summaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
-rw-r--r--3rdparty/asmjit/.gitignore6
-rw-r--r--3rdparty/asmjit/.travis.yml343
-rw-r--r--3rdparty/asmjit/CMakeLists.txt248
-rw-r--r--3rdparty/asmjit/README.md21
-rw-r--r--3rdparty/asmjit/src/asmjit.natvis166
-rw-r--r--3rdparty/asmjit/src/asmjit/a64.h62
-rw-r--r--3rdparty/asmjit/src/asmjit/arm.h62
-rw-r--r--3rdparty/asmjit/src/asmjit/arm/a64archtraits_p.h81
-rw-r--r--3rdparty/asmjit/src/asmjit/arm/a64assembler.cpp5115
-rw-r--r--3rdparty/asmjit/src/asmjit/arm/a64assembler.h72
-rw-r--r--3rdparty/asmjit/src/asmjit/arm/a64builder.cpp51
-rw-r--r--3rdparty/asmjit/src/asmjit/arm/a64builder.h57
-rw-r--r--3rdparty/asmjit/src/asmjit/arm/a64compiler.cpp60
-rw-r--r--3rdparty/asmjit/src/asmjit/arm/a64compiler.h235
-rw-r--r--3rdparty/asmjit/src/asmjit/arm/a64emithelper.cpp464
-rw-r--r--3rdparty/asmjit/src/asmjit/arm/a64emithelper_p.h50
-rw-r--r--3rdparty/asmjit/src/asmjit/arm/a64emitter.h1228
-rw-r--r--3rdparty/asmjit/src/asmjit/arm/a64formatter.cpp298
-rw-r--r--3rdparty/asmjit/src/asmjit/arm/a64formatter_p.h59
-rw-r--r--3rdparty/asmjit/src/asmjit/arm/a64func.cpp189
-rw-r--r--3rdparty/asmjit/src/asmjit/arm/a64func_p.h33
-rw-r--r--3rdparty/asmjit/src/asmjit/arm/a64globals.h1894
-rw-r--r--3rdparty/asmjit/src/asmjit/arm/a64instapi.cpp278
-rw-r--r--3rdparty/asmjit/src/asmjit/arm/a64instapi_p.h41
-rw-r--r--3rdparty/asmjit/src/asmjit/arm/a64instdb.cpp1957
-rw-r--r--3rdparty/asmjit/src/asmjit/arm/a64instdb.h74
-rw-r--r--3rdparty/asmjit/src/asmjit/arm/a64instdb_p.h876
-rw-r--r--3rdparty/asmjit/src/asmjit/arm/a64operand.cpp85
-rw-r--r--3rdparty/asmjit/src/asmjit/arm/a64operand.h312
-rw-r--r--3rdparty/asmjit/src/asmjit/arm/a64rapass.cpp806
-rw-r--r--3rdparty/asmjit/src/asmjit/arm/a64rapass_p.h105
-rw-r--r--3rdparty/asmjit/src/asmjit/arm/a64utils.h179
-rw-r--r--3rdparty/asmjit/src/asmjit/arm/armformatter.cpp143
-rw-r--r--3rdparty/asmjit/src/asmjit/arm/armformatter_p.h44
-rw-r--r--3rdparty/asmjit/src/asmjit/arm/armglobals.h21
-rw-r--r--3rdparty/asmjit/src/asmjit/arm/armoperand.h596
-rw-r--r--3rdparty/asmjit/src/asmjit/asmjit-scope-begin.h17
-rw-r--r--3rdparty/asmjit/src/asmjit/asmjit-scope-end.h9
-rw-r--r--3rdparty/asmjit/src/asmjit/asmjit.h14
-rw-r--r--3rdparty/asmjit/src/asmjit/core.h1418
-rw-r--r--3rdparty/asmjit/src/asmjit/core/api-build_p.h28
-rw-r--r--3rdparty/asmjit/src/asmjit/core/api-config.h385
-rw-r--r--3rdparty/asmjit/src/asmjit/core/arch.cpp59
-rw-r--r--3rdparty/asmjit/src/asmjit/core/arch.h64
-rw-r--r--3rdparty/asmjit/src/asmjit/core/archcommons.h229
-rw-r--r--3rdparty/asmjit/src/asmjit/core/archtraits.cpp160
-rw-r--r--3rdparty/asmjit/src/asmjit/core/archtraits.h290
-rw-r--r--3rdparty/asmjit/src/asmjit/core/assembler.cpp230
-rw-r--r--3rdparty/asmjit/src/asmjit/core/assembler.h45
-rw-r--r--3rdparty/asmjit/src/asmjit/core/builder.cpp218
-rw-r--r--3rdparty/asmjit/src/asmjit/core/builder.h792
-rw-r--r--3rdparty/asmjit/src/asmjit/core/callconv.cpp59
-rw-r--r--3rdparty/asmjit/src/asmjit/core/callconv.h374
-rw-r--r--3rdparty/asmjit/src/asmjit/core/codebuffer.h61
-rw-r--r--3rdparty/asmjit/src/asmjit/core/codeholder.cpp381
-rw-r--r--3rdparty/asmjit/src/asmjit/core/codeholder.h920
-rw-r--r--3rdparty/asmjit/src/asmjit/core/codewriter.cpp175
-rw-r--r--3rdparty/asmjit/src/asmjit/core/codewriter_p.h (renamed from 3rdparty/asmjit/src/asmjit/core/codebufferwriter_p.h)84
-rw-r--r--3rdparty/asmjit/src/asmjit/core/compiler.cpp325
-rw-r--r--3rdparty/asmjit/src/asmjit/core/compiler.h639
-rw-r--r--3rdparty/asmjit/src/asmjit/core/compilerdefs.h173
-rw-r--r--3rdparty/asmjit/src/asmjit/core/constpool.cpp102
-rw-r--r--3rdparty/asmjit/src/asmjit/core/constpool.h74
-rw-r--r--3rdparty/asmjit/src/asmjit/core/cpuinfo.cpp1147
-rw-r--r--3rdparty/asmjit/src/asmjit/core/cpuinfo.h757
-rw-r--r--3rdparty/asmjit/src/asmjit/core/datatypes.h1071
-rw-r--r--3rdparty/asmjit/src/asmjit/core/emithelper.cpp323
-rw-r--r--3rdparty/asmjit/src/asmjit/core/emithelper_p.h58
-rw-r--r--3rdparty/asmjit/src/asmjit/core/emitter.cpp265
-rw-r--r--3rdparty/asmjit/src/asmjit/core/emitter.h721
-rw-r--r--3rdparty/asmjit/src/asmjit/core/emitterutils.cpp83
-rw-r--r--3rdparty/asmjit/src/asmjit/core/emitterutils_p.h58
-rw-r--r--3rdparty/asmjit/src/asmjit/core/environment.cpp24
-rw-r--r--3rdparty/asmjit/src/asmjit/core/environment.h737
-rw-r--r--3rdparty/asmjit/src/asmjit/core/errorhandler.cpp29
-rw-r--r--3rdparty/asmjit/src/asmjit/core/errorhandler.h129
-rw-r--r--3rdparty/asmjit/src/asmjit/core/features.h186
-rw-r--r--3rdparty/asmjit/src/asmjit/core/formatter.cpp435
-rw-r--r--3rdparty/asmjit/src/asmjit/core/formatter.h267
-rw-r--r--3rdparty/asmjit/src/asmjit/core/formatter_p.h34
-rw-r--r--3rdparty/asmjit/src/asmjit/core/func.cpp311
-rw-r--r--3rdparty/asmjit/src/asmjit/core/func.h1123
-rw-r--r--3rdparty/asmjit/src/asmjit/core/funcargscontext.cpp293
-rw-r--r--3rdparty/asmjit/src/asmjit/core/funcargscontext_p.h199
-rw-r--r--3rdparty/asmjit/src/asmjit/core/globals.cpp47
-rw-r--r--3rdparty/asmjit/src/asmjit/core/globals.h246
-rw-r--r--3rdparty/asmjit/src/asmjit/core/inst.cpp106
-rw-r--r--3rdparty/asmjit/src/asmjit/core/inst.h745
-rw-r--r--3rdparty/asmjit/src/asmjit/core/jitallocator.cpp978
-rw-r--r--3rdparty/asmjit/src/asmjit/core/jitallocator.h197
-rw-r--r--3rdparty/asmjit/src/asmjit/core/jitruntime.cpp96
-rw-r--r--3rdparty/asmjit/src/asmjit/core/jitruntime.h53
-rw-r--r--3rdparty/asmjit/src/asmjit/core/logger.cpp73
-rw-r--r--3rdparty/asmjit/src/asmjit/core/logger.h110
-rw-r--r--3rdparty/asmjit/src/asmjit/core/misc_p.h28
-rw-r--r--3rdparty/asmjit/src/asmjit/core/operand.cpp62
-rw-r--r--3rdparty/asmjit/src/asmjit/core/operand.h1681
-rw-r--r--3rdparty/asmjit/src/asmjit/core/osutils.cpp28
-rw-r--r--3rdparty/asmjit/src/asmjit/core/osutils.h40
-rw-r--r--3rdparty/asmjit/src/asmjit/core/osutils_p.h58
-rw-r--r--3rdparty/asmjit/src/asmjit/core/raassignment_p.h185
-rw-r--r--3rdparty/asmjit/src/asmjit/core/rabuilders_p.h269
-rw-r--r--3rdparty/asmjit/src/asmjit/core/radefs_p.h943
-rw-r--r--3rdparty/asmjit/src/asmjit/core/ralocal.cpp544
-rw-r--r--3rdparty/asmjit/src/asmjit/core/ralocal_p.h100
-rw-r--r--3rdparty/asmjit/src/asmjit/core/rapass.cpp819
-rw-r--r--3rdparty/asmjit/src/asmjit/core/rapass_p.h615
-rw-r--r--3rdparty/asmjit/src/asmjit/core/rastack.cpp56
-rw-r--r--3rdparty/asmjit/src/asmjit/core/rastack_p.h48
-rw-r--r--3rdparty/asmjit/src/asmjit/core/string.cpp168
-rw-r--r--3rdparty/asmjit/src/asmjit/core/string.h192
-rw-r--r--3rdparty/asmjit/src/asmjit/core/support.cpp39
-rw-r--r--3rdparty/asmjit/src/asmjit/core/support.h1225
-rw-r--r--3rdparty/asmjit/src/asmjit/core/target.cpp31
-rw-r--r--3rdparty/asmjit/src/asmjit/core/target.h140
-rw-r--r--3rdparty/asmjit/src/asmjit/core/type.cpp118
-rw-r--r--3rdparty/asmjit/src/asmjit/core/type.h592
-rw-r--r--3rdparty/asmjit/src/asmjit/core/virtmem.cpp639
-rw-r--r--3rdparty/asmjit/src/asmjit/core/virtmem.h283
-rw-r--r--3rdparty/asmjit/src/asmjit/core/zone.cpp93
-rw-r--r--3rdparty/asmjit/src/asmjit/core/zone.h212
-rw-r--r--3rdparty/asmjit/src/asmjit/core/zonehash.cpp44
-rw-r--r--3rdparty/asmjit/src/asmjit/core/zonehash.h48
-rw-r--r--3rdparty/asmjit/src/asmjit/core/zonelist.cpp29
-rw-r--r--3rdparty/asmjit/src/asmjit/core/zonelist.h128
-rw-r--r--3rdparty/asmjit/src/asmjit/core/zonestack.cpp53
-rw-r--r--3rdparty/asmjit/src/asmjit/core/zonestack.h117
-rw-r--r--3rdparty/asmjit/src/asmjit/core/zonestring.h65
-rw-r--r--3rdparty/asmjit/src/asmjit/core/zonetree.cpp29
-rw-r--r--3rdparty/asmjit/src/asmjit/core/zonetree.h103
-rw-r--r--3rdparty/asmjit/src/asmjit/core/zonevector.cpp45
-rw-r--r--3rdparty/asmjit/src/asmjit/core/zonevector.h198
-rw-r--r--3rdparty/asmjit/src/asmjit/x86.h101
-rw-r--r--3rdparty/asmjit/src/asmjit/x86/x86archdata.cpp137
-rw-r--r--3rdparty/asmjit/src/asmjit/x86/x86archdata_p.h51
-rw-r--r--3rdparty/asmjit/src/asmjit/x86/x86archtraits_p.h148
-rw-r--r--3rdparty/asmjit/src/asmjit/x86/x86assembler.cpp1638
-rw-r--r--3rdparty/asmjit/src/asmjit/x86/x86assembler.h270
-rw-r--r--3rdparty/asmjit/src/asmjit/x86/x86builder.cpp73
-rw-r--r--3rdparty/asmjit/src/asmjit/x86/x86builder.h130
-rw-r--r--3rdparty/asmjit/src/asmjit/x86/x86callconv.cpp238
-rw-r--r--3rdparty/asmjit/src/asmjit/x86/x86callconv_p.h52
-rw-r--r--3rdparty/asmjit/src/asmjit/x86/x86compiler.cpp79
-rw-r--r--3rdparty/asmjit/src/asmjit/x86/x86compiler.h328
-rw-r--r--3rdparty/asmjit/src/asmjit/x86/x86emithelper.cpp619
-rw-r--r--3rdparty/asmjit/src/asmjit/x86/x86emithelper_p.h60
-rw-r--r--3rdparty/asmjit/src/asmjit/x86/x86emitter.h2584
-rw-r--r--3rdparty/asmjit/src/asmjit/x86/x86features.cpp398
-rw-r--r--3rdparty/asmjit/src/asmjit/x86/x86features.h290
-rw-r--r--3rdparty/asmjit/src/asmjit/x86/x86formatter.cpp465
-rw-r--r--3rdparty/asmjit/src/asmjit/x86/x86formatter_p.h50
-rw-r--r--3rdparty/asmjit/src/asmjit/x86/x86func.cpp503
-rw-r--r--3rdparty/asmjit/src/asmjit/x86/x86func_p.h33
-rw-r--r--3rdparty/asmjit/src/asmjit/x86/x86globals.h1188
-rw-r--r--3rdparty/asmjit/src/asmjit/x86/x86instapi.cpp895
-rw-r--r--3rdparty/asmjit/src/asmjit/x86/x86instapi_p.h34
-rw-r--r--3rdparty/asmjit/src/asmjit/x86/x86instdb.cpp7543
-rw-r--r--3rdparty/asmjit/src/asmjit/x86/x86instdb.h690
-rw-r--r--3rdparty/asmjit/src/asmjit/x86/x86instdb_p.h102
-rw-r--r--3rdparty/asmjit/src/asmjit/x86/x86internal.cpp1733
-rw-r--r--3rdparty/asmjit/src/asmjit/x86/x86internal_p.h87
-rw-r--r--3rdparty/asmjit/src/asmjit/x86/x86opcode_p.h358
-rw-r--r--3rdparty/asmjit/src/asmjit/x86/x86operand.cpp92
-rw-r--r--3rdparty/asmjit/src/asmjit/x86/x86operand.h915
-rw-r--r--3rdparty/asmjit/src/asmjit/x86/x86rapass.cpp1018
-rw-r--r--3rdparty/asmjit/src/asmjit/x86/x86rapass_p.h99
-rw-r--r--3rdparty/asmjit/test/asmjit_bench_x86.cpp172
-rw-r--r--3rdparty/asmjit/test/asmjit_test_assembler.cpp84
-rw-r--r--3rdparty/asmjit/test/asmjit_test_assembler.h85
-rw-r--r--3rdparty/asmjit/test/asmjit_test_assembler_a64.cpp4006
-rw-r--r--3rdparty/asmjit/test/asmjit_test_assembler_x64.cpp17833
-rw-r--r--3rdparty/asmjit/test/asmjit_test_assembler_x86.cpp8300
-rw-r--r--3rdparty/asmjit/test/asmjit_test_compiler.cpp253
-rw-r--r--3rdparty/asmjit/test/asmjit_test_compiler.h73
-rw-r--r--3rdparty/asmjit/test/asmjit_test_compiler_a64.cpp690
-rw-r--r--3rdparty/asmjit/test/asmjit_test_compiler_x86.cpp (renamed from 3rdparty/asmjit/test/asmjit_test_x86_cc.cpp)1765
-rw-r--r--3rdparty/asmjit/test/asmjit_test_emitters.cpp (renamed from 3rdparty/asmjit/test/asmjit_test_x86_asm.cpp)91
-rw-r--r--3rdparty/asmjit/test/asmjit_test_instinfo.cpp181
-rw-r--r--3rdparty/asmjit/test/asmjit_test_misc.h203
-rw-r--r--3rdparty/asmjit/test/asmjit_test_opcode.cpp110
-rw-r--r--3rdparty/asmjit/test/asmjit_test_opcode.h6059
-rw-r--r--3rdparty/asmjit/test/asmjit_test_perf.cpp62
-rw-r--r--3rdparty/asmjit/test/asmjit_test_perf.h61
-rw-r--r--3rdparty/asmjit/test/asmjit_test_perf_a64.cpp699
-rw-r--r--3rdparty/asmjit/test/asmjit_test_perf_x86.cpp5032
-rw-r--r--3rdparty/asmjit/test/asmjit_test_unit.cpp90
-rw-r--r--3rdparty/asmjit/test/asmjit_test_x86_instinfo.cpp128
-rw-r--r--3rdparty/asmjit/test/asmjit_test_x86_sections.cpp65
-rw-r--r--3rdparty/asmjit/test/asmjitutils.h38
-rw-r--r--3rdparty/asmjit/test/cmdline.h61
-rw-r--r--3rdparty/asmjit/test/performancetimer.h41
-rw-r--r--3rdparty/asmjit/tools/configure-makefiles.sh20
-rw-r--r--3rdparty/asmjit/tools/configure-ninja.sh22
-rw-r--r--3rdparty/asmjit/tools/configure-sanitizers.sh20
-rw-r--r--3rdparty/asmjit/tools/configure-vs-x64.bat9
-rw-r--r--3rdparty/asmjit/tools/configure-vs-x86.bat9
-rw-r--r--3rdparty/asmjit/tools/configure-vs2019-x64.bat2
-rw-r--r--3rdparty/asmjit/tools/configure-vs2019-x86.bat2
-rw-r--r--3rdparty/asmjit/tools/configure-vs2022-x64.bat2
-rw-r--r--3rdparty/asmjit/tools/configure-vs2022-x86.bat2
-rw-r--r--3rdparty/asmjit/tools/configure-xcode.sh11
-rw-r--r--3rdparty/asmjit/tools/tablegen-arm.js365
-rw-r--r--3rdparty/asmjit/tools/tablegen-arm.sh3
-rw-r--r--3rdparty/asmjit/tools/tablegen-x86.js1318
-rw-r--r--3rdparty/asmjit/tools/tablegen-x86.sh3
-rw-r--r--3rdparty/asmjit/tools/tablegen.js69
-rw-r--r--3rdparty/asmjit/tools/tablegen.sh1
207 files changed, 82319 insertions, 33326 deletions
diff --git a/3rdparty/asmjit/.gitignore b/3rdparty/asmjit/.gitignore
index 34bbad2b75f..75d36d09cd0 100644
--- a/3rdparty/asmjit/.gitignore
+++ b/3rdparty/asmjit/.gitignore
@@ -1,6 +1,6 @@
+/build
+/build_*
+/tools/asmdb
.vscode
.kdev4
*.kdev4
-build
-build_*
-tools/asmdb
diff --git a/3rdparty/asmjit/.travis.yml b/3rdparty/asmjit/.travis.yml
deleted file mode 100644
index 0d541e6c10d..00000000000
--- a/3rdparty/asmjit/.travis.yml
+++ /dev/null
@@ -1,343 +0,0 @@
-language: cpp
-
-git:
- depth: false
-
-env:
- global:
- - BUILD_TOOLCHAIN="Unix Makefiles"
- - MAKEFLAGS="-j2"
-
-dist: bionic
-
-matrix:
- include:
- - name: "Source Code Check"
- env: BUILD_MATRIX="SOURCE_CODE_CHECK=1"
- os: linux
- language: node_js
- node_js:
- - node
-
- - name: "Linux Clang Default [64-bit] [DBG]"
- env: BUILD_MATRIX="BUILD_TYPE=Debug && CC=clang-9 && CXX=clang++-9"
- os: linux
- addons:
- apt:
- sources:
- - sourceline: "ppa:ubuntu-toolchain-r/test"
- packages: [clang++-9]
-
- - name: "Linux Clang Default [64-bit] [REL]"
- env: BUILD_MATRIX="BUILD_TYPE=Release && CC=clang-9 && CXX=clang++-9"
- os: linux
- addons:
- apt:
- sources:
- - sourceline: "ppa:ubuntu-toolchain-r/test"
- packages: [clang++-9]
-
- - name: "Linux Clang Default [64-bit] [REL] [Valgrind]"
- env: BUILD_MATRIX="BUILD_TYPE=Release && CC=clang-9 && CXX=clang++-9" USE_VALGRIND=1
- os: linux
- addons:
- apt:
- sources:
- - sourceline: "ppa:ubuntu-toolchain-r/test"
- packages: [clang++-9, valgrind]
-
- - name: "Linux Clang Default [64-bit] [REL] [Sanitize=Address]"
- env: BUILD_MATRIX="BUILD_TYPE=Release && CC=clang-9 && CXX=clang++-9" EXTRA_OPTIONS="-DASMJIT_SANITIZE=address"
- os: linux
- addons:
- apt:
- sources:
- - sourceline: "ppa:ubuntu-toolchain-r/test"
- packages: [clang++-9]
-
- - name: "Linux Clang Default [64-bit] [REL] [Sanitize=Undefined]"
- env: BUILD_MATRIX="BUILD_TYPE=Release && CC=clang-9 && CXX=clang++-9" EXTRA_OPTIONS="-DASMJIT_SANITIZE=undefined"
- os: linux
- addons:
- apt:
- sources:
- - sourceline: "ppa:ubuntu-toolchain-r/test"
- packages: [clang++-9]
-
- - name: "Linux Clang Default [64-bit] [REL] [NoDeprecated]"
- env: BUILD_MATRIX="BUILD_TYPE=Release && CC=clang-9 && CXX=clang++-9" EXTRA_OPTIONS="-DASMJIT_NO_DEPRECATED=1"
- os: linux
- addons:
- apt:
- sources:
- - sourceline: "ppa:ubuntu-toolchain-r/test"
- packages: [clang++-9]
-
- - name: "Linux Clang Default [64-bit] [REL] [NoIntrinsics]"
- env: BUILD_MATRIX="BUILD_TYPE=Release && CC=clang-9 && CXX=clang++-9" EXTRA_OPTIONS="-DASMJIT_NO_INTRINSICS=1"
- os: linux
- addons:
- apt:
- sources:
- - sourceline: "ppa:ubuntu-toolchain-r/test"
- packages: [clang++-9]
-
- - name: "Linux Clang Default [64-bit] [REL] [NoLogging]"
- env: BUILD_MATRIX="BUILD_TYPE=Release && CC=clang-9 && CXX=clang++-9" EXTRA_OPTIONS="-DASMJIT_NO_LOGGING=1"
- os: linux
- addons:
- apt:
- sources:
- - sourceline: "ppa:ubuntu-toolchain-r/test"
- packages: [clang++-9]
-
- - name: "Linux Clang Default [64-bit] [REL] [NoBuilder]"
- env: BUILD_MATRIX="BUILD_TYPE=Release && CC=clang-9 && CXX=clang++-9" EXTRA_OPTIONS="-DASMJIT_NO_BUILDER=1"
- os: linux
- addons:
- apt:
- sources:
- - sourceline: "ppa:ubuntu-toolchain-r/test"
- packages: [clang++-9]
-
- - name: "Linux Clang Default [64-bit] [REL] [NoCompiler]"
- env: BUILD_MATRIX="BUILD_TYPE=Release && CC=clang-9 && CXX=clang++-9" EXTRA_OPTIONS="-DASMJIT_NO_COMPILER=1"
- os: linux
- addons:
- apt:
- sources:
- - sourceline: "ppa:ubuntu-toolchain-r/test"
- packages: [clang++-9]
-
- - name: "Linux GCC 4.8 [32-bit] [DBG]"
- env: BUILD_MATRIX="BUILD_TYPE=Debug && CC=gcc-4.8 && CXX=g++-4.8" CXXFLAGS=-m32 LDFLAGS=-m32
- os: linux
- addons:
- apt:
- packages: [g++-4.8, g++-4.8-multilib, "linux-libc-dev:i386"]
-
- - name: "Linux GCC 4.8 [64-bit] [DBG]"
- env: BUILD_MATRIX="BUILD_TYPE=Debug && CC=gcc-4.8 && CXX=g++-4.8"
- os: linux
- addons:
- apt:
- packages: [g++-4.8]
-
- - name: "Linux GCC 5 [32-bit] [DBG]"
- env: BUILD_MATRIX="BUILD_TYPE=Debug && CC=gcc-5 && CXX=g++-5" CXXFLAGS=-m32 LDFLAGS=-m32
- os: linux
- addons:
- apt:
- packages: [g++-5, g++-5-multilib, "linux-libc-dev:i386"]
-
- - name: "Linux GCC 5 [64-bit] [DBG]"
- env: BUILD_MATRIX="BUILD_TYPE=Debug && CC=gcc-5 && CXX=g++-5"
- os: linux
- addons:
- apt:
- packages: [g++-5]
-
- - name: "Linux GCC 6 [32-bit] [DBG]"
- env: BUILD_MATRIX="BUILD_TYPE=Debug && CC=gcc-6 && CXX=g++-6" CXXFLAGS=-m32 LDFLAGS=-m32
- os: linux
- addons:
- apt:
- packages: [g++-6, g++-6-multilib, "linux-libc-dev:i386"]
-
- - name: "Linux GCC 6 [64-bit] [DBG]"
- env: BUILD_MATRIX="BUILD_TYPE=Debug && CC=gcc-6 && CXX=g++-6"
- os: linux
- addons:
- apt:
- packages: [g++-6]
-
- - name: "Linux GCC 7 [32-bit] [DBG]"
- env: BUILD_MATRIX="BUILD_TYPE=Debug && CC=gcc-7 && CXX=g++-7" CXXFLAGS=-m32 LDFLAGS=-m32
- os: linux
- addons:
- apt:
- packages: [g++-7, g++-7-multilib, "linux-libc-dev:i386"]
-
- - name: "Linux GCC 7 [64-bit] [DBG]"
- env: BUILD_MATRIX="BUILD_TYPE=Debug && CC=gcc-7 && CXX=g++-7"
- os: linux
- addons:
- apt:
- packages: [g++-7]
-
- - name: "Linux GCC 8 [32-bit] [DBG]"
- env: BUILD_MATRIX="BUILD_TYPE=Debug && CC=gcc-8 && CXX=g++-8" CXXFLAGS=-m32 LDFLAGS=-m32
- os: linux
- addons:
- apt:
- packages: [g++-8, g++-8-multilib, "linux-libc-dev:i386"]
-
- - name: "Linux GCC 8 [64-bit] [DBG]"
- env: BUILD_MATRIX="BUILD_TYPE=Debug && CC=gcc-8 && CXX=g++-8"
- os: linux
- addons:
- apt:
- packages: [g++-8]
-
- - name: "Linux GCC 9 [32-bit] [DBG]"
- env: BUILD_MATRIX="BUILD_TYPE=Debug && CC=gcc-9 && CXX=g++-9" CXXFLAGS=-m32 LDFLAGS=-m32
- os: linux
- addons:
- apt:
- sources:
- - sourceline: "ppa:ubuntu-toolchain-r/test"
- packages: [g++-9, g++-9-multilib, "linux-libc-dev:i386"]
-
- - name: "Linux GCC 9 [64-bit] [DBG]"
- env: BUILD_MATRIX="BUILD_TYPE=Debug && CC=gcc-9 && CXX=g++-9"
- os: linux
- addons:
- apt:
- sources:
- - sourceline: "ppa:ubuntu-toolchain-r/test"
- packages: [g++-9]
-
- - name: "Linux GCC 10 [32-bit] [DBG]"
- env: BUILD_MATRIX="BUILD_TYPE=Debug && CC=gcc-10 && CXX=g++-10" CXXFLAGS=-m32 LDFLAGS=-m32
- os: linux
- addons:
- apt:
- sources:
- - sourceline: "ppa:ubuntu-toolchain-r/test"
- packages: [g++-10, g++-10-multilib, "linux-libc-dev:i386"]
-
- - name: "Linux GCC 10 [32-bit] [REL]"
- env: BUILD_MATRIX="BUILD_TYPE=Release && CC=gcc-10 && CXX=g++-10" CXXFLAGS=-m32 LDFLAGS=-m32
- os: linux
- addons:
- apt:
- sources:
- - sourceline: "ppa:ubuntu-toolchain-r/test"
- packages: [g++-10, g++-10-multilib, "linux-libc-dev:i386"]
-
- - name: "Linux GCC 10 [64-bit] [DBG]"
- env: BUILD_MATRIX="BUILD_TYPE=Debug && CC=gcc-10 && CXX=g++-10"
- os: linux
- addons:
- apt:
- sources:
- - sourceline: "ppa:ubuntu-toolchain-r/test"
- packages: [g++-10]
-
- - name: "Linux GCC 10 [64-bit] [REL]"
- env: BUILD_MATRIX="BUILD_TYPE=Release && CC=gcc-10 && CXX=g++-10"
- os: linux
- addons:
- apt:
- sources:
- - sourceline: "ppa:ubuntu-toolchain-r/test"
- packages: [g++-10]
-
- - name: "OSX Clang XCode 9.4 [32-bit] [DBG]"
- env: BUILD_MATRIX="BUILD_TYPE=Debug" CXXFLAGS=-m32 LDFLAGS=-m32
- os: osx
- osx_image: xcode9.4
-
- - name: "OSX Clang XCode 9.4 [32-bit] [REL]"
- env: BUILD_MATRIX="BUILD_TYPE=Release" CXXFLAGS=-m32 LDFLAGS=-m32
- os: osx
- osx_image: xcode9.4
-
- - name: "OSX Clang XCode 9.4 [64-bit] [DBG]"
- env: BUILD_MATRIX="BUILD_TYPE=Debug"
- os: osx
- osx_image: xcode9.4
-
- - name: "OSX Clang XCode 9.4 [64-bit] [REL]"
- env: BUILD_MATRIX="BUILD_TYPE=Release"
- os: osx
- osx_image: xcode9.4
-
- - name: "OSX Clang XCode 10.2 [64-bit] [DBG]"
- env: BUILD_MATRIX="BUILD_TYPE=Debug"
- os: osx
- osx_image: xcode10.2
-
- - name: "OSX Clang XCode 10.2 [64-bit] [REL]"
- env: BUILD_MATRIX="BUILD_TYPE=Release"
- os: osx
- osx_image: xcode10.2
-
- - name: "OSX Clang XCode 11 [64-bit] [DBG]"
- env: BUILD_MATRIX="BUILD_TYPE=Debug"
- os: osx
- osx_image: xcode11
-
- - name: "OSX Clang XCode 11 [64-bit] [REL]"
- env: BUILD_MATRIX="BUILD_TYPE=Release"
- os: osx
- osx_image: xcode11
-
- - name: "Windows VS2017 [32-bit] [DBG]"
- env: BUILD_MATRIX="BUILD_TYPE=Debug" BUILD_TOOLCHAIN="Visual Studio 15 2017"
- os: windows
-
- - name: "Windows VS2017 [32-bit] [REL]"
- env: BUILD_MATRIX="BUILD_TYPE=Release" BUILD_TOOLCHAIN="Visual Studio 15 2017"
- os: windows
-
- - name: "Windows VS2017 [64-bit] [DBG]"
- env: BUILD_MATRIX="BUILD_TYPE=Debug" BUILD_TOOLCHAIN="Visual Studio 15 2017 Win64"
- os: windows
-
- - name: "Windows VS2017 [64-bit] [REL]"
- env: BUILD_MATRIX="BUILD_TYPE=Release" BUILD_TOOLCHAIN="Visual Studio 15 2017 Win64"
- os: windows
-
-before_install:
- - eval "$BUILD_MATRIX"
-
-before_script:
- - |
- if [ -z $SOURCE_CODE_CHECK ]; then
- mkdir build
- cd build
- if [[ "$BUILD_TOOLCHAIN" =~ ^Visual\ Studio ]]; then
- cmake .. -G"${BUILD_TOOLCHAIN}" -DASMJIT_TEST=1 ${EXTRA_OPTIONS}
- else
- cmake .. -G"${BUILD_TOOLCHAIN}" -DASMJIT_TEST=1 ${EXTRA_OPTIONS} -DCMAKE_PREFIX_PATH="${MINGW_PATH}" -DCMAKE_BUILD_TYPE="${BUILD_TYPE}"
- fi
- cd ..
- fi
-
-script:
- - |
- if [ -z $SOURCE_CODE_CHECK ]; then
- cd build
- if [[ "$BUILD_TOOLCHAIN" =~ ^Visual\ Studio ]]; then
- cmake --build . --config ${BUILD_TYPE} -- -nologo -v:minimal || exit 1
- cd ${BUILD_TYPE}
- else
- cmake --build . || exit 1
- fi
- echo ""
- echo "=== Starting Tests ==="
- echo ""
- if [ "$USE_VALGRIND" = "1" ]; then
- RUN_CMD="valgrind --leak-check=full --show-reachable=yes --track-origins=yes"
- fi
- eval "$RUN_CMD ./asmjit_test_unit --quick" || exit 1
- echo ""
- eval "$RUN_CMD ./asmjit_test_opcode > /dev/null" || exit 1
- echo ""
- eval "$RUN_CMD ./asmjit_test_x86_asm" || exit 1
- echo ""
- eval "$RUN_CMD ./asmjit_test_x86_sections" || exit 1
- if [ -f ./asmjit_test_x86_instinfo ]; then
- echo ""
- eval "$RUN_CMD ./asmjit_test_x86_instinfo" || exit 1
- fi
- if [ -f ./asmjit_test_x86_cc ]; then
- echo ""
- eval "$RUN_CMD ./asmjit_test_x86_cc" || exit 1
- fi
- else
- cd tools
- ./enumgen.sh --verify || exit 1
- cd ..
- fi
diff --git a/3rdparty/asmjit/CMakeLists.txt b/3rdparty/asmjit/CMakeLists.txt
index e033c3ff663..50c9bcc198c 100644
--- a/3rdparty/asmjit/CMakeLists.txt
+++ b/3rdparty/asmjit/CMakeLists.txt
@@ -10,17 +10,17 @@ if(POLICY CMP0092)
cmake_policy(SET CMP0092 NEW) # Don't add -W3 warning level by default.
endif()
-include(CheckCXXCompilerFlag)
-
# Don't create a project if it was already created by another CMakeLists.txt.
# This allows one library to embed another library without making a collision.
if (NOT CMAKE_PROJECT_NAME OR "${CMAKE_PROJECT_NAME}" STREQUAL "asmjit")
project(asmjit CXX)
endif()
-# =============================================================================
-# [AsmJit - Deprecated]
-# =============================================================================
+include(CheckCXXCompilerFlag)
+include(GNUInstallDirs)
+
+# AsmJit - Deprecated
+# ===================
if (DEFINED ASMJIT_BUILD_EMBED)
message(DEPRECATION "ASMJIT_BUILD_EMBED is deprecated, use ASMJIT_EMBED")
@@ -32,9 +32,12 @@ if (DEFINED ASMJIT_BUILD_STATIC)
set(ASMJIT_STATIC "${ASMJIT_BUILD_STATIC}")
endif()
-# =============================================================================
-# [AsmJit - Configuration]
-# =============================================================================
+# AsmJit - Configuration
+# ======================
+
+if (NOT DEFINED ASMJIT_TEST)
+ set(ASMJIT_TEST FALSE)
+endif()
if (NOT DEFINED ASMJIT_EMBED)
set(ASMJIT_EMBED FALSE)
@@ -44,38 +47,53 @@ if (NOT DEFINED ASMJIT_STATIC)
set(ASMJIT_STATIC ${ASMJIT_EMBED})
endif()
-if (NOT DEFINED ASMJIT_BUILD_ARM)
- set(ASMJIT_BUILD_ARM FALSE)
+if (NOT DEFINED ASMJIT_SANITIZE)
+ set(ASMJIT_SANITIZE FALSE)
endif()
-if (NOT DEFINED ASMJIT_BUILD_X86)
- set(ASMJIT_BUILD_X86 FALSE)
+if (NOT DEFINED ASMJIT_NO_X86)
+ set(ASMJIT_NO_X86 FALSE)
endif()
-if (NOT DEFINED ASMJIT_TEST)
- set(ASMJIT_TEST FALSE)
+if (NOT DEFINED ASMJIT_NO_AARCH32)
+ set(ASMJIT_NO_AARCH32 FALSE)
+endif()
+
+if (NOT DEFINED ASMJIT_NO_AARCH64)
+ set(ASMJIT_NO_AARCH64 FALSE)
+endif()
+
+if (NOT DEFINED ASMJIT_NO_FOREIGN)
+ set(ASMJIT_NO_FOREIGN FALSE)
endif()
if (NOT DEFINED ASMJIT_NO_NATVIS)
set(ASMJIT_NO_NATVIS FALSE)
endif()
+if (NOT DEFINED ASMJIT_NO_CUSTOM_FLAGS)
+ set(ASMJIT_NO_CUSTOM_FLAGS FALSE)
+endif()
+
# EMBED implies STATIC.
if (ASMJIT_EMBED AND NOT ASMJIT_STATIC)
set(ASMJIT_STATIC TRUE)
endif()
-set(ASMJIT_DIR "${CMAKE_CURRENT_LIST_DIR}" CACHE PATH "Location of 'asmjit'")
-set(ASMJIT_TEST ${ASMJIT_TEST} CACHE BOOL "Build 'asmjit' test applications")
-set(ASMJIT_EMBED ${ASMJIT_EMBED} CACHE BOOL "Embed 'asmjit' library (no targets)")
-set(ASMJIT_STATIC ${ASMJIT_STATIC} CACHE BOOL "Build 'asmjit' library as static")
-set(ASMJIT_SANITIZE ${ASMJIT_SANITIZE} CACHE STRING "Build with sanitizers: 'address', 'undefined', etc...")
-set(ASMJIT_BUILD_X86 ${ASMJIT_BUILD_X86} CACHE BOOL "Build X86 backends (X86 and X86_64)")
-set(ASMJIT_BUILD_ARM ${ASMJIT_BUILD_ARM} CACHE BOOL "Build ARM backends (ARM/Trumb and AArch64")
-
-# =============================================================================
-# [AsmJit - Project]
-# =============================================================================
+set(ASMJIT_DIR "${CMAKE_CURRENT_LIST_DIR}" CACHE PATH "Location of 'asmjit'")
+set(ASMJIT_TEST "${ASMJIT_TEST}" CACHE BOOL "Build 'asmjit' test applications")
+set(ASMJIT_EMBED "${ASMJIT_EMBED}" CACHE BOOL "Embed 'asmjit' library (no targets)")
+set(ASMJIT_STATIC "${ASMJIT_STATIC}" CACHE BOOL "Build 'asmjit' library as static")
+set(ASMJIT_SANITIZE "${ASMJIT_SANITIZE}" CACHE STRING "Build with sanitizers: 'address', 'undefined', etc...")
+set(ASMJIT_NO_X86 "${ASMJIT_NO_X86}" CACHE BOOL "Disable X86/X64 backend")
+set(ASMJIT_NO_AARCH32 "${ASMJIT_NO_AARCH32}" CACHE BOOL "Disable AArch32 backend (ARM and THUMB)")
+set(ASMJIT_NO_AARCH64 "${ASMJIT_NO_AARCH64}" CACHE BOOL "Disable AArch64 backend")
+set(ASMJIT_NO_FOREIGN "${ASMJIT_NO_FOREIGN}" CACHE BOOL "Disable all foreign architectures (enables only a native architecture)")
+set(ASMJIT_NO_NATVIS "${ASMJIT_NO_NATVIS}" CACHE BOOL "Disable natvis support (embedding asmjit.natvis in PDB)")
+set(ASMJIT_NO_CUSTOM_FLAGS "${ASMJIT_NO_CUSTOM_FLAGS}" CACHE BOOL "Disable extra compilation flags added by AsmJit to its targets")
+
+# AsmJit - Project
+# ================
set(ASMJIT_INCLUDE_DIRS "${ASMJIT_DIR}/src") # Include directory is the same as source dir.
set(ASMJIT_DEPS "") # AsmJit dependencies (libraries) for the linker.
@@ -87,9 +105,8 @@ set(ASMJIT_PRIVATE_CFLAGS_REL "") # Private compiler flags used b
set(ASMJIT_SANITIZE_CFLAGS "") # Compiler flags required by currently enabled sanitizers.
set(ASMJIT_SANITIZE_LFLAGS "") # Linker flags required by currently enabled sanitizers.
-# =============================================================================
-# [AsmJit - Utilities]
-# =============================================================================
+# AsmJit - Utilities
+# ==================
function(asmjit_detect_cflags out)
set(out_array ${${out}})
@@ -139,6 +156,7 @@ function(asmjit_add_target target target_type)
add_library(${target} ${target_type} ${X_SOURCES})
endif()
+ set_target_properties(${target} PROPERTIES DEFINE_SYMBOL "")
target_link_libraries(${target} PRIVATE ${X_LIBRARIES})
# target_link_options was added in cmake v3.13, don't use it for now...
@@ -160,9 +178,8 @@ function(asmjit_add_target target target_type)
endif()
endfunction()
-# =============================================================================
-# [AsmJit - Compiler Support]
-# =============================================================================
+# AsmJit - Compiler Support
+# =========================
set(ASMJIT_INCLUDE_DIRS "${ASMJIT_DIR}/src") # Include directory is the same as source dir.
set(ASMJIT_DEPS "") # AsmJit dependencies (libraries) for the linker.
@@ -182,6 +199,7 @@ if (NOT ASMJIT_NO_CUSTOM_FLAGS)
list(APPEND ASMJIT_PRIVATE_CFLAGS
-MP # [+] Multi-Process Compilation.
-GF # [+] Eliminate duplicate strings.
+ -Zc:__cplusplus # [+] Conforming __cplusplus definition.
-Zc:inline # [+] Remove unreferenced COMDAT.
-Zc:strictStrings # [+] Strict const qualification of string literals.
-Zc:threadSafeInit- # [-] Thread-safe statics.
@@ -235,7 +253,7 @@ if (NOT WIN32)
list(APPEND ASMJIT_DEPS pthread)
endif()
-if ("${CMAKE_SYSTEM_NAME}" MATCHES "Linux")
+if ("${CMAKE_SYSTEM_NAME}" MATCHES "Linux" OR "${CMAKE_SYSTEM_NAME}" MATCHES "NetBSD")
list(APPEND ASMJIT_DEPS rt)
endif()
@@ -253,9 +271,12 @@ else()
endif()
foreach(build_option ASMJIT_STATIC
- ASMJIT_BUILD_X86
- #ASMJIT_BUILD_ARM
- ASMJIT_BUILD_A64
+ # AsmJit backends selection.
+ ASMJIT_NO_X86
+ ASMJIT_NO_AARCH32
+ ASMJIT_NO_AARCH64
+ ASMJIT_NO_FOREIGN
+ # AsmJit features selection.
ASMJIT_NO_DEPRECATED
ASMJIT_NO_JIT
ASMJIT_NO_LOGGING
@@ -270,9 +291,8 @@ foreach(build_option ASMJIT_STATIC
endif()
endforeach()
-# =============================================================================
-# [AsmJit - Linker Support]
-# =============================================================================
+# AsmJit - Linker Support
+# =======================
if (WIN32)
if(CMAKE_LINKER MATCHES "link\\.exe" OR CMAKE_LINKER MATCHES "lld-link\\.exe")
@@ -280,35 +300,38 @@ if (WIN32)
endif()
endif()
-# =============================================================================
-# [AsmJit - Source]
-# =============================================================================
+# AsmJit - Source
+# ===============
set(ASMJIT_SRC_LIST
asmjit/asmjit.h
+ asmjit/asmjit-scope-begin.h
+ asmjit/asmjit-scope-end.h
asmjit/core.h
asmjit/core/api-build_p.h
asmjit/core/api-config.h
- asmjit/core/arch.cpp
- asmjit/core/arch.h
+ asmjit/core/archtraits.cpp
+ asmjit/core/archtraits.h
+ asmjit/core/archcommons.h
asmjit/core/assembler.cpp
asmjit/core/assembler.h
asmjit/core/builder.cpp
asmjit/core/builder.h
- asmjit/core/callconv.cpp
- asmjit/core/callconv.h
asmjit/core/codebuffer.h
- asmjit/core/codebufferwriter_p.h
asmjit/core/codeholder.cpp
asmjit/core/codeholder.h
+ asmjit/core/codewriter.cpp
+ asmjit/core/codewriter_p.h
asmjit/core/compiler.cpp
asmjit/core/compiler.h
+ asmjit/core/compilerdefs.h
asmjit/core/constpool.cpp
asmjit/core/constpool.h
asmjit/core/cpuinfo.cpp
asmjit/core/cpuinfo.h
- asmjit/core/datatypes.h
+ asmjit/core/emithelper.cpp
+ asmjit/core/emithelper_p.h
asmjit/core/emitter.cpp
asmjit/core/emitter.h
asmjit/core/emitterutils.cpp
@@ -317,11 +340,12 @@ set(ASMJIT_SRC_LIST
asmjit/core/environment.h
asmjit/core/errorhandler.cpp
asmjit/core/errorhandler.h
- asmjit/core/features.h
asmjit/core/formatter.cpp
asmjit/core/formatter.h
asmjit/core/func.cpp
asmjit/core/func.h
+ asmjit/core/funcargscontext.cpp
+ asmjit/core/funcargscontext_p.h
asmjit/core/globals.cpp
asmjit/core/globals.h
asmjit/core/inst.cpp
@@ -370,25 +394,52 @@ set(ASMJIT_SRC_LIST
asmjit/core/zonevector.cpp
asmjit/core/zonevector.h
+ asmjit/arm.h
+ asmjit/arm/armformatter.cpp
+ asmjit/arm/armformatter_p.h
+ asmjit/arm/armglobals.h
+ asmjit/arm/armoperand.h
+ asmjit/arm/a64archtraits_p.h
+ asmjit/arm/a64assembler.cpp
+ asmjit/arm/a64assembler.h
+ asmjit/arm/a64builder.cpp
+ asmjit/arm/a64builder.h
+ asmjit/arm/a64compiler.cpp
+ asmjit/arm/a64compiler.h
+ asmjit/arm/a64emithelper.cpp
+ asmjit/arm/a64emithelper_p.h
+ asmjit/arm/a64emitter.h
+ asmjit/arm/a64formatter.cpp
+ asmjit/arm/a64formatter_p.h
+ asmjit/arm/a64func.cpp
+ asmjit/arm/a64func_p.h
+ asmjit/arm/a64globals.h
+ asmjit/arm/a64instapi.cpp
+ asmjit/arm/a64instapi_p.h
+ asmjit/arm/a64instdb.cpp
+ asmjit/arm/a64instdb.h
+ asmjit/arm/a64operand.cpp
+ asmjit/arm/a64operand.h
+ asmjit/arm/a64rapass.cpp
+ asmjit/arm/a64rapass_p.h
+ asmjit/arm/a64utils.h
+
asmjit/x86.h
- asmjit/x86/x86archdata.cpp
- asmjit/x86/x86archdata_p.h
+ asmjit/x86/x86archtraits_p.h
asmjit/x86/x86assembler.cpp
asmjit/x86/x86assembler.h
asmjit/x86/x86builder.cpp
asmjit/x86/x86builder.h
- asmjit/x86/x86callconv.cpp
- asmjit/x86/x86callconv_p.h
asmjit/x86/x86compiler.cpp
asmjit/x86/x86compiler.h
+ asmjit/x86/x86emithelper.cpp
+ asmjit/x86/x86emithelper_p.h
asmjit/x86/x86emitter.h
- asmjit/x86/x86features.cpp
- asmjit/x86/x86features.h
asmjit/x86/x86formatter.cpp
asmjit/x86/x86formatter_p.h
+ asmjit/x86/x86func.cpp
+ asmjit/x86/x86func_p.h
asmjit/x86/x86globals.h
- asmjit/x86/x86internal.cpp
- asmjit/x86/x86internal_p.h
asmjit/x86/x86instdb.cpp
asmjit/x86/x86instdb.h
asmjit/x86/x86instdb_p.h
@@ -420,9 +471,8 @@ if (NOT ${CMAKE_VERSION} VERSION_LESS "3.8.0")
source_group(TREE "${ASMJIT_DIR}" FILES ${ASMJIT_SRC})
endif()
-# =============================================================================
-# [AsmJit - Summary]
-# =============================================================================
+# AsmJit - Summary
+# ================
message("** AsmJit Summary **")
message(" ASMJIT_DIR=${ASMJIT_DIR}")
@@ -435,9 +485,8 @@ message(" ASMJIT_PRIVATE_CFLAGS=${ASMJIT_PRIVATE_CFLAGS}")
message(" ASMJIT_PRIVATE_CFLAGS_DBG=${ASMJIT_PRIVATE_CFLAGS_DBG}")
message(" ASMJIT_PRIVATE_CFLAGS_REL=${ASMJIT_PRIVATE_CFLAGS_REL}")
-# =============================================================================
-# [AsmJit - Targets]
-# =============================================================================
+# AsmJit - Targets
+# ================
if (NOT ASMJIT_EMBED)
# Add AsmJit target.
@@ -447,19 +496,33 @@ if (NOT ASMJIT_EMBED)
CFLAGS ${ASMJIT_PRIVATE_CFLAGS}
CFLAGS_DBG ${ASMJIT_PRIVATE_CFLAGS_DBG}
CFLAGS_REL ${ASMJIT_PRIVATE_CFLAGS_REL})
- target_include_directories(asmjit BEFORE INTERFACE ${ASMJIT_INCLUDE_DIRS})
+
target_compile_options(asmjit INTERFACE ${ASMJIT_CFLAGS})
+ target_include_directories(asmjit BEFORE INTERFACE
+ $<BUILD_INTERFACE:${ASMJIT_INCLUDE_DIRS}>
+ $<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}>)
+
+ # Add blend2d::blend2d alias.
+ add_library(asmjit::asmjit ALIAS asmjit)
+ # TODO: [CMAKE] Deprecated alias - we use projectname::libraryname convention now.
add_library(AsmJit::AsmJit ALIAS asmjit)
# Add AsmJit install instructions (library and public headers).
if (NOT ASMJIT_NO_INSTALL)
- install(TARGETS asmjit RUNTIME DESTINATION "bin"
- LIBRARY DESTINATION "lib${LIB_SUFFIX}"
- ARCHIVE DESTINATION "lib${LIB_SUFFIX}")
+ install(TARGETS asmjit
+ EXPORT asmjit-config
+ RUNTIME DESTINATION "${CMAKE_INSTALL_BINDIR}"
+ ARCHIVE DESTINATION "${CMAKE_INSTALL_LIBDIR}"
+ LIBRARY DESTINATION "${CMAKE_INSTALL_LIBDIR}"
+ INCLUDES DESTINATION "${CMAKE_INSTALL_INCLUDEDIR}")
+ install(EXPORT asmjit-config
+ NAMESPACE asmjit::
+ DESTINATION "${CMAKE_INSTALL_LIBDIR}/cmake/asmjit")
+
foreach(_src_file ${ASMJIT_SRC_LIST})
if ("${_src_file}" MATCHES "\\.h$" AND NOT "${_src_file}" MATCHES "_p\\.h$")
get_filename_component(_src_dir ${_src_file} PATH)
- install(FILES "${ASMJIT_DIR}/src/${_src_file}" DESTINATION "include/${_src_dir}")
+ install(FILES "${ASMJIT_DIR}/src/${_src_file}" DESTINATION "${CMAKE_INSTALL_INCLUDEDIR}/${_src_dir}")
endif()
endforeach()
endif()
@@ -482,50 +545,65 @@ if (NOT ASMJIT_EMBED)
CFLAGS_REL ${ASMJIT_PRIVATE_CFLAGS_REL})
target_include_directories(asmjit_test_unit BEFORE PRIVATE ${ASMJIT_INCLUDE_DIRS})
- foreach(_target asmjit_test_opcode
- asmjit_test_x86_asm
+ asmjit_add_target(asmjit_test_assembler TEST
+ SOURCES test/asmjit_test_assembler.cpp
+ test/asmjit_test_assembler.h
+ test/asmjit_test_assembler_a64.cpp
+ test/asmjit_test_assembler_x64.cpp
+ test/asmjit_test_assembler_x86.cpp
+ LIBRARIES asmjit::asmjit
+ CFLAGS ${ASMJIT_PRIVATE_CFLAGS}
+ CFLAGS_DBG ${ASMJIT_PRIVATE_CFLAGS_DBG}
+ CFLAGS_REL ${ASMJIT_PRIVATE_CFLAGS_REL})
+
+ asmjit_add_target(asmjit_test_perf EXECUTABLE
+ SOURCES test/asmjit_test_perf.cpp
+ test/asmjit_test_perf_a64.cpp
+ test/asmjit_test_perf_x86.cpp
+ SOURCES test/asmjit_test_perf.h
+ LIBRARIES asmjit::asmjit
+ CFLAGS ${ASMJIT_PRIVATE_CFLAGS}
+ CFLAGS_DBG ${ASMJIT_PRIVATE_CFLAGS_DBG}
+ CFLAGS_REL ${ASMJIT_PRIVATE_CFLAGS_REL})
+
+ foreach(_target asmjit_test_emitters
asmjit_test_x86_sections)
asmjit_add_target(${_target} TEST
SOURCES test/${_target}.cpp
- LIBRARIES AsmJit::AsmJit
+ LIBRARIES asmjit::asmjit
CFLAGS ${ASMJIT_PRIVATE_CFLAGS}
CFLAGS_DBG ${ASMJIT_PRIVATE_CFLAGS_DBG}
CFLAGS_REL ${ASMJIT_PRIVATE_CFLAGS_REL})
endforeach()
if (NOT ASMJIT_NO_INTROSPECTION)
- asmjit_add_target(asmjit_test_x86_instinfo TEST
- SOURCES test/asmjit_test_x86_instinfo.cpp
- LIBRARIES AsmJit::AsmJit
+ asmjit_add_target(asmjit_test_instinfo TEST
+ SOURCES test/asmjit_test_instinfo.cpp
+ LIBRARIES asmjit::asmjit
CFLAGS ${ASMJIT_PRIVATE_CFLAGS}
CFLAGS_DBG ${ASMJIT_PRIVATE_CFLAGS_DBG}
CFLAGS_REL ${ASMJIT_PRIVATE_CFLAGS_REL})
endif()
if (NOT (ASMJIT_NO_BUILDER OR ASMJIT_NO_COMPILER))
- # Vectorcall tests and XMM tests require at least SSE2 (required in 32-bit mode).
+ # Vectorcall tests and XMM tests require at least SSE2 in 32-bit mode (in 64-bit mode it's implicit).
set(sse2_flags "")
if ("${CMAKE_CXX_COMPILER_ID}" STREQUAL "MSVC" OR "x${CMAKE_CXX_SIMULATE_ID}" STREQUAL "xMSVC")
asmjit_detect_cflags(sse2_flags "-arch:SSE2")
else()
asmjit_detect_cflags(sse2_flags "-msse2")
endif()
- asmjit_add_target(asmjit_test_x86_cc TEST
- SOURCES test/asmjit_test_x86_cc.cpp
- LIBRARIES AsmJit::AsmJit
+ asmjit_add_target(asmjit_test_compiler TEST
+ SOURCES test/asmjit_test_compiler.cpp
+ test/asmjit_test_compiler.h
+ test/asmjit_test_compiler_a64.cpp
+ test/asmjit_test_compiler_x86.cpp
+ LIBRARIES asmjit::asmjit
CFLAGS ${ASMJIT_PRIVATE_CFLAGS} ${sse2_flags}
CFLAGS_DBG ${ASMJIT_PRIVATE_CFLAGS_DBG}
CFLAGS_REL ${ASMJIT_PRIVATE_CFLAGS_REL})
endif()
- foreach(_target asmjit_bench_x86)
- asmjit_add_target(${_target} EXECUTABLE
- SOURCES test/${_target}.cpp
- LIBRARIES AsmJit::AsmJit
- CFLAGS ${ASMJIT_PRIVATE_CFLAGS}
- CFLAGS_DBG ${ASMJIT_PRIVATE_CFLAGS_DBG}
- CFLAGS_REL ${ASMJIT_PRIVATE_CFLAGS_REL})
- endforeach()
endif()
endif()
diff --git a/3rdparty/asmjit/README.md b/3rdparty/asmjit/README.md
index abe51bb2169..c683989c656 100644
--- a/3rdparty/asmjit/README.md
+++ b/3rdparty/asmjit/README.md
@@ -23,8 +23,10 @@ Breaking the API is sometimes inevitable, what to do?
* See [Breaking Changes Guide](https://asmjit.com/doc/group__asmjit__breaking__changes.html), which is now part of AsmJit documentation.
* See asmjit tests, they always compile and provide implementation of many use-cases:
- * [asmjit_test_x86_asm.cpp](./test/asmjit_test_x86_asm.cpp) - Tests that demonstrate the purpose of emitters.
- * [asmjit_test_x86_cc.cpp](./test/asmjit_test_x86_cc.cpp) - A lot of tests targeting Compiler infrastructure.
+ * [asmjit_test_emitters.cpp](./test/asmjit_test_emitters.cpp) - Tests that demonstrate the purpose of emitters.
+ * [asmjit_test_assembler_x86.cpp](./test/asmjit_test_assembler_x86.cpp) - Tests targeting AsmJit's Assembler (x86/x64).
+ * [asmjit_test_compiler_x86.cpp](./test/asmjit_test_compiler_x86.cpp) - Tests targeting AsmJit's Compiler (x86/x64).
+ * [asmjit_test_instinfo.cpp](./test/asmjit_test_instinfo.cpp) - Tests that query instruction information.
* [asmjit_test_x86_sections.cpp](./test/asmjit_test_x86_sections.cpp) - Multiple sections test.
* Visit our [Official Chat](https://gitter.im/asmjit/asmjit) if you need a quick help.
@@ -44,12 +46,19 @@ TODO
----
* [ ] Core:
- * [ ] Add support for user external buffers in CodeHolder.
+ * [ ] Add support for user external buffers in CodeBuffer / CodeHolder.
* [ ] Ports:
- * [ ] ARM/Thumb/AArch64 support.
+ * [ ] 32-bit ARM/Thumb port.
+ * [ ] 64-bit ARM (AArch64) port.
+ * [ ] RISC-V port.
-Donors
-------
+Support
+-------
+
+ * AsmJit project has both community and commercial support, see [AsmJit's Support Page](https://asmjit.com/support.html)
+ * You can help the development and maintenance through Petr Kobalicek's [GitHub sponsors Profile](https://github.com/sponsors/kobalicek)
+
+Notable Donors List:
* [ZehMatt](https://github.com/ZehMatt)
diff --git a/3rdparty/asmjit/src/asmjit.natvis b/3rdparty/asmjit/src/asmjit.natvis
index b73d8487276..68012e0d15a 100644
--- a/3rdparty/asmjit/src/asmjit.natvis
+++ b/3rdparty/asmjit/src/asmjit.natvis
@@ -34,50 +34,94 @@
</Expand>
</Type>
- <Type Name="asmjit::Operand_">
- <Intrinsic Name="opType" Expression="(unsigned int)(_signature &amp; 0x7)" />
- <Intrinsic Name="opSize" Expression="(_signature &gt;&gt; 24) &amp; 0xFF" />
-
- <Intrinsic Name="regType" Expression="(_signature &gt;&gt; 3) &amp; 0x1F" />
- <Intrinsic Name="regGroup" Expression="(_signature &gt;&gt; 8) &amp; 0xF" />
-
- <Intrinsic Name="memBaseType" Expression="(_signature &gt;&gt; 3) &amp; 0x1F" />
- <Intrinsic Name="memIndexType" Expression="(_signature &gt;&gt; 8) &amp; 0x1F" />
- <Intrinsic Name="memAddrType" Expression="(_signature &gt;&gt; 13) &amp; 0x3" />
- <Intrinsic Name="memRegHome" Expression="(_signature &gt;&gt; 15) &amp; 0x1" />
+ <Type Name="asmjit::OperandSignature">
+ <Intrinsic Name="opType" Expression="(asmjit::OperandType)(_bits &amp; 0x7)" />
+ <Intrinsic Name="opSize" Expression="(_bits &gt;&gt; 24) &amp; 0xFF" />
+ <Intrinsic Name="regType" Expression="(asmjit::RegType)((_bits &gt;&gt; 3) &amp; 0x1F)" />
+ <Intrinsic Name="regGroup" Expression="(asmjit::RegGroup)((_bits &gt;&gt; 8) &amp; 0xF)" />
+ <Intrinsic Name="memBaseType" Expression="(asmjit::RegType)((_bits &gt;&gt; 3) &amp; 0x1F)" />
+ <Intrinsic Name="memIndexType" Expression="(asmjit::RegType)((_bits &gt;&gt; 8) &amp; 0x1F)" />
+ <Intrinsic Name="memRegHome" Expression="(bool)((_bits &gt;&gt; 13) &amp; 0x1)" />
+ <Intrinsic Name="memX86Segment" Expression="(asmjit::x86::SReg::Id)((_bits &gt;&gt; 18) &amp; 0x7)" />
+ <Intrinsic Name="memX86AddrType" Expression="(asmjit::x86::Mem::AddrType)((_bits &gt;&gt; 14) &amp; 0x3)" />
+ <Intrinsic Name="memX86ShiftValue" Expression="((_bits &gt;&gt; 16) &amp; 0x3)" />
+ <Intrinsic Name="memX86Broadcast" Expression="(asmjit::x86::Mem::Broadcast)((_bits &gt;&gt; 21) &amp; 0x7)" />
+ <Intrinsic Name="immType" Expression="(asmjit::ImmType)((_bits &gt;&gt; 3) &amp; 0x1)" />
+
+ <DisplayString Condition="opType() == asmjit::OperandType::kNone">[None]</DisplayString>
+ <DisplayString Condition="opType() == asmjit::OperandType::kReg">[Reg] {{ type={regType()} group={regGroup()} size={opSize(), d} }}</DisplayString>
+ <DisplayString Condition="opType() == asmjit::OperandType::kMem">[Mem] {{ base={memBaseType()} index={memIndexType()} }}</DisplayString>
+ <DisplayString Condition="opType() == asmjit::OperandType::kImm">[Imm] {{ type={immType()} }}</DisplayString>
+ <DisplayString Condition="opType() == asmjit::OperandType::kLabel">[Label]</DisplayString>
+ <DisplayString Condition="opType() &gt; asmjit::OperandType::kMaxValue">[Unknown]</DisplayString>
+ <Expand HideRawView="true">
+ <Item Name="bits">_bits, X</Item>
+ <Item Name="op.type">opType()</Item>
+ <Item Name="reg.type" Condition="opType() == asmjit::OperandType::kReg">regType()</Item>
+ <Item Name="reg.group" Condition="opType() == asmjit::OperandType::kReg">regGroup()</Item>
+ <Item Name="reg.size" Condition="opType() == asmjit::OperandType::kReg">opSize(), d</Item>
+ <Item Name="mem.baseType" Condition="opType() == asmjit::OperandType::kMem">memBaseType()</Item>
+ <Item Name="mem.indexType" Condition="opType() == asmjit::OperandType::kMem">memIndexType()</Item>
+ <Item Name="mem.regHome" Condition="opType() == asmjit::OperandType::kMem">memRegHome()</Item>
+ <Item Name="mem.size" Condition="opType() == asmjit::OperandType::kMem">opSize(), d</Item>
+ <Item Name="mem.x86.segment" Condition="opType() == asmjit::OperandType::kMem">memX86Segment()</Item>
+ <Item Name="mem.x86.addrType" Condition="opType() == asmjit::OperandType::kMem">memX86AddrType()</Item>
+ <Item Name="mem.x86.shift" Condition="opType() == asmjit::OperandType::kMem">memX86ShiftValue()</Item>
+ <Item Name="mem.x86.broadcast" Condition="opType() == asmjit::OperandType::kMem">memX86Broadcast()</Item>
+ <Item Name="imm.type" Condition="opType() == asmjit::OperandType::kImm">immType()</Item>
+ </Expand>
+ </Type>
+
+ <Type Name="asmjit::Operand_">
+ <Intrinsic Name="opType" Expression="(asmjit::OperandType)(_signature._bits &amp; 0x7)" />
+ <Intrinsic Name="opSize" Expression="(_signature._bits &gt;&gt; 24) &amp; 0xFF" />
+ <Intrinsic Name="regType" Expression="(asmjit::RegType)((_signature._bits &gt;&gt; 3) &amp; 0x1F)" />
+ <Intrinsic Name="regGroup" Expression="(asmjit::RegGroup)((_signature._bits &gt;&gt; 8) &amp; 0xF)" />
+ <Intrinsic Name="memBaseType" Expression="(asmjit::RegType)((_signature._bits &gt;&gt; 3) &amp; 0x1F)" />
+ <Intrinsic Name="memIndexType" Expression="(asmjit::RegType)((_signature._bits &gt;&gt; 8) &amp; 0x1F)" />
+ <Intrinsic Name="memRegHome" Expression="(bool)((_signature._bits &gt;&gt; 13) &amp; 0x1)" />
+ <Intrinsic Name="memX86Segment" Expression="(asmjit::x86::SReg::Id)((_signature._bits &gt;&gt; 18) &amp; 0x7)" />
+ <Intrinsic Name="memX86AddrType" Expression="(asmjit::x86::Mem::AddrType)((_signature._bits &gt;&gt; 14) &amp; 0x3)" />
+ <Intrinsic Name="memX86ShiftValue" Expression="((_signature._bits &gt;&gt; 16) &amp; 0x3)" />
+ <Intrinsic Name="memX86Broadcast" Expression="(asmjit::x86::Mem::Broadcast)((_signature._bits &gt;&gt; 21) &amp; 0x7)" />
<Intrinsic Name="memBaseId" Expression="_baseId" />
<Intrinsic Name="memIndexId" Expression="_data[0]" />
-
<Intrinsic Name="memOffset32b" Expression="(__int64)int(_data[1])" />
<Intrinsic Name="memOffset64b" Expression="(__int64) ((unsigned __int64)_baseId &lt;&lt; 32) | ((unsigned __int64)_data[1])" />
- <Intrinsic Name="memOffset" Expression="memBaseType() != 0 ? memOffset32b() : memOffset64b()" />
-
+ <Intrinsic Name="memOffset" Expression="memBaseType() != asmjit::RegType::kNone ? memOffset32b() : memOffset64b()" />
+ <Intrinsic Name="immType" Expression="(asmjit::ImmType)((_signature._bits &gt;&gt; 3) &amp; 0x1)" />
<Intrinsic Name="immValue" Expression="((__int64)_data[1] &lt;&lt; 32) | (__int64)_data[0]" />
- <DisplayString Condition="opType() == 0">[None]</DisplayString>
- <DisplayString Condition="opType() == 1">[Reg] {{ id={_baseId, d} group={regGroup(), d} type={regType(), d} size={opSize(), d} }}</DisplayString>
- <DisplayString Condition="opType() == 2">[Mem] {{ baseId={memBaseId(), d} indexId={memIndexId(), d} offset={(__int64)memOffset(), d} }}</DisplayString>
- <DisplayString Condition="opType() == 3">[Imm] {{ val={immValue(), d} hex={immValue(), X} }}</DisplayString>
- <DisplayString Condition="opType() == 4">[Label] {{ id={_baseId} }}</DisplayString>
+ <DisplayString Condition="opType() == asmjit::OperandType::kNone">[None]</DisplayString>
+ <DisplayString Condition="opType() == asmjit::OperandType::kReg">[Reg] {{ id={_baseId, d} group={regGroup(), d} type={regType(), d} size={opSize(), d} }}</DisplayString>
+ <DisplayString Condition="opType() == asmjit::OperandType::kMem">[Mem] {{ baseId={memBaseId(), d} indexId={memIndexId(), d} offset={(__int64)memOffset(), d} }}</DisplayString>
+ <DisplayString Condition="opType() == asmjit::OperandType::kImm">[Imm] {{ val={immValue(), d} hex={immValue(), X} }}</DisplayString>
+ <DisplayString Condition="opType() == asmjit::OperandType::kLabel">[Label] {{ id={_baseId} }}</DisplayString>
<DisplayString Condition="opType() &gt; 4">[Unknown]</DisplayString>
<Expand HideRawView="true">
- <Item Name="_signature">_signature, X</Item>
- <Item Name="_signature.any.type">(asmjit::Operand_::OpType)opType()</Item>
- <Item Name="_signature.any.size">opSize(), d</Item>
- <Item Name="_signature.reg.type" Condition="opType() == 1">(asmjit::BaseReg::RegType)regType()</Item>
- <Item Name="_signature.reg.group" Condition="opType() == 1">(asmjit::BaseReg::RegGroup)regGroup()</Item>
- <Item Name="_signature.mem.baseType" Condition="opType() == 2">(asmjit::BaseReg::RegType)memBaseType()</Item>
- <Item Name="_signature.mem.indexType" Condition="opType() == 2">(asmjit::BaseReg::RegType)memIndexType()</Item>
- <Item Name="_signature.mem.addrType" Condition="opType() == 2">(asmjit::BaseMem::AddrType)memAddrType()</Item>
- <Item Name="_signature.mem.regHome" Condition="opType() == 2">(bool)memRegHome()</Item>
- <Item Name="_baseId">_baseId</Item>
- <Item Name="_data[0]" Condition="opType() != 2 &amp;&amp; opType() != 3">_data[0]</Item>
- <Item Name="_data[1]" Condition="opType() != 2 &amp;&amp; opType() != 3">_data[1]</Item>
- <Item Name="_data[IndexId]" Condition="opType() == 2">_data[0]</Item>
- <Item Name="_data[OffsetLo]" Condition="opType() == 2">_data[1]</Item>
- <Item Name="_data[ImmHi]" Condition="opType() == 3">_data[0]</Item>
- <Item Name="_data[ImmLo]" Condition="opType() == 3">_data[1]</Item>
+ <Item Name="_signature">_signature._bits, X</Item>
+ <Item Name="op.type">opType()</Item>
+ <Item Name="op.size">opSize(), d</Item>
+ <Item Name="reg.type" Condition="opType() == asmjit::OperandType::kReg">regType()</Item>
+ <Item Name="reg.group" Condition="opType() == asmjit::OperandType::kReg">regGroup()</Item>
+ <Item Name="reg.id" Condition="opType() == asmjit::OperandType::kReg">_baseId, d</Item>
+ <Item Name="mem.baseType" Condition="opType() == asmjit::OperandType::kMem">memBaseType()</Item>
+ <Item Name="mem.baseId" Condition="opType() == asmjit::OperandType::kMem &amp;&amp; memBaseType() != asmjit::RegType::kNone">memBaseId()</Item>
+ <Item Name="mem.indexType" Condition="opType() == asmjit::OperandType::kMem">memIndexType()</Item>
+ <Item Name="mem.indexId" Condition="opType() == asmjit::OperandType::kMem &amp;&amp; memIndexType() != asmjit::RegType::kNone">memIndexId()</Item>
+ <Item Name="mem.regHome" Condition="opType() == asmjit::OperandType::kMem">memRegHome()</Item>
+ <Item Name="mem.offset" Condition="opType() == asmjit::OperandType::kMem">memOffset(), d</Item>
+ <Item Name="mem.x86.segment" Condition="opType() == asmjit::OperandType::kMem">memX86Segment()</Item>
+ <Item Name="mem.x86.addrType" Condition="opType() == asmjit::OperandType::kMem">memX86AddrType()</Item>
+ <Item Name="mem.x86.shift" Condition="opType() == asmjit::OperandType::kMem">memX86ShiftValue()</Item>
+ <Item Name="mem.x86.broadcast" Condition="opType() == asmjit::OperandType::kMem">memX86Broadcast()</Item>
+ <Item Name="imm.type" Condition="opType() == asmjit::OperandType::kImm">immType()</Item>
+ <Item Name="imm.value" Condition="opType() == asmjit::OperandType::kImm">immValue(), X</Item>
+ <Item Name="label.id" Condition="opType() == asmjit::OperandType::kLabel">_baseId, d</Item>
+ <Item Name="raw.baseId">_baseId</Item>
+ <Item Name="raw.data[0]">_data[0]</Item>
+ <Item Name="raw.data[1]">_data[1]</Item>
</Expand>
</Type>
@@ -98,7 +142,7 @@
<Expand HideRawView="true">
<Item Name="data">_data</Item>
- <Item Name="typeId">(asmjit::Type::Id)(typeId())</Item>
+ <Item Name="typeId">(asmjit::TypeId)(typeId())</Item>
<Item Name="regType" Condition="isReg()">(asmjit::BaseReg::RegType)regType()</Item>
<Item Name="regId" Condition="isReg()">regId()</Item>
<Item Name="stackOffset" Condition="isStack()">stackOffset()</Item>
@@ -108,26 +152,26 @@
<Type Name="asmjit::BaseNode">
<Intrinsic Name="nodeType" Expression="_any._nodeType" />
- <Intrinsic Name="isInst" Expression="nodeType() == asmjit::BaseNode::kNodeInst"></Intrinsic>
- <Intrinsic Name="isSection" Expression="nodeType() == asmjit::BaseNode::kNodeSection"></Intrinsic>
- <Intrinsic Name="isLabel" Expression="nodeType() == asmjit::BaseNode::kNodeLabel"></Intrinsic>
- <Intrinsic Name="isAlign" Expression="nodeType() == asmjit::BaseNode::kNodeAlign"></Intrinsic>
- <Intrinsic Name="isEmbedData" Expression="nodeType() == asmjit::BaseNode::kNodeEmbedData"></Intrinsic>
- <Intrinsic Name="isEmbedLabel" Expression="nodeType() == asmjit::BaseNode::kNodeEmbedLabel"></Intrinsic>
- <Intrinsic Name="isEmbedLabelDelta" Expression="nodeType() == asmjit::BaseNode::kNodeEmbedLabelDelta"></Intrinsic>
- <Intrinsic Name="isConstPool" Expression="nodeType() == asmjit::BaseNode::kNodeConstPool"></Intrinsic>
- <Intrinsic Name="isComment" Expression="nodeType() == asmjit::BaseNode::kNodeComment"></Intrinsic>
- <Intrinsic Name="isSentinel" Expression="nodeType() == asmjit::BaseNode::kNodeSentinel"></Intrinsic>
- <Intrinsic Name="isJump" Expression="nodeType() == asmjit::BaseNode::kNodeJump"></Intrinsic>
- <Intrinsic Name="isFunc" Expression="nodeType() == asmjit::BaseNode::kNodeFunc"></Intrinsic>
- <Intrinsic Name="isFuncRet" Expression="nodeType() == asmjit::BaseNode::kNodeFuncRet"></Intrinsic>
- <Intrinsic Name="isInvoke" Expression="nodeType() == asmjit::BaseNode::kNodeInvoke"></Intrinsic>
+ <Intrinsic Name="isInst" Expression="nodeType() == asmjit::NodeType::kInst"></Intrinsic>
+ <Intrinsic Name="isSection" Expression="nodeType() == asmjit::NodeType::kSection"></Intrinsic>
+ <Intrinsic Name="isLabel" Expression="nodeType() == asmjit::NodeType::kLabel"></Intrinsic>
+ <Intrinsic Name="isAlign" Expression="nodeType() == asmjit::NodeType::kAlign"></Intrinsic>
+ <Intrinsic Name="isEmbedData" Expression="nodeType() == asmjit::NodeType::kEmbedData"></Intrinsic>
+ <Intrinsic Name="isEmbedLabel" Expression="nodeType() == asmjit::NodeType::kEmbedLabel"></Intrinsic>
+ <Intrinsic Name="isEmbedLabelDelta" Expression="nodeType() == asmjit::NodeType::kEmbedLabelDelta"></Intrinsic>
+ <Intrinsic Name="isConstPool" Expression="nodeType() == asmjit::NodeType::kConstPool"></Intrinsic>
+ <Intrinsic Name="isComment" Expression="nodeType() == asmjit::NodeType::kComment"></Intrinsic>
+ <Intrinsic Name="isSentinel" Expression="nodeType() == asmjit::NodeType::kSentinel"></Intrinsic>
+ <Intrinsic Name="isJump" Expression="nodeType() == asmjit::NodeType::kJump"></Intrinsic>
+ <Intrinsic Name="isFunc" Expression="nodeType() == asmjit::NodeType::kFunc"></Intrinsic>
+ <Intrinsic Name="isFuncRet" Expression="nodeType() == asmjit::NodeType::kFuncRet"></Intrinsic>
+ <Intrinsic Name="isInvoke" Expression="nodeType() == asmjit::NodeType::kInvoke"></Intrinsic>
<Intrinsic Name="actsAsInst" Expression="isInst() || isJump() || isFunc() || isFuncRet() || isInvoke()" />
<Intrinsic Name="actsAsLabel" Expression="isLabel() || isFunc()" />
<DisplayString Condition="isInst()">[InstNode]</DisplayString>
- <DisplayString Condition="isSentinel()">[SectionNode]</DisplayString>
+ <DisplayString Condition="isSection()">[SectionNode]</DisplayString>
<DisplayString Condition="isLabel()">[LabelNode]</DisplayString>
<DisplayString Condition="isAlign()">[AlignNode]</DisplayString>
<DisplayString Condition="isEmbedData()">[EmbedDataNode]</DisplayString>
@@ -140,14 +184,14 @@
<DisplayString Condition="isFunc()">[FuncNode]</DisplayString>
<DisplayString Condition="isFuncRet()">[FuncRetNode]</DisplayString>
<DisplayString Condition="isInvoke()">[InvokeNode]</DisplayString>
- <DisplayString Condition="nodeType() == 0 || nodeType() &gt; 18">[UnknownNode {nodeType(), d}]</DisplayString>
+ <DisplayString Condition="nodeType() == asmjit::NodeType::kNone || nodeType() &gt; 18">[UnknownNode {nodeType(), d}]</DisplayString>
<Expand HideRawView="true">
<Item Name="prev">_prev</Item>
<Item Name="next">_next</Item>
- <Item Name="nodeType">(asmjit::BaseNode::NodeType)_any._nodeType</Item>
- <Item Name="nodeFlags">(asmjit::BaseNode::Flags)_any._nodeFlags</Item>
+ <Item Name="nodeType">_any._nodeType</Item>
+ <Item Name="nodeFlags">_any._nodeFlags</Item>
<Item Name="position">_position</Item>
<Item Name="userData.u64">_userDataU64</Item>
@@ -163,9 +207,9 @@
<Item Name="sectionId" Condition="isSection()">((asmjit::SectionNode*)this)-&gt;_id</Item>
<Item Name="nextSection" Condition="isSection()">((asmjit::SectionNode*)this)-&gt;_nextSection</Item>
- <Item Name="labelId" Condition="isLabel()">((asmjit::LabelNode*)this)-&gt;_id</Item>
+ <Item Name="labelId" Condition="isLabel()">((asmjit::LabelNode*)this)-&gt;_labelId</Item>
- <Item Name="alignMode" Condition="isAlign()">((asmjit::AlignNode*)this)-&gt;_alignMode</Item>
+ <Item Name="alignMode" Condition="isAlign()">((asmjit::AlignNode*)this)-&gt;_alignData._alignMode</Item>
<Item Name="alignment" Condition="isAlign()">((asmjit::AlignNode*)this)-&gt;_alignment</Item>
<Item Name="typeId" Condition="isEmbedData()">_embed._typeId, d</Item>
@@ -175,15 +219,15 @@
<Item Name="inlineData" Condition="isEmbedData()">((asmjit::EmbedDataNode*)this)-&gt;_inlineData</Item>
<Item Name="externalData" Condition="isEmbedData()">((asmjit::EmbedDataNode*)this)-&gt;_externalData</Item>
- <Item Name="labelId" Condition="isEmbedLabel()">((asmjit::EmbedLabelNode*)this)-&gt;_id</Item>
+ <Item Name="labelId" Condition="isEmbedLabel()">((asmjit::EmbedLabelNode*)this)-&gt;_labelId</Item>
- <Item Name="labelId" Condition="isEmbedLabelDelta()">((asmjit::EmbedLabelDeltaNode*)this)-&gt;_id</Item>
- <Item Name="baseId" Condition="isEmbedLabelDelta()">((asmjit::EmbedLabelDeltaNode*)this)-&gt;_baseId</Item>
+ <Item Name="labelId" Condition="isEmbedLabelDelta()">((asmjit::EmbedLabelDeltaNode*)this)-&gt;_labelId</Item>
+ <Item Name="baseLabelId" Condition="isEmbedLabelDelta()">((asmjit::EmbedLabelDeltaNode*)this)-&gt;_baseLabelId</Item>
<Item Name="dataSize" Condition="isEmbedLabelDelta()">((asmjit::EmbedLabelDeltaNode*)this)-&gt;_dataSize</Item>
<Item Name="constPool" Condition="isConstPool()">((asmjit::ConstPoolNode*)this)-&gt;_constPool</Item>
- <Item Name="sentinel.sentinelType" Condition="isSentinel()">(asmjit::SentinelNode::SentinelType)_sentinel._sentinelType</Item>
+ <Item Name="sentinel.sentinelType" Condition="isSentinel()">_sentinel._sentinelType</Item>
<Item Name="annotation" Condition="isJump()">((asmjit::JumpNode*)this)-&gt;_annotation</Item>
@@ -194,7 +238,7 @@
<Item Name="args" Condition="isFunc()">((asmjit::FuncNode*)this)-&gt;_args, [((asmjit::FuncNode*)this)-&gt;_funcDetail._argCount]</Item>
<Item Name="funcDetail" Condition="isInvoke()">((asmjit::InvokeNode*)this)-&gt;_funcDetail</Item>
- <Item Name="rets" Condition="isInvoke()">((asmjit::InvokeNode*)this)-&gt;_rets, [((asmjit::InvokeNode*)this)-&gt;_funcDetail._retCount]</Item>
+ <Item Name="rets" Condition="isInvoke()">((asmjit::InvokeNode*)this)-&gt;_rets</Item>
<Item Name="args" Condition="isInvoke()">((asmjit::InvokeNode*)this)-&gt;_args, [((asmjit::InvokeNode*)this)-&gt;_funcDetail._argCount]</Item>
</Expand>
</Type>
diff --git a/3rdparty/asmjit/src/asmjit/a64.h b/3rdparty/asmjit/src/asmjit/a64.h
new file mode 100644
index 00000000000..ea4d304f058
--- /dev/null
+++ b/3rdparty/asmjit/src/asmjit/a64.h
@@ -0,0 +1,62 @@
+// This file is part of AsmJit project <https://asmjit.com>
+//
+// See asmjit.h or LICENSE.md for license and copyright information
+// SPDX-License-Identifier: Zlib
+
+#ifndef ASMJIT_A64_H_INCLUDED
+#define ASMJIT_A64_H_INCLUDED
+
+//! \addtogroup asmjit_a64
+//!
+//! ### Emitters
+//!
+//! - \ref a64::Assembler - AArch64 assembler (must read, provides examples).
+//! - \ref a64::Builder - AArch64 builder.
+//! - \ref a64::Compiler - AArch64 compiler.
+//! - \ref a64::Emitter - AArch64 emitter (abstract).
+//!
+//! ### Supported Instructions
+//!
+//! - Emitters:
+//! - \ref a64::EmitterExplicitT - Provides all instructions that use explicit
+//! operands, provides also utility functions. The member functions provided
+//! are part of all ARM/AArch64 emitters.
+//!
+//! - Instruction representation:
+//! - \ref a64::Inst::Id - instruction identifiers.
+//!
+//! ### Register Operands
+//!
+//! - \ref arm::Reg - Base class for any AArch32/AArch64 register.
+//! - \ref arm::Gp - General purpose register:
+//! - \ref arm::GpW - 32-bit register.
+//! - \ref arm::GpX - 64-bit register.
+//! - \ref arm::Vec - Vector (SIMD) register:
+//! - \ref arm::VecB - 8-bit SIMD register (AArch64 only).
+//! - \ref arm::VecH - 16-bit SIMD register (AArch64 only).
+//! - \ref arm::VecS - 32-bit SIMD register.
+//! - \ref arm::VecD - 64-bit SIMD register.
+//! - \ref arm::VecV - 128-bit SIMD register.
+//!
+//! ### Memory Operands
+//!
+//! - \ref arm::Mem - AArch32/AArch64 memory operand that provides support for all ARM addressing features
+//! including base, index, pre/post increment, and ARM-specific shift addressing and index extending.
+//!
+//! ### Other
+//!
+//! - \ref arm::Shift - Shift operation and value.
+//! - \ref a64::Utils - Utilities that can help during code generation for AArch64.
+
+#include "./arm.h"
+#include "./arm/a64assembler.h"
+#include "./arm/a64builder.h"
+#include "./arm/a64compiler.h"
+#include "./arm/a64emitter.h"
+#include "./arm/a64globals.h"
+#include "./arm/a64instdb.h"
+#include "./arm/a64operand.h"
+#include "./arm/a64utils.h"
+
+#endif // ASMJIT_A64_H_INCLUDED
+
diff --git a/3rdparty/asmjit/src/asmjit/arm.h b/3rdparty/asmjit/src/asmjit/arm.h
new file mode 100644
index 00000000000..57ffa815b8c
--- /dev/null
+++ b/3rdparty/asmjit/src/asmjit/arm.h
@@ -0,0 +1,62 @@
+// This file is part of AsmJit project <https://asmjit.com>
+//
+// See asmjit.h or LICENSE.md for license and copyright information
+// SPDX-License-Identifier: Zlib
+
+#ifndef ASMJIT_ARM_H_INCLUDED
+#define ASMJIT_ARM_H_INCLUDED
+
+//! \addtogroup asmjit_arm
+//!
+//! ### Namespaces
+//!
+//! - \ref arm - arm namespace provides common functionality for both AArch32 and AArch64 backends.
+//! - \ref a64 - a64 namespace provides support for AArch64 architecture. In addition it includes
+//! \ref arm namespace, so you can only use a single namespace when targeting AArch64 architecture.
+//!
+//! ### Emitters
+//!
+//! - AArch64
+//! - \ref a64::Assembler - AArch64 assembler (must read, provides examples).
+//! - \ref a64::Builder - AArch64 builder.
+//! - \ref a64::Compiler - AArch64 compiler.
+//! - \ref a64::Emitter - AArch64 emitter (abstract).
+//!
+//! ### Supported Instructions
+//!
+//! - AArch64:
+//! - Emitters:
+//! - \ref a64::EmitterExplicitT - Provides all instructions that use explicit operands, provides also
+//! utility functions. The member functions provided are part of all AArch64 emitters.
+//! - Instruction representation:
+//! - \ref a64::Inst::Id - instruction identifiers.
+//!
+//! ### Register Operands
+//!
+//! - \ref arm::Reg - Base class for any AArch32/AArch64 register.
+//! - \ref arm::Gp - General purpose register:
+//! - \ref arm::GpW - 32-bit register.
+//! - \ref arm::GpX - 64-bit register.
+//! - \ref arm::Vec - Vector (SIMD) register:
+//! - \ref arm::VecB - 8-bit SIMD register (AArch64 only).
+//! - \ref arm::VecH - 16-bit SIMD register (AArch64 only).
+//! - \ref arm::VecS - 32-bit SIMD register.
+//! - \ref arm::VecD - 64-bit SIMD register.
+//! - \ref arm::VecV - 128-bit SIMD register.
+//!
+//! ### Memory Operands
+//!
+//! - \ref arm::Mem - AArch32/AArch64 memory operand that provides support for all ARM addressing features
+//! including base, index, pre/post increment, and ARM-specific shift addressing and index extending.
+//!
+//! ### Other
+//!
+//! - \ref arm::Shift - Shift operation and value (both AArch32 and AArch64).
+//! - \ref arm::DataType - Data type that is part of an instruction in AArch32 mode.
+//! - \ref a64::Utils - Utilities that can help during code generation for AArch64.
+
+#include "./core.h"
+#include "./arm/armglobals.h"
+#include "./arm/armoperand.h"
+
+#endif // ASMJIT_ARM_H_INCLUDED
diff --git a/3rdparty/asmjit/src/asmjit/arm/a64archtraits_p.h b/3rdparty/asmjit/src/asmjit/arm/a64archtraits_p.h
new file mode 100644
index 00000000000..87559c71d5a
--- /dev/null
+++ b/3rdparty/asmjit/src/asmjit/arm/a64archtraits_p.h
@@ -0,0 +1,81 @@
+// This file is part of AsmJit project <https://asmjit.com>
+//
+// See asmjit.h or LICENSE.md for license and copyright information
+// SPDX-License-Identifier: Zlib
+
+#ifndef ASMJIT_ARM_A64ARCHTRAITS_P_H_INCLUDED
+#define ASMJIT_ARM_A64ARCHTRAITS_P_H_INCLUDED
+
+#include "../core/archtraits.h"
+#include "../core/misc_p.h"
+#include "../core/type.h"
+#include "../arm/a64operand.h"
+
+ASMJIT_BEGIN_SUB_NAMESPACE(a64)
+
+//! \cond INTERNAL
+//! \addtogroup asmjit_a64
+//! \{
+
+static const constexpr ArchTraits a64ArchTraits = {
+ // SP/FP/LR/PC.
+ Gp::kIdSp, Gp::kIdFp, Gp::kIdLr, 0xFF,
+
+ // Reserved.
+ { 0, 0, 0 },
+
+ // HW stack alignment (AArch64 requires stack aligned to 64 bytes).
+ 16,
+
+ // Min/max stack offset - byte addressing is the worst, VecQ addressing the best.
+ 4095, 65520,
+
+ // Instruction hints [Gp, Vec, ExtraVirt2, ExtraVirt3].
+ {{
+ InstHints::kPushPop,
+ InstHints::kPushPop,
+ InstHints::kNoHints,
+ InstHints::kNoHints
+ }},
+
+ // RegInfo.
+ #define V(index) OperandSignature{arm::RegTraits<RegType(index)>::kSignature}
+ {{ ASMJIT_LOOKUP_TABLE_32(V, 0) }},
+ #undef V
+
+ // RegTypeToTypeId.
+ #define V(index) TypeId(arm::RegTraits<RegType(index)>::kTypeId)
+ {{ ASMJIT_LOOKUP_TABLE_32(V, 0) }},
+ #undef V
+
+ // TypeIdToRegType.
+ #define V(index) (index + uint32_t(TypeId::_kBaseStart) == uint32_t(TypeId::kInt8) ? RegType::kARM_GpW : \
+ index + uint32_t(TypeId::_kBaseStart) == uint32_t(TypeId::kUInt8) ? RegType::kARM_GpW : \
+ index + uint32_t(TypeId::_kBaseStart) == uint32_t(TypeId::kInt16) ? RegType::kARM_GpW : \
+ index + uint32_t(TypeId::_kBaseStart) == uint32_t(TypeId::kUInt16) ? RegType::kARM_GpW : \
+ index + uint32_t(TypeId::_kBaseStart) == uint32_t(TypeId::kInt32) ? RegType::kARM_GpW : \
+ index + uint32_t(TypeId::_kBaseStart) == uint32_t(TypeId::kUInt32) ? RegType::kARM_GpW : \
+ index + uint32_t(TypeId::_kBaseStart) == uint32_t(TypeId::kInt64) ? RegType::kARM_GpX : \
+ index + uint32_t(TypeId::_kBaseStart) == uint32_t(TypeId::kUInt64) ? RegType::kARM_GpX : \
+ index + uint32_t(TypeId::_kBaseStart) == uint32_t(TypeId::kIntPtr) ? RegType::kARM_GpX : \
+ index + uint32_t(TypeId::_kBaseStart) == uint32_t(TypeId::kUIntPtr) ? RegType::kARM_GpX : \
+ index + uint32_t(TypeId::_kBaseStart) == uint32_t(TypeId::kFloat32) ? RegType::kARM_VecS : \
+ index + uint32_t(TypeId::_kBaseStart) == uint32_t(TypeId::kFloat64) ? RegType::kARM_VecD : RegType::kNone)
+ {{ ASMJIT_LOOKUP_TABLE_32(V, 0) }},
+ #undef V
+
+ // Word names of 8-bit, 16-bit, 32-bit, and 64-bit quantities.
+ {
+ ArchTypeNameId::kByte,
+ ArchTypeNameId::kHWord,
+ ArchTypeNameId::kWord,
+ ArchTypeNameId::kXWord
+ }
+};
+
+//! \}
+//! \endcond
+
+ASMJIT_END_SUB_NAMESPACE
+
+#endif // ASMJIT_ARM_A64ARCHTRAITS_P_H_INCLUDED
diff --git a/3rdparty/asmjit/src/asmjit/arm/a64assembler.cpp b/3rdparty/asmjit/src/asmjit/arm/a64assembler.cpp
new file mode 100644
index 00000000000..9f8c9b1a9f2
--- /dev/null
+++ b/3rdparty/asmjit/src/asmjit/arm/a64assembler.cpp
@@ -0,0 +1,5115 @@
+// This file is part of AsmJit project <https://asmjit.com>
+//
+// See asmjit.h or LICENSE.md for license and copyright information
+// SPDX-License-Identifier: Zlib
+
+#include "../core/api-build_p.h"
+#if !defined(ASMJIT_NO_AARCH64)
+
+#include "../core/codewriter_p.h"
+#include "../core/cpuinfo.h"
+#include "../core/emitterutils_p.h"
+#include "../core/formatter.h"
+#include "../core/logger.h"
+#include "../core/misc_p.h"
+#include "../core/support.h"
+#include "../arm/armformatter_p.h"
+#include "../arm/a64assembler.h"
+#include "../arm/a64emithelper_p.h"
+#include "../arm/a64instdb_p.h"
+#include "../arm/a64utils.h"
+
+ASMJIT_BEGIN_SUB_NAMESPACE(a64)
+
+// a64::Assembler - Cond
+// =====================
+
+static inline uint32_t condCodeToOpcodeCond(uint32_t cond) noexcept {
+ return (uint32_t(cond) - 2u) & 0xFu;
+}
+
+// a64::Assembler - Bits
+// =====================
+
+template<typename T>
+static inline constexpr uint32_t B(const T& index) noexcept { return uint32_t(1u) << uint32_t(index); }
+
+static constexpr uint32_t kSP = Gp::kIdSp;
+static constexpr uint32_t kZR = Gp::kIdZr;
+static constexpr uint32_t kWX = InstDB::kWX;
+
+// a64::Assembler - ShiftOpToLdStOptMap
+// ====================================
+
+// Table that maps ShiftOp to OPT part in LD/ST (register) opcode.
+#define VALUE(index) index == uint32_t(ShiftOp::kUXTW) ? 2u : \
+ index == uint32_t(ShiftOp::kLSL) ? 3u : \
+ index == uint32_t(ShiftOp::kSXTW) ? 6u : \
+ index == uint32_t(ShiftOp::kSXTX) ? 7u : 0xFF
+static const uint8_t armShiftOpToLdStOptMap[] = { ASMJIT_LOOKUP_TABLE_16(VALUE, 0) };
+#undef VALUE
+
+static inline constexpr uint32_t diff(RegType a, RegType b) noexcept {
+ return uint32_t(a) - uint32_t(b);
+}
+
+// asmjit::a64::Assembler - SizeOp
+// ===============================
+
+//! Struct that contains Size (2 bits), Q flag, and S (scalar) flag. These values
+//! are used to encode Q, Size, and Scalar fields in an opcode.
+struct SizeOp {
+ enum : uint8_t {
+ k128BitShift = 0,
+ kScalarShift = 1,
+ kSizeShift = 2,
+
+ kQ = uint8_t(1u << k128BitShift),
+ kS = uint8_t(1u << kScalarShift),
+
+ k00 = uint8_t(0 << kSizeShift),
+ k01 = uint8_t(1 << kSizeShift),
+ k10 = uint8_t(2 << kSizeShift),
+ k11 = uint8_t(3 << kSizeShift),
+
+ k00Q = k00 | kQ,
+ k01Q = k01 | kQ,
+ k10Q = k10 | kQ,
+ k11Q = k11 | kQ,
+
+ k00S = k00 | kS,
+ k01S = k01 | kS,
+ k10S = k10 | kS,
+ k11S = k11 | kS,
+
+ kInvalid = 0xFFu,
+
+ // Masks used by SizeOpMap.
+ kSzQ = (0x3u << kSizeShift) | kQ,
+ kSzS = (0x3u << kSizeShift) | kS,
+ kSzQS = (0x3u << kSizeShift) | kQ | kS
+ };
+
+ uint8_t value;
+
+ inline bool isValid() const noexcept { return value != kInvalid; }
+ inline void makeInvalid() noexcept { value = kInvalid; }
+
+ inline uint32_t q() const noexcept { return (value >> k128BitShift) & 0x1u; }
+ inline uint32_t qs() const noexcept { return ((value >> k128BitShift) | (value >> kScalarShift)) & 0x1u; }
+ inline uint32_t scalar() const noexcept { return (value >> kScalarShift) & 0x1u; }
+ inline uint32_t size() const noexcept { return (value >> kSizeShift) & 0x3u; }
+
+ inline void decrementSize() noexcept {
+ ASMJIT_ASSERT(size() > 0);
+ value = uint8_t(value - (1u << kSizeShift));
+ }
+};
+
+struct SizeOpTable {
+ enum TableId : uint8_t {
+ kTableBin = 0,
+ kTableAny,
+ kCount
+ };
+
+ // 40 elements for each combination.
+ SizeOp array[(uint32_t(RegType::kARM_VecV) - uint32_t(RegType::kARM_VecB) + 1) * 8];
+};
+
+#define VALUE_BIN(x) { \
+ x == (((uint32_t(RegType::kARM_VecD) - uint32_t(RegType::kARM_VecB)) << 3) | (Vec::kElementTypeNone)) ? SizeOp::k00 : \
+ x == (((uint32_t(RegType::kARM_VecV) - uint32_t(RegType::kARM_VecB)) << 3) | (Vec::kElementTypeNone)) ? SizeOp::k00Q : \
+ x == (((uint32_t(RegType::kARM_VecD) - uint32_t(RegType::kARM_VecB)) << 3) | (Vec::kElementTypeB )) ? SizeOp::k00 : \
+ x == (((uint32_t(RegType::kARM_VecV) - uint32_t(RegType::kARM_VecB)) << 3) | (Vec::kElementTypeB )) ? SizeOp::k00Q : SizeOp::kInvalid \
+}
+
+#define VALUE_ANY(x) { \
+ x == (((uint32_t(RegType::kARM_VecB) - uint32_t(RegType::kARM_VecB)) << 3) | (Vec::kElementTypeNone)) ? SizeOp::k00S : \
+ x == (((uint32_t(RegType::kARM_VecH) - uint32_t(RegType::kARM_VecB)) << 3) | (Vec::kElementTypeNone)) ? SizeOp::k01S : \
+ x == (((uint32_t(RegType::kARM_VecS) - uint32_t(RegType::kARM_VecB)) << 3) | (Vec::kElementTypeNone)) ? SizeOp::k10S : \
+ x == (((uint32_t(RegType::kARM_VecD) - uint32_t(RegType::kARM_VecB)) << 3) | (Vec::kElementTypeNone)) ? SizeOp::k11S : \
+ x == (((uint32_t(RegType::kARM_VecD) - uint32_t(RegType::kARM_VecB)) << 3) | (Vec::kElementTypeB )) ? SizeOp::k00 : \
+ x == (((uint32_t(RegType::kARM_VecV) - uint32_t(RegType::kARM_VecB)) << 3) | (Vec::kElementTypeB )) ? SizeOp::k00Q : \
+ x == (((uint32_t(RegType::kARM_VecD) - uint32_t(RegType::kARM_VecB)) << 3) | (Vec::kElementTypeH )) ? SizeOp::k01 : \
+ x == (((uint32_t(RegType::kARM_VecV) - uint32_t(RegType::kARM_VecB)) << 3) | (Vec::kElementTypeH )) ? SizeOp::k01Q : \
+ x == (((uint32_t(RegType::kARM_VecD) - uint32_t(RegType::kARM_VecB)) << 3) | (Vec::kElementTypeS )) ? SizeOp::k10 : \
+ x == (((uint32_t(RegType::kARM_VecV) - uint32_t(RegType::kARM_VecB)) << 3) | (Vec::kElementTypeS )) ? SizeOp::k10Q : \
+ x == (((uint32_t(RegType::kARM_VecD) - uint32_t(RegType::kARM_VecB)) << 3) | (Vec::kElementTypeD )) ? SizeOp::k11S : \
+ x == (((uint32_t(RegType::kARM_VecV) - uint32_t(RegType::kARM_VecB)) << 3) | (Vec::kElementTypeD )) ? SizeOp::k11Q : SizeOp::kInvalid \
+}
+
+static const SizeOpTable sizeOpTable[SizeOpTable::kCount] = {
+ {{ ASMJIT_LOOKUP_TABLE_40(VALUE_BIN, 0) }},
+ {{ ASMJIT_LOOKUP_TABLE_40(VALUE_ANY, 0) }}
+};
+
+#undef VALUE_ANY
+#undef VALUE_BIN
+
+struct SizeOpMap {
+ uint8_t tableId;
+ uint8_t sizeOpMask;
+ uint16_t acceptMask;
+};
+
+static const constexpr SizeOpMap sizeOpMap[InstDB::kVO_Count] = {
+ { // kVO_V_B:
+ SizeOpTable::kTableBin, SizeOp::kQ , uint16_t(B(SizeOp::k00) | B(SizeOp::k00Q))
+ },
+
+ { // kVO_V_BH:
+ SizeOpTable::kTableAny, SizeOp::kSzQS, uint16_t(B(SizeOp::k00) | B(SizeOp::k00Q) | B(SizeOp::k01) | B(SizeOp::k01Q))
+ },
+
+ { // kVO_V_BH_4S:
+ SizeOpTable::kTableAny, SizeOp::kSzQS, uint16_t(B(SizeOp::k00) | B(SizeOp::k00Q) | B(SizeOp::k01) | B(SizeOp::k01Q) | B(SizeOp::k10Q))
+ },
+
+ { // kVO_V_BHS:
+ SizeOpTable::kTableAny, SizeOp::kSzQS, uint16_t(B(SizeOp::k00) | B(SizeOp::k00Q) | B(SizeOp::k01) | B(SizeOp::k01Q) | B(SizeOp::k10) | B(SizeOp::k10Q))
+ },
+
+ { // kVO_V_BHS_D2:
+ SizeOpTable::kTableAny, SizeOp::kSzQS, uint16_t(B(SizeOp::k00) | B(SizeOp::k00Q) | B(SizeOp::k01) | B(SizeOp::k01Q) | B(SizeOp::k10) | B(SizeOp::k10Q) | B(SizeOp::k11Q))
+ },
+
+ { // kVO_V_HS:
+ SizeOpTable::kTableAny, SizeOp::kSzQS, uint16_t(B(SizeOp::k01) | B(SizeOp::k01Q) | B(SizeOp::k10) | B(SizeOp::k10Q))
+ },
+
+ { // kVO_V_S:
+ SizeOpTable::kTableAny, SizeOp::kQ , uint16_t(B(SizeOp::k10) | B(SizeOp::k10Q))
+ },
+
+ { // kVO_V_B8H4:
+ SizeOpTable::kTableAny, SizeOp::kSzQS, uint16_t(B(SizeOp::k00) | B(SizeOp::k01))
+ },
+
+ { // kVO_V_B8H4S2:
+ SizeOpTable::kTableAny, SizeOp::kSzQS, uint16_t(B(SizeOp::k00) | B(SizeOp::k01) | B(SizeOp::k10))
+ },
+
+ { // kVO_V_B8D1:
+ SizeOpTable::kTableAny, SizeOp::kSzQ , uint16_t(B(SizeOp::k00) | B(SizeOp::k11S))
+ },
+
+ { // kVO_V_H4S2:
+ SizeOpTable::kTableAny, SizeOp::kSzQS, uint16_t(B(SizeOp::k01) | B(SizeOp::k10))
+ },
+
+ { // kVO_V_B16:
+ SizeOpTable::kTableBin, SizeOp::kQ , uint16_t(B(SizeOp::k00Q))
+ },
+
+ { // kVO_V_B16H8:
+ SizeOpTable::kTableAny, SizeOp::kSzQS, uint16_t(B(SizeOp::k00Q) | B(SizeOp::k01Q))
+ },
+
+ { // kVO_V_B16H8S4:
+ SizeOpTable::kTableAny, SizeOp::kSzQS, uint16_t(B(SizeOp::k00Q) | B(SizeOp::k01Q) | B(SizeOp::k10Q))
+ },
+
+ { // kVO_V_B16D2:
+ SizeOpTable::kTableAny, SizeOp::kSzQS, uint16_t(B(SizeOp::k00Q) | B(SizeOp::k11Q))
+ },
+
+ { // kVO_V_H8S4:
+ SizeOpTable::kTableAny, SizeOp::kSzQS, uint16_t(B(SizeOp::k01Q) | B(SizeOp::k10Q))
+ },
+
+ { // kVO_V_S4:
+ SizeOpTable::kTableAny, 0 , uint16_t(B(SizeOp::k10Q))
+ },
+
+ { // kVO_V_D2:
+ SizeOpTable::kTableAny, 0 , uint16_t(B(SizeOp::k11Q))
+ },
+
+ { // kVO_SV_BHS:
+ SizeOpTable::kTableAny, SizeOp::kSzQS, uint16_t(B(SizeOp::k00) | B(SizeOp::k00Q) | B(SizeOp::k00S) | B(SizeOp::k01) | B(SizeOp::k01Q) | B(SizeOp::k01S) | B(SizeOp::k10) | B(SizeOp::k10Q) | B(SizeOp::k10S))
+ },
+
+ { // kVO_SV_B8H4S2:
+ SizeOpTable::kTableAny, SizeOp::kSzQS, uint16_t(B(SizeOp::k00) | B(SizeOp::k00S) | B(SizeOp::k01) | B(SizeOp::k01S) | B(SizeOp::k10) | B(SizeOp::k10S))
+ },
+
+ { // kVO_SV_HS:
+ SizeOpTable::kTableAny, SizeOp::kSzQS, uint16_t(B(SizeOp::k01) | B(SizeOp::k01Q) | B(SizeOp::k01S) | B(SizeOp::k10) | B(SizeOp::k10Q) | B(SizeOp::k10S))
+ },
+
+ { // kVO_V_Any:
+ SizeOpTable::kTableAny, SizeOp::kSzQS, uint16_t(B(SizeOp::k00) | B(SizeOp::k00Q) | B(SizeOp::k01) | B(SizeOp::k01Q) | B(SizeOp::k10) | B(SizeOp::k10Q) | B(SizeOp::k11S) | B(SizeOp::k11Q))
+ },
+
+ { // kVO_SV_Any:
+ SizeOpTable::kTableAny, SizeOp::kSzQS, uint16_t(B(SizeOp::k00) | B(SizeOp::k00Q) | B(SizeOp::k00S) |
+ B(SizeOp::k01) | B(SizeOp::k01Q) | B(SizeOp::k01S) |
+ B(SizeOp::k10) | B(SizeOp::k10Q) | B(SizeOp::k10S) |
+ B(SizeOp::k11) | B(SizeOp::k11Q) | B(SizeOp::k11S))
+ }
+};
+
+static const Operand_& significantSimdOp(const Operand_& o0, const Operand_& o1, uint32_t instFlags) noexcept {
+ return !(instFlags & InstDB::kInstFlagLong) ? o0 : o1;
+}
+
+static inline SizeOp armElementTypeToSizeOp(uint32_t vecOpType, RegType regType, uint32_t elementType) noexcept {
+ // Instruction data or Assembler is wrong if this triggers an assertion failure.
+ ASMJIT_ASSERT(vecOpType < InstDB::kVO_Count);
+ // ElementType uses 3 bits in the operand signature, it should never overflow.
+ ASMJIT_ASSERT(elementType <= 0x7u);
+
+ const SizeOpMap& map = sizeOpMap[vecOpType];
+ const SizeOpTable& table = sizeOpTable[map.tableId];
+
+ size_t index = (Support::min<uint32_t>(diff(regType, RegType::kARM_VecB), diff(RegType::kARM_VecV, RegType::kARM_VecB) + 1) << 3) | elementType;
+ SizeOp op = table.array[index];
+ SizeOp modifiedOp { uint8_t(op.value & map.sizeOpMask) };
+
+ if (!Support::bitTest(map.acceptMask, op.value))
+ modifiedOp.makeInvalid();
+
+ return modifiedOp;
+}
+
+// a64::Assembler - Immediate Encoding Utilities (Integral)
+// ========================================================
+
+using Utils::LogicalImm;
+
+struct HalfWordImm {
+ uint32_t hw;
+ uint32_t inv;
+ uint32_t imm;
+};
+
+struct LMHImm {
+ uint32_t lm;
+ uint32_t h;
+ uint32_t maxRmId;
+};
+
+static inline uint32_t countZeroHalfWords64(uint64_t imm) noexcept {
+ return uint32_t((imm & 0x000000000000FFFFu) == 0) +
+ uint32_t((imm & 0x00000000FFFF0000u) == 0) +
+ uint32_t((imm & 0x0000FFFF00000000u) == 0) +
+ uint32_t((imm & 0xFFFF000000000000u) == 0) ;
+}
+
+static uint32_t encodeMovSequence32(uint32_t out[2], uint32_t imm, uint32_t rd, uint32_t x) noexcept {
+ ASMJIT_ASSERT(rd <= 31);
+
+ uint32_t kMovZ = 0b01010010100000000000000000000000 | (x << 31);
+ uint32_t kMovN = 0b00010010100000000000000000000000;
+ uint32_t kMovK = 0b01110010100000000000000000000000;
+
+ if ((imm & 0xFFFF0000u) == 0x00000000u) {
+ out[0] = kMovZ | (0 << 21) | ((imm & 0xFFFFu) << 5) | rd;
+ return 1;
+ }
+
+ if ((imm & 0xFFFF0000u) == 0xFFFF0000u) {
+ out[0] = kMovN | (0 << 21) | ((~imm & 0xFFFFu) << 5) | rd;
+ return 1;
+ }
+
+ if ((imm & 0x0000FFFFu) == 0x00000000u) {
+ out[0] = kMovZ | (1 << 21) | ((imm >> 16) << 5) | rd;
+ return 1;
+ }
+
+ if ((imm & 0x0000FFFFu) == 0x0000FFFFu) {
+ out[0] = kMovN | (1 << 21) | ((~imm >> 16) << 5) | rd;
+ return 1;
+ }
+
+ out[0] = kMovZ | (0 << 21) | ((imm & 0xFFFFu) << 5) | rd;
+ out[1] = kMovK | (1 << 21) | ((imm >> 16) << 5) | rd;
+ return 2;
+}
+
+static uint32_t encodeMovSequence64(uint32_t out[4], uint64_t imm, uint32_t rd, uint32_t x) noexcept {
+ ASMJIT_ASSERT(rd <= 31);
+
+ uint32_t kMovZ = 0b11010010100000000000000000000000;
+ uint32_t kMovN = 0b10010010100000000000000000000000;
+ uint32_t kMovK = 0b11110010100000000000000000000000;
+
+ if (imm <= 0xFFFFFFFFu)
+ return encodeMovSequence32(out, uint32_t(imm), rd, x);
+
+ uint32_t zhw = countZeroHalfWords64( imm);
+ uint32_t ohw = countZeroHalfWords64(~imm);
+
+ if (zhw >= ohw) {
+ uint32_t op = kMovZ;
+ uint32_t count = 0;
+
+ for (uint32_t hwIndex = 0; hwIndex < 4; hwIndex++, imm >>= 16) {
+ uint32_t hwImm = uint32_t(imm & 0xFFFFu);
+ if (hwImm == 0)
+ continue;
+
+ out[count++] = op | (hwIndex << 21) | (hwImm << 5) | rd;
+ op = kMovK;
+ }
+
+ // This should not happen - zero should be handled by encodeMovSequence32().
+ ASMJIT_ASSERT(count > 0);
+
+ return count;
+ }
+ else {
+ uint32_t op = kMovN;
+ uint32_t count = 0;
+ uint32_t negMask = 0xFFFFu;
+
+ for (uint32_t hwIndex = 0; hwIndex < 4; hwIndex++, imm >>= 16) {
+ uint32_t hwImm = uint32_t(imm & 0xFFFFu);
+ if (hwImm == 0xFFFFu)
+ continue;
+
+ out[count++] = op | (hwIndex << 21) | ((hwImm ^ negMask) << 5) | rd;
+ op = kMovK;
+ negMask = 0;
+ }
+
+ if (count == 0) {
+ out[count++] = kMovN | ((0xFFFF ^ negMask) << 5) | rd;
+ }
+
+ return count;
+ }
+}
+
+static inline bool encodeLMH(uint32_t sizeField, uint32_t elementIndex, LMHImm* out) noexcept {
+ if (sizeField != 1 && sizeField != 2)
+ return false;
+
+ uint32_t hShift = 3u - sizeField;
+ uint32_t lmShift = sizeField - 1u;
+ uint32_t maxElementIndex = 15u >> sizeField;
+
+ out->h = elementIndex >> hShift;
+ out->lm = (elementIndex << lmShift) & 0x3u;
+ out->maxRmId = (8u << sizeField) - 1;
+
+ return elementIndex <= maxElementIndex;
+}
+
+// [.......A|B.......|.......C|D.......|.......E|F.......|.......G|H.......]
+static inline uint32_t encodeImm64ByteMaskToImm8(uint64_t imm) noexcept {
+ return uint32_t(((imm >> (7 - 0)) & 0b00000011) | // [.......G|H.......]
+ ((imm >> (23 - 2)) & 0b00001100) | // [.......E|F.......]
+ ((imm >> (39 - 4)) & 0b00110000) | // [.......C|D.......]
+ ((imm >> (55 - 6)) & 0b11000000)); // [.......A|B.......]
+}
+
+// a64::Assembler - Opcode
+// =======================
+
+//! Helper class to store and manipulate ARM opcode.
+struct Opcode {
+ uint32_t v;
+
+ enum Bits : uint32_t {
+ kN = (1u << 22),
+ kQ = (1u << 30),
+ kX = (1u << 31)
+ };
+
+ // --------------------------------------------------------------------------
+ // [Opcode Builder]
+ // --------------------------------------------------------------------------
+
+ inline uint32_t get() const noexcept { return v; }
+ inline void reset(uint32_t value) noexcept { v = value; }
+
+ inline bool hasQ() const noexcept { return (v & kQ) != 0; }
+ inline bool hasX() const noexcept { return (v & kX) != 0; }
+
+ template<typename T>
+ inline Opcode& addImm(T value, uint32_t bitIndex) noexcept { return operator|=(uint32_t(value) << bitIndex); }
+
+ template<typename T>
+ inline Opcode& xorImm(T value, uint32_t bitIndex) noexcept { return operator^=(uint32_t(value) << bitIndex); }
+
+ template<typename T, typename Condition>
+ inline Opcode& addIf(T value, const Condition& condition) noexcept { return operator|=(condition ? uint32_t(value) : uint32_t(0)); }
+
+ inline Opcode& addLogicalImm(const LogicalImm& logicalImm) noexcept {
+ addImm(logicalImm.n, 22);
+ addImm(logicalImm.r, 16);
+ addImm(logicalImm.s, 10);
+ return *this;
+ }
+
+ inline Opcode& addReg(uint32_t id, uint32_t bitIndex) noexcept { return operator|=((id & 31u) << bitIndex); }
+ inline Opcode& addReg(const Operand_& op, uint32_t bitIndex) noexcept { return addReg(op.id(), bitIndex); }
+
+ inline Opcode& operator=(uint32_t x) noexcept { v = x; return *this; }
+ inline Opcode& operator&=(uint32_t x) noexcept { v &= x; return *this; }
+ inline Opcode& operator|=(uint32_t x) noexcept { v |= x; return *this; }
+ inline Opcode& operator^=(uint32_t x) noexcept { v ^= x; return *this; }
+
+ inline uint32_t operator&(uint32_t x) const noexcept { return v & x; }
+ inline uint32_t operator|(uint32_t x) const noexcept { return v | x; }
+ inline uint32_t operator^(uint32_t x) const noexcept { return v ^ x; }
+};
+
+// a64::Assembler - Signature Utilities
+// ====================================
+
+// TODO: [ARM] Deprecate matchSignature.
+static inline bool matchSignature(const Operand_& o0, const Operand_& o1, uint32_t instFlags) noexcept {
+ if (!(instFlags & (InstDB::kInstFlagLong | InstDB::kInstFlagNarrow)))
+ return o0.signature() == o1.signature();
+
+ // TODO: [ARM] Something smart to validate this.
+ return true;
+}
+
+static inline bool matchSignature(const Operand_& o0, const Operand_& o1, const Operand_& o2, uint32_t instFlags) noexcept {
+ return matchSignature(o0, o1, instFlags) && o1.signature() == o2.signature();
+}
+
+static inline bool matchSignature(const Operand_& o0, const Operand_& o1, const Operand_& o2, const Operand_& o3, uint32_t instFlags) noexcept {
+ return matchSignature(o0, o1, instFlags) && o1.signature() == o2.signature() && o2.signature() == o3.signature();;
+}
+
+// Memory must be either:
+// 1. Absolute address, which will be converted to relative.
+// 2. Relative displacement (Label).
+// 3. Base register + either offset or index.
+static inline bool armCheckMemBaseIndexRel(const Mem& mem) noexcept {
+ // Allowed base types (Nothing, Label, and GpX).
+ constexpr uint32_t kBaseMask = B(0) |
+ B(RegType::kLabelTag) |
+ B(RegType::kARM_GpX);
+
+ // Allowed index types (Nothing, GpW, and GpX).
+ constexpr uint32_t kIndexMask = B(0) |
+ B(RegType::kARM_GpW) |
+ B(RegType::kARM_GpX) ;
+
+ RegType baseType = mem.baseType();
+ RegType indexType = mem.indexType();
+
+ if (!Support::bitTest(kBaseMask, baseType))
+ return false;
+
+ if (baseType > RegType::kLabelTag) {
+ // Index allows either GpW or GpX.
+ if (!Support::bitTest(kIndexMask, indexType))
+ return false;
+
+ if (indexType == RegType::kNone)
+ return true;
+ else
+ return !mem.hasOffset();
+ }
+ else {
+ // No index register allowed if this is a PC relative address (literal).
+ return indexType == RegType::kNone;
+ }
+}
+
+struct EncodeFpOpcodeBits {
+ uint32_t sizeMask;
+ uint32_t mask[3];
+};
+
+static inline bool pickFpOpcode(const Vec& reg, uint32_t sOp, uint32_t sHf, uint32_t vOp, uint32_t vHf, Opcode* opcode, uint32_t* szOut) noexcept {
+ static constexpr uint32_t kQBitIndex = 30;
+
+ static const EncodeFpOpcodeBits szBits[InstDB::kHF_Count] = {
+ { B(2) | B(1) , { 0u , 0u, B(22) } },
+ { B(2) | B(1) | B(0), { 0u , 0u, 0u } },
+ { B(2) | B(1) | B(0), { B(23) | B(22) , 0u, B(22) } },
+ { B(2) | B(1) | B(0), { B(22) | B(20) | B(19) , 0u, B(22) } },
+ { B(2) | B(1) | B(0), { B(22) | B(21) | B(15) | B(14), 0u, B(22) } },
+ { B(2) | B(1) | B(0), { B(23) , 0u, B(22) } }
+ };
+
+ if (!reg.hasElementType()) {
+ // Scalar operation [HSD].
+ uint32_t sz = diff(reg.type(), RegType::kARM_VecH);
+ if (sz > 2u || !Support::bitTest(szBits[sHf].sizeMask, sz))
+ return false;
+
+ opcode->reset(szBits[sHf].mask[sz] ^ sOp);
+ *szOut = sz;
+ return sOp != 0;
+ }
+ else {
+ // Vector operation [HSD].
+ uint32_t q = diff(reg.type(), RegType::kARM_VecD);
+ uint32_t sz = reg.elementType() - Vec::kElementTypeH;
+
+ if (q > 1u || sz > 2u || !Support::bitTest(szBits[vHf].sizeMask, sz))
+ return false;
+
+ opcode->reset(szBits[vHf].mask[sz] ^ (vOp | (q << kQBitIndex)));
+ *szOut = sz;
+ return vOp != 0;
+ }
+}
+
+static inline bool pickFpOpcode(const Vec& reg, uint32_t sOp, uint32_t sHf, uint32_t vOp, uint32_t vHf, Opcode* opcode) noexcept {
+ uint32_t sz;
+ return pickFpOpcode(reg, sOp, sHf, vOp, vHf, opcode, &sz);
+}
+
+// a64::Assembler - Operand Checks
+// ===============================
+
+// Checks whether all operands have the same signature.
+static inline bool checkSignature(const Operand_& o0, const Operand_& o1) noexcept {
+ return o0.signature() == o1.signature();
+}
+
+static inline bool checkSignature(const Operand_& o0, const Operand_& o1, const Operand_& o2) noexcept {
+ return o0.signature() == o1.signature() &&
+ o1.signature() == o2.signature();
+}
+
+static inline bool checkSignature(const Operand_& o0, const Operand_& o1, const Operand_& o2, const Operand_& o3) noexcept {
+ return o0.signature() == o1.signature() &&
+ o1.signature() == o2.signature() &&
+ o2.signature() == o3.signature();
+}
+
+// Checks whether the register is GP register of the allowed types.
+//
+// Allowed is a 2-bit mask, where the first bits allows GpW and the second bit
+// allows GpX. These bits are usually stored within the instruction, but could
+// be also hardcoded in the assembler for instructions where GP types are not
+// selectable.
+static inline bool checkGpType(const Operand_& op, uint32_t allowed) noexcept {
+ RegType type = op.as<Reg>().type();
+ return Support::bitTest(allowed << uint32_t(RegType::kARM_GpW), type);
+}
+
+static inline bool checkGpType(const Operand_& op, uint32_t allowed, uint32_t* x) noexcept {
+ // NOTE: We set 'x' to one only when GpW is allowed, otherwise the X is part
+ // of the opcode and we cannot set it. This is why this works without requiring
+ // additional logic.
+ RegType type = op.as<Reg>().type();
+ *x = diff(type, RegType::kARM_GpW) & allowed;
+ return Support::bitTest(allowed << uint32_t(RegType::kARM_GpW), type);
+}
+
+static inline bool checkGpType(const Operand_& o0, const Operand_& o1, uint32_t allowed, uint32_t* x) noexcept {
+ return checkGpType(o0, allowed, x) && checkSignature(o0, o1);
+}
+
+static inline bool checkGpType(const Operand_& o0, const Operand_& o1, const Operand_& o2, uint32_t allowed, uint32_t* x) noexcept {
+ return checkGpType(o0, allowed, x) && checkSignature(o0, o1, o2);
+}
+
+static inline bool checkGpId(const Operand_& op, uint32_t hiId = kZR) noexcept {
+ uint32_t id = op.as<Reg>().id();
+ return id < 31u || id == hiId;
+}
+
+static inline bool checkGpId(const Operand_& o0, const Operand_& o1, uint32_t hiId = kZR) noexcept {
+ uint32_t id0 = o0.as<Reg>().id();
+ uint32_t id1 = o1.as<Reg>().id();
+
+ return (id0 < 31u || id0 == hiId) && (id1 < 31u || id1 == hiId);
+}
+
+static inline bool checkGpId(const Operand_& o0, const Operand_& o1, const Operand_& o2, uint32_t hiId = kZR) noexcept {
+ uint32_t id0 = o0.as<Reg>().id();
+ uint32_t id1 = o1.as<Reg>().id();
+ uint32_t id2 = o2.as<Reg>().id();
+
+ return (id0 < 31u || id0 == hiId) && (id1 < 31u || id1 == hiId) && (id2 < 31u || id2 == hiId);
+}
+
+static inline bool checkVecId(const Operand_& op) noexcept {
+ uint32_t id = op.as<Reg>().id();
+ return id <= 31u;
+}
+
+static inline bool checkVecId(const Operand_& o0, const Operand_& o1) noexcept {
+ uint32_t id0 = o0.as<Reg>().id();
+ uint32_t id1 = o1.as<Reg>().id();
+
+ return (id0 | id1) <= 31u;
+}
+
+/* Unused at the moment.
+static inline bool checkVecId(const Operand_& o0, const Operand_& o1, const Operand_& o2) noexcept {
+ uint32_t id0 = o0.as<Reg>().id();
+ uint32_t id1 = o1.as<Reg>().id();
+ uint32_t id2 = o2.as<Reg>().id();
+
+ return (id0 | id1 | id2) <= 31u;
+}
+
+static inline bool checkVecId(const Operand_& o0, const Operand_& o1, const Operand_& o2, const Operand_& o3) noexcept {
+ uint32_t id0 = o0.as<Reg>().id();
+ uint32_t id1 = o1.as<Reg>().id();
+ uint32_t id2 = o2.as<Reg>().id();
+ uint32_t id3 = o3.as<Reg>().id();
+
+ return (id0 | id1 | id2 | id3) <= 31u;
+}
+*/
+
+static inline bool checkMemBase(const Mem& mem) noexcept {
+ return mem.baseType() == RegType::kARM_GpX && mem.baseId() <= 31;
+}
+
+static inline bool checkEven(const Operand_& o0, const Operand_& o1) noexcept {
+ return ((o0.id() | o1.id()) & 1) == 0;
+}
+
+static inline bool checkConsecutive(const Operand_& o0, const Operand_& o1) noexcept {
+ return ((o0.id() + 1u) & 0x1Fu) == o1.id();
+}
+
+static inline bool checkConsecutive(const Operand_& o0, const Operand_& o1, const Operand_& o2) noexcept {
+ return ((o0.id() + 1u) & 0x1Fu) == o1.id() &&
+ ((o0.id() + 2u) & 0x1Fu) == o2.id();
+}
+
+static inline bool checkConsecutive(const Operand_& o0, const Operand_& o1, const Operand_& o2, const Operand_& o3) noexcept {
+ return ((o0.id() + 1u) & 0x1Fu) == o1.id() &&
+ ((o0.id() + 2u) & 0x1Fu) == o2.id() &&
+ ((o0.id() + 3u) & 0x1Fu) == o3.id();
+}
+
+// a64::Assembler - CheckReg
+// =========================
+
+#define V(index) (index == uint32_t(RegType::kARM_GpW) ? Gp::kIdZr : \
+ index == uint32_t(RegType::kARM_GpX) ? Gp::kIdZr : \
+ index == uint32_t(RegType::kARM_VecB) ? 31u : \
+ index == uint32_t(RegType::kARM_VecH) ? 31u : \
+ index == uint32_t(RegType::kARM_VecS) ? 31u : \
+ index == uint32_t(RegType::kARM_VecD) ? 31u : \
+ index == uint32_t(RegType::kARM_VecV) ? 31u : 0)
+static const Support::Array<uint8_t, 32> commonHiRegIdOfType = {{
+ ASMJIT_LOOKUP_TABLE_32(V, 0)
+}};
+#undef V
+
+static inline bool checkValidRegs(const Operand_& o0) noexcept {
+ return ((o0.id() < 31) | (o0.id() == commonHiRegIdOfType[o0.as<Reg>().type()]));
+}
+
+static inline bool checkValidRegs(const Operand_& o0, const Operand_& o1) noexcept {
+ return ((o0.id() < 31) | (o0.id() == commonHiRegIdOfType[o0.as<Reg>().type()])) &
+ ((o1.id() < 31) | (o1.id() == commonHiRegIdOfType[o1.as<Reg>().type()])) ;
+}
+
+static inline bool checkValidRegs(const Operand_& o0, const Operand_& o1, const Operand_& o2) noexcept {
+ return ((o0.id() < 31) | (o0.id() == commonHiRegIdOfType[o0.as<Reg>().type()])) &
+ ((o1.id() < 31) | (o1.id() == commonHiRegIdOfType[o1.as<Reg>().type()])) &
+ ((o2.id() < 31) | (o2.id() == commonHiRegIdOfType[o2.as<Reg>().type()])) ;
+}
+
+static inline bool checkValidRegs(const Operand_& o0, const Operand_& o1, const Operand_& o2, const Operand_& o3) noexcept {
+ return ((o0.id() < 31) | (o0.id() == commonHiRegIdOfType[o0.as<Reg>().type()])) &
+ ((o1.id() < 31) | (o1.id() == commonHiRegIdOfType[o1.as<Reg>().type()])) &
+ ((o2.id() < 31) | (o2.id() == commonHiRegIdOfType[o2.as<Reg>().type()])) &
+ ((o3.id() < 31) | (o3.id() == commonHiRegIdOfType[o3.as<Reg>().type()])) ;
+}
+
+// a64::Assembler - Construction & Destruction
+// ===========================================
+
+Assembler::Assembler(CodeHolder* code) noexcept : BaseAssembler() {
+ _archMask = uint64_t(1) << uint32_t(Arch::kAArch64);
+ assignEmitterFuncs(this);
+
+ if (code)
+ code->attach(this);
+}
+
+Assembler::~Assembler() noexcept {}
+
+// a64::Assembler - Emit
+// =====================
+
+#define ENC_OPS1(OP0) \
+ (uint32_t(OperandType::k##OP0))
+
+#define ENC_OPS2(OP0, OP1) \
+ (uint32_t(OperandType::k##OP0) + \
+ (uint32_t(OperandType::k##OP1) << 3))
+
+#define ENC_OPS3(OP0, OP1, OP2) \
+ (uint32_t(OperandType::k##OP0) + \
+ (uint32_t(OperandType::k##OP1) << 3) + \
+ (uint32_t(OperandType::k##OP2) << 6))
+
+#define ENC_OPS4(OP0, OP1, OP2, OP3) \
+ (uint32_t(OperandType::k##OP0) + \
+ (uint32_t(OperandType::k##OP1) << 3) + \
+ (uint32_t(OperandType::k##OP2) << 6) + \
+ (uint32_t(OperandType::k##OP3) << 9))
+
+Error Assembler::_emit(InstId instId, const Operand_& o0, const Operand_& o1, const Operand_& o2, const Operand_* opExt) {
+ // Logging/Validation/Error.
+ constexpr InstOptions kRequiresSpecialHandling = InstOptions::kReserved;
+
+ Error err;
+ CodeWriter writer(this);
+
+ // Combine all instruction options and also check whether the instruction
+ // is valid. All options that require special handling (including invalid
+ // instruction) are handled by the next branch.
+ InstOptions options = InstOptions(instId - 1 >= Inst::_kIdCount - 1) | InstOptions((size_t)(_bufferEnd - writer.cursor()) < 4) | instOptions() | forcedInstOptions();
+
+ CondCode instCC = BaseInst::extractARMCondCode(instId);
+ instId = instId & uint32_t(InstIdParts::kRealId);
+
+ if (instId >= Inst::_kIdCount)
+ instId = 0;
+
+ const InstDB::InstInfo* instInfo = &InstDB::_instInfoTable[instId];
+ uint32_t encodingIndex = instInfo->_encodingDataIndex;
+
+ Opcode opcode;
+ uint32_t isign4;
+ uint32_t instFlags;
+
+ const Operand_& o3 = opExt[EmitterUtils::kOp3];
+ const Operand_* rmRel = nullptr;
+
+ uint32_t multipleOpData[4];
+ uint32_t multipleOpCount;
+
+ // These are only used when instruction uses a relative displacement.
+ OffsetFormat offsetFormat; // Offset format.
+ uint64_t offsetValue; // Offset value (if known).
+
+ if (ASMJIT_UNLIKELY(Support::test(options, kRequiresSpecialHandling))) {
+ if (ASMJIT_UNLIKELY(!_code))
+ return reportError(DebugUtils::errored(kErrorNotInitialized));
+
+ // Unknown instruction.
+ if (ASMJIT_UNLIKELY(instId == 0))
+ goto InvalidInstruction;
+
+ // Condition code can only be used with 'B' instruction.
+ if (ASMJIT_UNLIKELY(instCC != CondCode::kAL && instId != Inst::kIdB))
+ goto InvalidInstruction;
+
+ // Grow request, happens rarely.
+ err = writer.ensureSpace(this, 4);
+ if (ASMJIT_UNLIKELY(err))
+ goto Failed;
+
+#ifndef ASMJIT_NO_VALIDATION
+ // Strict validation.
+ if (hasDiagnosticOption(DiagnosticOptions::kValidateAssembler)) {
+ Operand_ opArray[Globals::kMaxOpCount];
+ EmitterUtils::opArrayFromEmitArgs(opArray, o0, o1, o2, opExt);
+
+ err = _funcs.validate(arch(), BaseInst(instId, options, _extraReg), opArray, Globals::kMaxOpCount, ValidationFlags::kNone);
+ if (ASMJIT_UNLIKELY(err))
+ goto Failed;
+ }
+#endif
+ }
+
+ // Signature of the first 4 operands.
+ isign4 = (uint32_t(o0.opType()) ) +
+ (uint32_t(o1.opType()) << 3) +
+ (uint32_t(o2.opType()) << 6) +
+ (uint32_t(o3.opType()) << 9);
+ instFlags = instInfo->flags();
+
+ switch (instInfo->_encoding) {
+ // ------------------------------------------------------------------------
+ // [Base - Universal]
+ // ------------------------------------------------------------------------
+
+ case InstDB::kEncodingBaseOp: {
+ const InstDB::EncodingData::BaseOp& opData = InstDB::EncodingData::baseOp[encodingIndex];
+
+ if (isign4 == 0) {
+ opcode.reset(opData.opcode);
+ goto EmitOp;
+ }
+
+ break;
+ }
+
+ case InstDB::kEncodingBaseOpImm: {
+ const InstDB::EncodingData::BaseOpImm& opData = InstDB::EncodingData::baseOpImm[encodingIndex];
+
+ if (isign4 == ENC_OPS1(Imm)) {
+ uint64_t imm = o0.as<Imm>().valueAs<uint64_t>();
+ uint32_t immMax = 1u << opData.immBits;
+
+ if (imm >= immMax)
+ goto InvalidImmediate;
+
+ opcode.reset(opData.opcode);
+ opcode.addImm(imm, opData.immOffset);
+ goto EmitOp;
+ }
+
+ break;
+ }
+
+ case InstDB::kEncodingBaseR: {
+ const InstDB::EncodingData::BaseR& opData = InstDB::EncodingData::baseR[encodingIndex];
+
+ if (isign4 == ENC_OPS1(Reg)) {
+ if (!checkGpType(o0, opData.rType))
+ goto InvalidInstruction;
+
+ if (!checkGpId(o0, opData.rHiId))
+ goto InvalidPhysId;
+
+ opcode.reset(opData.opcode);
+ opcode.addReg(o0, opData.rShift);
+ goto EmitOp;
+ }
+
+ break;
+ }
+
+ case InstDB::kEncodingBaseRR: {
+ const InstDB::EncodingData::BaseRR& opData = InstDB::EncodingData::baseRR[encodingIndex];
+
+ if (isign4 == ENC_OPS2(Reg, Reg)) {
+ uint32_t x;
+ if (!checkGpType(o0, opData.aType, &x))
+ goto InvalidInstruction;
+
+ if (!checkGpType(o1, opData.bType))
+ goto InvalidInstruction;
+
+ if (opData.uniform && !checkSignature(o0, o1))
+ goto InvalidInstruction;
+
+ if (!checkGpId(o0, opData.aHiId))
+ goto InvalidPhysId;
+
+ if (!checkGpId(o1, opData.bHiId))
+ goto InvalidPhysId;
+
+ opcode.reset(opData.opcode);
+ opcode.addImm(x, 31);
+ opcode.addReg(o1, opData.bShift);
+ opcode.addReg(o0, opData.aShift);
+ goto EmitOp;
+ }
+
+ break;
+ }
+
+ case InstDB::kEncodingBaseRRR: {
+ const InstDB::EncodingData::BaseRRR& opData = InstDB::EncodingData::baseRRR[encodingIndex];
+
+ if (isign4 == ENC_OPS3(Reg, Reg, Reg)) {
+ uint32_t x;
+ if (!checkGpType(o0, opData.aType, &x))
+ goto InvalidInstruction;
+
+ if (!checkGpType(o1, opData.bType))
+ goto InvalidInstruction;
+
+ if (!checkGpType(o2, opData.cType))
+ goto InvalidInstruction;
+
+ if (opData.uniform && !checkSignature(o0, o1, o2))
+ goto InvalidInstruction;
+
+ if (!checkGpId(o0, opData.aHiId))
+ goto InvalidPhysId;
+
+ if (!checkGpId(o1, opData.bHiId))
+ goto InvalidPhysId;
+
+ if (!checkGpId(o2, opData.cHiId))
+ goto InvalidPhysId;
+
+ opcode.reset(opData.opcode());
+ opcode.addImm(x, 31);
+ opcode.addReg(o2, 16);
+ opcode.addReg(o1, 5);
+ opcode.addReg(o0, 0);
+ goto EmitOp;
+ }
+
+ break;
+ }
+
+ case InstDB::kEncodingBaseRRRR: {
+ const InstDB::EncodingData::BaseRRRR& opData = InstDB::EncodingData::baseRRRR[encodingIndex];
+
+ if (isign4 == ENC_OPS4(Reg, Reg, Reg, Reg)) {
+ uint32_t x;
+ if (!checkGpType(o0, opData.aType, &x))
+ goto InvalidInstruction;
+
+ if (!checkGpType(o1, opData.bType))
+ goto InvalidInstruction;
+
+ if (!checkGpType(o2, opData.cType))
+ goto InvalidInstruction;
+
+ if (!checkGpType(o3, opData.dType))
+ goto InvalidInstruction;
+
+ if (opData.uniform && !checkSignature(o0, o1, o2, o3))
+ goto InvalidInstruction;
+
+ if (!checkGpId(o0, opData.aHiId))
+ goto InvalidPhysId;
+
+ if (!checkGpId(o1, opData.bHiId))
+ goto InvalidPhysId;
+
+ if (!checkGpId(o2, opData.cHiId))
+ goto InvalidPhysId;
+
+ if (!checkGpId(o3, opData.dHiId))
+ goto InvalidPhysId;
+
+ opcode.reset(opData.opcode());
+ opcode.addImm(x, 31);
+ opcode.addReg(o2, 16);
+ opcode.addReg(o3, 10);
+ opcode.addReg(o1, 5);
+ opcode.addReg(o0, 0);
+ goto EmitOp;
+ }
+
+ break;
+ }
+
+ case InstDB::kEncodingBaseRRII: {
+ const InstDB::EncodingData::BaseRRII& opData = InstDB::EncodingData::baseRRII[encodingIndex];
+
+ if (isign4 == ENC_OPS4(Reg, Reg, Imm, Imm)) {
+ if (!checkGpType(o0, opData.aType))
+ goto InvalidInstruction;
+
+ if (!checkGpType(o1, opData.bType))
+ goto InvalidInstruction;
+
+ if (!checkGpId(o0, opData.aHiId))
+ goto InvalidPhysId;
+
+ if (!checkGpId(o1, opData.bHiId))
+ goto InvalidPhysId;
+
+ if (o2.as<Imm>().valueAs<uint64_t>() >= Support::bitMask(opData.aImmSize + opData.aImmDiscardLsb) ||
+ o3.as<Imm>().valueAs<uint64_t>() >= Support::bitMask(opData.bImmSize + opData.bImmDiscardLsb))
+ goto InvalidImmediate;
+
+ uint32_t aImm = o2.as<Imm>().valueAs<uint32_t>() >> opData.aImmDiscardLsb;
+ uint32_t bImm = o3.as<Imm>().valueAs<uint32_t>() >> opData.bImmDiscardLsb;
+
+ if ((aImm << opData.aImmDiscardLsb) != o2.as<Imm>().valueAs<uint32_t>() ||
+ (bImm << opData.bImmDiscardLsb) != o3.as<Imm>().valueAs<uint32_t>())
+ goto InvalidImmediate;
+
+ opcode.reset(opData.opcode());
+ opcode.addImm(aImm, opData.aImmOffset);
+ opcode.addImm(bImm, opData.bImmOffset);
+ opcode.addReg(o1, 5);
+ opcode.addReg(o0, 0);
+ goto EmitOp;
+ }
+
+ break;
+ }
+
+ // ------------------------------------------------------------------------
+ // [Base - Mov]
+ // ------------------------------------------------------------------------
+
+ case InstDB::kEncodingBaseMov: {
+ // MOV is a pseudo instruction that uses various instructions depending on its signature.
+ uint32_t x = diff(o0.as<Reg>().type(), RegType::kARM_GpW);
+ if (x > 1)
+ goto InvalidInstruction;
+
+ if (isign4 == ENC_OPS2(Reg, Reg)) {
+ if (!o0.as<Reg>().isGp())
+ goto InvalidInstruction;
+
+ if (!checkSignature(o0, o1))
+ goto InvalidInstruction;
+
+ bool hasSP = o0.as<Gp>().isSP() || o1.as<Gp>().isSP();
+ if (hasSP) {
+ // Cannot be combined with ZR.
+ if (!checkGpId(o0, o1, kSP))
+ goto InvalidPhysId;
+
+ // MOV Rd, Rm -> ADD Rd, Rn, #0.
+ opcode.reset(0b00010001000000000000000000000000);
+ opcode.addImm(x, 31);
+ opcode.addReg(o1, 5);
+ opcode.addReg(o0, 0);
+ goto EmitOp;
+ }
+ else {
+ if (!checkGpId(o0, o1, kZR))
+ goto InvalidPhysId;
+
+ // MOV Rd, Rm -> ORR Rd, <ZR>, Rm.
+ opcode.reset(0b00101010000000000000001111100000);
+ opcode.addImm(x, 31);
+ opcode.addReg(o1, 16);
+ opcode.addReg(o0, 0);
+ goto EmitOp;
+ }
+ }
+
+ if (isign4 == ENC_OPS2(Reg, Imm)) {
+ if (!o0.as<Reg>().isGp())
+ goto InvalidInstruction;
+
+ uint64_t immValue = o1.as<Imm>().valueAs<uint64_t>();
+ if (!x)
+ immValue &= 0xFFFFFFFFu;
+
+ // Prefer a single MOVN/MOVZ instruction over a logical instruction.
+ multipleOpCount = encodeMovSequence64(multipleOpData, immValue, o0.id() & 31, x);
+ if (multipleOpCount == 1 && !o0.as<Gp>().isSP()) {
+ opcode.reset(multipleOpData[0]);
+ goto EmitOp;
+ }
+
+ // Logical instructions use 13-bit immediate pattern encoded as N:ImmR:ImmS.
+ LogicalImm logicalImm;
+ if (!o0.as<Gp>().isZR()) {
+ if (Utils::encodeLogicalImm(immValue, x ? 64 : 32, &logicalImm)) {
+ if (!checkGpId(o0, kSP))
+ goto InvalidPhysId;
+
+ opcode.reset(0b00110010000000000000001111100000);
+ opcode.addImm(x, 31);
+ opcode.addLogicalImm(logicalImm);
+ opcode.addReg(o0, 0);
+ goto EmitOp;
+ }
+ }
+
+ if (!checkGpId(o0, kZR))
+ goto InvalidPhysId;
+
+ goto EmitOp_Multiple;
+ }
+
+ break;
+ }
+
+ case InstDB::kEncodingBaseMovKNZ: {
+ const InstDB::EncodingData::BaseMovKNZ& opData = InstDB::EncodingData::baseMovKNZ[encodingIndex];
+
+ uint32_t x = diff(o0.as<Reg>().type(), RegType::kARM_GpW);
+ if (x > 1)
+ goto InvalidInstruction;
+
+ if (!checkGpId(o0, kZR))
+ goto InvalidPhysId;
+
+ opcode.reset(opData.opcode);
+ opcode.addImm(x, 31);
+
+ if (isign4 == ENC_OPS2(Reg, Imm)) {
+ uint64_t imm16 = o1.as<Imm>().valueAs<uint64_t>();
+ if (imm16 > 0xFFFFu)
+ goto InvalidImmediate;
+
+ opcode.addImm(imm16, 5);
+ opcode.addReg(o0, 0);
+ goto EmitOp;
+ }
+
+ if (isign4 == ENC_OPS3(Reg, Imm, Imm)) {
+ uint64_t imm16 = o1.as<Imm>().valueAs<uint64_t>();
+ uint32_t shiftType = o2.as<Imm>().predicate();
+ uint64_t shiftValue = o2.as<Imm>().valueAs<uint64_t>();
+
+ if (imm16 > 0xFFFFu || shiftValue > 48 || shiftType != uint32_t(ShiftOp::kLSL))
+ goto InvalidImmediate;
+
+ // Convert shift value to 'hw' field.
+ uint32_t hw = uint32_t(shiftValue) >> 4;
+ if ((hw << 4) != uint32_t(shiftValue))
+ goto InvalidImmediate;
+
+ opcode.addImm(hw, 21);
+ opcode.addImm(imm16, 5);
+ opcode.addReg(o0, 0);
+
+ if (!x && hw > 1u)
+ goto InvalidImmediate;
+
+ goto EmitOp;
+ }
+
+ break;
+ }
+
+ // ------------------------------------------------------------------------
+ // [Base - Adr]
+ // ------------------------------------------------------------------------
+
+ case InstDB::kEncodingBaseAdr: {
+ const InstDB::EncodingData::BaseAdr& opData = InstDB::EncodingData::baseAdr[encodingIndex];
+
+ if (isign4 == ENC_OPS2(Reg, Label) || isign4 == ENC_OPS2(Reg, Imm)) {
+ if (!o0.as<Reg>().isGpX())
+ goto InvalidInstruction;
+
+ if (!checkGpId(o0, kZR))
+ goto InvalidPhysId;
+
+ opcode.reset(opData.opcode());
+ opcode.addReg(o0, 0);
+ offsetFormat.resetToImmValue(opData.offsetType, 4, 5, 21, 0);
+
+ if (instId == Inst::kIdAdrp)
+ offsetFormat._immDiscardLsb = 12;
+
+ rmRel = &o1;
+ goto EmitOp_Rel;
+ }
+
+ break;
+ }
+
+ // ------------------------------------------------------------------------
+ // [Base - Arithmetic and Logical]
+ // ------------------------------------------------------------------------
+
+ case InstDB::kEncodingBaseAddSub: {
+ const InstDB::EncodingData::BaseAddSub& opData = InstDB::EncodingData::baseAddSub[encodingIndex];
+
+ uint32_t x;
+ if (!checkGpType(o0, o1, kWX, &x))
+ goto InvalidInstruction;
+
+ if (isign4 == ENC_OPS3(Reg, Reg, Imm) || isign4 == ENC_OPS4(Reg, Reg, Imm, Imm)) {
+ opcode.reset(uint32_t(opData.immediateOp) << 24);
+
+ // ADD | SUB (immediate) - ZR is not allowed.
+ // ADDS|SUBS (immediate) - ZR allowed in Rd, SP allowed in Rn.
+ uint32_t aHiId = opcode.get() & B(29) ? kZR : kSP;
+ uint32_t bHiId = kSP;
+
+ if (!checkGpId(o0, aHiId) || !checkGpId(o1, bHiId))
+ goto InvalidPhysId;
+
+ // ADD|SUB (immediate) use 12-bit immediate optionally shifted by 'LSL #12'.
+ uint64_t imm = o2.as<Imm>().valueAs<uint64_t>();
+ uint32_t shift = 0;
+
+ if (isign4 == ENC_OPS4(Reg, Reg, Imm, Imm)) {
+ if (o3.as<Imm>().predicate() != uint32_t(ShiftOp::kLSL))
+ goto InvalidImmediate;
+
+ if (o3.as<Imm>().value() != 0 && o3.as<Imm>().value() != 12)
+ goto InvalidImmediate;
+
+ shift = uint32_t(o3.as<Imm>().value() != 0);
+ }
+
+ // Accept immediate value of '0x00XXX000' by setting 'shift' to 12.
+ if (imm > 0xFFFu) {
+ if (shift || (imm & ~uint64_t(0xFFFu << 12)) != 0)
+ goto InvalidImmediate;
+ shift = 1;
+ imm >>= 12;
+ }
+
+ opcode.addImm(x, 31);
+ opcode.addImm(shift, 22);
+ opcode.addImm(imm, 10);
+ opcode.addReg(o1, 5);
+ opcode.addReg(o0, 0);
+ goto EmitOp;
+ }
+
+ if (isign4 == ENC_OPS3(Reg, Reg, Reg) || isign4 == ENC_OPS4(Reg, Reg, Reg, Imm)) {
+ if (!checkSignature(o1, o2))
+ goto InvalidInstruction;
+
+ uint32_t opSize = x ? 64 : 32;
+ uint64_t shift = 0;
+ uint32_t sType = uint32_t(ShiftOp::kLSL);
+
+ if (isign4 == ENC_OPS4(Reg, Reg, Reg, Imm)) {
+ sType = o3.as<Imm>().predicate();
+ shift = o3.as<Imm>().valueAs<uint64_t>();
+ }
+
+ if (!checkGpId(o2, kZR))
+ goto InvalidPhysId;
+
+ // Shift operation - LSL, LSR, ASR.
+ if (sType <= uint32_t(ShiftOp::kASR)) {
+ bool hasSP = o0.as<Gp>().isSP() || o1.as<Gp>().isSP();
+ if (!hasSP) {
+ if (!checkGpId(o0, o1, kZR))
+ goto InvalidPhysId;
+
+ if (shift >= opSize)
+ goto InvalidImmediate;
+
+ opcode.reset(uint32_t(opData.shiftedOp) << 21);
+ opcode.addImm(x, 31);
+ opcode.addImm(sType, 22);
+ opcode.addReg(o2, 16);
+ opcode.addImm(shift, 10);
+ opcode.addReg(o1, 5);
+ opcode.addReg(o0, 0);
+ goto EmitOp;
+ }
+
+ // SP register can only be used with LSL or Extend.
+ if (sType != uint32_t(ShiftOp::kLSL))
+ goto InvalidImmediate;
+ sType = x ? uint32_t(ShiftOp::kUXTX) : uint32_t(ShiftOp::kUXTW);
+ }
+
+ // Extend operation - UXTB, UXTH, UXTW, UXTX, SXTB, SXTH, SXTW, SXTX.
+ opcode.reset(uint32_t(opData.extendedOp) << 21);
+ sType -= uint32_t(ShiftOp::kUXTB);
+
+ if (sType > 7 || shift > 4)
+ goto InvalidImmediate;
+
+ if (!(opcode.get() & B(29))) {
+ // ADD|SUB (extend) - ZR is not allowed.
+ if (!checkGpId(o0, o1, kSP))
+ goto InvalidPhysId;
+ }
+ else {
+ // ADDS|SUBS (extend) - ZR allowed in Rd, SP allowed in Rn.
+ if (!checkGpId(o0, kZR) || !checkGpId(o1, kSP))
+ goto InvalidPhysId;
+ }
+
+ opcode.addImm(x, 31);
+ opcode.addReg(o2, 16);
+ opcode.addImm(sType, 13);
+ opcode.addImm(shift, 10);
+ opcode.addReg(o1, 5);
+ opcode.addReg(o0, 0);
+ goto EmitOp;
+ }
+
+ break;
+ }
+
+ case InstDB::kEncodingBaseLogical: {
+ const InstDB::EncodingData::BaseLogical& opData = InstDB::EncodingData::baseLogical[encodingIndex];
+
+ uint32_t x;
+ if (!checkGpType(o0, o1, kWX, &x))
+ goto InvalidInstruction;
+
+ if (!checkSignature(o0, o1))
+ goto InvalidInstruction;
+
+ uint32_t opSize = x ? 64 : 32;
+
+ if (isign4 == ENC_OPS3(Reg, Reg, Imm) && opData.immediateOp != 0) {
+ opcode.reset(uint32_t(opData.immediateOp) << 23);
+
+ // AND|ANDS|BIC|BICS|ORR|EOR (immediate) uses a LogicalImm format described by N:R:S values.
+ uint64_t immMask = Support::lsbMask<uint64_t>(opSize);
+ uint64_t immValue = o2.as<Imm>().valueAs<uint64_t>();
+
+ if (opData.negateImm)
+ immValue ^= immMask;
+
+ // Logical instructions use 13-bit immediate pattern encoded as N:ImmS:ImmR.
+ LogicalImm logicalImm;
+ if (!Utils::encodeLogicalImm(immValue & immMask, opSize, &logicalImm))
+ goto InvalidImmediate;
+
+ // AND|BIC|ORR|EOR (immediate) can have SP on destination, but ANDS|BICS (immediate) cannot.
+ uint32_t kOpANDS = 0x3 << 29;
+ bool isANDS = (opcode.get() & kOpANDS) == kOpANDS;
+
+ if (!checkGpId(o0, isANDS ? kZR : kSP) || !checkGpId(o1, kZR))
+ goto InvalidPhysId;
+
+ opcode.addImm(x, 31);
+ opcode.addLogicalImm(logicalImm);
+ opcode.addReg(o1, 5);
+ opcode.addReg(o0, 0);
+ goto EmitOp;
+ }
+
+ if (!checkSignature(o1, o2))
+ goto InvalidInstruction;
+
+ if (isign4 == ENC_OPS3(Reg, Reg, Reg)) {
+ if (!checkGpId(o0, o1, o2, kZR))
+ goto InvalidPhysId;
+
+ opcode.reset(uint32_t(opData.shiftedOp) << 21);
+ opcode.addImm(x, 31);
+ opcode.addReg(o2, 16);
+ opcode.addReg(o1, 5);
+ opcode.addReg(o0, 0);
+ goto EmitOp;
+ }
+
+ if (isign4 == ENC_OPS4(Reg, Reg, Reg, Imm)) {
+ if (!checkGpId(o0, o1, o2, kZR))
+ goto InvalidPhysId;
+
+ uint32_t shiftType = o3.as<Imm>().predicate();
+ uint64_t opShift = o3.as<Imm>().valueAs<uint64_t>();
+
+ if (shiftType > 0x3 || opShift >= opSize)
+ goto InvalidImmediate;
+
+ opcode.reset(uint32_t(opData.shiftedOp) << 21);
+ opcode.addImm(x, 31);
+ opcode.addImm(shiftType, 22);
+ opcode.addReg(o2, 16);
+ opcode.addImm(opShift, 10);
+ opcode.addReg(o1, 5);
+ opcode.addReg(o0, 0);
+ goto EmitOp;
+ }
+
+ break;
+ }
+
+ case InstDB::kEncodingBaseCmpCmn: {
+ const InstDB::EncodingData::BaseCmpCmn& opData = InstDB::EncodingData::baseCmpCmn[encodingIndex];
+
+ uint32_t x;
+ if (!checkGpType(o0, kWX, &x))
+ goto InvalidInstruction;
+
+ if (isign4 == ENC_OPS2(Reg, Imm)) {
+ // CMN|CMP (immediate) - ZR is not allowed.
+ if (!checkGpId(o0, kSP))
+ goto InvalidPhysId;
+
+ // CMN|CMP (immediate) use 12-bit immediate optionally shifted by 'LSL #12'.
+ const Imm& imm12 = o1.as<Imm>();
+ uint32_t immShift = 0;
+ uint64_t immValue = imm12.valueAs<uint64_t>();
+
+ if (immValue > 0xFFFu) {
+ if ((immValue & ~uint64_t(0xFFFu << 12)) != 0)
+ goto InvalidImmediate;
+ immShift = 1;
+ immValue >>= 12;
+ }
+
+ opcode.reset(uint32_t(opData.immediateOp) << 24);
+ opcode.addImm(x, 31);
+ opcode.addImm(immShift, 22);
+ opcode.addImm(immValue, 10);
+ opcode.addReg(o0, 5);
+ opcode.addReg(Gp::kIdZr, 0);
+ goto EmitOp;
+ }
+
+ if (isign4 == ENC_OPS2(Reg, Reg) || isign4 == ENC_OPS3(Reg, Reg, Imm)) {
+ if (!checkSignature(o0, o1))
+ goto InvalidInstruction;
+
+ uint32_t opSize = x ? 64 : 32;
+ uint32_t sType = 0;
+ uint64_t shift = 0;
+
+ if (isign4 == ENC_OPS3(Reg, Reg, Imm)) {
+ sType = o2.as<Imm>().predicate();
+ shift = o2.as<Imm>().valueAs<uint64_t>();
+ }
+
+ bool hasSP = o0.as<Gp>().isSP() || o1.as<Gp>().isSP();
+
+ // Shift operation - LSL, LSR, ASR.
+ if (sType <= uint32_t(ShiftOp::kASR)) {
+ if (!hasSP) {
+ if (shift >= opSize)
+ goto InvalidImmediate;
+
+ opcode.reset(uint32_t(opData.shiftedOp) << 21);
+ opcode.addImm(x, 31);
+ opcode.addImm(sType, 22);
+ opcode.addReg(o1, 16);
+ opcode.addImm(shift, 10);
+ opcode.addReg(o0, 5);
+ opcode.addReg(Gp::kIdZr, 0);
+ goto EmitOp;
+ }
+
+ // SP register can only be used with LSL or Extend.
+ if (sType != uint32_t(ShiftOp::kLSL))
+ goto InvalidImmediate;
+
+ sType = x ? uint32_t(ShiftOp::kUXTX) : uint32_t(ShiftOp::kUXTW);
+ }
+
+ // Extend operation - UXTB, UXTH, UXTW, UXTX, SXTB, SXTH, SXTW, SXTX.
+ sType -= uint32_t(ShiftOp::kUXTB);
+ if (sType > 7 || shift > 4)
+ goto InvalidImmediate;
+
+ opcode.reset(uint32_t(opData.extendedOp) << 21);
+ opcode.addImm(x, 31);
+ opcode.addReg(o1, 16);
+ opcode.addImm(sType, 13);
+ opcode.addImm(shift, 10);
+ opcode.addReg(o0, 5);
+ opcode.addReg(Gp::kIdZr, 0);
+ goto EmitOp;
+ }
+
+ break;
+ }
+
+ case InstDB::kEncodingBaseMvnNeg: {
+ const InstDB::EncodingData::BaseMvnNeg& opData = InstDB::EncodingData::baseMvnNeg[encodingIndex];
+
+ uint32_t x;
+ if (!checkGpType(o0, o1, kWX, &x))
+ goto InvalidInstruction;
+
+ opcode.reset(opData.opcode);
+ opcode.addImm(x, 31);
+ opcode.addReg(o1, 16);
+ opcode.addReg(o0, 0);
+
+ if (isign4 == ENC_OPS2(Reg, Reg)) {
+ if (!checkGpId(o0, o1, kZR))
+ goto InvalidPhysId;
+
+ goto EmitOp;
+ }
+
+ if (isign4 == ENC_OPS3(Reg, Reg, Imm)) {
+ if (!checkGpId(o0, o1, kZR))
+ goto InvalidPhysId;
+
+ uint32_t opSize = x ? 64 : 32;
+ uint32_t shiftType = o2.as<Imm>().predicate();
+ uint64_t opShift = o2.as<Imm>().valueAs<uint64_t>();
+
+ if (shiftType > uint32_t(ShiftOp::kROR) || opShift >= opSize)
+ goto InvalidImmediate;
+
+ opcode.addImm(shiftType, 22);
+ opcode.addImm(opShift, 10);
+ goto EmitOp;
+ }
+
+ break;
+ }
+
+ case InstDB::kEncodingBaseTst: {
+ const InstDB::EncodingData::BaseTst& opData = InstDB::EncodingData::baseTst[encodingIndex];
+
+ uint32_t x;
+ if (!checkGpType(o0, kWX, &x))
+ goto InvalidInstruction;
+
+ uint32_t opSize = x ? 64 : 32;
+
+ if (isign4 == ENC_OPS2(Reg, Imm) && opData.immediateOp != 0) {
+ if (!checkGpId(o0, kZR))
+ goto InvalidPhysId;
+
+ // TST (immediate) uses a LogicalImm format described by N:R:S values.
+ uint64_t immMask = Support::lsbMask<uint64_t>(opSize);
+ uint64_t immValue = o1.as<Imm>().valueAs<uint64_t>();
+
+ // Logical instructions use 13-bit immediate pattern encoded as N:ImmS:ImmR.
+ LogicalImm logicalImm;
+ if (!Utils::encodeLogicalImm(immValue & immMask, opSize, &logicalImm))
+ goto InvalidImmediate;
+
+ opcode.reset(uint32_t(opData.immediateOp) << 22);
+ opcode.addLogicalImm(logicalImm);
+ opcode.addImm(x, 31);
+ opcode.addReg(o0, 5);
+ opcode.addReg(Gp::kIdZr, 0);
+ goto EmitOp;
+ }
+
+ opcode.reset(uint32_t(opData.shiftedOp) << 21);
+ opcode.addImm(x, 31);
+ opcode.addReg(o1, 16);
+ opcode.addReg(o0, 5);
+ opcode.addReg(Gp::kIdZr, 0);
+
+ if (isign4 == ENC_OPS2(Reg, Reg)) {
+ if (!checkGpId(o0, o1, kZR))
+ goto InvalidPhysId;
+
+ goto EmitOp;
+ }
+
+ if (isign4 == ENC_OPS3(Reg, Reg, Imm)) {
+ if (!checkGpId(o0, o1, kZR))
+ goto InvalidPhysId;
+
+ uint32_t shiftType = o2.as<Imm>().predicate();
+ uint64_t opShift = o2.as<Imm>().valueAs<uint64_t>();
+
+ if (shiftType > 0x3 || opShift >= opSize)
+ goto InvalidImmediate;
+
+ opcode.addImm(shiftType, 22);
+ opcode.addImm(opShift, 10);
+ goto EmitOp;
+ }
+
+ break;
+ }
+
+ // ------------------------------------------------------------------------
+ // [Base - Bit Manipulation]
+ // ------------------------------------------------------------------------
+
+ case InstDB::kEncodingBaseBfc: {
+ const InstDB::EncodingData::BaseBfc& opData = InstDB::EncodingData::baseBfc[encodingIndex];
+
+ if (isign4 == ENC_OPS3(Reg, Imm, Imm)) {
+ uint32_t x;
+ if (!checkGpType(o0, InstDB::kWX, &x))
+ goto InvalidInstruction;
+
+ if (!checkGpId(o0))
+ goto InvalidPhysId;
+
+ uint64_t lsb = o1.as<Imm>().valueAs<uint64_t>();
+ uint64_t width = o2.as<Imm>().valueAs<uint64_t>();
+ uint32_t opSize = x ? 64 : 32;
+
+ if (lsb >= opSize || width == 0 || width > opSize)
+ goto InvalidImmediate;
+
+ uint32_t lsb32 = Support::neg(uint32_t(lsb)) & (opSize - 1);
+ uint32_t width32 = uint32_t(width) - 1;
+
+ opcode.reset(opData.opcode);
+ opcode.addImm(x, 31);
+ opcode.addImm(x, 22);
+ opcode.addImm(lsb32, 16);
+ opcode.addImm(width32, 10);
+ opcode.addReg(o0, 0);
+ goto EmitOp;
+ }
+
+ break;
+ }
+
+ case InstDB::kEncodingBaseBfi: {
+ const InstDB::EncodingData::BaseBfi& opData = InstDB::EncodingData::baseBfi[encodingIndex];
+
+ if (isign4 == ENC_OPS4(Reg, Reg, Imm, Imm)) {
+ uint32_t x;
+ if (!checkGpType(o0, InstDB::kWX, &x))
+ goto InvalidInstruction;
+
+ if (!checkSignature(o0, o1))
+ goto InvalidInstruction;
+
+ if (!checkGpId(o0, o1))
+ goto InvalidPhysId;
+
+ uint64_t lsb = o2.as<Imm>().valueAs<uint64_t>();
+ uint64_t width = o3.as<Imm>().valueAs<uint64_t>();
+ uint32_t opSize = x ? 64 : 32;
+
+ if (lsb >= opSize || width == 0 || width > opSize)
+ goto InvalidImmediate;
+
+ uint32_t lImm = Support::neg(uint32_t(lsb)) & (opSize - 1);
+ uint32_t wImm = uint32_t(width) - 1;
+
+ opcode.reset(opData.opcode);
+ opcode.addImm(x, 31);
+ opcode.addImm(x, 22);
+ opcode.addImm(lImm, 16);
+ opcode.addImm(wImm, 10);
+ opcode.addReg(o1, 5);
+ opcode.addReg(o0, 0);
+ goto EmitOp;
+ }
+
+ break;
+ }
+
+ case InstDB::kEncodingBaseBfm: {
+ const InstDB::EncodingData::BaseBfm& opData = InstDB::EncodingData::baseBfm[encodingIndex];
+
+ if (isign4 == ENC_OPS4(Reg, Reg, Imm, Imm)) {
+ uint32_t x;
+ if (!checkGpType(o0, InstDB::kWX, &x))
+ goto InvalidInstruction;
+
+ if (!checkSignature(o0, o1))
+ goto InvalidInstruction;
+
+ if (!checkGpId(o0, o1))
+ goto InvalidPhysId;
+
+ uint64_t immR = o2.as<Imm>().valueAs<uint64_t>();
+ uint64_t immS = o3.as<Imm>().valueAs<uint64_t>();
+ uint32_t opSize = x ? 64 : 32;
+
+ if ((immR | immS) >= opSize)
+ goto InvalidImmediate;
+
+ opcode.reset(opData.opcode);
+ opcode.addImm(x, 31);
+ opcode.addImm(x, 22);
+ opcode.addImm(immR, 16);
+ opcode.addImm(immS, 10);
+ opcode.addReg(o1, 5);
+ opcode.addReg(o0, 0);
+ goto EmitOp;
+ }
+
+ break;
+ }
+
+ case InstDB::kEncodingBaseBfx: {
+ const InstDB::EncodingData::BaseBfx& opData = InstDB::EncodingData::baseBfx[encodingIndex];
+
+ if (isign4 == ENC_OPS4(Reg, Reg, Imm, Imm)) {
+ uint32_t x;
+ if (!checkGpType(o0, InstDB::kWX, &x))
+ goto InvalidInstruction;
+
+ if (!checkSignature(o0, o1))
+ goto InvalidInstruction;
+
+ if (!checkGpId(o0, o1))
+ goto InvalidPhysId;
+
+ uint64_t lsb = o2.as<Imm>().valueAs<uint64_t>();
+ uint64_t width = o3.as<Imm>().valueAs<uint64_t>();
+ uint32_t opSize = x ? 64 : 32;
+
+ if (lsb >= opSize || width == 0 || width > opSize)
+ goto InvalidImmediate;
+
+ uint32_t lsb32 = uint32_t(lsb);
+ uint32_t width32 = lsb32 + uint32_t(width) - 1u;
+
+ if (width32 >= opSize)
+ goto InvalidImmediate;
+
+ opcode.reset(opData.opcode);
+ opcode.addImm(x, 31);
+ opcode.addImm(x, 22);
+ opcode.addImm(lsb32, 16);
+ opcode.addImm(width32, 10);
+ opcode.addReg(o1, 5);
+ opcode.addReg(o0, 0);
+ goto EmitOp;
+ }
+
+ break;
+ }
+
+ case InstDB::kEncodingBaseExtend: {
+ const InstDB::EncodingData::BaseExtend& opData = InstDB::EncodingData::baseExtend[encodingIndex];
+
+ if (isign4 == ENC_OPS2(Reg, Reg)) {
+ uint32_t x;
+ if (!checkGpType(o0, opData.rType, &x))
+ goto InvalidInstruction;
+
+ if (!o1.as<Reg>().isGpW())
+ goto InvalidInstruction;
+
+ if (!checkGpId(o0, o1))
+ goto InvalidPhysId;
+
+ opcode.reset(opData.opcode());
+ opcode.addImm(x, 31);
+ opcode.addImm(x, 22);
+ opcode.addReg(o1, 5);
+ opcode.addReg(o0, 0);
+ goto EmitOp;
+ }
+
+ break;
+ }
+
+ case InstDB::kEncodingBaseExtract: {
+ const InstDB::EncodingData::BaseExtract& opData = InstDB::EncodingData::baseExtract[encodingIndex];
+
+ if (isign4 == ENC_OPS4(Reg, Reg, Reg, Imm)) {
+ uint32_t x;
+ if (!checkGpType(o0, kWX, &x))
+ goto InvalidInstruction;
+
+ if (!checkSignature(o0, o1, o2))
+ goto InvalidInstruction;
+
+ if (!checkGpId(o0, o1, o2))
+ goto InvalidPhysId;
+
+ uint64_t lsb = o3.as<Imm>().valueAs<uint64_t>();
+ uint32_t opSize = x ? 64 : 32;
+
+ if (lsb >= opSize)
+ goto InvalidImmediate;
+
+ opcode.reset(opData.opcode);
+ opcode.addImm(x, 31);
+ opcode.addImm(x, 22);
+ opcode.addReg(o2, 16);
+ opcode.addImm(lsb, 10);
+ opcode.addReg(o1, 5);
+ opcode.addReg(o0, 0);
+ goto EmitOp;
+ }
+
+ break;
+ }
+
+ case InstDB::kEncodingBaseRev: {
+ if (isign4 == ENC_OPS2(Reg, Reg)) {
+ uint32_t x;
+ if (!checkGpType(o0, InstDB::kWX, &x))
+ goto InvalidInstruction;
+
+ if (!checkSignature(o0, o1))
+ goto InvalidInstruction;
+
+ if (!checkGpId(o0, o1))
+ goto InvalidPhysId;
+
+ opcode.reset(0b01011010110000000000100000000000);
+ opcode.addImm(x, 31);
+ opcode.addImm(x, 10);
+ opcode.addReg(o1, 5);
+ opcode.addReg(o0, 0);
+ goto EmitOp;
+ }
+
+ break;
+ }
+
+ case InstDB::kEncodingBaseShift: {
+ const InstDB::EncodingData::BaseShift& opData = InstDB::EncodingData::baseShift[encodingIndex];
+
+ uint32_t x;
+ if (!checkGpType(o0, kWX, &x))
+ goto InvalidInstruction;
+
+ if (isign4 == ENC_OPS3(Reg, Reg, Reg)) {
+ if (!checkSignature(o0, o1, o2))
+ goto InvalidInstruction;
+
+ if (!checkGpId(o0, o1, o2, kZR))
+ goto InvalidPhysId;
+
+ opcode.reset(opData.registerOp());
+ opcode.addImm(x, 31);
+ opcode.addReg(o2, 16);
+ opcode.addReg(o1, 5);
+ opcode.addReg(o0, 0);
+ goto EmitOp;
+ }
+
+ if (isign4 == ENC_OPS3(Reg, Reg, Imm) && opData.immediateOp()) {
+ if (!checkSignature(o0, o1))
+ goto InvalidInstruction;
+
+ if (!checkGpId(o0, o1, kZR))
+ goto InvalidPhysId;
+
+ uint64_t immR = o2.as<Imm>().valueAs<uint64_t>();
+ uint32_t opSize = x ? 64 : 32;
+
+ if (immR >= opSize)
+ goto InvalidImmediate;
+
+ opcode.reset(opData.immediateOp());
+ opcode.addImm(x, 31);
+ opcode.addImm(x, 22);
+ opcode.addReg(o1, 5);
+ opcode.addReg(o0, 0);
+
+ if (opcode.get() & B(10)) {
+ // ASR and LSR (immediate) has the same logic.
+ opcode.addImm(x, 15);
+ opcode.addImm(immR, 16);
+ goto EmitOp;
+ }
+
+ if (opData.ror == 0) {
+ // LSL (immediate) is an alias to UBFM
+ uint32_t ubfmImmR = Support::neg(uint32_t(immR)) & (opSize - 1);
+ uint32_t ubfmImmS = opSize - 1 - uint32_t(immR);
+
+ opcode.addImm(ubfmImmR, 16);
+ opcode.addImm(ubfmImmS, 10);
+ goto EmitOp;
+ }
+ else {
+ // ROR (immediate) is an alias to EXTR.
+ opcode.addImm(immR, 10);
+ opcode.addReg(o1, 16);
+ goto EmitOp;
+ }
+ }
+
+ break;
+ }
+
+ // ------------------------------------------------------------------------
+ // [Base - Conditionals]
+ // ------------------------------------------------------------------------
+
+ case InstDB::kEncodingBaseCCmp: {
+ const InstDB::EncodingData::BaseCCmp& opData = InstDB::EncodingData::baseCCmp[encodingIndex];
+
+ if (isign4 == ENC_OPS4(Reg, Reg, Imm, Imm) || isign4 == ENC_OPS4(Reg, Imm, Imm, Imm)) {
+ uint32_t x;
+ if (!checkGpType(o0, InstDB::kWX, &x))
+ goto InvalidInstruction;
+
+ if (!checkGpId(o0, kZR))
+ goto InvalidPhysId;
+
+ uint64_t nzcv = o2.as<Imm>().valueAs<uint64_t>();
+ uint64_t cond = o3.as<Imm>().valueAs<uint64_t>();
+
+ if ((nzcv | cond) > 0xFu)
+ goto InvalidImmediate;
+
+ opcode.reset(opData.opcode);
+ opcode.addImm(x, 31);
+ opcode.addImm(condCodeToOpcodeCond(uint32_t(cond)), 12);
+ opcode.addImm(nzcv, 0);
+
+ if (isign4 == ENC_OPS4(Reg, Reg, Imm, Imm)) {
+ // CCMN|CCMP (register) form.
+ if (!checkSignature(o0, o1))
+ goto InvalidInstruction;
+
+ if (!checkGpId(o1, kZR))
+ goto InvalidPhysId;
+
+ opcode.addReg(o1, 16);
+ opcode.addReg(o0, 5);
+ goto EmitOp;
+ }
+ else {
+ // CCMN|CCMP (immediate) form.
+ uint64_t imm5 = o1.as<Imm>().valueAs<uint64_t>();
+ if (imm5 > 0x1F)
+ goto InvalidImmediate;
+
+ opcode.addImm(1, 11);
+ opcode.addImm(imm5, 16);
+ opcode.addReg(o0, 5);
+ goto EmitOp;
+ }
+ }
+
+ break;
+ }
+
+ case InstDB::kEncodingBaseCInc: {
+ const InstDB::EncodingData::BaseCInc& opData = InstDB::EncodingData::baseCInc[encodingIndex];
+
+ if (isign4 == ENC_OPS3(Reg, Reg, Imm)) {
+ uint32_t x;
+ if (!checkGpType(o0, o1, InstDB::kWX, &x))
+ goto InvalidInstruction;
+
+ if (!checkGpId(o0, o1, kZR))
+ goto InvalidPhysId;
+
+ uint64_t cond = o2.as<Imm>().valueAs<uint64_t>();
+ if (cond - 2u > 0xEu)
+ goto InvalidImmediate;
+
+ opcode.reset(opData.opcode);
+ opcode.addImm(x, 31);
+ opcode.addReg(o1, 16);
+ opcode.addImm(condCodeToOpcodeCond(uint32_t(cond)) ^ 1u, 12);
+ opcode.addReg(o1, 5);
+ opcode.addReg(o0, 0);
+ goto EmitOp;
+ }
+
+ break;
+ }
+
+ case InstDB::kEncodingBaseCSel: {
+ const InstDB::EncodingData::BaseCSel& opData = InstDB::EncodingData::baseCSel[encodingIndex];
+
+ if (isign4 == ENC_OPS4(Reg, Reg, Reg, Imm)) {
+ uint32_t x;
+ if (!checkGpType(o0, o1, o2, InstDB::kWX, &x))
+ goto InvalidInstruction;
+
+ if (!checkGpId(o0, o1, o2, kZR))
+ goto InvalidPhysId;
+
+ uint64_t cond = o3.as<Imm>().valueAs<uint64_t>();
+ if (cond > 0xFu)
+ goto InvalidImmediate;
+
+ opcode.reset(opData.opcode);
+ opcode.addImm(x, 31);
+ opcode.addReg(o2, 16);
+ opcode.addImm(condCodeToOpcodeCond(uint32_t(cond)), 12);
+ opcode.addReg(o1, 5);
+ opcode.addReg(o0, 0);
+ goto EmitOp;
+ }
+
+ break;
+ }
+
+ case InstDB::kEncodingBaseCSet: {
+ const InstDB::EncodingData::BaseCSet& opData = InstDB::EncodingData::baseCSet[encodingIndex];
+
+ if (isign4 == ENC_OPS2(Reg, Imm)) {
+ uint32_t x;
+ if (!checkGpType(o0, InstDB::kWX, &x))
+ goto InvalidInstruction;
+
+ if (!checkGpId(o0, kZR))
+ goto InvalidPhysId;
+
+ uint64_t cond = o1.as<Imm>().valueAs<uint64_t>();
+ if (cond - 2u >= 0xEu)
+ goto InvalidImmediate;
+
+ opcode.reset(opData.opcode);
+ opcode.addImm(x, 31);
+ opcode.addImm(condCodeToOpcodeCond(uint32_t(cond)) ^ 1u, 12);
+ opcode.addReg(o0, 0);
+ goto EmitOp;
+ }
+
+ break;
+ }
+
+ // ------------------------------------------------------------------------
+ // [Base - Special]
+ // ------------------------------------------------------------------------
+
+ case InstDB::kEncodingBaseAtDcIcTlbi: {
+ const InstDB::EncodingData::BaseAtDcIcTlbi& opData = InstDB::EncodingData::baseAtDcIcTlbi[encodingIndex];
+
+ if (isign4 == ENC_OPS1(Imm) || isign4 == ENC_OPS2(Imm, Reg)) {
+ if (opData.mandatoryReg && isign4 != ENC_OPS2(Imm, Reg))
+ goto InvalidInstruction;
+
+ if (o0.as<Imm>().valueAs<uint64_t>() > 0x7FFFu)
+ goto InvalidImmediate;
+
+ uint32_t imm = o0.as<Imm>().valueAs<uint32_t>();
+ if ((imm & opData.immVerifyMask) != opData.immVerifyData)
+ goto InvalidImmediate;
+
+ uint32_t rt = 31;
+ if (o1.isReg()) {
+ if (!o1.as<Reg>().isGpX())
+ goto InvalidInstruction;
+
+ if (!checkGpId(o1, kZR))
+ goto InvalidPhysId;
+
+ rt = o1.id() & 31;
+ }
+
+ opcode.reset(0b11010101000010000000000000000000);
+ opcode.addImm(imm, 5);
+ opcode.addReg(rt, 0);
+ goto EmitOp;
+ }
+ break;
+ }
+
+ case InstDB::kEncodingBaseMrs: {
+ if (isign4 == ENC_OPS2(Reg, Imm)) {
+ if (!o0.as<Reg>().isGpX())
+ goto InvalidInstruction;
+
+ if (!checkGpId(o0, kZR))
+ goto InvalidPhysId;
+
+ if (o1.as<Imm>().valueAs<uint64_t>() > 0xFFFFu)
+ goto InvalidImmediate;
+
+ uint32_t imm = o1.as<Imm>().valueAs<uint32_t>();
+ if (!(imm & B(15)))
+ goto InvalidImmediate;
+
+ opcode.reset(0b11010101001100000000000000000000);
+ opcode.addImm(imm, 5);
+ opcode.addReg(o0, 0);
+ goto EmitOp;
+ }
+
+ break;
+ }
+
+ case InstDB::kEncodingBaseMsr: {
+ if (isign4 == ENC_OPS2(Imm, Reg)) {
+ if (!o1.as<Reg>().isGpX())
+ goto InvalidInstruction;
+
+ if (o0.as<Imm>().valueAs<uint64_t>() > 0xFFFFu)
+ goto InvalidImmediate;
+
+ uint32_t imm = o0.as<Imm>().valueAs<uint32_t>();
+ if (!(imm & B(15)))
+ goto InvalidImmediate;
+
+ if (!checkGpId(o1, kZR))
+ goto InvalidPhysId;
+
+ opcode.reset(0b11010101000100000000000000000000);
+ opcode.addImm(imm, 5);
+ opcode.addReg(o1, 0);
+ goto EmitOp;
+ }
+
+ if (isign4 == ENC_OPS2(Imm, Imm)) {
+ if (o0.as<Imm>().valueAs<uint64_t>() > 0x1Fu)
+ goto InvalidImmediate;
+
+ if (o1.as<Imm>().valueAs<uint64_t>() > 0xFu)
+ goto InvalidImmediate;
+
+ uint32_t op = o0.as<Imm>().valueAs<uint32_t>();
+ uint32_t cRm = o1.as<Imm>().valueAs<uint32_t>();
+
+ uint32_t op1 = uint32_t(op) >> 3;
+ uint32_t op2 = uint32_t(op) & 0x7u;
+
+ opcode.reset(0b11010101000000000100000000011111);
+ opcode.addImm(op1, 16);
+ opcode.addImm(cRm, 8);
+ opcode.addImm(op2, 5);
+ goto EmitOp;
+ }
+
+ break;
+ }
+
+ case InstDB::kEncodingBaseSys: {
+ if (isign4 == ENC_OPS4(Imm, Imm, Imm, Imm)) {
+ if (o0.as<Imm>().valueAs<uint64_t>() > 0x7u ||
+ o1.as<Imm>().valueAs<uint64_t>() > 0xFu ||
+ o2.as<Imm>().valueAs<uint64_t>() > 0xFu ||
+ o3.as<Imm>().valueAs<uint64_t>() > 0x7u)
+ goto InvalidImmediate;
+
+ uint32_t op1 = o0.as<Imm>().valueAs<uint32_t>();
+ uint32_t cRn = o1.as<Imm>().valueAs<uint32_t>();
+ uint32_t cRm = o2.as<Imm>().valueAs<uint32_t>();
+ uint32_t op2 = o3.as<Imm>().valueAs<uint32_t>();
+ uint32_t rt = 31;
+
+ const Operand_& o4 = opExt[EmitterUtils::kOp4];
+ if (o4.isReg()) {
+ if (!o4.as<Reg>().isGpX())
+ goto InvalidInstruction;
+
+ if (!checkGpId(o4, kZR))
+ goto InvalidPhysId;
+
+ rt = o4.id() & 31;
+ }
+ else if (!o4.isNone()) {
+ goto InvalidInstruction;
+ }
+
+ opcode.reset(0b11010101000010000000000000000000);
+ opcode.addImm(op1, 16);
+ opcode.addImm(cRn, 12);
+ opcode.addImm(cRm, 8);
+ opcode.addImm(op2, 5);
+ opcode.addImm(rt, 0);
+ goto EmitOp;
+ }
+
+ break;
+ }
+
+ // ------------------------------------------------------------------------
+ // [Base - Branch]
+ // ------------------------------------------------------------------------
+
+ case InstDB::kEncodingBaseBranchReg: {
+ const InstDB::EncodingData::BaseBranchReg& opData = InstDB::EncodingData::baseBranchReg[encodingIndex];
+
+ if (isign4 == ENC_OPS1(Reg)) {
+ if (!o0.as<Reg>().isGpX())
+ goto InvalidInstruction;
+
+ if (!checkGpId(o0, kZR))
+ goto InvalidPhysId;
+
+ opcode.reset(opData.opcode);
+ opcode.addReg(o0, 5);
+ goto EmitOp;
+ }
+
+ break;
+ }
+
+ case InstDB::kEncodingBaseBranchRel: {
+ const InstDB::EncodingData::BaseBranchRel& opData = InstDB::EncodingData::baseBranchRel[encodingIndex];
+
+ if (isign4 == ENC_OPS1(Label) || isign4 == ENC_OPS1(Imm)) {
+ opcode.reset(opData.opcode);
+ rmRel = &o0;
+
+ if (instCC != CondCode::kAL) {
+ opcode |= B(30);
+ opcode.addImm(condCodeToOpcodeCond(uint32_t(instCC)), 0);
+ offsetFormat.resetToImmValue(OffsetType::kSignedOffset, 4, 5, 19, 2);
+ goto EmitOp_Rel;
+ }
+
+ offsetFormat.resetToImmValue(OffsetType::kSignedOffset, 4, 0, 26, 2);
+ goto EmitOp_Rel;
+ }
+
+ break;
+ }
+
+ case InstDB::kEncodingBaseBranchCmp: {
+ const InstDB::EncodingData::BaseBranchCmp& opData = InstDB::EncodingData::baseBranchCmp[encodingIndex];
+
+ if (isign4 == ENC_OPS2(Reg, Label) || isign4 == ENC_OPS2(Reg, Imm)) {
+ uint32_t x;
+ if (!checkGpType(o0, kWX, &x))
+ goto InvalidInstruction;
+
+ if (!checkGpId(o0, kZR))
+ goto InvalidPhysId;
+
+ opcode.reset(opData.opcode);
+ opcode.addImm(x, 31);
+ opcode.addReg(o0, 0);
+ offsetFormat.resetToImmValue(OffsetType::kSignedOffset, 4, 5, 19, 2);
+
+ rmRel = &o1;
+ goto EmitOp_Rel;
+ }
+
+ break;
+ }
+
+ case InstDB::kEncodingBaseBranchTst: {
+ const InstDB::EncodingData::BaseBranchTst& opData = InstDB::EncodingData::baseBranchTst[encodingIndex];
+
+ if (isign4 == ENC_OPS3(Reg, Imm, Label) || isign4 == ENC_OPS3(Reg, Imm, Imm)) {
+ uint32_t x;
+ if (!checkGpType(o0, kWX, &x))
+ goto InvalidInstruction;
+
+ if (!checkGpId(o0, kZR))
+ goto InvalidPhysId;
+
+ uint64_t imm = o1.as<Imm>().valueAs<uint64_t>();
+
+ opcode.reset(opData.opcode);
+ if (imm >= 32) {
+ if (!x)
+ goto InvalidImmediate;
+ opcode.addImm(x, 31);
+ imm &= 0x1F;
+ }
+
+ opcode.addReg(o0, 0);
+ opcode.addImm(imm, 19);
+ offsetFormat.resetToImmValue(OffsetType::kSignedOffset, 4, 5, 14, 2);
+
+ rmRel = &o2;
+ goto EmitOp_Rel;
+ }
+
+ break;
+ }
+
+ // ------------------------------------------------------------------------
+ // [Base - Load / Store]
+ // ------------------------------------------------------------------------
+
+ case InstDB::kEncodingBaseLdSt: {
+ const InstDB::EncodingData::BaseLdSt& opData = InstDB::EncodingData::baseLdSt[encodingIndex];
+
+ if (isign4 == ENC_OPS2(Reg, Mem)) {
+ const Mem& m = o1.as<Mem>();
+ rmRel = &m;
+
+ uint32_t x;
+ if (!checkGpType(o0, opData.rType, &x))
+ goto InvalidInstruction;
+
+ if (!checkGpId(o0, kZR))
+ goto InvalidPhysId;
+
+ // Instructions that work with either word or dword have the unsigned
+ // offset shift set to 2 (word), so we set it to 3 (dword) if this is
+ // X version of the instruction.
+ uint32_t xShiftMask = uint32_t(opData.uOffsetShift == 2);
+ uint32_t immShift = uint32_t(opData.uOffsetShift) + (x & xShiftMask);
+
+ if (!armCheckMemBaseIndexRel(m))
+ goto InvalidAddress;
+
+ int64_t offset = m.offset();
+ if (m.hasBaseReg()) {
+ // [Base {Offset | Index}]
+ if (m.hasIndex()) {
+ uint32_t opt = armShiftOpToLdStOptMap[m.predicate()];
+ if (opt == 0xFF)
+ goto InvalidAddress;
+
+ uint32_t shift = m.shift();
+ uint32_t s = shift != 0;
+
+ if (s && shift != immShift)
+ goto InvalidAddressScale;
+
+ opcode.reset(uint32_t(opData.registerOp) << 21);
+ opcode.xorImm(x, opData.xOffset);
+ opcode.addImm(opt, 13);
+ opcode.addImm(s, 12);
+ opcode |= B(11);
+ opcode.addReg(o0, 0);
+ goto EmitOp_MemBaseIndex_Rn5_Rm16;
+ }
+
+ // Makes it easier to work with the offset especially on 32-bit arch.
+ if (!Support::isInt32(offset))
+ goto InvalidDisplacement;
+ int32_t offset32 = int32_t(offset);
+
+ if (m.isPreOrPost()) {
+ if (!Support::isInt9(offset32))
+ goto InvalidDisplacement;
+
+ opcode.reset(uint32_t(opData.prePostOp) << 21);
+ opcode.xorImm(x, opData.xOffset);
+ opcode.addImm(offset32 & 0x1FF, 12);
+ opcode.addImm(m.isPreIndex(), 11);
+ opcode |= B(10);
+ opcode.addReg(o0, 0);
+ goto EmitOp_MemBase_Rn5;
+ }
+ else {
+ uint32_t imm12 = uint32_t(offset32) >> immShift;
+
+ // Alternative form of LDUR/STUR and related instructions as described by AArch64 reference manual:
+ //
+ // If this instruction is not encodable with scaled unsigned offset, try unscaled signed offset.
+ if (!Support::isUInt12(imm12) || (imm12 << immShift) != uint32_t(offset32)) {
+ instId = opData.uAltInstId;
+ instInfo = &InstDB::_instInfoTable[instId];
+ encodingIndex = instInfo->_encodingDataIndex;
+ goto Case_BaseLdurStur;
+ }
+
+ opcode.reset(uint32_t(opData.uOffsetOp) << 22);
+ opcode.xorImm(x, opData.xOffset);
+ opcode.addImm(imm12, 10);
+ opcode.addReg(o0, 0);
+ goto EmitOp_MemBase_Rn5;
+ }
+ }
+ else {
+ if (!opData.literalOp)
+ goto InvalidAddress;
+
+ opcode.reset(uint32_t(opData.literalOp) << 24);
+ opcode.xorImm(x, opData.xOffset);
+ opcode.addReg(o0, 0);
+ offsetFormat.resetToImmValue(OffsetType::kSignedOffset, 4, 5, 19, 2);
+ goto EmitOp_Rel;
+ }
+ }
+
+ break;
+ }
+
+ case InstDB::kEncodingBaseLdpStp: {
+ const InstDB::EncodingData::BaseLdpStp& opData = InstDB::EncodingData::baseLdpStp[encodingIndex];
+
+ if (isign4 == ENC_OPS3(Reg, Reg, Mem)) {
+ const Mem& m = o2.as<Mem>();
+ rmRel = &m;
+
+ uint32_t x;
+ if (!checkGpType(o0, o1, opData.rType, &x))
+ goto InvalidInstruction;
+
+ if (!checkGpId(o0, o1, kZR))
+ goto InvalidPhysId;
+
+ if (m.baseType() != RegType::kARM_GpX || m.hasIndex())
+ goto InvalidAddress;
+
+ if (m.isOffset64Bit())
+ goto InvalidDisplacement;
+
+ uint32_t offsetShift = opData.offsetShift + x;
+ int32_t offset32 = m.offsetLo32() >> offsetShift;
+
+ // Make sure we didn't lose bits by applying the mandatory offset shift.
+ if (uint32_t(offset32) << offsetShift != uint32_t(m.offsetLo32()))
+ goto InvalidDisplacement;
+
+ // Offset is encoded as 7-bit immediate.
+ if (!Support::isInt7(offset32))
+ goto InvalidDisplacement;
+
+ if (m.isPreOrPost() && offset32 != 0) {
+ if (!opData.prePostOp)
+ goto InvalidAddress;
+
+ opcode.reset(uint32_t(opData.prePostOp) << 22);
+ opcode.addImm(m.isPreIndex(), 24);
+ }
+ else {
+ opcode.reset(uint32_t(opData.offsetOp) << 22);
+ }
+
+ opcode.addImm(x, opData.xOffset);
+ opcode.addImm(offset32 & 0x7F, 15);
+ opcode.addReg(o1, 10);
+ opcode.addReg(o0, 0);
+ goto EmitOp_MemBase_Rn5;
+ }
+
+ break;
+ }
+
+ case InstDB::kEncodingBaseStx: {
+ const InstDB::EncodingData::BaseStx& opData = InstDB::EncodingData::baseStx[encodingIndex];
+
+ if (isign4 == ENC_OPS3(Reg, Reg, Mem)) {
+ const Mem& m = o2.as<Mem>();
+ uint32_t x;
+
+ if (!o0.as<Reg>().isGpW() || !checkGpType(o1, opData.rType, &x))
+ goto InvalidInstruction;
+
+ if (!checkGpId(o0, o1, kZR))
+ goto InvalidPhysId;
+
+ opcode.reset(opData.opcode());
+ opcode.addImm(x, opData.xOffset);
+ opcode.addReg(o0, 16);
+ opcode.addReg(o1, 0);
+
+ rmRel = &m;
+ goto EmitOp_MemBaseNoImm_Rn5;
+ }
+
+ break;
+ }
+
+ case InstDB::kEncodingBaseLdxp: {
+ const InstDB::EncodingData::BaseLdxp& opData = InstDB::EncodingData::baseLdxp[encodingIndex];
+
+ if (isign4 == ENC_OPS3(Reg, Reg, Mem)) {
+ const Mem& m = o2.as<Mem>();
+ uint32_t x;
+
+ if (!checkGpType(o0, opData.rType, &x) || !checkSignature(o0, o1))
+ goto InvalidInstruction;
+
+ if (!checkGpId(o0, o1, kZR))
+ goto InvalidPhysId;
+
+ opcode.reset(opData.opcode());
+ opcode.addImm(x, opData.xOffset);
+ opcode.addReg(o1, 10);
+ opcode.addReg(o0, 0);
+
+ rmRel = &m;
+ goto EmitOp_MemBaseNoImm_Rn5;
+ }
+
+ break;
+ }
+
+ case InstDB::kEncodingBaseStxp: {
+ const InstDB::EncodingData::BaseStxp& opData = InstDB::EncodingData::baseStxp[encodingIndex];
+
+ if (isign4 == ENC_OPS4(Reg, Reg, Reg, Mem)) {
+ const Mem& m = o3.as<Mem>();
+ uint32_t x;
+
+ if (!o0.as<Reg>().isGpW() || !checkGpType(o1, opData.rType, &x) || !checkSignature(o1, o2))
+ goto InvalidInstruction;
+
+ if (!checkGpId(o0, o1, o2, kZR))
+ goto InvalidPhysId;
+
+ opcode.reset(opData.opcode());
+ opcode.addImm(x, opData.xOffset);
+ opcode.addReg(o0, 16);
+ opcode.addReg(o2, 10);
+ opcode.addReg(o1, 0);
+
+ rmRel = &m;
+ goto EmitOp_MemBaseNoImm_Rn5;
+ }
+
+ break;
+ }
+
+ case InstDB::kEncodingBaseRM_NoImm: {
+ const InstDB::EncodingData::BaseRM_NoImm& opData = InstDB::EncodingData::baseRM_NoImm[encodingIndex];
+
+ if (isign4 == ENC_OPS2(Reg, Mem)) {
+ const Mem& m = o1.as<Mem>();
+ rmRel = &m;
+
+ uint32_t x;
+ if (!checkGpType(o0, opData.rType, &x))
+ goto InvalidInstruction;
+
+ if (!checkGpId(o0, opData.rHiId))
+ goto InvalidPhysId;
+
+ opcode.reset(opData.opcode());
+ opcode.addImm(x, opData.xOffset);
+ opcode.addReg(o0, 0);
+ goto EmitOp_MemBaseNoImm_Rn5;
+ }
+
+ break;
+ }
+
+ case InstDB::kEncodingBaseRM_SImm9: {
+Case_BaseLdurStur:
+ const InstDB::EncodingData::BaseRM_SImm9& opData = InstDB::EncodingData::baseRM_SImm9[encodingIndex];
+
+ if (isign4 == ENC_OPS2(Reg, Mem)) {
+ const Mem& m = o1.as<Mem>();
+ rmRel = &m;
+
+ uint32_t x;
+ if (!checkGpType(o0, opData.rType, &x))
+ goto InvalidInstruction;
+
+ if (!checkGpId(o0, opData.rHiId))
+ goto InvalidPhysId;
+
+ if (m.hasBaseReg() && !m.hasIndex()) {
+ if (m.isOffset64Bit())
+ goto InvalidDisplacement;
+
+ int32_t offset32 = m.offsetLo32() >> opData.immShift;
+ if (Support::shl(offset32, opData.immShift) != m.offsetLo32())
+ goto InvalidDisplacement;
+
+ if (!Support::isInt9(offset32))
+ goto InvalidDisplacement;
+
+ if (m.isFixedOffset()) {
+ opcode.reset(opData.offsetOp());
+ }
+ else {
+ if (!opData.prePostOp())
+ goto InvalidInstruction;
+
+ opcode.reset(opData.prePostOp());
+ opcode.xorImm(m.isPreIndex(), 11);
+ }
+
+ opcode.xorImm(x, opData.xOffset);
+ opcode.addImm(offset32 & 0x1FF, 12);
+ opcode.addReg(o0, 0);
+ goto EmitOp_MemBase_Rn5;
+ }
+
+ goto InvalidAddress;
+ }
+
+ break;
+ }
+
+ case InstDB::kEncodingBaseRM_SImm10: {
+ const InstDB::EncodingData::BaseRM_SImm10& opData = InstDB::EncodingData::baseRM_SImm10[encodingIndex];
+
+ if (isign4 == ENC_OPS2(Reg, Mem)) {
+ const Mem& m = o1.as<Mem>();
+ rmRel = &m;
+
+ uint32_t x;
+ if (!checkGpType(o0, opData.rType, &x))
+ goto InvalidInstruction;
+
+ if (!checkGpId(o0, opData.rHiId))
+ goto InvalidPhysId;
+
+ if (m.hasBaseReg() && !m.hasIndex()) {
+ if (m.isOffset64Bit())
+ goto InvalidDisplacement;
+
+ int32_t offset32 = m.offsetLo32() >> opData.immShift;
+ if (Support::shl(offset32, opData.immShift) != m.offsetLo32())
+ goto InvalidDisplacement;
+
+ if (!Support::isInt10(offset32))
+ goto InvalidDisplacement;
+
+ if (m.isPostIndex())
+ goto InvalidAddress;
+
+ // Offset has 10 bits, sign is stored in the 10th bit.
+ offset32 &= 0x3FF;
+
+ opcode.reset(opData.opcode());
+ opcode.xorImm(m.isPreIndex(), 11);
+ opcode.xorImm(x, opData.xOffset);
+ opcode.addImm(offset32 >> 9, 22);
+ opcode.addImm(offset32, 12);
+ opcode.addReg(o0, 0);
+ goto EmitOp_MemBase_Rn5;
+ }
+
+ goto InvalidAddress;
+ }
+
+ break;
+ }
+
+ case InstDB::kEncodingBaseAtomicOp: {
+ const InstDB::EncodingData::BaseAtomicOp& opData = InstDB::EncodingData::baseAtomicOp[encodingIndex];
+
+ if (isign4 == ENC_OPS3(Reg, Reg, Mem)) {
+ const Mem& m = o2.as<Mem>();
+ uint32_t x;
+
+ if (!checkGpType(o0, opData.rType, &x) || !checkSignature(o0, o1))
+ goto InvalidInstruction;
+
+ if (!checkGpId(o0, o1, kZR))
+ goto InvalidInstruction;
+
+ opcode.reset(opData.opcode());
+ opcode.addImm(x, opData.xOffset);
+ opcode.addReg(o0, 16);
+ opcode.addReg(o1, 0);
+
+ rmRel = &m;
+ goto EmitOp_MemBaseNoImm_Rn5;
+ }
+
+ break;
+ }
+
+ case InstDB::kEncodingBaseAtomicSt: {
+ const InstDB::EncodingData::BaseAtomicSt& opData = InstDB::EncodingData::baseAtomicSt[encodingIndex];
+
+ if (isign4 == ENC_OPS2(Reg, Mem)) {
+ const Mem& m = o1.as<Mem>();
+ uint32_t x;
+
+ if (!checkGpType(o0, opData.rType, &x))
+ goto InvalidInstruction;
+
+ if (!checkGpId(o0, kZR))
+ goto InvalidPhysId;
+
+ opcode.reset(opData.opcode());
+ opcode.addImm(x, opData.xOffset);
+ opcode.addReg(o0, 16);
+ opcode.addReg(Gp::kIdZr, 0);
+
+ rmRel = &m;
+ goto EmitOp_MemBaseNoImm_Rn5;
+ }
+
+ break;
+ }
+
+ case InstDB::kEncodingBaseAtomicCasp: {
+ const InstDB::EncodingData::BaseAtomicCasp& opData = InstDB::EncodingData::baseAtomicCasp[encodingIndex];
+ const Operand_& o4 = opExt[EmitterUtils::kOp4];
+
+ if (isign4 == ENC_OPS4(Reg, Reg, Reg, Reg) && o4.isMem()) {
+ const Mem& m = o4.as<Mem>();
+ uint32_t x;
+
+ if (!checkGpType(o0, opData.rType, &x))
+ goto InvalidInstruction;
+
+ if (!checkSignature(o0, o1, o2, o3))
+ goto InvalidInstruction;
+
+ if (!checkEven(o0, o2) || !checkGpId(o0, o2, kZR))
+ goto InvalidPhysId;
+
+ if (!checkConsecutive(o0, o1) || !checkConsecutive(o2, o3))
+ goto InvalidPhysId;
+
+ opcode.reset(opData.opcode());
+ opcode.addImm(x, opData.xOffset);
+ opcode.addReg(o0, 16);
+ opcode.addReg(o2, 0);
+
+ rmRel = &m;
+ goto EmitOp_MemBaseNoImm_Rn5;
+ }
+
+ break;
+ }
+
+ // ------------------------------------------------------------------------
+ // [FSimd - Instructions]
+ // ------------------------------------------------------------------------
+
+ case InstDB::kEncodingFSimdSV: {
+ const InstDB::EncodingData::FSimdSV& opData = InstDB::EncodingData::fSimdSV[encodingIndex];
+
+ if (isign4 == ENC_OPS2(Reg, Reg)) {
+ uint32_t q = diff(o1.as<Reg>().type(), RegType::kARM_VecD);
+ if (q > 1)
+ goto InvalidInstruction;
+
+ if (o0.as<Vec>().hasElementType())
+ goto InvalidInstruction;
+
+ // This operation is only defined for:
+ // hD, vS.{4|8}h (16-bit)
+ // sD, vS.4s (32-bit)
+ uint32_t sz = diff(o0.as<Reg>().type(), RegType::kARM_VecH);
+ uint32_t elementSz = o1.as<Vec>().elementType() - Vec::kElementTypeH;
+
+ // Size greater than 1 means 64-bit elements, not supported.
+ if ((sz | elementSz) > 1 || sz != elementSz)
+ goto InvalidInstruction;
+
+ // Size 1 (32-bit float) requires at least 4 elements.
+ if (sz && !q)
+ goto InvalidInstruction;
+
+ // Bit flipping according to sz.
+ static const uint32_t szBits[] = { B(29), 0 };
+
+ opcode.reset(opData.opcode << 10);
+ opcode ^= szBits[sz];
+ opcode.addImm(q, 30);
+ goto EmitOp_Rd0_Rn5;
+ }
+
+ break;
+ }
+
+ case InstDB::kEncodingFSimdVV: {
+ const InstDB::EncodingData::FSimdVV& opData = InstDB::EncodingData::fSimdVV[encodingIndex];
+
+ if (isign4 == ENC_OPS2(Reg, Reg)) {
+ if (!matchSignature(o0, o1, instFlags))
+ goto InvalidInstruction;
+
+ if (!pickFpOpcode(o0.as<Vec>(), opData.scalarOp(), opData.scalarHf(), opData.vectorOp(), opData.vectorHf(), &opcode))
+ goto InvalidInstruction;
+
+ goto EmitOp_Rd0_Rn5;
+ }
+
+ break;
+ }
+
+ case InstDB::kEncodingFSimdVVV: {
+ const InstDB::EncodingData::FSimdVVV& opData = InstDB::EncodingData::fSimdVVV[encodingIndex];
+
+ if (isign4 == ENC_OPS3(Reg, Reg, Reg)) {
+ if (!matchSignature(o0, o1, o2, instFlags))
+ goto InvalidInstruction;
+
+ if (!pickFpOpcode(o0.as<Vec>(), opData.scalarOp(), opData.scalarHf(), opData.vectorOp(), opData.vectorHf(), &opcode))
+ goto InvalidInstruction;
+
+ goto EmitOp_Rd0_Rn5_Rm16;
+ }
+
+ break;
+ }
+
+ case InstDB::kEncodingFSimdVVVe: {
+ const InstDB::EncodingData::FSimdVVVe& opData = InstDB::EncodingData::fSimdVVVe[encodingIndex];
+
+ if (isign4 == ENC_OPS3(Reg, Reg, Reg)) {
+ if (!o2.as<Vec>().hasElementIndex()) {
+ if (!matchSignature(o0, o1, o2, instFlags))
+ goto InvalidInstruction;
+
+ if (!pickFpOpcode(o0.as<Vec>(), opData.scalarOp(), opData.scalarHf(), opData.vectorOp(), opData.vectorHf(), &opcode))
+ goto InvalidInstruction;
+
+ goto EmitOp_Rd0_Rn5_Rm16;
+ }
+ else {
+ if (!matchSignature(o0, o1, instFlags))
+ goto InvalidInstruction;
+
+ uint32_t q = o1.as<Reg>().isVecQ();
+ uint32_t sz;
+
+ if (!pickFpOpcode(o0.as<Vec>(), opData.elementScalarOp(), InstDB::kHF_D, opData.elementVectorOp(), InstDB::kHF_D, &opcode, &sz))
+ goto InvalidInstruction;
+
+ if (sz == 0 && o2.as<Reg>().id() > 15)
+ goto InvalidPhysId;
+
+ uint32_t elementIndex = o2.as<Vec>().elementIndex();
+ if (elementIndex > (7u >> sz))
+ goto InvalidElementIndex;
+
+ uint32_t hlm = elementIndex << sz;
+ opcode.addImm(q, 30);
+ opcode.addImm(hlm & 3u, 20);
+ opcode.addImm(hlm >> 2, 11);
+ goto EmitOp_Rd0_Rn5_Rm16;
+ }
+ }
+
+ break;
+ }
+
+ case InstDB::kEncodingFSimdVVVV: {
+ const InstDB::EncodingData::FSimdVVVV& opData = InstDB::EncodingData::fSimdVVVV[encodingIndex];
+
+ if (isign4 == ENC_OPS4(Reg, Reg, Reg, Reg)) {
+ if (!matchSignature(o0, o1, o2, o3, instFlags))
+ goto InvalidInstruction;
+
+ if (!pickFpOpcode(o0.as<Vec>(), opData.scalarOp(), opData.scalarHf(), opData.vectorOp(), opData.vectorHf(), &opcode))
+ goto InvalidInstruction;
+
+ goto EmitOp_Rd0_Rn5_Rm16_Ra10;
+ }
+
+ break;
+ }
+
+ case InstDB::kEncodingSimdFcadd: {
+ const InstDB::EncodingData::SimdFcadd& opData = InstDB::EncodingData::simdFcadd[encodingIndex];
+
+ if (isign4 == ENC_OPS4(Reg, Reg, Reg, Imm)) {
+ if (!checkSignature(o0, o1, o2) || o0.as<Vec>().hasElementIndex())
+ goto InvalidInstruction;
+
+ uint32_t q = diff(o0.as<Reg>().type(), RegType::kARM_VecD);
+ if (q > 1)
+ goto InvalidInstruction;
+
+ uint32_t sz = o0.as<Vec>().elementType() - Vec::kElementTypeB;
+ if (sz == 0 || sz > 3)
+ goto InvalidInstruction;
+
+ // 0 <- 90deg.
+ // 1 <- 270deg.
+ uint32_t rot = 0;
+ if (o3.as<Imm>().value() == 270)
+ rot = 1;
+ else if (o3.as<Imm>().value() != 90)
+ goto InvalidImmediate;
+
+ opcode.reset(opData.opcode());
+ opcode.addImm(q, 30);
+ opcode.addImm(sz, 22);
+ opcode.addImm(rot, 12);
+ goto EmitOp_Rd0_Rn5_Rm16;
+ }
+
+ break;
+ }
+
+ case InstDB::kEncodingSimdFccmpFccmpe: {
+ const InstDB::EncodingData::SimdFccmpFccmpe& opData = InstDB::EncodingData::simdFccmpFccmpe[encodingIndex];
+
+ if (isign4 == ENC_OPS4(Reg, Reg, Imm, Imm)) {
+ uint32_t sz = diff(o0.as<Reg>().type(), RegType::kARM_VecH);
+ if (sz > 2)
+ goto InvalidInstruction;
+
+ if (!checkSignature(o0, o1) || o0.as<Vec>().hasElementType())
+ goto InvalidInstruction;
+
+ uint64_t nzcv = o2.as<Imm>().valueAs<uint64_t>();
+ uint64_t cond = o3.as<Imm>().valueAs<uint64_t>();
+
+ if ((nzcv | cond) > 0xFu)
+ goto InvalidImmediate;
+
+ uint32_t type = (sz - 1) & 0x3u;
+
+ opcode.reset(opData.opcode());
+ opcode.addImm(type, 22);
+ opcode.addImm(condCodeToOpcodeCond(uint32_t(cond)), 12);
+ opcode.addImm(nzcv, 0);
+
+ goto EmitOp_Rn5_Rm16;
+ }
+
+ break;
+ }
+
+ case InstDB::kEncodingSimdFcm: {
+ const InstDB::EncodingData::SimdFcm& opData = InstDB::EncodingData::simdFcm[encodingIndex];
+
+ if (isign4 == ENC_OPS3(Reg, Reg, Reg) && opData.hasRegisterOp()) {
+ if (!matchSignature(o0, o1, o2, instFlags))
+ goto InvalidInstruction;
+
+ if (!pickFpOpcode(o0.as<Vec>(), opData.registerScalarOp(), opData.registerScalarHf(), opData.registerVectorOp(), opData.registerVectorHf(), &opcode))
+ goto InvalidInstruction;
+
+ goto EmitOp_Rd0_Rn5_Rm16;
+ }
+
+ if (isign4 == ENC_OPS3(Reg, Reg, Imm) && opData.hasZeroOp()) {
+ if (!checkSignature(o0, o1))
+ goto InvalidInstruction;
+
+ if (o2.as<Imm>().value() != 0 || o2.as<Imm>().predicate() != 0)
+ goto InvalidImmediate;
+
+ if (!pickFpOpcode(o0.as<Vec>(), opData.zeroScalarOp(), InstDB::kHF_B, opData.zeroVectorOp(), InstDB::kHF_B, &opcode))
+ goto InvalidInstruction;
+
+ goto EmitOp_Rd0_Rn5;
+ }
+
+ break;
+ }
+
+ case InstDB::kEncodingSimdFcmla: {
+ const InstDB::EncodingData::SimdFcmla& opData = InstDB::EncodingData::simdFcmla[encodingIndex];
+
+ if (isign4 == ENC_OPS4(Reg, Reg, Reg, Imm)) {
+ if (!checkSignature(o0, o1))
+ goto InvalidInstruction;
+
+ uint32_t q = diff(o0.as<Reg>().type(), RegType::kARM_VecD);
+ if (q > 1)
+ goto InvalidInstruction;
+
+ uint32_t sz = o0.as<Vec>().elementType() - Vec::kElementTypeB;
+ if (sz == 0 || sz > 3)
+ goto InvalidInstruction;
+
+ uint32_t rot = 0;
+ switch (o3.as<Imm>().value()) {
+ case 0 : rot = 0; break;
+ case 90 : rot = 1; break;
+ case 180: rot = 2; break;
+ case 270: rot = 3; break;
+ default:
+ goto InvalidImmediate;
+ }
+
+ if (!o2.as<Vec>().hasElementIndex()) {
+ if (!checkSignature(o1, o2))
+ goto InvalidInstruction;
+
+ opcode.reset(opData.regularOp());
+ opcode.addImm(q, 30);
+ opcode.addImm(sz, 22);
+ opcode.addImm(rot, 11);
+ goto EmitOp_Rd0_Rn5_Rm16;
+ }
+ else {
+ if (o0.as<Vec>().elementType() != o2.as<Vec>().elementType())
+ goto InvalidInstruction;
+
+ // Only allowed vectors are: 4H, 8H, and 4S.
+ if (!(sz == 1 || (q == 1 && sz == 2)))
+ goto InvalidInstruction;
+
+ // Element index ranges:
+ // 4H - ElementIndex[0..1] (index 2..3 is UNDEFINED).
+ // 8H - ElementIndex[0..3].
+ // 4S - ElementIndex[0..1].
+ uint32_t elementIndex = o2.as<Vec>().elementIndex();
+ uint32_t hlFieldShift = sz == 1 ? 0u : 1u;
+ uint32_t maxElementIndex = q == 1 && sz == 1 ? 3u : 1u;
+
+ if (elementIndex > maxElementIndex)
+ goto InvalidElementIndex;
+
+ uint32_t hl = elementIndex << hlFieldShift;
+
+ opcode.reset(opData.elementOp());
+ opcode.addImm(q, 30);
+ opcode.addImm(sz, 22);
+ opcode.addImm(hl & 1u, 21); // L field.
+ opcode.addImm(hl >> 1, 11); // H field.
+ opcode.addImm(rot, 13);
+ goto EmitOp_Rd0_Rn5_Rm16;
+ }
+ }
+
+ break;
+ }
+
+ case InstDB::kEncodingSimdFcmpFcmpe: {
+ const InstDB::EncodingData::SimdFcmpFcmpe& opData = InstDB::EncodingData::simdFcmpFcmpe[encodingIndex];
+
+ uint32_t sz = diff(o0.as<Reg>().type(), RegType::kARM_VecH);
+ uint32_t type = (sz - 1) & 0x3u;
+
+ if (sz > 2)
+ goto InvalidInstruction;
+
+ if (o0.as<Vec>().hasElementType())
+ goto InvalidInstruction;
+
+ opcode.reset(opData.opcode());
+ opcode.addImm(type, 22);
+
+ if (isign4 == ENC_OPS2(Reg, Reg)) {
+ if (!checkSignature(o0, o1))
+ goto InvalidInstruction;
+
+ goto EmitOp_Rn5_Rm16;
+ }
+
+ if (isign4 == ENC_OPS2(Reg, Imm)) {
+ if (o1.as<Imm>().value() != 0 || o1.as<Imm>().predicate() != 0)
+ goto InvalidInstruction;
+
+ opcode |= B(3);
+ goto EmitOp_Rn5;
+ }
+
+ break;
+ }
+
+ case InstDB::kEncodingSimdFcsel: {
+ if (isign4 == ENC_OPS4(Reg, Reg, Reg, Imm)) {
+ if (!checkSignature(o0, o1, o2))
+ goto InvalidInstruction;
+
+ uint32_t sz = diff(o0.as<Reg>().type(), RegType::kARM_VecH);
+ uint32_t type = (sz - 1) & 0x3u;
+
+ if (sz > 2 || o0.as<Vec>().hasElementType())
+ goto InvalidInstruction;
+
+ uint64_t cond = o3.as<Imm>().valueAs<uint64_t>();
+ if (cond > 0xFu)
+ goto InvalidImmediate;
+
+ opcode.reset(0b00011110001000000000110000000000);
+ opcode.addImm(type, 22);
+ opcode.addImm(condCodeToOpcodeCond(uint32_t(cond)), 12);
+ goto EmitOp_Rd0_Rn5_Rm16;
+ }
+
+ break;
+ }
+
+ case InstDB::kEncodingSimdFcvt: {
+ if (isign4 == ENC_OPS2(Reg, Reg)) {
+ uint32_t dstSz = diff(o0.as<Reg>().type(), RegType::kARM_VecH);
+ uint32_t srcSz = diff(o1.as<Reg>().type(), RegType::kARM_VecH);
+
+ if ((dstSz | srcSz) > 3)
+ goto InvalidInstruction;
+
+ if (o0.as<Vec>().hasElementType() || o1.as<Vec>().hasElementType())
+ goto InvalidInstruction;
+
+ // Table that provides 'type' and 'opc' according to the dst/src combination.
+ static const uint8_t table[] = {
+ 0xFFu, // H <- H (Invalid).
+ 0x03u, // H <- S (type=00 opc=11).
+ 0x13u, // H <- D (type=01 opc=11).
+ 0xFFu, // H <- Q (Invalid).
+ 0x30u, // S <- H (type=11 opc=00).
+ 0xFFu, // S <- S (Invalid).
+ 0x10u, // S <- D (type=01 opc=00).
+ 0xFFu, // S <- Q (Invalid).
+ 0x31u, // D <- H (type=11 opc=01).
+ 0x01u, // D <- S (type=00 opc=01).
+ 0xFFu, // D <- D (Invalid).
+ 0xFFu, // D <- Q (Invalid).
+ 0xFFu, // Q <- H (Invalid).
+ 0xFFu, // Q <- S (Invalid).
+ 0xFFu, // Q <- D (Invalid).
+ 0xFFu // Q <- Q (Invalid).
+ };
+
+ uint32_t typeOpc = table[(dstSz << 2) | srcSz];
+ opcode.reset(0b0001111000100010010000 << 10);
+ opcode.addImm(typeOpc >> 4, 22);
+ opcode.addImm(typeOpc & 15, 15);
+ goto EmitOp_Rd0_Rn5;
+ }
+
+ break;
+ }
+
+ case InstDB::kEncodingSimdFcvtLN: {
+ const InstDB::EncodingData::SimdFcvtLN& opData = InstDB::EncodingData::simdFcvtLN[encodingIndex];
+
+ if (isign4 == ENC_OPS2(Reg, Reg)) {
+ // Scalar form - only FCVTXN.
+ if (o0.as<Vec>().isVecS() && o1.as<Vec>().isVecD()) {
+ if (!opData.hasScalar())
+ goto InvalidInstruction;
+
+ if (o0.as<Vec>().hasElementType() || o1.as<Vec>().hasElementType())
+ goto InvalidInstruction;
+
+ opcode.reset(opData.scalarOp());
+ opcode |= B(22); // sz bit must be 1, the only supported combination of FCVTXN.
+ goto EmitOp_Rd0_Rn5;
+ }
+
+ opcode.reset(opData.vectorOp());
+
+ const Vec& rL = (instFlags & InstDB::kInstFlagLong) ? o0.as<Vec>() : o1.as<Vec>();
+ const Vec& rN = (instFlags & InstDB::kInstFlagLong) ? o1.as<Vec>() : o0.as<Vec>();
+
+ uint32_t q = diff(rN.type(), RegType::kARM_VecD);
+ if (uint32_t(opcode.hasQ()) != q)
+ goto InvalidInstruction;
+
+ if (rL.isVecS4() && rN.elementType() == Vec::kElementTypeH && !opData.isCvtxn()) {
+ goto EmitOp_Rd0_Rn5;
+ }
+
+ if (rL.isVecD2() && rN.elementType() == Vec::kElementTypeS) {
+ opcode |= B(22);
+ goto EmitOp_Rd0_Rn5;
+ }
+ }
+
+ break;
+ }
+
+ case InstDB::kEncodingSimdFcvtSV: {
+ const InstDB::EncodingData::SimdFcvtSV& opData = InstDB::EncodingData::simdFcvtSV[encodingIndex];
+
+ // So we can support both IntToFloat and FloatToInt conversions.
+ const Operand_& oGp = opData.isFloatToInt() ? o0 : o1;
+ const Operand_& oVec = opData.isFloatToInt() ? o1 : o0;
+
+ if (isign4 == ENC_OPS2(Reg, Reg)) {
+ if (oGp.as<Reg>().isGp() && oVec.as<Reg>().isVec()) {
+ uint32_t x = oGp.as<Reg>().isGpX();
+ uint32_t type = diff(oVec.as<Reg>().type(), RegType::kARM_VecH);
+
+ if (type > 2u)
+ goto InvalidInstruction;
+
+ type = (type - 1u) & 0x3;
+ opcode.reset(opData.generalOp());
+ opcode.addImm(type, 22);
+ opcode.addImm(x, 31);
+ goto EmitOp_Rd0_Rn5;
+ }
+
+ if (o0.as<Reg>().isVec() && o1.as<Reg>().isVec()) {
+ if (!checkSignature(o0, o1))
+ goto InvalidInstruction;
+
+ if (!pickFpOpcode(o0.as<Vec>(), opData.scalarIntOp(), InstDB::kHF_B, opData.vectorIntOp(), InstDB::kHF_B, &opcode))
+ goto InvalidInstruction;
+
+ goto EmitOp_Rd0_Rn5;
+ }
+ }
+
+ if (isign4 == ENC_OPS3(Reg, Reg, Imm) && opData.isFixedPoint()) {
+ if (o2.as<Imm>().valueAs<uint64_t>() >= 64)
+ goto InvalidInstruction;
+
+ uint32_t scale = o2.as<Imm>().valueAs<uint32_t>();
+ if (scale == 0)
+ goto InvalidInstruction;
+
+ if (oGp.as<Reg>().isGp() && oVec.as<Reg>().isVec()) {
+ uint32_t x = oGp.as<Reg>().isGpX();
+ uint32_t type = diff(oVec.as<Reg>().type(), RegType::kARM_VecH);
+
+ uint32_t scaleLimit = 32u << x;
+ if (scale > scaleLimit)
+ goto InvalidInstruction;
+
+ type = (type - 1u) & 0x3;
+ opcode.reset(opData.generalOp() ^ B(21));
+ opcode.addImm(type, 22);
+ opcode.addImm(x, 31);
+ opcode.addImm(64u - scale, 10);
+ goto EmitOp_Rd0_Rn5;
+ }
+
+ if (o0.as<Reg>().isVec() && o1.as<Reg>().isVec()) {
+ if (!checkSignature(o0, o1))
+ goto InvalidInstruction;
+
+ uint32_t sz;
+ if (!pickFpOpcode(o0.as<Vec>(), opData.scalarFpOp(), InstDB::kHF_0, opData.vectorFpOp(), InstDB::kHF_0, &opcode, &sz))
+ goto InvalidInstruction;
+
+ uint32_t scaleLimit = 16u << sz;
+ if (scale > scaleLimit)
+ goto InvalidInstruction;
+
+ uint32_t imm = Support::neg(scale) & Support::lsbMask<uint32_t>(sz + 4 + 1);
+ opcode.addImm(imm, 16);
+ goto EmitOp_Rd0_Rn5;
+ }
+ }
+
+ break;
+ }
+
+ case InstDB::kEncodingSimdFmlal: {
+ const InstDB::EncodingData::SimdFmlal& opData = InstDB::EncodingData::simdFmlal[encodingIndex];
+
+ if (isign4 == ENC_OPS3(Reg, Reg, Reg)) {
+ uint32_t q = diff(o0.as<Reg>().type(), RegType::kARM_VecD);
+ uint32_t qIsOptional = opData.optionalQ();
+
+ if (qIsOptional) {
+ // This instruction works with either 64-bit or 128-bit registers,
+ // encoded by Q bit.
+ if (q > 1)
+ goto InvalidInstruction;
+ }
+ else {
+ // This instruction requires 128-bit vector registers.
+ if (q != 1)
+ goto InvalidInstruction;
+
+ // The instruction is ehtier B (bottom) or T (top), which is part of
+ // the opcode, which uses Q bit, so we have to clear it explicitly.
+ q = 0;
+ }
+
+ if (uint32_t(o0.as<Reg>().type()) != uint32_t(o1.as<Reg>().type()) + qIsOptional ||
+ o0.as<Vec>().elementType() != opData.tA ||
+ o1.as<Vec>().elementType() != opData.tB)
+ goto InvalidInstruction;
+
+ if (!o2.as<Vec>().hasElementIndex()) {
+ if (!checkSignature(o1, o2))
+ goto InvalidInstruction;
+
+ opcode.reset(opData.vectorOp());
+ opcode.addImm(q, 30);
+ goto EmitOp_Rd0_Rn5_Rm16;
+ }
+ else {
+ if (o2.as<Vec>().elementType() != opData.tElement)
+ goto InvalidInstruction;
+
+ if (o2.as<Reg>().id() > 15)
+ goto InvalidPhysId;
+
+ uint32_t elementIndex = o2.as<Vec>().elementIndex();
+ if (elementIndex > 7u)
+ goto InvalidElementIndex;
+
+ opcode.reset(opData.elementOp());
+ opcode.addImm(q, 30);
+ opcode.addImm(elementIndex & 3u, 20);
+ opcode.addImm(elementIndex >> 2, 11);
+ goto EmitOp_Rd0_Rn5_Rm16;
+ }
+ }
+
+ break;
+ }
+
+ case InstDB::kEncodingSimdFmov: {
+ if (isign4 == ENC_OPS2(Reg, Reg)) {
+ // FMOV Gp <-> Vec opcode:
+ opcode.reset(0b00011110001001100000000000000000);
+
+ if (o0.as<Reg>().isGp() && o1.as<Reg>().isVec()) {
+ // FMOV Wd, Hn (sf=0 type=11 rmode=00 op=110)
+ // FMOV Xd, Hn (sf=1 type=11 rmode=00 op=110)
+ // FMOV Wd, Sn (sf=0 type=00 rmode=00 op=110)
+ // FMOV Xd, Dn (sf=1 type=11 rmode=00 op=110)
+ // FMOV Xd, Vn.d[1] (sf=1 type=10 rmode=01 op=110)
+ uint32_t x = o0.as<Reg>().isGpX();
+ uint32_t sz = diff(o1.as<Reg>().type(), RegType::kARM_VecH);
+
+ uint32_t type = (sz - 1) & 0x3u;
+ uint32_t rModeOp = 0b00110;
+
+ if (o1.as<Vec>().hasElementIndex()) {
+ // Special case.
+ if (!x || !o1.as<Vec>().isVecD2() || o1.as<Vec>().elementIndex() != 1)
+ goto InvalidInstruction;
+ type = 0b10;
+ rModeOp = 0b01110;
+ }
+ else {
+ // Must be scalar.
+ if (sz > 2)
+ goto InvalidInstruction;
+
+ if (o1.as<Vec>().hasElementType())
+ goto InvalidInstruction;
+
+ if (o1.as<Vec>().isVecS() && x)
+ goto InvalidInstruction;
+
+ if (o1.as<Vec>().isVecD() && !x)
+ goto InvalidInstruction;
+ }
+
+ opcode.addImm(x, 31);
+ opcode.addImm(type, 22);
+ opcode.addImm(rModeOp, 16);
+ goto EmitOp_Rd0_Rn5;
+ }
+
+ if (o0.as<Reg>().isVec() && o1.as<Reg>().isGp()) {
+ // FMOV Hd, Wn (sf=0 type=11 rmode=00 op=111)
+ // FMOV Hd, Xn (sf=1 type=11 rmode=00 op=111)
+ // FMOV Sd, Wn (sf=0 type=00 rmode=00 op=111)
+ // FMOV Dd, Xn (sf=1 type=11 rmode=00 op=111)
+ // FMOV Vd.d[1], Xn (sf=1 type=10 rmode=01 op=111)
+ uint32_t x = o1.as<Reg>().isGpX();
+ uint32_t sz = diff(o0.as<Reg>().type(), RegType::kARM_VecH);
+
+ uint32_t type = (sz - 1) & 0x3u;
+ uint32_t rModeOp = 0b00111;
+
+ if (o0.as<Vec>().hasElementIndex()) {
+ // Special case.
+ if (!x || !o0.as<Vec>().isVecD2() || o0.as<Vec>().elementIndex() != 1)
+ goto InvalidInstruction;
+ type = 0b10;
+ rModeOp = 0b01111;
+ }
+ else {
+ // Must be scalar.
+ if (sz > 2)
+ goto InvalidInstruction;
+
+ if (o0.as<Vec>().hasElementType())
+ goto InvalidInstruction;
+
+ if (o0.as<Vec>().isVecS() && x)
+ goto InvalidInstruction;
+
+ if (o0.as<Vec>().isVecD() && !x)
+ goto InvalidInstruction;
+ }
+
+ opcode.addImm(x, 31);
+ opcode.addImm(type, 22);
+ opcode.addImm(rModeOp, 16);
+ goto EmitOp_Rd0_Rn5;
+ }
+
+ if (checkSignature(o0, o1)) {
+ uint32_t sz = diff(o0.as<Reg>().type(), RegType::kARM_VecH);
+ if (sz > 2)
+ goto InvalidInstruction;
+
+ if (o0.as<Vec>().hasElementType())
+ goto InvalidInstruction;
+
+ uint32_t type = (sz - 1) & 0x3;
+ opcode.reset(0b00011110001000000100000000000000);
+ opcode.addImm(type, 22);
+ goto EmitOp_Rd0_Rn5;
+ }
+ }
+
+ if (isign4 == ENC_OPS2(Reg, Imm)) {
+ if (o0.as<Reg>().isVec()) {
+ double fpValue;
+ if (o1.as<Imm>().isDouble())
+ fpValue = o1.as<Imm>().valueAs<double>();
+ else if (o1.as<Imm>().isInt32())
+ fpValue = o1.as<Imm>().valueAs<int32_t>();
+ else
+ goto InvalidImmediate;
+
+ if (!Utils::isFP64Imm8(fpValue))
+ goto InvalidImmediate;
+
+ uint32_t imm8 = Utils::encodeFP64ToImm8(fpValue);
+ if (!o0.as<Vec>().hasElementType()) {
+ // FMOV (scalar, immediate).
+ uint32_t sz = diff(o0.as<Reg>().type(), RegType::kARM_VecH);
+ uint32_t type = (sz - 1u) & 0x3u;
+
+ if (sz > 2)
+ goto InvalidInstruction;
+
+ opcode.reset(0b00011110001000000001000000000000);
+ opcode.addImm(type, 22);
+ opcode.addImm(imm8, 13);
+ goto EmitOp_Rd0;
+ }
+ else {
+ uint32_t q = diff(o0.as<Vec>().type(), RegType::kARM_VecD);
+ uint32_t sz = o0.as<Vec>().elementType() - Vec::kElementTypeH;
+
+ if (q > 1 || sz > 2)
+ goto InvalidInstruction;
+
+ static const uint32_t szBits[3] = { B(11), B(0), B(29) };
+ opcode.reset(0b00001111000000001111010000000000);
+ opcode ^= szBits[sz];
+ opcode.addImm(q, 30);
+ opcode.addImm(imm8 >> 5, 16);
+ opcode.addImm(imm8 & 31, 5);
+ goto EmitOp_Rd0;
+ }
+ }
+ }
+
+ break;
+ }
+
+ case InstDB::kEncodingFSimdPair: {
+ const InstDB::EncodingData::FSimdPair& opData = InstDB::EncodingData::fSimdPair[encodingIndex];
+
+ if (isign4 == ENC_OPS2(Reg, Reg)) {
+ // This operation is only defined for:
+ // hD, vS.2h (16-bit)
+ // sD, vS.2s (32-bit)
+ // dD, vS.2d (64-bit)
+ uint32_t sz = diff(o0.as<Reg>().type(), RegType::kARM_VecH);
+ if (sz > 2)
+ goto InvalidInstruction;
+
+ static const uint32_t szSignatures[3] = {
+ VecS::kSignature | (Vec::kSignatureElementH),
+ VecD::kSignature | (Vec::kSignatureElementS),
+ VecV::kSignature | (Vec::kSignatureElementD)
+ };
+
+ if (o1.signature() != szSignatures[sz])
+ goto InvalidInstruction;
+
+ static const uint32_t szBits[] = { B(29), 0, B(22) };
+ opcode.reset(opData.scalarOp());
+ opcode ^= szBits[sz];
+ goto EmitOp_Rd0_Rn5;
+ }
+
+ if (isign4 == ENC_OPS3(Reg, Reg, Reg)) {
+ if (!checkSignature(o0, o1, o2))
+ goto InvalidInstruction;
+
+ uint32_t q = diff(o0.as<Reg>().type(), RegType::kARM_VecD);
+ if (q > 1)
+ goto InvalidInstruction;
+
+ uint32_t sz = o0.as<Vec>().elementType() - Vec::kElementTypeH;
+ if (sz > 2)
+ goto InvalidInstruction;
+
+ static const uint32_t szBits[3] = { B(22) | B(21) | B(15) | B(14), 0, B(22) };
+ opcode.reset(opData.vectorOp());
+ opcode ^= szBits[sz];
+ opcode.addImm(q, 30);
+ goto EmitOp_Rd0_Rn5_Rm16;
+ }
+
+ break;
+ }
+
+ // ------------------------------------------------------------------------
+ // [ISimd - Instructions]
+ // ------------------------------------------------------------------------
+
+ case InstDB::kEncodingISimdSV: {
+ const InstDB::EncodingData::ISimdSV& opData = InstDB::EncodingData::iSimdSV[encodingIndex];
+
+ if (isign4 == ENC_OPS2(Reg, Reg)) {
+ // The first destination operand is scalar, which matches element-type of source vectors.
+ uint32_t L = (instFlags & InstDB::kInstFlagLong) != 0;
+ if (diff(o0.as<Vec>().type(), RegType::kARM_VecB) != o1.as<Vec>().elementType() - Vec::kElementTypeB + L)
+ goto InvalidInstruction;
+
+ SizeOp sizeOp = armElementTypeToSizeOp(opData.vecOpType, o1.as<Reg>().type(), o1.as<Vec>().elementType());
+ if (!sizeOp.isValid())
+ goto InvalidInstruction;
+
+ opcode.reset(opData.opcode());
+ opcode.addImm(sizeOp.q(), 30);
+ opcode.addImm(sizeOp.size(), 22);
+ goto EmitOp_Rd0_Rn5;
+ }
+
+ break;
+ }
+
+ case InstDB::kEncodingISimdVV: {
+ const InstDB::EncodingData::ISimdVV& opData = InstDB::EncodingData::iSimdVV[encodingIndex];
+
+ if (isign4 == ENC_OPS2(Reg, Reg)) {
+ const Operand_& sop = significantSimdOp(o0, o1, instFlags);
+ if (!matchSignature(o0, o1, instFlags))
+ goto InvalidInstruction;
+
+ SizeOp sizeOp = armElementTypeToSizeOp(opData.vecOpType, sop.as<Reg>().type(), sop.as<Vec>().elementType());
+ if (!sizeOp.isValid())
+ goto InvalidInstruction;
+
+ opcode.reset(opData.opcode());
+ opcode.addImm(sizeOp.qs(), 30);
+ opcode.addImm(sizeOp.scalar(), 28);
+ opcode.addImm(sizeOp.size(), 22);
+ goto EmitOp_Rd0_Rn5;
+ }
+
+ break;
+ }
+
+ case InstDB::kEncodingISimdVVx: {
+ const InstDB::EncodingData::ISimdVVx& opData = InstDB::EncodingData::iSimdVVx[encodingIndex];
+
+ if (isign4 == ENC_OPS2(Reg, Reg)) {
+ if (o0.signature() != opData.op0Signature ||
+ o1.signature() != opData.op1Signature)
+ goto InvalidInstruction;
+
+ opcode.reset(opData.opcode());
+ goto EmitOp_Rd0_Rn5;
+ }
+
+ break;
+ }
+
+ case InstDB::kEncodingISimdVVV: {
+ const InstDB::EncodingData::ISimdVVV& opData = InstDB::EncodingData::iSimdVVV[encodingIndex];
+
+ if (isign4 == ENC_OPS3(Reg, Reg, Reg)) {
+ const Operand_& sop = significantSimdOp(o0, o1, instFlags);
+ if (!matchSignature(o0, o1, o2, instFlags))
+ goto InvalidInstruction;
+
+ SizeOp sizeOp = armElementTypeToSizeOp(opData.vecOpType, sop.as<Reg>().type(), sop.as<Vec>().elementType());
+ if (!sizeOp.isValid())
+ goto InvalidInstruction;
+
+ opcode.reset(opData.opcode());
+ opcode.addImm(sizeOp.qs(), 30);
+ opcode.addImm(sizeOp.scalar(), 28);
+ opcode.addImm(sizeOp.size(), 22);
+ goto EmitOp_Rd0_Rn5_Rm16;
+ }
+
+ break;
+ }
+
+ case InstDB::kEncodingISimdVVVx: {
+ const InstDB::EncodingData::ISimdVVVx& opData = InstDB::EncodingData::iSimdVVVx[encodingIndex];
+
+ if (isign4 == ENC_OPS3(Reg, Reg, Reg)) {
+ if (o0.signature() != opData.op0Signature ||
+ o1.signature() != opData.op1Signature ||
+ o2.signature() != opData.op2Signature)
+ goto InvalidInstruction;
+
+ opcode.reset(opData.opcode());
+ goto EmitOp_Rd0_Rn5_Rm16;
+ }
+
+ break;
+ }
+
+ case InstDB::kEncodingISimdWWV: {
+ // Special case for wide add/sub [s|b][add|sub][w]{2}.
+ const InstDB::EncodingData::ISimdWWV& opData = InstDB::EncodingData::iSimdWWV[encodingIndex];
+
+ if (isign4 == ENC_OPS3(Reg, Reg, Reg)) {
+ SizeOp sizeOp = armElementTypeToSizeOp(opData.vecOpType, o2.as<Reg>().type(), o2.as<Vec>().elementType());
+ if (!sizeOp.isValid())
+ goto InvalidInstruction;
+
+ if (!checkSignature(o0, o1) || !o0.as<Reg>().isVecV() || o0.as<Vec>().elementType() != o2.as<Vec>().elementType() + 1)
+ goto InvalidInstruction;
+
+ opcode.reset(opData.opcode());
+ opcode.addImm(sizeOp.qs(), 30);
+ opcode.addImm(sizeOp.scalar(), 28);
+ opcode.addImm(sizeOp.size(), 22);
+ goto EmitOp_Rd0_Rn5_Rm16;
+ }
+
+ break;
+ }
+
+ case InstDB::kEncodingISimdVVVe: {
+ const InstDB::EncodingData::ISimdVVVe& opData = InstDB::EncodingData::iSimdVVVe[encodingIndex];
+
+ if (isign4 == ENC_OPS3(Reg, Reg, Reg)) {
+ const Operand_& sop = significantSimdOp(o0, o1, instFlags);
+ if (!matchSignature(o0, o1, instFlags))
+ goto InvalidInstruction;
+
+ if (!o2.as<Vec>().hasElementIndex()) {
+ SizeOp sizeOp = armElementTypeToSizeOp(opData.regularVecType, sop.as<Reg>().type(), sop.as<Vec>().elementType());
+ if (!sizeOp.isValid())
+ goto InvalidInstruction;
+
+ if (!checkSignature(o1, o2))
+ goto InvalidInstruction;
+
+ opcode.reset(uint32_t(opData.regularOp) << 10);
+ opcode.addImm(sizeOp.qs(), 30);
+ opcode.addImm(sizeOp.scalar(), 28);
+ opcode.addImm(sizeOp.size(), 22);
+ goto EmitOp_Rd0_Rn5_Rm16;
+ }
+ else {
+ SizeOp sizeOp = armElementTypeToSizeOp(opData.elementVecType, sop.as<Reg>().type(), sop.as<Vec>().elementType());
+ if (!sizeOp.isValid())
+ goto InvalidInstruction;
+
+ uint32_t elementIndex = o2.as<Vec>().elementIndex();
+ LMHImm lmh;
+
+ if (!encodeLMH(sizeOp.size(), elementIndex, &lmh))
+ goto InvalidElementIndex;
+
+ if (o2.as<Reg>().id() > lmh.maxRmId)
+ goto InvalidPhysId;
+
+ opcode.reset(uint32_t(opData.elementOp) << 10);
+ opcode.addImm(sizeOp.q(), 30);
+ opcode.addImm(sizeOp.size(), 22);
+ opcode.addImm(lmh.lm, 20);
+ opcode.addImm(lmh.h, 11);
+ goto EmitOp_Rd0_Rn5_Rm16;
+ }
+ }
+
+ break;
+ }
+
+ case InstDB::kEncodingISimdVVVI: {
+ const InstDB::EncodingData::ISimdVVVI& opData = InstDB::EncodingData::iSimdVVVI[encodingIndex];
+
+ if (isign4 == ENC_OPS4(Reg, Reg, Reg, Imm)) {
+ const Operand_& sop = significantSimdOp(o0, o1, instFlags);
+ if (!matchSignature(o0, o1, o2, instFlags))
+ goto InvalidInstruction;
+
+ SizeOp sizeOp = armElementTypeToSizeOp(opData.vecOpType, sop.as<Reg>().type(), sop.as<Vec>().elementType());
+ if (!sizeOp.isValid())
+ goto InvalidInstruction;
+
+ uint64_t immValue = o3.as<Imm>().valueAs<uint64_t>();
+ uint32_t immSize = opData.immSize;
+
+ if (opData.imm64HasOneBitLess && !sizeOp.q())
+ immSize--;
+
+ uint32_t immMax = 1u << immSize;
+ if (immValue >= immMax)
+ goto InvalidImmediate;
+
+ opcode.reset(opData.opcode());
+ opcode.addImm(sizeOp.qs(), 30);
+ opcode.addImm(sizeOp.scalar(), 28);
+ opcode.addImm(sizeOp.size(), 22);
+ opcode.addImm(immValue, opData.immShift);
+ goto EmitOp_Rd0_Rn5_Rm16;
+ }
+
+ break;
+ }
+
+ case InstDB::kEncodingISimdVVVV: {
+ const InstDB::EncodingData::ISimdVVVV& opData = InstDB::EncodingData::iSimdVVVV[encodingIndex];
+
+ if (isign4 == ENC_OPS4(Reg, Reg, Reg, Reg)) {
+ const Operand_& sop = significantSimdOp(o0, o1, instFlags);
+ if (!matchSignature(o0, o1, o2, o3, instFlags))
+ goto InvalidInstruction;
+
+ SizeOp sizeOp = armElementTypeToSizeOp(opData.vecOpType, sop.as<Reg>().type(), sop.as<Vec>().elementType());
+ if (!sizeOp.isValid())
+ goto InvalidInstruction;
+
+ opcode.reset(uint32_t(opData.opcode) << 10);
+ opcode.addImm(sizeOp.qs(), 30);
+ opcode.addImm(sizeOp.scalar(), 28);
+ opcode.addImm(sizeOp.size(), 22);
+ goto EmitOp_Rd0_Rn5_Rm16_Ra10;
+ }
+
+ break;
+ }
+
+ case InstDB::kEncodingISimdVVVVx: {
+ const InstDB::EncodingData::ISimdVVVVx& opData = InstDB::EncodingData::iSimdVVVVx[encodingIndex];
+
+ if (isign4 == ENC_OPS4(Reg, Reg, Reg, Reg)) {
+ if (o0.signature() != opData.op0Signature ||
+ o1.signature() != opData.op1Signature ||
+ o2.signature() != opData.op2Signature ||
+ o3.signature() != opData.op3Signature)
+ goto InvalidInstruction;
+
+ opcode.reset(uint32_t(opData.opcode) << 10);
+ goto EmitOp_Rd0_Rn5_Rm16_Ra10;
+ }
+
+ break;
+ }
+
+
+ case InstDB::kEncodingISimdPair: {
+ const InstDB::EncodingData::ISimdPair& opData = InstDB::EncodingData::iSimdPair[encodingIndex];
+
+ if (isign4 == ENC_OPS2(Reg, Reg) && opData.opcode2) {
+ if (o0.as<Vec>().isVecD1() && o1.as<Vec>().isVecD2()) {
+ opcode.reset(uint32_t(opData.opcode2) << 10);
+ opcode.addImm(0x3, 22); // size.
+ goto EmitOp_Rd0_Rn5;
+ }
+ }
+
+ if (isign4 == ENC_OPS3(Reg, Reg, Reg)) {
+ if (!matchSignature(o0, o1, o2, instFlags))
+ goto InvalidInstruction;
+
+ SizeOp sizeOp = armElementTypeToSizeOp(opData.opType3, o0.as<Reg>().type(), o0.as<Vec>().elementType());
+ if (!sizeOp.isValid())
+ goto InvalidInstruction;
+
+ opcode.reset(uint32_t(opData.opcode3) << 10);
+ opcode.addImm(sizeOp.qs(), 30);
+ opcode.addImm(sizeOp.scalar(), 28);
+ opcode.addImm(sizeOp.size(), 22);
+ goto EmitOp_Rd0_Rn5_Rm16;
+ }
+
+ break;
+ }
+
+ case InstDB::kEncodingSimdBicOrr: {
+ const InstDB::EncodingData::SimdBicOrr& opData = InstDB::EncodingData::simdBicOrr[encodingIndex];
+
+ if (isign4 == ENC_OPS3(Reg, Reg, Reg)) {
+ if (!matchSignature(o0, o1, o2, instFlags))
+ goto InvalidInstruction;
+
+ SizeOp sizeOp = armElementTypeToSizeOp(InstDB::kVO_V_B, o0.as<Reg>().type(), o0.as<Vec>().elementType());
+ if (!sizeOp.isValid())
+ goto InvalidInstruction;
+
+ opcode.reset(uint32_t(opData.registerOp) << 10);
+ opcode.addImm(sizeOp.q(), 30);
+ goto EmitOp_Rd0_Rn5_Rm16;
+ }
+
+ if (isign4 == ENC_OPS2(Reg, Imm) || isign4 == ENC_OPS3(Reg, Imm, Imm)) {
+ SizeOp sizeOp = armElementTypeToSizeOp(InstDB::kVO_V_HS, o0.as<Reg>().type(), o0.as<Vec>().elementType());
+ if (!sizeOp.isValid())
+ goto InvalidInstruction;
+
+ if (o1.as<Imm>().valueAs<uint64_t>() > 0xFFFFFFFFu)
+ goto InvalidImmediate;
+
+ uint32_t imm = o1.as<Imm>().valueAs<uint32_t>();
+ uint32_t shift = 0;
+ uint32_t maxShift = (8u << sizeOp.size()) - 8u;
+
+ if (o2.isImm()) {
+ if (o2.as<Imm>().predicate() != uint32_t(ShiftOp::kLSL))
+ goto InvalidImmediate;
+
+ if (imm > 0xFFu || o2.as<Imm>().valueAs<uint64_t>() > maxShift)
+ goto InvalidImmediate;
+
+ shift = o2.as<Imm>().valueAs<uint32_t>();
+ if ((shift & 0x7u) != 0u)
+ goto InvalidImmediate;
+ }
+ else if (imm) {
+ shift = Support::ctz(imm) & 0x7u;
+ imm >>= shift;
+
+ if (imm > 0xFFu || shift > maxShift)
+ goto InvalidImmediate;
+ }
+
+ uint32_t cmode = 0x1u | ((shift / 8u) << 1);
+ if (sizeOp.size() == 1)
+ cmode |= B(3);
+
+ // The immediate value is split into ABC and DEFGH parts.
+ uint32_t abc = (imm >> 5) & 0x7u;
+ uint32_t defgh = imm & 0x1Fu;
+
+ opcode.reset(uint32_t(opData.immediateOp) << 10);
+ opcode.addImm(sizeOp.q(), 30);
+ opcode.addImm(abc, 16);
+ opcode.addImm(cmode, 12);
+ opcode.addImm(defgh, 5);
+ goto EmitOp_Rd0;
+ }
+
+ break;
+ }
+
+ case InstDB::kEncodingSimdCmp: {
+ const InstDB::EncodingData::SimdCmp& opData = InstDB::EncodingData::simdCmp[encodingIndex];
+
+ if (isign4 == ENC_OPS3(Reg, Reg, Reg) && opData.regOp) {
+ if (!matchSignature(o0, o1, o2, instFlags))
+ goto InvalidInstruction;
+
+ SizeOp sizeOp = armElementTypeToSizeOp(opData.vecOpType, o0.as<Reg>().type(), o0.as<Vec>().elementType());
+ if (!sizeOp.isValid())
+ goto InvalidInstruction;
+
+ opcode.reset(uint32_t(opData.regOp) << 10);
+ opcode.addImm(sizeOp.qs(), 30);
+ opcode.addImm(sizeOp.scalar(), 28);
+ opcode.addImm(sizeOp.size(), 22);
+ goto EmitOp_Rd0_Rn5_Rm16;
+ }
+
+ if (isign4 == ENC_OPS3(Reg, Reg, Imm) && opData.zeroOp) {
+ if (!matchSignature(o0, o1, instFlags))
+ goto InvalidInstruction;
+
+ if (o2.as<Imm>().value() != 0)
+ goto InvalidImmediate;
+
+ SizeOp sizeOp = armElementTypeToSizeOp(opData.vecOpType, o0.as<Reg>().type(), o0.as<Vec>().elementType());
+ if (!sizeOp.isValid())
+ goto InvalidInstruction;
+
+ opcode.reset(uint32_t(opData.zeroOp) << 10);
+ opcode.addImm(sizeOp.qs(), 30);
+ opcode.addImm(sizeOp.scalar(), 28);
+ opcode.addImm(sizeOp.size(), 22);
+ goto EmitOp_Rd0_Rn5;
+ }
+
+ break;
+ }
+
+ case InstDB::kEncodingSimdDot: {
+ const InstDB::EncodingData::SimdDot& opData = InstDB::EncodingData::simdDot[encodingIndex];
+
+ if (isign4 == ENC_OPS3(Reg, Reg, Reg)) {
+ uint32_t q = diff(o0.as<Reg>().type(), RegType::kARM_VecD);
+ uint32_t size = 2;
+
+ if (q > 1u)
+ goto InvalidInstruction;
+
+ if (!o2.as<Vec>().hasElementIndex()) {
+ if (!opData.vectorOp)
+ goto InvalidInstruction;
+
+ if (o0.as<Reg>().type() != o1.as<Reg>().type() || o1.as<Reg>().type() != o2.as<Reg>().type())
+ goto InvalidInstruction;
+
+ if (o0.as<Vec>().elementType() != opData.tA ||
+ o1.as<Vec>().elementType() != opData.tB ||
+ o2.as<Vec>().elementType() != opData.tB)
+ goto InvalidInstruction;
+
+ opcode.reset(uint32_t(opData.vectorOp) << 10);
+ opcode.addImm(q, 30);
+ goto EmitOp_Rd0_Rn5_Rm16;
+ }
+ else {
+ if (!opData.elementOp)
+ goto InvalidInstruction;
+
+ if (o0.as<Reg>().type() != o1.as<Reg>().type() || !o2.as<Reg>().isVecV())
+ goto InvalidInstruction;
+
+ if (o0.as<Vec>().elementType() != opData.tA ||
+ o1.as<Vec>().elementType() != opData.tB ||
+ o2.as<Vec>().elementType() != opData.tElement)
+ goto InvalidInstruction;
+
+ uint32_t elementIndex = o2.as<Vec>().elementIndex();
+ LMHImm lmh;
+
+ if (!encodeLMH(size, elementIndex, &lmh))
+ goto InvalidElementIndex;
+
+ if (o2.as<Reg>().id() > lmh.maxRmId)
+ goto InvalidPhysId;
+
+ opcode.reset(uint32_t(opData.elementOp) << 10);
+ opcode.addImm(q, 30);
+ opcode.addImm(lmh.lm, 20);
+ opcode.addImm(lmh.h, 11);
+ goto EmitOp_Rd0_Rn5_Rm16;
+ }
+ }
+
+ break;
+ }
+
+ case InstDB::kEncodingSimdDup: SimdDup: {
+ if (isign4 == ENC_OPS2(Reg, Reg)) {
+ // Truth table of valid encodings of `Q:1|ElementType:3`
+ uint32_t kValidEncodings = B(Vec::kElementTypeB + 0) |
+ B(Vec::kElementTypeH + 0) |
+ B(Vec::kElementTypeS + 0) |
+ B(Vec::kElementTypeB + 8) |
+ B(Vec::kElementTypeH + 8) |
+ B(Vec::kElementTypeS + 8) |
+ B(Vec::kElementTypeD + 8) ;
+
+ uint32_t q = diff(o0.as<Reg>().type(), RegType::kARM_VecD);
+
+ if (o1.as<Reg>().isGp()) {
+ // DUP - Vec (scalar|vector) <- GP register.
+ //
+ // NOTE: This is only scalar for `dup d, x` case, otherwise the value
+ // would be duplicated across all vector elements (1, 2, 4, 8, or 16).
+ uint32_t elementType = o0.as<Vec>().elementType();
+ if (q > 1 || !Support::bitTest(kValidEncodings, (q << 3) | elementType))
+ goto InvalidInstruction;
+
+ uint32_t lsbIndex = elementType - 1u;
+ uint32_t imm5 = 1u << lsbIndex;
+
+ opcode.reset(0b0000111000000000000011 << 10);
+ opcode.addImm(q, 30);
+ opcode.addImm(imm5, 16);
+ goto EmitOp_Rd0_Rn5;
+ }
+
+ if (!o1.as<Reg>().isVec() || !o1.as<Vec>().hasElementIndex())
+ goto InvalidInstruction;
+
+ uint32_t dstIndex = o1.as<Vec>().elementIndex();
+ if (!o0.as<Vec>().hasElementType()) {
+ // DUP - Vec (scalar) <- Vec[N].
+ uint32_t lsbIndex = diff(o0.as<Reg>().type(), RegType::kARM_VecB);
+
+ if (lsbIndex != o1.as<Vec>().elementType() - Vec::kElementTypeB || lsbIndex > 3)
+ goto InvalidInstruction;
+
+ uint32_t imm5 = ((dstIndex << 1) | 1u) << lsbIndex;
+ if (imm5 > 31)
+ goto InvalidElementIndex;
+
+ opcode.reset(0b0101111000000000000001 << 10);
+ opcode.addImm(imm5, 16);
+ goto EmitOp_Rd0_Rn5;
+ }
+ else {
+ // DUP - Vec (all) <- Vec[N].
+ uint32_t elementType = o0.as<Vec>().elementType();
+ if (q > 1 || !Support::bitTest(kValidEncodings, (q << 3) | elementType))
+ goto InvalidInstruction;
+
+ uint32_t lsbIndex = elementType - 1u;
+ uint32_t imm5 = ((dstIndex << 1) | 1u) << lsbIndex;
+
+ if (imm5 > 31)
+ goto InvalidElementIndex;
+
+ opcode.reset(0b0000111000000000000001 << 10);
+ opcode.addImm(q, 30);
+ opcode.addImm(imm5, 16);
+ goto EmitOp_Rd0_Rn5;
+ }
+ }
+
+ break;
+ }
+
+ case InstDB::kEncodingSimdIns: SimdIns: {
+ if (isign4 == ENC_OPS2(Reg, Reg) && o0.as<Reg>().isVecV()) {
+ if (!o0.as<Vec>().hasElementIndex())
+ goto InvalidInstruction;
+
+ uint32_t elementType = o0.as<Vec>().elementType();
+ uint32_t dstIndex = o0.as<Vec>().elementIndex();
+ uint32_t lsbIndex = elementType - 1u;
+
+ uint32_t imm5 = ((dstIndex << 1) | 1u) << lsbIndex;
+ if (imm5 > 31)
+ goto InvalidElementIndex;
+
+ if (o1.as<Reg>().isGp()) {
+ // INS - Vec[N] <- GP register.
+ opcode.reset(0b0100111000000000000111 << 10);
+ opcode.addImm(imm5, 16);
+ goto EmitOp_Rd0_Rn5;
+ }
+ else if (o1.as<Reg>().isVecV() && o1.as<Vec>().hasElementIndex()) {
+ // INS - Vec[N] <- Vec[M].
+ if (o0.as<Vec>().elementType() != o1.as<Vec>().elementType())
+ goto InvalidInstruction;
+
+ uint32_t srcIndex = o1.as<Vec>().elementIndex();
+ if (o0.as<Reg>().type() != o1.as<Reg>().type())
+ goto InvalidInstruction;
+
+ uint32_t imm4 = srcIndex << lsbIndex;
+ if (imm4 > 15)
+ goto InvalidElementIndex;
+
+ opcode.reset(0b0110111000000000000001 << 10);
+ opcode.addImm(imm5, 16);
+ opcode.addImm(imm4, 11);
+ goto EmitOp_Rd0_Rn5;
+ }
+ }
+
+ break;
+ }
+
+ case InstDB::kEncodingSimdMov: {
+ if (isign4 == ENC_OPS2(Reg, Reg)) {
+ if (o0.as<Reg>().isVec() && o1.as<Reg>().isVec()) {
+ // INS v.x[index], v.x[index].
+ if (o0.as<Vec>().hasElementIndex() && o1.as<Vec>().hasElementIndex())
+ goto SimdIns;
+
+ // DUP {b|h|s|d}, v.{b|h|s|d}[index].
+ if (o1.as<Vec>().hasElementIndex())
+ goto SimdDup;
+
+ if (!checkSignature(o0, o1))
+ goto InvalidInstruction;
+
+ // ORR Vd, Vn, Vm
+ uint32_t q = diff(o0.as<Reg>().type(), RegType::kARM_VecD);
+ if (q > 1)
+ goto InvalidInstruction;
+
+ opcode.reset(0b0000111010100000000111 << 10);
+ opcode.addImm(q, 30);
+ opcode.addReg(o1, 16); // Vn == Vm.
+ goto EmitOp_Rd0_Rn5;
+ }
+
+ if (o0.as<Reg>().isVec() && o1.as<Reg>().isGp()) {
+ // INS v.x[index], Rn.
+ if (o0.as<Vec>().hasElementIndex())
+ goto SimdIns;
+
+ goto InvalidInstruction;
+ }
+
+ if (o0.as<Reg>().isGp() && o1.as<Reg>().isVec()) {
+ // UMOV Rd, V.{s|d}[index].
+ encodingIndex = 1;
+ goto SimdUmov;
+ }
+ }
+
+ break;
+ }
+
+ case InstDB::kEncodingSimdMoviMvni: {
+ const InstDB::EncodingData::SimdMoviMvni& opData = InstDB::EncodingData::simdMoviMvni[encodingIndex];
+
+ if (isign4 == ENC_OPS2(Reg, Imm) || isign4 == ENC_OPS3(Reg, Imm, Imm)) {
+ SizeOp sizeOp = armElementTypeToSizeOp(InstDB::kVO_V_Any, o0.as<Reg>().type(), o0.as<Vec>().elementType());
+ if (!sizeOp.isValid())
+ goto InvalidInstruction;
+
+ uint64_t imm64 = o1.as<Imm>().valueAs<uint64_t>();
+ uint32_t imm8 = 0;
+ uint32_t cmode = 0;
+ uint32_t inverted = opData.inverted;
+ uint32_t op = 0;
+ uint32_t shift = 0;
+ uint32_t shiftOp = uint32_t(ShiftOp::kLSL);
+
+ if (sizeOp.size() == 3u) {
+ // The second immediate should not be present, however, we accept
+ // an immediate value of zero as some user code may still pass it.
+ if (o2.isImm() && o0.as<Imm>().value() != 0)
+ goto InvalidImmediate;
+
+ if (Utils::isByteMaskImm8(imm64)) {
+ imm8 = encodeImm64ByteMaskToImm8(imm64);
+ }
+ else {
+ // Change from D to S and from 64-bit imm to 32-bit imm if this
+ // is not a byte-mask pattern.
+ if ((imm64 >> 32) == (imm64 & 0xFFFFFFFFu)) {
+ imm64 &= 0xFFFFFFFFu;
+ sizeOp.decrementSize();
+ }
+ else {
+ goto InvalidImmediate;
+ }
+ }
+ }
+
+ if (sizeOp.size() < 3u) {
+ if (imm64 > 0xFFFFFFFFu)
+ goto InvalidImmediate;
+ imm8 = uint32_t(imm64);
+
+ if (sizeOp.size() == 2) {
+ if ((imm8 >> 16) == (imm8 & 0xFFFFu)) {
+ imm8 >>= 16;
+ sizeOp.decrementSize();
+ }
+ }
+
+ if (sizeOp.size() == 1) {
+ if (imm8 > 0xFFFFu)
+ goto InvalidImmediate;
+
+ if ((imm8 >> 8) == (imm8 & 0xFFu)) {
+ imm8 >>= 8;
+ sizeOp.decrementSize();
+ }
+ }
+
+ uint32_t maxShift = (8u << sizeOp.size()) - 8u;
+ if (o2.isImm()) {
+ if (imm8 > 0xFFu || o2.as<Imm>().valueAs<uint64_t>() > maxShift)
+ goto InvalidImmediate;
+
+ shift = o2.as<Imm>().valueAs<uint32_t>();
+ shiftOp = o2.as<Imm>().predicate();
+ }
+ else if (imm8) {
+ shift = Support::ctz(imm8) & ~0x7u;
+ imm8 >>= shift;
+
+ if (imm8 > 0xFFu || shift > maxShift)
+ goto InvalidImmediate;
+ }
+
+ if ((shift & 0x7u) != 0u)
+ goto InvalidImmediate;
+ }
+
+ shift /= 8u;
+
+ switch (sizeOp.size()) {
+ case 0:
+ if (shiftOp != uint32_t(ShiftOp::kLSL))
+ goto InvalidImmediate;
+
+ if (inverted) {
+ imm8 = ~imm8 & 0xFFu;
+ inverted = 0;
+ }
+
+ cmode = B(3) | B(2) | B(1);
+ break;
+
+ case 1:
+ if (shiftOp != uint32_t(ShiftOp::kLSL))
+ goto InvalidImmediate;
+
+ cmode = B(3) | (shift << 1);
+ op = inverted;
+ break;
+
+ case 2:
+ if (shiftOp == uint32_t(ShiftOp::kLSL)) {
+ cmode = shift << 1;
+ }
+ else if (shiftOp == uint32_t(ShiftOp::kMSL)) {
+ if (shift == 0 || shift > 2)
+ goto InvalidImmediate;
+ cmode = B(3) | B(2) | (shift - 1u);
+ }
+ else {
+ goto InvalidImmediate;
+ }
+
+ op = inverted;
+ break;
+
+ case 3:
+ if (inverted) {
+ imm8 = ~imm8 & 0xFFu;
+ inverted = 0;
+ }
+
+ op = 1;
+ cmode = B(3) | B(2) | B(1);
+ break;
+ }
+
+ // The immediate value is split into ABC and DEFGH parts.
+ uint32_t abc = (imm8 >> 5) & 0x7u;
+ uint32_t defgh = imm8 & 0x1Fu;
+
+ opcode.reset(uint32_t(opData.opcode) << 10);
+ opcode.addImm(sizeOp.q(), 30);
+ opcode.addImm(op, 29);
+ opcode.addImm(abc, 16);
+ opcode.addImm(cmode, 12);
+ opcode.addImm(defgh, 5);
+ goto EmitOp_Rd0;
+ }
+
+ break;
+ }
+
+ case InstDB::kEncodingSimdShift: {
+ const InstDB::EncodingData::SimdShift& opData = InstDB::EncodingData::simdShift[encodingIndex];
+
+ const Operand_& sop = significantSimdOp(o0, o1, instFlags);
+ SizeOp sizeOp = armElementTypeToSizeOp(opData.vecOpType, sop.as<Reg>().type(), sop.as<Vec>().elementType());
+
+ if (!sizeOp.isValid())
+ goto InvalidInstruction;
+
+ if (isign4 == ENC_OPS3(Reg, Reg, Imm) && opData.immediateOp) {
+ if (!matchSignature(o0, o1, instFlags))
+ goto InvalidInstruction;
+
+ if (o2.as<Imm>().valueAs<uint64_t>() > 63)
+ goto InvalidImmediate;
+
+ uint32_t lsbShift = sizeOp.size() + 3u;
+ uint32_t lsbMask = (1u << lsbShift) - 1u;
+ uint32_t imm = o2.as<Imm>().valueAs<uint32_t>();
+
+ // Some instructions use IMM and some X - IMM, so negate if required.
+ if (opData.invertedImm) {
+ if (imm == 0 || imm > (1u << lsbShift))
+ goto InvalidImmediate;
+ imm = Support::neg(imm) & lsbMask;
+ }
+
+ if (imm > lsbMask)
+ goto InvalidImmediate;
+ imm |= (1u << lsbShift);
+
+ opcode.reset(uint32_t(opData.immediateOp) << 10);
+ opcode.addImm(sizeOp.qs(), 30);
+ opcode.addImm(sizeOp.scalar(), 28);
+ opcode.addImm(imm, 16);
+ goto EmitOp_Rd0_Rn5;
+ }
+
+ if (isign4 == ENC_OPS3(Reg, Reg, Reg) && opData.registerOp) {
+ if (!matchSignature(o0, o1, o2, instFlags))
+ goto InvalidInstruction;
+
+ opcode.reset(uint32_t(opData.registerOp) << 10);
+ opcode.addImm(sizeOp.qs(), 30);
+ opcode.addImm(sizeOp.scalar(), 28);
+ opcode.addImm(sizeOp.size(), 22);
+ goto EmitOp_Rd0_Rn5_Rm16;
+ }
+
+ break;
+ }
+
+ case InstDB::kEncodingSimdShiftES: {
+ const InstDB::EncodingData::SimdShiftES& opData = InstDB::EncodingData::simdShiftES[encodingIndex];
+
+ if (isign4 == ENC_OPS3(Reg, Reg, Imm)) {
+ SizeOp sizeOp = armElementTypeToSizeOp(opData.vecOpType, o1.as<Reg>().type(), o1.as<Vec>().elementType());
+ if (!sizeOp.isValid())
+ goto InvalidInstruction;
+
+ if (!matchSignature(o0, o1, instFlags))
+ goto InvalidInstruction;
+
+ // The immediate value must match the element size.
+ uint64_t shift = o2.as<Imm>().valueAs<uint64_t>();
+ uint32_t shiftOp = o2.as<Imm>().predicate();
+
+ if (shift != (8u << sizeOp.size()) || shiftOp != uint32_t(ShiftOp::kLSL))
+ goto InvalidImmediate;
+
+ opcode.reset(uint32_t(opData.opcode) << 10);
+ opcode.addImm(sizeOp.q(), 30);
+ opcode.addImm(sizeOp.size(), 22);
+ goto EmitOp_Rd0_Rn5;
+ }
+
+ break;
+ }
+
+ case InstDB::kEncodingSimdSm3tt: {
+ const InstDB::EncodingData::SimdSm3tt& opData = InstDB::EncodingData::simdSm3tt[encodingIndex];
+
+ if (isign4 == ENC_OPS3(Reg, Reg, Reg)) {
+ if (o0.as<Vec>().isVecS4() && o1.as<Vec>().isVecS4() && o2.as<Vec>().isVecS4() && o2.as<Vec>().hasElementIndex()) {
+ uint32_t imm2 = o2.as<Vec>().elementIndex();
+ if (imm2 > 3)
+ goto InvalidElementIndex;
+
+ opcode.reset(uint32_t(opData.opcode) << 10);
+ opcode.addImm(imm2, 12);
+ goto EmitOp_Rd0_Rn5_Rm16;
+ }
+ }
+
+ break;
+ }
+
+
+ case InstDB::kEncodingSimdSmovUmov: SimdUmov: {
+ const InstDB::EncodingData::SimdSmovUmov& opData = InstDB::EncodingData::simdSmovUmov[encodingIndex];
+
+ if (isign4 == ENC_OPS2(Reg, Reg) && o0.as<Reg>().isGp() && o1.as<Reg>().isVec()) {
+ SizeOp sizeOp = armElementTypeToSizeOp(opData.vecOpType, o1.as<Reg>().type(), o1.as<Vec>().elementType());
+ if (!sizeOp.isValid())
+ goto InvalidInstruction;
+
+ if (!o1.as<Vec>().hasElementIndex())
+ goto InvalidInstruction;
+
+ uint32_t x = o0.as<Gp>().isGpX();
+ uint32_t gpMustBeX = uint32_t(sizeOp.size() >= 3u - opData.isSigned);
+
+ if (opData.isSigned) {
+ if (gpMustBeX && !x)
+ goto InvalidInstruction;
+ }
+ else {
+ if (x != gpMustBeX)
+ goto InvalidInstruction;
+ }
+
+ uint32_t elementIndex = o1.as<Vec>().elementIndex();
+ uint32_t maxElementIndex = 15u >> sizeOp.size();
+
+ if (elementIndex > maxElementIndex)
+ goto InvalidElementIndex;
+
+ uint32_t imm5 = (1u | (elementIndex << 1)) << sizeOp.size();
+
+ opcode.reset(uint32_t(opData.opcode) << 10);
+ opcode.addImm(x, 30);
+ opcode.addImm(imm5, 16);
+ goto EmitOp_Rd0_Rn5;
+ }
+
+ break;
+ }
+
+ case InstDB::kEncodingSimdSxtlUxtl: {
+ const InstDB::EncodingData::SimdSxtlUxtl& opData = InstDB::EncodingData::simdSxtlUxtl[encodingIndex];
+
+ if (isign4 == ENC_OPS2(Reg, Reg)) {
+ SizeOp sizeOp = armElementTypeToSizeOp(opData.vecOpType, o1.as<Reg>().type(), o1.as<Vec>().elementType());
+ if (!sizeOp.isValid())
+ goto InvalidInstruction;
+
+ if (!matchSignature(o0, o1, instFlags))
+ goto InvalidInstruction;
+
+ opcode.reset(uint32_t(opData.opcode) << 10);
+ opcode.addImm(sizeOp.q(), 30);
+ opcode.addImm(1u, sizeOp.size() + 19);
+ goto EmitOp_Rd0_Rn5;
+ }
+
+ break;
+ }
+
+ case InstDB::kEncodingSimdTblTbx: {
+ const InstDB::EncodingData::SimdTblTbx& opData = InstDB::EncodingData::simdTblTbx[encodingIndex];
+
+ if (isign4 == ENC_OPS3(Reg, Reg, Reg) || isign4 == ENC_OPS4(Reg, Reg, Reg, Reg)) {
+ // TBL/TBX <Vd>.<Ta>, { <Vn>.16B }, <Vm>.<Ta>
+ // TBL/TBX <Vd>.<Ta>, { <Vn>.16B, <Vn+1>.16B }, <Vm>.<Ta>
+ // TBL/TBX <Vd>.<Ta>, { <Vn>.16B, <Vn+1>.16B, <Vn+2>.16B }, <Vm>.<Ta>
+ // TBL/TBX <Vd>.<Ta>, { <Vn>.16B, <Vn+1>.16B, <Vn+2>.16B, <Vn+3>.16B }, <Vm>.<Ta>
+ opcode.reset(uint32_t(opData.opcode) << 10);
+
+ const Operand_& o4 = opExt[EmitterUtils::kOp4];
+ const Operand_& o5 = opExt[EmitterUtils::kOp5];
+
+ uint32_t q = diff(o0.as<Reg>().type(), RegType::kARM_VecD);
+ if (q > 1 || o0.as<Vec>().hasElementIndex())
+ goto InvalidInstruction;
+
+ if (!o1.as<Vec>().isVecB16() || o1.as<Vec>().hasElementIndex())
+ goto InvalidInstruction;
+
+ uint32_t len = uint32_t(!o3.isNone()) + uint32_t(!o4.isNone()) + uint32_t(!o5.isNone());
+ opcode.addImm(q, 30);
+ opcode.addImm(len, 13);
+
+ switch (len) {
+ case 0:
+ if (!checkSignature(o0, o2))
+ goto InvalidInstruction;
+
+ if (o2.id() > 31)
+ goto InvalidPhysId;
+
+ opcode.addReg(o2, 16);
+ goto EmitOp_Rd0_Rn5;
+
+ case 1:
+ if (!checkSignature(o0, o3))
+ goto InvalidInstruction;
+
+ if (o3.id() > 31)
+ goto InvalidPhysId;
+
+ opcode.addReg(o3, 16);
+ goto EmitOp_Rd0_Rn5;
+
+ case 2:
+ if (!checkSignature(o0, o4))
+ goto InvalidInstruction;
+
+ if (o4.id() > 31)
+ goto InvalidPhysId;
+
+ opcode.addReg(o4, 16);
+ goto EmitOp_Rd0_Rn5;
+
+ case 3:
+ if (!checkSignature(o0, o5))
+ goto InvalidInstruction;
+
+ if (o5.id() > 31)
+ goto InvalidPhysId;
+
+ opcode.addReg(o5, 16);
+ goto EmitOp_Rd0_Rn5;
+
+ default:
+ // Should never happen.
+ goto InvalidInstruction;
+ }
+ }
+
+ break;
+ }
+
+ // ------------------------------------------------------------------------
+ // [Simd - Load / Store]
+ // ------------------------------------------------------------------------
+
+ case InstDB::kEncodingSimdLdSt: {
+ const InstDB::EncodingData::SimdLdSt& opData = InstDB::EncodingData::simdLdSt[encodingIndex];
+
+ if (isign4 == ENC_OPS2(Reg, Mem)) {
+ const Mem& m = o1.as<Mem>();
+ rmRel = &m;
+
+ // Width | SZ | XY | XSZ
+ // -------+----------+-----------+-----
+ // 8-bit | size==00 | opc == 01 | 000
+ // 16-bit | size==01 | opc == 01 | 001
+ // 32-bit | size==10 | opc == 01 | 010
+ // 64-bit | size==11 | opc == 01 | 011
+ // 128-bit| size==00 | opc == 11 | 100
+ uint32_t xsz = diff(o0.as<Reg>().type(), RegType::kARM_VecB);
+ if (xsz > 4u || o0.as<Vec>().hasElementIndex())
+ goto InvalidRegType;
+
+ if (!checkVecId(o0))
+ goto InvalidPhysId;
+
+ if (!armCheckMemBaseIndexRel(m))
+ goto InvalidAddress;
+
+ int64_t offset = m.offset();
+ if (m.hasBaseReg()) {
+ // [Base {Offset | Index}]
+ if (m.hasIndex()) {
+ uint32_t opt = armShiftOpToLdStOptMap[m.predicate()];
+ if (opt == 0xFFu)
+ goto InvalidAddress;
+
+ uint32_t shift = m.shift();
+ uint32_t s = (shift != 0);
+
+ if (s && shift != xsz)
+ goto InvalidAddressScale;
+
+ opcode.reset(uint32_t(opData.registerOp) << 21);
+ opcode.addImm(xsz & 3u, 30);
+ opcode.addImm(xsz >> 2, 23);
+ opcode.addImm(opt, 13);
+ opcode.addImm(s, 12);
+ opcode |= B(11);
+ opcode.addReg(o0, 0);
+ goto EmitOp_MemBaseIndex_Rn5_Rm16;
+ }
+
+ // Makes it easier to work with the offset especially on 32-bit arch.
+ if (!Support::isInt32(offset))
+ goto InvalidDisplacement;
+ int32_t offset32 = int32_t(offset);
+
+ if (m.isPreOrPost()) {
+ if (!Support::isInt9(offset32))
+ goto InvalidDisplacement;
+
+ opcode.reset(uint32_t(opData.prePostOp) << 21);
+ opcode.addImm(xsz & 3u, 30);
+ opcode.addImm(xsz >> 2, 23);
+ opcode.addImm(offset32 & 0x1FF, 12);
+ opcode.addImm(m.isPreIndex(), 11);
+ opcode |= B(10);
+ opcode.addReg(o0, 0);
+ goto EmitOp_MemBase_Rn5;
+ }
+ else {
+ uint32_t imm12 = uint32_t(offset32) >> xsz;
+
+ // If this instruction is not encodable with scaled unsigned offset, try unscaled signed offset.
+ if (!Support::isUInt12(imm12) || (imm12 << xsz) != uint32_t(offset32)) {
+ instId = opData.uAltInstId;
+ instInfo = &InstDB::_instInfoTable[instId];
+ encodingIndex = instInfo->_encodingDataIndex;
+ goto Case_SimdLdurStur;
+ }
+
+ opcode.reset(uint32_t(opData.uOffsetOp) << 22);
+ opcode.addImm(xsz & 3u, 30);
+ opcode.addImm(xsz >> 2, 23);
+ opcode.addImm(imm12, 10);
+ opcode.addReg(o0, 0);
+ goto EmitOp_MemBase_Rn5;
+ }
+ }
+ else {
+ if (!opData.literalOp)
+ goto InvalidAddress;
+
+ if (xsz < 2u)
+ goto InvalidRegType;
+
+ uint32_t opc = xsz - 2u;
+ opcode.reset(uint32_t(opData.literalOp) << 24);
+ opcode.addImm(opc, 30);
+ opcode.addReg(o0, 0);
+ offsetFormat.resetToImmValue(OffsetType::kSignedOffset, 4, 5, 19, 2);
+ goto EmitOp_Rel;
+ }
+ }
+
+ break;
+ }
+
+ case InstDB::kEncodingSimdLdpStp: {
+ const InstDB::EncodingData::SimdLdpStp& opData = InstDB::EncodingData::simdLdpStp[encodingIndex];
+
+ if (isign4 == ENC_OPS3(Reg, Reg, Mem)) {
+ const Mem& m = o2.as<Mem>();
+ rmRel = &m;
+
+ uint32_t opc = diff(o0.as<Reg>().type(), RegType::kARM_VecS);
+ if (opc > 2u || o0.as<Vec>().hasElementTypeOrIndex())
+ goto InvalidInstruction;
+
+ if (!checkSignature(o0, o1))
+ goto InvalidInstruction;
+
+ if (!checkVecId(o0, o1))
+ goto InvalidPhysId;
+
+ if (m.baseType() != RegType::kARM_GpX || m.hasIndex())
+ goto InvalidAddress;
+
+ if (m.isOffset64Bit())
+ goto InvalidDisplacement;
+
+ uint32_t offsetShift = 2u + opc;
+ int32_t offset32 = m.offsetLo32() >> offsetShift;
+
+ // Make sure we didn't lose bits by applying the mandatory offset shift.
+ if (Support::shl(offset32, offsetShift) != m.offsetLo32())
+ goto InvalidDisplacement;
+
+ // Offset is encoded as a 7-bit immediate.
+ if (!Support::isInt7(offset32))
+ goto InvalidDisplacement;
+
+ if (m.isPreOrPost() && offset32 != 0) {
+ if (!opData.prePostOp)
+ goto InvalidAddress;
+
+ opcode.reset(uint32_t(opData.prePostOp) << 22);
+ opcode.addImm(m.isPreIndex(), 24);
+ }
+ else {
+ opcode.reset(uint32_t(opData.offsetOp) << 22);
+ }
+
+ opcode.addImm(opc, 30);
+ opcode.addImm(offset32 & 0x7F, 15);
+ opcode.addReg(o1, 10);
+ opcode.addReg(o0, 0);
+ goto EmitOp_MemBase_Rn5;
+ }
+
+ break;
+ }
+
+ case InstDB::kEncodingSimdLdurStur: {
+Case_SimdLdurStur:
+ const InstDB::EncodingData::SimdLdurStur& opData = InstDB::EncodingData::simdLdurStur[encodingIndex];
+
+ if (isign4 == ENC_OPS2(Reg, Mem)) {
+ const Mem& m = o1.as<Mem>();
+ rmRel = &m;
+
+ uint32_t sz = diff(o0.as<Reg>().type(), RegType::kARM_VecB);
+ if (sz > 4 || o0.as<Vec>().hasElementTypeOrIndex())
+ goto InvalidInstruction;
+
+ if (!checkVecId(o0))
+ goto InvalidPhysId;
+
+ if (!armCheckMemBaseIndexRel(m))
+ goto InvalidAddress;
+
+ if (m.hasBaseReg() && !m.hasIndex() && !m.isPreOrPost()) {
+ if (m.isOffset64Bit())
+ goto InvalidDisplacement;
+
+ int32_t offset32 = m.offsetLo32();
+ if (!Support::isInt9(offset32))
+ goto InvalidDisplacement;
+
+ opcode.reset(uint32_t(opData.opcode) << 10);
+ opcode.addImm(sz & 3u, 30);
+ opcode.addImm(sz >> 2, 23);
+ opcode.addImm(offset32 & 0x1FF, 12);
+ opcode.addReg(o0, 0);
+ goto EmitOp_MemBase_Rn5;
+ }
+
+ goto InvalidAddress;
+ }
+
+ break;
+ }
+
+ case InstDB::kEncodingSimdLdNStN: {
+ const InstDB::EncodingData::SimdLdNStN& opData = InstDB::EncodingData::simdLdNStN[encodingIndex];
+ const Operand_& o4 = opExt[EmitterUtils::kOp4];
+
+ uint32_t n = 1;
+
+ if (isign4 == ENC_OPS2(Reg, Mem)) {
+ if (opData.n != 1)
+ goto InvalidInstruction;
+
+ rmRel = &o1;
+ }
+ else if (isign4 == ENC_OPS3(Reg, Reg, Mem)) {
+ if (opData.n != 1 && opData.n != 2)
+ goto InvalidInstruction;
+
+ if (!checkSignature(o0, o1) || !checkConsecutive(o0, o1))
+ goto InvalidInstruction;
+
+ n = 2;
+ rmRel = &o2;
+ }
+ else if (isign4 == ENC_OPS4(Reg, Reg, Reg, Mem) && o4.isNone()) {
+ if (opData.n != 1 && opData.n != 3)
+ goto InvalidInstruction;
+
+ if (!checkSignature(o0, o1, o2) || !checkConsecutive(o0, o1, o2))
+ goto InvalidInstruction;
+
+ n = 3;
+ rmRel = &o3;
+ }
+ else if (isign4 == ENC_OPS4(Reg, Reg, Reg, Reg) && o4.isMem()) {
+ if (opData.n != 1 && opData.n != 4)
+ goto InvalidInstruction;
+
+ if (!checkSignature(o0, o1, o2, o3) || !checkConsecutive(o0, o1, o2, o3))
+ goto InvalidInstruction;
+
+ n = 4;
+ rmRel = &o4;
+ }
+ else {
+ goto InvalidInstruction;
+ }
+
+ // We will use `v` and `m` from now as those are relevant for encoding.
+ const Vec& v = o0.as<Vec>();
+ const Mem& m = rmRel->as<Mem>();
+
+ uint32_t q = 0;
+ uint32_t rm = 0;
+ uint32_t rn = m.baseId();
+ uint32_t sz = v.elementType() - Vec::kElementTypeB;
+ uint32_t opcSsize = sz;
+ uint32_t offsetPossibility = 0;
+
+ if (sz > 3)
+ goto InvalidInstruction;
+
+ if (m.baseType() != RegType::kARM_GpX)
+ goto InvalidAddress;
+
+ // Rn cannot be ZR, but can be SP.
+ if (rn > 30 && rn != Gp::kIdSp)
+ goto InvalidAddress;
+
+ rn &= 31;
+
+ if (opData.replicate) {
+ if (n != opData.n)
+ goto InvalidInstruction;
+
+ // Replicates to the whole register, element index cannot be used.
+ if (v.hasElementIndex())
+ goto InvalidInstruction;
+
+ q = diff(v.type(), RegType::kARM_VecD);
+ if (q > 1)
+ goto InvalidInstruction;
+
+ opcode.reset(uint32_t(opData.singleOp) << 10);
+ offsetPossibility = (1u << sz) * n;
+ }
+ else if (v.hasElementIndex()) {
+ if (n != opData.n)
+ goto InvalidInstruction;
+
+ // LDx/STx (single structure).
+ static const uint8_t opcSsizeBySzS[] = { 0x0u << 3, 0x2u << 3, 0x4u << 3, (0x4u << 3) | 1u };
+
+ opcode.reset(uint32_t(opData.singleOp) << 10);
+ opcSsize = opcSsizeBySzS[sz];
+ offsetPossibility = (1u << sz) * opData.n;
+
+ uint32_t elementIndex = v.elementIndex();
+ uint32_t maxElementIndex = 15 >> sz;
+
+ if (elementIndex > maxElementIndex)
+ goto InvalidElementIndex;
+
+ elementIndex <<= sz;
+ q = elementIndex >> 3;
+ opcSsize |= elementIndex & 0x7u;
+ }
+ else {
+ // LDx/STx (multiple structures).
+ static const uint8_t opcSsizeByN[] = { 0u, 0x7u << 2, 0xAu << 2, 0x6u << 2, 0x2u << 2 };
+
+ q = diff(v.type(), RegType::kARM_VecD);
+ if (q > 1)
+ goto InvalidInstruction;
+
+ if (opData.n == 1)
+ opcSsize |= opcSsizeByN[n];
+
+ opcode.reset(uint32_t(opData.multipleOp) << 10);
+ offsetPossibility = (8u << q) * n;
+ }
+
+ if (m.hasIndex()) {
+ if (m.hasOffset() || !m.isPostIndex())
+ goto InvalidAddress;
+
+ rm = m.indexId();
+ if (rm > 30)
+ goto InvalidAddress;
+
+ // Bit 23 - PostIndex.
+ opcode |= B(23);
+ }
+ else {
+ if (m.hasOffset()) {
+ if (m.offset() != int32_t(offsetPossibility) || !m.isPostIndex())
+ goto InvalidAddress;
+ rm = 31;
+
+ // Bit 23 - PostIndex.
+ opcode |= B(23);
+ }
+ }
+
+ opcode.addImm(q, 30);
+ opcode.addImm(rm, 16);
+ opcode.addImm(opcSsize, 10);
+ opcode.addImm(rn, 5);
+ goto EmitOp_Rd0;
+ }
+
+ default:
+ break;
+ }
+
+ goto InvalidInstruction;
+
+ // --------------------------------------------------------------------------
+ // [EmitGp - Single]
+ // --------------------------------------------------------------------------
+
+EmitOp_Rd0:
+ if (!checkValidRegs(o0))
+ goto InvalidPhysId;
+
+ opcode.addReg(o0, 0);
+ goto EmitOp;
+
+EmitOp_Rn5:
+ if (!checkValidRegs(o0))
+ goto InvalidPhysId;
+
+ opcode.addReg(o0, 5);
+ goto EmitOp;
+
+EmitOp_Rn5_Rm16:
+ if (!checkValidRegs(o0, o1))
+ goto InvalidPhysId;
+
+ opcode.addReg(o0, 5);
+ opcode.addReg(o1, 16);
+ goto EmitOp;
+
+EmitOp_Rd0_Rn5:
+ if (!checkValidRegs(o0, o1))
+ goto InvalidPhysId;
+
+ opcode.addReg(o0, 0);
+ opcode.addReg(o1, 5);
+ goto EmitOp;
+
+EmitOp_Rd0_Rn5_Rm16_Ra10:
+ if (!checkValidRegs(o0, o1, o2, o3))
+ goto InvalidPhysId;
+
+ opcode.addReg(o0, 0);
+ opcode.addReg(o1, 5);
+ opcode.addReg(o2, 16);
+ opcode.addReg(o3, 10);
+ goto EmitOp;
+
+EmitOp_Rd0_Rn5_Rm16:
+ if (!checkValidRegs(o0, o1, o3))
+ goto InvalidPhysId;
+
+ opcode.addReg(o0, 0);
+ opcode.addReg(o1, 5);
+ opcode.addReg(o2, 16);
+ goto EmitOp;
+
+ // --------------------------------------------------------------------------
+ // [EmitGp - Multiple]
+ // --------------------------------------------------------------------------
+
+EmitOp_Multiple:
+ {
+ ASMJIT_ASSERT(multipleOpCount > 0);
+ err = writer.ensureSpace(this, multipleOpCount * 4u);
+ if (ASMJIT_UNLIKELY(err))
+ goto Failed;
+
+ for (uint32_t i = 0; i < multipleOpCount; i++)
+ writer.emit32uLE(multipleOpData[i]);
+
+ goto EmitDone;
+ }
+
+ // --------------------------------------------------------------------------
+ // [EmitGp - Memory]
+ // --------------------------------------------------------------------------
+
+EmitOp_MemBase_Rn5:
+ if (!checkMemBase(rmRel->as<Mem>()))
+ goto InvalidAddress;
+
+ opcode.addReg(rmRel->as<Mem>().baseId(), 5);
+ goto EmitOp;
+
+EmitOp_MemBaseNoImm_Rn5:
+ if (!checkMemBase(rmRel->as<Mem>()) || rmRel->as<Mem>().hasIndex())
+ goto InvalidAddress;
+
+ if (rmRel->as<Mem>().hasOffset())
+ goto InvalidDisplacement;
+
+ opcode.addReg(rmRel->as<Mem>().baseId(), 5);
+ goto EmitOp;
+
+EmitOp_MemBaseIndex_Rn5_Rm16:
+ if (!rmRel->as<Mem>().hasBaseReg())
+ goto InvalidAddress;
+
+ if (rmRel->as<Mem>().indexId() > 30 && rmRel->as<Mem>().indexId() != Gp::kIdZr)
+ goto InvalidPhysId;
+
+ opcode.addReg(rmRel->as<Mem>().indexId(), 16);
+ opcode.addReg(rmRel->as<Mem>().baseId(), 5);
+ goto EmitOp;
+
+ // --------------------------------------------------------------------------
+ // [EmitOp - PC Relative]
+ // --------------------------------------------------------------------------
+
+EmitOp_Rel:
+ {
+ if (rmRel->isLabel() || rmRel->isMem()) {
+ uint32_t labelId;
+ int64_t labelOffset = 0;
+
+ if (rmRel->isLabel()) {
+ labelId = rmRel->as<Label>().id();
+ }
+ else {
+ labelId = rmRel->as<Mem>().baseId();
+ labelOffset = rmRel->as<Mem>().offset();
+ }
+
+ LabelEntry* label = _code->labelEntry(labelId);
+ if (ASMJIT_UNLIKELY(!label))
+ goto InvalidLabel;
+
+ if (offsetFormat.type() == OffsetType::kAArch64_ADRP) {
+ // TODO: [ARM] Always create relocation entry.
+ }
+
+ if (label->isBoundTo(_section)) {
+ // Label bound to the current section.
+ offsetValue = label->offset() - uint64_t(offset()) + uint64_t(labelOffset);
+ goto EmitOp_DispImm;
+ }
+ else {
+ // Record non-bound label.
+ size_t codeOffset = writer.offsetFrom(_bufferData);
+ LabelLink* link = _code->newLabelLink(label, _section->id(), codeOffset, intptr_t(labelOffset), offsetFormat);
+
+ if (ASMJIT_UNLIKELY(!link))
+ goto OutOfMemory;
+
+ goto EmitOp;
+ }
+ }
+ }
+
+ if (rmRel->isImm()) {
+ uint64_t baseAddress = _code->baseAddress();
+ uint64_t targetOffset = rmRel->as<Imm>().valueAs<uint64_t>();
+
+ size_t codeOffset = writer.offsetFrom(_bufferData);
+
+ if (baseAddress == Globals::kNoBaseAddress || _section->id() != 0) {
+ // Create a new RelocEntry as we cannot calculate the offset right now.
+ RelocEntry* re;
+ err = _code->newRelocEntry(&re, RelocType::kAbsToRel);
+ if (err)
+ goto Failed;
+
+ re->_sourceSectionId = _section->id();
+ re->_sourceOffset = codeOffset;
+ re->_format = offsetFormat;
+ re->_payload = rmRel->as<Imm>().valueAs<uint64_t>() + 4u;
+ goto EmitOp;
+ }
+ else {
+ uint64_t pc = baseAddress + codeOffset;
+
+ if (offsetFormat.type() == OffsetType::kAArch64_ADRP)
+ pc &= ~uint64_t(4096 - 1);
+
+ offsetValue = targetOffset - pc;
+ goto EmitOp_DispImm;
+ }
+ }
+
+ goto InvalidInstruction;
+
+EmitOp_DispImm:
+ {
+ if ((offsetValue & Support::lsbMask<uint32_t>(offsetFormat.immDiscardLsb())) != 0)
+ goto InvalidDisplacement;
+
+ int64_t dispImm64 = int64_t(offsetValue) >> offsetFormat.immDiscardLsb();
+ if (!Support::isEncodableOffset64(dispImm64, offsetFormat.immBitCount()))
+ goto InvalidDisplacement;
+
+ uint32_t dispImm32 = uint32_t(dispImm64 & Support::lsbMask<uint32_t>(offsetFormat.immBitCount()));
+ switch (offsetFormat.type()) {
+ case OffsetType::kSignedOffset: {
+ opcode.addImm(dispImm32, offsetFormat.immBitShift());
+ goto EmitOp;
+ }
+
+ case OffsetType::kAArch64_ADR:
+ case OffsetType::kAArch64_ADRP: {
+ uint32_t immLo = dispImm32 & 0x3u;
+ uint32_t immHi = dispImm32 >> 2;
+ opcode.addImm(immLo, 29);
+ opcode.addImm(immHi, 5);
+ goto EmitOp;
+ }
+
+ default:
+ goto InvalidDisplacement;
+ }
+ }
+
+ // --------------------------------------------------------------------------
+ // [EmitOp - Opcode]
+ // --------------------------------------------------------------------------
+
+EmitOp:
+ writer.emit32uLE(opcode.get());
+ goto EmitDone;
+
+ // --------------------------------------------------------------------------
+ // [Done]
+ // --------------------------------------------------------------------------
+
+EmitDone:
+ if (Support::test(options, InstOptions::kReserved)) {
+#ifndef ASMJIT_NO_LOGGING
+ if (_logger)
+ EmitterUtils::logInstructionEmitted(this, instId, options, o0, o1, o2, opExt, 0, 0, writer.cursor());
+#endif
+ }
+
+ resetExtraReg();
+ resetInstOptions();
+ resetInlineComment();
+
+ writer.done(this);
+ return kErrorOk;
+
+ // --------------------------------------------------------------------------
+ // [Error Handler]
+ // --------------------------------------------------------------------------
+
+#define ERROR_HANDLER(ERR) ERR: err = DebugUtils::errored(kError##ERR); goto Failed;
+ ERROR_HANDLER(OutOfMemory)
+ ERROR_HANDLER(InvalidAddress)
+ ERROR_HANDLER(InvalidAddressScale)
+ ERROR_HANDLER(InvalidDisplacement)
+ ERROR_HANDLER(InvalidElementIndex)
+ ERROR_HANDLER(InvalidLabel)
+ ERROR_HANDLER(InvalidImmediate)
+ ERROR_HANDLER(InvalidInstruction)
+ ERROR_HANDLER(InvalidPhysId)
+ ERROR_HANDLER(InvalidRegType)
+#undef ERROR_HANDLER
+
+Failed:
+#ifndef ASMJIT_NO_LOGGING
+ return EmitterUtils::logInstructionFailed(this, err, instId, options, o0, o1, o2, opExt);
+#else
+ resetExtraReg();
+ resetInstOptions();
+ resetInlineComment();
+ return reportError(err);
+#endif
+}
+
+#undef ENC_OPS1
+#undef ENC_OPS2
+#undef ENC_OPS3
+#undef ENC_OPS4
+
+// a64::Assembler - Align
+// ======================
+
+Error Assembler::align(AlignMode alignMode, uint32_t alignment) {
+ constexpr uint32_t kNopA64 = 0xD503201Fu; // [11010101|00000011|00100000|00011111].
+
+ if (ASMJIT_UNLIKELY(!_code))
+ return reportError(DebugUtils::errored(kErrorNotInitialized));
+
+ if (ASMJIT_UNLIKELY(uint32_t(alignMode) > uint32_t(AlignMode::kMaxValue)))
+ return reportError(DebugUtils::errored(kErrorInvalidArgument));
+
+ if (alignment <= 1)
+ return kErrorOk;
+
+ if (ASMJIT_UNLIKELY(alignment > Globals::kMaxAlignment || !Support::isPowerOf2(alignment)))
+ return reportError(DebugUtils::errored(kErrorInvalidArgument));
+
+ uint32_t i = uint32_t(Support::alignUpDiff<size_t>(offset(), alignment));
+ if (i == 0)
+ return kErrorOk;
+
+ CodeWriter writer(this);
+ ASMJIT_PROPAGATE(writer.ensureSpace(this, i));
+
+ switch (alignMode) {
+ case AlignMode::kCode: {
+ uint32_t pattern = kNopA64;
+
+ if (ASMJIT_UNLIKELY(offset() & 0x3u))
+ return DebugUtils::errored(kErrorInvalidState);
+
+ while (i >= 4) {
+ writer.emit32uLE(pattern);
+ i -= 4;
+ }
+
+ ASMJIT_ASSERT(i == 0);
+ break;
+ }
+
+ case AlignMode::kData:
+ case AlignMode::kZero:
+ writer.emitZeros(i);
+ break;
+ }
+
+ writer.done(this);
+
+#ifndef ASMJIT_NO_LOGGING
+ if (_logger) {
+ StringTmp<128> sb;
+ sb.appendChars(' ', _logger->indentation(FormatIndentationGroup::kCode));
+ sb.appendFormat("align %u\n", alignment);
+ _logger->log(sb);
+ }
+#endif
+
+ return kErrorOk;
+}
+
+// a64::Assembler - Events
+// =======================
+
+Error Assembler::onAttach(CodeHolder* code) noexcept {
+ ASMJIT_PROPAGATE(Base::onAttach(code));
+ return kErrorOk;
+}
+
+Error Assembler::onDetach(CodeHolder* code) noexcept {
+ return Base::onDetach(code);
+}
+
+ASMJIT_END_SUB_NAMESPACE
+
+#endif // !ASMJIT_NO_AARCH64
diff --git a/3rdparty/asmjit/src/asmjit/arm/a64assembler.h b/3rdparty/asmjit/src/asmjit/arm/a64assembler.h
new file mode 100644
index 00000000000..f1ac72b8d56
--- /dev/null
+++ b/3rdparty/asmjit/src/asmjit/arm/a64assembler.h
@@ -0,0 +1,72 @@
+// This file is part of AsmJit project <https://asmjit.com>
+//
+// See asmjit.h or LICENSE.md for license and copyright information
+// SPDX-License-Identifier: Zlib
+
+#ifndef ASMJIT_ARM_A64ASSEMBLER_H_INCLUDED
+#define ASMJIT_ARM_A64ASSEMBLER_H_INCLUDED
+
+#include "../core/assembler.h"
+#include "../arm/a64emitter.h"
+#include "../arm/a64operand.h"
+
+ASMJIT_BEGIN_SUB_NAMESPACE(a64)
+
+//! \addtogroup asmjit_a64
+//! \{
+
+//! AArch64 assembler implementation.
+class ASMJIT_VIRTAPI Assembler
+ : public BaseAssembler,
+ public EmitterExplicitT<Assembler> {
+
+public:
+ typedef BaseAssembler Base;
+
+ //! \name Construction / Destruction
+ //! \{
+
+ ASMJIT_API Assembler(CodeHolder* code = nullptr) noexcept;
+ ASMJIT_API virtual ~Assembler() noexcept;
+
+ //! \}
+
+ //! \name Accessors
+ //! \{
+
+ //! Gets whether the current ARM mode is THUMB (alternative to 32-bit ARM encoding).
+ inline bool isInThumbMode() const noexcept { return _environment.isArchThumb(); }
+
+ //! Gets the current code alignment of the current mode (ARM vs THUMB).
+ inline uint32_t codeAlignment() const noexcept { return isInThumbMode() ? 2 : 4; }
+
+ //! \}
+
+ //! \name Emit
+ //! \{
+
+ ASMJIT_API Error _emit(InstId instId, const Operand_& o0, const Operand_& o1, const Operand_& o2, const Operand_* opExt) override;
+
+ //! \}
+
+ //! \name Align
+ //! \{
+
+ ASMJIT_API Error align(AlignMode alignMode, uint32_t alignment) override;
+
+ //! \}
+
+ //! \name Events
+ //! \{
+
+ ASMJIT_API Error onAttach(CodeHolder* code) noexcept override;
+ ASMJIT_API Error onDetach(CodeHolder* code) noexcept override;
+
+ //! \}
+};
+
+//! \}
+
+ASMJIT_END_SUB_NAMESPACE
+
+#endif // ASMJIT_ARM_A64ASSEMBLER_H_INCLUDED
diff --git a/3rdparty/asmjit/src/asmjit/arm/a64builder.cpp b/3rdparty/asmjit/src/asmjit/arm/a64builder.cpp
new file mode 100644
index 00000000000..3a52b2a578c
--- /dev/null
+++ b/3rdparty/asmjit/src/asmjit/arm/a64builder.cpp
@@ -0,0 +1,51 @@
+// This file is part of AsmJit project <https://asmjit.com>
+//
+// See asmjit.h or LICENSE.md for license and copyright information
+// SPDX-License-Identifier: Zlib
+
+#include "../core/api-build_p.h"
+#if !defined(ASMJIT_NO_AARCH64) && !defined(ASMJIT_NO_BUILDER)
+
+#include "../arm/a64assembler.h"
+#include "../arm/a64builder.h"
+#include "../arm/a64emithelper_p.h"
+
+ASMJIT_BEGIN_SUB_NAMESPACE(a64)
+
+// a64::Builder - Construction & Destruction
+// =========================================
+
+Builder::Builder(CodeHolder* code) noexcept : BaseBuilder() {
+ _archMask = uint64_t(1) << uint32_t(Arch::kAArch64);
+ assignEmitterFuncs(this);
+
+ if (code)
+ code->attach(this);
+}
+Builder::~Builder() noexcept {}
+
+// a64::Builder - Events
+// =====================
+
+Error Builder::onAttach(CodeHolder* code) noexcept {
+ return Base::onAttach(code);
+}
+
+Error Builder::onDetach(CodeHolder* code) noexcept {
+ return Base::onDetach(code);
+}
+
+// a64::Builder - Finalize
+// =======================
+
+Error Builder::finalize() {
+ ASMJIT_PROPAGATE(runPasses());
+ Assembler a(_code);
+ a.addEncodingOptions(encodingOptions());
+ a.addDiagnosticOptions(diagnosticOptions());
+ return serializeTo(&a);
+}
+
+ASMJIT_END_SUB_NAMESPACE
+
+#endif // !ASMJIT_NO_AARCH64 && !ASMJIT_NO_BUILDER
diff --git a/3rdparty/asmjit/src/asmjit/arm/a64builder.h b/3rdparty/asmjit/src/asmjit/arm/a64builder.h
new file mode 100644
index 00000000000..adc99aafc8c
--- /dev/null
+++ b/3rdparty/asmjit/src/asmjit/arm/a64builder.h
@@ -0,0 +1,57 @@
+// This file is part of AsmJit project <https://asmjit.com>
+//
+// See asmjit.h or LICENSE.md for license and copyright information
+// SPDX-License-Identifier: Zlib
+
+#ifndef ASMJIT_ARM_A64BUILDER_H_INCLUDED
+#define ASMJIT_ARM_A64BUILDER_H_INCLUDED
+
+#include "../core/api-config.h"
+#ifndef ASMJIT_NO_BUILDER
+
+#include "../core/builder.h"
+#include "../arm/a64emitter.h"
+
+ASMJIT_BEGIN_SUB_NAMESPACE(a64)
+
+//! \addtogroup asmjit_a64
+//! \{
+
+//! AArch64 builder implementation.
+class ASMJIT_VIRTAPI Builder
+ : public BaseBuilder,
+ public EmitterExplicitT<Builder> {
+public:
+ ASMJIT_NONCOPYABLE(Builder)
+ typedef BaseBuilder Base;
+
+ //! \name Construction & Destruction
+ //! \{
+
+ ASMJIT_API explicit Builder(CodeHolder* code = nullptr) noexcept;
+ ASMJIT_API virtual ~Builder() noexcept;
+
+ //! \}
+
+ //! \name Events
+ //! \{
+
+ ASMJIT_API Error onAttach(CodeHolder* code) noexcept override;
+ ASMJIT_API Error onDetach(CodeHolder* code) noexcept override;
+
+ //! \}
+
+ //! \name Finalize
+ //! \{
+
+ ASMJIT_API Error finalize() override;
+
+ //! \}
+};
+
+//! \}
+
+ASMJIT_END_SUB_NAMESPACE
+
+#endif // !ASMJIT_NO_BUILDER
+#endif // ASMJIT_ARM_A64BUILDER_H_INCLUDED
diff --git a/3rdparty/asmjit/src/asmjit/arm/a64compiler.cpp b/3rdparty/asmjit/src/asmjit/arm/a64compiler.cpp
new file mode 100644
index 00000000000..d6c4ed28ff2
--- /dev/null
+++ b/3rdparty/asmjit/src/asmjit/arm/a64compiler.cpp
@@ -0,0 +1,60 @@
+// This file is part of AsmJit project <https://asmjit.com>
+//
+// See asmjit.h or LICENSE.md for license and copyright information
+// SPDX-License-Identifier: Zlib
+
+#include "../core/api-build_p.h"
+#if !defined(ASMJIT_NO_AARCH64) && !defined(ASMJIT_NO_COMPILER)
+
+#include "../arm/a64assembler.h"
+#include "../arm/a64compiler.h"
+#include "../arm/a64emithelper_p.h"
+#include "../arm/a64rapass_p.h"
+
+ASMJIT_BEGIN_SUB_NAMESPACE(a64)
+
+// a64::Compiler - Construction & Destruction
+// ==========================================
+
+Compiler::Compiler(CodeHolder* code) noexcept : BaseCompiler() {
+ _archMask = uint64_t(1) << uint32_t(Arch::kAArch64);
+ assignEmitterFuncs(this);
+
+ if (code)
+ code->attach(this);
+}
+Compiler::~Compiler() noexcept {}
+
+// a64::Compiler - Events
+// ======================
+
+Error Compiler::onAttach(CodeHolder* code) noexcept {
+ ASMJIT_PROPAGATE(Base::onAttach(code));
+ Error err = addPassT<ARMRAPass>();
+
+ if (ASMJIT_UNLIKELY(err)) {
+ onDetach(code);
+ return err;
+ }
+
+ return kErrorOk;
+}
+
+Error Compiler::onDetach(CodeHolder* code) noexcept {
+ return Base::onDetach(code);
+}
+
+// a64::Compiler - Finalize
+// ========================
+
+Error Compiler::finalize() {
+ ASMJIT_PROPAGATE(runPasses());
+ Assembler a(_code);
+ a.addEncodingOptions(encodingOptions());
+ a.addDiagnosticOptions(diagnosticOptions());
+ return serializeTo(&a);
+}
+
+ASMJIT_END_SUB_NAMESPACE
+
+#endif // !ASMJIT_NO_AARCH64 && !ASMJIT_NO_COMPILER
diff --git a/3rdparty/asmjit/src/asmjit/arm/a64compiler.h b/3rdparty/asmjit/src/asmjit/arm/a64compiler.h
new file mode 100644
index 00000000000..ebed549581c
--- /dev/null
+++ b/3rdparty/asmjit/src/asmjit/arm/a64compiler.h
@@ -0,0 +1,235 @@
+// This file is part of AsmJit project <https://asmjit.com>
+//
+// See asmjit.h or LICENSE.md for license and copyright information
+// SPDX-License-Identifier: Zlib
+
+#ifndef ASMJIT_ARM_ARMCOMPILER_H_INCLUDED
+#define ASMJIT_ARM_ARMCOMPILER_H_INCLUDED
+
+#include "../core/api-config.h"
+#ifndef ASMJIT_NO_COMPILER
+
+#include "../core/compiler.h"
+#include "../core/type.h"
+#include "../arm/a64emitter.h"
+
+ASMJIT_BEGIN_SUB_NAMESPACE(a64)
+
+//! \addtogroup asmjit_a64
+//! \{
+
+//! AArch64 compiler implementation.
+class ASMJIT_VIRTAPI Compiler
+ : public BaseCompiler,
+ public EmitterExplicitT<Compiler> {
+public:
+ ASMJIT_NONCOPYABLE(Compiler)
+ typedef BaseCompiler Base;
+
+ //! \name Construction & Destruction
+ //! \{
+
+ ASMJIT_API explicit Compiler(CodeHolder* code = nullptr) noexcept;
+ ASMJIT_API virtual ~Compiler() noexcept;
+
+ //! \}
+
+ //! \name Virtual Registers
+ //! \{
+
+ //! \cond INTERNAL
+ template<typename RegT, typename Type>
+ inline RegT _newRegInternal(const Type& type) {
+ RegT reg(Globals::NoInit);
+ _newReg(&reg, type, nullptr);
+ return reg;
+ }
+
+ template<typename RegT, typename Type, typename... Args>
+ inline RegT _newRegInternal(const Type& type, const char* s, Args&&... args) {
+#ifndef ASMJIT_NO_LOGGING
+ RegT reg(Globals::NoInit);
+ if (sizeof...(Args) == 0)
+ _newReg(&reg, type, s);
+ else
+ _newRegFmt(&reg, type, s, std::forward<Args>(args)...);
+ return reg;
+#else
+ DebugUtils::unused(std::forward<Args>(args)...);
+ RegT reg(Globals::NoInit);
+ _newReg(&reg, type, nullptr);
+ return reg;
+#endif
+ }
+ //! \endcond
+
+ template<typename RegT, typename... Args>
+ inline RegT newSimilarReg(const RegT& ref, Args&&... args) {
+ return _newRegInternal<RegT>(ref, std::forward<Args>(args)...);
+ }
+
+ template<typename... Args>
+ inline Reg newReg(TypeId typeId, Args&&... args) { return _newRegInternal<Reg>(typeId, std::forward<Args>(args)...); }
+
+ template<typename... Args>
+ inline Gp newGp(TypeId typeId, Args&&... args) { return _newRegInternal<Gp>(typeId, std::forward<Args>(args)...); }
+
+ template<typename... Args>
+ inline Vec newVec(TypeId typeId, Args&&... args) { return _newRegInternal<Vec>(typeId, std::forward<Args>(args)...); }
+
+ template<typename... Args>
+ inline Gp newInt32(Args&&... args) { return _newRegInternal<Gp>(TypeId::kInt32, std::forward<Args>(args)...); }
+ template<typename... Args>
+ inline Gp newUInt32(Args&&... args) { return _newRegInternal<Gp>(TypeId::kUInt32, std::forward<Args>(args)...); }
+
+ template<typename... Args>
+ inline Gp newInt64(Args&&... args) { return _newRegInternal<Gp>(TypeId::kInt64, std::forward<Args>(args)...); }
+ template<typename... Args>
+ inline Gp newUInt64(Args&&... args) { return _newRegInternal<Gp>(TypeId::kUInt64, std::forward<Args>(args)...); }
+
+ template<typename... Args>
+ inline Gp newIntPtr(Args&&... args) { return _newRegInternal<Gp>(TypeId::kIntPtr, std::forward<Args>(args)...); }
+ template<typename... Args>
+ inline Gp newUIntPtr(Args&&... args) { return _newRegInternal<Gp>(TypeId::kUIntPtr, std::forward<Args>(args)...); }
+
+ template<typename... Args>
+ inline Gp newGpw(Args&&... args) { return _newRegInternal<Gp>(TypeId::kUInt32, std::forward<Args>(args)...); }
+ template<typename... Args>
+ inline Gp newGpx(Args&&... args) { return _newRegInternal<Gp>(TypeId::kUInt64, std::forward<Args>(args)...); }
+ template<typename... Args>
+ inline Gp newGpz(Args&&... args) { return _newRegInternal<Gp>(TypeId::kUIntPtr, std::forward<Args>(args)...); }
+
+ template<typename... Args>
+ inline Vec newVecS(Args&&... args) { return _newRegInternal<Vec>(TypeId::kFloat32, std::forward<Args>(args)...); }
+
+ template<typename... Args>
+ inline Vec newVecD(Args&&... args) { return _newRegInternal<Vec>(TypeId::kFloat64, std::forward<Args>(args)...); }
+
+ template<typename... Args>
+ inline Vec newVecQ(Args&&... args) { return _newRegInternal<Vec>(TypeId::kUInt8x16, std::forward<Args>(args)...); }
+
+ //! \}
+
+ //! \name Stack
+ //! \{
+
+ //! Creates a new memory chunk allocated on the current function's stack.
+ inline Mem newStack(uint32_t size, uint32_t alignment, const char* name = nullptr) {
+ Mem m(Globals::NoInit);
+ _newStack(&m, size, alignment, name);
+ return m;
+ }
+
+ //! \}
+
+ //! \name Constants
+ //! \{
+
+ //! Put data to a constant-pool and get a memory reference to it.
+ inline Mem newConst(ConstPoolScope scope, const void* data, size_t size) {
+ Mem m(Globals::NoInit);
+ _newConst(&m, scope, data, size);
+ return m;
+ }
+
+ //! Put a BYTE `val` to a constant-pool (8 bits).
+ inline Mem newByteConst(ConstPoolScope scope, uint8_t val) noexcept { return newConst(scope, &val, 1); }
+ //! Put a HWORD `val` to a constant-pool (16 bits).
+ inline Mem newHWordConst(ConstPoolScope scope, uint16_t val) noexcept { return newConst(scope, &val, 2); }
+ //! Put a WORD `val` to a constant-pool (32 bits).
+ inline Mem newWordConst(ConstPoolScope scope, uint32_t val) noexcept { return newConst(scope, &val, 4); }
+ //! Put a DWORD `val` to a constant-pool (64 bits).
+ inline Mem newDWordConst(ConstPoolScope scope, uint64_t val) noexcept { return newConst(scope, &val, 8); }
+
+ //! Put a WORD `val` to a constant-pool.
+ inline Mem newInt16Const(ConstPoolScope scope, int16_t val) noexcept { return newConst(scope, &val, 2); }
+ //! Put a WORD `val` to a constant-pool.
+ inline Mem newUInt16Const(ConstPoolScope scope, uint16_t val) noexcept { return newConst(scope, &val, 2); }
+ //! Put a DWORD `val` to a constant-pool.
+ inline Mem newInt32Const(ConstPoolScope scope, int32_t val) noexcept { return newConst(scope, &val, 4); }
+ //! Put a DWORD `val` to a constant-pool.
+ inline Mem newUInt32Const(ConstPoolScope scope, uint32_t val) noexcept { return newConst(scope, &val, 4); }
+ //! Put a QWORD `val` to a constant-pool.
+ inline Mem newInt64Const(ConstPoolScope scope, int64_t val) noexcept { return newConst(scope, &val, 8); }
+ //! Put a QWORD `val` to a constant-pool.
+ inline Mem newUInt64Const(ConstPoolScope scope, uint64_t val) noexcept { return newConst(scope, &val, 8); }
+
+ //! Put a SP-FP `val` to a constant-pool.
+ inline Mem newFloatConst(ConstPoolScope scope, float val) noexcept { return newConst(scope, &val, 4); }
+ //! Put a DP-FP `val` to a constant-pool.
+ inline Mem newDoubleConst(ConstPoolScope scope, double val) noexcept { return newConst(scope, &val, 8); }
+
+ //! \}
+
+ //! \name Instruction Options
+ //! \{
+
+ //! Force the compiler to not follow the conditional or unconditional jump.
+ inline Compiler& unfollow() noexcept { _instOptions |= InstOptions::kUnfollow; return *this; }
+
+ //! \}
+
+ //! \name Function Call & Ret Intrinsics
+ //! \{
+
+ //! Invoke a function call without `target` type enforcement.
+ inline Error invoke_(InvokeNode** out, const Operand_& target, const FuncSignature& signature) {
+ return addInvokeNode(out, Inst::kIdBlr, target, signature);
+ }
+
+ //! Invoke a function call of the given `target` and `signature` and store the added node to `out`.
+ //!
+ //! Creates a new \ref InvokeNode, initializes all the necessary members to match the given function `signature`,
+ //! adds the node to the compiler, and stores its pointer to `out`. The operation is atomic, if anything fails
+ //! nullptr is stored in `out` and error code is returned.
+ inline Error invoke(InvokeNode** out, const Gp& target, const FuncSignature& signature) { return invoke_(out, target, signature); }
+ //! \overload
+ inline Error invoke(InvokeNode** out, const Mem& target, const FuncSignature& signature) { return invoke_(out, target, signature); }
+ //! \overload
+ inline Error invoke(InvokeNode** out, const Label& target, const FuncSignature& signature) { return invoke_(out, target, signature); }
+ //! \overload
+ inline Error invoke(InvokeNode** out, const Imm& target, const FuncSignature& signature) { return invoke_(out, target, signature); }
+ //! \overload
+ inline Error invoke(InvokeNode** out, uint64_t target, const FuncSignature& signature) { return invoke_(out, Imm(int64_t(target)), signature); }
+
+ //! Return.
+ inline Error ret() { return addRet(Operand(), Operand()); }
+ //! \overload
+ inline Error ret(const BaseReg& o0) { return addRet(o0, Operand()); }
+ //! \overload
+ inline Error ret(const BaseReg& o0, const BaseReg& o1) { return addRet(o0, o1); }
+
+ //! \}
+
+ //! \name Jump Tables Support
+ //! \{
+
+ using EmitterExplicitT<Compiler>::br;
+
+ //! Adds a jump to the given `target` with the provided jump `annotation`.
+ inline Error br(const BaseReg& target, JumpAnnotation* annotation) { return emitAnnotatedJump(Inst::kIdBr, target, annotation); }
+
+ //! \}
+
+ //! \name Events
+ //! \{
+
+ ASMJIT_API Error onAttach(CodeHolder* code) noexcept override;
+ ASMJIT_API Error onDetach(CodeHolder* code) noexcept override;
+
+ //! \}
+
+ //! \name Finalize
+ //! \{
+
+ ASMJIT_API Error finalize() override;
+
+ //! \}
+};
+
+//! \}
+
+ASMJIT_END_SUB_NAMESPACE
+
+#endif // !ASMJIT_NO_COMPILER
+#endif // ASMJIT_ARM_ARMCOMPILER_H_INCLUDED
diff --git a/3rdparty/asmjit/src/asmjit/arm/a64emithelper.cpp b/3rdparty/asmjit/src/asmjit/arm/a64emithelper.cpp
new file mode 100644
index 00000000000..2d8a5781cd6
--- /dev/null
+++ b/3rdparty/asmjit/src/asmjit/arm/a64emithelper.cpp
@@ -0,0 +1,464 @@
+// This file is part of AsmJit project <https://asmjit.com>
+//
+// See asmjit.h or LICENSE.md for license and copyright information
+// SPDX-License-Identifier: Zlib
+
+#include "../core/api-build_p.h"
+#if !defined(ASMJIT_NO_AARCH64)
+
+#include "../core/formatter.h"
+#include "../core/funcargscontext_p.h"
+#include "../core/string.h"
+#include "../core/support.h"
+#include "../core/type.h"
+#include "../arm/a64emithelper_p.h"
+#include "../arm/a64formatter_p.h"
+#include "../arm/a64instapi_p.h"
+#include "../arm/a64operand.h"
+
+ASMJIT_BEGIN_SUB_NAMESPACE(a64)
+
+// a64::EmitHelper - Emit Operations
+// =================================
+
+ASMJIT_FAVOR_SIZE Error EmitHelper::emitRegMove(
+ const Operand_& dst_,
+ const Operand_& src_, TypeId typeId, const char* comment) {
+
+ Emitter* emitter = _emitter->as<Emitter>();
+
+ // Invalid or abstract TypeIds are not allowed.
+ ASMJIT_ASSERT(TypeUtils::isValid(typeId) && !TypeUtils::isAbstract(typeId));
+
+ emitter->setInlineComment(comment);
+
+ if (dst_.isReg() && src_.isMem()) {
+ Reg dst(dst_.as<Reg>());
+ Mem src(src_.as<Mem>());
+
+ switch (typeId) {
+ case TypeId::kInt8:
+ case TypeId::kUInt8:
+ return emitter->ldrb(dst.as<Gp>(), src);
+
+ case TypeId::kInt16:
+ case TypeId::kUInt16:
+ return emitter->ldrh(dst.as<Gp>(), src);
+
+ case TypeId::kInt32:
+ case TypeId::kUInt32:
+ return emitter->ldr(dst.as<Gp>().w(), src);
+
+ case TypeId::kInt64:
+ case TypeId::kUInt64:
+ return emitter->ldr(dst.as<Gp>().x(), src);
+
+ default: {
+ if (TypeUtils::isFloat32(typeId) || TypeUtils::isVec32(typeId))
+ return emitter->ldr(dst.as<Vec>().s(), src);
+
+ if (TypeUtils::isFloat64(typeId) || TypeUtils::isVec64(typeId))
+ return emitter->ldr(dst.as<Vec>().d(), src);
+
+ if (TypeUtils::isVec128(typeId))
+ return emitter->ldr(dst.as<Vec>().q(), src);
+
+ break;
+ }
+ }
+ }
+
+ if (dst_.isMem() && src_.isReg()) {
+ Mem dst(dst_.as<Mem>());
+ Reg src(src_.as<Reg>());
+
+ switch (typeId) {
+ case TypeId::kInt8:
+ case TypeId::kUInt8:
+ return emitter->strb(src.as<Gp>(), dst);
+
+ case TypeId::kInt16:
+ case TypeId::kUInt16:
+ return emitter->strh(src.as<Gp>(), dst);
+
+ case TypeId::kInt32:
+ case TypeId::kUInt32:
+ return emitter->str(src.as<Gp>().w(), dst);
+
+ case TypeId::kInt64:
+ case TypeId::kUInt64:
+ return emitter->str(src.as<Gp>().x(), dst);
+
+ default: {
+ if (TypeUtils::isFloat32(typeId) || TypeUtils::isVec32(typeId))
+ return emitter->str(src.as<Vec>().s(), dst);
+
+ if (TypeUtils::isFloat64(typeId) || TypeUtils::isVec64(typeId))
+ return emitter->str(src.as<Vec>().d(), dst);
+
+ if (TypeUtils::isVec128(typeId))
+ return emitter->str(src.as<Vec>().q(), dst);
+
+ break;
+ }
+ }
+ }
+
+ if (dst_.isReg() && src_.isReg()) {
+ Reg dst(dst_.as<Reg>());
+ Reg src(src_.as<Reg>());
+
+ switch (typeId) {
+ case TypeId::kInt8:
+ case TypeId::kUInt8:
+ case TypeId::kInt16:
+ case TypeId::kUInt16:
+ case TypeId::kInt32:
+ case TypeId::kUInt32:
+ case TypeId::kInt64:
+ case TypeId::kUInt64:
+ return emitter->mov(src.as<Gp>().x(), dst.as<Gp>().x());
+
+ default: {
+ if (TypeUtils::isFloat32(typeId) || TypeUtils::isVec32(typeId))
+ return emitter->fmov(dst.as<Vec>().s(), src.as<Vec>().s());
+
+ if (TypeUtils::isFloat64(typeId) || TypeUtils::isVec64(typeId))
+ return emitter->mov(dst.as<Vec>().b8(), src.as<Vec>().b8());
+
+ if (TypeUtils::isVec128(typeId))
+ return emitter->mov(dst.as<Vec>().b16(), src.as<Vec>().b16());
+
+ break;
+ }
+ }
+ }
+
+ emitter->setInlineComment(nullptr);
+ return DebugUtils::errored(kErrorInvalidState);
+}
+
+Error EmitHelper::emitRegSwap(
+ const BaseReg& a,
+ const BaseReg& b, const char* comment) {
+
+ DebugUtils::unused(a, b, comment);
+ return DebugUtils::errored(kErrorInvalidState);
+}
+
+// TODO: [ARM] EmitArgMove is unfinished.
+Error EmitHelper::emitArgMove(
+ const BaseReg& dst_, TypeId dstTypeId,
+ const Operand_& src_, TypeId srcTypeId, const char* comment) {
+
+ // Deduce optional `dstTypeId`, which may be `TypeId::kVoid` in some cases.
+ if (dstTypeId == TypeId::kVoid) {
+ const ArchTraits& archTraits = ArchTraits::byArch(_emitter->arch());
+ dstTypeId = archTraits.regTypeToTypeId(dst_.type());
+ }
+
+ // Invalid or abstract TypeIds are not allowed.
+ ASMJIT_ASSERT(TypeUtils::isValid(dstTypeId) && !TypeUtils::isAbstract(dstTypeId));
+ ASMJIT_ASSERT(TypeUtils::isValid(srcTypeId) && !TypeUtils::isAbstract(srcTypeId));
+
+ Reg dst(dst_.as<Reg>());
+ Operand src(src_);
+
+ uint32_t dstSize = TypeUtils::sizeOf(dstTypeId);
+ uint32_t srcSize = TypeUtils::sizeOf(srcTypeId);
+
+ if (TypeUtils::isInt(dstTypeId)) {
+ if (TypeUtils::isInt(srcTypeId)) {
+ uint32_t x = dstSize == 8;
+
+ dst.setSignature(OperandSignature{x ? uint32_t(GpX::kSignature) : uint32_t(GpW::kSignature)});
+ _emitter->setInlineComment(comment);
+
+ if (src.isReg()) {
+ src.setSignature(dst.signature());
+ return _emitter->emit(Inst::kIdMov, dst, src);
+ }
+ else if (src.isMem()) {
+ InstId instId = Inst::kIdNone;
+ switch (srcTypeId) {
+ case TypeId::kInt8: instId = Inst::kIdLdrsb; break;
+ case TypeId::kUInt8: instId = Inst::kIdLdrb; break;
+ case TypeId::kInt16: instId = Inst::kIdLdrsh; break;
+ case TypeId::kUInt16: instId = Inst::kIdLdrh; break;
+ case TypeId::kInt32: instId = x ? Inst::kIdLdrsw : Inst::kIdLdr; break;
+ case TypeId::kUInt32: instId = Inst::kIdLdr; x = 0; break;
+ case TypeId::kInt64: instId = Inst::kIdLdr; break;
+ case TypeId::kUInt64: instId = Inst::kIdLdr; break;
+ default:
+ return DebugUtils::errored(kErrorInvalidState);
+ }
+ return _emitter->emit(instId, dst, src);
+ }
+ }
+ }
+
+ if (TypeUtils::isFloat(dstTypeId) || TypeUtils::isVec(dstTypeId)) {
+ if (TypeUtils::isFloat(srcTypeId) || TypeUtils::isVec(srcTypeId)) {
+ switch (srcSize) {
+ case 2: dst.as<Vec>().setSignature(OperandSignature{VecH::kSignature}); break;
+ case 4: dst.as<Vec>().setSignature(OperandSignature{VecS::kSignature}); break;
+ case 8: dst.as<Vec>().setSignature(OperandSignature{VecD::kSignature}); break;
+ case 16: dst.as<Vec>().setSignature(OperandSignature{VecV::kSignature}); break;
+ default:
+ return DebugUtils::errored(kErrorInvalidState);
+ }
+
+ _emitter->setInlineComment(comment);
+
+ if (src.isReg()) {
+ InstId instId = srcSize <= 4 ? Inst::kIdFmov_v : Inst::kIdMov_v;
+ src.setSignature(dst.signature());
+ return _emitter->emit(instId, dst, src);
+ }
+ else if (src.isMem()) {
+ return _emitter->emit(Inst::kIdLdr_v, dst, src);
+ }
+ }
+ }
+
+ return DebugUtils::errored(kErrorInvalidState);
+}
+
+// a64::EmitHelper - Emit Prolog & Epilog
+// ======================================
+
+struct LoadStoreInstructions {
+ InstId singleInstId;
+ InstId pairInstId;
+};
+
+struct PrologEpilogInfo {
+ struct RegPair {
+ uint8_t ids[2];
+ uint16_t offset;
+ };
+
+ struct GroupData {
+ RegPair pairs[16];
+ uint32_t pairCount;
+ };
+
+ Support::Array<GroupData, 2> groups;
+ uint32_t sizeTotal;
+
+ Error init(const FuncFrame& frame) noexcept {
+ uint32_t offset = 0;
+
+ for (RegGroup group : Support::EnumValues<RegGroup, RegGroup::kGp, RegGroup::kVec>{}) {
+ GroupData& data = groups[group];
+
+ uint32_t n = 0;
+ uint32_t pairCount = 0;
+ RegPair* pairs = data.pairs;
+
+ uint32_t slotSize = frame.saveRestoreRegSize(group);
+ uint32_t savedRegs = frame.savedRegs(group);
+
+ if (group == RegGroup::kGp && frame.hasPreservedFP()) {
+ // Must be at the beginning of the push/pop sequence.
+ ASMJIT_ASSERT(pairCount == 0);
+
+ pairs[0].offset = uint16_t(offset);
+ pairs[0].ids[0] = Gp::kIdFp;
+ pairs[0].ids[1] = Gp::kIdLr;
+ offset += slotSize * 2;
+ pairCount++;
+
+ savedRegs &= ~Support::bitMask(Gp::kIdFp, Gp::kIdLr);
+ }
+
+ Support::BitWordIterator<uint32_t> it(savedRegs);
+ while (it.hasNext()) {
+ pairs[pairCount].ids[n] = uint8_t(it.next());
+
+ if (++n == 2) {
+ pairs[pairCount].offset = uint16_t(offset);
+ offset += slotSize * 2;
+
+ n = 0;
+ pairCount++;
+ }
+ }
+
+ if (n == 1) {
+ pairs[pairCount].ids[1] = uint8_t(BaseReg::kIdBad);
+ pairs[pairCount].offset = uint16_t(offset);
+ offset += slotSize * 2;
+ pairCount++;
+ }
+
+ data.pairCount = pairCount;
+ }
+
+ sizeTotal = offset;
+ return kErrorOk;
+ }
+};
+
+ASMJIT_FAVOR_SIZE Error EmitHelper::emitProlog(const FuncFrame& frame) {
+ Emitter* emitter = _emitter->as<Emitter>();
+
+ PrologEpilogInfo pei;
+ ASMJIT_PROPAGATE(pei.init(frame));
+
+ static const Support::Array<Reg, 2> groupRegs = {{ x0, d0 }};
+ static const Support::Array<LoadStoreInstructions, 2> groupInsts = {{
+ { Inst::kIdStr , Inst::kIdStp },
+ { Inst::kIdStr_v, Inst::kIdStp_v }
+ }};
+
+ uint32_t adjustInitialOffset = pei.sizeTotal;
+
+ for (RegGroup group : Support::EnumValues<RegGroup, RegGroup::kGp, RegGroup::kVec>{}) {
+ const PrologEpilogInfo::GroupData& data = pei.groups[group];
+ uint32_t pairCount = data.pairCount;
+
+ Reg regs[2] = { groupRegs[group], groupRegs[group] };
+ Mem mem = ptr(sp);
+
+ const LoadStoreInstructions& insts = groupInsts[group];
+ for (uint32_t i = 0; i < pairCount; i++) {
+ const PrologEpilogInfo::RegPair& pair = data.pairs[i];
+
+ regs[0].setId(pair.ids[0]);
+ regs[1].setId(pair.ids[1]);
+ mem.setOffsetLo32(pair.offset);
+
+ if (pair.offset == 0 && adjustInitialOffset) {
+ mem.setOffset(-int(adjustInitialOffset));
+ mem.makePreIndex();
+ }
+
+ if (pair.ids[1] == BaseReg::kIdBad)
+ ASMJIT_PROPAGATE(emitter->emit(insts.singleInstId, regs[0], mem));
+ else
+ ASMJIT_PROPAGATE(emitter->emit(insts.pairInstId, regs[0], regs[1], mem));
+
+ mem.resetToFixedOffset();
+
+ if (i == 0 && frame.hasPreservedFP()) {
+ ASMJIT_PROPAGATE(emitter->mov(x29, sp));
+ }
+ }
+ }
+
+ if (frame.hasStackAdjustment()) {
+ uint32_t adj = frame.stackAdjustment();
+ if (adj <= 0xFFFu) {
+ ASMJIT_PROPAGATE(emitter->sub(sp, sp, adj));
+ }
+ else if (adj <= 0xFFFFFFu) {
+ // TODO: [ARM] Prolog - we must touch the pages otherwise it's undefined.
+ ASMJIT_PROPAGATE(emitter->sub(sp, sp, adj & 0x000FFFu));
+ ASMJIT_PROPAGATE(emitter->sub(sp, sp, adj & 0xFFF000u));
+ }
+ else {
+ return DebugUtils::errored(kErrorInvalidState);
+ }
+ }
+
+ return kErrorOk;
+}
+
+// TODO: [ARM] Emit epilog.
+ASMJIT_FAVOR_SIZE Error EmitHelper::emitEpilog(const FuncFrame& frame) {
+ Emitter* emitter = _emitter->as<Emitter>();
+
+ PrologEpilogInfo pei;
+ ASMJIT_PROPAGATE(pei.init(frame));
+
+ static const Support::Array<Reg, 2> groupRegs = {{ x0, d0 }};
+ static const Support::Array<LoadStoreInstructions, 2> groupInsts = {{
+ { Inst::kIdLdr , Inst::kIdLdp },
+ { Inst::kIdLdr_v, Inst::kIdLdp_v }
+ }};
+
+ uint32_t adjustInitialOffset = pei.sizeTotal;
+
+ if (frame.hasStackAdjustment()) {
+ uint32_t adj = frame.stackAdjustment();
+ if (adj <= 0xFFFu) {
+ ASMJIT_PROPAGATE(emitter->add(sp, sp, adj));
+ }
+ else if (adj <= 0xFFFFFFu) {
+ ASMJIT_PROPAGATE(emitter->add(sp, sp, adj & 0x000FFFu));
+ ASMJIT_PROPAGATE(emitter->add(sp, sp, adj & 0xFFF000u));
+ }
+ else {
+ return DebugUtils::errored(kErrorInvalidState);
+ }
+ }
+
+ for (int g = 1; g >= 0; g--) {
+ RegGroup group = RegGroup(g);
+ const PrologEpilogInfo::GroupData& data = pei.groups[group];
+ uint32_t pairCount = data.pairCount;
+
+ Reg regs[2] = { groupRegs[group], groupRegs[group] };
+ Mem mem = ptr(sp);
+
+ const LoadStoreInstructions& insts = groupInsts[group];
+
+ for (int i = int(pairCount) - 1; i >= 0; i--) {
+ const PrologEpilogInfo::RegPair& pair = data.pairs[i];
+
+ regs[0].setId(pair.ids[0]);
+ regs[1].setId(pair.ids[1]);
+ mem.setOffsetLo32(pair.offset);
+
+ if (pair.offset == 0 && adjustInitialOffset) {
+ mem.setOffset(int(adjustInitialOffset));
+ mem.makePostIndex();
+ }
+
+ if (pair.ids[1] == BaseReg::kIdBad)
+ ASMJIT_PROPAGATE(emitter->emit(insts.singleInstId, regs[0], mem));
+ else
+ ASMJIT_PROPAGATE(emitter->emit(insts.pairInstId, regs[0], regs[1], mem));
+
+ mem.resetToFixedOffset();
+ }
+ }
+
+ ASMJIT_PROPAGATE(emitter->ret(x30));
+
+ return kErrorOk;
+}
+
+static Error ASMJIT_CDECL Emitter_emitProlog(BaseEmitter* emitter, const FuncFrame& frame) {
+ EmitHelper emitHelper(emitter);
+ return emitHelper.emitProlog(frame);
+}
+
+static Error ASMJIT_CDECL Emitter_emitEpilog(BaseEmitter* emitter, const FuncFrame& frame) {
+ EmitHelper emitHelper(emitter);
+ return emitHelper.emitEpilog(frame);
+}
+
+static Error ASMJIT_CDECL Emitter_emitArgsAssignment(BaseEmitter* emitter, const FuncFrame& frame, const FuncArgsAssignment& args) {
+ EmitHelper emitHelper(emitter);
+ return emitHelper.emitArgsAssignment(frame, args);
+}
+
+void assignEmitterFuncs(BaseEmitter* emitter) {
+ emitter->_funcs.emitProlog = Emitter_emitProlog;
+ emitter->_funcs.emitEpilog = Emitter_emitEpilog;
+ emitter->_funcs.emitArgsAssignment = Emitter_emitArgsAssignment;
+
+#ifndef ASMJIT_NO_LOGGING
+ emitter->_funcs.formatInstruction = FormatterInternal::formatInstruction;
+#endif
+
+#ifndef ASMJIT_NO_VALIDATION
+ emitter->_funcs.validate = InstInternal::validate;
+#endif
+}
+
+ASMJIT_END_SUB_NAMESPACE
+
+#endif // !ASMJIT_NO_AARCH64
diff --git a/3rdparty/asmjit/src/asmjit/arm/a64emithelper_p.h b/3rdparty/asmjit/src/asmjit/arm/a64emithelper_p.h
new file mode 100644
index 00000000000..b1ba1a92960
--- /dev/null
+++ b/3rdparty/asmjit/src/asmjit/arm/a64emithelper_p.h
@@ -0,0 +1,50 @@
+// This file is part of AsmJit project <https://asmjit.com>
+//
+// See asmjit.h or LICENSE.md for license and copyright information
+// SPDX-License-Identifier: Zlib
+
+#ifndef ASMJIT_ARM_ARMEMITHELPER_P_H_INCLUDED
+#define ASMJIT_ARM_ARMEMITHELPER_P_H_INCLUDED
+
+#include "../core/api-config.h"
+
+#include "../core/emithelper_p.h"
+#include "../core/func.h"
+#include "../arm/a64emitter.h"
+#include "../arm/a64operand.h"
+
+ASMJIT_BEGIN_SUB_NAMESPACE(a64)
+
+//! \cond INTERNAL
+//! \addtogroup asmjit_a64
+//! \{
+
+class EmitHelper : public BaseEmitHelper {
+public:
+ inline explicit EmitHelper(BaseEmitter* emitter = nullptr) noexcept
+ : BaseEmitHelper(emitter) {}
+
+ Error emitRegMove(
+ const Operand_& dst_,
+ const Operand_& src_, TypeId typeId, const char* comment = nullptr) override;
+
+ Error emitRegSwap(
+ const BaseReg& a,
+ const BaseReg& b, const char* comment = nullptr) override;
+
+ Error emitArgMove(
+ const BaseReg& dst_, TypeId dstTypeId,
+ const Operand_& src_, TypeId srcTypeId, const char* comment = nullptr) override;
+
+ Error emitProlog(const FuncFrame& frame);
+ Error emitEpilog(const FuncFrame& frame);
+};
+
+void assignEmitterFuncs(BaseEmitter* emitter);
+
+//! \}
+//! \endcond
+
+ASMJIT_END_SUB_NAMESPACE
+
+#endif // ASMJIT_ARM_ARMEMITHELPER_P_H_INCLUDED
diff --git a/3rdparty/asmjit/src/asmjit/arm/a64emitter.h b/3rdparty/asmjit/src/asmjit/arm/a64emitter.h
new file mode 100644
index 00000000000..54354eaca84
--- /dev/null
+++ b/3rdparty/asmjit/src/asmjit/arm/a64emitter.h
@@ -0,0 +1,1228 @@
+// This file is part of AsmJit project <https://asmjit.com>
+//
+// See asmjit.h or LICENSE.md for license and copyright information
+// SPDX-License-Identifier: Zlib
+
+#ifndef ASMJIT_ARM_A64EMITTER_H_INCLUDED
+#define ASMJIT_ARM_A64EMITTER_H_INCLUDED
+
+#include "../core/emitter.h"
+#include "../core/support.h"
+#include "../arm/a64instdb.h"
+#include "../arm/a64operand.h"
+
+ASMJIT_BEGIN_SUB_NAMESPACE(a64)
+
+#define ASMJIT_INST_0x(NAME, ID) \
+ inline Error NAME() { return _emitter()->_emitI(Inst::kId##ID); }
+
+#define ASMJIT_INST_1x(NAME, ID, T0) \
+ inline Error NAME(const T0& o0) { return _emitter()->_emitI(Inst::kId##ID, o0); }
+
+#define ASMJIT_INST_2x(NAME, ID, T0, T1) \
+ inline Error NAME(const T0& o0, const T1& o1) { return _emitter()->_emitI(Inst::kId##ID, o0, o1); }
+
+#define ASMJIT_INST_3x(NAME, ID, T0, T1, T2) \
+ inline Error NAME(const T0& o0, const T1& o1, const T2& o2) { return _emitter()->_emitI(Inst::kId##ID, o0, o1, o2); }
+
+#define ASMJIT_INST_4x(NAME, ID, T0, T1, T2, T3) \
+ inline Error NAME(const T0& o0, const T1& o1, const T2& o2, const T3& o3) { return _emitter()->_emitI(Inst::kId##ID, o0, o1, o2, o3); }
+
+#define ASMJIT_INST_5x(NAME, ID, T0, T1, T2, T3, T4) \
+ inline Error NAME(const T0& o0, const T1& o1, const T2& o2, const T3& o3, const T4& o4) { return _emitter()->_emitI(Inst::kId##ID, o0, o1, o2, o3, o4); }
+
+#define ASMJIT_INST_6x(NAME, ID, T0, T1, T2, T3, T4, T5) \
+ inline Error NAME(const T0& o0, const T1& o1, const T2& o2, const T3& o3, const T4& o4, const T5& o5) { return _emitter()->_emitI(Inst::kId##ID, o0, o1, o2, o3, o4, o5); }
+
+#define ASMJIT_INST_1cc(NAME, ID, T0) \
+ inline Error NAME(const T0& o0) { return _emitter()->_emitI(Inst::kId##ID, o0); } \
+ \
+ inline Error NAME(CondCode cc, const T0& o0) { return _emitter()->_emitI(BaseInst::composeARMInstId(Inst::kId##ID, cc), o0); } \
+ \
+ inline Error NAME##_eq(const T0& o0) { return _emitter()->_emitI(BaseInst::composeARMInstId(Inst::kId##ID, CondCode::kEQ), o0); } \
+ inline Error NAME##_ne(const T0& o0) { return _emitter()->_emitI(BaseInst::composeARMInstId(Inst::kId##ID, CondCode::kNE), o0); } \
+ inline Error NAME##_cs(const T0& o0) { return _emitter()->_emitI(BaseInst::composeARMInstId(Inst::kId##ID, CondCode::kCS), o0); } \
+ inline Error NAME##_hs(const T0& o0) { return _emitter()->_emitI(BaseInst::composeARMInstId(Inst::kId##ID, CondCode::kHS), o0); } \
+ inline Error NAME##_cc(const T0& o0) { return _emitter()->_emitI(BaseInst::composeARMInstId(Inst::kId##ID, CondCode::kCC), o0); } \
+ inline Error NAME##_lo(const T0& o0) { return _emitter()->_emitI(BaseInst::composeARMInstId(Inst::kId##ID, CondCode::kLO), o0); } \
+ inline Error NAME##_mi(const T0& o0) { return _emitter()->_emitI(BaseInst::composeARMInstId(Inst::kId##ID, CondCode::kMI), o0); } \
+ inline Error NAME##_pl(const T0& o0) { return _emitter()->_emitI(BaseInst::composeARMInstId(Inst::kId##ID, CondCode::kPL), o0); } \
+ inline Error NAME##_vs(const T0& o0) { return _emitter()->_emitI(BaseInst::composeARMInstId(Inst::kId##ID, CondCode::kVS), o0); } \
+ inline Error NAME##_vc(const T0& o0) { return _emitter()->_emitI(BaseInst::composeARMInstId(Inst::kId##ID, CondCode::kVC), o0); } \
+ inline Error NAME##_hi(const T0& o0) { return _emitter()->_emitI(BaseInst::composeARMInstId(Inst::kId##ID, CondCode::kHI), o0); } \
+ inline Error NAME##_ls(const T0& o0) { return _emitter()->_emitI(BaseInst::composeARMInstId(Inst::kId##ID, CondCode::kLS), o0); } \
+ inline Error NAME##_ge(const T0& o0) { return _emitter()->_emitI(BaseInst::composeARMInstId(Inst::kId##ID, CondCode::kGE), o0); } \
+ inline Error NAME##_lt(const T0& o0) { return _emitter()->_emitI(BaseInst::composeARMInstId(Inst::kId##ID, CondCode::kLT), o0); } \
+ inline Error NAME##_gt(const T0& o0) { return _emitter()->_emitI(BaseInst::composeARMInstId(Inst::kId##ID, CondCode::kGT), o0); } \
+ inline Error NAME##_le(const T0& o0) { return _emitter()->_emitI(BaseInst::composeARMInstId(Inst::kId##ID, CondCode::kLE), o0); } \
+ inline Error NAME##_al(const T0& o0) { return _emitter()->_emitI(BaseInst::composeARMInstId(Inst::kId##ID, CondCode::kAL), o0); }
+
+//! \addtogroup asmjit_a64
+//! \{
+
+//! ARM emitter.
+//!
+//! NOTE: This class cannot be instantiated, you can only cast to it and use it as emitter that emits to either
+//! \ref Assembler, \ref Builder, or \ref Compiler (use withcaution with \ref Compiler as it expects virtual
+//! registers to be used).
+template<typename This>
+struct EmitterExplicitT {
+ //! \cond
+
+ // These two are unfortunately reported by the sanitizer. We know what we do, however, the sanitizer doesn't.
+ // I have tried to use reinterpret_cast instead, but that would generate bad code when compiled by MSC.
+ ASMJIT_ATTRIBUTE_NO_SANITIZE_UNDEF inline This* _emitter() noexcept { return static_cast<This*>(this); }
+ ASMJIT_ATTRIBUTE_NO_SANITIZE_UNDEF inline const This* _emitter() const noexcept { return static_cast<const This*>(this); }
+
+ //! \endcond
+
+ // --------------------------------------------------------------------------
+ // [Options]
+ // --------------------------------------------------------------------------
+
+protected:
+ inline This& _addInstOptions(InstOptions options) noexcept {
+ static_cast<This*>(this)->addInstOptions(options);
+ return *static_cast<This*>(this);
+ }
+
+public:
+ //! \name General Purpose Instructions
+ //! \{
+
+ ASMJIT_INST_3x(adc, Adc, Gp, Gp, Gp)
+ ASMJIT_INST_3x(adcs, Adcs, Gp, Gp, Gp)
+
+ ASMJIT_INST_3x(add, Add, Gp, Gp, Gp)
+ ASMJIT_INST_4x(add, Add, Gp, Gp, Gp, Imm)
+ ASMJIT_INST_3x(add, Add, Gp, Gp, Imm)
+ ASMJIT_INST_4x(add, Add, Gp, Gp, Imm, Imm)
+ ASMJIT_INST_3x(adds, Adds, Gp, Gp, Gp)
+ ASMJIT_INST_3x(adds, Adds, Gp, Gp, Imm)
+ ASMJIT_INST_4x(adds, Adds, Gp, Gp, Gp, Imm)
+ ASMJIT_INST_4x(adds, Adds, Gp, Gp, Imm, Imm)
+
+ ASMJIT_INST_2x(adr, Adr, Gp, Imm)
+ ASMJIT_INST_2x(adr, Adr, Gp, Label)
+ ASMJIT_INST_2x(adrp, Adrp, Gp, Imm)
+ ASMJIT_INST_2x(adrp, Adrp, Gp, Label)
+
+ ASMJIT_INST_3x(and_, And, Gp, Gp, Imm)
+ ASMJIT_INST_3x(and_, And, Gp, Gp, Gp)
+ ASMJIT_INST_4x(and_, And, Gp, Gp, Gp, Imm)
+ ASMJIT_INST_3x(ands, Ands, Gp, Gp, Imm)
+ ASMJIT_INST_3x(ands, Ands, Gp, Gp, Gp)
+ ASMJIT_INST_4x(ands, Ands, Gp, Gp, Gp, Imm)
+
+ ASMJIT_INST_3x(asr, Asr, Gp, Gp, Imm)
+ ASMJIT_INST_3x(asr, Asr, Gp, Gp, Gp)
+ ASMJIT_INST_3x(asrv, Asrv, Gp, Gp, Gp)
+
+ ASMJIT_INST_2x(at, At, Imm, Gp)
+
+ ASMJIT_INST_3x(bfc, Bfc, Gp, Imm, Imm)
+ ASMJIT_INST_4x(bfi, Bfi, Gp, Gp, Imm, Imm)
+ ASMJIT_INST_4x(bfm, Bfm, Gp, Gp, Imm, Imm)
+ ASMJIT_INST_4x(bfxil, Bfxil, Gp, Gp, Imm, Imm)
+
+ ASMJIT_INST_3x(bic, Bic, Gp, Gp, Imm);
+ ASMJIT_INST_3x(bic, Bic, Gp, Gp, Gp);
+ ASMJIT_INST_4x(bic, Bic, Gp, Gp, Gp, Imm);
+ ASMJIT_INST_3x(bics, Bics, Gp, Gp, Imm);
+ ASMJIT_INST_3x(bics, Bics, Gp, Gp, Gp);
+ ASMJIT_INST_4x(bics, Bics, Gp, Gp, Gp, Imm);
+
+ ASMJIT_INST_1x(brk, Brk, Imm)
+
+ ASMJIT_INST_4x(ccmn, Ccmn, Gp, Gp, Imm, Imm);
+ ASMJIT_INST_4x(ccmn, Ccmn, Gp, Imm, Imm, Imm);
+ ASMJIT_INST_4x(ccmp, Ccmp, Gp, Gp, Imm, Imm);
+ ASMJIT_INST_4x(ccmp, Ccmp, Gp, Imm, Imm, Imm);
+
+ ASMJIT_INST_3x(cinc, Cinc, Gp, Gp, Imm);
+ ASMJIT_INST_3x(cinv, Cinv, Gp, Gp, Imm);
+
+ ASMJIT_INST_1x(clrex, Clrex, Imm)
+
+ ASMJIT_INST_2x(cls, Cls, Gp, Gp)
+ ASMJIT_INST_2x(clz, Clz, Gp, Gp)
+
+ ASMJIT_INST_2x(cmn, Cmn, Gp, Gp)
+ ASMJIT_INST_3x(cmn, Cmn, Gp, Gp, Imm)
+ ASMJIT_INST_2x(cmn, Cmn, Gp, Imm)
+ ASMJIT_INST_3x(cmn, Cmn, Gp, Imm, Imm)
+ ASMJIT_INST_2x(cmp, Cmp, Gp, Gp)
+ ASMJIT_INST_3x(cmp, Cmp, Gp, Gp, Imm)
+ ASMJIT_INST_2x(cmp, Cmp, Gp, Imm)
+ ASMJIT_INST_3x(cmp, Cmp, Gp, Imm, Imm)
+
+ ASMJIT_INST_3x(cneg, Cneg, Gp, Gp, Imm);
+
+ ASMJIT_INST_4x(csel, Csel, Gp, Gp, Gp, Imm);
+ ASMJIT_INST_2x(cset, Cset, Gp, Imm);
+ ASMJIT_INST_2x(csetm, Csetm, Gp, Imm);
+
+ ASMJIT_INST_4x(csinc, Csinc, Gp, Gp, Gp, Imm);
+ ASMJIT_INST_4x(csinv, Csinv, Gp, Gp, Gp, Imm);
+ ASMJIT_INST_4x(csneg, Csneg, Gp, Gp, Gp, Imm);
+
+ ASMJIT_INST_2x(dc, Dc, Imm, Gp)
+ ASMJIT_INST_1x(dmb, Dmb, Imm)
+ ASMJIT_INST_1x(dsb, Dsb, Imm)
+ ASMJIT_INST_0x(drps, Drps)
+
+ ASMJIT_INST_3x(eon, Eon, Gp, Gp, Gp)
+ ASMJIT_INST_4x(eon, Eon, Gp, Gp, Gp, Imm)
+
+ ASMJIT_INST_3x(eor, Eor, Gp, Gp, Imm)
+ ASMJIT_INST_3x(eor, Eor, Gp, Gp, Gp)
+ ASMJIT_INST_4x(eor, Eor, Gp, Gp, Gp, Imm)
+
+ ASMJIT_INST_0x(eret, Eret)
+ ASMJIT_INST_0x(esb, Esb)
+
+ ASMJIT_INST_4x(extr, Extr, Gp, Gp, Gp, Imm)
+
+ ASMJIT_INST_1x(hlt, Hlt, Imm)
+ ASMJIT_INST_1x(hvc, Hvc, Imm)
+ ASMJIT_INST_2x(ic, Ic, Imm, Gp)
+ ASMJIT_INST_1x(isb, Isb, Imm)
+
+ ASMJIT_INST_3x(lsl, Lsl, Gp, Gp, Imm)
+ ASMJIT_INST_3x(lsl, Lsl, Gp, Gp, Gp)
+ ASMJIT_INST_3x(lslv, Lslv, Gp, Gp, Gp)
+
+ ASMJIT_INST_3x(lsr, Lsr, Gp, Gp, Imm)
+ ASMJIT_INST_3x(lsr, Lsr, Gp, Gp, Gp)
+ ASMJIT_INST_3x(lsrv, Lsrv, Gp, Gp, Gp)
+
+ ASMJIT_INST_4x(madd, Madd, Gp, Gp, Gp, Gp)
+ ASMJIT_INST_3x(mneg, Mneg, Gp, Gp, Gp)
+
+ ASMJIT_INST_2x(mov, Mov, Gp, Gp)
+ ASMJIT_INST_2x(mov, Mov, Gp, Imm)
+ ASMJIT_INST_2x(movk, Movk, Gp, Imm)
+ ASMJIT_INST_3x(movk, Movk, Gp, Imm, Imm)
+ ASMJIT_INST_2x(movn, Movn, Gp, Imm)
+ ASMJIT_INST_3x(movn, Movn, Gp, Imm, Imm)
+ ASMJIT_INST_2x(movz, Movz, Gp, Imm)
+ ASMJIT_INST_3x(movz, Movz, Gp, Imm, Imm)
+
+ ASMJIT_INST_2x(mrs, Mrs, Gp, Imm)
+ ASMJIT_INST_2x(msr, Msr, Imm, Gp)
+ ASMJIT_INST_2x(msr, Msr, Imm, Imm)
+
+ ASMJIT_INST_4x(msub, Msub, Gp, Gp, Gp, Gp)
+ ASMJIT_INST_3x(mul, Mul, Gp, Gp, Gp)
+
+ ASMJIT_INST_2x(mvn, Mvn, Gp, Gp)
+ ASMJIT_INST_3x(mvn, Mvn, Gp, Gp, Imm)
+
+ ASMJIT_INST_2x(neg, Neg, Gp, Gp)
+ ASMJIT_INST_3x(neg, Neg, Gp, Gp, Imm)
+ ASMJIT_INST_2x(negs, Negs, Gp, Gp)
+ ASMJIT_INST_3x(negs, Negs, Gp, Gp, Imm)
+
+ ASMJIT_INST_2x(ngc, Ngc, Gp, Gp)
+ ASMJIT_INST_2x(ngcs, Ngcs, Gp, Gp)
+
+ ASMJIT_INST_3x(orn, Orn, Gp, Gp, Gp)
+ ASMJIT_INST_4x(orn, Orn, Gp, Gp, Gp, Imm)
+
+ ASMJIT_INST_3x(orr, Orr, Gp, Gp, Imm)
+ ASMJIT_INST_3x(orr, Orr, Gp, Gp, Gp)
+ ASMJIT_INST_4x(orr, Orr, Gp, Gp, Gp, Imm)
+
+ ASMJIT_INST_2x(rbit, Rbit, Gp, Gp)
+ ASMJIT_INST_1x(ret, Ret, Gp)
+
+ ASMJIT_INST_2x(rev, Rev, Gp, Gp)
+ ASMJIT_INST_2x(rev16, Rev16, Gp, Gp)
+ ASMJIT_INST_2x(rev32, Rev32, Gp, Gp)
+ ASMJIT_INST_2x(rev64, Rev64, Gp, Gp)
+
+ ASMJIT_INST_3x(ror, Ror, Gp, Gp, Imm)
+ ASMJIT_INST_3x(ror, Ror, Gp, Gp, Gp)
+ ASMJIT_INST_3x(rorv, Rorv, Gp, Gp, Gp)
+
+ ASMJIT_INST_3x(sbc, Sbc, Gp, Gp, Gp)
+ ASMJIT_INST_3x(sbcs, Sbcs, Gp, Gp, Gp)
+
+ ASMJIT_INST_4x(sbfiz, Sbfiz, Gp, Gp, Imm, Imm)
+ ASMJIT_INST_4x(sbfm, Sbfm, Gp, Gp, Imm, Imm)
+ ASMJIT_INST_4x(sbfx, Sbfx, Gp, Gp, Imm, Imm)
+
+ ASMJIT_INST_3x(sdiv, Sdiv, Gp, Gp, Gp)
+
+ ASMJIT_INST_4x(smaddl, Smaddl, Gp, Gp, Gp, Gp)
+ ASMJIT_INST_1x(smc, Smc, Imm)
+ ASMJIT_INST_3x(smnegl, Smnegl, Gp, Gp, Gp)
+ ASMJIT_INST_4x(smsubl, Smsubl, Gp, Gp, Gp, Gp)
+ ASMJIT_INST_3x(smulh, Smulh, Gp, Gp, Gp)
+ ASMJIT_INST_3x(smull, Smull, Gp, Gp, Gp)
+
+ ASMJIT_INST_3x(sub, Sub, Gp, Gp, Gp)
+ ASMJIT_INST_4x(sub, Sub, Gp, Gp, Gp, Imm)
+ ASMJIT_INST_3x(sub, Sub, Gp, Gp, Imm)
+ ASMJIT_INST_4x(sub, Sub, Gp, Gp, Imm, Imm)
+ ASMJIT_INST_3x(subs, Subs, Gp, Gp, Gp)
+ ASMJIT_INST_4x(subs, Subs, Gp, Gp, Gp, Imm)
+ ASMJIT_INST_3x(subs, Subs, Gp, Gp, Imm)
+ ASMJIT_INST_4x(subs, Subs, Gp, Gp, Imm, Imm)
+
+ ASMJIT_INST_1x(svc, Svc, Imm)
+
+ ASMJIT_INST_2x(sxtb, Sxtb, Gp, Gp)
+ ASMJIT_INST_2x(sxth, Sxth, Gp, Gp)
+ ASMJIT_INST_2x(sxtw, Sxtw, Gp, Gp)
+
+ ASMJIT_INST_4x(sys, Sys, Imm, Imm, Imm, Imm)
+ ASMJIT_INST_5x(sys, Sys, Imm, Imm, Imm, Imm, Gp)
+
+ ASMJIT_INST_2x(tlbi, Tlbi, Imm, Gp)
+ ASMJIT_INST_2x(tst, Tst, Gp, Imm)
+ ASMJIT_INST_2x(tst, Tst, Gp, Gp)
+ ASMJIT_INST_3x(tst, Tst, Gp, Gp, Imm)
+
+ ASMJIT_INST_3x(udiv, Udiv, Gp, Gp, Gp)
+
+ ASMJIT_INST_4x(ubfiz, Ubfiz, Gp, Gp, Imm, Imm)
+ ASMJIT_INST_4x(ubfm, Ubfm, Gp, Gp, Imm, Imm)
+ ASMJIT_INST_4x(ubfx, Ubfx, Gp, Gp, Imm, Imm)
+
+ ASMJIT_INST_4x(umaddl, Umaddl, Gp, Gp, Gp, Gp)
+ ASMJIT_INST_3x(umnegl, Umnegl, Gp, Gp, Gp)
+ ASMJIT_INST_4x(umsubl, Umsubl, Gp, Gp, Gp, Gp)
+ ASMJIT_INST_3x(umull, Umull, Gp, Gp, Gp)
+ ASMJIT_INST_3x(umulh, Umulh, Gp, Gp, Gp)
+
+ ASMJIT_INST_2x(uxtb, Uxtb, Gp, Gp)
+ ASMJIT_INST_2x(uxth, Uxth, Gp, Gp)
+
+ ASMJIT_INST_0x(csdb, Csdb)
+ ASMJIT_INST_1x(dcps1, Dcps1, Imm)
+ ASMJIT_INST_1x(dcps2, Dcps2, Imm)
+ ASMJIT_INST_1x(dcps3, Dcps3, Imm)
+ ASMJIT_INST_0x(dgh, Dgh)
+ ASMJIT_INST_0x(pssbb, Pssbb)
+ ASMJIT_INST_0x(ssbb, Ssbb)
+ ASMJIT_INST_1x(udf, Udf, Imm)
+ ASMJIT_INST_1x(setf8, Setf8, Gp)
+ ASMJIT_INST_1x(setf16, Setf16, Gp)
+
+ //! \}
+
+ //! \name ARMv8.4 Instructions
+ //! \{
+
+ ASMJIT_INST_0x(cfinv, Cfinv)
+
+ //! \}
+
+ //! \name ARMv8.5 Instructions
+ //! \{
+
+ ASMJIT_INST_0x(axflag, Axflag)
+ ASMJIT_INST_0x(xaflag, Xaflag)
+
+ //! \}
+
+ //! \name Branch Instructions
+ //! \{
+
+ ASMJIT_INST_1cc(b, B, Imm)
+ ASMJIT_INST_1cc(b, B, Label)
+ ASMJIT_INST_1x(bl, Bl, Imm)
+ ASMJIT_INST_1x(bl, Bl, Label)
+ ASMJIT_INST_1x(blr, Blr, Gp)
+ ASMJIT_INST_1x(br, Br, Gp)
+ ASMJIT_INST_2x(cbz, Cbz, Gp, Imm)
+ ASMJIT_INST_2x(cbz, Cbz, Gp, Label)
+ ASMJIT_INST_2x(cbnz, Cbnz, Gp, Imm)
+ ASMJIT_INST_2x(cbnz, Cbnz, Gp, Label)
+ ASMJIT_INST_3x(tbnz, Tbnz, Gp, Imm, Imm)
+ ASMJIT_INST_3x(tbnz, Tbnz, Gp, Imm, Label)
+ ASMJIT_INST_3x(tbz, Tbz, Gp, Imm, Imm)
+ ASMJIT_INST_3x(tbz, Tbz, Gp, Imm, Label)
+
+ //! \}
+
+ //! \name Load & Store Instructions
+ //! \{
+
+ ASMJIT_INST_3x(cas, Cas, Gp, Gp, Mem)
+ ASMJIT_INST_3x(casa, Casa, Gp, Gp, Mem)
+ ASMJIT_INST_3x(casab, Casab, Gp, Gp, Mem)
+ ASMJIT_INST_3x(casah, Casah, Gp, Gp, Mem)
+ ASMJIT_INST_3x(casal, Casal, Gp, Gp, Mem)
+ ASMJIT_INST_3x(casalb, Casalb, Gp, Gp, Mem)
+ ASMJIT_INST_3x(casalh, Casalh, Gp, Gp, Mem)
+ ASMJIT_INST_3x(casb, Casb, Gp, Gp, Mem)
+ ASMJIT_INST_3x(cash, Cash, Gp, Gp, Mem)
+ ASMJIT_INST_3x(casl, Casl, Gp, Gp, Mem)
+ ASMJIT_INST_3x(caslb, Caslb, Gp, Gp, Mem)
+ ASMJIT_INST_3x(caslh, Caslh, Gp, Gp, Mem)
+
+ ASMJIT_INST_5x(casp, Casp, Gp, Gp, Gp, Gp, Mem)
+ ASMJIT_INST_5x(caspa, Caspa, Gp, Gp, Gp, Gp, Mem)
+ ASMJIT_INST_5x(caspal, Caspal, Gp, Gp, Gp, Gp, Mem)
+ ASMJIT_INST_5x(caspl, Caspl, Gp, Gp, Gp, Gp, Mem)
+
+ ASMJIT_INST_3x(ldadd, Ldadd, Gp, Gp, Mem)
+ ASMJIT_INST_3x(ldadda, Ldadda, Gp, Gp, Mem)
+ ASMJIT_INST_3x(ldaddab, Ldaddab, Gp, Gp, Mem)
+ ASMJIT_INST_3x(ldaddah, Ldaddah, Gp, Gp, Mem)
+ ASMJIT_INST_3x(ldaddal, Ldaddal, Gp, Gp, Mem)
+ ASMJIT_INST_3x(ldaddalb, Ldaddalb, Gp, Gp, Mem)
+ ASMJIT_INST_3x(ldaddalh, Ldaddalh, Gp, Gp, Mem)
+ ASMJIT_INST_3x(ldaddb, Ldaddb, Gp, Gp, Mem)
+ ASMJIT_INST_3x(ldaddh, Ldaddh, Gp, Gp, Mem)
+ ASMJIT_INST_3x(ldaddl, Ldaddl, Gp, Gp, Mem)
+ ASMJIT_INST_3x(ldaddlb, Ldaddlb, Gp, Gp, Mem)
+ ASMJIT_INST_3x(ldaddlh, Ldaddlh, Gp, Gp, Mem)
+
+ ASMJIT_INST_2x(ldar, Ldar, Gp, Mem)
+ ASMJIT_INST_2x(ldarb, Ldarb, Gp, Mem)
+ ASMJIT_INST_2x(ldarh, Ldarh, Gp, Mem)
+
+ ASMJIT_INST_2x(ldaxr, Ldaxr, Gp, Mem)
+ ASMJIT_INST_2x(ldaxrb, Ldaxrb, Gp, Mem)
+ ASMJIT_INST_2x(ldaxrh, Ldaxrh, Gp, Mem)
+
+ ASMJIT_INST_3x(ldclr, Ldclr, Gp, Gp, Mem)
+ ASMJIT_INST_3x(ldclra, Ldclra, Gp, Gp, Mem)
+ ASMJIT_INST_3x(ldclrab, Ldclrab, Gp, Gp, Mem)
+ ASMJIT_INST_3x(ldclrah, Ldclrah, Gp, Gp, Mem)
+ ASMJIT_INST_3x(ldclral, Ldclral, Gp, Gp, Mem)
+ ASMJIT_INST_3x(ldclralb, Ldclralb, Gp, Gp, Mem)
+ ASMJIT_INST_3x(ldclralh, Ldclralh, Gp, Gp, Mem)
+ ASMJIT_INST_3x(ldclrb, Ldclrb, Gp, Gp, Mem)
+ ASMJIT_INST_3x(ldclrh, Ldclrh, Gp, Gp, Mem)
+ ASMJIT_INST_3x(ldclrl, Ldclrl, Gp, Gp, Mem)
+ ASMJIT_INST_3x(ldclrlb, Ldclrlb, Gp, Gp, Mem)
+ ASMJIT_INST_3x(ldclrlh, Ldclrlh, Gp, Gp, Mem)
+
+ ASMJIT_INST_3x(ldeor, Ldeor, Gp, Gp, Mem)
+ ASMJIT_INST_3x(ldeora, Ldeora, Gp, Gp, Mem)
+ ASMJIT_INST_3x(ldeorab, Ldeorab, Gp, Gp, Mem)
+ ASMJIT_INST_3x(ldeorah, Ldeorah, Gp, Gp, Mem)
+ ASMJIT_INST_3x(ldeoral, Ldeoral, Gp, Gp, Mem)
+ ASMJIT_INST_3x(ldeoralb, Ldeoralb, Gp, Gp, Mem)
+ ASMJIT_INST_3x(ldeoralh, Ldeoralh, Gp, Gp, Mem)
+ ASMJIT_INST_3x(ldeorb, Ldeorb, Gp, Gp, Mem)
+ ASMJIT_INST_3x(ldeorh, Ldeorh, Gp, Gp, Mem)
+ ASMJIT_INST_3x(ldeorl, Ldeorl, Gp, Gp, Mem)
+ ASMJIT_INST_3x(ldeorlb, Ldeorlb, Gp, Gp, Mem)
+ ASMJIT_INST_3x(ldeorlh, Ldeorlh, Gp, Gp, Mem)
+
+ ASMJIT_INST_2x(ldlar, Ldlar, Gp, Mem)
+ ASMJIT_INST_2x(ldlarb, Ldlarb, Gp, Mem)
+ ASMJIT_INST_2x(ldlarh, Ldlarh, Gp, Mem)
+
+ ASMJIT_INST_3x(ldnp, Ldnp, Gp, Gp, Mem)
+
+ ASMJIT_INST_3x(ldp, Ldp, Gp, Gp, Mem)
+ ASMJIT_INST_3x(ldpsw, Ldpsw, Gp, Gp, Mem)
+
+ ASMJIT_INST_2x(ldr, Ldr, Gp, Mem)
+ ASMJIT_INST_2x(ldrb, Ldrb, Gp, Mem)
+ ASMJIT_INST_2x(ldrh, Ldrh, Gp, Mem)
+ ASMJIT_INST_2x(ldrsb, Ldrsb, Gp, Mem)
+ ASMJIT_INST_2x(ldrsh, Ldrsh, Gp, Mem)
+ ASMJIT_INST_2x(ldrsw, Ldrsw, Gp, Mem)
+
+ ASMJIT_INST_3x(ldset, Ldset, Gp, Gp, Mem)
+ ASMJIT_INST_3x(ldseta, Ldseta, Gp, Gp, Mem)
+ ASMJIT_INST_3x(ldsetab, Ldsetab, Gp, Gp, Mem)
+ ASMJIT_INST_3x(ldsetah, Ldsetah, Gp, Gp, Mem)
+ ASMJIT_INST_3x(ldsetal, Ldsetal, Gp, Gp, Mem)
+ ASMJIT_INST_3x(ldsetalb, Ldsetalb, Gp, Gp, Mem)
+ ASMJIT_INST_3x(ldsetalh, Ldsetalh, Gp, Gp, Mem)
+ ASMJIT_INST_3x(ldsetb, Ldsetb, Gp, Gp, Mem)
+ ASMJIT_INST_3x(ldseth, Ldseth, Gp, Gp, Mem)
+ ASMJIT_INST_3x(ldsetl, Ldsetl, Gp, Gp, Mem)
+ ASMJIT_INST_3x(ldsetlb, Ldsetlb, Gp, Gp, Mem)
+ ASMJIT_INST_3x(ldsetlh, Ldsetlh, Gp, Gp, Mem)
+
+ ASMJIT_INST_3x(ldsmax, Ldsmax, Gp, Gp, Mem)
+ ASMJIT_INST_3x(ldsmaxa, Ldsmaxa, Gp, Gp, Mem)
+ ASMJIT_INST_3x(ldsmaxab, Ldsmaxab, Gp, Gp, Mem)
+ ASMJIT_INST_3x(ldsmaxah, Ldsmaxah, Gp, Gp, Mem)
+ ASMJIT_INST_3x(ldsmaxal, Ldsmaxal, Gp, Gp, Mem)
+ ASMJIT_INST_3x(ldsmaxalb, Ldsmaxalb, Gp, Gp, Mem)
+ ASMJIT_INST_3x(ldsmaxalh, Ldsmaxalh, Gp, Gp, Mem)
+ ASMJIT_INST_3x(ldsmaxb, Ldsmaxb, Gp, Gp, Mem)
+ ASMJIT_INST_3x(ldsmaxh, Ldsmaxh, Gp, Gp, Mem)
+ ASMJIT_INST_3x(ldsmaxl, Ldsmaxl, Gp, Gp, Mem)
+ ASMJIT_INST_3x(ldsmaxlb, Ldsmaxlb, Gp, Gp, Mem)
+ ASMJIT_INST_3x(ldsmaxlh, Ldsmaxlh, Gp, Gp, Mem)
+
+ ASMJIT_INST_3x(ldsmin, Ldsmin, Gp, Gp, Mem)
+ ASMJIT_INST_3x(ldsmina, Ldsmina, Gp, Gp, Mem)
+ ASMJIT_INST_3x(ldsminab, Ldsminab, Gp, Gp, Mem)
+ ASMJIT_INST_3x(ldsminah, Ldsminah, Gp, Gp, Mem)
+ ASMJIT_INST_3x(ldsminal, Ldsminal, Gp, Gp, Mem)
+ ASMJIT_INST_3x(ldsminalb, Ldsminalb, Gp, Gp, Mem)
+ ASMJIT_INST_3x(ldsminalh, Ldsminalh, Gp, Gp, Mem)
+ ASMJIT_INST_3x(ldsminb, Ldsminb, Gp, Gp, Mem)
+ ASMJIT_INST_3x(ldsminh, Ldsminh, Gp, Gp, Mem)
+ ASMJIT_INST_3x(ldsminl, Ldsminl, Gp, Gp, Mem)
+ ASMJIT_INST_3x(ldsminlb, Ldsminlb, Gp, Gp, Mem)
+ ASMJIT_INST_3x(ldsminlh, Ldsminlh, Gp, Gp, Mem)
+
+ ASMJIT_INST_2x(ldtr, Ldtr, Gp, Mem)
+ ASMJIT_INST_2x(ldtrb, Ldtrb, Gp, Mem)
+ ASMJIT_INST_2x(ldtrh, Ldtrh, Gp, Mem)
+ ASMJIT_INST_2x(ldtrsb, Ldtrsb, Gp, Mem)
+ ASMJIT_INST_2x(ldtrsh, Ldtrsh, Gp, Mem)
+ ASMJIT_INST_2x(ldtrsw, Ldtrsw, Gp, Mem)
+
+ ASMJIT_INST_3x(ldumax, Ldumax, Gp, Gp, Mem)
+ ASMJIT_INST_3x(ldumaxa, Ldumaxa, Gp, Gp, Mem)
+ ASMJIT_INST_3x(ldumaxab, Ldumaxab, Gp, Gp, Mem)
+ ASMJIT_INST_3x(ldumaxah, Ldumaxah, Gp, Gp, Mem)
+ ASMJIT_INST_3x(ldumaxal, Ldumaxal, Gp, Gp, Mem)
+ ASMJIT_INST_3x(ldumaxalb, Ldumaxalb, Gp, Gp, Mem)
+ ASMJIT_INST_3x(ldumaxalh, Ldumaxalh, Gp, Gp, Mem)
+ ASMJIT_INST_3x(ldumaxb, Ldumaxb, Gp, Gp, Mem)
+ ASMJIT_INST_3x(ldumaxh, Ldumaxh, Gp, Gp, Mem)
+ ASMJIT_INST_3x(ldumaxl, Ldumaxl, Gp, Gp, Mem)
+ ASMJIT_INST_3x(ldumaxlb, Ldumaxlb, Gp, Gp, Mem)
+ ASMJIT_INST_3x(ldumaxlh, Ldumaxlh, Gp, Gp, Mem)
+
+ ASMJIT_INST_3x(ldumin, Ldumin, Gp, Gp, Mem)
+ ASMJIT_INST_3x(ldumina, Ldumina, Gp, Gp, Mem)
+ ASMJIT_INST_3x(lduminab, Lduminab, Gp, Gp, Mem)
+ ASMJIT_INST_3x(lduminah, Lduminah, Gp, Gp, Mem)
+ ASMJIT_INST_3x(lduminal, Lduminal, Gp, Gp, Mem)
+ ASMJIT_INST_3x(lduminalb, Lduminalb, Gp, Gp, Mem)
+ ASMJIT_INST_3x(lduminalh, Lduminalh, Gp, Gp, Mem)
+ ASMJIT_INST_3x(lduminb, Lduminb, Gp, Gp, Mem)
+ ASMJIT_INST_3x(lduminh, Lduminh, Gp, Gp, Mem)
+ ASMJIT_INST_3x(lduminl, Lduminl, Gp, Gp, Mem)
+ ASMJIT_INST_3x(lduminlb, Lduminlb, Gp, Gp, Mem)
+ ASMJIT_INST_3x(lduminlh, Lduminlh, Gp, Gp, Mem)
+
+ ASMJIT_INST_2x(ldur, Ldur, Gp, Mem)
+ ASMJIT_INST_2x(ldurb, Ldurb, Gp, Mem)
+ ASMJIT_INST_2x(ldurh, Ldurh, Gp, Mem)
+ ASMJIT_INST_2x(ldursb, Ldursb, Gp, Mem)
+ ASMJIT_INST_2x(ldursh, Ldursh, Gp, Mem)
+ ASMJIT_INST_2x(ldursw, Ldursw, Gp, Mem)
+
+ ASMJIT_INST_3x(ldxp, Ldxp, Gp, Gp, Mem)
+ ASMJIT_INST_3x(ldaxp, Ldaxp, Gp, Gp, Mem)
+
+ ASMJIT_INST_2x(ldxr, Ldxr, Gp, Mem)
+ ASMJIT_INST_2x(ldxrb, Ldxrb, Gp, Mem)
+ ASMJIT_INST_2x(ldxrh, Ldxrh, Gp, Mem)
+
+ ASMJIT_INST_2x(stadd, Stadd, Gp, Mem)
+ ASMJIT_INST_2x(staddb, Staddb, Gp, Mem)
+ ASMJIT_INST_2x(staddh, Staddh, Gp, Mem)
+ ASMJIT_INST_2x(staddl, Staddl, Gp, Mem)
+ ASMJIT_INST_2x(staddlb, Staddlb, Gp, Mem)
+ ASMJIT_INST_2x(staddlh, Staddlh, Gp, Mem)
+
+ ASMJIT_INST_2x(stclr, Stclr, Gp, Mem)
+ ASMJIT_INST_2x(stclrb, Stclrb, Gp, Mem)
+ ASMJIT_INST_2x(stclrh, Stclrh, Gp, Mem)
+ ASMJIT_INST_2x(stclrl, Stclrl, Gp, Mem)
+ ASMJIT_INST_2x(stclrlb, Stclrlb, Gp, Mem)
+ ASMJIT_INST_2x(stclrlh, Stclrlh, Gp, Mem)
+
+ ASMJIT_INST_2x(steor, Steor, Gp, Mem)
+ ASMJIT_INST_2x(steorb, Steorb, Gp, Mem)
+ ASMJIT_INST_2x(steorh, Steorh, Gp, Mem)
+ ASMJIT_INST_2x(steorl, Steorl, Gp, Mem)
+ ASMJIT_INST_2x(steorlb, Steorlb, Gp, Mem)
+ ASMJIT_INST_2x(steorlh, Steorlh, Gp, Mem)
+
+ ASMJIT_INST_2x(stllr, Stllr, Gp, Mem)
+ ASMJIT_INST_2x(stllrb, Stllrb, Gp, Mem)
+ ASMJIT_INST_2x(stllrh, Stllrh, Gp, Mem)
+
+ ASMJIT_INST_2x(stlr, Stllr, Gp, Mem)
+ ASMJIT_INST_2x(stlrb, Stllrb, Gp, Mem)
+ ASMJIT_INST_2x(stlrh, Stllrh, Gp, Mem)
+
+ ASMJIT_INST_3x(stlxr, Stlxr, Gp, Gp, Mem)
+ ASMJIT_INST_3x(stlxrb, Stlxrb, Gp, Gp, Mem)
+ ASMJIT_INST_3x(stlxrh, Stlxrh, Gp, Gp, Mem)
+
+ ASMJIT_INST_3x(stnp, Stnp, Gp, Gp, Mem)
+ ASMJIT_INST_3x(stp, Stp, Gp, Gp, Mem)
+
+ ASMJIT_INST_2x(str, Str, Gp, Mem)
+ ASMJIT_INST_2x(strb, Strb, Gp, Mem)
+ ASMJIT_INST_2x(strh, Strh, Gp, Mem)
+
+ ASMJIT_INST_2x(stset, Stset, Gp, Mem)
+ ASMJIT_INST_2x(stsetb, Stsetb, Gp, Mem)
+ ASMJIT_INST_2x(stseth, Stseth, Gp, Mem)
+ ASMJIT_INST_2x(stsetl, Stsetl, Gp, Mem)
+ ASMJIT_INST_2x(stsetlb, Stsetlb, Gp, Mem)
+ ASMJIT_INST_2x(stsetlh, Stsetlh, Gp, Mem)
+
+ ASMJIT_INST_2x(stsmax, Stsmax, Gp, Mem)
+ ASMJIT_INST_2x(stsmaxb, Stsmaxb, Gp, Mem)
+ ASMJIT_INST_2x(stsmaxh, Stsmaxh, Gp, Mem)
+ ASMJIT_INST_2x(stsmaxl, Stsmaxl, Gp, Mem)
+ ASMJIT_INST_2x(stsmaxlb, Stsmaxlb, Gp, Mem)
+ ASMJIT_INST_2x(stsmaxlh, Stsmaxlh, Gp, Mem)
+
+ ASMJIT_INST_2x(stsmin, Stsmin, Gp, Mem)
+ ASMJIT_INST_2x(stsminb, Stsminb, Gp, Mem)
+ ASMJIT_INST_2x(stsminh, Stsminh, Gp, Mem)
+ ASMJIT_INST_2x(stsminl, Stsminl, Gp, Mem)
+ ASMJIT_INST_2x(stsminlb, Stsminlb, Gp, Mem)
+ ASMJIT_INST_2x(stsminlh, Stsminlh, Gp, Mem)
+
+ ASMJIT_INST_2x(sttr, Sttr, Gp, Mem)
+ ASMJIT_INST_2x(sttrb, Sttrb, Gp, Mem)
+ ASMJIT_INST_2x(sttrh, Sttrh, Gp, Mem)
+
+ ASMJIT_INST_2x(stumax, Stumax, Gp, Mem)
+ ASMJIT_INST_2x(stumaxb, Stumaxb, Gp, Mem)
+ ASMJIT_INST_2x(stumaxh, Stumaxh, Gp, Mem)
+ ASMJIT_INST_2x(stumaxl, Stumaxl, Gp, Mem)
+ ASMJIT_INST_2x(stumaxlb, Stumaxlb, Gp, Mem)
+ ASMJIT_INST_2x(stumaxlh, Stumaxlh, Gp, Mem)
+
+ ASMJIT_INST_2x(stumin, Stumin, Gp, Mem)
+ ASMJIT_INST_2x(stuminb, Stuminb, Gp, Mem)
+ ASMJIT_INST_2x(stuminh, Stuminh, Gp, Mem)
+ ASMJIT_INST_2x(stuminl, Stuminl, Gp, Mem)
+ ASMJIT_INST_2x(stuminlb, Stuminlb, Gp, Mem)
+ ASMJIT_INST_2x(stuminlh, Stuminlh, Gp, Mem)
+
+ ASMJIT_INST_2x(stur, Stur, Gp, Mem)
+ ASMJIT_INST_2x(sturb, Sturb, Gp, Mem)
+ ASMJIT_INST_2x(sturh, Sturh, Gp, Mem)
+
+ ASMJIT_INST_4x(stxp, Stxp, Gp, Gp, Gp, Mem)
+ ASMJIT_INST_4x(stlxp, Stlxp, Gp, Gp, Gp, Mem)
+
+ ASMJIT_INST_3x(stxr, Stxr, Gp, Gp, Mem)
+ ASMJIT_INST_3x(stxrb, Stxrb, Gp, Gp, Mem)
+ ASMJIT_INST_3x(stxrh, Stxrh, Gp, Gp, Mem)
+
+ ASMJIT_INST_3x(swp, Swp, Gp, Gp, Mem)
+ ASMJIT_INST_3x(swpa, Swpa, Gp, Gp, Mem)
+ ASMJIT_INST_3x(swpab, Swpab, Gp, Gp, Mem)
+ ASMJIT_INST_3x(swpah, Swpah, Gp, Gp, Mem)
+ ASMJIT_INST_3x(swpal, Swpal, Gp, Gp, Mem)
+ ASMJIT_INST_3x(swpalb, Swpalb, Gp, Gp, Mem)
+ ASMJIT_INST_3x(swpalh, Swpalh, Gp, Gp, Mem)
+ ASMJIT_INST_3x(swpb, Swpb, Gp, Gp, Mem)
+ ASMJIT_INST_3x(swph, Swph, Gp, Gp, Mem)
+ ASMJIT_INST_3x(swpl, Swpl, Gp, Gp, Mem)
+ ASMJIT_INST_3x(swplb, Swplb, Gp, Gp, Mem)
+ ASMJIT_INST_3x(swplh, Swplh, Gp, Gp, Mem)
+ //! \}
+
+ //! \name CRC Instructions (ARMv8.1-A, optional in ARMv8.0-A)
+ //! \{
+
+ ASMJIT_INST_3x(crc32b, Crc32b, Gp, Gp, Gp);
+ ASMJIT_INST_3x(crc32h, Crc32h, Gp, Gp, Gp);
+ ASMJIT_INST_3x(crc32w, Crc32w, Gp, Gp, Gp);
+ ASMJIT_INST_3x(crc32x, Crc32x, Gp, Gp, Gp);
+
+ ASMJIT_INST_3x(crc32cb, Crc32cb, Gp, Gp, Gp);
+ ASMJIT_INST_3x(crc32ch, Crc32ch, Gp, Gp, Gp);
+ ASMJIT_INST_3x(crc32cw, Crc32cw, Gp, Gp, Gp);
+ ASMJIT_INST_3x(crc32cx, Crc32cx, Gp, Gp, Gp);
+
+ //! \}
+
+ //! \name MTE Instructions
+ //! \{
+
+ ASMJIT_INST_2x(autda, Autda, Gp, Gp);
+ ASMJIT_INST_2x(autdb, Autdb, Gp, Gp);
+ ASMJIT_INST_1x(autdza, Autdza, Gp);
+ ASMJIT_INST_1x(autdzb, Autdzb, Gp);
+ ASMJIT_INST_2x(autia, Autia, Gp, Gp);
+ ASMJIT_INST_0x(autia1716, Autia1716);
+ ASMJIT_INST_0x(autiasp, Autiasp);
+ ASMJIT_INST_0x(autiaz, Autiaz);
+ ASMJIT_INST_2x(autib, Autib, Gp, Gp);
+ ASMJIT_INST_0x(autib1716, Autib1716);
+ ASMJIT_INST_0x(autibsp, Autibsp);
+ ASMJIT_INST_0x(autibz, Autibz);
+ ASMJIT_INST_1x(autiza, Autiza, Gp);
+ ASMJIT_INST_1x(autizb, Autizb, Gp);
+
+ ASMJIT_INST_3x(gmi, Gmi, Gp, Gp, Gp);
+
+ ASMJIT_INST_2x(cmpp, Cmpp, Gp, Gp);
+ ASMJIT_INST_4x(addg, Addg, Gp, Gp, Imm, Imm);
+
+ ASMJIT_INST_2x(ldg, Ldg, Gp, Mem)
+ ASMJIT_INST_2x(ldgm, Ldgm, Gp, Mem)
+ ASMJIT_INST_2x(ldraa, Ldraa, Gp, Mem)
+ ASMJIT_INST_2x(ldrab, Ldrab, Gp, Mem)
+
+ ASMJIT_INST_2x(pacda, Pacda, Gp, Gp);
+ ASMJIT_INST_2x(pacdb, Pacdb, Gp, Gp);
+ ASMJIT_INST_1x(pacdza, Pacdza, Gp);
+ ASMJIT_INST_1x(pacdzb, Pacdzb, Gp);
+ ASMJIT_INST_3x(pacga, Pacga, Gp, Gp, Gp);
+
+ ASMJIT_INST_3x(subp, Subp, Gp, Gp, Gp);
+ ASMJIT_INST_3x(subps, Subps, Gp, Gp, Gp);
+ ASMJIT_INST_4x(subg, Subg, Gp, Gp, Imm, Imm);
+
+ ASMJIT_INST_2x(st2g, St2g, Gp, Mem)
+ ASMJIT_INST_2x(stg, Stg, Gp, Mem)
+ ASMJIT_INST_3x(stgp, Stgp, Gp, Gp, Mem)
+ ASMJIT_INST_2x(stgm, Stgm, Gp, Mem)
+ ASMJIT_INST_2x(stzg, Stzg, Gp, Mem)
+ ASMJIT_INST_2x(stz2g, Stz2g, Gp, Mem)
+ ASMJIT_INST_2x(stzgm, Stzgm, Gp, Mem)
+
+ ASMJIT_INST_1x(xpacd, Xpacd, Gp);
+ ASMJIT_INST_1x(xpaci, Xpaci, Gp);
+ ASMJIT_INST_0x(xpaclri, Xpaclri);
+
+ //! \}
+
+ //! \name Hint Instructions
+ //! \{
+
+ ASMJIT_INST_1x(hint, Hint, Imm)
+ ASMJIT_INST_0x(nop, Nop)
+ ASMJIT_INST_0x(sev, Sev)
+ ASMJIT_INST_0x(sevl, Sevl)
+ ASMJIT_INST_0x(wfe, Wfe)
+ ASMJIT_INST_0x(wfi, Wfi)
+ ASMJIT_INST_0x(yield, Yield)
+
+ //! \}
+
+ //! \name SIMD & FP Instructions
+ //! \{
+
+ ASMJIT_INST_2x(abs, Abs_v, Vec, Vec);
+ ASMJIT_INST_3x(add, Add_v, Vec, Vec, Vec);
+ ASMJIT_INST_3x(addhn, Addhn_v, Vec, Vec, Vec);
+ ASMJIT_INST_3x(addhn2, Addhn2_v, Vec, Vec, Vec);
+ ASMJIT_INST_2x(addp, Addp_v, Vec, Vec);
+ ASMJIT_INST_3x(addp, Addp_v, Vec, Vec, Vec);
+ ASMJIT_INST_2x(addv, Addv_v, Vec, Vec);
+ ASMJIT_INST_3x(and_, And_v, Vec, Vec, Vec);
+ ASMJIT_INST_2x(bic, Bic_v, Vec, Imm);
+ ASMJIT_INST_3x(bic, Bic_v, Vec, Vec, Vec);
+ ASMJIT_INST_3x(bic, Bic_v, Vec, Imm, Imm);
+ ASMJIT_INST_3x(bif, Bif_v, Vec, Vec, Vec);
+ ASMJIT_INST_3x(bit, Bit_v, Vec, Vec, Vec);
+ ASMJIT_INST_3x(bsl, Bsl_v, Vec, Vec, Vec);
+ ASMJIT_INST_2x(cls, Cls_v, Vec, Vec);
+ ASMJIT_INST_2x(clz, Clz_v, Vec, Vec);
+ ASMJIT_INST_3x(cmeq, Cmeq_v, Vec, Vec, Vec);
+ ASMJIT_INST_3x(cmeq, Cmeq_v, Vec, Vec, Imm);
+ ASMJIT_INST_3x(cmge, Cmge_v, Vec, Vec, Vec);
+ ASMJIT_INST_3x(cmge, Cmge_v, Vec, Vec, Imm);
+ ASMJIT_INST_3x(cmgt, Cmgt_v, Vec, Vec, Vec);
+ ASMJIT_INST_3x(cmgt, Cmgt_v, Vec, Vec, Imm);
+ ASMJIT_INST_3x(cmhi, Cmhi_v, Vec, Vec, Vec);
+ ASMJIT_INST_3x(cmhs, Cmhs_v, Vec, Vec, Vec);
+ ASMJIT_INST_3x(cmle, Cmle_v, Vec, Vec, Imm);
+ ASMJIT_INST_3x(cmlt, Cmlt_v, Vec, Vec, Imm);
+ ASMJIT_INST_3x(cmtst, Cmtst_v, Vec, Vec, Vec);
+ ASMJIT_INST_2x(cnt, Cnt_v, Vec, Vec);
+ ASMJIT_INST_2x(dup, Dup_v, Vec, Gp);
+ ASMJIT_INST_2x(dup, Dup_v, Vec, Vec);
+ ASMJIT_INST_3x(eor, Eor_v, Vec, Vec, Vec);
+ ASMJIT_INST_4x(ext, Ext_v, Vec, Vec, Vec, Imm);
+ ASMJIT_INST_3x(fabd, Fabd_v, Vec, Vec, Vec);
+ ASMJIT_INST_2x(fabs, Fabs_v, Vec, Vec);
+ ASMJIT_INST_3x(facge, Facge_v, Vec, Vec, Vec);
+ ASMJIT_INST_3x(facgt, Facgt_v, Vec, Vec, Vec);
+ ASMJIT_INST_3x(fadd, Fadd_v, Vec, Vec, Vec);
+ ASMJIT_INST_2x(faddp, Faddp_v, Vec, Vec);
+ ASMJIT_INST_3x(faddp, Faddp_v, Vec, Vec, Vec);
+ ASMJIT_INST_4x(fccmp, Fccmp_v, Vec, Vec, Imm, Imm);
+ ASMJIT_INST_4x(fccmpe, Fccmpe_v, Vec, Vec, Imm, Imm);
+ ASMJIT_INST_3x(fcmeq, Fcmeq_v, Vec, Vec, Vec);
+ ASMJIT_INST_3x(fcmeq, Fcmeq_v, Vec, Vec, Imm);
+ ASMJIT_INST_3x(fcmge, Fcmge_v, Vec, Vec, Vec);
+ ASMJIT_INST_3x(fcmge, Fcmge_v, Vec, Vec, Imm);
+ ASMJIT_INST_3x(fcmgt, Fcmgt_v, Vec, Vec, Vec);
+ ASMJIT_INST_3x(fcmgt, Fcmgt_v, Vec, Vec, Imm);
+ ASMJIT_INST_3x(fcmle, Fcmle_v, Vec, Vec, Imm);
+ ASMJIT_INST_3x(fcmlt, Fcmlt_v, Vec, Vec, Imm);
+ ASMJIT_INST_2x(fcmp, Fcmp_v, Vec, Vec);
+ ASMJIT_INST_2x(fcmp, Fcmp_v, Vec, Imm);
+ ASMJIT_INST_2x(fcmpe, Fcmpe_v, Vec, Vec);
+ ASMJIT_INST_2x(fcmpe, Fcmpe_v, Vec, Imm);
+ ASMJIT_INST_4x(fcsel, Fcsel_v, Vec, Vec, Vec, Imm);
+ ASMJIT_INST_2x(fcvt, Fcvt_v, Vec, Vec);
+ ASMJIT_INST_2x(fcvtas, Fcvtas_v, Gp, Vec);
+ ASMJIT_INST_2x(fcvtas, Fcvtas_v, Vec, Vec);
+ ASMJIT_INST_2x(fcvtau, Fcvtau_v, Gp, Vec);
+ ASMJIT_INST_2x(fcvtau, Fcvtau_v, Vec, Vec);
+ ASMJIT_INST_2x(fcvtl, Fcvtl_v, Vec, Vec);
+ ASMJIT_INST_2x(fcvtl2, Fcvtl2_v, Vec, Vec);
+ ASMJIT_INST_2x(fcvtms, Fcvtms_v, Gp, Vec);
+ ASMJIT_INST_2x(fcvtms, Fcvtms_v, Vec, Vec);
+ ASMJIT_INST_2x(fcvtmu, Fcvtmu_v, Gp, Vec);
+ ASMJIT_INST_2x(fcvtmu, Fcvtmu_v, Vec, Vec);
+ ASMJIT_INST_2x(fcvtn, Fcvtn_v, Vec, Vec);
+ ASMJIT_INST_2x(fcvtn2, Fcvtn2_v, Vec, Vec);
+ ASMJIT_INST_2x(fcvtns, Fcvtns_v, Gp, Vec);
+ ASMJIT_INST_2x(fcvtns, Fcvtns_v, Vec, Vec);
+ ASMJIT_INST_2x(fcvtnu, Fcvtnu_v, Gp, Vec);
+ ASMJIT_INST_2x(fcvtnu, Fcvtnu_v, Vec, Vec);
+ ASMJIT_INST_2x(fcvtps, Fcvtps_v, Gp, Vec);
+ ASMJIT_INST_2x(fcvtps, Fcvtps_v, Vec, Vec);
+ ASMJIT_INST_2x(fcvtpu, Fcvtpu_v, Gp, Vec);
+ ASMJIT_INST_2x(fcvtpu, Fcvtpu_v, Vec, Vec);
+ ASMJIT_INST_2x(fcvtxn, Fcvtxn_v, Vec, Vec);
+ ASMJIT_INST_2x(fcvtxn2, Fcvtxn2_v, Vec, Vec);
+ ASMJIT_INST_2x(fcvtzs, Fcvtzs_v, Gp, Vec);
+ ASMJIT_INST_3x(fcvtzs, Fcvtzs_v, Gp, Vec, Imm);
+ ASMJIT_INST_2x(fcvtzs, Fcvtzs_v, Vec, Vec);
+ ASMJIT_INST_3x(fcvtzs, Fcvtzs_v, Vec, Vec, Imm);
+ ASMJIT_INST_2x(fcvtzu, Fcvtzu_v, Gp, Vec);
+ ASMJIT_INST_3x(fcvtzu, Fcvtzu_v, Gp, Vec, Imm);
+ ASMJIT_INST_2x(fcvtzu, Fcvtzu_v, Vec, Vec);
+ ASMJIT_INST_3x(fcvtzu, Fcvtzu_v, Vec, Vec, Imm);
+ ASMJIT_INST_3x(fdiv, Fdiv_v, Vec, Vec, Vec);
+ ASMJIT_INST_4x(fmadd, Fmadd_v, Vec, Vec, Vec, Vec);
+ ASMJIT_INST_3x(fmax, Fmax_v, Vec, Vec, Vec);
+ ASMJIT_INST_3x(fmaxnm, Fmaxnm_v, Vec, Vec, Vec);
+ ASMJIT_INST_3x(fmaxnmp, Fmaxnmp_v, Vec, Vec, Vec);
+ ASMJIT_INST_2x(fmaxnmp, Fmaxnmp_v, Vec, Vec);
+ ASMJIT_INST_2x(fmaxnmv, Fmaxnmv_v, Vec, Vec);
+ ASMJIT_INST_3x(fmaxp, Fmaxp_v, Vec, Vec, Vec);
+ ASMJIT_INST_2x(fmaxp, Fmaxp_v, Vec, Vec);
+ ASMJIT_INST_2x(fmaxv, Fmaxv_v, Vec, Vec);
+ ASMJIT_INST_3x(fmin, Fmin_v, Vec, Vec, Vec);
+ ASMJIT_INST_3x(fminnm, Fminnm_v, Vec, Vec, Vec);
+ ASMJIT_INST_2x(fminnmv, Fminnmv_v, Vec, Vec);
+ ASMJIT_INST_3x(fminnmp, Fminnmp_v, Vec, Vec, Vec);
+ ASMJIT_INST_2x(fminnmp, Fminnmp_v, Vec, Vec);
+ ASMJIT_INST_2x(fminp, Fminp_v, Vec, Vec);
+ ASMJIT_INST_3x(fminp, Fminp_v, Vec, Vec, Vec);
+ ASMJIT_INST_2x(fminv, Fminv_v, Vec, Vec);
+ ASMJIT_INST_3x(fmla, Fmla_v, Vec, Vec, Vec);
+ ASMJIT_INST_3x(fmls, Fmls_v, Vec, Vec, Vec);
+ ASMJIT_INST_2x(fmov, Fmov_v, Gp, Vec);
+ ASMJIT_INST_2x(fmov, Fmov_v, Vec, Gp);
+ ASMJIT_INST_2x(fmov, Fmov_v, Vec, Vec);
+ ASMJIT_INST_2x(fmov, Fmov_v, Vec, Imm);
+ ASMJIT_INST_4x(fmsub, Fmsub_v, Vec, Vec, Vec, Vec);
+ ASMJIT_INST_3x(fmul, Fmul_v, Vec, Vec, Vec);
+ ASMJIT_INST_3x(fmulx, Fmulx_v, Vec, Vec, Vec);
+ ASMJIT_INST_2x(fneg, Fneg_v, Vec, Vec);
+ ASMJIT_INST_4x(fnmadd, Fnmadd_v, Vec, Vec, Vec, Vec);
+ ASMJIT_INST_4x(fnmsub, Fnmsub_v, Vec, Vec, Vec, Vec);
+ ASMJIT_INST_3x(fnmul, Fnmul_v, Vec, Vec, Vec);
+ ASMJIT_INST_2x(frecpe, Frecpe_v, Vec, Vec);
+ ASMJIT_INST_3x(frecps, Frecps_v, Vec, Vec, Vec);
+ ASMJIT_INST_2x(frecpx, Frecpx_v, Vec, Vec);
+ ASMJIT_INST_2x(frint32x, Frint32x_v, Vec, Vec);
+ ASMJIT_INST_2x(frint32z, Frint32z_v, Vec, Vec);
+ ASMJIT_INST_2x(frint64x, Frint64x_v, Vec, Vec);
+ ASMJIT_INST_2x(frint64z, Frint64z_v, Vec, Vec);
+ ASMJIT_INST_2x(frinta, Frinta_v, Vec, Vec);
+ ASMJIT_INST_2x(frinti, Frinti_v, Vec, Vec);
+ ASMJIT_INST_2x(frintm, Frintm_v, Vec, Vec);
+ ASMJIT_INST_2x(frintn, Frintn_v, Vec, Vec);
+ ASMJIT_INST_2x(frintp, Frintp_v, Vec, Vec);
+ ASMJIT_INST_2x(frintx, Frintx_v, Vec, Vec);
+ ASMJIT_INST_2x(frintz, Frintz_v, Vec, Vec);
+ ASMJIT_INST_2x(frsqrte, Frsqrte_v, Vec, Vec);
+ ASMJIT_INST_3x(frsqrts, Frsqrts_v, Vec, Vec, Vec);
+ ASMJIT_INST_2x(fsqrt, Fsqrt_v, Vec, Vec);
+ ASMJIT_INST_3x(fsub, Fsub_v, Vec, Vec, Vec);
+ ASMJIT_INST_2x(ins, Ins_v, Vec, Gp);
+ ASMJIT_INST_2x(ins, Ins_v, Vec, Vec);
+ ASMJIT_INST_2x(ld1, Ld1_v, Vec, Mem);
+ ASMJIT_INST_3x(ld1, Ld1_v, Vec, Vec, Mem);
+ ASMJIT_INST_4x(ld1, Ld1_v, Vec, Vec, Vec, Mem);
+ ASMJIT_INST_5x(ld1, Ld1_v, Vec, Vec, Vec, Vec, Mem);
+ ASMJIT_INST_2x(ld1r, Ld1r_v, Vec, Mem);
+ ASMJIT_INST_3x(ld2, Ld2_v, Vec, Vec, Mem);
+ ASMJIT_INST_3x(ld2r, Ld2r_v, Vec, Vec, Mem);
+ ASMJIT_INST_4x(ld3, Ld3_v, Vec, Vec, Vec, Mem);
+ ASMJIT_INST_4x(ld3r, Ld3r_v, Vec, Vec, Vec, Mem);
+ ASMJIT_INST_5x(ld4, Ld4_v, Vec, Vec, Vec, Vec, Mem);
+ ASMJIT_INST_5x(ld4r, Ld4r_v, Vec, Vec, Vec, Vec, Mem);
+ ASMJIT_INST_3x(ldnp, Ldnp_v, Vec, Vec, Mem);
+ ASMJIT_INST_3x(ldp, Ldp_v, Vec, Vec, Mem);
+ ASMJIT_INST_2x(ldr, Ldr_v, Vec, Mem);
+ ASMJIT_INST_2x(ldur, Ldur_v, Vec, Mem);
+ ASMJIT_INST_3x(mla, Mla_v, Vec, Vec, Vec);
+ ASMJIT_INST_3x(mls, Mls_v, Vec, Vec, Vec);
+ ASMJIT_INST_2x(mov, Mov_v, Vec, Vec);
+ ASMJIT_INST_2x(mov, Mov_v, Gp, Vec);
+ ASMJIT_INST_2x(mov, Mov_v, Vec, Gp);
+ ASMJIT_INST_2x(movi, Movi_v, Vec, Imm);
+ ASMJIT_INST_3x(movi, Movi_v, Vec, Imm, Imm);
+ ASMJIT_INST_3x(mul, Mul_v, Vec, Vec, Vec);
+ ASMJIT_INST_2x(mvn, Mvn_v, Vec, Vec);
+ ASMJIT_INST_2x(mvni, Mvni_v, Vec, Imm);
+ ASMJIT_INST_3x(mvni, Mvni_v, Vec, Imm, Imm);
+ ASMJIT_INST_2x(neg, Neg_v, Vec, Vec);
+ ASMJIT_INST_2x(not_, Not_v, Vec, Vec);
+ ASMJIT_INST_3x(orn, Orn_v, Vec, Vec, Vec);
+ ASMJIT_INST_2x(orr, Orr_v, Vec, Imm);
+ ASMJIT_INST_3x(orr, Orr_v, Vec, Vec, Vec);
+ ASMJIT_INST_3x(orr, Orr_v, Vec, Imm, Imm);
+ ASMJIT_INST_3x(pmul, Pmul_v, Vec, Vec, Vec);
+ ASMJIT_INST_3x(pmull, Pmull_v, Vec, Vec, Vec);
+ ASMJIT_INST_3x(pmull2, Pmull2_v, Vec, Vec, Vec);
+ ASMJIT_INST_3x(raddhn, Raddhn_v, Vec, Vec, Vec);
+ ASMJIT_INST_3x(raddhn2, Raddhn2_v, Vec, Vec, Vec);
+ ASMJIT_INST_2x(rbit, Rbit_v, Vec, Vec);
+ ASMJIT_INST_2x(rev16, Rev16_v, Vec, Vec);
+ ASMJIT_INST_2x(rev32, Rev32_v, Vec, Vec);
+ ASMJIT_INST_2x(rev64, Rev64_v, Vec, Vec);
+ ASMJIT_INST_3x(rshrn, Rshrn_v, Vec, Vec, Imm);
+ ASMJIT_INST_3x(rshrn2, Rshrn2_v, Vec, Vec, Imm);
+ ASMJIT_INST_3x(rsubhn, Rsubhn_v, Vec, Vec, Vec);
+ ASMJIT_INST_3x(rsubhn2, Rsubhn2_v, Vec, Vec, Vec);
+ ASMJIT_INST_3x(saba, Saba_v, Vec, Vec, Vec);
+ ASMJIT_INST_3x(sabal, Sabal_v, Vec, Vec, Vec);
+ ASMJIT_INST_3x(sabal2, Sabal2_v, Vec, Vec, Vec);
+ ASMJIT_INST_3x(sabd, Sabd_v, Vec, Vec, Vec);
+ ASMJIT_INST_3x(sabdl, Sabdl_v, Vec, Vec, Vec);
+ ASMJIT_INST_3x(sabdl2, Sabdl2_v, Vec, Vec, Vec);
+ ASMJIT_INST_2x(sadalp, Sadalp_v, Vec, Vec);
+ ASMJIT_INST_3x(saddl, Saddl_v, Vec, Vec, Vec);
+ ASMJIT_INST_3x(saddl2, Saddl2_v, Vec, Vec, Vec);
+ ASMJIT_INST_2x(saddlp, Saddlp_v, Vec, Vec);
+ ASMJIT_INST_2x(saddlv, Saddlv_v, Vec, Vec);
+ ASMJIT_INST_3x(saddw, Saddw_v, Vec, Vec, Vec);
+ ASMJIT_INST_3x(saddw2, Saddw2_v, Vec, Vec, Vec);
+ ASMJIT_INST_2x(scvtf, Scvtf_v, Vec, Gp);
+ ASMJIT_INST_3x(scvtf, Scvtf_v, Vec, Gp, Imm);
+ ASMJIT_INST_2x(scvtf, Scvtf_v, Vec, Vec);
+ ASMJIT_INST_3x(scvtf, Scvtf_v, Vec, Vec, Imm);
+ ASMJIT_INST_3x(shadd, Shadd_v, Vec, Vec, Vec);
+ ASMJIT_INST_3x(shl, Shl_v, Vec, Vec, Imm);
+ ASMJIT_INST_3x(shll, Shll_v, Vec, Vec, Imm);
+ ASMJIT_INST_3x(shll2, Shll2_v, Vec, Vec, Imm);
+ ASMJIT_INST_3x(shrn, Shrn_v, Vec, Vec, Imm);
+ ASMJIT_INST_3x(shrn2, Shrn2_v, Vec, Vec, Imm);
+ ASMJIT_INST_3x(shsub, Shsub_v, Vec, Vec, Vec);
+ ASMJIT_INST_3x(sli, Sli_v, Vec, Vec, Imm);
+ ASMJIT_INST_3x(smax, Smax_v, Vec, Vec, Vec);
+ ASMJIT_INST_3x(smaxp, Smaxp_v, Vec, Vec, Vec);
+ ASMJIT_INST_2x(smaxv, Smaxv_v, Vec, Vec);
+ ASMJIT_INST_3x(smin, Smin_v, Vec, Vec, Vec);
+ ASMJIT_INST_3x(sminp, Sminp_v, Vec, Vec, Vec);
+ ASMJIT_INST_2x(sminv, Sminv_v, Vec, Vec);
+ ASMJIT_INST_3x(smlal, Smlal_v, Vec, Vec, Vec);
+ ASMJIT_INST_3x(smlal2, Smlal2_v, Vec, Vec, Vec);
+ ASMJIT_INST_3x(smlsl, Smlsl_v, Vec, Vec, Vec);
+ ASMJIT_INST_3x(smlsl2, Smlsl2_v, Vec, Vec, Vec);
+ ASMJIT_INST_2x(smov, Smov_v, Gp, Vec);
+ ASMJIT_INST_3x(smull, Smull_v, Vec, Vec, Vec);
+ ASMJIT_INST_3x(smull2, Smull2_v, Vec, Vec, Vec);
+ ASMJIT_INST_2x(sqabs, Sqabs_v, Vec, Vec);
+ ASMJIT_INST_3x(sqadd, Sqadd_v, Vec, Vec, Vec);
+ ASMJIT_INST_3x(sqdmlal, Sqdmlal_v, Vec, Vec, Vec);
+ ASMJIT_INST_3x(sqdmlal2, Sqdmlal2_v, Vec, Vec, Vec);
+ ASMJIT_INST_3x(sqdmlsl, Sqdmlsl_v, Vec, Vec, Vec);
+ ASMJIT_INST_3x(sqdmlsl2, Sqdmlsl2_v, Vec, Vec, Vec);
+ ASMJIT_INST_3x(sqdmulh, Sqdmulh_v, Vec, Vec, Vec);
+ ASMJIT_INST_3x(sqdmull, Sqdmull_v, Vec, Vec, Vec);
+ ASMJIT_INST_3x(sqdmull2, Sqdmull2_v, Vec, Vec, Vec);
+ ASMJIT_INST_2x(sqneg, Sqneg_v, Vec, Vec);
+ ASMJIT_INST_3x(sqrdmulh, Sqrdmulh_v, Vec, Vec, Vec);
+ ASMJIT_INST_3x(sqrshl, Sqrshl_v, Vec, Vec, Vec);
+ ASMJIT_INST_3x(sqrshrn, Sqrshrn_v, Vec, Vec, Imm);
+ ASMJIT_INST_3x(sqrshrn2, Sqrshrn2_v, Vec, Vec, Imm);
+ ASMJIT_INST_3x(sqrshrun, Sqrshrun_v, Vec, Vec, Imm);
+ ASMJIT_INST_3x(sqrshrun2, Sqrshrun2_v, Vec, Vec, Imm);
+ ASMJIT_INST_3x(sqshl, Sqshl_v, Vec, Vec, Vec);
+ ASMJIT_INST_3x(sqshl, Sqshl_v, Vec, Vec, Imm);
+ ASMJIT_INST_3x(sqshlu, Sqshlu_v, Vec, Vec, Imm);
+ ASMJIT_INST_3x(sqshrn, Sqshrn_v, Vec, Vec, Imm);
+ ASMJIT_INST_3x(sqshrn2, Sqshrn2_v, Vec, Vec, Imm);
+ ASMJIT_INST_3x(sqshrun, Sqshrun_v, Vec, Vec, Imm);
+ ASMJIT_INST_3x(sqshrun2, Sqshrun2_v, Vec, Vec, Imm);
+ ASMJIT_INST_3x(sqsub, Sqsub_v, Vec, Vec, Vec);
+ ASMJIT_INST_2x(sqxtn, Sqxtn_v, Vec, Vec);
+ ASMJIT_INST_2x(sqxtn2, Sqxtn2_v, Vec, Vec);
+ ASMJIT_INST_2x(sqxtun, Sqxtun_v, Vec, Vec);
+ ASMJIT_INST_2x(sqxtun2, Sqxtun2_v, Vec, Vec);
+ ASMJIT_INST_3x(srhadd, Srhadd_v, Vec, Vec, Vec);
+ ASMJIT_INST_3x(sri, Sri_v, Vec, Vec, Imm);
+ ASMJIT_INST_3x(srshl, Srshl_v, Vec, Vec, Vec);
+ ASMJIT_INST_3x(srshr, Srshr_v, Vec, Vec, Imm);
+ ASMJIT_INST_3x(srsra, Srsra_v, Vec, Vec, Imm);
+ ASMJIT_INST_3x(sshl, Sshl_v, Vec, Vec, Vec);
+ ASMJIT_INST_3x(sshll, Sshll_v, Vec, Vec, Imm);
+ ASMJIT_INST_3x(sshll2, Sshll2_v, Vec, Vec, Imm);
+ ASMJIT_INST_3x(sshr, Sshr_v, Vec, Vec, Imm);
+ ASMJIT_INST_3x(ssra, Ssra_v, Vec, Vec, Imm);
+ ASMJIT_INST_3x(ssubl, Ssubl_v, Vec, Vec, Vec);
+ ASMJIT_INST_3x(ssubl2, Ssubl2_v, Vec, Vec, Vec);
+ ASMJIT_INST_3x(ssubw, Ssubw_v, Vec, Vec, Vec);
+ ASMJIT_INST_3x(ssubw2, Ssubw2_v, Vec, Vec, Vec);
+ ASMJIT_INST_2x(st1, St1_v, Vec, Mem);
+ ASMJIT_INST_3x(st1, St1_v, Vec, Vec, Mem);
+ ASMJIT_INST_4x(st1, St1_v, Vec, Vec, Vec, Mem);
+ ASMJIT_INST_5x(st1, St1_v, Vec, Vec, Vec, Vec, Mem);
+ ASMJIT_INST_3x(st2, St2_v, Vec, Vec, Mem);
+ ASMJIT_INST_4x(st3, St3_v, Vec, Vec, Vec, Mem);
+ ASMJIT_INST_5x(st4, St4_v, Vec, Vec, Vec, Vec, Mem);
+ ASMJIT_INST_3x(stnp, Stnp_v, Vec, Vec, Mem);
+ ASMJIT_INST_3x(stp, Stp_v, Vec, Vec, Mem);
+ ASMJIT_INST_2x(str, Str_v, Vec, Mem);
+ ASMJIT_INST_2x(stur, Stur_v, Vec, Mem);
+ ASMJIT_INST_3x(sub, Sub_v, Vec, Vec, Vec);
+ ASMJIT_INST_3x(subhn, Subhn_v, Vec, Vec, Vec);
+ ASMJIT_INST_3x(subhn2, Subhn2_v, Vec, Vec, Vec);
+ ASMJIT_INST_2x(suqadd, Suqadd_v, Vec, Vec);
+ ASMJIT_INST_2x(sxtl, Sxtl_v, Vec, Vec);
+ ASMJIT_INST_2x(sxtl2, Sxtl2_v, Vec, Vec);
+ ASMJIT_INST_3x(tbl, Tbl_v, Vec, Vec, Vec);
+ ASMJIT_INST_4x(tbl, Tbl_v, Vec, Vec, Vec, Vec);
+ ASMJIT_INST_5x(tbl, Tbl_v, Vec, Vec, Vec, Vec, Vec);
+ ASMJIT_INST_6x(tbl, Tbl_v, Vec, Vec, Vec, Vec, Vec, Vec);
+ ASMJIT_INST_3x(tbx, Tbx_v, Vec, Vec, Vec);
+ ASMJIT_INST_4x(tbx, Tbx_v, Vec, Vec, Vec, Vec);
+ ASMJIT_INST_5x(tbx, Tbx_v, Vec, Vec, Vec, Vec, Vec);
+ ASMJIT_INST_6x(tbx, Tbx_v, Vec, Vec, Vec, Vec, Vec, Vec);
+ ASMJIT_INST_3x(trn1, Trn1_v, Vec, Vec, Vec);
+ ASMJIT_INST_3x(trn2, Trn2_v, Vec, Vec, Vec);
+ ASMJIT_INST_3x(uaba, Uaba_v, Vec, Vec, Vec);
+ ASMJIT_INST_3x(uabal, Uabal_v, Vec, Vec, Vec);
+ ASMJIT_INST_3x(uabal2, Uabal2_v, Vec, Vec, Vec);
+ ASMJIT_INST_3x(uabd, Uabd_v, Vec, Vec, Vec);
+ ASMJIT_INST_3x(uabdl, Uabdl_v, Vec, Vec, Vec);
+ ASMJIT_INST_3x(uabdl2, Uabdl2_v, Vec, Vec, Vec);
+ ASMJIT_INST_2x(uadalp, Uadalp_v, Vec, Vec);
+ ASMJIT_INST_3x(uaddl, Uaddl_v, Vec, Vec, Vec);
+ ASMJIT_INST_3x(uaddl2, Uaddl2_v, Vec, Vec, Vec);
+ ASMJIT_INST_2x(uaddlp, Uaddlp_v, Vec, Vec);
+ ASMJIT_INST_2x(uaddlv, Uaddlv_v, Vec, Vec);
+ ASMJIT_INST_3x(uaddw, Uaddw_v, Vec, Vec, Vec);
+ ASMJIT_INST_3x(uaddw2, Uaddw2_v, Vec, Vec, Vec);
+ ASMJIT_INST_2x(ucvtf, Ucvtf_v, Vec, Gp);
+ ASMJIT_INST_3x(ucvtf, Ucvtf_v, Vec, Gp, Imm);
+ ASMJIT_INST_2x(ucvtf, Ucvtf_v, Vec, Vec);
+ ASMJIT_INST_3x(ucvtf, Ucvtf_v, Vec, Vec, Imm);
+ ASMJIT_INST_3x(uhadd, Uhadd_v, Vec, Vec, Vec);
+ ASMJIT_INST_3x(uhsub, Uhsub_v, Vec, Vec, Vec);
+ ASMJIT_INST_3x(umax, Umax_v, Vec, Vec, Vec);
+ ASMJIT_INST_3x(umaxp, Umaxp_v, Vec, Vec, Vec);
+ ASMJIT_INST_2x(umaxv, Umaxv_v, Vec, Vec);
+ ASMJIT_INST_3x(umin, Umin_v, Vec, Vec, Vec);
+ ASMJIT_INST_3x(uminp, Uminp_v, Vec, Vec, Vec);
+ ASMJIT_INST_2x(uminv, Uminv_v, Vec, Vec);
+ ASMJIT_INST_3x(umlal, Umlal_v, Vec, Vec, Vec);
+ ASMJIT_INST_3x(umlal2, Umlal2_v, Vec, Vec, Vec);
+ ASMJIT_INST_3x(umlsl, Umlsl_v, Vec, Vec, Vec);
+ ASMJIT_INST_3x(umlsl2, Umlsl2_v, Vec, Vec, Vec);
+ ASMJIT_INST_2x(umov, Umov_v, Gp, Vec);
+ ASMJIT_INST_3x(umull, Umull_v, Vec, Vec, Vec);
+ ASMJIT_INST_3x(umull2, Umull2_v, Vec, Vec, Vec);
+ ASMJIT_INST_3x(uqadd, Uqadd_v, Vec, Vec, Vec);
+ ASMJIT_INST_3x(uqrshl, Uqrshl_v, Vec, Vec, Vec);
+ ASMJIT_INST_3x(uqrshl, Uqrshl_v, Vec, Vec, Imm);
+ ASMJIT_INST_3x(uqrshrn, Uqrshrn_v, Vec, Vec, Imm);
+ ASMJIT_INST_3x(uqrshrn2, Uqrshrn2_v, Vec, Vec, Imm);
+ ASMJIT_INST_3x(uqshl, Uqshl_v, Vec, Vec, Vec);
+ ASMJIT_INST_3x(uqshl, Uqshl_v, Vec, Vec, Imm);
+ ASMJIT_INST_3x(uqshrn, Uqshrn_v, Vec, Vec, Imm);
+ ASMJIT_INST_3x(uqshrn2, Uqshrn2_v, Vec, Vec, Imm);
+ ASMJIT_INST_3x(uqsub, Uqsub_v, Vec, Vec, Vec);
+ ASMJIT_INST_2x(uqxtn, Uqxtn_v, Vec, Vec);
+ ASMJIT_INST_2x(uqxtn2, Uqxtn2_v, Vec, Vec);
+ ASMJIT_INST_2x(urecpe, Urecpe_v, Vec, Vec);
+ ASMJIT_INST_3x(urhadd, Urhadd_v, Vec, Vec, Vec);
+ ASMJIT_INST_3x(urshl, Urshl_v, Vec, Vec, Vec);
+ ASMJIT_INST_3x(urshr, Urshr_v, Vec, Vec, Imm);
+ ASMJIT_INST_2x(ursqrte, Ursqrte_v, Vec, Vec);
+ ASMJIT_INST_3x(ursra, Ursra_v, Vec, Vec, Imm);
+ ASMJIT_INST_3x(ushl, Ushl_v, Vec, Vec, Vec);
+ ASMJIT_INST_3x(ushll, Ushll_v, Vec, Vec, Imm);
+ ASMJIT_INST_3x(ushll2, Ushll2_v, Vec, Vec, Imm);
+ ASMJIT_INST_3x(ushr, Ushr_v, Vec, Vec, Imm);
+ ASMJIT_INST_2x(usqadd, Usqadd_v, Vec, Vec);
+ ASMJIT_INST_3x(usra, Usra_v, Vec, Vec, Imm);
+ ASMJIT_INST_3x(usubl, Usubl_v, Vec, Vec, Vec);
+ ASMJIT_INST_3x(usubl2, Usubl2_v, Vec, Vec, Vec);
+ ASMJIT_INST_3x(usubw, Usubw_v, Vec, Vec, Vec);
+ ASMJIT_INST_3x(usubw2, Usubw2_v, Vec, Vec, Vec);
+ ASMJIT_INST_2x(uxtl, Uxtl_v, Vec, Vec);
+ ASMJIT_INST_2x(uxtl2, Uxtl2_v, Vec, Vec);
+ ASMJIT_INST_3x(uzp1, Uzp1_v, Vec, Vec, Vec);
+ ASMJIT_INST_3x(uzp2, Uzp2_v, Vec, Vec, Vec);
+ ASMJIT_INST_2x(xtn, Xtn_v, Vec, Vec);
+ ASMJIT_INST_2x(xtn2, Xtn2_v, Vec, Vec);
+ ASMJIT_INST_3x(zip1, Zip1_v, Vec, Vec, Vec);
+ ASMJIT_INST_3x(zip2, Zip2_v, Vec, Vec, Vec);
+
+ //! \}
+
+ //! \name AES Instructions
+ //! \{
+
+ ASMJIT_INST_2x(aesd, Aesd_v, Vec, Vec);
+ ASMJIT_INST_2x(aese, Aese_v, Vec, Vec);
+ ASMJIT_INST_2x(aesimc, Aesimc_v, Vec, Vec);
+ ASMJIT_INST_2x(aesmc, Aesmc_v, Vec, Vec);
+
+ //! \}
+
+ //! \name SHA1 Instructions
+ //! \{
+
+ ASMJIT_INST_3x(sha1c, Sha1c_v, Vec, Vec, Vec);
+ ASMJIT_INST_2x(sha1h, Sha1h_v, Vec, Vec);
+ ASMJIT_INST_3x(sha1m, Sha1m_v, Vec, Vec, Vec);
+ ASMJIT_INST_3x(sha1p, Sha1p_v, Vec, Vec, Vec);
+ ASMJIT_INST_3x(sha1su0, Sha1su0_v, Vec, Vec, Vec);
+ ASMJIT_INST_2x(sha1su1, Sha1su1_v, Vec, Vec);
+
+ //! \}
+
+ //! \name SHA2 Instructions
+ //! \{
+
+ ASMJIT_INST_3x(sha256h, Sha256h_v, Vec, Vec, Vec);
+ ASMJIT_INST_3x(sha256h2, Sha256h2_v, Vec, Vec, Vec);
+ ASMJIT_INST_2x(sha256su0, Sha256su0_v, Vec, Vec);
+ ASMJIT_INST_3x(sha256su1, Sha256su1_v, Vec, Vec, Vec);
+
+ //! \}
+
+ //! \name RDMA Instructions (ARMv8.1-A)
+ //! \{
+
+ ASMJIT_INST_3x(sqrdmlah, Sqrdmlah_v, Vec, Vec, Vec);
+ ASMJIT_INST_3x(sqrdmlsh, Sqrdmlsh_v, Vec, Vec, Vec);
+
+ //! \}
+
+ //! \name FCMA Instruction (ARMv8.3-A)
+ //! \{
+
+ ASMJIT_INST_4x(fcadd, Fcadd_v, Vec, Vec, Vec, Imm);
+ ASMJIT_INST_4x(fcmla, Fcmla_v, Vec, Vec, Vec, Imm);
+
+ //! \}
+
+ //! \name FJCVTZS Instruction (ARMv8.3-A)
+ //! \{
+
+ ASMJIT_INST_2x(fjcvtzs, Fjcvtzs_v, Gp, Vec);
+
+ //! \}
+
+ //! \name FP16FML Instructions (ARMv8.4-A, optional in ARMv8.2-A)
+ //! \{
+
+ ASMJIT_INST_3x(fmlal, Fmlal_v, Vec, Vec, Vec);
+ ASMJIT_INST_3x(fmlal2, Fmlal2_v, Vec, Vec, Vec);
+ ASMJIT_INST_3x(fmlsl, Fmlsl_v, Vec, Vec, Vec);
+ ASMJIT_INST_3x(fmlsl2, Fmlsl2_v, Vec, Vec, Vec);
+
+
+ //! \}
+
+ //! \name SHA3 Instructions (ARMv8.4-A, optional in ARMv8.2-A)
+ //! \{
+
+ ASMJIT_INST_4x(bcax, Bcax_v, Vec, Vec, Vec, Vec);
+ ASMJIT_INST_4x(eor3, Eor3_v, Vec, Vec, Vec, Vec);
+ ASMJIT_INST_3x(rax1, Rax1_v, Vec, Vec, Vec);
+ ASMJIT_INST_4x(xar, Xar_v, Vec, Vec, Vec, Imm);
+
+ //! \}
+
+ //! \name SHA512 Instructions (ARMv8.4-A)
+ //! \{
+
+ ASMJIT_INST_3x(sha512h, Sha512h_v, Vec, Vec, Vec);
+ ASMJIT_INST_3x(sha512h2, Sha512h2_v, Vec, Vec, Vec);
+ ASMJIT_INST_2x(sha512su0, Sha512su0_v, Vec, Vec);
+ ASMJIT_INST_3x(sha512su1, Sha512su1_v, Vec, Vec, Vec);
+
+ //! \}
+
+ //! \name SM3 Instructions (ARMv8.4-A)
+ //! \{
+
+ ASMJIT_INST_3x(sm3partw1, Sm3partw1_v, Vec, Vec, Vec);
+ ASMJIT_INST_3x(sm3partw2, Sm3partw2_v, Vec, Vec, Vec);
+ ASMJIT_INST_4x(sm3ss1, Sm3ss1_v, Vec, Vec, Vec, Vec);
+ ASMJIT_INST_3x(sm3tt1a, Sm3tt1a_v, Vec, Vec, Vec);
+ ASMJIT_INST_3x(sm3tt1b, Sm3tt1b_v, Vec, Vec, Vec);
+ ASMJIT_INST_3x(sm3tt2a, Sm3tt2a_v, Vec, Vec, Vec);
+ ASMJIT_INST_3x(sm3tt2b, Sm3tt2b_v, Vec, Vec, Vec);
+
+ //! \}
+
+ //! \name SM4 Instructions (ARMv8.4-A)
+ //! \{
+
+ ASMJIT_INST_2x(sm4e, Sm4e_v, Vec, Vec);
+ ASMJIT_INST_3x(sm4ekey, Sm4ekey_v, Vec, Vec, Vec);
+
+ //! \}
+
+ //! \name DOTPROD Instructions (ARMv8.4-A, optional in ARMv8.2-A)
+ //! \{
+
+ ASMJIT_INST_3x(sdot, Sdot_v, Vec, Vec, Vec);
+ ASMJIT_INST_3x(udot, Udot_v, Vec, Vec, Vec);
+
+ //! \}
+
+ //! \name BF16 Instructions (ARMv8.6-A)
+ //! \{
+
+ ASMJIT_INST_2x(bfcvt, Bfcvt_v, Vec, Vec);
+ ASMJIT_INST_2x(bfcvtn, Bfcvtn_v, Vec, Vec);
+ ASMJIT_INST_2x(bfcvtn2, Bfcvtn2_v, Vec, Vec);
+ ASMJIT_INST_3x(bfmlalb, Bfmlalb_v, Vec, Vec, Vec);
+ ASMJIT_INST_3x(bfmlalt, Bfmlalt_v, Vec, Vec, Vec);
+ ASMJIT_INST_3x(bfmmla, Bfmmla_v, Vec, Vec, Vec);
+ ASMJIT_INST_3x(bfdot, Bfdot_v, Vec, Vec, Vec);
+
+ //! \}
+
+ //! \name I8MM Instructions (ARMv8.6-A)
+ //! \{
+
+ ASMJIT_INST_3x(smmla, Smmla_v, Vec, Vec, Vec);
+ ASMJIT_INST_3x(sudot, Sudot_v, Vec, Vec, Vec);
+ ASMJIT_INST_3x(ummla, Ummla_v, Vec, Vec, Vec);
+ ASMJIT_INST_3x(usdot, Usdot_v, Vec, Vec, Vec);
+ ASMJIT_INST_3x(usmmla, Usmmla_v, Vec, Vec, Vec);
+
+ //! \}
+};
+
+//! Emitter (ARM).
+//!
+//! \note This class cannot be instantiated, you can only cast to it and use it as emitter that emits to either
+//! `a64::Assembler`, `a64::Builder`, or `a64::Compiler` (use with caution with `a64::Compiler` as it requires
+//! virtual registers).
+class Emitter : public BaseEmitter, public EmitterExplicitT<Emitter> {
+ ASMJIT_NONCONSTRUCTIBLE(Emitter)
+};
+
+//! \}
+
+#undef ASMJIT_INST_0x
+#undef ASMJIT_INST_1x
+#undef ASMJIT_INST_2x
+#undef ASMJIT_INST_3x
+#undef ASMJIT_INST_4x
+#undef ASMJIT_INST_5x
+#undef ASMJIT_INST_6x
+#undef ASMJIT_INST_1cc
+
+ASMJIT_END_SUB_NAMESPACE
+
+#endif // ASMJIT_ARM_A64EMITTER_H_INCLUDED
diff --git a/3rdparty/asmjit/src/asmjit/arm/a64formatter.cpp b/3rdparty/asmjit/src/asmjit/arm/a64formatter.cpp
new file mode 100644
index 00000000000..bccb68b99b0
--- /dev/null
+++ b/3rdparty/asmjit/src/asmjit/arm/a64formatter.cpp
@@ -0,0 +1,298 @@
+// This file is part of AsmJit project <https://asmjit.com>
+//
+// See asmjit.h or LICENSE.md for license and copyright information
+// SPDX-License-Identifier: Zlib
+
+#include "../core/api-build_p.h"
+#ifndef ASMJIT_NO_LOGGING
+
+#include "../core/misc_p.h"
+#include "../core/support.h"
+#include "../arm/a64formatter_p.h"
+#include "../arm/a64instapi_p.h"
+#include "../arm/a64instdb_p.h"
+#include "../arm/a64operand.h"
+
+#ifndef ASMJIT_NO_COMPILER
+ #include "../core/compiler.h"
+#endif
+
+ASMJIT_BEGIN_SUB_NAMESPACE(a64)
+
+// a64::FormatterInternal - Format Register
+// ========================================
+
+ASMJIT_FAVOR_SIZE Error FormatterInternal::formatRegister(
+ String& sb,
+ FormatFlags flags,
+ const BaseEmitter* emitter,
+ Arch arch,
+ RegType regType,
+ uint32_t rId,
+ uint32_t elementType,
+ uint32_t elementIndex) noexcept {
+
+ DebugUtils::unused(flags);
+ DebugUtils::unused(arch);
+
+ static const char bhsdq[] = "bhsdq";
+
+ bool virtRegFormatted = false;
+
+#ifndef ASMJIT_NO_COMPILER
+ if (Operand::isVirtId(rId)) {
+ if (emitter && emitter->isCompiler()) {
+ const BaseCompiler* cc = static_cast<const BaseCompiler*>(emitter);
+ if (cc->isVirtIdValid(rId)) {
+ VirtReg* vReg = cc->virtRegById(rId);
+ ASMJIT_ASSERT(vReg != nullptr);
+
+ const char* name = vReg->name();
+ if (name && name[0] != '\0')
+ ASMJIT_PROPAGATE(sb.append(name));
+ else
+ ASMJIT_PROPAGATE(sb.appendFormat("%%%u", unsigned(Operand::virtIdToIndex(rId))));
+
+ virtRegFormatted = true;
+ }
+ }
+ }
+#else
+ DebugUtils::unused(emitter, flags);
+#endif
+
+ if (!virtRegFormatted) {
+ char letter = '\0';
+ switch (regType) {
+ case RegType::kARM_GpW:
+ if (rId == Gp::kIdZr)
+ return sb.append("wzr");
+ if (rId == Gp::kIdSp)
+ return sb.append("wsp");
+
+ letter = 'w';
+ break;
+
+ case RegType::kARM_GpX:
+ if (rId == Gp::kIdZr)
+ return sb.append("xzr");
+ if (rId == Gp::kIdSp)
+ return sb.append("sp");
+
+ letter = 'x';
+ break;
+
+ case RegType::kARM_VecB:
+ case RegType::kARM_VecH:
+ case RegType::kARM_VecS:
+ case RegType::kARM_VecD:
+ case RegType::kARM_VecV:
+ letter = bhsdq[uint32_t(regType) - uint32_t(RegType::kARM_VecB)];
+ if (elementType)
+ letter = 'v';
+ break;
+
+ default:
+ ASMJIT_PROPAGATE(sb.appendFormat("<Reg-%u>?$u", uint32_t(regType), rId));
+ break;
+ }
+
+ if (letter)
+ ASMJIT_PROPAGATE(sb.appendFormat("%c%u", letter, rId));
+ }
+
+ if (elementType) {
+ char elementLetter = '\0';
+ uint32_t elementCount = 0;
+
+ switch (elementType) {
+ case Vec::kElementTypeB:
+ elementLetter = 'b';
+ elementCount = 16;
+ break;
+
+ case Vec::kElementTypeH:
+ elementLetter = 'h';
+ elementCount = 8;
+ break;
+
+ case Vec::kElementTypeS:
+ elementLetter = 's';
+ elementCount = 4;
+ break;
+
+ case Vec::kElementTypeD:
+ elementLetter = 'd';
+ elementCount = 2;
+ break;
+
+ default:
+ return sb.append(".<Unknown>");
+ }
+
+ if (elementLetter) {
+ if (elementIndex == 0xFFFFFFFFu) {
+ if (regType == RegType::kARM_VecD)
+ elementCount /= 2u;
+ ASMJIT_PROPAGATE(sb.appendFormat(".%u%c", elementCount, elementLetter));
+ }
+ else {
+ ASMJIT_PROPAGATE(sb.appendFormat(".%c[%u]", elementLetter, elementIndex));
+ }
+ }
+ }
+
+ return kErrorOk;
+}
+
+// a64::FormatterInternal - Format Operand
+// =======================================
+
+ASMJIT_FAVOR_SIZE Error FormatterInternal::formatOperand(
+ String& sb,
+ FormatFlags flags,
+ const BaseEmitter* emitter,
+ Arch arch,
+ const Operand_& op) noexcept {
+
+ if (op.isReg()) {
+ const BaseReg& reg = op.as<BaseReg>();
+
+ uint32_t elementType = op.as<Vec>().elementType();
+ uint32_t elementIndex = op.as<Vec>().elementIndex();
+
+ if (!op.as<Vec>().hasElementIndex())
+ elementIndex = 0xFFFFFFFFu;
+
+ return formatRegister(sb, flags, emitter, arch, reg.type(), reg.id(), elementType, elementIndex);
+ }
+
+ if (op.isMem()) {
+ const Mem& m = op.as<Mem>();
+ ASMJIT_PROPAGATE(sb.append('['));
+
+ if (m.hasBase()) {
+ if (m.hasBaseLabel()) {
+ ASMJIT_PROPAGATE(Formatter::formatLabel(sb, flags, emitter, m.baseId()));
+ }
+ else {
+ FormatFlags modifiedFlags = flags;
+ if (m.isRegHome()) {
+ ASMJIT_PROPAGATE(sb.append('&'));
+ modifiedFlags &= ~FormatFlags::kRegCasts;
+ }
+ ASMJIT_PROPAGATE(formatRegister(sb, modifiedFlags, emitter, arch, m.baseType(), m.baseId()));
+ }
+ }
+ else {
+ // ARM really requires base.
+ if (m.hasIndex() || m.hasOffset()) {
+ ASMJIT_PROPAGATE(sb.append("<None>"));
+ }
+ }
+
+ // The post index makes it look like there was another operand, but it's
+ // still the part of AsmJit's `arm::Mem` operand so it's consistent with
+ // other architectures.
+ if (m.isPostIndex())
+ ASMJIT_PROPAGATE(sb.append(']'));
+
+ if (m.hasIndex()) {
+ ASMJIT_PROPAGATE(sb.append(", "));
+ ASMJIT_PROPAGATE(formatRegister(sb, flags, emitter, arch, m.indexType(), m.indexId()));
+ }
+
+ if (m.hasOffset()) {
+ ASMJIT_PROPAGATE(sb.append(", "));
+
+ int64_t off = int64_t(m.offset());
+ uint32_t base = 10;
+
+ if (Support::test(flags, FormatFlags::kHexOffsets) && uint64_t(off) > 9)
+ base = 16;
+
+ if (base == 10) {
+ ASMJIT_PROPAGATE(sb.appendInt(off, base));
+ }
+ else {
+ ASMJIT_PROPAGATE(sb.append("0x"));
+ ASMJIT_PROPAGATE(sb.appendUInt(uint64_t(off), base));
+ }
+ }
+
+ if (m.hasShift()) {
+ ASMJIT_PROPAGATE(sb.append(' '));
+ if (!m.isPreOrPost())
+ ASMJIT_PROPAGATE(formatShiftOp(sb, (ShiftOp)m.predicate()));
+ ASMJIT_PROPAGATE(sb.appendFormat(" %u", m.shift()));
+ }
+
+ if (!m.isPostIndex())
+ ASMJIT_PROPAGATE(sb.append(']'));
+
+ if (m.isPreIndex())
+ ASMJIT_PROPAGATE(sb.append('!'));
+
+ return kErrorOk;
+ }
+
+ if (op.isImm()) {
+ const Imm& i = op.as<Imm>();
+ int64_t val = i.value();
+
+ if (Support::test(flags, FormatFlags::kHexImms) && uint64_t(val) > 9) {
+ ASMJIT_PROPAGATE(sb.append("0x"));
+ return sb.appendUInt(uint64_t(val), 16);
+ }
+ else {
+ return sb.appendInt(val, 10);
+ }
+ }
+
+ if (op.isLabel()) {
+ return Formatter::formatLabel(sb, flags, emitter, op.id());
+ }
+
+ return sb.append("<None>");
+}
+
+// a64::FormatterInternal - Format Instruction
+// ===========================================
+
+ASMJIT_FAVOR_SIZE Error FormatterInternal::formatInstruction(
+ String& sb,
+ FormatFlags flags,
+ const BaseEmitter* emitter,
+ Arch arch,
+ const BaseInst& inst, const Operand_* operands, size_t opCount) noexcept {
+
+ DebugUtils::unused(arch);
+
+ // Format instruction options and instruction mnemonic.
+ InstId instId = inst.realId();
+ if (instId < Inst::_kIdCount)
+ ASMJIT_PROPAGATE(InstInternal::instIdToString(arch, instId, sb));
+ else
+ ASMJIT_PROPAGATE(sb.appendFormat("[InstId=#%u]", unsigned(instId)));
+
+ CondCode cc = inst.armCondCode();
+ if (cc != CondCode::kAL) {
+ ASMJIT_PROPAGATE(sb.append('.'));
+ ASMJIT_PROPAGATE(formatCondCode(sb, cc));
+ }
+
+ for (uint32_t i = 0; i < opCount; i++) {
+ const Operand_& op = operands[i];
+ if (op.isNone())
+ break;
+
+ ASMJIT_PROPAGATE(sb.append(i == 0 ? " " : ", "));
+ ASMJIT_PROPAGATE(formatOperand(sb, flags, emitter, arch, op));
+ }
+
+ return kErrorOk;
+}
+
+ASMJIT_END_SUB_NAMESPACE
+
+#endif // !ASMJIT_NO_LOGGING
diff --git a/3rdparty/asmjit/src/asmjit/arm/a64formatter_p.h b/3rdparty/asmjit/src/asmjit/arm/a64formatter_p.h
new file mode 100644
index 00000000000..bd7a1440cb0
--- /dev/null
+++ b/3rdparty/asmjit/src/asmjit/arm/a64formatter_p.h
@@ -0,0 +1,59 @@
+// This file is part of AsmJit project <https://asmjit.com>
+//
+// See asmjit.h or LICENSE.md for license and copyright information
+// SPDX-License-Identifier: Zlib
+
+#ifndef ASMJIT_ARM_A64FORMATTER_P_H_INCLUDED
+#define ASMJIT_ARM_A64FORMATTER_P_H_INCLUDED
+
+#include "../core/api-config.h"
+#ifndef ASMJIT_NO_LOGGING
+
+#include "../core/formatter.h"
+#include "../core/string.h"
+#include "../arm/armformatter_p.h"
+#include "../arm/a64globals.h"
+
+ASMJIT_BEGIN_SUB_NAMESPACE(a64)
+
+//! \cond INTERNAL
+//! \addtogroup asmjit_a64
+//! \{
+
+namespace FormatterInternal {
+
+using namespace arm::FormatterInternal;
+
+Error ASMJIT_CDECL formatRegister(
+ String& sb,
+ FormatFlags flags,
+ const BaseEmitter* emitter,
+ Arch arch,
+ RegType regType,
+ uint32_t regId,
+ uint32_t elementType = 0,
+ uint32_t elementIndex = 0xFFFFFFFFu) noexcept;
+
+Error ASMJIT_CDECL formatOperand(
+ String& sb,
+ FormatFlags flags,
+ const BaseEmitter* emitter,
+ Arch arch,
+ const Operand_& op) noexcept;
+
+Error ASMJIT_CDECL formatInstruction(
+ String& sb,
+ FormatFlags flags,
+ const BaseEmitter* emitter,
+ Arch arch,
+ const BaseInst& inst, const Operand_* operands, size_t opCount) noexcept;
+
+} // {FormatterInternal}
+
+//! \}
+//! \endcond
+
+ASMJIT_END_SUB_NAMESPACE
+
+#endif // !ASMJIT_NO_LOGGING
+#endif // ASMJIT_ARM_A64FORMATTER_P_H_INCLUDED
diff --git a/3rdparty/asmjit/src/asmjit/arm/a64func.cpp b/3rdparty/asmjit/src/asmjit/arm/a64func.cpp
new file mode 100644
index 00000000000..55e3f2e71ec
--- /dev/null
+++ b/3rdparty/asmjit/src/asmjit/arm/a64func.cpp
@@ -0,0 +1,189 @@
+// This file is part of AsmJit project <https://asmjit.com>
+//
+// See asmjit.h or LICENSE.md for license and copyright information
+// SPDX-License-Identifier: Zlib
+
+#include "../core/api-build_p.h"
+#if !defined(ASMJIT_NO_AARCH64)
+
+#include "../arm/a64func_p.h"
+#include "../arm/a64operand.h"
+
+ASMJIT_BEGIN_SUB_NAMESPACE(a64)
+
+namespace FuncInternal {
+
+static inline bool shouldThreatAsCDecl(CallConvId ccId) noexcept {
+ return ccId == CallConvId::kCDecl ||
+ ccId == CallConvId::kStdCall ||
+ ccId == CallConvId::kFastCall ||
+ ccId == CallConvId::kVectorCall ||
+ ccId == CallConvId::kThisCall ||
+ ccId == CallConvId::kRegParm1 ||
+ ccId == CallConvId::kRegParm2 ||
+ ccId == CallConvId::kRegParm3;
+}
+
+static RegType regTypeFromFpOrVecTypeId(TypeId typeId) noexcept {
+ if (typeId == TypeId::kFloat32)
+ return RegType::kARM_VecS;
+ else if (typeId == TypeId::kFloat64)
+ return RegType::kARM_VecD;
+ else if (TypeUtils::isVec32(typeId))
+ return RegType::kARM_VecS;
+ else if (TypeUtils::isVec64(typeId))
+ return RegType::kARM_VecD;
+ else if (TypeUtils::isVec128(typeId))
+ return RegType::kARM_VecV;
+ else
+ return RegType::kNone;
+}
+
+ASMJIT_FAVOR_SIZE Error initCallConv(CallConv& cc, CallConvId ccId, const Environment& environment) noexcept {
+ cc.setArch(environment.arch());
+
+ cc.setSaveRestoreRegSize(RegGroup::kGp, 8);
+ cc.setSaveRestoreRegSize(RegGroup::kVec, 8);
+ cc.setSaveRestoreAlignment(RegGroup::kGp, 16);
+ cc.setSaveRestoreAlignment(RegGroup::kVec, 16);
+ cc.setSaveRestoreAlignment(RegGroup::kExtraVirt2, 1);
+ cc.setSaveRestoreAlignment(RegGroup::kExtraVirt3, 1);
+ cc.setPassedOrder(RegGroup::kGp, 0, 1, 2, 3, 4, 5, 6, 7);
+ cc.setPassedOrder(RegGroup::kVec, 0, 1, 2, 3, 4, 5, 6, 7);
+ cc.setNaturalStackAlignment(16);
+
+ if (shouldThreatAsCDecl(ccId)) {
+ // ARM doesn't have that many calling conventions as we can find in X86 world, treat most conventions as __cdecl.
+ cc.setId(CallConvId::kCDecl);
+ cc.setPreservedRegs(RegGroup::kGp, Support::bitMask(Gp::kIdOs, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30));
+ cc.setPreservedRegs(RegGroup::kVec, Support::bitMask(8, 9, 10, 11, 12, 13, 14, 15));
+ }
+ else {
+ cc.setId(ccId);
+ cc.setSaveRestoreRegSize(RegGroup::kVec, 16);
+ cc.setPreservedRegs(RegGroup::kGp, Support::bitMask(4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30));
+ cc.setPreservedRegs(RegGroup::kVec, Support::bitMask(4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31));
+ }
+
+ return kErrorOk;
+}
+
+ASMJIT_FAVOR_SIZE Error initFuncDetail(FuncDetail& func, const FuncSignature& signature, uint32_t registerSize) noexcept {
+ DebugUtils::unused(signature);
+
+ const CallConv& cc = func.callConv();
+ uint32_t stackOffset = 0;
+
+ uint32_t i;
+ uint32_t argCount = func.argCount();
+
+ if (func.hasRet()) {
+ for (uint32_t valueIndex = 0; valueIndex < Globals::kMaxValuePack; valueIndex++) {
+ TypeId typeId = func._rets[valueIndex].typeId();
+
+ // Terminate at the first void type (end of the pack).
+ if (typeId == TypeId::kVoid)
+ break;
+
+ switch (typeId) {
+ case TypeId::kInt8:
+ case TypeId::kInt16:
+ case TypeId::kInt32: {
+ func._rets[valueIndex].initReg(RegType::kARM_GpW, valueIndex, TypeId::kInt32);
+ break;
+ }
+
+ case TypeId::kUInt8:
+ case TypeId::kUInt16:
+ case TypeId::kUInt32: {
+ func._rets[valueIndex].initReg(RegType::kARM_GpW, valueIndex, TypeId::kUInt32);
+ break;
+ }
+
+ case TypeId::kInt64:
+ case TypeId::kUInt64: {
+ func._rets[valueIndex].initReg(RegType::kARM_GpX, valueIndex, typeId);
+ break;
+ }
+
+ default: {
+ RegType regType = regTypeFromFpOrVecTypeId(typeId);
+ if (regType == RegType::kNone)
+ return DebugUtils::errored(kErrorInvalidRegType);
+
+ func._rets[valueIndex].initReg(regType, valueIndex, typeId);
+ break;
+ }
+ }
+ }
+ }
+
+ switch (cc.strategy()) {
+ case CallConvStrategy::kDefault: {
+ uint32_t gpzPos = 0;
+ uint32_t vecPos = 0;
+
+ for (i = 0; i < argCount; i++) {
+ FuncValue& arg = func._args[i][0];
+ TypeId typeId = arg.typeId();
+
+ if (TypeUtils::isInt(typeId)) {
+ uint32_t regId = BaseReg::kIdBad;
+
+ if (gpzPos < CallConv::kMaxRegArgsPerGroup)
+ regId = cc._passedOrder[RegGroup::kGp].id[gpzPos];
+
+ if (regId != BaseReg::kIdBad) {
+ RegType regType = typeId <= TypeId::kUInt32 ? RegType::kARM_GpW : RegType::kARM_GpX;
+ arg.assignRegData(regType, regId);
+ func.addUsedRegs(RegGroup::kGp, Support::bitMask(regId));
+ gpzPos++;
+ }
+ else {
+ uint32_t size = Support::max<uint32_t>(TypeUtils::sizeOf(typeId), registerSize);
+ arg.assignStackOffset(int32_t(stackOffset));
+ stackOffset += size;
+ }
+ continue;
+ }
+
+ if (TypeUtils::isFloat(typeId) || TypeUtils::isVec(typeId)) {
+ uint32_t regId = BaseReg::kIdBad;
+
+ if (vecPos < CallConv::kMaxRegArgsPerGroup)
+ regId = cc._passedOrder[RegGroup::kVec].id[vecPos];
+
+ if (regId != BaseReg::kIdBad) {
+ RegType regType = regTypeFromFpOrVecTypeId(typeId);
+ if (regType == RegType::kNone)
+ return DebugUtils::errored(kErrorInvalidRegType);
+
+ arg.initTypeId(typeId);
+ arg.assignRegData(regType, regId);
+ func.addUsedRegs(RegGroup::kVec, Support::bitMask(regId));
+ vecPos++;
+ }
+ else {
+ uint32_t size = TypeUtils::sizeOf(typeId);
+ arg.assignStackOffset(int32_t(stackOffset));
+ stackOffset += size;
+ }
+ continue;
+ }
+ }
+ break;
+ }
+
+ default:
+ return DebugUtils::errored(kErrorInvalidState);
+ }
+
+ func._argStackSize = stackOffset;
+ return kErrorOk;
+}
+
+} // {FuncInternal}
+
+ASMJIT_END_SUB_NAMESPACE
+
+#endif // !ASMJIT_NO_AARCH64
diff --git a/3rdparty/asmjit/src/asmjit/arm/a64func_p.h b/3rdparty/asmjit/src/asmjit/arm/a64func_p.h
new file mode 100644
index 00000000000..9f531fc5a23
--- /dev/null
+++ b/3rdparty/asmjit/src/asmjit/arm/a64func_p.h
@@ -0,0 +1,33 @@
+// This file is part of AsmJit project <https://asmjit.com>
+//
+// See asmjit.h or LICENSE.md for license and copyright information
+// SPDX-License-Identifier: Zlib
+
+#ifndef ASMJIT_ARM_A64FUNC_P_H_INCLUDED
+#define ASMJIT_ARM_A64FUNC_P_H_INCLUDED
+
+#include "../core/func.h"
+
+ASMJIT_BEGIN_SUB_NAMESPACE(a64)
+
+//! \cond INTERNAL
+//! \addtogroup asmjit_a64
+//! \{
+
+//! AArch64-specific function API (calling conventions and other utilities).
+namespace FuncInternal {
+
+//! Initialize `CallConv` structure (AArch64 specific).
+Error initCallConv(CallConv& cc, CallConvId ccId, const Environment& environment) noexcept;
+
+//! Initialize `FuncDetail` (AArch64 specific).
+Error initFuncDetail(FuncDetail& func, const FuncSignature& signature, uint32_t registerSize) noexcept;
+
+} // {FuncInternal}
+
+//! \}
+//! \endcond
+
+ASMJIT_END_SUB_NAMESPACE
+
+#endif // ASMJIT_ARM_A64FUNC_P_H_INCLUDED
diff --git a/3rdparty/asmjit/src/asmjit/arm/a64globals.h b/3rdparty/asmjit/src/asmjit/arm/a64globals.h
new file mode 100644
index 00000000000..2b6b6f0ce91
--- /dev/null
+++ b/3rdparty/asmjit/src/asmjit/arm/a64globals.h
@@ -0,0 +1,1894 @@
+// This file is part of AsmJit project <https://asmjit.com>
+//
+// See asmjit.h or LICENSE.md for license and copyright information
+// SPDX-License-Identifier: Zlib
+
+#ifndef ASMJIT_ARM_A64GLOBALS_H_INCLUDED
+#define ASMJIT_ARM_A64GLOBALS_H_INCLUDED
+
+#include "../arm/armglobals.h"
+
+//! \namespace asmjit::a64
+//! \ingroup asmjit_a64
+//!
+//! AArch64 backend.
+
+ASMJIT_BEGIN_SUB_NAMESPACE(a64)
+
+// a64 uses everything from arm namespace and adds into it.
+using namespace arm;
+
+//! \addtogroup asmjit_a64
+//! \{
+
+//! AArch64 instruction.
+//!
+//! \note Only used to hold ARM-specific enumerations and static functions.
+struct Inst {
+ //! Instruction id.
+ enum Id : uint32_t {
+ // ${InstId:Begin}
+ kIdNone = 0, //!< Instruction ''.
+ kIdAdc, //!< Instruction 'adc'.
+ kIdAdcs, //!< Instruction 'adcs'.
+ kIdAdd, //!< Instruction 'add'.
+ kIdAddg, //!< Instruction 'addg'.
+ kIdAdds, //!< Instruction 'adds'.
+ kIdAdr, //!< Instruction 'adr'.
+ kIdAdrp, //!< Instruction 'adrp'.
+ kIdAnd, //!< Instruction 'and'.
+ kIdAnds, //!< Instruction 'ands'.
+ kIdAsr, //!< Instruction 'asr'.
+ kIdAsrv, //!< Instruction 'asrv'.
+ kIdAt, //!< Instruction 'at'.
+ kIdAutda, //!< Instruction 'autda'.
+ kIdAutdza, //!< Instruction 'autdza'.
+ kIdAutdb, //!< Instruction 'autdb'.
+ kIdAutdzb, //!< Instruction 'autdzb'.
+ kIdAutia, //!< Instruction 'autia'.
+ kIdAutia1716, //!< Instruction 'autia1716'.
+ kIdAutiasp, //!< Instruction 'autiasp'.
+ kIdAutiaz, //!< Instruction 'autiaz'.
+ kIdAutib, //!< Instruction 'autib'.
+ kIdAutib1716, //!< Instruction 'autib1716'.
+ kIdAutibsp, //!< Instruction 'autibsp'.
+ kIdAutibz, //!< Instruction 'autibz'.
+ kIdAutiza, //!< Instruction 'autiza'.
+ kIdAutizb, //!< Instruction 'autizb'.
+ kIdAxflag, //!< Instruction 'axflag'.
+ kIdB, //!< Instruction 'b'.
+ kIdBfc, //!< Instruction 'bfc'.
+ kIdBfi, //!< Instruction 'bfi'.
+ kIdBfm, //!< Instruction 'bfm'.
+ kIdBfxil, //!< Instruction 'bfxil'.
+ kIdBic, //!< Instruction 'bic'.
+ kIdBics, //!< Instruction 'bics'.
+ kIdBl, //!< Instruction 'bl'.
+ kIdBlr, //!< Instruction 'blr'.
+ kIdBr, //!< Instruction 'br'.
+ kIdBrk, //!< Instruction 'brk'.
+ kIdCas, //!< Instruction 'cas'.
+ kIdCasa, //!< Instruction 'casa'.
+ kIdCasab, //!< Instruction 'casab'.
+ kIdCasah, //!< Instruction 'casah'.
+ kIdCasal, //!< Instruction 'casal'.
+ kIdCasalb, //!< Instruction 'casalb'.
+ kIdCasalh, //!< Instruction 'casalh'.
+ kIdCasb, //!< Instruction 'casb'.
+ kIdCash, //!< Instruction 'cash'.
+ kIdCasl, //!< Instruction 'casl'.
+ kIdCaslb, //!< Instruction 'caslb'.
+ kIdCaslh, //!< Instruction 'caslh'.
+ kIdCasp, //!< Instruction 'casp'.
+ kIdCaspa, //!< Instruction 'caspa'.
+ kIdCaspal, //!< Instruction 'caspal'.
+ kIdCaspl, //!< Instruction 'caspl'.
+ kIdCbnz, //!< Instruction 'cbnz'.
+ kIdCbz, //!< Instruction 'cbz'.
+ kIdCcmn, //!< Instruction 'ccmn'.
+ kIdCcmp, //!< Instruction 'ccmp'.
+ kIdCfinv, //!< Instruction 'cfinv'.
+ kIdCinc, //!< Instruction 'cinc'.
+ kIdCinv, //!< Instruction 'cinv'.
+ kIdClrex, //!< Instruction 'clrex'.
+ kIdCls, //!< Instruction 'cls'.
+ kIdClz, //!< Instruction 'clz'.
+ kIdCmn, //!< Instruction 'cmn'.
+ kIdCmp, //!< Instruction 'cmp'.
+ kIdCmpp, //!< Instruction 'cmpp'.
+ kIdCneg, //!< Instruction 'cneg'.
+ kIdCrc32b, //!< Instruction 'crc32b'.
+ kIdCrc32cb, //!< Instruction 'crc32cb'.
+ kIdCrc32ch, //!< Instruction 'crc32ch'.
+ kIdCrc32cw, //!< Instruction 'crc32cw'.
+ kIdCrc32cx, //!< Instruction 'crc32cx'.
+ kIdCrc32h, //!< Instruction 'crc32h'.
+ kIdCrc32w, //!< Instruction 'crc32w'.
+ kIdCrc32x, //!< Instruction 'crc32x'.
+ kIdCsdb, //!< Instruction 'csdb'.
+ kIdCsel, //!< Instruction 'csel'.
+ kIdCset, //!< Instruction 'cset'.
+ kIdCsetm, //!< Instruction 'csetm'.
+ kIdCsinc, //!< Instruction 'csinc'.
+ kIdCsinv, //!< Instruction 'csinv'.
+ kIdCsneg, //!< Instruction 'csneg'.
+ kIdDc, //!< Instruction 'dc'.
+ kIdDcps1, //!< Instruction 'dcps1'.
+ kIdDcps2, //!< Instruction 'dcps2'.
+ kIdDcps3, //!< Instruction 'dcps3'.
+ kIdDgh, //!< Instruction 'dgh'.
+ kIdDmb, //!< Instruction 'dmb'.
+ kIdDrps, //!< Instruction 'drps'.
+ kIdDsb, //!< Instruction 'dsb'.
+ kIdEon, //!< Instruction 'eon'.
+ kIdEor, //!< Instruction 'eor'.
+ kIdEsb, //!< Instruction 'esb'.
+ kIdExtr, //!< Instruction 'extr'.
+ kIdEret, //!< Instruction 'eret'.
+ kIdGmi, //!< Instruction 'gmi'.
+ kIdHint, //!< Instruction 'hint'.
+ kIdHlt, //!< Instruction 'hlt'.
+ kIdHvc, //!< Instruction 'hvc'.
+ kIdIc, //!< Instruction 'ic'.
+ kIdIsb, //!< Instruction 'isb'.
+ kIdLdadd, //!< Instruction 'ldadd'.
+ kIdLdadda, //!< Instruction 'ldadda'.
+ kIdLdaddab, //!< Instruction 'ldaddab'.
+ kIdLdaddah, //!< Instruction 'ldaddah'.
+ kIdLdaddal, //!< Instruction 'ldaddal'.
+ kIdLdaddalb, //!< Instruction 'ldaddalb'.
+ kIdLdaddalh, //!< Instruction 'ldaddalh'.
+ kIdLdaddb, //!< Instruction 'ldaddb'.
+ kIdLdaddh, //!< Instruction 'ldaddh'.
+ kIdLdaddl, //!< Instruction 'ldaddl'.
+ kIdLdaddlb, //!< Instruction 'ldaddlb'.
+ kIdLdaddlh, //!< Instruction 'ldaddlh'.
+ kIdLdar, //!< Instruction 'ldar'.
+ kIdLdarb, //!< Instruction 'ldarb'.
+ kIdLdarh, //!< Instruction 'ldarh'.
+ kIdLdaxp, //!< Instruction 'ldaxp'.
+ kIdLdaxr, //!< Instruction 'ldaxr'.
+ kIdLdaxrb, //!< Instruction 'ldaxrb'.
+ kIdLdaxrh, //!< Instruction 'ldaxrh'.
+ kIdLdclr, //!< Instruction 'ldclr'.
+ kIdLdclra, //!< Instruction 'ldclra'.
+ kIdLdclrab, //!< Instruction 'ldclrab'.
+ kIdLdclrah, //!< Instruction 'ldclrah'.
+ kIdLdclral, //!< Instruction 'ldclral'.
+ kIdLdclralb, //!< Instruction 'ldclralb'.
+ kIdLdclralh, //!< Instruction 'ldclralh'.
+ kIdLdclrb, //!< Instruction 'ldclrb'.
+ kIdLdclrh, //!< Instruction 'ldclrh'.
+ kIdLdclrl, //!< Instruction 'ldclrl'.
+ kIdLdclrlb, //!< Instruction 'ldclrlb'.
+ kIdLdclrlh, //!< Instruction 'ldclrlh'.
+ kIdLdeor, //!< Instruction 'ldeor'.
+ kIdLdeora, //!< Instruction 'ldeora'.
+ kIdLdeorab, //!< Instruction 'ldeorab'.
+ kIdLdeorah, //!< Instruction 'ldeorah'.
+ kIdLdeoral, //!< Instruction 'ldeoral'.
+ kIdLdeoralb, //!< Instruction 'ldeoralb'.
+ kIdLdeoralh, //!< Instruction 'ldeoralh'.
+ kIdLdeorb, //!< Instruction 'ldeorb'.
+ kIdLdeorh, //!< Instruction 'ldeorh'.
+ kIdLdeorl, //!< Instruction 'ldeorl'.
+ kIdLdeorlb, //!< Instruction 'ldeorlb'.
+ kIdLdeorlh, //!< Instruction 'ldeorlh'.
+ kIdLdg, //!< Instruction 'ldg'.
+ kIdLdgm, //!< Instruction 'ldgm'.
+ kIdLdlar, //!< Instruction 'ldlar'.
+ kIdLdlarb, //!< Instruction 'ldlarb'.
+ kIdLdlarh, //!< Instruction 'ldlarh'.
+ kIdLdnp, //!< Instruction 'ldnp'.
+ kIdLdp, //!< Instruction 'ldp'.
+ kIdLdpsw, //!< Instruction 'ldpsw'.
+ kIdLdr, //!< Instruction 'ldr'.
+ kIdLdraa, //!< Instruction 'ldraa'.
+ kIdLdrab, //!< Instruction 'ldrab'.
+ kIdLdrb, //!< Instruction 'ldrb'.
+ kIdLdrh, //!< Instruction 'ldrh'.
+ kIdLdrsb, //!< Instruction 'ldrsb'.
+ kIdLdrsh, //!< Instruction 'ldrsh'.
+ kIdLdrsw, //!< Instruction 'ldrsw'.
+ kIdLdset, //!< Instruction 'ldset'.
+ kIdLdseta, //!< Instruction 'ldseta'.
+ kIdLdsetab, //!< Instruction 'ldsetab'.
+ kIdLdsetah, //!< Instruction 'ldsetah'.
+ kIdLdsetal, //!< Instruction 'ldsetal'.
+ kIdLdsetalb, //!< Instruction 'ldsetalb'.
+ kIdLdsetalh, //!< Instruction 'ldsetalh'.
+ kIdLdsetb, //!< Instruction 'ldsetb'.
+ kIdLdseth, //!< Instruction 'ldseth'.
+ kIdLdsetl, //!< Instruction 'ldsetl'.
+ kIdLdsetlb, //!< Instruction 'ldsetlb'.
+ kIdLdsetlh, //!< Instruction 'ldsetlh'.
+ kIdLdsmax, //!< Instruction 'ldsmax'.
+ kIdLdsmaxa, //!< Instruction 'ldsmaxa'.
+ kIdLdsmaxab, //!< Instruction 'ldsmaxab'.
+ kIdLdsmaxah, //!< Instruction 'ldsmaxah'.
+ kIdLdsmaxal, //!< Instruction 'ldsmaxal'.
+ kIdLdsmaxalb, //!< Instruction 'ldsmaxalb'.
+ kIdLdsmaxalh, //!< Instruction 'ldsmaxalh'.
+ kIdLdsmaxb, //!< Instruction 'ldsmaxb'.
+ kIdLdsmaxh, //!< Instruction 'ldsmaxh'.
+ kIdLdsmaxl, //!< Instruction 'ldsmaxl'.
+ kIdLdsmaxlb, //!< Instruction 'ldsmaxlb'.
+ kIdLdsmaxlh, //!< Instruction 'ldsmaxlh'.
+ kIdLdsmin, //!< Instruction 'ldsmin'.
+ kIdLdsmina, //!< Instruction 'ldsmina'.
+ kIdLdsminab, //!< Instruction 'ldsminab'.
+ kIdLdsminah, //!< Instruction 'ldsminah'.
+ kIdLdsminal, //!< Instruction 'ldsminal'.
+ kIdLdsminalb, //!< Instruction 'ldsminalb'.
+ kIdLdsminalh, //!< Instruction 'ldsminalh'.
+ kIdLdsminb, //!< Instruction 'ldsminb'.
+ kIdLdsminh, //!< Instruction 'ldsminh'.
+ kIdLdsminl, //!< Instruction 'ldsminl'.
+ kIdLdsminlb, //!< Instruction 'ldsminlb'.
+ kIdLdsminlh, //!< Instruction 'ldsminlh'.
+ kIdLdtr, //!< Instruction 'ldtr'.
+ kIdLdtrb, //!< Instruction 'ldtrb'.
+ kIdLdtrh, //!< Instruction 'ldtrh'.
+ kIdLdtrsb, //!< Instruction 'ldtrsb'.
+ kIdLdtrsh, //!< Instruction 'ldtrsh'.
+ kIdLdtrsw, //!< Instruction 'ldtrsw'.
+ kIdLdumax, //!< Instruction 'ldumax'.
+ kIdLdumaxa, //!< Instruction 'ldumaxa'.
+ kIdLdumaxab, //!< Instruction 'ldumaxab'.
+ kIdLdumaxah, //!< Instruction 'ldumaxah'.
+ kIdLdumaxal, //!< Instruction 'ldumaxal'.
+ kIdLdumaxalb, //!< Instruction 'ldumaxalb'.
+ kIdLdumaxalh, //!< Instruction 'ldumaxalh'.
+ kIdLdumaxb, //!< Instruction 'ldumaxb'.
+ kIdLdumaxh, //!< Instruction 'ldumaxh'.
+ kIdLdumaxl, //!< Instruction 'ldumaxl'.
+ kIdLdumaxlb, //!< Instruction 'ldumaxlb'.
+ kIdLdumaxlh, //!< Instruction 'ldumaxlh'.
+ kIdLdumin, //!< Instruction 'ldumin'.
+ kIdLdumina, //!< Instruction 'ldumina'.
+ kIdLduminab, //!< Instruction 'lduminab'.
+ kIdLduminah, //!< Instruction 'lduminah'.
+ kIdLduminal, //!< Instruction 'lduminal'.
+ kIdLduminalb, //!< Instruction 'lduminalb'.
+ kIdLduminalh, //!< Instruction 'lduminalh'.
+ kIdLduminb, //!< Instruction 'lduminb'.
+ kIdLduminh, //!< Instruction 'lduminh'.
+ kIdLduminl, //!< Instruction 'lduminl'.
+ kIdLduminlb, //!< Instruction 'lduminlb'.
+ kIdLduminlh, //!< Instruction 'lduminlh'.
+ kIdLdur, //!< Instruction 'ldur'.
+ kIdLdurb, //!< Instruction 'ldurb'.
+ kIdLdurh, //!< Instruction 'ldurh'.
+ kIdLdursb, //!< Instruction 'ldursb'.
+ kIdLdursh, //!< Instruction 'ldursh'.
+ kIdLdursw, //!< Instruction 'ldursw'.
+ kIdLdxp, //!< Instruction 'ldxp'.
+ kIdLdxr, //!< Instruction 'ldxr'.
+ kIdLdxrb, //!< Instruction 'ldxrb'.
+ kIdLdxrh, //!< Instruction 'ldxrh'.
+ kIdLsl, //!< Instruction 'lsl'.
+ kIdLslv, //!< Instruction 'lslv'.
+ kIdLsr, //!< Instruction 'lsr'.
+ kIdLsrv, //!< Instruction 'lsrv'.
+ kIdMadd, //!< Instruction 'madd'.
+ kIdMneg, //!< Instruction 'mneg'.
+ kIdMov, //!< Instruction 'mov'.
+ kIdMovk, //!< Instruction 'movk'.
+ kIdMovn, //!< Instruction 'movn'.
+ kIdMovz, //!< Instruction 'movz'.
+ kIdMrs, //!< Instruction 'mrs'.
+ kIdMsr, //!< Instruction 'msr'.
+ kIdMsub, //!< Instruction 'msub'.
+ kIdMul, //!< Instruction 'mul'.
+ kIdMvn, //!< Instruction 'mvn'.
+ kIdNeg, //!< Instruction 'neg'.
+ kIdNegs, //!< Instruction 'negs'.
+ kIdNgc, //!< Instruction 'ngc'.
+ kIdNgcs, //!< Instruction 'ngcs'.
+ kIdNop, //!< Instruction 'nop'.
+ kIdOrn, //!< Instruction 'orn'.
+ kIdOrr, //!< Instruction 'orr'.
+ kIdPacda, //!< Instruction 'pacda'.
+ kIdPacdb, //!< Instruction 'pacdb'.
+ kIdPacdza, //!< Instruction 'pacdza'.
+ kIdPacdzb, //!< Instruction 'pacdzb'.
+ kIdPacga, //!< Instruction 'pacga'.
+ kIdPssbb, //!< Instruction 'pssbb'.
+ kIdRbit, //!< Instruction 'rbit'.
+ kIdRet, //!< Instruction 'ret'.
+ kIdRev, //!< Instruction 'rev'.
+ kIdRev16, //!< Instruction 'rev16'.
+ kIdRev32, //!< Instruction 'rev32'.
+ kIdRev64, //!< Instruction 'rev64'.
+ kIdRor, //!< Instruction 'ror'.
+ kIdRorv, //!< Instruction 'rorv'.
+ kIdSbc, //!< Instruction 'sbc'.
+ kIdSbcs, //!< Instruction 'sbcs'.
+ kIdSbfiz, //!< Instruction 'sbfiz'.
+ kIdSbfm, //!< Instruction 'sbfm'.
+ kIdSbfx, //!< Instruction 'sbfx'.
+ kIdSdiv, //!< Instruction 'sdiv'.
+ kIdSetf8, //!< Instruction 'setf8'.
+ kIdSetf16, //!< Instruction 'setf16'.
+ kIdSev, //!< Instruction 'sev'.
+ kIdSevl, //!< Instruction 'sevl'.
+ kIdSmaddl, //!< Instruction 'smaddl'.
+ kIdSmc, //!< Instruction 'smc'.
+ kIdSmnegl, //!< Instruction 'smnegl'.
+ kIdSmsubl, //!< Instruction 'smsubl'.
+ kIdSmulh, //!< Instruction 'smulh'.
+ kIdSmull, //!< Instruction 'smull'.
+ kIdSsbb, //!< Instruction 'ssbb'.
+ kIdSt2g, //!< Instruction 'st2g'.
+ kIdStadd, //!< Instruction 'stadd'.
+ kIdStaddl, //!< Instruction 'staddl'.
+ kIdStaddb, //!< Instruction 'staddb'.
+ kIdStaddlb, //!< Instruction 'staddlb'.
+ kIdStaddh, //!< Instruction 'staddh'.
+ kIdStaddlh, //!< Instruction 'staddlh'.
+ kIdStclr, //!< Instruction 'stclr'.
+ kIdStclrl, //!< Instruction 'stclrl'.
+ kIdStclrb, //!< Instruction 'stclrb'.
+ kIdStclrlb, //!< Instruction 'stclrlb'.
+ kIdStclrh, //!< Instruction 'stclrh'.
+ kIdStclrlh, //!< Instruction 'stclrlh'.
+ kIdSteor, //!< Instruction 'steor'.
+ kIdSteorl, //!< Instruction 'steorl'.
+ kIdSteorb, //!< Instruction 'steorb'.
+ kIdSteorlb, //!< Instruction 'steorlb'.
+ kIdSteorh, //!< Instruction 'steorh'.
+ kIdSteorlh, //!< Instruction 'steorlh'.
+ kIdStg, //!< Instruction 'stg'.
+ kIdStgm, //!< Instruction 'stgm'.
+ kIdStgp, //!< Instruction 'stgp'.
+ kIdStllr, //!< Instruction 'stllr'.
+ kIdStllrb, //!< Instruction 'stllrb'.
+ kIdStllrh, //!< Instruction 'stllrh'.
+ kIdStlr, //!< Instruction 'stlr'.
+ kIdStlrb, //!< Instruction 'stlrb'.
+ kIdStlrh, //!< Instruction 'stlrh'.
+ kIdStlxp, //!< Instruction 'stlxp'.
+ kIdStlxr, //!< Instruction 'stlxr'.
+ kIdStlxrb, //!< Instruction 'stlxrb'.
+ kIdStlxrh, //!< Instruction 'stlxrh'.
+ kIdStnp, //!< Instruction 'stnp'.
+ kIdStp, //!< Instruction 'stp'.
+ kIdStr, //!< Instruction 'str'.
+ kIdStrb, //!< Instruction 'strb'.
+ kIdStrh, //!< Instruction 'strh'.
+ kIdStset, //!< Instruction 'stset'.
+ kIdStsetl, //!< Instruction 'stsetl'.
+ kIdStsetb, //!< Instruction 'stsetb'.
+ kIdStsetlb, //!< Instruction 'stsetlb'.
+ kIdStseth, //!< Instruction 'stseth'.
+ kIdStsetlh, //!< Instruction 'stsetlh'.
+ kIdStsmax, //!< Instruction 'stsmax'.
+ kIdStsmaxl, //!< Instruction 'stsmaxl'.
+ kIdStsmaxb, //!< Instruction 'stsmaxb'.
+ kIdStsmaxlb, //!< Instruction 'stsmaxlb'.
+ kIdStsmaxh, //!< Instruction 'stsmaxh'.
+ kIdStsmaxlh, //!< Instruction 'stsmaxlh'.
+ kIdStsmin, //!< Instruction 'stsmin'.
+ kIdStsminl, //!< Instruction 'stsminl'.
+ kIdStsminb, //!< Instruction 'stsminb'.
+ kIdStsminlb, //!< Instruction 'stsminlb'.
+ kIdStsminh, //!< Instruction 'stsminh'.
+ kIdStsminlh, //!< Instruction 'stsminlh'.
+ kIdSttr, //!< Instruction 'sttr'.
+ kIdSttrb, //!< Instruction 'sttrb'.
+ kIdSttrh, //!< Instruction 'sttrh'.
+ kIdStumax, //!< Instruction 'stumax'.
+ kIdStumaxl, //!< Instruction 'stumaxl'.
+ kIdStumaxb, //!< Instruction 'stumaxb'.
+ kIdStumaxlb, //!< Instruction 'stumaxlb'.
+ kIdStumaxh, //!< Instruction 'stumaxh'.
+ kIdStumaxlh, //!< Instruction 'stumaxlh'.
+ kIdStumin, //!< Instruction 'stumin'.
+ kIdStuminl, //!< Instruction 'stuminl'.
+ kIdStuminb, //!< Instruction 'stuminb'.
+ kIdStuminlb, //!< Instruction 'stuminlb'.
+ kIdStuminh, //!< Instruction 'stuminh'.
+ kIdStuminlh, //!< Instruction 'stuminlh'.
+ kIdStur, //!< Instruction 'stur'.
+ kIdSturb, //!< Instruction 'sturb'.
+ kIdSturh, //!< Instruction 'sturh'.
+ kIdStxp, //!< Instruction 'stxp'.
+ kIdStxr, //!< Instruction 'stxr'.
+ kIdStxrb, //!< Instruction 'stxrb'.
+ kIdStxrh, //!< Instruction 'stxrh'.
+ kIdStz2g, //!< Instruction 'stz2g'.
+ kIdStzg, //!< Instruction 'stzg'.
+ kIdStzgm, //!< Instruction 'stzgm'.
+ kIdSub, //!< Instruction 'sub'.
+ kIdSubg, //!< Instruction 'subg'.
+ kIdSubp, //!< Instruction 'subp'.
+ kIdSubps, //!< Instruction 'subps'.
+ kIdSubs, //!< Instruction 'subs'.
+ kIdSvc, //!< Instruction 'svc'.
+ kIdSwp, //!< Instruction 'swp'.
+ kIdSwpa, //!< Instruction 'swpa'.
+ kIdSwpab, //!< Instruction 'swpab'.
+ kIdSwpah, //!< Instruction 'swpah'.
+ kIdSwpal, //!< Instruction 'swpal'.
+ kIdSwpalb, //!< Instruction 'swpalb'.
+ kIdSwpalh, //!< Instruction 'swpalh'.
+ kIdSwpb, //!< Instruction 'swpb'.
+ kIdSwph, //!< Instruction 'swph'.
+ kIdSwpl, //!< Instruction 'swpl'.
+ kIdSwplb, //!< Instruction 'swplb'.
+ kIdSwplh, //!< Instruction 'swplh'.
+ kIdSxtb, //!< Instruction 'sxtb'.
+ kIdSxth, //!< Instruction 'sxth'.
+ kIdSxtw, //!< Instruction 'sxtw'.
+ kIdSys, //!< Instruction 'sys'.
+ kIdTlbi, //!< Instruction 'tlbi'.
+ kIdTst, //!< Instruction 'tst'.
+ kIdTbnz, //!< Instruction 'tbnz'.
+ kIdTbz, //!< Instruction 'tbz'.
+ kIdUbfiz, //!< Instruction 'ubfiz'.
+ kIdUbfm, //!< Instruction 'ubfm'.
+ kIdUbfx, //!< Instruction 'ubfx'.
+ kIdUdf, //!< Instruction 'udf'.
+ kIdUdiv, //!< Instruction 'udiv'.
+ kIdUmaddl, //!< Instruction 'umaddl'.
+ kIdUmnegl, //!< Instruction 'umnegl'.
+ kIdUmull, //!< Instruction 'umull'.
+ kIdUmulh, //!< Instruction 'umulh'.
+ kIdUmsubl, //!< Instruction 'umsubl'.
+ kIdUxtb, //!< Instruction 'uxtb'.
+ kIdUxth, //!< Instruction 'uxth'.
+ kIdWfe, //!< Instruction 'wfe'.
+ kIdWfi, //!< Instruction 'wfi'.
+ kIdXaflag, //!< Instruction 'xaflag'.
+ kIdXpacd, //!< Instruction 'xpacd'.
+ kIdXpaci, //!< Instruction 'xpaci'.
+ kIdXpaclri, //!< Instruction 'xpaclri'.
+ kIdYield, //!< Instruction 'yield'.
+ kIdAbs_v, //!< Instruction 'abs' {ASIMD}.
+ kIdAdd_v, //!< Instruction 'add' {ASIMD}.
+ kIdAddhn_v, //!< Instruction 'addhn' {ASIMD}.
+ kIdAddhn2_v, //!< Instruction 'addhn2' {ASIMD}.
+ kIdAddp_v, //!< Instruction 'addp' {ASIMD}.
+ kIdAddv_v, //!< Instruction 'addv' {ASIMD}.
+ kIdAesd_v, //!< Instruction 'aesd' {ASIMD}.
+ kIdAese_v, //!< Instruction 'aese' {ASIMD}.
+ kIdAesimc_v, //!< Instruction 'aesimc' {ASIMD}.
+ kIdAesmc_v, //!< Instruction 'aesmc' {ASIMD}.
+ kIdAnd_v, //!< Instruction 'and' {ASIMD}.
+ kIdBcax_v, //!< Instruction 'bcax' {ASIMD}.
+ kIdBfcvt_v, //!< Instruction 'bfcvt' {ASIMD}.
+ kIdBfcvtn_v, //!< Instruction 'bfcvtn' {ASIMD}.
+ kIdBfcvtn2_v, //!< Instruction 'bfcvtn2' {ASIMD}.
+ kIdBfdot_v, //!< Instruction 'bfdot' {ASIMD}.
+ kIdBfmlalb_v, //!< Instruction 'bfmlalb' {ASIMD}.
+ kIdBfmlalt_v, //!< Instruction 'bfmlalt' {ASIMD}.
+ kIdBfmmla_v, //!< Instruction 'bfmmla' {ASIMD}.
+ kIdBic_v, //!< Instruction 'bic' {ASIMD}.
+ kIdBif_v, //!< Instruction 'bif' {ASIMD}.
+ kIdBit_v, //!< Instruction 'bit' {ASIMD}.
+ kIdBsl_v, //!< Instruction 'bsl' {ASIMD}.
+ kIdCls_v, //!< Instruction 'cls' {ASIMD}.
+ kIdClz_v, //!< Instruction 'clz' {ASIMD}.
+ kIdCmeq_v, //!< Instruction 'cmeq' {ASIMD}.
+ kIdCmge_v, //!< Instruction 'cmge' {ASIMD}.
+ kIdCmgt_v, //!< Instruction 'cmgt' {ASIMD}.
+ kIdCmhi_v, //!< Instruction 'cmhi' {ASIMD}.
+ kIdCmhs_v, //!< Instruction 'cmhs' {ASIMD}.
+ kIdCmle_v, //!< Instruction 'cmle' {ASIMD}.
+ kIdCmlt_v, //!< Instruction 'cmlt' {ASIMD}.
+ kIdCmtst_v, //!< Instruction 'cmtst' {ASIMD}.
+ kIdCnt_v, //!< Instruction 'cnt' {ASIMD}.
+ kIdDup_v, //!< Instruction 'dup' {ASIMD}.
+ kIdEor_v, //!< Instruction 'eor' {ASIMD}.
+ kIdEor3_v, //!< Instruction 'eor3' {ASIMD}.
+ kIdExt_v, //!< Instruction 'ext' {ASIMD}.
+ kIdFabd_v, //!< Instruction 'fabd' {ASIMD}.
+ kIdFabs_v, //!< Instruction 'fabs' {ASIMD}.
+ kIdFacge_v, //!< Instruction 'facge' {ASIMD}.
+ kIdFacgt_v, //!< Instruction 'facgt' {ASIMD}.
+ kIdFadd_v, //!< Instruction 'fadd' {ASIMD}.
+ kIdFaddp_v, //!< Instruction 'faddp' {ASIMD}.
+ kIdFcadd_v, //!< Instruction 'fcadd' {ASIMD}.
+ kIdFccmp_v, //!< Instruction 'fccmp' {ASIMD}.
+ kIdFccmpe_v, //!< Instruction 'fccmpe' {ASIMD}.
+ kIdFcmeq_v, //!< Instruction 'fcmeq' {ASIMD}.
+ kIdFcmge_v, //!< Instruction 'fcmge' {ASIMD}.
+ kIdFcmgt_v, //!< Instruction 'fcmgt' {ASIMD}.
+ kIdFcmla_v, //!< Instruction 'fcmla' {ASIMD}.
+ kIdFcmle_v, //!< Instruction 'fcmle' {ASIMD}.
+ kIdFcmlt_v, //!< Instruction 'fcmlt' {ASIMD}.
+ kIdFcmp_v, //!< Instruction 'fcmp' {ASIMD}.
+ kIdFcmpe_v, //!< Instruction 'fcmpe' {ASIMD}.
+ kIdFcsel_v, //!< Instruction 'fcsel' {ASIMD}.
+ kIdFcvt_v, //!< Instruction 'fcvt' {ASIMD}.
+ kIdFcvtas_v, //!< Instruction 'fcvtas' {ASIMD}.
+ kIdFcvtau_v, //!< Instruction 'fcvtau' {ASIMD}.
+ kIdFcvtl_v, //!< Instruction 'fcvtl' {ASIMD}.
+ kIdFcvtl2_v, //!< Instruction 'fcvtl2' {ASIMD}.
+ kIdFcvtms_v, //!< Instruction 'fcvtms' {ASIMD}.
+ kIdFcvtmu_v, //!< Instruction 'fcvtmu' {ASIMD}.
+ kIdFcvtn_v, //!< Instruction 'fcvtn' {ASIMD}.
+ kIdFcvtn2_v, //!< Instruction 'fcvtn2' {ASIMD}.
+ kIdFcvtns_v, //!< Instruction 'fcvtns' {ASIMD}.
+ kIdFcvtnu_v, //!< Instruction 'fcvtnu' {ASIMD}.
+ kIdFcvtps_v, //!< Instruction 'fcvtps' {ASIMD}.
+ kIdFcvtpu_v, //!< Instruction 'fcvtpu' {ASIMD}.
+ kIdFcvtxn_v, //!< Instruction 'fcvtxn' {ASIMD}.
+ kIdFcvtxn2_v, //!< Instruction 'fcvtxn2' {ASIMD}.
+ kIdFcvtzs_v, //!< Instruction 'fcvtzs' {ASIMD}.
+ kIdFcvtzu_v, //!< Instruction 'fcvtzu' {ASIMD}.
+ kIdFdiv_v, //!< Instruction 'fdiv' {ASIMD}.
+ kIdFjcvtzs_v, //!< Instruction 'fjcvtzs' {ASIMD}.
+ kIdFmadd_v, //!< Instruction 'fmadd' {ASIMD}.
+ kIdFmax_v, //!< Instruction 'fmax' {ASIMD}.
+ kIdFmaxnm_v, //!< Instruction 'fmaxnm' {ASIMD}.
+ kIdFmaxnmp_v, //!< Instruction 'fmaxnmp' {ASIMD}.
+ kIdFmaxnmv_v, //!< Instruction 'fmaxnmv' {ASIMD}.
+ kIdFmaxp_v, //!< Instruction 'fmaxp' {ASIMD}.
+ kIdFmaxv_v, //!< Instruction 'fmaxv' {ASIMD}.
+ kIdFmin_v, //!< Instruction 'fmin' {ASIMD}.
+ kIdFminnm_v, //!< Instruction 'fminnm' {ASIMD}.
+ kIdFminnmp_v, //!< Instruction 'fminnmp' {ASIMD}.
+ kIdFminnmv_v, //!< Instruction 'fminnmv' {ASIMD}.
+ kIdFminp_v, //!< Instruction 'fminp' {ASIMD}.
+ kIdFminv_v, //!< Instruction 'fminv' {ASIMD}.
+ kIdFmla_v, //!< Instruction 'fmla' {ASIMD}.
+ kIdFmlal_v, //!< Instruction 'fmlal' {ASIMD}.
+ kIdFmlal2_v, //!< Instruction 'fmlal2' {ASIMD}.
+ kIdFmls_v, //!< Instruction 'fmls' {ASIMD}.
+ kIdFmlsl_v, //!< Instruction 'fmlsl' {ASIMD}.
+ kIdFmlsl2_v, //!< Instruction 'fmlsl2' {ASIMD}.
+ kIdFmov_v, //!< Instruction 'fmov' {ASIMD}.
+ kIdFmsub_v, //!< Instruction 'fmsub' {ASIMD}.
+ kIdFmul_v, //!< Instruction 'fmul' {ASIMD}.
+ kIdFmulx_v, //!< Instruction 'fmulx' {ASIMD}.
+ kIdFneg_v, //!< Instruction 'fneg' {ASIMD}.
+ kIdFnmadd_v, //!< Instruction 'fnmadd' {ASIMD}.
+ kIdFnmsub_v, //!< Instruction 'fnmsub' {ASIMD}.
+ kIdFnmul_v, //!< Instruction 'fnmul' {ASIMD}.
+ kIdFrecpe_v, //!< Instruction 'frecpe' {ASIMD}.
+ kIdFrecps_v, //!< Instruction 'frecps' {ASIMD}.
+ kIdFrecpx_v, //!< Instruction 'frecpx' {ASIMD}.
+ kIdFrint32x_v, //!< Instruction 'frint32x' {ASIMD}.
+ kIdFrint32z_v, //!< Instruction 'frint32z' {ASIMD}.
+ kIdFrint64x_v, //!< Instruction 'frint64x' {ASIMD}.
+ kIdFrint64z_v, //!< Instruction 'frint64z' {ASIMD}.
+ kIdFrinta_v, //!< Instruction 'frinta' {ASIMD}.
+ kIdFrinti_v, //!< Instruction 'frinti' {ASIMD}.
+ kIdFrintm_v, //!< Instruction 'frintm' {ASIMD}.
+ kIdFrintn_v, //!< Instruction 'frintn' {ASIMD}.
+ kIdFrintp_v, //!< Instruction 'frintp' {ASIMD}.
+ kIdFrintx_v, //!< Instruction 'frintx' {ASIMD}.
+ kIdFrintz_v, //!< Instruction 'frintz' {ASIMD}.
+ kIdFrsqrte_v, //!< Instruction 'frsqrte' {ASIMD}.
+ kIdFrsqrts_v, //!< Instruction 'frsqrts' {ASIMD}.
+ kIdFsqrt_v, //!< Instruction 'fsqrt' {ASIMD}.
+ kIdFsub_v, //!< Instruction 'fsub' {ASIMD}.
+ kIdIns_v, //!< Instruction 'ins' {ASIMD}.
+ kIdLd1_v, //!< Instruction 'ld1' {ASIMD}.
+ kIdLd1r_v, //!< Instruction 'ld1r' {ASIMD}.
+ kIdLd2_v, //!< Instruction 'ld2' {ASIMD}.
+ kIdLd2r_v, //!< Instruction 'ld2r' {ASIMD}.
+ kIdLd3_v, //!< Instruction 'ld3' {ASIMD}.
+ kIdLd3r_v, //!< Instruction 'ld3r' {ASIMD}.
+ kIdLd4_v, //!< Instruction 'ld4' {ASIMD}.
+ kIdLd4r_v, //!< Instruction 'ld4r' {ASIMD}.
+ kIdLdnp_v, //!< Instruction 'ldnp' {ASIMD}.
+ kIdLdp_v, //!< Instruction 'ldp' {ASIMD}.
+ kIdLdr_v, //!< Instruction 'ldr' {ASIMD}.
+ kIdLdur_v, //!< Instruction 'ldur' {ASIMD}.
+ kIdMla_v, //!< Instruction 'mla' {ASIMD}.
+ kIdMls_v, //!< Instruction 'mls' {ASIMD}.
+ kIdMov_v, //!< Instruction 'mov' {ASIMD}.
+ kIdMovi_v, //!< Instruction 'movi' {ASIMD}.
+ kIdMul_v, //!< Instruction 'mul' {ASIMD}.
+ kIdMvn_v, //!< Instruction 'mvn' {ASIMD}.
+ kIdMvni_v, //!< Instruction 'mvni' {ASIMD}.
+ kIdNeg_v, //!< Instruction 'neg' {ASIMD}.
+ kIdNot_v, //!< Instruction 'not' {ASIMD}.
+ kIdOrn_v, //!< Instruction 'orn' {ASIMD}.
+ kIdOrr_v, //!< Instruction 'orr' {ASIMD}.
+ kIdPmul_v, //!< Instruction 'pmul' {ASIMD}.
+ kIdPmull_v, //!< Instruction 'pmull' {ASIMD}.
+ kIdPmull2_v, //!< Instruction 'pmull2' {ASIMD}.
+ kIdRaddhn_v, //!< Instruction 'raddhn' {ASIMD}.
+ kIdRaddhn2_v, //!< Instruction 'raddhn2' {ASIMD}.
+ kIdRax1_v, //!< Instruction 'rax1' {ASIMD}.
+ kIdRbit_v, //!< Instruction 'rbit' {ASIMD}.
+ kIdRev16_v, //!< Instruction 'rev16' {ASIMD}.
+ kIdRev32_v, //!< Instruction 'rev32' {ASIMD}.
+ kIdRev64_v, //!< Instruction 'rev64' {ASIMD}.
+ kIdRshrn_v, //!< Instruction 'rshrn' {ASIMD}.
+ kIdRshrn2_v, //!< Instruction 'rshrn2' {ASIMD}.
+ kIdRsubhn_v, //!< Instruction 'rsubhn' {ASIMD}.
+ kIdRsubhn2_v, //!< Instruction 'rsubhn2' {ASIMD}.
+ kIdSaba_v, //!< Instruction 'saba' {ASIMD}.
+ kIdSabal_v, //!< Instruction 'sabal' {ASIMD}.
+ kIdSabal2_v, //!< Instruction 'sabal2' {ASIMD}.
+ kIdSabd_v, //!< Instruction 'sabd' {ASIMD}.
+ kIdSabdl_v, //!< Instruction 'sabdl' {ASIMD}.
+ kIdSabdl2_v, //!< Instruction 'sabdl2' {ASIMD}.
+ kIdSadalp_v, //!< Instruction 'sadalp' {ASIMD}.
+ kIdSaddl_v, //!< Instruction 'saddl' {ASIMD}.
+ kIdSaddl2_v, //!< Instruction 'saddl2' {ASIMD}.
+ kIdSaddlp_v, //!< Instruction 'saddlp' {ASIMD}.
+ kIdSaddlv_v, //!< Instruction 'saddlv' {ASIMD}.
+ kIdSaddw_v, //!< Instruction 'saddw' {ASIMD}.
+ kIdSaddw2_v, //!< Instruction 'saddw2' {ASIMD}.
+ kIdScvtf_v, //!< Instruction 'scvtf' {ASIMD}.
+ kIdSdot_v, //!< Instruction 'sdot' {ASIMD}.
+ kIdSha1c_v, //!< Instruction 'sha1c' {ASIMD}.
+ kIdSha1h_v, //!< Instruction 'sha1h' {ASIMD}.
+ kIdSha1m_v, //!< Instruction 'sha1m' {ASIMD}.
+ kIdSha1p_v, //!< Instruction 'sha1p' {ASIMD}.
+ kIdSha1su0_v, //!< Instruction 'sha1su0' {ASIMD}.
+ kIdSha1su1_v, //!< Instruction 'sha1su1' {ASIMD}.
+ kIdSha256h_v, //!< Instruction 'sha256h' {ASIMD}.
+ kIdSha256h2_v, //!< Instruction 'sha256h2' {ASIMD}.
+ kIdSha256su0_v, //!< Instruction 'sha256su0' {ASIMD}.
+ kIdSha256su1_v, //!< Instruction 'sha256su1' {ASIMD}.
+ kIdSha512h_v, //!< Instruction 'sha512h' {ASIMD}.
+ kIdSha512h2_v, //!< Instruction 'sha512h2' {ASIMD}.
+ kIdSha512su0_v, //!< Instruction 'sha512su0' {ASIMD}.
+ kIdSha512su1_v, //!< Instruction 'sha512su1' {ASIMD}.
+ kIdShadd_v, //!< Instruction 'shadd' {ASIMD}.
+ kIdShl_v, //!< Instruction 'shl' {ASIMD}.
+ kIdShll_v, //!< Instruction 'shll' {ASIMD}.
+ kIdShll2_v, //!< Instruction 'shll2' {ASIMD}.
+ kIdShrn_v, //!< Instruction 'shrn' {ASIMD}.
+ kIdShrn2_v, //!< Instruction 'shrn2' {ASIMD}.
+ kIdShsub_v, //!< Instruction 'shsub' {ASIMD}.
+ kIdSli_v, //!< Instruction 'sli' {ASIMD}.
+ kIdSm3partw1_v, //!< Instruction 'sm3partw1' {ASIMD}.
+ kIdSm3partw2_v, //!< Instruction 'sm3partw2' {ASIMD}.
+ kIdSm3ss1_v, //!< Instruction 'sm3ss1' {ASIMD}.
+ kIdSm3tt1a_v, //!< Instruction 'sm3tt1a' {ASIMD}.
+ kIdSm3tt1b_v, //!< Instruction 'sm3tt1b' {ASIMD}.
+ kIdSm3tt2a_v, //!< Instruction 'sm3tt2a' {ASIMD}.
+ kIdSm3tt2b_v, //!< Instruction 'sm3tt2b' {ASIMD}.
+ kIdSm4e_v, //!< Instruction 'sm4e' {ASIMD}.
+ kIdSm4ekey_v, //!< Instruction 'sm4ekey' {ASIMD}.
+ kIdSmax_v, //!< Instruction 'smax' {ASIMD}.
+ kIdSmaxp_v, //!< Instruction 'smaxp' {ASIMD}.
+ kIdSmaxv_v, //!< Instruction 'smaxv' {ASIMD}.
+ kIdSmin_v, //!< Instruction 'smin' {ASIMD}.
+ kIdSminp_v, //!< Instruction 'sminp' {ASIMD}.
+ kIdSminv_v, //!< Instruction 'sminv' {ASIMD}.
+ kIdSmlal_v, //!< Instruction 'smlal' {ASIMD}.
+ kIdSmlal2_v, //!< Instruction 'smlal2' {ASIMD}.
+ kIdSmlsl_v, //!< Instruction 'smlsl' {ASIMD}.
+ kIdSmlsl2_v, //!< Instruction 'smlsl2' {ASIMD}.
+ kIdSmmla_v, //!< Instruction 'smmla' {ASIMD}.
+ kIdSmov_v, //!< Instruction 'smov' {ASIMD}.
+ kIdSmull_v, //!< Instruction 'smull' {ASIMD}.
+ kIdSmull2_v, //!< Instruction 'smull2' {ASIMD}.
+ kIdSqabs_v, //!< Instruction 'sqabs' {ASIMD}.
+ kIdSqadd_v, //!< Instruction 'sqadd' {ASIMD}.
+ kIdSqdmlal_v, //!< Instruction 'sqdmlal' {ASIMD}.
+ kIdSqdmlal2_v, //!< Instruction 'sqdmlal2' {ASIMD}.
+ kIdSqdmlsl_v, //!< Instruction 'sqdmlsl' {ASIMD}.
+ kIdSqdmlsl2_v, //!< Instruction 'sqdmlsl2' {ASIMD}.
+ kIdSqdmulh_v, //!< Instruction 'sqdmulh' {ASIMD}.
+ kIdSqdmull_v, //!< Instruction 'sqdmull' {ASIMD}.
+ kIdSqdmull2_v, //!< Instruction 'sqdmull2' {ASIMD}.
+ kIdSqneg_v, //!< Instruction 'sqneg' {ASIMD}.
+ kIdSqrdmlah_v, //!< Instruction 'sqrdmlah' {ASIMD}.
+ kIdSqrdmlsh_v, //!< Instruction 'sqrdmlsh' {ASIMD}.
+ kIdSqrdmulh_v, //!< Instruction 'sqrdmulh' {ASIMD}.
+ kIdSqrshl_v, //!< Instruction 'sqrshl' {ASIMD}.
+ kIdSqrshrn_v, //!< Instruction 'sqrshrn' {ASIMD}.
+ kIdSqrshrn2_v, //!< Instruction 'sqrshrn2' {ASIMD}.
+ kIdSqrshrun_v, //!< Instruction 'sqrshrun' {ASIMD}.
+ kIdSqrshrun2_v, //!< Instruction 'sqrshrun2' {ASIMD}.
+ kIdSqshl_v, //!< Instruction 'sqshl' {ASIMD}.
+ kIdSqshlu_v, //!< Instruction 'sqshlu' {ASIMD}.
+ kIdSqshrn_v, //!< Instruction 'sqshrn' {ASIMD}.
+ kIdSqshrn2_v, //!< Instruction 'sqshrn2' {ASIMD}.
+ kIdSqshrun_v, //!< Instruction 'sqshrun' {ASIMD}.
+ kIdSqshrun2_v, //!< Instruction 'sqshrun2' {ASIMD}.
+ kIdSqsub_v, //!< Instruction 'sqsub' {ASIMD}.
+ kIdSqxtn_v, //!< Instruction 'sqxtn' {ASIMD}.
+ kIdSqxtn2_v, //!< Instruction 'sqxtn2' {ASIMD}.
+ kIdSqxtun_v, //!< Instruction 'sqxtun' {ASIMD}.
+ kIdSqxtun2_v, //!< Instruction 'sqxtun2' {ASIMD}.
+ kIdSrhadd_v, //!< Instruction 'srhadd' {ASIMD}.
+ kIdSri_v, //!< Instruction 'sri' {ASIMD}.
+ kIdSrshl_v, //!< Instruction 'srshl' {ASIMD}.
+ kIdSrshr_v, //!< Instruction 'srshr' {ASIMD}.
+ kIdSrsra_v, //!< Instruction 'srsra' {ASIMD}.
+ kIdSshl_v, //!< Instruction 'sshl' {ASIMD}.
+ kIdSshll_v, //!< Instruction 'sshll' {ASIMD}.
+ kIdSshll2_v, //!< Instruction 'sshll2' {ASIMD}.
+ kIdSshr_v, //!< Instruction 'sshr' {ASIMD}.
+ kIdSsra_v, //!< Instruction 'ssra' {ASIMD}.
+ kIdSsubl_v, //!< Instruction 'ssubl' {ASIMD}.
+ kIdSsubl2_v, //!< Instruction 'ssubl2' {ASIMD}.
+ kIdSsubw_v, //!< Instruction 'ssubw' {ASIMD}.
+ kIdSsubw2_v, //!< Instruction 'ssubw2' {ASIMD}.
+ kIdSt1_v, //!< Instruction 'st1' {ASIMD}.
+ kIdSt2_v, //!< Instruction 'st2' {ASIMD}.
+ kIdSt3_v, //!< Instruction 'st3' {ASIMD}.
+ kIdSt4_v, //!< Instruction 'st4' {ASIMD}.
+ kIdStnp_v, //!< Instruction 'stnp' {ASIMD}.
+ kIdStp_v, //!< Instruction 'stp' {ASIMD}.
+ kIdStr_v, //!< Instruction 'str' {ASIMD}.
+ kIdStur_v, //!< Instruction 'stur' {ASIMD}.
+ kIdSub_v, //!< Instruction 'sub' {ASIMD}.
+ kIdSubhn_v, //!< Instruction 'subhn' {ASIMD}.
+ kIdSubhn2_v, //!< Instruction 'subhn2' {ASIMD}.
+ kIdSudot_v, //!< Instruction 'sudot' {ASIMD}.
+ kIdSuqadd_v, //!< Instruction 'suqadd' {ASIMD}.
+ kIdSxtl_v, //!< Instruction 'sxtl' {ASIMD}.
+ kIdSxtl2_v, //!< Instruction 'sxtl2' {ASIMD}.
+ kIdTbl_v, //!< Instruction 'tbl' {ASIMD}.
+ kIdTbx_v, //!< Instruction 'tbx' {ASIMD}.
+ kIdTrn1_v, //!< Instruction 'trn1' {ASIMD}.
+ kIdTrn2_v, //!< Instruction 'trn2' {ASIMD}.
+ kIdUaba_v, //!< Instruction 'uaba' {ASIMD}.
+ kIdUabal_v, //!< Instruction 'uabal' {ASIMD}.
+ kIdUabal2_v, //!< Instruction 'uabal2' {ASIMD}.
+ kIdUabd_v, //!< Instruction 'uabd' {ASIMD}.
+ kIdUabdl_v, //!< Instruction 'uabdl' {ASIMD}.
+ kIdUabdl2_v, //!< Instruction 'uabdl2' {ASIMD}.
+ kIdUadalp_v, //!< Instruction 'uadalp' {ASIMD}.
+ kIdUaddl_v, //!< Instruction 'uaddl' {ASIMD}.
+ kIdUaddl2_v, //!< Instruction 'uaddl2' {ASIMD}.
+ kIdUaddlp_v, //!< Instruction 'uaddlp' {ASIMD}.
+ kIdUaddlv_v, //!< Instruction 'uaddlv' {ASIMD}.
+ kIdUaddw_v, //!< Instruction 'uaddw' {ASIMD}.
+ kIdUaddw2_v, //!< Instruction 'uaddw2' {ASIMD}.
+ kIdUcvtf_v, //!< Instruction 'ucvtf' {ASIMD}.
+ kIdUdot_v, //!< Instruction 'udot' {ASIMD}.
+ kIdUhadd_v, //!< Instruction 'uhadd' {ASIMD}.
+ kIdUhsub_v, //!< Instruction 'uhsub' {ASIMD}.
+ kIdUmax_v, //!< Instruction 'umax' {ASIMD}.
+ kIdUmaxp_v, //!< Instruction 'umaxp' {ASIMD}.
+ kIdUmaxv_v, //!< Instruction 'umaxv' {ASIMD}.
+ kIdUmin_v, //!< Instruction 'umin' {ASIMD}.
+ kIdUminp_v, //!< Instruction 'uminp' {ASIMD}.
+ kIdUminv_v, //!< Instruction 'uminv' {ASIMD}.
+ kIdUmlal_v, //!< Instruction 'umlal' {ASIMD}.
+ kIdUmlal2_v, //!< Instruction 'umlal2' {ASIMD}.
+ kIdUmlsl_v, //!< Instruction 'umlsl' {ASIMD}.
+ kIdUmlsl2_v, //!< Instruction 'umlsl2' {ASIMD}.
+ kIdUmmla_v, //!< Instruction 'ummla' {ASIMD}.
+ kIdUmov_v, //!< Instruction 'umov' {ASIMD}.
+ kIdUmull_v, //!< Instruction 'umull' {ASIMD}.
+ kIdUmull2_v, //!< Instruction 'umull2' {ASIMD}.
+ kIdUqadd_v, //!< Instruction 'uqadd' {ASIMD}.
+ kIdUqrshl_v, //!< Instruction 'uqrshl' {ASIMD}.
+ kIdUqrshrn_v, //!< Instruction 'uqrshrn' {ASIMD}.
+ kIdUqrshrn2_v, //!< Instruction 'uqrshrn2' {ASIMD}.
+ kIdUqshl_v, //!< Instruction 'uqshl' {ASIMD}.
+ kIdUqshrn_v, //!< Instruction 'uqshrn' {ASIMD}.
+ kIdUqshrn2_v, //!< Instruction 'uqshrn2' {ASIMD}.
+ kIdUqsub_v, //!< Instruction 'uqsub' {ASIMD}.
+ kIdUqxtn_v, //!< Instruction 'uqxtn' {ASIMD}.
+ kIdUqxtn2_v, //!< Instruction 'uqxtn2' {ASIMD}.
+ kIdUrecpe_v, //!< Instruction 'urecpe' {ASIMD}.
+ kIdUrhadd_v, //!< Instruction 'urhadd' {ASIMD}.
+ kIdUrshl_v, //!< Instruction 'urshl' {ASIMD}.
+ kIdUrshr_v, //!< Instruction 'urshr' {ASIMD}.
+ kIdUrsqrte_v, //!< Instruction 'ursqrte' {ASIMD}.
+ kIdUrsra_v, //!< Instruction 'ursra' {ASIMD}.
+ kIdUsdot_v, //!< Instruction 'usdot' {ASIMD}.
+ kIdUshl_v, //!< Instruction 'ushl' {ASIMD}.
+ kIdUshll_v, //!< Instruction 'ushll' {ASIMD}.
+ kIdUshll2_v, //!< Instruction 'ushll2' {ASIMD}.
+ kIdUshr_v, //!< Instruction 'ushr' {ASIMD}.
+ kIdUsmmla_v, //!< Instruction 'usmmla' {ASIMD}.
+ kIdUsqadd_v, //!< Instruction 'usqadd' {ASIMD}.
+ kIdUsra_v, //!< Instruction 'usra' {ASIMD}.
+ kIdUsubl_v, //!< Instruction 'usubl' {ASIMD}.
+ kIdUsubl2_v, //!< Instruction 'usubl2' {ASIMD}.
+ kIdUsubw_v, //!< Instruction 'usubw' {ASIMD}.
+ kIdUsubw2_v, //!< Instruction 'usubw2' {ASIMD}.
+ kIdUxtl_v, //!< Instruction 'uxtl' {ASIMD}.
+ kIdUxtl2_v, //!< Instruction 'uxtl2' {ASIMD}.
+ kIdUzp1_v, //!< Instruction 'uzp1' {ASIMD}.
+ kIdUzp2_v, //!< Instruction 'uzp2' {ASIMD}.
+ kIdXar_v, //!< Instruction 'xar' {ASIMD}.
+ kIdXtn_v, //!< Instruction 'xtn' {ASIMD}.
+ kIdXtn2_v, //!< Instruction 'xtn2' {ASIMD}.
+ kIdZip1_v, //!< Instruction 'zip1' {ASIMD}.
+ kIdZip2_v, //!< Instruction 'zip2' {ASIMD}.
+ _kIdCount
+ // ${InstId:End}
+ };
+
+ //! Tests whether the `instId` is defined (counts also Inst::kIdNone, which must be zero).
+ static inline bool isDefinedId(InstId instId) noexcept { return (instId & uint32_t(InstIdParts::kRealId)) < _kIdCount; }
+};
+
+namespace Predicate {
+
+//! Address translate options (AT).
+namespace AT {
+ static inline constexpr uint32_t encode(uint32_t op1, uint32_t cRn, uint32_t cRm, uint32_t op2) noexcept {
+ return (op1 << 11) | (cRn << 7) | (cRm << 3) | (op2 << 0);
+ }
+
+ enum Value : uint32_t {
+ kS1E1R = encode(0b000, 0b0111, 0b1000, 0b000),
+ kS1E2R = encode(0b100, 0b0111, 0b1000, 0b000),
+ kS1E3R = encode(0b110, 0b0111, 0b1000, 0b000),
+ kS1E1W = encode(0b000, 0b0111, 0b1000, 0b001),
+ kS1E2W = encode(0b100, 0b0111, 0b1000, 0b001),
+ kS1E3W = encode(0b110, 0b0111, 0b1000, 0b001),
+ kS1E0R = encode(0b000, 0b0111, 0b1000, 0b010),
+ kS1E0W = encode(0b000, 0b0111, 0b1000, 0b011),
+ kS12E1R = encode(0b100, 0b0111, 0b1000, 0b100),
+ kS12E1W = encode(0b100, 0b0111, 0b1000, 0b101),
+ kS12E0R = encode(0b100, 0b0111, 0b1000, 0b110),
+ kS12E0W = encode(0b100, 0b0111, 0b1000, 0b111),
+ kS1E1RP = encode(0b000, 0b0111, 0b1001, 0b000),
+ kS1E1WP = encode(0b000, 0b0111, 0b1001, 0b001)
+ };
+}
+
+//! Data barrier options (DMB/DSB).
+namespace DB {
+ //! Data barrier immediate values.
+ enum Value : uint32_t {
+ //! Waits only for loads to complete, and only applies to the outer shareable domain.
+ kOSHLD = 0x01u,
+ //! Waits only for stores to complete, and only applies to the outer shareable domain.
+ kOSHST = 0x02u,
+ //! Only applies to the outer shareable domain.
+ kOSH = 0x03u,
+
+ //! Waits only for loads to complete and only applies out to the point of unification.
+ kNSHLD = 0x05u,
+ //! Waits only for stores to complete and only applies out to the point of unification.
+ kNSHST = 0x06u,
+ //! Only applies out to the point of unification.
+ kNSH = 0x07u,
+
+ //! Waits only for loads to complete, and only applies to the inner shareable domain.
+ kISHLD = 0x09u,
+ //! Waits only for stores to complete, and only applies to the inner shareable domain.
+ kISHST = 0x0Au,
+ //! Only applies to the inner shareable domain.
+ kISH = 0x0Bu,
+
+ //! Waits only for loads to complete.
+ kLD = 0x0Du,
+ //! Waits only for stores to complete.
+ kST = 0x0Eu,
+ //! Full system memory barrier operation.
+ kSY = 0x0Fu
+ };
+}
+
+//! Data cache maintenance options.
+namespace DC {
+ static inline constexpr uint32_t encode(uint32_t op1, uint32_t cRn, uint32_t cRm, uint32_t op2) noexcept {
+ return (op1 << 11) | (cRn << 7) | (cRm << 3) | (op2 << 0);
+ }
+
+ //! Data cache maintenance immediate values.
+ enum Value : uint32_t {
+ kZVA = encode(0b011, 0b0111, 0b0100, 0b001),
+ kIVAC = encode(0b000, 0b0111, 0b0110, 0b001),
+ kISW = encode(0b000, 0b0111, 0b0110, 0b010),
+ kCVAC = encode(0b011, 0b0111, 0b1010, 0b001),
+ kCSW = encode(0b000, 0b0111, 0b1010, 0b010),
+ kCVAU = encode(0b011, 0b0111, 0b1011, 0b001),
+ kCIVAC = encode(0b011, 0b0111, 0b1110, 0b001),
+ kCISW = encode(0b000, 0b0111, 0b1110, 0b010),
+ kCVAP = encode(0b011, 0b0111, 0b1100, 0b001),
+ kCVADP = encode(0b011, 0b0111, 0b1101, 0b001),
+ kIGVAC = encode(0b000, 0b0111, 0b0110, 0b011),
+ kIGSW = encode(0b000, 0b0111, 0b0110, 0b100),
+ kCGSW = encode(0b000, 0b0111, 0b1010, 0b100),
+ kCIGSW = encode(0b000, 0b0111, 0b1110, 0b100),
+ kCGVAC = encode(0b011, 0b0111, 0b1010, 0b011),
+ kCGVAP = encode(0b011, 0b0111, 0b1100, 0b011),
+ kCGVADP = encode(0b011, 0b0111, 0b1101, 0b011),
+ kCIGVAC = encode(0b011, 0b0111, 0b1110, 0b011),
+ kGVA = encode(0b011, 0b0111, 0b0100, 0b011),
+ kIGDVAC = encode(0b000, 0b0111, 0b0110, 0b101),
+ kIGDSW = encode(0b000, 0b0111, 0b0110, 0b110),
+ kCGDSW = encode(0b000, 0b0111, 0b1010, 0b110),
+ kCIGDSW = encode(0b000, 0b0111, 0b1110, 0b110),
+ kCGDVAC = encode(0b011, 0b0111, 0b1010, 0b101),
+ kCGDVAP = encode(0b011, 0b0111, 0b1100, 0b101),
+ kCGDVADP = encode(0b011, 0b0111, 0b1101, 0b101),
+ kCIGDVAC = encode(0b011, 0b0111, 0b1110, 0b101),
+ kGZVA = encode(0b011, 0b0111, 0b0100, 0b100)
+ };
+}
+
+//! Instruction cache maintenance options.
+namespace IC {
+ static inline constexpr uint32_t encode(uint32_t op1, uint32_t cRn, uint32_t cRm, uint32_t op2) noexcept {
+ return (op1 << 11) | (cRn << 7) | (cRm << 3) | (op2 << 0);
+ }
+
+ //! Instruction cache maintenance immediate values.
+ enum Value : uint32_t {
+ kIALLUIS = encode(0b000, 0b0111, 0b0001, 0b000),
+ kIALLU = encode(0b000, 0b0111, 0b0101, 0b000),
+ kIVAU = encode(0b011, 0b0111, 0b0101, 0b001)
+ };
+}
+
+//! Instruction-fetch barrier options.
+namespace ISB {
+ //! Instruction-fetch barrier immediate values.
+ enum Value : uint32_t {
+ kSY = 0xF
+ };
+}
+
+//! Prefetch options.
+namespace PRFOp {
+ //! Prefetch immediate values.
+ enum Value : uint32_t {
+ kPLDL1KEEP = 0x00,
+ kPLDL1STRM = 0x01,
+ kPLDL2KEEP = 0x02,
+ kPLDL2STRM = 0x03,
+ kPLDL3KEEP = 0x04,
+ kPLDL3STRM = 0x05,
+ kPLIL1KEEP = 0x08,
+ kPLIL1STRM = 0x09,
+ kPLIL2KEEP = 0x0A,
+ kPLIL2STRM = 0x0B,
+ kPLIL3KEEP = 0x0C,
+ kPLIL3STRM = 0x0D,
+ kPSTL1KEEP = 0x10,
+ kPSTL1STRM = 0x11,
+ kPSTL2KEEP = 0x12,
+ kPSTL2STRM = 0x13,
+ kPSTL3KEEP = 0x14,
+ kPSTL3STRM = 0x15
+ };
+}
+
+//! PSB instruction options.
+namespace PSB {
+ //! PSB immediate values.
+ enum Value : uint32_t {
+ kCSYNC = 0x11u
+ };
+}
+
+namespace TLBI {
+ static inline constexpr uint32_t encode(uint32_t op1, uint32_t cRn, uint32_t cRm, uint32_t op2) noexcept {
+ return (op1 << 11) | (cRn << 7) | (cRm << 3) | (op2 << 0);
+ }
+
+ enum Value : uint32_t {
+ kIPAS2E1IS = encode(0b100, 0b1000, 0b0000, 0b001),
+ kIPAS2LE1IS = encode(0b100, 0b1000, 0b0000, 0b101),
+ kVMALLE1IS = encode(0b000, 0b1000, 0b0011, 0b000),
+ kALLE2IS = encode(0b100, 0b1000, 0b0011, 0b000),
+ kALLE3IS = encode(0b110, 0b1000, 0b0011, 0b000),
+ kVAE1IS = encode(0b000, 0b1000, 0b0011, 0b001),
+ kVAE2IS = encode(0b100, 0b1000, 0b0011, 0b001),
+ kVAE3IS = encode(0b110, 0b1000, 0b0011, 0b001),
+ kASIDE1IS = encode(0b000, 0b1000, 0b0011, 0b010),
+ kVAAE1IS = encode(0b000, 0b1000, 0b0011, 0b011),
+ kALLE1IS = encode(0b100, 0b1000, 0b0011, 0b100),
+ kVALE1IS = encode(0b000, 0b1000, 0b0011, 0b101),
+ kVALE2IS = encode(0b100, 0b1000, 0b0011, 0b101),
+ kVALE3IS = encode(0b110, 0b1000, 0b0011, 0b101),
+ kVMALLS12E1IS = encode(0b100, 0b1000, 0b0011, 0b110),
+ kVAALE1IS = encode(0b000, 0b1000, 0b0011, 0b111),
+ kIPAS2E1 = encode(0b100, 0b1000, 0b0100, 0b001),
+ kIPAS2LE1 = encode(0b100, 0b1000, 0b0100, 0b101),
+ kVMALLE1 = encode(0b000, 0b1000, 0b0111, 0b000),
+ kALLE2 = encode(0b100, 0b1000, 0b0111, 0b000),
+ kALLE3 = encode(0b110, 0b1000, 0b0111, 0b000),
+ kVAE1 = encode(0b000, 0b1000, 0b0111, 0b001),
+ kVAE2 = encode(0b100, 0b1000, 0b0111, 0b001),
+ kVAE3 = encode(0b110, 0b1000, 0b0111, 0b001),
+ kASIDE1 = encode(0b000, 0b1000, 0b0111, 0b010),
+ kVAAE1 = encode(0b000, 0b1000, 0b0111, 0b011),
+ kALLE1 = encode(0b100, 0b1000, 0b0111, 0b100),
+ kVALE1 = encode(0b000, 0b1000, 0b0111, 0b101),
+ kVALE2 = encode(0b100, 0b1000, 0b0111, 0b101),
+ kVALE3 = encode(0b110, 0b1000, 0b0111, 0b101),
+ kVMALLS12E1 = encode(0b100, 0b1000, 0b0111, 0b110),
+ kVAALE1 = encode(0b000, 0b1000, 0b0111, 0b111),
+
+ kVMALLE1OS = encode(0b000, 0b1000, 0b0001, 0b000),
+ kVAE1OS = encode(0b000, 0b1000, 0b0001, 0b001),
+ kASIDE1OS = encode(0b000, 0b1000, 0b0001, 0b010),
+ kVAAE1OS = encode(0b000, 0b1000, 0b0001, 0b011),
+ kVALE1OS = encode(0b000, 0b1000, 0b0001, 0b101),
+ kVAALE1OS = encode(0b000, 0b1000, 0b0001, 0b111),
+ kIPAS2E1OS = encode(0b100, 0b1000, 0b0100, 0b000),
+ kIPAS2LE1OS = encode(0b100, 0b1000, 0b0100, 0b100),
+ kVAE2OS = encode(0b100, 0b1000, 0b0001, 0b001),
+ kVALE2OS = encode(0b100, 0b1000, 0b0001, 0b101),
+ kVMALLS12E1OS = encode(0b100, 0b1000, 0b0001, 0b110),
+ kVAE3OS = encode(0b110, 0b1000, 0b0001, 0b001),
+ kVALE3OS = encode(0b110, 0b1000, 0b0001, 0b101),
+ kALLE2OS = encode(0b100, 0b1000, 0b0001, 0b000),
+ kALLE1OS = encode(0b100, 0b1000, 0b0001, 0b100),
+ kALLE3OS = encode(0b110, 0b1000, 0b0001, 0b000),
+
+ kRVAE1 = encode(0b000, 0b1000, 0b0110, 0b001),
+ kRVAAE1 = encode(0b000, 0b1000, 0b0110, 0b011),
+ kRVALE1 = encode(0b000, 0b1000, 0b0110, 0b101),
+ kRVAALE1 = encode(0b000, 0b1000, 0b0110, 0b111),
+ kRVAE1IS = encode(0b000, 0b1000, 0b0010, 0b001),
+ kRVAAE1IS = encode(0b000, 0b1000, 0b0010, 0b011),
+ kRVALE1IS = encode(0b000, 0b1000, 0b0010, 0b101),
+ kRVAALE1IS = encode(0b000, 0b1000, 0b0010, 0b111),
+ kRVAE1OS = encode(0b000, 0b1000, 0b0101, 0b001),
+ kRVAAE1OS = encode(0b000, 0b1000, 0b0101, 0b011),
+ kRVALE1OS = encode(0b000, 0b1000, 0b0101, 0b101),
+ kRVAALE1OS = encode(0b000, 0b1000, 0b0101, 0b111),
+ kRIPAS2E1IS = encode(0b100, 0b1000, 0b0000, 0b010),
+ kRIPAS2LE1IS = encode(0b100, 0b1000, 0b0000, 0b110),
+ kRIPAS2E1 = encode(0b100, 0b1000, 0b0100, 0b010),
+ kRIPAS2LE1 = encode(0b100, 0b1000, 0b0100, 0b110),
+ kRIPAS2E1OS = encode(0b100, 0b1000, 0b0100, 0b011),
+ kRIPAS2LE1OS = encode(0b100, 0b1000, 0b0100, 0b111),
+ kRVAE2 = encode(0b100, 0b1000, 0b0110, 0b001),
+ kRVALE2 = encode(0b100, 0b1000, 0b0110, 0b101),
+ kRVAE2IS = encode(0b100, 0b1000, 0b0010, 0b001),
+ kRVALE2IS = encode(0b100, 0b1000, 0b0010, 0b101),
+ kRVAE2OS = encode(0b100, 0b1000, 0b0101, 0b001),
+ kRVALE2OS = encode(0b100, 0b1000, 0b0101, 0b101),
+ kRVAE3 = encode(0b110, 0b1000, 0b0110, 0b001),
+ kRVALE3 = encode(0b110, 0b1000, 0b0110, 0b101),
+ kRVAE3IS = encode(0b110, 0b1000, 0b0010, 0b001),
+ kRVALE3IS = encode(0b110, 0b1000, 0b0010, 0b101),
+ kRVAE3OS = encode(0b110, 0b1000, 0b0101, 0b001),
+ kRVALE3OS = encode(0b110, 0b1000, 0b0101, 0b101),
+ };
+}
+
+//! Trace synchronization barrier options.
+namespace TSB {
+ //! Trace synchronization immediate values.
+ enum Value : uint32_t {
+ kCSYNC = 0
+ };
+}
+
+//! Processor state access through MSR.
+namespace PState {
+ //! Encodes a pstate from `op0` and `op1`.
+ static inline constexpr uint32_t encode(uint32_t op0, uint32_t op1) noexcept {
+ return (op0 << 3) | (op1 << 0);
+ }
+
+ //! Processor state access immediates.
+ enum Value : uint32_t {
+ kSPSel = encode(0b000, 0b101),
+ kDAIFSet = encode(0b011, 0b110),
+ kDAIFClr = encode(0b011, 0b111),
+ kPAN = encode(0b000, 0b100),
+ kUAO = encode(0b000, 0b011),
+ kDIT = encode(0b011, 0b010),
+ kSSBS = encode(0b011, 0b001),
+ kTCO = encode(0b011, 0b100)
+ };
+};
+
+//! System register identifiers and utilities (MSR/MRS).
+namespace SysReg {
+ //! System register fields.
+ struct Fields {
+ uint8_t op0;
+ uint8_t op1;
+ uint8_t cRn;
+ uint8_t cRm;
+ uint8_t op2;
+ };
+
+ //! Encodes a system register from `op0`, `op1`, `cRn`, `cRm`, and `op2` fields.
+ static inline constexpr uint32_t encode(uint32_t op0, uint32_t op1, uint32_t cRn, uint32_t cRm, uint32_t op2) noexcept {
+ return (op0 << 14) | (op1 << 11) | (cRn << 7) | (cRm << 3) | (op2 << 0);
+ }
+
+ //! Encodes a system register from `fields`.
+ static inline constexpr uint32_t encode(const Fields& fields) noexcept {
+ return encode(fields.op0, fields.op1, fields.cRn, fields.cRm, fields.op2);
+ }
+
+ //! Decodes a system register to \ref Fields.
+ static inline constexpr Fields decode(uint32_t id) noexcept {
+ return Fields {
+ uint8_t((id >> 14) & 0x3u),
+ uint8_t((id >> 11) & 0x7u),
+ uint8_t((id >> 7) & 0xFu),
+ uint8_t((id >> 3) & 0xFu),
+ uint8_t((id >> 0) & 0x7u)
+ };
+ }
+
+ //! System register identifiers.
+ enum Id : uint32_t {
+ kACTLR_EL1 = encode(0b11, 0b000, 0b0001, 0b0000, 0b001), // RW
+ kACTLR_EL2 = encode(0b11, 0b100, 0b0001, 0b0000, 0b001), // RW
+ kACTLR_EL3 = encode(0b11, 0b110, 0b0001, 0b0000, 0b001), // RW
+ kAFSR0_EL1 = encode(0b11, 0b000, 0b0101, 0b0001, 0b000), // RW
+ kAFSR0_EL12 = encode(0b11, 0b101, 0b0101, 0b0001, 0b000), // RW
+ kAFSR0_EL2 = encode(0b11, 0b100, 0b0101, 0b0001, 0b000), // RW
+ kAFSR0_EL3 = encode(0b11, 0b110, 0b0101, 0b0001, 0b000), // RW
+ kAFSR1_EL1 = encode(0b11, 0b000, 0b0101, 0b0001, 0b001), // RW
+ kAFSR1_EL12 = encode(0b11, 0b101, 0b0101, 0b0001, 0b001), // RW
+ kAFSR1_EL2 = encode(0b11, 0b100, 0b0101, 0b0001, 0b001), // RW
+ kAFSR1_EL3 = encode(0b11, 0b110, 0b0101, 0b0001, 0b001), // RW
+ kAIDR_EL1 = encode(0b11, 0b001, 0b0000, 0b0000, 0b111), // RO
+ kAMAIR_EL1 = encode(0b11, 0b000, 0b1010, 0b0011, 0b000), // RW
+ kAMAIR_EL12 = encode(0b11, 0b101, 0b1010, 0b0011, 0b000), // RW
+ kAMAIR_EL2 = encode(0b11, 0b100, 0b1010, 0b0011, 0b000), // RW
+ kAMAIR_EL3 = encode(0b11, 0b110, 0b1010, 0b0011, 0b000), // RW
+ kAMCFGR_EL0 = encode(0b11, 0b011, 0b1101, 0b0010, 0b001), // RO
+ kAMCGCR_EL0 = encode(0b11, 0b011, 0b1101, 0b0010, 0b010), // RO
+ kAMCNTENCLR0_EL0 = encode(0b11, 0b011, 0b1101, 0b0010, 0b100), // RW
+ kAMCNTENCLR1_EL0 = encode(0b11, 0b011, 0b1101, 0b0011, 0b000), // RW
+ kAMCNTENSET0_EL0 = encode(0b11, 0b011, 0b1101, 0b0010, 0b101), // RW
+ kAMCNTENSET1_EL0 = encode(0b11, 0b011, 0b1101, 0b0011, 0b001), // RW
+ kAMCR_EL0 = encode(0b11, 0b011, 0b1101, 0b0010, 0b000), // RW
+ kAMEVCNTR00_EL0 = encode(0b11, 0b011, 0b1101, 0b0100, 0b000), // RW
+ kAMEVCNTR01_EL0 = encode(0b11, 0b011, 0b1101, 0b0100, 0b001), // RW
+ kAMEVCNTR02_EL0 = encode(0b11, 0b011, 0b1101, 0b0100, 0b010), // RW
+ kAMEVCNTR03_EL0 = encode(0b11, 0b011, 0b1101, 0b0100, 0b011), // RW
+ kAMEVCNTR10_EL0 = encode(0b11, 0b011, 0b1101, 0b1100, 0b000), // RW
+ kAMEVCNTR110_EL0 = encode(0b11, 0b011, 0b1101, 0b1101, 0b010), // RW
+ kAMEVCNTR111_EL0 = encode(0b11, 0b011, 0b1101, 0b1101, 0b011), // RW
+ kAMEVCNTR112_EL0 = encode(0b11, 0b011, 0b1101, 0b1101, 0b100), // RW
+ kAMEVCNTR113_EL0 = encode(0b11, 0b011, 0b1101, 0b1101, 0b101), // RW
+ kAMEVCNTR114_EL0 = encode(0b11, 0b011, 0b1101, 0b1101, 0b110), // RW
+ kAMEVCNTR115_EL0 = encode(0b11, 0b011, 0b1101, 0b1101, 0b111), // RW
+ kAMEVCNTR11_EL0 = encode(0b11, 0b011, 0b1101, 0b1100, 0b001), // RW
+ kAMEVCNTR12_EL0 = encode(0b11, 0b011, 0b1101, 0b1100, 0b010), // RW
+ kAMEVCNTR13_EL0 = encode(0b11, 0b011, 0b1101, 0b1100, 0b011), // RW
+ kAMEVCNTR14_EL0 = encode(0b11, 0b011, 0b1101, 0b1100, 0b100), // RW
+ kAMEVCNTR15_EL0 = encode(0b11, 0b011, 0b1101, 0b1100, 0b101), // RW
+ kAMEVCNTR16_EL0 = encode(0b11, 0b011, 0b1101, 0b1100, 0b110), // RW
+ kAMEVCNTR17_EL0 = encode(0b11, 0b011, 0b1101, 0b1100, 0b111), // RW
+ kAMEVCNTR18_EL0 = encode(0b11, 0b011, 0b1101, 0b1101, 0b000), // RW
+ kAMEVCNTR19_EL0 = encode(0b11, 0b011, 0b1101, 0b1101, 0b001), // RW
+ kAMEVTYPER00_EL0 = encode(0b11, 0b011, 0b1101, 0b0110, 0b000), // RO
+ kAMEVTYPER01_EL0 = encode(0b11, 0b011, 0b1101, 0b0110, 0b001), // RO
+ kAMEVTYPER02_EL0 = encode(0b11, 0b011, 0b1101, 0b0110, 0b010), // RO
+ kAMEVTYPER03_EL0 = encode(0b11, 0b011, 0b1101, 0b0110, 0b011), // RO
+ kAMEVTYPER10_EL0 = encode(0b11, 0b011, 0b1101, 0b1110, 0b000), // RW
+ kAMEVTYPER110_EL0 = encode(0b11, 0b011, 0b1101, 0b1111, 0b010), // RW
+ kAMEVTYPER111_EL0 = encode(0b11, 0b011, 0b1101, 0b1111, 0b011), // RW
+ kAMEVTYPER112_EL0 = encode(0b11, 0b011, 0b1101, 0b1111, 0b100), // RW
+ kAMEVTYPER113_EL0 = encode(0b11, 0b011, 0b1101, 0b1111, 0b101), // RW
+ kAMEVTYPER114_EL0 = encode(0b11, 0b011, 0b1101, 0b1111, 0b110), // RW
+ kAMEVTYPER115_EL0 = encode(0b11, 0b011, 0b1101, 0b1111, 0b111), // RW
+ kAMEVTYPER11_EL0 = encode(0b11, 0b011, 0b1101, 0b1110, 0b001), // RW
+ kAMEVTYPER12_EL0 = encode(0b11, 0b011, 0b1101, 0b1110, 0b010), // RW
+ kAMEVTYPER13_EL0 = encode(0b11, 0b011, 0b1101, 0b1110, 0b011), // RW
+ kAMEVTYPER14_EL0 = encode(0b11, 0b011, 0b1101, 0b1110, 0b100), // RW
+ kAMEVTYPER15_EL0 = encode(0b11, 0b011, 0b1101, 0b1110, 0b101), // RW
+ kAMEVTYPER16_EL0 = encode(0b11, 0b011, 0b1101, 0b1110, 0b110), // RW
+ kAMEVTYPER17_EL0 = encode(0b11, 0b011, 0b1101, 0b1110, 0b111), // RW
+ kAMEVTYPER18_EL0 = encode(0b11, 0b011, 0b1101, 0b1111, 0b000), // RW
+ kAMEVTYPER19_EL0 = encode(0b11, 0b011, 0b1101, 0b1111, 0b001), // RW
+ kAMUSERENR_EL0 = encode(0b11, 0b011, 0b1101, 0b0010, 0b011), // RW
+ kAPDAKeyHi_EL1 = encode(0b11, 0b000, 0b0010, 0b0010, 0b001), // RW
+ kAPDAKeyLo_EL1 = encode(0b11, 0b000, 0b0010, 0b0010, 0b000), // RW
+ kAPDBKeyHi_EL1 = encode(0b11, 0b000, 0b0010, 0b0010, 0b011), // RW
+ kAPDBKeyLo_EL1 = encode(0b11, 0b000, 0b0010, 0b0010, 0b010), // RW
+ kAPGAKeyHi_EL1 = encode(0b11, 0b000, 0b0010, 0b0011, 0b001), // RW
+ kAPGAKeyLo_EL1 = encode(0b11, 0b000, 0b0010, 0b0011, 0b000), // RW
+ kAPIAKeyHi_EL1 = encode(0b11, 0b000, 0b0010, 0b0001, 0b001), // RW
+ kAPIAKeyLo_EL1 = encode(0b11, 0b000, 0b0010, 0b0001, 0b000), // RW
+ kAPIBKeyHi_EL1 = encode(0b11, 0b000, 0b0010, 0b0001, 0b011), // RW
+ kAPIBKeyLo_EL1 = encode(0b11, 0b000, 0b0010, 0b0001, 0b010), // RW
+ kCCSIDR2_EL1 = encode(0b11, 0b001, 0b0000, 0b0000, 0b010), // RO
+ kCCSIDR_EL1 = encode(0b11, 0b001, 0b0000, 0b0000, 0b000), // RO
+ kCLIDR_EL1 = encode(0b11, 0b001, 0b0000, 0b0000, 0b001), // RO
+ kCNTFRQ_EL0 = encode(0b11, 0b011, 0b1110, 0b0000, 0b000), // RW
+ kCNTHCTL_EL2 = encode(0b11, 0b100, 0b1110, 0b0001, 0b000), // RW
+ kCNTHPS_CTL_EL2 = encode(0b11, 0b100, 0b1110, 0b0101, 0b001), // RW
+ kCNTHPS_CVAL_EL2 = encode(0b11, 0b100, 0b1110, 0b0101, 0b010), // RW
+ kCNTHPS_TVAL_EL2 = encode(0b11, 0b100, 0b1110, 0b0101, 0b000), // RW
+ kCNTHP_CTL_EL2 = encode(0b11, 0b100, 0b1110, 0b0010, 0b001), // RW
+ kCNTHP_CVAL_EL2 = encode(0b11, 0b100, 0b1110, 0b0010, 0b010), // RW
+ kCNTHP_TVAL_EL2 = encode(0b11, 0b100, 0b1110, 0b0010, 0b000), // RW
+ kCNTHVS_CTL_EL2 = encode(0b11, 0b100, 0b1110, 0b0100, 0b001), // RW
+ kCNTHVS_CVAL_EL2 = encode(0b11, 0b100, 0b1110, 0b0100, 0b010), // RW
+ kCNTHVS_TVAL_EL2 = encode(0b11, 0b100, 0b1110, 0b0100, 0b000), // RW
+ kCNTHV_CTL_EL2 = encode(0b11, 0b100, 0b1110, 0b0011, 0b001), // RW
+ kCNTHV_CVAL_EL2 = encode(0b11, 0b100, 0b1110, 0b0011, 0b010), // RW
+ kCNTHV_TVAL_EL2 = encode(0b11, 0b100, 0b1110, 0b0011, 0b000), // RW
+ kCNTISCALE_EL2 = encode(0b11, 0b100, 0b1110, 0b0000, 0b101), // RW
+ kCNTKCTL_EL1 = encode(0b11, 0b000, 0b1110, 0b0001, 0b000), // RW
+ kCNTKCTL_EL12 = encode(0b11, 0b101, 0b1110, 0b0001, 0b000), // RW
+ kCNTPCTSS_EL0 = encode(0b11, 0b011, 0b1110, 0b0000, 0b101), // RW
+ kCNTPCT_EL0 = encode(0b11, 0b011, 0b1110, 0b0000, 0b001), // RO
+ kCNTPOFF_EL2 = encode(0b11, 0b100, 0b1110, 0b0000, 0b110), // RW
+ kCNTPS_CTL_EL1 = encode(0b11, 0b111, 0b1110, 0b0010, 0b001), // RW
+ kCNTPS_CVAL_EL1 = encode(0b11, 0b111, 0b1110, 0b0010, 0b010), // RW
+ kCNTPS_TVAL_EL1 = encode(0b11, 0b111, 0b1110, 0b0010, 0b000), // RW
+ kCNTP_CTL_EL0 = encode(0b11, 0b011, 0b1110, 0b0010, 0b001), // RW
+ kCNTP_CTL_EL02 = encode(0b11, 0b101, 0b1110, 0b0010, 0b001), // RW
+ kCNTP_CVAL_EL0 = encode(0b11, 0b011, 0b1110, 0b0010, 0b010), // RW
+ kCNTP_CVAL_EL02 = encode(0b11, 0b101, 0b1110, 0b0010, 0b010), // RW
+ kCNTP_TVAL_EL0 = encode(0b11, 0b011, 0b1110, 0b0010, 0b000), // RW
+ kCNTP_TVAL_EL02 = encode(0b11, 0b101, 0b1110, 0b0010, 0b000), // RW
+ kCNTSCALE_EL2 = encode(0b11, 0b100, 0b1110, 0b0000, 0b100), // RW
+ kCNTVCTSS_EL0 = encode(0b11, 0b011, 0b1110, 0b0000, 0b110), // RW
+ kCNTVCT_EL0 = encode(0b11, 0b011, 0b1110, 0b0000, 0b010), // RO
+ kCNTVFRQ_EL2 = encode(0b11, 0b100, 0b1110, 0b0000, 0b111), // RW
+ kCNTVOFF_EL2 = encode(0b11, 0b100, 0b1110, 0b0000, 0b011), // RW
+ kCNTV_CTL_EL0 = encode(0b11, 0b011, 0b1110, 0b0011, 0b001), // RW
+ kCNTV_CTL_EL02 = encode(0b11, 0b101, 0b1110, 0b0011, 0b001), // RW
+ kCNTV_CVAL_EL0 = encode(0b11, 0b011, 0b1110, 0b0011, 0b010), // RW
+ kCNTV_CVAL_EL02 = encode(0b11, 0b101, 0b1110, 0b0011, 0b010), // RW
+ kCNTV_TVAL_EL0 = encode(0b11, 0b011, 0b1110, 0b0011, 0b000), // RW
+ kCNTV_TVAL_EL02 = encode(0b11, 0b101, 0b1110, 0b0011, 0b000), // RW
+ kCONTEXTIDR_EL1 = encode(0b11, 0b000, 0b1101, 0b0000, 0b001), // RW
+ kCONTEXTIDR_EL12 = encode(0b11, 0b101, 0b1101, 0b0000, 0b001), // RW
+ kCONTEXTIDR_EL2 = encode(0b11, 0b100, 0b1101, 0b0000, 0b001), // RW
+ kCPACR_EL1 = encode(0b11, 0b000, 0b0001, 0b0000, 0b010), // RW
+ kCPACR_EL12 = encode(0b11, 0b101, 0b0001, 0b0000, 0b010), // RW
+ kCPM_IOACC_CTL_EL3 = encode(0b11, 0b111, 0b1111, 0b0010, 0b000), // RW
+ kCPTR_EL2 = encode(0b11, 0b100, 0b0001, 0b0001, 0b010), // RW
+ kCPTR_EL3 = encode(0b11, 0b110, 0b0001, 0b0001, 0b010), // RW
+ kCSSELR_EL1 = encode(0b11, 0b010, 0b0000, 0b0000, 0b000), // RW
+ kCTR_EL0 = encode(0b11, 0b011, 0b0000, 0b0000, 0b001), // RO
+ kCurrentEL = encode(0b11, 0b000, 0b0100, 0b0010, 0b010), // RO
+ kDACR32_EL2 = encode(0b11, 0b100, 0b0011, 0b0000, 0b000), // RW
+ kDAIF = encode(0b11, 0b011, 0b0100, 0b0010, 0b001), // RW
+ kDBGAUTHSTATUS_EL1 = encode(0b10, 0b000, 0b0111, 0b1110, 0b110), // RO
+ kDBGBCR0_EL1 = encode(0b10, 0b000, 0b0000, 0b0000, 0b101), // RW
+ kDBGBCR10_EL1 = encode(0b10, 0b000, 0b0000, 0b1010, 0b101), // RW
+ kDBGBCR11_EL1 = encode(0b10, 0b000, 0b0000, 0b1011, 0b101), // RW
+ kDBGBCR12_EL1 = encode(0b10, 0b000, 0b0000, 0b1100, 0b101), // RW
+ kDBGBCR13_EL1 = encode(0b10, 0b000, 0b0000, 0b1101, 0b101), // RW
+ kDBGBCR14_EL1 = encode(0b10, 0b000, 0b0000, 0b1110, 0b101), // RW
+ kDBGBCR15_EL1 = encode(0b10, 0b000, 0b0000, 0b1111, 0b101), // RW
+ kDBGBCR1_EL1 = encode(0b10, 0b000, 0b0000, 0b0001, 0b101), // RW
+ kDBGBCR2_EL1 = encode(0b10, 0b000, 0b0000, 0b0010, 0b101), // RW
+ kDBGBCR3_EL1 = encode(0b10, 0b000, 0b0000, 0b0011, 0b101), // RW
+ kDBGBCR4_EL1 = encode(0b10, 0b000, 0b0000, 0b0100, 0b101), // RW
+ kDBGBCR5_EL1 = encode(0b10, 0b000, 0b0000, 0b0101, 0b101), // RW
+ kDBGBCR6_EL1 = encode(0b10, 0b000, 0b0000, 0b0110, 0b101), // RW
+ kDBGBCR7_EL1 = encode(0b10, 0b000, 0b0000, 0b0111, 0b101), // RW
+ kDBGBCR8_EL1 = encode(0b10, 0b000, 0b0000, 0b1000, 0b101), // RW
+ kDBGBCR9_EL1 = encode(0b10, 0b000, 0b0000, 0b1001, 0b101), // RW
+ kDBGBVR0_EL1 = encode(0b10, 0b000, 0b0000, 0b0000, 0b100), // RW
+ kDBGBVR10_EL1 = encode(0b10, 0b000, 0b0000, 0b1010, 0b100), // RW
+ kDBGBVR11_EL1 = encode(0b10, 0b000, 0b0000, 0b1011, 0b100), // RW
+ kDBGBVR12_EL1 = encode(0b10, 0b000, 0b0000, 0b1100, 0b100), // RW
+ kDBGBVR13_EL1 = encode(0b10, 0b000, 0b0000, 0b1101, 0b100), // RW
+ kDBGBVR14_EL1 = encode(0b10, 0b000, 0b0000, 0b1110, 0b100), // RW
+ kDBGBVR15_EL1 = encode(0b10, 0b000, 0b0000, 0b1111, 0b100), // RW
+ kDBGBVR1_EL1 = encode(0b10, 0b000, 0b0000, 0b0001, 0b100), // RW
+ kDBGBVR2_EL1 = encode(0b10, 0b000, 0b0000, 0b0010, 0b100), // RW
+ kDBGBVR3_EL1 = encode(0b10, 0b000, 0b0000, 0b0011, 0b100), // RW
+ kDBGBVR4_EL1 = encode(0b10, 0b000, 0b0000, 0b0100, 0b100), // RW
+ kDBGBVR5_EL1 = encode(0b10, 0b000, 0b0000, 0b0101, 0b100), // RW
+ kDBGBVR6_EL1 = encode(0b10, 0b000, 0b0000, 0b0110, 0b100), // RW
+ kDBGBVR7_EL1 = encode(0b10, 0b000, 0b0000, 0b0111, 0b100), // RW
+ kDBGBVR8_EL1 = encode(0b10, 0b000, 0b0000, 0b1000, 0b100), // RW
+ kDBGBVR9_EL1 = encode(0b10, 0b000, 0b0000, 0b1001, 0b100), // RW
+ kDBGCLAIMCLR_EL1 = encode(0b10, 0b000, 0b0111, 0b1001, 0b110), // RW
+ kDBGCLAIMSET_EL1 = encode(0b10, 0b000, 0b0111, 0b1000, 0b110), // RW
+ kDBGDTRRX_EL0 = encode(0b10, 0b011, 0b0000, 0b0101, 0b000), // RO
+ kDBGDTRTX_EL0 = encode(0b10, 0b011, 0b0000, 0b0101, 0b000), // WO
+ kDBGDTR_EL0 = encode(0b10, 0b011, 0b0000, 0b0100, 0b000), // RW
+ kDBGPRCR_EL1 = encode(0b10, 0b000, 0b0001, 0b0100, 0b100), // RW
+ kDBGVCR32_EL2 = encode(0b10, 0b100, 0b0000, 0b0111, 0b000), // RW
+ kDBGWCR0_EL1 = encode(0b10, 0b000, 0b0000, 0b0000, 0b111), // RW
+ kDBGWCR10_EL1 = encode(0b10, 0b000, 0b0000, 0b1010, 0b111), // RW
+ kDBGWCR11_EL1 = encode(0b10, 0b000, 0b0000, 0b1011, 0b111), // RW
+ kDBGWCR12_EL1 = encode(0b10, 0b000, 0b0000, 0b1100, 0b111), // RW
+ kDBGWCR13_EL1 = encode(0b10, 0b000, 0b0000, 0b1101, 0b111), // RW
+ kDBGWCR14_EL1 = encode(0b10, 0b000, 0b0000, 0b1110, 0b111), // RW
+ kDBGWCR15_EL1 = encode(0b10, 0b000, 0b0000, 0b1111, 0b111), // RW
+ kDBGWCR1_EL1 = encode(0b10, 0b000, 0b0000, 0b0001, 0b111), // RW
+ kDBGWCR2_EL1 = encode(0b10, 0b000, 0b0000, 0b0010, 0b111), // RW
+ kDBGWCR3_EL1 = encode(0b10, 0b000, 0b0000, 0b0011, 0b111), // RW
+ kDBGWCR4_EL1 = encode(0b10, 0b000, 0b0000, 0b0100, 0b111), // RW
+ kDBGWCR5_EL1 = encode(0b10, 0b000, 0b0000, 0b0101, 0b111), // RW
+ kDBGWCR6_EL1 = encode(0b10, 0b000, 0b0000, 0b0110, 0b111), // RW
+ kDBGWCR7_EL1 = encode(0b10, 0b000, 0b0000, 0b0111, 0b111), // RW
+ kDBGWCR8_EL1 = encode(0b10, 0b000, 0b0000, 0b1000, 0b111), // RW
+ kDBGWCR9_EL1 = encode(0b10, 0b000, 0b0000, 0b1001, 0b111), // RW
+ kDBGWVR0_EL1 = encode(0b10, 0b000, 0b0000, 0b0000, 0b110), // RW
+ kDBGWVR10_EL1 = encode(0b10, 0b000, 0b0000, 0b1010, 0b110), // RW
+ kDBGWVR11_EL1 = encode(0b10, 0b000, 0b0000, 0b1011, 0b110), // RW
+ kDBGWVR12_EL1 = encode(0b10, 0b000, 0b0000, 0b1100, 0b110), // RW
+ kDBGWVR13_EL1 = encode(0b10, 0b000, 0b0000, 0b1101, 0b110), // RW
+ kDBGWVR14_EL1 = encode(0b10, 0b000, 0b0000, 0b1110, 0b110), // RW
+ kDBGWVR15_EL1 = encode(0b10, 0b000, 0b0000, 0b1111, 0b110), // RW
+ kDBGWVR1_EL1 = encode(0b10, 0b000, 0b0000, 0b0001, 0b110), // RW
+ kDBGWVR2_EL1 = encode(0b10, 0b000, 0b0000, 0b0010, 0b110), // RW
+ kDBGWVR3_EL1 = encode(0b10, 0b000, 0b0000, 0b0011, 0b110), // RW
+ kDBGWVR4_EL1 = encode(0b10, 0b000, 0b0000, 0b0100, 0b110), // RW
+ kDBGWVR5_EL1 = encode(0b10, 0b000, 0b0000, 0b0101, 0b110), // RW
+ kDBGWVR6_EL1 = encode(0b10, 0b000, 0b0000, 0b0110, 0b110), // RW
+ kDBGWVR7_EL1 = encode(0b10, 0b000, 0b0000, 0b0111, 0b110), // RW
+ kDBGWVR8_EL1 = encode(0b10, 0b000, 0b0000, 0b1000, 0b110), // RW
+ kDBGWVR9_EL1 = encode(0b10, 0b000, 0b0000, 0b1001, 0b110), // RW
+ kDCZID_EL0 = encode(0b11, 0b011, 0b0000, 0b0000, 0b111), // RO
+ kDISR_EL1 = encode(0b11, 0b000, 0b1100, 0b0001, 0b001), // RW
+ kDIT = encode(0b11, 0b011, 0b0100, 0b0010, 0b101), // RW
+ kDLR_EL0 = encode(0b11, 0b011, 0b0100, 0b0101, 0b001), // RW
+ kDSPSR_EL0 = encode(0b11, 0b011, 0b0100, 0b0101, 0b000), // RW
+ kELR_EL1 = encode(0b11, 0b000, 0b0100, 0b0000, 0b001), // RW
+ kELR_EL12 = encode(0b11, 0b101, 0b0100, 0b0000, 0b001), // RW
+ kELR_EL2 = encode(0b11, 0b100, 0b0100, 0b0000, 0b001), // RW
+ kELR_EL3 = encode(0b11, 0b110, 0b0100, 0b0000, 0b001), // RW
+ kERRIDR_EL1 = encode(0b11, 0b000, 0b0101, 0b0011, 0b000), // RO
+ kERRSELR_EL1 = encode(0b11, 0b000, 0b0101, 0b0011, 0b001), // RW
+ kERXADDR_EL1 = encode(0b11, 0b000, 0b0101, 0b0100, 0b011), // RW
+ kERXCTLR_EL1 = encode(0b11, 0b000, 0b0101, 0b0100, 0b001), // RW
+ kERXFR_EL1 = encode(0b11, 0b000, 0b0101, 0b0100, 0b000), // RO
+ kERXMISC0_EL1 = encode(0b11, 0b000, 0b0101, 0b0101, 0b000), // RW
+ kERXMISC1_EL1 = encode(0b11, 0b000, 0b0101, 0b0101, 0b001), // RW
+ kERXMISC2_EL1 = encode(0b11, 0b000, 0b0101, 0b0101, 0b010), // RW
+ kERXMISC3_EL1 = encode(0b11, 0b000, 0b0101, 0b0101, 0b011), // RW
+ kERXPFGCDN_EL1 = encode(0b11, 0b000, 0b0101, 0b0100, 0b110), // RW
+ kERXPFGCTL_EL1 = encode(0b11, 0b000, 0b0101, 0b0100, 0b101), // RW
+ kERXPFGF_EL1 = encode(0b11, 0b000, 0b0101, 0b0100, 0b100), // RO
+ kERXSTATUS_EL1 = encode(0b11, 0b000, 0b0101, 0b0100, 0b010), // RW
+ kESR_EL1 = encode(0b11, 0b000, 0b0101, 0b0010, 0b000), // RW
+ kESR_EL12 = encode(0b11, 0b101, 0b0101, 0b0010, 0b000), // RW
+ kESR_EL2 = encode(0b11, 0b100, 0b0101, 0b0010, 0b000), // RW
+ kESR_EL3 = encode(0b11, 0b110, 0b0101, 0b0010, 0b000), // RW
+ kFAR_EL1 = encode(0b11, 0b000, 0b0110, 0b0000, 0b000), // RW
+ kFAR_EL12 = encode(0b11, 0b101, 0b0110, 0b0000, 0b000), // RW
+ kFAR_EL2 = encode(0b11, 0b100, 0b0110, 0b0000, 0b000), // RW
+ kFAR_EL3 = encode(0b11, 0b110, 0b0110, 0b0000, 0b000), // RW
+ kFPCR = encode(0b11, 0b011, 0b0100, 0b0100, 0b000), // RW
+ kFPEXC32_EL2 = encode(0b11, 0b100, 0b0101, 0b0011, 0b000), // RW
+ kFPSR = encode(0b11, 0b011, 0b0100, 0b0100, 0b001), // RW
+ kGCR_EL1 = encode(0b11, 0b000, 0b0001, 0b0000, 0b110), // RW
+ kGMID_EL1 = encode(0b11, 0b001, 0b0000, 0b0000, 0b100), // RO
+ kHACR_EL2 = encode(0b11, 0b100, 0b0001, 0b0001, 0b111), // RW
+ kHCR_EL2 = encode(0b11, 0b100, 0b0001, 0b0001, 0b000), // RW
+ kHDFGRTR_EL2 = encode(0b11, 0b100, 0b0011, 0b0001, 0b100), // RW
+ kHDFGWTR_EL2 = encode(0b11, 0b100, 0b0011, 0b0001, 0b101), // RW
+ kHFGITR_EL2 = encode(0b11, 0b100, 0b0001, 0b0001, 0b110), // RW
+ kHFGRTR_EL2 = encode(0b11, 0b100, 0b0001, 0b0001, 0b100), // RW
+ kHFGWTR_EL2 = encode(0b11, 0b100, 0b0001, 0b0001, 0b101), // RW
+ kHPFAR_EL2 = encode(0b11, 0b100, 0b0110, 0b0000, 0b100), // RW
+ kHSTR_EL2 = encode(0b11, 0b100, 0b0001, 0b0001, 0b011), // RW
+ kICC_AP0R0_EL1 = encode(0b11, 0b000, 0b1100, 0b1000, 0b100), // RW
+ kICC_AP0R1_EL1 = encode(0b11, 0b000, 0b1100, 0b1000, 0b101), // RW
+ kICC_AP0R2_EL1 = encode(0b11, 0b000, 0b1100, 0b1000, 0b110), // RW
+ kICC_AP0R3_EL1 = encode(0b11, 0b000, 0b1100, 0b1000, 0b111), // RW
+ kICC_AP1R0_EL1 = encode(0b11, 0b000, 0b1100, 0b1001, 0b000), // RW
+ kICC_AP1R1_EL1 = encode(0b11, 0b000, 0b1100, 0b1001, 0b001), // RW
+ kICC_AP1R2_EL1 = encode(0b11, 0b000, 0b1100, 0b1001, 0b010), // RW
+ kICC_AP1R3_EL1 = encode(0b11, 0b000, 0b1100, 0b1001, 0b011), // RW
+ kICC_ASGI1R_EL1 = encode(0b11, 0b000, 0b1100, 0b1011, 0b110), // WO
+ kICC_BPR0_EL1 = encode(0b11, 0b000, 0b1100, 0b1000, 0b011), // RW
+ kICC_BPR1_EL1 = encode(0b11, 0b000, 0b1100, 0b1100, 0b011), // RW
+ kICC_CTLR_EL1 = encode(0b11, 0b000, 0b1100, 0b1100, 0b100), // RW
+ kICC_CTLR_EL3 = encode(0b11, 0b110, 0b1100, 0b1100, 0b100), // RW
+ kICC_DIR_EL1 = encode(0b11, 0b000, 0b1100, 0b1011, 0b001), // WO
+ kICC_EOIR0_EL1 = encode(0b11, 0b000, 0b1100, 0b1000, 0b001), // WO
+ kICC_EOIR1_EL1 = encode(0b11, 0b000, 0b1100, 0b1100, 0b001), // WO
+ kICC_HPPIR0_EL1 = encode(0b11, 0b000, 0b1100, 0b1000, 0b010), // RO
+ kICC_HPPIR1_EL1 = encode(0b11, 0b000, 0b1100, 0b1100, 0b010), // RO
+ kICC_IAR0_EL1 = encode(0b11, 0b000, 0b1100, 0b1000, 0b000), // RO
+ kICC_IAR1_EL1 = encode(0b11, 0b000, 0b1100, 0b1100, 0b000), // RO
+ kICC_IGRPEN0_EL1 = encode(0b11, 0b000, 0b1100, 0b1100, 0b110), // RW
+ kICC_IGRPEN1_EL1 = encode(0b11, 0b000, 0b1100, 0b1100, 0b111), // RW
+ kICC_IGRPEN1_EL3 = encode(0b11, 0b110, 0b1100, 0b1100, 0b111), // RW
+ kICC_PMR_EL1 = encode(0b11, 0b000, 0b0100, 0b0110, 0b000), // RW
+ kICC_RPR_EL1 = encode(0b11, 0b000, 0b1100, 0b1011, 0b011), // RO
+ kICC_SGI0R_EL1 = encode(0b11, 0b000, 0b1100, 0b1011, 0b111), // WO
+ kICC_SGI1R_EL1 = encode(0b11, 0b000, 0b1100, 0b1011, 0b101), // WO
+ kICC_SRE_EL1 = encode(0b11, 0b000, 0b1100, 0b1100, 0b101), // RW
+ kICC_SRE_EL2 = encode(0b11, 0b100, 0b1100, 0b1001, 0b101), // RW
+ kICC_SRE_EL3 = encode(0b11, 0b110, 0b1100, 0b1100, 0b101), // RW
+ kICH_AP0R0_EL2 = encode(0b11, 0b100, 0b1100, 0b1000, 0b000), // RW
+ kICH_AP0R1_EL2 = encode(0b11, 0b100, 0b1100, 0b1000, 0b001), // RW
+ kICH_AP0R2_EL2 = encode(0b11, 0b100, 0b1100, 0b1000, 0b010), // RW
+ kICH_AP0R3_EL2 = encode(0b11, 0b100, 0b1100, 0b1000, 0b011), // RW
+ kICH_AP1R0_EL2 = encode(0b11, 0b100, 0b1100, 0b1001, 0b000), // RW
+ kICH_AP1R1_EL2 = encode(0b11, 0b100, 0b1100, 0b1001, 0b001), // RW
+ kICH_AP1R2_EL2 = encode(0b11, 0b100, 0b1100, 0b1001, 0b010), // RW
+ kICH_AP1R3_EL2 = encode(0b11, 0b100, 0b1100, 0b1001, 0b011), // RW
+ kICH_EISR_EL2 = encode(0b11, 0b100, 0b1100, 0b1011, 0b011), // RO
+ kICH_ELRSR_EL2 = encode(0b11, 0b100, 0b1100, 0b1011, 0b101), // RO
+ kICH_HCR_EL2 = encode(0b11, 0b100, 0b1100, 0b1011, 0b000), // RW
+ kICH_LR0_EL2 = encode(0b11, 0b100, 0b1100, 0b1100, 0b000), // RW
+ kICH_LR10_EL2 = encode(0b11, 0b100, 0b1100, 0b1101, 0b010), // RW
+ kICH_LR11_EL2 = encode(0b11, 0b100, 0b1100, 0b1101, 0b011), // RW
+ kICH_LR12_EL2 = encode(0b11, 0b100, 0b1100, 0b1101, 0b100), // RW
+ kICH_LR13_EL2 = encode(0b11, 0b100, 0b1100, 0b1101, 0b101), // RW
+ kICH_LR14_EL2 = encode(0b11, 0b100, 0b1100, 0b1101, 0b110), // RW
+ kICH_LR15_EL2 = encode(0b11, 0b100, 0b1100, 0b1101, 0b111), // RW
+ kICH_LR1_EL2 = encode(0b11, 0b100, 0b1100, 0b1100, 0b001), // RW
+ kICH_LR2_EL2 = encode(0b11, 0b100, 0b1100, 0b1100, 0b010), // RW
+ kICH_LR3_EL2 = encode(0b11, 0b100, 0b1100, 0b1100, 0b011), // RW
+ kICH_LR4_EL2 = encode(0b11, 0b100, 0b1100, 0b1100, 0b100), // RW
+ kICH_LR5_EL2 = encode(0b11, 0b100, 0b1100, 0b1100, 0b101), // RW
+ kICH_LR6_EL2 = encode(0b11, 0b100, 0b1100, 0b1100, 0b110), // RW
+ kICH_LR7_EL2 = encode(0b11, 0b100, 0b1100, 0b1100, 0b111), // RW
+ kICH_LR8_EL2 = encode(0b11, 0b100, 0b1100, 0b1101, 0b000), // RW
+ kICH_LR9_EL2 = encode(0b11, 0b100, 0b1100, 0b1101, 0b001), // RW
+ kICH_MISR_EL2 = encode(0b11, 0b100, 0b1100, 0b1011, 0b010), // RO
+ kICH_VMCR_EL2 = encode(0b11, 0b100, 0b1100, 0b1011, 0b111), // RW
+ kICH_VTR_EL2 = encode(0b11, 0b100, 0b1100, 0b1011, 0b001), // RO
+ kID_AA64AFR0_EL1 = encode(0b11, 0b000, 0b0000, 0b0101, 0b100), // RO
+ kID_AA64AFR1_EL1 = encode(0b11, 0b000, 0b0000, 0b0101, 0b101), // RO
+ kID_AA64DFR0_EL1 = encode(0b11, 0b000, 0b0000, 0b0101, 0b000), // RO
+ kID_AA64DFR1_EL1 = encode(0b11, 0b000, 0b0000, 0b0101, 0b001), // RO
+ kID_AA64ISAR0_EL1 = encode(0b11, 0b000, 0b0000, 0b0110, 0b000), // RO
+ kID_AA64ISAR1_EL1 = encode(0b11, 0b000, 0b0000, 0b0110, 0b001), // RO
+ kID_AA64MMFR0_EL1 = encode(0b11, 0b000, 0b0000, 0b0111, 0b000), // RO
+ kID_AA64MMFR1_EL1 = encode(0b11, 0b000, 0b0000, 0b0111, 0b001), // RO
+ kID_AA64MMFR2_EL1 = encode(0b11, 0b000, 0b0000, 0b0111, 0b010), // RO
+ kID_AA64PFR0_EL1 = encode(0b11, 0b000, 0b0000, 0b0100, 0b000), // RO
+ kID_AA64PFR1_EL1 = encode(0b11, 0b000, 0b0000, 0b0100, 0b001), // RO
+ kID_AA64ZFR0_EL1 = encode(0b11, 0b000, 0b0000, 0b0100, 0b100), // RO
+ kID_AFR0_EL1 = encode(0b11, 0b000, 0b0000, 0b0001, 0b011), // RO
+ kID_DFR0_EL1 = encode(0b11, 0b000, 0b0000, 0b0001, 0b010), // RO
+ kID_ISAR0_EL1 = encode(0b11, 0b000, 0b0000, 0b0010, 0b000), // RO
+ kID_ISAR1_EL1 = encode(0b11, 0b000, 0b0000, 0b0010, 0b001), // RO
+ kID_ISAR2_EL1 = encode(0b11, 0b000, 0b0000, 0b0010, 0b010), // RO
+ kID_ISAR3_EL1 = encode(0b11, 0b000, 0b0000, 0b0010, 0b011), // RO
+ kID_ISAR4_EL1 = encode(0b11, 0b000, 0b0000, 0b0010, 0b100), // RO
+ kID_ISAR5_EL1 = encode(0b11, 0b000, 0b0000, 0b0010, 0b101), // RO
+ kID_ISAR6_EL1 = encode(0b11, 0b000, 0b0000, 0b0010, 0b111), // RO
+ kID_MMFR0_EL1 = encode(0b11, 0b000, 0b0000, 0b0001, 0b100), // RO
+ kID_MMFR1_EL1 = encode(0b11, 0b000, 0b0000, 0b0001, 0b101), // RO
+ kID_MMFR2_EL1 = encode(0b11, 0b000, 0b0000, 0b0001, 0b110), // RO
+ kID_MMFR3_EL1 = encode(0b11, 0b000, 0b0000, 0b0001, 0b111), // RO
+ kID_MMFR4_EL1 = encode(0b11, 0b000, 0b0000, 0b0010, 0b110), // RO
+ kID_MMFR5_EL1 = encode(0b11, 0b000, 0b0000, 0b0011, 0b110), // RO
+ kID_PFR0_EL1 = encode(0b11, 0b000, 0b0000, 0b0001, 0b000), // RO
+ kID_PFR1_EL1 = encode(0b11, 0b000, 0b0000, 0b0001, 0b001), // RO
+ kID_PFR2_EL1 = encode(0b11, 0b000, 0b0000, 0b0011, 0b100), // RO
+ kIFSR32_EL2 = encode(0b11, 0b100, 0b0101, 0b0000, 0b001), // RW
+ kISR_EL1 = encode(0b11, 0b000, 0b1100, 0b0001, 0b000), // RO
+ kLORC_EL1 = encode(0b11, 0b000, 0b1010, 0b0100, 0b011), // RW
+ kLOREA_EL1 = encode(0b11, 0b000, 0b1010, 0b0100, 0b001), // RW
+ kLORID_EL1 = encode(0b11, 0b000, 0b1010, 0b0100, 0b111), // RO
+ kLORN_EL1 = encode(0b11, 0b000, 0b1010, 0b0100, 0b010), // RW
+ kLORSA_EL1 = encode(0b11, 0b000, 0b1010, 0b0100, 0b000), // RW
+ kMAIR_EL1 = encode(0b11, 0b000, 0b1010, 0b0010, 0b000), // RW
+ kMAIR_EL12 = encode(0b11, 0b101, 0b1010, 0b0010, 0b000), // RW
+ kMAIR_EL2 = encode(0b11, 0b100, 0b1010, 0b0010, 0b000), // RW
+ kMAIR_EL3 = encode(0b11, 0b110, 0b1010, 0b0010, 0b000), // RW
+ kMDCCINT_EL1 = encode(0b10, 0b000, 0b0000, 0b0010, 0b000), // RW
+ kMDCCSR_EL0 = encode(0b10, 0b011, 0b0000, 0b0001, 0b000), // RO
+ kMDCR_EL2 = encode(0b11, 0b100, 0b0001, 0b0001, 0b001), // RW
+ kMDCR_EL3 = encode(0b11, 0b110, 0b0001, 0b0011, 0b001), // RW
+ kMDRAR_EL1 = encode(0b10, 0b000, 0b0001, 0b0000, 0b000), // RO
+ kMDSCR_EL1 = encode(0b10, 0b000, 0b0000, 0b0010, 0b010), // RW
+ kMIDR_EL1 = encode(0b11, 0b000, 0b0000, 0b0000, 0b000), // RO
+ kMPAM0_EL1 = encode(0b11, 0b000, 0b1010, 0b0101, 0b001), // RW
+ kMPAM1_EL1 = encode(0b11, 0b000, 0b1010, 0b0101, 0b000), // RW
+ kMPAM1_EL12 = encode(0b11, 0b101, 0b1010, 0b0101, 0b000), // RW
+ kMPAM2_EL2 = encode(0b11, 0b100, 0b1010, 0b0101, 0b000), // RW
+ kMPAM3_EL3 = encode(0b11, 0b110, 0b1010, 0b0101, 0b000), // RW
+ kMPAMHCR_EL2 = encode(0b11, 0b100, 0b1010, 0b0100, 0b000), // RW
+ kMPAMIDR_EL1 = encode(0b11, 0b000, 0b1010, 0b0100, 0b100), // RO
+ kMPAMVPM0_EL2 = encode(0b11, 0b100, 0b1010, 0b0110, 0b000), // RW
+ kMPAMVPM1_EL2 = encode(0b11, 0b100, 0b1010, 0b0110, 0b001), // RW
+ kMPAMVPM2_EL2 = encode(0b11, 0b100, 0b1010, 0b0110, 0b010), // RW
+ kMPAMVPM3_EL2 = encode(0b11, 0b100, 0b1010, 0b0110, 0b011), // RW
+ kMPAMVPM4_EL2 = encode(0b11, 0b100, 0b1010, 0b0110, 0b100), // RW
+ kMPAMVPM5_EL2 = encode(0b11, 0b100, 0b1010, 0b0110, 0b101), // RW
+ kMPAMVPM6_EL2 = encode(0b11, 0b100, 0b1010, 0b0110, 0b110), // RW
+ kMPAMVPM7_EL2 = encode(0b11, 0b100, 0b1010, 0b0110, 0b111), // RW
+ kMPAMVPMV_EL2 = encode(0b11, 0b100, 0b1010, 0b0100, 0b001), // RW
+ kMPIDR_EL1 = encode(0b11, 0b000, 0b0000, 0b0000, 0b101), // RO
+ kMVFR0_EL1 = encode(0b11, 0b000, 0b0000, 0b0011, 0b000), // RO
+ kMVFR1_EL1 = encode(0b11, 0b000, 0b0000, 0b0011, 0b001), // RO
+ kMVFR2_EL1 = encode(0b11, 0b000, 0b0000, 0b0011, 0b010), // RO
+ kNZCV = encode(0b11, 0b011, 0b0100, 0b0010, 0b000), // RW
+ kOSDLR_EL1 = encode(0b10, 0b000, 0b0001, 0b0011, 0b100), // RW
+ kOSDTRRX_EL1 = encode(0b10, 0b000, 0b0000, 0b0000, 0b010), // RW
+ kOSDTRTX_EL1 = encode(0b10, 0b000, 0b0000, 0b0011, 0b010), // RW
+ kOSECCR_EL1 = encode(0b10, 0b000, 0b0000, 0b0110, 0b010), // RW
+ kOSLAR_EL1 = encode(0b10, 0b000, 0b0001, 0b0000, 0b100), // WO
+ kOSLSR_EL1 = encode(0b10, 0b000, 0b0001, 0b0001, 0b100), // RO
+ kPAN = encode(0b11, 0b000, 0b0100, 0b0010, 0b011), // RW
+ kPAR_EL1 = encode(0b11, 0b000, 0b0111, 0b0100, 0b000), // RW
+ kPMBIDR_EL1 = encode(0b11, 0b000, 0b1001, 0b1010, 0b111), // RO
+ kPMBLIMITR_EL1 = encode(0b11, 0b000, 0b1001, 0b1010, 0b000), // RW
+ kPMBPTR_EL1 = encode(0b11, 0b000, 0b1001, 0b1010, 0b001), // RW
+ kPMBSR_EL1 = encode(0b11, 0b000, 0b1001, 0b1010, 0b011), // RW
+ kPMCCFILTR_EL0 = encode(0b11, 0b011, 0b1110, 0b1111, 0b111), // RW
+ kPMCCNTR_EL0 = encode(0b11, 0b011, 0b1001, 0b1101, 0b000), // RW
+ kPMCEID0_EL0 = encode(0b11, 0b011, 0b1001, 0b1100, 0b110), // RO
+ kPMCEID1_EL0 = encode(0b11, 0b011, 0b1001, 0b1100, 0b111), // RO
+ kPMCNTENCLR_EL0 = encode(0b11, 0b011, 0b1001, 0b1100, 0b010), // RW
+ kPMCNTENSET_EL0 = encode(0b11, 0b011, 0b1001, 0b1100, 0b001), // RW
+ kPMCR_EL0 = encode(0b11, 0b011, 0b1001, 0b1100, 0b000), // RW
+ kPMEVCNTR0_EL0 = encode(0b11, 0b011, 0b1110, 0b1000, 0b000), // RW
+ kPMEVCNTR10_EL0 = encode(0b11, 0b011, 0b1110, 0b1001, 0b010), // RW
+ kPMEVCNTR11_EL0 = encode(0b11, 0b011, 0b1110, 0b1001, 0b011), // RW
+ kPMEVCNTR12_EL0 = encode(0b11, 0b011, 0b1110, 0b1001, 0b100), // RW
+ kPMEVCNTR13_EL0 = encode(0b11, 0b011, 0b1110, 0b1001, 0b101), // RW
+ kPMEVCNTR14_EL0 = encode(0b11, 0b011, 0b1110, 0b1001, 0b110), // RW
+ kPMEVCNTR15_EL0 = encode(0b11, 0b011, 0b1110, 0b1001, 0b111), // RW
+ kPMEVCNTR16_EL0 = encode(0b11, 0b011, 0b1110, 0b1010, 0b000), // RW
+ kPMEVCNTR17_EL0 = encode(0b11, 0b011, 0b1110, 0b1010, 0b001), // RW
+ kPMEVCNTR18_EL0 = encode(0b11, 0b011, 0b1110, 0b1010, 0b010), // RW
+ kPMEVCNTR19_EL0 = encode(0b11, 0b011, 0b1110, 0b1010, 0b011), // RW
+ kPMEVCNTR1_EL0 = encode(0b11, 0b011, 0b1110, 0b1000, 0b001), // RW
+ kPMEVCNTR20_EL0 = encode(0b11, 0b011, 0b1110, 0b1010, 0b100), // RW
+ kPMEVCNTR21_EL0 = encode(0b11, 0b011, 0b1110, 0b1010, 0b101), // RW
+ kPMEVCNTR22_EL0 = encode(0b11, 0b011, 0b1110, 0b1010, 0b110), // RW
+ kPMEVCNTR23_EL0 = encode(0b11, 0b011, 0b1110, 0b1010, 0b111), // RW
+ kPMEVCNTR24_EL0 = encode(0b11, 0b011, 0b1110, 0b1011, 0b000), // RW
+ kPMEVCNTR25_EL0 = encode(0b11, 0b011, 0b1110, 0b1011, 0b001), // RW
+ kPMEVCNTR26_EL0 = encode(0b11, 0b011, 0b1110, 0b1011, 0b010), // RW
+ kPMEVCNTR27_EL0 = encode(0b11, 0b011, 0b1110, 0b1011, 0b011), // RW
+ kPMEVCNTR28_EL0 = encode(0b11, 0b011, 0b1110, 0b1011, 0b100), // RW
+ kPMEVCNTR29_EL0 = encode(0b11, 0b011, 0b1110, 0b1011, 0b101), // RW
+ kPMEVCNTR2_EL0 = encode(0b11, 0b011, 0b1110, 0b1000, 0b010), // RW
+ kPMEVCNTR30_EL0 = encode(0b11, 0b011, 0b1110, 0b1011, 0b110), // RW
+ kPMEVCNTR3_EL0 = encode(0b11, 0b011, 0b1110, 0b1000, 0b011), // RW
+ kPMEVCNTR4_EL0 = encode(0b11, 0b011, 0b1110, 0b1000, 0b100), // RW
+ kPMEVCNTR5_EL0 = encode(0b11, 0b011, 0b1110, 0b1000, 0b101), // RW
+ kPMEVCNTR6_EL0 = encode(0b11, 0b011, 0b1110, 0b1000, 0b110), // RW
+ kPMEVCNTR7_EL0 = encode(0b11, 0b011, 0b1110, 0b1000, 0b111), // RW
+ kPMEVCNTR8_EL0 = encode(0b11, 0b011, 0b1110, 0b1001, 0b000), // RW
+ kPMEVCNTR9_EL0 = encode(0b11, 0b011, 0b1110, 0b1001, 0b001), // RW
+ kPMEVTYPER0_EL0 = encode(0b11, 0b011, 0b1110, 0b1100, 0b000), // RW
+ kPMEVTYPER10_EL0 = encode(0b11, 0b011, 0b1110, 0b1101, 0b010), // RW
+ kPMEVTYPER11_EL0 = encode(0b11, 0b011, 0b1110, 0b1101, 0b011), // RW
+ kPMEVTYPER12_EL0 = encode(0b11, 0b011, 0b1110, 0b1101, 0b100), // RW
+ kPMEVTYPER13_EL0 = encode(0b11, 0b011, 0b1110, 0b1101, 0b101), // RW
+ kPMEVTYPER14_EL0 = encode(0b11, 0b011, 0b1110, 0b1101, 0b110), // RW
+ kPMEVTYPER15_EL0 = encode(0b11, 0b011, 0b1110, 0b1101, 0b111), // RW
+ kPMEVTYPER16_EL0 = encode(0b11, 0b011, 0b1110, 0b1110, 0b000), // RW
+ kPMEVTYPER17_EL0 = encode(0b11, 0b011, 0b1110, 0b1110, 0b001), // RW
+ kPMEVTYPER18_EL0 = encode(0b11, 0b011, 0b1110, 0b1110, 0b010), // RW
+ kPMEVTYPER19_EL0 = encode(0b11, 0b011, 0b1110, 0b1110, 0b011), // RW
+ kPMEVTYPER1_EL0 = encode(0b11, 0b011, 0b1110, 0b1100, 0b001), // RW
+ kPMEVTYPER20_EL0 = encode(0b11, 0b011, 0b1110, 0b1110, 0b100), // RW
+ kPMEVTYPER21_EL0 = encode(0b11, 0b011, 0b1110, 0b1110, 0b101), // RW
+ kPMEVTYPER22_EL0 = encode(0b11, 0b011, 0b1110, 0b1110, 0b110), // RW
+ kPMEVTYPER23_EL0 = encode(0b11, 0b011, 0b1110, 0b1110, 0b111), // RW
+ kPMEVTYPER24_EL0 = encode(0b11, 0b011, 0b1110, 0b1111, 0b000), // RW
+ kPMEVTYPER25_EL0 = encode(0b11, 0b011, 0b1110, 0b1111, 0b001), // RW
+ kPMEVTYPER26_EL0 = encode(0b11, 0b011, 0b1110, 0b1111, 0b010), // RW
+ kPMEVTYPER27_EL0 = encode(0b11, 0b011, 0b1110, 0b1111, 0b011), // RW
+ kPMEVTYPER28_EL0 = encode(0b11, 0b011, 0b1110, 0b1111, 0b100), // RW
+ kPMEVTYPER29_EL0 = encode(0b11, 0b011, 0b1110, 0b1111, 0b101), // RW
+ kPMEVTYPER2_EL0 = encode(0b11, 0b011, 0b1110, 0b1100, 0b010), // RW
+ kPMEVTYPER30_EL0 = encode(0b11, 0b011, 0b1110, 0b1111, 0b110), // RW
+ kPMEVTYPER3_EL0 = encode(0b11, 0b011, 0b1110, 0b1100, 0b011), // RW
+ kPMEVTYPER4_EL0 = encode(0b11, 0b011, 0b1110, 0b1100, 0b100), // RW
+ kPMEVTYPER5_EL0 = encode(0b11, 0b011, 0b1110, 0b1100, 0b101), // RW
+ kPMEVTYPER6_EL0 = encode(0b11, 0b011, 0b1110, 0b1100, 0b110), // RW
+ kPMEVTYPER7_EL0 = encode(0b11, 0b011, 0b1110, 0b1100, 0b111), // RW
+ kPMEVTYPER8_EL0 = encode(0b11, 0b011, 0b1110, 0b1101, 0b000), // RW
+ kPMEVTYPER9_EL0 = encode(0b11, 0b011, 0b1110, 0b1101, 0b001), // RW
+ kPMINTENCLR_EL1 = encode(0b11, 0b000, 0b1001, 0b1110, 0b010), // RW
+ kPMINTENSET_EL1 = encode(0b11, 0b000, 0b1001, 0b1110, 0b001), // RW
+ kPMMIR_EL1 = encode(0b11, 0b000, 0b1001, 0b1110, 0b110), // RW
+ kPMOVSCLR_EL0 = encode(0b11, 0b011, 0b1001, 0b1100, 0b011), // RW
+ kPMOVSSET_EL0 = encode(0b11, 0b011, 0b1001, 0b1110, 0b011), // RW
+ kPMSCR_EL1 = encode(0b11, 0b000, 0b1001, 0b1001, 0b000), // RW
+ kPMSCR_EL12 = encode(0b11, 0b101, 0b1001, 0b1001, 0b000), // RW
+ kPMSCR_EL2 = encode(0b11, 0b100, 0b1001, 0b1001, 0b000), // RW
+ kPMSELR_EL0 = encode(0b11, 0b011, 0b1001, 0b1100, 0b101), // RW
+ kPMSEVFR_EL1 = encode(0b11, 0b000, 0b1001, 0b1001, 0b101), // RW
+ kPMSFCR_EL1 = encode(0b11, 0b000, 0b1001, 0b1001, 0b100), // RW
+ kPMSICR_EL1 = encode(0b11, 0b000, 0b1001, 0b1001, 0b010), // RW
+ kPMSIDR_EL1 = encode(0b11, 0b000, 0b1001, 0b1001, 0b111), // RO
+ kPMSIRR_EL1 = encode(0b11, 0b000, 0b1001, 0b1001, 0b011), // RW
+ kPMSLATFR_EL1 = encode(0b11, 0b000, 0b1001, 0b1001, 0b110), // RW
+ kPMSWINC_EL0 = encode(0b11, 0b011, 0b1001, 0b1100, 0b100), // WO
+ kPMUSERENR_EL0 = encode(0b11, 0b011, 0b1001, 0b1110, 0b000), // RW
+ kPMXEVCNTR_EL0 = encode(0b11, 0b011, 0b1001, 0b1101, 0b010), // RW
+ kPMXEVTYPER_EL0 = encode(0b11, 0b011, 0b1001, 0b1101, 0b001), // RW
+ kREVIDR_EL1 = encode(0b11, 0b000, 0b0000, 0b0000, 0b110), // RO
+ kRGSR_EL1 = encode(0b11, 0b000, 0b0001, 0b0000, 0b101), // RW
+ kRMR_EL1 = encode(0b11, 0b000, 0b1100, 0b0000, 0b010), // RW
+ kRMR_EL2 = encode(0b11, 0b100, 0b1100, 0b0000, 0b010), // RW
+ kRMR_EL3 = encode(0b11, 0b110, 0b1100, 0b0000, 0b010), // RW
+ kRNDR = encode(0b11, 0b011, 0b0010, 0b0100, 0b000), // RO
+ kRNDRRS = encode(0b11, 0b011, 0b0010, 0b0100, 0b001), // RO
+ kRVBAR_EL1 = encode(0b11, 0b000, 0b1100, 0b0000, 0b001), // RO
+ kRVBAR_EL2 = encode(0b11, 0b100, 0b1100, 0b0000, 0b001), // RO
+ kRVBAR_EL3 = encode(0b11, 0b110, 0b1100, 0b0000, 0b001), // RO
+ kSCR_EL3 = encode(0b11, 0b110, 0b0001, 0b0001, 0b000), // RW
+ kSCTLR_EL1 = encode(0b11, 0b000, 0b0001, 0b0000, 0b000), // RW
+ kSCTLR_EL12 = encode(0b11, 0b101, 0b0001, 0b0000, 0b000), // RW
+ kSCTLR_EL2 = encode(0b11, 0b100, 0b0001, 0b0000, 0b000), // RW
+ kSCTLR_EL3 = encode(0b11, 0b110, 0b0001, 0b0000, 0b000), // RW
+ kSCXTNUM_EL0 = encode(0b11, 0b011, 0b1101, 0b0000, 0b111), // RW
+ kSCXTNUM_EL1 = encode(0b11, 0b000, 0b1101, 0b0000, 0b111), // RW
+ kSCXTNUM_EL12 = encode(0b11, 0b101, 0b1101, 0b0000, 0b111), // RW
+ kSCXTNUM_EL2 = encode(0b11, 0b100, 0b1101, 0b0000, 0b111), // RW
+ kSCXTNUM_EL3 = encode(0b11, 0b110, 0b1101, 0b0000, 0b111), // RW
+ kSDER32_EL2 = encode(0b11, 0b100, 0b0001, 0b0011, 0b001), // RW
+ kSDER32_EL3 = encode(0b11, 0b110, 0b0001, 0b0001, 0b001), // RW
+ kSPSR_EL1 = encode(0b11, 0b000, 0b0100, 0b0000, 0b000), // RW
+ kSPSR_EL12 = encode(0b11, 0b101, 0b0100, 0b0000, 0b000), // RW
+ kSPSR_EL2 = encode(0b11, 0b100, 0b0100, 0b0000, 0b000), // RW
+ kSPSR_EL3 = encode(0b11, 0b110, 0b0100, 0b0000, 0b000), // RW
+ kSPSR_abt = encode(0b11, 0b100, 0b0100, 0b0011, 0b001), // RW
+ kSPSR_fiq = encode(0b11, 0b100, 0b0100, 0b0011, 0b011), // RW
+ kSPSR_irq = encode(0b11, 0b100, 0b0100, 0b0011, 0b000), // RW
+ kSPSR_und = encode(0b11, 0b100, 0b0100, 0b0011, 0b010), // RW
+ kSPSel = encode(0b11, 0b000, 0b0100, 0b0010, 0b000), // RW
+ kSP_EL0 = encode(0b11, 0b000, 0b0100, 0b0001, 0b000), // RW
+ kSP_EL1 = encode(0b11, 0b100, 0b0100, 0b0001, 0b000), // RW
+ kSP_EL2 = encode(0b11, 0b110, 0b0100, 0b0001, 0b000), // RW
+ kSSBS = encode(0b11, 0b011, 0b0100, 0b0010, 0b110), // RW
+ kTCO = encode(0b11, 0b011, 0b0100, 0b0010, 0b111), // RW
+ kTCR_EL1 = encode(0b11, 0b000, 0b0010, 0b0000, 0b010), // RW
+ kTCR_EL12 = encode(0b11, 0b101, 0b0010, 0b0000, 0b010), // RW
+ kTCR_EL2 = encode(0b11, 0b100, 0b0010, 0b0000, 0b010), // RW
+ kTCR_EL3 = encode(0b11, 0b110, 0b0010, 0b0000, 0b010), // RW
+ kTEECR32_EL1 = encode(0b10, 0b010, 0b0000, 0b0000, 0b000), // RW
+ kTEEHBR32_EL1 = encode(0b10, 0b010, 0b0001, 0b0000, 0b000), // RW
+ kTFSRE0_EL1 = encode(0b11, 0b000, 0b0101, 0b0110, 0b001), // RW
+ kTFSR_EL1 = encode(0b11, 0b000, 0b0101, 0b0110, 0b000), // RW
+ kTFSR_EL12 = encode(0b11, 0b101, 0b0101, 0b0110, 0b000), // RW
+ kTFSR_EL2 = encode(0b11, 0b100, 0b0101, 0b0110, 0b000), // RW
+ kTFSR_EL3 = encode(0b11, 0b110, 0b0101, 0b0110, 0b000), // RW
+ kTPIDRRO_EL0 = encode(0b11, 0b011, 0b1101, 0b0000, 0b011), // RW
+ kTPIDR_EL0 = encode(0b11, 0b011, 0b1101, 0b0000, 0b010), // RW
+ kTPIDR_EL1 = encode(0b11, 0b000, 0b1101, 0b0000, 0b100), // RW
+ kTPIDR_EL2 = encode(0b11, 0b100, 0b1101, 0b0000, 0b010), // RW
+ kTPIDR_EL3 = encode(0b11, 0b110, 0b1101, 0b0000, 0b010), // RW
+ kTRBBASER_EL1 = encode(0b11, 0b000, 0b1001, 0b1011, 0b010), // RW
+ kTRBIDR_EL1 = encode(0b11, 0b000, 0b1001, 0b1011, 0b111), // RO
+ kTRBLIMITR_EL1 = encode(0b11, 0b000, 0b1001, 0b1011, 0b000), // RW
+ kTRBMAR_EL1 = encode(0b11, 0b000, 0b1001, 0b1011, 0b100), // RW
+ kTRBPTR_EL1 = encode(0b11, 0b000, 0b1001, 0b1011, 0b001), // RW
+ kTRBSR_EL1 = encode(0b11, 0b000, 0b1001, 0b1011, 0b011), // RW
+ kTRBTRG_EL1 = encode(0b11, 0b000, 0b1001, 0b1011, 0b110), // RW
+ kTRCACATR0 = encode(0b10, 0b001, 0b0010, 0b0000, 0b010), // RW
+ kTRCACATR1 = encode(0b10, 0b001, 0b0010, 0b0010, 0b010), // RW
+ kTRCACATR10 = encode(0b10, 0b001, 0b0010, 0b0100, 0b011), // RW
+ kTRCACATR11 = encode(0b10, 0b001, 0b0010, 0b0110, 0b011), // RW
+ kTRCACATR12 = encode(0b10, 0b001, 0b0010, 0b1000, 0b011), // RW
+ kTRCACATR13 = encode(0b10, 0b001, 0b0010, 0b1010, 0b011), // RW
+ kTRCACATR14 = encode(0b10, 0b001, 0b0010, 0b1100, 0b011), // RW
+ kTRCACATR15 = encode(0b10, 0b001, 0b0010, 0b1110, 0b011), // RW
+ kTRCACATR2 = encode(0b10, 0b001, 0b0010, 0b0100, 0b010), // RW
+ kTRCACATR3 = encode(0b10, 0b001, 0b0010, 0b0110, 0b010), // RW
+ kTRCACATR4 = encode(0b10, 0b001, 0b0010, 0b1000, 0b010), // RW
+ kTRCACATR5 = encode(0b10, 0b001, 0b0010, 0b1010, 0b010), // RW
+ kTRCACATR6 = encode(0b10, 0b001, 0b0010, 0b1100, 0b010), // RW
+ kTRCACATR7 = encode(0b10, 0b001, 0b0010, 0b1110, 0b010), // RW
+ kTRCACATR8 = encode(0b10, 0b001, 0b0010, 0b0000, 0b011), // RW
+ kTRCACATR9 = encode(0b10, 0b001, 0b0010, 0b0010, 0b011), // RW
+ kTRCACVR0 = encode(0b10, 0b001, 0b0010, 0b0000, 0b000), // RW
+ kTRCACVR1 = encode(0b10, 0b001, 0b0010, 0b0010, 0b000), // RW
+ kTRCACVR10 = encode(0b10, 0b001, 0b0010, 0b0100, 0b001), // RW
+ kTRCACVR11 = encode(0b10, 0b001, 0b0010, 0b0110, 0b001), // RW
+ kTRCACVR12 = encode(0b10, 0b001, 0b0010, 0b1000, 0b001), // RW
+ kTRCACVR13 = encode(0b10, 0b001, 0b0010, 0b1010, 0b001), // RW
+ kTRCACVR14 = encode(0b10, 0b001, 0b0010, 0b1100, 0b001), // RW
+ kTRCACVR15 = encode(0b10, 0b001, 0b0010, 0b1110, 0b001), // RW
+ kTRCACVR2 = encode(0b10, 0b001, 0b0010, 0b0100, 0b000), // RW
+ kTRCACVR3 = encode(0b10, 0b001, 0b0010, 0b0110, 0b000), // RW
+ kTRCACVR4 = encode(0b10, 0b001, 0b0010, 0b1000, 0b000), // RW
+ kTRCACVR5 = encode(0b10, 0b001, 0b0010, 0b1010, 0b000), // RW
+ kTRCACVR6 = encode(0b10, 0b001, 0b0010, 0b1100, 0b000), // RW
+ kTRCACVR7 = encode(0b10, 0b001, 0b0010, 0b1110, 0b000), // RW
+ kTRCACVR8 = encode(0b10, 0b001, 0b0010, 0b0000, 0b001), // RW
+ kTRCACVR9 = encode(0b10, 0b001, 0b0010, 0b0010, 0b001), // RW
+ kTRCAUTHSTATUS = encode(0b10, 0b001, 0b0111, 0b1110, 0b110), // RO
+ kTRCAUXCTLR = encode(0b10, 0b001, 0b0000, 0b0110, 0b000), // RW
+ kTRCBBCTLR = encode(0b10, 0b001, 0b0000, 0b1111, 0b000), // RW
+ kTRCCCCTLR = encode(0b10, 0b001, 0b0000, 0b1110, 0b000), // RW
+ kTRCCIDCCTLR0 = encode(0b10, 0b001, 0b0011, 0b0000, 0b010), // RW
+ kTRCCIDCCTLR1 = encode(0b10, 0b001, 0b0011, 0b0001, 0b010), // RW
+ kTRCCIDCVR0 = encode(0b10, 0b001, 0b0011, 0b0000, 0b000), // RW
+ kTRCCIDCVR1 = encode(0b10, 0b001, 0b0011, 0b0010, 0b000), // RW
+ kTRCCIDCVR2 = encode(0b10, 0b001, 0b0011, 0b0100, 0b000), // RW
+ kTRCCIDCVR3 = encode(0b10, 0b001, 0b0011, 0b0110, 0b000), // RW
+ kTRCCIDCVR4 = encode(0b10, 0b001, 0b0011, 0b1000, 0b000), // RW
+ kTRCCIDCVR5 = encode(0b10, 0b001, 0b0011, 0b1010, 0b000), // RW
+ kTRCCIDCVR6 = encode(0b10, 0b001, 0b0011, 0b1100, 0b000), // RW
+ kTRCCIDCVR7 = encode(0b10, 0b001, 0b0011, 0b1110, 0b000), // RW
+ kTRCCIDR0 = encode(0b10, 0b001, 0b0111, 0b1100, 0b111), // RO
+ kTRCCIDR1 = encode(0b10, 0b001, 0b0111, 0b1101, 0b111), // RO
+ kTRCCIDR2 = encode(0b10, 0b001, 0b0111, 0b1110, 0b111), // RO
+ kTRCCIDR3 = encode(0b10, 0b001, 0b0111, 0b1111, 0b111), // RO
+ kTRCCLAIMCLR = encode(0b10, 0b001, 0b0111, 0b1001, 0b110), // RW
+ kTRCCLAIMSET = encode(0b10, 0b001, 0b0111, 0b1000, 0b110), // RW
+ kTRCCNTCTLR0 = encode(0b10, 0b001, 0b0000, 0b0100, 0b101), // RW
+ kTRCCNTCTLR1 = encode(0b10, 0b001, 0b0000, 0b0101, 0b101), // RW
+ kTRCCNTCTLR2 = encode(0b10, 0b001, 0b0000, 0b0110, 0b101), // RW
+ kTRCCNTCTLR3 = encode(0b10, 0b001, 0b0000, 0b0111, 0b101), // RW
+ kTRCCNTRLDVR0 = encode(0b10, 0b001, 0b0000, 0b0000, 0b101), // RW
+ kTRCCNTRLDVR1 = encode(0b10, 0b001, 0b0000, 0b0001, 0b101), // RW
+ kTRCCNTRLDVR2 = encode(0b10, 0b001, 0b0000, 0b0010, 0b101), // RW
+ kTRCCNTRLDVR3 = encode(0b10, 0b001, 0b0000, 0b0011, 0b101), // RW
+ kTRCCNTVR0 = encode(0b10, 0b001, 0b0000, 0b1000, 0b101), // RW
+ kTRCCNTVR1 = encode(0b10, 0b001, 0b0000, 0b1001, 0b101), // RW
+ kTRCCNTVR2 = encode(0b10, 0b001, 0b0000, 0b1010, 0b101), // RW
+ kTRCCNTVR3 = encode(0b10, 0b001, 0b0000, 0b1011, 0b101), // RW
+ kTRCCONFIGR = encode(0b10, 0b001, 0b0000, 0b0100, 0b000), // RW
+ kTRCDEVAFF0 = encode(0b10, 0b001, 0b0111, 0b1010, 0b110), // RO
+ kTRCDEVAFF1 = encode(0b10, 0b001, 0b0111, 0b1011, 0b110), // RO
+ kTRCDEVARCH = encode(0b10, 0b001, 0b0111, 0b1111, 0b110), // RO
+ kTRCDEVID = encode(0b10, 0b001, 0b0111, 0b0010, 0b111), // RO
+ kTRCDEVTYPE = encode(0b10, 0b001, 0b0111, 0b0011, 0b111), // RO
+ kTRCDVCMR0 = encode(0b10, 0b001, 0b0010, 0b0000, 0b110), // RW
+ kTRCDVCMR1 = encode(0b10, 0b001, 0b0010, 0b0100, 0b110), // RW
+ kTRCDVCMR2 = encode(0b10, 0b001, 0b0010, 0b1000, 0b110), // RW
+ kTRCDVCMR3 = encode(0b10, 0b001, 0b0010, 0b1100, 0b110), // RW
+ kTRCDVCMR4 = encode(0b10, 0b001, 0b0010, 0b0000, 0b111), // RW
+ kTRCDVCMR5 = encode(0b10, 0b001, 0b0010, 0b0100, 0b111), // RW
+ kTRCDVCMR6 = encode(0b10, 0b001, 0b0010, 0b1000, 0b111), // RW
+ kTRCDVCMR7 = encode(0b10, 0b001, 0b0010, 0b1100, 0b111), // RW
+ kTRCDVCVR0 = encode(0b10, 0b001, 0b0010, 0b0000, 0b100), // RW
+ kTRCDVCVR1 = encode(0b10, 0b001, 0b0010, 0b0100, 0b100), // RW
+ kTRCDVCVR2 = encode(0b10, 0b001, 0b0010, 0b1000, 0b100), // RW
+ kTRCDVCVR3 = encode(0b10, 0b001, 0b0010, 0b1100, 0b100), // RW
+ kTRCDVCVR4 = encode(0b10, 0b001, 0b0010, 0b0000, 0b101), // RW
+ kTRCDVCVR5 = encode(0b10, 0b001, 0b0010, 0b0100, 0b101), // RW
+ kTRCDVCVR6 = encode(0b10, 0b001, 0b0010, 0b1000, 0b101), // RW
+ kTRCDVCVR7 = encode(0b10, 0b001, 0b0010, 0b1100, 0b101), // RW
+ kTRCEVENTCTL0R = encode(0b10, 0b001, 0b0000, 0b1000, 0b000), // RW
+ kTRCEVENTCTL1R = encode(0b10, 0b001, 0b0000, 0b1001, 0b000), // RW
+ kTRCEXTINSELR = encode(0b10, 0b001, 0b0000, 0b1000, 0b100), // RW
+ kTRCEXTINSELR0 = encode(0b10, 0b001, 0b0000, 0b1000, 0b100), // RW
+ kTRCEXTINSELR1 = encode(0b10, 0b001, 0b0000, 0b1001, 0b100), // RW
+ kTRCEXTINSELR2 = encode(0b10, 0b001, 0b0000, 0b1010, 0b100), // RW
+ kTRCEXTINSELR3 = encode(0b10, 0b001, 0b0000, 0b1011, 0b100), // RW
+ kTRCIDR0 = encode(0b10, 0b001, 0b0000, 0b1000, 0b111), // RO
+ kTRCIDR1 = encode(0b10, 0b001, 0b0000, 0b1001, 0b111), // RO
+ kTRCIDR10 = encode(0b10, 0b001, 0b0000, 0b0010, 0b110), // RO
+ kTRCIDR11 = encode(0b10, 0b001, 0b0000, 0b0011, 0b110), // RO
+ kTRCIDR12 = encode(0b10, 0b001, 0b0000, 0b0100, 0b110), // RO
+ kTRCIDR13 = encode(0b10, 0b001, 0b0000, 0b0101, 0b110), // RO
+ kTRCIDR2 = encode(0b10, 0b001, 0b0000, 0b1010, 0b111), // RO
+ kTRCIDR3 = encode(0b10, 0b001, 0b0000, 0b1011, 0b111), // RO
+ kTRCIDR4 = encode(0b10, 0b001, 0b0000, 0b1100, 0b111), // RO
+ kTRCIDR5 = encode(0b10, 0b001, 0b0000, 0b1101, 0b111), // RO
+ kTRCIDR6 = encode(0b10, 0b001, 0b0000, 0b1110, 0b111), // RO
+ kTRCIDR7 = encode(0b10, 0b001, 0b0000, 0b1111, 0b111), // RO
+ kTRCIDR8 = encode(0b10, 0b001, 0b0000, 0b0000, 0b110), // RO
+ kTRCIDR9 = encode(0b10, 0b001, 0b0000, 0b0001, 0b110), // RO
+ kTRCIMSPEC0 = encode(0b10, 0b001, 0b0000, 0b0000, 0b111), // RW
+ kTRCIMSPEC1 = encode(0b10, 0b001, 0b0000, 0b0001, 0b111), // RW
+ kTRCIMSPEC2 = encode(0b10, 0b001, 0b0000, 0b0010, 0b111), // RW
+ kTRCIMSPEC3 = encode(0b10, 0b001, 0b0000, 0b0011, 0b111), // RW
+ kTRCIMSPEC4 = encode(0b10, 0b001, 0b0000, 0b0100, 0b111), // RW
+ kTRCIMSPEC5 = encode(0b10, 0b001, 0b0000, 0b0101, 0b111), // RW
+ kTRCIMSPEC6 = encode(0b10, 0b001, 0b0000, 0b0110, 0b111), // RW
+ kTRCIMSPEC7 = encode(0b10, 0b001, 0b0000, 0b0111, 0b111), // RW
+ kTRCITCTRL = encode(0b10, 0b001, 0b0111, 0b0000, 0b100), // RW
+ kTRCLAR = encode(0b10, 0b001, 0b0111, 0b1100, 0b110), // WO
+ kTRCLSR = encode(0b10, 0b001, 0b0111, 0b1101, 0b110), // RO
+ kTRCOSLAR = encode(0b10, 0b001, 0b0001, 0b0000, 0b100), // WO
+ kTRCOSLSR = encode(0b10, 0b001, 0b0001, 0b0001, 0b100), // RO
+ kTRCPDCR = encode(0b10, 0b001, 0b0001, 0b0100, 0b100), // RW
+ kTRCPDSR = encode(0b10, 0b001, 0b0001, 0b0101, 0b100), // RO
+ kTRCPIDR0 = encode(0b10, 0b001, 0b0111, 0b1000, 0b111), // RO
+ kTRCPIDR1 = encode(0b10, 0b001, 0b0111, 0b1001, 0b111), // RO
+ kTRCPIDR2 = encode(0b10, 0b001, 0b0111, 0b1010, 0b111), // RO
+ kTRCPIDR3 = encode(0b10, 0b001, 0b0111, 0b1011, 0b111), // RO
+ kTRCPIDR4 = encode(0b10, 0b001, 0b0111, 0b0100, 0b111), // RO
+ kTRCPIDR5 = encode(0b10, 0b001, 0b0111, 0b0101, 0b111), // RO
+ kTRCPIDR6 = encode(0b10, 0b001, 0b0111, 0b0110, 0b111), // RO
+ kTRCPIDR7 = encode(0b10, 0b001, 0b0111, 0b0111, 0b111), // RO
+ kTRCPRGCTLR = encode(0b10, 0b001, 0b0000, 0b0001, 0b000), // RW
+ kTRCPROCSELR = encode(0b10, 0b001, 0b0000, 0b0010, 0b000), // RW
+ kTRCQCTLR = encode(0b10, 0b001, 0b0000, 0b0001, 0b001), // RW
+ kTRCRSCTLR10 = encode(0b10, 0b001, 0b0001, 0b1010, 0b000), // RW
+ kTRCRSCTLR11 = encode(0b10, 0b001, 0b0001, 0b1011, 0b000), // RW
+ kTRCRSCTLR12 = encode(0b10, 0b001, 0b0001, 0b1100, 0b000), // RW
+ kTRCRSCTLR13 = encode(0b10, 0b001, 0b0001, 0b1101, 0b000), // RW
+ kTRCRSCTLR14 = encode(0b10, 0b001, 0b0001, 0b1110, 0b000), // RW
+ kTRCRSCTLR15 = encode(0b10, 0b001, 0b0001, 0b1111, 0b000), // RW
+ kTRCRSCTLR16 = encode(0b10, 0b001, 0b0001, 0b0000, 0b001), // RW
+ kTRCRSCTLR17 = encode(0b10, 0b001, 0b0001, 0b0001, 0b001), // RW
+ kTRCRSCTLR18 = encode(0b10, 0b001, 0b0001, 0b0010, 0b001), // RW
+ kTRCRSCTLR19 = encode(0b10, 0b001, 0b0001, 0b0011, 0b001), // RW
+ kTRCRSCTLR2 = encode(0b10, 0b001, 0b0001, 0b0010, 0b000), // RW
+ kTRCRSCTLR20 = encode(0b10, 0b001, 0b0001, 0b0100, 0b001), // RW
+ kTRCRSCTLR21 = encode(0b10, 0b001, 0b0001, 0b0101, 0b001), // RW
+ kTRCRSCTLR22 = encode(0b10, 0b001, 0b0001, 0b0110, 0b001), // RW
+ kTRCRSCTLR23 = encode(0b10, 0b001, 0b0001, 0b0111, 0b001), // RW
+ kTRCRSCTLR24 = encode(0b10, 0b001, 0b0001, 0b1000, 0b001), // RW
+ kTRCRSCTLR25 = encode(0b10, 0b001, 0b0001, 0b1001, 0b001), // RW
+ kTRCRSCTLR26 = encode(0b10, 0b001, 0b0001, 0b1010, 0b001), // RW
+ kTRCRSCTLR27 = encode(0b10, 0b001, 0b0001, 0b1011, 0b001), // RW
+ kTRCRSCTLR28 = encode(0b10, 0b001, 0b0001, 0b1100, 0b001), // RW
+ kTRCRSCTLR29 = encode(0b10, 0b001, 0b0001, 0b1101, 0b001), // RW
+ kTRCRSCTLR3 = encode(0b10, 0b001, 0b0001, 0b0011, 0b000), // RW
+ kTRCRSCTLR30 = encode(0b10, 0b001, 0b0001, 0b1110, 0b001), // RW
+ kTRCRSCTLR31 = encode(0b10, 0b001, 0b0001, 0b1111, 0b001), // RW
+ kTRCRSCTLR4 = encode(0b10, 0b001, 0b0001, 0b0100, 0b000), // RW
+ kTRCRSCTLR5 = encode(0b10, 0b001, 0b0001, 0b0101, 0b000), // RW
+ kTRCRSCTLR6 = encode(0b10, 0b001, 0b0001, 0b0110, 0b000), // RW
+ kTRCRSCTLR7 = encode(0b10, 0b001, 0b0001, 0b0111, 0b000), // RW
+ kTRCRSCTLR8 = encode(0b10, 0b001, 0b0001, 0b1000, 0b000), // RW
+ kTRCRSCTLR9 = encode(0b10, 0b001, 0b0001, 0b1001, 0b000), // RW
+ kTRCRSR = encode(0b10, 0b001, 0b0000, 0b1010, 0b000), // RW
+ kTRCSEQEVR0 = encode(0b10, 0b001, 0b0000, 0b0000, 0b100), // RW
+ kTRCSEQEVR1 = encode(0b10, 0b001, 0b0000, 0b0001, 0b100), // RW
+ kTRCSEQEVR2 = encode(0b10, 0b001, 0b0000, 0b0010, 0b100), // RW
+ kTRCSEQRSTEVR = encode(0b10, 0b001, 0b0000, 0b0110, 0b100), // RW
+ kTRCSEQSTR = encode(0b10, 0b001, 0b0000, 0b0111, 0b100), // RW
+ kTRCSSCCR0 = encode(0b10, 0b001, 0b0001, 0b0000, 0b010), // RW
+ kTRCSSCCR1 = encode(0b10, 0b001, 0b0001, 0b0001, 0b010), // RW
+ kTRCSSCCR2 = encode(0b10, 0b001, 0b0001, 0b0010, 0b010), // RW
+ kTRCSSCCR3 = encode(0b10, 0b001, 0b0001, 0b0011, 0b010), // RW
+ kTRCSSCCR4 = encode(0b10, 0b001, 0b0001, 0b0100, 0b010), // RW
+ kTRCSSCCR5 = encode(0b10, 0b001, 0b0001, 0b0101, 0b010), // RW
+ kTRCSSCCR6 = encode(0b10, 0b001, 0b0001, 0b0110, 0b010), // RW
+ kTRCSSCCR7 = encode(0b10, 0b001, 0b0001, 0b0111, 0b010), // RW
+ kTRCSSCSR0 = encode(0b10, 0b001, 0b0001, 0b1000, 0b010), // RW
+ kTRCSSCSR1 = encode(0b10, 0b001, 0b0001, 0b1001, 0b010), // RW
+ kTRCSSCSR2 = encode(0b10, 0b001, 0b0001, 0b1010, 0b010), // RW
+ kTRCSSCSR3 = encode(0b10, 0b001, 0b0001, 0b1011, 0b010), // RW
+ kTRCSSCSR4 = encode(0b10, 0b001, 0b0001, 0b1100, 0b010), // RW
+ kTRCSSCSR5 = encode(0b10, 0b001, 0b0001, 0b1101, 0b010), // RW
+ kTRCSSCSR6 = encode(0b10, 0b001, 0b0001, 0b1110, 0b010), // RW
+ kTRCSSCSR7 = encode(0b10, 0b001, 0b0001, 0b1111, 0b010), // RW
+ kTRCSSPCICR0 = encode(0b10, 0b001, 0b0001, 0b0000, 0b011), // RW
+ kTRCSSPCICR1 = encode(0b10, 0b001, 0b0001, 0b0001, 0b011), // RW
+ kTRCSSPCICR2 = encode(0b10, 0b001, 0b0001, 0b0010, 0b011), // RW
+ kTRCSSPCICR3 = encode(0b10, 0b001, 0b0001, 0b0011, 0b011), // RW
+ kTRCSSPCICR4 = encode(0b10, 0b001, 0b0001, 0b0100, 0b011), // RW
+ kTRCSSPCICR5 = encode(0b10, 0b001, 0b0001, 0b0101, 0b011), // RW
+ kTRCSSPCICR6 = encode(0b10, 0b001, 0b0001, 0b0110, 0b011), // RW
+ kTRCSSPCICR7 = encode(0b10, 0b001, 0b0001, 0b0111, 0b011), // RW
+ kTRCSTALLCTLR = encode(0b10, 0b001, 0b0000, 0b1011, 0b000), // RW
+ kTRCSTATR = encode(0b10, 0b001, 0b0000, 0b0011, 0b000), // RO
+ kTRCSYNCPR = encode(0b10, 0b001, 0b0000, 0b1101, 0b000), // RW
+ kTRCTRACEIDR = encode(0b10, 0b001, 0b0000, 0b0000, 0b001), // RW
+ kTRCTSCTLR = encode(0b10, 0b001, 0b0000, 0b1100, 0b000), // RW
+ kTRCVDARCCTLR = encode(0b10, 0b001, 0b0000, 0b1010, 0b010), // RW
+ kTRCVDCTLR = encode(0b10, 0b001, 0b0000, 0b1000, 0b010), // RW
+ kTRCVDSACCTLR = encode(0b10, 0b001, 0b0000, 0b1001, 0b010), // RW
+ kTRCVICTLR = encode(0b10, 0b001, 0b0000, 0b0000, 0b010), // RW
+ kTRCVIIECTLR = encode(0b10, 0b001, 0b0000, 0b0001, 0b010), // RW
+ kTRCVIPCSSCTLR = encode(0b10, 0b001, 0b0000, 0b0011, 0b010), // RW
+ kTRCVISSCTLR = encode(0b10, 0b001, 0b0000, 0b0010, 0b010), // RW
+ kTRCVMIDCCTLR0 = encode(0b10, 0b001, 0b0011, 0b0010, 0b010), // RW
+ kTRCVMIDCCTLR1 = encode(0b10, 0b001, 0b0011, 0b0011, 0b010), // RW
+ kTRCVMIDCVR0 = encode(0b10, 0b001, 0b0011, 0b0000, 0b001), // RW
+ kTRCVMIDCVR1 = encode(0b10, 0b001, 0b0011, 0b0010, 0b001), // RW
+ kTRCVMIDCVR2 = encode(0b10, 0b001, 0b0011, 0b0100, 0b001), // RW
+ kTRCVMIDCVR3 = encode(0b10, 0b001, 0b0011, 0b0110, 0b001), // RW
+ kTRCVMIDCVR4 = encode(0b10, 0b001, 0b0011, 0b1000, 0b001), // RW
+ kTRCVMIDCVR5 = encode(0b10, 0b001, 0b0011, 0b1010, 0b001), // RW
+ kTRCVMIDCVR6 = encode(0b10, 0b001, 0b0011, 0b1100, 0b001), // RW
+ kTRCVMIDCVR7 = encode(0b10, 0b001, 0b0011, 0b1110, 0b001), // RW
+ kTRFCR_EL1 = encode(0b11, 0b000, 0b0001, 0b0010, 0b001), // RW
+ kTRFCR_EL12 = encode(0b11, 0b101, 0b0001, 0b0010, 0b001), // RW
+ kTRFCR_EL2 = encode(0b11, 0b100, 0b0001, 0b0010, 0b001), // RW
+ kTTBR0_EL1 = encode(0b11, 0b000, 0b0010, 0b0000, 0b000), // RW
+ kTTBR0_EL12 = encode(0b11, 0b101, 0b0010, 0b0000, 0b000), // RW
+ kTTBR0_EL2 = encode(0b11, 0b100, 0b0010, 0b0000, 0b000), // RW
+ kTTBR0_EL3 = encode(0b11, 0b110, 0b0010, 0b0000, 0b000), // RW
+ kTTBR1_EL1 = encode(0b11, 0b000, 0b0010, 0b0000, 0b001), // RW
+ kTTBR1_EL12 = encode(0b11, 0b101, 0b0010, 0b0000, 0b001), // RW
+ kTTBR1_EL2 = encode(0b11, 0b100, 0b0010, 0b0000, 0b001), // RW
+ kUAO = encode(0b11, 0b000, 0b0100, 0b0010, 0b100), // RW
+ kVBAR_EL1 = encode(0b11, 0b000, 0b1100, 0b0000, 0b000), // RW
+ kVBAR_EL12 = encode(0b11, 0b101, 0b1100, 0b0000, 0b000), // RW
+ kVBAR_EL2 = encode(0b11, 0b100, 0b1100, 0b0000, 0b000), // RW
+ kVBAR_EL3 = encode(0b11, 0b110, 0b1100, 0b0000, 0b000), // RW
+ kVDISR_EL2 = encode(0b11, 0b100, 0b1100, 0b0001, 0b001), // RW
+ kVMPIDR_EL2 = encode(0b11, 0b100, 0b0000, 0b0000, 0b101), // RW
+ kVNCR_EL2 = encode(0b11, 0b100, 0b0010, 0b0010, 0b000), // RW
+ kVPIDR_EL2 = encode(0b11, 0b100, 0b0000, 0b0000, 0b000), // RW
+ kVSESR_EL2 = encode(0b11, 0b100, 0b0101, 0b0010, 0b011), // RW
+ kVSTCR_EL2 = encode(0b11, 0b100, 0b0010, 0b0110, 0b010), // RW
+ kVSTTBR_EL2 = encode(0b11, 0b100, 0b0010, 0b0110, 0b000), // RW
+ kVTCR_EL2 = encode(0b11, 0b100, 0b0010, 0b0001, 0b010), // RW
+ kVTTBR_EL2 = encode(0b11, 0b100, 0b0010, 0b0001, 0b000), // RW
+ kZCR_EL1 = encode(0b11, 0b000, 0b0001, 0b0010, 0b000), // RW
+ kZCR_EL12 = encode(0b11, 0b101, 0b0001, 0b0010, 0b000), // RW
+ kZCR_EL2 = encode(0b11, 0b100, 0b0001, 0b0010, 0b000), // RW
+ kZCR_EL3 = encode(0b11, 0b110, 0b0001, 0b0010, 0b000) // RW
+ };
+};
+
+} // {Predicate}
+
+//! \}
+
+ASMJIT_END_SUB_NAMESPACE
+
+#endif // ASMJIT_ARM_A64GLOBALS_H_INCLUDED
diff --git a/3rdparty/asmjit/src/asmjit/arm/a64instapi.cpp b/3rdparty/asmjit/src/asmjit/arm/a64instapi.cpp
new file mode 100644
index 00000000000..dc98bc8f73c
--- /dev/null
+++ b/3rdparty/asmjit/src/asmjit/arm/a64instapi.cpp
@@ -0,0 +1,278 @@
+// This file is part of AsmJit project <https://asmjit.com>
+//
+// See asmjit.h or LICENSE.md for license and copyright information
+// SPDX-License-Identifier: Zlib
+
+#include "../core/api-build_p.h"
+#if !defined(ASMJIT_NO_AARCH64)
+
+#include "../core/cpuinfo.h"
+#include "../core/misc_p.h"
+#include "../core/support.h"
+#include "../arm/a64instapi_p.h"
+#include "../arm/a64instdb_p.h"
+#include "../arm/a64operand.h"
+
+ASMJIT_BEGIN_SUB_NAMESPACE(a64)
+
+// a64::InstInternal - Text
+// ========================
+
+#ifndef ASMJIT_NO_TEXT
+Error InstInternal::instIdToString(Arch arch, InstId instId, String& output) noexcept {
+ uint32_t realId = instId & uint32_t(InstIdParts::kRealId);
+ DebugUtils::unused(arch);
+
+ if (ASMJIT_UNLIKELY(!Inst::isDefinedId(realId)))
+ return DebugUtils::errored(kErrorInvalidInstruction);
+
+ const InstDB::InstInfo& info = InstDB::infoById(realId);
+ return output.append(InstDB::_nameData + info._nameDataIndex);
+}
+
+InstId InstInternal::stringToInstId(Arch arch, const char* s, size_t len) noexcept {
+ DebugUtils::unused(arch);
+
+ if (ASMJIT_UNLIKELY(!s))
+ return Inst::kIdNone;
+
+ if (len == SIZE_MAX)
+ len = strlen(s);
+
+ if (ASMJIT_UNLIKELY(len == 0 || len > InstDB::kMaxNameSize))
+ return Inst::kIdNone;
+
+ uint32_t prefix = uint32_t(s[0]) - 'a';
+ if (ASMJIT_UNLIKELY(prefix > 'z' - 'a'))
+ return Inst::kIdNone;
+
+ uint32_t index = InstDB::instNameIndex[prefix].start;
+ if (ASMJIT_UNLIKELY(!index))
+ return Inst::kIdNone;
+
+ const char* nameData = InstDB::_nameData;
+ const InstDB::InstInfo* table = InstDB::_instInfoTable;
+
+ const InstDB::InstInfo* base = table + index;
+ const InstDB::InstInfo* end = table + InstDB::instNameIndex[prefix].end;
+
+ for (size_t lim = (size_t)(end - base); lim != 0; lim >>= 1) {
+ const InstDB::InstInfo* cur = base + (lim >> 1);
+ int result = Support::cmpInstName(nameData + cur[0]._nameDataIndex, s, len);
+
+ if (result < 0) {
+ base = cur + 1;
+ lim--;
+ continue;
+ }
+
+ if (result > 0)
+ continue;
+
+ return uint32_t((size_t)(cur - table));
+ }
+
+ return Inst::kIdNone;
+}
+#endif // !ASMJIT_NO_TEXT
+
+// a64::InstInternal - Validate
+// ============================
+
+#ifndef ASMJIT_NO_VALIDATION
+ASMJIT_FAVOR_SIZE Error InstInternal::validate(Arch arch, const BaseInst& inst, const Operand_* operands, size_t opCount, ValidationFlags validationFlags) noexcept {
+ // TODO:
+ DebugUtils::unused(arch, inst, operands, opCount, validationFlags);
+ return kErrorOk;
+}
+#endif // !ASMJIT_NO_VALIDATION
+
+// a64::InstInternal - QueryRWInfo
+// ===============================
+
+#ifndef ASMJIT_NO_INTROSPECTION
+struct InstRWInfoData {
+ uint8_t rwx[Globals::kMaxOpCount];
+};
+
+static const InstRWInfoData instRWInfoData[] = {
+ #define R uint8_t(OpRWFlags::kRead)
+ #define W uint8_t(OpRWFlags::kWrite)
+ #define X uint8_t(OpRWFlags::kRW)
+
+ {{ R, R, R, R, R, R }}, // kRWI_R
+ {{ R, W, R, R, R, R }}, // kRWI_RW
+ {{ R, X, R, R, R, R }}, // kRWI_RX
+ {{ R, R, W, R, R, R }}, // kRWI_RRW
+ {{ R, W, X, R, R, R }}, // kRWI_RWX
+ {{ W, R, R, R, R, R }}, // kRWI_W
+ {{ W, R, W, R, R, R }}, // kRWI_WRW
+ {{ W, R, X, R, R, R }}, // kRWI_WRX
+ {{ W, R, R, W, R, R }}, // kRWI_WRRW
+ {{ W, R, R, X, R, R }}, // kRWI_WRRX
+ {{ W, W, R, R, R, R }}, // kRWI_WW
+ {{ X, R, R, R, R, R }}, // kRWI_X
+ {{ X, R, X, R, R, R }}, // kRWI_XRX
+ {{ X, X, R, R, X, R }}, // kRWI_XXRRX
+
+ {{ W, R, R, R, R, R }}, // kRWI_LDn
+ {{ R, W, R, R, R, R }}, // kRWI_STn
+ {{ R, R, R, R, R, R }} // kRWI_TODO
+
+ #undef R
+ #undef W
+ #undef X
+};
+
+static const uint8_t elementTypeSize[8] = { 0, 1, 2, 4, 8, 4, 4, 0 };
+
+Error InstInternal::queryRWInfo(Arch arch, const BaseInst& inst, const Operand_* operands, size_t opCount, InstRWInfo* out) noexcept {
+ // Unused in Release configuration as the assert is not compiled in.
+ DebugUtils::unused(arch);
+
+ // Only called when `arch` matches X86 family.
+ ASMJIT_ASSERT(Environment::isFamilyARM(arch));
+
+ // Get the instruction data.
+ uint32_t realId = inst.id() & uint32_t(InstIdParts::kRealId);
+
+ if (ASMJIT_UNLIKELY(!Inst::isDefinedId(realId)))
+ return DebugUtils::errored(kErrorInvalidInstruction);
+
+ out->_instFlags = 0;
+ out->_opCount = uint8_t(opCount);
+ out->_rmFeature = 0;
+ out->_extraReg.reset();
+ out->_readFlags = CpuRWFlags::kNone; // TODO: [ARM] Read PSTATUS.
+ out->_writeFlags = CpuRWFlags::kNone; // TODO: [ARM] Write PSTATUS
+
+ const InstDB::InstInfo& instInfo = InstDB::_instInfoTable[realId];
+ const InstRWInfoData& rwInfo = instRWInfoData[instInfo.rwInfoIndex()];
+
+ if (instInfo.hasFlag(InstDB::kInstFlagConsecutive) && opCount > 2) {
+ for (uint32_t i = 0; i < opCount; i++) {
+ OpRWInfo& op = out->_operands[i];
+ const Operand_& srcOp = operands[i];
+
+ if (!srcOp.isRegOrMem()) {
+ op.reset();
+ continue;
+ }
+
+ OpRWFlags rwFlags = i < opCount - 1 ? (OpRWFlags)rwInfo.rwx[0] : (OpRWFlags)rwInfo.rwx[1];
+
+ op._opFlags = rwFlags & ~(OpRWFlags::kZExt);
+ op._physId = BaseReg::kIdBad;
+ op._rmSize = 0;
+ op._resetReserved();
+
+ uint64_t rByteMask = op.isRead() ? 0xFFFFFFFFFFFFFFFFu : 0x0000000000000000u;
+ uint64_t wByteMask = op.isWrite() ? 0xFFFFFFFFFFFFFFFFu : 0x0000000000000000u;
+
+ op._readByteMask = rByteMask;
+ op._writeByteMask = wByteMask;
+ op._extendByteMask = 0;
+ op._consecutiveLeadCount = 0;
+
+ if (srcOp.isReg()) {
+ if (i == 0)
+ op._consecutiveLeadCount = uint8_t(opCount - 1);
+ else
+ op.addOpFlags(OpRWFlags::kConsecutive);
+ }
+ else {
+ const Mem& memOp = srcOp.as<Mem>();
+
+ if (memOp.hasBase()) {
+ op.addOpFlags(OpRWFlags::kMemBaseRead);
+ }
+
+ if (memOp.hasIndex()) {
+ op.addOpFlags(OpRWFlags::kMemIndexRead);
+ op.addOpFlags(memOp.isPreOrPost() ? OpRWFlags::kMemIndexWrite : OpRWFlags::kNone);
+ }
+ }
+ }
+ }
+ else {
+ for (uint32_t i = 0; i < opCount; i++) {
+ OpRWInfo& op = out->_operands[i];
+ const Operand_& srcOp = operands[i];
+
+ if (!srcOp.isRegOrMem()) {
+ op.reset();
+ continue;
+ }
+
+ OpRWFlags rwFlags = (OpRWFlags)rwInfo.rwx[i];
+
+ op._opFlags = rwFlags & ~(OpRWFlags::kZExt);
+ op._physId = BaseReg::kIdBad;
+ op._rmSize = 0;
+ op._resetReserved();
+
+ uint64_t rByteMask = op.isRead() ? 0xFFFFFFFFFFFFFFFFu : 0x0000000000000000u;
+ uint64_t wByteMask = op.isWrite() ? 0xFFFFFFFFFFFFFFFFu : 0x0000000000000000u;
+
+ op._readByteMask = rByteMask;
+ op._writeByteMask = wByteMask;
+ op._extendByteMask = 0;
+ op._consecutiveLeadCount = 0;
+
+ if (srcOp.isReg()) {
+ if (srcOp.as<Vec>().hasElementIndex()) {
+ // Only part of the vector is accessed if element index [] is used.
+ uint32_t elementType = srcOp.as<Vec>().elementType();
+ uint32_t elementIndex = srcOp.as<Vec>().elementIndex();
+
+ uint32_t elementSize = elementTypeSize[elementType];
+ uint64_t accessMask = uint64_t(Support::lsbMask<uint32_t>(elementSize)) << (elementIndex * elementSize);
+
+ op._readByteMask &= accessMask;
+ op._writeByteMask &= accessMask;
+ }
+
+ // TODO: [ARM] RW info is not finished.
+ }
+ else {
+ const Mem& memOp = srcOp.as<Mem>();
+
+ if (memOp.hasBase()) {
+ op.addOpFlags(OpRWFlags::kMemBaseRead);
+ }
+
+ if (memOp.hasIndex()) {
+ op.addOpFlags(OpRWFlags::kMemIndexRead);
+ op.addOpFlags(memOp.isPreOrPost() ? OpRWFlags::kMemIndexWrite : OpRWFlags::kNone);
+ }
+ }
+ }
+ }
+
+ return kErrorOk;
+}
+#endif // !ASMJIT_NO_INTROSPECTION
+
+// a64::InstInternal - QueryFeatures
+// =================================
+
+#ifndef ASMJIT_NO_INTROSPECTION
+Error InstInternal::queryFeatures(Arch arch, const BaseInst& inst, const Operand_* operands, size_t opCount, CpuFeatures* out) noexcept {
+ // TODO: [ARM] QueryFeatures not implemented yet.
+ DebugUtils::unused(arch, inst, operands, opCount, out);
+ return kErrorOk;
+}
+#endif // !ASMJIT_NO_INTROSPECTION
+
+// a64::InstInternal - Unit
+// ========================
+
+#if defined(ASMJIT_TEST)
+UNIT(arm_inst_api_text) {
+ // TODO:
+}
+#endif
+
+ASMJIT_END_SUB_NAMESPACE
+
+#endif // !ASMJIT_NO_AARCH64
diff --git a/3rdparty/asmjit/src/asmjit/arm/a64instapi_p.h b/3rdparty/asmjit/src/asmjit/arm/a64instapi_p.h
new file mode 100644
index 00000000000..320a3e881d9
--- /dev/null
+++ b/3rdparty/asmjit/src/asmjit/arm/a64instapi_p.h
@@ -0,0 +1,41 @@
+// This file is part of AsmJit project <https://asmjit.com>
+//
+// See asmjit.h or LICENSE.md for license and copyright information
+// SPDX-License-Identifier: Zlib
+
+#ifndef ASMJIT_ARM_A64INSTAPI_P_H_INCLUDED
+#define ASMJIT_ARM_A64INSTAPI_P_H_INCLUDED
+
+#include "../core/inst.h"
+#include "../core/operand.h"
+
+ASMJIT_BEGIN_SUB_NAMESPACE(a64)
+
+//! \cond INTERNAL
+//! \addtogroup asmjit_a64
+//! \{
+
+namespace InstInternal {
+
+#ifndef ASMJIT_NO_TEXT
+Error ASMJIT_CDECL instIdToString(Arch arch, InstId instId, String& output) noexcept;
+InstId ASMJIT_CDECL stringToInstId(Arch arch, const char* s, size_t len) noexcept;
+#endif // !ASMJIT_NO_TEXT
+
+#ifndef ASMJIT_NO_VALIDATION
+Error ASMJIT_CDECL validate(Arch arch, const BaseInst& inst, const Operand_* operands, size_t opCount, ValidationFlags validationFlags) noexcept;
+#endif // !ASMJIT_NO_VALIDATION
+
+#ifndef ASMJIT_NO_INTROSPECTION
+Error ASMJIT_CDECL queryRWInfo(Arch arch, const BaseInst& inst, const Operand_* operands, size_t opCount, InstRWInfo* out) noexcept;
+Error ASMJIT_CDECL queryFeatures(Arch arch, const BaseInst& inst, const Operand_* operands, size_t opCount, CpuFeatures* out) noexcept;
+#endif // !ASMJIT_NO_INTROSPECTION
+
+} // {InstInternal}
+
+//! \}
+//! \endcond
+
+ASMJIT_END_SUB_NAMESPACE
+
+#endif // ASMJIT_ARM_A64INSTAPI_P_H_INCLUDED
diff --git a/3rdparty/asmjit/src/asmjit/arm/a64instdb.cpp b/3rdparty/asmjit/src/asmjit/arm/a64instdb.cpp
new file mode 100644
index 00000000000..64709b5db03
--- /dev/null
+++ b/3rdparty/asmjit/src/asmjit/arm/a64instdb.cpp
@@ -0,0 +1,1957 @@
+// This file is part of AsmJit project <https://asmjit.com>
+//
+// See asmjit.h or LICENSE.md for license and copyright information
+// SPDX-License-Identifier: Zlib
+
+#include "../core/api-build_p.h"
+#if !defined(ASMJIT_NO_AARCH64)
+
+#include "../core/codeholder.h"
+#include "../core/support.h"
+#include "../arm/a64instdb_p.h"
+#include "../arm/a64operand.h"
+
+ASMJIT_BEGIN_SUB_NAMESPACE(a64)
+
+namespace InstDB {
+
+// a64::InstDB - InstInfoTable
+// ===========================
+
+// Don't store `_nameDataIndex` if instruction names are disabled. Since some
+// APIs can use `_nameDataIndex` it's much safer if it's zero if it's not used.
+#if defined(ASMJIT_NO_TEXT)
+ #define NAME_DATA_INDEX(x) 0
+#else
+ #define NAME_DATA_INDEX(x) x
+#endif
+
+// Defines an ARM/AArch64 instruction.
+#define INST(id, opcodeEncoding, opcodeData, rwInfoIndex, flags, opcodeDataIndex, nameDataIndex) { \
+ uint32_t(kEncoding##opcodeEncoding), \
+ uint32_t(opcodeDataIndex), \
+ 0, \
+ uint32_t(NAME_DATA_INDEX(nameDataIndex)), \
+ uint16_t(rwInfoIndex), \
+ uint16_t(flags) \
+}
+
+#define F(flag) kInstFlag##flag
+
+// TODO: [ARM] Missing Instructions:
+/*
+BLRAA, BLRAAZ, BLRAB, BLRABZ: Branch with Link to Register, with pointer authentication.
+BRAA, BRAAZ, BRAB, BRABZ: Branch to Register, with pointer authentication.
+
+CFP: Control Flow Prediction Restriction by Context: an alias of SYS.
+CPP: Cache Prefetch Prediction Restriction by Context: an alias of SYS.
+DVP: Data Value Prediction Restriction by Context: an alias of SYS.
+PSB CSYNC: Profiling Synchronization Barrier.
+
+ERETAA, ERETAB: Exception Return, with pointer authentication.
+LDAPxxx
+PACIA, PACIA1716, PACIASP, PACIAZ, PACIZA: Pointer Authentication Code for Instruction address, using key A.
+PACIB, PACIB1716, PACIBSP, PACIBZ, PACIZB: Pointer Authentication Code for Instruction address, using key B.
+PRFM (immediate): Prefetch Memory (immediate).
+PRFM (literal): Prefetch Memory (literal).
+PRFM (register): Prefetch Memory (register).
+PRFUM: Prefetch Memory (unscaled offset).
+RETAA, RETAB: Return from subroutine, with pointer authentication.
+RMIF: Rotate, Mask Insert Flags.
+SYSL
+IRG: Insert Random Tag.
+INST_(Irg , BaseRRR , (0b1001101011000000000100, kX , kSP, kX , kSP, kX , kZR, true) , kRWI_W , 0 , 0 , 1 ), // #1
+*/
+const InstInfo _instInfoTable[] = {
+ // +------------------+---------------------+--------------------------------------------------------------------------------------+-----------+---------------------------+----+-----+
+ // | Instruction Id | Encoding | Opcode Data | RW Info | Instruction Flags |DatX|NameX|
+ // +------------------+---------------------+--------------------------------------------------------------------------------------+-----------+---------------------------+----+-----+
+ // ${InstInfo:Begin}
+ INST(None , None , (_) , 0 , 0 , 0 , 0 ), // #0
+ INST(Adc , BaseRRR , (0b0001101000000000000000, kWX, kZR, kWX, kZR, kWX, kZR, true) , kRWI_W , 0 , 0 , 1 ), // #1
+ INST(Adcs , BaseRRR , (0b0011101000000000000000, kWX, kZR, kWX, kZR, kWX, kZR, true) , kRWI_W , 0 , 1 , 5 ), // #2
+ INST(Add , BaseAddSub , (0b0001011000, 0b0001011001, 0b0010001) , kRWI_W , 0 , 0 , 978 ), // #3
+ INST(Addg , BaseRRII , (0b1001000110000000000000, kX, kSP, kX, kSP, 6, 4, 16, 4, 0, 10) , kRWI_W , 0 , 0 , 10 ), // #4
+ INST(Adds , BaseAddSub , (0b0101011000, 0b0101011001, 0b0110001) , kRWI_W , 0 , 1 , 15 ), // #5
+ INST(Adr , BaseAdr , (0b0001000000000000000000, OffsetType::kAArch64_ADR) , kRWI_W , 0 , 0 , 25 ), // #6
+ INST(Adrp , BaseAdr , (0b1001000000000000000000, OffsetType::kAArch64_ADRP) , kRWI_W , 0 , 1 , 29 ), // #7
+ INST(And , BaseLogical , (0b0001010000, 0b00100100, 0) , kRWI_W , 0 , 0 , 57 ), // #8
+ INST(Ands , BaseLogical , (0b1101010000, 0b11100100, 0) , kRWI_W , 0 , 1 , 61 ), // #9
+ INST(Asr , BaseShift , (0b0001101011000000001010, 0b0001001100000000011111, 0) , kRWI_W , 0 , 0 , 66 ), // #10
+ INST(Asrv , BaseShift , (0b0001101011000000001010, 0b0000000000000000000000, 0) , kRWI_W , 0 , 1 , 70 ), // #11
+ INST(At , BaseAtDcIcTlbi , (0b00011111110000, 0b00001111000000, true) , kRWI_RX , 0 , 0 , 75 ), // #12
+ INST(Autda , BaseRR , (0b11011010110000010001100000000000, kX, kZR, 0, kX, kSP, 5, true) , kRWI_X , 0 , 0 , 78 ), // #13
+ INST(Autdza , BaseR , (0b11011010110000010011101111100000, kX, kZR, 0) , kRWI_X , 0 , 0 , 90 ), // #14
+ INST(Autdb , BaseRR , (0b11011010110000010001110000000000, kX, kZR, 0, kX, kSP, 5, true) , kRWI_X , 0 , 1 , 84 ), // #15
+ INST(Autdzb , BaseR , (0b11011010110000010011111111100000, kX, kZR, 0) , kRWI_X , 0 , 1 , 97 ), // #16
+ INST(Autia , BaseRR , (0b11011010110000010001000000000000, kX, kZR, 0, kX, kSP, 5, true) , kRWI_X , 0 , 2 , 104 ), // #17
+ INST(Autia1716 , BaseOp , (0b11010101000000110010000110011111) , 0 , 0 , 0 , 110 ), // #18
+ INST(Autiasp , BaseOp , (0b11010101000000110010001110111111) , 0 , 0 , 1 , 120 ), // #19
+ INST(Autiaz , BaseOp , (0b11010101000000110010001110011111) , 0 , 0 , 2 , 128 ), // #20
+ INST(Autib , BaseRR , (0b11011010110000010001010000000000, kX, kZR, 0, kX, kSP, 5, true) , kRWI_X , 0 , 3 , 135 ), // #21
+ INST(Autib1716 , BaseOp , (0b11010101000000110010000111011111) , 0 , 0 , 3 , 141 ), // #22
+ INST(Autibsp , BaseOp , (0b11010101000000110010001111111111) , 0 , 0 , 4 , 151 ), // #23
+ INST(Autibz , BaseOp , (0b11010101000000110010001111011111) , 0 , 0 , 5 , 159 ), // #24
+ INST(Autiza , BaseR , (0b11011010110000010011001111100000, kX, kZR, 0) , kRWI_X , 0 , 2 , 166 ), // #25
+ INST(Autizb , BaseR , (0b11011010110000010011011111100000, kX, kZR, 0) , kRWI_X , 0 , 3 , 173 ), // #26
+ INST(Axflag , BaseOp , (0b11010101000000000100000001011111) , 0 , 0 , 6 , 180 ), // #27
+ INST(B , BaseBranchRel , (0b00010100000000000000000000000000) , 0 , F(Cond) , 0 , 1738), // #28
+ INST(Bfc , BaseBfc , (0b00110011000000000000001111100000) , kRWI_X , 0 , 0 , 192 ), // #29
+ INST(Bfi , BaseBfi , (0b00110011000000000000000000000000) , kRWI_X , 0 , 0 , 223 ), // #30
+ INST(Bfm , BaseBfm , (0b00110011000000000000000000000000) , kRWI_X , 0 , 0 , 2514), // #31
+ INST(Bfxil , BaseBfx , (0b00110011000000000000000000000000) , kRWI_X , 0 , 0 , 250 ), // #32
+ INST(Bic , BaseLogical , (0b0001010001, 0b00100100, 1) , kRWI_W , 0 , 2 , 256 ), // #33
+ INST(Bics , BaseLogical , (0b1101010001, 0b11100100, 1) , kRWI_W , 0 , 3 , 260 ), // #34
+ INST(Bl , BaseBranchRel , (0b10010100000000000000000000000000) , 0 , 0 , 1 , 2831), // #35
+ INST(Blr , BaseBranchReg , (0b11010110001111110000000000000000) , kRWI_R , 0 , 0 , 269 ), // #36
+ INST(Br , BaseBranchReg , (0b11010110000111110000000000000000) , kRWI_R , 0 , 1 , 273 ), // #37
+ INST(Brk , BaseOpImm , (0b11010100001000000000000000000000, 16, 5) , 0 , 0 , 0 , 276 ), // #38
+ INST(Cas , BaseAtomicOp , (0b1000100010100000011111, kWX, 30, 0) , kRWI_XRX , 0 , 0 , 284 ), // #39
+ INST(Casa , BaseAtomicOp , (0b1000100011100000011111, kWX, 30, 1) , kRWI_XRX , 0 , 1 , 288 ), // #40
+ INST(Casab , BaseAtomicOp , (0b0000100011100000011111, kW , 0 , 1) , kRWI_XRX , 0 , 2 , 293 ), // #41
+ INST(Casah , BaseAtomicOp , (0b0100100011100000011111, kW , 0 , 1) , kRWI_XRX , 0 , 3 , 299 ), // #42
+ INST(Casal , BaseAtomicOp , (0b1000100011100000111111, kWX, 30, 1) , kRWI_XRX , 0 , 4 , 305 ), // #43
+ INST(Casalb , BaseAtomicOp , (0b0000100011100000111111, kW , 0 , 1) , kRWI_XRX , 0 , 5 , 311 ), // #44
+ INST(Casalh , BaseAtomicOp , (0b0100100011100000111111, kW , 0 , 1) , kRWI_XRX , 0 , 6 , 318 ), // #45
+ INST(Casb , BaseAtomicOp , (0b0000100010100000011111, kW , 0 , 0) , kRWI_XRX , 0 , 7 , 325 ), // #46
+ INST(Cash , BaseAtomicOp , (0b0100100010100000011111, kW , 0 , 0) , kRWI_XRX , 0 , 8 , 330 ), // #47
+ INST(Casl , BaseAtomicOp , (0b1000100010100000111111, kWX, 30, 0) , kRWI_XRX , 0 , 9 , 335 ), // #48
+ INST(Caslb , BaseAtomicOp , (0b0000100010100000111111, kW , 0 , 0) , kRWI_XRX , 0 , 10 , 340 ), // #49
+ INST(Caslh , BaseAtomicOp , (0b0100100010100000111111, kW , 0 , 0) , kRWI_XRX , 0 , 11 , 346 ), // #50
+ INST(Casp , BaseAtomicCasp , (0b0000100000100000011111, kWX, 30) , kRWI_XXRRX, 0 , 0 , 352 ), // #51
+ INST(Caspa , BaseAtomicCasp , (0b0000100001100000011111, kWX, 30) , kRWI_XXRRX, 0 , 1 , 357 ), // #52
+ INST(Caspal , BaseAtomicCasp , (0b0000100001100000111111, kWX, 30) , kRWI_XXRRX, 0 , 2 , 363 ), // #53
+ INST(Caspl , BaseAtomicCasp , (0b0000100000100000111111, kWX, 30) , kRWI_XXRRX, 0 , 3 , 370 ), // #54
+ INST(Cbnz , BaseBranchCmp , (0b00110101000000000000000000000000) , kRWI_R , 0 , 0 , 376 ), // #55
+ INST(Cbz , BaseBranchCmp , (0b00110100000000000000000000000000) , kRWI_R , 0 , 1 , 381 ), // #56
+ INST(Ccmn , BaseCCmp , (0b00111010010000000000000000000000) , kRWI_R , 0 , 0 , 385 ), // #57
+ INST(Ccmp , BaseCCmp , (0b01111010010000000000000000000000) , kRWI_R , 0 , 1 , 650 ), // #58
+ INST(Cfinv , BaseOp , (0b11010101000000000100000000011111) , 0 , 0 , 7 , 390 ), // #59
+ INST(Cinc , BaseCInc , (0b00011010100000000000010000000000) , kRWI_W , 0 , 0 , 396 ), // #60
+ INST(Cinv , BaseCInc , (0b01011010100000000000000000000000) , kRWI_W , 0 , 1 , 401 ), // #61
+ INST(Clrex , BaseOpImm , (0b11010101000000110011000001011111, 4, 8) , 0 , 0 , 1 , 406 ), // #62
+ INST(Cls , BaseRR , (0b01011010110000000001010000000000, kWX, kZR, 0, kWX, kZR, 5, true) , kRWI_W , 0 , 4 , 412 ), // #63
+ INST(Clz , BaseRR , (0b01011010110000000001000000000000, kWX, kZR, 0, kWX, kZR, 5, true) , kRWI_W , 0 , 5 , 416 ), // #64
+ INST(Cmn , BaseCmpCmn , (0b0101011000, 0b0101011001, 0b0110001) , kRWI_R , 0 , 0 , 386 ), // #65
+ INST(Cmp , BaseCmpCmn , (0b1101011000, 0b1101011001, 0b1110001) , kRWI_R , 0 , 1 , 651 ), // #66
+ INST(Cmpp , BaseRR , (0b10111010110000000000000000011111, kX, kSP, 5, kX, kSP, 16, true) , kRWI_R , 0 , 6 , 430 ), // #67
+ INST(Cneg , BaseCInc , (0b01011010100000000000010000000000) , kRWI_W , 0 , 2 , 441 ), // #68
+ INST(Crc32b , BaseRRR , (0b0001101011000000010000, kW, kZR, kW, kZR, kW, kZR, false) , kRWI_W , 0 , 2 , 450 ), // #69
+ INST(Crc32cb , BaseRRR , (0b0001101011000000010100, kW, kZR, kW, kZR, kW, kZR, false) , kRWI_W , 0 , 3 , 457 ), // #70
+ INST(Crc32ch , BaseRRR , (0b0001101011000000010101, kW, kZR, kW, kZR, kW, kZR, false) , kRWI_W , 0 , 4 , 465 ), // #71
+ INST(Crc32cw , BaseRRR , (0b0001101011000000010110, kW, kZR, kW, kZR, kW, kZR, false) , kRWI_W , 0 , 5 , 473 ), // #72
+ INST(Crc32cx , BaseRRR , (0b1001101011000000010111, kW, kZR, kW, kZR, kX, kZR, false) , kRWI_W , 0 , 6 , 481 ), // #73
+ INST(Crc32h , BaseRRR , (0b0001101011000000010001, kW, kZR, kW, kZR, kW, kZR, false) , kRWI_W , 0 , 7 , 489 ), // #74
+ INST(Crc32w , BaseRRR , (0b0001101011000000010010, kW, kZR, kW, kZR, kW, kZR, false) , kRWI_W , 0 , 8 , 496 ), // #75
+ INST(Crc32x , BaseRRR , (0b1001101011000000010011, kW, kZR, kW, kZR, kX, kZR, false) , kRWI_W , 0 , 9 , 503 ), // #76
+ INST(Csdb , BaseOp , (0b11010101000000110010001010011111) , 0 , 0 , 8 , 510 ), // #77
+ INST(Csel , BaseCSel , (0b00011010100000000000000000000000) , kRWI_W , 0 , 0 , 710 ), // #78
+ INST(Cset , BaseCSet , (0b00011010100111110000011111100000) , kRWI_W , 0 , 0 , 515 ), // #79
+ INST(Csetm , BaseCSet , (0b01011010100111110000001111100000) , kRWI_W , 0 , 1 , 520 ), // #80
+ INST(Csinc , BaseCSel , (0b00011010100000000000010000000000) , kRWI_W , 0 , 1 , 526 ), // #81
+ INST(Csinv , BaseCSel , (0b01011010100000000000000000000000) , kRWI_W , 0 , 2 , 532 ), // #82
+ INST(Csneg , BaseCSel , (0b01011010100000000000010000000000) , kRWI_W , 0 , 3 , 538 ), // #83
+ INST(Dc , BaseAtDcIcTlbi , (0b00011110000000, 0b00001110000000, true) , kRWI_RX , 0 , 1 , 2 ), // #84
+ INST(Dcps1 , BaseOpImm , (0b11010100101000000000000000000001, 16, 5) , 0 , 0 , 2 , 544 ), // #85
+ INST(Dcps2 , BaseOpImm , (0b11010100101000000000000000000010, 16, 5) , 0 , 0 , 3 , 550 ), // #86
+ INST(Dcps3 , BaseOpImm , (0b11010100101000000000000000000011, 16, 5) , 0 , 0 , 4 , 556 ), // #87
+ INST(Dgh , BaseOp , (0b11010101000000110010000011011111) , 0 , 0 , 9 , 562 ), // #88
+ INST(Dmb , BaseOpImm , (0b11010101000000110011000010111111, 4, 8) , 0 , 0 , 5 , 566 ), // #89
+ INST(Drps , BaseOp , (0b11010110101111110000001111100000) , 0 , 0 , 10 , 570 ), // #90
+ INST(Dsb , BaseOpImm , (0b11010101000000110011000010011111, 4, 8) , 0 , 0 , 6 , 575 ), // #91
+ INST(Eon , BaseLogical , (0b1001010001, 0b10100100, 1) , kRWI_W , 0 , 4 , 583 ), // #92
+ INST(Eor , BaseLogical , (0b1001010000, 0b10100100, 0) , kRWI_W , 0 , 5 , 1418), // #93
+ INST(Esb , BaseOp , (0b11010101000000110010001000011111) , 0 , 0 , 11 , 597 ), // #94
+ INST(Extr , BaseExtract , (0b00010011100000000000000000000000) , kRWI_W , 0 , 0 , 605 ), // #95
+ INST(Eret , BaseOp , (0b11010110100111110000001111100000) , 0 , 0 , 12 , 592 ), // #96
+ INST(Gmi , BaseRRR , (0b1001101011000000000101, kX , kZR, kX , kSP, kX , kZR, true) , kRWI_W , 0 , 10 , 1128), // #97
+ INST(Hint , BaseOpImm , (0b11010101000000110010000000011111, 7, 5) , 0 , 0 , 7 , 1132), // #98
+ INST(Hlt , BaseOpImm , (0b11010100010000000000000000000000, 16, 5) , 0 , 0 , 8 , 1137), // #99
+ INST(Hvc , BaseOpImm , (0b11010100000000000000000000000010, 16, 5) , 0 , 0 , 9 , 1141), // #100
+ INST(Ic , BaseAtDcIcTlbi , (0b00011110000000, 0b00001110000000, false) , kRWI_RX , 0 , 2 , 257 ), // #101
+ INST(Isb , BaseOpImm , (0b11010101000000110011000011011111, 4, 8) , 0 , 0 , 10 , 1149), // #102
+ INST(Ldadd , BaseAtomicOp , (0b1011100000100000000000, kWX, 30, 0) , kRWI_WRX , 0 , 12 , 1189), // #103
+ INST(Ldadda , BaseAtomicOp , (0b1011100010100000000000, kWX, 30, 1) , kRWI_WRX , 0 , 13 , 1195), // #104
+ INST(Ldaddab , BaseAtomicOp , (0b0011100010100000000000, kW , 0 , 1) , kRWI_WRX , 0 , 14 , 1202), // #105
+ INST(Ldaddah , BaseAtomicOp , (0b0111100010100000000000, kW , 0 , 1) , kRWI_WRX , 0 , 15 , 1210), // #106
+ INST(Ldaddal , BaseAtomicOp , (0b1011100011100000000000, kWX, 30, 1) , kRWI_WRX , 0 , 16 , 1218), // #107
+ INST(Ldaddalb , BaseAtomicOp , (0b0011100011100000000000, kW , 0 , 1) , kRWI_WRX , 0 , 17 , 1226), // #108
+ INST(Ldaddalh , BaseAtomicOp , (0b0111100011100000000000, kW , 0 , 1) , kRWI_WRX , 0 , 18 , 1235), // #109
+ INST(Ldaddb , BaseAtomicOp , (0b0011100000100000000000, kW , 0 , 0) , kRWI_WRX , 0 , 19 , 1244), // #110
+ INST(Ldaddh , BaseAtomicOp , (0b0111100000100000000000, kW , 0 , 0) , kRWI_WRX , 0 , 20 , 1251), // #111
+ INST(Ldaddl , BaseAtomicOp , (0b1011100001100000000000, kWX, 30, 0) , kRWI_WRX , 0 , 21 , 1258), // #112
+ INST(Ldaddlb , BaseAtomicOp , (0b0011100001100000000000, kW , 0 , 0) , kRWI_WRX , 0 , 22 , 1265), // #113
+ INST(Ldaddlh , BaseAtomicOp , (0b0111100001100000000000, kW , 0 , 0) , kRWI_WRX , 0 , 23 , 1273), // #114
+ INST(Ldar , BaseRM_NoImm , (0b1000100011011111111111, kWX, kZR, 30) , kRWI_W , 0 , 0 , 1281), // #115
+ INST(Ldarb , BaseRM_NoImm , (0b0000100011011111111111, kW , kZR, 0 ) , kRWI_W , 0 , 1 , 1286), // #116
+ INST(Ldarh , BaseRM_NoImm , (0b0100100011011111111111, kW , kZR, 0 ) , kRWI_W , 0 , 2 , 1292), // #117
+ INST(Ldaxp , BaseLdxp , (0b1000100001111111100000, kWX, 30) , kRWI_WW , 0 , 0 , 1298), // #118
+ INST(Ldaxr , BaseRM_NoImm , (0b1000100001011111111111, kWX, kZR, 30) , kRWI_W , 0 , 3 , 1304), // #119
+ INST(Ldaxrb , BaseRM_NoImm , (0b0000100001011111111111, kW , kZR, 0 ) , kRWI_W , 0 , 4 , 1310), // #120
+ INST(Ldaxrh , BaseRM_NoImm , (0b0100100001011111111111, kW , kZR, 0 ) , kRWI_W , 0 , 5 , 1317), // #121
+ INST(Ldclr , BaseAtomicOp , (0b1011100000100000000100, kWX, 30, 0) , kRWI_WRX , 0 , 24 , 1324), // #122
+ INST(Ldclra , BaseAtomicOp , (0b1011100010100000000100, kWX, 30, 1) , kRWI_WRX , 0 , 25 , 1330), // #123
+ INST(Ldclrab , BaseAtomicOp , (0b0011100010100000000100, kW , 0 , 1) , kRWI_WRX , 0 , 26 , 1337), // #124
+ INST(Ldclrah , BaseAtomicOp , (0b0111100010100000000100, kW , 0 , 1) , kRWI_WRX , 0 , 27 , 1345), // #125
+ INST(Ldclral , BaseAtomicOp , (0b1011100011100000000100, kWX, 30, 1) , kRWI_WRX , 0 , 28 , 1353), // #126
+ INST(Ldclralb , BaseAtomicOp , (0b0011100011100000000100, kW , 0 , 1) , kRWI_WRX , 0 , 29 , 1361), // #127
+ INST(Ldclralh , BaseAtomicOp , (0b0111100011100000000100, kW , 0 , 1) , kRWI_WRX , 0 , 30 , 1370), // #128
+ INST(Ldclrb , BaseAtomicOp , (0b0011100000100000000100, kW , 0 , 0) , kRWI_WRX , 0 , 31 , 1379), // #129
+ INST(Ldclrh , BaseAtomicOp , (0b0111100000100000000100, kW , 0 , 0) , kRWI_WRX , 0 , 32 , 1386), // #130
+ INST(Ldclrl , BaseAtomicOp , (0b1011100001100000000100, kWX, 30, 0) , kRWI_WRX , 0 , 33 , 1393), // #131
+ INST(Ldclrlb , BaseAtomicOp , (0b0011100001100000000100, kW , 0 , 0) , kRWI_WRX , 0 , 34 , 1400), // #132
+ INST(Ldclrlh , BaseAtomicOp , (0b0111100001100000000100, kW , 0 , 0) , kRWI_WRX , 0 , 35 , 1408), // #133
+ INST(Ldeor , BaseAtomicOp , (0b1011100000100000001000, kWX, 30, 0) , kRWI_WRX , 0 , 36 , 1416), // #134
+ INST(Ldeora , BaseAtomicOp , (0b1011100010100000001000, kWX, 30, 1) , kRWI_WRX , 0 , 37 , 1422), // #135
+ INST(Ldeorab , BaseAtomicOp , (0b0011100010100000001000, kW , 0 , 1) , kRWI_WRX , 0 , 38 , 1429), // #136
+ INST(Ldeorah , BaseAtomicOp , (0b0111100010100000001000, kW , 0 , 1) , kRWI_WRX , 0 , 39 , 1437), // #137
+ INST(Ldeoral , BaseAtomicOp , (0b1011100011100000001000, kWX, 30, 1) , kRWI_WRX , 0 , 40 , 1445), // #138
+ INST(Ldeoralb , BaseAtomicOp , (0b0011100011100000001000, kW , 0 , 1) , kRWI_WRX , 0 , 41 , 1453), // #139
+ INST(Ldeoralh , BaseAtomicOp , (0b0111100011100000001000, kW , 0 , 1) , kRWI_WRX , 0 , 42 , 1462), // #140
+ INST(Ldeorb , BaseAtomicOp , (0b0011100000100000001000, kW , 0 , 0) , kRWI_WRX , 0 , 43 , 1471), // #141
+ INST(Ldeorh , BaseAtomicOp , (0b0111100000100000001000, kW , 0 , 0) , kRWI_WRX , 0 , 44 , 1478), // #142
+ INST(Ldeorl , BaseAtomicOp , (0b1011100001100000001000, kWX, 30, 0) , kRWI_WRX , 0 , 45 , 1485), // #143
+ INST(Ldeorlb , BaseAtomicOp , (0b0011100001100000001000, kW , 0 , 0) , kRWI_WRX , 0 , 46 , 1492), // #144
+ INST(Ldeorlh , BaseAtomicOp , (0b0111100001100000001000, kW , 0 , 0) , kRWI_WRX , 0 , 47 , 1500), // #145
+ INST(Ldg , BaseRM_SImm9 , (0b1101100101100000000000, 0b0000000000000000000000, kX , kZR, 0, 4) , kRWI_W , 0 , 0 , 1508), // #146
+ INST(Ldgm , BaseRM_NoImm , (0b1101100111100000000000, kX , kZR, 0 ) , kRWI_W , 0 , 6 , 1512), // #147
+ INST(Ldlar , BaseRM_NoImm , (0b1000100011011111011111, kWX, kZR, 30) , kRWI_W , 0 , 7 , 1517), // #148
+ INST(Ldlarb , BaseRM_NoImm , (0b0000100011011111011111, kW , kZR, 0 ) , kRWI_W , 0 , 8 , 1523), // #149
+ INST(Ldlarh , BaseRM_NoImm , (0b0100100011011111011111, kW , kZR, 0 ) , kRWI_W , 0 , 9 , 1530), // #150
+ INST(Ldnp , BaseLdpStp , (0b0010100001, 0 , kWX, 31, 2) , kRWI_WW , 0 , 0 , 1537), // #151
+ INST(Ldp , BaseLdpStp , (0b0010100101, 0b0010100011, kWX, 31, 2) , kRWI_W , 0 , 1 , 1542), // #152
+ INST(Ldpsw , BaseLdpStp , (0b0110100101, 0b0110100011, kX , 0 , 2) , kRWI_WW , 0 , 2 , 1546), // #153
+ INST(Ldr , BaseLdSt , (0b1011100101, 0b10111000010, 0b10111000011, 0b00011000, kWX, 30, 2, Inst::kIdLdur) , kRWI_W , 0 , 0 , 1552), // #154
+ INST(Ldraa , BaseRM_SImm10 , (0b1111100000100000000001, kX , kZR, 0, 3) , kRWI_W , 0 , 0 , 1556), // #155
+ INST(Ldrab , BaseRM_SImm10 , (0b1111100010100000000001, kX , kZR, 0, 3) , kRWI_W , 0 , 1 , 1562), // #156
+ INST(Ldrb , BaseLdSt , (0b0011100101, 0b00111000010, 0b00111000011, 0 , kW , 0 , 0, Inst::kIdLdurb) , kRWI_W , 0 , 1 , 1568), // #157
+ INST(Ldrh , BaseLdSt , (0b0111100101, 0b01111000010, 0b01111000011, 0 , kW , 0 , 1, Inst::kIdLdurh) , kRWI_W , 0 , 2 , 1573), // #158
+ INST(Ldrsb , BaseLdSt , (0b0011100111, 0b00111000100, 0b00111000101, 0 , kWX, 22, 0, Inst::kIdLdursb) , kRWI_W , 0 , 3 , 1578), // #159
+ INST(Ldrsh , BaseLdSt , (0b0111100110, 0b01111000100, 0b01111000101, 0 , kWX, 22, 1, Inst::kIdLdursh) , kRWI_W , 0 , 4 , 1584), // #160
+ INST(Ldrsw , BaseLdSt , (0b1011100110, 0b10111000100, 0b10111000101, 0b10011000, kX , 0 , 2, Inst::kIdLdursw) , kRWI_W , 0 , 5 , 1590), // #161
+ INST(Ldset , BaseAtomicOp , (0b1011100000100000001100, kWX, 30, 0) , kRWI_WRX , 0 , 48 , 1596), // #162
+ INST(Ldseta , BaseAtomicOp , (0b1011100010100000001100, kWX, 30, 1) , kRWI_WRX , 0 , 49 , 1602), // #163
+ INST(Ldsetab , BaseAtomicOp , (0b0011100010100000001100, kW , 0 , 1) , kRWI_WRX , 0 , 50 , 1609), // #164
+ INST(Ldsetah , BaseAtomicOp , (0b0111100010100000001100, kW , 0 , 1) , kRWI_WRX , 0 , 51 , 1617), // #165
+ INST(Ldsetal , BaseAtomicOp , (0b1011100011100000001100, kWX, 30, 1) , kRWI_WRX , 0 , 52 , 1625), // #166
+ INST(Ldsetalb , BaseAtomicOp , (0b0011100011100000001100, kW , 0 , 1) , kRWI_WRX , 0 , 53 , 1633), // #167
+ INST(Ldsetalh , BaseAtomicOp , (0b0111100011100000001100, kW , 0 , 1) , kRWI_WRX , 0 , 54 , 1642), // #168
+ INST(Ldsetb , BaseAtomicOp , (0b0011100000100000001100, kW , 0 , 0) , kRWI_WRX , 0 , 55 , 1651), // #169
+ INST(Ldseth , BaseAtomicOp , (0b0111100000100000001100, kW , 0 , 0) , kRWI_WRX , 0 , 56 , 1658), // #170
+ INST(Ldsetl , BaseAtomicOp , (0b1011100001100000001100, kWX, 30, 0) , kRWI_WRX , 0 , 57 , 1665), // #171
+ INST(Ldsetlb , BaseAtomicOp , (0b0011100001100000001100, kW , 0 , 0) , kRWI_WRX , 0 , 58 , 1672), // #172
+ INST(Ldsetlh , BaseAtomicOp , (0b0111100001100000001100, kW , 0 , 0) , kRWI_WRX , 0 , 59 , 1680), // #173
+ INST(Ldsmax , BaseAtomicOp , (0b1011100000100000010000, kWX, 30, 0) , kRWI_WRX , 0 , 60 , 1688), // #174
+ INST(Ldsmaxa , BaseAtomicOp , (0b1011100010100000010000, kWX, 30, 1) , kRWI_WRX , 0 , 61 , 1695), // #175
+ INST(Ldsmaxab , BaseAtomicOp , (0b0011100010100000010000, kW , 0 , 1) , kRWI_WRX , 0 , 62 , 1703), // #176
+ INST(Ldsmaxah , BaseAtomicOp , (0b0111100010100000010000, kW , 0 , 1) , kRWI_WRX , 0 , 63 , 1712), // #177
+ INST(Ldsmaxal , BaseAtomicOp , (0b1011100011100000010000, kWX, 30, 1) , kRWI_WRX , 0 , 64 , 1721), // #178
+ INST(Ldsmaxalb , BaseAtomicOp , (0b0011100011100000010000, kW , 0 , 1) , kRWI_WRX , 0 , 65 , 1730), // #179
+ INST(Ldsmaxalh , BaseAtomicOp , (0b0111100011100000010000, kW , 0 , 1) , kRWI_WRX , 0 , 66 , 1740), // #180
+ INST(Ldsmaxb , BaseAtomicOp , (0b0011100000100000010000, kW , 0 , 0) , kRWI_WRX , 0 , 67 , 1750), // #181
+ INST(Ldsmaxh , BaseAtomicOp , (0b0111100000100000010000, kW , 0 , 0) , kRWI_WRX , 0 , 68 , 1758), // #182
+ INST(Ldsmaxl , BaseAtomicOp , (0b1011100001100000010000, kWX, 30, 0) , kRWI_WRX , 0 , 69 , 1766), // #183
+ INST(Ldsmaxlb , BaseAtomicOp , (0b0011100001100000010000, kW , 0 , 0) , kRWI_WRX , 0 , 70 , 1774), // #184
+ INST(Ldsmaxlh , BaseAtomicOp , (0b0111100001100000010000, kW , 0 , 0) , kRWI_WRX , 0 , 71 , 1783), // #185
+ INST(Ldsmin , BaseAtomicOp , (0b1011100000100000010100, kWX, 30, 0) , kRWI_WRX , 0 , 72 , 1792), // #186
+ INST(Ldsmina , BaseAtomicOp , (0b1011100010100000010100, kWX, 30, 1) , kRWI_WRX , 0 , 73 , 1799), // #187
+ INST(Ldsminab , BaseAtomicOp , (0b0011100010100000010100, kW , 0 , 1) , kRWI_WRX , 0 , 74 , 1807), // #188
+ INST(Ldsminah , BaseAtomicOp , (0b0111100010100000010100, kW , 0 , 1) , kRWI_WRX , 0 , 75 , 1816), // #189
+ INST(Ldsminal , BaseAtomicOp , (0b1011100011100000010100, kWX, 30, 1) , kRWI_WRX , 0 , 76 , 1825), // #190
+ INST(Ldsminalb , BaseAtomicOp , (0b0011100011100000010100, kW , 0 , 1) , kRWI_WRX , 0 , 77 , 1834), // #191
+ INST(Ldsminalh , BaseAtomicOp , (0b0111100011100000010100, kW , 0 , 1) , kRWI_WRX , 0 , 78 , 1844), // #192
+ INST(Ldsminb , BaseAtomicOp , (0b0011100000100000010100, kW , 0 , 0) , kRWI_WRX , 0 , 79 , 1854), // #193
+ INST(Ldsminh , BaseAtomicOp , (0b0111100000100000010100, kW , 0 , 0) , kRWI_WRX , 0 , 80 , 1862), // #194
+ INST(Ldsminl , BaseAtomicOp , (0b1011100001100000010100, kWX, 30, 0) , kRWI_WRX , 0 , 81 , 1870), // #195
+ INST(Ldsminlb , BaseAtomicOp , (0b0011100001100000010100, kW , 0 , 0) , kRWI_WRX , 0 , 82 , 1878), // #196
+ INST(Ldsminlh , BaseAtomicOp , (0b0111100001100000010100, kW , 0 , 0) , kRWI_WRX , 0 , 83 , 1887), // #197
+ INST(Ldtr , BaseRM_SImm9 , (0b1011100001000000000010, 0b0000000000000000000000, kWX, kZR, 30, 0) , kRWI_W , 0 , 1 , 1896), // #198
+ INST(Ldtrb , BaseRM_SImm9 , (0b0011100001000000000010, 0b0000000000000000000000, kW , kZR, 0 , 0) , kRWI_W , 0 , 2 , 1901), // #199
+ INST(Ldtrh , BaseRM_SImm9 , (0b0111100001000000000010, 0b0000000000000000000000, kW , kZR, 0 , 0) , kRWI_W , 0 , 3 , 1907), // #200
+ INST(Ldtrsb , BaseRM_SImm9 , (0b0011100011000000000010, 0b0000000000000000000000, kWX, kZR, 22, 0) , kRWI_W , 0 , 4 , 1913), // #201
+ INST(Ldtrsh , BaseRM_SImm9 , (0b0111100011000000000010, 0b0000000000000000000000, kWX, kZR, 22, 0) , kRWI_W , 0 , 5 , 1920), // #202
+ INST(Ldtrsw , BaseRM_SImm9 , (0b1011100010000000000010, 0b0000000000000000000000, kX , kZR, 0 , 0) , kRWI_W , 0 , 6 , 1927), // #203
+ INST(Ldumax , BaseAtomicOp , (0b1011100000100000011000, kWX, 30, 0) , kRWI_WRX , 0 , 84 , 1934), // #204
+ INST(Ldumaxa , BaseAtomicOp , (0b1011100010100000011000, kWX, 30, 1) , kRWI_WRX , 0 , 85 , 1941), // #205
+ INST(Ldumaxab , BaseAtomicOp , (0b0011100010100000011000, kW , 0 , 1) , kRWI_WRX , 0 , 86 , 1949), // #206
+ INST(Ldumaxah , BaseAtomicOp , (0b0111100010100000011000, kW , 0 , 1) , kRWI_WRX , 0 , 87 , 1958), // #207
+ INST(Ldumaxal , BaseAtomicOp , (0b1011100011100000011000, kWX, 30, 1) , kRWI_WRX , 0 , 88 , 1967), // #208
+ INST(Ldumaxalb , BaseAtomicOp , (0b0011100011100000011000, kW , 0 , 1) , kRWI_WRX , 0 , 89 , 1976), // #209
+ INST(Ldumaxalh , BaseAtomicOp , (0b0111100011100000011000, kW , 0 , 1) , kRWI_WRX , 0 , 90 , 1986), // #210
+ INST(Ldumaxb , BaseAtomicOp , (0b0011100000100000011000, kW , 0 , 0) , kRWI_WRX , 0 , 91 , 1996), // #211
+ INST(Ldumaxh , BaseAtomicOp , (0b0111100000100000011000, kW , 0 , 0) , kRWI_WRX , 0 , 92 , 2004), // #212
+ INST(Ldumaxl , BaseAtomicOp , (0b1011100001100000011000, kWX, 30, 0) , kRWI_WRX , 0 , 93 , 2012), // #213
+ INST(Ldumaxlb , BaseAtomicOp , (0b0011100001100000011000, kW , 0 , 0) , kRWI_WRX , 0 , 94 , 2020), // #214
+ INST(Ldumaxlh , BaseAtomicOp , (0b0111100001100000011000, kW , 0 , 0) , kRWI_WRX , 0 , 95 , 2029), // #215
+ INST(Ldumin , BaseAtomicOp , (0b1011100000100000011100, kWX, 30, 0) , kRWI_WRX , 0 , 96 , 2038), // #216
+ INST(Ldumina , BaseAtomicOp , (0b1011100010100000011100, kWX, 30, 1) , kRWI_WRX , 0 , 97 , 2045), // #217
+ INST(Lduminab , BaseAtomicOp , (0b0011100010100000011100, kW , 0 , 1) , kRWI_WRX , 0 , 98 , 2053), // #218
+ INST(Lduminah , BaseAtomicOp , (0b0111100010100000011100, kW , 0 , 1) , kRWI_WRX , 0 , 99 , 2062), // #219
+ INST(Lduminal , BaseAtomicOp , (0b1011100011100000011100, kWX, 30, 1) , kRWI_WRX , 0 , 100, 2071), // #220
+ INST(Lduminalb , BaseAtomicOp , (0b0011100011100000011100, kW , 0 , 1) , kRWI_WRX , 0 , 101, 2080), // #221
+ INST(Lduminalh , BaseAtomicOp , (0b0111100011100000011100, kW , 0 , 1) , kRWI_WRX , 0 , 102, 2090), // #222
+ INST(Lduminb , BaseAtomicOp , (0b0011100000100000011100, kW , 0 , 0) , kRWI_WRX , 0 , 103, 2100), // #223
+ INST(Lduminh , BaseAtomicOp , (0b0111100000100000011100, kW , 0 , 0) , kRWI_WRX , 0 , 104, 2108), // #224
+ INST(Lduminl , BaseAtomicOp , (0b1011100001100000011100, kWX, 30, 0) , kRWI_WRX , 0 , 105, 2116), // #225
+ INST(Lduminlb , BaseAtomicOp , (0b0011100001100000011100, kW , 0 , 0) , kRWI_WRX , 0 , 106, 2124), // #226
+ INST(Lduminlh , BaseAtomicOp , (0b0111100001100000011100, kW , 0 , 0) , kRWI_WRX , 0 , 107, 2133), // #227
+ INST(Ldur , BaseRM_SImm9 , (0b1011100001000000000000, 0b0000000000000000000000, kWX, kZR, 30, 0) , kRWI_W , 0 , 7 , 2142), // #228
+ INST(Ldurb , BaseRM_SImm9 , (0b0011100001000000000000, 0b0000000000000000000000, kW , kZR, 0 , 0) , kRWI_W , 0 , 8 , 2147), // #229
+ INST(Ldurh , BaseRM_SImm9 , (0b0111100001000000000000, 0b0000000000000000000000, kW , kZR, 0 , 0) , kRWI_W , 0 , 9 , 2153), // #230
+ INST(Ldursb , BaseRM_SImm9 , (0b0011100011000000000000, 0b0000000000000000000000, kWX, kZR, 22, 0) , kRWI_W , 0 , 10 , 2159), // #231
+ INST(Ldursh , BaseRM_SImm9 , (0b0111100011000000000000, 0b0000000000000000000000, kWX, kZR, 22, 0) , kRWI_W , 0 , 11 , 2166), // #232
+ INST(Ldursw , BaseRM_SImm9 , (0b1011100010000000000000, 0b0000000000000000000000, kWX, kZR, 0 , 0) , kRWI_W , 0 , 12 , 2173), // #233
+ INST(Ldxp , BaseLdxp , (0b1000100001111111000000, kWX, 30) , kRWI_WW , 0 , 1 , 2180), // #234
+ INST(Ldxr , BaseRM_NoImm , (0b1000100001011111011111, kWX, kZR, 30) , kRWI_W , 0 , 10 , 2185), // #235
+ INST(Ldxrb , BaseRM_NoImm , (0b0000100001011111011111, kW , kZR, 0 ) , kRWI_W , 0 , 11 , 2190), // #236
+ INST(Ldxrh , BaseRM_NoImm , (0b0100100001011111011111, kW , kZR, 0 ) , kRWI_W , 0 , 12 , 2196), // #237
+ INST(Lsl , BaseShift , (0b0001101011000000001000, 0b0101001100000000000000, 0) , kRWI_W , 0 , 2 , 2880), // #238
+ INST(Lslv , BaseShift , (0b0001101011000000001000, 0b0000000000000000000000, 0) , kRWI_W , 0 , 3 , 2202), // #239
+ INST(Lsr , BaseShift , (0b0001101011000000001001, 0b0101001100000000011111, 0) , kRWI_W , 0 , 4 , 2207), // #240
+ INST(Lsrv , BaseShift , (0b0001101011000000001001, 0b0000000000000000000000, 0) , kRWI_W , 0 , 5 , 2211), // #241
+ INST(Madd , BaseRRRR , (0b0001101100000000000000, kWX, kZR, kWX, kZR, kWX, kZR, kWX, kZR, true) , kRWI_W , 0 , 0 , 977 ), // #242
+ INST(Mneg , BaseRRR , (0b0001101100000000111111, kWX, kZR, kWX, kZR, kWX, kZR, true) , kRWI_W , 0 , 11 , 2216), // #243
+ INST(Mov , BaseMov , (_) , kRWI_W , 0 , 0 , 949 ), // #244
+ INST(Movk , BaseMovKNZ , (0b01110010100000000000000000000000) , kRWI_X , 0 , 0 , 2226), // #245
+ INST(Movn , BaseMovKNZ , (0b00010010100000000000000000000000) , kRWI_W , 0 , 1 , 2231), // #246
+ INST(Movz , BaseMovKNZ , (0b01010010100000000000000000000000) , kRWI_W , 0 , 2 , 2236), // #247
+ INST(Mrs , BaseMrs , (_) , kRWI_W , 0 , 0 , 2241), // #248
+ INST(Msr , BaseMsr , (_) , kRWI_W , 0 , 0 , 2245), // #249
+ INST(Msub , BaseRRRR , (0b0001101100000000100000, kWX, kZR, kWX, kZR, kWX, kZR, kWX, kZR, true) , kRWI_W , 0 , 1 , 984 ), // #250
+ INST(Mul , BaseRRR , (0b0001101100000000011111, kWX, kZR, kWX, kZR, kWX, kZR, true) , kRWI_W , 0 , 12 , 991 ), // #251
+ INST(Mvn , BaseMvnNeg , (0b00101010001000000000001111100000) , kRWI_W , 0 , 0 , 2249), // #252
+ INST(Neg , BaseMvnNeg , (0b01001011000000000000001111100000) , kRWI_W , 0 , 1 , 540 ), // #253
+ INST(Negs , BaseMvnNeg , (0b01101011000000000000001111100000) , kRWI_W , 0 , 2 , 2258), // #254
+ INST(Ngc , BaseRR , (0b01011010000000000000001111100000, kWX, kZR, 0, kWX, kZR, 16, true) , kRWI_W , 0 , 7 , 2263), // #255
+ INST(Ngcs , BaseRR , (0b01111010000000000000001111100000, kWX, kZR, 0, kWX, kZR, 16, true) , kRWI_W , 0 , 8 , 2267), // #256
+ INST(Nop , BaseOp , (0b11010101000000110010000000011111) , 0 , 0 , 13 , 2272), // #257
+ INST(Orn , BaseLogical , (0b0101010001, 0b01100100, 1) , kRWI_W , 0 , 6 , 2280), // #258
+ INST(Orr , BaseLogical , (0b0101010000, 0b01100100, 0) , kRWI_W , 0 , 7 , 2284), // #259
+ INST(Pacda , BaseRR , (0b11011010110000010000100000000000, kX, kZR, 0, kX, kSP, 5, true) , kRWI_X , 0 , 9 , 2288), // #260
+ INST(Pacdb , BaseRR , (0b11011010110000010000110000000000, kX, kZR, 0, kX, kSP, 5, true) , kRWI_X , 0 , 10 , 2294), // #261
+ INST(Pacdza , BaseR , (0b11011010110000010010101111100000, kX, kZR, 0) , kRWI_X , 0 , 4 , 2300), // #262
+ INST(Pacdzb , BaseR , (0b11011010110000010010111111100000, kX, kZR, 0) , kRWI_X , 0 , 5 , 2307), // #263
+ INST(Pacga , BaseRRR , (0b1001101011000000001100, kX, kZR, kX, kZR, kX, kSP, false) , kRWI_W , 0 , 13 , 2314), // #264
+ INST(Pssbb , BaseOp , (0b11010101000000110011010010011111) , 0 , 0 , 14 , 2338), // #265
+ INST(Rbit , BaseRR , (0b01011010110000000000000000000000, kWX, kZR, 0, kWX, kZR, 5, true) , kRWI_W , 0 , 11 , 2364), // #266
+ INST(Ret , BaseBranchReg , (0b11010110010111110000000000000000) , kRWI_R , 0 , 2 , 593 ), // #267
+ INST(Rev , BaseRev , (_) , kRWI_W , 0 , 0 , 2369), // #268
+ INST(Rev16 , BaseRR , (0b01011010110000000000010000000000, kWX, kZR, 0, kWX, kZR, 5, true) , kRWI_W , 0 , 12 , 2373), // #269
+ INST(Rev32 , BaseRR , (0b11011010110000000000100000000000, kWX, kZR, 0, kWX, kZR, 5, true) , kRWI_W , 0 , 13 , 2379), // #270
+ INST(Rev64 , BaseRR , (0b11011010110000000000110000000000, kWX, kZR, 0, kWX, kZR, 5, true) , kRWI_W , 0 , 14 , 2385), // #271
+ INST(Ror , BaseShift , (0b0001101011000000001011, 0b0001001110000000000000, 1) , kRWI_W , 0 , 6 , 2391), // #272
+ INST(Rorv , BaseShift , (0b0001101011000000001011, 0b0000000000000000000000, 1) , kRWI_W , 0 , 7 , 2395), // #273
+ INST(Sbc , BaseRRR , (0b0101101000000000000000, kWX, kZR, kWX, kZR, kWX, kZR, true) , kRWI_W , 0 , 14 , 2498), // #274
+ INST(Sbcs , BaseRRR , (0b0111101000000000000000, kWX, kZR, kWX, kZR, kWX, kZR, true) , kRWI_W , 0 , 15 , 2502), // #275
+ INST(Sbfiz , BaseBfi , (0b00010011000000000000000000000000) , kRWI_W , 0 , 1 , 2507), // #276
+ INST(Sbfm , BaseBfm , (0b00010011000000000000000000000000) , kRWI_W , 0 , 1 , 2513), // #277
+ INST(Sbfx , BaseBfx , (0b00010011000000000000000000000000) , kRWI_W , 0 , 1 , 2518), // #278
+ INST(Sdiv , BaseRRR , (0b0001101011000000000011, kWX, kZR, kWX, kZR, kWX, kZR, true) , kRWI_W , 0 , 16 , 2529), // #279
+ INST(Setf8 , BaseR , (0b00111010000000000000100000001101, kW, kZR, 5) , 0 , 0 , 6 , 2541), // #280
+ INST(Setf16 , BaseR , (0b00111010000000000100100000001101, kW, kZR, 5) , 0 , 0 , 7 , 2534), // #281
+ INST(Sev , BaseOp , (0b11010101000000110010000010011111) , 0 , 0 , 15 , 2547), // #282
+ INST(Sevl , BaseOp , (0b11010101000000110010000010111111) , 0 , 0 , 16 , 2551), // #283
+ INST(Smaddl , BaseRRRR , (0b1001101100100000000000, kX , kZR, kW , kZR, kW , kZR, kX , kZR, false) , kRWI_W , 0 , 2 , 2758), // #284
+ INST(Smc , BaseOpImm , (0b11010100000000000000000000000011, 16, 5) , 0 , 0 , 11 , 53 ), // #285
+ INST(Smnegl , BaseRRR , (0b1001101100100000111111, kX , kZR, kW , kZR, kW , kZR, false) , kRWI_W , 0 , 17 , 2815), // #286
+ INST(Smsubl , BaseRRRR , (0b1001101100100000100000, kX , kZR, kW , kZR, kW , kZR, kX , kZR, false) , kRWI_W , 0 , 3 , 2827), // #287
+ INST(Smulh , BaseRRR , (0b1001101101000000011111, kX , kZR, kX , kZR, kX , kZR, true) , kRWI_W , 0 , 18 , 2834), // #288
+ INST(Smull , BaseRRR , (0b1001101100100000011111, kX , kZR, kW , kZR, kW , kZR, false) , kRWI_W , 0 , 19 , 2840), // #289
+ INST(Ssbb , BaseOp , (0b11010101000000110011000010011111) , 0 , 0 , 17 , 2339), // #290
+ INST(St2g , BaseRM_SImm9 , (0b1101100110100000000010, 0b1101100110100000000001, kX, kSP, 0, 4) , kRWI_RW , 0 , 13 , 3164), // #291
+ INST(Stadd , BaseAtomicSt , (0b1011100000100000000000, kWX, 30) , kRWI_RX , 0 , 0 , 3177), // #292
+ INST(Staddl , BaseAtomicSt , (0b1011100001100000000000, kWX, 30) , kRWI_RX , 0 , 1 , 3197), // #293
+ INST(Staddb , BaseAtomicSt , (0b0011100000100000000000, kW , 0 ) , kRWI_RX , 0 , 2 , 3183), // #294
+ INST(Staddlb , BaseAtomicSt , (0b0011100001100000000000, kW , 0 ) , kRWI_RX , 0 , 3 , 3204), // #295
+ INST(Staddh , BaseAtomicSt , (0b0111100000100000000000, kW , 0 ) , kRWI_RX , 0 , 4 , 3190), // #296
+ INST(Staddlh , BaseAtomicSt , (0b0111100001100000000000, kW , 0 ) , kRWI_RX , 0 , 5 , 3212), // #297
+ INST(Stclr , BaseAtomicSt , (0b1011100000100000000100, kWX, 30) , kRWI_RX , 0 , 6 , 3220), // #298
+ INST(Stclrl , BaseAtomicSt , (0b1011100001100000000100, kWX, 30) , kRWI_RX , 0 , 7 , 3240), // #299
+ INST(Stclrb , BaseAtomicSt , (0b0011100000100000000100, kW , 0 ) , kRWI_RX , 0 , 8 , 3226), // #300
+ INST(Stclrlb , BaseAtomicSt , (0b0011100001100000000100, kW , 0 ) , kRWI_RX , 0 , 9 , 3247), // #301
+ INST(Stclrh , BaseAtomicSt , (0b0111100000100000000100, kW , 0 ) , kRWI_RX , 0 , 10 , 3233), // #302
+ INST(Stclrlh , BaseAtomicSt , (0b0111100001100000000100, kW , 0 ) , kRWI_RX , 0 , 11 , 3255), // #303
+ INST(Steor , BaseAtomicSt , (0b1011100000100000001000, kWX, 30) , kRWI_RX , 0 , 12 , 3263), // #304
+ INST(Steorl , BaseAtomicSt , (0b1011100001100000001000, kWX, 30) , kRWI_RX , 0 , 13 , 3283), // #305
+ INST(Steorb , BaseAtomicSt , (0b0011100000100000001000, kW , 0 ) , kRWI_RX , 0 , 14 , 3269), // #306
+ INST(Steorlb , BaseAtomicSt , (0b0011100001100000001000, kW , 0 ) , kRWI_RX , 0 , 15 , 3290), // #307
+ INST(Steorh , BaseAtomicSt , (0b0111100000100000001000, kW , 0 ) , kRWI_RX , 0 , 16 , 3276), // #308
+ INST(Steorlh , BaseAtomicSt , (0b0111100001100000001000, kW , 0 ) , kRWI_RX , 0 , 17 , 3298), // #309
+ INST(Stg , BaseRM_SImm9 , (0b1101100100100000000010, 0b1101100100100000000001, kX, kSP, 0, 4) , kRWI_RW , 0 , 14 , 3306), // #310
+ INST(Stgm , BaseRM_NoImm , (0b1101100110100000000000, kX , kZR, 0 ) , kRWI_RW , 0 , 13 , 3310), // #311
+ INST(Stgp , BaseLdpStp , (0b0110100100, 0b0110100010, kX, 0, 4) , kRWI_RRW , 0 , 3 , 3315), // #312
+ INST(Stllr , BaseRM_NoImm , (0b1000100010011111011111, kWX, kZR, 30) , kRWI_RW , 0 , 14 , 3320), // #313
+ INST(Stllrb , BaseRM_NoImm , (0b0000100010011111011111, kW , kZR, 0 ) , kRWI_RW , 0 , 15 , 3326), // #314
+ INST(Stllrh , BaseRM_NoImm , (0b0100100010011111011111, kW , kZR, 0 ) , kRWI_RW , 0 , 16 , 3333), // #315
+ INST(Stlr , BaseRM_NoImm , (0b1000100010011111111111, kWX, kZR, 30) , kRWI_RW , 0 , 17 , 3340), // #316
+ INST(Stlrb , BaseRM_NoImm , (0b0000100010011111111111, kW , kZR, 0 ) , kRWI_RW , 0 , 18 , 3345), // #317
+ INST(Stlrh , BaseRM_NoImm , (0b0100100010011111111111, kW , kZR, 0 ) , kRWI_RW , 0 , 19 , 3351), // #318
+ INST(Stlxp , BaseStxp , (0b1000100000100000100000, kWX, 30) , kRWI_WRRX , 0 , 0 , 3357), // #319
+ INST(Stlxr , BaseAtomicOp , (0b1000100000000000111111, kWX, 30, 1) , kRWI_WRX , 0 , 108, 3363), // #320
+ INST(Stlxrb , BaseAtomicOp , (0b0000100000000000111111, kW , 0 , 1) , kRWI_WRX , 0 , 109, 3369), // #321
+ INST(Stlxrh , BaseAtomicOp , (0b0100100000000000111111, kW , 0 , 1) , kRWI_WRX , 0 , 110, 3376), // #322
+ INST(Stnp , BaseLdpStp , (0b0010100000, 0 , kWX, 31, 2) , kRWI_RRW , 0 , 4 , 3383), // #323
+ INST(Stp , BaseLdpStp , (0b0010100100, 0b0010100010, kWX, 31, 2) , kRWI_RRW , 0 , 5 , 3388), // #324
+ INST(Str , BaseLdSt , (0b1011100100, 0b10111000000, 0b10111000001, 0 , kWX, 30, 2, Inst::kIdStur) , kRWI_RW , 0 , 6 , 3392), // #325
+ INST(Strb , BaseLdSt , (0b0011100100, 0b00111000000, 0b00111000001, 0 , kW , 30, 0, Inst::kIdSturb) , kRWI_RW , 0 , 7 , 3396), // #326
+ INST(Strh , BaseLdSt , (0b0111100100, 0b01111000000, 0b01111000001, 0 , kWX, 30, 1, Inst::kIdSturh) , kRWI_RW , 0 , 8 , 3401), // #327
+ INST(Stset , BaseAtomicSt , (0b1011100000100000001100, kWX, 30) , kRWI_RX , 0 , 18 , 3406), // #328
+ INST(Stsetl , BaseAtomicSt , (0b1011100001100000001100, kWX, 30) , kRWI_RX , 0 , 19 , 3426), // #329
+ INST(Stsetb , BaseAtomicSt , (0b0011100000100000001100, kW , 0 ) , kRWI_RX , 0 , 20 , 3412), // #330
+ INST(Stsetlb , BaseAtomicSt , (0b0011100001100000001100, kW , 0 ) , kRWI_RX , 0 , 21 , 3433), // #331
+ INST(Stseth , BaseAtomicSt , (0b0111100000100000001100, kW , 0 ) , kRWI_RX , 0 , 22 , 3419), // #332
+ INST(Stsetlh , BaseAtomicSt , (0b0111100001100000001100, kW , 0 ) , kRWI_RX , 0 , 23 , 3441), // #333
+ INST(Stsmax , BaseAtomicSt , (0b1011100000100000010000, kWX, 30) , kRWI_RX , 0 , 24 , 3449), // #334
+ INST(Stsmaxl , BaseAtomicSt , (0b1011100001100000010000, kWX, 30) , kRWI_RX , 0 , 25 , 3472), // #335
+ INST(Stsmaxb , BaseAtomicSt , (0b0011100000100000010000, kW , 0 ) , kRWI_RX , 0 , 26 , 3456), // #336
+ INST(Stsmaxlb , BaseAtomicSt , (0b0011100001100000010000, kW , 0 ) , kRWI_RX , 0 , 27 , 3480), // #337
+ INST(Stsmaxh , BaseAtomicSt , (0b0111100000100000010000, kW , 0 ) , kRWI_RX , 0 , 28 , 3464), // #338
+ INST(Stsmaxlh , BaseAtomicSt , (0b0111100001100000010000, kW , 0 ) , kRWI_RX , 0 , 29 , 3489), // #339
+ INST(Stsmin , BaseAtomicSt , (0b1011100000100000010100, kWX, 30) , kRWI_RX , 0 , 30 , 3498), // #340
+ INST(Stsminl , BaseAtomicSt , (0b1011100001100000010100, kWX, 30) , kRWI_RX , 0 , 31 , 3521), // #341
+ INST(Stsminb , BaseAtomicSt , (0b0011100000100000010100, kW , 0 ) , kRWI_RX , 0 , 32 , 3505), // #342
+ INST(Stsminlb , BaseAtomicSt , (0b0011100001100000010100, kW , 0 ) , kRWI_RX , 0 , 33 , 3529), // #343
+ INST(Stsminh , BaseAtomicSt , (0b0111100000100000010100, kW , 0 ) , kRWI_RX , 0 , 34 , 3513), // #344
+ INST(Stsminlh , BaseAtomicSt , (0b0111100001100000010100, kW , 0 ) , kRWI_RX , 0 , 35 , 3538), // #345
+ INST(Sttr , BaseRM_SImm9 , (0b1011100000000000000010, 0b0000000000000000000000, kWX, kZR, 30, 0) , kRWI_RW , 0 , 15 , 3547), // #346
+ INST(Sttrb , BaseRM_SImm9 , (0b0011100000000000000010, 0b0000000000000000000000, kW , kZR, 0 , 0) , kRWI_RW , 0 , 16 , 3552), // #347
+ INST(Sttrh , BaseRM_SImm9 , (0b0111100000000000000010, 0b0000000000000000000000, kW , kZR, 0 , 0) , kRWI_RW , 0 , 17 , 3558), // #348
+ INST(Stumax , BaseAtomicSt , (0b1011100000100000011000, kWX, 30) , kRWI_RX , 0 , 36 , 3564), // #349
+ INST(Stumaxl , BaseAtomicSt , (0b1011100001100000011000, kWX, 30) , kRWI_RX , 0 , 37 , 3587), // #350
+ INST(Stumaxb , BaseAtomicSt , (0b0011100000100000011000, kW , 0 ) , kRWI_RX , 0 , 38 , 3571), // #351
+ INST(Stumaxlb , BaseAtomicSt , (0b0011100001100000011000, kW , 0 ) , kRWI_RX , 0 , 39 , 3595), // #352
+ INST(Stumaxh , BaseAtomicSt , (0b0111100000100000011000, kW , 0 ) , kRWI_RX , 0 , 40 , 3579), // #353
+ INST(Stumaxlh , BaseAtomicSt , (0b0111100001100000011000, kW , 0 ) , kRWI_RX , 0 , 41 , 3604), // #354
+ INST(Stumin , BaseAtomicSt , (0b1011100000100000011100, kWX, 30) , kRWI_RX , 0 , 42 , 3613), // #355
+ INST(Stuminl , BaseAtomicSt , (0b1011100001100000011100, kWX, 30) , kRWI_RX , 0 , 43 , 3636), // #356
+ INST(Stuminb , BaseAtomicSt , (0b0011100000100000011100, kW , 0 ) , kRWI_RX , 0 , 44 , 3620), // #357
+ INST(Stuminlb , BaseAtomicSt , (0b0011100001100000011100, kW , 0 ) , kRWI_RX , 0 , 45 , 3644), // #358
+ INST(Stuminh , BaseAtomicSt , (0b0111100000100000011100, kW , 0 ) , kRWI_RX , 0 , 46 , 3628), // #359
+ INST(Stuminlh , BaseAtomicSt , (0b0111100001100000011100, kW , 0 ) , kRWI_RX , 0 , 47 , 3653), // #360
+ INST(Stur , BaseRM_SImm9 , (0b1011100000000000000000, 0b0000000000000000000000, kWX, kZR, 30, 0) , kRWI_RW , 0 , 18 , 3662), // #361
+ INST(Sturb , BaseRM_SImm9 , (0b0011100000000000000000, 0b0000000000000000000000, kW , kZR, 0 , 0) , kRWI_RW , 0 , 19 , 3667), // #362
+ INST(Sturh , BaseRM_SImm9 , (0b0111100000000000000000, 0b0000000000000000000000, kW , kZR, 0 , 0) , kRWI_RW , 0 , 20 , 3673), // #363
+ INST(Stxp , BaseStxp , (0b1000100000100000000000, kWX, 30) , kRWI_WRRW , 0 , 1 , 3679), // #364
+ INST(Stxr , BaseStx , (0b1000100000000000011111, kWX, 30) , kRWI_WRW , 0 , 0 , 3684), // #365
+ INST(Stxrb , BaseStx , (0b0000100000000000011111, kW , 0 ) , kRWI_WRW , 0 , 1 , 3689), // #366
+ INST(Stxrh , BaseStx , (0b0100100000000000011111, kW , 0 ) , kRWI_WRW , 0 , 2 , 3695), // #367
+ INST(Stz2g , BaseRM_SImm9 , (0b1101100111100000000010, 0b1101100111100000000001, kX , kSP, 0, 4) , kRWI_RW , 0 , 21 , 3701), // #368
+ INST(Stzg , BaseRM_SImm9 , (0b1101100101100000000010, 0b1101100101100000000001, kX , kSP, 0, 4) , kRWI_RW , 0 , 22 , 3707), // #369
+ INST(Stzgm , BaseRM_NoImm , (0b1101100100100000000000, kX , kZR, 0) , kRWI_RW , 0 , 20 , 3712), // #370
+ INST(Sub , BaseAddSub , (0b1001011000, 0b1001011001, 0b1010001) , kRWI_X , 0 , 2 , 985 ), // #371
+ INST(Subg , BaseRRII , (0b1101000110000000000000, kX, kSP, kX, kSP, 6, 4, 16, 4, 0, 10) , kRWI_W , 0 , 1 , 3718), // #372
+ INST(Subp , BaseRRR , (0b1001101011000000000000, kX, kZR, kX, kSP, kX, kSP, false) , kRWI_W , 0 , 20 , 3723), // #373
+ INST(Subps , BaseRRR , (0b1011101011000000000000, kX, kZR, kX, kSP, kX, kSP, false) , kRWI_W , 0 , 21 , 3728), // #374
+ INST(Subs , BaseAddSub , (0b1101011000, 0b1101011001, 0b1110001) , kRWI_X , 0 , 3 , 3734), // #375
+ INST(Svc , BaseOpImm , (0b11010100000000000000000000000001, 16, 5) , 0 , 0 , 12 , 3752), // #376
+ INST(Swp , BaseAtomicOp , (0b1011100000100000100000, kWX, 30, 1) , kRWI_RWX , 0 , 111, 3756), // #377
+ INST(Swpa , BaseAtomicOp , (0b1011100010100000100000, kWX, 30, 1) , kRWI_RWX , 0 , 112, 3760), // #378
+ INST(Swpab , BaseAtomicOp , (0b0011100010100000100000, kW , 0 , 1) , kRWI_RWX , 0 , 113, 3765), // #379
+ INST(Swpah , BaseAtomicOp , (0b0111100010100000100000, kW , 0 , 1) , kRWI_RWX , 0 , 114, 3771), // #380
+ INST(Swpal , BaseAtomicOp , (0b1011100011100000100000, kWX, 30, 1) , kRWI_RWX , 0 , 115, 3777), // #381
+ INST(Swpalb , BaseAtomicOp , (0b0011100011100000100000, kW , 0 , 1) , kRWI_RWX , 0 , 116, 3783), // #382
+ INST(Swpalh , BaseAtomicOp , (0b0111100011100000100000, kW , 0 , 1) , kRWI_RWX , 0 , 117, 3790), // #383
+ INST(Swpb , BaseAtomicOp , (0b0011100000100000100000, kW , 0 , 1) , kRWI_RWX , 0 , 118, 3797), // #384
+ INST(Swph , BaseAtomicOp , (0b0111100000100000100000, kW , 0 , 1) , kRWI_RWX , 0 , 119, 3802), // #385
+ INST(Swpl , BaseAtomicOp , (0b1011100001100000100000, kWX, 30, 1) , kRWI_RWX , 0 , 120, 3807), // #386
+ INST(Swplb , BaseAtomicOp , (0b0011100001100000100000, kW , 0 , 1) , kRWI_RWX , 0 , 121, 3812), // #387
+ INST(Swplh , BaseAtomicOp , (0b0111100001100000100000, kW , 0 , 1) , kRWI_RWX , 0 , 122, 3818), // #388
+ INST(Sxtb , BaseExtend , (0b0001001100000000000111, kWX, 0) , kRWI_W , 0 , 0 , 3824), // #389
+ INST(Sxth , BaseExtend , (0b0001001100000000001111, kWX, 0) , kRWI_W , 0 , 1 , 3829), // #390
+ INST(Sxtw , BaseExtend , (0b1001001101000000011111, kX , 0) , kRWI_W , 0 , 2 , 3845), // #391
+ INST(Sys , BaseSys , (_) , kRWI_W , 0 , 0 , 3850), // #392
+ INST(Tlbi , BaseAtDcIcTlbi , (0b00011110000000, 0b00010000000000, false) , kRWI_RX , 0 , 3 , 3871), // #393
+ INST(Tst , BaseTst , (0b1101010000, 0b111001000) , kRWI_R , 0 , 0 , 437 ), // #394
+ INST(Tbnz , BaseBranchTst , (0b00110111000000000000000000000000) , kRWI_R , 0 , 0 , 3858), // #395
+ INST(Tbz , BaseBranchTst , (0b00110110000000000000000000000000) , kRWI_R , 0 , 1 , 3867), // #396
+ INST(Ubfiz , BaseBfi , (0b01010011000000000000000000000000) , kRWI_W , 0 , 2 , 3969), // #397
+ INST(Ubfm , BaseBfm , (0b01010011000000000000000000000000) , kRWI_W , 0 , 2 , 3975), // #398
+ INST(Ubfx , BaseBfx , (0b01010011000000000000000000000000) , kRWI_W , 0 , 2 , 3980), // #399
+ INST(Udf , BaseOpImm , (0b00000000000000000000000000000000, 16, 0) , 0 , 0 , 13 , 3991), // #400
+ INST(Udiv , BaseRRR , (0b0001101011000000000010, kWX, kZR, kWX, kZR, kWX, kZR, true) , kRWI_W , 0 , 22 , 3995), // #401
+ INST(Umaddl , BaseRRRR , (0b1001101110100000000000, kX , kZR, kW , kZR, kW , kZR, kX , kZR, false) , kRWI_W , 0 , 4 , 4012), // #402
+ INST(Umnegl , BaseRRR , (0b1001101110100000111111, kX , kZR, kW , kZR, kW , kZR, false) , kRWI_W , 0 , 23 , 4075), // #403
+ INST(Umull , BaseRRR , (0b1001101110100000011111, kX , kZR, kW , kZR, kW , kZR, false) , kRWI_W , 0 , 24 , 4100), // #404
+ INST(Umulh , BaseRRR , (0b1001101111000000011111, kX , kZR, kX , kZR, kX , kZR, false) , kRWI_W , 0 , 25 , 4094), // #405
+ INST(Umsubl , BaseRRRR , (0b1001101110100000100000, kX , kZR, kW , kZR, kW , kZR, kX , kZR, false) , kRWI_W , 0 , 5 , 4087), // #406
+ INST(Uxtb , BaseExtend , (0b0101001100000000000111, kW, 1) , kRWI_W , 0 , 3 , 4291), // #407
+ INST(Uxth , BaseExtend , (0b0101001100000000001111, kW, 1) , kRWI_W , 0 , 4 , 4296), // #408
+ INST(Wfe , BaseOp , (0b11010101000000110010000001011111) , 0 , 0 , 18 , 4322), // #409
+ INST(Wfi , BaseOp , (0b11010101000000110010000001111111) , 0 , 0 , 19 , 4326), // #410
+ INST(Xaflag , BaseOp , (0b11010101000000000100000000111111) , 0 , 0 , 20 , 4330), // #411
+ INST(Xpacd , BaseR , (0b11011010110000010100011111100000, kX, kZR, 0) , kRWI_X , 0 , 8 , 4341), // #412
+ INST(Xpaci , BaseR , (0b11011010110000010100001111100000, kX, kZR, 0) , kRWI_X , 0 , 9 , 4347), // #413
+ INST(Xpaclri , BaseOp , (0b11010101000000110010000011111111) , kRWI_X , 0 , 21 , 4353), // #414
+ INST(Yield , BaseOp , (0b11010101000000110010000000111111) , 0 , 0 , 22 , 4361), // #415
+ INST(Abs_v , ISimdVV , (0b0000111000100000101110, kVO_V_Any) , kRWI_W , 0 , 0 , 2855), // #416
+ INST(Add_v , ISimdVVV , (0b0000111000100000100001, kVO_V_Any) , kRWI_W , 0 , 0 , 978 ), // #417
+ INST(Addhn_v , ISimdVVV , (0b0000111000100000010000, kVO_V_B8H4S2) , kRWI_W , F(Narrow) , 1 , 2345), // #418
+ INST(Addhn2_v , ISimdVVV , (0b0100111000100000010000, kVO_V_B16H8S4) , kRWI_W , F(Narrow) , 2 , 2352), // #419
+ INST(Addp_v , ISimdPair , (0b0101111000110001101110, 0b0000111000100000101111, kVO_V_Any) , kRWI_W , F(Pair) , 0 , 638 ), // #420
+ INST(Addv_v , ISimdSV , (0b0000111000110001101110, kVO_V_BH_4S) , kRWI_W , 0 , 0 , 20 ), // #421
+ INST(Aesd_v , ISimdVVx , (0b0100111000101000010110, kOp_V16B, kOp_V16B) , kRWI_X , 0 , 0 , 34 ), // #422
+ INST(Aese_v , ISimdVVx , (0b0100111000101000010010, kOp_V16B, kOp_V16B) , kRWI_X , 0 , 1 , 39 ), // #423
+ INST(Aesimc_v , ISimdVVx , (0b0100111000101000011110, kOp_V16B, kOp_V16B) , kRWI_W , 0 , 2 , 44 ), // #424
+ INST(Aesmc_v , ISimdVVx , (0b0100111000101000011010, kOp_V16B, kOp_V16B) , kRWI_W , 0 , 3 , 51 ), // #425
+ INST(And_v , ISimdVVV , (0b0000111000100000000111, kVO_V_B) , kRWI_W , 0 , 3 , 57 ), // #426
+ INST(Bcax_v , ISimdVVVV , (0b1100111000100000000000, kVO_V_B16) , kRWI_W , 0 , 0 , 187 ), // #427
+ INST(Bfcvt_v , ISimdVVx , (0b0001111001100011010000, kOp_H, kOp_S) , kRWI_W , 0 , 4 , 196 ), // #428
+ INST(Bfcvtn_v , ISimdVVx , (0b0000111010100001011010, kOp_V4H, kOp_V4S) , kRWI_W , F(Narrow) , 5 , 202 ), // #429
+ INST(Bfcvtn2_v , ISimdVVx , (0b0100111010100001011010, kOp_V8H, kOp_V4S) , kRWI_W , F(Narrow) , 6 , 209 ), // #430
+ INST(Bfdot_v , SimdDot , (0b0010111001000000111111, 0b0000111101000000111100, kET_S, kET_H, kET_2H) , kRWI_X , 0 , 0 , 217 ), // #431
+ INST(Bfmlalb_v , SimdFmlal , (0b0010111011000000111111, 0b0000111111000000111100, 0, kET_S, kET_H, kET_H) , kRWI_X , F(VH0_15) , 0 , 227 ), // #432
+ INST(Bfmlalt_v , SimdFmlal , (0b0110111011000000111111, 0b0100111111000000111100, 0, kET_S, kET_H, kET_H) , kRWI_X , F(VH0_15) , 1 , 235 ), // #433
+ INST(Bfmmla_v , ISimdVVVx , (0b0110111001000000111011, kOp_V4S, kOp_V8H, kOp_V8H) , kRWI_X , F(Long) , 0 , 243 ), // #434
+ INST(Bic_v , SimdBicOrr , (0b0000111001100000000111, 0b0010111100000000000001) , kRWI_W , 0 , 0 , 256 ), // #435
+ INST(Bif_v , ISimdVVV , (0b0010111011100000000111, kVO_V_B) , kRWI_X , 0 , 4 , 265 ), // #436
+ INST(Bit_v , ISimdVVV , (0b0010111010100000000111, kVO_V_B) , kRWI_X , 0 , 5 , 2365), // #437
+ INST(Bsl_v , ISimdVVV , (0b0010111001100000000111, kVO_V_B) , kRWI_X , 0 , 6 , 280 ), // #438
+ INST(Cls_v , ISimdVV , (0b0000111000100000010010, kVO_V_BHS) , kRWI_W , 0 , 1 , 412 ), // #439
+ INST(Clz_v , ISimdVV , (0b0010111000100000010010, kVO_V_BHS) , kRWI_W , 0 , 2 , 416 ), // #440
+ INST(Cmeq_v , SimdCmp , (0b0010111000100000100011, 0b0000111000100000100110, kVO_V_Any) , kRWI_W , 0 , 0 , 663 ), // #441
+ INST(Cmge_v , SimdCmp , (0b0000111000100000001111, 0b0010111000100000100010, kVO_V_Any) , kRWI_W , 0 , 1 , 669 ), // #442
+ INST(Cmgt_v , SimdCmp , (0b0000111000100000001101, 0b0000111000100000100010, kVO_V_Any) , kRWI_W , 0 , 2 , 675 ), // #443
+ INST(Cmhi_v , SimdCmp , (0b0010111000100000001101, 0b0000000000000000000000, kVO_V_Any) , kRWI_W , 0 , 3 , 420 ), // #444
+ INST(Cmhs_v , SimdCmp , (0b0010111000100000001111, 0b0000000000000000000000, kVO_V_Any) , kRWI_W , 0 , 4 , 425 ), // #445
+ INST(Cmle_v , SimdCmp , (0b0000000000000000000000, 0b0010111000100000100110, kVO_V_Any) , kRWI_W , 0 , 5 , 687 ), // #446
+ INST(Cmlt_v , SimdCmp , (0b0000000000000000000000, 0b0000111000100000101010, kVO_V_Any) , kRWI_W , 0 , 6 , 693 ), // #447
+ INST(Cmtst_v , ISimdVVV , (0b0000111000100000100011, kVO_V_Any) , kRWI_W , 0 , 7 , 435 ), // #448
+ INST(Cnt_v , ISimdVV , (0b0000111000100000010110, kVO_V_B) , kRWI_W , 0 , 3 , 446 ), // #449
+ INST(Dup_v , SimdDup , (_) , kRWI_W , 0 , 0 , 579 ), // #450
+ INST(Eor_v , ISimdVVV , (0b0010111000100000000111, kVO_V_B) , kRWI_W , 0 , 8 , 1418), // #451
+ INST(Eor3_v , ISimdVVVV , (0b1100111000000000000000, kVO_V_B16) , kRWI_W , 0 , 1 , 587 ), // #452
+ INST(Ext_v , ISimdVVVI , (0b0010111000000000000000, kVO_V_B, 4, 11, 1) , kRWI_W , 0 , 0 , 601 ), // #453
+ INST(Fabd_v , FSimdVVV , (0b0111111010100000110101, kHF_C, 0b0010111010100000110101, kHF_C) , kRWI_W , 0 , 0 , 610 ), // #454
+ INST(Fabs_v , FSimdVV , (0b0001111000100000110000, kHF_A, 0b0000111010100000111110, kHF_B) , kRWI_W , 0 , 0 , 615 ), // #455
+ INST(Facge_v , FSimdVVV , (0b0111111000100000111011, kHF_C, 0b0010111000100000111011, kHF_C) , kRWI_W , 0 , 1 , 620 ), // #456
+ INST(Facgt_v , FSimdVVV , (0b0111111010100000111011, kHF_C, 0b0010111010100000111011, kHF_C) , kRWI_W , 0 , 2 , 626 ), // #457
+ INST(Fadd_v , FSimdVVV , (0b0001111000100000001010, kHF_A, 0b0000111000100000110101, kHF_C) , kRWI_W , 0 , 3 , 632 ), // #458
+ INST(Faddp_v , FSimdPair , (0b0111111000110000110110, 0b0010111000100000110101) , kRWI_W , 0 , 0 , 637 ), // #459
+ INST(Fcadd_v , SimdFcadd , (0b0010111000000000111001) , kRWI_W , 0 , 0 , 643 ), // #460
+ INST(Fccmp_v , SimdFccmpFccmpe , (0b00011110001000000000010000000000) , kRWI_R , 0 , 0 , 649 ), // #461
+ INST(Fccmpe_v , SimdFccmpFccmpe , (0b00011110001000000000010000010000) , kRWI_R , 0 , 1 , 655 ), // #462
+ INST(Fcmeq_v , SimdFcm , (0b0000111000100000111001, kHF_C, 0b0000111010100000110110) , kRWI_W , 0 , 0 , 662 ), // #463
+ INST(Fcmge_v , SimdFcm , (0b0010111000100000111001, kHF_C, 0b0010111010100000110010) , kRWI_W , 0 , 1 , 668 ), // #464
+ INST(Fcmgt_v , SimdFcm , (0b0010111010100000111001, kHF_C, 0b0000111010100000110010) , kRWI_W , 0 , 2 , 674 ), // #465
+ INST(Fcmla_v , SimdFcmla , (0b0010111000000000110001, 0b0010111100000000000100) , kRWI_X , 0 , 0 , 680 ), // #466
+ INST(Fcmle_v , SimdFcm , (0b0000000000000000000000, kHF_C, 0b0010111010100000110110) , kRWI_W , 0 , 3 , 686 ), // #467
+ INST(Fcmlt_v , SimdFcm , (0b0000000000000000000000, kHF_C, 0b0000111010100000111010) , kRWI_W , 0 , 4 , 692 ), // #468
+ INST(Fcmp_v , SimdFcmpFcmpe , (0b00011110001000000010000000000000) , kRWI_R , 0 , 0 , 698 ), // #469
+ INST(Fcmpe_v , SimdFcmpFcmpe , (0b00011110001000000010000000010000) , kRWI_R , 0 , 1 , 703 ), // #470
+ INST(Fcsel_v , SimdFcsel , (_) , kRWI_W , 0 , 0 , 709 ), // #471
+ INST(Fcvt_v , SimdFcvt , (_) , kRWI_W , 0 , 0 , 197 ), // #472
+ INST(Fcvtas_v , SimdFcvtSV , (0b0000111000100001110010, 0b0000000000000000000000, 0b0001111000100100000000, 1) , kRWI_W , 0 , 0 , 715 ), // #473
+ INST(Fcvtau_v , SimdFcvtSV , (0b0010111000100001110010, 0b0000000000000000000000, 0b0001111000100101000000, 1) , kRWI_W , 0 , 1 , 722 ), // #474
+ INST(Fcvtl_v , SimdFcvtLN , (0b0000111000100001011110, 0, 0) , kRWI_W , F(Long) , 0 , 729 ), // #475
+ INST(Fcvtl2_v , SimdFcvtLN , (0b0100111000100001011110, 0, 0) , kRWI_W , F(Long) , 1 , 735 ), // #476
+ INST(Fcvtms_v , SimdFcvtSV , (0b0000111000100001101110, 0b0000000000000000000000, 0b0001111000110000000000, 1) , kRWI_W , 0 , 2 , 742 ), // #477
+ INST(Fcvtmu_v , SimdFcvtSV , (0b0010111000100001101110, 0b0000000000000000000000, 0b0001111000110001000000, 1) , kRWI_W , 0 , 3 , 749 ), // #478
+ INST(Fcvtn_v , SimdFcvtLN , (0b0000111000100001011010, 0, 0) , kRWI_W , F(Narrow) , 2 , 203 ), // #479
+ INST(Fcvtn2_v , SimdFcvtLN , (0b0100111000100001011010, 0, 0) , kRWI_X , F(Narrow) , 3 , 210 ), // #480
+ INST(Fcvtns_v , SimdFcvtSV , (0b0000111000100001101010, 0b0000000000000000000000, 0b0001111000100000000000, 1) , kRWI_W , 0 , 4 , 756 ), // #481
+ INST(Fcvtnu_v , SimdFcvtSV , (0b0010111000100001101010, 0b0000000000000000000000, 0b0001111000100001000000, 1) , kRWI_W , 0 , 5 , 763 ), // #482
+ INST(Fcvtps_v , SimdFcvtSV , (0b0000111010100001101010, 0b0000000000000000000000, 0b0001111000101000000000, 1) , kRWI_W , 0 , 6 , 770 ), // #483
+ INST(Fcvtpu_v , SimdFcvtSV , (0b0010111010100001101010, 0b0000000000000000000000, 0b0001111000101001000000, 1) , kRWI_W , 0 , 7 , 777 ), // #484
+ INST(Fcvtxn_v , SimdFcvtLN , (0b0010111000100001011010, 1, 1) , kRWI_W , F(Narrow) , 4 , 784 ), // #485
+ INST(Fcvtxn2_v , SimdFcvtLN , (0b0110111000100001011010, 1, 0) , kRWI_X , F(Narrow) , 5 , 791 ), // #486
+ INST(Fcvtzs_v , SimdFcvtSV , (0b0000111010100001101110, 0b0000111100000000111111, 0b0001111000111000000000, 1) , kRWI_W , 0 , 8 , 799 ), // #487
+ INST(Fcvtzu_v , SimdFcvtSV , (0b0010111010100001101110, 0b0010111100000000111111, 0b0001111000111001000000, 1) , kRWI_W , 0 , 9 , 806 ), // #488
+ INST(Fdiv_v , FSimdVVV , (0b0001111000100000000110, kHF_A, 0b0010111000100000111111, kHF_C) , kRWI_W , 0 , 4 , 813 ), // #489
+ INST(Fjcvtzs_v , ISimdVVx , (0b0001111001111110000000, kOp_GpW, kOp_D) , kRWI_W , 0 , 7 , 818 ), // #490
+ INST(Fmadd_v , FSimdVVVV , (0b0001111100000000000000, kHF_A, 0b0000000000000000000000, kHF_N) , kRWI_W , 0 , 0 , 826 ), // #491
+ INST(Fmax_v , FSimdVVV , (0b0001111000100000010010, kHF_A, 0b0000111000100000111101, kHF_C) , kRWI_W , 0 , 5 , 832 ), // #492
+ INST(Fmaxnm_v , FSimdVVV , (0b0001111000100000011010, kHF_A, 0b0000111000100000110001, kHF_C) , kRWI_W , 0 , 6 , 837 ), // #493
+ INST(Fmaxnmp_v , FSimdPair , (0b0111111000110000110010, 0b0010111000100000110001) , kRWI_W , 0 , 1 , 844 ), // #494
+ INST(Fmaxnmv_v , FSimdSV , (0b0010111000110000110010) , kRWI_W , 0 , 0 , 852 ), // #495
+ INST(Fmaxp_v , FSimdPair , (0b0111111000110000111110, 0b0010111000100000111101) , kRWI_W , 0 , 2 , 860 ), // #496
+ INST(Fmaxv_v , FSimdSV , (0b0010111000110000111110) , kRWI_W , 0 , 1 , 866 ), // #497
+ INST(Fmin_v , FSimdVVV , (0b0001111000100000010110, kHF_A, 0b0000111010100000111101, kHF_C) , kRWI_W , 0 , 7 , 872 ), // #498
+ INST(Fminnm_v , FSimdVVV , (0b0001111000100000011110, kHF_A, 0b0000111010100000110001, kHF_C) , kRWI_W , 0 , 8 , 877 ), // #499
+ INST(Fminnmp_v , FSimdPair , (0b0111111010110000110010, 0b0010111010100000110001) , kRWI_W , 0 , 3 , 884 ), // #500
+ INST(Fminnmv_v , FSimdSV , (0b0010111010110000110010) , kRWI_W , 0 , 2 , 892 ), // #501
+ INST(Fminp_v , FSimdPair , (0b0111111010110000111110, 0b0010111010100000111101) , kRWI_W , 0 , 4 , 900 ), // #502
+ INST(Fminv_v , FSimdSV , (0b0010111010110000111110) , kRWI_W , 0 , 3 , 906 ), // #503
+ INST(Fmla_v , FSimdVVVe , (0b0000000000000000000000, kHF_N, 0b0000111000100000110011, 0b0000111110000000000100) , kRWI_X , F(VH0_15) , 0 , 912 ), // #504
+ INST(Fmlal_v , SimdFmlal , (0b0000111000100000111011, 0b0000111110000000000000, 1, kET_S, kET_H, kET_H) , kRWI_X , F(VH0_15) , 2 , 917 ), // #505
+ INST(Fmlal2_v , SimdFmlal , (0b0010111000100000110011, 0b0010111110000000100000, 1, kET_S, kET_H, kET_H) , kRWI_X , F(VH0_15) , 3 , 923 ), // #506
+ INST(Fmls_v , FSimdVVVe , (0b0000000000000000000000, kHF_N, 0b0000111010100000110011, 0b0000111110000000010100) , kRWI_X , F(VH0_15) , 1 , 930 ), // #507
+ INST(Fmlsl_v , SimdFmlal , (0b0000111010100000111011, 0b0000111110000000010000, 1, kET_S, kET_H, kET_H) , kRWI_X , F(VH0_15) , 4 , 935 ), // #508
+ INST(Fmlsl2_v , SimdFmlal , (0b0010111010100000110011, 0b0010111110000000110000, 1, kET_S, kET_H, kET_H) , kRWI_X , F(VH0_15) , 5 , 941 ), // #509
+ INST(Fmov_v , SimdFmov , (_) , kRWI_W , 0 , 0 , 948 ), // #510
+ INST(Fmsub_v , FSimdVVVV , (0b0001111100000000100000, kHF_A, 0b0000000000000000000000, kHF_N) , kRWI_W , 0 , 1 , 953 ), // #511
+ INST(Fmul_v , FSimdVVVe , (0b0001111000100000000010, kHF_A, 0b0010111000100000110111, 0b0000111110000000100100) , kRWI_W , F(VH0_15) , 2 , 959 ), // #512
+ INST(Fmulx_v , FSimdVVVe , (0b0101111000100000110111, kHF_C, 0b0000111000100000110111, 0b0010111110000000100100) , kRWI_W , F(VH0_15) , 3 , 964 ), // #513
+ INST(Fneg_v , FSimdVV , (0b0001111000100001010000, kHF_A, 0b0010111010100000111110, kHF_B) , kRWI_W , 0 , 1 , 970 ), // #514
+ INST(Fnmadd_v , FSimdVVVV , (0b0001111100100000000000, kHF_A, 0b0000000000000000000000, kHF_N) , kRWI_W , 0 , 2 , 975 ), // #515
+ INST(Fnmsub_v , FSimdVVVV , (0b0001111100100000100000, kHF_A, 0b0000000000000000000000, kHF_N) , kRWI_W , 0 , 3 , 982 ), // #516
+ INST(Fnmul_v , FSimdVVV , (0b0001111000100000100010, kHF_A, 0b0000000000000000000000, kHF_N) , kRWI_W , 0 , 9 , 989 ), // #517
+ INST(Frecpe_v , FSimdVV , (0b0101111010100001110110, kHF_B, 0b0000111010100001110110, kHF_B) , kRWI_W , 0 , 2 , 995 ), // #518
+ INST(Frecps_v , FSimdVVV , (0b0101111000100000111111, kHF_C, 0b0000111000100000111111, kHF_C) , kRWI_W , 0 , 10 , 1002), // #519
+ INST(Frecpx_v , FSimdVV , (0b0101111010100001111110, kHF_B, 0b0000000000000000000000, kHF_N) , kRWI_W , 0 , 3 , 1009), // #520
+ INST(Frint32x_v , FSimdVV , (0b0001111000101000110000, kHF_N, 0b0010111000100001111010, kHF_N) , kRWI_W , 0 , 4 , 1016), // #521
+ INST(Frint32z_v , FSimdVV , (0b0001111000101000010000, kHF_N, 0b0000111000100001111010, kHF_N) , kRWI_W , 0 , 5 , 1025), // #522
+ INST(Frint64x_v , FSimdVV , (0b0001111000101001110000, kHF_N, 0b0010111000100001111110, kHF_N) , kRWI_W , 0 , 6 , 1034), // #523
+ INST(Frint64z_v , FSimdVV , (0b0001111000101001010000, kHF_N, 0b0000111000100001111110, kHF_N) , kRWI_W , 0 , 7 , 1043), // #524
+ INST(Frinta_v , FSimdVV , (0b0001111000100110010000, kHF_A, 0b0010111000100001100010, kHF_B) , kRWI_W , 0 , 8 , 1052), // #525
+ INST(Frinti_v , FSimdVV , (0b0001111000100111110000, kHF_A, 0b0010111010100001100110, kHF_B) , kRWI_W , 0 , 9 , 1059), // #526
+ INST(Frintm_v , FSimdVV , (0b0001111000100101010000, kHF_A, 0b0000111000100001100110, kHF_B) , kRWI_W , 0 , 10 , 1066), // #527
+ INST(Frintn_v , FSimdVV , (0b0001111000100100010000, kHF_A, 0b0000111000100001100010, kHF_B) , kRWI_W , 0 , 11 , 1073), // #528
+ INST(Frintp_v , FSimdVV , (0b0001111000100100110000, kHF_A, 0b0000111010100001100010, kHF_B) , kRWI_W , 0 , 12 , 1080), // #529
+ INST(Frintx_v , FSimdVV , (0b0001111000100111010000, kHF_A, 0b0010111000100001100110, kHF_B) , kRWI_W , 0 , 13 , 1087), // #530
+ INST(Frintz_v , FSimdVV , (0b0001111000100101110000, kHF_A, 0b0000111010100001100110, kHF_B) , kRWI_W , 0 , 14 , 1094), // #531
+ INST(Frsqrte_v , FSimdVV , (0b0111111010100001110110, kHF_B, 0b0010111010100001110110, kHF_B) , kRWI_W , 0 , 15 , 1101), // #532
+ INST(Frsqrts_v , FSimdVVV , (0b0101111010100000111111, kHF_C, 0b0000111010100000111111, kHF_C) , kRWI_W , 0 , 11 , 1109), // #533
+ INST(Fsqrt_v , FSimdVV , (0b0001111000100001110000, kHF_A, 0b0010111010100001111110, kHF_B) , kRWI_W , 0 , 16 , 1117), // #534
+ INST(Fsub_v , FSimdVVV , (0b0001111000100000001110, kHF_A, 0b0000111010100000110101, kHF_C) , kRWI_W , 0 , 12 , 1123), // #535
+ INST(Ins_v , SimdIns , (_) , kRWI_X , 0 , 0 , 1145), // #536
+ INST(Ld1_v , SimdLdNStN , (0b0000110101000000000000, 0b0000110001000000001000, 1, 0) , kRWI_LDn , F(Consecutive) , 0 , 1153), // #537
+ INST(Ld1r_v , SimdLdNStN , (0b0000110101000000110000, 0b0000000000000000000000, 1, 1) , kRWI_LDn , F(Consecutive) , 1 , 1157), // #538
+ INST(Ld2_v , SimdLdNStN , (0b0000110101100000000000, 0b0000110001000000100000, 2, 0) , kRWI_LDn , F(Consecutive) , 2 , 1162), // #539
+ INST(Ld2r_v , SimdLdNStN , (0b0000110101100000110000, 0b0000000000000000000000, 2, 1) , kRWI_LDn , F(Consecutive) , 3 , 1166), // #540
+ INST(Ld3_v , SimdLdNStN , (0b0000110101000000001000, 0b0000110001000000010000, 3, 0) , kRWI_LDn , F(Consecutive) , 4 , 1171), // #541
+ INST(Ld3r_v , SimdLdNStN , (0b0000110101000000111000, 0b0000000000000000000000, 3, 1) , kRWI_LDn , F(Consecutive) , 5 , 1175), // #542
+ INST(Ld4_v , SimdLdNStN , (0b0000110101100000001000, 0b0000110001000000000000, 4, 0) , kRWI_LDn , F(Consecutive) , 6 , 1180), // #543
+ INST(Ld4r_v , SimdLdNStN , (0b0000110101100000111000, 0b0000000000000000000000, 4, 1) , kRWI_LDn , F(Consecutive) , 7 , 1184), // #544
+ INST(Ldnp_v , SimdLdpStp , (0b0010110001, 0b0000000000) , kRWI_WW , 0 , 0 , 1537), // #545
+ INST(Ldp_v , SimdLdpStp , (0b0010110101, 0b0010110011) , kRWI_WW , 0 , 1 , 1542), // #546
+ INST(Ldr_v , SimdLdSt , (0b0011110101, 0b00111100010, 0b00111100011, 0b00011100, Inst::kIdLdur_v) , kRWI_W , 0 , 0 , 1552), // #547
+ INST(Ldur_v , SimdLdurStur , (0b0011110001000000000000) , kRWI_W , 0 , 0 , 2142), // #548
+ INST(Mla_v , ISimdVVVe , (0b0000111000100000100101, kVO_V_BHS, 0b0010111100000000000000, kVO_V_HS) , kRWI_X , F(VH0_15) , 0 , 246 ), // #549
+ INST(Mls_v , ISimdVVVe , (0b0010111000100000100101, kVO_V_BHS, 0b0010111100000000010000, kVO_V_HS) , kRWI_X , F(VH0_15) , 1 , 931 ), // #550
+ INST(Mov_v , SimdMov , (_) , kRWI_W , 0 , 0 , 949 ), // #551
+ INST(Movi_v , SimdMoviMvni , (0b0000111100000000000001, 0) , kRWI_W , 0 , 0 , 2221), // #552
+ INST(Mul_v , ISimdVVVe , (0b0000111000100000100111, kVO_V_BHS, 0b0000111100000000100000, kVO_V_HS) , kRWI_W , F(VH0_15) , 2 , 991 ), // #553
+ INST(Mvn_v , ISimdVV , (0b0010111000100000010110, kVO_V_B) , kRWI_W , 0 , 4 , 2249), // #554
+ INST(Mvni_v , SimdMoviMvni , (0b0000111100000000000001, 1) , kRWI_W , 0 , 1 , 2253), // #555
+ INST(Neg_v , ISimdVV , (0b0010111000100000101110, kVO_V_Any) , kRWI_W , 0 , 5 , 540 ), // #556
+ INST(Not_v , ISimdVV , (0b0010111000100000010110, kVO_V_B) , kRWI_W , 0 , 6 , 2276), // #557
+ INST(Orn_v , ISimdVVV , (0b0000111011100000000111, kVO_V_B) , kRWI_W , 0 , 9 , 2280), // #558
+ INST(Orr_v , SimdBicOrr , (0b0000111010100000000111, 0b0000111100000000000001) , kRWI_W , 0 , 1 , 2284), // #559
+ INST(Pmul_v , ISimdVVV , (0b0010111000100000100111, kVO_V_B) , kRWI_W , 0 , 10 , 2320), // #560
+ INST(Pmull_v , ISimdVVV , (0b0000111000100000111000, kVO_V_B8D1) , kRWI_W , F(Long) , 11 , 2325), // #561
+ INST(Pmull2_v , ISimdVVV , (0b0100111000100000111000, kVO_V_B16D2) , kRWI_W , F(Long) , 12 , 2331), // #562
+ INST(Raddhn_v , ISimdVVV , (0b0010111000100000010000, kVO_V_B8H4S2) , kRWI_W , F(Narrow) , 13 , 2344), // #563
+ INST(Raddhn2_v , ISimdVVV , (0b0110111000100000010000, kVO_V_B16H8S4) , kRWI_X , F(Narrow) , 14 , 2351), // #564
+ INST(Rax1_v , ISimdVVV , (0b1100111001100000100011, kVO_V_D2) , kRWI_W , 0 , 15 , 2359), // #565
+ INST(Rbit_v , ISimdVV , (0b0010111001100000010110, kVO_V_B) , kRWI_W , 0 , 7 , 2364), // #566
+ INST(Rev16_v , ISimdVV , (0b0000111000100000000110, kVO_V_B) , kRWI_W , 0 , 8 , 2373), // #567
+ INST(Rev32_v , ISimdVV , (0b0010111000100000000010, kVO_V_BH) , kRWI_W , 0 , 9 , 2379), // #568
+ INST(Rev64_v , ISimdVV , (0b0000111000100000000010, kVO_V_BHS) , kRWI_W , 0 , 10 , 2385), // #569
+ INST(Rshrn_v , SimdShift , (0b0000000000000000000000, 0b0000111100000000100011, 1, kVO_V_B8H4S2) , kRWI_W , F(Narrow) , 0 , 2960), // #570
+ INST(Rshrn2_v , SimdShift , (0b0000000000000000000000, 0b0100111100000000100011, 1, kVO_V_B16H8S4) , kRWI_X , F(Narrow) , 1 , 2968), // #571
+ INST(Rsubhn_v , ISimdVVV , (0b0010111000100000011000, kVO_V_B8H4S2) , kRWI_W , F(Narrow) , 16 , 2400), // #572
+ INST(Rsubhn2_v , ISimdVVV , (0b0110111000100000011000, kVO_V_B16H8S4) , kRWI_X , F(Narrow) , 17 , 2407), // #573
+ INST(Saba_v , ISimdVVV , (0b0000111000100000011111, kVO_V_BHS) , kRWI_X , 0 , 18 , 2415), // #574
+ INST(Sabal_v , ISimdVVV , (0b0000111000100000010100, kVO_V_B8H4S2) , kRWI_X , F(Long) , 19 , 2420), // #575
+ INST(Sabal2_v , ISimdVVV , (0b0100111000100000010100, kVO_V_B16H8S4) , kRWI_X , F(Long) , 20 , 2426), // #576
+ INST(Sabd_v , ISimdVVV , (0b0000111000100000011101, kVO_V_BHS) , kRWI_W , 0 , 21 , 2433), // #577
+ INST(Sabdl_v , ISimdVVV , (0b0000111000100000011100, kVO_V_B8H4S2) , kRWI_W , F(Long) , 22 , 2438), // #578
+ INST(Sabdl2_v , ISimdVVV , (0b0100111000100000011100, kVO_V_B16H8S4) , kRWI_W , F(Long) , 23 , 2444), // #579
+ INST(Sadalp_v , ISimdVV , (0b0000111000100000011010, kVO_V_BHS) , kRWI_X , F(Long) | F(Pair) , 11 , 2451), // #580
+ INST(Saddl_v , ISimdVVV , (0b0000111000100000000000, kVO_V_B8H4S2) , kRWI_W , F(Long) , 24 , 2458), // #581
+ INST(Saddl2_v , ISimdVVV , (0b0100111000100000000000, kVO_V_B16H8S4) , kRWI_W , F(Long) , 25 , 2464), // #582
+ INST(Saddlp_v , ISimdVV , (0b0000111000100000001010, kVO_V_BHS) , kRWI_W , F(Long) | F(Pair) , 12 , 2471), // #583
+ INST(Saddlv_v , ISimdSV , (0b0000111000110000001110, kVO_V_BH_4S) , kRWI_W , F(Long) , 1 , 2478), // #584
+ INST(Saddw_v , ISimdWWV , (0b0000111000100000000100, kVO_V_B8H4S2) , kRWI_W , 0 , 0 , 2485), // #585
+ INST(Saddw2_v , ISimdWWV , (0b0000111000100000000100, kVO_V_B16H8S4) , kRWI_W , 0 , 1 , 2491), // #586
+ INST(Scvtf_v , SimdFcvtSV , (0b0000111000100001110110, 0b0000111100000000111001, 0b0001111000100010000000, 0) , kRWI_W , 0 , 10 , 2523), // #587
+ INST(Sdot_v , SimdDot , (0b0000111010000000100101, 0b0000111110000000111000, kET_S, kET_B, kET_4B) , kRWI_X , 0 , 1 , 4218), // #588
+ INST(Sha1c_v , ISimdVVVx , (0b0101111000000000000000, kOp_Q, kOp_S, kOp_V4S) , kRWI_X , 0 , 1 , 2556), // #589
+ INST(Sha1h_v , ISimdVVx , (0b0101111000101000000010, kOp_S, kOp_S) , kRWI_W , 0 , 8 , 2562), // #590
+ INST(Sha1m_v , ISimdVVVx , (0b0101111000000000001000, kOp_Q, kOp_S, kOp_V4S) , kRWI_X , 0 , 2 , 2568), // #591
+ INST(Sha1p_v , ISimdVVVx , (0b0101111000000000000100, kOp_Q, kOp_S, kOp_V4S) , kRWI_X , 0 , 3 , 2574), // #592
+ INST(Sha1su0_v , ISimdVVVx , (0b0101111000000000001100, kOp_V4S, kOp_V4S, kOp_V4S) , kRWI_X , 0 , 4 , 2580), // #593
+ INST(Sha1su1_v , ISimdVVx , (0b0101111000101000000110, kOp_V4S, kOp_V4S) , kRWI_X , 0 , 9 , 2588), // #594
+ INST(Sha256h_v , ISimdVVVx , (0b0101111000000000010000, kOp_Q, kOp_Q, kOp_V4S) , kRWI_X , 0 , 5 , 2596), // #595
+ INST(Sha256h2_v , ISimdVVVx , (0b0101111000000000010100, kOp_Q, kOp_Q, kOp_V4S) , kRWI_X , 0 , 6 , 2604), // #596
+ INST(Sha256su0_v , ISimdVVx , (0b0101111000101000001010, kOp_V4S, kOp_V4S) , kRWI_X , 0 , 10 , 2613), // #597
+ INST(Sha256su1_v , ISimdVVVx , (0b0101111000000000011000, kOp_V4S, kOp_V4S, kOp_V4S) , kRWI_X , 0 , 7 , 2623), // #598
+ INST(Sha512h_v , ISimdVVVx , (0b1100111001100000100000, kOp_Q, kOp_Q, kOp_V2D) , kRWI_X , 0 , 8 , 2633), // #599
+ INST(Sha512h2_v , ISimdVVVx , (0b1100111001100000100001, kOp_Q, kOp_Q, kOp_V2D) , kRWI_X , 0 , 9 , 2641), // #600
+ INST(Sha512su0_v , ISimdVVx , (0b1100111011000000100000, kOp_V2D, kOp_V2D) , kRWI_X , 0 , 11 , 2650), // #601
+ INST(Sha512su1_v , ISimdVVVx , (0b1100111001100000100010, kOp_V2D, kOp_V2D, kOp_V2D) , kRWI_X , 0 , 10 , 2660), // #602
+ INST(Shadd_v , ISimdVVV , (0b0000111000100000000001, kVO_V_BHS) , kRWI_W , 0 , 26 , 2670), // #603
+ INST(Shl_v , SimdShift , (0b0000000000000000000000, 0b0000111100000000010101, 0, kVO_V_Any) , kRWI_W , 0 , 2 , 2954), // #604
+ INST(Shll_v , SimdShiftES , (0b0010111000100001001110, kVO_V_B8H4S2) , kRWI_W , F(Long) , 0 , 3108), // #605
+ INST(Shll2_v , SimdShiftES , (0b0110111000100001001110, kVO_V_B16H8S4) , kRWI_W , F(Long) , 1 , 3114), // #606
+ INST(Shrn_v , SimdShift , (0b0000000000000000000000, 0b0000111100000000100001, 1, kVO_V_B8H4S2) , kRWI_W , F(Narrow) , 3 , 2961), // #607
+ INST(Shrn2_v , SimdShift , (0b0000000000000000000000, 0b0100111100000000100001, 1, kVO_V_B16H8S4) , kRWI_X , F(Narrow) , 4 , 2969), // #608
+ INST(Shsub_v , ISimdVVV , (0b0000111000100000001001, kVO_V_BHS) , kRWI_W , 0 , 27 , 2676), // #609
+ INST(Sli_v , SimdShift , (0b0000000000000000000000, 0b0010111100000000010101, 0, kVO_V_Any) , kRWI_X , 0 , 5 , 2682), // #610
+ INST(Sm3partw1_v , ISimdVVVx , (0b1100111001100000110000, kOp_V4S, kOp_V4S, kOp_V4S) , kRWI_X , 0 , 11 , 2686), // #611
+ INST(Sm3partw2_v , ISimdVVVx , (0b1100111001100000110001, kOp_V4S, kOp_V4S, kOp_V4S) , kRWI_X , 0 , 12 , 2696), // #612
+ INST(Sm3ss1_v , ISimdVVVVx , (0b1100111001000000000000, kOp_V4S, kOp_V4S, kOp_V4S, kOp_V4S) , kRWI_W , 0 , 0 , 2706), // #613
+ INST(Sm3tt1a_v , SimdSm3tt , (0b1100111001000000100000) , kRWI_X , 0 , 0 , 2713), // #614
+ INST(Sm3tt1b_v , SimdSm3tt , (0b1100111001000000100001) , kRWI_X , 0 , 1 , 2721), // #615
+ INST(Sm3tt2a_v , SimdSm3tt , (0b1100111001000000100010) , kRWI_X , 0 , 2 , 2729), // #616
+ INST(Sm3tt2b_v , SimdSm3tt , (0b1100111001000000100011) , kRWI_X , 0 , 3 , 2737), // #617
+ INST(Sm4e_v , ISimdVVx , (0b1100111011000000100001, kOp_V4S, kOp_V4S) , kRWI_X , 0 , 12 , 2745), // #618
+ INST(Sm4ekey_v , ISimdVVVx , (0b1100111001100000110010, kOp_V4S, kOp_V4S, kOp_V4S) , kRWI_X , 0 , 13 , 2750), // #619
+ INST(Smax_v , ISimdVVV , (0b0000111000100000011001, kVO_V_BHS) , kRWI_W , 0 , 28 , 1690), // #620
+ INST(Smaxp_v , ISimdVVV , (0b0000111000100000101001, kVO_V_BHS) , kRWI_W , 0 , 29 , 2765), // #621
+ INST(Smaxv_v , ISimdSV , (0b0000111000110000101010, kVO_V_BH_4S) , kRWI_W , 0 , 2 , 2771), // #622
+ INST(Smin_v , ISimdVVV , (0b0000111000100000011011, kVO_V_BHS) , kRWI_W , 0 , 30 , 1794), // #623
+ INST(Sminp_v , ISimdVVV , (0b0000111000100000101011, kVO_V_BHS) , kRWI_W , 0 , 31 , 2777), // #624
+ INST(Sminv_v , ISimdSV , (0b0000111000110001101010, kVO_V_BH_4S) , kRWI_W , 0 , 3 , 2783), // #625
+ INST(Smlal_v , ISimdVVVe , (0b0000111000100000100000, kVO_V_B8H4S2, 0b0000111100000000001000, kVO_V_H4S2) , kRWI_X , F(Long) | F(VH0_15) , 3 , 2789), // #626
+ INST(Smlal2_v , ISimdVVVe , (0b0100111000100000100000, kVO_V_B16H8S4, 0b0100111100000000001000, kVO_V_H8S4) , kRWI_X , F(Long) | F(VH0_15) , 4 , 2795), // #627
+ INST(Smlsl_v , ISimdVVVe , (0b0000111000100000101000, kVO_V_B8H4S2, 0b0000111100000000011000, kVO_V_H4S2) , kRWI_X , F(Long) | F(VH0_15) , 5 , 2802), // #628
+ INST(Smlsl2_v , ISimdVVVe , (0b0100111000100000101000, kVO_V_B16H8S4, 0b0100111100000000011000, kVO_V_H8S4) , kRWI_X , F(Long) | F(VH0_15) , 6 , 2808), // #629
+ INST(Smmla_v , ISimdVVVx , (0b0100111010000000101001, kOp_V4S, kOp_V16B, kOp_V16B) , kRWI_X , 0 , 14 , 4247), // #630
+ INST(Smov_v , SimdSmovUmov , (0b0000111000000000001011, kVO_V_BHS, 1) , kRWI_W , 0 , 0 , 2822), // #631
+ INST(Smull_v , ISimdVVVe , (0b0000111000100000110000, kVO_V_B8H4S2, 0b0000111100000000101000, kVO_V_H4S2) , kRWI_W , F(Long) | F(VH0_15) , 7 , 2840), // #632
+ INST(Smull2_v , ISimdVVVe , (0b0100111000100000110000, kVO_V_B16H8S4, 0b0100111100000000101000, kVO_V_H8S4) , kRWI_W , F(Long) | F(VH0_15) , 8 , 2846), // #633
+ INST(Sqabs_v , ISimdVV , (0b0000111000100000011110, kVO_SV_Any) , kRWI_W , 0 , 13 , 2853), // #634
+ INST(Sqadd_v , ISimdVVV , (0b0000111000100000000011, kVO_SV_Any) , kRWI_W , 0 , 32 , 4254), // #635
+ INST(Sqdmlal_v , ISimdVVVe , (0b0000111000100000100100, kVO_SV_BHS, 0b0000111100000000001100, kVO_V_H4S2) , kRWI_X , F(Long) | F(VH0_15) , 9 , 2859), // #636
+ INST(Sqdmlal2_v , ISimdVVVe , (0b0100111000100000100100, kVO_V_B16H8S4, 0b0100111100000000001100, kVO_V_H8S4) , kRWI_X , F(Long) | F(VH0_15) , 10 , 2867), // #637
+ INST(Sqdmlsl_v , ISimdVVVe , (0b0000111000100000101100, kVO_SV_BHS, 0b0000111100000000011100, kVO_V_H4S2) , kRWI_X , F(Long) | F(VH0_15) , 11 , 2876), // #638
+ INST(Sqdmlsl2_v , ISimdVVVe , (0b0100111000100000101100, kVO_V_B16H8S4, 0b0100111100000000011100, kVO_V_H8S4) , kRWI_X , F(Long) | F(VH0_15) , 12 , 2884), // #639
+ INST(Sqdmulh_v , ISimdVVVe , (0b0000111000100000101101, kVO_SV_HS, 0b0000111100000000110000, kVO_SV_HS) , kRWI_W , F(VH0_15) , 13 , 2893), // #640
+ INST(Sqdmull_v , ISimdVVVe , (0b0000111000100000110100, kVO_SV_BHS, 0b0000111100000000101100, kVO_V_H4S2) , kRWI_W , F(Long) | F(VH0_15) , 14 , 2901), // #641
+ INST(Sqdmull2_v , ISimdVVVe , (0b0100111000100000110100, kVO_V_B16H8S4, 0b0100111100000000101100, kVO_V_H8S4) , kRWI_W , F(Long) | F(VH0_15) , 15 , 2909), // #642
+ INST(Sqneg_v , ISimdVV , (0b0010111000100000011110, kVO_SV_Any) , kRWI_W , 0 , 14 , 2918), // #643
+ INST(Sqrdmlah_v , ISimdVVVe , (0b0010111000000000100001, kVO_SV_HS, 0b0010111100000000110100, kVO_SV_HS) , kRWI_X , F(VH0_15) , 16 , 2924), // #644
+ INST(Sqrdmlsh_v , ISimdVVVe , (0b0010111000000000100011, kVO_SV_HS, 0b0010111100000000111100, kVO_SV_HS) , kRWI_X , F(VH0_15) , 17 , 2933), // #645
+ INST(Sqrdmulh_v , ISimdVVVe , (0b0010111000100000101101, kVO_SV_HS, 0b0000111100000000110100, kVO_SV_HS) , kRWI_W , F(VH0_15) , 18 , 2942), // #646
+ INST(Sqrshl_v , SimdShift , (0b0000111000100000010111, 0b0000000000000000000000, 1, kVO_SV_Any) , kRWI_W , 0 , 6 , 2951), // #647
+ INST(Sqrshrn_v , SimdShift , (0b0000000000000000000000, 0b0000111100000000100111, 1, kVO_SV_B8H4S2) , kRWI_W , F(Narrow) , 7 , 2958), // #648
+ INST(Sqrshrn2_v , SimdShift , (0b0000000000000000000000, 0b0100111100000000100111, 1, kVO_V_B16H8S4) , kRWI_X , F(Narrow) , 8 , 2966), // #649
+ INST(Sqrshrun_v , SimdShift , (0b0000000000000000000000, 0b0010111100000000100011, 1, kVO_SV_B8H4S2) , kRWI_W , F(Narrow) , 9 , 2975), // #650
+ INST(Sqrshrun2_v , SimdShift , (0b0000000000000000000000, 0b0110111100000000100011, 1, kVO_V_B16H8S4) , kRWI_X , F(Narrow) , 10 , 2984), // #651
+ INST(Sqshl_v , SimdShift , (0b0000111000100000010011, 0b0000111100000000011101, 0, kVO_SV_Any) , kRWI_W , 0 , 11 , 2994), // #652
+ INST(Sqshlu_v , SimdShift , (0b0000000000000000000000, 0b0010111100000000011001, 0, kVO_SV_Any) , kRWI_W , 0 , 12 , 3000), // #653
+ INST(Sqshrn_v , SimdShift , (0b0000000000000000000000, 0b0000111100000000100101, 1, kVO_SV_B8H4S2) , kRWI_W , F(Narrow) , 13 , 3007), // #654
+ INST(Sqshrn2_v , SimdShift , (0b0000000000000000000000, 0b0100111100000000100101, 1, kVO_V_B16H8S4) , kRWI_X , F(Narrow) , 14 , 3014), // #655
+ INST(Sqshrun_v , SimdShift , (0b0000000000000000000000, 0b0010111100000000100001, 1, kVO_SV_B8H4S2) , kRWI_W , F(Narrow) , 15 , 3022), // #656
+ INST(Sqshrun2_v , SimdShift , (0b0000000000000000000000, 0b0110111100000000100001, 1, kVO_V_B16H8S4) , kRWI_X , F(Narrow) , 16 , 3030), // #657
+ INST(Sqsub_v , ISimdVVV , (0b0000111000100000001011, kVO_SV_Any) , kRWI_W , 0 , 33 , 3039), // #658
+ INST(Sqxtn_v , ISimdVV , (0b0000111000100001010010, kVO_SV_B8H4S2) , kRWI_W , F(Narrow) , 15 , 3045), // #659
+ INST(Sqxtn2_v , ISimdVV , (0b0100111000100001010010, kVO_V_B16H8S4) , kRWI_X , F(Narrow) , 16 , 3051), // #660
+ INST(Sqxtun_v , ISimdVV , (0b0010111000100001001010, kVO_SV_B8H4S2) , kRWI_W , F(Narrow) , 17 , 3058), // #661
+ INST(Sqxtun2_v , ISimdVV , (0b0110111000100001001010, kVO_V_B16H8S4) , kRWI_X , F(Narrow) , 18 , 3065), // #662
+ INST(Srhadd_v , ISimdVVV , (0b0000111000100000000101, kVO_V_BHS) , kRWI_W , 0 , 34 , 3073), // #663
+ INST(Sri_v , SimdShift , (0b0000000000000000000000, 0b0010111100000000010001, 1, kVO_V_Any) , kRWI_W , 0 , 17 , 3080), // #664
+ INST(Srshl_v , SimdShift , (0b0000111000100000010101, 0b0000000000000000000000, 0, kVO_V_Any) , kRWI_W , 0 , 18 , 3084), // #665
+ INST(Srshr_v , SimdShift , (0b0000000000000000000000, 0b0000111100000000001001, 1, kVO_V_Any) , kRWI_W , 0 , 19 , 3090), // #666
+ INST(Srsra_v , SimdShift , (0b0000000000000000000000, 0b0000111100000000001101, 1, kVO_V_Any) , kRWI_X , 0 , 20 , 3096), // #667
+ INST(Sshl_v , SimdShift , (0b0000111000100000010001, 0b0000000000000000000000, 0, kVO_V_Any) , kRWI_W , 0 , 21 , 3102), // #668
+ INST(Sshll_v , SimdShift , (0b0000000000000000000000, 0b0000111100000000101001, 0, kVO_V_B8H4S2) , kRWI_W , F(Long) , 22 , 3107), // #669
+ INST(Sshll2_v , SimdShift , (0b0000000000000000000000, 0b0100111100000000101001, 0, kVO_V_B16H8S4) , kRWI_W , F(Long) , 23 , 3113), // #670
+ INST(Sshr_v , SimdShift , (0b0000000000000000000000, 0b0000111100000000000001, 1, kVO_V_Any) , kRWI_W , 0 , 24 , 3120), // #671
+ INST(Ssra_v , SimdShift , (0b0000000000000000000000, 0b0000111100000000000101, 1, kVO_V_Any) , kRWI_X , 0 , 25 , 3125), // #672
+ INST(Ssubl_v , ISimdVVV , (0b0000111000100000001000, kVO_V_B8H4S2) , kRWI_W , F(Long) , 35 , 3130), // #673
+ INST(Ssubl2_v , ISimdVVV , (0b0100111000100000001000, kVO_V_B16H8S4) , kRWI_W , F(Long) , 36 , 3136), // #674
+ INST(Ssubw_v , ISimdWWV , (0b0000111000100000001100, kVO_V_B8H4S2) , kRWI_W , 0 , 2 , 3143), // #675
+ INST(Ssubw2_v , ISimdWWV , (0b0000111000100000001100, kVO_V_B16H8S4) , kRWI_X , 0 , 3 , 3149), // #676
+ INST(St1_v , SimdLdNStN , (0b0000110100000000000000, 0b0000110000000000001000, 1, 0) , kRWI_STn , F(Consecutive) , 8 , 3156), // #677
+ INST(St2_v , SimdLdNStN , (0b0000110100100000000000, 0b0000110000000000100000, 2, 0) , kRWI_STn , F(Consecutive) , 9 , 3160), // #678
+ INST(St3_v , SimdLdNStN , (0b0000110100000000001000, 0b0000110000000000010000, 3, 0) , kRWI_STn , F(Consecutive) , 10 , 3169), // #679
+ INST(St4_v , SimdLdNStN , (0b0000110100100000001000, 0b0000110000000000000000, 4, 0) , kRWI_STn , F(Consecutive) , 11 , 3173), // #680
+ INST(Stnp_v , SimdLdpStp , (0b0010110000, 0b0000000000) , kRWI_RRW , 0 , 2 , 3383), // #681
+ INST(Stp_v , SimdLdpStp , (0b0010110100, 0b0010110010) , kRWI_RRW , 0 , 3 , 3388), // #682
+ INST(Str_v , SimdLdSt , (0b0011110100, 0b00111100000, 0b00111100001, 0b00000000, Inst::kIdStur_v) , kRWI_RW , 0 , 1 , 3392), // #683
+ INST(Stur_v , SimdLdurStur , (0b0011110000000000000000) , kRWI_RW , 0 , 1 , 3662), // #684
+ INST(Sub_v , ISimdVVV , (0b0010111000100000100001, kVO_V_Any) , kRWI_W , 0 , 37 , 985 ), // #685
+ INST(Subhn_v , ISimdVVV , (0b0000111000100000011000, kVO_V_B8H4S2) , kRWI_W , F(Narrow) , 38 , 2401), // #686
+ INST(Subhn2_v , ISimdVVV , (0b0000111000100000011000, kVO_V_B16H8S4) , kRWI_X , F(Narrow) , 39 , 2408), // #687
+ INST(Sudot_v , SimdDot , (0b0000000000000000000000, 0b0000111100000000111100, kET_S, kET_B, kET_4B) , kRWI_X , 0 , 2 , 3739), // #688
+ INST(Suqadd_v , ISimdVV , (0b0000111000100000001110, kVO_SV_Any) , kRWI_X , 0 , 19 , 3745), // #689
+ INST(Sxtl_v , SimdSxtlUxtl , (0b0000111100000000101001, kVO_V_B8H4S2) , kRWI_W , F(Long) , 0 , 3834), // #690
+ INST(Sxtl2_v , SimdSxtlUxtl , (0b0100111100000000101001, kVO_V_B16H8S4) , kRWI_W , F(Long) , 1 , 3839), // #691
+ INST(Tbl_v , SimdTblTbx , (0b0000111000000000000000) , kRWI_W , 0 , 0 , 3854), // #692
+ INST(Tbx_v , SimdTblTbx , (0b0000111000000000000100) , kRWI_W , 0 , 1 , 3863), // #693
+ INST(Trn1_v , ISimdVVV , (0b0000111000000000001010, kVO_V_BHS_D2) , kRWI_W , 0 , 40 , 3876), // #694
+ INST(Trn2_v , ISimdVVV , (0b0000111000000000011010, kVO_V_BHS_D2) , kRWI_W , 0 , 41 , 3881), // #695
+ INST(Uaba_v , ISimdVVV , (0b0010111000100000011111, kVO_V_BHS) , kRWI_X , 0 , 42 , 3886), // #696
+ INST(Uabal_v , ISimdVVV , (0b0010111000100000010100, kVO_V_B8H4S2) , kRWI_X , F(Long) , 43 , 3891), // #697
+ INST(Uabal2_v , ISimdVVV , (0b0110111000100000010100, kVO_V_B16H8S4) , kRWI_X , F(Long) , 44 , 3897), // #698
+ INST(Uabd_v , ISimdVVV , (0b0010111000100000011101, kVO_V_BHS) , kRWI_W , 0 , 45 , 3904), // #699
+ INST(Uabdl_v , ISimdVVV , (0b0010111000100000011100, kVO_V_B8H4S2) , kRWI_W , F(Long) , 46 , 3909), // #700
+ INST(Uabdl2_v , ISimdVVV , (0b0110111000100000011100, kVO_V_B16H8S4) , kRWI_W , F(Long) , 47 , 3915), // #701
+ INST(Uadalp_v , ISimdVV , (0b0010111000100000011010, kVO_V_BHS) , kRWI_X , F(Long) | F(Pair) , 20 , 3922), // #702
+ INST(Uaddl_v , ISimdVVV , (0b0010111000100000000000, kVO_V_B8H4S2) , kRWI_W , F(Long) , 48 , 3929), // #703
+ INST(Uaddl2_v , ISimdVVV , (0b0110111000100000000000, kVO_V_B16H8S4) , kRWI_W , F(Long) , 49 , 3935), // #704
+ INST(Uaddlp_v , ISimdVV , (0b0010111000100000001010, kVO_V_BHS) , kRWI_W , F(Long) | F(Pair) , 21 , 3942), // #705
+ INST(Uaddlv_v , ISimdSV , (0b0010111000110000001110, kVO_V_BH_4S) , kRWI_W , F(Long) , 4 , 3949), // #706
+ INST(Uaddw_v , ISimdWWV , (0b0010111000100000000100, kVO_V_B8H4S2) , kRWI_W , 0 , 4 , 3956), // #707
+ INST(Uaddw2_v , ISimdWWV , (0b0010111000100000000100, kVO_V_B16H8S4) , kRWI_W , 0 , 5 , 3962), // #708
+ INST(Ucvtf_v , SimdFcvtSV , (0b0010111000100001110110, 0b0010111100000000111001, 0b0001111000100011000000, 0) , kRWI_W , 0 , 11 , 3985), // #709
+ INST(Udot_v , SimdDot , (0b0010111010000000100101, 0b0010111110000000111000, kET_S, kET_B, kET_4B) , kRWI_X , 0 , 3 , 3740), // #710
+ INST(Uhadd_v , ISimdVVV , (0b0010111000100000000001, kVO_V_BHS) , kRWI_W , 0 , 50 , 4000), // #711
+ INST(Uhsub_v , ISimdVVV , (0b0010111000100000001001, kVO_V_BHS) , kRWI_W , 0 , 51 , 4006), // #712
+ INST(Umax_v , ISimdVVV , (0b0010111000100000011001, kVO_V_BHS) , kRWI_W , 0 , 52 , 1936), // #713
+ INST(Umaxp_v , ISimdVVV , (0b0010111000100000101001, kVO_V_BHS) , kRWI_W , 0 , 53 , 4019), // #714
+ INST(Umaxv_v , ISimdSV , (0b0010111000110000101010, kVO_V_BH_4S) , kRWI_W , 0 , 5 , 4025), // #715
+ INST(Umin_v , ISimdVVV , (0b0010111000100000011011, kVO_V_BHS) , kRWI_W , 0 , 54 , 2040), // #716
+ INST(Uminp_v , ISimdVVV , (0b0010111000100000101011, kVO_V_BHS) , kRWI_W , 0 , 55 , 4031), // #717
+ INST(Uminv_v , ISimdSV , (0b0010111000110001101010, kVO_V_BH_4S) , kRWI_W , 0 , 6 , 4037), // #718
+ INST(Umlal_v , ISimdVVVe , (0b0010111000100000100000, kVO_V_B8H4S2, 0b0010111100000000001000, kVO_V_H4S2) , kRWI_X , F(Long) | F(VH0_15) , 19 , 4043), // #719
+ INST(Umlal2_v , ISimdVVVe , (0b0110111000100000100000, kVO_V_B16H8S4, 0b0010111100000000001000, kVO_V_H8S4) , kRWI_X , F(Long) | F(VH0_15) , 20 , 4049), // #720
+ INST(Umlsl_v , ISimdVVVe , (0b0010111000100000101000, kVO_V_B8H4S2, 0b0010111100000000011000, kVO_V_H4S2) , kRWI_X , F(Long) | F(VH0_15) , 21 , 4056), // #721
+ INST(Umlsl2_v , ISimdVVVe , (0b0110111000100000101000, kVO_V_B16H8S4, 0b0110111100000000011000, kVO_V_H8S4) , kRWI_X , F(Long) | F(VH0_15) , 22 , 4062), // #722
+ INST(Ummla_v , ISimdVVVx , (0b0110111010000000101001, kOp_V4S, kOp_V16B, kOp_V16B) , kRWI_X , 0 , 15 , 4069), // #723
+ INST(Umov_v , SimdSmovUmov , (0b0000111000000000001111, kVO_V_Any, 0) , kRWI_W , 0 , 1 , 4082), // #724
+ INST(Umull_v , ISimdVVVe , (0b0010111000100000110000, kVO_V_B8H4S2, 0b0010111100000000101000, kVO_V_H4S2) , kRWI_W , F(Long) | F(VH0_15) , 23 , 4100), // #725
+ INST(Umull2_v , ISimdVVVe , (0b0110111000100000110000, kVO_V_B16H8S4, 0b0110111100000000101000, kVO_V_H8S4) , kRWI_W , F(Long) | F(VH0_15) , 24 , 4106), // #726
+ INST(Uqadd_v , ISimdVVV , (0b0010111000100000000011, kVO_SV_Any) , kRWI_W , 0 , 56 , 3746), // #727
+ INST(Uqrshl_v , SimdShift , (0b0010111000100000010111, 0b0000000000000000000000, 0, kVO_SV_Any) , kRWI_W , 0 , 26 , 4113), // #728
+ INST(Uqrshrn_v , SimdShift , (0b0000000000000000000000, 0b0010111100000000100111, 1, kVO_SV_B8H4S2) , kRWI_W , F(Narrow) , 27 , 4120), // #729
+ INST(Uqrshrn2_v , SimdShift , (0b0000000000000000000000, 0b0110111100000000100111, 1, kVO_V_B16H8S4) , kRWI_X , F(Narrow) , 28 , 4128), // #730
+ INST(Uqshl_v , SimdShift , (0b0010111000100000010011, 0b0010111100000000011101, 0, kVO_SV_Any) , kRWI_W , 0 , 29 , 4137), // #731
+ INST(Uqshrn_v , SimdShift , (0b0000000000000000000000, 0b0010111100000000100101, 1, kVO_SV_B8H4S2) , kRWI_W , F(Narrow) , 30 , 4143), // #732
+ INST(Uqshrn2_v , SimdShift , (0b0000000000000000000000, 0b0110111100000000100101, 1, kVO_V_B16H8S4) , kRWI_X , F(Narrow) , 31 , 4150), // #733
+ INST(Uqsub_v , ISimdVVV , (0b0010111000100000001011, kVO_SV_Any) , kRWI_W , 0 , 57 , 4158), // #734
+ INST(Uqxtn_v , ISimdVV , (0b0010111000100001010010, kVO_SV_B8H4S2) , kRWI_W , F(Narrow) , 22 , 4164), // #735
+ INST(Uqxtn2_v , ISimdVV , (0b0110111000100001010010, kVO_V_B16H8S4) , kRWI_X , F(Narrow) , 23 , 4170), // #736
+ INST(Urecpe_v , ISimdVV , (0b0000111010100001110010, kVO_V_S) , kRWI_W , 0 , 24 , 4177), // #737
+ INST(Urhadd_v , ISimdVVV , (0b0010111000100000000101, kVO_V_BHS) , kRWI_W , 0 , 58 , 4184), // #738
+ INST(Urshl_v , SimdShift , (0b0010111000100000010101, 0b0000000000000000000000, 0, kVO_V_Any) , kRWI_W , 0 , 32 , 4191), // #739
+ INST(Urshr_v , SimdShift , (0b0000000000000000000000, 0b0010111100000000001001, 1, kVO_V_Any) , kRWI_W , 0 , 33 , 4197), // #740
+ INST(Ursqrte_v , ISimdVV , (0b0010111010100001110010, kVO_V_S) , kRWI_W , 0 , 25 , 4203), // #741
+ INST(Ursra_v , SimdShift , (0b0000000000000000000000, 0b0010111100000000001101, 1, kVO_V_Any) , kRWI_X , 0 , 34 , 4211), // #742
+ INST(Usdot_v , SimdDot , (0b0000111010000000100111, 0b0000111110000000111100, kET_S, kET_B, kET_4B) , kRWI_X , 0 , 4 , 4217), // #743
+ INST(Ushl_v , SimdShift , (0b0010111000100000010001, 0b0000000000000000000000, 0, kVO_V_Any) , kRWI_W , 0 , 35 , 4223), // #744
+ INST(Ushll_v , SimdShift , (0b0000000000000000000000, 0b0010111100000000101001, 0, kVO_V_B8H4S2) , kRWI_W , F(Long) , 36 , 4228), // #745
+ INST(Ushll2_v , SimdShift , (0b0000000000000000000000, 0b0110111100000000101001, 0, kVO_V_B16H8S4) , kRWI_W , F(Long) , 37 , 4234), // #746
+ INST(Ushr_v , SimdShift , (0b0000000000000000000000, 0b0010111100000000000001, 1, kVO_V_Any) , kRWI_W , 0 , 38 , 4241), // #747
+ INST(Usmmla_v , ISimdVVVx , (0b0100111010000000101011, kOp_V4S, kOp_V16B, kOp_V16B) , kRWI_X , 0 , 16 , 4246), // #748
+ INST(Usqadd_v , ISimdVV , (0b0010111000100000001110, kVO_SV_Any) , kRWI_X , 0 , 26 , 4253), // #749
+ INST(Usra_v , SimdShift , (0b0000000000000000000000, 0b0010111100000000000101, 1, kVO_V_Any) , kRWI_X , 0 , 39 , 4260), // #750
+ INST(Usubl_v , ISimdVVV , (0b0010111000100000001000, kVO_V_B8H4S2) , kRWI_W , F(Long) , 59 , 4265), // #751
+ INST(Usubl2_v , ISimdVVV , (0b0110111000100000001000, kVO_V_B16H8S4) , kRWI_W , F(Long) , 60 , 4271), // #752
+ INST(Usubw_v , ISimdWWV , (0b0010111000100000001100, kVO_V_B8H4S2) , kRWI_W , 0 , 6 , 4278), // #753
+ INST(Usubw2_v , ISimdWWV , (0b0010111000100000001100, kVO_V_B16H8S4) , kRWI_W , 0 , 7 , 4284), // #754
+ INST(Uxtl_v , SimdSxtlUxtl , (0b0010111100000000101001, kVO_V_B8H4S2) , kRWI_W , F(Long) , 2 , 4301), // #755
+ INST(Uxtl2_v , SimdSxtlUxtl , (0b0110111100000000101001, kVO_V_B16H8S4) , kRWI_W , F(Long) , 3 , 4306), // #756
+ INST(Uzp1_v , ISimdVVV , (0b0000111000000000000110, kVO_V_BHS_D2) , kRWI_W , 0 , 61 , 4312), // #757
+ INST(Uzp2_v , ISimdVVV , (0b0000111000000000010110, kVO_V_BHS_D2) , kRWI_W , 0 , 62 , 4317), // #758
+ INST(Xar_v , ISimdVVVI , (0b1100111001100000100011, kVO_V_D2, 6, 10, 0) , kRWI_W , 0 , 1 , 4337), // #759
+ INST(Xtn_v , ISimdVV , (0b0000111000100001001010, kVO_V_B8H4S2) , kRWI_W , F(Narrow) , 27 , 3047), // #760
+ INST(Xtn2_v , ISimdVV , (0b0100111000100001001010, kVO_V_B16H8S4) , kRWI_X , F(Narrow) , 28 , 3053), // #761
+ INST(Zip1_v , ISimdVVV , (0b0000111000000000001110, kVO_V_BHS_D2) , kRWI_W , 0 , 63 , 4367), // #762
+ INST(Zip2_v , ISimdVVV , (0b0000111000000000011110, kVO_V_BHS_D2) , kRWI_W , 0 , 64 , 4372) // #763
+ // ${InstInfo:End}
+};
+
+#undef F
+#undef INST
+#undef NAME_DATA_INDEX
+
+namespace EncodingData {
+
+// ${EncodingData:Begin}
+// ------------------- Automatically generated, do not edit -------------------
+const BaseAddSub baseAddSub[4] = {
+ { 0b0001011000, 0b0001011001, 0b0010001 }, // add
+ { 0b0101011000, 0b0101011001, 0b0110001 }, // adds
+ { 0b1001011000, 0b1001011001, 0b1010001 }, // sub
+ { 0b1101011000, 0b1101011001, 0b1110001 } // subs
+};
+
+const BaseAdr baseAdr[2] = {
+ { 0b0001000000000000000000, OffsetType::kAArch64_ADR }, // adr
+ { 0b1001000000000000000000, OffsetType::kAArch64_ADRP } // adrp
+};
+
+const BaseAtDcIcTlbi baseAtDcIcTlbi[4] = {
+ { 0b00011111110000, 0b00001111000000, true }, // at
+ { 0b00011110000000, 0b00001110000000, true }, // dc
+ { 0b00011110000000, 0b00001110000000, false }, // ic
+ { 0b00011110000000, 0b00010000000000, false } // tlbi
+};
+
+const BaseAtomicCasp baseAtomicCasp[4] = {
+ { 0b0000100000100000011111, kWX, 30 }, // casp
+ { 0b0000100001100000011111, kWX, 30 }, // caspa
+ { 0b0000100001100000111111, kWX, 30 }, // caspal
+ { 0b0000100000100000111111, kWX, 30 } // caspl
+};
+
+const BaseAtomicOp baseAtomicOp[123] = {
+ { 0b1000100010100000011111, kWX, 30, 0 }, // cas
+ { 0b1000100011100000011111, kWX, 30, 1 }, // casa
+ { 0b0000100011100000011111, kW , 0 , 1 }, // casab
+ { 0b0100100011100000011111, kW , 0 , 1 }, // casah
+ { 0b1000100011100000111111, kWX, 30, 1 }, // casal
+ { 0b0000100011100000111111, kW , 0 , 1 }, // casalb
+ { 0b0100100011100000111111, kW , 0 , 1 }, // casalh
+ { 0b0000100010100000011111, kW , 0 , 0 }, // casb
+ { 0b0100100010100000011111, kW , 0 , 0 }, // cash
+ { 0b1000100010100000111111, kWX, 30, 0 }, // casl
+ { 0b0000100010100000111111, kW , 0 , 0 }, // caslb
+ { 0b0100100010100000111111, kW , 0 , 0 }, // caslh
+ { 0b1011100000100000000000, kWX, 30, 0 }, // ldadd
+ { 0b1011100010100000000000, kWX, 30, 1 }, // ldadda
+ { 0b0011100010100000000000, kW , 0 , 1 }, // ldaddab
+ { 0b0111100010100000000000, kW , 0 , 1 }, // ldaddah
+ { 0b1011100011100000000000, kWX, 30, 1 }, // ldaddal
+ { 0b0011100011100000000000, kW , 0 , 1 }, // ldaddalb
+ { 0b0111100011100000000000, kW , 0 , 1 }, // ldaddalh
+ { 0b0011100000100000000000, kW , 0 , 0 }, // ldaddb
+ { 0b0111100000100000000000, kW , 0 , 0 }, // ldaddh
+ { 0b1011100001100000000000, kWX, 30, 0 }, // ldaddl
+ { 0b0011100001100000000000, kW , 0 , 0 }, // ldaddlb
+ { 0b0111100001100000000000, kW , 0 , 0 }, // ldaddlh
+ { 0b1011100000100000000100, kWX, 30, 0 }, // ldclr
+ { 0b1011100010100000000100, kWX, 30, 1 }, // ldclra
+ { 0b0011100010100000000100, kW , 0 , 1 }, // ldclrab
+ { 0b0111100010100000000100, kW , 0 , 1 }, // ldclrah
+ { 0b1011100011100000000100, kWX, 30, 1 }, // ldclral
+ { 0b0011100011100000000100, kW , 0 , 1 }, // ldclralb
+ { 0b0111100011100000000100, kW , 0 , 1 }, // ldclralh
+ { 0b0011100000100000000100, kW , 0 , 0 }, // ldclrb
+ { 0b0111100000100000000100, kW , 0 , 0 }, // ldclrh
+ { 0b1011100001100000000100, kWX, 30, 0 }, // ldclrl
+ { 0b0011100001100000000100, kW , 0 , 0 }, // ldclrlb
+ { 0b0111100001100000000100, kW , 0 , 0 }, // ldclrlh
+ { 0b1011100000100000001000, kWX, 30, 0 }, // ldeor
+ { 0b1011100010100000001000, kWX, 30, 1 }, // ldeora
+ { 0b0011100010100000001000, kW , 0 , 1 }, // ldeorab
+ { 0b0111100010100000001000, kW , 0 , 1 }, // ldeorah
+ { 0b1011100011100000001000, kWX, 30, 1 }, // ldeoral
+ { 0b0011100011100000001000, kW , 0 , 1 }, // ldeoralb
+ { 0b0111100011100000001000, kW , 0 , 1 }, // ldeoralh
+ { 0b0011100000100000001000, kW , 0 , 0 }, // ldeorb
+ { 0b0111100000100000001000, kW , 0 , 0 }, // ldeorh
+ { 0b1011100001100000001000, kWX, 30, 0 }, // ldeorl
+ { 0b0011100001100000001000, kW , 0 , 0 }, // ldeorlb
+ { 0b0111100001100000001000, kW , 0 , 0 }, // ldeorlh
+ { 0b1011100000100000001100, kWX, 30, 0 }, // ldset
+ { 0b1011100010100000001100, kWX, 30, 1 }, // ldseta
+ { 0b0011100010100000001100, kW , 0 , 1 }, // ldsetab
+ { 0b0111100010100000001100, kW , 0 , 1 }, // ldsetah
+ { 0b1011100011100000001100, kWX, 30, 1 }, // ldsetal
+ { 0b0011100011100000001100, kW , 0 , 1 }, // ldsetalb
+ { 0b0111100011100000001100, kW , 0 , 1 }, // ldsetalh
+ { 0b0011100000100000001100, kW , 0 , 0 }, // ldsetb
+ { 0b0111100000100000001100, kW , 0 , 0 }, // ldseth
+ { 0b1011100001100000001100, kWX, 30, 0 }, // ldsetl
+ { 0b0011100001100000001100, kW , 0 , 0 }, // ldsetlb
+ { 0b0111100001100000001100, kW , 0 , 0 }, // ldsetlh
+ { 0b1011100000100000010000, kWX, 30, 0 }, // ldsmax
+ { 0b1011100010100000010000, kWX, 30, 1 }, // ldsmaxa
+ { 0b0011100010100000010000, kW , 0 , 1 }, // ldsmaxab
+ { 0b0111100010100000010000, kW , 0 , 1 }, // ldsmaxah
+ { 0b1011100011100000010000, kWX, 30, 1 }, // ldsmaxal
+ { 0b0011100011100000010000, kW , 0 , 1 }, // ldsmaxalb
+ { 0b0111100011100000010000, kW , 0 , 1 }, // ldsmaxalh
+ { 0b0011100000100000010000, kW , 0 , 0 }, // ldsmaxb
+ { 0b0111100000100000010000, kW , 0 , 0 }, // ldsmaxh
+ { 0b1011100001100000010000, kWX, 30, 0 }, // ldsmaxl
+ { 0b0011100001100000010000, kW , 0 , 0 }, // ldsmaxlb
+ { 0b0111100001100000010000, kW , 0 , 0 }, // ldsmaxlh
+ { 0b1011100000100000010100, kWX, 30, 0 }, // ldsmin
+ { 0b1011100010100000010100, kWX, 30, 1 }, // ldsmina
+ { 0b0011100010100000010100, kW , 0 , 1 }, // ldsminab
+ { 0b0111100010100000010100, kW , 0 , 1 }, // ldsminah
+ { 0b1011100011100000010100, kWX, 30, 1 }, // ldsminal
+ { 0b0011100011100000010100, kW , 0 , 1 }, // ldsminalb
+ { 0b0111100011100000010100, kW , 0 , 1 }, // ldsminalh
+ { 0b0011100000100000010100, kW , 0 , 0 }, // ldsminb
+ { 0b0111100000100000010100, kW , 0 , 0 }, // ldsminh
+ { 0b1011100001100000010100, kWX, 30, 0 }, // ldsminl
+ { 0b0011100001100000010100, kW , 0 , 0 }, // ldsminlb
+ { 0b0111100001100000010100, kW , 0 , 0 }, // ldsminlh
+ { 0b1011100000100000011000, kWX, 30, 0 }, // ldumax
+ { 0b1011100010100000011000, kWX, 30, 1 }, // ldumaxa
+ { 0b0011100010100000011000, kW , 0 , 1 }, // ldumaxab
+ { 0b0111100010100000011000, kW , 0 , 1 }, // ldumaxah
+ { 0b1011100011100000011000, kWX, 30, 1 }, // ldumaxal
+ { 0b0011100011100000011000, kW , 0 , 1 }, // ldumaxalb
+ { 0b0111100011100000011000, kW , 0 , 1 }, // ldumaxalh
+ { 0b0011100000100000011000, kW , 0 , 0 }, // ldumaxb
+ { 0b0111100000100000011000, kW , 0 , 0 }, // ldumaxh
+ { 0b1011100001100000011000, kWX, 30, 0 }, // ldumaxl
+ { 0b0011100001100000011000, kW , 0 , 0 }, // ldumaxlb
+ { 0b0111100001100000011000, kW , 0 , 0 }, // ldumaxlh
+ { 0b1011100000100000011100, kWX, 30, 0 }, // ldumin
+ { 0b1011100010100000011100, kWX, 30, 1 }, // ldumina
+ { 0b0011100010100000011100, kW , 0 , 1 }, // lduminab
+ { 0b0111100010100000011100, kW , 0 , 1 }, // lduminah
+ { 0b1011100011100000011100, kWX, 30, 1 }, // lduminal
+ { 0b0011100011100000011100, kW , 0 , 1 }, // lduminalb
+ { 0b0111100011100000011100, kW , 0 , 1 }, // lduminalh
+ { 0b0011100000100000011100, kW , 0 , 0 }, // lduminb
+ { 0b0111100000100000011100, kW , 0 , 0 }, // lduminh
+ { 0b1011100001100000011100, kWX, 30, 0 }, // lduminl
+ { 0b0011100001100000011100, kW , 0 , 0 }, // lduminlb
+ { 0b0111100001100000011100, kW , 0 , 0 }, // lduminlh
+ { 0b1000100000000000111111, kWX, 30, 1 }, // stlxr
+ { 0b0000100000000000111111, kW , 0 , 1 }, // stlxrb
+ { 0b0100100000000000111111, kW , 0 , 1 }, // stlxrh
+ { 0b1011100000100000100000, kWX, 30, 1 }, // swp
+ { 0b1011100010100000100000, kWX, 30, 1 }, // swpa
+ { 0b0011100010100000100000, kW , 0 , 1 }, // swpab
+ { 0b0111100010100000100000, kW , 0 , 1 }, // swpah
+ { 0b1011100011100000100000, kWX, 30, 1 }, // swpal
+ { 0b0011100011100000100000, kW , 0 , 1 }, // swpalb
+ { 0b0111100011100000100000, kW , 0 , 1 }, // swpalh
+ { 0b0011100000100000100000, kW , 0 , 1 }, // swpb
+ { 0b0111100000100000100000, kW , 0 , 1 }, // swph
+ { 0b1011100001100000100000, kWX, 30, 1 }, // swpl
+ { 0b0011100001100000100000, kW , 0 , 1 }, // swplb
+ { 0b0111100001100000100000, kW , 0 , 1 } // swplh
+};
+
+const BaseAtomicSt baseAtomicSt[48] = {
+ { 0b1011100000100000000000, kWX, 30 }, // stadd
+ { 0b1011100001100000000000, kWX, 30 }, // staddl
+ { 0b0011100000100000000000, kW , 0 }, // staddb
+ { 0b0011100001100000000000, kW , 0 }, // staddlb
+ { 0b0111100000100000000000, kW , 0 }, // staddh
+ { 0b0111100001100000000000, kW , 0 }, // staddlh
+ { 0b1011100000100000000100, kWX, 30 }, // stclr
+ { 0b1011100001100000000100, kWX, 30 }, // stclrl
+ { 0b0011100000100000000100, kW , 0 }, // stclrb
+ { 0b0011100001100000000100, kW , 0 }, // stclrlb
+ { 0b0111100000100000000100, kW , 0 }, // stclrh
+ { 0b0111100001100000000100, kW , 0 }, // stclrlh
+ { 0b1011100000100000001000, kWX, 30 }, // steor
+ { 0b1011100001100000001000, kWX, 30 }, // steorl
+ { 0b0011100000100000001000, kW , 0 }, // steorb
+ { 0b0011100001100000001000, kW , 0 }, // steorlb
+ { 0b0111100000100000001000, kW , 0 }, // steorh
+ { 0b0111100001100000001000, kW , 0 }, // steorlh
+ { 0b1011100000100000001100, kWX, 30 }, // stset
+ { 0b1011100001100000001100, kWX, 30 }, // stsetl
+ { 0b0011100000100000001100, kW , 0 }, // stsetb
+ { 0b0011100001100000001100, kW , 0 }, // stsetlb
+ { 0b0111100000100000001100, kW , 0 }, // stseth
+ { 0b0111100001100000001100, kW , 0 }, // stsetlh
+ { 0b1011100000100000010000, kWX, 30 }, // stsmax
+ { 0b1011100001100000010000, kWX, 30 }, // stsmaxl
+ { 0b0011100000100000010000, kW , 0 }, // stsmaxb
+ { 0b0011100001100000010000, kW , 0 }, // stsmaxlb
+ { 0b0111100000100000010000, kW , 0 }, // stsmaxh
+ { 0b0111100001100000010000, kW , 0 }, // stsmaxlh
+ { 0b1011100000100000010100, kWX, 30 }, // stsmin
+ { 0b1011100001100000010100, kWX, 30 }, // stsminl
+ { 0b0011100000100000010100, kW , 0 }, // stsminb
+ { 0b0011100001100000010100, kW , 0 }, // stsminlb
+ { 0b0111100000100000010100, kW , 0 }, // stsminh
+ { 0b0111100001100000010100, kW , 0 }, // stsminlh
+ { 0b1011100000100000011000, kWX, 30 }, // stumax
+ { 0b1011100001100000011000, kWX, 30 }, // stumaxl
+ { 0b0011100000100000011000, kW , 0 }, // stumaxb
+ { 0b0011100001100000011000, kW , 0 }, // stumaxlb
+ { 0b0111100000100000011000, kW , 0 }, // stumaxh
+ { 0b0111100001100000011000, kW , 0 }, // stumaxlh
+ { 0b1011100000100000011100, kWX, 30 }, // stumin
+ { 0b1011100001100000011100, kWX, 30 }, // stuminl
+ { 0b0011100000100000011100, kW , 0 }, // stuminb
+ { 0b0011100001100000011100, kW , 0 }, // stuminlb
+ { 0b0111100000100000011100, kW , 0 }, // stuminh
+ { 0b0111100001100000011100, kW , 0 } // stuminlh
+};
+
+const BaseBfc baseBfc[1] = {
+ { 0b00110011000000000000001111100000 } // bfc
+};
+
+const BaseBfi baseBfi[3] = {
+ { 0b00110011000000000000000000000000 }, // bfi
+ { 0b00010011000000000000000000000000 }, // sbfiz
+ { 0b01010011000000000000000000000000 } // ubfiz
+};
+
+const BaseBfm baseBfm[3] = {
+ { 0b00110011000000000000000000000000 }, // bfm
+ { 0b00010011000000000000000000000000 }, // sbfm
+ { 0b01010011000000000000000000000000 } // ubfm
+};
+
+const BaseBfx baseBfx[3] = {
+ { 0b00110011000000000000000000000000 }, // bfxil
+ { 0b00010011000000000000000000000000 }, // sbfx
+ { 0b01010011000000000000000000000000 } // ubfx
+};
+
+const BaseBranchCmp baseBranchCmp[2] = {
+ { 0b00110101000000000000000000000000 }, // cbnz
+ { 0b00110100000000000000000000000000 } // cbz
+};
+
+const BaseBranchReg baseBranchReg[3] = {
+ { 0b11010110001111110000000000000000 }, // blr
+ { 0b11010110000111110000000000000000 }, // br
+ { 0b11010110010111110000000000000000 } // ret
+};
+
+const BaseBranchRel baseBranchRel[2] = {
+ { 0b00010100000000000000000000000000 }, // b
+ { 0b10010100000000000000000000000000 } // bl
+};
+
+const BaseBranchTst baseBranchTst[2] = {
+ { 0b00110111000000000000000000000000 }, // tbnz
+ { 0b00110110000000000000000000000000 } // tbz
+};
+
+const BaseCCmp baseCCmp[2] = {
+ { 0b00111010010000000000000000000000 }, // ccmn
+ { 0b01111010010000000000000000000000 } // ccmp
+};
+
+const BaseCInc baseCInc[3] = {
+ { 0b00011010100000000000010000000000 }, // cinc
+ { 0b01011010100000000000000000000000 }, // cinv
+ { 0b01011010100000000000010000000000 } // cneg
+};
+
+const BaseCSel baseCSel[4] = {
+ { 0b00011010100000000000000000000000 }, // csel
+ { 0b00011010100000000000010000000000 }, // csinc
+ { 0b01011010100000000000000000000000 }, // csinv
+ { 0b01011010100000000000010000000000 } // csneg
+};
+
+const BaseCSet baseCSet[2] = {
+ { 0b00011010100111110000011111100000 }, // cset
+ { 0b01011010100111110000001111100000 } // csetm
+};
+
+const BaseCmpCmn baseCmpCmn[2] = {
+ { 0b0101011000, 0b0101011001, 0b0110001 }, // cmn
+ { 0b1101011000, 0b1101011001, 0b1110001 } // cmp
+};
+
+const BaseExtend baseExtend[5] = {
+ { 0b0001001100000000000111, kWX, 0 }, // sxtb
+ { 0b0001001100000000001111, kWX, 0 }, // sxth
+ { 0b1001001101000000011111, kX , 0 }, // sxtw
+ { 0b0101001100000000000111, kW, 1 }, // uxtb
+ { 0b0101001100000000001111, kW, 1 } // uxth
+};
+
+const BaseExtract baseExtract[1] = {
+ { 0b00010011100000000000000000000000 } // extr
+};
+
+const BaseLdSt baseLdSt[9] = {
+ { 0b1011100101, 0b10111000010, 0b10111000011, 0b00011000, kWX, 30, 2, Inst::kIdLdur }, // ldr
+ { 0b0011100101, 0b00111000010, 0b00111000011, 0 , kW , 0 , 0, Inst::kIdLdurb }, // ldrb
+ { 0b0111100101, 0b01111000010, 0b01111000011, 0 , kW , 0 , 1, Inst::kIdLdurh }, // ldrh
+ { 0b0011100111, 0b00111000100, 0b00111000101, 0 , kWX, 22, 0, Inst::kIdLdursb }, // ldrsb
+ { 0b0111100110, 0b01111000100, 0b01111000101, 0 , kWX, 22, 1, Inst::kIdLdursh }, // ldrsh
+ { 0b1011100110, 0b10111000100, 0b10111000101, 0b10011000, kX , 0 , 2, Inst::kIdLdursw }, // ldrsw
+ { 0b1011100100, 0b10111000000, 0b10111000001, 0 , kWX, 30, 2, Inst::kIdStur }, // str
+ { 0b0011100100, 0b00111000000, 0b00111000001, 0 , kW , 30, 0, Inst::kIdSturb }, // strb
+ { 0b0111100100, 0b01111000000, 0b01111000001, 0 , kWX, 30, 1, Inst::kIdSturh } // strh
+};
+
+const BaseLdpStp baseLdpStp[6] = {
+ { 0b0010100001, 0 , kWX, 31, 2 }, // ldnp
+ { 0b0010100101, 0b0010100011, kWX, 31, 2 }, // ldp
+ { 0b0110100101, 0b0110100011, kX , 0 , 2 }, // ldpsw
+ { 0b0110100100, 0b0110100010, kX, 0, 4 }, // stgp
+ { 0b0010100000, 0 , kWX, 31, 2 }, // stnp
+ { 0b0010100100, 0b0010100010, kWX, 31, 2 } // stp
+};
+
+const BaseLdxp baseLdxp[2] = {
+ { 0b1000100001111111100000, kWX, 30 }, // ldaxp
+ { 0b1000100001111111000000, kWX, 30 } // ldxp
+};
+
+const BaseLogical baseLogical[8] = {
+ { 0b0001010000, 0b00100100, 0 }, // and
+ { 0b1101010000, 0b11100100, 0 }, // ands
+ { 0b0001010001, 0b00100100, 1 }, // bic
+ { 0b1101010001, 0b11100100, 1 }, // bics
+ { 0b1001010001, 0b10100100, 1 }, // eon
+ { 0b1001010000, 0b10100100, 0 }, // eor
+ { 0b0101010001, 0b01100100, 1 }, // orn
+ { 0b0101010000, 0b01100100, 0 } // orr
+};
+
+const BaseMovKNZ baseMovKNZ[3] = {
+ { 0b01110010100000000000000000000000 }, // movk
+ { 0b00010010100000000000000000000000 }, // movn
+ { 0b01010010100000000000000000000000 } // movz
+};
+
+const BaseMvnNeg baseMvnNeg[3] = {
+ { 0b00101010001000000000001111100000 }, // mvn
+ { 0b01001011000000000000001111100000 }, // neg
+ { 0b01101011000000000000001111100000 } // negs
+};
+
+const BaseOp baseOp[23] = {
+ { 0b11010101000000110010000110011111 }, // autia1716
+ { 0b11010101000000110010001110111111 }, // autiasp
+ { 0b11010101000000110010001110011111 }, // autiaz
+ { 0b11010101000000110010000111011111 }, // autib1716
+ { 0b11010101000000110010001111111111 }, // autibsp
+ { 0b11010101000000110010001111011111 }, // autibz
+ { 0b11010101000000000100000001011111 }, // axflag
+ { 0b11010101000000000100000000011111 }, // cfinv
+ { 0b11010101000000110010001010011111 }, // csdb
+ { 0b11010101000000110010000011011111 }, // dgh
+ { 0b11010110101111110000001111100000 }, // drps
+ { 0b11010101000000110010001000011111 }, // esb
+ { 0b11010110100111110000001111100000 }, // eret
+ { 0b11010101000000110010000000011111 }, // nop
+ { 0b11010101000000110011010010011111 }, // pssbb
+ { 0b11010101000000110010000010011111 }, // sev
+ { 0b11010101000000110010000010111111 }, // sevl
+ { 0b11010101000000110011000010011111 }, // ssbb
+ { 0b11010101000000110010000001011111 }, // wfe
+ { 0b11010101000000110010000001111111 }, // wfi
+ { 0b11010101000000000100000000111111 }, // xaflag
+ { 0b11010101000000110010000011111111 }, // xpaclri
+ { 0b11010101000000110010000000111111 } // yield
+};
+
+const BaseOpImm baseOpImm[14] = {
+ { 0b11010100001000000000000000000000, 16, 5 }, // brk
+ { 0b11010101000000110011000001011111, 4, 8 }, // clrex
+ { 0b11010100101000000000000000000001, 16, 5 }, // dcps1
+ { 0b11010100101000000000000000000010, 16, 5 }, // dcps2
+ { 0b11010100101000000000000000000011, 16, 5 }, // dcps3
+ { 0b11010101000000110011000010111111, 4, 8 }, // dmb
+ { 0b11010101000000110011000010011111, 4, 8 }, // dsb
+ { 0b11010101000000110010000000011111, 7, 5 }, // hint
+ { 0b11010100010000000000000000000000, 16, 5 }, // hlt
+ { 0b11010100000000000000000000000010, 16, 5 }, // hvc
+ { 0b11010101000000110011000011011111, 4, 8 }, // isb
+ { 0b11010100000000000000000000000011, 16, 5 }, // smc
+ { 0b11010100000000000000000000000001, 16, 5 }, // svc
+ { 0b00000000000000000000000000000000, 16, 0 } // udf
+};
+
+const BaseR baseR[10] = {
+ { 0b11011010110000010011101111100000, kX, kZR, 0 }, // autdza
+ { 0b11011010110000010011111111100000, kX, kZR, 0 }, // autdzb
+ { 0b11011010110000010011001111100000, kX, kZR, 0 }, // autiza
+ { 0b11011010110000010011011111100000, kX, kZR, 0 }, // autizb
+ { 0b11011010110000010010101111100000, kX, kZR, 0 }, // pacdza
+ { 0b11011010110000010010111111100000, kX, kZR, 0 }, // pacdzb
+ { 0b00111010000000000000100000001101, kW, kZR, 5 }, // setf8
+ { 0b00111010000000000100100000001101, kW, kZR, 5 }, // setf16
+ { 0b11011010110000010100011111100000, kX, kZR, 0 }, // xpacd
+ { 0b11011010110000010100001111100000, kX, kZR, 0 } // xpaci
+};
+
+const BaseRM_NoImm baseRM_NoImm[21] = {
+ { 0b1000100011011111111111, kWX, kZR, 30 }, // ldar
+ { 0b0000100011011111111111, kW , kZR, 0 }, // ldarb
+ { 0b0100100011011111111111, kW , kZR, 0 }, // ldarh
+ { 0b1000100001011111111111, kWX, kZR, 30 }, // ldaxr
+ { 0b0000100001011111111111, kW , kZR, 0 }, // ldaxrb
+ { 0b0100100001011111111111, kW , kZR, 0 }, // ldaxrh
+ { 0b1101100111100000000000, kX , kZR, 0 }, // ldgm
+ { 0b1000100011011111011111, kWX, kZR, 30 }, // ldlar
+ { 0b0000100011011111011111, kW , kZR, 0 }, // ldlarb
+ { 0b0100100011011111011111, kW , kZR, 0 }, // ldlarh
+ { 0b1000100001011111011111, kWX, kZR, 30 }, // ldxr
+ { 0b0000100001011111011111, kW , kZR, 0 }, // ldxrb
+ { 0b0100100001011111011111, kW , kZR, 0 }, // ldxrh
+ { 0b1101100110100000000000, kX , kZR, 0 }, // stgm
+ { 0b1000100010011111011111, kWX, kZR, 30 }, // stllr
+ { 0b0000100010011111011111, kW , kZR, 0 }, // stllrb
+ { 0b0100100010011111011111, kW , kZR, 0 }, // stllrh
+ { 0b1000100010011111111111, kWX, kZR, 30 }, // stlr
+ { 0b0000100010011111111111, kW , kZR, 0 }, // stlrb
+ { 0b0100100010011111111111, kW , kZR, 0 }, // stlrh
+ { 0b1101100100100000000000, kX , kZR, 0 } // stzgm
+};
+
+const BaseRM_SImm10 baseRM_SImm10[2] = {
+ { 0b1111100000100000000001, kX , kZR, 0, 3 }, // ldraa
+ { 0b1111100010100000000001, kX , kZR, 0, 3 } // ldrab
+};
+
+const BaseRM_SImm9 baseRM_SImm9[23] = {
+ { 0b1101100101100000000000, 0b0000000000000000000000, kX , kZR, 0, 4 }, // ldg
+ { 0b1011100001000000000010, 0b0000000000000000000000, kWX, kZR, 30, 0 }, // ldtr
+ { 0b0011100001000000000010, 0b0000000000000000000000, kW , kZR, 0 , 0 }, // ldtrb
+ { 0b0111100001000000000010, 0b0000000000000000000000, kW , kZR, 0 , 0 }, // ldtrh
+ { 0b0011100011000000000010, 0b0000000000000000000000, kWX, kZR, 22, 0 }, // ldtrsb
+ { 0b0111100011000000000010, 0b0000000000000000000000, kWX, kZR, 22, 0 }, // ldtrsh
+ { 0b1011100010000000000010, 0b0000000000000000000000, kX , kZR, 0 , 0 }, // ldtrsw
+ { 0b1011100001000000000000, 0b0000000000000000000000, kWX, kZR, 30, 0 }, // ldur
+ { 0b0011100001000000000000, 0b0000000000000000000000, kW , kZR, 0 , 0 }, // ldurb
+ { 0b0111100001000000000000, 0b0000000000000000000000, kW , kZR, 0 , 0 }, // ldurh
+ { 0b0011100011000000000000, 0b0000000000000000000000, kWX, kZR, 22, 0 }, // ldursb
+ { 0b0111100011000000000000, 0b0000000000000000000000, kWX, kZR, 22, 0 }, // ldursh
+ { 0b1011100010000000000000, 0b0000000000000000000000, kWX, kZR, 0 , 0 }, // ldursw
+ { 0b1101100110100000000010, 0b1101100110100000000001, kX, kSP, 0, 4 }, // st2g
+ { 0b1101100100100000000010, 0b1101100100100000000001, kX, kSP, 0, 4 }, // stg
+ { 0b1011100000000000000010, 0b0000000000000000000000, kWX, kZR, 30, 0 }, // sttr
+ { 0b0011100000000000000010, 0b0000000000000000000000, kW , kZR, 0 , 0 }, // sttrb
+ { 0b0111100000000000000010, 0b0000000000000000000000, kW , kZR, 0 , 0 }, // sttrh
+ { 0b1011100000000000000000, 0b0000000000000000000000, kWX, kZR, 30, 0 }, // stur
+ { 0b0011100000000000000000, 0b0000000000000000000000, kW , kZR, 0 , 0 }, // sturb
+ { 0b0111100000000000000000, 0b0000000000000000000000, kW , kZR, 0 , 0 }, // sturh
+ { 0b1101100111100000000010, 0b1101100111100000000001, kX , kSP, 0, 4 }, // stz2g
+ { 0b1101100101100000000010, 0b1101100101100000000001, kX , kSP, 0, 4 } // stzg
+};
+
+const BaseRR baseRR[15] = {
+ { 0b11011010110000010001100000000000, kX, kZR, 0, kX, kSP, 5, true }, // autda
+ { 0b11011010110000010001110000000000, kX, kZR, 0, kX, kSP, 5, true }, // autdb
+ { 0b11011010110000010001000000000000, kX, kZR, 0, kX, kSP, 5, true }, // autia
+ { 0b11011010110000010001010000000000, kX, kZR, 0, kX, kSP, 5, true }, // autib
+ { 0b01011010110000000001010000000000, kWX, kZR, 0, kWX, kZR, 5, true }, // cls
+ { 0b01011010110000000001000000000000, kWX, kZR, 0, kWX, kZR, 5, true }, // clz
+ { 0b10111010110000000000000000011111, kX, kSP, 5, kX, kSP, 16, true }, // cmpp
+ { 0b01011010000000000000001111100000, kWX, kZR, 0, kWX, kZR, 16, true }, // ngc
+ { 0b01111010000000000000001111100000, kWX, kZR, 0, kWX, kZR, 16, true }, // ngcs
+ { 0b11011010110000010000100000000000, kX, kZR, 0, kX, kSP, 5, true }, // pacda
+ { 0b11011010110000010000110000000000, kX, kZR, 0, kX, kSP, 5, true }, // pacdb
+ { 0b01011010110000000000000000000000, kWX, kZR, 0, kWX, kZR, 5, true }, // rbit
+ { 0b01011010110000000000010000000000, kWX, kZR, 0, kWX, kZR, 5, true }, // rev16
+ { 0b11011010110000000000100000000000, kWX, kZR, 0, kWX, kZR, 5, true }, // rev32
+ { 0b11011010110000000000110000000000, kWX, kZR, 0, kWX, kZR, 5, true } // rev64
+};
+
+const BaseRRII baseRRII[2] = {
+ { 0b1001000110000000000000, kX, kSP, kX, kSP, 6, 4, 16, 4, 0, 10 }, // addg
+ { 0b1101000110000000000000, kX, kSP, kX, kSP, 6, 4, 16, 4, 0, 10 } // subg
+};
+
+const BaseRRR baseRRR[26] = {
+ { 0b0001101000000000000000, kWX, kZR, kWX, kZR, kWX, kZR, true }, // adc
+ { 0b0011101000000000000000, kWX, kZR, kWX, kZR, kWX, kZR, true }, // adcs
+ { 0b0001101011000000010000, kW, kZR, kW, kZR, kW, kZR, false }, // crc32b
+ { 0b0001101011000000010100, kW, kZR, kW, kZR, kW, kZR, false }, // crc32cb
+ { 0b0001101011000000010101, kW, kZR, kW, kZR, kW, kZR, false }, // crc32ch
+ { 0b0001101011000000010110, kW, kZR, kW, kZR, kW, kZR, false }, // crc32cw
+ { 0b1001101011000000010111, kW, kZR, kW, kZR, kX, kZR, false }, // crc32cx
+ { 0b0001101011000000010001, kW, kZR, kW, kZR, kW, kZR, false }, // crc32h
+ { 0b0001101011000000010010, kW, kZR, kW, kZR, kW, kZR, false }, // crc32w
+ { 0b1001101011000000010011, kW, kZR, kW, kZR, kX, kZR, false }, // crc32x
+ { 0b1001101011000000000101, kX , kZR, kX , kSP, kX , kZR, true }, // gmi
+ { 0b0001101100000000111111, kWX, kZR, kWX, kZR, kWX, kZR, true }, // mneg
+ { 0b0001101100000000011111, kWX, kZR, kWX, kZR, kWX, kZR, true }, // mul
+ { 0b1001101011000000001100, kX, kZR, kX, kZR, kX, kSP, false }, // pacga
+ { 0b0101101000000000000000, kWX, kZR, kWX, kZR, kWX, kZR, true }, // sbc
+ { 0b0111101000000000000000, kWX, kZR, kWX, kZR, kWX, kZR, true }, // sbcs
+ { 0b0001101011000000000011, kWX, kZR, kWX, kZR, kWX, kZR, true }, // sdiv
+ { 0b1001101100100000111111, kX , kZR, kW , kZR, kW , kZR, false }, // smnegl
+ { 0b1001101101000000011111, kX , kZR, kX , kZR, kX , kZR, true }, // smulh
+ { 0b1001101100100000011111, kX , kZR, kW , kZR, kW , kZR, false }, // smull
+ { 0b1001101011000000000000, kX, kZR, kX, kSP, kX, kSP, false }, // subp
+ { 0b1011101011000000000000, kX, kZR, kX, kSP, kX, kSP, false }, // subps
+ { 0b0001101011000000000010, kWX, kZR, kWX, kZR, kWX, kZR, true }, // udiv
+ { 0b1001101110100000111111, kX , kZR, kW , kZR, kW , kZR, false }, // umnegl
+ { 0b1001101110100000011111, kX , kZR, kW , kZR, kW , kZR, false }, // umull
+ { 0b1001101111000000011111, kX , kZR, kX , kZR, kX , kZR, false } // umulh
+};
+
+const BaseRRRR baseRRRR[6] = {
+ { 0b0001101100000000000000, kWX, kZR, kWX, kZR, kWX, kZR, kWX, kZR, true }, // madd
+ { 0b0001101100000000100000, kWX, kZR, kWX, kZR, kWX, kZR, kWX, kZR, true }, // msub
+ { 0b1001101100100000000000, kX , kZR, kW , kZR, kW , kZR, kX , kZR, false }, // smaddl
+ { 0b1001101100100000100000, kX , kZR, kW , kZR, kW , kZR, kX , kZR, false }, // smsubl
+ { 0b1001101110100000000000, kX , kZR, kW , kZR, kW , kZR, kX , kZR, false }, // umaddl
+ { 0b1001101110100000100000, kX , kZR, kW , kZR, kW , kZR, kX , kZR, false } // umsubl
+};
+
+const BaseShift baseShift[8] = {
+ { 0b0001101011000000001010, 0b0001001100000000011111, 0 }, // asr
+ { 0b0001101011000000001010, 0b0000000000000000000000, 0 }, // asrv
+ { 0b0001101011000000001000, 0b0101001100000000000000, 0 }, // lsl
+ { 0b0001101011000000001000, 0b0000000000000000000000, 0 }, // lslv
+ { 0b0001101011000000001001, 0b0101001100000000011111, 0 }, // lsr
+ { 0b0001101011000000001001, 0b0000000000000000000000, 0 }, // lsrv
+ { 0b0001101011000000001011, 0b0001001110000000000000, 1 }, // ror
+ { 0b0001101011000000001011, 0b0000000000000000000000, 1 } // rorv
+};
+
+const BaseStx baseStx[3] = {
+ { 0b1000100000000000011111, kWX, 30 }, // stxr
+ { 0b0000100000000000011111, kW , 0 }, // stxrb
+ { 0b0100100000000000011111, kW , 0 } // stxrh
+};
+
+const BaseStxp baseStxp[2] = {
+ { 0b1000100000100000100000, kWX, 30 }, // stlxp
+ { 0b1000100000100000000000, kWX, 30 } // stxp
+};
+
+const BaseTst baseTst[1] = {
+ { 0b1101010000, 0b111001000 } // tst
+};
+
+const FSimdPair fSimdPair[5] = {
+ { 0b0111111000110000110110, 0b0010111000100000110101 }, // faddp_v
+ { 0b0111111000110000110010, 0b0010111000100000110001 }, // fmaxnmp_v
+ { 0b0111111000110000111110, 0b0010111000100000111101 }, // fmaxp_v
+ { 0b0111111010110000110010, 0b0010111010100000110001 }, // fminnmp_v
+ { 0b0111111010110000111110, 0b0010111010100000111101 } // fminp_v
+};
+
+const FSimdSV fSimdSV[4] = {
+ { 0b0010111000110000110010 }, // fmaxnmv_v
+ { 0b0010111000110000111110 }, // fmaxv_v
+ { 0b0010111010110000110010 }, // fminnmv_v
+ { 0b0010111010110000111110 } // fminv_v
+};
+
+const FSimdVV fSimdVV[17] = {
+ { 0b0001111000100000110000, kHF_A, 0b0000111010100000111110, kHF_B }, // fabs_v
+ { 0b0001111000100001010000, kHF_A, 0b0010111010100000111110, kHF_B }, // fneg_v
+ { 0b0101111010100001110110, kHF_B, 0b0000111010100001110110, kHF_B }, // frecpe_v
+ { 0b0101111010100001111110, kHF_B, 0b0000000000000000000000, kHF_N }, // frecpx_v
+ { 0b0001111000101000110000, kHF_N, 0b0010111000100001111010, kHF_N }, // frint32x_v
+ { 0b0001111000101000010000, kHF_N, 0b0000111000100001111010, kHF_N }, // frint32z_v
+ { 0b0001111000101001110000, kHF_N, 0b0010111000100001111110, kHF_N }, // frint64x_v
+ { 0b0001111000101001010000, kHF_N, 0b0000111000100001111110, kHF_N }, // frint64z_v
+ { 0b0001111000100110010000, kHF_A, 0b0010111000100001100010, kHF_B }, // frinta_v
+ { 0b0001111000100111110000, kHF_A, 0b0010111010100001100110, kHF_B }, // frinti_v
+ { 0b0001111000100101010000, kHF_A, 0b0000111000100001100110, kHF_B }, // frintm_v
+ { 0b0001111000100100010000, kHF_A, 0b0000111000100001100010, kHF_B }, // frintn_v
+ { 0b0001111000100100110000, kHF_A, 0b0000111010100001100010, kHF_B }, // frintp_v
+ { 0b0001111000100111010000, kHF_A, 0b0010111000100001100110, kHF_B }, // frintx_v
+ { 0b0001111000100101110000, kHF_A, 0b0000111010100001100110, kHF_B }, // frintz_v
+ { 0b0111111010100001110110, kHF_B, 0b0010111010100001110110, kHF_B }, // frsqrte_v
+ { 0b0001111000100001110000, kHF_A, 0b0010111010100001111110, kHF_B } // fsqrt_v
+};
+
+const FSimdVVV fSimdVVV[13] = {
+ { 0b0111111010100000110101, kHF_C, 0b0010111010100000110101, kHF_C }, // fabd_v
+ { 0b0111111000100000111011, kHF_C, 0b0010111000100000111011, kHF_C }, // facge_v
+ { 0b0111111010100000111011, kHF_C, 0b0010111010100000111011, kHF_C }, // facgt_v
+ { 0b0001111000100000001010, kHF_A, 0b0000111000100000110101, kHF_C }, // fadd_v
+ { 0b0001111000100000000110, kHF_A, 0b0010111000100000111111, kHF_C }, // fdiv_v
+ { 0b0001111000100000010010, kHF_A, 0b0000111000100000111101, kHF_C }, // fmax_v
+ { 0b0001111000100000011010, kHF_A, 0b0000111000100000110001, kHF_C }, // fmaxnm_v
+ { 0b0001111000100000010110, kHF_A, 0b0000111010100000111101, kHF_C }, // fmin_v
+ { 0b0001111000100000011110, kHF_A, 0b0000111010100000110001, kHF_C }, // fminnm_v
+ { 0b0001111000100000100010, kHF_A, 0b0000000000000000000000, kHF_N }, // fnmul_v
+ { 0b0101111000100000111111, kHF_C, 0b0000111000100000111111, kHF_C }, // frecps_v
+ { 0b0101111010100000111111, kHF_C, 0b0000111010100000111111, kHF_C }, // frsqrts_v
+ { 0b0001111000100000001110, kHF_A, 0b0000111010100000110101, kHF_C } // fsub_v
+};
+
+const FSimdVVVV fSimdVVVV[4] = {
+ { 0b0001111100000000000000, kHF_A, 0b0000000000000000000000, kHF_N }, // fmadd_v
+ { 0b0001111100000000100000, kHF_A, 0b0000000000000000000000, kHF_N }, // fmsub_v
+ { 0b0001111100100000000000, kHF_A, 0b0000000000000000000000, kHF_N }, // fnmadd_v
+ { 0b0001111100100000100000, kHF_A, 0b0000000000000000000000, kHF_N } // fnmsub_v
+};
+
+const FSimdVVVe fSimdVVVe[4] = {
+ { 0b0000000000000000000000, kHF_N, 0b0000111000100000110011, 0b0000111110000000000100 }, // fmla_v
+ { 0b0000000000000000000000, kHF_N, 0b0000111010100000110011, 0b0000111110000000010100 }, // fmls_v
+ { 0b0001111000100000000010, kHF_A, 0b0010111000100000110111, 0b0000111110000000100100 }, // fmul_v
+ { 0b0101111000100000110111, kHF_C, 0b0000111000100000110111, 0b0010111110000000100100 } // fmulx_v
+};
+
+const ISimdPair iSimdPair[1] = {
+ { 0b0101111000110001101110, 0b0000111000100000101111, kVO_V_Any } // addp_v
+};
+
+const ISimdSV iSimdSV[7] = {
+ { 0b0000111000110001101110, kVO_V_BH_4S }, // addv_v
+ { 0b0000111000110000001110, kVO_V_BH_4S }, // saddlv_v
+ { 0b0000111000110000101010, kVO_V_BH_4S }, // smaxv_v
+ { 0b0000111000110001101010, kVO_V_BH_4S }, // sminv_v
+ { 0b0010111000110000001110, kVO_V_BH_4S }, // uaddlv_v
+ { 0b0010111000110000101010, kVO_V_BH_4S }, // umaxv_v
+ { 0b0010111000110001101010, kVO_V_BH_4S } // uminv_v
+};
+
+const ISimdVV iSimdVV[29] = {
+ { 0b0000111000100000101110, kVO_V_Any }, // abs_v
+ { 0b0000111000100000010010, kVO_V_BHS }, // cls_v
+ { 0b0010111000100000010010, kVO_V_BHS }, // clz_v
+ { 0b0000111000100000010110, kVO_V_B }, // cnt_v
+ { 0b0010111000100000010110, kVO_V_B }, // mvn_v
+ { 0b0010111000100000101110, kVO_V_Any }, // neg_v
+ { 0b0010111000100000010110, kVO_V_B }, // not_v
+ { 0b0010111001100000010110, kVO_V_B }, // rbit_v
+ { 0b0000111000100000000110, kVO_V_B }, // rev16_v
+ { 0b0010111000100000000010, kVO_V_BH }, // rev32_v
+ { 0b0000111000100000000010, kVO_V_BHS }, // rev64_v
+ { 0b0000111000100000011010, kVO_V_BHS }, // sadalp_v
+ { 0b0000111000100000001010, kVO_V_BHS }, // saddlp_v
+ { 0b0000111000100000011110, kVO_SV_Any }, // sqabs_v
+ { 0b0010111000100000011110, kVO_SV_Any }, // sqneg_v
+ { 0b0000111000100001010010, kVO_SV_B8H4S2 }, // sqxtn_v
+ { 0b0100111000100001010010, kVO_V_B16H8S4 }, // sqxtn2_v
+ { 0b0010111000100001001010, kVO_SV_B8H4S2 }, // sqxtun_v
+ { 0b0110111000100001001010, kVO_V_B16H8S4 }, // sqxtun2_v
+ { 0b0000111000100000001110, kVO_SV_Any }, // suqadd_v
+ { 0b0010111000100000011010, kVO_V_BHS }, // uadalp_v
+ { 0b0010111000100000001010, kVO_V_BHS }, // uaddlp_v
+ { 0b0010111000100001010010, kVO_SV_B8H4S2 }, // uqxtn_v
+ { 0b0110111000100001010010, kVO_V_B16H8S4 }, // uqxtn2_v
+ { 0b0000111010100001110010, kVO_V_S }, // urecpe_v
+ { 0b0010111010100001110010, kVO_V_S }, // ursqrte_v
+ { 0b0010111000100000001110, kVO_SV_Any }, // usqadd_v
+ { 0b0000111000100001001010, kVO_V_B8H4S2 }, // xtn_v
+ { 0b0100111000100001001010, kVO_V_B16H8S4 } // xtn2_v
+};
+
+const ISimdVVV iSimdVVV[65] = {
+ { 0b0000111000100000100001, kVO_V_Any }, // add_v
+ { 0b0000111000100000010000, kVO_V_B8H4S2 }, // addhn_v
+ { 0b0100111000100000010000, kVO_V_B16H8S4 }, // addhn2_v
+ { 0b0000111000100000000111, kVO_V_B }, // and_v
+ { 0b0010111011100000000111, kVO_V_B }, // bif_v
+ { 0b0010111010100000000111, kVO_V_B }, // bit_v
+ { 0b0010111001100000000111, kVO_V_B }, // bsl_v
+ { 0b0000111000100000100011, kVO_V_Any }, // cmtst_v
+ { 0b0010111000100000000111, kVO_V_B }, // eor_v
+ { 0b0000111011100000000111, kVO_V_B }, // orn_v
+ { 0b0010111000100000100111, kVO_V_B }, // pmul_v
+ { 0b0000111000100000111000, kVO_V_B8D1 }, // pmull_v
+ { 0b0100111000100000111000, kVO_V_B16D2 }, // pmull2_v
+ { 0b0010111000100000010000, kVO_V_B8H4S2 }, // raddhn_v
+ { 0b0110111000100000010000, kVO_V_B16H8S4 }, // raddhn2_v
+ { 0b1100111001100000100011, kVO_V_D2 }, // rax1_v
+ { 0b0010111000100000011000, kVO_V_B8H4S2 }, // rsubhn_v
+ { 0b0110111000100000011000, kVO_V_B16H8S4 }, // rsubhn2_v
+ { 0b0000111000100000011111, kVO_V_BHS }, // saba_v
+ { 0b0000111000100000010100, kVO_V_B8H4S2 }, // sabal_v
+ { 0b0100111000100000010100, kVO_V_B16H8S4 }, // sabal2_v
+ { 0b0000111000100000011101, kVO_V_BHS }, // sabd_v
+ { 0b0000111000100000011100, kVO_V_B8H4S2 }, // sabdl_v
+ { 0b0100111000100000011100, kVO_V_B16H8S4 }, // sabdl2_v
+ { 0b0000111000100000000000, kVO_V_B8H4S2 }, // saddl_v
+ { 0b0100111000100000000000, kVO_V_B16H8S4 }, // saddl2_v
+ { 0b0000111000100000000001, kVO_V_BHS }, // shadd_v
+ { 0b0000111000100000001001, kVO_V_BHS }, // shsub_v
+ { 0b0000111000100000011001, kVO_V_BHS }, // smax_v
+ { 0b0000111000100000101001, kVO_V_BHS }, // smaxp_v
+ { 0b0000111000100000011011, kVO_V_BHS }, // smin_v
+ { 0b0000111000100000101011, kVO_V_BHS }, // sminp_v
+ { 0b0000111000100000000011, kVO_SV_Any }, // sqadd_v
+ { 0b0000111000100000001011, kVO_SV_Any }, // sqsub_v
+ { 0b0000111000100000000101, kVO_V_BHS }, // srhadd_v
+ { 0b0000111000100000001000, kVO_V_B8H4S2 }, // ssubl_v
+ { 0b0100111000100000001000, kVO_V_B16H8S4 }, // ssubl2_v
+ { 0b0010111000100000100001, kVO_V_Any }, // sub_v
+ { 0b0000111000100000011000, kVO_V_B8H4S2 }, // subhn_v
+ { 0b0000111000100000011000, kVO_V_B16H8S4 }, // subhn2_v
+ { 0b0000111000000000001010, kVO_V_BHS_D2 }, // trn1_v
+ { 0b0000111000000000011010, kVO_V_BHS_D2 }, // trn2_v
+ { 0b0010111000100000011111, kVO_V_BHS }, // uaba_v
+ { 0b0010111000100000010100, kVO_V_B8H4S2 }, // uabal_v
+ { 0b0110111000100000010100, kVO_V_B16H8S4 }, // uabal2_v
+ { 0b0010111000100000011101, kVO_V_BHS }, // uabd_v
+ { 0b0010111000100000011100, kVO_V_B8H4S2 }, // uabdl_v
+ { 0b0110111000100000011100, kVO_V_B16H8S4 }, // uabdl2_v
+ { 0b0010111000100000000000, kVO_V_B8H4S2 }, // uaddl_v
+ { 0b0110111000100000000000, kVO_V_B16H8S4 }, // uaddl2_v
+ { 0b0010111000100000000001, kVO_V_BHS }, // uhadd_v
+ { 0b0010111000100000001001, kVO_V_BHS }, // uhsub_v
+ { 0b0010111000100000011001, kVO_V_BHS }, // umax_v
+ { 0b0010111000100000101001, kVO_V_BHS }, // umaxp_v
+ { 0b0010111000100000011011, kVO_V_BHS }, // umin_v
+ { 0b0010111000100000101011, kVO_V_BHS }, // uminp_v
+ { 0b0010111000100000000011, kVO_SV_Any }, // uqadd_v
+ { 0b0010111000100000001011, kVO_SV_Any }, // uqsub_v
+ { 0b0010111000100000000101, kVO_V_BHS }, // urhadd_v
+ { 0b0010111000100000001000, kVO_V_B8H4S2 }, // usubl_v
+ { 0b0110111000100000001000, kVO_V_B16H8S4 }, // usubl2_v
+ { 0b0000111000000000000110, kVO_V_BHS_D2 }, // uzp1_v
+ { 0b0000111000000000010110, kVO_V_BHS_D2 }, // uzp2_v
+ { 0b0000111000000000001110, kVO_V_BHS_D2 }, // zip1_v
+ { 0b0000111000000000011110, kVO_V_BHS_D2 } // zip2_v
+};
+
+const ISimdVVVI iSimdVVVI[2] = {
+ { 0b0010111000000000000000, kVO_V_B, 4, 11, 1 }, // ext_v
+ { 0b1100111001100000100011, kVO_V_D2, 6, 10, 0 } // xar_v
+};
+
+const ISimdVVVV iSimdVVVV[2] = {
+ { 0b1100111000100000000000, kVO_V_B16 }, // bcax_v
+ { 0b1100111000000000000000, kVO_V_B16 } // eor3_v
+};
+
+const ISimdVVVVx iSimdVVVVx[1] = {
+ { 0b1100111001000000000000, kOp_V4S, kOp_V4S, kOp_V4S, kOp_V4S } // sm3ss1_v
+};
+
+const ISimdVVVe iSimdVVVe[25] = {
+ { 0b0000111000100000100101, kVO_V_BHS, 0b0010111100000000000000, kVO_V_HS }, // mla_v
+ { 0b0010111000100000100101, kVO_V_BHS, 0b0010111100000000010000, kVO_V_HS }, // mls_v
+ { 0b0000111000100000100111, kVO_V_BHS, 0b0000111100000000100000, kVO_V_HS }, // mul_v
+ { 0b0000111000100000100000, kVO_V_B8H4S2, 0b0000111100000000001000, kVO_V_H4S2 }, // smlal_v
+ { 0b0100111000100000100000, kVO_V_B16H8S4, 0b0100111100000000001000, kVO_V_H8S4 }, // smlal2_v
+ { 0b0000111000100000101000, kVO_V_B8H4S2, 0b0000111100000000011000, kVO_V_H4S2 }, // smlsl_v
+ { 0b0100111000100000101000, kVO_V_B16H8S4, 0b0100111100000000011000, kVO_V_H8S4 }, // smlsl2_v
+ { 0b0000111000100000110000, kVO_V_B8H4S2, 0b0000111100000000101000, kVO_V_H4S2 }, // smull_v
+ { 0b0100111000100000110000, kVO_V_B16H8S4, 0b0100111100000000101000, kVO_V_H8S4 }, // smull2_v
+ { 0b0000111000100000100100, kVO_SV_BHS, 0b0000111100000000001100, kVO_V_H4S2 }, // sqdmlal_v
+ { 0b0100111000100000100100, kVO_V_B16H8S4, 0b0100111100000000001100, kVO_V_H8S4 }, // sqdmlal2_v
+ { 0b0000111000100000101100, kVO_SV_BHS, 0b0000111100000000011100, kVO_V_H4S2 }, // sqdmlsl_v
+ { 0b0100111000100000101100, kVO_V_B16H8S4, 0b0100111100000000011100, kVO_V_H8S4 }, // sqdmlsl2_v
+ { 0b0000111000100000101101, kVO_SV_HS, 0b0000111100000000110000, kVO_SV_HS }, // sqdmulh_v
+ { 0b0000111000100000110100, kVO_SV_BHS, 0b0000111100000000101100, kVO_V_H4S2 }, // sqdmull_v
+ { 0b0100111000100000110100, kVO_V_B16H8S4, 0b0100111100000000101100, kVO_V_H8S4 }, // sqdmull2_v
+ { 0b0010111000000000100001, kVO_SV_HS, 0b0010111100000000110100, kVO_SV_HS }, // sqrdmlah_v
+ { 0b0010111000000000100011, kVO_SV_HS, 0b0010111100000000111100, kVO_SV_HS }, // sqrdmlsh_v
+ { 0b0010111000100000101101, kVO_SV_HS, 0b0000111100000000110100, kVO_SV_HS }, // sqrdmulh_v
+ { 0b0010111000100000100000, kVO_V_B8H4S2, 0b0010111100000000001000, kVO_V_H4S2 }, // umlal_v
+ { 0b0110111000100000100000, kVO_V_B16H8S4, 0b0010111100000000001000, kVO_V_H8S4 }, // umlal2_v
+ { 0b0010111000100000101000, kVO_V_B8H4S2, 0b0010111100000000011000, kVO_V_H4S2 }, // umlsl_v
+ { 0b0110111000100000101000, kVO_V_B16H8S4, 0b0110111100000000011000, kVO_V_H8S4 }, // umlsl2_v
+ { 0b0010111000100000110000, kVO_V_B8H4S2, 0b0010111100000000101000, kVO_V_H4S2 }, // umull_v
+ { 0b0110111000100000110000, kVO_V_B16H8S4, 0b0110111100000000101000, kVO_V_H8S4 } // umull2_v
+};
+
+const ISimdVVVx iSimdVVVx[17] = {
+ { 0b0110111001000000111011, kOp_V4S, kOp_V8H, kOp_V8H }, // bfmmla_v
+ { 0b0101111000000000000000, kOp_Q, kOp_S, kOp_V4S }, // sha1c_v
+ { 0b0101111000000000001000, kOp_Q, kOp_S, kOp_V4S }, // sha1m_v
+ { 0b0101111000000000000100, kOp_Q, kOp_S, kOp_V4S }, // sha1p_v
+ { 0b0101111000000000001100, kOp_V4S, kOp_V4S, kOp_V4S }, // sha1su0_v
+ { 0b0101111000000000010000, kOp_Q, kOp_Q, kOp_V4S }, // sha256h_v
+ { 0b0101111000000000010100, kOp_Q, kOp_Q, kOp_V4S }, // sha256h2_v
+ { 0b0101111000000000011000, kOp_V4S, kOp_V4S, kOp_V4S }, // sha256su1_v
+ { 0b1100111001100000100000, kOp_Q, kOp_Q, kOp_V2D }, // sha512h_v
+ { 0b1100111001100000100001, kOp_Q, kOp_Q, kOp_V2D }, // sha512h2_v
+ { 0b1100111001100000100010, kOp_V2D, kOp_V2D, kOp_V2D }, // sha512su1_v
+ { 0b1100111001100000110000, kOp_V4S, kOp_V4S, kOp_V4S }, // sm3partw1_v
+ { 0b1100111001100000110001, kOp_V4S, kOp_V4S, kOp_V4S }, // sm3partw2_v
+ { 0b1100111001100000110010, kOp_V4S, kOp_V4S, kOp_V4S }, // sm4ekey_v
+ { 0b0100111010000000101001, kOp_V4S, kOp_V16B, kOp_V16B }, // smmla_v
+ { 0b0110111010000000101001, kOp_V4S, kOp_V16B, kOp_V16B }, // ummla_v
+ { 0b0100111010000000101011, kOp_V4S, kOp_V16B, kOp_V16B } // usmmla_v
+};
+
+const ISimdVVx iSimdVVx[13] = {
+ { 0b0100111000101000010110, kOp_V16B, kOp_V16B }, // aesd_v
+ { 0b0100111000101000010010, kOp_V16B, kOp_V16B }, // aese_v
+ { 0b0100111000101000011110, kOp_V16B, kOp_V16B }, // aesimc_v
+ { 0b0100111000101000011010, kOp_V16B, kOp_V16B }, // aesmc_v
+ { 0b0001111001100011010000, kOp_H, kOp_S }, // bfcvt_v
+ { 0b0000111010100001011010, kOp_V4H, kOp_V4S }, // bfcvtn_v
+ { 0b0100111010100001011010, kOp_V8H, kOp_V4S }, // bfcvtn2_v
+ { 0b0001111001111110000000, kOp_GpW, kOp_D }, // fjcvtzs_v
+ { 0b0101111000101000000010, kOp_S, kOp_S }, // sha1h_v
+ { 0b0101111000101000000110, kOp_V4S, kOp_V4S }, // sha1su1_v
+ { 0b0101111000101000001010, kOp_V4S, kOp_V4S }, // sha256su0_v
+ { 0b1100111011000000100000, kOp_V2D, kOp_V2D }, // sha512su0_v
+ { 0b1100111011000000100001, kOp_V4S, kOp_V4S } // sm4e_v
+};
+
+const ISimdWWV iSimdWWV[8] = {
+ { 0b0000111000100000000100, kVO_V_B8H4S2 }, // saddw_v
+ { 0b0000111000100000000100, kVO_V_B16H8S4 }, // saddw2_v
+ { 0b0000111000100000001100, kVO_V_B8H4S2 }, // ssubw_v
+ { 0b0000111000100000001100, kVO_V_B16H8S4 }, // ssubw2_v
+ { 0b0010111000100000000100, kVO_V_B8H4S2 }, // uaddw_v
+ { 0b0010111000100000000100, kVO_V_B16H8S4 }, // uaddw2_v
+ { 0b0010111000100000001100, kVO_V_B8H4S2 }, // usubw_v
+ { 0b0010111000100000001100, kVO_V_B16H8S4 } // usubw2_v
+};
+
+const SimdBicOrr simdBicOrr[2] = {
+ { 0b0000111001100000000111, 0b0010111100000000000001 }, // bic_v
+ { 0b0000111010100000000111, 0b0000111100000000000001 } // orr_v
+};
+
+const SimdCmp simdCmp[7] = {
+ { 0b0010111000100000100011, 0b0000111000100000100110, kVO_V_Any }, // cmeq_v
+ { 0b0000111000100000001111, 0b0010111000100000100010, kVO_V_Any }, // cmge_v
+ { 0b0000111000100000001101, 0b0000111000100000100010, kVO_V_Any }, // cmgt_v
+ { 0b0010111000100000001101, 0b0000000000000000000000, kVO_V_Any }, // cmhi_v
+ { 0b0010111000100000001111, 0b0000000000000000000000, kVO_V_Any }, // cmhs_v
+ { 0b0000000000000000000000, 0b0010111000100000100110, kVO_V_Any }, // cmle_v
+ { 0b0000000000000000000000, 0b0000111000100000101010, kVO_V_Any } // cmlt_v
+};
+
+const SimdDot simdDot[5] = {
+ { 0b0010111001000000111111, 0b0000111101000000111100, kET_S, kET_H, kET_2H }, // bfdot_v
+ { 0b0000111010000000100101, 0b0000111110000000111000, kET_S, kET_B, kET_4B }, // sdot_v
+ { 0b0000000000000000000000, 0b0000111100000000111100, kET_S, kET_B, kET_4B }, // sudot_v
+ { 0b0010111010000000100101, 0b0010111110000000111000, kET_S, kET_B, kET_4B }, // udot_v
+ { 0b0000111010000000100111, 0b0000111110000000111100, kET_S, kET_B, kET_4B } // usdot_v
+};
+
+const SimdFcadd simdFcadd[1] = {
+ { 0b0010111000000000111001 } // fcadd_v
+};
+
+const SimdFccmpFccmpe simdFccmpFccmpe[2] = {
+ { 0b00011110001000000000010000000000 }, // fccmp_v
+ { 0b00011110001000000000010000010000 } // fccmpe_v
+};
+
+const SimdFcm simdFcm[5] = {
+ { 0b0000111000100000111001, kHF_C, 0b0000111010100000110110 }, // fcmeq_v
+ { 0b0010111000100000111001, kHF_C, 0b0010111010100000110010 }, // fcmge_v
+ { 0b0010111010100000111001, kHF_C, 0b0000111010100000110010 }, // fcmgt_v
+ { 0b0000000000000000000000, kHF_C, 0b0010111010100000110110 }, // fcmle_v
+ { 0b0000000000000000000000, kHF_C, 0b0000111010100000111010 } // fcmlt_v
+};
+
+const SimdFcmla simdFcmla[1] = {
+ { 0b0010111000000000110001, 0b0010111100000000000100 } // fcmla_v
+};
+
+const SimdFcmpFcmpe simdFcmpFcmpe[2] = {
+ { 0b00011110001000000010000000000000 }, // fcmp_v
+ { 0b00011110001000000010000000010000 } // fcmpe_v
+};
+
+const SimdFcvtLN simdFcvtLN[6] = {
+ { 0b0000111000100001011110, 0, 0 }, // fcvtl_v
+ { 0b0100111000100001011110, 0, 0 }, // fcvtl2_v
+ { 0b0000111000100001011010, 0, 0 }, // fcvtn_v
+ { 0b0100111000100001011010, 0, 0 }, // fcvtn2_v
+ { 0b0010111000100001011010, 1, 1 }, // fcvtxn_v
+ { 0b0110111000100001011010, 1, 0 } // fcvtxn2_v
+};
+
+const SimdFcvtSV simdFcvtSV[12] = {
+ { 0b0000111000100001110010, 0b0000000000000000000000, 0b0001111000100100000000, 1 }, // fcvtas_v
+ { 0b0010111000100001110010, 0b0000000000000000000000, 0b0001111000100101000000, 1 }, // fcvtau_v
+ { 0b0000111000100001101110, 0b0000000000000000000000, 0b0001111000110000000000, 1 }, // fcvtms_v
+ { 0b0010111000100001101110, 0b0000000000000000000000, 0b0001111000110001000000, 1 }, // fcvtmu_v
+ { 0b0000111000100001101010, 0b0000000000000000000000, 0b0001111000100000000000, 1 }, // fcvtns_v
+ { 0b0010111000100001101010, 0b0000000000000000000000, 0b0001111000100001000000, 1 }, // fcvtnu_v
+ { 0b0000111010100001101010, 0b0000000000000000000000, 0b0001111000101000000000, 1 }, // fcvtps_v
+ { 0b0010111010100001101010, 0b0000000000000000000000, 0b0001111000101001000000, 1 }, // fcvtpu_v
+ { 0b0000111010100001101110, 0b0000111100000000111111, 0b0001111000111000000000, 1 }, // fcvtzs_v
+ { 0b0010111010100001101110, 0b0010111100000000111111, 0b0001111000111001000000, 1 }, // fcvtzu_v
+ { 0b0000111000100001110110, 0b0000111100000000111001, 0b0001111000100010000000, 0 }, // scvtf_v
+ { 0b0010111000100001110110, 0b0010111100000000111001, 0b0001111000100011000000, 0 } // ucvtf_v
+};
+
+const SimdFmlal simdFmlal[6] = {
+ { 0b0010111011000000111111, 0b0000111111000000111100, 0, kET_S, kET_H, kET_H }, // bfmlalb_v
+ { 0b0110111011000000111111, 0b0100111111000000111100, 0, kET_S, kET_H, kET_H }, // bfmlalt_v
+ { 0b0000111000100000111011, 0b0000111110000000000000, 1, kET_S, kET_H, kET_H }, // fmlal_v
+ { 0b0010111000100000110011, 0b0010111110000000100000, 1, kET_S, kET_H, kET_H }, // fmlal2_v
+ { 0b0000111010100000111011, 0b0000111110000000010000, 1, kET_S, kET_H, kET_H }, // fmlsl_v
+ { 0b0010111010100000110011, 0b0010111110000000110000, 1, kET_S, kET_H, kET_H } // fmlsl2_v
+};
+
+const SimdLdNStN simdLdNStN[12] = {
+ { 0b0000110101000000000000, 0b0000110001000000001000, 1, 0 }, // ld1_v
+ { 0b0000110101000000110000, 0b0000000000000000000000, 1, 1 }, // ld1r_v
+ { 0b0000110101100000000000, 0b0000110001000000100000, 2, 0 }, // ld2_v
+ { 0b0000110101100000110000, 0b0000000000000000000000, 2, 1 }, // ld2r_v
+ { 0b0000110101000000001000, 0b0000110001000000010000, 3, 0 }, // ld3_v
+ { 0b0000110101000000111000, 0b0000000000000000000000, 3, 1 }, // ld3r_v
+ { 0b0000110101100000001000, 0b0000110001000000000000, 4, 0 }, // ld4_v
+ { 0b0000110101100000111000, 0b0000000000000000000000, 4, 1 }, // ld4r_v
+ { 0b0000110100000000000000, 0b0000110000000000001000, 1, 0 }, // st1_v
+ { 0b0000110100100000000000, 0b0000110000000000100000, 2, 0 }, // st2_v
+ { 0b0000110100000000001000, 0b0000110000000000010000, 3, 0 }, // st3_v
+ { 0b0000110100100000001000, 0b0000110000000000000000, 4, 0 } // st4_v
+};
+
+const SimdLdSt simdLdSt[2] = {
+ { 0b0011110101, 0b00111100010, 0b00111100011, 0b00011100, Inst::kIdLdur_v }, // ldr_v
+ { 0b0011110100, 0b00111100000, 0b00111100001, 0b00000000, Inst::kIdStur_v } // str_v
+};
+
+const SimdLdpStp simdLdpStp[4] = {
+ { 0b0010110001, 0b0000000000 }, // ldnp_v
+ { 0b0010110101, 0b0010110011 }, // ldp_v
+ { 0b0010110000, 0b0000000000 }, // stnp_v
+ { 0b0010110100, 0b0010110010 } // stp_v
+};
+
+const SimdLdurStur simdLdurStur[2] = {
+ { 0b0011110001000000000000 }, // ldur_v
+ { 0b0011110000000000000000 } // stur_v
+};
+
+const SimdMoviMvni simdMoviMvni[2] = {
+ { 0b0000111100000000000001, 0 }, // movi_v
+ { 0b0000111100000000000001, 1 } // mvni_v
+};
+
+const SimdShift simdShift[40] = {
+ { 0b0000000000000000000000, 0b0000111100000000100011, 1, kVO_V_B8H4S2 }, // rshrn_v
+ { 0b0000000000000000000000, 0b0100111100000000100011, 1, kVO_V_B16H8S4 }, // rshrn2_v
+ { 0b0000000000000000000000, 0b0000111100000000010101, 0, kVO_V_Any }, // shl_v
+ { 0b0000000000000000000000, 0b0000111100000000100001, 1, kVO_V_B8H4S2 }, // shrn_v
+ { 0b0000000000000000000000, 0b0100111100000000100001, 1, kVO_V_B16H8S4 }, // shrn2_v
+ { 0b0000000000000000000000, 0b0010111100000000010101, 0, kVO_V_Any }, // sli_v
+ { 0b0000111000100000010111, 0b0000000000000000000000, 1, kVO_SV_Any }, // sqrshl_v
+ { 0b0000000000000000000000, 0b0000111100000000100111, 1, kVO_SV_B8H4S2 }, // sqrshrn_v
+ { 0b0000000000000000000000, 0b0100111100000000100111, 1, kVO_V_B16H8S4 }, // sqrshrn2_v
+ { 0b0000000000000000000000, 0b0010111100000000100011, 1, kVO_SV_B8H4S2 }, // sqrshrun_v
+ { 0b0000000000000000000000, 0b0110111100000000100011, 1, kVO_V_B16H8S4 }, // sqrshrun2_v
+ { 0b0000111000100000010011, 0b0000111100000000011101, 0, kVO_SV_Any }, // sqshl_v
+ { 0b0000000000000000000000, 0b0010111100000000011001, 0, kVO_SV_Any }, // sqshlu_v
+ { 0b0000000000000000000000, 0b0000111100000000100101, 1, kVO_SV_B8H4S2 }, // sqshrn_v
+ { 0b0000000000000000000000, 0b0100111100000000100101, 1, kVO_V_B16H8S4 }, // sqshrn2_v
+ { 0b0000000000000000000000, 0b0010111100000000100001, 1, kVO_SV_B8H4S2 }, // sqshrun_v
+ { 0b0000000000000000000000, 0b0110111100000000100001, 1, kVO_V_B16H8S4 }, // sqshrun2_v
+ { 0b0000000000000000000000, 0b0010111100000000010001, 1, kVO_V_Any }, // sri_v
+ { 0b0000111000100000010101, 0b0000000000000000000000, 0, kVO_V_Any }, // srshl_v
+ { 0b0000000000000000000000, 0b0000111100000000001001, 1, kVO_V_Any }, // srshr_v
+ { 0b0000000000000000000000, 0b0000111100000000001101, 1, kVO_V_Any }, // srsra_v
+ { 0b0000111000100000010001, 0b0000000000000000000000, 0, kVO_V_Any }, // sshl_v
+ { 0b0000000000000000000000, 0b0000111100000000101001, 0, kVO_V_B8H4S2 }, // sshll_v
+ { 0b0000000000000000000000, 0b0100111100000000101001, 0, kVO_V_B16H8S4 }, // sshll2_v
+ { 0b0000000000000000000000, 0b0000111100000000000001, 1, kVO_V_Any }, // sshr_v
+ { 0b0000000000000000000000, 0b0000111100000000000101, 1, kVO_V_Any }, // ssra_v
+ { 0b0010111000100000010111, 0b0000000000000000000000, 0, kVO_SV_Any }, // uqrshl_v
+ { 0b0000000000000000000000, 0b0010111100000000100111, 1, kVO_SV_B8H4S2 }, // uqrshrn_v
+ { 0b0000000000000000000000, 0b0110111100000000100111, 1, kVO_V_B16H8S4 }, // uqrshrn2_v
+ { 0b0010111000100000010011, 0b0010111100000000011101, 0, kVO_SV_Any }, // uqshl_v
+ { 0b0000000000000000000000, 0b0010111100000000100101, 1, kVO_SV_B8H4S2 }, // uqshrn_v
+ { 0b0000000000000000000000, 0b0110111100000000100101, 1, kVO_V_B16H8S4 }, // uqshrn2_v
+ { 0b0010111000100000010101, 0b0000000000000000000000, 0, kVO_V_Any }, // urshl_v
+ { 0b0000000000000000000000, 0b0010111100000000001001, 1, kVO_V_Any }, // urshr_v
+ { 0b0000000000000000000000, 0b0010111100000000001101, 1, kVO_V_Any }, // ursra_v
+ { 0b0010111000100000010001, 0b0000000000000000000000, 0, kVO_V_Any }, // ushl_v
+ { 0b0000000000000000000000, 0b0010111100000000101001, 0, kVO_V_B8H4S2 }, // ushll_v
+ { 0b0000000000000000000000, 0b0110111100000000101001, 0, kVO_V_B16H8S4 }, // ushll2_v
+ { 0b0000000000000000000000, 0b0010111100000000000001, 1, kVO_V_Any }, // ushr_v
+ { 0b0000000000000000000000, 0b0010111100000000000101, 1, kVO_V_Any } // usra_v
+};
+
+const SimdShiftES simdShiftES[2] = {
+ { 0b0010111000100001001110, kVO_V_B8H4S2 }, // shll_v
+ { 0b0110111000100001001110, kVO_V_B16H8S4 } // shll2_v
+};
+
+const SimdSm3tt simdSm3tt[4] = {
+ { 0b1100111001000000100000 }, // sm3tt1a_v
+ { 0b1100111001000000100001 }, // sm3tt1b_v
+ { 0b1100111001000000100010 }, // sm3tt2a_v
+ { 0b1100111001000000100011 } // sm3tt2b_v
+};
+
+const SimdSmovUmov simdSmovUmov[2] = {
+ { 0b0000111000000000001011, kVO_V_BHS, 1 }, // smov_v
+ { 0b0000111000000000001111, kVO_V_Any, 0 } // umov_v
+};
+
+const SimdSxtlUxtl simdSxtlUxtl[4] = {
+ { 0b0000111100000000101001, kVO_V_B8H4S2 }, // sxtl_v
+ { 0b0100111100000000101001, kVO_V_B16H8S4 }, // sxtl2_v
+ { 0b0010111100000000101001, kVO_V_B8H4S2 }, // uxtl_v
+ { 0b0110111100000000101001, kVO_V_B16H8S4 } // uxtl2_v
+};
+
+const SimdTblTbx simdTblTbx[2] = {
+ { 0b0000111000000000000000 }, // tbl_v
+ { 0b0000111000000000000100 } // tbx_v
+};
+// ----------------------------------------------------------------------------
+// ${EncodingData:End}
+
+} // {EncodingData}
+} // {InstDB}
+
+/*
+// ${CommonData:Begin}
+// ------------------- Automatically generated, do not edit -------------------
+const InstDB::CommonInfo InstDB::commonData[] = {
+ { 0} // #0 [ref=440x]
+};
+// ----------------------------------------------------------------------------
+// ${CommonData:End}
+*/
+
+// ArmUtil - Id <-> Name
+// =====================
+
+#ifndef ASMJIT_DISABLE_TEXT
+// ${NameData:Begin}
+// ------------------- Automatically generated, do not edit -------------------
+const char InstDB::_nameData[] =
+ "\0" "adc\0" "adcs\0" "addg\0" "adds\0" "addv\0" "adr\0" "adrp\0" "aesd\0" "aese\0" "aesimc\0" "aesmc\0" "and\0"
+ "ands\0" "asr\0" "asrv\0" "at\0" "autda\0" "autdb\0" "autdza\0" "autdzb\0" "autia\0" "autia1716\0" "autiasp\0"
+ "autiaz\0" "autib\0" "autib1716\0" "autibsp\0" "autibz\0" "autiza\0" "autizb\0" "axflag\0" "bcax\0" "bfc\0" "bfcvt\0"
+ "bfcvtn\0" "bfcvtn2\0" "bfdot\0" "bfi\0" "bfmlalb\0" "bfmlalt\0" "bfmmla\0" "bfxil\0" "bic\0" "bics\0" "bif\0"
+ "blr\0" "br\0" "brk\0" "bsl\0" "cas\0" "casa\0" "casab\0" "casah\0" "casal\0" "casalb\0" "casalh\0" "casb\0" "cash\0"
+ "casl\0" "caslb\0" "caslh\0" "casp\0" "caspa\0" "caspal\0" "caspl\0" "cbnz\0" "cbz\0" "ccmn\0" "cfinv\0" "cinc\0"
+ "cinv\0" "clrex\0" "cls\0" "clz\0" "cmhi\0" "cmhs\0" "cmpp\0" "cmtst\0" "cneg\0" "cnt\0" "crc32b\0" "crc32cb\0"
+ "crc32ch\0" "crc32cw\0" "crc32cx\0" "crc32h\0" "crc32w\0" "crc32x\0" "csdb\0" "cset\0" "csetm\0" "csinc\0" "csinv\0"
+ "csneg\0" "dcps1\0" "dcps2\0" "dcps3\0" "dgh\0" "dmb\0" "drps\0" "dsb\0" "dup\0" "eon\0" "eor3\0" "eret\0" "esb\0"
+ "ext\0" "extr\0" "fabd\0" "fabs\0" "facge\0" "facgt\0" "fadd\0" "faddp\0" "fcadd\0" "fccmp\0" "fccmpe\0" "fcmeq\0"
+ "fcmge\0" "fcmgt\0" "fcmla\0" "fcmle\0" "fcmlt\0" "fcmp\0" "fcmpe\0" "fcsel\0" "fcvtas\0" "fcvtau\0" "fcvtl\0"
+ "fcvtl2\0" "fcvtms\0" "fcvtmu\0" "fcvtns\0" "fcvtnu\0" "fcvtps\0" "fcvtpu\0" "fcvtxn\0" "fcvtxn2\0" "fcvtzs\0"
+ "fcvtzu\0" "fdiv\0" "fjcvtzs\0" "fmadd\0" "fmax\0" "fmaxnm\0" "fmaxnmp\0" "fmaxnmv\0" "fmaxp\0" "fmaxv\0" "fmin\0"
+ "fminnm\0" "fminnmp\0" "fminnmv\0" "fminp\0" "fminv\0" "fmla\0" "fmlal\0" "fmlal2\0" "fmls\0" "fmlsl\0" "fmlsl2\0"
+ "fmov\0" "fmsub\0" "fmul\0" "fmulx\0" "fneg\0" "fnmadd\0" "fnmsub\0" "fnmul\0" "frecpe\0" "frecps\0" "frecpx\0"
+ "frint32x\0" "frint32z\0" "frint64x\0" "frint64z\0" "frinta\0" "frinti\0" "frintm\0" "frintn\0" "frintp\0" "frintx\0"
+ "frintz\0" "frsqrte\0" "frsqrts\0" "fsqrt\0" "fsub\0" "gmi\0" "hint\0" "hlt\0" "hvc\0" "ins\0" "isb\0" "ld1\0"
+ "ld1r\0" "ld2\0" "ld2r\0" "ld3\0" "ld3r\0" "ld4\0" "ld4r\0" "ldadd\0" "ldadda\0" "ldaddab\0" "ldaddah\0" "ldaddal\0"
+ "ldaddalb\0" "ldaddalh\0" "ldaddb\0" "ldaddh\0" "ldaddl\0" "ldaddlb\0" "ldaddlh\0" "ldar\0" "ldarb\0" "ldarh\0"
+ "ldaxp\0" "ldaxr\0" "ldaxrb\0" "ldaxrh\0" "ldclr\0" "ldclra\0" "ldclrab\0" "ldclrah\0" "ldclral\0" "ldclralb\0"
+ "ldclralh\0" "ldclrb\0" "ldclrh\0" "ldclrl\0" "ldclrlb\0" "ldclrlh\0" "ldeor\0" "ldeora\0" "ldeorab\0" "ldeorah\0"
+ "ldeoral\0" "ldeoralb\0" "ldeoralh\0" "ldeorb\0" "ldeorh\0" "ldeorl\0" "ldeorlb\0" "ldeorlh\0" "ldg\0" "ldgm\0"
+ "ldlar\0" "ldlarb\0" "ldlarh\0" "ldnp\0" "ldp\0" "ldpsw\0" "ldr\0" "ldraa\0" "ldrab\0" "ldrb\0" "ldrh\0" "ldrsb\0"
+ "ldrsh\0" "ldrsw\0" "ldset\0" "ldseta\0" "ldsetab\0" "ldsetah\0" "ldsetal\0" "ldsetalb\0" "ldsetalh\0" "ldsetb\0"
+ "ldseth\0" "ldsetl\0" "ldsetlb\0" "ldsetlh\0" "ldsmax\0" "ldsmaxa\0" "ldsmaxab\0" "ldsmaxah\0" "ldsmaxal\0"
+ "ldsmaxalb\0" "ldsmaxalh\0" "ldsmaxb\0" "ldsmaxh\0" "ldsmaxl\0" "ldsmaxlb\0" "ldsmaxlh\0" "ldsmin\0" "ldsmina\0"
+ "ldsminab\0" "ldsminah\0" "ldsminal\0" "ldsminalb\0" "ldsminalh\0" "ldsminb\0" "ldsminh\0" "ldsminl\0" "ldsminlb\0"
+ "ldsminlh\0" "ldtr\0" "ldtrb\0" "ldtrh\0" "ldtrsb\0" "ldtrsh\0" "ldtrsw\0" "ldumax\0" "ldumaxa\0" "ldumaxab\0"
+ "ldumaxah\0" "ldumaxal\0" "ldumaxalb\0" "ldumaxalh\0" "ldumaxb\0" "ldumaxh\0" "ldumaxl\0" "ldumaxlb\0" "ldumaxlh\0"
+ "ldumin\0" "ldumina\0" "lduminab\0" "lduminah\0" "lduminal\0" "lduminalb\0" "lduminalh\0" "lduminb\0" "lduminh\0"
+ "lduminl\0" "lduminlb\0" "lduminlh\0" "ldur\0" "ldurb\0" "ldurh\0" "ldursb\0" "ldursh\0" "ldursw\0" "ldxp\0" "ldxr\0"
+ "ldxrb\0" "ldxrh\0" "lslv\0" "lsr\0" "lsrv\0" "mneg\0" "movi\0" "movk\0" "movn\0" "movz\0" "mrs\0" "msr\0" "mvn\0"
+ "mvni\0" "negs\0" "ngc\0" "ngcs\0" "nop\0" "not\0" "orn\0" "orr\0" "pacda\0" "pacdb\0" "pacdza\0" "pacdzb\0"
+ "pacga\0" "pmul\0" "pmull\0" "pmull2\0" "pssbb\0" "raddhn\0" "raddhn2\0" "rax1\0" "rbit\0" "rev\0" "rev16\0"
+ "rev32\0" "rev64\0" "ror\0" "rorv\0" "rsubhn\0" "rsubhn2\0" "saba\0" "sabal\0" "sabal2\0" "sabd\0" "sabdl\0"
+ "sabdl2\0" "sadalp\0" "saddl\0" "saddl2\0" "saddlp\0" "saddlv\0" "saddw\0" "saddw2\0" "sbc\0" "sbcs\0" "sbfiz\0"
+ "sbfm\0" "sbfx\0" "scvtf\0" "sdiv\0" "setf16\0" "setf8\0" "sev\0" "sevl\0" "sha1c\0" "sha1h\0" "sha1m\0" "sha1p\0"
+ "sha1su0\0" "sha1su1\0" "sha256h\0" "sha256h2\0" "sha256su0\0" "sha256su1\0" "sha512h\0" "sha512h2\0" "sha512su0\0"
+ "sha512su1\0" "shadd\0" "shsub\0" "sli\0" "sm3partw1\0" "sm3partw2\0" "sm3ss1\0" "sm3tt1a\0" "sm3tt1b\0" "sm3tt2a\0"
+ "sm3tt2b\0" "sm4e\0" "sm4ekey\0" "smaddl\0" "smaxp\0" "smaxv\0" "sminp\0" "sminv\0" "smlal\0" "smlal2\0" "smlsl\0"
+ "smlsl2\0" "smnegl\0" "smov\0" "smsubl\0" "smulh\0" "smull\0" "smull2\0" "sqabs\0" "sqdmlal\0" "sqdmlal2\0"
+ "sqdmlsl\0" "sqdmlsl2\0" "sqdmulh\0" "sqdmull\0" "sqdmull2\0" "sqneg\0" "sqrdmlah\0" "sqrdmlsh\0" "sqrdmulh\0"
+ "sqrshl\0" "sqrshrn\0" "sqrshrn2\0" "sqrshrun\0" "sqrshrun2\0" "sqshl\0" "sqshlu\0" "sqshrn\0" "sqshrn2\0"
+ "sqshrun\0" "sqshrun2\0" "sqsub\0" "sqxtn\0" "sqxtn2\0" "sqxtun\0" "sqxtun2\0" "srhadd\0" "sri\0" "srshl\0" "srshr\0"
+ "srsra\0" "sshl\0" "sshll\0" "sshll2\0" "sshr\0" "ssra\0" "ssubl\0" "ssubl2\0" "ssubw\0" "ssubw2\0" "st1\0" "st2\0"
+ "st2g\0" "st3\0" "st4\0" "stadd\0" "staddb\0" "staddh\0" "staddl\0" "staddlb\0" "staddlh\0" "stclr\0" "stclrb\0"
+ "stclrh\0" "stclrl\0" "stclrlb\0" "stclrlh\0" "steor\0" "steorb\0" "steorh\0" "steorl\0" "steorlb\0" "steorlh\0"
+ "stg\0" "stgm\0" "stgp\0" "stllr\0" "stllrb\0" "stllrh\0" "stlr\0" "stlrb\0" "stlrh\0" "stlxp\0" "stlxr\0" "stlxrb\0"
+ "stlxrh\0" "stnp\0" "stp\0" "str\0" "strb\0" "strh\0" "stset\0" "stsetb\0" "stseth\0" "stsetl\0" "stsetlb\0"
+ "stsetlh\0" "stsmax\0" "stsmaxb\0" "stsmaxh\0" "stsmaxl\0" "stsmaxlb\0" "stsmaxlh\0" "stsmin\0" "stsminb\0"
+ "stsminh\0" "stsminl\0" "stsminlb\0" "stsminlh\0" "sttr\0" "sttrb\0" "sttrh\0" "stumax\0" "stumaxb\0" "stumaxh\0"
+ "stumaxl\0" "stumaxlb\0" "stumaxlh\0" "stumin\0" "stuminb\0" "stuminh\0" "stuminl\0" "stuminlb\0" "stuminlh\0"
+ "stur\0" "sturb\0" "sturh\0" "stxp\0" "stxr\0" "stxrb\0" "stxrh\0" "stz2g\0" "stzg\0" "stzgm\0" "subg\0" "subp\0"
+ "subps\0" "subs\0" "sudot\0" "suqadd\0" "svc\0" "swp\0" "swpa\0" "swpab\0" "swpah\0" "swpal\0" "swpalb\0" "swpalh\0"
+ "swpb\0" "swph\0" "swpl\0" "swplb\0" "swplh\0" "sxtb\0" "sxth\0" "sxtl\0" "sxtl2\0" "sxtw\0" "sys\0" "tbl\0" "tbnz\0"
+ "tbx\0" "tbz\0" "tlbi\0" "trn1\0" "trn2\0" "uaba\0" "uabal\0" "uabal2\0" "uabd\0" "uabdl\0" "uabdl2\0" "uadalp\0"
+ "uaddl\0" "uaddl2\0" "uaddlp\0" "uaddlv\0" "uaddw\0" "uaddw2\0" "ubfiz\0" "ubfm\0" "ubfx\0" "ucvtf\0" "udf\0"
+ "udiv\0" "uhadd\0" "uhsub\0" "umaddl\0" "umaxp\0" "umaxv\0" "uminp\0" "uminv\0" "umlal\0" "umlal2\0" "umlsl\0"
+ "umlsl2\0" "ummla\0" "umnegl\0" "umov\0" "umsubl\0" "umulh\0" "umull\0" "umull2\0" "uqrshl\0" "uqrshrn\0"
+ "uqrshrn2\0" "uqshl\0" "uqshrn\0" "uqshrn2\0" "uqsub\0" "uqxtn\0" "uqxtn2\0" "urecpe\0" "urhadd\0" "urshl\0"
+ "urshr\0" "ursqrte\0" "ursra\0" "usdot\0" "ushl\0" "ushll\0" "ushll2\0" "ushr\0" "usmmla\0" "usqadd\0" "usra\0"
+ "usubl\0" "usubl2\0" "usubw\0" "usubw2\0" "uxtb\0" "uxth\0" "uxtl\0" "uxtl2\0" "uzp1\0" "uzp2\0" "wfe\0" "wfi\0"
+ "xaflag\0" "xar\0" "xpacd\0" "xpaci\0" "xpaclri\0" "yield\0" "zip1\0" "zip2";
+
+const InstDB::InstNameIndex InstDB::instNameIndex[26] = {
+ { Inst::kIdAdc , Inst::kIdAnd_v + 1 },
+ { Inst::kIdB , Inst::kIdBsl_v + 1 },
+ { Inst::kIdCas , Inst::kIdCnt_v + 1 },
+ { Inst::kIdDc , Inst::kIdDup_v + 1 },
+ { Inst::kIdEon , Inst::kIdExt_v + 1 },
+ { Inst::kIdFabd_v , Inst::kIdFsub_v + 1 },
+ { Inst::kIdGmi , Inst::kIdGmi + 1 },
+ { Inst::kIdHint , Inst::kIdHvc + 1 },
+ { Inst::kIdIc , Inst::kIdIns_v + 1 },
+ { Inst::kIdNone , Inst::kIdNone + 1 },
+ { Inst::kIdNone , Inst::kIdNone + 1 },
+ { Inst::kIdLdadd , Inst::kIdLdur_v + 1 },
+ { Inst::kIdMadd , Inst::kIdMvni_v + 1 },
+ { Inst::kIdNeg , Inst::kIdNot_v + 1 },
+ { Inst::kIdOrn , Inst::kIdOrr_v + 1 },
+ { Inst::kIdPacda , Inst::kIdPmull2_v + 1 },
+ { Inst::kIdNone , Inst::kIdNone + 1 },
+ { Inst::kIdRbit , Inst::kIdRsubhn2_v + 1 },
+ { Inst::kIdSbc , Inst::kIdSxtl2_v + 1 },
+ { Inst::kIdTlbi , Inst::kIdTrn2_v + 1 },
+ { Inst::kIdUbfiz , Inst::kIdUzp2_v + 1 },
+ { Inst::kIdNone , Inst::kIdNone + 1 },
+ { Inst::kIdWfe , Inst::kIdWfi + 1 },
+ { Inst::kIdXaflag , Inst::kIdXtn2_v + 1 },
+ { Inst::kIdYield , Inst::kIdYield + 1 },
+ { Inst::kIdZip1_v , Inst::kIdZip2_v + 1 }
+};
+// ----------------------------------------------------------------------------
+// ${NameData:End}
+#endif
+
+ASMJIT_END_SUB_NAMESPACE
+
+#endif // !ASMJIT_NO_AARCH64
diff --git a/3rdparty/asmjit/src/asmjit/arm/a64instdb.h b/3rdparty/asmjit/src/asmjit/arm/a64instdb.h
new file mode 100644
index 00000000000..0575d1a2fa6
--- /dev/null
+++ b/3rdparty/asmjit/src/asmjit/arm/a64instdb.h
@@ -0,0 +1,74 @@
+// This file is part of AsmJit project <https://asmjit.com>
+//
+// See asmjit.h or LICENSE.md for license and copyright information
+// SPDX-License-Identifier: Zlib
+
+#ifndef ASMJIT_ARM_A64INSTDB_H_INCLUDED
+#define ASMJIT_ARM_A64INSTDB_H_INCLUDED
+
+#include "../arm/a64globals.h"
+
+ASMJIT_BEGIN_SUB_NAMESPACE(a64)
+
+//! \addtogroup asmjit_a64
+//! \{
+
+//! Instruction database (AArch64).
+namespace InstDB {
+
+//! Instruction flags.
+enum InstFlags : uint32_t {
+ //! The instruction provides conditional execution.
+ kInstFlagCond = 0x00000001u,
+ //! SIMD instruction that processes elements in pairs.
+ kInstFlagPair = 0x00000002u,
+ //! SIMD instruction that does widening (Long).
+ kInstFlagLong = 0x00000004u,
+ //! SIMD instruction that does narrowing (Narrow).
+ kInstFlagNarrow = 0x00000008u,
+ //! SIMD element access of half-words can only be used with v0..15.
+ kInstFlagVH0_15 = 0x00000010u,
+
+ //! Instruction may consecutive registers if the number of operands is greater than 2.
+ kInstFlagConsecutive = 0x00000080u
+};
+
+//! Instruction information (AArch64).
+struct InstInfo {
+ //! Instruction encoding type.
+ uint32_t _encoding : 8;
+ //! Index to data specific to each encoding type.
+ uint32_t _encodingDataIndex : 8;
+ uint32_t _reserved : 2;
+ //! Index to \ref _nameData.
+ uint32_t _nameDataIndex : 14;
+
+ uint16_t _rwInfoIndex;
+ uint16_t _flags;
+
+ //! \name Accessors
+ //! \{
+
+ inline uint32_t rwInfoIndex() const noexcept { return _rwInfoIndex; }
+ inline uint32_t flags() const noexcept { return _flags; }
+
+ inline bool hasFlag(uint32_t flag) const { return (_flags & flag) != 0; }
+
+ //! \}
+};
+
+ASMJIT_VARAPI const InstInfo _instInfoTable[];
+
+static inline const InstInfo& infoById(InstId instId) noexcept {
+ instId &= uint32_t(InstIdParts::kRealId);
+ ASMJIT_ASSERT(Inst::isDefinedId(instId));
+ return _instInfoTable[instId];
+}
+
+} // {InstDB}
+
+//! \}
+
+ASMJIT_END_SUB_NAMESPACE
+
+#endif // ASMJIT_ARM_A64INSTDB_H_INCLUDED
diff --git a/3rdparty/asmjit/src/asmjit/arm/a64instdb_p.h b/3rdparty/asmjit/src/asmjit/arm/a64instdb_p.h
new file mode 100644
index 00000000000..eb4f3f83766
--- /dev/null
+++ b/3rdparty/asmjit/src/asmjit/arm/a64instdb_p.h
@@ -0,0 +1,876 @@
+// This file is part of AsmJit project <https://asmjit.com>
+//
+// See asmjit.h or LICENSE.md for license and copyright information
+// SPDX-License-Identifier: Zlib
+
+#ifndef ASMJIT_ARM_A64INSTDB_H_P_INCLUDED
+#define ASMJIT_ARM_A64INSTDB_H_P_INCLUDED
+
+#include "../core/codeholder.h"
+#include "../arm/a64instdb.h"
+#include "../arm/a64operand.h"
+
+ASMJIT_BEGIN_SUB_NAMESPACE(a64)
+
+//! \cond INTERNAL
+//! \addtogroup asmjit_a64
+//! \{
+
+namespace InstDB {
+
+// a64::InstDB - Constants Used by Instructions
+// ============================================
+
+// GP register types supported by base instructions.
+static constexpr uint32_t kW = 0x1;
+static constexpr uint32_t kX = 0x2;
+static constexpr uint32_t kWX = 0x3;
+
+// GP high register IDs supported by the instruction.
+static constexpr uint32_t kZR = Gp::kIdZr;
+static constexpr uint32_t kSP = Gp::kIdSp;
+
+// a64::InstDB - RWInfo
+// ====================
+
+enum RWInfoType : uint32_t {
+ kRWI_R,
+ kRWI_RW,
+ kRWI_RX,
+ kRWI_RRW,
+ kRWI_RWX,
+ kRWI_W,
+ kRWI_WRW,
+ kRWI_WRX,
+ kRWI_WRRW,
+ kRWI_WRRX,
+ kRWI_WW,
+ kRWI_X,
+ kRWI_XRX,
+ kRWI_XXRRX,
+
+ kRWI_LDn,
+ kRWI_STn,
+
+ kRWI_SpecialStart = kRWI_LDn
+};
+
+// a64::InstDB - ElementType
+// =========================
+
+enum ElementType : uint8_t {
+ kET_None = Vec::kElementTypeNone,
+ kET_B = Vec::kElementTypeB,
+ kET_H = Vec::kElementTypeH,
+ kET_S = Vec::kElementTypeS,
+ kET_D = Vec::kElementTypeD,
+ kET_2H = Vec::kElementTypeH2,
+ kET_4B = Vec::kElementTypeB4
+};
+
+// a64::InstDB - GpType
+// ====================
+
+enum GpType : uint8_t {
+ kGp_W,
+ kGp_X,
+ kGp_X_SP
+};
+
+// a64::InstDB - OPSig
+// ===================
+
+enum kOpSignature : uint32_t {
+ kOp_GpW = GpW::kSignature,
+ kOp_GpX = GpX::kSignature,
+
+ kOp_B = VecB::kSignature,
+ kOp_H = VecH::kSignature,
+ kOp_S = VecS::kSignature,
+ kOp_D = VecD::kSignature,
+ kOp_Q = VecV::kSignature,
+
+ kOp_V8B = VecD::kSignature | Vec::kSignatureElementB,
+ kOp_V4H = VecD::kSignature | Vec::kSignatureElementH,
+ kOp_V2S = VecD::kSignature | Vec::kSignatureElementS,
+
+ kOp_V16B = VecV::kSignature | Vec::kSignatureElementB,
+ kOp_V8H = VecV::kSignature | Vec::kSignatureElementH,
+ kOp_V4S = VecV::kSignature | Vec::kSignatureElementS,
+ kOp_V2D = VecV::kSignature | Vec::kSignatureElementD
+};
+
+// a64::InstDB - HFConv
+// ====================
+
+enum kHFConv : uint32_t {
+ //! FP16 version of the instruction is not available.
+ kHF_N,
+
+ //! Doesn't do any change to the opcode.
+ kHF_0,
+
+ kHF_A,
+ kHF_B,
+ kHF_C,
+ kHF_D,
+
+ kHF_Count
+};
+
+// a64::InstDB - VOType
+// ====================
+
+//! Vector operand type combinations used by FP&SIMD instructions.
+enum VOType : uint32_t {
+ kVO_V_B,
+ kVO_V_BH,
+ kVO_V_BH_4S,
+ kVO_V_BHS,
+ kVO_V_BHS_D2,
+ kVO_V_HS,
+ kVO_V_S,
+
+ kVO_V_B8H4,
+ kVO_V_B8H4S2,
+ kVO_V_B8D1,
+ kVO_V_H4S2,
+
+ kVO_V_B16,
+ kVO_V_B16H8,
+ kVO_V_B16H8S4,
+ kVO_V_B16D2,
+ kVO_V_H8S4,
+ kVO_V_S4,
+ kVO_V_D2,
+
+ kVO_SV_BHS,
+ kVO_SV_B8H4S2,
+ kVO_SV_HS,
+ kVO_V_Any,
+ kVO_SV_Any,
+
+ kVO_Count
+};
+
+// a64::InstDB - EncodingId
+// ========================
+
+// ${EncodingId:Begin}
+// ------------------- Automatically generated, do not edit -------------------
+enum EncodingId : uint32_t {
+ kEncodingNone = 0,
+ kEncodingBaseAddSub,
+ kEncodingBaseAdr,
+ kEncodingBaseAtDcIcTlbi,
+ kEncodingBaseAtomicCasp,
+ kEncodingBaseAtomicOp,
+ kEncodingBaseAtomicSt,
+ kEncodingBaseBfc,
+ kEncodingBaseBfi,
+ kEncodingBaseBfm,
+ kEncodingBaseBfx,
+ kEncodingBaseBranchCmp,
+ kEncodingBaseBranchReg,
+ kEncodingBaseBranchRel,
+ kEncodingBaseBranchTst,
+ kEncodingBaseCCmp,
+ kEncodingBaseCInc,
+ kEncodingBaseCSel,
+ kEncodingBaseCSet,
+ kEncodingBaseCmpCmn,
+ kEncodingBaseExtend,
+ kEncodingBaseExtract,
+ kEncodingBaseLdSt,
+ kEncodingBaseLdpStp,
+ kEncodingBaseLdxp,
+ kEncodingBaseLogical,
+ kEncodingBaseMov,
+ kEncodingBaseMovKNZ,
+ kEncodingBaseMrs,
+ kEncodingBaseMsr,
+ kEncodingBaseMvnNeg,
+ kEncodingBaseOp,
+ kEncodingBaseOpImm,
+ kEncodingBaseR,
+ kEncodingBaseRM_NoImm,
+ kEncodingBaseRM_SImm10,
+ kEncodingBaseRM_SImm9,
+ kEncodingBaseRR,
+ kEncodingBaseRRII,
+ kEncodingBaseRRR,
+ kEncodingBaseRRRR,
+ kEncodingBaseRev,
+ kEncodingBaseShift,
+ kEncodingBaseStx,
+ kEncodingBaseStxp,
+ kEncodingBaseSys,
+ kEncodingBaseTst,
+ kEncodingFSimdPair,
+ kEncodingFSimdSV,
+ kEncodingFSimdVV,
+ kEncodingFSimdVVV,
+ kEncodingFSimdVVVV,
+ kEncodingFSimdVVVe,
+ kEncodingISimdPair,
+ kEncodingISimdSV,
+ kEncodingISimdVV,
+ kEncodingISimdVVV,
+ kEncodingISimdVVVI,
+ kEncodingISimdVVVV,
+ kEncodingISimdVVVVx,
+ kEncodingISimdVVVe,
+ kEncodingISimdVVVx,
+ kEncodingISimdVVx,
+ kEncodingISimdWWV,
+ kEncodingSimdBicOrr,
+ kEncodingSimdCmp,
+ kEncodingSimdDot,
+ kEncodingSimdDup,
+ kEncodingSimdFcadd,
+ kEncodingSimdFccmpFccmpe,
+ kEncodingSimdFcm,
+ kEncodingSimdFcmla,
+ kEncodingSimdFcmpFcmpe,
+ kEncodingSimdFcsel,
+ kEncodingSimdFcvt,
+ kEncodingSimdFcvtLN,
+ kEncodingSimdFcvtSV,
+ kEncodingSimdFmlal,
+ kEncodingSimdFmov,
+ kEncodingSimdIns,
+ kEncodingSimdLdNStN,
+ kEncodingSimdLdSt,
+ kEncodingSimdLdpStp,
+ kEncodingSimdLdurStur,
+ kEncodingSimdMov,
+ kEncodingSimdMoviMvni,
+ kEncodingSimdShift,
+ kEncodingSimdShiftES,
+ kEncodingSimdSm3tt,
+ kEncodingSimdSmovUmov,
+ kEncodingSimdSxtlUxtl,
+ kEncodingSimdTblTbx
+};
+// ----------------------------------------------------------------------------
+// ${EncodingId:End}
+
+// a64::InstDB::EncodingData
+// =========================
+
+namespace EncodingData {
+
+#define M_OPCODE(field, bits) \
+ uint32_t _##field : bits; \
+ inline constexpr uint32_t field() const noexcept { return uint32_t(_##field) << (32 - bits); }
+
+struct BaseOp {
+ uint32_t opcode;
+};
+
+struct BaseOpImm {
+ uint32_t opcode;
+ uint16_t immBits;
+ uint16_t immOffset;
+};
+
+struct BaseR {
+ uint32_t opcode;
+ uint32_t rType : 8;
+ uint32_t rHiId : 8;
+ uint32_t rShift : 8;
+};
+
+struct BaseRR {
+ uint32_t opcode;
+ uint32_t aType : 2;
+ uint32_t aHiId : 6;
+ uint32_t aShift : 5;
+ uint32_t bType : 2;
+ uint32_t bHiId : 6;
+ uint32_t bShift : 5;
+ uint32_t uniform : 1;
+};
+
+struct BaseRRR {
+ M_OPCODE(opcode, 22)
+ uint32_t aType : 2;
+ uint32_t aHiId : 6;
+ uint32_t bType : 2;
+ uint32_t bHiId : 6;
+ uint32_t cType : 2;
+ uint32_t cHiId : 6;
+ uint32_t uniform : 1;
+};
+
+struct BaseRRRR {
+ M_OPCODE(opcode, 22)
+ uint32_t aType : 2;
+ uint32_t aHiId : 6;
+ uint32_t bType : 2;
+ uint32_t bHiId : 6;
+ uint32_t cType : 2;
+ uint32_t cHiId : 6;
+ uint32_t dType : 2;
+ uint32_t dHiId : 6;
+ uint32_t uniform : 1;
+};
+
+struct BaseRRII {
+ M_OPCODE(opcode, 22)
+ uint32_t aType : 2;
+ uint32_t aHiId : 6;
+ uint32_t bType : 2;
+ uint32_t bHiId : 6;
+ uint32_t aImmSize : 6;
+ uint32_t aImmDiscardLsb : 5;
+ uint32_t aImmOffset : 5;
+ uint32_t bImmSize : 6;
+ uint32_t bImmDiscardLsb : 5;
+ uint32_t bImmOffset : 5;
+};
+
+struct BaseAtDcIcTlbi {
+ uint32_t immVerifyMask : 14;
+ uint32_t immVerifyData : 14;
+ uint32_t mandatoryReg : 1;
+};
+
+struct BaseAdcSbc {
+ uint32_t opcode;
+};
+
+struct BaseAddSub {
+ uint32_t shiftedOp : 10; // sf|.......|Sh|.|Rm| Imm:6 |Rn|Rd|
+ uint32_t extendedOp : 10; // sf|.......|..|.|Rm|Opt|Imm3|Rn|Rd|
+ uint32_t immediateOp: 10; // sf|.......|Sh| Imm:12 |Rn|Rd|
+};
+
+struct BaseAdr {
+ M_OPCODE(opcode, 22)
+ OffsetType offsetType : 8;
+};
+
+struct BaseBfm {
+ uint32_t opcode; // sf|........|N|ImmR:6|ImmS:6|Rn|Rd|
+};
+
+struct BaseCmpCmn {
+ uint32_t shiftedOp : 10; // sf|.......|Sh|.|Rm| Imm:6 |Rn|11111|
+ uint32_t extendedOp : 10; // sf|.......|..|.|Rm|Opt|Imm3|Rn|11111|
+ uint32_t immediateOp: 10; // sf|.......|Sh| Imm:12 |Rn|11111|
+};
+
+struct BaseExtend {
+ M_OPCODE(opcode, 22) // sf|........|N|......|......|Rn|Rd|
+ uint32_t rType : 2;
+ uint32_t u : 1;
+};
+
+struct BaseLogical {
+ uint32_t shiftedOp : 10; // sf|.......|Sh|.|Rm| Imm:6 |Rn|Rd|
+ uint32_t immediateOp: 10; // sf|........|N|ImmR:6|ImmS:6|Rn|Rd|
+ uint32_t negateImm : 1 ; // True if this is an operation that must negate IMM.
+};
+
+struct BaseMvnNeg {
+ uint32_t opcode;
+};
+
+struct BaseShift {
+ M_OPCODE(registerOp, 22)
+ M_OPCODE(immediateOp, 22)
+ uint32_t ror : 2;
+};
+
+struct BaseTst {
+ uint32_t shiftedOp : 10; // sf|.......|Sh|.|Rm| Imm:6 |Rn|11111|
+ uint32_t immediateOp: 10; // sf|........|N|ImmR:6|ImmS:6|Rn|11111|
+};
+
+struct BaseRM_NoImm {
+ M_OPCODE(opcode, 22)
+ uint32_t rType : 2;
+ uint32_t rHiId : 6;
+ uint32_t xOffset : 5;
+};
+
+struct BaseRM_SImm9 {
+ M_OPCODE(offsetOp, 22)
+ M_OPCODE(prePostOp, 22)
+ uint32_t rType : 2;
+ uint32_t rHiId : 6;
+ uint32_t xOffset : 5;
+ uint32_t immShift : 4;
+};
+
+struct BaseRM_SImm10 {
+ M_OPCODE(opcode, 22)
+ uint32_t rType : 2;
+ uint32_t rHiId : 6;
+ uint32_t xOffset : 5;
+ uint32_t immShift : 4;
+};
+
+struct BaseLdSt {
+ uint32_t uOffsetOp : 10;
+ uint32_t prePostOp : 11;
+ uint32_t registerOp : 11;
+ uint32_t literalOp : 8;
+ uint32_t rType : 2;
+ uint32_t xOffset : 5;
+ uint32_t uOffsetShift : 3;
+ uint32_t uAltInstId : 14;
+};
+
+struct BaseLdpStp {
+ uint32_t offsetOp : 10;
+ uint32_t prePostOp : 10;
+ uint32_t rType : 2;
+ uint32_t xOffset : 5;
+ uint32_t offsetShift : 3;
+};
+
+struct BaseStx {
+ M_OPCODE(opcode, 22)
+ uint32_t rType : 2;
+ uint32_t xOffset : 5;
+};
+
+struct BaseLdxp {
+ M_OPCODE(opcode, 22)
+ uint32_t rType : 2;
+ uint32_t xOffset : 5;
+};
+
+struct BaseStxp {
+ M_OPCODE(opcode, 22)
+ uint32_t rType : 2;
+ uint32_t xOffset : 5;
+};
+
+struct BaseAtomicOp {
+ M_OPCODE(opcode, 22)
+ uint32_t rType : 2;
+ uint32_t xOffset : 5;
+ uint32_t zr : 1;
+};
+
+struct BaseAtomicSt {
+ M_OPCODE(opcode, 22)
+ uint32_t rType : 2;
+ uint32_t xOffset : 5;
+};
+
+struct BaseAtomicCasp {
+ M_OPCODE(opcode, 22)
+ uint32_t rType : 2;
+ uint32_t xOffset : 5;
+};
+
+typedef BaseOp BaseBranchReg;
+typedef BaseOp BaseBranchRel;
+typedef BaseOp BaseBranchCmp;
+typedef BaseOp BaseBranchTst;
+typedef BaseOp BaseExtract;
+typedef BaseOp BaseBfc;
+typedef BaseOp BaseBfi;
+typedef BaseOp BaseBfx;
+typedef BaseOp BaseCCmp;
+typedef BaseOp BaseCInc;
+typedef BaseOp BaseCSet;
+typedef BaseOp BaseCSel;
+typedef BaseOp BaseMovKNZ;
+typedef BaseOp BaseMull;
+
+struct FSimdGeneric {
+ uint32_t _scalarOp : 28;
+ uint32_t _scalarHf : 4;
+ uint32_t _vectorOp : 28;
+ uint32_t _vectorHf : 4;
+
+ constexpr uint32_t scalarOp() const noexcept { return uint32_t(_scalarOp) << 10; }
+ constexpr uint32_t vectorOp() const noexcept { return uint32_t(_vectorOp) << 10; }
+ constexpr uint32_t scalarHf() const noexcept { return uint32_t(_scalarHf); }
+ constexpr uint32_t vectorHf() const noexcept { return uint32_t(_vectorHf); }
+};
+
+typedef FSimdGeneric FSimdVV;
+typedef FSimdGeneric FSimdVVV;
+typedef FSimdGeneric FSimdVVVV;
+
+struct FSimdSV {
+ uint32_t opcode;
+};
+
+struct FSimdVVVe {
+ uint32_t _scalarOp : 28;
+ uint32_t _scalarHf : 4;
+ uint32_t _vectorOp;
+ uint32_t _elementOp;
+
+ constexpr uint32_t scalarOp() const noexcept { return uint32_t(_scalarOp) << 10; }
+ constexpr uint32_t scalarHf() const noexcept { return uint32_t(_scalarHf); };
+ constexpr uint32_t vectorOp() const noexcept { return uint32_t(_vectorOp) << 10; }
+ constexpr uint32_t vectorHf() const noexcept { return kHF_C; }
+ constexpr uint32_t elementScalarOp() const noexcept { return (uint32_t(_elementOp) << 10) | (0x5u << 28); }
+ constexpr uint32_t elementVectorOp() const noexcept { return (uint32_t(_elementOp) << 10); }
+};
+
+struct SimdFcadd {
+ uint32_t _opcode;
+
+ constexpr uint32_t opcode() const noexcept { return _opcode << 10; }
+};
+
+struct SimdFcmla {
+ uint32_t _regularOp;
+ uint32_t _elementOp;
+
+ constexpr uint32_t regularOp() const noexcept { return uint32_t(_regularOp) << 10; }
+ constexpr uint32_t elementOp() const noexcept { return (uint32_t(_elementOp) << 10); }
+};
+
+struct SimdFccmpFccmpe {
+ uint32_t _opcode;
+ constexpr uint32_t opcode() const noexcept { return _opcode; }
+};
+
+struct SimdFcm {
+ uint32_t _registerOp : 28;
+ uint32_t _registerHf : 4;
+
+ uint32_t _zeroOp : 28;
+
+ constexpr bool hasRegisterOp() const noexcept { return _registerOp != 0; }
+ constexpr bool hasZeroOp() const noexcept { return _zeroOp != 0; }
+
+ constexpr uint32_t registerScalarOp() const noexcept { return (uint32_t(_registerOp) << 10) | (0x5u << 28); }
+ constexpr uint32_t registerVectorOp() const noexcept { return uint32_t(_registerOp) << 10; }
+ constexpr uint32_t registerScalarHf() const noexcept { return uint32_t(_registerHf); }
+ constexpr uint32_t registerVectorHf() const noexcept { return uint32_t(_registerHf); }
+
+ constexpr uint32_t zeroScalarOp() const noexcept { return (uint32_t(_zeroOp) << 10) | (0x5u << 28); }
+ constexpr uint32_t zeroVectorOp() const noexcept { return (uint32_t(_zeroOp) << 10); }
+};
+
+struct SimdFcmpFcmpe {
+ uint32_t _opcode;
+ constexpr uint32_t opcode() const noexcept { return _opcode; }
+};
+
+struct SimdFcvtLN {
+ uint32_t _opcode : 22;
+ uint32_t _isCvtxn : 1;
+ uint32_t _hasScalar : 1;
+
+ constexpr uint32_t scalarOp() const noexcept { return (uint32_t(_opcode) << 10) | (0x5u << 28); }
+ constexpr uint32_t vectorOp() const noexcept { return (uint32_t(_opcode) << 10); }
+
+ constexpr uint32_t isCvtxn() const noexcept { return _isCvtxn; }
+ constexpr uint32_t hasScalar() const noexcept { return _hasScalar; }
+};
+
+struct SimdFcvtSV {
+ uint32_t _vectorIntOp;
+ uint32_t _vectorFpOp;
+ uint32_t _generalOp : 31;
+ uint32_t _isFloatToInt : 1;
+
+ constexpr uint32_t scalarIntOp() const noexcept { return (uint32_t(_vectorIntOp) << 10) | (0x5u << 28); }
+ constexpr uint32_t vectorIntOp() const noexcept { return uint32_t(_vectorIntOp) << 10; }
+ constexpr uint32_t scalarFpOp() const noexcept { return (uint32_t(_vectorFpOp) << 10) | (0x5u << 28); }
+ constexpr uint32_t vectorFpOp() const noexcept { return uint32_t(_vectorFpOp) << 10; }
+ constexpr uint32_t generalOp() const noexcept { return (uint32_t(_generalOp) << 10); }
+
+ constexpr uint32_t isFloatToInt() const noexcept { return _isFloatToInt; }
+ constexpr uint32_t isFixedPoint() const noexcept { return _vectorFpOp != 0; }
+};
+
+struct SimdFmlal {
+ uint32_t _vectorOp;
+ uint32_t _elementOp;
+ uint8_t _optionalQ;
+ uint8_t tA;
+ uint8_t tB;
+ uint8_t tElement;
+
+ constexpr uint32_t vectorOp() const noexcept { return uint32_t(_vectorOp) << 10; }
+ constexpr uint32_t elementOp() const noexcept { return uint32_t(_elementOp) << 10; }
+ constexpr uint32_t optionalQ() const noexcept { return _optionalQ; }
+};
+
+struct FSimdPair {
+ uint32_t _scalarOp;
+ uint32_t _vectorOp;
+
+ constexpr uint32_t scalarOp() const noexcept { return uint32_t(_scalarOp) << 10; }
+ constexpr uint32_t vectorOp() const noexcept { return uint32_t(_vectorOp) << 10; }
+};
+
+struct ISimdVV {
+ M_OPCODE(opcode, 22)
+ uint32_t vecOpType : 6;
+};
+
+struct ISimdVVx {
+ M_OPCODE(opcode, 22)
+ uint32_t op0Signature;
+ uint32_t op1Signature;
+};
+
+struct ISimdSV {
+ M_OPCODE(opcode, 22)
+ uint32_t vecOpType : 6;
+};
+
+struct ISimdVVV {
+ M_OPCODE(opcode, 22)
+ uint32_t vecOpType : 6;
+};
+
+struct ISimdVVVx {
+ M_OPCODE(opcode, 22)
+ uint32_t op0Signature;
+ uint32_t op1Signature;
+ uint32_t op2Signature;
+};
+
+struct ISimdWWV {
+ M_OPCODE(opcode, 22)
+ uint32_t vecOpType : 6;
+};
+
+struct ISimdVVVe {
+ uint32_t regularOp : 26; // 22 bits used.
+ uint32_t regularVecType : 6;
+ uint32_t elementOp : 26; // 22 bits used.
+ uint32_t elementVecType : 6;
+};
+
+struct ISimdVVVI {
+ M_OPCODE(opcode, 22)
+ uint32_t vecOpType : 6;
+ uint32_t immSize : 4;
+ uint32_t immShift : 4;
+ uint32_t imm64HasOneBitLess : 1;
+};
+
+struct ISimdVVVV {
+ uint32_t opcode : 22;
+ uint32_t vecOpType : 6;
+};
+
+struct ISimdVVVVx {
+ uint32_t opcode;
+ uint32_t op0Signature;
+ uint32_t op1Signature;
+ uint32_t op2Signature;
+ uint32_t op3Signature;
+};
+
+struct SimdBicOrr {
+ uint32_t registerOp; // 22 bits used.
+ uint32_t immediateOp; // 22 bits used.
+};
+
+struct SimdCmp {
+ uint32_t regOp;
+ uint32_t zeroOp : 22;
+ uint32_t vecOpType : 6;
+};
+
+struct SimdDot {
+ uint32_t vectorOp; // 22 bits used.
+ uint32_t elementOp; // 22 bits used.
+ uint8_t tA; // Element-type of the first operand.
+ uint8_t tB; // Element-type of the second and third operands.
+ uint8_t tElement; // Element-type of the element index[] operand.
+};
+
+struct SimdMoviMvni {
+ uint32_t opcode : 31;
+ uint32_t inverted : 1;
+};
+
+struct SimdLdSt {
+ uint32_t uOffsetOp : 10;
+ uint32_t prePostOp : 11;
+ uint32_t registerOp : 11;
+ uint32_t literalOp : 8;
+ uint32_t uAltInstId : 16;
+};
+
+struct SimdLdNStN {
+ uint32_t singleOp;
+ uint32_t multipleOp : 22;
+ uint32_t n : 3;
+ uint32_t replicate : 1;
+};
+
+struct SimdLdpStp {
+ uint32_t offsetOp : 10;
+ uint32_t prePostOp : 10;
+};
+
+struct SimdLdurStur {
+ uint32_t opcode;
+};
+
+struct ISimdPair {
+ uint32_t opcode2; // 22 bits used.
+ uint32_t opcode3 : 26; // 22 bits used.
+ uint32_t opType3 : 6;
+};
+
+struct SimdShift {
+ uint32_t registerOp; // 22 bits used.
+ uint32_t immediateOp : 22; // 22 bits used.
+ uint32_t invertedImm : 1;
+ uint32_t vecOpType : 6;
+};
+
+struct SimdShiftES {
+ uint32_t opcode : 22;
+ uint32_t vecOpType : 6;
+};
+
+struct SimdSm3tt {
+ uint32_t opcode;
+};
+
+struct SimdSmovUmov {
+ uint32_t opcode : 22;
+ uint32_t vecOpType : 6;
+ uint32_t isSigned : 1;
+};
+
+struct SimdSxtlUxtl {
+ uint32_t opcode : 22;
+ uint32_t vecOpType : 6;
+};
+
+struct SimdTblTbx {
+ uint32_t opcode;
+};
+
+#undef M_OPCODE
+
+// ${EncodingDataForward:Begin}
+// ------------------- Automatically generated, do not edit -------------------
+extern const BaseAddSub baseAddSub[4];
+extern const BaseAdr baseAdr[2];
+extern const BaseAtDcIcTlbi baseAtDcIcTlbi[4];
+extern const BaseAtomicCasp baseAtomicCasp[4];
+extern const BaseAtomicOp baseAtomicOp[123];
+extern const BaseAtomicSt baseAtomicSt[48];
+extern const BaseBfc baseBfc[1];
+extern const BaseBfi baseBfi[3];
+extern const BaseBfm baseBfm[3];
+extern const BaseBfx baseBfx[3];
+extern const BaseBranchCmp baseBranchCmp[2];
+extern const BaseBranchReg baseBranchReg[3];
+extern const BaseBranchRel baseBranchRel[2];
+extern const BaseBranchTst baseBranchTst[2];
+extern const BaseCCmp baseCCmp[2];
+extern const BaseCInc baseCInc[3];
+extern const BaseCSel baseCSel[4];
+extern const BaseCSet baseCSet[2];
+extern const BaseCmpCmn baseCmpCmn[2];
+extern const BaseExtend baseExtend[5];
+extern const BaseExtract baseExtract[1];
+extern const BaseLdSt baseLdSt[9];
+extern const BaseLdpStp baseLdpStp[6];
+extern const BaseLdxp baseLdxp[2];
+extern const BaseLogical baseLogical[8];
+extern const BaseMovKNZ baseMovKNZ[3];
+extern const BaseMvnNeg baseMvnNeg[3];
+extern const BaseOp baseOp[23];
+extern const BaseOpImm baseOpImm[14];
+extern const BaseR baseR[10];
+extern const BaseRM_NoImm baseRM_NoImm[21];
+extern const BaseRM_SImm10 baseRM_SImm10[2];
+extern const BaseRM_SImm9 baseRM_SImm9[23];
+extern const BaseRR baseRR[15];
+extern const BaseRRII baseRRII[2];
+extern const BaseRRR baseRRR[26];
+extern const BaseRRRR baseRRRR[6];
+extern const BaseShift baseShift[8];
+extern const BaseStx baseStx[3];
+extern const BaseStxp baseStxp[2];
+extern const BaseTst baseTst[1];
+extern const FSimdPair fSimdPair[5];
+extern const FSimdSV fSimdSV[4];
+extern const FSimdVV fSimdVV[17];
+extern const FSimdVVV fSimdVVV[13];
+extern const FSimdVVVV fSimdVVVV[4];
+extern const FSimdVVVe fSimdVVVe[4];
+extern const ISimdPair iSimdPair[1];
+extern const ISimdSV iSimdSV[7];
+extern const ISimdVV iSimdVV[29];
+extern const ISimdVVV iSimdVVV[65];
+extern const ISimdVVVI iSimdVVVI[2];
+extern const ISimdVVVV iSimdVVVV[2];
+extern const ISimdVVVVx iSimdVVVVx[1];
+extern const ISimdVVVe iSimdVVVe[25];
+extern const ISimdVVVx iSimdVVVx[17];
+extern const ISimdVVx iSimdVVx[13];
+extern const ISimdWWV iSimdWWV[8];
+extern const SimdBicOrr simdBicOrr[2];
+extern const SimdCmp simdCmp[7];
+extern const SimdDot simdDot[5];
+extern const SimdFcadd simdFcadd[1];
+extern const SimdFccmpFccmpe simdFccmpFccmpe[2];
+extern const SimdFcm simdFcm[5];
+extern const SimdFcmla simdFcmla[1];
+extern const SimdFcmpFcmpe simdFcmpFcmpe[2];
+extern const SimdFcvtLN simdFcvtLN[6];
+extern const SimdFcvtSV simdFcvtSV[12];
+extern const SimdFmlal simdFmlal[6];
+extern const SimdLdNStN simdLdNStN[12];
+extern const SimdLdSt simdLdSt[2];
+extern const SimdLdpStp simdLdpStp[4];
+extern const SimdLdurStur simdLdurStur[2];
+extern const SimdMoviMvni simdMoviMvni[2];
+extern const SimdShift simdShift[40];
+extern const SimdShiftES simdShiftES[2];
+extern const SimdSm3tt simdSm3tt[4];
+extern const SimdSmovUmov simdSmovUmov[2];
+extern const SimdSxtlUxtl simdSxtlUxtl[4];
+extern const SimdTblTbx simdTblTbx[2];
+// ----------------------------------------------------------------------------
+// ${EncodingDataForward:End}
+
+} // {EncodingData}
+
+// a64::InstDB - InstNameIndex
+// ===========================
+
+// ${NameLimits:Begin}
+// ------------------- Automatically generated, do not edit -------------------
+enum : uint32_t { kMaxNameSize = 9 };
+// ----------------------------------------------------------------------------
+// ${NameLimits:End}
+
+struct InstNameIndex {
+ uint16_t start;
+ uint16_t end;
+};
+
+// a64::InstDB - Tables
+// ====================
+
+#ifndef ASMJIT_NO_TEXT
+extern const char _nameData[];
+extern const InstNameIndex instNameIndex[26];
+#endif // !ASMJIT_NO_TEXT
+
+} // {InstDB}
+
+//! \}
+//! \endcond
+
+ASMJIT_END_SUB_NAMESPACE
+
+#endif // ASMJIT_A64_ARMINSTDB_H_P_INCLUDED
+
diff --git a/3rdparty/asmjit/src/asmjit/arm/a64operand.cpp b/3rdparty/asmjit/src/asmjit/arm/a64operand.cpp
new file mode 100644
index 00000000000..40a4a7952bc
--- /dev/null
+++ b/3rdparty/asmjit/src/asmjit/arm/a64operand.cpp
@@ -0,0 +1,85 @@
+// This file is part of AsmJit project <https://asmjit.com>
+//
+// See asmjit.h or LICENSE.md for license and copyright information
+// SPDX-License-Identifier: Zlib
+
+#include "../core/api-build_p.h"
+#if !defined(ASMJIT_NO_AARCH64)
+
+#include "../core/misc_p.h"
+#include "../arm/a64operand.h"
+
+ASMJIT_BEGIN_SUB_NAMESPACE(a64)
+
+// a64::Operand - Tests
+// ====================
+
+#if defined(ASMJIT_TEST)
+UNIT(a64_operand) {
+ INFO("Checking if a64::reg(...) matches built-in IDs");
+ EXPECT(w(5) == w5);
+ EXPECT(x(5) == x5);
+
+ INFO("Checking Gp register properties");
+ EXPECT(Gp().isReg() == true);
+ EXPECT(w0.isReg() == true);
+ EXPECT(x0.isReg() == true);
+ EXPECT(w0.id() == 0);
+ EXPECT(x0.id() == 0);
+ EXPECT(wzr.id() == Gp::kIdZr);
+ EXPECT(xzr.id() == Gp::kIdZr);
+ EXPECT(wsp.id() == Gp::kIdSp);
+ EXPECT(sp.id() == Gp::kIdSp);
+ EXPECT(w0.size() == 4);
+ EXPECT(x0.size() == 8);
+ EXPECT(w0.type() == RegType::kARM_GpW);
+ EXPECT(x0.type() == RegType::kARM_GpX);
+ EXPECT(w0.group() == RegGroup::kGp);
+ EXPECT(x0.group() == RegGroup::kGp);
+
+ INFO("Checking Vec register properties");
+ EXPECT(v0.type() == RegType::kARM_VecV);
+ EXPECT(d0.type() == RegType::kARM_VecD);
+ EXPECT(s0.type() == RegType::kARM_VecS);
+ EXPECT(h0.type() == RegType::kARM_VecH);
+ EXPECT(b0.type() == RegType::kARM_VecB);
+
+ EXPECT(v0.group() == RegGroup::kVec);
+ EXPECT(d0.group() == RegGroup::kVec);
+ EXPECT(s0.group() == RegGroup::kVec);
+ EXPECT(h0.group() == RegGroup::kVec);
+ EXPECT(b0.group() == RegGroup::kVec);
+
+ INFO("Checking Vec register element[] access");
+ Vec vd_1 = v15.d(1);
+ EXPECT(vd_1.type() == RegType::kARM_VecV);
+ EXPECT(vd_1.group() == RegGroup::kVec);
+ EXPECT(vd_1.id() == 15);
+ EXPECT(vd_1.isVecD2());
+ EXPECT(vd_1.elementType() == Vec::kElementTypeD);
+ EXPECT(vd_1.hasElementIndex());
+ EXPECT(vd_1.elementIndex() == 1);
+
+ Vec vs_3 = v15.s(3);
+ EXPECT(vs_3.type() == RegType::kARM_VecV);
+ EXPECT(vs_3.group() == RegGroup::kVec);
+ EXPECT(vs_3.id() == 15);
+ EXPECT(vs_3.isVecS4());
+ EXPECT(vs_3.elementType() == Vec::kElementTypeS);
+ EXPECT(vs_3.hasElementIndex());
+ EXPECT(vs_3.elementIndex() == 3);
+
+ Vec vb_4 = v15.b4(3);
+ EXPECT(vb_4.type() == RegType::kARM_VecV);
+ EXPECT(vb_4.group() == RegGroup::kVec);
+ EXPECT(vb_4.id() == 15);
+ EXPECT(vb_4.isVecB4x4());
+ EXPECT(vb_4.elementType() == Vec::kElementTypeB4);
+ EXPECT(vb_4.hasElementIndex());
+ EXPECT(vb_4.elementIndex() == 3);
+}
+#endif
+
+ASMJIT_END_SUB_NAMESPACE
+
+#endif // !ASMJIT_NO_AARCH64
diff --git a/3rdparty/asmjit/src/asmjit/arm/a64operand.h b/3rdparty/asmjit/src/asmjit/arm/a64operand.h
new file mode 100644
index 00000000000..c2d3c179a86
--- /dev/null
+++ b/3rdparty/asmjit/src/asmjit/arm/a64operand.h
@@ -0,0 +1,312 @@
+// This file is part of AsmJit project <https://asmjit.com>
+//
+// See asmjit.h or LICENSE.md for license and copyright information
+// SPDX-License-Identifier: Zlib
+
+#ifndef ASMJIT_ARM_A64OPERAND_H_INCLUDED
+#define ASMJIT_ARM_A64OPERAND_H_INCLUDED
+
+#include "../arm/armoperand.h"
+
+ASMJIT_BEGIN_SUB_NAMESPACE(a64)
+
+//! \addtogroup asmjit_a64
+//! \{
+
+using arm::Reg;
+using arm::Mem;
+using arm::Gp;
+using arm::GpW;
+using arm::GpX;
+
+using arm::Vec;
+using arm::VecB;
+using arm::VecH;
+using arm::VecS;
+using arm::VecD;
+using arm::VecV;
+
+#ifndef _DOXYGEN
+namespace regs {
+#endif
+
+using namespace ::asmjit::arm::regs;
+
+static constexpr GpW w0 = GpW(0);
+static constexpr GpW w1 = GpW(1);
+static constexpr GpW w2 = GpW(2);
+static constexpr GpW w3 = GpW(3);
+static constexpr GpW w4 = GpW(4);
+static constexpr GpW w5 = GpW(5);
+static constexpr GpW w6 = GpW(6);
+static constexpr GpW w7 = GpW(7);
+static constexpr GpW w8 = GpW(8);
+static constexpr GpW w9 = GpW(9);
+static constexpr GpW w10 = GpW(10);
+static constexpr GpW w11 = GpW(11);
+static constexpr GpW w12 = GpW(12);
+static constexpr GpW w13 = GpW(13);
+static constexpr GpW w14 = GpW(14);
+static constexpr GpW w15 = GpW(15);
+static constexpr GpW w16 = GpW(16);
+static constexpr GpW w17 = GpW(17);
+static constexpr GpW w18 = GpW(18);
+static constexpr GpW w19 = GpW(19);
+static constexpr GpW w20 = GpW(20);
+static constexpr GpW w21 = GpW(21);
+static constexpr GpW w22 = GpW(22);
+static constexpr GpW w23 = GpW(23);
+static constexpr GpW w24 = GpW(24);
+static constexpr GpW w25 = GpW(25);
+static constexpr GpW w26 = GpW(26);
+static constexpr GpW w27 = GpW(27);
+static constexpr GpW w28 = GpW(28);
+static constexpr GpW w29 = GpW(29);
+static constexpr GpW w30 = GpW(30);
+static constexpr GpW wzr = GpW(Gp::kIdZr);
+static constexpr GpW wsp = GpW(Gp::kIdSp);
+
+static constexpr GpX x0 = GpX(0);
+static constexpr GpX x1 = GpX(1);
+static constexpr GpX x2 = GpX(2);
+static constexpr GpX x3 = GpX(3);
+static constexpr GpX x4 = GpX(4);
+static constexpr GpX x5 = GpX(5);
+static constexpr GpX x6 = GpX(6);
+static constexpr GpX x7 = GpX(7);
+static constexpr GpX x8 = GpX(8);
+static constexpr GpX x9 = GpX(9);
+static constexpr GpX x10 = GpX(10);
+static constexpr GpX x11 = GpX(11);
+static constexpr GpX x12 = GpX(12);
+static constexpr GpX x13 = GpX(13);
+static constexpr GpX x14 = GpX(14);
+static constexpr GpX x15 = GpX(15);
+static constexpr GpX x16 = GpX(16);
+static constexpr GpX x17 = GpX(17);
+static constexpr GpX x18 = GpX(18);
+static constexpr GpX x19 = GpX(19);
+static constexpr GpX x20 = GpX(20);
+static constexpr GpX x21 = GpX(21);
+static constexpr GpX x22 = GpX(22);
+static constexpr GpX x23 = GpX(23);
+static constexpr GpX x24 = GpX(24);
+static constexpr GpX x25 = GpX(25);
+static constexpr GpX x26 = GpX(26);
+static constexpr GpX x27 = GpX(27);
+static constexpr GpX x28 = GpX(28);
+static constexpr GpX x29 = GpX(29);
+static constexpr GpX x30 = GpX(30);
+static constexpr GpX xzr = GpX(Gp::kIdZr);
+static constexpr GpX sp = GpX(Gp::kIdSp);
+
+static constexpr VecB b0 = VecB(0);
+static constexpr VecB b1 = VecB(1);
+static constexpr VecB b2 = VecB(2);
+static constexpr VecB b3 = VecB(3);
+static constexpr VecB b4 = VecB(4);
+static constexpr VecB b5 = VecB(5);
+static constexpr VecB b6 = VecB(6);
+static constexpr VecB b7 = VecB(7);
+static constexpr VecB b8 = VecB(8);
+static constexpr VecB b9 = VecB(9);
+static constexpr VecB b10 = VecB(10);
+static constexpr VecB b11 = VecB(11);
+static constexpr VecB b12 = VecB(12);
+static constexpr VecB b13 = VecB(13);
+static constexpr VecB b14 = VecB(14);
+static constexpr VecB b15 = VecB(15);
+static constexpr VecB b16 = VecB(16);
+static constexpr VecB b17 = VecB(17);
+static constexpr VecB b18 = VecB(18);
+static constexpr VecB b19 = VecB(19);
+static constexpr VecB b20 = VecB(20);
+static constexpr VecB b21 = VecB(21);
+static constexpr VecB b22 = VecB(22);
+static constexpr VecB b23 = VecB(23);
+static constexpr VecB b24 = VecB(24);
+static constexpr VecB b25 = VecB(25);
+static constexpr VecB b26 = VecB(26);
+static constexpr VecB b27 = VecB(27);
+static constexpr VecB b28 = VecB(28);
+static constexpr VecB b29 = VecB(29);
+static constexpr VecB b30 = VecB(30);
+static constexpr VecB b31 = VecB(31);
+
+static constexpr VecH h0 = VecH(0);
+static constexpr VecH h1 = VecH(1);
+static constexpr VecH h2 = VecH(2);
+static constexpr VecH h3 = VecH(3);
+static constexpr VecH h4 = VecH(4);
+static constexpr VecH h5 = VecH(5);
+static constexpr VecH h6 = VecH(6);
+static constexpr VecH h7 = VecH(7);
+static constexpr VecH h8 = VecH(8);
+static constexpr VecH h9 = VecH(9);
+static constexpr VecH h10 = VecH(10);
+static constexpr VecH h11 = VecH(11);
+static constexpr VecH h12 = VecH(12);
+static constexpr VecH h13 = VecH(13);
+static constexpr VecH h14 = VecH(14);
+static constexpr VecH h15 = VecH(15);
+static constexpr VecH h16 = VecH(16);
+static constexpr VecH h17 = VecH(17);
+static constexpr VecH h18 = VecH(18);
+static constexpr VecH h19 = VecH(19);
+static constexpr VecH h20 = VecH(20);
+static constexpr VecH h21 = VecH(21);
+static constexpr VecH h22 = VecH(22);
+static constexpr VecH h23 = VecH(23);
+static constexpr VecH h24 = VecH(24);
+static constexpr VecH h25 = VecH(25);
+static constexpr VecH h26 = VecH(26);
+static constexpr VecH h27 = VecH(27);
+static constexpr VecH h28 = VecH(28);
+static constexpr VecH h29 = VecH(29);
+static constexpr VecH h30 = VecH(30);
+static constexpr VecH h31 = VecH(31);
+
+static constexpr VecS s0 = VecS(0);
+static constexpr VecS s1 = VecS(1);
+static constexpr VecS s2 = VecS(2);
+static constexpr VecS s3 = VecS(3);
+static constexpr VecS s4 = VecS(4);
+static constexpr VecS s5 = VecS(5);
+static constexpr VecS s6 = VecS(6);
+static constexpr VecS s7 = VecS(7);
+static constexpr VecS s8 = VecS(8);
+static constexpr VecS s9 = VecS(9);
+static constexpr VecS s10 = VecS(10);
+static constexpr VecS s11 = VecS(11);
+static constexpr VecS s12 = VecS(12);
+static constexpr VecS s13 = VecS(13);
+static constexpr VecS s14 = VecS(14);
+static constexpr VecS s15 = VecS(15);
+static constexpr VecS s16 = VecS(16);
+static constexpr VecS s17 = VecS(17);
+static constexpr VecS s18 = VecS(18);
+static constexpr VecS s19 = VecS(19);
+static constexpr VecS s20 = VecS(20);
+static constexpr VecS s21 = VecS(21);
+static constexpr VecS s22 = VecS(22);
+static constexpr VecS s23 = VecS(23);
+static constexpr VecS s24 = VecS(24);
+static constexpr VecS s25 = VecS(25);
+static constexpr VecS s26 = VecS(26);
+static constexpr VecS s27 = VecS(27);
+static constexpr VecS s28 = VecS(28);
+static constexpr VecS s29 = VecS(29);
+static constexpr VecS s30 = VecS(30);
+static constexpr VecS s31 = VecS(31);
+
+static constexpr VecD d0 = VecD(0);
+static constexpr VecD d1 = VecD(1);
+static constexpr VecD d2 = VecD(2);
+static constexpr VecD d3 = VecD(3);
+static constexpr VecD d4 = VecD(4);
+static constexpr VecD d5 = VecD(5);
+static constexpr VecD d6 = VecD(6);
+static constexpr VecD d7 = VecD(7);
+static constexpr VecD d8 = VecD(8);
+static constexpr VecD d9 = VecD(9);
+static constexpr VecD d10 = VecD(10);
+static constexpr VecD d11 = VecD(11);
+static constexpr VecD d12 = VecD(12);
+static constexpr VecD d13 = VecD(13);
+static constexpr VecD d14 = VecD(14);
+static constexpr VecD d15 = VecD(15);
+static constexpr VecD d16 = VecD(16);
+static constexpr VecD d17 = VecD(17);
+static constexpr VecD d18 = VecD(18);
+static constexpr VecD d19 = VecD(19);
+static constexpr VecD d20 = VecD(20);
+static constexpr VecD d21 = VecD(21);
+static constexpr VecD d22 = VecD(22);
+static constexpr VecD d23 = VecD(23);
+static constexpr VecD d24 = VecD(24);
+static constexpr VecD d25 = VecD(25);
+static constexpr VecD d26 = VecD(26);
+static constexpr VecD d27 = VecD(27);
+static constexpr VecD d28 = VecD(28);
+static constexpr VecD d29 = VecD(29);
+static constexpr VecD d30 = VecD(30);
+static constexpr VecD d31 = VecD(31);
+
+static constexpr VecV q0 = VecV(0);
+static constexpr VecV q1 = VecV(1);
+static constexpr VecV q2 = VecV(2);
+static constexpr VecV q3 = VecV(3);
+static constexpr VecV q4 = VecV(4);
+static constexpr VecV q5 = VecV(5);
+static constexpr VecV q6 = VecV(6);
+static constexpr VecV q7 = VecV(7);
+static constexpr VecV q8 = VecV(8);
+static constexpr VecV q9 = VecV(9);
+static constexpr VecV q10 = VecV(10);
+static constexpr VecV q11 = VecV(11);
+static constexpr VecV q12 = VecV(12);
+static constexpr VecV q13 = VecV(13);
+static constexpr VecV q14 = VecV(14);
+static constexpr VecV q15 = VecV(15);
+static constexpr VecV q16 = VecV(16);
+static constexpr VecV q17 = VecV(17);
+static constexpr VecV q18 = VecV(18);
+static constexpr VecV q19 = VecV(19);
+static constexpr VecV q20 = VecV(20);
+static constexpr VecV q21 = VecV(21);
+static constexpr VecV q22 = VecV(22);
+static constexpr VecV q23 = VecV(23);
+static constexpr VecV q24 = VecV(24);
+static constexpr VecV q25 = VecV(25);
+static constexpr VecV q26 = VecV(26);
+static constexpr VecV q27 = VecV(27);
+static constexpr VecV q28 = VecV(28);
+static constexpr VecV q29 = VecV(29);
+static constexpr VecV q30 = VecV(30);
+static constexpr VecV q31 = VecV(31);
+
+static constexpr VecV v0 = VecV(0);
+static constexpr VecV v1 = VecV(1);
+static constexpr VecV v2 = VecV(2);
+static constexpr VecV v3 = VecV(3);
+static constexpr VecV v4 = VecV(4);
+static constexpr VecV v5 = VecV(5);
+static constexpr VecV v6 = VecV(6);
+static constexpr VecV v7 = VecV(7);
+static constexpr VecV v8 = VecV(8);
+static constexpr VecV v9 = VecV(9);
+static constexpr VecV v10 = VecV(10);
+static constexpr VecV v11 = VecV(11);
+static constexpr VecV v12 = VecV(12);
+static constexpr VecV v13 = VecV(13);
+static constexpr VecV v14 = VecV(14);
+static constexpr VecV v15 = VecV(15);
+static constexpr VecV v16 = VecV(16);
+static constexpr VecV v17 = VecV(17);
+static constexpr VecV v18 = VecV(18);
+static constexpr VecV v19 = VecV(19);
+static constexpr VecV v20 = VecV(20);
+static constexpr VecV v21 = VecV(21);
+static constexpr VecV v22 = VecV(22);
+static constexpr VecV v23 = VecV(23);
+static constexpr VecV v24 = VecV(24);
+static constexpr VecV v25 = VecV(25);
+static constexpr VecV v26 = VecV(26);
+static constexpr VecV v27 = VecV(27);
+static constexpr VecV v28 = VecV(28);
+static constexpr VecV v29 = VecV(29);
+static constexpr VecV v30 = VecV(30);
+static constexpr VecV v31 = VecV(31);
+
+#ifndef _DOXYGEN
+} // {regs}
+
+// Make `a64::regs` accessible through `a64` namespace as well.
+using namespace regs;
+#endif
+
+//! \}
+
+ASMJIT_END_SUB_NAMESPACE
+
+#endif // ASMJIT_ARM_A64OPERAND_H_INCLUDED
diff --git a/3rdparty/asmjit/src/asmjit/arm/a64rapass.cpp b/3rdparty/asmjit/src/asmjit/arm/a64rapass.cpp
new file mode 100644
index 00000000000..ad78369eaa7
--- /dev/null
+++ b/3rdparty/asmjit/src/asmjit/arm/a64rapass.cpp
@@ -0,0 +1,806 @@
+// This file is part of AsmJit project <https://asmjit.com>
+//
+// See asmjit.h or LICENSE.md for license and copyright information
+// SPDX-License-Identifier: Zlib
+
+#include "../core/api-build_p.h"
+#if !defined(ASMJIT_NO_AARCH64) && !defined(ASMJIT_NO_COMPILER)
+
+#include "../core/cpuinfo.h"
+#include "../core/support.h"
+#include "../core/type.h"
+#include "../arm/a64assembler.h"
+#include "../arm/a64compiler.h"
+#include "../arm/a64emithelper_p.h"
+#include "../arm/a64instapi_p.h"
+#include "../arm/a64instdb_p.h"
+#include "../arm/a64rapass_p.h"
+
+ASMJIT_BEGIN_SUB_NAMESPACE(a64)
+
+// a64::ARMRAPass - Helpers
+// ========================
+
+// TODO: [ARM] These should be shared with all backends.
+ASMJIT_MAYBE_UNUSED
+static inline uint64_t raImmMaskFromSize(uint32_t size) noexcept {
+ ASMJIT_ASSERT(size > 0 && size < 256);
+ static const uint64_t masks[] = {
+ 0x00000000000000FFu, // 1
+ 0x000000000000FFFFu, // 2
+ 0x00000000FFFFFFFFu, // 4
+ 0xFFFFFFFFFFFFFFFFu, // 8
+ 0x0000000000000000u, // 16
+ 0x0000000000000000u, // 32
+ 0x0000000000000000u, // 64
+ 0x0000000000000000u, // 128
+ 0x0000000000000000u // 256
+ };
+ return masks[Support::ctz(size)];
+}
+
+static const RegMask raConsecutiveLeadCountToRegMaskFilter[5] = {
+ 0xFFFFFFFFu, // [0] No consecutive.
+ 0x00000000u, // [1] Invalid, never used.
+ 0x7FFFFFFFu, // [2] 2 consecutive registers.
+ 0x3FFFFFFFu, // [3] 3 consecutive registers.
+ 0x1FFFFFFFu // [4] 4 consecutive registers.
+};
+
+static inline RATiedFlags raUseOutFlagsFromRWFlags(OpRWFlags rwFlags) noexcept {
+ static constexpr RATiedFlags map[] = {
+ RATiedFlags::kNone,
+ RATiedFlags::kRead | RATiedFlags::kUse, // kRead
+ RATiedFlags::kWrite | RATiedFlags::kOut, // kWrite
+ RATiedFlags::kRW | RATiedFlags::kUse, // kRW
+ };
+
+ return map[uint32_t(rwFlags & OpRWFlags::kRW)];
+}
+
+static inline RATiedFlags raRegRwFlags(OpRWFlags flags) noexcept {
+ return raUseOutFlagsFromRWFlags(flags);
+}
+
+static inline RATiedFlags raMemBaseRwFlags(OpRWFlags flags) noexcept {
+ constexpr uint32_t shift = Support::ConstCTZ<uint32_t(OpRWFlags::kMemBaseRW)>::value;
+ return raUseOutFlagsFromRWFlags(OpRWFlags(uint32_t(flags) >> shift) & OpRWFlags::kRW);
+}
+
+static inline RATiedFlags raMemIndexRwFlags(OpRWFlags flags) noexcept {
+ constexpr uint32_t shift = Support::ConstCTZ<uint32_t(OpRWFlags::kMemIndexRW)>::value;
+ return raUseOutFlagsFromRWFlags(OpRWFlags(uint32_t(flags) >> shift) & OpRWFlags::kRW);
+}
+// a64::RACFGBuilder
+// =================
+
+class RACFGBuilder : public RACFGBuilderT<RACFGBuilder> {
+public:
+ Arch _arch;
+
+ inline RACFGBuilder(ARMRAPass* pass) noexcept
+ : RACFGBuilderT<RACFGBuilder>(pass),
+ _arch(pass->cc()->arch()) {}
+
+ inline Compiler* cc() const noexcept { return static_cast<Compiler*>(_cc); }
+
+ Error onInst(InstNode* inst, InstControlFlow& controlType, RAInstBuilder& ib) noexcept;
+
+ Error onBeforeInvoke(InvokeNode* invokeNode) noexcept;
+ Error onInvoke(InvokeNode* invokeNode, RAInstBuilder& ib) noexcept;
+
+ Error moveImmToRegArg(InvokeNode* invokeNode, const FuncValue& arg, const Imm& imm_, BaseReg* out) noexcept;
+ Error moveImmToStackArg(InvokeNode* invokeNode, const FuncValue& arg, const Imm& imm_) noexcept;
+ Error moveRegToStackArg(InvokeNode* invokeNode, const FuncValue& arg, const BaseReg& reg) noexcept;
+
+ Error onBeforeRet(FuncRetNode* funcRet) noexcept;
+ Error onRet(FuncRetNode* funcRet, RAInstBuilder& ib) noexcept;
+};
+
+// a64::RACFGBuilder - OnInst
+// ==========================
+
+// TODO: [ARM] This is just a workaround...
+static InstControlFlow getControlFlowType(InstId instId) noexcept {
+ switch (instId) {
+ case Inst::kIdB:
+ case Inst::kIdBr:
+ if (BaseInst::extractARMCondCode(instId) == CondCode::kAL)
+ return InstControlFlow::kJump;
+ else
+ return InstControlFlow::kBranch;
+ case Inst::kIdBl:
+ case Inst::kIdBlr:
+ return InstControlFlow::kCall;
+ case Inst::kIdCbz:
+ case Inst::kIdCbnz:
+ case Inst::kIdTbz:
+ case Inst::kIdTbnz:
+ return InstControlFlow::kBranch;
+ case Inst::kIdRet:
+ return InstControlFlow::kReturn;
+ default:
+ return InstControlFlow::kRegular;
+ }
+}
+
+Error RACFGBuilder::onInst(InstNode* inst, InstControlFlow& controlType, RAInstBuilder& ib) noexcept {
+ InstRWInfo rwInfo;
+
+ InstId instId = inst->id();
+ if (Inst::isDefinedId(instId)) {
+ uint32_t opCount = inst->opCount();
+ const Operand* opArray = inst->operands();
+ ASMJIT_PROPAGATE(InstInternal::queryRWInfo(_arch, inst->baseInst(), opArray, opCount, &rwInfo));
+
+ const InstDB::InstInfo& instInfo = InstDB::infoById(instId);
+ uint32_t singleRegOps = 0;
+
+ if (opCount) {
+ uint32_t consecutiveOffset = 0xFFFFFFFFu;
+ uint32_t consecutiveParent = Globals::kInvalidId;
+
+ for (uint32_t i = 0; i < opCount; i++) {
+ const Operand& op = opArray[i];
+ const OpRWInfo& opRwInfo = rwInfo.operand(i);
+
+ if (op.isReg()) {
+ // Register Operand
+ // ----------------
+ const Reg& reg = op.as<Reg>();
+
+ RATiedFlags flags = raRegRwFlags(opRwInfo.opFlags());
+ uint32_t vIndex = Operand::virtIdToIndex(reg.id());
+
+ if (vIndex < Operand::kVirtIdCount) {
+ RAWorkReg* workReg;
+ ASMJIT_PROPAGATE(_pass->virtIndexAsWorkReg(vIndex, &workReg));
+
+ // Use RW instead of Write in case that not the whole register is overwritten. This is important for
+ // liveness as we cannot kill a register that will be used.
+ if ((flags & RATiedFlags::kRW) == RATiedFlags::kWrite) {
+ if (workReg->regByteMask() & ~(opRwInfo.writeByteMask() | opRwInfo.extendByteMask())) {
+ // Not write-only operation.
+ flags = (flags & ~RATiedFlags::kOut) | (RATiedFlags::kRead | RATiedFlags::kUse);
+ }
+ }
+
+ RegGroup group = workReg->group();
+
+ RegMask useRegs = _pass->_availableRegs[group];
+ RegMask outRegs = useRegs;
+
+ uint32_t useId = BaseReg::kIdBad;
+ uint32_t outId = BaseReg::kIdBad;
+
+ uint32_t useRewriteMask = 0;
+ uint32_t outRewriteMask = 0;
+
+ if (opRwInfo.consecutiveLeadCount()) {
+ // There must be a single consecutive register lead, otherwise the RW data is invalid.
+ if (consecutiveOffset != 0xFFFFFFFFu)
+ return DebugUtils::errored(kErrorInvalidState);
+
+ // A consecutive lead register cannot be used as a consecutive +1/+2/+3 register, the registers must be distinct.
+ if (RATiedReg::consecutiveDataFromFlags(flags) != 0)
+ return DebugUtils::errored(kErrorNotConsecutiveRegs);
+
+ flags |= RATiedFlags::kLeadConsecutive | RATiedReg::consecutiveDataToFlags(opRwInfo.consecutiveLeadCount() - 1);
+ consecutiveOffset = 0;
+
+ RegMask filter = raConsecutiveLeadCountToRegMaskFilter[opRwInfo.consecutiveLeadCount()];
+ if (Support::test(flags, RATiedFlags::kUse)) {
+ flags |= RATiedFlags::kUseConsecutive;
+ useRegs &= filter;
+ }
+ else {
+ flags |= RATiedFlags::kOutConsecutive;
+ outRegs &= filter;
+ }
+ }
+
+ if (Support::test(flags, RATiedFlags::kUse)) {
+ useRewriteMask = Support::bitMask(inst->getRewriteIndex(&reg._baseId));
+ if (opRwInfo.hasOpFlag(OpRWFlags::kRegPhysId)) {
+ useId = opRwInfo.physId();
+ flags |= RATiedFlags::kUseFixed;
+ }
+ else if (opRwInfo.hasOpFlag(OpRWFlags::kConsecutive)) {
+ if (consecutiveOffset == 0xFFFFFFFFu)
+ return DebugUtils::errored(kErrorInvalidState);
+ flags |= RATiedFlags::kUseConsecutive | RATiedReg::consecutiveDataToFlags(++consecutiveOffset);
+ }
+ }
+ else {
+ outRewriteMask = Support::bitMask(inst->getRewriteIndex(&reg._baseId));
+ if (opRwInfo.hasOpFlag(OpRWFlags::kRegPhysId)) {
+ outId = opRwInfo.physId();
+ flags |= RATiedFlags::kOutFixed;
+ }
+ else if (opRwInfo.hasOpFlag(OpRWFlags::kConsecutive)) {
+ if (consecutiveOffset == 0xFFFFFFFFu)
+ return DebugUtils::errored(kErrorInvalidState);
+ flags |= RATiedFlags::kOutConsecutive | RATiedReg::consecutiveDataToFlags(++consecutiveOffset);
+ }
+ }
+
+ // Special cases regarding element access.
+ if (reg.as<Vec>().hasElementIndex()) {
+ // Only the first 0..15 registers can be used if the register uses
+ // element accessor that accesses half-words (h[0..7] elements).
+ if (instInfo.hasFlag(InstDB::kInstFlagVH0_15) && reg.as<Vec>().elementType() == Vec::kElementTypeH) {
+ if (Support::test(flags, RATiedFlags::kUse))
+ useId &= 0x0000FFFFu;
+ else
+ outId &= 0x0000FFFFu;
+ }
+ }
+
+ ASMJIT_PROPAGATE(ib.add(workReg, flags, useRegs, useId, useRewriteMask, outRegs, outId, outRewriteMask, opRwInfo.rmSize(), consecutiveParent));
+ if (singleRegOps == i)
+ singleRegOps++;
+
+ if (Support::test(flags, RATiedFlags::kLeadConsecutive | RATiedFlags::kUseConsecutive | RATiedFlags::kOutConsecutive))
+ consecutiveParent = workReg->workId();
+ }
+ }
+ else if (op.isMem()) {
+ // Memory Operand
+ // --------------
+ const Mem& mem = op.as<Mem>();
+
+ if (mem.isRegHome()) {
+ RAWorkReg* workReg;
+ ASMJIT_PROPAGATE(_pass->virtIndexAsWorkReg(Operand::virtIdToIndex(mem.baseId()), &workReg));
+ _pass->getOrCreateStackSlot(workReg);
+ }
+ else if (mem.hasBaseReg()) {
+ uint32_t vIndex = Operand::virtIdToIndex(mem.baseId());
+ if (vIndex < Operand::kVirtIdCount) {
+ RAWorkReg* workReg;
+ ASMJIT_PROPAGATE(_pass->virtIndexAsWorkReg(vIndex, &workReg));
+
+ RATiedFlags flags = raMemBaseRwFlags(opRwInfo.opFlags());
+ RegGroup group = workReg->group();
+ RegMask allocable = _pass->_availableRegs[group];
+
+ // Base registers have never fixed id on ARM.
+ const uint32_t useId = BaseReg::kIdBad;
+ const uint32_t outId = BaseReg::kIdBad;
+
+ uint32_t useRewriteMask = 0;
+ uint32_t outRewriteMask = 0;
+
+ if (Support::test(flags, RATiedFlags::kUse))
+ useRewriteMask = Support::bitMask(inst->getRewriteIndex(&mem._baseId));
+ else
+ outRewriteMask = Support::bitMask(inst->getRewriteIndex(&mem._baseId));
+
+ ASMJIT_PROPAGATE(ib.add(workReg, flags, allocable, useId, useRewriteMask, allocable, outId, outRewriteMask));
+ }
+ }
+
+ if (mem.hasIndexReg()) {
+ uint32_t vIndex = Operand::virtIdToIndex(mem.indexId());
+ if (vIndex < Operand::kVirtIdCount) {
+ RAWorkReg* workReg;
+ ASMJIT_PROPAGATE(_pass->virtIndexAsWorkReg(vIndex, &workReg));
+
+ RATiedFlags flags = raMemIndexRwFlags(opRwInfo.opFlags());
+ RegGroup group = workReg->group();
+ RegMask allocable = _pass->_availableRegs[group];
+
+ // Index registers have never fixed id on ARM.
+ const uint32_t useId = BaseReg::kIdBad;
+ const uint32_t outId = BaseReg::kIdBad;
+
+ uint32_t useRewriteMask = 0;
+ uint32_t outRewriteMask = 0;
+
+ if (Support::test(flags, RATiedFlags::kUse))
+ useRewriteMask = Support::bitMask(inst->getRewriteIndex(&mem._data[Operand::kDataMemIndexId]));
+ else
+ outRewriteMask = Support::bitMask(inst->getRewriteIndex(&mem._data[Operand::kDataMemIndexId]));
+
+ ASMJIT_PROPAGATE(ib.add(workReg, RATiedFlags::kUse | RATiedFlags::kRead, allocable, useId, useRewriteMask, allocable, outId, outRewriteMask));
+ }
+ }
+ }
+ }
+ }
+
+ controlType = getControlFlowType(instId);
+ }
+
+ return kErrorOk;
+}
+
+// a64::RACFGBuilder - OnInvoke
+// ============================
+
+Error RACFGBuilder::onBeforeInvoke(InvokeNode* invokeNode) noexcept {
+ const FuncDetail& fd = invokeNode->detail();
+ uint32_t argCount = invokeNode->argCount();
+
+ cc()->_setCursor(invokeNode->prev());
+
+ for (uint32_t argIndex = 0; argIndex < argCount; argIndex++) {
+ const FuncValuePack& argPack = fd.argPack(argIndex);
+ for (uint32_t valueIndex = 0; valueIndex < Globals::kMaxValuePack; valueIndex++) {
+ if (!argPack[valueIndex])
+ break;
+
+ const FuncValue& arg = argPack[valueIndex];
+ const Operand& op = invokeNode->arg(argIndex, valueIndex);
+
+ if (op.isNone())
+ continue;
+
+ if (op.isReg()) {
+ const Reg& reg = op.as<Reg>();
+ RAWorkReg* workReg;
+ ASMJIT_PROPAGATE(_pass->virtIndexAsWorkReg(Operand::virtIdToIndex(reg.id()), &workReg));
+
+ if (arg.isReg()) {
+ RegGroup regGroup = workReg->group();
+ RegGroup argGroup = Reg::groupOf(arg.regType());
+
+ if (regGroup != argGroup) {
+ // TODO: [ARM] Conversion is not supported.
+ return DebugUtils::errored(kErrorInvalidAssignment);
+ }
+ }
+ else {
+ ASMJIT_PROPAGATE(moveRegToStackArg(invokeNode, arg, reg));
+ }
+ }
+ else if (op.isImm()) {
+ if (arg.isReg()) {
+ BaseReg reg;
+ ASMJIT_PROPAGATE(moveImmToRegArg(invokeNode, arg, op.as<Imm>(), &reg));
+ invokeNode->_args[argIndex][valueIndex] = reg;
+ }
+ else {
+ ASMJIT_PROPAGATE(moveImmToStackArg(invokeNode, arg, op.as<Imm>()));
+ }
+ }
+ }
+ }
+
+ cc()->_setCursor(invokeNode);
+
+ if (fd.hasRet()) {
+ for (uint32_t valueIndex = 0; valueIndex < Globals::kMaxValuePack; valueIndex++) {
+ const FuncValue& ret = fd.ret(valueIndex);
+ if (!ret)
+ break;
+
+ const Operand& op = invokeNode->ret(valueIndex);
+ if (op.isReg()) {
+ const Reg& reg = op.as<Reg>();
+ RAWorkReg* workReg;
+ ASMJIT_PROPAGATE(_pass->virtIndexAsWorkReg(Operand::virtIdToIndex(reg.id()), &workReg));
+
+ if (ret.isReg()) {
+ RegGroup regGroup = workReg->group();
+ RegGroup retGroup = Reg::groupOf(ret.regType());
+
+ if (regGroup != retGroup) {
+ // TODO: [ARM] Conversion is not supported.
+ return DebugUtils::errored(kErrorInvalidAssignment);
+ }
+ }
+ }
+ }
+ }
+
+ // This block has function call(s).
+ _curBlock->addFlags(RABlockFlags::kHasFuncCalls);
+ _pass->func()->frame().addAttributes(FuncAttributes::kHasFuncCalls);
+ _pass->func()->frame().updateCallStackSize(fd.argStackSize());
+
+ return kErrorOk;
+}
+
+Error RACFGBuilder::onInvoke(InvokeNode* invokeNode, RAInstBuilder& ib) noexcept {
+ uint32_t argCount = invokeNode->argCount();
+ const FuncDetail& fd = invokeNode->detail();
+
+ for (uint32_t argIndex = 0; argIndex < argCount; argIndex++) {
+ const FuncValuePack& argPack = fd.argPack(argIndex);
+ for (uint32_t valueIndex = 0; valueIndex < Globals::kMaxValuePack; valueIndex++) {
+ if (!argPack[valueIndex])
+ continue;
+
+ const FuncValue& arg = argPack[valueIndex];
+ const Operand& op = invokeNode->arg(argIndex, valueIndex);
+
+ if (op.isNone())
+ continue;
+
+ if (op.isReg()) {
+ const Reg& reg = op.as<Reg>();
+ RAWorkReg* workReg;
+ ASMJIT_PROPAGATE(_pass->virtIndexAsWorkReg(Operand::virtIdToIndex(reg.id()), &workReg));
+
+ if (arg.isIndirect()) {
+ RegGroup regGroup = workReg->group();
+ if (regGroup != RegGroup::kGp)
+ return DebugUtils::errored(kErrorInvalidState);
+ ASMJIT_PROPAGATE(ib.addCallArg(workReg, arg.regId()));
+ }
+ else if (arg.isReg()) {
+ RegGroup regGroup = workReg->group();
+ RegGroup argGroup = Reg::groupOf(arg.regType());
+
+ if (regGroup == argGroup) {
+ ASMJIT_PROPAGATE(ib.addCallArg(workReg, arg.regId()));
+ }
+ }
+ }
+ }
+ }
+
+ for (uint32_t retIndex = 0; retIndex < Globals::kMaxValuePack; retIndex++) {
+ const FuncValue& ret = fd.ret(retIndex);
+ if (!ret)
+ break;
+
+ const Operand& op = invokeNode->ret(retIndex);
+ if (op.isReg()) {
+ const Reg& reg = op.as<Reg>();
+ RAWorkReg* workReg;
+ ASMJIT_PROPAGATE(_pass->virtIndexAsWorkReg(Operand::virtIdToIndex(reg.id()), &workReg));
+
+ if (ret.isReg()) {
+ RegGroup regGroup = workReg->group();
+ RegGroup retGroup = Reg::groupOf(ret.regType());
+
+ if (regGroup == retGroup) {
+ ASMJIT_PROPAGATE(ib.addCallRet(workReg, ret.regId()));
+ }
+ }
+ else {
+ return DebugUtils::errored(kErrorInvalidAssignment);
+ }
+ }
+ }
+
+ // Setup clobbered registers.
+ ib._clobbered[0] = Support::lsbMask<RegMask>(_pass->_physRegCount[RegGroup(0)]) & ~fd.preservedRegs(RegGroup(0));
+ ib._clobbered[1] = Support::lsbMask<RegMask>(_pass->_physRegCount[RegGroup(1)]) & ~fd.preservedRegs(RegGroup(1));
+ ib._clobbered[2] = Support::lsbMask<RegMask>(_pass->_physRegCount[RegGroup(2)]) & ~fd.preservedRegs(RegGroup(2));
+ ib._clobbered[3] = Support::lsbMask<RegMask>(_pass->_physRegCount[RegGroup(3)]) & ~fd.preservedRegs(RegGroup(3));
+
+ return kErrorOk;
+}
+
+// a64::RACFGBuilder - MoveImmToRegArg
+// ===================================
+
+Error RACFGBuilder::moveImmToRegArg(InvokeNode* invokeNode, const FuncValue& arg, const Imm& imm_, BaseReg* out) noexcept {
+ DebugUtils::unused(invokeNode);
+ ASMJIT_ASSERT(arg.isReg());
+
+ Imm imm(imm_);
+ TypeId typeId = TypeId::kVoid;
+
+ switch (arg.typeId()) {
+ case TypeId::kInt8 : typeId = TypeId::kUInt64; imm.signExtend8Bits(); break;
+ case TypeId::kUInt8 : typeId = TypeId::kUInt64; imm.zeroExtend8Bits(); break;
+ case TypeId::kInt16 : typeId = TypeId::kUInt64; imm.signExtend16Bits(); break;
+ case TypeId::kUInt16: typeId = TypeId::kUInt64; imm.zeroExtend16Bits(); break;
+ case TypeId::kInt32 : typeId = TypeId::kUInt64; imm.signExtend32Bits(); break;
+ case TypeId::kUInt32: typeId = TypeId::kUInt64; imm.zeroExtend32Bits(); break;
+ case TypeId::kInt64 : typeId = TypeId::kUInt64; break;
+ case TypeId::kUInt64: typeId = TypeId::kUInt64; break;
+
+ default:
+ return DebugUtils::errored(kErrorInvalidAssignment);
+ }
+
+ ASMJIT_PROPAGATE(cc()->_newReg(out, typeId, nullptr));
+ cc()->virtRegById(out->id())->setWeight(BaseRAPass::kCallArgWeight);
+ return cc()->mov(out->as<Gp>(), imm);
+}
+
+// a64::RACFGBuilder - MoveImmToStackArg
+// =====================================
+
+Error RACFGBuilder::moveImmToStackArg(InvokeNode* invokeNode, const FuncValue& arg, const Imm& imm_) noexcept {
+ BaseReg reg;
+
+ ASMJIT_PROPAGATE(moveImmToRegArg(invokeNode, arg, imm_, &reg));
+ ASMJIT_PROPAGATE(moveRegToStackArg(invokeNode, arg, reg));
+
+ return kErrorOk;
+}
+
+// a64::RACFGBuilder - MoveRegToStackArg
+// =====================================
+
+Error RACFGBuilder::moveRegToStackArg(InvokeNode* invokeNode, const FuncValue& arg, const BaseReg& reg) noexcept {
+ DebugUtils::unused(invokeNode);
+ Mem stackPtr = ptr(_pass->_sp.as<Gp>(), arg.stackOffset());
+
+ if (reg.isGp())
+ return cc()->str(reg.as<Gp>(), stackPtr);
+
+ if (reg.isVec())
+ return cc()->str(reg.as<Vec>(), stackPtr);
+
+ return DebugUtils::errored(kErrorInvalidState);
+}
+
+// a64::RACFGBuilder - OnReg
+// =========================
+
+Error RACFGBuilder::onBeforeRet(FuncRetNode* funcRet) noexcept {
+ DebugUtils::unused(funcRet);
+ return kErrorOk;
+}
+
+Error RACFGBuilder::onRet(FuncRetNode* funcRet, RAInstBuilder& ib) noexcept {
+ const FuncDetail& funcDetail = _pass->func()->detail();
+ const Operand* opArray = funcRet->operands();
+ uint32_t opCount = funcRet->opCount();
+
+ for (uint32_t i = 0; i < opCount; i++) {
+ const Operand& op = opArray[i];
+ if (op.isNone()) continue;
+
+ const FuncValue& ret = funcDetail.ret(i);
+ if (ASMJIT_UNLIKELY(!ret.isReg()))
+ return DebugUtils::errored(kErrorInvalidAssignment);
+
+ if (op.isReg()) {
+ // Register return value.
+ const Reg& reg = op.as<Reg>();
+ uint32_t vIndex = Operand::virtIdToIndex(reg.id());
+
+ if (vIndex < Operand::kVirtIdCount) {
+ RAWorkReg* workReg;
+ ASMJIT_PROPAGATE(_pass->virtIndexAsWorkReg(vIndex, &workReg));
+
+ RegGroup group = workReg->group();
+ RegMask allocable = _pass->_availableRegs[group];
+ ASMJIT_PROPAGATE(ib.add(workReg, RATiedFlags::kUse | RATiedFlags::kRead, allocable, ret.regId(), 0, 0, BaseReg::kIdBad, 0));
+ }
+ }
+ else {
+ return DebugUtils::errored(kErrorInvalidAssignment);
+ }
+ }
+
+ return kErrorOk;
+}
+
+// a64::ARMRAPass - Construction & Destruction
+// ===========================================
+
+ARMRAPass::ARMRAPass() noexcept
+ : BaseRAPass() { _iEmitHelper = &_emitHelper; }
+ARMRAPass::~ARMRAPass() noexcept {}
+
+// a64::ARMRAPass - OnInit / OnDone
+// ================================
+
+void ARMRAPass::onInit() noexcept {
+ Arch arch = cc()->arch();
+
+ _emitHelper._emitter = _cb;
+
+ _archTraits = &ArchTraits::byArch(arch);
+ _physRegCount.set(RegGroup::kGp, 32);
+ _physRegCount.set(RegGroup::kVec, 32);
+ _physRegCount.set(RegGroup::kExtraVirt2, 0);
+ _physRegCount.set(RegGroup::kExtraVirt3, 0);
+ _buildPhysIndex();
+
+ _availableRegCount = _physRegCount;
+ _availableRegs[RegGroup::kGp] = Support::lsbMask<uint32_t>(_physRegCount.get(RegGroup::kGp));
+ _availableRegs[RegGroup::kVec] = Support::lsbMask<uint32_t>(_physRegCount.get(RegGroup::kVec));
+ _availableRegs[RegGroup::kExtraVirt3] = Support::lsbMask<uint32_t>(_physRegCount.get(RegGroup::kExtraVirt2));
+ _availableRegs[RegGroup::kExtraVirt3] = Support::lsbMask<uint32_t>(_physRegCount.get(RegGroup::kExtraVirt3));
+
+ _scratchRegIndexes[0] = uint8_t(27);
+ _scratchRegIndexes[1] = uint8_t(28);
+
+ // The architecture specific setup makes implicitly all registers available. So
+ // make unavailable all registers that are special and cannot be used in general.
+ bool hasFP = _func->frame().hasPreservedFP();
+
+ if (hasFP)
+ makeUnavailable(RegGroup::kGp, Gp::kIdFp);
+
+ makeUnavailable(RegGroup::kGp, Gp::kIdSp);
+ makeUnavailable(RegGroup::kGp, Gp::kIdOs); // OS-specific use, usually TLS.
+
+ _sp = sp;
+ _fp = x29;
+}
+
+void ARMRAPass::onDone() noexcept {}
+
+// a64::ARMRAPass - BuildCFG
+// =========================
+
+Error ARMRAPass::buildCFG() noexcept {
+ return RACFGBuilder(this).run();
+}
+
+// a64::ARMRAPass - Rewrite
+// ========================
+
+ASMJIT_FAVOR_SPEED Error ARMRAPass::_rewrite(BaseNode* first, BaseNode* stop) noexcept {
+ uint32_t virtCount = cc()->_vRegArray.size();
+
+ BaseNode* node = first;
+ while (node != stop) {
+ BaseNode* next = node->next();
+ if (node->isInst()) {
+ InstNode* inst = node->as<InstNode>();
+ RAInst* raInst = node->passData<RAInst>();
+
+ Operand* operands = inst->operands();
+ uint32_t opCount = inst->opCount();
+
+ uint32_t i;
+
+ // Rewrite virtual registers into physical registers.
+ if (raInst) {
+ // If the instruction contains pass data (raInst) then it was a subject
+ // for register allocation and must be rewritten to use physical regs.
+ RATiedReg* tiedRegs = raInst->tiedRegs();
+ uint32_t tiedCount = raInst->tiedCount();
+
+ for (i = 0; i < tiedCount; i++) {
+ RATiedReg* tiedReg = &tiedRegs[i];
+
+ Support::BitWordIterator<uint32_t> useIt(tiedReg->useRewriteMask());
+ uint32_t useId = tiedReg->useId();
+ while (useIt.hasNext())
+ inst->rewriteIdAtIndex(useIt.next(), useId);
+
+ Support::BitWordIterator<uint32_t> outIt(tiedReg->outRewriteMask());
+ uint32_t outId = tiedReg->outId();
+ while (outIt.hasNext())
+ inst->rewriteIdAtIndex(outIt.next(), outId);
+ }
+
+ // This data is allocated by Zone passed to `runOnFunction()`, which
+ // will be reset after the RA pass finishes. So reset this data to
+ // prevent having a dead pointer after the RA pass is complete.
+ node->resetPassData();
+
+ if (ASMJIT_UNLIKELY(node->type() != NodeType::kInst)) {
+ // FuncRet terminates the flow, it must either be removed if the exit
+ // label is next to it (optimization) or patched to an architecture
+ // dependent jump instruction that jumps to the function's exit before
+ // the epilog.
+ if (node->type() == NodeType::kFuncRet) {
+ RABlock* block = raInst->block();
+ if (!isNextTo(node, _func->exitNode())) {
+ cc()->_setCursor(node->prev());
+ ASMJIT_PROPAGATE(emitJump(_func->exitNode()->label()));
+ }
+
+ BaseNode* prev = node->prev();
+ cc()->removeNode(node);
+ block->setLast(prev);
+ }
+ }
+ }
+
+ // Rewrite stack slot addresses.
+ for (i = 0; i < opCount; i++) {
+ Operand& op = operands[i];
+ if (op.isMem()) {
+ BaseMem& mem = op.as<BaseMem>();
+ if (mem.isRegHome()) {
+ uint32_t virtIndex = Operand::virtIdToIndex(mem.baseId());
+ if (ASMJIT_UNLIKELY(virtIndex >= virtCount))
+ return DebugUtils::errored(kErrorInvalidVirtId);
+
+ VirtReg* virtReg = cc()->virtRegByIndex(virtIndex);
+ RAWorkReg* workReg = virtReg->workReg();
+ ASMJIT_ASSERT(workReg != nullptr);
+
+ RAStackSlot* slot = workReg->stackSlot();
+ int32_t offset = slot->offset();
+
+ mem._setBase(_sp.type(), slot->baseRegId());
+ mem.clearRegHome();
+ mem.addOffsetLo32(offset);
+ }
+ }
+ }
+ }
+
+ node = next;
+ }
+
+ return kErrorOk;
+}
+
+// a64::ARMRAPass - Prolog & Epilog
+// ================================
+
+Error ARMRAPass::updateStackFrame() noexcept {
+ if (_func->frame().hasFuncCalls())
+ _func->frame().addDirtyRegs(RegGroup::kGp, Support::bitMask(Gp::kIdLr));
+
+ return BaseRAPass::updateStackFrame();
+}
+
+// a64::ARMRAPass - OnEmit
+// =======================
+
+Error ARMRAPass::emitMove(uint32_t workId, uint32_t dstPhysId, uint32_t srcPhysId) noexcept {
+ RAWorkReg* wReg = workRegById(workId);
+ BaseReg dst(wReg->signature(), dstPhysId);
+ BaseReg src(wReg->signature(), srcPhysId);
+
+ const char* comment = nullptr;
+
+#ifndef ASMJIT_NO_LOGGING
+ if (hasDiagnosticOption(DiagnosticOptions::kRAAnnotate)) {
+ _tmpString.assignFormat("<MOVE> %s", workRegById(workId)->name());
+ comment = _tmpString.data();
+ }
+#endif
+
+ return _emitHelper.emitRegMove(dst, src, wReg->typeId(), comment);
+}
+
+Error ARMRAPass::emitSwap(uint32_t aWorkId, uint32_t aPhysId, uint32_t bWorkId, uint32_t bPhysId) noexcept {
+ DebugUtils::unused(aWorkId, aPhysId, bWorkId, bPhysId);
+ return DebugUtils::errored(kErrorInvalidState);
+}
+
+Error ARMRAPass::emitLoad(uint32_t workId, uint32_t dstPhysId) noexcept {
+ RAWorkReg* wReg = workRegById(workId);
+ BaseReg dstReg(wReg->signature(), dstPhysId);
+ BaseMem srcMem(workRegAsMem(wReg));
+
+ const char* comment = nullptr;
+
+#ifndef ASMJIT_NO_LOGGING
+ if (hasDiagnosticOption(DiagnosticOptions::kRAAnnotate)) {
+ _tmpString.assignFormat("<LOAD> %s", workRegById(workId)->name());
+ comment = _tmpString.data();
+ }
+#endif
+
+ return _emitHelper.emitRegMove(dstReg, srcMem, wReg->typeId(), comment);
+}
+
+Error ARMRAPass::emitSave(uint32_t workId, uint32_t srcPhysId) noexcept {
+ RAWorkReg* wReg = workRegById(workId);
+ BaseMem dstMem(workRegAsMem(wReg));
+ BaseReg srcReg(wReg->signature(), srcPhysId);
+
+ const char* comment = nullptr;
+
+#ifndef ASMJIT_NO_LOGGING
+ if (hasDiagnosticOption(DiagnosticOptions::kRAAnnotate)) {
+ _tmpString.assignFormat("<SAVE> %s", workRegById(workId)->name());
+ comment = _tmpString.data();
+ }
+#endif
+
+ return _emitHelper.emitRegMove(dstMem, srcReg, wReg->typeId(), comment);
+}
+
+Error ARMRAPass::emitJump(const Label& label) noexcept {
+ return cc()->b(label);
+}
+
+Error ARMRAPass::emitPreCall(InvokeNode* invokeNode) noexcept {
+ DebugUtils::unused(invokeNode);
+ return kErrorOk;
+}
+
+ASMJIT_END_SUB_NAMESPACE
+
+#endif // !ASMJIT_NO_AARCH64 && !ASMJIT_NO_COMPILER
diff --git a/3rdparty/asmjit/src/asmjit/arm/a64rapass_p.h b/3rdparty/asmjit/src/asmjit/arm/a64rapass_p.h
new file mode 100644
index 00000000000..e1a90ab8df7
--- /dev/null
+++ b/3rdparty/asmjit/src/asmjit/arm/a64rapass_p.h
@@ -0,0 +1,105 @@
+// This file is part of AsmJit project <https://asmjit.com>
+//
+// See asmjit.h or LICENSE.md for license and copyright information
+// SPDX-License-Identifier: Zlib
+
+#ifndef ASMJIT_ARM_A64RAPASS_P_H_INCLUDED
+#define ASMJIT_ARM_A64RAPASS_P_H_INCLUDED
+
+#include "../core/api-config.h"
+#ifndef ASMJIT_NO_COMPILER
+
+#include "../core/compiler.h"
+#include "../core/rabuilders_p.h"
+#include "../core/rapass_p.h"
+#include "../arm/a64assembler.h"
+#include "../arm/a64compiler.h"
+#include "../arm/a64emithelper_p.h"
+
+ASMJIT_BEGIN_SUB_NAMESPACE(a64)
+
+//! \cond INTERNAL
+//! \addtogroup asmjit_a64
+//! \{
+
+//! ARM register allocation pass.
+//!
+//! Takes care of generating function prologs and epilogs, and also performs
+//! register allocation.
+class ARMRAPass : public BaseRAPass {
+public:
+ ASMJIT_NONCOPYABLE(ARMRAPass)
+ typedef BaseRAPass Base;
+
+ EmitHelper _emitHelper;
+
+ //! \name Construction & Destruction
+ //! \{
+
+ ARMRAPass() noexcept;
+ virtual ~ARMRAPass() noexcept;
+
+ //! \}
+
+ //! \name Accessors
+ //! \{
+
+ //! Returns the compiler casted to `arm::Compiler`.
+ inline Compiler* cc() const noexcept { return static_cast<Compiler*>(_cb); }
+
+ //! Returns emit helper.
+ inline EmitHelper* emitHelper() noexcept { return &_emitHelper; }
+
+ //! \}
+
+ //! \name Events
+ //! \{
+
+ void onInit() noexcept override;
+ void onDone() noexcept override;
+
+ //! \}
+
+ //! \name CFG
+ //! \{
+
+ Error buildCFG() noexcept override;
+
+ //! \}
+
+ //! \name Rewrite
+ //! \{
+
+ Error _rewrite(BaseNode* first, BaseNode* stop) noexcept override;
+
+ //! \}
+
+ //! \name Prolog & Epilog
+ //! \{
+
+ Error updateStackFrame() noexcept override;
+
+ //! \}
+
+ //! \name Emit Helpers
+ //! \{
+
+ Error emitMove(uint32_t workId, uint32_t dstPhysId, uint32_t srcPhysId) noexcept override;
+ Error emitSwap(uint32_t aWorkId, uint32_t aPhysId, uint32_t bWorkId, uint32_t bPhysId) noexcept override;
+
+ Error emitLoad(uint32_t workId, uint32_t dstPhysId) noexcept override;
+ Error emitSave(uint32_t workId, uint32_t srcPhysId) noexcept override;
+
+ Error emitJump(const Label& label) noexcept override;
+ Error emitPreCall(InvokeNode* invokeNode) noexcept override;
+
+ //! \}
+};
+
+//! \}
+//! \endcond
+
+ASMJIT_END_SUB_NAMESPACE
+
+#endif // !ASMJIT_NO_COMPILER
+#endif // ASMJIT_ARM_A64RAPASS_P_H_INCLUDED
diff --git a/3rdparty/asmjit/src/asmjit/arm/a64utils.h b/3rdparty/asmjit/src/asmjit/arm/a64utils.h
new file mode 100644
index 00000000000..4a88ca51724
--- /dev/null
+++ b/3rdparty/asmjit/src/asmjit/arm/a64utils.h
@@ -0,0 +1,179 @@
+// This file is part of AsmJit project <https://asmjit.com>
+//
+// See asmjit.h or LICENSE.md for license and copyright information
+// SPDX-License-Identifier: Zlib
+
+#ifndef ASMJIT_ARM_A64UTILS_H_INCLUDED
+#define ASMJIT_ARM_A64UTILS_H_INCLUDED
+
+#include "../arm/a64globals.h"
+
+ASMJIT_BEGIN_SUB_NAMESPACE(a64)
+
+//! \addtogroup asmjit_a64
+//! \{
+
+//! Public utilities and helpers for targeting AArch64 architecture.
+namespace Utils {
+
+//! Decomposed fields of a logical immediate value (AArch64).
+struct LogicalImm {
+ uint32_t n;
+ uint32_t s;
+ uint32_t r;
+};
+
+//! Encodes the given `imm` value of the given `width` to a logical immediate value represented as N, S, and R fields
+//! and writes these fields to `out`.
+//!
+//! Encoding Table:
+//!
+//! ```
+//! +---+--------+--------+------+
+//! | N | ImmS | ImmR | Size |
+//! +---+--------+--------+------+
+//! | 1 | ssssss | rrrrrr | 64 |
+//! | 0 | 0sssss | .rrrrr | 32 |
+//! | 0 | 10ssss | ..rrrr | 16 |
+//! | 0 | 110sss | ...rrr | 8 |
+//! | 0 | 1110ss | ....rr | 4 |
+//! | 0 | 11110s | .....r | 2 |
+//! +---+--------+--------+------+
+//! ```
+ASMJIT_MAYBE_UNUSED
+static bool encodeLogicalImm(uint64_t imm, uint32_t width, a64::Utils::LogicalImm* out) noexcept {
+ // Determine the element width, which must be 2, 4, 8, 16, 32, or 64 bits.
+ do {
+ width /= 2;
+ uint64_t mask = (uint64_t(1) << width) - 1u;
+ if ((imm & mask) != ((imm >> width) & mask)) {
+ width *= 2;
+ break;
+ }
+ } while (width > 2);
+
+ // Patterns of all zeros and all ones are not encodable.
+ uint64_t lsbMask = Support::lsbMask<uint64_t>(width);
+ imm &= lsbMask;
+
+ if (imm == 0 || imm == lsbMask)
+ return false;
+
+ // Inspect the pattern and get the most important bit indexes.
+ //
+ // oIndex <-+ +-> zIndex
+ // | |
+ // |..zeros..|oCount|zCount|..ones..|
+ // |000000000|111111|000000|11111111|
+
+ uint32_t zIndex = Support::ctz(~imm);
+ uint64_t zImm = imm ^ ((uint64_t(1) << zIndex) - 1);
+ uint32_t zCount = (zImm ? Support::ctz(zImm) : width) - zIndex;
+
+ uint32_t oIndex = zIndex + zCount;
+ uint64_t oImm = ~(zImm ^ Support::lsbMask<uint64_t>(oIndex));
+ uint32_t oCount = (oImm ? Support::ctz(oImm) : width) - (oIndex);
+
+ // Verify whether the bit-pattern is encodable.
+ uint64_t mustBeZero = oImm ^ ~Support::lsbMask<uint64_t>(oIndex + oCount);
+ if (mustBeZero != 0 || (zIndex > 0 && width - (oIndex + oCount) != 0))
+ return false;
+
+ out->n = width == 64;
+ out->s = (oCount + zIndex - 1) | (Support::neg(width * 2) & 0x3F);
+ out->r = width - oIndex;
+ return true;
+}
+
+//! Returns true if the given `imm` value is encodable as a logical immediate. The `width` argument describes the
+//! width of the operation, and must be either 32 or 64. This function can be used to test whether an immediate
+//! value can be used with AND, ANDS, BIC, BICS, EON, EOR, ORN, and ORR instruction.
+ASMJIT_MAYBE_UNUSED
+static inline bool isLogicalImm(uint64_t imm, uint32_t width) noexcept {
+ LogicalImm dummy;
+ return encodeLogicalImm(imm, width, &dummy);
+}
+
+//! Returns true if the given `imm` value is a byte mask. Byte mask has each byte part of the value set to either
+//! 0x00 or 0xFF. Some ARM instructions accept immediates that form a byte-mask and this function can be used to
+//! verify that the immediate is encodable before using the value.
+template<typename T>
+static inline bool isByteMaskImm8(const T& imm) noexcept {
+ constexpr T kMask = T(0x0101010101010101 & Support::allOnes<T>());
+ return imm == (imm & kMask) * T(255);
+}
+
+//! \cond
+//! A generic implementation that checjs whether a floating point value can be converted to ARM Imm8.
+template<typename T, uint32_t kNumBBits, uint32_t kNumCDEFGHBits, uint32_t kNumZeroBits>
+static inline bool isFPImm8Generic(T val) noexcept {
+ constexpr uint32_t kAllBsMask = Support::lsbMask<uint32_t>(kNumBBits);
+ constexpr uint32_t kB0Pattern = Support::bitMask(kNumBBits - 1);
+ constexpr uint32_t kB1Pattern = kAllBsMask ^ kB0Pattern;
+
+ T immZ = val & Support::lsbMask<T>(kNumZeroBits);
+ uint32_t immB = uint32_t(val >> (kNumZeroBits + kNumCDEFGHBits)) & kAllBsMask;
+
+ // ImmZ must be all zeros and ImmB must either be B0 or B1 pattern.
+ return immZ == 0 && (immB == kB0Pattern || immB == kB1Pattern);
+}
+//! \endcond
+
+//! Returns true if the given half precision floating point `val` can be encoded as ARM IMM8 value, which represents
+//! a limited set of floating point immediate values, which can be used with FMOV instruction.
+//!
+//! The floating point must have bits distributed in the following way:
+//!
+//! ```
+//! [aBbbcdef|gh000000]
+//! ```
+static inline bool isFP16Imm8(uint32_t val) noexcept { return isFPImm8Generic<uint32_t, 3, 6, 6>(val); }
+
+//! Returns true if the given single precision floating point `val` can be encoded as ARM IMM8 value, which represents
+//! a limited set of floating point immediate values, which can be used with FMOV instruction.
+//!
+//! The floating point must have bits distributed in the following way:
+//!
+//! ```
+//! [aBbbbbbc|defgh000|00000000|00000000]
+//! ```
+static inline bool isFP32Imm8(uint32_t val) noexcept { return isFPImm8Generic<uint32_t, 6, 6, 19>(val); }
+//! \overload
+static inline bool isFP32Imm8(float val) noexcept { return isFP32Imm8(Support::bitCast<uint32_t>(val)); }
+
+//! Returns true if the given double precision floating point `val` can be encoded as ARM IMM8 value, which represents
+//! a limited set of floating point immediate values, which can be used with FMOV instruction.
+//!
+//! The floating point must have bits distributed in the following way:
+//!
+//! ```
+//! [aBbbbbbb|bbcdefgh|00000000|00000000|00000000|00000000|00000000|00000000]
+//! ```
+static inline bool isFP64Imm8(uint64_t val) noexcept { return isFPImm8Generic<uint64_t, 9, 6, 48>(val); }
+//! \overload
+static inline bool isFP64Imm8(double val) noexcept { return isFP64Imm8(Support::bitCast<uint64_t>(val)); }
+
+//! \cond
+template<typename T, uint32_t kNumBBits, uint32_t kNumCDEFGHBits, uint32_t kNumZeroBits>
+static inline uint32_t encodeFPToImm8Generic(T val) noexcept {
+ uint32_t bits = uint32_t(val >> kNumZeroBits);
+ return ((bits >> (kNumBBits + kNumCDEFGHBits - 7)) & 0x80u) | (bits & 0x7F);
+}
+//! \endcond
+
+//! Encodes a double precision floating point value into IMM8 format.
+//!
+//! \note This function expects that `isFP64Imm8(val) == true` so it doesn't perform any checks of the value and just
+//! rearranges some bits into Imm8 order.
+static inline uint32_t encodeFP64ToImm8(uint64_t val) noexcept { return encodeFPToImm8Generic<uint64_t, 9, 6, 48>(val); }
+//! \overload
+static inline uint32_t encodeFP64ToImm8(double val) noexcept { return encodeFP64ToImm8(Support::bitCast<uint64_t>(val)); }
+
+} // {Utils}
+
+//! \}
+
+ASMJIT_END_SUB_NAMESPACE
+
+#endif // ASMJIT_ARM_A64UTILS_H_INCLUDED
+
diff --git a/3rdparty/asmjit/src/asmjit/arm/armformatter.cpp b/3rdparty/asmjit/src/asmjit/arm/armformatter.cpp
new file mode 100644
index 00000000000..0432043106a
--- /dev/null
+++ b/3rdparty/asmjit/src/asmjit/arm/armformatter.cpp
@@ -0,0 +1,143 @@
+// This file is part of AsmJit project <https://asmjit.com>
+//
+// See asmjit.h or LICENSE.md for license and copyright information
+// SPDX-License-Identifier: Zlib
+
+#include "../core/api-build_p.h"
+#ifndef ASMJIT_NO_LOGGING
+
+#include "../core/misc_p.h"
+#include "../core/support.h"
+#include "../arm/armformatter_p.h"
+#include "../arm/armoperand.h"
+#include "../arm/a64instapi_p.h"
+#include "../arm/a64instdb_p.h"
+
+#ifndef ASMJIT_NO_COMPILER
+ #include "../core/compiler.h"
+#endif
+
+ASMJIT_BEGIN_SUB_NAMESPACE(arm)
+
+// arm::FormatterInternal - Format Feature
+// =======================================
+
+Error FormatterInternal::formatFeature(String& sb, uint32_t featureId) noexcept {
+ // @EnumStringBegin{"enum": "CpuFeatures::ARM", "output": "sFeature", "strip": "k"}@
+ static const char sFeatureString[] =
+ "None\0"
+ "THUMB\0"
+ "THUMBv2\0"
+ "ARMv6\0"
+ "ARMv7\0"
+ "ARMv8a\0"
+ "ARMv8_1a\0"
+ "ARMv8_2a\0"
+ "ARMv8_3a\0"
+ "ARMv8_4a\0"
+ "ARMv8_5a\0"
+ "ARMv8_6a\0"
+ "ARMv8_7a\0"
+ "VFPv2\0"
+ "VFPv3\0"
+ "VFPv4\0"
+ "VFP_D32\0"
+ "AES\0"
+ "ALTNZCV\0"
+ "ASIMD\0"
+ "BF16\0"
+ "BTI\0"
+ "CPUID\0"
+ "CRC32\0"
+ "DGH\0"
+ "DIT\0"
+ "DOTPROD\0"
+ "EDSP\0"
+ "FCMA\0"
+ "FJCVTZS\0"
+ "FLAGM\0"
+ "FP16CONV\0"
+ "FP16FML\0"
+ "FP16FULL\0"
+ "FRINT\0"
+ "I8MM\0"
+ "IDIVA\0"
+ "IDIVT\0"
+ "LSE\0"
+ "MTE\0"
+ "RCPC_IMMO\0"
+ "RDM\0"
+ "PMU\0"
+ "PMULL\0"
+ "RNG\0"
+ "SB\0"
+ "SHA1\0"
+ "SHA2\0"
+ "SHA3\0"
+ "SHA512\0"
+ "SM3\0"
+ "SM4\0"
+ "SSBS\0"
+ "SVE\0"
+ "SVE_BF16\0"
+ "SVE_F32MM\0"
+ "SVE_F64MM\0"
+ "SVE_I8MM\0"
+ "SVE_PMULL\0"
+ "SVE2\0"
+ "SVE2_AES\0"
+ "SVE2_BITPERM\0"
+ "SVE2_SHA3\0"
+ "SVE2_SM4\0"
+ "TME\0"
+ "<Unknown>\0";
+
+ static const uint16_t sFeatureIndex[] = {
+ 0, 5, 11, 19, 25, 31, 38, 47, 56, 65, 74, 83, 92, 101, 107, 113, 119, 127,
+ 131, 139, 145, 150, 154, 160, 166, 170, 174, 182, 187, 192, 200, 206, 215,
+ 223, 232, 238, 243, 249, 255, 259, 263, 273, 277, 281, 287, 291, 294, 299,
+ 304, 309, 316, 320, 324, 329, 333, 342, 352, 362, 371, 381, 386, 395, 408,
+ 418, 427, 431
+ };
+ // @EnumStringEnd@
+
+ return sb.append(sFeatureString + sFeatureIndex[Support::min<uint32_t>(featureId, uint32_t(CpuFeatures::ARM::kMaxValue) + 1)]);
+}
+
+// arm::FormatterInternal - Format Constants
+// =========================================
+
+ASMJIT_FAVOR_SIZE Error FormatterInternal::formatCondCode(String& sb, CondCode cc) noexcept {
+ static const char condCodeData[] =
+ "al\0" "na\0"
+ "eq\0" "ne\0"
+ "cs\0" "cc\0" "mi\0" "pl\0" "vs\0" "vc\0"
+ "hi\0" "ls\0" "ge\0" "lt\0" "gt\0" "le\0"
+ "<Unknown>";
+ return sb.append(condCodeData + Support::min<uint32_t>(uint32_t(cc), 16u) * 3);
+}
+
+ASMJIT_FAVOR_SIZE Error FormatterInternal::formatShiftOp(String& sb, ShiftOp shiftOp) noexcept {
+ const char* str = "<Unknown>";
+ switch (shiftOp) {
+ case ShiftOp::kLSL: str = "lsl"; break;
+ case ShiftOp::kLSR: str = "lsr"; break;
+ case ShiftOp::kASR: str = "asr"; break;
+ case ShiftOp::kROR: str = "ror"; break;
+ case ShiftOp::kRRX: str = "rrx"; break;
+ case ShiftOp::kMSL: str = "msl"; break;
+ case ShiftOp::kUXTB: str = "uxtb"; break;
+ case ShiftOp::kUXTH: str = "uxth"; break;
+ case ShiftOp::kUXTW: str = "uxtw"; break;
+ case ShiftOp::kUXTX: str = "uxtx"; break;
+ case ShiftOp::kSXTB: str = "sxtb"; break;
+ case ShiftOp::kSXTH: str = "sxth"; break;
+ case ShiftOp::kSXTW: str = "sxtw"; break;
+ case ShiftOp::kSXTX: str = "sxtx"; break;
+ }
+ return sb.append(str);
+}
+
+ASMJIT_END_SUB_NAMESPACE
+
+#endif // !ASMJIT_NO_LOGGING
diff --git a/3rdparty/asmjit/src/asmjit/arm/armformatter_p.h b/3rdparty/asmjit/src/asmjit/arm/armformatter_p.h
new file mode 100644
index 00000000000..582173054a8
--- /dev/null
+++ b/3rdparty/asmjit/src/asmjit/arm/armformatter_p.h
@@ -0,0 +1,44 @@
+// This file is part of AsmJit project <https://asmjit.com>
+//
+// See asmjit.h or LICENSE.md for license and copyright information
+// SPDX-License-Identifier: Zlib
+
+#ifndef ASMJIT_ARM_ARMFORMATTER_P_H_INCLUDED
+#define ASMJIT_ARM_ARMFORMATTER_P_H_INCLUDED
+
+#include "../core/api-config.h"
+#ifndef ASMJIT_NO_LOGGING
+
+#include "../core/formatter.h"
+#include "../core/string.h"
+#include "../arm/armglobals.h"
+
+ASMJIT_BEGIN_SUB_NAMESPACE(arm)
+
+//! \cond INTERNAL
+//! \addtogroup asmjit_arm
+//! \{
+
+namespace FormatterInternal {
+
+Error ASMJIT_CDECL formatFeature(
+ String& sb,
+ uint32_t featureId) noexcept;
+
+Error ASMJIT_CDECL formatCondCode(
+ String& sb,
+ CondCode cc) noexcept;
+
+Error ASMJIT_CDECL formatShiftOp(
+ String& sb,
+ ShiftOp shiftOp) noexcept;
+
+} // {FormatterInternal}
+
+//! \}
+//! \endcond
+
+ASMJIT_END_SUB_NAMESPACE
+
+#endif // !ASMJIT_NO_LOGGING
+#endif // ASMJIT_ARM_ARMFORMATTER_P_H_INCLUDED
diff --git a/3rdparty/asmjit/src/asmjit/arm/armglobals.h b/3rdparty/asmjit/src/asmjit/arm/armglobals.h
new file mode 100644
index 00000000000..506646f8068
--- /dev/null
+++ b/3rdparty/asmjit/src/asmjit/arm/armglobals.h
@@ -0,0 +1,21 @@
+// This file is part of AsmJit project <https://asmjit.com>
+//
+// See asmjit.h or LICENSE.md for license and copyright information
+// SPDX-License-Identifier: Zlib
+
+#ifndef ASMJIT_ARM_ARMGLOBALS_H_INCLUDED
+#define ASMJIT_ARM_ARMGLOBALS_H_INCLUDED
+
+#include "../core/archcommons.h"
+#include "../core/inst.h"
+
+//! \namespace asmjit::arm
+//! \ingroup asmjit_arm
+//!
+//! API shared between AArch32 & AArch64 backends.
+
+ASMJIT_BEGIN_SUB_NAMESPACE(arm)
+
+ASMJIT_END_SUB_NAMESPACE
+
+#endif // ASMJIT_ARM_ARMGLOBALS_H_INCLUDED
diff --git a/3rdparty/asmjit/src/asmjit/arm/armoperand.h b/3rdparty/asmjit/src/asmjit/arm/armoperand.h
new file mode 100644
index 00000000000..e7803e952b6
--- /dev/null
+++ b/3rdparty/asmjit/src/asmjit/arm/armoperand.h
@@ -0,0 +1,596 @@
+// This file is part of AsmJit project <https://asmjit.com>
+//
+// See asmjit.h or LICENSE.md for license and copyright information
+// SPDX-License-Identifier: Zlib
+
+#ifndef ASMJIT_ARM_ARMOPERAND_H_INCLUDED
+#define ASMJIT_ARM_ARMOPERAND_H_INCLUDED
+
+#include "../core/archtraits.h"
+#include "../core/operand.h"
+#include "../core/type.h"
+#include "../arm/armglobals.h"
+
+ASMJIT_BEGIN_SUB_NAMESPACE(arm)
+
+//! \addtogroup asmjit_arm
+//! \{
+
+class Reg;
+class Mem;
+
+class Gp;
+class GpW;
+class GpX;
+
+class Vec;
+class VecB;
+class VecH;
+class VecS;
+class VecD;
+class VecV;
+
+//! Register traits (ARM/AArch64).
+//!
+//! Register traits contains information about a particular register type. It's used by asmjit to setup register
+//! information on-the-fly and to populate tables that contain register information (this way it's possible to
+//! change register types and groups without having to reorder these tables).
+template<RegType kRegType>
+struct RegTraits : public BaseRegTraits {};
+
+//! \cond
+// <--------------------+-----+-------------------------+------------------------+---+---+------------------+
+// | Reg | Reg-Type | Reg-Group |Sz |Cnt| TypeId |
+// <--------------------+-----+-------------------------+------------------------+---+---+------------------+
+ASMJIT_DEFINE_REG_TRAITS(GpW , RegType::kARM_GpW , RegGroup::kGp , 4 , 32, TypeId::kInt32 );
+ASMJIT_DEFINE_REG_TRAITS(GpX , RegType::kARM_GpX , RegGroup::kGp , 8 , 32, TypeId::kInt64 );
+ASMJIT_DEFINE_REG_TRAITS(VecB , RegType::kARM_VecB , RegGroup::kVec , 1 , 32, TypeId::kVoid );
+ASMJIT_DEFINE_REG_TRAITS(VecH , RegType::kARM_VecH , RegGroup::kVec , 2 , 32, TypeId::kVoid );
+ASMJIT_DEFINE_REG_TRAITS(VecS , RegType::kARM_VecS , RegGroup::kVec , 4 , 32, TypeId::kInt32x1 );
+ASMJIT_DEFINE_REG_TRAITS(VecD , RegType::kARM_VecD , RegGroup::kVec , 8 , 32, TypeId::kInt32x2 );
+ASMJIT_DEFINE_REG_TRAITS(VecV , RegType::kARM_VecV , RegGroup::kVec , 16, 32, TypeId::kInt32x4 );
+//! \endcond
+
+//! Register (ARM).
+class Reg : public BaseReg {
+public:
+ ASMJIT_DEFINE_ABSTRACT_REG(Reg, BaseReg)
+
+ //! Gets whether the register is a `R|W` register (32-bit).
+ inline constexpr bool isGpW() const noexcept { return baseSignature() == RegTraits<RegType::kARM_GpW>::kSignature; }
+ //! Gets whether the register is an `X` register (64-bit).
+ inline constexpr bool isGpX() const noexcept { return baseSignature() == RegTraits<RegType::kARM_GpX>::kSignature; }
+ //! Gets whether the register is a VEC-B register (8-bit).
+ inline constexpr bool isVecB() const noexcept { return baseSignature() == RegTraits<RegType::kARM_VecB>::kSignature; }
+ //! Gets whether the register is a VEC-H register (16-bit).
+ inline constexpr bool isVecH() const noexcept { return baseSignature() == RegTraits<RegType::kARM_VecH>::kSignature; }
+ //! Gets whether the register is a VEC-S register (32-bit).
+ inline constexpr bool isVecS() const noexcept { return baseSignature() == RegTraits<RegType::kARM_VecS>::kSignature; }
+ //! Gets whether the register is a VEC-D register (64-bit).
+ inline constexpr bool isVecD() const noexcept { return baseSignature() == RegTraits<RegType::kARM_VecD>::kSignature; }
+ //! Gets whether the register is a VEC-Q register (128-bit).
+ inline constexpr bool isVecQ() const noexcept { return baseSignature() == RegTraits<RegType::kARM_VecV>::kSignature; }
+
+ //! Gets whether the register is either VEC-D (64-bit) or VEC-Q (128-bit).
+ inline constexpr bool isVecDOrQ() const noexcept { return uint32_t(type()) - uint32_t(RegType::kARM_VecD) <= 1u; }
+
+ //! Gets whether the register is a VEC-V register (128-bit).
+ inline constexpr bool isVecV() const noexcept { return baseSignature() == RegTraits<RegType::kARM_VecV>::kSignature; }
+
+ template<RegType kRegType>
+ inline void setRegT(uint32_t id) noexcept {
+ setSignature(RegTraits<kRegType>::kSignature);
+ setId(id);
+ }
+
+ inline void setTypeAndId(RegType type, uint32_t id) noexcept {
+ setSignature(signatureOf(type));
+ setId(id);
+ }
+
+ static inline RegGroup groupOf(RegType type) noexcept { return ArchTraits::byArch(Arch::kAArch64).regTypeToGroup(type); }
+ static inline TypeId typeIdOf(RegType type) noexcept { return ArchTraits::byArch(Arch::kAArch64).regTypeToTypeId(type); }
+ static inline OperandSignature signatureOf(RegType type) noexcept { return ArchTraits::byArch(Arch::kAArch64).regTypeToSignature(type); }
+
+ template<RegType kRegType>
+ static inline RegGroup groupOfT() noexcept { return RegTraits<kRegType>::kGroup; }
+
+ template<RegType kRegType>
+ static inline TypeId typeIdOfT() noexcept { return RegTraits<kRegType>::kTypeId; }
+
+ template<RegType kRegType>
+ static inline OperandSignature signatureOfT() noexcept { return RegTraits<kRegType>::kSignature; }
+
+ static inline bool isGpW(const Operand_& op) noexcept { return op.as<Reg>().isGpW(); }
+ static inline bool isGpX(const Operand_& op) noexcept { return op.as<Reg>().isGpX(); }
+ static inline bool isVecB(const Operand_& op) noexcept { return op.as<Reg>().isVecB(); }
+ static inline bool isVecH(const Operand_& op) noexcept { return op.as<Reg>().isVecH(); }
+ static inline bool isVecS(const Operand_& op) noexcept { return op.as<Reg>().isVecS(); }
+ static inline bool isVecD(const Operand_& op) noexcept { return op.as<Reg>().isVecD(); }
+ static inline bool isVecQ(const Operand_& op) noexcept { return op.as<Reg>().isVecQ(); }
+ static inline bool isVecV(const Operand_& op) noexcept { return op.as<Reg>().isVecV(); }
+
+ static inline bool isGpW(const Operand_& op, uint32_t id) noexcept { return isGpW(op) & (op.id() == id); }
+ static inline bool isGpX(const Operand_& op, uint32_t id) noexcept { return isGpX(op) & (op.id() == id); }
+ static inline bool isVecB(const Operand_& op, uint32_t id) noexcept { return isVecB(op) & (op.id() == id); }
+ static inline bool isVecH(const Operand_& op, uint32_t id) noexcept { return isVecH(op) & (op.id() == id); }
+ static inline bool isVecS(const Operand_& op, uint32_t id) noexcept { return isVecS(op) & (op.id() == id); }
+ static inline bool isVecD(const Operand_& op, uint32_t id) noexcept { return isVecD(op) & (op.id() == id); }
+ static inline bool isVecQ(const Operand_& op, uint32_t id) noexcept { return isVecQ(op) & (op.id() == id); }
+ static inline bool isVecV(const Operand_& op, uint32_t id) noexcept { return isVecV(op) & (op.id() == id); }
+};
+
+//! General purpose register (ARM).
+class Gp : public Reg {
+public:
+ ASMJIT_DEFINE_ABSTRACT_REG(Gp, Reg)
+
+ //! Special register id.
+ enum Id : uint32_t {
+ //! Register that depends on OS, could be used as TLS offset.
+ kIdOs = 18,
+ //! Frame pointer.
+ kIdFp = 29,
+ //! Link register.
+ kIdLr = 30,
+ //! Stack register id.
+ kIdSp = 31,
+ //! Zero register id.
+ //!
+ //! Although zero register has the same id as stack register it has a special treatment, because we need to be
+ //! able to distinguish between these two at API level. Some intructions were designed to be used with SP and
+ //! some other with ZR - so we need a way to distinguish these two to make sure we emit the right thing.
+ //!
+ //! The number 63 is not random, when you perform `id & 31` you would always get 31 for both SP and ZR inputs,
+ //! which is the identifier used by AArch64 ISA to encode either SP or ZR depending on the instruction.
+ kIdZr = 63
+ };
+
+ inline constexpr bool isZR() const noexcept { return id() == kIdZr; }
+ inline constexpr bool isSP() const noexcept { return id() == kIdSp; }
+
+ //! Cast this register to a 32-bit R|W.
+ inline GpW w() const noexcept;
+ //! Cast this register to a 64-bit X.
+ inline GpX x() const noexcept;
+};
+
+//! Vector register (ARM).
+class Vec : public Reg {
+public:
+ ASMJIT_DEFINE_ABSTRACT_REG(Vec, Reg)
+
+ //! Additional signature bits used by arm::Vec.
+ enum AdditionalBits : uint32_t {
+ // Register element type (3 bits).
+ // |........|........|.XXX....|........|
+ kSignatureRegElementTypeShift = 12,
+ kSignatureRegElementTypeMask = 0x07 << kSignatureRegElementTypeShift,
+
+ // Register has element index (1 bit).
+ // |........|........|X.......|........|
+ kSignatureRegElementFlagShift = 15,
+ kSignatureRegElementFlagMask = 0x01 << kSignatureRegElementFlagShift,
+
+ // Register element index (4 bits).
+ // |........|....XXXX|........|........|
+ kSignatureRegElementIndexShift = 16,
+ kSignatureRegElementIndexMask = 0x0F << kSignatureRegElementIndexShift
+ };
+
+ //! Element type.
+ enum ElementType : uint32_t {
+ //! No element type specified.
+ kElementTypeNone = 0,
+ //! Byte elements (B8 or B16).
+ kElementTypeB,
+ //! Halfword elements (H4 or H8).
+ kElementTypeH,
+ //! Singleword elements (S2 or S4).
+ kElementTypeS,
+ //! Doubleword elements (D2).
+ kElementTypeD,
+ //! Byte elements grouped by 4 bytes (B4).
+ //!
+ //! \note This element-type is only used by few instructions.
+ kElementTypeB4,
+ //! Halfword elements grouped by 2 halfwords (H2).
+ //!
+ //! \note This element-type is only used by few instructions.
+ kElementTypeH2,
+
+ //! Count of element types.
+ kElementTypeCount
+ };
+
+ //! \cond
+ //! Shortcuts.
+ enum SignatureReg : uint32_t {
+ kSignatureElementB = kElementTypeB << kSignatureRegElementTypeShift,
+ kSignatureElementH = kElementTypeH << kSignatureRegElementTypeShift,
+ kSignatureElementS = kElementTypeS << kSignatureRegElementTypeShift,
+ kSignatureElementD = kElementTypeD << kSignatureRegElementTypeShift,
+ kSignatureElementB4 = kElementTypeB4 << kSignatureRegElementTypeShift,
+ kSignatureElementH2 = kElementTypeH2 << kSignatureRegElementTypeShift
+ };
+ //! \endcond
+
+ //! Returns whether the register has associated an element type.
+ inline constexpr bool hasElementType() const noexcept { return _signature.hasField<kSignatureRegElementTypeMask>(); }
+ //! Returns whether the register has element index (it's an element index access).
+ inline constexpr bool hasElementIndex() const noexcept { return _signature.hasField<kSignatureRegElementFlagMask>(); }
+ //! Returns whether the reggister has element type or element index (or both).
+ inline constexpr bool hasElementTypeOrIndex() const noexcept { return _signature.hasField<kSignatureRegElementTypeMask | kSignatureRegElementFlagMask>(); }
+
+ //! Returns element type of the register.
+ inline constexpr uint32_t elementType() const noexcept { return _signature.getField<kSignatureRegElementTypeMask>(); }
+ //! Sets element type of the register to `elementType`.
+ inline void setElementType(uint32_t elementType) noexcept { _signature.setField<kSignatureRegElementTypeMask>(elementType); }
+ //! Resets element type to none.
+ inline void resetElementType() noexcept { _signature.setField<kSignatureRegElementTypeMask>(0); }
+
+ //! Returns element index of the register.
+ inline constexpr uint32_t elementIndex() const noexcept { return _signature.getField<kSignatureRegElementIndexMask>(); }
+ //! Sets element index of the register to `elementType`.
+ inline void setElementIndex(uint32_t elementIndex) noexcept {
+ _signature |= kSignatureRegElementFlagMask;
+ _signature.setField<kSignatureRegElementIndexMask>(elementIndex);
+ }
+ //! Resets element index of the register.
+ inline void resetElementIndex() noexcept {
+ _signature &= ~(kSignatureRegElementFlagMask | kSignatureRegElementIndexMask);
+ }
+
+ inline constexpr bool isVecB8() const noexcept { return _signature.subset(kBaseSignatureMask | kSignatureRegElementTypeMask) == (RegTraits<RegType::kARM_VecD>::kSignature | kSignatureElementB); }
+ inline constexpr bool isVecH4() const noexcept { return _signature.subset(kBaseSignatureMask | kSignatureRegElementTypeMask) == (RegTraits<RegType::kARM_VecD>::kSignature | kSignatureElementH); }
+ inline constexpr bool isVecS2() const noexcept { return _signature.subset(kBaseSignatureMask | kSignatureRegElementTypeMask) == (RegTraits<RegType::kARM_VecD>::kSignature | kSignatureElementS); }
+ inline constexpr bool isVecD1() const noexcept { return _signature.subset(kBaseSignatureMask | kSignatureRegElementTypeMask) == (RegTraits<RegType::kARM_VecD>::kSignature); }
+
+ inline constexpr bool isVecB16() const noexcept { return _signature.subset(kBaseSignatureMask | kSignatureRegElementTypeMask) == (RegTraits<RegType::kARM_VecV>::kSignature | kSignatureElementB); }
+ inline constexpr bool isVecH8() const noexcept { return _signature.subset(kBaseSignatureMask | kSignatureRegElementTypeMask) == (RegTraits<RegType::kARM_VecV>::kSignature | kSignatureElementH); }
+ inline constexpr bool isVecS4() const noexcept { return _signature.subset(kBaseSignatureMask | kSignatureRegElementTypeMask) == (RegTraits<RegType::kARM_VecV>::kSignature | kSignatureElementS); }
+ inline constexpr bool isVecD2() const noexcept { return _signature.subset(kBaseSignatureMask | kSignatureRegElementTypeMask) == (RegTraits<RegType::kARM_VecV>::kSignature | kSignatureElementD); }
+ inline constexpr bool isVecB4x4() const noexcept { return _signature.subset(kBaseSignatureMask | kSignatureRegElementTypeMask) == (RegTraits<RegType::kARM_VecV>::kSignature | kSignatureElementB4); }
+ inline constexpr bool isVecH2x4() const noexcept { return _signature.subset(kBaseSignatureMask | kSignatureRegElementTypeMask) == (RegTraits<RegType::kARM_VecV>::kSignature | kSignatureElementH2); }
+
+ //! Creates a cloned register with element access.
+ inline Vec at(uint32_t elementIndex) const noexcept {
+ return Vec((signature() & ~kSignatureRegElementIndexMask) | (elementIndex << kSignatureRegElementIndexShift) | kSignatureRegElementFlagMask, id());
+ }
+
+ //! Cast this register to an 8-bit B register (scalar).
+ inline VecB b() const noexcept;
+ //! Cast this register to a 16-bit H register (scalar).
+ inline VecH h() const noexcept;
+ //! Cast this register to a 32-bit S register (scalar).
+ inline VecS s() const noexcept;
+ //! Cast this register to a 64-bit D register (scalar).
+ inline VecD d() const noexcept;
+ //! Cast this register to a 128-bit Q register (scalar).
+ inline VecV q() const noexcept;
+ //! Cast this register to a 128-bit V register.
+ inline VecV v() const noexcept;
+
+ //! Cast this register to a 128-bit V.B[elementIndex] register.
+ inline VecV b(uint32_t elementIndex) const noexcept;
+ //! Cast this register to a 128-bit V.H[elementIndex] register.
+ inline VecV h(uint32_t elementIndex) const noexcept;
+ //! Cast this register to a 128-bit V.S[elementIndex] register.
+ inline VecV s(uint32_t elementIndex) const noexcept;
+ //! Cast this register to a 128-bit V.D[elementIndex] register.
+ inline VecV d(uint32_t elementIndex) const noexcept;
+ //! Cast this register to a 128-bit V.H2[elementIndex] register.
+ inline VecV h2(uint32_t elementIndex) const noexcept;
+ //! Cast this register to a 128-bit V.B4[elementIndex] register.
+ inline VecV b4(uint32_t elementIndex) const noexcept;
+
+ //! Cast this register to V.8B.
+ inline VecD b8() const noexcept;
+ //! Cast this register to V.16B.
+ inline VecV b16() const noexcept;
+ //! Cast this register to V.2H.
+ inline VecS h2() const noexcept;
+ //! Cast this register to V.4H.
+ inline VecD h4() const noexcept;
+ //! Cast this register to V.8H.
+ inline VecV h8() const noexcept;
+ //! Cast this register to V.2S.
+ inline VecD s2() const noexcept;
+ //! Cast this register to V.4S.
+ inline VecV s4() const noexcept;
+ //! Cast this register to V.2D.
+ inline VecV d2() const noexcept;
+
+ static inline constexpr OperandSignature _makeElementAccessSignature(uint32_t elementType, uint32_t elementIndex) noexcept {
+ return OperandSignature{
+ uint32_t(RegTraits<RegType::kARM_VecV>::kSignature) |
+ uint32_t(kSignatureRegElementFlagMask) |
+ uint32_t(elementType << kSignatureRegElementTypeShift) |
+ uint32_t(elementIndex << kSignatureRegElementIndexShift)};
+ }
+};
+
+//! 32-bit GPW (AArch64) and/or GPR (ARM/AArch32) register.
+class GpW : public Gp { ASMJIT_DEFINE_FINAL_REG(GpW, Gp, RegTraits<RegType::kARM_GpW>) };
+//! 64-bit GPX (AArch64) register.
+class GpX : public Gp { ASMJIT_DEFINE_FINAL_REG(GpX, Gp, RegTraits<RegType::kARM_GpX>) };
+
+//! 8-bit view (S) of VFP/SIMD register.
+class VecB : public Vec { ASMJIT_DEFINE_FINAL_REG(VecB, Vec, RegTraits<RegType::kARM_VecB>) };
+//! 16-bit view (S) of VFP/SIMD register.
+class VecH : public Vec { ASMJIT_DEFINE_FINAL_REG(VecH, Vec, RegTraits<RegType::kARM_VecH>) };
+//! 32-bit view (S) of VFP/SIMD register.
+class VecS : public Vec { ASMJIT_DEFINE_FINAL_REG(VecS, Vec, RegTraits<RegType::kARM_VecS>) };
+//! 64-bit view (D) of VFP/SIMD register.
+class VecD : public Vec { ASMJIT_DEFINE_FINAL_REG(VecD, Vec, RegTraits<RegType::kARM_VecD>) };
+//! 128-bit vector register (Q or V).
+class VecV : public Vec { ASMJIT_DEFINE_FINAL_REG(VecV, Vec, RegTraits<RegType::kARM_VecV>) };
+
+inline GpW Gp::w() const noexcept { return GpW(id()); }
+inline GpX Gp::x() const noexcept { return GpX(id()); }
+
+inline VecB Vec::b() const noexcept { return VecB(id()); }
+inline VecH Vec::h() const noexcept { return VecH(id()); }
+inline VecS Vec::s() const noexcept { return VecS(id()); }
+inline VecD Vec::d() const noexcept { return VecD(id()); }
+inline VecV Vec::q() const noexcept { return VecV(id()); }
+inline VecV Vec::v() const noexcept { return VecV(id()); }
+
+inline VecV Vec::b(uint32_t elementIndex) const noexcept { return VecV(_makeElementAccessSignature(kElementTypeB, elementIndex), id()); }
+inline VecV Vec::h(uint32_t elementIndex) const noexcept { return VecV(_makeElementAccessSignature(kElementTypeH, elementIndex), id()); }
+inline VecV Vec::s(uint32_t elementIndex) const noexcept { return VecV(_makeElementAccessSignature(kElementTypeS, elementIndex), id()); }
+inline VecV Vec::d(uint32_t elementIndex) const noexcept { return VecV(_makeElementAccessSignature(kElementTypeD, elementIndex), id()); }
+inline VecV Vec::h2(uint32_t elementIndex) const noexcept { return VecV(_makeElementAccessSignature(kElementTypeH2, elementIndex), id()); }
+inline VecV Vec::b4(uint32_t elementIndex) const noexcept { return VecV(_makeElementAccessSignature(kElementTypeB4, elementIndex), id()); }
+
+inline VecD Vec::b8() const noexcept { return VecD(OperandSignature{VecD::kSignature | kSignatureElementB}, id()); }
+inline VecS Vec::h2() const noexcept { return VecS(OperandSignature{VecS::kSignature | kSignatureElementH}, id()); }
+inline VecD Vec::h4() const noexcept { return VecD(OperandSignature{VecD::kSignature | kSignatureElementH}, id()); }
+inline VecD Vec::s2() const noexcept { return VecD(OperandSignature{VecD::kSignature | kSignatureElementS}, id()); }
+inline VecV Vec::b16() const noexcept { return VecV(OperandSignature{VecV::kSignature | kSignatureElementB}, id()); }
+inline VecV Vec::h8() const noexcept { return VecV(OperandSignature{VecV::kSignature | kSignatureElementH}, id()); }
+inline VecV Vec::s4() const noexcept { return VecV(OperandSignature{VecV::kSignature | kSignatureElementS}, id()); }
+inline VecV Vec::d2() const noexcept { return VecV(OperandSignature{VecV::kSignature | kSignatureElementD}, id()); }
+
+#ifndef _DOXYGEN
+namespace regs {
+#endif
+
+//! Creates a 32-bit W register operand (ARM/AArch64).
+static inline constexpr GpW w(uint32_t id) noexcept { return GpW(id); }
+//! Creates a 64-bit X register operand (AArch64).
+static inline constexpr GpX x(uint32_t id) noexcept { return GpX(id); }
+//! Creates a 32-bit S register operand (ARM/AArch64).
+static inline constexpr VecS s(uint32_t id) noexcept { return VecS(id); }
+//! Creates a 64-bit D register operand (ARM/AArch64).
+static inline constexpr VecD d(uint32_t id) noexcept { return VecD(id); }
+//! Creates a 1282-bit V register operand (ARM/AArch64).
+static inline constexpr VecV v(uint32_t id) noexcept { return VecV(id); }
+
+#ifndef _DOXYGEN
+} // {regs}
+
+// Make `arm::regs` accessible through `arm` namespace as well.
+using namespace regs;
+#endif
+
+//! Memory operand (ARM).
+class Mem : public BaseMem {
+public:
+ //! \cond INTERNAL
+ //! Additional bits of operand's signature used by `arm::Mem`.
+ enum AdditionalBits : uint32_t {
+ // Index shift value (5 bits).
+ // |........|.....XXX|XX......|........|
+ kSignatureMemShiftValueShift = 14,
+ kSignatureMemShiftValueMask = 0x1Fu << kSignatureMemShiftValueShift,
+
+ // Shift operation type (4 bits).
+ // |........|XXXX....|........|........|
+ kSignatureMemPredicateShift = 20,
+ kSignatureMemPredicateMask = 0x0Fu << kSignatureMemPredicateShift
+ };
+ //! \endcond
+
+ //! Memory offset mode.
+ //!
+ //! Additional constants that can be used with the `predicate`.
+ enum OffsetMode : uint32_t {
+ //! Pre-index "[BASE, #Offset {, <shift>}]!" with write-back.
+ kOffsetPreIndex = 0xE,
+ //! Post-index "[BASE], #Offset {, <shift>}" with write-back.
+ kOffsetPostIndex = 0xF
+ };
+
+ //! \name Construction & Destruction
+ //! \{
+
+ //! Construct a default `Mem` operand, that points to [0].
+ inline constexpr Mem() noexcept
+ : BaseMem() {}
+
+ inline constexpr Mem(const Mem& other) noexcept
+ : BaseMem(other) {}
+
+ inline explicit Mem(Globals::NoInit_) noexcept
+ : BaseMem(Globals::NoInit) {}
+
+ inline constexpr Mem(const Signature& signature, uint32_t baseId, uint32_t indexId, int32_t offset) noexcept
+ : BaseMem(signature, baseId, indexId, offset) {}
+
+ inline constexpr explicit Mem(const Label& base, int32_t off = 0, Signature signature = Signature{0}) noexcept
+ : BaseMem(Signature::fromOpType(OperandType::kMem) |
+ Signature::fromMemBaseType(RegType::kLabelTag) |
+ signature, base.id(), 0, off) {}
+
+ inline constexpr explicit Mem(const BaseReg& base, int32_t off = 0, Signature signature = Signature{0}) noexcept
+ : BaseMem(Signature::fromOpType(OperandType::kMem) |
+ Signature::fromMemBaseType(base.type()) |
+ signature, base.id(), 0, off) {}
+
+ inline constexpr Mem(const BaseReg& base, const BaseReg& index, Signature signature = Signature{0}) noexcept
+ : BaseMem(Signature::fromOpType(OperandType::kMem) |
+ Signature::fromMemBaseType(base.type()) |
+ Signature::fromMemIndexType(index.type()) |
+ signature, base.id(), index.id(), 0) {}
+
+ inline constexpr Mem(const BaseReg& base, const BaseReg& index, const Shift& shift, Signature signature = Signature{0}) noexcept
+ : BaseMem(Signature::fromOpType(OperandType::kMem) |
+ Signature::fromMemBaseType(base.type()) |
+ Signature::fromMemIndexType(index.type()) |
+ Signature::fromValue<kSignatureMemPredicateMask>(uint32_t(shift.op())) |
+ Signature::fromValue<kSignatureMemShiftValueMask>(shift.value()) |
+ signature, base.id(), index.id(), 0) {}
+
+ inline constexpr Mem(uint64_t base, Signature signature = Signature{0}) noexcept
+ : BaseMem(Signature::fromOpType(OperandType::kMem) |
+ signature, uint32_t(base >> 32), 0, int32_t(uint32_t(base & 0xFFFFFFFFu))) {}
+
+ //! \}
+
+ //! \name Overloaded Operators
+ //! \{
+
+ inline Mem& operator=(const Mem& other) noexcept = default;
+
+ //! \}
+
+ //! \name ARM Specific Features
+ //! \{
+
+ //! Clones the memory operand.
+ inline constexpr Mem clone() const noexcept { return Mem(*this); }
+ //! Gets new memory operand adjusted by `off`.
+ inline Mem cloneAdjusted(int64_t off) const noexcept {
+ Mem result(*this);
+ result.addOffset(off);
+ return result;
+ }
+
+ using BaseMem::setIndex;
+
+ inline void setIndex(const BaseReg& index, uint32_t shift) noexcept {
+ setIndex(index);
+ setShift(shift);
+ }
+
+ //! Gets whether the memory operand has shift (aka scale) constant.
+ inline constexpr bool hasShift() const noexcept { return _signature.hasField<kSignatureMemShiftValueMask>(); }
+ //! Gets the memory operand's shift (aka scale) constant.
+ inline constexpr uint32_t shift() const noexcept { return _signature.getField<kSignatureMemShiftValueMask>(); }
+ //! Sets the memory operand's shift (aka scale) constant.
+ inline void setShift(uint32_t shift) noexcept { _signature.setField<kSignatureMemShiftValueMask>(shift); }
+ //! Resets the memory operand's shift (aka scale) constant to zero.
+ inline void resetShift() noexcept { _signature.setField<kSignatureMemShiftValueMask>(0); }
+
+ //! Gets memory predicate (shift mode or offset mode), see \ref ShiftOp and \ref OffsetMode.
+ inline constexpr uint32_t predicate() const noexcept { return _signature.getField<kSignatureMemPredicateMask>(); }
+ //! Sets memory predicate to `predicate`, see `Mem::ShiftOp`.
+ inline void setPredicate(uint32_t predicate) noexcept { _signature.setField<kSignatureMemPredicateMask>(predicate); }
+ //! Resets shift mode to LSL (default).
+ inline void resetPredicate() noexcept { _signature.setField<kSignatureMemPredicateMask>(0); }
+
+ inline constexpr bool isFixedOffset() const noexcept { return predicate() < kOffsetPreIndex; }
+ inline constexpr bool isPreOrPost() const noexcept { return predicate() >= kOffsetPreIndex; }
+ inline constexpr bool isPreIndex() const noexcept { return predicate() == kOffsetPreIndex; }
+ inline constexpr bool isPostIndex() const noexcept { return predicate() == kOffsetPostIndex; }
+
+ inline void resetToFixedOffset() noexcept { resetPredicate(); }
+ inline void makePreIndex() noexcept { setPredicate(kOffsetPreIndex); }
+ inline void makePostIndex() noexcept { setPredicate(kOffsetPostIndex); }
+
+ inline Mem pre() const noexcept {
+ Mem result(*this);
+ result.setPredicate(kOffsetPreIndex);
+ return result;
+ }
+
+ inline Mem pre(int64_t off) const noexcept {
+ Mem result(*this);
+ result.setPredicate(kOffsetPreIndex);
+ result.addOffset(off);
+ return result;
+ }
+
+ inline Mem post() const noexcept {
+ Mem result(*this);
+ result.setPredicate(kOffsetPreIndex);
+ return result;
+ }
+
+ inline Mem post(int64_t off) const noexcept {
+ Mem result(*this);
+ result.setPredicate(kOffsetPostIndex);
+ result.addOffset(off);
+ return result;
+ }
+
+ //! \}
+};
+
+//! Creates `[base.reg, offset]` memory operand (offset mode).
+static inline constexpr Mem ptr(const Gp& base, int32_t offset = 0) noexcept {
+ return Mem(base, offset);
+}
+
+//! Creates `[base.reg, offset]!` memory operand (pre-index mode).
+static inline constexpr Mem ptr_pre(const Gp& base, int32_t offset = 0) noexcept {
+ return Mem(base, offset, OperandSignature::fromValue<Mem::kSignatureMemPredicateMask>(Mem::kOffsetPreIndex));
+}
+
+//! Creates `[base.reg], offset` memory operand (post-index mode).
+static inline constexpr Mem ptr_post(const Gp& base, int32_t offset = 0) noexcept {
+ return Mem(base, offset, OperandSignature::fromValue<Mem::kSignatureMemPredicateMask>(Mem::kOffsetPostIndex));
+}
+
+//! Creates `[base.reg, index]` memory operand.
+static inline constexpr Mem ptr(const Gp& base, const Gp& index) noexcept {
+ return Mem(base, index);
+}
+
+//! Creates `[base.reg], index` memory operand (post-index mode).
+static inline constexpr Mem ptr_post(const Gp& base, const Gp& index) noexcept {
+ return Mem(base, index, OperandSignature::fromValue<Mem::kSignatureMemPredicateMask>(Mem::kOffsetPostIndex));
+}
+
+//! Creates `[base.reg, index, SHIFT_OP #shift]` memory operand.
+static inline constexpr Mem ptr(const Gp& base, const Gp& index, const Shift& shift) noexcept {
+ return Mem(base, index, shift);
+}
+
+//! Creates `[base + offset]` memory operand.
+static inline constexpr Mem ptr(const Label& base, int32_t offset = 0) noexcept {
+ return Mem(base, offset);
+}
+
+// TODO: [ARM] PC + offset address.
+#if 0
+//! Creates `[PC + offset]` (relative) memory operand.
+static inline constexpr Mem ptr(const PC& pc, int32_t offset = 0) noexcept {
+ return Mem(pc, offset);
+}
+#endif
+
+//! Creates `[base]` absolute memory operand.
+//!
+//! \note The concept of absolute memory operands doesn't exist on ARM, the ISA only provides PC relative addressing.
+//! Absolute memory operands can only be used if it's known that the PC relative offset is encodable and that it
+//! would be within the limits. Absolute address is also often output from disassemblers, so AsmJit support it so it
+//! can assemble it back.
+static inline constexpr Mem ptr(uint64_t base) noexcept { return Mem(base); }
+
+//! \}
+
+ASMJIT_END_SUB_NAMESPACE
+
+//! \cond INTERNAL
+ASMJIT_BEGIN_NAMESPACE
+ASMJIT_DEFINE_TYPE_ID(arm::GpW, TypeId::kInt32);
+ASMJIT_DEFINE_TYPE_ID(arm::GpX, TypeId::kInt64);
+ASMJIT_DEFINE_TYPE_ID(arm::VecS, TypeId::kFloat32x1);
+ASMJIT_DEFINE_TYPE_ID(arm::VecD, TypeId::kFloat64x1);
+ASMJIT_DEFINE_TYPE_ID(arm::VecV, TypeId::kInt32x4);
+ASMJIT_END_NAMESPACE
+//! \endcond
+
+#endif // ASMJIT_ARM_ARMOPERAND_H_INCLUDED
diff --git a/3rdparty/asmjit/src/asmjit/asmjit-scope-begin.h b/3rdparty/asmjit/src/asmjit/asmjit-scope-begin.h
new file mode 100644
index 00000000000..93397b584a6
--- /dev/null
+++ b/3rdparty/asmjit/src/asmjit/asmjit-scope-begin.h
@@ -0,0 +1,17 @@
+// This file is part of AsmJit project <https://asmjit.com>
+//
+// See asmjit.h or LICENSE.md for license and copyright information
+// SPDX-License-Identifier: Zlib
+
+#ifdef _WIN32
+ #pragma push_macro("min")
+ #pragma push_macro("max")
+
+ #ifdef min
+ #undef min
+ #endif
+
+ #ifdef max
+ #undef max
+ #endif
+#endif
diff --git a/3rdparty/asmjit/src/asmjit/asmjit-scope-end.h b/3rdparty/asmjit/src/asmjit/asmjit-scope-end.h
new file mode 100644
index 00000000000..702cef49f1f
--- /dev/null
+++ b/3rdparty/asmjit/src/asmjit/asmjit-scope-end.h
@@ -0,0 +1,9 @@
+// This file is part of AsmJit project <https://asmjit.com>
+//
+// See asmjit.h or LICENSE.md for license and copyright information
+// SPDX-License-Identifier: Zlib
+
+#ifdef _WIN32
+ #pragma pop_macro("min")
+ #pragma pop_macro("max")
+#endif
diff --git a/3rdparty/asmjit/src/asmjit/asmjit.h b/3rdparty/asmjit/src/asmjit/asmjit.h
index 400426c40a7..1cd0651ffe1 100644
--- a/3rdparty/asmjit/src/asmjit/asmjit.h
+++ b/3rdparty/asmjit/src/asmjit/asmjit.h
@@ -1,9 +1,9 @@
-// AsmJit - Machine code generation for C++
+// This file is part of AsmJit project <https://asmjit.com>
//
-// * Official AsmJit Home Page: https://asmjit.com
-// * Official Github Repository: https://github.com/asmjit/asmjit
+// SPDX-License-Identifier: Zlib
+// Official GitHub Repository: https://github.com/asmjit/asmjit
//
-// Copyright (c) 2008-2020 The AsmJit Authors
+// Copyright (c) 2008-2021 The AsmJit Authors
//
// This software is provided 'as-is', without any express or implied
// warranty. In no event will the authors be held liable for any damages
@@ -26,12 +26,8 @@
#include "./core.h"
-#ifdef ASMJIT_BUILD_X86
+#ifndef ASMJIT_NO_X86
#include "./x86.h"
#endif
-#ifdef ASMJIT_BUILD_ARM
- #include "./arm.h"
-#endif
-
#endif // ASMJIT_ASMJIT_H_INCLUDED
diff --git a/3rdparty/asmjit/src/asmjit/core.h b/3rdparty/asmjit/src/asmjit/core.h
index d0fb214d0ce..4406ed89f30 100644
--- a/3rdparty/asmjit/src/asmjit/core.h
+++ b/3rdparty/asmjit/src/asmjit/core.h
@@ -1,25 +1,7 @@
-// AsmJit - Machine code generation for C++
+// This file is part of AsmJit project <https://asmjit.com>
//
-// * Official AsmJit Home Page: https://asmjit.com
-// * Official Github Repository: https://github.com/asmjit/asmjit
-//
-// Copyright (c) 2008-2020 The AsmJit Authors
-//
-// This software is provided 'as-is', without any express or implied
-// warranty. In no event will the authors be held liable for any damages
-// arising from the use of this software.
-//
-// Permission is granted to anyone to use this software for any purpose,
-// including commercial applications, and to alter it and redistribute it
-// freely, subject to the following restrictions:
-//
-// 1. The origin of this software must not be misrepresented; you must not
-// claim that you wrote the original software. If you use this software
-// in a product, an acknowledgment in the product documentation would be
-// appreciated but is not required.
-// 2. Altered source versions must be plainly marked as such, and must not be
-// misrepresented as being the original software.
-// 3. This notice may not be removed or altered from any source distribution.
+// See asmjit.h or LICENSE.md for license and copyright information
+// SPDX-License-Identifier: Zlib
#ifndef ASMJIT_CORE_H_INCLUDED
#define ASMJIT_CORE_H_INCLUDED
@@ -27,62 +9,48 @@
//! Root namespace used by AsmJit.
namespace asmjit {
-// ============================================================================
-// [Documentation - mainpage]
-// ============================================================================
-
//! \mainpage API Reference
//!
//! AsmJit C++ API reference documentation generated by Doxygen.
//!
-//! AsmJit library uses one global namespace called \ref asmjit, which provides
-//! the whole functionality. Core functionality is within \ref asmjit namespace
-//! and architecture specific functionality is always in its own namespace. For
-//! example \ref asmjit::x86 provides both 32-bit and 64-bit X86 code generation.
+//! AsmJit library uses one global namespace called \ref asmjit, which provides the whole functionality. Core
+//! functionality is within \ref asmjit namespace and architecture specific functionality is always in its own
+//! namespace. For example \ref asmjit::x86 provides both 32-bit and 64-bit X86 code generation.
//!
//! \section main_groups Documentation Groups
//!
-//! AsmJit documentation is structured into groups. Groups can be followed in
-//! order to learn AsmJit, but knowledge from multiple groups is required to
-//! use AsmJit properly:
+//! AsmJit documentation is structured into groups. Groups can be followed in order to learn AsmJit, but knowledge
+//! from multiple groups is required to use AsmJit properly:
//!
//! $$DOCS_GROUP_OVERVIEW$$
//!
-//! \note It's important to understand that in order to learn AsmJit all groups
-//! are important. Some groups can be omitted if a particular tool is out of
-//! interest - for example \ref asmjit_assembler users don't need to know about
-//! \ref asmjit_builder, but it's not the opposite. \ref asmjit_builder users
-//! must know about \ref asmjit_assembler as it also uses operands, labels, and
-//! other concepts. Similarly \ref asmjit_compiler users must know how both \ref
-//! asmjit_assembler and \ref asmjit_builder tools work.
+//! \note It's important to understand that in order to learn AsmJit all groups are important. Some groups can be
+//! omitted if a particular tool is out of interest - for example \ref asmjit_assembler users don't need to know
+//! about \ref asmjit_builder, but it's not the opposite. \ref asmjit_builder users should know about \ref
+//! asmjit_assembler as it also uses operands, labels, and other concepts. Similarly \ref asmjit_compiler users
+//! should know how both \ref asmjit_assembler and \ref asmjit_builder tools work.
//!
//! \section where_to_start Where To Start
//!
-//! AsmJit \ref asmjit_core provides the following two classes that are essential
-//! from the code generation perspective:
+//! AsmJit \ref asmjit_core provides the following two classes that are essential from the code generation perspective:
//!
-//! - \ref CodeHolder provides functionality
-//! to temporarily hold the generated code. It stores all the necessary
-//! information about the code - code buffers, sections, labels, symbols,
-//! and information about relocations.
+//! - \ref CodeHolder provides functionality to temporarily hold the generated code. It stores all the necessary
+//! information about the code - code buffers, sections, labels, symbols, and information about relocations.
//!
-//! - \ref BaseEmitter provides interface used
-//! by emitter implementations. The interface provides basic building blocks
-//! that are then implemented by \ref BaseAssembler, \ref BaseBuilder, and
-//! \ref BaseCompiler.
+//! - \ref BaseEmitter provides interface used by emitter implementations. The interface provides basic building
+//! blocks that are then implemented by \ref BaseAssembler, \ref BaseBuilder, and \ref BaseCompiler.
//!
//! Code emitters:
//!
//! - \ref asmjit_assembler - provides direct machine code generation.
//!
-//! - \ref asmjit_builder - provides intermediate code generation that can
-//! be processed before it's serialized to \ref BaseAssembler.
+//! - \ref asmjit_builder - provides intermediate code generation that can be processed before it's serialized to
+//! \ref BaseAssembler.
//!
-//! - \ref asmjit_compiler - provides high-level code generation with built-in
-//! register allocation.
+//! - \ref asmjit_compiler - provides high-level code generation with built-in register allocation.
//!
-//! - \ref FuncNode - provides insight into how function looks from the Compiler
-//! perspective and how it's stored in a node-list.
+//! - \ref FuncNode - provides insight into how function looks from the Compiler perspective and how it's stored in
+//! a node-list.
//!
//! \section main_recommendations Recommendations
//!
@@ -92,76 +60,63 @@ namespace asmjit {
//!
//! - Make sure that you use \ref ErrorHandler, see \ref asmjit_error_handling.
//!
-//! - Instruction validation in your debug builds can reveal problems too.
-//! AsmJit provides validation at instruction level, that can be enabled
-//! by \ref BaseEmitter::addValidationOptions().
+//! - Instruction validation in your debug builds can reveal problems too. AsmJit provides validation at instruction
+//! level that can be enabled via \ref BaseEmitter::addDiagnosticOptions(). See \ref DiagnosticOptions for more
+//! details.
//!
-//! See \ref BaseEmitter::ValidationOptions for more details.
+//! - If you are a Compiler user, use diagnostic options and read carefully if anything suspicious pops out.
+//! Diagnostic options can be enabled via \ref BaseEmitter::addDiagnosticOptions(). If unsure which ones to use,
+//! enable annotations and all debug options: `DiagnosticOptions::kRAAnnotate | DiagnosticOptions::kRADebugAll`.
//!
-//! - Make sure you put a breakpoint into \ref DebugUtils::errored() function
-//! if you have a problem with AsmJit returning errors during instruction
-//! encoding or register allocation. Having an active breakpoint there can
-//! help to reveal the origin of the error, to inspect variables and other
-//! conditions that caused to it.
+//! - Make sure you put a breakpoint into \ref DebugUtils::errored() function if you have a problem with AsmJit
+//! returning errors during instruction encoding or register allocation. Having an active breakpoint there can
+//! help to reveal the origin of the error, to inspect variables and other conditions that caused it.
//!
-//! The reason for using \ref Logger and \ref ErrorHandler is that they provide
-//! a very useful information about what's happening inside emitters. In many
-//! cases the information provided by these two is crucial to quickly fix issues
-//! that happen during development (for example wrong instruction, address, or
-//! register used). In addition, output from \ref Logger is always necessary
-//! when filling bug reports. In other words, using logging and proper error
-//! handling can save a lot of time during the development.
+//! The reason for using \ref Logger and \ref ErrorHandler is that they provide a very useful information about what's
+//! happening inside emitters. In many cases the information provided by these two is crucial to quickly identify and
+//! fix issues that happen during development (for example wrong instruction, address, or register used). In addition,
+//! output from \ref Logger is always necessary when filling bug reports. In other words, using logging and proper error
+//! handling can save a lot of time during the development and can also save users from submitting issues.
//!
//! \section main_other Other Pages
//!
//! - <a href="annotated.html">Class List</a> - List of classes sorted alphabetically
//! - <a href="namespaceasmjit.html">AsmJit Namespace</a> - List of symbols provided by `asmjit` namespace
-// ============================================================================
-// [Documentation - asmjit_build]
-// ============================================================================
//! \defgroup asmjit_build Build Instructions
//! \brief Build instructions, supported environments, and feature selection.
//!
//! ### Overview
//!
-//! AsmJit is designed to be easy embeddable in any project. However, it depends
-//! on some compile-time definitions that can be used to enable or disable
-//! features to decrease the resulting binary size. A typical way of building
-//! AsmJit is to use [cmake](https://www.cmake.org), but it's also possible to
-//! just include AsmJit source code in your project and to just build it. The
-//! easiest way to include AsmJit in your project is to just include **src**
-//! directory in your project and to define \ref ASMJIT_STATIC. AsmJit can be
-//! just updated from time to time without any changes to this integration
-//! process. Do not embed AsmJit's `test` files in such case as these are used
-//! exclusively for testing.
+//! AsmJit is designed to be easy embeddable in any project. However, it depends on some compile-time definitions that
+//! can be used to enable or disable features to decrease the resulting binary size. A typical way of building AsmJit
+//! is to use [cmake](https://www.cmake.org), but it's also possible to just include AsmJit source code in your project
+//! and to just build it. The easiest way to include AsmJit in your project is to just include **src** directory in
+//! your project and to define \ref ASMJIT_STATIC. AsmJit can be just updated from time to time without any changes to
+//! this integration process. Do not embed AsmJit's `test` files in such case as these are used exclusively for testing.
//!
//! ### Supported C++ Compilers
//!
//! - Requirements:
//!
-//! - AsmJit won't build without C++11 enabled. If you use older GCC or Clang
-//! you would have to enable at least C++11 standard through compiler flags.
+//! - AsmJit won't build without C++11 enabled. If you use older GCC or Clang you would have to enable at least
+//! C++11 standard through compiler flags.
//!
//! - Tested:
//!
-//! - **Clang** - Tested by Travis-CI - Clang 3.9+ (with C++11 enabled) is
-//! officially supported (older Clang versions having C++11 support are
-//! probably fine, but are not regularly tested).
+//! - **Clang** - Tested by GitHub Actions - Clang 3.9+ (with C++11 enabled) is officially supported (older Clang
+//! versions having C++11 support are probably fine, but are not regularly tested).
//!
-//! - **GNU** - Tested by Travis-CI - GCC 4.8+ (with C++11 enabled) is
-//! officially supported.
+//! - **GNU** - Tested by GitHub Actions - GCC 4.8+ (with C++11 enabled) is officially supported.
//!
-//! - **MINGW** - Tested by Travis-CI - Use the latest version, if possible.
+//! - **MINGW** - Should work, but it's not tested in our CI environment.
//!
-//! - **MSVC** - Tested by Travis-CI - VS2017+ is officially supported, VS2015
-//! is reported to work.
+//! - **MSVC** - Tested by GitHub Actions - VS2017+ is officially supported, VS2015 is reported to work.
//!
//! - Untested:
//!
-//! - **Intel** - No maintainers and no CI environment to regularly test
-//! this compiler.
+//! - **Intel** - No maintainers and no CI environment to regularly test this compiler.
//!
//! - **Other** C++ compilers would require basic support in
//! [core/api-config.h](https://github.com/asmjit/asmjit/tree/master/src/asmjit/core/api-config.h).
@@ -170,258 +125,261 @@ namespace asmjit {
//!
//! - Tested:
//!
-//! - **Linux** - Tested by Travis-CI (any distribution is generally supported).
+//! - **Linux** - Tested by GitHub Actions (any distribution is generally supported).
//!
-//! - **OSX** - Tested by Travis-CI (any version is supported).
+//! - **Mac OS** - Tested by GitHub Actions (any version is supported).
//!
-//! - **Windows** - Tested by Travis-CI - (Windows 7+ is officially supported).
+//! - **Windows** - Tested by GitHub Actions - (Windows 7+ is officially supported).
//!
-//! - **Emscripten** - Works if compiled with \ref ASMJIT_NO_JIT. AsmJit
-//! cannot generate WASM code, but can be used to generate X86/X64 code
-//! within a browser, for example.
+//! - **Emscripten** - Works if compiled with \ref ASMJIT_NO_JIT. AsmJit cannot generate WASM code, but can be
+//! used to generate X86/X64 code within a browser, for example.
//!
//! - Untested:
//!
-//! - **BSDs** - No maintainers, no CI environment to regularly test BSDs,
-//! but they should work out of box.
+//! - **BSDs** - No maintainers, no CI environment to regularly test BSDs, but they should work out of box.
//!
//! - **Haiku** - Not regularly tested, but reported to work.
//!
-//! - **Other** operating systems would require some testing and support in
-//! the following files:
+//! - **Other** operating systems would require some testing and support in the following files:
//! - [core/api-config.h](https://github.com/asmjit/asmjit/tree/master/src/asmjit/core/api-config.h)
//! - [core/osutils.cpp](https://github.com/asmjit/asmjit/tree/master/src/asmjit/core/osutils.cpp)
//! - [core/virtmem.cpp](https://github.com/asmjit/asmjit/tree/master/src/asmjit/core/virtmem.cpp)
//!
//! ### Supported Backends / Architectures
//!
-//! - **X86** - Both 32-bit and 64-bit backends tested by Travis-CI.
-//! - **ARM** - Work-in-progress (not public at the moment).
+//! - **X86** and **X86_64** - Both 32-bit and 64-bit backends tested on CI.
+//! - **AArch64** - AArch64 backend is currently only partially tested (there is no native AArch64 runner to test
+//! AsmJit Builder/Compiler)
//!
//! ### Static Builds and Embedding
//!
-//! These definitions can be used to enable static library build. Embed is used
-//! when AsmJit's source code is embedded directly in another project, implies
-//! static build as well.
+//! These definitions can be used to enable static library build. Embed is used when AsmJit's source code is embedded
+//! directly in another project, implies static build as well.
//!
//! - \ref ASMJIT_EMBED - Asmjit is embedded, implies \ref ASMJIT_STATIC.
//! - \ref ASMJIT_STATIC - Enable static-library build.
//!
-//! \note Projects that use AsmJit statically must define \ref ASMJIT_STATIC in
-//! all compilation units that use AsmJit, otherwise AsmJit would use dynamic
-//! library imports in \ref ASMJIT_API decorator. The recommendation is to
-//! define this macro across the whole project that uses AsmJit this way.
+//! \note Projects that use AsmJit statically must define \ref ASMJIT_STATIC in all compilation units that use AsmJit,
+//! otherwise AsmJit would use dynamic library imports in \ref ASMJIT_API decorator. The recommendation is to define
+//! this macro across the whole project that uses AsmJit this way.
//!
//! ### Build Configuration
//!
-//! These definitions control whether asserts are active or not. By default
-//! AsmJit would autodetect build configuration from existing pre-processor
-//! definitions, but this behavior can be overridden, for example to enable
-//! debug asserts in release configuration.
+//! These definitions control whether asserts are active or not. By default AsmJit would autodetect build configuration
+//! from existing pre-processor definitions, but this behavior can be overridden, for example to enable debug asserts
+//! in release configuration.
//!
-//! - \ref ASMJIT_BUILD_DEBUG - Overrides build configuration to debug,
-//! asserts will be enabled in this case.
-//! - \ref ASMJIT_BUILD_RELEASE - Overrides build configuration to release,
-//! asserts will be disabled in this case.
+//! - \ref ASMJIT_BUILD_DEBUG - Overrides build configuration to debug, asserts will be enabled in this case.
+//! - \ref ASMJIT_BUILD_RELEASE - Overrides build configuration to release, asserts will be disabled in this case.
//!
-//! \note There is usually no need to override the build configuration. AsmJit
-//! detects the build configuration by checking whether `NDEBUG` is defined and
-//! automatically defines \ref ASMJIT_BUILD_RELEASE if configuration overrides
-//! were not used. We only recommend using build configuration overrides in
-//! special situations, like using AsmJit in release configuration with asserts
-//! enabled for whatever reason.
+//! \note There is usually no need to override the build configuration. AsmJit detects the build configuration by
+//! checking whether `NDEBUG` is defined and automatically defines \ref ASMJIT_BUILD_RELEASE if configuration overrides
+//! were not used. We only recommend using build configuration overrides in special situations, like using AsmJit in
+//! release configuration with asserts enabled for whatever reason.
//!
//! ### AsmJit Backends
//!
-//! AsmJit currently supports only X86/X64 backend, but the plan is to add more
-//! backends in the future. By default AsmJit builds only the host backend, which
-//! is autodetected at compile-time, but this can be overridden.
+//! AsmJit currently supports only X86/X64 backend, but the plan is to add more backends in the future. By default
+//! AsmJit builds only the host backend, which is autodetected at compile-time, but this can be overridden.
//!
-//! - \ref ASMJIT_BUILD_X86 - Always build X86 backend (X86 and X86_64).
-//! - \ref ASMJIT_BUILD_ARM - Always build ARM backend (ARM and AArch64).
-//! - \ref ASMJIT_BUILD_HOST - Always build the host backend, implied by default.
+//! - \ref ASMJIT_NO_X86 - Disable X86/X64 backends.
+//! - \ref ASMJIT_NO_FOREIGN - Disables the support for foreign architectures.
//!
//! ### Features Selection
//!
-//! AsmJit builds by defaults all supported features, which includes all emitters,
-//! logging, instruction validation and introspection, and JIT memory allocation.
-//! Features can be disabled at compile time by using `ASMJIT_NO_...` definitions.
+//! AsmJit builds by defaults all supported features, which includes all emitters, logging, instruction validation and
+//! introspection, and JIT memory allocation. Features can be disabled at compile time by using `ASMJIT_NO_...`
+//! definitions.
//!
-//! - \ref ASMJIT_NO_DEPRECATED - Disables deprecated API at compile time
-//! so it won't be available and the compilation will fail if there is
-//! attempt to use such API. This includes deprecated classes, namespaces,
+//! - \ref ASMJIT_NO_DEPRECATED - Disables deprecated API at compile time so it won't be available and the
+//! compilation will fail if there is attempt to use such API. This includes deprecated classes, namespaces,
//! enumerations, and functions.
//!
-//! - \ref ASMJIT_NO_BUILDER - Disables \ref asmjit_builder functionality
-//! completely. This implies \ref ASMJIT_NO_COMPILER as \ref asmjit_compiler
-//! cannot be used without \ref asmjit_builder.
+//! - \ref ASMJIT_NO_BUILDER - Disables \ref asmjit_builder functionality completely. This implies \ref
+//! ASMJIT_NO_COMPILER as \ref asmjit_compiler cannot be used without \ref asmjit_builder.
//!
-//! - \ref ASMJIT_NO_COMPILER - Disables \ref asmjit_compiler functionality
-//! completely.
+//! - \ref ASMJIT_NO_COMPILER - Disables \ref asmjit_compiler functionality completely.
//!
//! - \ref ASMJIT_NO_JIT - Disables JIT memory management and \ref JitRuntime.
//!
//! - \ref ASMJIT_NO_LOGGING - Disables \ref Logger and \ref Formatter.
//!
-//! - \ref ASMJIT_NO_TEXT - Disables everything that contains string
-//! representation of AsmJit constants, should be used together with
-//! \ref ASMJIT_NO_LOGGING as logging doesn't make sense without the
-//! ability to quiry instruction names, register names, etc...
+//! - \ref ASMJIT_NO_TEXT - Disables everything that contains string representation of AsmJit constants, should
+//! be used together with \ref ASMJIT_NO_LOGGING as logging doesn't make sense without the ability to query
+//! instruction names, register names, etc...
//!
//! - \ref ASMJIT_NO_VALIDATION - Disables validation API.
//!
-//! - \ref ASMJIT_NO_INTROSPECTION - Disables instruction introspection API,
-//! must be used together with \ref ASMJIT_NO_COMPILER as \ref asmjit_compiler
-//! requires introspection for its liveness analysis and register allocation.
+//! - \ref ASMJIT_NO_INTROSPECTION - Disables instruction introspection API, must be used together with \ref
+//! ASMJIT_NO_COMPILER as \ref asmjit_compiler requires introspection for its liveness analysis and register
+//! allocation.
//!
-//! \note It's not recommended to disable features if you plan to build AsmJit
-//! as a shared library that will be used by multiple projects that you don't
-//! control how AsmJit was built (for example AsmJit in a Linux distribution).
-//! The possibility to disable certain features exists mainly for customized
-//! AsmJit builds.
+//! \note It's not recommended to disable features if you plan to build AsmJit as a shared library that will be
+//! used by multiple projects that you don't control how AsmJit was built (for example AsmJit in a Linux distribution).
+//! The possibility to disable certain features exists mainly for customized AsmJit builds.
-// ============================================================================
-// [Documentation - asmjit_breaking_changes]
-// ============================================================================
//! \defgroup asmjit_breaking_changes Breaking Changes
//! \brief Documentation of breaking changes
//!
//! ### Overview
//!
-//! AsmJit is a live project that is being actively developed. Deprecating the
-//! existing API in favor of a new one is preferred, but it's not always
-//! possible if the changes are significant. AsmJit authors prefer to do
-//! accumulated breaking changes at once instead of breaking the API often.
-//! This page documents deprecated and removed APIs and should serve as a how-to
-//! guide for people that want to port existing code to work with the newest AsmJit.
+//! AsmJit is a live project that is being actively developed. Deprecating the existing API in favor of a new
+//! one is preferred, but it's not always possible if the changes are significant. AsmJit authors prefer to do
+//! accumulated breaking changes at once instead of breaking the API often. This page documents deprecated and
+//! removed APIs and should serve as a how-to guide for people that want to port existing code to work with the
+//! newest AsmJit.
//!
//! ### Tips
//!
//! Useful tips before you start:
//!
-//! - Visit our [Public Gitter Channel](https://gitter.im/asmjit/asmjit) if
-//! you need a quick help.
+//! - Visit our [Public Gitter Channel](https://gitter.im/asmjit/asmjit) if you need a quick help.
+//!
+//! - Build AsmJit with `ASMJIT_NO_DEPRECATED` macro defined to make sure that you are not using deprecated
+//! functionality at all. Deprecated functions are decorated with `ASMJIT_DEPRECATED()` macro, but sometimes
+//! it's not possible to decorate everything like classes, which are used by deprecated functions as well,
+//! because some compilers would warn about that. If your project compiles fine with `ASMJIT_NO_DEPRECATED`
+//! it's not using anything, which was deprecated.
+//!
+//! ### Changes committed at 2021-12-13
//!
-//! - Build AsmJit with `ASMJIT_NO_DEPRECATED` macro defined to make sure that
-//! you are not using deprecated functionality at all. Deprecated functions
-//! are decorated with `ASMJIT_DEPRECATED()` macro, but sometimes it's not
-//! possible to decorate everything like classes, which are used by deprecated
-//! functions as well, because some compilers would warn about that. If your
-//! project compiles fine with `ASMJIT_NO_DEPRECATED` it's not using anything,
-//! which was deprecated.
+//! Core changes:
+//!
+//! - Removed old deprecated API.
+//!
+//! - Many enumerations were changed to enum class, and many public APIs were changed to use such enums instead
+//! of uint32_t. This change makes some APIs backward incompatible - there are no deprecations this time.
+//!
+//! - Extracted operand signature manipulation to `OperandSignature`.
+//! - Setting function arguments through `Compiler::setArg()` was deprecated, use FuncNode::setArg() instead.
+//! - Moved `{arch}::Features::k` to `CpuFeatures::{arch}::k`.
+//! - Moved `BaseEmitter::kEncodingOption` to `EncodingOptions::k`.
+//! - Moved `BaseEmitter::kFlag` to `EmitterFlags::k`.
+//! - Moved `BaseEmitter::kType` to `EmitterType::k`.
+//! - Moved `BaseEmitter::kValidationOption` to `DiagnosticOptions::kValidate`.
+//! - Moved `BaseFeatures` to `CpuFeatures`.
+//! - Moved `BaseInst::kControl` to `InstControlFlow::k`.
+//! - Moved `BaseInst::kOption` and `x86::Inst::kOption` to `InstOptions::k`.
+//! - Moved `BaseNode::kNode` to `NodeType::k`.
+//! - Moved `BaseReg::kGroup` and `x86::Reg::kGroup` to `RegGroup::k`.
+//! - Moved `BaseReg::kType` and `x86::Reg::kType` to `RegType::k`.
+//! - Moved `CallConv::kFlag` to `CallConvFlags::k`.
+//! - Moved `CallConv::kId` to `CallConvId::k`.
+//! - Moved `CallConv::kStrategy` to `CallConvStrategy::k`.
+//! - Moved `CodeBuffer::kFlag` to `CodeBufferFlags`.
+//! - Moved `ConstPool::kScope` to `ConstPoolScope::k`.
+//! - Moved `Environment::kArch` to `Arch::k`.
+//! - Moved `Environment::kSubArch` to `SubArch::k`.
+//! - Moved `Environment::kFormat` to `OjectFormat::k`.
+//! - Moved `Environment::kPlatform` to `Platform::k`.
+//! - Moved `Environment::kAbi` to `PlatformABI::k`.
+//! - Moved `Environment::kVendor` to `Vendor::k`.
+//! - Moved `FormatOptions::kFlag` to `FormatFlags::k` and `DiagnosticOptions::k` (Compiler diagnostics flags).
+//! - Moved `FormatOptions::kIndentation` to `FormatIndentationGroup::k`.
+//! - Moved `FuncFrame::kAttr` to `FuncAttributes::k`.
+//! - Moved `Globals::kReset` to `ResetPolicy::k`.
+//! - Moved `InstDB::kAvx512Flag` to `InstDB::Avx512Flags::k`.
+//! - Moved `InstDB::kFlag` to `InstDB::InstFlags::k`.
+//! - Moved `InstDB::kMemFlag` to `InstDB::OpFlags::kMem`.
+//! - Moved `InstDB::kMode` to `InstDB::Mode::k`.
+//! - Moved `InstDB::kOpFlag` to `InstDB::OpFlags::k{OpType}...`.
+//! - Moved `JitAllocator::kOption` to `JitAllocatorOptions::k`.
+//! - Moved `Label::kType` to `LabelType::k`.
+//! - Moved `Operand::kOpType` to `OperandType::k`.
+//! - Moved `OpRWInfo::kFlag` to `OpRWFlags::k`.
+//! - Moved `Type::kId` to `TypeId::k`.
+//! - Moved `VirtMem::k` to `VirtMem::MemoryFlags::k`.
//!
//! ### Changes committed at 2020-05-30
//!
-//! AsmJit has been cleaned up significantly, many todo items have been fixed
-//! and many functions and classes have been redesigned, some in an incompatible
-//! way.
+//! AsmJit has been cleaned up significantly, many todo items have been fixed and many functions and classes have
+//! been redesigned, some in an incompatible way.
//!
//! Core changes:
//!
-//! - \ref Imm operand has now only \ref Imm::value() and \ref Imm::valueAs()
-//! functions that return its value content, and \ref Imm::setValue() function
-//! that sets the content. Functions like `setI8()`, `setU8()` were deprecated.
+//! - `Imm` operand has now only `Imm::value()` and `Imm::valueAs()` functions that return its value content,
+//! and `Imm::setValue()` function that sets the content. Functions like `setI8()`, `setU8()` were deprecated.
//!
//! Old functions were deprecated, but code using them should still compile.
//!
-//! - `ArchInfo` has been replaced with \ref Environment. Environment provides
-//! more details about the architecture, but drops some properties that
-//! were used by arch info - `gpSize(`) and `gpCount()`. `gpSize()` can
-//! be replaced with `registerSize()` getter, which returns a native register
-//! size of the architecture the environment uses. However, `gpCount()` was
-//! removed - at the moment \ref ArchRegs can be used to access such properties.
+//! - `ArchInfo` has been replaced with `Environment`. Environment provides more details about the architecture,
+//! but drops some properties that were used by arch info - `gpSize(`) and `gpCount()`. `gpSize()` can be replaced
+//! with `registerSize()` getter, which returns a native register size of the architecture the environment uses.
+//! However, `gpCount()` was removed - at the moment `ArchTraits` can be used to access such properties.
//!
-//! Some other functions were renamed, like `ArchInfo::isX86Family()` is
-//! now \ref Environment::isFamilyX86(), etc. The reason for changing the
-//! order was support for more propertries and all the accessors now
-//! start with the type of the property, like \ref Environment::isPlatformWindows().
+//! Some other functions were renamed, like `ArchInfo::isX86Family()` is now `Environment::isFamilyX86()`, etc.
+//! The reason for changing the order was support for more propertries and all the accessors now start with the
+//! type of the property, like `Environment::isPlatformWindows()`.
//!
-//! This function causes many other classes to provide `environment()` getter
-//! instead of `archInfo()` getter. In addition, AsmJit now uses `arch()` to
-//! get an architecture instead of `archId()`. `ArchInfo::kIdXXX` was renamed
-//! to `Environment::kArchXXX`.
+//! This function causes many other classes to provide `environment()` getter instead of `archInfo()` getter.
+//! In addition, AsmJit now uses `arch()` to get an architecture instead of `archId()`. `ArchInfo::kIdXXX` was
+//! renamed to `Environment::kArchXXX`.
//!
//! Some functions were deprecated, some removed...
//!
-//! - `CodeInfo` has been removed in favor of \ref Environment. If you used
-//! `CodeInfo` to set architecture and base address, this is now possible
-//! with \ref Environment and setting base address explicitly by \ref
-//! CodeHolder::init() - the first argument is \ref Environment, and the
-//! second argument is base address, which defaults to \ref
-//! Globals::kNoBaseAddress.
+//! - `CodeInfo` has been removed in favor of `Environment`. If you used `CodeInfo` to set architecture and base
+//! address, this is now possible with `Environment` and setting base address explicitly by `CodeHolder::init()`
+//! - the first argument is `Environment`, and the second argument is base address, which defaults to
+//! `Globals::kNoBaseAddress`.
//!
-//! CodeInfo class was deprecated, but the code using it should still
-//! compile with warnings.
+//! CodeInfo class was deprecated, but the code using it should still compile with warnings.
//!
-//! - \ref CallConv has been updated to offer a more unified way of representing
-//! calling conventions - many calling conventions were abstracted to follow
-//! standard naming like \ref CallConv::kIdCDecl or \ref CallConv::kIdStdCall.
+//! - `CallConv` has been updated to offer a more unified way of representing calling conventions - many calling
+//! conventions were abstracted to follow standard naming like `CallConvId::kCDecl` or `CallConvId::kStdCall`.
//!
-//! This change means that other APIs like \ref FuncDetail::init() now
-//! require both, calling convention and target \ref Environment.
+//! This change means that other APIs like `FuncDetail::init()` now require both, calling convention and target
+//! `Environment`.
//!
-//! - `Logging` namespace has been renamed to \ref Formatter, which now
-//! provides general functionality for formatting in AsmJit.
+//! - `Logging` namespace has been renamed to `Formatter`, which now provides general functionality for formatting
+//! in AsmJit.
//!
-//! Logging namespace should still work, but its use is deprecated.
-//! Unfortunately this will be without deprecation warnings, so please
-//! make sure you don't use it.
+//! Logging namespace should still work, but its use is deprecated. Unfortunately this will be without deprecation
+//! warnings, so make sure you don't use it.
//!
-//! - `Data64`, `Data128`, and `Data256` structs were deprecated and should
-//! no longer be used. There is no replacement, AsmJit users should simply
-//! create their own structures if they need them or use the new repeated
-//! embed API in emitters, see \ref BaseEmitter::embedDataArray().
+//! - `Data64`, `Data128`, and `Data256` structs were deprecated and should no longer be used. There is no replacement,
+//! AsmJit users should simply create their own structures if they need them or use the new repeated embed API in
+//! emitters, see `BaseEmitter::embedDataArray()`.
//!
//! Emitter changes:
//!
-//! - \ref BaseEmitter::emit() function signature has been changed to accept
-//! 3 operands by reference and the rest 3 operands as a continuous array.
-//! This change is purely cosmetic and shouldn't affect users as emit()
-//! has many overloads that dispatch to the right function.
+//! - `BaseEmitter::emit()` function signature has been changed to accept 3 operands by reference and the rest 3
+//! operands as a continuous array. This change is purely cosmetic and shouldn't affect users as emit() has many
+//! overloads that dispatch to the right function.
//!
-//! - \ref x86::Emitter (Assembler, Builder, Compiler) deprecates embed
-//! utilities like `dint8()`, `duint8()`, `duint16()`, `dxmm()`, etc...
-//! in favor of a new and more powerful \ref BaseEmitter::embedDataArray().
-//! This function also allows emitting repeated values and/or patterns,
-//! which is used by helpers \ref BaseEmitter::embedUInt8(), and others...
+//! - `x86::Emitter` (Assembler, Builder, Compiler) deprecates embed utilities like `dint8()`, `duint8()`, `duint16()`,
+//! `dxmm()`, etc... in favor of a new and more powerful `BaseEmitter::embedDataArray()`. This function also allows
+//! emitting repeated values and/or patterns, which is used by helpers `BaseEmitter::embedUInt8()`, and others...
//!
-//! - Validation is now available through \ref BaseEmitter::ValidationOptions,
-//! which can be enabled/disabled through \ref BaseEmitter::addValidationOptions()
-//! and \ref BaseEmitter::clearValidationOptions(), respectively. Validation
-//! options now separate between encoding and Builder/Compiler so it's possible
-//! to choose the granularity required.
+//! - Validation is now available through `BaseEmitter::DiagnosticOptions`, which can be enabled/disabled through
+//! `BaseEmitter::addDiagnosticOptions()` and `BaseEmitter::clearDiagnosticOptions()`, respectively. Validation
+//! options now separate between encoding and Builder/Compiler so it's possible to choose the granularity required.
//!
//! Builder changes:
//!
-//! - Internal functions for creating nodes were redesigned. They now accept
-//! a pointer to the node created as a first parameter. These changes should
-//! not affect AsmJit users as these functions were used internally.
+//! - Internal functions for creating nodes were redesigned. They now accept a pointer to the node created as
+//! a first parameter. These changes should not affect AsmJit users as these functions were used internally.
//!
//! Compiler changes:
//!
-//! - `FuncCallNode` has been renamed to \ref InvokeNode. Additionally, function
-//! calls should now use \ref x86::Compiler::invoke() instead of `call()`.
-//! The reason behind this is to remove the confusion between a `call`
-//! instruction and AsmJit's `call()` intrinsic, which is now `invoke()`.
+//! - `FuncCallNode` has been renamed to `InvokeNode`. Additionally, function calls should now use
+//! `x86::Compiler::invoke()` instead of `call()`. The reason behind this is to remove the confusion between a
+//! `call` instruction and AsmJit's `call()` intrinsic, which is now `invoke()`.
//!
-//! - Creating new nodes also changed. Now the preferred way of invoking a
-//! function is to call \ref x86::Compiler::invoke() where the first
-//! argument is `InvokeNode**`. The function now returns an error and would
-//! call \ref ErrorHandler in case of a failure. Error handling was
-//! unspecified in the past - the function was marked noexcept, but called
-//! error handler, which could throw.
+//! - Creating new nodes also changed. Now the preferred way of invoking a function is to call
+//! `x86::Compiler::invoke()` where the first argument is `InvokeNode**`. The function now returns an error and
+//! would call `ErrorHandler` in case of a failure. Error handling was unspecified in the past - the function was
+//! marked noexcept, but called error handler, which could throw.
//!
-//! The reason behind this change is to make the API consistent with other
-//! changes and to also make it possible to inspect the possible error. In
-//! the previous API it returned a new node or `nullptr` in case of error,
-//! which the user couldn't inspect unless there was an attached \ref
-//! ErrorHandler.
+//! The reason behind this change is to make the API consistent with other changes and to also make it possible
+//! to inspect the possible error. In the previous API it returned a new node or `nullptr` in case of error,
+//! which the user couldn't inspect unless there was an attached `ErrorHandler`.
//!
//! Samples:
//!
//! ```
//! #include <asmjit/x86.h>
+//!
//! using namespace asmjit;
//!
//! // The basic setup of JitRuntime and CodeHolder changed, use environment()
@@ -438,55 +396,46 @@ namespace asmjit {
//! }
//! ```
-// ============================================================================
-// [Documentation - asmjit_core]
-// ============================================================================
//! \defgroup asmjit_core Core
//! \brief Globals, code storage, and emitter interface.
//!
//! ### Overview
//!
-//! AsmJit library uses \ref CodeHolder to hold code during code generation and
-//! emitters inheriting from \ref BaseEmitter to emit code. CodeHolder uses
-//! containers to manage its data:
+//! AsmJit library uses \ref CodeHolder to hold code during code generation and emitters inheriting from \ref
+//! BaseEmitter to emit code. CodeHolder uses containers to manage its data:
//!
//! - \ref Section - stores information about a code or data section.
//! - \ref CodeBuffer - stores actual code or data, part of \ref Section.
-//! - \ref LabelEntry - stores information about a label - its name, offset,
-//! section where it belongs to, and other bits.
-//! - \ref LabelLink - stores information about yet unbound label, which was
-//! already used by the assembler.
+//! - \ref LabelEntry - stores information about a label - its name, offset, section where it belongs to, and
+//! other bits.
+//! - \ref LabelLink - stores information about yet unbound label, which was already used by the assembler.
//! - \ref RelocEntry - stores information about a relocation.
-//! - \ref AddressTableEntry - stores information about an address, which was
-//! used in a jump or call. Such address may need relocation.
+//! - \ref AddressTableEntry - stores information about an address, which was used in a jump or call. Such
+//! address may need relocation.
//!
//! To generate code you would need to instantiate at least the following classes:
//!
//! - \ref CodeHolder - to hold code during code generation.
//! - \ref BaseEmitter - to emit code into \ref CodeHolder.
-//! - \ref Target (optional) - most likely \ref JitRuntime to keep the generated
-//! code in executable memory. \ref Target can be customized by inheriting from
-//! it.
+//! - \ref Target (optional) - most likely \ref JitRuntime to keep the generated code in executable memory. \ref
+//! Target can be customized by inheriting from it.
//!
//! There are also other core classes that are important:
//!
-//! - \ref Environment - describes where the code will run. Environment brings
-//! the concept of target triples or tuples into AsmJit, which means that users
-//! can specify target architecture, platform, and ABI.
-//! - \ref Type - encapsulates lightweight type functionality that can be used
-//! to describe primitive and vector types. Types are used by higher level
-//! utilities, for example by \ref asmjit_function and \ref asmjit_compiler.
-//! - \ref CpuInfo - encapsulates CPU information - stores both CPU information
-//! and features described by \ref BaseFeatures.
+//! - \ref Environment - describes where the code will run. Environment brings the concept of target triples or
+//! tuples into AsmJit, which means that users can specify target architecture, platform, and ABI.
+//! - \ref TypeId - encapsulates lightweight type functionality that can be used to describe primitive and vector
+//! types. Types are used by higher level utilities, for example by \ref asmjit_function and \ref asmjit_compiler.
+//! - \ref CpuInfo - encapsulates CPU information - stores both CPU information and CPU features described by \ref
+//! CpuFeatures.
//!
//! AsmJit also provides global constants:
//!
//! - \ref Globals - namespace that provides global constants.
//! - \ref ByteOrder - byte-order constants and functionality.
//!
-//! \note CodeHolder examples use \ref x86::Assembler as abstract interfaces cannot
-//! be used to generate code.
+//! \note CodeHolder examples use \ref x86::Assembler as abstract interfaces cannot be used to generate code.
//!
//! ### CodeHolder & Emitters
//!
@@ -529,8 +478,8 @@ namespace asmjit {
//! }
//! ```
//!
-//! The example above used \ref x86::Assembler as an emitter. AsmJit provides the
-//! following emitters that offer various levels of abstraction:
+//! The example above used \ref x86::Assembler as an emitter. AsmJit provides the following emitters that offer various
+//! levels of abstraction:
//!
//! - \ref asmjit_assembler - Low-level emitter that emits directly to \ref CodeBuffer.
//! - \ref asmjit_builder - Low-level emitter that emits to a \ref BaseNode list.
@@ -538,30 +487,25 @@ namespace asmjit {
//!
//! ### Targets and JitRuntime
//!
-//! AsmJit's \ref Target is an interface that provides basic target abstraction.
-//! At the moment AsmJit provides only one implementation called \ref JitRuntime,
-//! which as the name suggests provides JIT code target and execution runtime.
-//! \ref JitRuntime provides all the necessary stuff to implement a simple JIT
-//! compiler with basic memory management. It only provides \ref JitRuntime::add()
-//! and \ref JitRuntime::release() functions that are used to either add code
-//! to the runtime or release it. \ref JitRuntime doesn't do any decisions on
-//! when the code should be released, the decision is up to the developer.
+//! AsmJit's \ref Target is an interface that provides basic target abstraction. At the moment AsmJit provides only
+//! one implementation called \ref JitRuntime, which as the name suggests provides JIT code target and execution
+//! runtime. \ref JitRuntime provides all the necessary stuff to implement a simple JIT compiler with basic memory
+//! management. It only provides \ref JitRuntime::add() and \ref JitRuntime::release() functions that are used to
+//! either add code to the runtime or release it. \ref JitRuntime doesn't do any decisions on when the code should be
+//! released, the decision is up to the developer.
//!
//! See more at \ref asmjit_virtual_memory group.
//!
//! ### More About Environment
//!
-//! In the previous example the \ref Environment is retrieved from \ref JitRuntime.
-//! It's logical as \ref JitRuntime always returns an \ref Environment that is
-//! compatible with the host. For example if your application runs in 64-bit mode
-//! the \ref Environment returned will use \ref Environment::kArchX64 architecture
-//! in contrast to \ref Environment::kArchX86, which will be used in 32-bit mode on
-//! any X86 platform.
+//! In the previous example the \ref Environment is retrieved from \ref JitRuntime. It's logical as \ref JitRuntime
+//! always returns an \ref Environment that is compatible with the host. For example if your application runs on X86_64
+//! CPU the \ref Environment returned will use \ref Arch::kX64 architecture in contrast to \ref Arch::kX86, which will
+//! be used in 32-bit mode on an X86 target.
//!
-//! AsmJit allows to setup the \ref Environment manually and to select a different
-//! architecture and ABI when necessary. So let's do something else this time, let's
-//! always generate a 32-bit code and print its binary representation. To do that, we
-//! can create our own \ref Environment and initialize it to \ref Environment::kArchX86.
+//! AsmJit allows to setup the \ref Environment manually and to select a different architecture and ABI when necessary.
+//! So let's do something else this time, let's always generate a 32-bit code and print its binary representation. To
+//! do that, we can create our own \ref Environment and initialize it to \ref Arch::kX86.
//!
//! ```
//! #include <asmjit/x86.h>
@@ -574,7 +518,7 @@ namespace asmjit {
//!
//! // Create a custom environment initialized to 32-bit X86 architecture.
//! Environment env;
-//! env.setArch(Environment::kArchX86);
+//! env.setArch(Arch::kX86);
//!
//! CodeHolder code; // Create a CodeHolder.
//! code.init(env); // Initialize CodeHolder with custom environment.
@@ -612,46 +556,37 @@ namespace asmjit {
//!
//! ### Explicit Code Relocation
//!
-//! In addition to \ref Environment, \ref CodeHolder can be configured to
-//! specify a base-address (or a virtual base-address in a linker terminology),
-//! which could be static (useful when you know the location where the target's
-//! machine code will be) or dynamic. AsmJit assumes dynamic base-address by
-//! default and relocates the code held by \ref CodeHolder to a user provided
-//! address on-demand. To be able to relocate to a user provided address it needs
-//! to store some information about relocations, which is represented by \ref
-//! RelocEntry. Relocation entries are only required if you call external functions
-//! from the generated code that cannot be encoded by using a 32-bit displacement
-//! (64-bit displacements are not provided by aby supported architecture).
-//!
-//! There is also a concept called \ref LabelLink - label link is a lightweight
-//! data structure that doesn't have any identifier and is stored in \ref LabelEntry
-//! as a single-linked list. Label link represents either unbound yet used label
-//! and cross-sections links (only relevant to code that uses multiple sections).
-//! Since crossing sections is something that cannot be resolved immediately these
-//! links persist until offsets of these sections are assigned and until
-//! \ref CodeHolder::resolveUnresolvedLinks() is called. It's an error if you end
-//! up with code that has unresolved label links after flattening. You can verify
-//! it by calling \ref CodeHolder::hasUnresolvedLinks(), which inspects the value
-//! returned by \ref CodeHolder::unresolvedLinkCount().
-//!
-//! AsmJit can flatten code that uses multiple sections by assigning each section
-//! an incrementing offset that respects its alignment. Use \ref CodeHolder::flatten()
-//! to do that. After the sections are flattened their offsets and virtual-sizes
-//! are adjusted to respect each section's buffer size and alignment. The \ref
-//! CodeHolder::resolveUnresolvedLinks() function must be called before relocating
-//! the code held by \ref CodeHolder. You can also flatten your code manually by
-//! iterating over all sections and calculating their offsets (relative to base)
-//! by your own algorithm. In that case \ref CodeHolder::flatten() should not be
-//! called, however, \ref CodeHolder::resolveUnresolvedLinks() should be.
-//!
-//! The example below shows how to use a built-in virtual memory allocator
-//! \ref JitAllocator instead of using \ref JitRuntime (just in case you want
-//! to use your own memory management) and how to relocate the generated code
-//! into your own memory block - you can use your own virtual memory allocator
-//! if you prefer that, but that's OS specific and not covered by the documentation.
-//!
-//! The following code is similar to the previous one, but implements a function
-//! working in both 32-bit and 64-bit environments:
+//! In addition to \ref Environment, \ref CodeHolder can be configured to specify a base-address (or a virtual base
+//! address in a linker terminology), which could be static (useful when you know the location where the target's
+//! machine code will be) or dynamic. AsmJit assumes dynamic base-address by default and relocates the code held by
+//! \ref CodeHolder to a user provided address on-demand. To be able to relocate to a user provided address it needs
+//! to store some information about relocations, which is represented by \ref RelocEntry. Relocation entries are only
+//! required if you call external functions from the generated code that cannot be encoded by using a 32-bit
+//! displacement (64-bit displacements are not provided by aby supported architecture).
+//!
+//! There is also a concept called \ref LabelLink - label link is a lightweight data structure that doesn't have any
+//! identifier and is stored in \ref LabelEntry as a single-linked list. Label link represents either unbound yet used
+//! label and cross-sections links (only relevant to code that uses multiple sections). Since crossing sections is
+//! something that cannot be resolved immediately these links persist until offsets of these sections are assigned and
+//! until \ref CodeHolder::resolveUnresolvedLinks() is called. It's an error if you end up with code that has
+//! unresolved label links after flattening. You can verify it by calling \ref CodeHolder::hasUnresolvedLinks(), which
+//! inspects the value returned by \ref CodeHolder::unresolvedLinkCount().
+//!
+//! AsmJit can flatten code that uses multiple sections by assigning each section an incrementing offset that respects
+//! its alignment. Use \ref CodeHolder::flatten() to do that. After the sections are flattened their offsets and
+//! virtual sizes are adjusted to respect each section's buffer size and alignment. The \ref
+//! CodeHolder::resolveUnresolvedLinks() function must be called before relocating the code held by \ref CodeHolder.
+//! You can also flatten your code manually by iterating over all sections and calculating their offsets (relative to
+//! base) by your own algorithm. In that case \ref CodeHolder::flatten() should not be called, however,
+//! \ref CodeHolder::resolveUnresolvedLinks() should be.
+//!
+//! The example below shows how to use a built-in virtual memory allocator \ref JitAllocator instead of using \ref
+//! JitRuntime (just in case you want to use your own memory management) and how to relocate the generated code
+//! into your own memory block - you can use your own virtual memory allocator if you prefer that, but that's OS
+//! specific and not covered by the documentation.
+//!
+//! The following code is similar to the previous one, but implements a function working in both 32-bit and 64-bit
+//! environments:
//!
//! ```
//! #include <asmjit/x86.h>
@@ -663,7 +598,7 @@ namespace asmjit {
//!
//! int main() {
//! // Create a custom environment that matches the current host environment.
-//! Environment env = hostEnvironment();
+//! Environment env = Environment::host();
//!
//! CodeHolder code; // Create a CodeHolder.
//! code.init(env); // Initialize CodeHolder with environment.
@@ -752,7 +687,7 @@ namespace asmjit {
//! // memcpy((uint8_t*)p + section->offset(),
//! // section->data(),
//! // section->bufferSize());
-//! code.copyFlattenedData(p, codeSize, CodeHolder::kCopyPadSectionBuffer);
+//! code.copyFlattenedData(p, codeSize, CopySectionFlags::kPadSectionBuffer);
//!
//! // Execute the generated function.
//! int inA[4] = { 4, 3, 2, 1 };
@@ -774,18 +709,19 @@ namespace asmjit {
//! }
//! ```
//!
-//! If you know the base-address in advance (before the code generation) it can
-//! be passed as a second argument to \ref CodeHolder::init(). In that case the
-//! Assembler will know the absolute position of each instruction and would be
-//! able to use it during instruction encoding to prevent relocations where
-//! possible. The following example shows how to configure the base address:
+//! If you know the base-address in advance (before the code generation) it can be passed as a second argument to
+//! \ref CodeHolder::init(). In that case the Assembler will know the absolute position of each instruction and
+//! would be able to use it during instruction encoding to prevent relocations where possible. The following example
+//! shows how to configure the base address:
//!
//! ```
//! #include <asmjit/x86.h>
//! #include <stdio.h>
//!
+//! using namespace asmjit;
+//!
//! void initializeCodeHolder(CodeHolder& code) {
-//! Environment env = hostEnvironment();
+//! Environment env = Environment::host();
//! uint64_t baseAddress = uint64_t(0x1234);
//!
//! // initialize CodeHolder with environment and custom base address.
@@ -795,16 +731,16 @@ namespace asmjit {
//!
//! ### Label Offsets and Links
//!
-//! When a label that is not yet bound is used by the Assembler, it creates a
-//! \ref LabelLink, which is then added to a \ref LabelEntry. These links are
-//! also created if a label is used in a different section than in which it
-//! was bound. Let's examine some functions that can be used to check whether
-//! there are any unresolved links.
+//! When a label that is not yet bound is used by the Assembler, it creates a \ref LabelLink, which is then added to
+//! a \ref LabelEntry. These links are also created if a label is used in a different section than in which it was
+//! bound. Let's examine some functions that can be used to check whether there are any unresolved links.
//!
//! ```
//! #include <asmjit/core.h>
//! #include <stdio.h>
//!
+//! using namespace asmjit;
+//!
//! void labelLinksExample(CodeHolder& code, const Label& label) {
//! // Tests whether the `label` is bound.
//! bool isBound = code.isLabelBound(label);
@@ -819,16 +755,17 @@ namespace asmjit {
//! }
//! ```
//!
-//! There is no function that would return the number of unbound labels as this
-//! is completely unimportant from CodeHolder's perspective. If a label is not
-//! used then it doesn't matter whether it's bound or not, only actually used
-//! labels matter. After a Label is bound it's possible to query its offset
-//! offset relative to the start of the section where it was bound:
+//! There is no function that would return the number of unbound labels as this is completely unimportant from
+//! CodeHolder's perspective. If a label is not used then it doesn't matter whether it's bound or not, only actually
+//! used labels matter. After a Label is bound it's possible to query its offset offset relative to the start of the
+//! section where it was bound:
//!
//! ```
//! #include <asmjit/core.h>
//! #include <stdio.h>
//!
+//! using namespace asmjit;
+//!
//! void labelOffsetExample(CodeHolder& code, const Label& label) {
//! // Label offset is known after it's bound. The offset provided is relative
//! // to the start of the section, see below for alternative. If the given
@@ -848,15 +785,16 @@ namespace asmjit {
//!
//! ### Sections
//!
-//! AsmJit allows to create multiple sections within the same \ref CodeHolder.
-//! A test-case [asmjit_test_x86_sections.cpp](https://github.com/asmjit/asmjit/blob/master/test/asmjit_test_x86_sections.cpp)
-//! can be used as a reference point although the following example should
-//! also provide a useful insight:
+//! AsmJit allows to create multiple sections within the same \ref CodeHolder. A test-case
+//! [asmjit_test_x86_sections.cpp](https://github.com/asmjit/asmjit/blob/master/test/asmjit_test_x86_sections.cpp)
+//! can be used as a reference point although the following example should also provide a useful insight:
//!
//! ```
//! #include <asmjit/x86.h>
//! #include <stdio.h>
//!
+//! using namespace asmjit;
+//!
//! void sectionsExample(CodeHolder& code) {
//! // Text section is always provided as the first section.
//! Section* text = code.textSection(); // or code.sectionById(0);
@@ -864,10 +802,11 @@ namespace asmjit {
//! // To create another section use CodeHolder::newSection().
//! Section* data;
//! Error err = code.newSection(&data,
-//! ".data", // Section name
-//! SIZE_MAX, // Name length if the name is not null terminated (or SIZE_MAX).
-//! 0, // Section flags, see Section::Flags.
-//! 8); // Section alignment, must be power of 2.
+//! ".data", // Section name
+//! SIZE_MAX, // Name length if the name is not null terminated (or SIZE_MAX).
+//! SectionFlags::kNone, // Section flags, see SectionFlags.
+//! 8, // Section alignment, must be power of 2.
+//! 0); // Section order value (optional, default 0).
//!
//! // When you switch sections in Assembler, Builder, or Compiler the cursor
//! // will always move to the end of that section. When you create an Assembler
@@ -892,17 +831,17 @@ namespace asmjit {
//! }
//! ```
//!
-//! The last line in the example above shows that a LabelLink would be created
-//! even for bound labels that cross sections. In this case a referenced label
-//! was bound in another section, which means that the link couldn't be resolved
-//! at that moment. If your code uses sections, but you wish AsmJit to flatten
-//! these sections (you don't plan to flatten them manually) then there is an
-//! API for that.
+//! The last line in the example above shows that a LabelLink would be created even for bound labels that cross
+//! sections. In this case a referenced label was bound in another section, which means that the link couldn't be
+//! resolved at that moment. If your code uses sections, but you wish AsmJit to flatten these sections (you don't
+//! plan to flatten them manually) then there is an API for that.
//!
//! ```
//! #include <asmjit/x86.h>
//! #include <stdio.h>
//!
+//! using namespace asmjit;
+//!
//! // ... (continuing the previous example) ...
//! void sectionsExampleContinued(CodeHolder& code) {
//! // Suppose we have some code that contains multiple sections and
@@ -937,18 +876,14 @@ namespace asmjit {
//! }
//! ```
-// ============================================================================
-// [Documentation - asmjit_assembler]
-// ============================================================================
//! \defgroup asmjit_assembler Assembler
//! \brief Assembler interface and operands.
//!
//! ### Overview
//!
-//! AsmJit's Assembler is used to emit machine code directly into a \ref
-//! CodeBuffer. In general, code generation with assembler requires the knowledge
-//! of the following:
+//! AsmJit's Assembler is used to emit machine code directly into a \ref CodeBuffer. In general, code generation
+//! with assembler requires the knowledge of the following:
//!
//! - \ref BaseAssembler and architecture-specific assemblers:
//! - \ref x86::Assembler - Assembler specific to X86 architecture
@@ -960,76 +895,58 @@ namespace asmjit {
//! - \ref Imm - Immediate (value) operand.
//! - \ref Label - Label operand.
//!
-//! \note Assembler examples use \ref x86::Assembler as abstract interfaces cannot
-//! be used to generate code.
+//! \note Assembler examples use \ref x86::Assembler as abstract interfaces cannot be used to generate code.
//!
//! ### Operand Basics
//!
-//! Let's start with operands. \ref Operand is a data structure that defines a
-//! data layout of any operand. It can be inherited, but any class inheriting
-//! it cannot add any members to it, only the existing layout can be reused.
-//! AsmJit allows to construct operands dynamically, to store them, and to query
-//! a complete information about them at run-time. Operands are small (always 16
-//! bytes per \ref Operand) and can be copied and passed by value. Please never
-//! allocate individual operands dynamically by using a `new` keyword - it would
-//! work, but then you would have to be responsible for deleting such operands.
-//! In AsmJit operands are always part of some other data structures like \ref
-//! InstNode, which is part of \ref asmjit_builder tool.
-//!
-//! Operands contain only identifiers, but not pointers to any code-generation data.
-//! For example \ref Label operand only provides label identifier, but not a pointer
-//! to \ref LabelEntry structure. In AsmJit such IDs are used to link stuff together
-//! without having to deal with pointers.
-//!
-//! AsmJit's operands all inherit from a base class called \ref Operand. Operands
-//! have the following properties that are commonly accessible by getters and setters:
-//!
-//! - \ref Operand - Base operand, which only provides accessors that are common
-//! to all operand types.
-//! - \ref BaseReg - Describes either physical or virtual register. Physical
-//! registers have id that matches the target's machine id directly whereas
-//! virtual registers must be allocated into physical registers by a register
+//! Let's start with operands. \ref Operand is a data structure that defines a data layout of any operand. It can be
+//! inherited, but any class inheriting it cannot add any members to it, only the existing layout can be reused.
+//! AsmJit allows to construct operands dynamically, to store them, and to query a complete information about them
+//! at run-time. Operands are small (always 16 bytes per \ref Operand) and can be copied and passed by value. Please
+//! never allocate individual operands dynamically by using a `new` keyword - it would work, but then you would have
+//! to be responsible for deleting such operands. In AsmJit operands are always part of some other data structures
+//! like \ref InstNode, which is part of \ref asmjit_builder tool.
+//!
+//! Operands contain only identifiers, but not pointers to any code-generation data. For example \ref Label operand
+//! only provides label identifier, but not a pointer to \ref LabelEntry structure. In AsmJit such IDs are used to
+//! link stuff together without having to deal with pointers.
+//!
+//! AsmJit's operands all inherit from a base class called \ref Operand. Operands have the following properties that
+//! are commonly accessible by getters and setters:
+//!
+//! - \ref Operand - Base operand, which only provides accessors that are common to all operand types.
+//! - \ref BaseReg - Describes either physical or virtual register. Physical registers have id that matches the
+//! target's machine id directly whereas virtual registers must be allocated into physical registers by a register
//! allocator pass. Register operand provides:
-//! - Register Type - Unique id that describes each possible register provided
-//! by the target architecture - for example X86 backend provides \ref
-//! x86::Reg::RegType, which defines all variations of general purpose registers
-//! (GPB-LO, GPB-HI, GPW, GPD, and GPQ) and all types of other registers like K,
-//! MM, BND, XMM, YMM, and ZMM.
-//! - Register Group - Groups multiple register types under a single group - for
-//! example all general-purpose registers (of all sizes) on X86 are part of
-//! \ref x86::Reg::kGroupGp and all SIMD registers (XMM, YMM, ZMM) are part
-//! of \ref x86::Reg::kGroupVec.
-//! - Register Size - Contains the size of the register in bytes. If the size
-//! depends on the mode (32-bit vs 64-bit) then generally the higher size is
-//! used (for example RIP register has size 8 by default).
+//! - Register Type (\ref RegType) - Unique id that describes each possible register provided by the target
+//! architecture - for example X86 backend provides general purpose registers (GPB-LO, GPB-HI, GPW, GPD, and GPQ)
+//! and all types of other registers like K, MM, BND, XMM, YMM, ZMM, and TMM.
+//! - Register Group (\ref RegGroup) - Groups multiple register types under a single group - for example all
+//! general-purpose registers (of all sizes) on X86 are part of \ref RegGroup::kGp and all SIMD registers
+//! (XMM, YMM, ZMM) are part of \ref RegGroup::kVec.
+//! - Register Size - Contains the size of the register in bytes. If the size depends on the mode (32-bit vs
+//! 64-bit) then generally the higher size is used (for example RIP register has size 8 by default).
//! - Register Id - Contains physical or virtual id of the register.
//! - \ref BaseMem - Used to reference a memory location. Memory operand provides:
//! - Base Register - A base register type and id (physical or virtual).
//! - Index Register - An index register type and id (physical or virtual).
-//! - Offset - Displacement or absolute address to be referenced (32-bit if base
-//! register is used and 64-bit if base register is not used).
-//! - Flags that can describe various architecture dependent information (like
-//! scale and segment-override on X86).
-//! - \ref Imm - Immediate values are usually part of instructions (encoded within
-//! the instruction itself) or data.
-//! - \ref Label - used to reference a location in code or data. Labels must be
-//! created by the \ref BaseEmitter or by \ref CodeHolder. Each label has its
-//! unique id per \ref CodeHolder instance.
+//! - Offset - Displacement or absolute address to be referenced (32-bit if base register is used and 64-bit if
+//! base register is not used).
+//! - Flags that can describe various architecture dependent information (like scale and segment-override on X86).
+//! - \ref Imm - Immediate values are usually part of instructions (encoded within the instruction itself) or data.
+//! - \ref Label - used to reference a location in code or data. Labels must be created by the \ref BaseEmitter or
+//! by \ref CodeHolder. Each label has its unique id per \ref CodeHolder instance.
//!
//! ### Operand Manipulation
//!
-//! AsmJit allows to construct operands dynamically, to store them, and to query
-//! a complete information about them at run-time. Operands are small (always 16
-//! bytes per `Operand`) and should be always copied (by value) if you intend to
-//! store them (don't create operands by using `new` keyword, it's not recommended).
-//! Operands are safe to be passed to `memcpy()` and `memset()`, which becomes
-//! handy when working with arrays of operands. If you set all members of an \ref
-//! Operand to zero the operand would become NONE operand, which is the same as a
-//! default constructed Operand.
+//! AsmJit allows to construct operands dynamically, to store them, and to query a complete information about them at
+//! run-time. Operands are small (always 16 bytes per `Operand`) and should be always copied (by value) if you intend
+//! to store them (don't create operands by using `new` keyword, it's not recommended). Operands are safe to be passed
+//! to `memcpy()` and `memset()`, which becomes handy when working with arrays of operands. If you set all members of
+//! an \ref Operand to zero the operand would become NONE operand, which is the same as a default constructed Operand.
//!
-//! The example below illustrates how operands can be used and modified even
-//! without using any other code generation classes. The example uses X86
-//! architecture-specific operands.
+//! The example below illustrates how operands can be used and modified even without using any other code generation
+//! classes. The example uses X86 architecture-specific operands.
//!
//! ```
//! #include <asmjit/x86.h>
@@ -1049,7 +966,7 @@ namespace asmjit {
//! // Constructs [src + idx] memory address - referencing [rax + r10].
//! x86::Mem m = x86::ptr(src, idx);
//!
-//! // Examine `m`: Returns `x86::Reg::kTypeGpq`.
+//! // Examine `m`: Returns `RegType::kX86_Gpq`.
//! m.indexType();
//! // Examine `m`: Returns 10 (`r10`).
//! m.indexId();
@@ -1087,23 +1004,20 @@ namespace asmjit {
//! }
//! ```
//!
-//! Some operands have to be created explicitly by emitters. For example labels
-//! must be created by \ref BaseEmitter::newLabel(), which creates a label entry
-//! and returns a \ref Label operand with the id that refers to it. Such label
-//! then can be used by emitters.
+//! Some operands have to be created explicitly by emitters. For example labels must be created by \ref
+//! BaseEmitter::newLabel(), which creates a label entry and returns a \ref Label operand with the id that refers
+//! to it. Such label then can be used by emitters.
//!
//! ### Memory Operands
//!
-//! Some architectures like X86 provide a complex memory addressing model that
-//! allows to encode addresses having a BASE register, INDEX register with a
-//! possible scale (left shift), and displacement (called offset in AsmJit).
-//! Memory address on X86 can also specify memory segment (segment-override in
-//! X86 terminology) and some instructions (gather / scatter) require INDEX to
-//! be a \ref x86::Vec register instead of a general-purpose register.
+//! Some architectures like X86 provide a complex memory addressing model that allows to encode addresses having a
+//! BASE register, INDEX register with a possible scale (left shift), and displacement (called offset in AsmJit).
+//! Memory address on X86 can also specify memory segment (segment-override in X86 terminology) and some instructions
+//! (gather / scatter) require INDEX to be a \ref x86::Vec register instead of a general-purpose register.
//!
-//! AsmJit allows to encode and work with all forms of addresses mentioned and
-//! implemented by X86. In addition, it also allows to construct absolute 64-bit
-//! memory address operands, which is only allowed in one form of 'mov' instruction.
+//! AsmJit allows to encode and work with all forms of addresses mentioned and implemented by X86. In addition, it
+//! also allows to construct absolute 64-bit memory address operands, which is only allowed in one form of 'mov'
+//! instruction.
//!
//! ```
//! #include <asmjit/x86.h>
@@ -1128,7 +1042,7 @@ namespace asmjit {
//! Mem g = ptr(rax, xmm1, 2); // g = [rax + xmm1 << 2]
//! Mem h = ptr(rax, xmm1, 2, 15); // h = [rax + xmm1 << 2 + 15]
//!
-//! // Absolute adddress:
+//! // Absolute address:
//! uint64_t addr = (uint64_t)0x1234;
//! Mem i = ptr(addr); // i = [0x1234]
//! Mem j = ptr(addr, rbx); // j = [0x1234 + rbx]
@@ -1146,9 +1060,8 @@ namespace asmjit {
//! }
//! ```
//!
-//! Memory operands can optionally contain memory size. This is required by
-//! instructions where the memory size cannot be deduced from other operands,
-//! like `inc` and `dec` on X86:
+//! Memory operands can optionally contain memory size. This is required by instructions where the memory size cannot
+//! be deduced from other operands, like `inc` and `dec` on X86:
//!
//! ```
//! #include <asmjit/x86.h>
@@ -1232,34 +1145,26 @@ namespace asmjit {
//!
//! - \ref x86::Assembler provides many X86/X64 examples.
-// ============================================================================
-// [Documentation - asmjit_builder]
-// ============================================================================
//! \defgroup asmjit_builder Builder
//! \brief Builder interface, nodes, and passes.
//!
//! ### Overview
//!
-//! Both \ref BaseBuilder and \ref BaseCompiler interfaces describe emitters
-//! that emit into a representation that allows further processing. The code
-//! stored in such representation is completely safe to be patched, simplified,
-//! reordered, obfuscated, removed, injected, analyzed, or processed some other
-//! way. Each instruction, label, directive, or other building block is stored
-//! as \ref BaseNode (or derived class like \ref InstNode or \ref LabelNode)
-//! and contains all the information necessary to pass that node later to the
-//! assembler.
-//!
-//! \ref BaseBuilder is an emitter that inherits from \ref BaseEmitter interface.
-//! It was designed to provide a maximum compatibility with the existing \ref
-//! BaseAssembler emitter so users can move from assembler to builder when needed,
+//! Both \ref BaseBuilder and \ref BaseCompiler interfaces describe emitters that emit into a representation that
+//! allows further processing. The code stored in such representation is completely safe to be patched, simplified,
+//! reordered, obfuscated, removed, injected, analyzed, or processed some other way. Each instruction, label,
+//! directive, or other building block is stored as \ref BaseNode (or derived class like \ref InstNode or \ref
+//! LabelNode) and contains all the information necessary to pass that node later to the assembler.
+//!
+//! \ref BaseBuilder is an emitter that inherits from \ref BaseEmitter interface. It was designed to provide a maximum
+//! compatibility with the existing \ref BaseAssembler emitter so users can move from assembler to builder when needed,
//! for example to implement post-processing, which is not possible with Assembler.
//!
//! ### Builder Nodes
//!
-//! \ref BaseBuilder doesn't generate machine code directly, it uses an intermediate
-//! representation based on nodes, however, it allows to serialize to \ref BaseAssembler
-//! when the code is ready to be encoded.
+//! \ref BaseBuilder doesn't generate machine code directly, it uses an intermediate representation based on nodes,
+//! however, it allows to serialize to \ref BaseAssembler when the code is ready to be encoded.
//!
//! There are multiple node types used by both \ref BaseBuilder and \ref BaseCompiler :
//!
@@ -1272,16 +1177,13 @@ namespace asmjit {
//! - Data nodes:
//! - \ref EmbedDataNode - Represents data.
//! - \ref EmbedLabelNode - Represents \ref Label address embedded as data.
-//! - \ref EmbedLabelDeltaNode - Represents a difference of two labels
-//! embedded in data.
+//! - \ref EmbedLabelDeltaNode - Represents a difference of two labels embedded in data.
//! - \ref ConstPoolNode - Represents a constant pool data embedded as data.
//!
//! - Informative nodes:
-//! - \ref CommentNode - Represents a comment string, doesn't affect code
-//! generation.
-//! - \ref SentinelNode - A marker that can be used to remember certain
-//! position in code or data, doesn't affect code generation. Used by
-//! \ref FuncNode to mark the end of a function.
+//! - \ref CommentNode - Represents a comment string, doesn't affect code generation.
+//! - \ref SentinelNode - A marker that can be used to remember certain position in code or data, doesn't affect
+//! code generation. Used by \ref FuncNode to mark the end of a function.
//!
//! - Other nodes are provided by \ref asmjit_compiler infrastructure.
//!
@@ -1289,47 +1191,38 @@ namespace asmjit {
//!
//! - \ref x86::Builder provides many X86/X64 examples.
-// ============================================================================
-// [Documentation - asmjit_compiler]
-// ============================================================================
//! \defgroup asmjit_compiler Compiler
//! \brief Compiler interface.
//!
//! ### Overview
//!
-//! \ref BaseCompiler is a high-level interface built on top of \ref BaseBuilder
-//! interface, which provides register allocation and support for defining and
-//! invoking functions. At the moment it's the easiest way of generating code
-//! in AsmJit as most architecture and OS specifics is properly abstracted and
-//! handled by AsmJit automatically. However, abstractions also mean restrictions,
-//! which means that \ref BaseCompiler has more limitations that \ref BaseAssembler
-//! or \ref BaseBuilder.
-//!
-//! Since \ref BaseCompiler provides register allocation it also establishes the
-//! concept of functions - a function in Compiler sense is a unit in which virtual
-//! registers are allocated into physical registers by the register allocator.
-//! In addition, it enables to use such virtual registers in function invocations.
-//!
-//! \ref BaseCompiler automatically handles function calling conventions. It's
-//! still architecture dependent, but makes the code generation much easies.
-//! Functions are essential; the first-step to generate some code is to define a
-//! signature of the function to be generated (before generating the function body
-//! itself). Function arguments and return value(s) are handled by assigning
-//! virtual registers to them. Similarly, function calls are handled the same way.
+//! \ref BaseCompiler is a high-level interface, which provides register allocation and support for defining and
+//! invoking functions, built on top of \ref BaseBuilder interface At the moment it's the easiest way of generating
+//! code in AsmJit as most architecture and OS specifics is properly abstracted and handled by AsmJit automatically.
+//! However, abstractions also mean restrictions, which means that \ref BaseCompiler has more limitations than \ref
+//! BaseAssembler or \ref BaseBuilder.
+//!
+//! Since \ref BaseCompiler provides register allocation it also establishes the concept of functions - a function
+//! in Compiler sense is a unit in which virtual registers are allocated into physical registers by the register
+//! allocator. In addition, it enables to use such virtual registers in function invocations.
+//!
+//! \ref BaseCompiler automatically handles function calling conventions. It's still architecture dependent, but
+//! makes the code generation much easies. Functions are essential; the first-step to generate some code is to define
+//! a signature of the function to be generated (before generating the function body itself). Function arguments and
+//! return value(s) are handled by assigning virtual registers to them. Similarly, function calls are handled the same
+//! way.
//!
//! ### Compiler Nodes
//!
-//! \ref BaseCompiler adds some nodes that are required for function generation
-//! and invocation:
+//! \ref BaseCompiler adds some nodes that are required for function generation and invocation:
//!
//! - \ref FuncNode - Represents a function definition.
//! - \ref FuncRetNode - Represents a function return.
//! - \ref InvokeNode - Represents a function invocation.
//!
-//! \ref BaseCompiler also makes the use of passes (\ref Pass) and automatically
-//! adds an architecture-dependent register allocator pass to the list of passes
-//! when attached to \ref CodeHolder.
+//! \ref BaseCompiler also makes the use of passes (\ref Pass) and automatically adds an architecture-dependent
+//! register allocator pass to the list of passes when attached to \ref CodeHolder.
//!
//! ### Compiler Examples
//!
@@ -1337,134 +1230,110 @@ namespace asmjit {
//!
//! ### Compiler Tips
//!
-//! Users of AsmJit have done mistakes in the past, this section should provide
-//! some useful tips for beginners:
+//! Users of AsmJit have done mistakes in the past, this section should provide some useful tips for beginners:
//!
-//! - Virtual registers in compiler are bound to a single function. At the
-//! moment the implementation doesn't care whether a single virtual register
-//! is used in multiple functions, but it sees it as two independent virtual
-//! registers in that case. This means that virtual registers cannot be used
-//! to implement global variables. Global variables are basically memory
-//! addresses which functions can read from and write to, and they have to
-//! be implemented in the same way.
+//! - Virtual registers in compiler are bound to a single function. At the moment the implementation doesn't
+//! care whether a single virtual register is used in multiple functions, but it sees it as two independent
+//! virtual registers in that case. This means that virtual registers cannot be used to implement global
+//! variables. Global variables are basically memory addresses which functions can read from and write to,
+//! and they have to be implemented in the same way.
//!
-//! - Compiler provides a useful debugging functionality, which can be turned
-//! on through \ref FormatOptions::Flags. Use \ref Logger::addFlags() to
-//! turn on additional logging features when using Compiler.
+//! - Compiler provides a useful debugging functionality, which can be turned on through \ref FormatFlags. Use
+//! \ref Logger::addFlags() to turn on additional logging features when using Compiler.
-// ============================================================================
-// [Documentation - asmjit_function]
-// ============================================================================
//! \defgroup asmjit_function Function
//! \brief Function definitions.
//!
//! ### Overview
//!
-//! AsmJit provides functionality that can be used to define function signatures
-//! and to calculate automatically optimal function frame that can be used directly
-//! by a prolog and epilog insertion. This feature was exclusive to AsmJit's Compiler
-//! for a very long time, but was abstracted out and is now available for all users
-//! regardless of the emitter they use. The following use cases are possible:
+//! AsmJit provides functionality that can be used to define function signatures and to calculate automatically
+//! optimal function frame that can be used directly by a prolog and epilog insertion. This feature was exclusive
+//! to AsmJit's Compiler for a very long time, but was abstracted out and is now available for all users regardless
+//! of the emitter they use. The following use cases are possible:
//!
-//! - Calculate function frame before the function is generated - this is the
-//! only way available to \ref BaseAssembler users and it will be described
-//! in this section.
+//! - Calculate function frame before the function is generated - this is the only way available to \ref
+//! BaseAssembler users and it will be described in this section.
//!
-//! - Calculate function frame after the function is generated - this way is
-//! generally used by \ref BaseBuilder and \ref BaseCompiler emitters and
-//! this way is generally described in \ref asmjit_compiler section.
+//! - Calculate function frame after the function is generated - this way is generally used by \ref BaseBuilder
+//! and \ref BaseCompiler emitters and this way is generally described in \ref asmjit_compiler section.
//!
//! The following concepts are used to describe and create functions in AsmJit:
//!
-//! - \ref Type::Id - Type-id is an 8-bit value that describes a platform
-//! independent type as we know from C/C++. It provides abstractions for
-//! most common types like `int8_t`, `uint32_t`, `uintptr_t`, `float`,
-//! `double`, and all possible vector types to match ISAs up to AVX512.
-//! \ref Type::Id was introduced originally for \ref asmjit_compiler, but
-//! it's now used by \ref FuncSignature as well.
-//!
-//! - \ref CallConv - Describes a calling convention - this class contains
-//! instructions to assign registers and stack addresses to function
-//! arguments and return value(s), but doesn't specify any function
-//! signature itself. Calling conventions are architecture and OS dependent.
-//!
-//! - \ref FuncSignature - Describes a function signature, for example
-//! `int func(int, int)`. FuncSignature contains a function calling convention
-//! id, return value type, and function arguments. The signature itself is
-//! platform independent and uses \ref Type::Id to describe types of function
-//! arguments and function return value(s).
-//!
-//! - \ref FuncDetail - Architecture and ABI dependent information that describes
-//! \ref CallConv and expanded \ref FuncSignature. Each function argument and
-//! return value is represented as \ref FuncValue that contains the original
-//! \ref Type::Id enriched with additional information that specifies whether
-//! the value is passed or returned by register (and which register) or by
-//! stack. Each value also contains some other metadata that provide additional
-//! information required to handle it properly (for example whether a vector is
-//! passed indirectly by a pointer as required by WIN64 calling convention).
-//!
-//! - \ref FuncFrame - Contains information about the function frame that can
-//! be used by prolog/epilog inserter (PEI). Holds call stack size size and
-//! alignment, local stack size and alignment, and various attributes that
-//! describe how prolog and epilog should be constructed. `FuncFrame` doesn't
-//! know anything about function's arguments or return values, it hold only
-//! information necessary to create a valid and ABI conforming function prologs
-//! and epilogs.
-//!
-//! - \ref FuncArgsAssignment - A helper class that can be used to reassign
-//! function arguments into user specified registers. It's architecture and
-//! ABI dependent mapping from function arguments described by \ref CallConv
+//! - \ref TypeId - Type-id is an 8-bit value that describes a platform independent type as we know from C/C++.
+//! It provides abstractions for most common types like `int8_t`, `uint32_t`, `uintptr_t`, `float`, `double`,
+//! and all possible vector types to match ISAs up to AVX512. \ref TypeId was introduced originally for \ref
+//! asmjit_compiler, but it's now used by \ref FuncSignature as well.
+//!
+//! - \ref CallConv - Describes a calling convention - this class contains instructions to assign registers and
+//! stack addresses to function arguments and return value(s), but doesn't specify any function signature itself.
+//! Calling conventions are architecture and OS dependent.
+//!
+//! - \ref FuncSignature - Describes a function signature, for example `int func(int, int)`. FuncSignature contains
+//! a function calling convention id, return value type, and function arguments. The signature itself is platform
+//! independent and uses \ref TypeId to describe types of function arguments and function return value(s).
+//!
+//! - \ref FuncDetail - Architecture and ABI dependent information that describes \ref CallConv and expanded \ref
+//! FuncSignature. Each function argument and return value is represented as \ref FuncValue that contains the
+//! original \ref TypeId enriched with additional information that specifies whether the value is passed or
+//! returned by register (and which register) or by stack. Each value also contains some other metadata that
+//! provide additional information required to handle it properly (for example whether a vector is passed
+//! indirectly by a pointer as required by WIN64 calling convention).
+//!
+//! - \ref FuncFrame - Contains information about the function frame that can be used by prolog/epilog inserter
+//! (PEI). Holds call stack size size and alignment, local stack size and alignment, and various attributes that
+//! describe how prolog and epilog should be constructed. `FuncFrame` doesn't know anything about function's
+//! arguments or return values, it hold only information necessary to create a valid and ABI conforming function
+//! prologs and epilogs.
+//!
+//! - \ref FuncArgsAssignment - A helper class that can be used to reassign function arguments into user specified
+//! registers. It's architecture and ABI dependent mapping from function arguments described by \ref CallConv
//! and \ref FuncDetail into registers specified by the user.
//!
-//! It's a lot of concepts where each represents one step in a function frame
-//! calculation. It can be used to create function prologs, epilogs, and also
-//! to calculate information necessary to perform function calls.
+//! It's a lot of concepts where each represents one step in a function frame calculation. It can be used to create
+//! function prologs, epilogs, and also to calculate information necessary to perform function calls.
-// ============================================================================
-// [Documentation - asmjit_logging]
-// ============================================================================
//! \defgroup asmjit_logging Logging
//! \brief Logging and formatting.
//!
//! ### Overview
//!
-//! The initial phase of a project that generates machine code is not always smooth.
-//! Failure cases are common not just at the beginning phase, but also during the
-//! development or refactoring. AsmJit provides logging functionality to address
-//! this issue. AsmJit does already a good job with function overloading to prevent
-//! from emitting unencodable instructions, but it can't prevent from emitting machine
-//! code that is correct at instruction level, but doesn't work when it's executed as
-//! a whole. Logging has always been an important part of AsmJit's infrastructure and
-//! looking at logs can sometimes reveal code generation issues quickly.
+//! The initial phase of a project that generates machine code is not always smooth. Failure cases are common not just
+//! at the beginning phase, but also during the development or refactoring. AsmJit provides logging functionality to
+//! address this issue. AsmJit does already a good job with function overloading to prevent from emitting unencodable
+//! instructions, but it can't prevent from emitting machine code that is correct at instruction level, but doesn't
+//! work when it's executed asa whole. Logging has always been an important part of AsmJit's infrastructure and looking
+//! at logs can sometimes reveal code generation issues quickly.
//!
//! AsmJit provides API for logging and formatting:
-//! - \ref Logger - A logger that you can pass to \ref CodeHolder and all emitters
-//! that inherit from \ref BaseEmitter.
-//! - \ref FormatOptions - Formatting options that can change how instructions and
-//! operands are formatted.
-//! - \ref Formatter - A namespace that provides functions that can format input
-//! data like \ref Operand, \ref BaseReg, \ref Label, and \ref BaseNode into
-//! \ref String.
+//!
+//! - \ref Logger - A logger that you can pass to \ref CodeHolder and all emitters that inherit from \ref BaseEmitter.
+//!
+//! - \ref FormatOptions - Formatting options that can change how instructions and operands are formatted.
+//!
+//! - \ref Formatter - A namespace that provides functions that can format input data like \ref Operand, \ref BaseReg,
+//! \ref Label, and \ref BaseNode into \ref String.
//!
//! AsmJit's \ref Logger serves the following purposes:
+//!
//! - Provides a basic foundation for logging.
-//! - Abstract class leaving the implementation on users. The following built-in
-//! inplementations are provided for simplicty:
+//!
+//! - Abstract class leaving the implementation on users. The following built-in implementations are provided for
+//! simplicity:
+//!
//! - \ref FileLogger implements logging into a standard `FILE` stream.
//! - \ref StringLogger serializes all logs into a \ref String instance.
//!
-//! AsmJit's \ref FormatOptions provides the following to customize the formatting of
-//! instructions and operands through:
-//! - \ref FormatOptions::Flags
-//! - \ref FormatOptions::IndentationType
+//! AsmJit's \ref FormatOptions provides the following to customize the formatting of instructions and operands through:
+//!
+//! - \ref FormatFlags
+//! - \ref FormatIndentationGroup
//!
//! ### Logging
//!
-//! A \ref Logger is typically attached to a \ref CodeHolder, which propagates it
-//! to all attached emitters automatically. The example below illustrates how to
-//! use \ref FileLogger that outputs to standard output:
+//! A \ref Logger is typically attached to a \ref CodeHolder, which propagates it to all attached emitters
+//! automatically. The example below illustrates how to use \ref FileLogger that outputs to standard output:
//!
//! ```
//! #include <asmjit/core.h>
@@ -1485,8 +1354,8 @@ namespace asmjit {
//! }
//! ```
//!
-//! If output to FILE stream is not desired it's possible to use \ref StringLogger,
-//! which concatenates everything into a multi-line string:
+//! If output to FILE stream is not desired it's possible to use \ref StringLogger, which concatenates everything
+//! into a multi-line string:
//!
//! ```
//! #include <asmjit/core.h>
@@ -1519,11 +1388,10 @@ namespace asmjit {
//!
//! ### Formatting
//!
-//! AsmJit uses \ref Formatter to format inputs that are then passed to \ref
-//! Logger. Formatting is public and can be used by AsmJit users as well. The
-//! most important thing to know regarding formatting is that \ref Formatter
-//! always appends to the output string, so it can be used to build complex
-//! strings without having to concatenate intermediate strings.
+//! AsmJit uses \ref Formatter to format inputs that are then passed to \ref Logger. Formatting is public and can be
+//! used by AsmJit users as well. The most important thing to know regarding formatting is that \ref Formatter always
+//! appends to the output string, so it can be used to build complex strings without having to concatenate
+//! intermediate strings.
//!
//! The first example illustrates how to format operands:
//!
@@ -1533,12 +1401,12 @@ namespace asmjit {
//!
//! using namespace asmjit;
//!
-//! void logOperand(uint32_t arch, const Operand_& op) {
+//! void logOperand(Arch arch, const Operand_& op) {
//! // The emitter is optional (named labels and virtual registers need it).
//! BaseEmitter* emitter = nullptr;
//!
//! // No flags by default.
-//! uint32_t formatFlags = FormatOptions::kNoFlags;
+//! FormatFlags formatFlags = FormatFlags::kNone;
//!
//! StringTmp<128> sb;
//! Formatter::formatOperand(sb, formatFlags, emitter, arch, op);
@@ -1551,7 +1419,7 @@ namespace asmjit {
//! // Architecture is not part of operand, it must be passed explicitly.
//! // Format flags. We pass it explicitly also to 'logOperand' to make
//! // compatible with what AsmJit normally does.
-//! uint32_t arch = Environment::kArchX64;
+//! Arch arch = Arch::kX64;
//!
//! log(arch, rax); // Prints 'rax'.
//! log(arch, ptr(rax, rbx, 2)); // Prints '[rax + rbx * 4]`.
@@ -1570,12 +1438,12 @@ namespace asmjit {
//! using namespace asmjit;
//!
//! template<typename... Args>
-//! void logInstruction(uint32_t arch, const BaseInst& inst, Args&&... args) {
+//! void logInstruction(Arch arch, const BaseInst& inst, Args&&... args) {
//! // The emitter is optional (named labels and virtual registers need it).
//! BaseEmitter* emitter = nullptr;
//!
//! // No flags by default.
-//! uint32_t formatFlags = FormatOptions::kNoFlags;
+//! FormatFlags formatFlags = FormatFlags::kNone;
//!
//! // The formatter expects operands in an array.
//! Operand_ operands { std::forward<Args>(args)... };
@@ -1592,7 +1460,7 @@ namespace asmjit {
//! // Architecture is not part of operand, it must be passed explicitly.
//! // Format flags. We pass it explicitly also to 'logOperand' to make
//! // compatible with what AsmJit normally does.
-//! uint32_t arch = Environment::kArchX64;
+//! Arch arch = Arch::kX64;
//!
//! // Prints 'mov rax, rcx'.
//! logInstruction(arch, BaseInst(Inst::kIdMov), rax, rcx);
@@ -1605,19 +1473,19 @@ namespace asmjit {
//! // BaseInst abstracts instruction id, instruction options, and extraReg.
//! // Prints 'lock add [rax], rcx'.
//! logInstruction(arch,
-//! BaseInst(Inst::kIdAdd, Inst::kOptionLock),
+//! BaseInst(Inst::kIdAdd, InstOptions::kX86_Lock),
//! x86::ptr(rax), rcx);
//!
//! // Similarly an extra register (like AVX-512 selector) can be used.
//! // Prints 'vaddpd zmm0 {k2} {z}, zmm1, [rax]'.
//! logInstruction(arch,
-//! BaseInst(Inst::kIdAdd, Inst::kOptionZMask, k2),
+//! BaseInst(Inst::kIdAdd, InstOptions::kX86_ZMask, k2),
//! zmm0, zmm1, ptr(rax));
//! }
//! ```
//!
-//! And finally, the example below illustrates how to use a built-in function
-//! to format the content of \ref BaseBuilder, which consists of nodes:
+//! And finally, the example below illustrates how to use a built-in function to format the content of
+//! \ref BaseBuilder, which consists of nodes:
//!
//! ```
//! #include <asmjit/core.h>
@@ -1626,7 +1494,7 @@ namespace asmjit {
//! using namespace asmjit;
//!
//! void formattingExample(BaseBuilder* builder) {
-//! uint32_t formatFlags = FormatOptions::kNoFlags;
+//! FormatFlags formatFlags = FormatFlags::kNone;
//!
//! // This also shows how temporary strings can be used.
//! StringTmp<512> sb;
@@ -1643,40 +1511,30 @@ namespace asmjit {
//! }
//! ```
-// ============================================================================
-// [Documentation - asmjit_error_handling]
-// ============================================================================
//! \defgroup asmjit_error_handling Error Handling
//! \brief Error handling.
//!
//! ### Overview
//!
-//! AsmJit uses error codes to represent and return errors. Every function that
-//! can fail returns an \ref Error code. Exceptions are never thrown by AsmJit
-//! itself even in extreme conditions like out-of-memory, but it's possible to
-//! override \ref ErrorHandler::handleError() to throw, in that case no error
-//! will be returned and exception will be thrown instead. All functions where
-//! this can happen are not marked `noexcept`.
+//! AsmJit uses error codes to represent and return errors. Every function that can fail returns an \ref Error code.
+//! Exceptions are never thrown by AsmJit itself even in extreme conditions like out-of-memory, but it's possible to
+//! override \ref ErrorHandler::handleError() to throw, in that case no error will be returned and exception will be
+//! thrown instead. All functions where this can happen are not marked `noexcept`.
//!
-//! Errors should never be ignored, however, checking errors after each AsmJit
-//! API call would simply overcomplicate the whole code generation experience.
-//! \ref ErrorHandler exists to make the use of AsmJit API simpler as it allows
+//! Errors should never be ignored, however, checking errors after each AsmJit API call would simply overcomplicate
+//! the whole code generation experience. \ref ErrorHandler exists to make the use of AsmJit API simpler as it allows
//! to customize how errors can be handled:
//!
//! - Record the error and continue (the way how the error is user-implemented).
-//! - Throw an exception. AsmJit doesn't use exceptions and is completely
-//! exception-safe, but it's perfectly legal to throw an exception from
-//! the error handler.
-//! - Use plain old C's `setjmp()` and `longjmp()`. Asmjit always puts Assembler,
-//! Builder and Compiler to a consistent state before calling \ref
-//! ErrorHandler::handleError(), so `longjmp()` can be used without issues to
-//! cancel the code-generation if an error occurred. This method can be used if
-//! exception handling in your project is turned off and you still want some
-//! comfort. In most cases it should be safe as AsmJit uses \ref Zone memory
-//! and the ownership of memory it allocates always ends with the instance that
-//! allocated it. If using this approach please never jump outside the life-time
-//! of \ref CodeHolder and \ref BaseEmitter.
+//! - Throw an exception. AsmJit doesn't use exceptions and is completely exception-safe, but it's perfectly legal
+//! to throw an exception from the error handler.
+//! - Use plain old C's `setjmp()` and `longjmp()`. Asmjit always puts Assembler, Builder and Compiler to a
+//! consistent state before calling \ref ErrorHandler::handleError(), so `longjmp()` can be used without issues
+//! to cancel the code-generation if an error occurred. This method can be used if exception handling in your
+//! project is turned off and you still want some comfort. In most cases it should be safe as AsmJit uses \ref
+//! Zone memory and the ownership of memory it allocates always ends with the instance that allocated it. If
+//! using this approach please never jump outside the life-time of \ref CodeHolder and \ref BaseEmitter.
//!
//! ### Using ErrorHandler
//!
@@ -1718,69 +1576,56 @@ namespace asmjit {
//! - See \ref Error that lists error codes that AsmJit uses.
//! - See \ref ErrorHandler for more details about error handling.
-// ============================================================================
-// [Documentation - asmjit_instruction_db]
-// ============================================================================
//! \defgroup asmjit_instruction_db Instruction DB
//! \brief Instruction database (introspection, read/write, validation, ...).
//!
//! ### Overview
//!
-//! AsmJit provides a public instruction database that can be used to query
-//! information about a complete instruction. The instruction database requires
-//! the knowledge of the following:
+//! AsmJit provides a public instruction database that can be used to query information about a complete instruction.
+//! The instruction database requires the knowledge of the following:
+//!
+//! - \ref BaseInst - Base instruction that contains instruction id, options, and a possible extra-register that
+//! represents either REP prefix counter or AVX-512 selector (mask).
//!
-//! - \ref BaseInst - Base instruction that contains instruction id, options,
-//! and a possible extra-register that represents either REP prefix counter
-//! or AVX-512 selector (mask).
//! - \ref Operand - Represents operands of an instruction.
//!
//! Each instruction can be then queried for the following information:
//!
-//! - \ref InstRWInfo - Read/write information of instruction and its oprands.
-//! - \ref OpRWInfo - Read/write information of a single operand, part of
-//! \ref InstRWInfo data structure.
-//! - \ref BaseFeatures - CPU features required to execute the instruction.
+//! - \ref InstRWInfo - Read/write information of instruction and its oprands (includes \ref OpRWInfo).
+//!
+//! - \ref CpuFeatures - CPU features required to execute the instruction.
//!
-//! In addition to query functionality AsmJit is also able to validate whether
-//! an instruction and its operands are valid. This is useful for making sure
-//! that what user tries to emit is correct and it can be also used by other
+//! In addition to query functionality AsmJit is also able to validate whether an instruction and its operands are
+//! valid. This is useful for making sure that what user tries to emit is correct and it can be also used by other
//! projects that parse user input, like AsmTK project.
//!
//! ### Query API
//!
-//! The instruction query API is provided by \ref InstAPI namespace. The
-//! following queries are possible:
+//! The instruction query API is provided by \ref InstAPI namespace. The following queries are possible:
//!
-//! - \ref InstAPI::queryRWInfo() - queries read/write information of the
-//! given instruction and its operands. Includes also CPU flags read/written.
+//! - \ref InstAPI::queryRWInfo() - queries read/write information of the given instruction and its operands.
+//! Includes also CPU flags read/written.
//!
-//! - \ref InstAPI::queryFeatures() - queries CPU features that are required
-//! to execute the given instruction. A full instruction with operands must
-//! be given as some architectures like X86 may require different features
-//! for the same instruction based on its operands.
+//! - \ref InstAPI::queryFeatures() - queries CPU features that are required to execute the given instruction. A full
+//! instruction with operands must be given as some architectures like X86 may require different features for the
+//! same instruction based on its operands.
//!
-//! - <a href="https://github.com/asmjit/asmjit/blob/master/test/asmjit_test_x86_instinfo.cpp">asmjit_test_x86_instinfo.cpp</a>
+//! - <a href="https://github.com/asmjit/asmjit/blob/master/test/asmjit_test_instinfo.cpp">asmjit_test_instinfo.cpp</a>
//! can be also used as a reference about accessing instruction information.
//!
//! ### Validation API
//!
-//! The instruction validation API is provided by \ref InstAPI namespace in the
-//! similar fashion like the Query API, however, validation can also be turned
-//! on at \ref BaseEmitter level. The following is possible:
+//! The instruction validation API is provided by \ref InstAPI namespace in the similar fashion like the Query API,
+//! however, validation can also be turned on at \ref BaseEmitter level. The following is possible:
//!
-//! - \ref InstAPI::validate() - low-level instruction validation function
-//! that is used internally by emitters if strict validation is enabled.
+//! - \ref InstAPI::validate() - low-level instruction validation function that is used internally by emitters
+//! if strict validation is enabled.
//!
-//! - \ref BaseEmitter::addValidationOptions() - can be used to enable
-//! validation at emitter level, see \ref BaseEmitter::ValidationOptions.
+//! - \ref BaseEmitter::addDiagnosticOptions() - can be used to enable validation at emitter level, see \ref
+//! DiagnosticOptions.
-// ============================================================================
-// [Documentation - asmjit_virtual_memory]
-// ============================================================================
-
//! \defgroup asmjit_virtual_memory Virtual Memory
//! \brief Virtual memory management.
//!
@@ -1788,53 +1633,42 @@ namespace asmjit {
//!
//! AsmJit's virtual memory management is divided into two main categories:
//!
-//! - Low level API that provides cross-platform abstractions for virtual
-//! memory allocation. Implemented in \ref VirtMem namespace.
-//! - High level API that makes it very easy to store generated code for
-//! execution. See \ref JitRuntime, which is used by many examples for its
-//! simplicity and easy integration with \ref CodeHolder. There is also
-//! \ref JitAllocator, which lays somewhere between RAW memory allocation
-//! and \ref JitRuntime.
+//! - Low level API that provides cross-platform abstractions for virtual memory allocation. Implemented in
+//! \ref VirtMem namespace.
+//!
+//! - High level API that makes it very easy to store generated code for execution. See \ref JitRuntime, which is
+//! used by many examples for its simplicity and easy integration with \ref CodeHolder. There is also \ref
+//! JitAllocator, which lays somewhere between RAW memory allocation and \ref JitRuntime.
-// ============================================================================
-// [Documentation - asmjit_zone_memory]
-// ============================================================================
//! \defgroup asmjit_zone Zone Memory
//! \brief Zone memory allocator and containers.
//!
//! ### Overview
//!
-//! AsmJit uses zone memory allocation (also known as Arena allocation) to allocate
-//! most of the data it uses. It's a fast allocator that allows AsmJit to allocate
-//! a lot of small data structures fast and without `malloc()` overhead. Since
-//! code generators and all related classes are usually short-lived this approach
-//! decreases memory usage and fragmentation as arena-based allocators always
-//! allocate larger blocks of memory, which are then split into smaller chunks.
-//!
-//! Another advantage of zone memory allocation is that since the whole library
-//! uses this strategy it's very easy to deallocate everything that a particular
-//! instance is holding by simply releasing the memory the allocator holds. This
-//! improves destruction time of such objects as there is no destruction at all.
-//! Long-lived objects just reset its data in destructor or in their reset()
-//! member function for a future reuse. For this purpose all containers in AsmJit
-//! are also zone allocated.
+//! AsmJit uses zone memory allocation (also known as Arena allocation) to allocate most of the data it uses. It's a
+//! fast allocator that allows AsmJit to allocate a lot of small data structures fast and without `malloc()` overhead.
+//! Since code generators and all related classes are usually short-lived this approach decreases memory usage and
+//! fragmentation as arena-based allocators always allocate larger blocks of memory, which are then split into smaller
+//! chunks.
+//!
+//! Another advantage of zone memory allocation is that since the whole library uses this strategy it's very easy to
+//! deallocate everything that a particular instance is holding by simply releasing the memory the allocator holds.
+//! This improves destruction time of such objects as there is no destruction at all. Long-lived objects just reset
+//! its data in destructor or in their reset() member function for a future reuse. For this purpose all containers in
+//! AsmJit are also zone allocated.
//!
//! ### Zone Allocation
//!
-//! - \ref Zone - Incremental zone memory allocator with minimum features. It
-//! can only allocate memory without the possibility to return it back to
-//! the allocator.
+//! - \ref Zone - Incremental zone memory allocator with minimum features. It can only allocate memory without the
+//! possibility to return it back to the allocator.
//!
-//! - \ref ZoneTmp - A temporary \ref Zone with some initial static storage.
-//! If the allocation requests fit the static storage allocated then there
-//! will be no dynamic memory allocation during the lifetime of \ref ZoneTmp,
-//! otherwise it would act as \ref Zone with one preallocated block on the
-//! stack.
+//! - \ref ZoneTmp - A temporary \ref Zone with some initial static storage. If the allocation requests fit the
+//! static storage allocated then there will be no dynamic memory allocation during the lifetime of \ref ZoneTmp,
+//! otherwise it would act as \ref Zone with one preallocated block on the stack.
//!
-//! - \ref ZoneAllocator - A wrapper of \ref Zone that provides the capability
-//! of returning memory to the allocator. Such memory is stored in a pool for
-//! later reuse.
+//! - \ref ZoneAllocator - A wrapper of \ref Zone that provides the capability of returning memory to the allocator.
+//! Such memory is stored in a pool for later reuse.
//!
//! ### Zone Allocated Containers
//!
@@ -1848,11 +1682,10 @@ namespace asmjit {
//!
//! ### Using Zone Allocated Containers
//!
-//! The most common data structure exposed by AsmJit is \ref ZoneVector. It's very
-//! similar to `std::vector`, but the implementation doesn't use exceptions and
-//! uses the mentioned \ref ZoneAllocator for performance reasons. You don't have
-//! to worry about allocations as you should not need to add items to AsmJit's
-//! data structures directly as there should be API for all required operations.
+//! The most common data structure exposed by AsmJit is \ref ZoneVector. It's very similar to `std::vector`, but the
+//! implementation doesn't use exceptions and uses the mentioned \ref ZoneAllocator for performance reasons. You don't
+//! have to worry about allocations as you should not need to add items to AsmJit's data structures directly as there
+//! should be API for all required operations.
//!
//! The following APIs in \ref CodeHolder returns \ref ZoneVector reference:
//!
@@ -1874,10 +1707,9 @@ namespace asmjit {
//! }
//! ```
//!
-//! \ref ZoneVector has overloaded array access operator to make it possible
-//! to access its elements through operator[]. Some standard functions like
-//! \ref ZoneVector::empty(), \ref ZoneVector::size(), and \ref ZoneVector::data()
-//! are provided as well. Vectors are also iterable through a range-based for loop:
+//! \ref ZoneVector has overloaded array access operator to make it possible to access its elements through operator[].
+//! Some standard functions like \ref ZoneVector::empty(), \ref ZoneVector::size(), and \ref ZoneVector::data() are
+//! provided as well. Vectors are also iterable through a range-based for loop:
//!
//! ```
//! using namespace asmjit;
@@ -1894,15 +1726,13 @@ namespace asmjit {
//!
//! ### Design Considerations
//!
-//! Zone-allocated containers do not store the allocator within the container.
-//! This decision was made to reduce the footprint of such containers as AsmJit
-//! tooling, especially Compiler's register allocation, may use many instances
+//! Zone-allocated containers do not store the allocator within the container. This decision was made to reduce the
+//! footprint of such containers as AsmJit tooling, especially Compiler's register allocation, may use many instances
//! of such containers to perform code analysis and register allocation.
//!
-//! For example to append an item into a \ref ZoneVector it's required to pass
-//! the allocator as the first argument, so it can be used in case that the
-//! vector needs a reallocation. Such function also returns an error, which
-//! must be propagated to the caller.
+//! For example to append an item into a \ref ZoneVector it's required to pass the allocator as the first argument,
+//! so it can be used in case that the vector needs a reallocation. Such function also returns an error, which must
+//! be propagated to the caller.
//!
//! ```
//! using namespace asmjit
@@ -1926,10 +1756,9 @@ namespace asmjit {
//! }
//! ```
//!
-//! Containers like \ref ZoneVector also provide a functionality to reserve a
-//! certain number of items before any items are added to it. This approach is
-//! used internally in most places as it allows to prepare space for data that
-//! will be added to some container before the data itself was created.
+//! Containers like \ref ZoneVector also provide a functionality to reserve a certain number of items before any items
+//! are added to it. This approach is used internally in most places as it allows to prepare space for data that will
+//! be added to some container before the data itself was created.
//!
//! ```
//! using namespace asmjit
@@ -1947,48 +1776,46 @@ namespace asmjit {
//! }
//! ```
-// ============================================================================
-// [Documentation - asmjit_utilities]
-// ============================================================================
//! \defgroup asmjit_utilities Utilities
//! \brief Utility classes and functions.
//!
//! ### Overview
//!
-//! AsmJit uses and provides utility classes and functions, that can be used
-//! with AsmJit. The functionality can be divided into the following topics:
+//! AsmJit uses and provides utility classes and functions, that can be used with AsmJit. The functionality can be
+//! divided into the following topics:
//!
//! ### String Functionality
//!
-//! - \ref String - AsmJit's string container, which is used internally
-//! and which doesn't use exceptions and has a stable layout, which is
-//! not dependent on C++ standard library.
-//! - \ref StringTmp - String that can have base storage allocated on
-//! stack. The amount of storage on stack can be specified as a template
-//! parameter.
+//! - \ref String - AsmJit's string container, which is used internally and which doesn't use exceptions and has
+//! a stable layout, which is not dependent on C++ standard library.
+//!
+//! - \ref StringTmp - String that can have base storage allocated on stack. The amount of storage on stack can
+//! be specified as a template parameter.
+//!
//! - \ref FixedString - Fixed string container limited up to N characters.
//!
//! ### Code Generation Utilities
//!
-//! - \ref ConstPool - Constant pool used by \ref BaseCompiler, but also
-//! available to users that may find use of it.
+//! - \ref ConstPool - Constant pool used by \ref BaseCompiler, but also available to users that may find use of it.
//!
//! ### Support Functionality Used by AsmJit
//!
-//! - \ref Support namespace provides many other utility functions and
-//! classes that are used by AsmJit, and made public.
+//! - \ref Support namespace provides many other utility functions and classes that are used by AsmJit, and made
+//! public.
-// ============================================================================
-// [Documentation - asmjit_<arch> backends]
-// ============================================================================
//! \defgroup asmjit_x86 X86 Backend
//! \brief X86/X64 backend.
-// ============================================================================
-// [Documentation - asmjit_ra]
-// ============================================================================
+
+//! \defgroup asmjit_arm ARM Commons
+//! \brief ARM commons shared between AArch32 and AArch64.
+
+
+//! \defgroup asmjit_a64 AArch64 Backend
+//! \brief AArch64 backend.
+
//! \cond INTERNAL
//! \defgroup asmjit_ra RA
@@ -1997,63 +1824,38 @@ namespace asmjit {
} // {asmjit}
-// ============================================================================
-// [Core Headers]
-// ============================================================================
-
-#include "./core/globals.h"
-
-#include "./core/arch.h"
-#include "./core/assembler.h"
-#include "./core/builder.h"
-#include "./core/callconv.h"
-#include "./core/codeholder.h"
-#include "./core/compiler.h"
-#include "./core/constpool.h"
-#include "./core/cpuinfo.h"
-#include "./core/datatypes.h"
-#include "./core/emitter.h"
-#include "./core/environment.h"
-#include "./core/errorhandler.h"
-#include "./core/features.h"
-#include "./core/formatter.h"
-#include "./core/func.h"
-#include "./core/inst.h"
-#include "./core/jitallocator.h"
-#include "./core/jitruntime.h"
-#include "./core/logger.h"
-#include "./core/operand.h"
-#include "./core/osutils.h"
-#include "./core/string.h"
-#include "./core/support.h"
-#include "./core/target.h"
-#include "./core/type.h"
-#include "./core/virtmem.h"
-#include "./core/zone.h"
-#include "./core/zonehash.h"
-#include "./core/zonelist.h"
-#include "./core/zonetree.h"
-#include "./core/zonestack.h"
-#include "./core/zonestring.h"
-#include "./core/zonevector.h"
-
-// ============================================================================
-// [Deprecated]
-// ============================================================================
-
-#ifndef ASMJIT_NO_DEPRECATED
-namespace asmjit {
-
-#ifndef ASMJIT_NO_COMPILER
-ASMJIT_DEPRECATED("Use InvokeNode instead of FuncCallNode")
-typedef InvokeNode FuncCallNode;
-#endif // !ASMJIT_NO_COMPILER
-
-#ifndef ASMJIT_NO_LOGGING
-namespace Logging { using namespace Formatter; }
-#endif //! ASMJIT_NO_LOGGING
-
-} // {asmjit}
-#endif // !ASMJIT_NO_DEPRECATED
+#include "asmjit-scope-begin.h"
+#include "core/archtraits.h"
+#include "core/assembler.h"
+#include "core/builder.h"
+#include "core/codeholder.h"
+#include "core/compiler.h"
+#include "core/constpool.h"
+#include "core/cpuinfo.h"
+#include "core/emitter.h"
+#include "core/environment.h"
+#include "core/errorhandler.h"
+#include "core/formatter.h"
+#include "core/func.h"
+#include "core/globals.h"
+#include "core/inst.h"
+#include "core/jitallocator.h"
+#include "core/jitruntime.h"
+#include "core/logger.h"
+#include "core/operand.h"
+#include "core/osutils.h"
+#include "core/string.h"
+#include "core/support.h"
+#include "core/target.h"
+#include "core/type.h"
+#include "core/virtmem.h"
+#include "core/zone.h"
+#include "core/zonehash.h"
+#include "core/zonelist.h"
+#include "core/zonetree.h"
+#include "core/zonestack.h"
+#include "core/zonestring.h"
+#include "core/zonevector.h"
+#include "asmjit-scope-end.h"
#endif // ASMJIT_CORE_H_INCLUDED
diff --git a/3rdparty/asmjit/src/asmjit/core/api-build_p.h b/3rdparty/asmjit/src/asmjit/core/api-build_p.h
index db37ca77e93..6eca971037e 100644
--- a/3rdparty/asmjit/src/asmjit/core/api-build_p.h
+++ b/3rdparty/asmjit/src/asmjit/core/api-build_p.h
@@ -1,25 +1,7 @@
-// AsmJit - Machine code generation for C++
+// This file is part of AsmJit project <https://asmjit.com>
//
-// * Official AsmJit Home Page: https://asmjit.com
-// * Official Github Repository: https://github.com/asmjit/asmjit
-//
-// Copyright (c) 2008-2020 The AsmJit Authors
-//
-// This software is provided 'as-is', without any express or implied
-// warranty. In no event will the authors be held liable for any damages
-// arising from the use of this software.
-//
-// Permission is granted to anyone to use this software for any purpose,
-// including commercial applications, and to alter it and redistribute it
-// freely, subject to the following restrictions:
-//
-// 1. The origin of this software must not be misrepresented; you must not
-// claim that you wrote the original software. If you use this software
-// in a product, an acknowledgment in the product documentation would be
-// appreciated but is not required.
-// 2. Altered source versions must be plainly marked as such, and must not be
-// misrepresented as being the original software.
-// 3. This notice may not be removed or altered from any source distribution.
+// See asmjit.h or LICENSE.md for license and copyright information
+// SPDX-License-Identifier: Zlib
#ifndef ASMJIT_CORE_API_BUILD_P_H_INCLUDED
#define ASMJIT_CORE_API_BUILD_P_H_INCLUDED
@@ -47,10 +29,6 @@
#include <windows.h>
#endif
-// ============================================================================
-// [asmjit::Build - Globals - Build-Only]
-// ============================================================================
-
#include "./api-config.h"
#if !defined(ASMJIT_BUILD_DEBUG) && defined(__GNUC__) && !defined(__clang__)
diff --git a/3rdparty/asmjit/src/asmjit/core/api-config.h b/3rdparty/asmjit/src/asmjit/core/api-config.h
index 1767d332483..a0fb979eb33 100644
--- a/3rdparty/asmjit/src/asmjit/core/api-config.h
+++ b/3rdparty/asmjit/src/asmjit/core/api-config.h
@@ -1,48 +1,59 @@
-// AsmJit - Machine code generation for C++
+// This file is part of AsmJit project <https://asmjit.com>
//
-// * Official AsmJit Home Page: https://asmjit.com
-// * Official Github Repository: https://github.com/asmjit/asmjit
-//
-// Copyright (c) 2008-2020 The AsmJit Authors
-//
-// This software is provided 'as-is', without any express or implied
-// warranty. In no event will the authors be held liable for any damages
-// arising from the use of this software.
-//
-// Permission is granted to anyone to use this software for any purpose,
-// including commercial applications, and to alter it and redistribute it
-// freely, subject to the following restrictions:
-//
-// 1. The origin of this software must not be misrepresented; you must not
-// claim that you wrote the original software. If you use this software
-// in a product, an acknowledgment in the product documentation would be
-// appreciated but is not required.
-// 2. Altered source versions must be plainly marked as such, and must not be
-// misrepresented as being the original software.
-// 3. This notice may not be removed or altered from any source distribution.
+// See asmjit.h or LICENSE.md for license and copyright information
+// SPDX-License-Identifier: Zlib
#ifndef ASMJIT_CORE_API_CONFIG_H_INCLUDED
#define ASMJIT_CORE_API_CONFIG_H_INCLUDED
-// ============================================================================
-// [asmjit::Version]
-// ============================================================================
+// AsmJit Library & ABI Version
+// ============================
//! \addtogroup asmjit_core
//! \{
//! AsmJit library version in `(Major << 16) | (Minor << 8) | (Patch)` format.
-#define ASMJIT_LIBRARY_VERSION 0x010400 /* 1.4.0 */
+#define ASMJIT_LIBRARY_VERSION 0x010900 /* 1.9.0 */
+
+//! \def ASMJIT_ABI_NAMESPACE
+//!
+//! AsmJit ABI namespace is an inline namespace within \ref asmjit namespace.
+//!
+//! It's used to make sure that when user links to an incompatible version of AsmJit, it won't link. It has also some
+//! additional properties as well. When `ASMJIT_ABI_NAMESPACE` is defined by the user it would override the AsmJit
+//! default, which makes it possible to use use multiple AsmJit libraries within a single project, totally controlled
+//! by the users. This is useful especially in cases in which some of such library comes from a third party.
+#ifndef ASMJIT_ABI_NAMESPACE
+ #define ASMJIT_ABI_NAMESPACE _abi_1_9
+#endif
//! \}
-// ============================================================================
-// [asmjit::Build - Documentation]
-// ============================================================================
+// Global Dependencies
+// ===================
-// NOTE: Doxygen cannot document macros that are not defined, that's why we have
-// to define them and then undefine them, so it won't use the macros with its
-// own preprocessor.
+#include <stdarg.h>
+#include <stddef.h>
+#include <stdint.h> // We really want std types as globals, not under 'std' namespace.
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include <iterator>
+#include <limits>
+#include <new>
+#include <type_traits>
+#include <utility>
+
+#if !defined(_WIN32) && !defined(__EMSCRIPTEN__)
+ #include <pthread.h>
+#endif
+
+// Build Options
+// =============
+
+// NOTE: Doxygen cannot document macros that are not defined, that's why we have to define them and then undefine
+// them immediately, so it won't use the macros with its own preprocessor.
#ifdef _DOXYGEN
namespace asmjit {
@@ -65,16 +76,19 @@ namespace asmjit {
//! \note Can be defined explicitly to bypass autodetection.
#define ASMJIT_BUILD_RELEASE
-//! Defined to build X86/X64 backend.
-#define ASMJIT_BUILD_X86
+//! Disables X86/X64 backends.
+#define ASMJIT_NO_X86
+
+//! Disables AArch32 backends (both ARM and Thumb).
+#define ASMJIT_NO_AARCH32
-//! Defined to build ARM/AArch64 backend.
-#define ASMJIT_BUILD_ARM
+//! Disables AArch64 backend.
+#define ASMJIT_NO_AARCH64
-//! Defined to build host backend autodetected at compile-time.
-#define ASMJIT_BUILD_HOST
+//! Disables non-host backends entirely (useful for JIT compilers to minimize the library size).
+#define ASMJIT_NO_FOREIGN
-//! Disables deprecated API at compile time.
+//! Disables deprecated API at compile time (deprecated API won't be available).
#define ASMJIT_NO_DEPRECATED
//! Disables \ref asmjit_builder functionality completely.
@@ -83,10 +97,10 @@ namespace asmjit {
//! Disables \ref asmjit_compiler functionality completely.
#define ASMJIT_NO_COMPILER
-//! Disables JIT memory management and \ref JitRuntime.
+//! Disables JIT memory management and \ref asmjit::JitRuntime.
#define ASMJIT_NO_JIT
-//! Disables \ref Logger and \ref Formatter.
+//! Disables \ref asmjit::Logger and \ref asmjit::Formatter.
#define ASMJIT_NO_LOGGING
//! Disables everything that contains text.
@@ -99,7 +113,13 @@ namespace asmjit {
#define ASMJIT_NO_INTROSPECTION
// Avoid doxygen preprocessor using feature-selection definitions.
-#undef ASMJIT_NO_DEPRECATED
+#undef ASMJIT_BUILD_EMBNED
+#undef ASMJIT_BUILD_STATIC
+#undef ASMJIT_BUILD_DEBUG
+#undef ASMJIT_BUILD_RELEASE
+#undef ASMJIT_NO_X86
+#undef ASMJIT_NO_FOREIGN
+// (keep ASMJIT_NO_DEPRECATED defined, we don't document deprecated APIs).
#undef ASMJIT_NO_BUILDER
#undef ASMJIT_NO_COMPILER
#undef ASMJIT_NO_JIT
@@ -113,34 +133,6 @@ namespace asmjit {
} // {asmjit}
#endif // _DOXYGEN
-// ============================================================================
-// [asmjit::Dependencies]
-// ============================================================================
-
-// We really want std-types as globals.
-#include <stdarg.h>
-#include <stddef.h>
-#include <stdint.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-
-#include <new>
-#include <limits>
-#include <type_traits>
-#include <utility>
-
-#if !defined(_WIN32) && !defined(__EMSCRIPTEN__)
- #include <pthread.h>
-#endif
-
-
-// ============================================================================
-// [asmjit::Options]
-// ============================================================================
-
-#define ASMJIT_STATIC
-
// ASMJIT_NO_BUILDER implies ASMJIT_NO_COMPILER.
#if defined(ASMJIT_NO_BUILDER) && !defined(ASMJIT_NO_COMPILER)
#define ASMJIT_NO_COMPILER
@@ -148,37 +140,17 @@ namespace asmjit {
// Prevent compile-time errors caused by misconfiguration.
#if defined(ASMJIT_NO_TEXT) && !defined(ASMJIT_NO_LOGGING)
- #pragma "ASMJIT_NO_TEXT can only be defined when ASMJIT_NO_LOGGING is defined."
+ #pragma message("'ASMJIT_NO_TEXT' can only be defined when 'ASMJIT_NO_LOGGING' is defined.")
#undef ASMJIT_NO_TEXT
#endif
#if defined(ASMJIT_NO_INTROSPECTION) && !defined(ASMJIT_NO_COMPILER)
- #pragma message("ASMJIT_NO_INTROSPECTION can only be defined when ASMJIT_NO_COMPILER is defined")
+ #pragma message("'ASMJIT_NO_INTROSPECTION' can only be defined when 'ASMJIT_NO_COMPILER' is defined")
#undef ASMJIT_NO_INTROSPECTION
#endif
-// ============================================================================
-// [asmjit::Build - Globals - Deprecated]
-// ============================================================================
-
-#ifndef ASMJIT_NO_DEPRECATED
- #if defined(ASMJIT_BUILD_EMBED) || defined(ASMJIT_BUILD_STATIC)
- #if defined(ASMJIT_BUILD_EMBED)
- #pragma message("'ASMJIT_BUILD_EMBED' is deprecated, use 'ASMJIT_STATIC'")
- #endif
- #if defined(ASMJIT_BUILD_STATIC)
- #pragma message("'ASMJIT_BUILD_STATIC' is deprecated, use 'ASMJIT_STATIC'")
- #endif
-
- #if !defined(ASMJIT_STATIC)
- #define ASMJIT_STATIC
- #endif
- #endif
-#endif // !ASMJIT_NO_DEPRECATED
-
-// ============================================================================
-// [asmjit::Build - Globals - Build Mode]
-// ============================================================================
+// Build Mode
+// ==========
// Detect ASMJIT_BUILD_DEBUG and ASMJIT_BUILD_RELEASE if not defined.
#if !defined(ASMJIT_BUILD_DEBUG) && !defined(ASMJIT_BUILD_RELEASE)
@@ -189,9 +161,8 @@ namespace asmjit {
#endif
#endif
-// ============================================================================
-// [asmjit::Build - Globals - Target Architecture]
-// ============================================================================
+// Target Architecture Detection
+// =============================
#if defined(_M_X64) || defined(__x86_64__)
#define ASMJIT_ARCH_X86 64
@@ -237,27 +208,21 @@ namespace asmjit {
#define ASMJIT_ARCH_BE 0
#endif
-// Build host architecture if no architecture is selected.
-#if !defined(ASMJIT_BUILD_HOST) && \
- !defined(ASMJIT_BUILD_X86) && \
- !defined(ASMJIT_BUILD_ARM)
- #define ASMJIT_BUILD_HOST
-#endif
+#if defined(ASMJIT_NO_FOREIGN)
+ #if !ASMJIT_ARCH_X86 && !defined(ASMJIT_NO_X86)
+ #define ASMJIT_NO_X86
+ #endif
-// Detect host architecture if building only for host.
-#if ASMJIT_ARCH_X86 && defined(ASMJIT_BUILD_HOST) && !defined(ASMJIT_BUILD_X86)
- #define ASMJIT_BUILD_X86
+ #if !ASMJIT_ARCH_ARM && !defined(ASMJIT_NO_AARCH64)
+ #define ASMJIT_NO_AARCH64
+ #endif
#endif
-#if ASMJIT_ARCH_ARM && defined(ASMJIT_BUILD_HOST) && !defined(ASMJIT_BUILD_ARM)
- #define ASMJIT_BUILD_ARM
-#endif
-// ============================================================================
-// [asmjit::Build - Globals - C++ Compiler and Features Detection]
-// ============================================================================
+// C++ Compiler and Features Detection
+// ===================================
-#define ASMJIT_CXX_GNU 0
+#define ASMJIT_CXX_GNU 0
#define ASMJIT_CXX_MAKE_VER(MAJOR, MINOR) ((MAJOR) * 1000 + (MINOR))
// Intel Compiler [pretends to be GNU or MSC, so it must be checked first]:
@@ -297,9 +262,12 @@ namespace asmjit {
#define ASMJIT_CXX_HAS_ATTRIBUTE(NAME, CHECK) (!(!(CHECK)))
#endif
-// ============================================================================
-// [asmjit::Build - Globals - API Decorators & Language Extensions]
-// ============================================================================
+// API Decorators & C++ Extensions
+// ===============================
+
+//! \def ASMJIT_API
+//!
+//! A decorator that is used to decorate API that AsmJit exports when built as a shared library.
// API (Export / Import).
#if !defined(ASMJIT_STATIC)
@@ -328,12 +296,12 @@ namespace asmjit {
#define ASMJIT_VARAPI extern ASMJIT_API
#endif
-// This is basically a workaround. When using MSVC and marking class as DLL
-// export everything gets exported, which is unwanted in most projects. MSVC
-// automatically exports typeinfo and vtable if at least one symbol of the
-// class is exported. However, GCC has some strange behavior that even if
-// one or more symbol is exported it doesn't export typeinfo unless the
-// class itself is decorated with "visibility(default)" (i.e. ASMJIT_API).
+//! \def ASMJIT_VIRTAPI
+//!
+//! This is basically a workaround. When using MSVC and marking class as DLL export everything gets exported, which
+//! is unwanted in most projects. MSVC automatically exports typeinfo and vtable if at least one symbol of the class
+//! is exported. However, GCC has some strange behavior that even if one or more symbol is exported it doesn't export
+//! typeinfo unless the class itself is decorated with "visibility(default)" (i.e. ASMJIT_API).
#if !defined(_WIN32) && defined(__GNUC__)
#define ASMJIT_VIRTAPI ASMJIT_API
#else
@@ -342,11 +310,11 @@ namespace asmjit {
// Function attributes.
#if !defined(ASMJIT_BUILD_DEBUG) && defined(__GNUC__)
- #define ASMJIT_INLINE inline __attribute__((__always_inline__))
+ #define ASMJIT_FORCE_INLINE inline __attribute__((__always_inline__))
#elif !defined(ASMJIT_BUILD_DEBUG) && defined(_MSC_VER)
- #define ASMJIT_INLINE __forceinline
+ #define ASMJIT_FORCE_INLINE __forceinline
#else
- #define ASMJIT_INLINE inline
+ #define ASMJIT_FORCE_INLINE inline
#endif
#if defined(__GNUC__)
@@ -386,7 +354,6 @@ namespace asmjit {
#define ASMJIT_VECTORCALL
#endif
-
// Type alignment (not allowed by C++11 'alignas' keyword).
#if defined(__GNUC__)
#define ASMJIT_ALIGN_TYPE(TYPE, N) __attribute__((__aligned__(N))) TYPE
@@ -405,6 +372,53 @@ namespace asmjit {
#define ASMJIT_MAY_ALIAS
#endif
+//! \def ASMJIT_MAYBE_UNUSED
+//!
+//! Expands to `[[maybe_unused]]` if supported or a compiler attribute instead.
+#if __cplusplus >= 201703L
+ #define ASMJIT_MAYBE_UNUSED [[maybe_unused]]
+#elif defined(__GNUC__)
+ #define ASMJIT_MAYBE_UNUSED __attribute__((unused))
+#else
+ #define ASMJIT_MAYBE_UNUSED
+#endif
+
+#if defined(__clang_major__) && __clang_major__ >= 4 && !defined(_DOXYGEN)
+ // NOTE: Clang allows to apply this attribute to function arguments, which is what we want. Once GCC decides to
+ // support this use, we will enable it for GCC as well. However, until that, it will be clang only, which is
+ // what we need for static analysis.
+ #define ASMJIT_NONNULL(FUNCTION_ARGUMENT) FUNCTION_ARGUMENT __attribute__((__nonnull__))
+#else
+ #define ASMJIT_NONNULL(FUNCTION_ARGUMENT) FUNCTION_ARGUMENT
+#endif
+
+//! \def ASMJIT_NOEXCEPT_TYPE
+//!
+//! Defined to `noexcept` in C++17 mode or nothing otherwise. Used by function typedefs.
+#if __cplusplus >= 201703L
+ #define ASMJIT_NOEXCEPT_TYPE noexcept
+#else
+ #define ASMJIT_NOEXCEPT_TYPE
+#endif
+
+//! \def ASMJIT_ASSUME(...)
+//!
+//! Macro that tells the C/C++ compiler that the expression `...` evaluates to true.
+//!
+//! This macro has two purposes:
+//!
+//! 1. Enable optimizations that would not be possible without the assumption.
+//! 2. Hint static analysis tools that a certain condition is true to prevent false positives.
+#if defined(__clang__)
+ #define ASMJIT_ASSUME(...) __builtin_assume(__VA_ARGS__)
+#elif defined(__GNUC__)
+ #define ASMJIT_ASSUME(...) do { if (!(__VA_ARGS__)) __builtin_unreachable(); } while (0)
+#elif defined(_MSC_VER)
+ #define ASMJIT_ASSUME(...) __assume(__VA_ARGS__)
+#else
+ #define ASMJIT_ASSUME(...) (void)0
+#endif
+
//! \def ASMJIT_LIKELY(...)
//!
//! Condition is likely to be taken (mostly error handling and edge cases).
@@ -461,49 +475,51 @@ namespace asmjit {
#define ASMJIT_ATTRIBUTE_NO_SANITIZE_UNDEF
#endif
-// ============================================================================
-// [asmjit::Build - Globals - Begin-Namespace / End-Namespace]
-// ============================================================================
+// Begin-Namespace & End-Namespace Macros
+// ======================================
-#if defined(__clang__)
+#if defined _DOXYGEN
+ #define ASMJIT_BEGIN_NAMESPACE namespace asmjit {
+ #define ASMJIT_END_NAMESPACE }
+#elif defined(__clang__)
#define ASMJIT_BEGIN_NAMESPACE \
- namespace asmjit { \
+ namespace asmjit { inline namespace ASMJIT_ABI_NAMESPACE { \
_Pragma("clang diagnostic push") \
_Pragma("clang diagnostic ignored \"-Wconstant-logical-operand\"") \
_Pragma("clang diagnostic ignored \"-Wunnamed-type-template-args\"")
#define ASMJIT_END_NAMESPACE \
_Pragma("clang diagnostic pop") \
- }
+ }}
#elif defined(__GNUC__) && __GNUC__ == 4
#define ASMJIT_BEGIN_NAMESPACE \
- namespace asmjit { \
+ namespace asmjit { inline namespace ASMJIT_ABI_NAMESPACE { \
_Pragma("GCC diagnostic push") \
_Pragma("GCC diagnostic ignored \"-Wmissing-field-initializers\"")
#define ASMJIT_END_NAMESPACE \
_Pragma("GCC diagnostic pop") \
- }
+ }}
#elif defined(__GNUC__) && __GNUC__ >= 8
#define ASMJIT_BEGIN_NAMESPACE \
- namespace asmjit { \
+ namespace asmjit { inline namespace ASMJIT_ABI_NAMESPACE { \
_Pragma("GCC diagnostic push") \
_Pragma("GCC diagnostic ignored \"-Wclass-memaccess\"")
#define ASMJIT_END_NAMESPACE \
_Pragma("GCC diagnostic pop") \
- }
+ }}
#elif defined(_MSC_VER) && !defined(__INTEL_COMPILER)
#define ASMJIT_BEGIN_NAMESPACE \
- namespace asmjit { \
+ namespace asmjit { inline namespace ASMJIT_ABI_NAMESPACE { \
__pragma(warning(push)) \
__pragma(warning(disable: 4127)) /* conditional expression is const */ \
__pragma(warning(disable: 4201)) /* nameless struct/union */
#define ASMJIT_END_NAMESPACE \
__pragma(warning(pop)) \
- }
+ }}
#endif
#if !defined(ASMJIT_BEGIN_NAMESPACE) && !defined(ASMJIT_END_NAMESPACE)
- #define ASMJIT_BEGIN_NAMESPACE namespace asmjit {
- #define ASMJIT_END_NAMESPACE }
+ #define ASMJIT_BEGIN_NAMESPACE namespace asmjit { inline namespace ASMJIT_ABI_NAMESPACE {
+ #define ASMJIT_END_NAMESPACE }}
#endif
#define ASMJIT_BEGIN_SUB_NAMESPACE(NAMESPACE) \
@@ -514,28 +530,83 @@ namespace asmjit {
} \
ASMJIT_END_NAMESPACE
-// ============================================================================
-// [asmjit::Build - Globals - Utilities]
-// ============================================================================
+// C++ Utilities
+// =============
-#define ASMJIT_NONCOPYABLE(...) \
- private: \
- __VA_ARGS__(const __VA_ARGS__& other) = delete; \
- __VA_ARGS__& operator=(const __VA_ARGS__& other) = delete; \
- public:
+#define ASMJIT_NONCOPYABLE(Type) \
+ Type(const Type& other) = delete; \
+ Type& operator=(const Type& other) = delete;
-#define ASMJIT_NONCONSTRUCTIBLE(...) \
- private: \
- __VA_ARGS__() = delete; \
- __VA_ARGS__(const __VA_ARGS__& other) = delete; \
- __VA_ARGS__& operator=(const __VA_ARGS__& other) = delete; \
- public:
+#define ASMJIT_NONCONSTRUCTIBLE(Type) \
+ Type() = delete; \
+ Type(const Type& other) = delete; \
+ Type& operator=(const Type& other) = delete;
+
+//! \def ASMJIT_DEFINE_ENUM_FLAGS(T)
+//!
+//! Defines bit operations for enumeration flags.
+#ifdef _DOXYGEN
+ #define ASMJIT_DEFINE_ENUM_FLAGS(T)
+#else
+ #define ASMJIT_DEFINE_ENUM_FLAGS(T) \
+ static ASMJIT_FORCE_INLINE constexpr T operator~(T a) noexcept { \
+ return T(~(std::underlying_type<T>::type)(a)); \
+ } \
+ \
+ static ASMJIT_FORCE_INLINE constexpr T operator|(T a, T b) noexcept { \
+ return T((std::underlying_type<T>::type)(a) | \
+ (std::underlying_type<T>::type)(b)); \
+ } \
+ static ASMJIT_FORCE_INLINE constexpr T operator&(T a, T b) noexcept { \
+ return T((std::underlying_type<T>::type)(a) & \
+ (std::underlying_type<T>::type)(b)); \
+ } \
+ static ASMJIT_FORCE_INLINE constexpr T operator^(T a, T b) noexcept { \
+ return T((std::underlying_type<T>::type)(a) ^ \
+ (std::underlying_type<T>::type)(b)); \
+ } \
+ \
+ static ASMJIT_FORCE_INLINE T& operator|=(T& a, T b) noexcept { \
+ a = T((std::underlying_type<T>::type)(a) | \
+ (std::underlying_type<T>::type)(b)); \
+ return a; \
+ } \
+ static ASMJIT_FORCE_INLINE T& operator&=(T& a, T b) noexcept { \
+ a = T((std::underlying_type<T>::type)(a) & \
+ (std::underlying_type<T>::type)(b)); \
+ return a; \
+ } \
+ static ASMJIT_FORCE_INLINE T& operator^=(T& a, T b) noexcept { \
+ a = T((std::underlying_type<T>::type)(a) ^ \
+ (std::underlying_type<T>::type)(b)); \
+ return a; \
+ }
+#endif
+
+//! \def ASMJIT_DEFINE_ENUM_COMPARE(T)
+//!
+//! Defines comparison operations for enumeration flags.
+#ifdef _DOXYGEN
+ #define ASMJIT_DEFINE_ENUM_COMPARE(T)
+#else
+ #define ASMJIT_DEFINE_ENUM_COMPARE(T) \
+ static ASMJIT_FORCE_INLINE bool operator<(T a, T b) noexcept { \
+ return (std::underlying_type<T>::type)(a) < (std::underlying_type<T>::type)(b); \
+ } \
+ static ASMJIT_FORCE_INLINE bool operator<=(T a, T b) noexcept { \
+ return (std::underlying_type<T>::type)(a) <= (std::underlying_type<T>::type)(b); \
+ } \
+ static ASMJIT_FORCE_INLINE bool operator>(T a, T b) noexcept { \
+ return (std::underlying_type<T>::type)(a) > (std::underlying_type<T>::type)(b); \
+ } \
+ static ASMJIT_FORCE_INLINE bool operator>=(T a, T b) noexcept { \
+ return (std::underlying_type<T>::type)(a) >= (std::underlying_type<T>::type)(b); \
+ }
+#endif
-// ============================================================================
-// [asmjit::Build - Globals - Cleanup]
-// ============================================================================
+// Cleanup Api-Config Specific Macros
+// ==================================
-// Cleanup definitions that are only used within this header file.
#undef ASMJIT_CXX_GNU
#undef ASMJIT_CXX_MAKE_VER
diff --git a/3rdparty/asmjit/src/asmjit/core/arch.cpp b/3rdparty/asmjit/src/asmjit/core/arch.cpp
deleted file mode 100644
index 7200897b0a0..00000000000
--- a/3rdparty/asmjit/src/asmjit/core/arch.cpp
+++ /dev/null
@@ -1,59 +0,0 @@
-// AsmJit - Machine code generation for C++
-//
-// * Official AsmJit Home Page: https://asmjit.com
-// * Official Github Repository: https://github.com/asmjit/asmjit
-//
-// Copyright (c) 2008-2020 The AsmJit Authors
-//
-// This software is provided 'as-is', without any express or implied
-// warranty. In no event will the authors be held liable for any damages
-// arising from the use of this software.
-//
-// Permission is granted to anyone to use this software for any purpose,
-// including commercial applications, and to alter it and redistribute it
-// freely, subject to the following restrictions:
-//
-// 1. The origin of this software must not be misrepresented; you must not
-// claim that you wrote the original software. If you use this software
-// in a product, an acknowledgment in the product documentation would be
-// appreciated but is not required.
-// 2. Altered source versions must be plainly marked as such, and must not be
-// misrepresented as being the original software.
-// 3. This notice may not be removed or altered from any source distribution.
-
-#include "../core/api-build_p.h"
-#include "../core/arch.h"
-
-#ifdef ASMJIT_BUILD_X86
- #include "../x86/x86archdata_p.h"
-#endif
-
-#ifdef ASMJIT_BUILD_ARM
- #include "../arm/armarchdata_p.h"
-#endif
-
-ASMJIT_BEGIN_NAMESPACE
-
-// ============================================================================
-// [asmjit::ArchUtils]
-// ============================================================================
-
-ASMJIT_FAVOR_SIZE Error ArchUtils::typeIdToRegInfo(uint32_t arch, uint32_t typeId, uint32_t* typeIdOut, RegInfo* regInfoOut) noexcept {
- // Zero the output in case the input is invalid.
- *typeIdOut = 0;
- regInfoOut->reset();
-
-#ifdef ASMJIT_BUILD_X86
- if (Environment::isFamilyX86(arch))
- return x86::ArchInternal::typeIdToRegInfo(arch, typeId, typeIdOut, regInfoOut);
-#endif
-
-#ifdef ASMJIT_BUILD_ARM
- if (Environment::isFamilyARM(arch))
- return arm::ArchInternal::typeIdToRegInfo(arch, typeId, typeIdOut, regInfoOut);
-#endif
-
- return DebugUtils::errored(kErrorInvalidArch);
-}
-
-ASMJIT_END_NAMESPACE
diff --git a/3rdparty/asmjit/src/asmjit/core/arch.h b/3rdparty/asmjit/src/asmjit/core/arch.h
deleted file mode 100644
index 4991a3330d3..00000000000
--- a/3rdparty/asmjit/src/asmjit/core/arch.h
+++ /dev/null
@@ -1,64 +0,0 @@
-// AsmJit - Machine code generation for C++
-//
-// * Official AsmJit Home Page: https://asmjit.com
-// * Official Github Repository: https://github.com/asmjit/asmjit
-//
-// Copyright (c) 2008-2020 The AsmJit Authors
-//
-// This software is provided 'as-is', without any express or implied
-// warranty. In no event will the authors be held liable for any damages
-// arising from the use of this software.
-//
-// Permission is granted to anyone to use this software for any purpose,
-// including commercial applications, and to alter it and redistribute it
-// freely, subject to the following restrictions:
-//
-// 1. The origin of this software must not be misrepresented; you must not
-// claim that you wrote the original software. If you use this software
-// in a product, an acknowledgment in the product documentation would be
-// appreciated but is not required.
-// 2. Altered source versions must be plainly marked as such, and must not be
-// misrepresented as being the original software.
-// 3. This notice may not be removed or altered from any source distribution.
-
-#ifndef ASMJIT_CORE_ARCH_H_INCLUDED
-#define ASMJIT_CORE_ARCH_H_INCLUDED
-
-#include "../core/environment.h"
-#include "../core/operand.h"
-
-ASMJIT_BEGIN_NAMESPACE
-
-//! \addtogroup asmjit_core
-//! \{
-
-// ============================================================================
-// [asmjit::ArchRegs]
-// ============================================================================
-
-//! Information about registers of a CPU architecture.
-struct ArchRegs {
- //! Register information and signatures indexed by `BaseReg::RegType`.
- RegInfo regInfo[BaseReg::kTypeMax + 1];
- //! Count (maximum) of registers per `BaseReg::RegType`.
- uint8_t regCount[BaseReg::kTypeMax + 1];
- //! Converts RegType to TypeId, see `Type::Id`.
- uint8_t regTypeToTypeId[BaseReg::kTypeMax + 1];
-};
-
-// ============================================================================
-// [asmjit::ArchUtils]
-// ============================================================================
-
-//! Architecture utilities.
-namespace ArchUtils {
-
-ASMJIT_API Error typeIdToRegInfo(uint32_t arch, uint32_t typeId, uint32_t* typeIdOut, RegInfo* regInfo) noexcept;
-
-} // {ArchUtils}
-
-//! \}
-
-ASMJIT_END_NAMESPACE
-
-#endif // ASMJIT_CORE_ARCH_H_INCLUDED
diff --git a/3rdparty/asmjit/src/asmjit/core/archcommons.h b/3rdparty/asmjit/src/asmjit/core/archcommons.h
new file mode 100644
index 00000000000..e9d2c84d722
--- /dev/null
+++ b/3rdparty/asmjit/src/asmjit/core/archcommons.h
@@ -0,0 +1,229 @@
+// This file is part of AsmJit project <https://asmjit.com>
+//
+// See asmjit.h or LICENSE.md for license and copyright information
+// SPDX-License-Identifier: Zlib
+
+#ifndef ASMJIT_CORE_ARCHCOMMONS_H_INCLUDED
+#define ASMJIT_CORE_ARCHCOMMONS_H_INCLUDED
+
+// This file provides architecture-specific classes that are required in the core library. For example Imm operand
+// allows to be created from arm::Shift in a const-expr way, so the arm::Shift must be provided. So this header file
+// provides everything architecture-specific that is used by the Core API.
+
+#include "../core/globals.h"
+
+ASMJIT_BEGIN_SUB_NAMESPACE(arm)
+
+//! \addtogroup asmjit_arm
+//! \{
+
+//! Condition code (both AArch32 & AArch64).
+//!
+//! \note This enumeration doesn't match condition code that is used in AArch32/AArch64 opcodes. In general this
+//! condition code is encoded as `(cc - 2) & 0xF` so that `kAL` condition code is zero and encoded as 0xE in opcode.
+//! This makes it easier to use a condition code as an instruction modifier that defaults to 'al'.
+enum class CondCode : uint8_t {
+ kAL = 0x00u, //!< (no condition code) (always)
+ kNA = 0x01u, //!< (not available) (special)
+ kEQ = 0x02u, //!< Z==1 (any_sign ==)
+ kNE = 0x03u, //!< Z==0 (any_sign !=)
+ kCS = 0x04u, //!< C==1 (unsigned >=)
+ kHS = 0x04u, //!< C==1 (unsigned >=)
+ kCC = 0x05u, //!< C==0 (unsigned < )
+ kLO = 0x05u, //!< C==0 (unsigned < )
+ kMI = 0x06u, //!< N==1 (is negative)
+ kPL = 0x07u, //!< N==0 (is positive or zero)
+ kVS = 0x08u, //!< V==1 (is overflow)
+ kVC = 0x09u, //!< V==0 (no overflow)
+ kHI = 0x0Au, //!< C==1 & Z==0 (unsigned > )
+ kLS = 0x0Bu, //!< C==0 | Z==1 (unsigned <=)
+ kGE = 0x0Cu, //!< N==V (signed >=)
+ kLT = 0x0Du, //!< N!=V (signed < )
+ kGT = 0x0Eu, //!< Z==0 & N==V (signed > )
+ kLE = 0x0Fu, //!< Z==1 | N!=V (signed <=)
+
+ kSign = kMI, //!< Sign.
+ kNotSign = kPL, //!< Not sign.
+
+ kOverflow = kVS, //!< Signed overflow.
+ kNotOverflow = kVC, //!< Not signed overflow.
+
+ kEqual = kEQ, //!< Equal `a == b`.
+ kNotEqual = kNE, //!< Not Equal `a != b`.
+
+ kZero = kEQ, //!< Zero (alias to equal).
+ kNotZero = kNE, //!< Not Zero (alias to Not Equal).
+
+ kNegative = kMI, //!< Negative.
+ kPositive = kPL, //!< Positive or zero.
+
+ kSignedLT = kLT, //!< Signed `a < b`.
+ kSignedLE = kLE, //!< Signed `a <= b`.
+ kSignedGT = kGT, //!< Signed `a > b`.
+ kSignedGE = kGE, //!< Signed `a >= b`.
+
+ kUnsignedLT = kLO, //!< Unsigned `a < b`.
+ kUnsignedLE = kLS, //!< Unsigned `a <= b`.
+ kUnsignedGT = kHI, //!< Unsigned `a > b`.
+ kUnsignedGE = kHS, //!< Unsigned `a >= b`.
+
+ kAlways = kAL, //!< No condition code (always).
+
+ kMaxValue = 0x0Fu //!< Maximum value of `CondCode`.
+};
+
+//! Negates a condition code.
+static inline constexpr CondCode negateCond(CondCode cond) noexcept { return CondCode(uint8_t(cond) ^ uint8_t(1)); }
+
+//! Data type that can be encoded with the instruction (AArch32 only).
+enum class DataType : uint32_t {
+ //! No data type specified (default for all general purpose instructions).
+ kNone = 0,
+ //! 8-bit signed integer, specified as `.s8` in assembly.
+ kS8 = 1,
+ //! 16-bit signed integer, specified as `.s16` in assembly.
+ kS16 = 2,
+ //! 32-bit signed integer, specified as `.s32` in assembly.
+ kS32 = 3,
+ //! 64-bit signed integer, specified as `.s64` in assembly.
+ kS64 = 4,
+ //! 8-bit unsigned integer, specified as `.u8` in assembly.
+ kU8 = 5,
+ //! 16-bit unsigned integer, specified as `.u16` in assembly.
+ kU16 = 6,
+ //! 32-bit unsigned integer, specified as `.u32` in assembly.
+ kU32 = 7,
+ //! 64-bit unsigned integer, specified as `.u64` in assembly.
+ kU64 = 8,
+ //! 16-bit floating point (half precision), specified as `.f16` in assembly.
+ kF16 = 10,
+ //! 32-bit floating point (single precision), specified as `.f32` in assembly.
+ kF32 = 11,
+ //! 64-bit floating point (double precision), specified as `.f64` in assembly.
+ kF64 = 12,
+ //! 8-bit polynomial.
+ kP8 = 13,
+ //! 64-bit polynomial.
+ kP64 = 15,
+
+ //! Maximum value of `DataType`.
+ kMaxValue = 15
+};
+
+//! Shift operation predicate (ARM) describes either SHIFT or EXTEND operation.
+//!
+//! \note The constants are AsmJit specific. The first 5 values describe real constants on ARM32 and AArch64 hardware,
+//! however, the addition constants that describe extend modes are specific to AsmJit and would be translated to the
+//! AArch64 specific constants by the assembler.
+enum class ShiftOp : uint32_t {
+ //! Shift left logical operation (default).
+ //!
+ //! Available to all ARM architectures.
+ kLSL = 0x00u,
+
+ //! Shift right logical operation.
+ //!
+ //! Available to all ARM architectures.
+ kLSR = 0x01u,
+
+ //! Shift right arithmetic operation.
+ //!
+ //! Available to all ARM architectures.
+ kASR = 0x02u,
+
+ //! Rotate right operation (AArch32 only).
+ kROR = 0x03u,
+
+ //! Rotate right with carry operation (encoded as `ShiftOp::kROR` with zero) (AArch32 only).
+ kRRX = 0x04u,
+
+ //! Shift left by filling low order bits with ones.
+ kMSL = 0x05u,
+
+ //! UXTN extend register operation (AArch64 only).
+ kUXTB = 0x06u,
+ //! UXTH extend register operation (AArch64 only).
+ kUXTH = 0x07u,
+ //! UXTW extend register operation (AArch64 only).
+ kUXTW = 0x08u,
+ //! UXTX extend register operation (AArch64 only).
+ kUXTX = 0x09u,
+
+ //! SXTB extend register operation (AArch64 only).
+ kSXTB = 0x0Au,
+ //! SXTH extend register operation (AArch64 only).
+ kSXTH = 0x0Bu,
+ //! SXTW extend register operation (AArch64 only).
+ kSXTW = 0x0Cu,
+ //! SXTX extend register operation (AArch64 only).
+ kSXTX = 0x0Du
+
+ // NOTE: 0xE and 0xF are used by memory operand to specify POST|PRE offset mode.
+};
+
+//! Represents ARM immediate shift operation type and value.
+class Shift {
+public:
+ //! Shift operation.
+ ShiftOp _op;
+ //! Shift Value.
+ uint32_t _value;
+
+ //! Default constructed Shift is not initialized.
+ inline Shift() noexcept = default;
+
+ //! Copy constructor (default)
+ constexpr Shift(const Shift& other) noexcept = default;
+
+ //! Constructs Shift from operation `op` and shift `value`.
+ constexpr Shift(ShiftOp op, uint32_t value) noexcept
+ : _op(op),
+ _value(value) {}
+
+ //! Returns the shift operation.
+ constexpr ShiftOp op() const noexcept { return _op; }
+ //! Sets shift operation to `op`.
+ inline void setOp(ShiftOp op) noexcept { _op = op; }
+
+ //! Returns the shift smount.
+ constexpr uint32_t value() const noexcept { return _value; }
+ //! Sets shift amount to `value`.
+ inline void setValue(uint32_t value) noexcept { _value = value; }
+};
+
+//! Constructs a `LSL #value` shift (logical shift left).
+static constexpr Shift lsl(uint32_t value) noexcept { return Shift(ShiftOp::kLSL, value); }
+//! Constructs a `LSR #value` shift (logical shift right).
+static constexpr Shift lsr(uint32_t value) noexcept { return Shift(ShiftOp::kLSR, value); }
+//! Constructs a `ASR #value` shift (arithmetic shift right).
+static constexpr Shift asr(uint32_t value) noexcept { return Shift(ShiftOp::kASR, value); }
+//! Constructs a `ROR #value` shift (rotate right).
+static constexpr Shift ror(uint32_t value) noexcept { return Shift(ShiftOp::kROR, value); }
+//! Constructs a `RRX` shift (rotate with carry by 1).
+static constexpr Shift rrx() noexcept { return Shift(ShiftOp::kRRX, 0); }
+//! Constructs a `MSL #value` shift (logical shift left filling ones).
+static constexpr Shift msl(uint32_t value) noexcept { return Shift(ShiftOp::kMSL, value); }
+
+//! Constructs a `UXTB #value` extend and shift (unsigned byte extend).
+static constexpr Shift uxtb(uint32_t value) noexcept { return Shift(ShiftOp::kUXTB, value); }
+//! Constructs a `UXTH #value` extend and shift (unsigned hword extend).
+static constexpr Shift uxth(uint32_t value) noexcept { return Shift(ShiftOp::kUXTH, value); }
+//! Constructs a `UXTW #value` extend and shift (unsigned word extend).
+static constexpr Shift uxtw(uint32_t value) noexcept { return Shift(ShiftOp::kUXTW, value); }
+//! Constructs a `UXTX #value` extend and shift (unsigned dword extend).
+static constexpr Shift uxtx(uint32_t value) noexcept { return Shift(ShiftOp::kUXTX, value); }
+
+//! Constructs a `SXTB #value` extend and shift (signed byte extend).
+static constexpr Shift sxtb(uint32_t value) noexcept { return Shift(ShiftOp::kSXTB, value); }
+//! Constructs a `SXTH #value` extend and shift (signed hword extend).
+static constexpr Shift sxth(uint32_t value) noexcept { return Shift(ShiftOp::kSXTH, value); }
+//! Constructs a `SXTW #value` extend and shift (signed word extend).
+static constexpr Shift sxtw(uint32_t value) noexcept { return Shift(ShiftOp::kSXTW, value); }
+//! Constructs a `SXTX #value` extend and shift (signed dword extend).
+static constexpr Shift sxtx(uint32_t value) noexcept { return Shift(ShiftOp::kSXTX, value); }
+
+//! \}
+
+ASMJIT_END_SUB_NAMESPACE
+
+#endif // ASMJIT_CORE_ARCHCOMMONS_H_INCLUDED
diff --git a/3rdparty/asmjit/src/asmjit/core/archtraits.cpp b/3rdparty/asmjit/src/asmjit/core/archtraits.cpp
new file mode 100644
index 00000000000..fc825df8009
--- /dev/null
+++ b/3rdparty/asmjit/src/asmjit/core/archtraits.cpp
@@ -0,0 +1,160 @@
+// This file is part of AsmJit project <https://asmjit.com>
+//
+// See asmjit.h or LICENSE.md for license and copyright information
+// SPDX-License-Identifier: Zlib
+
+#include "../core/api-build_p.h"
+#include "../core/archtraits.h"
+#include "../core/misc_p.h"
+
+#if !defined(ASMJIT_NO_X86)
+ #include "../x86/x86archtraits_p.h"
+#endif
+
+#if !defined(ASMJIT_NO_AARCH64)
+ #include "../arm/a64archtraits_p.h"
+#endif
+
+ASMJIT_BEGIN_NAMESPACE
+
+static const constexpr ArchTraits noArchTraits = {
+ // SP/FP/LR/PC.
+ 0xFF, 0xFF, 0xFF, 0xFF,
+
+ // Reserved,
+ { 0, 0, 0 },
+
+ // HW stack alignment.
+ 0,
+
+ // Min/Max stack offset.
+ 0, 0,
+
+ // ISA features [Gp, Vec, Other0, Other1].
+ {{
+ InstHints::kNoHints,
+ InstHints::kNoHints,
+ InstHints::kNoHints,
+ InstHints::kNoHints
+ }},
+
+ // RegTypeToSignature.
+ #define V(index) OperandSignature{0}
+ {{ ASMJIT_LOOKUP_TABLE_32(V, 0) }},
+ #undef V
+
+ // RegTypeToTypeId.
+ #define V(index) TypeId::kVoid
+ {{ ASMJIT_LOOKUP_TABLE_32(V, 0) }},
+ #undef V
+
+ // TypeIdToRegType.
+ #define V(index) RegType::kNone
+ {{ ASMJIT_LOOKUP_TABLE_32(V, 0) }},
+ #undef V
+
+ // Word names of 8-bit, 16-bit, 32-bit, and 64-bit quantities.
+ {
+ ArchTypeNameId::kByte,
+ ArchTypeNameId::kHalf,
+ ArchTypeNameId::kWord,
+ ArchTypeNameId::kQuad
+ }
+};
+
+ASMJIT_VARAPI const ArchTraits _archTraits[uint32_t(Arch::kMaxValue) + 1] = {
+ // No architecture.
+ noArchTraits,
+
+ // X86/X86 architectures.
+#if !defined(ASMJIT_NO_X86)
+ x86::x86ArchTraits,
+ x86::x64ArchTraits,
+#else
+ noArchTraits,
+ noArchTraits,
+#endif
+
+ // RISCV32/RISCV64 architectures.
+ noArchTraits,
+ noArchTraits,
+
+ // ARM architecture
+ noArchTraits,
+
+ // AArch64 architecture.
+#if !defined(ASMJIT_NO_AARCH64)
+ a64::a64ArchTraits,
+#else
+ noArchTraits,
+#endif
+
+ // ARM/Thumb architecture.
+ noArchTraits,
+
+ // Reserved.
+ noArchTraits,
+
+ // MIPS32/MIPS64
+ noArchTraits,
+ noArchTraits
+};
+
+ASMJIT_FAVOR_SIZE Error ArchUtils::typeIdToRegSignature(Arch arch, TypeId typeId, TypeId* typeIdOut, OperandSignature* regSignatureOut) noexcept {
+ const ArchTraits& archTraits = ArchTraits::byArch(arch);
+
+ // TODO: Remove this, should never be used like this.
+ // Passed RegType instead of TypeId?
+ if (uint32_t(typeId) <= uint32_t(RegType::kMaxValue))
+ typeId = archTraits.regTypeToTypeId(RegType(uint32_t(typeId)));
+
+ if (ASMJIT_UNLIKELY(!TypeUtils::isValid(typeId)))
+ return DebugUtils::errored(kErrorInvalidTypeId);
+
+ // First normalize architecture dependent types.
+ if (TypeUtils::isAbstract(typeId)) {
+ bool is32Bit = Environment::is32Bit(arch);
+ if (typeId == TypeId::kIntPtr)
+ typeId = is32Bit ? TypeId::kInt32 : TypeId::kInt64;
+ else
+ typeId = is32Bit ? TypeId::kUInt32 : TypeId::kUInt64;
+ }
+
+ // Type size helps to construct all groups of registers.
+ // TypeId is invalid if the size is zero.
+ uint32_t size = TypeUtils::sizeOf(typeId);
+ if (ASMJIT_UNLIKELY(!size))
+ return DebugUtils::errored(kErrorInvalidTypeId);
+
+ if (ASMJIT_UNLIKELY(typeId == TypeId::kFloat80))
+ return DebugUtils::errored(kErrorInvalidUseOfF80);
+
+ RegType regType = RegType::kNone;
+ if (TypeUtils::isBetween(typeId, TypeId::_kBaseStart, TypeId::_kVec32Start)) {
+ regType = archTraits._typeIdToRegType[uint32_t(typeId) - uint32_t(TypeId::_kBaseStart)];
+ if (regType == RegType::kNone) {
+ if (typeId == TypeId::kInt64 || typeId == TypeId::kUInt64)
+ return DebugUtils::errored(kErrorInvalidUseOfGpq);
+ else
+ return DebugUtils::errored(kErrorInvalidTypeId);
+ }
+ }
+ else {
+ if (size <= 8 && archTraits._regSignature[RegType::kVec64].isValid())
+ regType = RegType::kVec64;
+ else if (size <= 16 && archTraits._regSignature[RegType::kVec128].isValid())
+ regType = RegType::kVec128;
+ else if (size == 32 && archTraits._regSignature[RegType::kVec256].isValid())
+ regType = RegType::kVec256;
+ else if (archTraits._regSignature[RegType::kVec512].isValid())
+ regType = RegType::kVec512;
+ else
+ return DebugUtils::errored(kErrorInvalidTypeId);
+ }
+
+ *typeIdOut = typeId;
+ *regSignatureOut = archTraits.regTypeToSignature(regType);
+ return kErrorOk;
+}
+
+ASMJIT_END_NAMESPACE
diff --git a/3rdparty/asmjit/src/asmjit/core/archtraits.h b/3rdparty/asmjit/src/asmjit/core/archtraits.h
new file mode 100644
index 00000000000..4d05c11096b
--- /dev/null
+++ b/3rdparty/asmjit/src/asmjit/core/archtraits.h
@@ -0,0 +1,290 @@
+// This file is part of AsmJit project <https://asmjit.com>
+//
+// See asmjit.h or LICENSE.md for license and copyright information
+// SPDX-License-Identifier: Zlib
+
+#ifndef ASMJIT_CORE_ARCHTRAITS_H_INCLUDED
+#define ASMJIT_CORE_ARCHTRAITS_H_INCLUDED
+
+#include "../core/operand.h"
+#include "../core/support.h"
+#include "../core/type.h"
+
+ASMJIT_BEGIN_NAMESPACE
+
+//! \addtogroup asmjit_core
+//! \{
+
+//! Instruction set architecture (ISA).
+enum class Arch : uint8_t {
+ //! Unknown or uninitialized ISA.
+ kUnknown = 0,
+
+ //! 32-bit X86 ISA.
+ kX86 = 1,
+ //! 64-bit X86 ISA also known as X64, X86_64, and AMD64.
+ kX64 = 2,
+
+ //! 32-bit RISC-V ISA.
+ kRISCV32 = 3,
+ //! 64-bit RISC-V ISA.
+ kRISCV64 = 4,
+
+ //! 32-bit ARM ISA (little endian).
+ kARM = 5,
+ //! 64-bit ARM ISA in (little endian).
+ kAArch64 = 6,
+ //! 32-bit ARM ISA in Thumb mode (little endian).
+ kThumb = 7,
+
+ // 8 is not used at the moment, even numbers are 64-bit architectures.
+
+ //! 32-bit MIPS ISA in (little endian).
+ kMIPS32_LE = 9,
+ //! 64-bit MIPS ISA in (little endian).
+ kMIPS64_LE = 10,
+
+ //! 32-bit ARM ISA (big endian).
+ kARM_BE = 11,
+ //! 64-bit ARM ISA in (big endian).
+ kAArch64_BE = 12,
+ //! 32-bit ARM ISA in Thumb mode (big endian).
+ kThumb_BE = 13,
+
+ // 14 is not used at the moment, even numbers are 64-bit architectures.
+
+ //! 32-bit MIPS ISA in (big endian).
+ kMIPS32_BE = 15,
+ //! 64-bit MIPS ISA in (big endian).
+ kMIPS64_BE = 16,
+
+ //! Maximum value of `Arch`.
+ kMaxValue = kMIPS64_BE,
+
+ //! Mask used by 32-bit ISAs (odd are 32-bit, even are 64-bit).
+ k32BitMask = 0x01,
+ //! First big-endian architecture.
+ kBigEndian = kARM_BE,
+
+ //! ISA detected at compile-time (ISA of the host).
+ kHost =
+#if defined(_DOXYGEN)
+ DETECTED_AT_COMPILE_TIME
+#else
+ ASMJIT_ARCH_X86 == 32 ? kX86 :
+ ASMJIT_ARCH_X86 == 64 ? kX64 :
+
+ ASMJIT_ARCH_ARM == 32 && ASMJIT_ARCH_LE ? kARM :
+ ASMJIT_ARCH_ARM == 32 && ASMJIT_ARCH_BE ? kARM_BE :
+ ASMJIT_ARCH_ARM == 64 && ASMJIT_ARCH_LE ? kAArch64 :
+ ASMJIT_ARCH_ARM == 64 && ASMJIT_ARCH_BE ? kAArch64_BE :
+
+ ASMJIT_ARCH_MIPS == 32 && ASMJIT_ARCH_LE ? kMIPS32_LE :
+ ASMJIT_ARCH_MIPS == 32 && ASMJIT_ARCH_BE ? kMIPS32_BE :
+ ASMJIT_ARCH_MIPS == 64 && ASMJIT_ARCH_LE ? kMIPS64_LE :
+ ASMJIT_ARCH_MIPS == 64 && ASMJIT_ARCH_BE ? kMIPS64_BE :
+
+ kUnknown
+#endif
+};
+
+//! Sub-architecture.
+enum class SubArch : uint8_t {
+ //! Unknown or uninitialized architecture sub-type.
+ kUnknown = 0,
+
+ //! Maximum value of `SubArch`.
+ kMaxValue = kUnknown,
+
+ //! Sub-architecture detected at compile-time (sub-architecture of the host).
+ kHost =
+#if defined(_DOXYGEN)
+ DETECTED_AT_COMPILE_TIME
+#else
+ kUnknown
+#endif
+};
+
+//! Identifier used to represent names of different data types across architectures.
+enum class ArchTypeNameId : uint8_t {
+ //! Describes 'db' (X86/X86_64 convention, always 8-bit quantity).
+ kDB = 0,
+ //! Describes 'dw' (X86/X86_64 convention, always 16-bit word).
+ kDW,
+ //! Describes 'dd' (X86/X86_64 convention, always 32-bit word).
+ kDD,
+ //! Describes 'dq' (X86/X86_64 convention, always 64-bit word).
+ kDQ,
+ //! Describes 'byte' (always 8-bit quantity).
+ kByte,
+ //! Describes 'half' (most likely 16-bit word).
+ kHalf,
+ //! Describes 'word' (either 16-bit or 32-bit word).
+ kWord,
+ //! Describes 'hword' (most likely 16-bit word).
+ kHWord,
+ //! Describes 'dword' (either 32-bit or 64-bit word).
+ kDWord,
+ //! Describes 'qword' (64-bit word).
+ kQWord,
+ //! Describes 'xword' (64-bit word).
+ kXWord,
+ //! Describes 'short' (always 16-bit word).
+ kShort,
+ //! Describes 'long' (most likely 32-bit word).
+ kLong,
+ //! Describes 'quad' (64-bit word).
+ kQuad,
+
+ //! Maximum value of `ArchTypeNameId`.
+ kMaxValue = kQuad
+};
+
+//! Instruction feature hints for each register group provided by \ref ArchTraits.
+//!
+//! Instruction feature hints describe miscellaneous instructions provided by the architecture that can be used by
+//! register allocator to make certain things simpler - like register swaps or emitting register push/pop sequences.
+//!
+//! \remarks Instruction feature hints are only defined for register groups that can be used with \ref
+//! asmjit_compiler infrastructure. Register groups that are not managed by Compiler are not provided by
+//! \ref ArchTraits and cannot be queried.
+enum class InstHints : uint8_t {
+ //! No feature hints.
+ kNoHints = 0,
+
+ //! Architecture supports a register swap by using a single instructio.
+ kRegSwap = 0x01u,
+ //! Architecture provides push/pop instructions.
+ kPushPop = 0x02u
+};
+ASMJIT_DEFINE_ENUM_FLAGS(InstHints)
+
+//! Architecture traits used by Function API and Compiler's register allocator.
+struct ArchTraits {
+ //! \name Members
+ //! \{
+
+ //! Stack pointer register id.
+ uint8_t _spRegId;
+ //! Frame pointer register id.
+ uint8_t _fpRegId;
+ //! Link register id.
+ uint8_t _linkRegId;
+ //! Instruction pointer (or program counter) register id, if accessible.
+ uint8_t _ipRegId;
+
+ // Reserved.
+ uint8_t _reserved[3];
+ //! Hardware stack alignment requirement.
+ uint8_t _hwStackAlignment;
+
+ //! Minimum addressable offset on stack guaranteed for all instructions.
+ uint32_t _minStackOffset;
+ //! Maximum addressable offset on stack depending on specific instruction.
+ uint32_t _maxStackOffset;
+
+ //! Flags for each virtual register group.
+ Support::Array<InstHints, Globals::kNumVirtGroups> _instHints;
+
+ //! Maps register type into a signature, that provides group, size and can be used to construct register operands.
+ Support::Array<OperandSignature, uint32_t(RegType::kMaxValue) + 1> _regSignature;
+ //! Maps a register to type-id, see \ref TypeId.
+ Support::Array<TypeId, uint32_t(RegType::kMaxValue) + 1> _regTypeToTypeId;
+ //! Maps scalar TypeId values (from TypeId::_kIdBaseStart) to register types, see \ref TypeId.
+ Support::Array<RegType, 32> _typeIdToRegType;
+
+ //! Word name identifiers of 8-bit, 16-bit, 32-biit, and 64-bit quantities that appear in formatted text.
+ ArchTypeNameId _typeNameIdTable[4];
+
+ //! \}
+
+ //! \name Accessors
+ //! \{
+
+ //! Returns stack pointer register id.
+ inline uint32_t spRegId() const noexcept { return _spRegId; }
+ //! Returns stack frame register id.
+ inline uint32_t fpRegId() const noexcept { return _fpRegId; }
+ //! Returns link register id, if the architecture provides it.
+ inline uint32_t linkRegId() const noexcept { return _linkRegId; }
+ //! Returns instruction pointer register id, if the architecture provides it.
+ inline uint32_t ipRegId() const noexcept { return _ipRegId; }
+
+ //! Returns a hardware stack alignment requirement.
+ //!
+ //! \note This is a hardware constraint. Architectures that don't constrain it would return the lowest alignment
+ //! (1), however, some architectures may constrain the alignment, for example AArch64 requires 16-byte alignment.
+ inline uint32_t hwStackAlignment() const noexcept { return _hwStackAlignment; }
+
+ //! Tests whether the architecture provides link register, which is used across function calls. If the link
+ //! register is not provided then a function call pushes the return address on stack (X86/X64).
+ inline bool hasLinkReg() const noexcept { return _linkRegId != BaseReg::kIdBad; }
+
+ //! Returns minimum addressable offset on stack guaranteed for all instructions.
+ inline uint32_t minStackOffset() const noexcept { return _minStackOffset; }
+ //! Returns maximum addressable offset on stack depending on specific instruction.
+ inline uint32_t maxStackOffset() const noexcept { return _maxStackOffset; }
+
+ //! Returns ISA flags of the given register `group`.
+ inline InstHints instFeatureHints(RegGroup group) const noexcept { return _instHints[group]; }
+ //! Tests whether the given register `group` has the given `flag` set.
+ inline bool hasInstHint(RegGroup group, InstHints feature) const noexcept { return Support::test(_instHints[group], feature); }
+ //! Tests whether the ISA provides register swap instruction for the given register `group`.
+ inline bool hasInstRegSwap(RegGroup group) const noexcept { return hasInstHint(group, InstHints::kRegSwap); }
+ //! Tests whether the ISA provides push/pop instructions for the given register `group`.
+ inline bool hasInstPushPop(RegGroup group) const noexcept { return hasInstHint(group, InstHints::kPushPop); }
+
+ inline bool hasRegType(RegType type) const noexcept {
+ return type <= RegType::kMaxValue && _regSignature[type].isValid();
+ }
+
+ //! Returns an operand signature from the given register `type` of this architecture.
+ inline OperandSignature regTypeToSignature(RegType type) const noexcept { return _regSignature[type]; }
+ //! Returns a register from the given register `type` of this architecture.
+ inline RegGroup regTypeToGroup(RegType type) const noexcept { return _regSignature[type].regGroup(); }
+ //! Returns a register size the given register `type` of this architecture.
+ inline uint32_t regTypeToSize(RegType type) const noexcept { return _regSignature[type].size(); }
+ //! Returns a corresponding `TypeId` from the given register `type` of this architecture.
+ inline TypeId regTypeToTypeId(RegType type) const noexcept { return _regTypeToTypeId[type]; }
+
+ //! Returns a table of ISA word names that appear in formatted text. Word names are ISA dependent.
+ //!
+ //! The index of this table is log2 of the size:
+ //! - [0] 8-bits
+ //! - [1] 16-bits
+ //! - [2] 32-bits
+ //! - [3] 64-bits
+ inline const ArchTypeNameId* typeNameIdTable() const noexcept { return _typeNameIdTable; }
+
+ //! Returns an ISA word name identifier of the given `index`, see \ref typeNameIdTable() for more details.
+ inline ArchTypeNameId typeNameIdByIndex(uint32_t index) const noexcept { return _typeNameIdTable[index]; }
+
+ //! \}
+
+ //! \name Statics
+ //! \{
+
+ //! Returns a const reference to `ArchTraits` for the given architecture `arch`.
+ static inline const ArchTraits& byArch(Arch arch) noexcept;
+
+ //! \}
+};
+
+ASMJIT_VARAPI const ArchTraits _archTraits[uint32_t(Arch::kMaxValue) + 1];
+
+//! \cond
+inline const ArchTraits& ArchTraits::byArch(Arch arch) noexcept { return _archTraits[uint32_t(arch)]; }
+//! \endcond
+
+//! Architecture utilities.
+namespace ArchUtils {
+
+ASMJIT_API Error typeIdToRegSignature(Arch arch, TypeId typeId, TypeId* typeIdOut, OperandSignature* regSignatureOut) noexcept;
+
+} // {ArchUtils}
+
+//! \}
+
+ASMJIT_END_NAMESPACE
+
+#endif // ASMJIT_CORE_ARCHTRAITS_H_INCLUDED
diff --git a/3rdparty/asmjit/src/asmjit/core/assembler.cpp b/3rdparty/asmjit/src/asmjit/core/assembler.cpp
index 2eea9cbae94..d6c87627ec4 100644
--- a/3rdparty/asmjit/src/asmjit/core/assembler.cpp
+++ b/3rdparty/asmjit/src/asmjit/core/assembler.cpp
@@ -1,29 +1,11 @@
-// AsmJit - Machine code generation for C++
+// This file is part of AsmJit project <https://asmjit.com>
//
-// * Official AsmJit Home Page: https://asmjit.com
-// * Official Github Repository: https://github.com/asmjit/asmjit
-//
-// Copyright (c) 2008-2020 The AsmJit Authors
-//
-// This software is provided 'as-is', without any express or implied
-// warranty. In no event will the authors be held liable for any damages
-// arising from the use of this software.
-//
-// Permission is granted to anyone to use this software for any purpose,
-// including commercial applications, and to alter it and redistribute it
-// freely, subject to the following restrictions:
-//
-// 1. The origin of this software must not be misrepresented; you must not
-// claim that you wrote the original software. If you use this software
-// in a product, an acknowledgment in the product documentation would be
-// appreciated but is not required.
-// 2. Altered source versions must be plainly marked as such, and must not be
-// misrepresented as being the original software.
-// 3. This notice may not be removed or altered from any source distribution.
+// See asmjit.h or LICENSE.md for license and copyright information
+// SPDX-License-Identifier: Zlib
#include "../core/api-build_p.h"
#include "../core/assembler.h"
-#include "../core/codebufferwriter_p.h"
+#include "../core/codewriter_p.h"
#include "../core/constpool.h"
#include "../core/emitterutils_p.h"
#include "../core/formatter.h"
@@ -32,21 +14,16 @@
ASMJIT_BEGIN_NAMESPACE
-// ============================================================================
-// [asmjit::BaseAssembler - Construction / Destruction]
-// ============================================================================
+// BaseAssembler - Construction & Destruction
+// ==========================================
BaseAssembler::BaseAssembler() noexcept
- : BaseEmitter(kTypeAssembler),
- _section(nullptr),
- _bufferData(nullptr),
- _bufferEnd(nullptr),
- _bufferPtr(nullptr) {}
+ : BaseEmitter(EmitterType::kAssembler) {}
+
BaseAssembler::~BaseAssembler() noexcept {}
-// ============================================================================
-// [asmjit::BaseAssembler - Buffer Management]
-// ============================================================================
+// BaseAssembler - Buffer Management
+// =================================
Error BaseAssembler::setOffset(size_t offset) {
if (ASMJIT_UNLIKELY(!_code))
@@ -60,9 +37,8 @@ Error BaseAssembler::setOffset(size_t offset) {
return kErrorOk;
}
-// ============================================================================
-// [asmjit::BaseAssembler - Section Management]
-// ============================================================================
+// BaseAssembler - Section Management
+// ==================================
static void BaseAssembler_initSection(BaseAssembler* self, Section* section) noexcept {
uint8_t* p = section->_buffer._data;
@@ -89,9 +65,8 @@ Error BaseAssembler::section(Section* section) {
return kErrorOk;
}
-// ============================================================================
-// [asmjit::BaseAssembler - Label Management]
-// ============================================================================
+// BaseAssembler - Label Management
+// ================================
Label BaseAssembler::newLabel() {
uint32_t labelId = Globals::kInvalidId;
@@ -106,7 +81,7 @@ Label BaseAssembler::newLabel() {
return Label(labelId);
}
-Label BaseAssembler::newNamedLabel(const char* name, size_t nameSize, uint32_t type, uint32_t parentId) {
+Label BaseAssembler::newNamedLabel(const char* name, size_t nameSize, LabelType type, uint32_t parentId) {
uint32_t labelId = Globals::kInvalidId;
if (ASMJIT_LIKELY(_code)) {
LabelEntry* le;
@@ -137,22 +112,8 @@ Error BaseAssembler::bind(const Label& label) {
return kErrorOk;
}
-// ============================================================================
-// [asmjit::BaseAssembler - Embed]
-// ============================================================================
-
-#ifndef ASMJIT_NO_LOGGING
-struct DataSizeByPower {
- char str[4];
-};
-
-static const DataSizeByPower dataSizeByPowerTable[] = {
- { "db" },
- { "dw" },
- { "dd" },
- { "dq" }
-};
-#endif
+// BaseAssembler - Embed
+// =====================
Error BaseAssembler::embed(const void* data, size_t dataSize) {
if (ASMJIT_UNLIKELY(!_code))
@@ -161,59 +122,77 @@ Error BaseAssembler::embed(const void* data, size_t dataSize) {
if (dataSize == 0)
return kErrorOk;
- CodeBufferWriter writer(this);
+ CodeWriter writer(this);
ASMJIT_PROPAGATE(writer.ensureSpace(this, dataSize));
writer.emitData(data, dataSize);
+ writer.done(this);
#ifndef ASMJIT_NO_LOGGING
- if (_logger)
- _logger->logBinary(data, dataSize);
+ if (_logger) {
+ StringTmp<512> sb;
+ Formatter::formatData(sb, _logger->flags(), arch(), TypeId::kUInt8, data, dataSize, 1);
+ sb.append('\n');
+ _logger->log(sb);
+ }
#endif
- writer.done(this);
return kErrorOk;
}
-Error BaseAssembler::embedDataArray(uint32_t typeId, const void* data, size_t itemCcount, size_t repeatCount) {
- uint32_t deabstractDelta = Type::deabstractDeltaOfSize(registerSize());
- uint32_t finalTypeId = Type::deabstract(typeId, deabstractDelta);
+Error BaseAssembler::embedDataArray(TypeId typeId, const void* data, size_t itemCount, size_t repeatCount) {
+ uint32_t deabstractDelta = TypeUtils::deabstractDeltaOfSize(registerSize());
+ TypeId finalTypeId = TypeUtils::deabstract(typeId, deabstractDelta);
- if (ASMJIT_UNLIKELY(!Type::isValid(finalTypeId)))
+ if (ASMJIT_UNLIKELY(!TypeUtils::isValid(finalTypeId)))
return reportError(DebugUtils::errored(kErrorInvalidArgument));
- if (itemCcount == 0 || repeatCount == 0)
+ if (itemCount == 0 || repeatCount == 0)
return kErrorOk;
- uint32_t typeSize = Type::sizeOf(finalTypeId);
+ uint32_t typeSize = TypeUtils::sizeOf(finalTypeId);
Support::FastUInt8 of = 0;
- size_t dataSize = Support::mulOverflow(itemCcount, size_t(typeSize), &of);
+ size_t dataSize = Support::mulOverflow(itemCount, size_t(typeSize), &of);
size_t totalSize = Support::mulOverflow(dataSize, repeatCount, &of);
if (ASMJIT_UNLIKELY(of))
return reportError(DebugUtils::errored(kErrorOutOfMemory));
- CodeBufferWriter writer(this);
+ CodeWriter writer(this);
ASMJIT_PROPAGATE(writer.ensureSpace(this, totalSize));
-#ifndef ASMJIT_NO_LOGGING
- const uint8_t* start = writer.cursor();
-#endif
-
- for (size_t i = 0; i < repeatCount; i++) {
+ for (size_t i = 0; i < repeatCount; i++)
writer.emitData(data, dataSize);
- }
+
+ writer.done(this);
#ifndef ASMJIT_NO_LOGGING
- if (_logger)
- _logger->logBinary(start, totalSize);
+ if (_logger) {
+ StringTmp<512> sb;
+ Formatter::formatData(sb, _logger->flags(), arch(), typeId, data, itemCount, repeatCount);
+ sb.append('\n');
+ _logger->log(sb);
+ }
#endif
- writer.done(this);
return kErrorOk;
}
+#ifndef ASMJIT_NO_LOGGING
+static const TypeId dataTypeIdBySize[9] = {
+ TypeId::kVoid, // [0] (invalid)
+ TypeId::kUInt8, // [1] (uint8_t)
+ TypeId::kUInt16, // [2] (uint16_t)
+ TypeId::kVoid, // [3] (invalid)
+ TypeId::kUInt32, // [4] (uint32_t)
+ TypeId::kVoid, // [5] (invalid)
+ TypeId::kVoid, // [6] (invalid)
+ TypeId::kVoid, // [7] (invalid)
+ TypeId::kUInt64 // [8] (uint64_t)
+};
+#endif
+
Error BaseAssembler::embedConstPool(const Label& label, const ConstPool& pool) {
if (ASMJIT_UNLIKELY(!_code))
return reportError(DebugUtils::errored(kErrorNotInitialized));
@@ -221,27 +200,40 @@ Error BaseAssembler::embedConstPool(const Label& label, const ConstPool& pool) {
if (ASMJIT_UNLIKELY(!isLabelValid(label)))
return reportError(DebugUtils::errored(kErrorInvalidLabel));
- ASMJIT_PROPAGATE(align(kAlignData, uint32_t(pool.alignment())));
+ ASMJIT_PROPAGATE(align(AlignMode::kData, uint32_t(pool.alignment())));
ASMJIT_PROPAGATE(bind(label));
size_t size = pool.size();
- CodeBufferWriter writer(this);
- ASMJIT_PROPAGATE(writer.ensureSpace(this, size));
+ if (!size)
+ return kErrorOk;
- pool.fill(writer.cursor());
+ CodeWriter writer(this);
+ ASMJIT_PROPAGATE(writer.ensureSpace(this, size));
#ifndef ASMJIT_NO_LOGGING
- if (_logger)
- _logger->logBinary(writer.cursor(), size);
+ uint8_t* data = writer.cursor();
#endif
+ pool.fill(writer.cursor());
writer.advance(size);
writer.done(this);
+#ifndef ASMJIT_NO_LOGGING
+ if (_logger) {
+ uint32_t dataSizeLog2 = Support::min<uint32_t>(Support::ctz(pool.minItemSize()), 3);
+ uint32_t dataSize = 1 << dataSizeLog2;
+
+ StringTmp<512> sb;
+ Formatter::formatData(sb, _logger->flags(), arch(), dataTypeIdBySize[dataSize], data, size >> dataSizeLog2);
+ sb.append('\n');
+ _logger->log(sb);
+ }
+#endif
+
return kErrorOk;
}
-Error BaseAssembler::embedLabel(const Label& label) {
+Error BaseAssembler::embedLabel(const Label& label, size_t dataSize) {
if (ASMJIT_UNLIKELY(!_code))
return reportError(DebugUtils::errored(kErrorNotInitialized));
@@ -252,37 +244,47 @@ Error BaseAssembler::embedLabel(const Label& label) {
if (ASMJIT_UNLIKELY(!le))
return reportError(DebugUtils::errored(kErrorInvalidLabel));
- uint32_t dataSize = registerSize();
- ASMJIT_ASSERT(dataSize <= 8);
+ if (dataSize == 0)
+ dataSize = registerSize();
- CodeBufferWriter writer(this);
+ if (ASMJIT_UNLIKELY(!Support::isPowerOf2(dataSize) || dataSize > 8))
+ return reportError(DebugUtils::errored(kErrorInvalidOperandSize));
+
+ CodeWriter writer(this);
ASMJIT_PROPAGATE(writer.ensureSpace(this, dataSize));
#ifndef ASMJIT_NO_LOGGING
if (_logger) {
StringTmp<256> sb;
- sb.appendFormat("%s ", dataSizeByPowerTable[Support::ctz(dataSize)].str);
- Formatter::formatLabel(sb, 0, this, label.id());
+ sb.append('.');
+ Formatter::formatDataType(sb, _logger->flags(), arch(), dataTypeIdBySize[dataSize]);
+ sb.append(' ');
+ Formatter::formatLabel(sb, FormatFlags::kNone, this, label.id());
sb.append('\n');
_logger->log(sb);
}
#endif
- Error err = _code->newRelocEntry(&re, RelocEntry::kTypeRelToAbs, dataSize);
+ Error err = _code->newRelocEntry(&re, RelocType::kRelToAbs);
if (ASMJIT_UNLIKELY(err))
return reportError(err);
re->_sourceSectionId = _section->id();
re->_sourceOffset = offset();
+ re->_format.resetToSimpleValue(OffsetType::kUnsignedOffset, dataSize);
if (le->isBound()) {
re->_targetSectionId = le->section()->id();
re->_payload = le->offset();
}
else {
- LabelLink* link = _code->newLabelLink(le, _section->id(), offset(), 0);
+ OffsetFormat of;
+ of.resetToSimpleValue(OffsetType::kUnsignedOffset, dataSize);
+
+ LabelLink* link = _code->newLabelLink(le, _section->id(), offset(), 0, of);
if (ASMJIT_UNLIKELY(!link))
return reportError(DebugUtils::errored(kErrorOutOfMemory));
+
link->relocId = re->id();
}
@@ -309,16 +311,18 @@ Error BaseAssembler::embedLabelDelta(const Label& label, const Label& base, size
if (ASMJIT_UNLIKELY(!Support::isPowerOf2(dataSize) || dataSize > 8))
return reportError(DebugUtils::errored(kErrorInvalidOperandSize));
- CodeBufferWriter writer(this);
+ CodeWriter writer(this);
ASMJIT_PROPAGATE(writer.ensureSpace(this, dataSize));
#ifndef ASMJIT_NO_LOGGING
if (_logger) {
StringTmp<256> sb;
- sb.appendFormat(".%s (", dataSizeByPowerTable[Support::ctz(dataSize)].str);
- Formatter::formatLabel(sb, 0, this, label.id());
+ sb.append('.');
+ Formatter::formatDataType(sb, _logger->flags(), arch(), dataTypeIdBySize[dataSize]);
+ sb.append(" (");
+ Formatter::formatLabel(sb, FormatFlags::kNone, this, label.id());
sb.append(" - ");
- Formatter::formatLabel(sb, 0, this, base.id());
+ Formatter::formatLabel(sb, FormatFlags::kNone, this, base.id());
sb.append(")\n");
_logger->log(sb);
}
@@ -331,7 +335,7 @@ Error BaseAssembler::embedLabelDelta(const Label& label, const Label& base, size
}
else {
RelocEntry* re;
- Error err = _code->newRelocEntry(&re, RelocEntry::kTypeExpression, uint32_t(dataSize));
+ Error err = _code->newRelocEntry(&re, RelocType::kExpression);
if (ASMJIT_UNLIKELY(err))
return reportError(err);
@@ -340,10 +344,11 @@ Error BaseAssembler::embedLabelDelta(const Label& label, const Label& base, size
return reportError(DebugUtils::errored(kErrorOutOfMemory));
exp->reset();
- exp->opType = Expression::kOpSub;
+ exp->opType = ExpressionOpType::kSub;
exp->setValueAsLabel(0, labelEntry);
exp->setValueAsLabel(1, baseEntry);
+ re->_format.resetToSimpleValue(OffsetType::kSignedOffset, dataSize);
re->_sourceSectionId = _section->id();
re->_sourceOffset = offset();
re->_payload = (uint64_t)(uintptr_t)exp;
@@ -355,30 +360,31 @@ Error BaseAssembler::embedLabelDelta(const Label& label, const Label& base, size
return kErrorOk;
}
-// ============================================================================
-// [asmjit::BaseAssembler - Comment]
-// ============================================================================
+// BaseAssembler - Comment
+// =======================
Error BaseAssembler::comment(const char* data, size_t size) {
- if (ASMJIT_UNLIKELY(!_code))
- return reportError(DebugUtils::errored(kErrorNotInitialized));
-
-#ifndef ASMJIT_NO_LOGGING
- if (_logger) {
- _logger->log(data, size);
- _logger->log("\n", 1);
+ if (!hasEmitterFlag(EmitterFlags::kLogComments)) {
+ if (!hasEmitterFlag(EmitterFlags::kAttached))
+ return reportError(DebugUtils::errored(kErrorNotInitialized));
return kErrorOk;
}
+
+#ifndef ASMJIT_NO_LOGGING
+ // Logger cannot be NULL if `EmitterFlags::kLogComments` is set.
+ ASMJIT_ASSERT(_logger != nullptr);
+
+ _logger->log(data, size);
+ _logger->log("\n", 1);
+ return kErrorOk;
#else
DebugUtils::unused(data, size);
-#endif
-
return kErrorOk;
+#endif
}
-// ============================================================================
-// [asmjit::BaseAssembler - Events]
-// ============================================================================
+// BaseAssembler - Events
+// ======================
Error BaseAssembler::onAttach(CodeHolder* code) noexcept {
ASMJIT_PROPAGATE(Base::onAttach(code));
diff --git a/3rdparty/asmjit/src/asmjit/core/assembler.h b/3rdparty/asmjit/src/asmjit/core/assembler.h
index 966dabb06e0..7ea2505f046 100644
--- a/3rdparty/asmjit/src/asmjit/core/assembler.h
+++ b/3rdparty/asmjit/src/asmjit/core/assembler.h
@@ -1,31 +1,12 @@
-// AsmJit - Machine code generation for C++
+// This file is part of AsmJit project <https://asmjit.com>
//
-// * Official AsmJit Home Page: https://asmjit.com
-// * Official Github Repository: https://github.com/asmjit/asmjit
-//
-// Copyright (c) 2008-2020 The AsmJit Authors
-//
-// This software is provided 'as-is', without any express or implied
-// warranty. In no event will the authors be held liable for any damages
-// arising from the use of this software.
-//
-// Permission is granted to anyone to use this software for any purpose,
-// including commercial applications, and to alter it and redistribute it
-// freely, subject to the following restrictions:
-//
-// 1. The origin of this software must not be misrepresented; you must not
-// claim that you wrote the original software. If you use this software
-// in a product, an acknowledgment in the product documentation would be
-// appreciated but is not required.
-// 2. Altered source versions must be plainly marked as such, and must not be
-// misrepresented as being the original software.
-// 3. This notice may not be removed or altered from any source distribution.
+// See asmjit.h or LICENSE.md for license and copyright information
+// SPDX-License-Identifier: Zlib
#ifndef ASMJIT_CORE_ASSEMBLER_H_INCLUDED
#define ASMJIT_CORE_ASSEMBLER_H_INCLUDED
#include "../core/codeholder.h"
-#include "../core/datatypes.h"
#include "../core/emitter.h"
#include "../core/operand.h"
@@ -34,10 +15,6 @@ ASMJIT_BEGIN_NAMESPACE
//! \addtogroup asmjit_assembler
//! \{
-// ============================================================================
-// [asmjit::BaseAssembler]
-// ============================================================================
-
//! Base assembler.
//!
//! This is a base class that provides interface used by architecture specific
@@ -54,13 +31,13 @@ public:
typedef BaseEmitter Base;
//! Current section where the assembling happens.
- Section* _section;
+ Section* _section = nullptr;
//! Start of the CodeBuffer of the current section.
- uint8_t* _bufferData;
+ uint8_t* _bufferData = nullptr;
//! End (first invalid byte) of the current section.
- uint8_t* _bufferEnd;
+ uint8_t* _bufferEnd = nullptr;
//! Pointer in the CodeBuffer of the current section.
- uint8_t* _bufferPtr;
+ uint8_t* _bufferPtr = nullptr;
//! \name Construction & Destruction
//! \{
@@ -112,7 +89,7 @@ public:
//! \{
ASMJIT_API Label newLabel() override;
- ASMJIT_API Label newNamedLabel(const char* name, size_t nameSize = SIZE_MAX, uint32_t type = Label::kTypeGlobal, uint32_t parentId = Globals::kInvalidId) override;
+ ASMJIT_API Label newNamedLabel(const char* name, size_t nameSize = SIZE_MAX, LabelType type = LabelType::kGlobal, uint32_t parentId = Globals::kInvalidId) override;
ASMJIT_API Error bind(const Label& label) override;
//! \}
@@ -121,11 +98,11 @@ public:
//! \{
ASMJIT_API Error embed(const void* data, size_t dataSize) override;
- ASMJIT_API Error embedDataArray(uint32_t typeId, const void* data, size_t itemCcount, size_t repeatCount = 1) override;
+ ASMJIT_API Error embedDataArray(TypeId typeId, const void* data, size_t itemCount, size_t repeatCount = 1) override;
ASMJIT_API Error embedConstPool(const Label& label, const ConstPool& pool) override;
- ASMJIT_API Error embedLabel(const Label& label) override;
- ASMJIT_API Error embedLabelDelta(const Label& label, const Label& base, size_t dataSize) override;
+ ASMJIT_API Error embedLabel(const Label& label, size_t dataSize = 0) override;
+ ASMJIT_API Error embedLabelDelta(const Label& label, const Label& base, size_t dataSize = 0) override;
//! \}
diff --git a/3rdparty/asmjit/src/asmjit/core/builder.cpp b/3rdparty/asmjit/src/asmjit/core/builder.cpp
index 97780c767a4..5df243e7b8a 100644
--- a/3rdparty/asmjit/src/asmjit/core/builder.cpp
+++ b/3rdparty/asmjit/src/asmjit/core/builder.cpp
@@ -1,25 +1,7 @@
-// AsmJit - Machine code generation for C++
+// This file is part of AsmJit project <https://asmjit.com>
//
-// * Official AsmJit Home Page: https://asmjit.com
-// * Official Github Repository: https://github.com/asmjit/asmjit
-//
-// Copyright (c) 2008-2020 The AsmJit Authors
-//
-// This software is provided 'as-is', without any express or implied
-// warranty. In no event will the authors be held liable for any damages
-// arising from the use of this software.
-//
-// Permission is granted to anyone to use this software for any purpose,
-// including commercial applications, and to alter it and redistribute it
-// freely, subject to the following restrictions:
-//
-// 1. The origin of this software must not be misrepresented; you must not
-// claim that you wrote the original software. If you use this software
-// in a product, an acknowledgment in the product documentation would be
-// appreciated but is not required.
-// 2. Altered source versions must be plainly marked as such, and must not be
-// misrepresented as being the original software.
-// 3. This notice may not be removed or altered from any source distribution.
+// See asmjit.h or LICENSE.md for license and copyright information
+// SPDX-License-Identifier: Zlib
#include "../core/api-build_p.h"
#ifndef ASMJIT_NO_BUILDER
@@ -33,9 +15,8 @@
ASMJIT_BEGIN_NAMESPACE
-// ============================================================================
-// [asmjit::PostponedErrorHandler (Internal)]
-// ============================================================================
+// PostponedErrorHandler (Internal)
+// ================================
//! Postponed error handler that never throws. Used as a temporal error handler
//! to run passes. If error occurs, the caller is notified and will call the
@@ -50,9 +31,8 @@ public:
StringTmp<128> _message;
};
-// ============================================================================
-// [asmjit::BaseBuilder - Utilities]
-// ============================================================================
+// BaseBuilder - Utilities
+// =======================
static void BaseBuilder_deletePasses(BaseBuilder* self) noexcept {
for (Pass* pass : self->_passes)
@@ -60,32 +40,24 @@ static void BaseBuilder_deletePasses(BaseBuilder* self) noexcept {
self->_passes.reset();
}
-// ============================================================================
-// [asmjit::BaseBuilder - Construction / Destruction]
-// ============================================================================
+// BaseBuilder - Construction & Destruction
+// ========================================
BaseBuilder::BaseBuilder() noexcept
- : BaseEmitter(kTypeBuilder),
+ : BaseEmitter(EmitterType::kBuilder),
_codeZone(32768 - Zone::kBlockOverhead),
_dataZone(16384 - Zone::kBlockOverhead),
_passZone(65536 - Zone::kBlockOverhead),
- _allocator(&_codeZone),
- _passes(),
- _labelNodes(),
- _cursor(nullptr),
- _firstNode(nullptr),
- _lastNode(nullptr),
- _nodeFlags(0) {}
+ _allocator(&_codeZone) {}
BaseBuilder::~BaseBuilder() noexcept {
BaseBuilder_deletePasses(this);
}
-// ============================================================================
-// [asmjit::BaseBuilder - Node Management]
-// ============================================================================
+// BaseBuilder - Node Management
+// =============================
-Error BaseBuilder::_newInstNode(InstNode** out, uint32_t instId, uint32_t instOptions, uint32_t opCount) {
+Error BaseBuilder::newInstNode(InstNode** out, InstId instId, InstOptions instOptions, uint32_t opCount) {
uint32_t opCapacity = InstNode::capacityOfOpCount(opCount);
ASMJIT_ASSERT(opCapacity >= InstNode::kBaseOpCapacity);
@@ -98,28 +70,28 @@ Error BaseBuilder::_newInstNode(InstNode** out, uint32_t instId, uint32_t instOp
}
-Error BaseBuilder::_newLabelNode(LabelNode** out) {
+Error BaseBuilder::newLabelNode(LabelNode** out) {
*out = nullptr;
ASMJIT_PROPAGATE(_newNodeT<LabelNode>(out));
return registerLabelNode(*out);
}
-Error BaseBuilder::_newAlignNode(AlignNode** out, uint32_t alignMode, uint32_t alignment) {
+Error BaseBuilder::newAlignNode(AlignNode** out, AlignMode alignMode, uint32_t alignment) {
*out = nullptr;
return _newNodeT<AlignNode>(out, alignMode, alignment);
}
-Error BaseBuilder::_newEmbedDataNode(EmbedDataNode** out, uint32_t typeId, const void* data, size_t itemCount, size_t repeatCount) {
+Error BaseBuilder::newEmbedDataNode(EmbedDataNode** out, TypeId typeId, const void* data, size_t itemCount, size_t repeatCount) {
*out = nullptr;
- uint32_t deabstractDelta = Type::deabstractDeltaOfSize(registerSize());
- uint32_t finalTypeId = Type::deabstract(typeId, deabstractDelta);
+ uint32_t deabstractDelta = TypeUtils::deabstractDeltaOfSize(registerSize());
+ TypeId finalTypeId = TypeUtils::deabstract(typeId, deabstractDelta);
- if (ASMJIT_UNLIKELY(!Type::isValid(finalTypeId)))
+ if (ASMJIT_UNLIKELY(!TypeUtils::isValid(finalTypeId)))
return reportError(DebugUtils::errored(kErrorInvalidArgument));
- uint32_t typeSize = Type::sizeOf(finalTypeId);
+ uint32_t typeSize = TypeUtils::sizeOf(finalTypeId);
Support::FastUInt8 of = 0;
size_t dataSize = Support::mulOverflow(itemCount, size_t(typeSize), &of);
@@ -129,7 +101,7 @@ Error BaseBuilder::_newEmbedDataNode(EmbedDataNode** out, uint32_t typeId, const
EmbedDataNode* node;
ASMJIT_PROPAGATE(_newNodeT<EmbedDataNode>(&node));
- node->_embed._typeId = uint8_t(typeId);
+ node->_embed._typeId = typeId;
node->_embed._typeSize = uint8_t(typeSize);
node->_itemCount = itemCount;
node->_repeatCount = repeatCount;
@@ -149,14 +121,14 @@ Error BaseBuilder::_newEmbedDataNode(EmbedDataNode** out, uint32_t typeId, const
return kErrorOk;
}
-Error BaseBuilder::_newConstPoolNode(ConstPoolNode** out) {
+Error BaseBuilder::newConstPoolNode(ConstPoolNode** out) {
*out = nullptr;
ASMJIT_PROPAGATE(_newNodeT<ConstPoolNode>(out));
return registerLabelNode(*out);
}
-Error BaseBuilder::_newCommentNode(CommentNode** out, const char* data, size_t size) {
+Error BaseBuilder::newCommentNode(CommentNode** out, const char* data, size_t size) {
*out = nullptr;
if (data) {
@@ -174,7 +146,6 @@ Error BaseBuilder::_newCommentNode(CommentNode** out, const char* data, size_t s
}
BaseNode* BaseBuilder::addNode(BaseNode* node) noexcept {
- ASMJIT_ASSERT(node);
ASMJIT_ASSERT(!node->_prev);
ASMJIT_ASSERT(!node->_next);
ASMJIT_ASSERT(!node->isActive());
@@ -204,7 +175,7 @@ BaseNode* BaseBuilder::addNode(BaseNode* node) noexcept {
_lastNode = node;
}
- node->addFlags(BaseNode::kFlagIsActive);
+ node->addFlags(NodeFlags::kIsActive);
if (node->isSection())
_dirtySectionLinks = true;
@@ -213,9 +184,6 @@ BaseNode* BaseBuilder::addNode(BaseNode* node) noexcept {
}
BaseNode* BaseBuilder::addAfter(BaseNode* node, BaseNode* ref) noexcept {
- ASMJIT_ASSERT(node);
- ASMJIT_ASSERT(ref);
-
ASMJIT_ASSERT(!node->_prev);
ASMJIT_ASSERT(!node->_next);
@@ -225,7 +193,7 @@ BaseNode* BaseBuilder::addAfter(BaseNode* node, BaseNode* ref) noexcept {
node->_prev = prev;
node->_next = next;
- node->addFlags(BaseNode::kFlagIsActive);
+ node->addFlags(NodeFlags::kIsActive);
if (node->isSection())
_dirtySectionLinks = true;
@@ -239,11 +207,9 @@ BaseNode* BaseBuilder::addAfter(BaseNode* node, BaseNode* ref) noexcept {
}
BaseNode* BaseBuilder::addBefore(BaseNode* node, BaseNode* ref) noexcept {
- ASMJIT_ASSERT(node != nullptr);
ASMJIT_ASSERT(!node->_prev);
ASMJIT_ASSERT(!node->_next);
ASMJIT_ASSERT(!node->isActive());
- ASMJIT_ASSERT(ref != nullptr);
ASMJIT_ASSERT(ref->isActive());
BaseNode* prev = ref->prev();
@@ -252,7 +218,7 @@ BaseNode* BaseBuilder::addBefore(BaseNode* node, BaseNode* ref) noexcept {
node->_prev = prev;
node->_next = next;
- node->addFlags(BaseNode::kFlagIsActive);
+ node->addFlags(NodeFlags::kIsActive);
if (node->isSection())
_dirtySectionLinks = true;
@@ -284,7 +250,7 @@ BaseNode* BaseBuilder::removeNode(BaseNode* node) noexcept {
node->_prev = nullptr;
node->_next = nullptr;
- node->clearFlags(BaseNode::kFlagIsActive);
+ node->clearFlags(NodeFlags::kIsActive);
if (node->isSection())
_dirtySectionLinks = true;
@@ -325,7 +291,7 @@ void BaseBuilder::removeNodes(BaseNode* first, BaseNode* last) noexcept {
node->_prev = nullptr;
node->_next = nullptr;
- node->clearFlags(BaseNode::kFlagIsActive);
+ node->clearFlags(NodeFlags::kIsActive);
didRemoveSection |= uint32_t(node->isSection());
if (_cursor == node)
@@ -346,9 +312,8 @@ BaseNode* BaseBuilder::setCursor(BaseNode* node) noexcept {
return old;
}
-// ============================================================================
-// [asmjit::BaseBuilder - Section]
-// ============================================================================
+// BaseBuilder - Sections
+// ======================
Error BaseBuilder::sectionNodeOf(SectionNode** out, uint32_t sectionId) {
*out = nullptr;
@@ -386,6 +351,7 @@ Error BaseBuilder::sectionNodeOf(SectionNode** out, uint32_t sectionId) {
Error BaseBuilder::section(Section* section) {
SectionNode* node;
ASMJIT_PROPAGATE(sectionNodeOf(&node, section->id()));
+ ASMJIT_ASSUME(node != nullptr);
if (!node->isActive()) {
// Insert the section at the end if it was not part of the code.
@@ -430,9 +396,8 @@ void BaseBuilder::updateSectionLinks() noexcept {
_dirtySectionLinks = false;
}
-// ============================================================================
-// [asmjit::BaseBuilder - Labels]
-// ============================================================================
+// BaseBuilder - Labels
+// ====================
Error BaseBuilder::labelNodeOf(LabelNode** out, uint32_t labelId) {
*out = nullptr;
@@ -506,7 +471,7 @@ Label BaseBuilder::newLabel() {
return Label(labelId);
}
-Label BaseBuilder::newNamedLabel(const char* name, size_t nameSize, uint32_t type, uint32_t parentId) {
+Label BaseBuilder::newNamedLabel(const char* name, size_t nameSize, LabelType type, uint32_t parentId) {
uint32_t labelId = Globals::kInvalidId;
LabelEntry* le;
@@ -527,9 +492,8 @@ Error BaseBuilder::bind(const Label& label) {
return kErrorOk;
}
-// ============================================================================
-// [asmjit::BaseBuilder - Passes]
-// ============================================================================
+// BaseBuilder - Passes
+// ====================
ASMJIT_FAVOR_SIZE Pass* BaseBuilder::passByName(const char* name) const noexcept {
for (Pass* pass : _passes)
@@ -609,25 +573,26 @@ Error BaseBuilder::runPasses() {
return kErrorOk;
}
-// ============================================================================
-// [asmjit::BaseBuilder - Emit]
-// ============================================================================
+// BaseBuilder - Emit
+// ==================
-Error BaseBuilder::_emit(uint32_t instId, const Operand_& o0, const Operand_& o1, const Operand_& o2, const Operand_* opExt) {
+Error BaseBuilder::_emit(InstId instId, const Operand_& o0, const Operand_& o1, const Operand_& o2, const Operand_* opExt) {
uint32_t opCount = EmitterUtils::opCountFromEmitArgs(o0, o1, o2, opExt);
- uint32_t options = instOptions() | forcedInstOptions();
+ InstOptions options = instOptions() | forcedInstOptions();
- if (options & BaseInst::kOptionReserved) {
+ if (Support::test(options, InstOptions::kReserved)) {
if (ASMJIT_UNLIKELY(!_code))
return DebugUtils::errored(kErrorNotInitialized);
#ifndef ASMJIT_NO_VALIDATION
// Strict validation.
- if (hasValidationOption(kValidationOptionIntermediate)) {
+ if (hasDiagnosticOption(DiagnosticOptions::kValidateIntermediate)) {
Operand_ opArray[Globals::kMaxOpCount];
EmitterUtils::opArrayFromEmitArgs(opArray, o0, o1, o2, opExt);
- Error err = InstAPI::validate(arch(), BaseInst(instId, options, _extraReg), opArray, opCount);
+ ValidationFlags validationFlags = isCompiler() ? ValidationFlags::kEnableVirtRegs : ValidationFlags::kNone;
+ Error err = _funcs.validate(arch(), BaseInst(instId, options, _extraReg), opArray, opCount, validationFlags);
+
if (ASMJIT_UNLIKELY(err)) {
resetInstOptions();
resetExtraReg();
@@ -637,8 +602,8 @@ Error BaseBuilder::_emit(uint32_t instId, const Operand_& o0, const Operand_& o1
}
#endif
- // Clear options that should never be part of `InstNode`.
- options &= ~BaseInst::kOptionReserved;
+ // Clear instruction options that should never be part of a regular instruction.
+ options &= ~InstOptions::kReserved;
}
uint32_t opCapacity = InstNode::capacityOfOpCount(opCount);
@@ -672,42 +637,43 @@ Error BaseBuilder::_emit(uint32_t instId, const Operand_& o0, const Operand_& o1
return kErrorOk;
}
-// ============================================================================
-// [asmjit::BaseBuilder - Align]
-// ============================================================================
+// BaseBuilder - Align
+// ===================
-Error BaseBuilder::align(uint32_t alignMode, uint32_t alignment) {
+Error BaseBuilder::align(AlignMode alignMode, uint32_t alignment) {
if (ASMJIT_UNLIKELY(!_code))
return DebugUtils::errored(kErrorNotInitialized);
AlignNode* node;
- ASMJIT_PROPAGATE(_newAlignNode(&node, alignMode, alignment));
+ ASMJIT_PROPAGATE(newAlignNode(&node, alignMode, alignment));
+ ASMJIT_ASSUME(node != nullptr);
addNode(node);
return kErrorOk;
}
-// ============================================================================
-// [asmjit::BaseBuilder - Embed]
-// ============================================================================
+// BaseBuilder - Embed
+// ===================
Error BaseBuilder::embed(const void* data, size_t dataSize) {
if (ASMJIT_UNLIKELY(!_code))
return DebugUtils::errored(kErrorNotInitialized);
EmbedDataNode* node;
- ASMJIT_PROPAGATE(_newEmbedDataNode(&node, Type::kIdU8, data, dataSize));
+ ASMJIT_PROPAGATE(newEmbedDataNode(&node, TypeId::kUInt8, data, dataSize));
+ ASMJIT_ASSUME(node != nullptr);
addNode(node);
return kErrorOk;
}
-Error BaseBuilder::embedDataArray(uint32_t typeId, const void* data, size_t itemCount, size_t itemRepeat) {
+Error BaseBuilder::embedDataArray(TypeId typeId, const void* data, size_t itemCount, size_t itemRepeat) {
if (ASMJIT_UNLIKELY(!_code))
return DebugUtils::errored(kErrorNotInitialized);
EmbedDataNode* node;
- ASMJIT_PROPAGATE(_newEmbedDataNode(&node, typeId, data, itemCount, itemRepeat));
+ ASMJIT_PROPAGATE(newEmbedDataNode(&node, typeId, data, itemCount, itemRepeat));
+ ASMJIT_ASSUME(node != nullptr);
addNode(node);
return kErrorOk;
@@ -720,24 +686,37 @@ Error BaseBuilder::embedConstPool(const Label& label, const ConstPool& pool) {
if (!isLabelValid(label))
return reportError(DebugUtils::errored(kErrorInvalidLabel));
- ASMJIT_PROPAGATE(align(kAlignData, uint32_t(pool.alignment())));
+ ASMJIT_PROPAGATE(align(AlignMode::kData, uint32_t(pool.alignment())));
ASMJIT_PROPAGATE(bind(label));
EmbedDataNode* node;
- ASMJIT_PROPAGATE(_newEmbedDataNode(&node, Type::kIdU8, nullptr, pool.size()));
+ ASMJIT_PROPAGATE(newEmbedDataNode(&node, TypeId::kUInt8, nullptr, pool.size()));
+ ASMJIT_ASSUME(node != nullptr);
pool.fill(node->data());
addNode(node);
return kErrorOk;
}
-Error BaseBuilder::embedLabel(const Label& label) {
+// BaseBuilder - EmbedLabel & EmbedLabelDelta
+// ==========================================
+//
+// If dataSize is zero it means that the size is the same as target register width, however,
+// if it's provided we really want to validate whether it's within the possible range.
+
+static inline bool BaseBuilder_checkDataSize(size_t dataSize) noexcept {
+ return !dataSize || (Support::isPowerOf2(dataSize) && dataSize <= 8);
+}
+
+Error BaseBuilder::embedLabel(const Label& label, size_t dataSize) {
if (ASMJIT_UNLIKELY(!_code))
return DebugUtils::errored(kErrorNotInitialized);
+ if (!BaseBuilder_checkDataSize(dataSize))
+ return reportError(DebugUtils::errored(kErrorInvalidArgument));
EmbedLabelNode* node;
- ASMJIT_PROPAGATE(_newNodeT<EmbedLabelNode>(&node, label.id()));
+ ASMJIT_PROPAGATE(_newNodeT<EmbedLabelNode>(&node, label.id(), uint32_t(dataSize)));
addNode(node);
return kErrorOk;
@@ -747,10 +726,7 @@ Error BaseBuilder::embedLabelDelta(const Label& label, const Label& base, size_t
if (ASMJIT_UNLIKELY(!_code))
return DebugUtils::errored(kErrorNotInitialized);
- // If dataSize is zero it means that the size is the same as target register
- // width, however, if it's provided we really want to validate whether it's
- // within the possible range.
- if (dataSize && (!Support::isPowerOf2(dataSize) || dataSize > 8))
+ if (!BaseBuilder_checkDataSize(dataSize))
return reportError(DebugUtils::errored(kErrorInvalidArgument));
EmbedLabelDeltaNode* node;
@@ -760,26 +736,25 @@ Error BaseBuilder::embedLabelDelta(const Label& label, const Label& base, size_t
return kErrorOk;
}
-// ============================================================================
-// [asmjit::BaseBuilder - Comment]
-// ============================================================================
+// BaseBuilder - Comment
+// =====================
Error BaseBuilder::comment(const char* data, size_t size) {
if (ASMJIT_UNLIKELY(!_code))
return DebugUtils::errored(kErrorNotInitialized);
CommentNode* node;
- ASMJIT_PROPAGATE(_newCommentNode(&node, data, size));
+ ASMJIT_PROPAGATE(newCommentNode(&node, data, size));
+ ASMJIT_ASSUME(node != nullptr);
addNode(node);
return kErrorOk;
}
-// ============================================================================
-// [asmjit::BaseBuilder - Serialize]
-// ============================================================================
+// BaseBuilder - SerializeTo
+// =========================
-Error BaseBuilder::serialize(BaseEmitter* dst) {
+Error BaseBuilder::serializeTo(BaseEmitter* dst) {
Error err = kErrorOk;
BaseNode* node_ = _firstNode;
@@ -792,7 +767,7 @@ Error BaseBuilder::serialize(BaseEmitter* dst) {
InstNode* node = node_->as<InstNode>();
// NOTE: Inlined to remove one additional call per instruction.
- dst->setInstOptions(node->instOptions());
+ dst->setInstOptions(node->options());
dst->setExtraReg(node->extraReg());
const Operand_* op = node->operands();
@@ -836,7 +811,7 @@ Error BaseBuilder::serialize(BaseEmitter* dst) {
}
else if (node_->isEmbedLabel()) {
EmbedLabelNode* node = node_->as<EmbedLabelNode>();
- err = dst->embedLabel(node->label());
+ err = dst->embedLabel(node->label(), node->dataSize());
}
else if (node_->isEmbedLabelDelta()) {
EmbedLabelDeltaNode* node = node_->as<EmbedLabelDeltaNode>();
@@ -858,9 +833,8 @@ Error BaseBuilder::serialize(BaseEmitter* dst) {
return err;
}
-// ============================================================================
-// [asmjit::BaseBuilder - Events]
-// ============================================================================
+// BaseBuilder - Events
+// ====================
Error BaseBuilder::onAttach(CodeHolder* code) noexcept {
ASMJIT_PROPAGATE(Base::onAttach(code));
@@ -876,10 +850,11 @@ Error BaseBuilder::onAttach(CodeHolder* code) noexcept {
return err;
}
+ ASMJIT_ASSUME(initialSection != nullptr);
_cursor = initialSection;
_firstNode = initialSection;
_lastNode = initialSection;
- initialSection->setFlags(BaseNode::kFlagIsActive);
+ initialSection->setFlags(NodeFlags::kIsActive);
return kErrorOk;
}
@@ -894,8 +869,7 @@ Error BaseBuilder::onDetach(CodeHolder* code) noexcept {
_dataZone.reset();
_passZone.reset();
- _nodeFlags = 0;
-
+ _nodeFlags = NodeFlags::kNone;
_cursor = nullptr;
_firstNode = nullptr;
_lastNode = nullptr;
@@ -903,13 +877,11 @@ Error BaseBuilder::onDetach(CodeHolder* code) noexcept {
return Base::onDetach(code);
}
-// ============================================================================
-// [asmjit::Pass - Construction / Destruction]
-// ============================================================================
+// Pass - Construction & Destruction
+// =================================
Pass::Pass(const char* name) noexcept
- : _cb(nullptr),
- _name(name) {}
+ : _name(name) {}
Pass::~Pass() noexcept {}
ASMJIT_END_NAMESPACE
diff --git a/3rdparty/asmjit/src/asmjit/core/builder.h b/3rdparty/asmjit/src/asmjit/core/builder.h
index ba99267dafa..3575de2fbb8 100644
--- a/3rdparty/asmjit/src/asmjit/core/builder.h
+++ b/3rdparty/asmjit/src/asmjit/core/builder.h
@@ -1,25 +1,7 @@
-// AsmJit - Machine code generation for C++
+// This file is part of AsmJit project <https://asmjit.com>
//
-// * Official AsmJit Home Page: https://asmjit.com
-// * Official Github Repository: https://github.com/asmjit/asmjit
-//
-// Copyright (c) 2008-2020 The AsmJit Authors
-//
-// This software is provided 'as-is', without any express or implied
-// warranty. In no event will the authors be held liable for any damages
-// arising from the use of this software.
-//
-// Permission is granted to anyone to use this software for any purpose,
-// including commercial applications, and to alter it and redistribute it
-// freely, subject to the following restrictions:
-//
-// 1. The origin of this software must not be misrepresented; you must not
-// claim that you wrote the original software. If you use this software
-// in a product, an acknowledgment in the product documentation would be
-// appreciated but is not required.
-// 2. Altered source versions must be plainly marked as such, and must not be
-// misrepresented as being the original software.
-// 3. This notice may not be removed or altered from any source distribution.
+// See asmjit.h or LICENSE.md for license and copyright information
+// SPDX-License-Identifier: Zlib
#ifndef ASMJIT_CORE_BUILDER_H_INCLUDED
#define ASMJIT_CORE_BUILDER_H_INCLUDED
@@ -44,10 +26,6 @@ ASMJIT_BEGIN_NAMESPACE
//! \addtogroup asmjit_builder
//! \{
-// ============================================================================
-// [Forward Declarations]
-// ============================================================================
-
class BaseBuilder;
class Pass;
@@ -63,21 +41,88 @@ class CommentNode;
class SentinelNode;
class LabelDeltaNode;
-// Only used by Compiler infrastructure.
-class JumpAnnotation;
+//! Type of node used by \ref BaseBuilder and \ref BaseCompiler.
+enum class NodeType : uint8_t {
+ //! Invalid node (internal, don't use).
+ kNone = 0,
+
+ // [BaseBuilder]
+
+ //! Node is \ref InstNode or \ref InstExNode.
+ kInst = 1,
+ //! Node is \ref SectionNode.
+ kSection = 2,
+ //! Node is \ref LabelNode.
+ kLabel = 3,
+ //! Node is \ref AlignNode.
+ kAlign = 4,
+ //! Node is \ref EmbedDataNode.
+ kEmbedData = 5,
+ //! Node is \ref EmbedLabelNode.
+ kEmbedLabel = 6,
+ //! Node is \ref EmbedLabelDeltaNode.
+ kEmbedLabelDelta = 7,
+ //! Node is \ref ConstPoolNode.
+ kConstPool = 8,
+ //! Node is \ref CommentNode.
+ kComment = 9,
+ //! Node is \ref SentinelNode.
+ kSentinel = 10,
+
+ // [BaseCompiler]
+
+ //! Node is \ref JumpNode (acts as InstNode).
+ kJump = 15,
+ //! Node is \ref FuncNode (acts as LabelNode).
+ kFunc = 16,
+ //! Node is \ref FuncRetNode (acts as InstNode).
+ kFuncRet = 17,
+ //! Node is \ref InvokeNode (acts as InstNode).
+ kInvoke = 18,
+
+ // [UserDefined]
+
+ //! First id of a user-defined node.
+ kUser = 32
+};
-// ============================================================================
-// [asmjit::BaseBuilder]
-// ============================================================================
+//! Node flags, specify what the node is and/or does.
+enum class NodeFlags : uint8_t {
+ //! No flags.
+ kNone = 0,
+ //! Node is code that can be executed (instruction, label, align, etc...).
+ kIsCode = 0x01u,
+ //! Node is data that cannot be executed (data, const-pool, etc...).
+ kIsData = 0x02u,
+ //! Node is informative, can be removed and ignored.
+ kIsInformative = 0x04u,
+ //! Node can be safely removed if unreachable.
+ kIsRemovable = 0x08u,
+ //! Node does nothing when executed (label, align, explicit nop).
+ kHasNoEffect = 0x10u,
+ //! Node is an instruction or acts as it.
+ kActsAsInst = 0x20u,
+ //! Node is a label or acts as it.
+ kActsAsLabel = 0x40u,
+ //! Node is active (part of the code).
+ kIsActive = 0x80u
+};
+ASMJIT_DEFINE_ENUM_FLAGS(NodeFlags)
+
+//! Type of the sentinel (purery informative purpose).
+enum class SentinelType : uint8_t {
+ //! Type of the sentinel is not known.
+ kUnknown = 0u,
+ //! This is a sentinel used at the end of \ref FuncNode.
+ kFuncEnd = 1u
+};
//! Builder interface.
//!
-//! `BaseBuilder` interface was designed to be used as a \ref BaseAssembler
-//! replacement in case pre-processing or post-processing of the generated code
-//! is required. The code can be modified during or after code generation. Pre
-//! or post processing can be done manually or through a \ref Pass object. \ref
-//! BaseBuilder stores the emitted code as a double-linked list of nodes, which
-//! allows O(1) insertion and removal during processing.
+//! `BaseBuilder` interface was designed to be used as a \ref BaseAssembler replacement in case pre-processing or
+//! post-processing of the generated code is required. The code can be modified during or after code generation.
+//! Pre processing or post processing can be done manually or through a \ref Pass object. \ref BaseBuilder stores
+//! the emitted code as a double-linked list of nodes, which allows O(1) insertion and removal during processing.
//!
//! Check out architecture specific builders for more details and examples:
//!
@@ -87,6 +132,9 @@ public:
ASMJIT_NONCOPYABLE(BaseBuilder)
typedef BaseEmitter Base;
+ //! \name Members
+ //! \{
+
//! Base zone used to allocate nodes and passes.
Zone _codeZone;
//! Data zone used to allocate data and names.
@@ -97,23 +145,25 @@ public:
ZoneAllocator _allocator;
//! Array of `Pass` objects.
- ZoneVector<Pass*> _passes;
+ ZoneVector<Pass*> _passes {};
//! Maps section indexes to `LabelNode` nodes.
- ZoneVector<SectionNode*> _sectionNodes;
+ ZoneVector<SectionNode*> _sectionNodes {};
//! Maps label indexes to `LabelNode` nodes.
- ZoneVector<LabelNode*> _labelNodes;
+ ZoneVector<LabelNode*> _labelNodes {};
//! Current node (cursor).
- BaseNode* _cursor;
+ BaseNode* _cursor = nullptr;
//! First node of the current section.
- BaseNode* _firstNode;
+ BaseNode* _firstNode = nullptr;
//! Last node of the current section.
- BaseNode* _lastNode;
+ BaseNode* _lastNode = nullptr;
//! Flags assigned to each new node.
- uint32_t _nodeFlags;
+ NodeFlags _nodeFlags = NodeFlags::kNone;
//! The sections links are dirty (used internally).
- bool _dirtySectionLinks;
+ bool _dirtySectionLinks = false;
+
+ //! \}
//! \name Construction & Destruction
//! \{
@@ -133,16 +183,15 @@ public:
//! Returns the last node.
inline BaseNode* lastNode() const noexcept { return _lastNode; }
- //! Allocates and instantiates a new node of type `T` and returns its instance.
- //! If the allocation fails `nullptr` is returned.
+ //! Allocates and instantiates a new node of type `T` and returns its instance. If the allocation fails `nullptr`
+ //! is returned.
//!
//! The template argument `T` must be a type that is extends \ref BaseNode.
//!
- //! \remarks The pointer returned (if non-null) is owned by the Builder or
- //! Compiler. When the Builder/Compiler is destroyed it destroys all nodes
- //! it created so no manual memory management is required.
+ //! \remarks The pointer returned (if non-null) is owned by the Builder or Compiler. When the Builder/Compiler
+ //! is destroyed it destroys all nodes it created so no manual memory management is required.
template<typename T, typename... Args>
- inline Error _newNodeT(T** out, Args&&... args) {
+ inline Error _newNodeT(T** ASMJIT_NONNULL(out), Args&&... args) {
*out = _allocator.newT<T>(this, std::forward<Args>(args)...);
if (ASMJIT_UNLIKELY(!*out))
return reportError(DebugUtils::errored(kErrorOutOfMemory));
@@ -150,50 +199,44 @@ public:
}
//! Creates a new \ref InstNode.
- ASMJIT_API Error _newInstNode(InstNode** out, uint32_t instId, uint32_t instOptions, uint32_t opCount);
+ ASMJIT_API Error newInstNode(InstNode** ASMJIT_NONNULL(out), InstId instId, InstOptions instOptions, uint32_t opCount);
//! Creates a new \ref LabelNode.
- ASMJIT_API Error _newLabelNode(LabelNode** out);
+ ASMJIT_API Error newLabelNode(LabelNode** ASMJIT_NONNULL(out));
//! Creates a new \ref AlignNode.
- ASMJIT_API Error _newAlignNode(AlignNode** out, uint32_t alignMode, uint32_t alignment);
+ ASMJIT_API Error newAlignNode(AlignNode** ASMJIT_NONNULL(out), AlignMode alignMode, uint32_t alignment);
//! Creates a new \ref EmbedDataNode.
- ASMJIT_API Error _newEmbedDataNode(EmbedDataNode** out, uint32_t typeId, const void* data, size_t itemCount, size_t repeatCount = 1);
+ ASMJIT_API Error newEmbedDataNode(EmbedDataNode** ASMJIT_NONNULL(out), TypeId typeId, const void* data, size_t itemCount, size_t repeatCount = 1);
//! Creates a new \ref ConstPoolNode.
- ASMJIT_API Error _newConstPoolNode(ConstPoolNode** out);
+ ASMJIT_API Error newConstPoolNode(ConstPoolNode** ASMJIT_NONNULL(out));
//! Creates a new \ref CommentNode.
- ASMJIT_API Error _newCommentNode(CommentNode** out, const char* data, size_t size);
+ ASMJIT_API Error newCommentNode(CommentNode** ASMJIT_NONNULL(out), const char* data, size_t size);
//! Adds `node` after the current and sets the current node to the given `node`.
- ASMJIT_API BaseNode* addNode(BaseNode* node) noexcept;
+ ASMJIT_API BaseNode* addNode(BaseNode* ASMJIT_NONNULL(node)) noexcept;
//! Inserts the given `node` after `ref`.
- ASMJIT_API BaseNode* addAfter(BaseNode* node, BaseNode* ref) noexcept;
+ ASMJIT_API BaseNode* addAfter(BaseNode* ASMJIT_NONNULL(node), BaseNode* ASMJIT_NONNULL(ref)) noexcept;
//! Inserts the given `node` before `ref`.
- ASMJIT_API BaseNode* addBefore(BaseNode* node, BaseNode* ref) noexcept;
+ ASMJIT_API BaseNode* addBefore(BaseNode* ASMJIT_NONNULL(node), BaseNode* ASMJIT_NONNULL(ref)) noexcept;
//! Removes the given `node`.
- ASMJIT_API BaseNode* removeNode(BaseNode* node) noexcept;
+ ASMJIT_API BaseNode* removeNode(BaseNode* ASMJIT_NONNULL(node)) noexcept;
//! Removes multiple nodes.
ASMJIT_API void removeNodes(BaseNode* first, BaseNode* last) noexcept;
//! Returns the cursor.
//!
- //! When the Builder/Compiler is created it automatically creates a '.text'
- //! \ref SectionNode, which will be the initial one. When instructions are
- //! added they are always added after the cursor and the cursor is changed
- //! to be that newly added node. Use `setCursor()` to change where new nodes
- //! are inserted.
- inline BaseNode* cursor() const noexcept {
- return _cursor;
- }
+ //! When the Builder/Compiler is created it automatically creates a '.text' \ref SectionNode, which will be the
+ //! initial one. When instructions are added they are always added after the cursor and the cursor is changed
+ //! to be that newly added node. Use `setCursor()` to change where new nodes are inserted.
+ inline BaseNode* cursor() const noexcept { return _cursor; }
//! Sets the current node to `node` and return the previous one.
ASMJIT_API BaseNode* setCursor(BaseNode* node) noexcept;
//! Sets the current node without returning the previous node.
//!
- //! Only use this function if you are concerned about performance and want
- //! this inlined (for example if you set the cursor in a loop, etc...).
- inline void _setCursor(BaseNode* node) noexcept {
- _cursor = node;
- }
+ //! Only use this function if you are concerned about performance and want this inlined (for example if you set
+ //! the cursor in a loop, etc...).
+ inline void _setCursor(BaseNode* node) noexcept { _cursor = node; }
//! \}
@@ -202,8 +245,8 @@ public:
//! Returns a vector of SectionNode objects.
//!
- //! \note If a section of some id is not associated with the Builder/Compiler
- //! it would be null, so always check for nulls if you iterate over the vector.
+ //! \note If a section of some id is not associated with the Builder/Compiler it would be null, so always check
+ //! for nulls if you iterate over the vector.
inline const ZoneVector<SectionNode*>& sectionNodes() const noexcept {
return _sectionNodes;
}
@@ -215,15 +258,14 @@ public:
//! Returns or creates a `SectionNode` that matches the given `sectionId`.
//!
- //! \remarks This function will either get the existing `SectionNode` or create
- //! it in case it wasn't created before. You can check whether a section has a
- //! registered `SectionNode` by using `BaseBuilder::hasRegisteredSectionNode()`.
- ASMJIT_API Error sectionNodeOf(SectionNode** out, uint32_t sectionId);
+ //! \remarks This function will either get the existing `SectionNode` or create it in case it wasn't created before.
+ //! You can check whether a section has a registered `SectionNode` by using `BaseBuilder::hasRegisteredSectionNode()`.
+ ASMJIT_API Error sectionNodeOf(SectionNode** ASMJIT_NONNULL(out), uint32_t sectionId);
- ASMJIT_API Error section(Section* section) override;
+ ASMJIT_API Error section(Section* ASMJIT_NONNULL(section)) override;
- //! Returns whether the section links of active section nodes are dirty. You can
- //! update these links by calling `updateSectionLinks()` in such case.
+ //! Returns whether the section links of active section nodes are dirty. You can update these links by calling
+ //! `updateSectionLinks()` in such case.
inline bool hasDirtySectionLinks() const noexcept { return _dirtySectionLinks; }
//! Updates links of all active section nodes.
@@ -236,8 +278,8 @@ public:
//! Returns a vector of \ref LabelNode nodes.
//!
- //! \note If a label of some id is not associated with the Builder/Compiler
- //! it would be null, so always check for nulls if you iterate over the vector.
+ //! \note If a label of some id is not associated with the Builder/Compiler it would be null, so always check for
+ //! nulls if you iterate over the vector.
inline const ZoneVector<LabelNode*>& labelNodes() const noexcept { return _labelNodes; }
//! Tests whether the `LabelNode` of the given `labelId` was registered.
@@ -252,25 +294,23 @@ public:
//! Gets or creates a \ref LabelNode that matches the given `labelId`.
//!
- //! \remarks This function will either get the existing `LabelNode` or create
- //! it in case it wasn't created before. You can check whether a label has a
- //! registered `LabelNode` by calling \ref BaseBuilder::hasRegisteredLabelNode().
- ASMJIT_API Error labelNodeOf(LabelNode** out, uint32_t labelId);
+ //! \remarks This function will either get the existing `LabelNode` or create it in case it wasn't created before.
+ //! You can check whether a label has a registered `LabelNode` by calling \ref BaseBuilder::hasRegisteredLabelNode().
+ ASMJIT_API Error labelNodeOf(LabelNode** ASMJIT_NONNULL(out), uint32_t labelId);
//! \overload
- inline Error labelNodeOf(LabelNode** out, const Label& label) {
+ inline Error labelNodeOf(LabelNode** ASMJIT_NONNULL(out), const Label& label) {
return labelNodeOf(out, label.id());
}
//! Registers this \ref LabelNode (internal).
//!
- //! This function is used internally to register a newly created `LabelNode`
- //! with this instance of Builder/Compiler. Use \ref labelNodeOf() functions
- //! to get back \ref LabelNode from a label or its identifier.
- ASMJIT_API Error registerLabelNode(LabelNode* node);
+ //! This function is used internally to register a newly created `LabelNode` with this instance of Builder/Compiler.
+ //! Use \ref labelNodeOf() functions to get back \ref LabelNode from a label or its identifier.
+ ASMJIT_API Error registerLabelNode(LabelNode* ASMJIT_NONNULL(node));
ASMJIT_API Label newLabel() override;
- ASMJIT_API Label newNamedLabel(const char* name, size_t nameSize = SIZE_MAX, uint32_t type = Label::kTypeGlobal, uint32_t parentId = Globals::kInvalidId) override;
+ ASMJIT_API Label newNamedLabel(const char* name, size_t nameSize = SIZE_MAX, LabelType type = LabelType::kGlobal, uint32_t parentId = Globals::kInvalidId) override;
ASMJIT_API Error bind(const Label& label) override;
//! \}
@@ -281,14 +321,13 @@ public:
//! Returns a vector of `Pass` instances that will be executed by `runPasses()`.
inline const ZoneVector<Pass*>& passes() const noexcept { return _passes; }
- //! Allocates and instantiates a new pass of type `T` and returns its instance.
- //! If the allocation fails `nullptr` is returned.
+ //! Allocates and instantiates a new pass of type `T` and returns its instance. If the allocation fails `nullptr` is
+ //! returned.
//!
//! The template argument `T` must be a type that is extends \ref Pass.
//!
- //! \remarks The pointer returned (if non-null) is owned by the Builder or
- //! Compiler. When the Builder/Compiler is destroyed it destroys all passes
- //! it created so no manual memory management is required.
+ //! \remarks The pointer returned (if non-null) is owned by the Builder or Compiler. When the Builder/Compiler is
+ //! destroyed it destroys all passes it created so no manual memory management is required.
template<typename T>
inline T* newPassT() noexcept { return _codeZone.newT<T>(); }
@@ -319,14 +358,14 @@ public:
//! \name Emit
//! \{
- ASMJIT_API Error _emit(uint32_t instId, const Operand_& o0, const Operand_& o1, const Operand_& o2, const Operand_* opExt) override;
+ ASMJIT_API Error _emit(InstId instId, const Operand_& o0, const Operand_& o1, const Operand_& o2, const Operand_* opExt) override;
//! \}
//! \name Align
//! \{
- ASMJIT_API Error align(uint32_t alignMode, uint32_t alignment) override;
+ ASMJIT_API Error align(AlignMode alignMode, uint32_t alignment) override;
//! \}
@@ -334,11 +373,11 @@ public:
//! \{
ASMJIT_API Error embed(const void* data, size_t dataSize) override;
- ASMJIT_API Error embedDataArray(uint32_t typeId, const void* data, size_t count, size_t repeat = 1) override;
+ ASMJIT_API Error embedDataArray(TypeId typeId, const void* data, size_t count, size_t repeat = 1) override;
ASMJIT_API Error embedConstPool(const Label& label, const ConstPool& pool) override;
- ASMJIT_API Error embedLabel(const Label& label) override;
- ASMJIT_API Error embedLabelDelta(const Label& label, const Label& base, size_t dataSize) override;
+ ASMJIT_API Error embedLabel(const Label& label, size_t dataSize = 0) override;
+ ASMJIT_API Error embedLabelDelta(const Label& label, const Label& base, size_t dataSize = 0) override;
//! \}
@@ -354,10 +393,9 @@ public:
//! Serializes everything the given emitter `dst`.
//!
- //! Although not explicitly required the emitter will most probably be of
- //! Assembler type. The reason is that there is no known use of serializing
- //! nodes held by Builder/Compiler into another Builder-like emitter.
- ASMJIT_API Error serialize(BaseEmitter* dst);
+ //! Although not explicitly required the emitter will most probably be of Assembler type. The reason is that
+ //! there is no known use of serializing nodes held by Builder/Compiler into another Builder-like emitter.
+ ASMJIT_API Error serializeTo(BaseEmitter* dst);
//! \}
@@ -368,32 +406,21 @@ public:
ASMJIT_API Error onDetach(CodeHolder* code) noexcept override;
//! \}
-
-#ifndef ASMJIT_NO_DEPRECATED
-#ifndef ASMJIT_NO_LOGGING
- ASMJIT_DEPRECATED("Use Formatter::formatNodeList(sb, formatFlags, builder)")
- inline Error dump(String& sb, uint32_t formatFlags = 0) const noexcept {
- return Formatter::formatNodeList(sb, formatFlags, this);
- }
-#endif // !ASMJIT_NO_LOGGING
-#endif // !ASMJIT_NO_DEPRECATED
};
-// ============================================================================
-// [asmjit::BaseNode]
-// ============================================================================
-
//! Base node.
//!
-//! Every node represents a building-block used by \ref BaseBuilder. It can
-//! be instruction, data, label, comment, directive, or any other high-level
-//! representation that can be transformed to the building blocks mentioned.
-//! Every class that inherits \ref BaseBuilder can define its own high-level
-//! nodes that can be later lowered to basic nodes like instructions.
+//! Every node represents a building-block used by \ref BaseBuilder. It can be instruction, data, label, comment,
+//! directive, or any other high-level representation that can be transformed to the building blocks mentioned.
+//! Every class that inherits \ref BaseBuilder can define its own high-level nodes that can be later lowered to
+//! basic nodes like instructions.
class BaseNode {
public:
ASMJIT_NONCOPYABLE(BaseNode)
+ //! \name Members
+ //! \{
+
union {
struct {
//! Previous node.
@@ -407,22 +434,34 @@ public:
//! Data shared between all types of nodes.
struct AnyData {
- //! Node type, see \ref NodeType.
- uint8_t _nodeType;
- //! Node flags, see \ref Flags.
- uint8_t _nodeFlags;
+ //! Node type.
+ NodeType _nodeType;
+ //! Node flags.
+ NodeFlags _nodeFlags;
//! Not used by BaseNode.
uint8_t _reserved0;
//! Not used by BaseNode.
uint8_t _reserved1;
};
+ //! Data used by \ref AlignNode.
+ struct AlignData {
+ //! Node type.
+ NodeType _nodeType;
+ //! Node flags.
+ NodeFlags _nodeFlags;
+ //! Align mode.
+ AlignMode _alignMode;
+ //! Not used by AlignNode.
+ uint8_t _reserved;
+ };
+
//! Data used by \ref InstNode.
struct InstData {
- //! Node type, see \ref NodeType.
- uint8_t _nodeType;
- //! Node flags, see \ref Flags.
- uint8_t _nodeFlags;
+ //! Node type.
+ NodeType _nodeType;
+ //! Node flags.
+ NodeFlags _nodeFlags;
//! Instruction operands count (used).
uint8_t _opCount;
//! Instruction operands capacity (allocated).
@@ -431,24 +470,24 @@ public:
//! Data used by \ref EmbedDataNode.
struct EmbedData {
- //! Node type, see \ref NodeType.
- uint8_t _nodeType;
- //! Node flags, see \ref Flags.
- uint8_t _nodeFlags;
- //! Type id, see \ref Type::Id.
- uint8_t _typeId;
+ //! Node type.
+ NodeType _nodeType;
+ //! Node flags.
+ NodeFlags _nodeFlags;
+ //! Type id.
+ TypeId _typeId;
//! Size of `_typeId`.
uint8_t _typeSize;
};
//! Data used by \ref SentinelNode.
struct SentinelData {
- //! Node type, see \ref NodeType.
- uint8_t _nodeType;
- //! Node flags, see \ref Flags.
- uint8_t _nodeFlags;
+ //! Node type.
+ NodeType _nodeType;
+ //! Node flags.
+ NodeFlags _nodeFlags;
//! Sentinel type.
- uint8_t _sentinelType;
+ SentinelType _sentinelType;
//! Not used by BaseNode.
uint8_t _reserved1;
};
@@ -457,6 +496,8 @@ public:
union {
//! Data useful by any node type.
AnyData _any;
+ //! Data specific to \ref AlignNode.
+ AlignData _alignData;
//! Data specific to \ref InstNode.
InstData _inst;
//! Data specific to \ref EmbedDataNode.
@@ -482,84 +523,17 @@ public:
//! Inline comment/annotation or nullptr if not used.
const char* _inlineComment;
- //! Type of `BaseNode`.
- enum NodeType : uint32_t {
- //! Invalid node (internal, don't use).
- kNodeNone = 0,
-
- // [BaseBuilder]
-
- //! Node is \ref InstNode or \ref InstExNode.
- kNodeInst = 1,
- //! Node is \ref SectionNode.
- kNodeSection = 2,
- //! Node is \ref LabelNode.
- kNodeLabel = 3,
- //! Node is \ref AlignNode.
- kNodeAlign = 4,
- //! Node is \ref EmbedDataNode.
- kNodeEmbedData = 5,
- //! Node is \ref EmbedLabelNode.
- kNodeEmbedLabel = 6,
- //! Node is \ref EmbedLabelDeltaNode.
- kNodeEmbedLabelDelta = 7,
- //! Node is \ref ConstPoolNode.
- kNodeConstPool = 8,
- //! Node is \ref CommentNode.
- kNodeComment = 9,
- //! Node is \ref SentinelNode.
- kNodeSentinel = 10,
-
- // [BaseCompiler]
-
- //! Node is \ref JumpNode (acts as InstNode).
- kNodeJump = 15,
- //! Node is \ref FuncNode (acts as LabelNode).
- kNodeFunc = 16,
- //! Node is \ref FuncRetNode (acts as InstNode).
- kNodeFuncRet = 17,
- //! Node is \ref InvokeNode (acts as InstNode).
- kNodeInvoke = 18,
-
- // [UserDefined]
-
- //! First id of a user-defined node.
- kNodeUser = 32,
-
-#ifndef ASMJIT_NO_DEPRECATED
- kNodeFuncCall = kNodeInvoke
-#endif // !ASMJIT_NO_DEPRECATED
- };
-
- //! Node flags, specify what the node is and/or does.
- enum Flags : uint32_t {
- //! Node is code that can be executed (instruction, label, align, etc...).
- kFlagIsCode = 0x01u,
- //! Node is data that cannot be executed (data, const-pool, etc...).
- kFlagIsData = 0x02u,
- //! Node is informative, can be removed and ignored.
- kFlagIsInformative = 0x04u,
- //! Node can be safely removed if unreachable.
- kFlagIsRemovable = 0x08u,
- //! Node does nothing when executed (label, align, explicit nop).
- kFlagHasNoEffect = 0x10u,
- //! Node is an instruction or acts as it.
- kFlagActsAsInst = 0x20u,
- //! Node is a label or acts as it.
- kFlagActsAsLabel = 0x40u,
- //! Node is active (part of the code).
- kFlagIsActive = 0x80u
- };
+ //! \}
//! \name Construction & Destruction
//! \{
//! Creates a new `BaseNode` - always use `BaseBuilder` to allocate nodes.
- ASMJIT_INLINE BaseNode(BaseBuilder* cb, uint32_t type, uint32_t flags = 0) noexcept {
+ inline BaseNode(BaseBuilder* cb, NodeType nodeType, NodeFlags nodeFlags = NodeFlags::kNone) noexcept {
_prev = nullptr;
_next = nullptr;
- _any._nodeType = uint8_t(type);
- _any._nodeFlags = uint8_t(flags | cb->_nodeFlags);
+ _any._nodeType = nodeType;
+ _any._nodeFlags = nodeFlags | cb->_nodeFlags;
_any._reserved0 = 0;
_any._reserved1 = 0;
_position = 0;
@@ -588,71 +562,65 @@ public:
inline BaseNode* next() const noexcept { return _next; }
//! Returns the type of the node, see `NodeType`.
- inline uint32_t type() const noexcept { return _any._nodeType; }
+ inline NodeType type() const noexcept { return _any._nodeType; }
//! Sets the type of the node, see `NodeType` (internal).
//!
- //! \remarks You should never set a type of a node to anything else than the
- //! initial value. This function is only provided for users that use custom
- //! nodes and need to change the type either during construction or later.
- inline void setType(uint32_t type) noexcept { _any._nodeType = uint8_t(type); }
+ //! \remarks You should never set a type of a node to anything else than the initial value. This function is only
+ //! provided for users that use custom nodes and need to change the type either during construction or later.
+ inline void setType(NodeType type) noexcept { _any._nodeType = type; }
//! Tests whether this node is either `InstNode` or extends it.
- inline bool isInst() const noexcept { return hasFlag(kFlagActsAsInst); }
+ inline bool isInst() const noexcept { return hasFlag(NodeFlags::kActsAsInst); }
//! Tests whether this node is `SectionNode`.
- inline bool isSection() const noexcept { return type() == kNodeSection; }
+ inline bool isSection() const noexcept { return type() == NodeType::kSection; }
//! Tests whether this node is either `LabelNode` or extends it.
- inline bool isLabel() const noexcept { return hasFlag(kFlagActsAsLabel); }
+ inline bool isLabel() const noexcept { return hasFlag(NodeFlags::kActsAsLabel); }
//! Tests whether this node is `AlignNode`.
- inline bool isAlign() const noexcept { return type() == kNodeAlign; }
+ inline bool isAlign() const noexcept { return type() == NodeType::kAlign; }
//! Tests whether this node is `EmbedDataNode`.
- inline bool isEmbedData() const noexcept { return type() == kNodeEmbedData; }
+ inline bool isEmbedData() const noexcept { return type() == NodeType::kEmbedData; }
//! Tests whether this node is `EmbedLabelNode`.
- inline bool isEmbedLabel() const noexcept { return type() == kNodeEmbedLabel; }
+ inline bool isEmbedLabel() const noexcept { return type() == NodeType::kEmbedLabel; }
//! Tests whether this node is `EmbedLabelDeltaNode`.
- inline bool isEmbedLabelDelta() const noexcept { return type() == kNodeEmbedLabelDelta; }
+ inline bool isEmbedLabelDelta() const noexcept { return type() == NodeType::kEmbedLabelDelta; }
//! Tests whether this node is `ConstPoolNode`.
- inline bool isConstPool() const noexcept { return type() == kNodeConstPool; }
+ inline bool isConstPool() const noexcept { return type() == NodeType::kConstPool; }
//! Tests whether this node is `CommentNode`.
- inline bool isComment() const noexcept { return type() == kNodeComment; }
+ inline bool isComment() const noexcept { return type() == NodeType::kComment; }
//! Tests whether this node is `SentinelNode`.
- inline bool isSentinel() const noexcept { return type() == kNodeSentinel; }
+ inline bool isSentinel() const noexcept { return type() == NodeType::kSentinel; }
//! Tests whether this node is `FuncNode`.
- inline bool isFunc() const noexcept { return type() == kNodeFunc; }
+ inline bool isFunc() const noexcept { return type() == NodeType::kFunc; }
//! Tests whether this node is `FuncRetNode`.
- inline bool isFuncRet() const noexcept { return type() == kNodeFuncRet; }
+ inline bool isFuncRet() const noexcept { return type() == NodeType::kFuncRet; }
//! Tests whether this node is `InvokeNode`.
- inline bool isInvoke() const noexcept { return type() == kNodeInvoke; }
+ inline bool isInvoke() const noexcept { return type() == NodeType::kInvoke; }
-#ifndef ASMJIT_NO_DEPRECATED
- ASMJIT_DEPRECATED("Use isInvoke")
- inline bool isFuncCall() const noexcept { return isInvoke(); }
-#endif // !ASMJIT_NO_DEPRECATED
-
- //! Returns the node flags, see \ref Flags.
- inline uint32_t flags() const noexcept { return _any._nodeFlags; }
+ //! Returns the node flags.
+ inline NodeFlags flags() const noexcept { return _any._nodeFlags; }
//! Tests whether the node has the given `flag` set.
- inline bool hasFlag(uint32_t flag) const noexcept { return (uint32_t(_any._nodeFlags) & flag) != 0; }
+ inline bool hasFlag(NodeFlags flag) const noexcept { return Support::test(_any._nodeFlags, flag); }
//! Replaces node flags with `flags`.
- inline void setFlags(uint32_t flags) noexcept { _any._nodeFlags = uint8_t(flags); }
+ inline void setFlags(NodeFlags flags) noexcept { _any._nodeFlags = flags; }
//! Adds the given `flags` to node flags.
- inline void addFlags(uint32_t flags) noexcept { _any._nodeFlags = uint8_t(_any._nodeFlags | flags); }
+ inline void addFlags(NodeFlags flags) noexcept { _any._nodeFlags |= flags; }
//! Clears the given `flags` from node flags.
- inline void clearFlags(uint32_t flags) noexcept { _any._nodeFlags = uint8_t(_any._nodeFlags & (flags ^ 0xFF)); }
+ inline void clearFlags(NodeFlags flags) noexcept { _any._nodeFlags &= ~flags; }
//! Tests whether the node is code that can be executed.
- inline bool isCode() const noexcept { return hasFlag(kFlagIsCode); }
+ inline bool isCode() const noexcept { return hasFlag(NodeFlags::kIsCode); }
//! Tests whether the node is data that cannot be executed.
- inline bool isData() const noexcept { return hasFlag(kFlagIsData); }
+ inline bool isData() const noexcept { return hasFlag(NodeFlags::kIsData); }
//! Tests whether the node is informative only (is never encoded like comment, etc...).
- inline bool isInformative() const noexcept { return hasFlag(kFlagIsInformative); }
+ inline bool isInformative() const noexcept { return hasFlag(NodeFlags::kIsInformative); }
//! Tests whether the node is removable if it's in an unreachable code block.
- inline bool isRemovable() const noexcept { return hasFlag(kFlagIsRemovable); }
+ inline bool isRemovable() const noexcept { return hasFlag(NodeFlags::kIsRemovable); }
//! Tests whether the node has no effect when executed (label, .align, nop, ...).
- inline bool hasNoEffect() const noexcept { return hasFlag(kFlagHasNoEffect); }
+ inline bool hasNoEffect() const noexcept { return hasFlag(NodeFlags::kHasNoEffect); }
//! Tests whether the node is part of the code.
- inline bool isActive() const noexcept { return hasFlag(kFlagIsActive); }
+ inline bool isActive() const noexcept { return hasFlag(NodeFlags::kIsActive); }
//! Tests whether the node has a position assigned.
//!
@@ -662,20 +630,18 @@ public:
inline uint32_t position() const noexcept { return _position; }
//! Sets node position.
//!
- //! Node position is a 32-bit unsigned integer that is used by Compiler to
- //! track where the node is relatively to the start of the function. It doesn't
- //! describe a byte position in a binary, instead it's just a pseudo position
+ //! Node position is a 32-bit unsigned integer that is used by Compiler to track where the node is relatively to
+ //! the start of the function. It doesn't describe a byte position in a binary, instead it's just a pseudo position
//! used by liveness analysis and other tools around Compiler.
//!
- //! If you don't use Compiler then you may use `position()` and `setPosition()`
- //! freely for your own purposes if the 32-bit value limit is okay for you.
+ //! If you don't use Compiler then you may use `position()` and `setPosition()` freely for your own purposes if
+ //! the 32-bit value limit is okay for you.
inline void setPosition(uint32_t position) noexcept { _position = position; }
//! Returns user data casted to `T*`.
//!
- //! User data is decicated to be used only by AsmJit users and not touched
- //! by the library. The data has a pointer size so you can either store a
- //! pointer or `intptr_t` value through `setUserDataAsIntPtr()`.
+ //! User data is decicated to be used only by AsmJit users and not touched by the library. The data has a pointer
+ //! size so you can either store a pointer or `intptr_t` value through `setUserDataAsIntPtr()`.
template<typename T>
inline T* userDataAsPtr() const noexcept { return static_cast<T*>(_userDataPtr); }
//! Returns user data casted to `int64_t`.
@@ -717,10 +683,6 @@ public:
//! \}
};
-// ============================================================================
-// [asmjit::InstNode]
-// ============================================================================
-
//! Instruction node.
//!
//! Wraps an instruction with its options and operands.
@@ -728,25 +690,34 @@ class InstNode : public BaseNode {
public:
ASMJIT_NONCOPYABLE(InstNode)
+ //! \name Constants
+ //! \{
+
enum : uint32_t {
- //! Count of embedded operands per `InstNode` that are always allocated as
- //! a part of the instruction. Minimum embedded operands is 4, but in 32-bit
- //! more pointers are smaller and we can embed 5. The rest (up to 6 operands)
+ //! Count of embedded operands per `InstNode` that are always allocated as a part of the instruction. Minimum
+ //! embedded operands is 4, but in 32-bit more pointers are smaller and we can embed 5. The rest (up to 6 operands)
//! is always stored in `InstExNode`.
kBaseOpCapacity = uint32_t((128 - sizeof(BaseNode) - sizeof(BaseInst)) / sizeof(Operand_))
};
+ //! \}
+
+ //! \name Members
+ //! \{
+
//! Base instruction data.
BaseInst _baseInst;
//! First 4 or 5 operands (indexed from 0).
Operand_ _opArray[kBaseOpCapacity];
+ //! \}
+
//! \name Construction & Destruction
//! \{
//! Creates a new `InstNode` instance.
- ASMJIT_INLINE InstNode(BaseBuilder* cb, uint32_t instId, uint32_t options, uint32_t opCount, uint32_t opCapacity = kBaseOpCapacity) noexcept
- : BaseNode(cb, kNodeInst, kFlagIsCode | kFlagIsRemovable | kFlagActsAsInst),
+ inline InstNode(BaseBuilder* cb, InstId instId, InstOptions options, uint32_t opCount, uint32_t opCapacity = kBaseOpCapacity) noexcept
+ : BaseNode(cb, NodeType::kInst, NodeFlags::kIsCode | NodeFlags::kIsRemovable | NodeFlags::kActsAsInst),
_baseInst(instId, options) {
_inst._opCapacity = uint8_t(opCapacity);
_inst._opCount = uint8_t(opCount);
@@ -762,25 +733,41 @@ public:
//! \}
- //! \name Accessors
+ //! \name Instruction Object
//! \{
inline BaseInst& baseInst() noexcept { return _baseInst; }
inline const BaseInst& baseInst() const noexcept { return _baseInst; }
+ //! \}
+
+ //! \name Instruction Id
+ //! \{
+
//! Returns the instruction id, see `BaseInst::Id`.
- inline uint32_t id() const noexcept { return _baseInst.id(); }
+ inline InstId id() const noexcept { return _baseInst.id(); }
+ //! Returns the instruction real id, see `BaseInst::Id`.
+ inline InstId realId() const noexcept { return _baseInst.realId(); }
+
//! Sets the instruction id to `id`, see `BaseInst::Id`.
- inline void setId(uint32_t id) noexcept { _baseInst.setId(id); }
+ inline void setId(InstId id) noexcept { _baseInst.setId(id); }
+
+ //! \}
+
+ //! \name Instruction Options
+ //! \{
- //! Returns instruction options.
- inline uint32_t instOptions() const noexcept { return _baseInst.options(); }
- //! Sets instruction options.
- inline void setInstOptions(uint32_t options) noexcept { _baseInst.setOptions(options); }
- //! Adds instruction options.
- inline void addInstOptions(uint32_t options) noexcept { _baseInst.addOptions(options); }
- //! Clears instruction options.
- inline void clearInstOptions(uint32_t options) noexcept { _baseInst.clearOptions(options); }
+ inline InstOptions options() const noexcept { return _baseInst.options(); }
+ inline bool hasOption(InstOptions option) const noexcept { return _baseInst.hasOption(option); }
+ inline void setOptions(InstOptions options) noexcept { _baseInst.setOptions(options); }
+ inline void addOptions(InstOptions options) noexcept { _baseInst.addOptions(options); }
+ inline void clearOptions(InstOptions options) noexcept { _baseInst.clearOptions(options); }
+ inline void resetOptions() noexcept { _baseInst.resetOptions(); }
+
+ //! \}
+
+ //! \name Extra Register
+ //! \{
//! Tests whether the node has an extra register operand.
inline bool hasExtraReg() const noexcept { return _baseInst.hasExtraReg(); }
@@ -795,6 +782,11 @@ public:
//! Resets extra register operand.
inline void resetExtraReg() noexcept { _baseInst.resetExtraReg(); }
+ //! \}
+
+ //! \name Instruction Operands
+ //! \{
+
//! Returns operand count.
inline uint32_t opCount() const noexcept { return _inst._opCount; }
//! Returns operand capacity.
@@ -843,19 +835,19 @@ public:
//! \name Utilities
//! \{
- inline bool hasOpType(uint32_t opType) const noexcept {
+ inline bool hasOpType(OperandType opType) const noexcept {
for (uint32_t i = 0, count = opCount(); i < count; i++)
if (_opArray[i].opType() == opType)
return true;
return false;
}
- inline bool hasRegOp() const noexcept { return hasOpType(Operand::kOpReg); }
- inline bool hasMemOp() const noexcept { return hasOpType(Operand::kOpMem); }
- inline bool hasImmOp() const noexcept { return hasOpType(Operand::kOpImm); }
- inline bool hasLabelOp() const noexcept { return hasOpType(Operand::kOpLabel); }
+ inline bool hasRegOp() const noexcept { return hasOpType(OperandType::kReg); }
+ inline bool hasMemOp() const noexcept { return hasOpType(OperandType::kMem); }
+ inline bool hasImmOp() const noexcept { return hasOpType(OperandType::kImm); }
+ inline bool hasLabelOp() const noexcept { return hasOpType(OperandType::kLabel); }
- inline uint32_t indexOfOpType(uint32_t opType) const noexcept {
+ inline uint32_t indexOfOpType(OperandType opType) const noexcept {
uint32_t i = 0;
uint32_t count = opCount();
@@ -868,9 +860,9 @@ public:
return i;
}
- inline uint32_t indexOfMemOp() const noexcept { return indexOfOpType(Operand::kOpMem); }
- inline uint32_t indexOfImmOp() const noexcept { return indexOfOpType(Operand::kOpImm); }
- inline uint32_t indexOfLabelOp() const noexcept { return indexOfOpType(Operand::kOpLabel); }
+ inline uint32_t indexOfMemOp() const noexcept { return indexOfOpType(OperandType::kMem); }
+ inline uint32_t indexOfImmOp() const noexcept { return indexOfOpType(OperandType::kImm); }
+ inline uint32_t indexOfLabelOp() const noexcept { return indexOfOpType(OperandType::kLabel); }
//! \}
@@ -881,7 +873,7 @@ public:
inline uint32_t* _getRewriteArray() noexcept { return &_baseInst._extraReg._id; }
inline const uint32_t* _getRewriteArray() const noexcept { return &_baseInst._extraReg._id; }
- ASMJIT_INLINE uint32_t getRewriteIndex(const uint32_t* id) const noexcept {
+ inline uint32_t getRewriteIndex(const uint32_t* id) const noexcept {
const uint32_t* array = _getRewriteArray();
ASMJIT_ASSERT(array <= id);
@@ -891,7 +883,7 @@ public:
return uint32_t(index);
}
- ASMJIT_INLINE void rewriteIdAtIndex(uint32_t index, uint32_t id) noexcept {
+ inline void rewriteIdAtIndex(uint32_t index, uint32_t id) noexcept {
uint32_t* array = _getRewriteArray();
array[index] = id;
}
@@ -916,58 +908,59 @@ public:
//! \}
};
-// ============================================================================
-// [asmjit::InstExNode]
-// ============================================================================
-
//! Instruction node with maximum number of operands.
//!
-//! This node is created automatically by Builder/Compiler in case that the
-//! required number of operands exceeds the default capacity of `InstNode`.
+//! This node is created automatically by Builder/Compiler in case that the required number of operands exceeds
+//! the default capacity of `InstNode`.
class InstExNode : public InstNode {
public:
ASMJIT_NONCOPYABLE(InstExNode)
+ //! \name Members
+ //! \{
+
//! Continued `_opArray[]` to hold up to `kMaxOpCount` operands.
Operand_ _opArrayEx[Globals::kMaxOpCount - kBaseOpCapacity];
+ //! \}
+
//! \name Construction & Destruction
//! \{
//! Creates a new `InstExNode` instance.
- inline InstExNode(BaseBuilder* cb, uint32_t instId, uint32_t options, uint32_t opCapacity = Globals::kMaxOpCount) noexcept
+ inline InstExNode(BaseBuilder* cb, InstId instId, InstOptions options, uint32_t opCapacity = Globals::kMaxOpCount) noexcept
: InstNode(cb, instId, options, opCapacity) {}
//! \}
};
-// ============================================================================
-// [asmjit::SectionNode]
-// ============================================================================
-
//! Section node.
class SectionNode : public BaseNode {
public:
ASMJIT_NONCOPYABLE(SectionNode)
+ //! \name Members
+ //! \{
+
//! Section id.
uint32_t _id;
//! Next section node that follows this section.
//!
- //! This link is only valid when the section is active (is part of the code)
- //! and when `Builder::hasDirtySectionLinks()` returns `false`. If you intend
- //! to use this field you should always call `Builder::updateSectionLinks()`
- //! before you do so.
+ //! This link is only valid when the section is active (is part of the code) and when `Builder::hasDirtySectionLinks()`
+ //! returns `false`. If you intend to use this field you should always call `Builder::updateSectionLinks()` before you
+ //! do so.
SectionNode* _nextSection;
+ //! \}
+
//! \name Construction & Destruction
//! \{
//! Creates a new `SectionNode` instance.
- inline SectionNode(BaseBuilder* cb, uint32_t id = 0) noexcept
- : BaseNode(cb, kNodeSection, kFlagHasNoEffect),
- _id(id),
+ inline SectionNode(BaseBuilder* cb, uint32_t secionId = 0) noexcept
+ : BaseNode(cb, NodeType::kSection, NodeFlags::kHasNoEffect),
+ _id(secionId),
_nextSection(nullptr) {}
//! \}
@@ -981,24 +974,25 @@ public:
//! \}
};
-// ============================================================================
-// [asmjit::LabelNode]
-// ============================================================================
-
//! Label node.
class LabelNode : public BaseNode {
public:
ASMJIT_NONCOPYABLE(LabelNode)
+ //! \name Members
+ //! \{
+
//! Label identifier.
uint32_t _labelId;
+ //! \}
+
//! \name Construction & Destruction
//! \{
//! Creates a new `LabelNode` instance.
inline LabelNode(BaseBuilder* cb, uint32_t labelId = 0) noexcept
- : BaseNode(cb, kNodeLabel, kFlagHasNoEffect | kFlagActsAsLabel),
+ : BaseNode(cb, NodeType::kLabel, NodeFlags::kHasNoEffect | NodeFlags::kActsAsLabel),
_labelId(labelId) {}
//! \}
@@ -1012,17 +1006,8 @@ public:
inline uint32_t labelId() const noexcept { return _labelId; }
//! \}
-
-#ifndef ASMJIT_NO_DEPRECATED
- ASMJIT_DEPRECATED("Use labelId() instead")
- inline uint32_t id() const noexcept { return labelId(); }
-#endif // !ASMJIT_NO_DEPRECATED
};
-// ============================================================================
-// [asmjit::AlignNode]
-// ============================================================================
-
//! Align directive (BaseBuilder).
//!
//! Wraps `.align` directive.
@@ -1030,19 +1015,24 @@ class AlignNode : public BaseNode {
public:
ASMJIT_NONCOPYABLE(AlignNode)
- //! Align mode, see `AlignMode`.
- uint32_t _alignMode;
+ //! \name Members
+ //! \{
+
//! Alignment (in bytes).
uint32_t _alignment;
+ //! \}
+
//! \name Construction & Destruction
//! \{
//! Creates a new `AlignNode` instance.
- inline AlignNode(BaseBuilder* cb, uint32_t alignMode, uint32_t alignment) noexcept
- : BaseNode(cb, kNodeAlign, kFlagIsCode | kFlagHasNoEffect),
- _alignMode(alignMode),
- _alignment(alignment) {}
+ inline AlignNode(BaseBuilder* cb, AlignMode alignMode, uint32_t alignment) noexcept
+ : BaseNode(cb, NodeType::kAlign, NodeFlags::kIsCode | NodeFlags::kHasNoEffect) {
+
+ _alignData._alignMode = alignMode;
+ _alignment = alignment;
+ }
//! \}
@@ -1050,9 +1040,9 @@ public:
//! \{
//! Returns align mode.
- inline uint32_t alignMode() const noexcept { return _alignMode; }
+ inline AlignMode alignMode() const noexcept { return _alignData._alignMode; }
//! Sets align mode to `alignMode`.
- inline void setAlignMode(uint32_t alignMode) noexcept { _alignMode = alignMode; }
+ inline void setAlignMode(AlignMode alignMode) noexcept { _alignData._alignMode = alignMode; }
//! Returns align offset in bytes.
inline uint32_t alignment() const noexcept { return _alignment; }
@@ -1062,22 +1052,22 @@ public:
//! \}
};
-// ============================================================================
-// [asmjit::EmbedDataNode]
-// ============================================================================
-
//! Embed data node.
//!
-//! Wraps `.data` directive. The node contains data that will be placed at the
-//! node's position in the assembler stream. The data is considered to be RAW;
-//! no analysis nor byte-order conversion is performed on RAW data.
+//! Wraps `.data` directive. The node contains data that will be placed at the node's position in the assembler
+//! stream. The data is considered to be RAW; no analysis nor byte-order conversion is performed on RAW data.
class EmbedDataNode : public BaseNode {
public:
ASMJIT_NONCOPYABLE(EmbedDataNode)
+ //! \cond INTERNAL
enum : uint32_t {
kInlineBufferSize = 128 - (sizeof(BaseNode) + sizeof(size_t) * 2)
};
+ //! \endcond
+
+ //! \name Members
+ //! \{
size_t _itemCount;
size_t _repeatCount;
@@ -1087,15 +1077,17 @@ public:
uint8_t _inlineData[kInlineBufferSize];
};
+ //! \}
+
//! \name Construction & Destruction
//! \{
//! Creates a new `EmbedDataNode` instance.
inline EmbedDataNode(BaseBuilder* cb) noexcept
- : BaseNode(cb, kNodeEmbedData, kFlagIsData),
+ : BaseNode(cb, NodeType::kEmbedData, NodeFlags::kIsData),
_itemCount(0),
_repeatCount(0) {
- _embed._typeId = uint8_t(Type::kIdU8),
+ _embed._typeId = TypeId::kUInt8;
_embed._typeSize = uint8_t(1);
memset(_inlineData, 0, kInlineBufferSize);
}
@@ -1105,8 +1097,8 @@ public:
//! \name Accessors
//! \{
- //! Returns \ref Type::Id of the data.
- inline uint32_t typeId() const noexcept { return _embed._typeId; }
+ //! Returns data type as \ref TypeId.
+ inline TypeId typeId() const noexcept { return _embed._typeId; }
//! Returns the size of a single data element.
inline uint32_t typeSize() const noexcept { return _embed._typeSize; }
@@ -1135,24 +1127,27 @@ public:
//! \}
};
-// ============================================================================
-// [asmjit::EmbedLabelNode]
-// ============================================================================
-
//! Label data node.
class EmbedLabelNode : public BaseNode {
public:
ASMJIT_NONCOPYABLE(EmbedLabelNode)
+ //! \name Members
+ //! \{
+
uint32_t _labelId;
+ uint32_t _dataSize;
+
+ //! \}
//! \name Construction & Destruction
//! \{
//! Creates a new `EmbedLabelNode` instance.
- inline EmbedLabelNode(BaseBuilder* cb, uint32_t labelId = 0) noexcept
- : BaseNode(cb, kNodeEmbedLabel, kFlagIsData),
- _labelId(labelId) {}
+ inline EmbedLabelNode(BaseBuilder* cb, uint32_t labelId = 0, uint32_t dataSize = 0) noexcept
+ : BaseNode(cb, NodeType::kEmbedLabel, NodeFlags::kIsData),
+ _labelId(labelId),
+ _dataSize(dataSize) {}
//! \}
@@ -1169,33 +1164,34 @@ public:
//! Sets the label id (use with caution, improper use can break a lot of things).
inline void setLabelId(uint32_t labelId) noexcept { _labelId = labelId; }
- //! \}
+ //! Returns the data size.
+ inline uint32_t dataSize() const noexcept { return _dataSize; }
+ //! Sets the data size.
+ inline void setDataSize(uint32_t dataSize) noexcept { _dataSize = dataSize; }
-#ifndef ASMJIT_NO_DEPRECATED
- ASMJIT_DEPRECATED("Use labelId() instead")
- inline uint32_t id() const noexcept { return labelId(); }
-#endif // !ASMJIT_NO_DEPRECATED
+ //! \}
};
-// ============================================================================
-// [asmjit::EmbedLabelDeltaNode]
-// ============================================================================
-
//! Label data node.
class EmbedLabelDeltaNode : public BaseNode {
public:
ASMJIT_NONCOPYABLE(EmbedLabelDeltaNode)
+ //! \name Members
+ //! \{
+
uint32_t _labelId;
uint32_t _baseLabelId;
uint32_t _dataSize;
+ //! \}
+
//! \name Construction & Destruction
//! \{
//! Creates a new `EmbedLabelDeltaNode` instance.
inline EmbedLabelDeltaNode(BaseBuilder* cb, uint32_t labelId = 0, uint32_t baseLabelId = 0, uint32_t dataSize = 0) noexcept
- : BaseNode(cb, kNodeEmbedLabelDelta, kFlagIsData),
+ : BaseNode(cb, NodeType::kEmbedLabelDelta, NodeFlags::kIsData),
_labelId(labelId),
_baseLabelId(baseLabelId),
_dataSize(dataSize) {}
@@ -1231,33 +1227,20 @@ public:
inline void setDataSize(uint32_t dataSize) noexcept { _dataSize = dataSize; }
//! \}
-
-#ifndef ASMJIT_NO_DEPRECATED
- ASMJIT_DEPRECATED("Use labelId() instead")
- inline uint32_t id() const noexcept { return labelId(); }
-
- ASMJIT_DEPRECATED("Use setLabelId() instead")
- inline void setId(uint32_t id) noexcept { setLabelId(id); }
-
- ASMJIT_DEPRECATED("Use baseLabelId() instead")
- inline uint32_t baseId() const noexcept { return baseLabelId(); }
-
- ASMJIT_DEPRECATED("Use setBaseLabelId() instead")
- inline void setBaseId(uint32_t id) noexcept { setBaseLabelId(id); }
-#endif // !ASMJIT_NO_DEPRECATED
};
-// ============================================================================
-// [asmjit::ConstPoolNode]
-// ============================================================================
-
//! A node that wraps `ConstPool`.
class ConstPoolNode : public LabelNode {
public:
ASMJIT_NONCOPYABLE(ConstPoolNode)
+ //! \name Members
+ //! \{
+
ConstPool _constPool;
+ //! \}
+
//! \name Construction & Destruction
//! \{
@@ -1266,9 +1249,9 @@ public:
: LabelNode(cb, id),
_constPool(&cb->_codeZone) {
- setType(kNodeConstPool);
- addFlags(kFlagIsData);
- clearFlags(kFlagIsCode | kFlagHasNoEffect);
+ setType(NodeType::kConstPool);
+ addFlags(NodeFlags::kIsData);
+ clearFlags(NodeFlags::kIsCode | NodeFlags::kHasNoEffect);
}
//! \}
@@ -1301,10 +1284,6 @@ public:
//! \}
};
-// ============================================================================
-// [asmjit::CommentNode]
-// ============================================================================
-
//! Comment node.
class CommentNode : public BaseNode {
public:
@@ -1315,41 +1294,29 @@ public:
//! Creates a new `CommentNode` instance.
inline CommentNode(BaseBuilder* cb, const char* comment) noexcept
- : BaseNode(cb, kNodeComment, kFlagIsInformative | kFlagHasNoEffect | kFlagIsRemovable) {
+ : BaseNode(cb, NodeType::kComment, NodeFlags::kIsInformative | NodeFlags::kHasNoEffect | NodeFlags::kIsRemovable) {
_inlineComment = comment;
}
//! \}
};
-// ============================================================================
-// [asmjit::SentinelNode]
-// ============================================================================
-
//! Sentinel node.
//!
-//! Sentinel is a marker that is completely ignored by the code builder. It's
-//! used to remember a position in a code as it never gets removed by any pass.
+//! Sentinel is a marker that is completely ignored by the code builder. It's used to remember a position in a code
+//! as it never gets removed by any pass.
class SentinelNode : public BaseNode {
public:
ASMJIT_NONCOPYABLE(SentinelNode)
- //! Type of the sentinel (purery informative purpose).
- enum SentinelType : uint32_t {
- //! Type of the sentinel is not known.
- kSentinelUnknown = 0u,
- //! This is a sentinel used at the end of \ref FuncNode.
- kSentinelFuncEnd = 1u
- };
-
//! \name Construction & Destruction
//! \{
//! Creates a new `SentinelNode` instance.
- inline SentinelNode(BaseBuilder* cb, uint32_t sentinelType = kSentinelUnknown) noexcept
- : BaseNode(cb, kNodeSentinel, kFlagIsInformative | kFlagHasNoEffect) {
+ inline SentinelNode(BaseBuilder* cb, SentinelType sentinelType = SentinelType::kUnknown) noexcept
+ : BaseNode(cb, NodeType::kSentinel, NodeFlags::kIsInformative | NodeFlags::kHasNoEffect) {
- _sentinel._sentinelType = uint8_t(sentinelType);
+ _sentinel._sentinelType = sentinelType;
}
//! \}
@@ -1358,32 +1325,33 @@ public:
//! \{
//! Returns the type of the sentinel.
- inline uint32_t sentinelType() const noexcept {
+ inline SentinelType sentinelType() const noexcept {
return _sentinel._sentinelType;
}
//! Sets the type of the sentinel.
- inline void setSentinelType(uint32_t type) noexcept {
- _sentinel._sentinelType = uint8_t(type);
+ inline void setSentinelType(SentinelType type) noexcept {
+ _sentinel._sentinelType = type;
}
//! \}
};
-// ============================================================================
-// [asmjit::Pass]
-// ============================================================================
-
//! Pass can be used to implement code transformations, analysis, and lowering.
class ASMJIT_VIRTAPI Pass {
public:
ASMJIT_BASE_CLASS(Pass)
ASMJIT_NONCOPYABLE(Pass)
+ //! \name Members
+ //! \{
+
//! BaseBuilder this pass is assigned to.
- BaseBuilder* _cb;
+ BaseBuilder* _cb = nullptr;
//! Name of the pass.
- const char* _name;
+ const char* _name = nullptr;
+
+ //! \}
//! \name Construction & Destruction
//! \{
@@ -1408,8 +1376,8 @@ public:
//! Processes the code stored in Builder or Compiler.
//!
- //! This is the only function that is called by the `BaseBuilder` to process
- //! the code. It passes `zone`, which will be reset after the `run()` finishes.
+ //! This is the only function that is called by the `BaseBuilder` to process the code. It passes `zone`,
+ //! which will be reset after the `run()` finishes.
virtual Error run(Zone* zone, Logger* logger) = 0;
//! \}
diff --git a/3rdparty/asmjit/src/asmjit/core/callconv.cpp b/3rdparty/asmjit/src/asmjit/core/callconv.cpp
deleted file mode 100644
index 722dbcdb238..00000000000
--- a/3rdparty/asmjit/src/asmjit/core/callconv.cpp
+++ /dev/null
@@ -1,59 +0,0 @@
-// AsmJit - Machine code generation for C++
-//
-// * Official AsmJit Home Page: https://asmjit.com
-// * Official Github Repository: https://github.com/asmjit/asmjit
-//
-// Copyright (c) 2008-2020 The AsmJit Authors
-//
-// This software is provided 'as-is', without any express or implied
-// warranty. In no event will the authors be held liable for any damages
-// arising from the use of this software.
-//
-// Permission is granted to anyone to use this software for any purpose,
-// including commercial applications, and to alter it and redistribute it
-// freely, subject to the following restrictions:
-//
-// 1. The origin of this software must not be misrepresented; you must not
-// claim that you wrote the original software. If you use this software
-// in a product, an acknowledgment in the product documentation would be
-// appreciated but is not required.
-// 2. Altered source versions must be plainly marked as such, and must not be
-// misrepresented as being the original software.
-// 3. This notice may not be removed or altered from any source distribution.
-
-#include "../core/api-build_p.h"
-#include "../core/arch.h"
-#include "../core/func.h"
-#include "../core/type.h"
-
-#ifdef ASMJIT_BUILD_X86
- #include "../x86/x86callconv_p.h"
-#endif
-
-#ifdef ASMJIT_BUILD_ARM
- #include "../arm/armcallconv_p.h"
-#endif
-
-ASMJIT_BEGIN_NAMESPACE
-
-// ============================================================================
-// [asmjit::CallConv - Init / Reset]
-// ============================================================================
-
-ASMJIT_FAVOR_SIZE Error CallConv::init(uint32_t ccId, const Environment& environment) noexcept {
- reset();
-
-#ifdef ASMJIT_BUILD_X86
- if (environment.isFamilyX86())
- return x86::CallConvInternal::init(*this, ccId, environment);
-#endif
-
-#ifdef ASMJIT_BUILD_ARM
- if (environment.isFamilyARM())
- return arm::CallConvInternal::init(*this, ccIdv, environment);
-#endif
-
- return DebugUtils::errored(kErrorInvalidArgument);
-}
-
-ASMJIT_END_NAMESPACE
diff --git a/3rdparty/asmjit/src/asmjit/core/callconv.h b/3rdparty/asmjit/src/asmjit/core/callconv.h
deleted file mode 100644
index 6e75540c545..00000000000
--- a/3rdparty/asmjit/src/asmjit/core/callconv.h
+++ /dev/null
@@ -1,374 +0,0 @@
-// AsmJit - Machine code generation for C++
-//
-// * Official AsmJit Home Page: https://asmjit.com
-// * Official Github Repository: https://github.com/asmjit/asmjit
-//
-// Copyright (c) 2008-2020 The AsmJit Authors
-//
-// This software is provided 'as-is', without any express or implied
-// warranty. In no event will the authors be held liable for any damages
-// arising from the use of this software.
-//
-// Permission is granted to anyone to use this software for any purpose,
-// including commercial applications, and to alter it and redistribute it
-// freely, subject to the following restrictions:
-//
-// 1. The origin of this software must not be misrepresented; you must not
-// claim that you wrote the original software. If you use this software
-// in a product, an acknowledgment in the product documentation would be
-// appreciated but is not required.
-// 2. Altered source versions must be plainly marked as such, and must not be
-// misrepresented as being the original software.
-// 3. This notice may not be removed or altered from any source distribution.
-
-#ifndef ASMJIT_CORE_CALLCONV_H_INCLUDED
-#define ASMJIT_CORE_CALLCONV_H_INCLUDED
-
-#include "../core/arch.h"
-#include "../core/operand.h"
-#include "../core/support.h"
-
-ASMJIT_BEGIN_NAMESPACE
-
-//! \addtogroup asmjit_function
-//! \{
-
-// ============================================================================
-// [asmjit::CallConv]
-// ============================================================================
-
-//! Function calling convention.
-//!
-//! Function calling convention is a scheme that defines how function parameters
-//! are passed and how function returns its result. AsmJit defines a variety of
-//! architecture and OS specific calling conventions and also provides a compile
-//! time detection to make the code-generation easier.
-struct CallConv {
- //! Calling convention id, see `Id`.
- uint8_t _id;
- //! Architecture identifier, see \ref Environment::Arch.
- uint8_t _arch;
- //! Register assignment strategy.
- uint8_t _strategy;
- //! Flags.
- uint8_t _flags;
-
- //! Red zone size (AMD64 == 128 bytes).
- uint8_t _redZoneSize;
- //! Spill zone size (WIN64 == 32 bytes).
- uint8_t _spillZoneSize;
- //! Natural stack alignment as defined by OS/ABI.
- uint8_t _naturalStackAlignment;
- uint8_t _reserved[1];
-
- //! Mask of all passed registers, per group.
- uint32_t _passedRegs[BaseReg::kGroupVirt];
- //! Mask of all preserved registers, per group.
- uint32_t _preservedRegs[BaseReg::kGroupVirt];
-
- //! Internal limits of AsmJit's CallConv.
- enum Limits : uint32_t {
- kMaxRegArgsPerGroup = 16
- };
-
- //! Passed registers' order.
- union RegOrder {
- //! Passed registers, ordered.
- uint8_t id[kMaxRegArgsPerGroup];
- uint32_t packed[(kMaxRegArgsPerGroup + 3) / 4];
- };
-
- //! Passed registers' order, per register group.
- RegOrder _passedOrder[BaseReg::kGroupVirt];
-
- //! Calling convention id.
- //!
- //! Calling conventions can be divided into the following groups:
- //!
- //! - Universal - calling conventions are applicable to any target. They
- //! will be converted to a target dependent calling convention at runtime
- //! by \ref init(). The purpose of these conventions is to make using
- //! functions less target dependent and closer to how they are declared
- //! in C and C++.
- //!
- //! - Target specific - calling conventions that are used by a particular
- //! architecture and ABI. For example Windows 64-bit calling convention
- //! and AMD64 SystemV calling convention.
- enum Id : uint32_t {
- //! None or invalid (can't be used).
- kIdNone = 0,
-
- // ------------------------------------------------------------------------
- // [Universal Calling Conventions]
- // ------------------------------------------------------------------------
-
- //! Standard function call or explicit `__cdecl` where it can be specified.
- //!
- //! This is a universal convention, which is used to initialize specific
- //! calling connventions based on architecture, platform, and its ABI.
- kIdCDecl = 1,
-
- //! `__stdcall` on targets that support this calling convention.
- //!
- //! \note This calling convention is only supported on 32-bit X86. If used
- //! on environment that doesn't support this calling convention \ref kIdCDecl
- //! will be used instead.
- kIdStdCall = 2,
-
- //! `__fastcall` on targets that support this calling convention.
- //!
- //! \note This calling convention is only supported on 32-bit X86. If used
- //! on environment that doesn't support this calling convention \ref kIdCDecl
- //! will be used instead.
- kIdFastCall = 3,
-
- //! `__vectorcall` on targets that support this calling convention.
- //!
- //! \note This calling convention is only supported on 32-bit and 64-bit
- //! X86 architecture on Windows platform. If used on environment that doesn't
- //! support this calling convention \ref kIdCDecl will be used instead.
- kIdVectorCall = 4,
-
- //! `__thiscall` on targets that support this calling convention.
- //!
- //! \note This calling convention is only supported on 32-bit X86 Windows
- //! platform. If used on environment that doesn't support this calling
- //! convention \ref kIdCDecl will be used instead.
- kIdThisCall = 5,
-
- //! `__attribute__((regparm(1)))` convention (GCC and Clang).
- kIdRegParm1 = 6,
- //! `__attribute__((regparm(2)))` convention (GCC and Clang).
- kIdRegParm2 = 7,
- //! `__attribute__((regparm(3)))` convention (GCC and Clang).
- kIdRegParm3 = 8,
-
- //! Soft-float calling convention (ARM).
- //!
- //! Floating point arguments are passed via general purpose registers.
- kIdSoftFloat = 9,
-
- //! Hard-float calling convention (ARM).
- //!
- //! Floating point arguments are passed via SIMD registers.
- kIdHardFloat = 10,
-
- //! AsmJit specific calling convention designed for calling functions
- //! inside a multimedia code that don't use many registers internally,
- //! but are long enough to be called and not inlined. These functions are
- //! usually used to calculate trigonometric functions, logarithms, etc...
- kIdLightCall2 = 16,
- kIdLightCall3 = 17,
- kIdLightCall4 = 18,
-
- // ------------------------------------------------------------------------
- // [ABI-Specific Calling Conventions]
- // ------------------------------------------------------------------------
-
- kIdX64SystemV = 32,
- kIdX64Windows = 33,
-
- // ------------------------------------------------------------------------
- // [Host]
- // ------------------------------------------------------------------------
-
- kIdHost =
-#if ASMJIT_ARCH_ARM == 32 && defined(__SOFTFP__)
- kIdSoftFloat
-#elif ASMJIT_ARCH_ARM == 32 && !defined(__SOFTFP__)
- kIdHardFloat
-#else
- kIdCDecl
-#endif
-
-#ifndef ASMJIT_NO_DEPRECATE
- , kIdHostCDecl = kIdCDecl
- , kIdHostStdCall = kIdStdCall
- , kIdHostFastCall = kIdFastCall
- , kIdHostLightCall2 = kIdLightCall2
- , kIdHostLightCall3 = kIdLightCall3
- , kIdHostLightCall4 = kIdLightCall4
-#endif // !ASMJIT_NO_DEPRECATE
- };
-
- //! Strategy used to assign registers to function arguments.
- //!
- //! This is AsmJit specific. It basically describes how AsmJit should convert
- //! the function arguments defined by `FuncSignature` into register IDs and
- //! stack offsets. The default strategy `kStrategyDefault` assigns registers
- //! and then stack whereas `kStrategyWin64` strategy does register shadowing
- //! as defined by WIN64 calling convention - it applies to 64-bit calling
- //! conventions only.
- enum Strategy : uint32_t {
- //! Default register assignment strategy.
- kStrategyDefault = 0,
- //! Windows 64-bit ABI register assignment strategy.
- kStrategyX64Windows = 1,
- //! Windows 64-bit __vectorcall register assignment strategy.
- kStrategyX64VectorCall = 2,
-
- //! Number of assignment strategies.
- kStrategyCount = 3
- };
-
- //! Calling convention flags.
- enum Flags : uint32_t {
- //! Callee is responsible for cleaning up the stack.
- kFlagCalleePopsStack = 0x01u,
- //! Pass vector arguments indirectly (as a pointer).
- kFlagIndirectVecArgs = 0x02u,
- //! Pass F32 and F64 arguments by VEC128 register.
- kFlagPassFloatsByVec = 0x04u,
- //! Pass MMX and vector arguments by stack if the function has variable arguments.
- kFlagPassVecByStackIfVA = 0x08u,
- //! MMX registers are passed and returned via GP registers.
- kFlagPassMmxByGp = 0x10u,
- //! MMX registers are passed and returned via XMM registers.
- kFlagPassMmxByXmm = 0x20u,
- //! Calling convention can be used with variable arguments.
- kFlagVarArgCompatible = 0x80u
- };
-
- //! \name Construction & Destruction
- //! \{
-
- //! Initializes this calling convention to the given `ccId` based on the
- //! `environment`.
- //!
- //! See \ref Id and \ref Environment for more details.
- ASMJIT_API Error init(uint32_t ccId, const Environment& environment) noexcept;
-
- //! Resets this CallConv struct into a defined state.
- //!
- //! It's recommended to reset the \ref CallConv struct in case you would
- //! like create a custom calling convention as it prevents from using an
- //! uninitialized data (CallConv doesn't have a constructor that would
- //! initialize it, it's just a struct).
- inline void reset() noexcept {
- memset(this, 0, sizeof(*this));
- memset(_passedOrder, 0xFF, sizeof(_passedOrder));
- }
-
- //! \}
-
- //! \name Accessors
- //! \{
-
- //! Returns the calling convention id, see `Id`.
- inline uint32_t id() const noexcept { return _id; }
- //! Sets the calling convention id, see `Id`.
- inline void setId(uint32_t id) noexcept { _id = uint8_t(id); }
-
- //! Returns the calling function architecture id.
- inline uint32_t arch() const noexcept { return _arch; }
- //! Sets the calling function architecture id.
- inline void setArch(uint32_t arch) noexcept { _arch = uint8_t(arch); }
-
- //! Returns the strategy used to assign registers to arguments, see `Strategy`.
- inline uint32_t strategy() const noexcept { return _strategy; }
- //! Sets the strategy used to assign registers to arguments, see `Strategy`.
- inline void setStrategy(uint32_t strategy) noexcept { _strategy = uint8_t(strategy); }
-
- //! Tests whether the calling convention has the given `flag` set.
- inline bool hasFlag(uint32_t flag) const noexcept { return (uint32_t(_flags) & flag) != 0; }
- //! Returns the calling convention flags, see `Flags`.
- inline uint32_t flags() const noexcept { return _flags; }
- //! Adds the calling convention flags, see `Flags`.
- inline void setFlags(uint32_t flag) noexcept { _flags = uint8_t(flag); };
- //! Adds the calling convention flags, see `Flags`.
- inline void addFlags(uint32_t flags) noexcept { _flags = uint8_t(_flags | flags); };
-
- //! Tests whether this calling convention specifies 'RedZone'.
- inline bool hasRedZone() const noexcept { return _redZoneSize != 0; }
- //! Tests whether this calling convention specifies 'SpillZone'.
- inline bool hasSpillZone() const noexcept { return _spillZoneSize != 0; }
-
- //! Returns size of 'RedZone'.
- inline uint32_t redZoneSize() const noexcept { return _redZoneSize; }
- //! Returns size of 'SpillZone'.
- inline uint32_t spillZoneSize() const noexcept { return _spillZoneSize; }
-
- //! Sets size of 'RedZone'.
- inline void setRedZoneSize(uint32_t size) noexcept { _redZoneSize = uint8_t(size); }
- //! Sets size of 'SpillZone'.
- inline void setSpillZoneSize(uint32_t size) noexcept { _spillZoneSize = uint8_t(size); }
-
- //! Returns a natural stack alignment.
- inline uint32_t naturalStackAlignment() const noexcept { return _naturalStackAlignment; }
- //! Sets a natural stack alignment.
- //!
- //! This function can be used to override the default stack alignment in case
- //! that you know that it's alignment is different. For example it allows to
- //! implement custom calling conventions that guarantee higher stack alignment.
- inline void setNaturalStackAlignment(uint32_t value) noexcept { _naturalStackAlignment = uint8_t(value); }
-
- //! Returns the order of passed registers of the given `group`, see \ref BaseReg::RegGroup.
- inline const uint8_t* passedOrder(uint32_t group) const noexcept {
- ASMJIT_ASSERT(group < BaseReg::kGroupVirt);
- return _passedOrder[group].id;
- }
-
- //! Returns the mask of passed registers of the given `group`, see \ref BaseReg::RegGroup.
- inline uint32_t passedRegs(uint32_t group) const noexcept {
- ASMJIT_ASSERT(group < BaseReg::kGroupVirt);
- return _passedRegs[group];
- }
-
- inline void _setPassedPacked(uint32_t group, uint32_t p0, uint32_t p1, uint32_t p2, uint32_t p3) noexcept {
- ASMJIT_ASSERT(group < BaseReg::kGroupVirt);
-
- _passedOrder[group].packed[0] = p0;
- _passedOrder[group].packed[1] = p1;
- _passedOrder[group].packed[2] = p2;
- _passedOrder[group].packed[3] = p3;
- }
-
- //! Resets the order and mask of passed registers.
- inline void setPassedToNone(uint32_t group) noexcept {
- ASMJIT_ASSERT(group < BaseReg::kGroupVirt);
-
- _setPassedPacked(group, 0xFFFFFFFFu, 0xFFFFFFFFu, 0xFFFFFFFFu, 0xFFFFFFFFu);
- _passedRegs[group] = 0u;
- }
-
- //! Sets the order and mask of passed registers.
- inline void setPassedOrder(uint32_t group, uint32_t a0, uint32_t a1 = 0xFF, uint32_t a2 = 0xFF, uint32_t a3 = 0xFF, uint32_t a4 = 0xFF, uint32_t a5 = 0xFF, uint32_t a6 = 0xFF, uint32_t a7 = 0xFF) noexcept {
- ASMJIT_ASSERT(group < BaseReg::kGroupVirt);
-
- // NOTE: This should always be called with all arguments known at compile time,
- // so even if it looks scary it should be translated into few instructions.
- _setPassedPacked(group, Support::bytepack32_4x8(a0, a1, a2, a3),
- Support::bytepack32_4x8(a4, a5, a6, a7),
- 0xFFFFFFFFu,
- 0xFFFFFFFFu);
-
- _passedRegs[group] = (a0 != 0xFF ? 1u << a0 : 0u) |
- (a1 != 0xFF ? 1u << a1 : 0u) |
- (a2 != 0xFF ? 1u << a2 : 0u) |
- (a3 != 0xFF ? 1u << a3 : 0u) |
- (a4 != 0xFF ? 1u << a4 : 0u) |
- (a5 != 0xFF ? 1u << a5 : 0u) |
- (a6 != 0xFF ? 1u << a6 : 0u) |
- (a7 != 0xFF ? 1u << a7 : 0u) ;
- }
-
- //! Returns preserved register mask of the given `group`, see \ref BaseReg::RegGroup.
- inline uint32_t preservedRegs(uint32_t group) const noexcept {
- ASMJIT_ASSERT(group < BaseReg::kGroupVirt);
- return _preservedRegs[group];
- }
-
- //! Sets preserved register mask of the given `group`, see \ref BaseReg::RegGroup.
- inline void setPreservedRegs(uint32_t group, uint32_t regs) noexcept {
- ASMJIT_ASSERT(group < BaseReg::kGroupVirt);
- _preservedRegs[group] = regs;
- }
-
- //! \}
-};
-
-//! \}
-
-ASMJIT_END_NAMESPACE
-
-#endif // ASMJIT_CORE_CALLCONV_H_INCLUDED
diff --git a/3rdparty/asmjit/src/asmjit/core/codebuffer.h b/3rdparty/asmjit/src/asmjit/core/codebuffer.h
index 76c86b1f631..4946e7a06a1 100644
--- a/3rdparty/asmjit/src/asmjit/core/codebuffer.h
+++ b/3rdparty/asmjit/src/asmjit/core/codebuffer.h
@@ -1,42 +1,35 @@
-// AsmJit - Machine code generation for C++
+// This file is part of AsmJit project <https://asmjit.com>
//
-// * Official AsmJit Home Page: https://asmjit.com
-// * Official Github Repository: https://github.com/asmjit/asmjit
-//
-// Copyright (c) 2008-2020 The AsmJit Authors
-//
-// This software is provided 'as-is', without any express or implied
-// warranty. In no event will the authors be held liable for any damages
-// arising from the use of this software.
-//
-// Permission is granted to anyone to use this software for any purpose,
-// including commercial applications, and to alter it and redistribute it
-// freely, subject to the following restrictions:
-//
-// 1. The origin of this software must not be misrepresented; you must not
-// claim that you wrote the original software. If you use this software
-// in a product, an acknowledgment in the product documentation would be
-// appreciated but is not required.
-// 2. Altered source versions must be plainly marked as such, and must not be
-// misrepresented as being the original software.
-// 3. This notice may not be removed or altered from any source distribution.
+// See asmjit.h or LICENSE.md for license and copyright information
+// SPDX-License-Identifier: Zlib
#ifndef ASMJIT_CORE_CODEBUFFER_H_INCLUDED
#define ASMJIT_CORE_CODEBUFFER_H_INCLUDED
#include "../core/globals.h"
+#include "../core/support.h"
ASMJIT_BEGIN_NAMESPACE
//! \addtogroup asmjit_core
//! \{
-// ============================================================================
-// [asmjit::CodeBuffer]
-// ============================================================================
+//! Flags used by \ref CodeBuffer.
+enum class CodeBufferFlags : uint32_t {
+ //! No flags.
+ kNone = 0,
+ //! Buffer is external (not allocated by asmjit).
+ kIsExternal = 0x00000001u,
+ //! Buffer is fixed (cannot be reallocated).
+ kIsFixed = 0x00000002u
+};
+ASMJIT_DEFINE_ENUM_FLAGS(CodeBufferFlags)
//! Code or data buffer.
struct CodeBuffer {
+ //! \name Members
+ //! \{
+
//! The content of the buffer (data).
uint8_t* _data;
//! Number of bytes of `data` used.
@@ -44,15 +37,9 @@ struct CodeBuffer {
//! Buffer capacity (in bytes).
size_t _capacity;
//! Buffer flags.
- uint32_t _flags;
+ CodeBufferFlags _flags;
- //! Code buffer flags.
- enum Flags : uint32_t {
- //! Buffer is external (not allocated by asmjit).
- kFlagIsExternal = 0x00000001u,
- //! Buffer is fixed (cannot be reallocated).
- kFlagIsFixed = 0x00000002u
- };
+ //! \}
//! \name Overloaded Operators
//! \{
@@ -73,20 +60,20 @@ struct CodeBuffer {
//! \name Accessors
//! \{
- //! Returns code buffer flags, see \ref Flags.
- inline uint32_t flags() const noexcept { return _flags; }
+ //! Returns code buffer flags.
+ inline CodeBufferFlags flags() const noexcept { return _flags; }
//! Tests whether the code buffer has the given `flag` set.
- inline bool hasFlag(uint32_t flag) const noexcept { return (_flags & flag) != 0; }
+ inline bool hasFlag(CodeBufferFlags flag) const noexcept { return Support::test(_flags, flag); }
//! Tests whether this code buffer has a fixed size.
//!
//! Fixed size means that the code buffer is fixed and cannot grow.
- inline bool isFixed() const noexcept { return hasFlag(kFlagIsFixed); }
+ inline bool isFixed() const noexcept { return hasFlag(CodeBufferFlags::kIsFixed); }
//! Tests whether the data in this code buffer is external.
//!
//! External data can only be provided by users, it's never used by AsmJit.
- inline bool isExternal() const noexcept { return hasFlag(kFlagIsExternal); }
+ inline bool isExternal() const noexcept { return hasFlag(CodeBufferFlags::kIsExternal); }
//! Tests whether the data in this code buffer is allocated (non-null).
inline bool isAllocated() const noexcept { return _data != nullptr; }
diff --git a/3rdparty/asmjit/src/asmjit/core/codeholder.cpp b/3rdparty/asmjit/src/asmjit/core/codeholder.cpp
index 8711e382ce4..cf763cfff12 100644
--- a/3rdparty/asmjit/src/asmjit/core/codeholder.cpp
+++ b/3rdparty/asmjit/src/asmjit/core/codeholder.cpp
@@ -1,36 +1,21 @@
-// AsmJit - Machine code generation for C++
+// This file is part of AsmJit project <https://asmjit.com>
//
-// * Official AsmJit Home Page: https://asmjit.com
-// * Official Github Repository: https://github.com/asmjit/asmjit
-//
-// Copyright (c) 2008-2020 The AsmJit Authors
-//
-// This software is provided 'as-is', without any express or implied
-// warranty. In no event will the authors be held liable for any damages
-// arising from the use of this software.
-//
-// Permission is granted to anyone to use this software for any purpose,
-// including commercial applications, and to alter it and redistribute it
-// freely, subject to the following restrictions:
-//
-// 1. The origin of this software must not be misrepresented; you must not
-// claim that you wrote the original software. If you use this software
-// in a product, an acknowledgment in the product documentation would be
-// appreciated but is not required.
-// 2. Altered source versions must be plainly marked as such, and must not be
-// misrepresented as being the original software.
-// 3. This notice may not be removed or altered from any source distribution.
+// See asmjit.h or LICENSE.md for license and copyright information
+// SPDX-License-Identifier: Zlib
#include "../core/api-build_p.h"
#include "../core/assembler.h"
+#include "../core/codewriter_p.h"
#include "../core/logger.h"
#include "../core/support.h"
+#include <algorithm>
+#include <tuple>
+
ASMJIT_BEGIN_NAMESPACE
-// ============================================================================
-// [Globals]
-// ============================================================================
+// Globals
+// =======
static const char CodeHolder_addrTabName[] = ".addrtab";
@@ -39,31 +24,30 @@ static inline uint32_t x86EncodeMod(uint32_t m, uint32_t o, uint32_t rm) noexcep
return (m << 6) | (o << 3) | rm;
}
-// ============================================================================
-// [asmjit::LabelLinkIterator]
-// ============================================================================
+// LabelLinkIterator
+// =================
class LabelLinkIterator {
public:
- ASMJIT_INLINE LabelLinkIterator(LabelEntry* le) noexcept { reset(le); }
+ inline LabelLinkIterator(LabelEntry* le) noexcept { reset(le); }
- ASMJIT_INLINE explicit operator bool() const noexcept { return isValid(); }
- ASMJIT_INLINE bool isValid() const noexcept { return _link != nullptr; }
+ inline explicit operator bool() const noexcept { return isValid(); }
+ inline bool isValid() const noexcept { return _link != nullptr; }
- ASMJIT_INLINE LabelLink* link() const noexcept { return _link; }
- ASMJIT_INLINE LabelLink* operator->() const noexcept { return _link; }
+ inline LabelLink* link() const noexcept { return _link; }
+ inline LabelLink* operator->() const noexcept { return _link; }
- ASMJIT_INLINE void reset(LabelEntry* le) noexcept {
+ inline void reset(LabelEntry* le) noexcept {
_pPrev = &le->_links;
_link = *_pPrev;
}
- ASMJIT_INLINE void next() noexcept {
+ inline void next() noexcept {
_pPrev = &_link->next;
_link = *_pPrev;
}
- ASMJIT_INLINE void resolveAndNext(CodeHolder* code) noexcept {
+ inline void resolveAndNext(CodeHolder* code) noexcept {
LabelLink* linkToDelete = _link;
_link = _link->next;
@@ -77,11 +61,10 @@ public:
LabelLink* _link;
};
-// ============================================================================
-// [asmjit::CodeHolder - Utilities]
-// ============================================================================
+// CodeHolder - Utilities
+// ======================
-static void CodeHolder_resetInternal(CodeHolder* self, uint32_t resetPolicy) noexcept {
+static void CodeHolder_resetInternal(CodeHolder* self, ResetPolicy resetPolicy) noexcept {
uint32_t i;
const ZoneVector<BaseEmitter*>& emitters = self->emitters();
@@ -113,6 +96,7 @@ static void CodeHolder_resetInternal(CodeHolder* self, uint32_t resetPolicy) noe
self->_relocations.reset();
self->_labelEntries.reset();
self->_sections.reset();
+ self->_sectionsByOrder.reset();
self->_unresolvedLinkCount = 0;
self->_addressTableSection = nullptr;
@@ -129,27 +113,25 @@ static void CodeHolder_onSettingsUpdated(CodeHolder* self) noexcept {
}
}
-// ============================================================================
-// [asmjit::CodeHolder - Construction / Destruction]
-// ============================================================================
+// CodeHolder - Construction & Destruction
+// =======================================
-CodeHolder::CodeHolder() noexcept
+CodeHolder::CodeHolder(const Support::Temporary* temporary) noexcept
: _environment(),
_baseAddress(Globals::kNoBaseAddress),
_logger(nullptr),
_errorHandler(nullptr),
- _zone(16384 - Zone::kBlockOverhead),
+ _zone(16384 - Zone::kBlockOverhead, 1, temporary),
_allocator(&_zone),
_unresolvedLinkCount(0),
_addressTableSection(nullptr) {}
CodeHolder::~CodeHolder() noexcept {
- CodeHolder_resetInternal(this, Globals::kResetHard);
+ CodeHolder_resetInternal(this, ResetPolicy::kHard);
}
-// ============================================================================
-// [asmjit::CodeHolder - Init / Reset]
-// ============================================================================
+// CodeHolder - Init & Reset
+// =========================
inline void CodeHolder_setSectionDefaultName(
Section* section,
@@ -169,13 +151,15 @@ Error CodeHolder::init(const Environment& environment, uint64_t baseAddress) noe
ASMJIT_ASSERT(_emitters.empty());
// Create a default section and insert it to the `_sections` array.
- Error err = _sections.willGrow(&_allocator);
+ Error err = _sections.willGrow(&_allocator) |
+ _sectionsByOrder.willGrow(&_allocator);
if (err == kErrorOk) {
Section* section = _allocator.allocZeroedT<Section>();
if (ASMJIT_LIKELY(section)) {
- section->_flags = Section::kFlagExec | Section::kFlagConst;
+ section->_flags = SectionFlags::kExecutable | SectionFlags::kReadOnly;
CodeHolder_setSectionDefaultName(section, '.', 't', 'e', 'x', 't');
_sections.appendUnsafe(section);
+ _sectionsByOrder.appendUnsafe(section);
}
else {
err = DebugUtils::errored(kErrorOutOfMemory);
@@ -193,13 +177,12 @@ Error CodeHolder::init(const Environment& environment, uint64_t baseAddress) noe
}
}
-void CodeHolder::reset(uint32_t resetPolicy) noexcept {
+void CodeHolder::reset(ResetPolicy resetPolicy) noexcept {
CodeHolder_resetInternal(this, resetPolicy);
}
-// ============================================================================
-// [asmjit::CodeHolder - Attach / Detach]
-// ============================================================================
+// CodeHolder - Attach / Detach
+// ============================
Error CodeHolder::attach(BaseEmitter* emitter) noexcept {
// Catch a possible misuse of the API.
@@ -207,10 +190,14 @@ Error CodeHolder::attach(BaseEmitter* emitter) noexcept {
return DebugUtils::errored(kErrorInvalidArgument);
// Invalid emitter, this should not be possible.
- uint32_t type = emitter->emitterType();
- if (ASMJIT_UNLIKELY(type == BaseEmitter::kTypeNone || type >= BaseEmitter::kTypeCount))
+ EmitterType type = emitter->emitterType();
+ if (ASMJIT_UNLIKELY(type == EmitterType::kNone || uint32_t(type) > uint32_t(EmitterType::kMaxValue)))
return DebugUtils::errored(kErrorInvalidState);
+ uint64_t archMask = emitter->_archMask;
+ if (ASMJIT_UNLIKELY(!(archMask & (uint64_t(1) << uint32_t(arch())))))
+ return DebugUtils::errored(kErrorInvalidArch);
+
// This is suspicious, but don't fail if `emitter` is already attached
// to this code holder. This is not error, but it's not recommended.
if (emitter->_code != nullptr) {
@@ -254,9 +241,8 @@ Error CodeHolder::detach(BaseEmitter* emitter) noexcept {
return err;
}
-// ============================================================================
-// [asmjit::CodeHolder - Logging]
-// ============================================================================
+// CodeHolder - Logging
+// ====================
void CodeHolder::setLogger(Logger* logger) noexcept {
#ifndef ASMJIT_NO_LOGGING
@@ -267,18 +253,16 @@ void CodeHolder::setLogger(Logger* logger) noexcept {
#endif
}
-// ============================================================================
-// [asmjit::CodeHolder - Error Handling]
-// ============================================================================
+// CodeHolder - Error Handling
+// ===========================
void CodeHolder::setErrorHandler(ErrorHandler* errorHandler) noexcept {
_errorHandler = errorHandler;
CodeHolder_onSettingsUpdated(this);
}
-// ============================================================================
-// [asmjit::CodeHolder - Code Buffer]
-// ============================================================================
+// CodeHolder - Code Buffer
+// ========================
static Error CodeHolder_reserveInternal(CodeHolder* self, CodeBuffer* cb, size_t n) noexcept {
uint8_t* oldData = cb->_data;
@@ -351,7 +335,9 @@ Error CodeHolder::growBuffer(CodeBuffer* cb, size_t n) noexcept {
Error CodeHolder::reserveBuffer(CodeBuffer* cb, size_t n) noexcept {
size_t capacity = cb->capacity();
- if (n <= capacity) return kErrorOk;
+
+ if (n <= capacity)
+ return kErrorOk;
if (cb->isFixed())
return DebugUtils::errored(kErrorTooLarge);
@@ -359,11 +345,10 @@ Error CodeHolder::reserveBuffer(CodeBuffer* cb, size_t n) noexcept {
return CodeHolder_reserveInternal(this, cb, n);
}
-// ============================================================================
-// [asmjit::CodeHolder - Sections]
-// ============================================================================
+// CodeHolder - Sections
+// =====================
-Error CodeHolder::newSection(Section** sectionOut, const char* name, size_t nameSize, uint32_t flags, uint32_t alignment) noexcept {
+Error CodeHolder::newSection(Section** sectionOut, const char* name, size_t nameSize, SectionFlags flags, uint32_t alignment, int32_t order) noexcept {
*sectionOut = nullptr;
if (nameSize == SIZE_MAX)
@@ -383,16 +368,24 @@ Error CodeHolder::newSection(Section** sectionOut, const char* name, size_t name
return DebugUtils::errored(kErrorTooManySections);
ASMJIT_PROPAGATE(_sections.willGrow(&_allocator));
- Section* section = _allocator.allocZeroedT<Section>();
+ ASMJIT_PROPAGATE(_sectionsByOrder.willGrow(&_allocator));
+ Section* section = _allocator.allocZeroedT<Section>();
if (ASMJIT_UNLIKELY(!section))
return DebugUtils::errored(kErrorOutOfMemory);
section->_id = sectionId;
section->_flags = flags;
section->_alignment = alignment;
+ section->_order = order;
memcpy(section->_name.str, name, nameSize);
+
+ Section** insertPosition = std::lower_bound(_sectionsByOrder.begin(), _sectionsByOrder.end(), section, [](const Section* a, const Section* b) {
+ return std::make_tuple(a->order(), a->id()) < std::make_tuple(b->order(), b->id());
+ });
+
_sections.appendUnsafe(section);
+ _sectionsByOrder.insertUnsafe((size_t)(insertPosition - _sectionsByOrder.data()), section);
*sectionOut = section;
return kErrorOk;
@@ -405,7 +398,7 @@ Section* CodeHolder::sectionByName(const char* name, size_t nameSize) const noex
// This could be also put in a hash-table similarly like we do with labels,
// however it's questionable as the number of sections should be pretty low
// in general. Create an issue if this becomes a problem.
- if (ASMJIT_UNLIKELY(nameSize <= Globals::kMaxSectionNameSize)) {
+ if (nameSize <= Globals::kMaxSectionNameSize) {
for (Section* section : _sections)
if (memcmp(section->_name.str, name, nameSize) == 0 && section->_name.str[nameSize] == '\0')
return section;
@@ -418,7 +411,12 @@ Section* CodeHolder::ensureAddressTableSection() noexcept {
if (_addressTableSection)
return _addressTableSection;
- newSection(&_addressTableSection, CodeHolder_addrTabName, sizeof(CodeHolder_addrTabName) - 1, 0, _environment.registerSize());
+ newSection(&_addressTableSection,
+ CodeHolder_addrTabName,
+ sizeof(CodeHolder_addrTabName) - 1,
+ SectionFlags::kNone,
+ _environment.registerSize(),
+ std::numeric_limits<int32_t>::max());
return _addressTableSection;
}
@@ -441,9 +439,8 @@ Error CodeHolder::addAddressToAddressTable(uint64_t address) noexcept {
return kErrorOk;
}
-// ============================================================================
-// [asmjit::CodeHolder - Labels / Symbols]
-// ============================================================================
+// CodeHolder - Labels & Symbols
+// =============================
//! Only used to lookup a label from `_namedLabels`.
class LabelByName {
@@ -491,20 +488,7 @@ static uint32_t CodeHolder_hashNameAndGetSize(const char* name, size_t& nameSize
return hashCode;
}
-static bool CodeHolder_writeDisplacement(void* dst, int64_t displacement, uint32_t displacementSize) {
- if (displacementSize == 4 && Support::isInt32(displacement)) {
- Support::writeI32uLE(dst, int32_t(displacement));
- return true;
- }
- else if (displacementSize == 1 && Support::isInt8(displacement)) {
- Support::writeI8(dst, int8_t(displacement));
- return true;
- }
-
- return false;
-}
-
-LabelLink* CodeHolder::newLabelLink(LabelEntry* le, uint32_t sectionId, size_t offset, intptr_t rel) noexcept {
+LabelLink* CodeHolder::newLabelLink(LabelEntry* le, uint32_t sectionId, size_t offset, intptr_t rel, const OffsetFormat& format) noexcept {
LabelLink* link = _allocator.allocT<LabelLink>();
if (ASMJIT_UNLIKELY(!link)) return nullptr;
@@ -515,6 +499,7 @@ LabelLink* CodeHolder::newLabelLink(LabelEntry* le, uint32_t sectionId, size_t o
link->relocId = Globals::kInvalidId;
link->offset = offset;
link->rel = rel;
+ link->format = format;
_unresolvedLinkCount++;
return link;
@@ -542,32 +527,66 @@ Error CodeHolder::newLabelEntry(LabelEntry** entryOut) noexcept {
return kErrorOk;
}
-Error CodeHolder::newNamedLabelEntry(LabelEntry** entryOut, const char* name, size_t nameSize, uint32_t type, uint32_t parentId) noexcept {
+Error CodeHolder::newNamedLabelEntry(LabelEntry** entryOut, const char* name, size_t nameSize, LabelType type, uint32_t parentId) noexcept {
*entryOut = nullptr;
uint32_t hashCode = CodeHolder_hashNameAndGetSize(name, nameSize);
- if (ASMJIT_UNLIKELY(nameSize == 0))
- return DebugUtils::errored(kErrorInvalidLabelName);
+ if (ASMJIT_UNLIKELY(nameSize == 0)) {
+ if (type == LabelType::kAnonymous)
+ return newLabelEntry(entryOut);
+ else
+ return DebugUtils::errored(kErrorInvalidLabelName);
+ }
if (ASMJIT_UNLIKELY(nameSize > Globals::kMaxLabelNameSize))
return DebugUtils::errored(kErrorLabelNameTooLong);
switch (type) {
- case Label::kTypeLocal:
+ case LabelType::kAnonymous: {
+ // Anonymous labels cannot have a parent (or more specifically, parent is useless here).
+ if (ASMJIT_UNLIKELY(parentId != Globals::kInvalidId))
+ return DebugUtils::errored(kErrorInvalidParentLabel);
+
+ uint32_t labelId = _labelEntries.size();
+ if (ASMJIT_UNLIKELY(labelId == Globals::kInvalidId))
+ return DebugUtils::errored(kErrorTooManyLabels);
+
+ ASMJIT_PROPAGATE(_labelEntries.willGrow(&_allocator));
+ LabelEntry* le = _allocator.allocZeroedT<LabelEntry>();
+
+ if (ASMJIT_UNLIKELY(!le))
+ return DebugUtils::errored(kErrorOutOfMemory);
+
+ // NOTE: This LabelEntry has a name, but we leave its hashCode as zero as it's anonymous.
+ le->_setId(labelId);
+ le->_parentId = Globals::kInvalidId;
+ le->_offset = 0;
+ ASMJIT_PROPAGATE(le->_name.setData(&_zone, name, nameSize));
+
+ _labelEntries.appendUnsafe(le);
+
+ *entryOut = le;
+ return kErrorOk;
+ }
+
+ case LabelType::kLocal: {
if (ASMJIT_UNLIKELY(parentId >= _labelEntries.size()))
return DebugUtils::errored(kErrorInvalidParentLabel);
hashCode ^= parentId;
break;
+ }
- case Label::kTypeGlobal:
+ case LabelType::kGlobal:
+ case LabelType::kExternal: {
if (ASMJIT_UNLIKELY(parentId != Globals::kInvalidId))
- return DebugUtils::errored(kErrorNonLocalLabelCannotHaveParent);
-
+ return DebugUtils::errored(kErrorInvalidParentLabel);
break;
+ }
- default:
+ default: {
return DebugUtils::errored(kErrorInvalidArgument);
+ }
}
// Don't allow to insert duplicates. Local labels allow duplicates that have
@@ -591,7 +610,7 @@ Error CodeHolder::newNamedLabelEntry(LabelEntry** entryOut, const char* name, si
le->_hashCode = hashCode;
le->_setId(labelId);
- le->_type = uint8_t(type);
+ le->_type = type;
le->_parentId = parentId;
le->_offset = 0;
ASMJIT_PROPAGATE(le->_name.setData(&_zone, name, nameSize));
@@ -640,18 +659,16 @@ ASMJIT_API Error CodeHolder::resolveUnresolvedLinks() noexcept {
ASMJIT_ASSERT(linkOffset < buf.size());
// Calculate the offset relative to the start of the virtual base.
- uint64_t fromOffset = Support::addOverflow<uint64_t>(fromSection->offset(), linkOffset, &of);
+ Support::FastUInt8 localOF = of;
+ uint64_t fromOffset = Support::addOverflow<uint64_t>(fromSection->offset(), linkOffset, &localOF);
int64_t displacement = int64_t(toOffset - fromOffset + uint64_t(int64_t(link->rel)));
- if (!of) {
+ if (!localOF) {
ASMJIT_ASSERT(size_t(linkOffset) < buf.size());
-
- // Size of the value we are going to patch. Only BYTE/DWORD is allowed.
- uint32_t displacementSize = buf._data[linkOffset];
- ASMJIT_ASSERT(buf.size() - size_t(linkOffset) >= displacementSize);
+ ASMJIT_ASSERT(buf.size() - size_t(linkOffset) >= link->format.valueSize());
// Overwrite a real displacement in the CodeBuffer.
- if (CodeHolder_writeDisplacement(buf._data + linkOffset, displacement, displacementSize)) {
+ if (CodeWriterUtils::writeOffset(buf._data + linkOffset, displacement, link->format)) {
link.resolveAndNext(this);
continue;
}
@@ -714,11 +731,10 @@ ASMJIT_API Error CodeHolder::bindLabel(const Label& label, uint32_t toSectionId,
int64_t displacement = int64_t(toOffset - uint64_t(linkOffset) + uint64_t(int64_t(link->rel)));
// Size of the value we are going to patch. Only BYTE/DWORD is allowed.
- uint32_t displacementSize = buf._data[linkOffset];
- ASMJIT_ASSERT(buf.size() - size_t(linkOffset) >= displacementSize);
+ ASMJIT_ASSERT(buf.size() - size_t(linkOffset) >= link->format.regionSize());
// Overwrite a real displacement in the CodeBuffer.
- if (!CodeHolder_writeDisplacement(buf._data + linkOffset, displacement, displacementSize)) {
+ if (!CodeWriterUtils::writeOffset(buf._data + linkOffset, displacement, link->format)) {
err = DebugUtils::errored(kErrorInvalidDisplacement);
link.next();
continue;
@@ -731,11 +747,10 @@ ASMJIT_API Error CodeHolder::bindLabel(const Label& label, uint32_t toSectionId,
return err;
}
-// ============================================================================
-// [asmjit::BaseEmitter - Relocations]
-// ============================================================================
+// CodeHolder - Relocations
+// ========================
-Error CodeHolder::newRelocEntry(RelocEntry** dst, uint32_t relocType, uint32_t valueSize) noexcept {
+Error CodeHolder::newRelocEntry(RelocEntry** dst, RelocType relocType) noexcept {
ASMJIT_PROPAGATE(_relocations.willGrow(&_allocator));
uint32_t relocId = _relocations.size();
@@ -747,8 +762,7 @@ Error CodeHolder::newRelocEntry(RelocEntry** dst, uint32_t relocType, uint32_t v
return DebugUtils::errored(kErrorOutOfMemory);
re->_id = relocId;
- re->_relocType = uint8_t(relocType);
- re->_valueSize = uint8_t(valueSize);
+ re->_relocType = relocType;
re->_sourceSectionId = Globals::kInvalidId;
re->_targetSectionId = Globals::kInvalidId;
_relocations.appendUnsafe(re);
@@ -757,26 +771,25 @@ Error CodeHolder::newRelocEntry(RelocEntry** dst, uint32_t relocType, uint32_t v
return kErrorOk;
}
-// ============================================================================
-// [asmjit::BaseEmitter - Expression Evaluation]
-// ============================================================================
+// CodeHolder - Expression Evaluation
+// ==================================
static Error CodeHolder_evaluateExpression(CodeHolder* self, Expression* exp, uint64_t* out) noexcept {
uint64_t value[2];
for (size_t i = 0; i < 2; i++) {
uint64_t v;
switch (exp->valueType[i]) {
- case Expression::kValueNone: {
+ case ExpressionValueType::kNone: {
v = 0;
break;
}
- case Expression::kValueConstant: {
+ case ExpressionValueType::kConstant: {
v = exp->value[i].constant;
break;
}
- case Expression::kValueLabel: {
+ case ExpressionValueType::kLabel: {
LabelEntry* le = exp->value[i].label;
if (!le->isBound())
return DebugUtils::errored(kErrorExpressionLabelNotBound);
@@ -784,7 +797,7 @@ static Error CodeHolder_evaluateExpression(CodeHolder* self, Expression* exp, ui
break;
}
- case Expression::kValueExpression: {
+ case ExpressionValueType::kExpression: {
Expression* nested = exp->value[i].expression;
ASMJIT_PROPAGATE(CodeHolder_evaluateExpression(self, nested, &v));
break;
@@ -802,27 +815,27 @@ static Error CodeHolder_evaluateExpression(CodeHolder* self, Expression* exp, ui
uint64_t& b = value[1];
switch (exp->opType) {
- case Expression::kOpAdd:
+ case ExpressionOpType::kAdd:
result = a + b;
break;
- case Expression::kOpSub:
+ case ExpressionOpType::kSub:
result = a - b;
break;
- case Expression::kOpMul:
+ case ExpressionOpType::kMul:
result = a * b;
break;
- case Expression::kOpSll:
+ case ExpressionOpType::kSll:
result = (b > 63) ? uint64_t(0) : uint64_t(a << b);
break;
- case Expression::kOpSrl:
+ case ExpressionOpType::kSrl:
result = (b > 63) ? uint64_t(0) : uint64_t(a >> b);
break;
- case Expression::kOpSra:
+ case ExpressionOpType::kSra:
result = Support::sar(a, Support::min<uint64_t>(b, 63));
break;
@@ -834,13 +847,12 @@ static Error CodeHolder_evaluateExpression(CodeHolder* self, Expression* exp, ui
return kErrorOk;
}
-// ============================================================================
-// [asmjit::BaseEmitter - Utilities]
-// ============================================================================
+// CodeHolder - Utilities
+// ======================
Error CodeHolder::flatten() noexcept {
uint64_t offset = 0;
- for (Section* section : _sections) {
+ for (Section* section : _sectionsByOrder) {
uint64_t realSize = section->realSize();
if (realSize) {
uint64_t alignedOffset = Support::alignUp(offset, section->alignment());
@@ -858,7 +870,7 @@ Error CodeHolder::flatten() noexcept {
// Now we know that we can assign offsets of all sections properly.
Section* prev = nullptr;
offset = 0;
- for (Section* section : _sections) {
+ for (Section* section : _sectionsByOrder) {
uint64_t realSize = section->realSize();
if (realSize)
offset = Support::alignUp(offset, section->alignment());
@@ -879,7 +891,7 @@ size_t CodeHolder::codeSize() const noexcept {
Support::FastUInt8 of = 0;
uint64_t offset = 0;
- for (Section* section : _sections) {
+ for (Section* section : _sectionsByOrder) {
uint64_t realSize = section->realSize();
if (realSize) {
@@ -916,7 +928,7 @@ Error CodeHolder::relocateToBase(uint64_t baseAddress) noexcept {
// Relocate all recorded locations.
for (const RelocEntry* re : _relocations) {
// Possibly deleted or optimized-out entry.
- if (re->relocType() == RelocEntry::kTypeNone)
+ if (re->relocType() == RelocType::kNone)
continue;
Section* sourceSection = sectionById(re->sourceSectionId());
@@ -930,26 +942,25 @@ Error CodeHolder::relocateToBase(uint64_t baseAddress) noexcept {
uint64_t sourceOffset = re->sourceOffset();
// Make sure that the `RelocEntry` doesn't go out of bounds.
- size_t regionSize = re->leadingSize() + re->valueSize() + re->trailingSize();
+ size_t regionSize = re->format().regionSize();
if (ASMJIT_UNLIKELY(re->sourceOffset() >= sourceSection->bufferSize() ||
sourceSection->bufferSize() - size_t(re->sourceOffset()) < regionSize))
return DebugUtils::errored(kErrorInvalidRelocEntry);
uint8_t* buffer = sourceSection->data();
- size_t valueOffset = size_t(re->sourceOffset()) + re->leadingSize();
switch (re->relocType()) {
- case RelocEntry::kTypeExpression: {
+ case RelocType::kExpression: {
Expression* expression = (Expression*)(uintptr_t(value));
ASMJIT_PROPAGATE(CodeHolder_evaluateExpression(this, expression, &value));
break;
}
- case RelocEntry::kTypeAbsToAbs: {
+ case RelocType::kAbsToAbs: {
break;
}
- case RelocEntry::kTypeRelToAbs: {
+ case RelocType::kRelToAbs: {
// Value is currently a relative offset from the start of its section.
// We have to convert it to an absolute offset (including base address).
if (ASMJIT_UNLIKELY(!targetSection))
@@ -960,15 +971,21 @@ Error CodeHolder::relocateToBase(uint64_t baseAddress) noexcept {
break;
}
- case RelocEntry::kTypeAbsToRel: {
+ case RelocType::kAbsToRel: {
value -= baseAddress + sectionOffset + sourceOffset + regionSize;
- if (addressSize > 4 && !Support::isInt32(int64_t(value)))
+
+ // Sign extend as we are not interested in the high 32-bit word in a 32-bit address space.
+ if (addressSize <= 4)
+ value = uint64_t(int64_t(int32_t(value & 0xFFFFFFFFu)));
+ else if (!Support::isInt32(int64_t(value)))
return DebugUtils::errored(kErrorRelocOffsetOutOfRange);
+
break;
}
- case RelocEntry::kTypeX64AddressEntry: {
- if (re->valueSize() != 4 || re->leadingSize() < 2)
+ case RelocType::kX64AddressEntry: {
+ size_t valueOffset = size_t(re->sourceOffset()) + re->format().valueOffset();
+ if (re->format().valueSize() != 4 || valueOffset < 2)
return DebugUtils::errored(kErrorInvalidRelocEntry);
// First try whether a relative 32-bit displacement would work.
@@ -1022,30 +1039,15 @@ Error CodeHolder::relocateToBase(uint64_t baseAddress) noexcept {
return DebugUtils::errored(kErrorInvalidRelocEntry);
}
- switch (re->valueSize()) {
- case 1:
- Support::writeU8(buffer + valueOffset, uint32_t(value & 0xFFu));
- break;
-
- case 2:
- Support::writeU16uLE(buffer + valueOffset, uint32_t(value & 0xFFFFu));
- break;
-
- case 4:
- Support::writeU32uLE(buffer + valueOffset, uint32_t(value & 0xFFFFFFFFu));
- break;
-
- case 8:
- Support::writeU64uLE(buffer + valueOffset, value);
- break;
-
- default:
- return DebugUtils::errored(kErrorInvalidRelocEntry);
+ if (!CodeWriterUtils::writeOffset(buffer + re->sourceOffset(), int64_t(value), re->format())) {
+ return DebugUtils::errored(kErrorInvalidRelocEntry);
}
}
// Fixup the virtual size of the address table if it's the last section.
- if (_sections.last() == addressTableSection) {
+ if (_sectionsByOrder.last() == addressTableSection) {
+ ASMJIT_ASSERT(addressTableSection != nullptr);
+
size_t addressTableSize = addressTableEntryCount * addressSize;
addressTableSection->_buffer._size = addressTableSize;
addressTableSection->_virtualSize = addressTableSize;
@@ -1054,7 +1056,7 @@ Error CodeHolder::relocateToBase(uint64_t baseAddress) noexcept {
return kErrorOk;
}
-Error CodeHolder::copySectionData(void* dst, size_t dstSize, uint32_t sectionId, uint32_t copyOptions) noexcept {
+Error CodeHolder::copySectionData(void* dst, size_t dstSize, uint32_t sectionId, CopySectionFlags copyFlags) noexcept {
if (ASMJIT_UNLIKELY(!isSectionValid(sectionId)))
return DebugUtils::errored(kErrorInvalidSection);
@@ -1066,7 +1068,7 @@ Error CodeHolder::copySectionData(void* dst, size_t dstSize, uint32_t sectionId,
memcpy(dst, section->data(), bufferSize);
- if (bufferSize < dstSize && (copyOptions & kCopyPadSectionBuffer)) {
+ if (bufferSize < dstSize && Support::test(copyFlags, CopySectionFlags::kPadSectionBuffer)) {
size_t paddingSize = dstSize - bufferSize;
memset(static_cast<uint8_t*>(dst) + bufferSize, 0, paddingSize);
}
@@ -1074,9 +1076,9 @@ Error CodeHolder::copySectionData(void* dst, size_t dstSize, uint32_t sectionId,
return kErrorOk;
}
-Error CodeHolder::copyFlattenedData(void* dst, size_t dstSize, uint32_t copyOptions) noexcept {
+Error CodeHolder::copyFlattenedData(void* dst, size_t dstSize, CopySectionFlags copyFlags) noexcept {
size_t end = 0;
- for (Section* section : _sections) {
+ for (Section* section : _sectionsByOrder) {
if (section->offset() > dstSize)
return DebugUtils::errored(kErrorInvalidArgument);
@@ -1090,7 +1092,7 @@ Error CodeHolder::copyFlattenedData(void* dst, size_t dstSize, uint32_t copyOpti
size_t paddingSize = 0;
memcpy(dstTarget, section->data(), bufferSize);
- if ((copyOptions & kCopyPadSectionBuffer) && bufferSize < section->virtualSize()) {
+ if (Support::test(copyFlags, CopySectionFlags::kPadSectionBuffer) && bufferSize < section->virtualSize()) {
paddingSize = Support::min<size_t>(dstSize - offset, size_t(section->virtualSize())) - bufferSize;
memset(dstTarget + bufferSize, 0, paddingSize);
}
@@ -1098,11 +1100,50 @@ Error CodeHolder::copyFlattenedData(void* dst, size_t dstSize, uint32_t copyOpti
end = Support::max(end, offset + bufferSize + paddingSize);
}
- if (end < dstSize && (copyOptions & kCopyPadTargetBuffer)) {
+ if (end < dstSize && Support::test(copyFlags, CopySectionFlags::kPadTargetBuffer)) {
memset(static_cast<uint8_t*>(dst) + end, 0, dstSize - end);
}
return kErrorOk;
}
+// CodeHolder - Tests
+// ==================
+
+#if defined(ASMJIT_TEST)
+UNIT(code_holder) {
+ CodeHolder code;
+
+ INFO("Verifying CodeHolder::init()");
+ Environment env;
+ env.init(Arch::kX86);
+
+ code.init(env);
+ EXPECT(code.arch() == Arch::kX86);
+
+ INFO("Verifying named labels");
+ LabelEntry* le;
+ EXPECT(code.newNamedLabelEntry(&le, "NamedLabel", SIZE_MAX, LabelType::kGlobal) == kErrorOk);
+ EXPECT(strcmp(le->name(), "NamedLabel") == 0);
+ EXPECT(code.labelIdByName("NamedLabel") == le->id());
+
+ INFO("Verifying section ordering");
+ Section* section1;
+ EXPECT(code.newSection(&section1, "high-priority", SIZE_MAX, SectionFlags::kNone, 1, -1) == kErrorOk);
+ EXPECT(code.sections()[1] == section1);
+ EXPECT(code.sectionsByOrder()[0] == section1);
+
+ Section* section0;
+ EXPECT(code.newSection(&section0, "higher-priority", SIZE_MAX, SectionFlags::kNone, 1, -2) == kErrorOk);
+ EXPECT(code.sections()[2] == section0);
+ EXPECT(code.sectionsByOrder()[0] == section0);
+ EXPECT(code.sectionsByOrder()[1] == section1);
+
+ Section* section3;
+ EXPECT(code.newSection(&section3, "low-priority", SIZE_MAX, SectionFlags::kNone, 1, 2) == kErrorOk);
+ EXPECT(code.sections()[3] == section3);
+ EXPECT(code.sectionsByOrder()[3] == section3);
+}
+#endif
+
ASMJIT_END_NAMESPACE
diff --git a/3rdparty/asmjit/src/asmjit/core/codeholder.h b/3rdparty/asmjit/src/asmjit/core/codeholder.h
index 9b3466dbb58..e3bd0d59239 100644
--- a/3rdparty/asmjit/src/asmjit/core/codeholder.h
+++ b/3rdparty/asmjit/src/asmjit/core/codeholder.h
@@ -1,32 +1,13 @@
-// AsmJit - Machine code generation for C++
+// This file is part of AsmJit project <https://asmjit.com>
//
-// * Official AsmJit Home Page: https://asmjit.com
-// * Official Github Repository: https://github.com/asmjit/asmjit
-//
-// Copyright (c) 2008-2020 The AsmJit Authors
-//
-// This software is provided 'as-is', without any express or implied
-// warranty. In no event will the authors be held liable for any damages
-// arising from the use of this software.
-//
-// Permission is granted to anyone to use this software for any purpose,
-// including commercial applications, and to alter it and redistribute it
-// freely, subject to the following restrictions:
-//
-// 1. The origin of this software must not be misrepresented; you must not
-// claim that you wrote the original software. If you use this software
-// in a product, an acknowledgment in the product documentation would be
-// appreciated but is not required.
-// 2. Altered source versions must be plainly marked as such, and must not be
-// misrepresented as being the original software.
-// 3. This notice may not be removed or altered from any source distribution.
+// See asmjit.h or LICENSE.md for license and copyright information
+// SPDX-License-Identifier: Zlib
#ifndef ASMJIT_CORE_CODEHOLDER_H_INCLUDED
#define ASMJIT_CORE_CODEHOLDER_H_INCLUDED
-#include "../core/arch.h"
+#include "../core/archtraits.h"
#include "../core/codebuffer.h"
-#include "../core/datatypes.h"
#include "../core/errorhandler.h"
#include "../core/operand.h"
#include "../core/string.h"
@@ -43,46 +24,142 @@ ASMJIT_BEGIN_NAMESPACE
//! \addtogroup asmjit_core
//! \{
-// ============================================================================
-// [Forward Declarations]
-// ============================================================================
-
class BaseEmitter;
class CodeHolder;
class LabelEntry;
class Logger;
-// ============================================================================
-// [asmjit::AlignMode]
-// ============================================================================
-
-//! Align mode.
-enum AlignMode : uint32_t {
- //! Align executable code.
- kAlignCode = 0,
- //! Align non-executable code.
- kAlignData = 1,
- //! Align by a sequence of zeros.
- kAlignZero = 2,
- //! Count of alignment modes.
- kAlignCount = 3
+//! Operator type that can be used within an \ref Expression.
+enum class ExpressionOpType : uint8_t {
+ //! Addition.
+ kAdd = 0,
+ //! Subtraction.
+ kSub = 1,
+ //! Multiplication
+ kMul = 2,
+ //! Logical left shift.
+ kSll = 3,
+ //! Logical right shift.
+ kSrl = 4,
+ //! Arithmetic right shift.
+ kSra = 5
};
-// ============================================================================
-// [asmjit::Section]
-// ============================================================================
+//! Value tyoe that can be used within an \ref Expression.
+enum class ExpressionValueType : uint8_t {
+ //! No value or invalid.
+ kNone = 0,
+ //! Value is 64-bit unsigned integer (constant).
+ kConstant = 1,
+ //! Value is \ref LabelEntry, which references a \ref Label.
+ kLabel = 2,
+ //! Value is \ref Expression
+ kExpression = 3
+};
+
+//! Expression node that can reference constants, labels, and another expressions.
+struct Expression {
+ //! Expression value.
+ union Value {
+ //! Constant.
+ uint64_t constant;
+ //! Pointer to another expression.
+ Expression* expression;
+ //! Pointer to \ref LabelEntry.
+ LabelEntry* label;
+ };
+
+ //! \name Members
+ //! \{
+
+ //! Operation type.
+ ExpressionOpType opType;
+ //! Value types of \ref value.
+ ExpressionValueType valueType[2];
+ //! Reserved for future use, should be initialized to zero.
+ uint8_t reserved[5];
+ //! Expression left and right values.
+ Value value[2];
+
+ //! \}
+
+ //! \name Accessors
+ //! \{
+
+ //! Resets the whole expression.
+ //!
+ //! Changes both values to \ref ExpressionValueType::kNone.
+ inline void reset() noexcept { memset(this, 0, sizeof(*this)); }
+
+ //! Sets the value type at `index` to \ref ExpressionValueType::kConstant and its content to `constant`.
+ inline void setValueAsConstant(size_t index, uint64_t constant) noexcept {
+ valueType[index] = ExpressionValueType::kConstant;
+ value[index].constant = constant;
+ }
+
+ //! Sets the value type at `index` to \ref ExpressionValueType::kLabel and its content to `labelEntry`.
+ inline void setValueAsLabel(size_t index, LabelEntry* labelEntry) noexcept {
+ valueType[index] = ExpressionValueType::kLabel;
+ value[index].label = labelEntry;
+ }
+
+ //! Sets the value type at `index` to \ref ExpressionValueType::kExpression and its content to `expression`.
+ inline void setValueAsExpression(size_t index, Expression* expression) noexcept {
+ valueType[index] = ExpressionValueType::kExpression;
+ value[index].expression = expression;
+ }
+
+ //! \}
+};
+
+//! Section flags, used by \ref Section.
+enum class SectionFlags : uint32_t {
+ //! No flags.
+ kNone = 0,
+ //! Executable (.text sections).
+ kExecutable = 0x00000001u,
+ //! Read-only (.text and .data sections).
+ kReadOnly = 0x00000002u,
+ //! Zero initialized by the loader (BSS).
+ kZeroInitialized = 0x00000004u,
+ //! Info / comment flag.
+ kComment = 0x00000008u,
+ //! Section created implicitly, can be deleted by \ref Target.
+ kImplicit = 0x80000000u
+};
+ASMJIT_DEFINE_ENUM_FLAGS(SectionFlags)
+
+//! Flags that can be used with \ref CodeHolder::copySectionData() and \ref CodeHolder::copyFlattenedData().
+enum class CopySectionFlags : uint32_t {
+ //! No flags.
+ kNone = 0,
+
+ //! If virtual size of a section is greater than the size of its \ref CodeBuffer then all bytes between the buffer
+ //! size and virtual size will be zeroed. If this option is not set then those bytes would be left as is, which
+ //! means that if the user didn't initialize them they would have a previous content, which may be unwanted.
+ kPadSectionBuffer = 0x00000001u,
+
+ //! Clears the target buffer if the flattened data is less than the destination size. This option works
+ //! only with \ref CodeHolder::copyFlattenedData() as it processes multiple sections. It is ignored by
+ //! \ref CodeHolder::copySectionData().
+ kPadTargetBuffer = 0x00000002u
+};
+ASMJIT_DEFINE_ENUM_FLAGS(CopySectionFlags)
//! Section entry.
class Section {
public:
+ //! \name Members
+ //! \{
+
//! Section id.
uint32_t _id;
//! Section flags.
- uint32_t _flags;
+ SectionFlags _flags;
//! Section alignment requirements (0 if no requirements).
uint32_t _alignment;
- //! Reserved for future use (padding).
- uint32_t _reserved;
+ //! Order (lower value means higher priority).
+ int32_t _order;
//! Offset of this section from base-address.
uint64_t _offset;
//! Virtual size of the section (zero initialized sections).
@@ -92,19 +169,7 @@ public:
//! Code or data buffer.
CodeBuffer _buffer;
- //! Section flags.
- enum Flags : uint32_t {
- //! Executable (.text sections).
- kFlagExec = 0x00000001u,
- //! Read-only (.text and .data sections).
- kFlagConst = 0x00000002u,
- //! Zero initialized by the loader (BSS).
- kFlagZero = 0x00000004u,
- //! Info / comment flag.
- kFlagInfo = 0x00000008u,
- //! Section created implicitly and can be deleted by \ref Target.
- kFlagImplicit = 0x80000000u
- };
+ //! \}
//! \name Accessors
//! \{
@@ -119,20 +184,23 @@ public:
//! \overload
inline const uint8_t* data() const noexcept { return _buffer.data(); }
- //! Returns the section flags, see \ref Flags.
- inline uint32_t flags() const noexcept { return _flags; }
+ //! Returns the section flags.
+ inline SectionFlags flags() const noexcept { return _flags; }
//! Tests whether the section has the given `flag`.
- inline bool hasFlag(uint32_t flag) const noexcept { return (_flags & flag) != 0; }
+ inline bool hasFlag(SectionFlags flag) const noexcept { return Support::test(_flags, flag); }
//! Adds `flags` to the section flags.
- inline void addFlags(uint32_t flags) noexcept { _flags |= flags; }
+ inline void addFlags(SectionFlags flags) noexcept { _flags |= flags; }
//! Removes `flags` from the section flags.
- inline void clearFlags(uint32_t flags) noexcept { _flags &= ~flags; }
+ inline void clearFlags(SectionFlags flags) noexcept { _flags &= ~flags; }
//! Returns the minimum section alignment
inline uint32_t alignment() const noexcept { return _alignment; }
//! Sets the minimum section alignment
inline void setAlignment(uint32_t alignment) noexcept { _alignment = alignment; }
+ //! Returns the section order, which has a higher priority than section id.
+ inline int32_t order() const noexcept { return _order; }
+
//! Returns the section offset, relative to base.
inline uint64_t offset() const noexcept { return _offset; }
//! Set the section offset.
@@ -140,9 +208,8 @@ public:
//! Returns the virtual size of the section.
//!
- //! Virtual size is initially zero and is never changed by AsmJit. It's normal
- //! if virtual size is smaller than size returned by `bufferSize()` as the buffer
- //! stores real data emitted by assemblers or appended by users.
+ //! Virtual size is initially zero and is never changed by AsmJit. It's normal if virtual size is smaller than
+ //! size returned by `bufferSize()` as the buffer stores real data emitted by assemblers or appended by users.
//!
//! Use `realSize()` to get the real and final size of this section.
inline uint64_t virtualSize() const noexcept { return _virtualSize; }
@@ -162,235 +229,219 @@ public:
//! \}
};
-// ============================================================================
-// [asmjit::LabelLink]
-// ============================================================================
+//! Entry in an address table.
+class AddressTableEntry : public ZoneTreeNodeT<AddressTableEntry> {
+public:
+ ASMJIT_NONCOPYABLE(AddressTableEntry)
+
+ //! \name Members
+ //! \{
-//! Data structure used to link either unbound labels or cross-section links.
-struct LabelLink {
- //! Next link (single-linked list).
- LabelLink* next;
- //! Section id where the label is bound.
- uint32_t sectionId;
- //! Relocation id or Globals::kInvalidId.
- uint32_t relocId;
- //! Label offset relative to the start of the section.
- size_t offset;
- //! Inlined rel8/rel32.
- intptr_t rel;
-};
+ //! Address.
+ uint64_t _address;
+ //! Slot.
+ uint32_t _slot;
-// ============================================================================
-// [asmjit::Expression]
-// ============================================================================
+ //! \}
-//! Expression node that can reference constants, labels, and another expressions.
-struct Expression {
- //! Operation type.
- enum OpType : uint8_t {
- //! Addition.
- kOpAdd = 0,
- //! Subtraction.
- kOpSub = 1,
- //! Multiplication
- kOpMul = 2,
- //! Logical left shift.
- kOpSll = 3,
- //! Logical right shift.
- kOpSrl = 4,
- //! Arithmetic right shift.
- kOpSra = 5
- };
+ //! \name Construction & Destruction
+ //! \{
- //! Type of \ref Value.
- enum ValueType : uint8_t {
- //! No value or invalid.
- kValueNone = 0,
- //! Value is 64-bit unsigned integer (constant).
- kValueConstant = 1,
- //! Value is \ref LabelEntry, which references a \ref Label.
- kValueLabel = 2,
- //! Value is \ref Expression
- kValueExpression = 3
- };
+ inline explicit AddressTableEntry(uint64_t address) noexcept
+ : _address(address),
+ _slot(0xFFFFFFFFu) {}
- //! Expression value.
- union Value {
- //! Constant.
- uint64_t constant;
- //! Pointer to another expression.
- Expression* expression;
- //! Poitner to \ref LabelEntry.
- LabelEntry* label;
- };
+ //! \}
- //! Operation type.
- uint8_t opType;
- //! Value types of \ref value.
- uint8_t valueType[2];
- //! Reserved for future use, should be initialized to zero.
- uint8_t reserved[5];
- //! Expression left and right values.
- Value value[2];
+ //! \name Accessors
+ //! \{
- //! Resets the whole expression.
- //!
- //! Changes both values to \ref kValueNone.
- inline void reset() noexcept { memset(this, 0, sizeof(*this)); }
+ inline uint64_t address() const noexcept { return _address; }
+ inline uint32_t slot() const noexcept { return _slot; }
- //! Sets the value type at `index` to \ref kValueConstant and its content to `constant`.
- inline void setValueAsConstant(size_t index, uint64_t constant) noexcept {
- valueType[index] = kValueConstant;
- value[index].constant = constant;
- }
+ inline bool hasAssignedSlot() const noexcept { return _slot != 0xFFFFFFFFu; }
- //! Sets the value type at `index` to \ref kValueLabel and its content to `labelEntry`.
- inline void setValueAsLabel(size_t index, LabelEntry* labelEntry) noexcept {
- valueType[index] = kValueLabel;
- value[index].label = labelEntry;
- }
+ inline bool operator<(const AddressTableEntry& other) const noexcept { return _address < other._address; }
+ inline bool operator>(const AddressTableEntry& other) const noexcept { return _address > other._address; }
- //! Sets the value type at `index` to \ref kValueExpression and its content to `expression`.
- inline void setValueAsExpression(size_t index, Expression* expression) noexcept {
- valueType[index] = kValueLabel;
- value[index].expression = expression;
- }
+ inline bool operator<(uint64_t queryAddress) const noexcept { return _address < queryAddress; }
+ inline bool operator>(uint64_t queryAddress) const noexcept { return _address > queryAddress; }
+
+ //! \}
};
-// ============================================================================
-// [asmjit::LabelEntry]
-// ============================================================================
+//! Offset format type, used by \ref OffsetFormat.
+enum class OffsetType : uint8_t {
+ //! A value having `_immBitCount` bits and shifted by `_immBitShift`.
+ //!
+ //! This offset type is sufficient for many targets that store offset as a continuous set bits within an
+ //! instruction word / sequence of bytes.
+ kSignedOffset,
-//! Label entry.
+ //! An unsigned value having `_immBitCount` bits and shifted by `_immBitShift`.
+ kUnsignedOffset,
+
+ // AArch64 Specific Offset Formats
+ // -------------------------------
+
+ //! AARCH64 ADR format of `[.|immlo:2|.....|immhi:19|.....]`.
+ kAArch64_ADR,
+
+ //! AARCH64 ADRP format of `[.|immlo:2|.....|immhi:19|.....]` (4kB pages).
+ kAArch64_ADRP,
+
+ //! Maximum value of `OffsetFormatType`.
+ kMaxValue = kAArch64_ADRP
+};
+
+//! Provides information about formatting offsets, absolute addresses, or their parts. Offset format is used by both
+//! \ref RelocEntry and \ref LabelLink. The illustration below describes the relation of region size and offset size.
+//! Region size is the size of the whole unit whereas offset size is the size of the unit that will be patched.
//!
-//! Contains the following properties:
-//! * Label id - This is the only thing that is set to the `Label` operand.
-//! * Label name - Optional, used mostly to create executables and libraries.
-//! * Label type - Type of the label, default `Label::kTypeAnonymous`.
-//! * Label parent id - Derived from many assemblers that allow to define a
-//! local label that falls under a global label. This allows to define
-//! many labels of the same name that have different parent (global) label.
-//! * Offset - offset of the label bound by `Assembler`.
-//! * Links - single-linked list that contains locations of code that has
-//! to be patched when the label gets bound. Every use of unbound label
-//! adds one link to `_links` list.
-//! * HVal - Hash value of label's name and optionally parentId.
-//! * HashNext - Hash-table implementation detail.
-class LabelEntry : public ZoneHashNode {
-public:
- // Let's round the size of `LabelEntry` to 64 bytes (as `ZoneAllocator` has
- // granularity of 32 bytes anyway). This gives `_name` the remaining space,
- // which is should be 16 bytes on 64-bit and 28 bytes on 32-bit architectures.
- static constexpr uint32_t kStaticNameSize =
- 64 - (sizeof(ZoneHashNode) + 8 + sizeof(Section*) + sizeof(size_t) + sizeof(LabelLink*));
-
- //! Label type, see `Label::LabelType`.
- uint8_t _type;
- //! Must be zero.
+//! ```
+//! +-> Code buffer | The subject of the relocation (region) |
+//! | | (Word-Offset) (Word-Size) |
+//! |xxxxxxxxxxxxxxx|................|*PATCHED*|................|xxxxxxxxxxxx->
+//! | |
+//! [Word Offset points here]----+ +--- [WordOffset + WordSize]
+//! ```
+//!
+//! Once the offset word has been located it can be patched like this:
+//!
+//! ```
+//! |ImmDiscardLSB (discard LSB bits).
+//! |..
+//! [0000000000000iiiiiiiiiiiiiiiiiDD] - Offset value (32-bit)
+//! [000000000000000iiiiiiiiiiiiiiiii] - Offset value after discard LSB.
+//! [00000000000iiiiiiiiiiiiiiiii0000] - Offset value shifted by ImmBitShift.
+//! [xxxxxxxxxxxiiiiiiiiiiiiiiiiixxxx] - Patched word (32-bit)
+//! |...............|
+//! (ImmBitCount) +- ImmBitShift
+//! ```
+struct OffsetFormat {
+ //! \name Members
+ //! \{
+
+ //! Type of the offset.
+ OffsetType _type;
+ //! Encoding flags.
uint8_t _flags;
- //! Reserved.
- uint16_t _reserved16;
- //! Label parent id or zero.
- uint32_t _parentId;
- //! Label offset relative to the start of the `_section`.
- uint64_t _offset;
- //! Section where the label was bound.
- Section* _section;
- //! Label links.
- LabelLink* _links;
- //! Label name.
- ZoneString<kStaticNameSize> _name;
+ //! Size of the region (in bytes) containing the offset value, if the offset value is part of an instruction,
+ //! otherwise it would be the same as `_valueSize`.
+ uint8_t _regionSize;
+ //! Size of the offset value, in bytes (1, 2, 4, or 8).
+ uint8_t _valueSize;
+ //! Offset of the offset value, in bytes, relative to the start of the region or data. Value offset would be
+ //! zero if both region size and value size are equal.
+ uint8_t _valueOffset;
+ //! Size of the offset immediate value in bits.
+ uint8_t _immBitCount;
+ //! Shift of the offset immediate value in bits in the target word.
+ uint8_t _immBitShift;
+ //! Number of least significant bits to discard before writing the immediate to the destination. All discarded
+ //! bits must be zero otherwise the value is invalid.
+ uint8_t _immDiscardLsb;
+
+ //! \}
//! \name Accessors
//! \{
- // NOTE: Label id is stored in `_customData`, which is provided by ZoneHashNode
- // to fill a padding that a C++ compiler targeting 64-bit CPU will add to align
- // the structure to 64-bits.
+ //! Returns the type of the offset.
+ inline OffsetType type() const noexcept { return _type; }
- //! Returns label id.
- inline uint32_t id() const noexcept { return _customData; }
- //! Sets label id (internal, used only by `CodeHolder`).
- inline void _setId(uint32_t id) noexcept { _customData = id; }
-
- //! Returns label type, see `Label::LabelType`.
- inline uint32_t type() const noexcept { return _type; }
- //! Returns label flags, returns 0 at the moment.
+ //! Returns flags.
inline uint32_t flags() const noexcept { return _flags; }
- //! Tests whether the label has a parent label.
- inline bool hasParent() const noexcept { return _parentId != Globals::kInvalidId; }
- //! Returns label's parent id.
- inline uint32_t parentId() const noexcept { return _parentId; }
-
- //! Returns the section where the label was bound.
- //!
- //! If the label was not yet bound the return value is `nullptr`.
- inline Section* section() const noexcept { return _section; }
+ //! Returns the size of the region/instruction where the offset is encoded.
+ inline uint32_t regionSize() const noexcept { return _regionSize; }
- //! Tests whether the label has name.
- inline bool hasName() const noexcept { return !_name.empty(); }
+ //! Returns the the offset of the word relative to the start of the region where the offset is.
+ inline uint32_t valueOffset() const noexcept { return _valueOffset; }
- //! Returns the label's name.
- //!
- //! \note Local labels will return their local name without their parent
- //! part, for example ".L1".
- inline const char* name() const noexcept { return _name.data(); }
-
- //! Returns size of label's name.
+ //! Returns the size of the data-type (word) that contains the offset, in bytes.
+ inline uint32_t valueSize() const noexcept { return _valueSize; }
+ //! Returns the count of bits of the offset value in the data it's stored in.
+ inline uint32_t immBitCount() const noexcept { return _immBitCount; }
+ //! Returns the bit-shift of the offset value in the data it's stored in.
+ inline uint32_t immBitShift() const noexcept { return _immBitShift; }
+ //! Returns the number of least significant bits of the offset value, that must be zero and that are not part of
+ //! the encoded data.
+ inline uint32_t immDiscardLsb() const noexcept { return _immDiscardLsb; }
+
+ //! Resets this offset format to a simple data value of `dataSize` bytes.
//!
- //! \note Label name is always null terminated, so you can use `strlen()` to
- //! get it, however, it's also cached in `LabelEntry` itself, so if you want
- //! to know the size the fastest way is to call `LabelEntry::nameSize()`.
- inline uint32_t nameSize() const noexcept { return _name.size(); }
-
- //! Returns links associated with this label.
- inline LabelLink* links() const noexcept { return _links; }
+ //! The region will be the same size as data and immediate bits would correspond to `dataSize * 8`. There will be
+ //! no immediate bit shift or discarded bits.
+ inline void resetToSimpleValue(OffsetType type, size_t valueSize) noexcept {
+ ASMJIT_ASSERT(valueSize <= 8u);
+
+ _type = type;
+ _flags = uint8_t(0);
+ _regionSize = uint8_t(valueSize);
+ _valueSize = uint8_t(valueSize);
+ _valueOffset = uint8_t(0);
+ _immBitCount = uint8_t(valueSize * 8u);
+ _immBitShift = uint8_t(0);
+ _immDiscardLsb = uint8_t(0);
+ }
- //! Tests whether the label is bound.
- inline bool isBound() const noexcept { return _section != nullptr; }
- //! Tests whether the label is bound to a the given `sectionId`.
- inline bool isBoundTo(Section* section) const noexcept { return _section == section; }
+ inline void resetToImmValue(OffsetType type, size_t valueSize, uint32_t immBitShift, uint32_t immBitCount, uint32_t immDiscardLsb) noexcept {
+ ASMJIT_ASSERT(valueSize <= 8u);
+ ASMJIT_ASSERT(immBitShift < valueSize * 8u);
+ ASMJIT_ASSERT(immBitCount <= 64u);
+ ASMJIT_ASSERT(immDiscardLsb <= 64u);
+
+ _type = type;
+ _flags = uint8_t(0);
+ _regionSize = uint8_t(valueSize);
+ _valueSize = uint8_t(valueSize);
+ _valueOffset = uint8_t(0);
+ _immBitCount = uint8_t(immBitCount);
+ _immBitShift = uint8_t(immBitShift);
+ _immDiscardLsb = uint8_t(immDiscardLsb);
+ }
- //! Returns the label offset (only useful if the label is bound).
- inline uint64_t offset() const noexcept { return _offset; }
+ inline void setRegion(size_t regionSize, size_t valueOffset) noexcept {
+ _regionSize = uint8_t(regionSize);
+ _valueOffset = uint8_t(valueOffset);
+ }
- //! Returns the hash-value of label's name and its parent label (if any).
- //!
- //! Label hash is calculated as `HASH(Name) ^ ParentId`. The hash function
- //! is implemented in `Support::hashString()` and `Support::hashRound()`.
- inline uint32_t hashCode() const noexcept { return _hashCode; }
+ inline void setLeadingAndTrailingSize(size_t leadingSize, size_t trailingSize) noexcept {
+ _regionSize = uint8_t(leadingSize + trailingSize + _valueSize);
+ _valueOffset = uint8_t(leadingSize);
+ }
//! \}
};
-// ============================================================================
-// [asmjit::RelocEntry]
-// ============================================================================
+//! Relocation type.
+enum class RelocType : uint32_t {
+ //! None/deleted (no relocation).
+ kNone = 0,
+ //! Expression evaluation, `_payload` is pointer to `Expression`.
+ kExpression = 1,
+ //! Relocate absolute to absolute.
+ kAbsToAbs = 2,
+ //! Relocate relative to absolute.
+ kRelToAbs = 3,
+ //! Relocate absolute to relative.
+ kAbsToRel = 4,
+ //! Relocate absolute to relative or use trampoline.
+ kX64AddressEntry = 5
+};
//! Relocation entry.
-//!
-//! We describe relocation data in the following way:
-//!
-//! ```
-//! +- Start of the buffer +- End of the data
-//! | |*PATCHED*| | or instruction
-//! |xxxxxxxxxxxxxxxxxxxxxx|LeadSize|ValueSize|TrailSize|xxxxxxxxxxxxxxxxxxxx->
-//! |
-//! +- Source offset
-//! ```
struct RelocEntry {
+ //! \name Members
+ //! \{
+
//! Relocation id.
uint32_t _id;
//! Type of the relocation.
- uint8_t _relocType;
- //! Size of the relocation data/value (1, 2, 4 or 8 bytes).
- uint8_t _valueSize;
- //! Number of bytes after `_sourceOffset` to reach the value to be patched.
- uint8_t _leadingSize;
- //! Number of bytes after `_sourceOffset + _valueSize` to reach end of the
- //! instruction.
- uint8_t _trailingSize;
+ RelocType _relocType;
+ //! Format of the relocated value.
+ OffsetFormat _format;
//! Source section id.
uint32_t _sourceSectionId;
//! Target section id.
@@ -400,32 +451,15 @@ struct RelocEntry {
//! Payload (target offset, target address, expression, etc).
uint64_t _payload;
- //! Relocation type.
- enum RelocType : uint32_t {
- //! None/deleted (no relocation).
- kTypeNone = 0,
- //! Expression evaluation, `_payload` is pointer to `Expression`.
- kTypeExpression = 1,
- //! Relocate absolute to absolute.
- kTypeAbsToAbs = 2,
- //! Relocate relative to absolute.
- kTypeRelToAbs = 3,
- //! Relocate absolute to relative.
- kTypeAbsToRel = 4,
- //! Relocate absolute to relative or use trampoline.
- kTypeX64AddressEntry = 5
- };
+ //! \}
//! \name Accessors
//! \{
inline uint32_t id() const noexcept { return _id; }
- inline uint32_t relocType() const noexcept { return _relocType; }
- inline uint32_t valueSize() const noexcept { return _valueSize; }
-
- inline uint32_t leadingSize() const noexcept { return _leadingSize; }
- inline uint32_t trailingSize() const noexcept { return _trailingSize; }
+ inline RelocType relocType() const noexcept { return _relocType; }
+ inline const OffsetFormat& format() const noexcept { return _format; }
inline uint32_t sourceSectionId() const noexcept { return _sourceSectionId; }
inline uint32_t targetSectionId() const noexcept { return _targetSectionId; }
@@ -440,64 +474,170 @@ struct RelocEntry {
//! \}
};
-// ============================================================================
-// [asmjit::AddressTableEntry]
-// ============================================================================
+//! Type of the \ref Label.
+enum class LabelType : uint8_t {
+ //! Anonymous label that can optionally have a name, which is only used for debugging purposes.
+ kAnonymous = 0,
+ //! Local label (always has parentId).
+ kLocal = 1,
+ //! Global label (never has parentId).
+ kGlobal = 2,
+ //! External label (references an external symbol).
+ kExternal = 3,
+
+ //! Maximum value of `LabelType`.
+ kMaxValue = kExternal
+};
-//! Entry in an address table.
-class AddressTableEntry : public ZoneTreeNodeT<AddressTableEntry> {
+//! Data structure used to link either unbound labels or cross-section links.
+struct LabelLink {
+ //! Next link (single-linked list).
+ LabelLink* next;
+ //! Section id where the label is bound.
+ uint32_t sectionId;
+ //! Relocation id or Globals::kInvalidId.
+ uint32_t relocId;
+ //! Label offset relative to the start of the section.
+ size_t offset;
+ //! Inlined rel8/rel32.
+ intptr_t rel;
+ //! Offset format information.
+ OffsetFormat format;
+};
+
+//! Label entry.
+//!
+//! Contains the following properties:
+//! - Label id - This is the only thing that is set to the `Label` operand.
+//! - Label name - Optional, used mostly to create executables and libraries.
+//! - Label type - Type of the label, default `LabelType::kAnonymous`.
+//! - Label parent id - Derived from many assemblers that allow to define a local label that falls under a global
+//! label. This allows to define many labels of the same name that have different parent (global) label.
+//! - Offset - offset of the label bound by `Assembler`.
+//! - Links - single-linked list that contains locations of code that has to be patched when the label gets bound.
+//! Every use of unbound label adds one link to `_links` list.
+//! - HVal - Hash value of label's name and optionally parentId.
+//! - HashNext - Hash-table implementation detail.
+class LabelEntry : public ZoneHashNode {
public:
- ASMJIT_NONCOPYABLE(AddressTableEntry)
+ //! \name Constants
+ //! \{
- //! Address.
- uint64_t _address;
- //! Slot.
- uint32_t _slot;
+ enum : uint32_t {
+ //! SSO size of \ref _name.
+ //!
+ //! \cond INTERNAL
+ //! Let's round the size of `LabelEntry` to 64 bytes (as `ZoneAllocator` has granularity of 32 bytes anyway). This
+ //! gives `_name` the remaining space, which is should be 16 bytes on 64-bit and 28 bytes on 32-bit architectures.
+ //! \endcond
+ kStaticNameSize = 64 - (sizeof(ZoneHashNode) + 8 + sizeof(Section*) + sizeof(size_t) + sizeof(LabelLink*))
+ };
- //! \name Construction & Destruction
+ //! \}
+
+ //! \name Members
//! \{
- inline explicit AddressTableEntry(uint64_t address) noexcept
- : _address(address),
- _slot(0xFFFFFFFFu) {}
+ //! Type of the label.
+ LabelType _type;
+ //! Must be zero.
+ uint8_t _reserved[3];
+ //! Label parent id or zero.
+ uint32_t _parentId;
+ //! Label offset relative to the start of the `_section`.
+ uint64_t _offset;
+ //! Section where the label was bound.
+ Section* _section;
+ //! Label links.
+ LabelLink* _links;
+ //! Label name.
+ ZoneString<kStaticNameSize> _name;
//! \}
//! \name Accessors
//! \{
- inline uint64_t address() const noexcept { return _address; }
- inline uint32_t slot() const noexcept { return _slot; }
+ // NOTE: Label id is stored in `_customData`, which is provided by ZoneHashNode to fill a padding that a C++
+ // compiler targeting 64-bit CPU will add to align the structure to 64-bits.
- inline bool hasAssignedSlot() const noexcept { return _slot != 0xFFFFFFFFu; }
+ //! Returns label id.
+ inline uint32_t id() const noexcept { return _customData; }
+ //! Sets label id (internal, used only by `CodeHolder`).
+ inline void _setId(uint32_t id) noexcept { _customData = id; }
- inline bool operator<(const AddressTableEntry& other) const noexcept { return _address < other._address; }
- inline bool operator>(const AddressTableEntry& other) const noexcept { return _address > other._address; }
+ //! Returns label type.
+ inline LabelType type() const noexcept { return _type; }
- inline bool operator<(uint64_t queryAddress) const noexcept { return _address < queryAddress; }
- inline bool operator>(uint64_t queryAddress) const noexcept { return _address > queryAddress; }
+ //! Tests whether the label has a parent label.
+ inline bool hasParent() const noexcept { return _parentId != Globals::kInvalidId; }
+ //! Returns label's parent id.
+ inline uint32_t parentId() const noexcept { return _parentId; }
+
+ //! Returns the section where the label was bound.
+ //!
+ //! If the label was not yet bound the return value is `nullptr`.
+ inline Section* section() const noexcept { return _section; }
+
+ //! Tests whether the label has name.
+ inline bool hasName() const noexcept { return !_name.empty(); }
+
+ //! Returns the label's name.
+ //!
+ //! \note Local labels will return their local name without their parent part, for example ".L1".
+ inline const char* name() const noexcept { return _name.data(); }
+
+ //! Returns size of label's name.
+ //!
+ //! \note Label name is always null terminated, so you can use `strlen()` to get it, however, it's also cached in
+ //! `LabelEntry` itself, so if you want to know the size the fastest way is to call `LabelEntry::nameSize()`.
+ inline uint32_t nameSize() const noexcept { return _name.size(); }
+
+ //! Returns links associated with this label.
+ inline LabelLink* links() const noexcept { return _links; }
+
+ //! Tests whether the label is bound.
+ inline bool isBound() const noexcept { return _section != nullptr; }
+ //! Tests whether the label is bound to a the given `sectionId`.
+ inline bool isBoundTo(Section* section) const noexcept { return _section == section; }
+
+ //! Returns the label offset (only useful if the label is bound).
+ inline uint64_t offset() const noexcept { return _offset; }
+
+ //! Returns the hash-value of label's name and its parent label (if any).
+ //!
+ //! Label hash is calculated as `HASH(Name) ^ ParentId`. The hash function is implemented in `Support::hashString()`
+ //! and `Support::hashRound()`.
+ inline uint32_t hashCode() const noexcept { return _hashCode; }
//! \}
};
-// ============================================================================
-// [asmjit::CodeHolder]
-// ============================================================================
-
-//! Contains basic information about the target architecture and its options.
+//! Holds assembled code and data (including sections, labels, and relocation information).
+//!
+//! CodeHolder connects emitters with their targets. It provides them interface that can be used to query information
+//! about the target environment (architecture, etc...) and API to create labels, sections, relocations, and to write
+//! data to a \ref CodeBuffer, which is always part of \ref Section. More than one emitter can be attached to a single
+//! CodeHolder instance at a time, which is used in practice
//!
-//! In addition, it holds assembled code & data (including sections, labels, and
-//! relocation information). `CodeHolder` can store both binary and intermediate
-//! representation of assembly, which can be generated by \ref BaseAssembler,
-//! \ref BaseBuilder, and \ref BaseCompiler
+//! CodeHolder provides interface for all emitter types. Assemblers use CodeHolder to write into \ref CodeBuffer, and
+//! higher level emitters like Builder and Compiler use CodeHolder to manage labels and sections so higher level code
+//! can be serialized to Assembler by \ref BaseEmitter::finalize() and \ref BaseBuilder::serializeTo().
//!
-//! \note `CodeHolder` has an ability to attach an \ref ErrorHandler, however,
-//! the error handler is not triggered by `CodeHolder` itself, it's instead
-//! propagated to all emitters that attach to it.
+//! In order to use CodeHolder, it must be first initialized by \ref init(). After the CodeHolder has been successfully
+//! initialized it can be used to hold assembled code, sections, labels, relocations, and to attach / detach code
+//! emitters. After the end of code generation it can be used to query physical locations of labels and to relocate
+//! the assembled code into the right address.
+//!
+//! \note \ref CodeHolder has an ability to attach an \ref ErrorHandler, however, the error handler is not triggered
+//! by \ref CodeHolder itself, it's instead propagated to all emitters that attach to it.
class CodeHolder {
public:
ASMJIT_NONCOPYABLE(CodeHolder)
+ //! \name Members
+ //! \{
+
//! Environment information.
Environment _environment;
//! Base address or \ref Globals::kNoBaseAddress.
@@ -517,6 +657,8 @@ public:
ZoneVector<BaseEmitter*> _emitters;
//! Section entries.
ZoneVector<Section*> _sections;
+ //! Section entries sorted by section order and then section id.
+ ZoneVector<Section*> _sectionsByOrder;
//! Label entries.
ZoneVector<LabelEntry*> _labelEntries;
//! Relocation entries.
@@ -531,31 +673,22 @@ public:
//! Address table entries.
ZoneTree<AddressTableEntry> _addressTableEntries;
- //! Options that can be used with \ref copySectionData() and \ref copyFlattenedData().
- enum CopyOptions : uint32_t {
- //! If virtual size of a section is greater than the size of its \ref CodeBuffer
- //! then all bytes between the buffer size and virtual size will be zeroed.
- //! If this option is not set then those bytes would be left as is, which
- //! means that if the user didn't initialize them they would have a previous
- //! content, which may be unwanted.
- kCopyPadSectionBuffer = 0x00000001u,
-
-#ifndef ASMJIT_NO_DEPRECATED
- kCopyWithPadding = kCopyPadSectionBuffer,
-#endif // !ASMJIT_NO_DEPRECATED
-
- //! Zeroes the target buffer if the flattened data is less than the destination
- //! size. This option works only with \ref copyFlattenedData() as it processes
- //! multiple sections. It is ignored by \ref copySectionData().
- kCopyPadTargetBuffer = 0x00000002u
- };
+ //! \}
//! \name Construction & Destruction
//! \{
//! Creates an uninitialized CodeHolder (you must init() it before it can be used).
- ASMJIT_API CodeHolder() noexcept;
- //! Destroys the CodeHolder.
+ //!
+ //! An optional `temporary` argument can be used to initialize the first block of \ref Zone that the CodeHolder
+ //! uses into a temporary memory provided by the user.
+ ASMJIT_API explicit CodeHolder(const Support::Temporary* temporary = nullptr) noexcept;
+
+ //! \overload
+ inline explicit CodeHolder(const Support::Temporary& temporary) noexcept
+ : CodeHolder(&temporary) {}
+
+ //! Destroys the CodeHolder and frees all resources it has allocated.
ASMJIT_API ~CodeHolder() noexcept;
//! Tests whether the `CodeHolder` has been initialized.
@@ -563,10 +696,10 @@ public:
//! Emitters can be only attached to initialized `CodeHolder` instances.
inline bool isInitialized() const noexcept { return _environment.isInitialized(); }
- //! Initializes CodeHolder to hold code described by code `info`.
+ //! Initializes CodeHolder to hold code described by the given `environment` and `baseAddress`.
ASMJIT_API Error init(const Environment& environment, uint64_t baseAddress = Globals::kNoBaseAddress) noexcept;
//! Detaches all code-generators attached and resets the `CodeHolder`.
- ASMJIT_API void reset(uint32_t resetPolicy = Globals::kResetSoft) noexcept;
+ ASMJIT_API void reset(ResetPolicy resetPolicy = ResetPolicy::kSoft) noexcept;
//! \}
@@ -585,10 +718,9 @@ public:
//! Returns the allocator that the `CodeHolder` uses.
//!
- //! \note This should be only used for AsmJit's purposes. Code holder uses
- //! arena allocator to allocate everything, so anything allocated through
- //! this allocator will be invalidated by \ref CodeHolder::reset() or by
- //! CodeHolder's destructor.
+ //! \note This should be only used for AsmJit's purposes. Code holder uses arena allocator to allocate everything,
+ //! so anything allocated through this allocator will be invalidated by \ref CodeHolder::reset() or by CodeHolder's
+ //! destructor.
inline ZoneAllocator* allocator() const noexcept { return const_cast<ZoneAllocator*>(&_allocator); }
//! \}
@@ -596,13 +728,13 @@ public:
//! \name Code & Architecture
//! \{
- //! Returns the target environment information, see \ref Environment.
+ //! Returns the target environment information.
inline const Environment& environment() const noexcept { return _environment; }
//! Returns the target architecture.
- inline uint32_t arch() const noexcept { return environment().arch(); }
+ inline Arch arch() const noexcept { return environment().arch(); }
//! Returns the target sub-architecture.
- inline uint32_t subArch() const noexcept { return environment().subArch(); }
+ inline SubArch subArch() const noexcept { return environment().subArch(); }
//! Tests whether a static base-address is set.
inline bool hasBaseAddress() const noexcept { return _baseAddress != Globals::kNoBaseAddress; }
@@ -622,7 +754,7 @@ public:
//! \name Logging
//! \{
- //! Returns the attached logger, see \ref Logger.
+ //! Returns the attached logger.
inline Logger* logger() const noexcept { return _logger; }
//! Attaches a `logger` to CodeHolder and propagates it to all attached emitters.
ASMJIT_API void setLogger(Logger* logger) noexcept;
@@ -648,14 +780,12 @@ public:
//! Makes sure that at least `n` bytes can be added to CodeHolder's buffer `cb`.
//!
- //! \note The buffer `cb` must be managed by `CodeHolder` - otherwise the
- //! behavior of the function is undefined.
+ //! \note The buffer `cb` must be managed by `CodeHolder` - otherwise the behavior of the function is undefined.
ASMJIT_API Error growBuffer(CodeBuffer* cb, size_t n) noexcept;
//! Reserves the size of `cb` to at least `n` bytes.
//!
- //! \note The buffer `cb` must be managed by `CodeHolder` - otherwise the
- //! behavior of the function is undefined.
+ //! \note The buffer `cb` must be managed by `CodeHolder` - otherwise the behavior of the function is undefined.
ASMJIT_API Error reserveBuffer(CodeBuffer* cb, size_t n) noexcept;
//! \}
@@ -665,6 +795,8 @@ public:
//! Returns an array of `Section*` records.
inline const ZoneVector<Section*>& sections() const noexcept { return _sections; }
+ //! Returns an array of `Section*` records sorted according to section order first, then section id.
+ inline const ZoneVector<Section*>& sectionsByOrder() const noexcept { return _sectionsByOrder; }
//! Returns the number of sections.
inline uint32_t sectionCount() const noexcept { return _sections.size(); }
@@ -674,7 +806,7 @@ public:
//! Creates a new section and return its pointer in `sectionOut`.
//!
//! Returns `Error`, does not report a possible error to `ErrorHandler`.
- ASMJIT_API Error newSection(Section** sectionOut, const char* name, size_t nameSize = SIZE_MAX, uint32_t flags = 0, uint32_t alignment = 1) noexcept;
+ ASMJIT_API Error newSection(Section** sectionOut, const char* name, size_t nameSize = SIZE_MAX, SectionFlags flags = SectionFlags::kNone, uint32_t alignment = 1, int32_t order = 0) noexcept;
//! Returns a section entry of the given index.
inline Section* sectionById(uint32_t sectionId) const noexcept { return _sections[sectionId]; }
@@ -706,14 +838,12 @@ public:
//! Used to add an address to an address table.
//!
- //! This implicitly calls `ensureAddressTableSection()` and then creates
- //! `AddressTableEntry` that is inserted to `_addressTableEntries`. If the
- //! address already exists this operation does nothing as the same addresses
+ //! This implicitly calls `ensureAddressTableSection()` and then creates `AddressTableEntry` that is inserted
+ //! to `_addressTableEntries`. If the address already exists this operation does nothing as the same addresses
//! use the same slot.
//!
- //! This function should be considered internal as it's used by assemblers to
- //! insert an absolute address into the address table. Inserting address into
- //! address table without creating a particula relocation entry makes no sense.
+ //! This function should be considered internal as it's used by assemblers to insert an absolute address into the
+ //! address table. Inserting address into address table without creating a particula relocation entry makes no sense.
ASMJIT_API Error addAddressToAddressTable(uint64_t address) noexcept;
//! \}
@@ -761,8 +891,8 @@ public:
//! Returns offset of a `Label` by its `labelId`.
//!
- //! The offset returned is relative to the start of the section. Zero offset
- //! is returned for unbound labels, which is their initial offset value.
+ //! The offset returned is relative to the start of the section. Zero offset is returned for unbound labels,
+ //! which is their initial offset value.
inline uint64_t labelOffset(uint32_t labelId) const noexcept {
ASMJIT_ASSERT(isLabelValid(labelId));
return _labelEntries[labelId]->offset();
@@ -775,9 +905,8 @@ public:
//! Returns offset of a label by it's `labelId` relative to the base offset.
//!
- //! \remarks The offset of the section where the label is bound must be valid
- //! in order to use this function, otherwise the value returned will not be
- //! reliable.
+ //! \remarks The offset of the section where the label is bound must be valid in order to use this function,
+ //! otherwise the value returned will not be reliable.
inline uint64_t labelOffsetFromBase(uint32_t labelId) const noexcept {
ASMJIT_ASSERT(isLabelValid(labelId));
const LabelEntry* le = _labelEntries[labelId];
@@ -798,20 +927,18 @@ public:
//!
//! \param entryOut Where to store the created \ref LabelEntry.
//! \param name The name of the label.
- //! \param nameSize The length of `name` argument, or `SIZE_MAX` if `name` is
- //! a null terminated string, which means that the `CodeHolder` will
- //! use `strlen()` to determine the length.
- //! \param type The type of the label to create, see \ref Label::LabelType.
- //! \param parentId Parent id of a local label, otherwise it must be
- //! \ref Globals::kInvalidId.
- //!
- //! \retval Always returns \ref Error, does not report a possible error to
- //! the attached \ref ErrorHandler.
+ //! \param nameSize The length of `name` argument, or `SIZE_MAX` if `name` is a null terminated string, which
+ //! means that the `CodeHolder` will use `strlen()` to determine the length.
+ //! \param type The type of the label to create, see \ref LabelType.
+ //! \param parentId Parent id of a local label, otherwise it must be \ref Globals::kInvalidId.
+ //! \retval Always returns \ref Error, does not report a possible error to the attached \ref ErrorHandler.
//!
- //! AsmJit has a support for local labels (\ref Label::kTypeLocal) which
- //! require a parent label id (parentId). The names of local labels can
- //! conflict with names of other local labels that have a different parent.
- ASMJIT_API Error newNamedLabelEntry(LabelEntry** entryOut, const char* name, size_t nameSize, uint32_t type, uint32_t parentId = Globals::kInvalidId) noexcept;
+ //! AsmJit has a support for local labels (\ref LabelType::kLocal) which require a parent label id (parentId).
+ //! The names of local labels can conflict with names of other local labels that have a different parent. In
+ //! addition, AsmJit supports named anonymous labels, which are useful only for debugging purposes as the
+ //! anonymous name will have a name, which will be formatted, but the label itself cannot be queried by such
+ //! name.
+ ASMJIT_API Error newNamedLabelEntry(LabelEntry** entryOut, const char* name, size_t nameSize, LabelType type, uint32_t parentId = Globals::kInvalidId) noexcept;
//! Returns a label by name.
//!
@@ -834,12 +961,11 @@ public:
//! Creates a new label-link used to store information about yet unbound labels.
//!
//! Returns `null` if the allocation failed.
- ASMJIT_API LabelLink* newLabelLink(LabelEntry* le, uint32_t sectionId, size_t offset, intptr_t rel) noexcept;
+ ASMJIT_API LabelLink* newLabelLink(LabelEntry* le, uint32_t sectionId, size_t offset, intptr_t rel, const OffsetFormat& format) noexcept;
- //! Resolves cross-section links (`LabelLink`) associated with each label that
- //! was used as a destination in code of a different section. It's only useful
- //! to people that use multiple sections as it will do nothing if the code only
- //! contains a single section in which cross-section links are not possible.
+ //! Resolves cross-section links (`LabelLink`) associated with each label that was used as a destination in code
+ //! of a different section. It's only useful to people that use multiple sections as it will do nothing if the code
+ //! only contains a single section in which cross-section links are not possible.
ASMJIT_API Error resolveUnresolvedLinks() noexcept;
//! Binds a label to a given `sectionId` and `offset` (relative to start of the section).
@@ -860,10 +986,10 @@ public:
//! Returns a RelocEntry of the given `id`.
inline RelocEntry* relocEntry(uint32_t id) const noexcept { return _relocations[id]; }
- //! Creates a new relocation entry of type `relocType` and size `valueSize`.
+ //! Creates a new relocation entry of type `relocType`.
//!
//! Additional fields can be set after the relocation entry was created.
- ASMJIT_API Error newRelocEntry(RelocEntry** dst, uint32_t relocType, uint32_t valueSize) noexcept;
+ ASMJIT_API Error newRelocEntry(RelocEntry** dst, RelocType relocType) noexcept;
//! \}
@@ -877,49 +1003,29 @@ public:
//! Returns computed the size of code & data of all sections.
//!
- //! \note All sections will be iterated over and the code size returned
- //! would represent the minimum code size of all combined sections after
- //! applying minimum alignment. Code size may decrease after calling
- //! `flatten()` and `relocateToBase()`.
+ //! \note All sections will be iterated over and the code size returned would represent the minimum code size of
+ //! all combined sections after applying minimum alignment. Code size may decrease after calling `flatten()` and
+ //! `relocateToBase()`.
ASMJIT_API size_t codeSize() const noexcept;
//! Relocates the code to the given `baseAddress`.
//!
- //! \param baseAddress Absolute base address where the code will be relocated
- //! to. Please note that nothing is copied to such base address, it's just an
- //! absolute value used by the relocator to resolve all stored relocations.
+ //! \param baseAddress Absolute base address where the code will be relocated to. Please note that nothing is
+ //! copied to such base address, it's just an absolute value used by the relocator to resolve all stored relocations.
//!
//! \note This should never be called more than once.
ASMJIT_API Error relocateToBase(uint64_t baseAddress) noexcept;
//! Copies a single section into `dst`.
- ASMJIT_API Error copySectionData(void* dst, size_t dstSize, uint32_t sectionId, uint32_t copyOptions = 0) noexcept;
+ ASMJIT_API Error copySectionData(void* dst, size_t dstSize, uint32_t sectionId, CopySectionFlags copyFlags = CopySectionFlags::kNone) noexcept;
//! Copies all sections into `dst`.
//!
- //! This should only be used if the data was flattened and there are no gaps
- //! between the sections. The `dstSize` is always checked and the copy will
- //! never write anything outside the provided buffer.
- ASMJIT_API Error copyFlattenedData(void* dst, size_t dstSize, uint32_t copyOptions = 0) noexcept;
+ //! This should only be used if the data was flattened and there are no gaps between the sections. The `dstSize`
+ //! is always checked and the copy will never write anything outside the provided buffer.
+ ASMJIT_API Error copyFlattenedData(void* dst, size_t dstSize, CopySectionFlags copyFlags = CopySectionFlags::kNone) noexcept;
//! \}
-
-#ifndef ASMJIT_NO_DEPRECATED
- ASMJIT_DEPRECATED("Use 'CodeHolder::init(const Environment& environment, uint64_t baseAddress)' instead")
- inline Error init(const CodeInfo& codeInfo) noexcept { return init(codeInfo._environment, codeInfo._baseAddress); }
-
- ASMJIT_DEPRECATED("Use nevironment() instead")
- inline CodeInfo codeInfo() const noexcept { return CodeInfo(_environment, _baseAddress); }
-
- ASMJIT_DEPRECATED("Use BaseEmitter::encodingOptions() - this function always returns zero")
- inline uint32_t emitterOptions() const noexcept { return 0; }
-
- ASMJIT_DEPRECATED("Use BaseEmitter::addEncodingOptions() - this function does nothing")
- inline void addEmitterOptions(uint32_t options) noexcept { DebugUtils::unused(options); }
-
- ASMJIT_DEPRECATED("Use BaseEmitter::clearEncodingOptions() - this function does nothing")
- inline void clearEmitterOptions(uint32_t options) noexcept { DebugUtils::unused(options); }
-#endif // !ASMJIT_NO_DEPRECATED
};
//! \}
diff --git a/3rdparty/asmjit/src/asmjit/core/codewriter.cpp b/3rdparty/asmjit/src/asmjit/core/codewriter.cpp
new file mode 100644
index 00000000000..1babc5f172e
--- /dev/null
+++ b/3rdparty/asmjit/src/asmjit/core/codewriter.cpp
@@ -0,0 +1,175 @@
+// This file is part of AsmJit project <https://asmjit.com>
+//
+// See asmjit.h or LICENSE.md for license and copyright information
+// SPDX-License-Identifier: Zlib
+
+#include "../core/api-build_p.h"
+#include "../core/codeholder.h"
+#include "../core/codewriter_p.h"
+
+ASMJIT_BEGIN_NAMESPACE
+
+bool CodeWriterUtils::encodeOffset32(uint32_t* dst, int64_t offset64, const OffsetFormat& format) noexcept {
+ uint32_t bitCount = format.immBitCount();
+ uint32_t bitShift = format.immBitShift();
+ uint32_t discardLsb = format.immDiscardLsb();
+
+ // Invalid offset (should not happen).
+ if (!bitCount || bitCount > format.valueSize() * 8u)
+ return false;
+
+ uint32_t value;
+
+ // First handle all unsigned offset types.
+ if (format.type() == OffsetType::kUnsignedOffset) {
+ if (discardLsb) {
+ ASMJIT_ASSERT(discardLsb <= 32);
+ if ((offset64 & Support::lsbMask<uint32_t>(discardLsb)) != 0)
+ return false;
+ offset64 = int64_t(uint64_t(offset64) >> discardLsb);
+ }
+
+ value = uint32_t(offset64 & Support::lsbMask<uint32_t>(bitCount));
+ if (value != offset64)
+ return false;
+ }
+ else {
+ // The rest of OffsetType options are all signed.
+ if (discardLsb) {
+ ASMJIT_ASSERT(discardLsb <= 32);
+ if ((offset64 & Support::lsbMask<uint32_t>(discardLsb)) != 0)
+ return false;
+ offset64 >>= discardLsb;
+ }
+
+ if (!Support::isInt32(offset64))
+ return false;
+
+ value = uint32_t(int32_t(offset64));
+ if (!Support::isEncodableOffset32(int32_t(value), bitCount))
+ return false;
+ }
+
+ switch (format.type()) {
+ case OffsetType::kSignedOffset:
+ case OffsetType::kUnsignedOffset: {
+ *dst = (value & Support::lsbMask<uint32_t>(bitCount)) << bitShift;
+ return true;
+ }
+
+ case OffsetType::kAArch64_ADR:
+ case OffsetType::kAArch64_ADRP: {
+ // Sanity checks.
+ if (format.valueSize() != 4 || bitCount != 21 || bitShift != 5)
+ return false;
+
+ uint32_t immLo = value & 0x3u;
+ uint32_t immHi = (value >> 2) & Support::lsbMask<uint32_t>(19);
+
+ *dst = (immLo << 29) | (immHi << 5);
+ return true;
+ }
+
+ default:
+ return false;
+ }
+}
+
+bool CodeWriterUtils::encodeOffset64(uint64_t* dst, int64_t offset64, const OffsetFormat& format) noexcept {
+ uint32_t bitCount = format.immBitCount();
+ uint32_t discardLsb = format.immDiscardLsb();
+
+ if (!bitCount || bitCount > format.valueSize() * 8u)
+ return false;
+
+ uint64_t value;
+
+ // First handle all unsigned offset types.
+ if (format.type() == OffsetType::kUnsignedOffset) {
+ if (discardLsb) {
+ ASMJIT_ASSERT(discardLsb <= 32);
+ if ((offset64 & Support::lsbMask<uint32_t>(discardLsb)) != 0)
+ return false;
+ offset64 = int64_t(uint64_t(offset64) >> discardLsb);
+ }
+
+ value = uint64_t(offset64) & Support::lsbMask<uint64_t>(bitCount);
+ if (value != uint64_t(offset64))
+ return false;
+ }
+ else {
+ // The rest of OffsetType options are all signed.
+ if (discardLsb) {
+ ASMJIT_ASSERT(discardLsb <= 32);
+ if ((offset64 & Support::lsbMask<uint32_t>(discardLsb)) != 0)
+ return false;
+ offset64 >>= discardLsb;
+ }
+
+ if (!Support::isEncodableOffset64(offset64, bitCount))
+ return false;
+
+ value = uint64_t(offset64);
+ }
+
+ switch (format.type()) {
+ case OffsetType::kSignedOffset:
+ case OffsetType::kUnsignedOffset: {
+ *dst = (value & Support::lsbMask<uint64_t>(bitCount)) << format.immBitShift();
+ return true;
+ }
+
+ default:
+ return false;
+ }
+}
+
+bool CodeWriterUtils::writeOffset(void* dst, int64_t offset64, const OffsetFormat& format) noexcept {
+ // Offset the destination by ValueOffset so the `dst` points to the
+ // patched word instead of the beginning of the patched region.
+ dst = static_cast<char*>(dst) + format.valueOffset();
+
+ switch (format.valueSize()) {
+ case 1: {
+ uint32_t mask;
+ if (!encodeOffset32(&mask, offset64, format))
+ return false;
+
+ Support::writeU8(dst, uint8_t(Support::readU8(dst) | mask));
+ return true;
+ }
+
+ case 2: {
+ uint32_t mask;
+ if (!encodeOffset32(&mask, offset64, format))
+ return false;
+
+ Support::writeU16uLE(dst, uint16_t(Support::readU16uLE(dst) | mask));
+ return true;
+ }
+
+ case 4: {
+ uint32_t mask;
+ if (!encodeOffset32(&mask, offset64, format)) {
+ return false;
+ }
+
+ Support::writeU32uLE(dst, Support::readU32uLE(dst) | mask);
+ return true;
+ }
+
+ case 8: {
+ uint64_t mask;
+ if (!encodeOffset64(&mask, offset64, format))
+ return false;
+
+ Support::writeU64uLE(dst, Support::readU64uLE(dst) | mask);
+ return true;
+ }
+
+ default:
+ return false;
+ }
+}
+
+ASMJIT_END_NAMESPACE
diff --git a/3rdparty/asmjit/src/asmjit/core/codebufferwriter_p.h b/3rdparty/asmjit/src/asmjit/core/codewriter_p.h
index 75ee04748f4..c799241490a 100644
--- a/3rdparty/asmjit/src/asmjit/core/codebufferwriter_p.h
+++ b/3rdparty/asmjit/src/asmjit/core/codewriter_p.h
@@ -1,25 +1,7 @@
-// AsmJit - Machine code generation for C++
+// This file is part of AsmJit project <https://asmjit.com>
//
-// * Official AsmJit Home Page: https://asmjit.com
-// * Official Github Repository: https://github.com/asmjit/asmjit
-//
-// Copyright (c) 2008-2020 The AsmJit Authors
-//
-// This software is provided 'as-is', without any express or implied
-// warranty. In no event will the authors be held liable for any damages
-// arising from the use of this software.
-//
-// Permission is granted to anyone to use this software for any purpose,
-// including commercial applications, and to alter it and redistribute it
-// freely, subject to the following restrictions:
-//
-// 1. The origin of this software must not be misrepresented; you must not
-// claim that you wrote the original software. If you use this software
-// in a product, an acknowledgment in the product documentation would be
-// appreciated but is not required.
-// 2. Altered source versions must be plainly marked as such, and must not be
-// misrepresented as being the original software.
-// 3. This notice may not be removed or altered from any source distribution.
+// See asmjit.h or LICENSE.md for license and copyright information
+// SPDX-License-Identifier: Zlib
#ifndef ASMJIT_CORE_CODEBUFFERWRITER_P_H_INCLUDED
#define ASMJIT_CORE_CODEBUFFERWRITER_P_H_INCLUDED
@@ -34,19 +16,17 @@ ASMJIT_BEGIN_NAMESPACE
//! \addtogroup asmjit_assembler
//! \{
-// ============================================================================
-// [asmjit::CodeBufferWriter]
-// ============================================================================
+struct OffsetFormat;
-//! Helper that is used to write into a `CodeBuffer` held by `BaseAssembler`.
-class CodeBufferWriter {
+//! Helper that is used to write into a \ref CodeBuffer held by \ref BaseAssembler.
+class CodeWriter {
public:
uint8_t* _cursor;
- ASMJIT_INLINE explicit CodeBufferWriter(BaseAssembler* a) noexcept
+ ASMJIT_FORCE_INLINE explicit CodeWriter(BaseAssembler* a) noexcept
: _cursor(a->_bufferPtr) {}
- ASMJIT_INLINE Error ensureSpace(BaseAssembler* a, size_t n) noexcept {
+ ASMJIT_FORCE_INLINE Error ensureSpace(BaseAssembler* a, size_t n) noexcept {
size_t remainingSpace = (size_t)(a->_bufferEnd - _cursor);
if (ASMJIT_UNLIKELY(remainingSpace < n)) {
CodeBuffer& buffer = a->_section->_buffer;
@@ -58,24 +38,24 @@ public:
return kErrorOk;
}
- ASMJIT_INLINE uint8_t* cursor() const noexcept { return _cursor; }
- ASMJIT_INLINE void setCursor(uint8_t* cursor) noexcept { _cursor = cursor; }
- ASMJIT_INLINE void advance(size_t n) noexcept { _cursor += n; }
+ ASMJIT_FORCE_INLINE uint8_t* cursor() const noexcept { return _cursor; }
+ ASMJIT_FORCE_INLINE void setCursor(uint8_t* cursor) noexcept { _cursor = cursor; }
+ ASMJIT_FORCE_INLINE void advance(size_t n) noexcept { _cursor += n; }
- ASMJIT_INLINE size_t offsetFrom(uint8_t* from) const noexcept {
+ ASMJIT_FORCE_INLINE size_t offsetFrom(uint8_t* from) const noexcept {
ASMJIT_ASSERT(_cursor >= from);
return (size_t)(_cursor - from);
}
template<typename T>
- ASMJIT_INLINE void emit8(T val) noexcept {
+ ASMJIT_FORCE_INLINE void emit8(T val) noexcept {
typedef typename std::make_unsigned<T>::type U;
_cursor[0] = uint8_t(U(val) & U(0xFF));
_cursor++;
}
template<typename T, typename Y>
- ASMJIT_INLINE void emit8If(T val, Y cond) noexcept {
+ ASMJIT_FORCE_INLINE void emit8If(T val, Y cond) noexcept {
typedef typename std::make_unsigned<T>::type U;
ASMJIT_ASSERT(size_t(cond) <= 1u);
@@ -84,41 +64,41 @@ public:
}
template<typename T>
- ASMJIT_INLINE void emit16uLE(T val) noexcept {
+ ASMJIT_FORCE_INLINE void emit16uLE(T val) noexcept {
typedef typename std::make_unsigned<T>::type U;
- Support::writeU16uLE(_cursor, uint32_t(U(val) & 0xFFFFu));
+ Support::writeU16uLE(_cursor, uint16_t(U(val) & 0xFFFFu));
_cursor += 2;
}
template<typename T>
- ASMJIT_INLINE void emit16uBE(T val) noexcept {
+ ASMJIT_FORCE_INLINE void emit16uBE(T val) noexcept {
typedef typename std::make_unsigned<T>::type U;
- Support::writeU16uBE(_cursor, uint32_t(U(val) & 0xFFFFu));
+ Support::writeU16uBE(_cursor, uint16_t(U(val) & 0xFFFFu));
_cursor += 2;
}
template<typename T>
- ASMJIT_INLINE void emit32uLE(T val) noexcept {
+ ASMJIT_FORCE_INLINE void emit32uLE(T val) noexcept {
typedef typename std::make_unsigned<T>::type U;
Support::writeU32uLE(_cursor, uint32_t(U(val) & 0xFFFFFFFFu));
_cursor += 4;
}
template<typename T>
- ASMJIT_INLINE void emit32uBE(T val) noexcept {
+ ASMJIT_FORCE_INLINE void emit32uBE(T val) noexcept {
typedef typename std::make_unsigned<T>::type U;
Support::writeU32uBE(_cursor, uint32_t(U(val) & 0xFFFFFFFFu));
_cursor += 4;
}
- ASMJIT_INLINE void emitData(const void* data, size_t size) noexcept {
+ ASMJIT_FORCE_INLINE void emitData(const void* data, size_t size) noexcept {
ASMJIT_ASSERT(size != 0);
memcpy(_cursor, data, size);
_cursor += size;
}
template<typename T>
- ASMJIT_INLINE void emitValueLE(const T& value, size_t size) noexcept {
+ ASMJIT_FORCE_INLINE void emitValueLE(const T& value, size_t size) noexcept {
typedef typename std::make_unsigned<T>::type U;
ASMJIT_ASSERT(size <= sizeof(T));
@@ -131,7 +111,7 @@ public:
}
template<typename T>
- ASMJIT_INLINE void emitValueBE(const T& value, size_t size) noexcept {
+ ASMJIT_FORCE_INLINE void emitValueBE(const T& value, size_t size) noexcept {
typedef typename std::make_unsigned<T>::type U;
ASMJIT_ASSERT(size <= sizeof(T));
@@ -143,13 +123,13 @@ public:
_cursor += size;
}
- ASMJIT_INLINE void emitZeros(size_t size) noexcept {
+ ASMJIT_FORCE_INLINE void emitZeros(size_t size) noexcept {
ASMJIT_ASSERT(size != 0);
memset(_cursor, 0, size);
_cursor += size;
}
- ASMJIT_INLINE void remove8(uint8_t* where) noexcept {
+ ASMJIT_FORCE_INLINE void remove8(uint8_t* where) noexcept {
ASMJIT_ASSERT(where < _cursor);
uint8_t* p = where;
@@ -159,7 +139,7 @@ public:
}
template<typename T>
- ASMJIT_INLINE void insert8(uint8_t* where, T val) noexcept {
+ ASMJIT_FORCE_INLINE void insert8(uint8_t* where, T val) noexcept {
uint8_t* p = _cursor;
while (p != where) {
@@ -171,7 +151,7 @@ public:
_cursor++;
}
- ASMJIT_INLINE void done(BaseAssembler* a) noexcept {
+ ASMJIT_FORCE_INLINE void done(BaseAssembler* a) noexcept {
CodeBuffer& buffer = a->_section->_buffer;
size_t newSize = (size_t)(_cursor - a->_bufferData);
ASMJIT_ASSERT(newSize <= buffer.capacity());
@@ -181,6 +161,16 @@ public:
}
};
+//! Code writer utilities.
+namespace CodeWriterUtils {
+
+bool encodeOffset32(uint32_t* dst, int64_t offset64, const OffsetFormat& format) noexcept;
+bool encodeOffset64(uint64_t* dst, int64_t offset64, const OffsetFormat& format) noexcept;
+
+bool writeOffset(void* dst, int64_t offset64, const OffsetFormat& format) noexcept;
+
+} // {CodeWriterUtils}
+
//! \}
//! \endcond
diff --git a/3rdparty/asmjit/src/asmjit/core/compiler.cpp b/3rdparty/asmjit/src/asmjit/core/compiler.cpp
index 8043b48c847..b1c6b803b29 100644
--- a/3rdparty/asmjit/src/asmjit/core/compiler.cpp
+++ b/3rdparty/asmjit/src/asmjit/core/compiler.cpp
@@ -1,25 +1,7 @@
-// AsmJit - Machine code generation for C++
+// This file is part of AsmJit project <https://asmjit.com>
//
-// * Official AsmJit Home Page: https://asmjit.com
-// * Official Github Repository: https://github.com/asmjit/asmjit
-//
-// Copyright (c) 2008-2020 The AsmJit Authors
-//
-// This software is provided 'as-is', without any express or implied
-// warranty. In no event will the authors be held liable for any damages
-// arising from the use of this software.
-//
-// Permission is granted to anyone to use this software for any purpose,
-// including commercial applications, and to alter it and redistribute it
-// freely, subject to the following restrictions:
-//
-// 1. The origin of this software must not be misrepresented; you must not
-// claim that you wrote the original software. If you use this software
-// in a product, an acknowledgment in the product documentation would be
-// appreciated but is not required.
-// 2. Altered source versions must be plainly marked as such, and must not be
-// misrepresented as being the original software.
-// 3. This notice may not be removed or altered from any source distribution.
+// See asmjit.h or LICENSE.md for license and copyright information
+// SPDX-License-Identifier: Zlib
#include "../core/api-build_p.h"
#ifndef ASMJIT_NO_COMPILER
@@ -35,12 +17,13 @@
ASMJIT_BEGIN_NAMESPACE
-// ============================================================================
-// [asmjit::GlobalConstPoolPass]
-// ============================================================================
+// GlobalConstPoolPass
+// ===================
class GlobalConstPoolPass : public Pass {
+public:
typedef Pass Base;
+public:
ASMJIT_NONCOPYABLE(GlobalConstPoolPass)
GlobalConstPoolPass() noexcept : Pass("GlobalConstPoolPass") {}
@@ -50,73 +33,50 @@ class GlobalConstPoolPass : public Pass {
// Flush the global constant pool.
BaseCompiler* compiler = static_cast<BaseCompiler*>(_cb);
- if (compiler->_globalConstPool) {
- compiler->addAfter(compiler->_globalConstPool, compiler->lastNode());
- compiler->_globalConstPool = nullptr;
+ ConstPoolNode* globalConstPool = compiler->_constPools[uint32_t(ConstPoolScope::kGlobal)];
+
+ if (globalConstPool) {
+ compiler->addAfter(globalConstPool, compiler->lastNode());
+ compiler->_constPools[uint32_t(ConstPoolScope::kGlobal)] = nullptr;
}
return kErrorOk;
}
};
-// ============================================================================
-// [asmjit::InvokeNode - Arg / Ret]
-// ============================================================================
-
-bool InvokeNode::_setArg(uint32_t i, const Operand_& op) noexcept {
- if ((i & ~kFuncArgHi) >= _funcDetail.argCount())
- return false;
-
- _args[i] = op;
- return true;
-}
-
-bool InvokeNode::_setRet(uint32_t i, const Operand_& op) noexcept {
- if (i >= 2)
- return false;
-
- _rets[i] = op;
- return true;
-}
-
-// ============================================================================
-// [asmjit::BaseCompiler - Construction / Destruction]
-// ============================================================================
+// BaseCompiler - Construction & Destruction
+// =========================================
BaseCompiler::BaseCompiler() noexcept
: BaseBuilder(),
_func(nullptr),
_vRegZone(4096 - Zone::kBlockOverhead),
_vRegArray(),
- _localConstPool(nullptr),
- _globalConstPool(nullptr) {
-
- _emitterType = uint8_t(kTypeCompiler);
- _validationFlags = uint8_t(InstAPI::kValidationFlagVirtRegs);
+ _constPools { nullptr, nullptr } {
+ _emitterType = EmitterType::kCompiler;
+ _validationFlags = ValidationFlags::kEnableVirtRegs;
}
BaseCompiler::~BaseCompiler() noexcept {}
-// ============================================================================
-// [asmjit::BaseCompiler - Function Management]
-// ============================================================================
+// BaseCompiler - Function Management
+// ==================================
-Error BaseCompiler::_newFuncNode(FuncNode** out, const FuncSignature& signature) {
+Error BaseCompiler::newFuncNode(FuncNode** out, const FuncSignature& signature) {
*out = nullptr;
// Create FuncNode together with all the required surrounding nodes.
FuncNode* funcNode;
ASMJIT_PROPAGATE(_newNodeT<FuncNode>(&funcNode));
- ASMJIT_PROPAGATE(_newLabelNode(&funcNode->_exitNode));
- ASMJIT_PROPAGATE(_newNodeT<SentinelNode>(&funcNode->_end, SentinelNode::kSentinelFuncEnd));
+ ASMJIT_PROPAGATE(newLabelNode(&funcNode->_exitNode));
+ ASMJIT_PROPAGATE(_newNodeT<SentinelNode>(&funcNode->_end, SentinelType::kFuncEnd));
// Initialize the function's detail info.
Error err = funcNode->detail().init(signature, environment());
if (ASMJIT_UNLIKELY(err))
return reportError(err);
- // If the Target guarantees greater stack alignment than required by the
- // calling convention then override it as we can prevent having to perform
- // dynamic stack alignment
+ // If the Target guarantees greater stack alignment than required by the calling convention
+ // then override it as we can prevent having to perform dynamic stack alignment
uint32_t environmentStackAlignment = _environment.stackAlignment();
if (funcNode->_funcDetail._callConv.naturalStackAlignment() < environmentStackAlignment)
@@ -130,10 +90,10 @@ Error BaseCompiler::_newFuncNode(FuncNode** out, const FuncSignature& signature)
// Allocate space for function arguments.
funcNode->_args = nullptr;
if (funcNode->argCount() != 0) {
- funcNode->_args = _allocator.allocT<VirtReg*>(funcNode->argCount() * sizeof(VirtReg*));
+ funcNode->_args = _allocator.allocT<FuncNode::ArgPack>(funcNode->argCount() * sizeof(FuncNode::ArgPack));
if (ASMJIT_UNLIKELY(!funcNode->_args))
return reportError(DebugUtils::errored(kErrorOutOfMemory));
- memset(funcNode->_args, 0, funcNode->argCount() * sizeof(VirtReg*));
+ memset(funcNode->_args, 0, funcNode->argCount() * sizeof(FuncNode::ArgPack));
}
ASMJIT_PROPAGATE(registerLabelNode(funcNode));
@@ -142,17 +102,21 @@ Error BaseCompiler::_newFuncNode(FuncNode** out, const FuncSignature& signature)
return kErrorOk;
}
-Error BaseCompiler::_addFuncNode(FuncNode** out, const FuncSignature& signature) {
- ASMJIT_PROPAGATE(_newFuncNode(out, signature));
+Error BaseCompiler::addFuncNode(FuncNode** out, const FuncSignature& signature) {
+ ASMJIT_PROPAGATE(newFuncNode(out, signature));
+ ASMJIT_ASSUME(*out != nullptr);
+
addFunc(*out);
return kErrorOk;
}
-Error BaseCompiler::_newRetNode(FuncRetNode** out, const Operand_& o0, const Operand_& o1) {
+Error BaseCompiler::newFuncRetNode(FuncRetNode** out, const Operand_& o0, const Operand_& o1) {
uint32_t opCount = !o1.isNone() ? 2u : !o0.isNone() ? 1u : 0u;
FuncRetNode* node;
ASMJIT_PROPAGATE(_newNodeT<FuncRetNode>(&node));
+ ASMJIT_ASSUME(node != nullptr);
+
node->setOpCount(opCount);
node->setOp(0, o0);
node->setOp(1, o1);
@@ -162,14 +126,13 @@ Error BaseCompiler::_newRetNode(FuncRetNode** out, const Operand_& o0, const Ope
return kErrorOk;
}
-Error BaseCompiler::_addRetNode(FuncRetNode** out, const Operand_& o0, const Operand_& o1) {
- ASMJIT_PROPAGATE(_newRetNode(out, o0, o1));
+Error BaseCompiler::addFuncRetNode(FuncRetNode** out, const Operand_& o0, const Operand_& o1) {
+ ASMJIT_PROPAGATE(newFuncRetNode(out, o0, o1));
addNode(*out);
return kErrorOk;
}
FuncNode* BaseCompiler::addFunc(FuncNode* func) {
- ASMJIT_ASSERT(_func == nullptr);
_func = func;
addNode(func); // Function node.
@@ -188,10 +151,11 @@ Error BaseCompiler::endFunc() {
return reportError(DebugUtils::errored(kErrorInvalidState));
// Add the local constant pool at the end of the function (if exists).
- if (_localConstPool) {
+ ConstPoolNode* localConstPool = _constPools[uint32_t(ConstPoolScope::kLocal)];
+ if (localConstPool) {
setCursor(func->endNode()->prev());
- addNode(_localConstPool);
- _localConstPool = nullptr;
+ addNode(localConstPool);
+ _constPools[uint32_t(ConstPoolScope::kLocal)] = nullptr;
}
// Mark as finished.
@@ -203,28 +167,12 @@ Error BaseCompiler::endFunc() {
return kErrorOk;
}
-Error BaseCompiler::setArg(uint32_t argIndex, const BaseReg& r) {
- FuncNode* func = _func;
+// BaseCompiler - Function Invocation
+// ==================================
- if (ASMJIT_UNLIKELY(!func))
- return reportError(DebugUtils::errored(kErrorInvalidState));
-
- if (ASMJIT_UNLIKELY(!isVirtRegValid(r)))
- return reportError(DebugUtils::errored(kErrorInvalidVirtId));
-
- VirtReg* vReg = virtRegByReg(r);
- func->setArg(argIndex, vReg);
-
- return kErrorOk;
-}
-
-// ============================================================================
-// [asmjit::BaseCompiler - Function Invocation]
-// ============================================================================
-
-Error BaseCompiler::_newInvokeNode(InvokeNode** out, uint32_t instId, const Operand_& o0, const FuncSignature& signature) {
+Error BaseCompiler::newInvokeNode(InvokeNode** out, InstId instId, const Operand_& o0, const FuncSignature& signature) {
InvokeNode* node;
- ASMJIT_PROPAGATE(_newNodeT<InvokeNode>(&node, instId, 0u));
+ ASMJIT_PROPAGATE(_newNodeT<InvokeNode>(&node, instId, InstOptions::kNone));
node->setOpCount(1);
node->setOp(0, o0);
@@ -237,25 +185,24 @@ Error BaseCompiler::_newInvokeNode(InvokeNode** out, uint32_t instId, const Oper
// Skip the allocation if there are no arguments.
uint32_t argCount = signature.argCount();
if (argCount) {
- node->_args = static_cast<Operand*>(_allocator.alloc(argCount * sizeof(Operand)));
+ node->_args = static_cast<InvokeNode::OperandPack*>(_allocator.alloc(argCount * sizeof(InvokeNode::OperandPack)));
if (!node->_args)
- reportError(DebugUtils::errored(kErrorOutOfMemory));
- memset(node->_args, 0, argCount * sizeof(Operand));
+ return reportError(DebugUtils::errored(kErrorOutOfMemory));
+ memset(node->_args, 0, argCount * sizeof(InvokeNode::OperandPack));
}
*out = node;
return kErrorOk;
}
-Error BaseCompiler::_addInvokeNode(InvokeNode** out, uint32_t instId, const Operand_& o0, const FuncSignature& signature) {
- ASMJIT_PROPAGATE(_newInvokeNode(out, instId, o0, signature));
+Error BaseCompiler::addInvokeNode(InvokeNode** out, InstId instId, const Operand_& o0, const FuncSignature& signature) {
+ ASMJIT_PROPAGATE(newInvokeNode(out, instId, o0, signature));
addNode(*out);
return kErrorOk;
}
-// ============================================================================
-// [asmjit::BaseCompiler - Virtual Registers]
-// ============================================================================
+// BaseCompiler - Virtual Registers
+// ================================
static void BaseCompiler_assignGenericName(BaseCompiler* self, VirtReg* vReg) {
uint32_t index = unsigned(Operand::virtIdToIndex(vReg->_id));
@@ -267,7 +214,7 @@ static void BaseCompiler_assignGenericName(BaseCompiler* self, VirtReg* vReg) {
vReg->_name.setData(&self->_dataZone, buf, unsigned(size));
}
-Error BaseCompiler::newVirtReg(VirtReg** out, uint32_t typeId, uint32_t signature, const char* name) {
+Error BaseCompiler::newVirtReg(VirtReg** out, TypeId typeId, OperandSignature signature, const char* name) {
*out = nullptr;
uint32_t index = _vRegArray.size();
@@ -281,10 +228,10 @@ Error BaseCompiler::newVirtReg(VirtReg** out, uint32_t typeId, uint32_t signatur
if (ASMJIT_UNLIKELY(!vReg))
return reportError(DebugUtils::errored(kErrorOutOfMemory));
- uint32_t size = Type::sizeOf(typeId);
+ uint32_t size = TypeUtils::sizeOf(typeId);
uint32_t alignment = Support::min<uint32_t>(size, 64);
- vReg = new(vReg) VirtReg(Operand::indexToVirtId(index), signature, size, alignment, typeId);
+ vReg = new(vReg) VirtReg(signature, Operand::indexToVirtId(index), size, alignment, typeId);
#ifndef ASMJIT_NO_LOGGING
if (name && name[0] != '\0')
@@ -301,23 +248,23 @@ Error BaseCompiler::newVirtReg(VirtReg** out, uint32_t typeId, uint32_t signatur
return kErrorOk;
}
-Error BaseCompiler::_newReg(BaseReg* out, uint32_t typeId, const char* name) {
+Error BaseCompiler::_newReg(BaseReg* out, TypeId typeId, const char* name) {
+ OperandSignature regSignature;
out->reset();
- RegInfo regInfo;
- Error err = ArchUtils::typeIdToRegInfo(arch(), typeId, &typeId, &regInfo);
-
+ Error err = ArchUtils::typeIdToRegSignature(arch(), typeId, &typeId, &regSignature);
if (ASMJIT_UNLIKELY(err))
return reportError(err);
VirtReg* vReg;
- ASMJIT_PROPAGATE(newVirtReg(&vReg, typeId, regInfo.signature(), name));
+ ASMJIT_PROPAGATE(newVirtReg(&vReg, typeId, regSignature, name));
+ ASMJIT_ASSUME(vReg != nullptr);
- out->_initReg(regInfo.signature(), vReg->id());
+ out->_initReg(regSignature, vReg->id());
return kErrorOk;
}
-Error BaseCompiler::_newRegFmt(BaseReg* out, uint32_t typeId, const char* fmt, ...) {
+Error BaseCompiler::_newRegFmt(BaseReg* out, TypeId typeId, const char* fmt, ...) {
va_list ap;
StringTmp<256> sb;
@@ -331,75 +278,73 @@ Error BaseCompiler::_newRegFmt(BaseReg* out, uint32_t typeId, const char* fmt, .
Error BaseCompiler::_newReg(BaseReg* out, const BaseReg& ref, const char* name) {
out->reset();
- RegInfo regInfo;
- uint32_t typeId;
+ OperandSignature regSignature;
+ TypeId typeId;
if (isVirtRegValid(ref)) {
VirtReg* vRef = virtRegByReg(ref);
typeId = vRef->typeId();
- // NOTE: It's possible to cast one register type to another if it's the
- // same register group. However, VirtReg always contains the TypeId that
- // was used to create the register. This means that in some cases we may
- // end up having different size of `ref` and `vRef`. In such case we
- // adjust the TypeId to match the `ref` register type instead of the
- // original register type, which should be the expected behavior.
- uint32_t typeSize = Type::sizeOf(typeId);
+ // NOTE: It's possible to cast one register type to another if it's the same register group. However, VirtReg
+ // always contains the TypeId that was used to create the register. This means that in some cases we may end
+ // up having different size of `ref` and `vRef`. In such case we adjust the TypeId to match the `ref` register
+ // type instead of the original register type, which should be the expected behavior.
+ uint32_t typeSize = TypeUtils::sizeOf(typeId);
uint32_t refSize = ref.size();
if (typeSize != refSize) {
- if (Type::isInt(typeId)) {
+ if (TypeUtils::isInt(typeId)) {
// GP register - change TypeId to match `ref`, but keep sign of `vRef`.
switch (refSize) {
- case 1: typeId = Type::kIdI8 | (typeId & 1); break;
- case 2: typeId = Type::kIdI16 | (typeId & 1); break;
- case 4: typeId = Type::kIdI32 | (typeId & 1); break;
- case 8: typeId = Type::kIdI64 | (typeId & 1); break;
- default: typeId = Type::kIdVoid; break;
+ case 1: typeId = TypeId(uint32_t(TypeId::kInt8 ) | (uint32_t(typeId) & 1)); break;
+ case 2: typeId = TypeId(uint32_t(TypeId::kInt16) | (uint32_t(typeId) & 1)); break;
+ case 4: typeId = TypeId(uint32_t(TypeId::kInt32) | (uint32_t(typeId) & 1)); break;
+ case 8: typeId = TypeId(uint32_t(TypeId::kInt64) | (uint32_t(typeId) & 1)); break;
+ default: typeId = TypeId::kVoid; break;
}
}
- else if (Type::isMmx(typeId)) {
+ else if (TypeUtils::isMmx(typeId)) {
// MMX register - always use 64-bit.
- typeId = Type::kIdMmx64;
+ typeId = TypeId::kMmx64;
}
- else if (Type::isMask(typeId)) {
+ else if (TypeUtils::isMask(typeId)) {
// Mask register - change TypeId to match `ref` size.
switch (refSize) {
- case 1: typeId = Type::kIdMask8; break;
- case 2: typeId = Type::kIdMask16; break;
- case 4: typeId = Type::kIdMask32; break;
- case 8: typeId = Type::kIdMask64; break;
- default: typeId = Type::kIdVoid; break;
+ case 1: typeId = TypeId::kMask8; break;
+ case 2: typeId = TypeId::kMask16; break;
+ case 4: typeId = TypeId::kMask32; break;
+ case 8: typeId = TypeId::kMask64; break;
+ default: typeId = TypeId::kVoid; break;
}
}
else {
- // VEC register - change TypeId to match `ref` size, keep vector metadata.
- uint32_t elementTypeId = Type::baseOf(typeId);
-
+ // Vector register - change TypeId to match `ref` size, keep vector metadata.
+ TypeId scalarTypeId = TypeUtils::scalarOf(typeId);
switch (refSize) {
- case 16: typeId = Type::_kIdVec128Start + (elementTypeId - Type::kIdI8); break;
- case 32: typeId = Type::_kIdVec256Start + (elementTypeId - Type::kIdI8); break;
- case 64: typeId = Type::_kIdVec512Start + (elementTypeId - Type::kIdI8); break;
- default: typeId = Type::kIdVoid; break;
+ case 16: typeId = TypeUtils::scalarToVector(scalarTypeId, TypeId::_kVec128Start); break;
+ case 32: typeId = TypeUtils::scalarToVector(scalarTypeId, TypeId::_kVec256Start); break;
+ case 64: typeId = TypeUtils::scalarToVector(scalarTypeId, TypeId::_kVec512Start); break;
+ default: typeId = TypeId::kVoid; break;
}
}
- if (typeId == Type::kIdVoid)
+ if (typeId == TypeId::kVoid)
return reportError(DebugUtils::errored(kErrorInvalidState));
}
}
else {
- typeId = ref.type();
+ typeId = ArchTraits::byArch(arch()).regTypeToTypeId(ref.type());
}
- Error err = ArchUtils::typeIdToRegInfo(arch(), typeId, &typeId, &regInfo);
+ Error err = ArchUtils::typeIdToRegSignature(arch(), typeId, &typeId, &regSignature);
if (ASMJIT_UNLIKELY(err))
return reportError(err);
VirtReg* vReg;
- ASMJIT_PROPAGATE(newVirtReg(&vReg, typeId, regInfo.signature(), name));
+ ASMJIT_PROPAGATE(newVirtReg(&vReg, typeId, regSignature, name));
+ ASMJIT_ASSUME(vReg != nullptr);
- out->_initReg(regInfo.signature(), vReg->id());
+ out->_initReg(regSignature, vReg->id());
return kErrorOk;
}
@@ -430,14 +375,18 @@ Error BaseCompiler::_newStack(BaseMem* out, uint32_t size, uint32_t alignment, c
alignment = 64;
VirtReg* vReg;
- ASMJIT_PROPAGATE(newVirtReg(&vReg, 0, 0, name));
+ ASMJIT_PROPAGATE(newVirtReg(&vReg, TypeId::kVoid, OperandSignature{0}, name));
+ ASMJIT_ASSUME(vReg != nullptr);
vReg->_virtSize = size;
vReg->_isStack = true;
vReg->_alignment = uint8_t(alignment);
// Set the memory operand to GPD/GPQ and its id to VirtReg.
- *out = BaseMem(BaseMem::Decomposed { _gpRegInfo.type(), vReg->id(), BaseReg::kTypeNone, 0, 0, 0, BaseMem::kSignatureMemRegHomeFlag });
+ *out = BaseMem(OperandSignature::fromOpType(OperandType::kMem) |
+ OperandSignature::fromMemBaseType(_gpSignature.regType()) |
+ OperandSignature::fromBits(OperandSignature::kMemRegHomeFlag),
+ vReg->id(), 0, 0);
return kErrorOk;
}
@@ -458,9 +407,8 @@ Error BaseCompiler::setStackSize(uint32_t virtId, uint32_t newSize, uint32_t new
if (newAlignment)
vReg->_alignment = uint8_t(newAlignment);
- // This is required if the RAPass is already running. There is a chance that
- // a stack-slot has been already allocated and in that case it has to be
- // updated as well, otherwise we would allocate wrong amount of memory.
+ // This is required if the RAPass is already running. There is a chance that a stack-slot has been already
+ // allocated and in that case it has to be updated as well, otherwise we would allocate wrong amount of memory.
RAWorkReg* workReg = vReg->_workReg;
if (workReg && workReg->_stackSlot) {
workReg->_stackSlot->_size = vReg->_virtSize;
@@ -470,37 +418,26 @@ Error BaseCompiler::setStackSize(uint32_t virtId, uint32_t newSize, uint32_t new
return kErrorOk;
}
-Error BaseCompiler::_newConst(BaseMem* out, uint32_t scope, const void* data, size_t size) {
+Error BaseCompiler::_newConst(BaseMem* out, ConstPoolScope scope, const void* data, size_t size) {
out->reset();
- ConstPoolNode** pPool;
- if (scope == ConstPool::kScopeLocal)
- pPool = &_localConstPool;
- else if (scope == ConstPool::kScopeGlobal)
- pPool = &_globalConstPool;
- else
+ if (uint32_t(scope) > 1)
return reportError(DebugUtils::errored(kErrorInvalidArgument));
- if (!*pPool)
- ASMJIT_PROPAGATE(_newConstPoolNode(pPool));
+ if (!_constPools[uint32_t(scope)])
+ ASMJIT_PROPAGATE(newConstPoolNode(&_constPools[uint32_t(scope)]));
- ConstPoolNode* pool = *pPool;
+ ConstPoolNode* pool = _constPools[uint32_t(scope)];
size_t off;
Error err = pool->add(data, size, off);
if (ASMJIT_UNLIKELY(err))
return reportError(err);
- *out = BaseMem(BaseMem::Decomposed {
- Label::kLabelTag, // Base type.
- pool->labelId(), // Base id.
- 0, // Index type.
- 0, // Index id.
- int32_t(off), // Offset.
- uint32_t(size), // Size.
- 0 // Flags.
- });
-
+ *out = BaseMem(OperandSignature::fromOpType(OperandType::kMem) |
+ OperandSignature::fromMemBaseType(RegType::kLabelTag) |
+ OperandSignature::fromSize(uint32_t(size)),
+ pool->labelId(), 0, int32_t(off));
return kErrorOk;
}
@@ -525,11 +462,10 @@ void BaseCompiler::rename(const BaseReg& reg, const char* fmt, ...) {
}
}
-// ============================================================================
-// [asmjit::BaseCompiler - Jump Annotations]
-// ============================================================================
+// BaseCompiler - Jump Annotations
+// ===============================
-Error BaseCompiler::newJumpNode(JumpNode** out, uint32_t instId, uint32_t instOptions, const Operand_& o0, JumpAnnotation* annotation) {
+Error BaseCompiler::newJumpNode(JumpNode** out, InstId instId, InstOptions instOptions, const Operand_& o0, JumpAnnotation* annotation) {
JumpNode* node = _allocator.allocT<JumpNode>();
uint32_t opCount = 1;
@@ -544,8 +480,8 @@ Error BaseCompiler::newJumpNode(JumpNode** out, uint32_t instId, uint32_t instOp
return kErrorOk;
}
-Error BaseCompiler::emitAnnotatedJump(uint32_t instId, const Operand_& o0, JumpAnnotation* annotation) {
- uint32_t options = instOptions() | forcedInstOptions();
+Error BaseCompiler::emitAnnotatedJump(InstId instId, const Operand_& o0, JumpAnnotation* annotation) {
+ InstOptions options = instOptions() | forcedInstOptions();
RegOnly extra = extraReg();
const char* comment = inlineComment();
@@ -553,7 +489,7 @@ Error BaseCompiler::emitAnnotatedJump(uint32_t instId, const Operand_& o0, JumpA
resetInlineComment();
resetExtraReg();
- JumpNode* node = nullptr;
+ JumpNode* node;
ASMJIT_PROPAGATE(newJumpNode(&node, instId, options, o0, annotation));
node->setExtraReg(extra);
@@ -582,13 +518,16 @@ JumpAnnotation* BaseCompiler::newJumpAnnotation() {
return jumpAnnotation;
}
-// ============================================================================
-// [asmjit::BaseCompiler - Events]
-// ============================================================================
+// BaseCompiler - Events
+// =====================
Error BaseCompiler::onAttach(CodeHolder* code) noexcept {
ASMJIT_PROPAGATE(Base::onAttach(code));
+ const ArchTraits& archTraits = ArchTraits::byArch(code->arch());
+ RegType nativeRegType = Environment::is32Bit(code->arch()) ? RegType::kGp32 : RegType::kGp64;
+ _gpSignature = archTraits.regTypeToSignature(nativeRegType);
+
Error err = addPassT<GlobalConstPoolPass>();
if (ASMJIT_UNLIKELY(err)) {
onDetach(code);
@@ -600,8 +539,8 @@ Error BaseCompiler::onAttach(CodeHolder* code) noexcept {
Error BaseCompiler::onDetach(CodeHolder* code) noexcept {
_func = nullptr;
- _localConstPool = nullptr;
- _globalConstPool = nullptr;
+ _constPools[uint32_t(ConstPoolScope::kLocal)] = nullptr;
+ _constPools[uint32_t(ConstPoolScope::kGlobal)] = nullptr;
_vRegArray.reset();
_vRegZone.reset();
@@ -609,32 +548,30 @@ Error BaseCompiler::onDetach(CodeHolder* code) noexcept {
return Base::onDetach(code);
}
-// ============================================================================
-// [asmjit::FuncPass - Construction / Destruction]
-// ============================================================================
+// FuncPass - Construction & Destruction
+// =====================================
FuncPass::FuncPass(const char* name) noexcept
: Pass(name) {}
-// ============================================================================
-// [asmjit::FuncPass - Run]
-// ============================================================================
+// FuncPass - Run
+// ==============
Error FuncPass::run(Zone* zone, Logger* logger) {
BaseNode* node = cb()->firstNode();
if (!node) return kErrorOk;
do {
- if (node->type() == BaseNode::kNodeFunc) {
+ if (node->type() == NodeType::kFunc) {
FuncNode* func = node->as<FuncNode>();
node = func->endNode();
ASMJIT_PROPAGATE(runOnFunction(zone, logger, func));
}
- // Find a function by skipping all nodes that are not `kNodeFunc`.
+ // Find a function by skipping all nodes that are not `NodeType::kFunc`.
do {
node = node->next();
- } while (node && node->type() != BaseNode::kNodeFunc);
+ } while (node && node->type() != NodeType::kFunc);
} while (node);
return kErrorOk;
diff --git a/3rdparty/asmjit/src/asmjit/core/compiler.h b/3rdparty/asmjit/src/asmjit/core/compiler.h
index 71f89ec701e..709fd952acc 100644
--- a/3rdparty/asmjit/src/asmjit/core/compiler.h
+++ b/3rdparty/asmjit/src/asmjit/core/compiler.h
@@ -1,25 +1,7 @@
-// AsmJit - Machine code generation for C++
+// This file is part of AsmJit project <https://asmjit.com>
//
-// * Official AsmJit Home Page: https://asmjit.com
-// * Official Github Repository: https://github.com/asmjit/asmjit
-//
-// Copyright (c) 2008-2020 The AsmJit Authors
-//
-// This software is provided 'as-is', without any express or implied
-// warranty. In no event will the authors be held liable for any damages
-// arising from the use of this software.
-//
-// Permission is granted to anyone to use this software for any purpose,
-// including commercial applications, and to alter it and redistribute it
-// freely, subject to the following restrictions:
-//
-// 1. The origin of this software must not be misrepresented; you must not
-// claim that you wrote the original software. If you use this software
-// in a product, an acknowledgment in the product documentation would be
-// appreciated but is not required.
-// 2. Altered source versions must be plainly marked as such, and must not be
-// misrepresented as being the original software.
-// 3. This notice may not be removed or altered from any source distribution.
+// See asmjit.h or LICENSE.md for license and copyright information
+// SPDX-License-Identifier: Zlib
#ifndef ASMJIT_CORE_COMPILER_H_INCLUDED
#define ASMJIT_CORE_COMPILER_H_INCLUDED
@@ -30,6 +12,7 @@
#include "../core/assembler.h"
#include "../core/builder.h"
#include "../core/constpool.h"
+#include "../core/compilerdefs.h"
#include "../core/func.h"
#include "../core/inst.h"
#include "../core/operand.h"
@@ -39,15 +22,7 @@
ASMJIT_BEGIN_NAMESPACE
-// ============================================================================
-// [Forward Declarations]
-// ============================================================================
-
-struct RATiedReg;
-class RAWorkReg;
-
class JumpAnnotation;
-
class JumpNode;
class FuncNode;
class FuncRetNode;
@@ -56,150 +31,18 @@ class InvokeNode;
//! \addtogroup asmjit_compiler
//! \{
-// ============================================================================
-// [asmjit::VirtReg]
-// ============================================================================
-
-//! Virtual register data, managed by \ref BaseCompiler.
-class VirtReg {
-public:
- ASMJIT_NONCOPYABLE(VirtReg)
-
- //! Virtual register id.
- uint32_t _id;
- //! Virtual register info (signature).
- RegInfo _info;
- //! Virtual register size (can be smaller than `regInfo._size`).
- uint32_t _virtSize;
- //! Virtual register alignment (for spilling).
- uint8_t _alignment;
- //! Type-id.
- uint8_t _typeId;
- //! Virtual register weight for alloc/spill decisions.
- uint8_t _weight;
- //! True if this is a fixed register, never reallocated.
- uint8_t _isFixed : 1;
- //! True if the virtual register is only used as a stack (never accessed as register).
- uint8_t _isStack : 1;
- uint8_t _reserved : 6;
-
- //! Virtual register name (user provided or automatically generated).
- ZoneString<16> _name;
-
- // -------------------------------------------------------------------------
- // The following members are used exclusively by RAPass. They are initialized
- // when the VirtReg is created to NULL pointers and then changed during RAPass
- // execution. RAPass sets them back to NULL before it returns.
- // -------------------------------------------------------------------------
-
- //! Reference to `RAWorkReg`, used during register allocation.
- RAWorkReg* _workReg;
-
- //! \name Construction & Destruction
- //! \{
-
- inline VirtReg(uint32_t id, uint32_t signature, uint32_t virtSize, uint32_t alignment, uint32_t typeId) noexcept
- : _id(id),
- _virtSize(virtSize),
- _alignment(uint8_t(alignment)),
- _typeId(uint8_t(typeId)),
- _weight(1),
- _isFixed(false),
- _isStack(false),
- _reserved(0),
- _name(),
- _workReg(nullptr) { _info._signature = signature; }
-
- //! \}
-
- //! \name Accessors
- //! \{
-
- //! Returns the virtual register id.
- inline uint32_t id() const noexcept { return _id; }
-
- //! Returns the virtual register name.
- inline const char* name() const noexcept { return _name.data(); }
- //! Returns the size of the virtual register name.
- inline uint32_t nameSize() const noexcept { return _name.size(); }
-
- //! Returns a register information that wraps the register signature.
- inline const RegInfo& info() const noexcept { return _info; }
- //! Returns a virtual register type (maps to the physical register type as well).
- inline uint32_t type() const noexcept { return _info.type(); }
- //! Returns a virtual register group (maps to the physical register group as well).
- inline uint32_t group() const noexcept { return _info.group(); }
-
- //! Returns a real size of the register this virtual register maps to.
- //!
- //! For example if this is a 128-bit SIMD register used for a scalar single
- //! precision floating point value then its virtSize would be 4, however, the
- //! `regSize` would still say 16 (128-bits), because it's the smallest size
- //! of that register type.
- inline uint32_t regSize() const noexcept { return _info.size(); }
-
- //! Returns a register signature of this virtual register.
- inline uint32_t signature() const noexcept { return _info.signature(); }
-
- //! Returns the virtual register size.
- //!
- //! The virtual register size describes how many bytes the virtual register
- //! needs to store its content. It can be smaller than the physical register
- //! size, see `regSize()`.
- inline uint32_t virtSize() const noexcept { return _virtSize; }
-
- //! Returns the virtual register alignment.
- inline uint32_t alignment() const noexcept { return _alignment; }
-
- //! Returns the virtual register type id, see `Type::Id`.
- inline uint32_t typeId() const noexcept { return _typeId; }
-
- //! Returns the virtual register weight - the register allocator can use it
- //! as explicit hint for alloc/spill decisions.
- inline uint32_t weight() const noexcept { return _weight; }
- //! Sets the virtual register weight (0 to 255) - the register allocator can
- //! use it as explicit hint for alloc/spill decisions and initial bin-packing.
- inline void setWeight(uint32_t weight) noexcept { _weight = uint8_t(weight); }
-
- //! Returns whether the virtual register is always allocated to a fixed
- //! physical register (and never reallocated).
- //!
- //! \note This is only used for special purposes and it's mostly internal.
- inline bool isFixed() const noexcept { return bool(_isFixed); }
-
- //! Returns whether the virtual register is indeed a stack that only uses
- //! the virtual register id for making it accessible.
- //!
- //! \note It's an error if a stack is accessed as a register.
- inline bool isStack() const noexcept { return bool(_isStack); }
-
- inline bool hasWorkReg() const noexcept { return _workReg != nullptr; }
- inline RAWorkReg* workReg() const noexcept { return _workReg; }
- inline void setWorkReg(RAWorkReg* workReg) noexcept { _workReg = workReg; }
- inline void resetWorkReg() noexcept { _workReg = nullptr; }
-
- //! \}
-};
-
-// ============================================================================
-// [asmjit::BaseCompiler]
-// ============================================================================
-
//! Code emitter that uses virtual registers and performs register allocation.
//!
-//! Compiler is a high-level code-generation tool that provides register
-//! allocation and automatic handling of function calling conventions. It was
-//! primarily designed for merging multiple parts of code into a function
-//! without worrying about registers and function calling conventions.
+//! Compiler is a high-level code-generation tool that provides register allocation and automatic handling of function
+//! calling conventions. It was primarily designed for merging multiple parts of code into a function without worrying
+//! about registers and function calling conventions.
//!
-//! BaseCompiler can be used, with a minimum effort, to handle 32-bit and
-//! 64-bit code generation within a single code base.
+//! BaseCompiler can be used, with a minimum effort, to handle 32-bit and 64-bit code generation within a single code
+//! base.
//!
-//! BaseCompiler is based on BaseBuilder and contains all the features it
-//! provides. It means that the code it stores can be modified (removed, added,
-//! injected) and analyzed. When the code is finalized the compiler can emit
-//! the code into an Assembler to translate the abstract representation into a
-//! machine code.
+//! BaseCompiler is based on BaseBuilder and contains all the features it provides. It means that the code it stores
+//! can be modified (removed, added, injected) and analyzed. When the code is finalized the compiler can emit the code
+//! into an Assembler to translate the abstract representation into a machine code.
//!
//! Check out architecture specific compilers for more details and examples:
//!
@@ -209,6 +52,9 @@ public:
ASMJIT_NONCOPYABLE(BaseCompiler)
typedef BaseBuilder Base;
+ //! \name Members
+ //! \{
+
//! Current function.
FuncNode* _func;
//! Allocates `VirtReg` objects.
@@ -218,10 +64,12 @@ public:
//! Stores jump annotations.
ZoneVector<JumpAnnotation*> _jumpAnnotations;
- //! Local constant pool, flushed at the end of each function.
- ConstPoolNode* _localConstPool;
- //! Global constant pool, flushed by `finalize()`.
- ConstPoolNode* _globalConstPool;
+ //! Local and global constant pools.
+ //!
+ //! Local constant pool is flushed with each function, global constant pool is flushed only by \ref finalize().
+ ConstPoolNode* _constPools[2];
+
+ //! \}
//! \name Construction & Destruction
//! \{
@@ -236,52 +84,54 @@ public:
//! \name Function Management
//! \{
- //! Returns the current function.
- inline FuncNode* func() const noexcept { return _func; }
-
//! Creates a new \ref FuncNode.
- ASMJIT_API Error _newFuncNode(FuncNode** out, const FuncSignature& signature);
- //! Creates a new \ref FuncNode adds it to the compiler.
- ASMJIT_API Error _addFuncNode(FuncNode** out, const FuncSignature& signature);
+ ASMJIT_API Error newFuncNode(FuncNode** ASMJIT_NONNULL(out), const FuncSignature& signature);
+ //! Creates a new \ref FuncNode adds it to the instruction stream.
+ ASMJIT_API Error addFuncNode(FuncNode** ASMJIT_NONNULL(out), const FuncSignature& signature);
//! Creates a new \ref FuncRetNode.
- ASMJIT_API Error _newRetNode(FuncRetNode** out, const Operand_& o0, const Operand_& o1);
- //! Creates a new \ref FuncRetNode and adds it to the compiler.
- ASMJIT_API Error _addRetNode(FuncRetNode** out, const Operand_& o0, const Operand_& o1);
+ ASMJIT_API Error newFuncRetNode(FuncRetNode** ASMJIT_NONNULL(out), const Operand_& o0, const Operand_& o1);
+ //! Creates a new \ref FuncRetNode and adds it to the instruction stream.
+ ASMJIT_API Error addFuncRetNode(FuncRetNode** ASMJIT_NONNULL(out), const Operand_& o0, const Operand_& o1);
+
+ //! Returns the current function.
+ inline FuncNode* func() const noexcept { return _func; }
//! Creates a new \ref FuncNode with the given `signature` and returns it.
inline FuncNode* newFunc(const FuncSignature& signature) {
FuncNode* node;
- _newFuncNode(&node, signature);
+ newFuncNode(&node, signature);
return node;
}
- //! Creates a new \ref FuncNode with the given `signature`, adds it to the
- //! compiler by using the \ref addFunc(FuncNode*) overload, and returns it.
+ //! Creates a new \ref FuncNode with the given `signature`, adds it to the instruction stream by using
+ //! the \ref addFunc(FuncNode*) overload, and returns it.
inline FuncNode* addFunc(const FuncSignature& signature) {
FuncNode* node;
- _addFuncNode(&node, signature);
+ addFuncNode(&node, signature);
return node;
}
//! Adds a function `node` to the instruction stream.
- ASMJIT_API FuncNode* addFunc(FuncNode* func);
+ ASMJIT_API FuncNode* addFunc(FuncNode* ASMJIT_NONNULL(func));
//! Emits a sentinel that marks the end of the current function.
ASMJIT_API Error endFunc();
+#if !defined(ASMJIT_NO_DEPRECATED)
+ inline Error _setArg(size_t argIndex, size_t valueIndex, const BaseReg& reg);
+
//! Sets a function argument at `argIndex` to `reg`.
- ASMJIT_API Error setArg(uint32_t argIndex, const BaseReg& reg);
+ ASMJIT_DEPRECATED("Setting arguments through Compiler is deprecated, use FuncNode->setArg() instead")
+ inline Error setArg(size_t argIndex, const BaseReg& reg) { return _setArg(argIndex, 0, reg); }
- inline FuncRetNode* newRet(const Operand_& o0, const Operand_& o1) {
- FuncRetNode* node;
- _newRetNode(&node, o0, o1);
- return node;
- }
+ //! Sets a function argument at `argIndex` at `valueIndex` to `reg`.
+ ASMJIT_DEPRECATED("Setting arguments through Compiler is deprecated, use FuncNode->setArg() instead")
+ inline Error setArg(size_t argIndex, size_t valueIndex, const BaseReg& reg) { return _setArg(argIndex, valueIndex, reg); }
+#endif
- inline FuncRetNode* addRet(const Operand_& o0, const Operand_& o1) {
+ inline Error addRet(const Operand_& o0, const Operand_& o1) {
FuncRetNode* node;
- _addRetNode(&node, o0, o1);
- return node;
+ return addFuncRetNode(&node, o0, o1);
}
//! \}
@@ -290,23 +140,9 @@ public:
//! \{
//! Creates a new \ref InvokeNode.
- ASMJIT_API Error _newInvokeNode(InvokeNode** out, uint32_t instId, const Operand_& o0, const FuncSignature& signature);
- //! Creates a new \ref InvokeNode and adds it to Compiler.
- ASMJIT_API Error _addInvokeNode(InvokeNode** out, uint32_t instId, const Operand_& o0, const FuncSignature& signature);
-
- //! Creates a new `InvokeNode`.
- inline InvokeNode* newCall(uint32_t instId, const Operand_& o0, const FuncSignature& signature) {
- InvokeNode* node;
- _newInvokeNode(&node, instId, o0, signature);
- return node;
- }
-
- //! Adds a new `InvokeNode`.
- inline InvokeNode* addCall(uint32_t instId, const Operand_& o0, const FuncSignature& signature) {
- InvokeNode* node;
- _addInvokeNode(&node, instId, o0, signature);
- return node;
- }
+ ASMJIT_API Error newInvokeNode(InvokeNode** ASMJIT_NONNULL(out), InstId instId, const Operand_& o0, const FuncSignature& signature);
+ //! Creates a new \ref InvokeNode and adds it to the instruction stream.
+ ASMJIT_API Error addInvokeNode(InvokeNode** ASMJIT_NONNULL(out), InstId instId, const Operand_& o0, const FuncSignature& signature);
//! \}
@@ -315,26 +151,25 @@ public:
//! Creates a new virtual register representing the given `typeId` and `signature`.
//!
- //! \note This function is public, but it's not generally recommended to be used
- //! by AsmJit users, use architecture-specific `newReg()` functionality instead
- //! or functions like \ref _newReg() and \ref _newRegFmt().
- ASMJIT_API Error newVirtReg(VirtReg** out, uint32_t typeId, uint32_t signature, const char* name);
+ //! \note This function is public, but it's not generally recommended to be used by AsmJit users, use architecture
+ //! specific `newReg()` functionality instead or functions like \ref _newReg() and \ref _newRegFmt().
+ ASMJIT_API Error newVirtReg(VirtReg** ASMJIT_NONNULL(out), TypeId typeId, OperandSignature signature, const char* name);
//! Creates a new virtual register of the given `typeId` and stores it to `out` operand.
- ASMJIT_API Error _newReg(BaseReg* out, uint32_t typeId, const char* name = nullptr);
+ ASMJIT_API Error _newReg(BaseReg* ASMJIT_NONNULL(out), TypeId typeId, const char* name = nullptr);
//! Creates a new virtual register of the given `typeId` and stores it to `out` operand.
//!
//! \note This version accepts a snprintf() format `fmt` followed by a variadic arguments.
- ASMJIT_API Error _newRegFmt(BaseReg* out, uint32_t typeId, const char* fmt, ...);
+ ASMJIT_API Error _newRegFmt(BaseReg* ASMJIT_NONNULL(out), TypeId typeId, const char* fmt, ...);
//! Creates a new virtual register compatible with the provided reference register `ref`.
- ASMJIT_API Error _newReg(BaseReg* out, const BaseReg& ref, const char* name = nullptr);
+ ASMJIT_API Error _newReg(BaseReg* ASMJIT_NONNULL(out), const BaseReg& ref, const char* name = nullptr);
//! Creates a new virtual register compatible with the provided reference register `ref`.
//!
//! \note This version accepts a snprintf() format `fmt` followed by a variadic arguments.
- ASMJIT_API Error _newRegFmt(BaseReg* out, const BaseReg& ref, const char* fmt, ...);
+ ASMJIT_API Error _newRegFmt(BaseReg* ASMJIT_NONNULL(out), const BaseReg& ref, const char* fmt, ...);
//! Tests whether the given `id` is a valid virtual register id.
inline bool isVirtIdValid(uint32_t id) const noexcept {
@@ -357,9 +192,8 @@ public:
//! Returns \ref VirtReg associated with the given virtual register `index`.
//!
- //! \note This is not the same as virtual register id. The conversion between
- //! id and its index is implemented by \ref Operand_::virtIdToIndex() and \ref
- //! Operand_::indexToVirtId() functions.
+ //! \note This is not the same as virtual register id. The conversion between id and its index is implemented
+ //! by \ref Operand_::virtIdToIndex() and \ref Operand_::indexToVirtId() functions.
inline VirtReg* virtRegByIndex(uint32_t index) const noexcept { return _vRegArray[index]; }
//! Returns an array of all virtual registers managed by the Compiler.
@@ -371,7 +205,7 @@ public:
//! Creates a new stack of the given `size` and `alignment` and stores it to `out`.
//!
//! \note `name` can be used to give the stack a name, for debugging purposes.
- ASMJIT_API Error _newStack(BaseMem* out, uint32_t size, uint32_t alignment, const char* name = nullptr);
+ ASMJIT_API Error _newStack(BaseMem* ASMJIT_NONNULL(out), uint32_t size, uint32_t alignment, const char* name = nullptr);
//! Updates the stack size of a stack created by `_newStack()` by its `virtId`.
ASMJIT_API Error setStackSize(uint32_t virtId, uint32_t newSize, uint32_t newAlignment = 0);
@@ -386,11 +220,11 @@ public:
//! \name Constants
//! \{
- //! Creates a new constant of the given `scope` (see \ref ConstPool::Scope).
+ //! Creates a new constant of the given `scope` (see \ref ConstPoolScope).
//!
- //! This function adds a constant of the given `size` to the built-in \ref
- //! ConstPool and stores the reference to that constant to the `out` operand.
- ASMJIT_API Error _newConst(BaseMem* out, uint32_t scope, const void* data, size_t size);
+ //! This function adds a constant of the given `size` to the built-in \ref ConstPool and stores the reference to that
+ //! constant to the `out` operand.
+ ASMJIT_API Error _newConst(BaseMem* ASMJIT_NONNULL(out), ConstPoolScope scope, const void* data, size_t size);
//! \}
@@ -409,23 +243,15 @@ public:
return _jumpAnnotations;
}
- ASMJIT_API Error newJumpNode(JumpNode** out, uint32_t instId, uint32_t instOptions, const Operand_& o0, JumpAnnotation* annotation);
- ASMJIT_API Error emitAnnotatedJump(uint32_t instId, const Operand_& o0, JumpAnnotation* annotation);
+ ASMJIT_API Error newJumpNode(JumpNode** ASMJIT_NONNULL(out), InstId instId, InstOptions instOptions, const Operand_& o0, JumpAnnotation* annotation);
+ ASMJIT_API Error emitAnnotatedJump(InstId instId, const Operand_& o0, JumpAnnotation* annotation);
- //! Returns a new `JumpAnnotation` instance, which can be used to aggregate
- //! possible targets of a jump where the target is not a label, for example
- //! to implement jump tables.
+ //! Returns a new `JumpAnnotation` instance, which can be used to aggregate possible targets of a jump where the
+ //! target is not a label, for example to implement jump tables.
ASMJIT_API JumpAnnotation* newJumpAnnotation();
//! \}
-#ifndef ASMJIT_NO_DEPRECATED
- ASMJIT_DEPRECATED("alloc() has no effect, it will be removed in the future")
- inline void alloc(BaseReg&) {}
- ASMJIT_DEPRECATED("spill() has no effect, it will be removed in the future")
- inline void spill(BaseReg&) {}
-#endif // !ASMJIT_NO_DEPRECATED
-
//! \name Events
//! \{
@@ -435,22 +261,19 @@ public:
//! \}
};
-// ============================================================================
-// [asmjit::JumpAnnotation]
-// ============================================================================
-
//! Jump annotation used to annotate jumps.
//!
-//! \ref BaseCompiler allows to emit jumps where the target is either register
-//! or memory operand. Such jumps cannot be trivially inspected, so instead of
-//! doing heuristics AsmJit allows to annotate such jumps with possible targets.
-//! Register allocator then use the annotation to construct control-flow, which
-//! is then used by liveness analysis and other tools to prepare ground for
-//! register allocation.
+//! \ref BaseCompiler allows to emit jumps where the target is either register or memory operand. Such jumps cannot be
+//! trivially inspected, so instead of doing heuristics AsmJit allows to annotate such jumps with possible targets.
+//! Register allocator then uses the annotation to construct control-flow, which is then used by liveness analysis and
+//! other tools to prepare ground for register allocation.
class JumpAnnotation {
public:
ASMJIT_NONCOPYABLE(JumpAnnotation)
+ //! \name Members
+ //! \{
+
//! Compiler that owns this JumpAnnotation.
BaseCompiler* _compiler;
//! Annotation identifier.
@@ -458,10 +281,20 @@ public:
//! Vector of label identifiers, see \ref labelIds().
ZoneVector<uint32_t> _labelIds;
- inline JumpAnnotation(BaseCompiler* compiler, uint32_t annotationId) noexcept
+ //! \}
+
+ //! \name Construction & Destruction
+ //! \{
+
+ inline JumpAnnotation(BaseCompiler* ASMJIT_NONNULL(compiler), uint32_t annotationId) noexcept
: _compiler(compiler),
_annotationId(annotationId) {}
+ //! \}
+
+ //! \name Accessors
+ //! \{
+
//! Returns the compiler that owns this JumpAnnotation.
inline BaseCompiler* compiler() const noexcept { return _compiler; }
//! Returns the annotation id.
@@ -474,35 +307,42 @@ public:
//! Tests whether the given `labelId` is a target of this JumpAnnotation.
inline bool hasLabelId(uint32_t labelId) const noexcept { return _labelIds.contains(labelId); }
+ //! \}
+
+ //! \name Annotation Building API
+ //! \{
+
//! Adds the `label` to the list of targets of this JumpAnnotation.
inline Error addLabel(const Label& label) noexcept { return addLabelId(label.id()); }
//! Adds the `labelId` to the list of targets of this JumpAnnotation.
inline Error addLabelId(uint32_t labelId) noexcept { return _labelIds.append(&_compiler->_allocator, labelId); }
-};
-// ============================================================================
-// [asmjit::JumpNode]
-// ============================================================================
+ //! \}
+};
//! Jump instruction with \ref JumpAnnotation.
//!
-//! \note This node should be only used to represent jump where the jump target
-//! cannot be deduced by examining instruction operands. For example if the jump
-//! target is register or memory location. This pattern is often used to perform
-//! indirect jumps that use jump table, e.g. to implement `switch{}` statement.
+//! \note This node should be only used to represent jump where the jump target cannot be deduced by examining
+//! instruction operands. For example if the jump target is register or memory location. This pattern is often
+//! used to perform indirect jumps that use jump table, e.g. to implement `switch{}` statement.
class JumpNode : public InstNode {
public:
ASMJIT_NONCOPYABLE(JumpNode)
+ //! \name Members
+ //! \{
+
JumpAnnotation* _annotation;
+ //! \}
+
//! \name Construction & Destruction
//! \{
- ASMJIT_INLINE JumpNode(BaseCompiler* cc, uint32_t instId, uint32_t options, uint32_t opCount, JumpAnnotation* annotation) noexcept
+ inline JumpNode(BaseCompiler* ASMJIT_NONNULL(cc), InstId instId, InstOptions options, uint32_t opCount, JumpAnnotation* annotation) noexcept
: InstNode(cc, instId, options, opCount, kBaseOpCapacity),
_annotation(annotation) {
- setType(kNodeJump);
+ setType(NodeType::kJump);
}
//! \}
@@ -520,31 +360,24 @@ public:
//! \}
};
-// ============================================================================
-// [asmjit::FuncNode]
-// ============================================================================
-
//! Function node represents a function used by \ref BaseCompiler.
//!
//! A function is composed of the following:
//!
-//! - Function entry, \ref FuncNode acts as a label, so the entry is implicit.
-//! To get the entry, simply use \ref FuncNode::label(), which is the same
-//! as \ref LabelNode::label().
+//! - Function entry, \ref FuncNode acts as a label, so the entry is implicit. To get the entry, simply use
+//! \ref FuncNode::label(), which is the same as \ref LabelNode::label().
//!
-//! - Function exit, which is represented by \ref FuncNode::exitNode(). A
-//! helper function \ref FuncNode::exitLabel() exists and returns an exit
-//! label instead of node.
+//! - Function exit, which is represented by \ref FuncNode::exitNode(). A helper function
+//! \ref FuncNode::exitLabel() exists and returns an exit label instead of node.
//!
-//! - Function \ref FuncNode::endNode() sentinel. This node marks the end of
-//! a function - there should be no code that belongs to the function after
-//! this node, but the Compiler doesn't enforce that at the moment.
+//! - Function \ref FuncNode::endNode() sentinel. This node marks the end of a function - there should be no
+//! code that belongs to the function after this node, but the Compiler doesn't enforce that at the moment.
//!
//! - Function detail, see \ref FuncNode::detail().
//!
//! - Function frame, see \ref FuncNode::frame().
//!
-//! - Function arguments mapped to virtual registers, see \ref FuncNode::args().
+//! - Function arguments mapped to virtual registers, see \ref FuncNode::argPacks().
//!
//! In a node list, the function and its body looks like the following:
//!
@@ -563,16 +396,30 @@ public:
//! [...] - Anything after the function.
//! \endcode
//!
-//! When a function is added to the compiler by \ref BaseCompiler::addFunc() it
-//! actually inserts 3 nodes (FuncNode, ExitLabel, and FuncEnd) and sets the
-//! current cursor to be FuncNode. When \ref BaseCompiler::endFunc() is called
-//! the cursor is set to FuncEnd. This guarantees that user can use ExitLabel
-//! as a marker after additional code or data can be placed, and it's a common
-//! practice.
+//! When a function is added to the instruction stream by \ref BaseCompiler::addFunc() it actually inserts 3 nodes
+//! (FuncNode, ExitLabel, and FuncEnd) and sets the current cursor to be FuncNode. When \ref BaseCompiler::endFunc()
+//! is called the cursor is set to FuncEnd. This guarantees that user can use ExitLabel as a marker after additional
+//! code or data can be placed, which is a common practice.
class FuncNode : public LabelNode {
public:
ASMJIT_NONCOPYABLE(FuncNode)
+ //! Arguments pack.
+ struct ArgPack {
+ RegOnly _data[Globals::kMaxValuePack];
+
+ inline void reset() noexcept {
+ for (size_t valueIndex = 0; valueIndex < Globals::kMaxValuePack; valueIndex++)
+ _data[valueIndex].reset();
+ }
+
+ inline RegOnly& operator[](size_t valueIndex) noexcept { return _data[valueIndex]; }
+ inline const RegOnly& operator[](size_t valueIndex) const noexcept { return _data[valueIndex]; }
+ };
+
+ //! \name Members
+ //! \{
+
//! Function detail.
FuncDetail _funcDetail;
//! Function frame.
@@ -581,23 +428,25 @@ public:
LabelNode* _exitNode;
//! Function end (sentinel).
SentinelNode* _end;
- //! Arguments array as `VirtReg`.
- VirtReg** _args;
+ //! Argument packs.
+ ArgPack* _args;
+
+ //! \}
//! \name Construction & Destruction
//! \{
//! Creates a new `FuncNode` instance.
//!
- //! Always use `BaseCompiler::addFunc()` to create `FuncNode`.
- ASMJIT_INLINE FuncNode(BaseBuilder* cb) noexcept
+ //! Always use `BaseCompiler::addFunc()` to create a new `FuncNode`.
+ inline FuncNode(BaseBuilder* ASMJIT_NONNULL(cb)) noexcept
: LabelNode(cb),
_funcDetail(),
_frame(),
_exitNode(nullptr),
_end(nullptr),
_args(nullptr) {
- setType(kNodeFunc);
+ setType(NodeType::kFunc);
}
//! \}
@@ -610,12 +459,12 @@ public:
//! Returns function exit label.
inline Label exitLabel() const noexcept { return _exitNode->label(); }
- //! Returns "End of Func" sentinel.
+ //! Returns "End of Func" sentinel node.
inline SentinelNode* endNode() const noexcept { return _end; }
- //! Returns function declaration.
+ //! Returns function detail.
inline FuncDetail& detail() noexcept { return _funcDetail; }
- //! Returns function declaration.
+ //! Returns function detail.
inline const FuncDetail& detail() const noexcept { return _funcDetail; }
//! Returns function frame.
@@ -623,44 +472,64 @@ public:
//! Returns function frame.
inline const FuncFrame& frame() const noexcept { return _frame; }
+ //! Returns function attributes.
+ inline FuncAttributes attributes() const noexcept { return _frame.attributes(); }
+ //! Adds `attrs` to the function attributes.
+ inline void addAttributes(FuncAttributes attrs) noexcept { _frame.addAttributes(attrs); }
+
//! Returns arguments count.
inline uint32_t argCount() const noexcept { return _funcDetail.argCount(); }
- //! Returns returns count.
- inline uint32_t retCount() const noexcept { return _funcDetail.retCount(); }
+ //! Returns argument packs.
+ inline ArgPack* argPacks() const noexcept { return _args; }
- //! Returns arguments list.
- inline VirtReg** args() const noexcept { return _args; }
+ //! Tests whether the function has a return value.
+ inline bool hasRet() const noexcept { return _funcDetail.hasRet(); }
- //! Returns argument at `i`.
- inline VirtReg* arg(uint32_t i) const noexcept {
- ASMJIT_ASSERT(i < argCount());
- return _args[i];
+ //! Returns argument pack at `argIndex`.
+ inline ArgPack& argPack(size_t argIndex) const noexcept {
+ ASMJIT_ASSERT(argIndex < argCount());
+ return _args[argIndex];
}
- //! Sets argument at `i`.
- inline void setArg(uint32_t i, VirtReg* vReg) noexcept {
- ASMJIT_ASSERT(i < argCount());
- _args[i] = vReg;
+ //! Sets argument at `argIndex`.
+ inline void setArg(size_t argIndex, const BaseReg& vReg) noexcept {
+ ASMJIT_ASSERT(argIndex < argCount());
+ _args[argIndex][0].init(vReg);
}
- //! Resets argument at `i`.
- inline void resetArg(uint32_t i) noexcept {
- ASMJIT_ASSERT(i < argCount());
- _args[i] = nullptr;
+ //! \overload
+ inline void setArg(size_t argIndex, const RegOnly& vReg) noexcept {
+ ASMJIT_ASSERT(argIndex < argCount());
+ _args[argIndex][0].init(vReg);
}
- //! Returns function attributes.
- inline uint32_t attributes() const noexcept { return _frame.attributes(); }
- //! Adds `attrs` to the function attributes.
- inline void addAttributes(uint32_t attrs) noexcept { _frame.addAttributes(attrs); }
+ //! Sets argument at `argIndex` and `valueIndex`.
+ inline void setArg(size_t argIndex, size_t valueIndex, const BaseReg& vReg) noexcept {
+ ASMJIT_ASSERT(argIndex < argCount());
+ _args[argIndex][valueIndex].init(vReg);
+ }
+
+ //! \overload
+ inline void setArg(size_t argIndex, size_t valueIndex, const RegOnly& vReg) noexcept {
+ ASMJIT_ASSERT(argIndex < argCount());
+ _args[argIndex][valueIndex].init(vReg);
+ }
+
+ //! Resets argument pack at `argIndex`.
+ inline void resetArg(size_t argIndex) noexcept {
+ ASMJIT_ASSERT(argIndex < argCount());
+ _args[argIndex].reset();
+ }
+
+ //! Resets argument pack at `argIndex`.
+ inline void resetArg(size_t argIndex, size_t valueIndex) noexcept {
+ ASMJIT_ASSERT(argIndex < argCount());
+ _args[argIndex][valueIndex].reset();
+ }
//! \}
};
-// ============================================================================
-// [asmjit::FuncRetNode]
-// ============================================================================
-
//! Function return, used by \ref BaseCompiler.
class FuncRetNode : public InstNode {
public:
@@ -670,42 +539,68 @@ public:
//! \{
//! Creates a new `FuncRetNode` instance.
- inline FuncRetNode(BaseBuilder* cb) noexcept : InstNode(cb, BaseInst::kIdAbstract, 0, 0) {
- _any._nodeType = kNodeFuncRet;
+ inline FuncRetNode(BaseBuilder* ASMJIT_NONNULL(cb)) noexcept : InstNode(cb, BaseInst::kIdAbstract, InstOptions::kNone, 0) {
+ _any._nodeType = NodeType::kFuncRet;
}
//! \}
};
-// ============================================================================
-// [asmjit::InvokeNode]
-// ============================================================================
-
//! Function invocation, used by \ref BaseCompiler.
class InvokeNode : public InstNode {
public:
ASMJIT_NONCOPYABLE(InvokeNode)
+ //! Operand pack provides multiple operands that can be associated with a single return value of function
+ //! argument. Sometims this is necessary to express an argument or return value that requires multiple
+ //! registers, for example 64-bit value in 32-bit mode or passing / returning homogeneous data structures.
+ struct OperandPack {
+ //! Operands.
+ Operand_ _data[Globals::kMaxValuePack];
+
+ //! Reset the pack by resetting all operands in the pack.
+ inline void reset() noexcept {
+ for (size_t valueIndex = 0; valueIndex < Globals::kMaxValuePack; valueIndex++)
+ _data[valueIndex].reset();
+ }
+
+ //! Returns an operand at the given `valueIndex`.
+ inline Operand& operator[](size_t valueIndex) noexcept {
+ ASMJIT_ASSERT(valueIndex < Globals::kMaxValuePack);
+ return _data[valueIndex].as<Operand>();
+ }
+
+ //! Returns an operand at the given `valueIndex` (const).
+ const inline Operand& operator[](size_t valueIndex) const noexcept {
+ ASMJIT_ASSERT(valueIndex < Globals::kMaxValuePack);
+ return _data[valueIndex].as<Operand>();
+ }
+ };
+
+ //! \name Members
+ //! \{
+
//! Function detail.
FuncDetail _funcDetail;
- //! Returns.
- Operand_ _rets[2];
- //! Arguments.
- Operand_* _args;
+ //! Function return value(s).
+ OperandPack _rets;
+ //! Function arguments.
+ OperandPack* _args;
+
+ //! \}
//! \name Construction & Destruction
//! \{
//! Creates a new `InvokeNode` instance.
- inline InvokeNode(BaseBuilder* cb, uint32_t instId, uint32_t options) noexcept
+ inline InvokeNode(BaseBuilder* ASMJIT_NONNULL(cb), InstId instId, InstOptions options) noexcept
: InstNode(cb, instId, options, kBaseOpCapacity),
_funcDetail(),
_args(nullptr) {
- setType(kNodeInvoke);
+ setType(NodeType::kInvoke);
_resetOps();
- _rets[0].reset();
- _rets[1].reset();
- addFlags(kFlagIsRemovable);
+ _rets.reset();
+ addFlags(NodeFlags::kIsRemovable);
}
//! \}
@@ -728,53 +623,67 @@ public:
//! \overload
inline const Operand& target() const noexcept { return _opArray[0].as<Operand>(); }
+ //! Returns the number of function return values.
+ inline bool hasRet() const noexcept { return _funcDetail.hasRet(); }
//! Returns the number of function arguments.
inline uint32_t argCount() const noexcept { return _funcDetail.argCount(); }
- //! Returns the number of function return values.
- inline uint32_t retCount() const noexcept { return _funcDetail.retCount(); }
- //! Returns the return value at `i`.
- inline Operand& ret(uint32_t i = 0) noexcept {
- ASMJIT_ASSERT(i < 2);
- return _rets[i].as<Operand>();
+ //! Returns operand pack representing function return value(s).
+ inline OperandPack& retPack() noexcept { return _rets; }
+ //! Returns operand pack representing function return value(s).
+ inline const OperandPack& retPack() const noexcept { return _rets; }
+
+ //! Returns the return value at the given `valueIndex`.
+ inline Operand& ret(size_t valueIndex = 0) noexcept { return _rets[valueIndex]; }
+ //! \overload
+ inline const Operand& ret(size_t valueIndex = 0) const noexcept { return _rets[valueIndex]; }
+
+ //! Returns operand pack representing function return value(s).
+ inline OperandPack& argPack(size_t argIndex) noexcept {
+ ASMJIT_ASSERT(argIndex < argCount());
+ return _args[argIndex];
}
//! \overload
- inline const Operand& ret(uint32_t i = 0) const noexcept {
- ASMJIT_ASSERT(i < 2);
- return _rets[i].as<Operand>();
+ inline const OperandPack& argPack(size_t argIndex) const noexcept {
+ ASMJIT_ASSERT(argIndex < argCount());
+ return _args[argIndex];
}
- //! Returns the function argument at `i`.
- inline Operand& arg(uint32_t i) noexcept {
- ASMJIT_ASSERT(i < kFuncArgCountLoHi);
- return _args[i].as<Operand>();
+ //! Returns a function argument at the given `argIndex`.
+ inline Operand& arg(size_t argIndex, size_t valueIndex) noexcept {
+ ASMJIT_ASSERT(argIndex < argCount());
+ return _args[argIndex][valueIndex];
}
//! \overload
- inline const Operand& arg(uint32_t i) const noexcept {
- ASMJIT_ASSERT(i < kFuncArgCountLoHi);
- return _args[i].as<Operand>();
+ inline const Operand& arg(size_t argIndex, size_t valueIndex) const noexcept {
+ ASMJIT_ASSERT(argIndex < argCount());
+ return _args[argIndex][valueIndex];
}
- //! Sets the function argument at `i` to `op`.
- ASMJIT_API bool _setArg(uint32_t i, const Operand_& op) noexcept;
//! Sets the function return value at `i` to `op`.
- ASMJIT_API bool _setRet(uint32_t i, const Operand_& op) noexcept;
+ inline void _setRet(size_t valueIndex, const Operand_& op) noexcept { _rets[valueIndex] = op; }
+ //! Sets the function argument at `i` to `op`.
+ inline void _setArg(size_t argIndex, size_t valueIndex, const Operand_& op) noexcept {
+ ASMJIT_ASSERT(argIndex < argCount());
+ _args[argIndex][valueIndex] = op;
+ }
- //! Sets the function argument at `i` to `reg`.
- inline bool setArg(uint32_t i, const BaseReg& reg) noexcept { return _setArg(i, reg); }
- //! Sets the function argument at `i` to `imm`.
- inline bool setArg(uint32_t i, const Imm& imm) noexcept { return _setArg(i, imm); }
+ //! Sets the function return value at `valueIndex` to `reg`.
+ inline void setRet(size_t valueIndex, const BaseReg& reg) noexcept { _setRet(valueIndex, reg); }
- //! Sets the function return value at `i` to `var`.
- inline bool setRet(uint32_t i, const BaseReg& reg) noexcept { return _setRet(i, reg); }
+ //! Sets the first function argument in a value-pack at `argIndex` to `reg`.
+ inline void setArg(size_t argIndex, const BaseReg& reg) noexcept { _setArg(argIndex, 0, reg); }
+ //! Sets the first function argument in a value-pack at `argIndex` to `imm`.
+ inline void setArg(size_t argIndex, const Imm& imm) noexcept { _setArg(argIndex, 0, imm); }
+
+ //! Sets the function argument at `argIndex` and `valueIndex` to `reg`.
+ inline void setArg(size_t argIndex, size_t valueIndex, const BaseReg& reg) noexcept { _setArg(argIndex, valueIndex, reg); }
+ //! Sets the function argument at `argIndex` and `valueIndex` to `imm`.
+ inline void setArg(size_t argIndex, size_t valueIndex, const Imm& imm) noexcept { _setArg(argIndex, valueIndex, imm); }
//! \}
};
-// ============================================================================
-// [asmjit::FuncPass]
-// ============================================================================
-
//! Function pass extends \ref Pass with \ref FuncPass::runOnFunction().
class ASMJIT_VIRTAPI FuncPass : public Pass {
public:
@@ -796,7 +705,7 @@ public:
//! \}
- //! \name Run
+ //! \name Pass Interface
//! \{
//! Calls `runOnFunction()` on each `FuncNode` node found.
@@ -808,6 +717,18 @@ public:
//! \}
};
+#if !defined(ASMJIT_NO_DEPRECATED)
+inline Error BaseCompiler::_setArg(size_t argIndex, size_t valueIndex, const BaseReg& reg) {
+ FuncNode* func = _func;
+
+ if (ASMJIT_UNLIKELY(!func))
+ return reportError(DebugUtils::errored(kErrorInvalidState));
+
+ func->setArg(argIndex, valueIndex, reg);
+ return kErrorOk;
+}
+#endif
+
//! \}
ASMJIT_END_NAMESPACE
diff --git a/3rdparty/asmjit/src/asmjit/core/compilerdefs.h b/3rdparty/asmjit/src/asmjit/core/compilerdefs.h
new file mode 100644
index 00000000000..1870e688bc9
--- /dev/null
+++ b/3rdparty/asmjit/src/asmjit/core/compilerdefs.h
@@ -0,0 +1,173 @@
+// This file is part of AsmJit project <https://asmjit.com>
+//
+// See asmjit.h or LICENSE.md for license and copyright information
+// SPDX-License-Identifier: Zlib
+
+#ifndef ASMJIT_CORE_COMPILERDEFS_H_INCLUDED
+#define ASMJIT_CORE_COMPILERDEFS_H_INCLUDED
+
+#include "../core/api-config.h"
+#include "../core/operand.h"
+#include "../core/type.h"
+#include "../core/zonestring.h"
+
+ASMJIT_BEGIN_NAMESPACE
+
+class RAWorkReg;
+
+//! \addtogroup asmjit_compiler
+//! \{
+
+//! Virtual register data, managed by \ref BaseCompiler.
+class VirtReg {
+public:
+ ASMJIT_NONCOPYABLE(VirtReg)
+
+ //! \name Members
+ //! \{
+
+ //! Virtual register signature.
+ OperandSignature _signature {};
+ //! Virtual register id.
+ uint32_t _id = 0;
+ //! Virtual register size (can be smaller than `_signature._size`).
+ uint32_t _virtSize = 0;
+ //! Virtual register alignment (for spilling).
+ uint8_t _alignment = 0;
+ //! Type-id.
+ TypeId _typeId = TypeId::kVoid;
+ //! Virtual register weight for alloc/spill decisions.
+ uint8_t _weight = 1;
+ //! True if this is a fixed register, never reallocated.
+ uint8_t _isFixed : 1;
+ //! True if the virtual register is only used as a stack (never accessed as register).
+ uint8_t _isStack : 1;
+ //! True if this virtual register has assigned stack offset (can be only valid after register allocation pass).
+ uint8_t _hasStackSlot : 1;
+ uint8_t _reservedBits : 5;
+
+ //! Stack offset assigned by the register allocator relative to stack pointer (can be negative as well).
+ int32_t _stackOffset = 0;
+
+ //! Reserved for future use (padding).
+ uint32_t _reservedU32 = 0;
+
+ //! Virtual register name (user provided or automatically generated).
+ ZoneString<16> _name {};
+
+ // The following members are used exclusively by RAPass. They are initialized when the VirtReg is created to
+ // null pointers and then changed during RAPass execution. RAPass sets them back to NULL before it returns.
+
+ //! Reference to `RAWorkReg`, used during register allocation.
+ RAWorkReg* _workReg = nullptr;
+
+ //! \}
+
+ //! \name Construction & Destruction
+ //! \{
+
+ inline VirtReg(OperandSignature signature, uint32_t id, uint32_t virtSize, uint32_t alignment, TypeId typeId) noexcept
+ : _signature(signature),
+ _id(id),
+ _virtSize(virtSize),
+ _alignment(uint8_t(alignment)),
+ _typeId(typeId),
+ _isFixed(false),
+ _isStack(false),
+ _hasStackSlot(false),
+ _reservedBits(0),
+ _stackOffset(0),
+ _reservedU32(0) {}
+
+ //! \}
+
+ //! \name Accessors
+ //! \{
+
+ //! Returns the virtual register id.
+ inline uint32_t id() const noexcept { return _id; }
+
+ //! Returns the virtual register name.
+ inline const char* name() const noexcept { return _name.data(); }
+ //! Returns the size of the virtual register name.
+ inline uint32_t nameSize() const noexcept { return _name.size(); }
+
+ //! Returns a register signature of this virtual register.
+ inline OperandSignature signature() const noexcept { return _signature; }
+ //! Returns a virtual register type (maps to the physical register type as well).
+ inline RegType type() const noexcept { return _signature.regType(); }
+ //! Returns a virtual register group (maps to the physical register group as well).
+ inline RegGroup group() const noexcept { return _signature.regGroup(); }
+
+ //! Returns a real size of the register this virtual register maps to.
+ //!
+ //! For example if this is a 128-bit SIMD register used for a scalar single precision floating point value then
+ //! its virtSize would be 4, however, the `regSize` would still say 16 (128-bits), because it's the smallest size
+ //! of that register type.
+ inline uint32_t regSize() const noexcept { return _signature.size(); }
+
+ //! Returns the virtual register size.
+ //!
+ //! The virtual register size describes how many bytes the virtual register needs to store its content. It can be
+ //! smaller than the physical register size, see `regSize()`.
+ inline uint32_t virtSize() const noexcept { return _virtSize; }
+
+ //! Returns the virtual register alignment.
+ inline uint32_t alignment() const noexcept { return _alignment; }
+
+ //! Returns the virtual register type id.
+ inline TypeId typeId() const noexcept { return _typeId; }
+
+ //! Returns the virtual register weight - the register allocator can use it as explicit hint for alloc/spill
+ //! decisions.
+ inline uint32_t weight() const noexcept { return _weight; }
+ //! Sets the virtual register weight (0 to 255) - the register allocator can use it as explicit hint for
+ //! alloc/spill decisions and initial bin-packing.
+ inline void setWeight(uint32_t weight) noexcept { _weight = uint8_t(weight); }
+
+ //! Returns whether the virtual register is always allocated to a fixed physical register (and never reallocated).
+ //!
+ //! \note This is only used for special purposes and it's mostly internal.
+ inline bool isFixed() const noexcept { return bool(_isFixed); }
+
+ //! Tests whether the virtual register is in fact a stack that only uses the virtual register id.
+ //!
+ //! \note It's an error if a stack is accessed as a register.
+ inline bool isStack() const noexcept { return bool(_isStack); }
+
+ //! Tests whether this virtual register (or stack) has assigned a stack offset.
+ //!
+ //! If this is a virtual register that was never allocated on stack, it would return false, otherwise if
+ //! it's a virtual register that was spilled or explicitly allocated stack, the return value would be true.
+ inline bool hasStackSlot() const noexcept { return bool(_hasStackSlot); }
+
+ //! Assigns a stack offset of this virtual register to `stackOffset` and sets `_hasStackSlot` to true.
+ inline void assignStackSlot(int32_t stackOffset) noexcept {
+ _hasStackSlot = 1;
+ _stackOffset = stackOffset;
+ }
+
+ //! Returns a stack offset associated with a virtual register or explicit stack allocation.
+ //!
+ //! \note Always verify that the stack offset has been assigned by calling \ref hasStackSlot(). The return
+ //! value will be zero when the stack offset was not assigned.
+ inline int32_t stackOffset() const noexcept { return _stackOffset; }
+
+ //! Tests whether the virtual register has an associated `RAWorkReg` at the moment.
+ inline bool hasWorkReg() const noexcept { return _workReg != nullptr; }
+ //! Returns an associated RAWorkReg with this virtual register (only valid during register allocation).
+ inline RAWorkReg* workReg() const noexcept { return _workReg; }
+ //! Associates a RAWorkReg with this virtual register (used by register allocator).
+ inline void setWorkReg(RAWorkReg* workReg) noexcept { _workReg = workReg; }
+ //! Reset the RAWorkReg association (used by register allocator).
+ inline void resetWorkReg() noexcept { _workReg = nullptr; }
+
+ //! \}
+};
+
+//! \}
+
+ASMJIT_END_NAMESPACE
+
+#endif // ASMJIT_CORE_COMPILERDEFS_H_INCLUDED
+
diff --git a/3rdparty/asmjit/src/asmjit/core/constpool.cpp b/3rdparty/asmjit/src/asmjit/core/constpool.cpp
index 4db68e2e6e9..ad5fe4f2fc0 100644
--- a/3rdparty/asmjit/src/asmjit/core/constpool.cpp
+++ b/3rdparty/asmjit/src/asmjit/core/constpool.cpp
@@ -1,25 +1,7 @@
-// AsmJit - Machine code generation for C++
+// This file is part of AsmJit project <https://asmjit.com>
//
-// * Official AsmJit Home Page: https://asmjit.com
-// * Official Github Repository: https://github.com/asmjit/asmjit
-//
-// Copyright (c) 2008-2020 The AsmJit Authors
-//
-// This software is provided 'as-is', without any express or implied
-// warranty. In no event will the authors be held liable for any damages
-// arising from the use of this software.
-//
-// Permission is granted to anyone to use this software for any purpose,
-// including commercial applications, and to alter it and redistribute it
-// freely, subject to the following restrictions:
-//
-// 1. The origin of this software must not be misrepresented; you must not
-// claim that you wrote the original software. If you use this software
-// in a product, an acknowledgment in the product documentation would be
-// appreciated but is not required.
-// 2. Altered source versions must be plainly marked as such, and must not be
-// misrepresented as being the original software.
-// 3. This notice may not be removed or altered from any source distribution.
+// See asmjit.h or LICENSE.md for license and copyright information
+// SPDX-License-Identifier: Zlib
#include "../core/api-build_p.h"
#include "../core/constpool.h"
@@ -27,16 +9,14 @@
ASMJIT_BEGIN_NAMESPACE
-// ============================================================================
-// [asmjit::ConstPool - Construction / Destruction]
-// ============================================================================
+// ConstPool - Construction & Destruction
+// ======================================
ConstPool::ConstPool(Zone* zone) noexcept { reset(zone); }
ConstPool::~ConstPool() noexcept {}
-// ============================================================================
-// [asmjit::ConstPool - Reset]
-// ============================================================================
+// ConstPool - Reset
+// =================
void ConstPool::reset(Zone* zone) noexcept {
_zone = zone;
@@ -52,13 +32,13 @@ void ConstPool::reset(Zone* zone) noexcept {
_gapPool = nullptr;
_size = 0;
_alignment = 0;
+ _minItemSize = 0;
}
-// ============================================================================
-// [asmjit::ConstPool - Ops]
-// ============================================================================
+// ConstPool - Operations
+// ======================
-static ASMJIT_INLINE ConstPool::Gap* ConstPool_allocGap(ConstPool* self) noexcept {
+static inline ConstPool::Gap* ConstPool_allocGap(ConstPool* self) noexcept {
ConstPool::Gap* gap = self->_gapPool;
if (!gap)
return self->_zone->allocT<ConstPool::Gap>();
@@ -67,7 +47,7 @@ static ASMJIT_INLINE ConstPool::Gap* ConstPool_allocGap(ConstPool* self) noexcep
return gap;
}
-static ASMJIT_INLINE void ConstPool_freeGap(ConstPool* self, ConstPool::Gap* gap) noexcept {
+static inline void ConstPool_freeGap(ConstPool* self, ConstPool::Gap* gap) noexcept {
gap->_next = self->_gapPool;
self->_gapPool = gap;
}
@@ -79,7 +59,11 @@ static void ConstPool_addGap(ConstPool* self, size_t offset, size_t size) noexce
size_t gapIndex;
size_t gapSize;
- if (size >= 16 && Support::isAligned<size_t>(offset, 16)) {
+ if (size >= 32 && Support::isAligned<size_t>(offset, 32)) {
+ gapIndex = ConstPool::kIndex32;
+ gapSize = 32;
+ }
+ else if (size >= 16 && Support::isAligned<size_t>(offset, 16)) {
gapIndex = ConstPool::kIndex16;
gapSize = 16;
}
@@ -100,9 +84,8 @@ static void ConstPool_addGap(ConstPool* self, size_t offset, size_t size) noexce
gapSize = 1;
}
- // We don't have to check for errors here, if this failed nothing really
- // happened (just the gap won't be visible) and it will fail again at
- // place where the same check would generate `kErrorOutOfMemory` error.
+ // We don't have to check for errors here, if this failed nothing really happened (just the gap won't be
+ // visible) and it will fail again at place where the same check would generate `kErrorOutOfMemory` error.
ConstPool::Gap* gap = ConstPool_allocGap(self);
if (!gap)
return;
@@ -121,7 +104,9 @@ static void ConstPool_addGap(ConstPool* self, size_t offset, size_t size) noexce
Error ConstPool::add(const void* data, size_t size, size_t& dstOffset) noexcept {
size_t treeIndex;
- if (size == 32)
+ if (size == 64)
+ treeIndex = kIndex64;
+ else if (size == 32)
treeIndex = kIndex32;
else if (size == 16)
treeIndex = kIndex16;
@@ -142,8 +127,7 @@ Error ConstPool::add(const void* data, size_t size, size_t& dstOffset) noexcept
return kErrorOk;
}
- // Before incrementing the current offset try if there is a gap that can
- // be used for the requested data.
+ // Before incrementing the current offset try if there is a gap that can be used for the requested data.
size_t offset = ~size_t(0);
size_t gapIndex = treeIndex;
@@ -171,8 +155,7 @@ Error ConstPool::add(const void* data, size_t size, size_t& dstOffset) noexcept
}
if (offset == ~size_t(0)) {
- // Get how many bytes have to be skipped so the address is aligned accordingly
- // to the 'size'.
+ // Get how many bytes have to be skipped so the address is aligned accordingly to the 'size'.
size_t diff = Support::alignUpDiff<size_t>(_size, size);
if (diff != 0) {
@@ -186,40 +169,46 @@ Error ConstPool::add(const void* data, size_t size, size_t& dstOffset) noexcept
// Add the initial node to the right index.
node = ConstPool::Tree::_newNode(_zone, data, size, offset, false);
- if (!node) return DebugUtils::errored(kErrorOutOfMemory);
+ if (ASMJIT_UNLIKELY(!node))
+ return DebugUtils::errored(kErrorOutOfMemory);
_tree[treeIndex].insert(node);
_alignment = Support::max<size_t>(_alignment, size);
dstOffset = offset;
- // Now create a bunch of shared constants that are based on the data pattern.
- // We stop at size 4, it probably doesn't make sense to split constants down
- // to 1 byte.
+ // Now create a bunch of shared constants that are based on the data pattern. We stop at size 4,
+ // it probably doesn't make sense to split constants down to 1 byte.
size_t pCount = 1;
- while (size > 4) {
- size >>= 1;
+ size_t smallerSize = size;
+
+ while (smallerSize > 4) {
pCount <<= 1;
+ smallerSize >>= 1;
ASMJIT_ASSERT(treeIndex != 0);
treeIndex--;
const uint8_t* pData = static_cast<const uint8_t*>(data);
- for (size_t i = 0; i < pCount; i++, pData += size) {
+ for (size_t i = 0; i < pCount; i++, pData += smallerSize) {
node = _tree[treeIndex].get(pData);
if (node) continue;
- node = ConstPool::Tree::_newNode(_zone, pData, size, offset + (i * size), true);
+ node = ConstPool::Tree::_newNode(_zone, pData, smallerSize, offset + (i * smallerSize), true);
_tree[treeIndex].insert(node);
}
}
+ if (_minItemSize == 0)
+ _minItemSize = size;
+ else
+ _minItemSize = Support::min(_minItemSize, size);
+
return kErrorOk;
}
-// ============================================================================
-// [asmjit::ConstPool - Reset]
-// ============================================================================
+// ConstPool - Reset
+// =================
struct ConstPoolFill {
inline ConstPoolFill(uint8_t* dst, size_t dataSize) noexcept :
@@ -246,9 +235,8 @@ void ConstPool::fill(void* dst) const noexcept {
}
}
-// ============================================================================
-// [asmjit::ConstPool - Unit]
-// ============================================================================
+// ConstPool - Tests
+// =================
#if defined(ASMJIT_TEST)
UNIT(const_pool) {
@@ -258,7 +246,7 @@ UNIT(const_pool) {
uint32_t i;
uint32_t kCount = BrokenAPI::hasArg("--quick") ? 1000 : 1000000;
- INFO("Adding %u constants to the pool.", kCount);
+ INFO("Adding %u constants to the pool", kCount);
{
size_t prevOffset;
size_t curOffset;
@@ -278,7 +266,7 @@ UNIT(const_pool) {
EXPECT(pool.alignment() == 8);
}
- INFO("Retrieving %u constants from the pool.", kCount);
+ INFO("Retrieving %u constants from the pool", kCount);
{
uint64_t c = 0x0101010101010101u;
diff --git a/3rdparty/asmjit/src/asmjit/core/constpool.h b/3rdparty/asmjit/src/asmjit/core/constpool.h
index d9ac58952a8..32b84b1065d 100644
--- a/3rdparty/asmjit/src/asmjit/core/constpool.h
+++ b/3rdparty/asmjit/src/asmjit/core/constpool.h
@@ -1,25 +1,7 @@
-// AsmJit - Machine code generation for C++
+// This file is part of AsmJit project <https://asmjit.com>
//
-// * Official AsmJit Home Page: https://asmjit.com
-// * Official Github Repository: https://github.com/asmjit/asmjit
-//
-// Copyright (c) 2008-2020 The AsmJit Authors
-//
-// This software is provided 'as-is', without any express or implied
-// warranty. In no event will the authors be held liable for any damages
-// arising from the use of this software.
-//
-// Permission is granted to anyone to use this software for any purpose,
-// including commercial applications, and to alter it and redistribute it
-// freely, subject to the following restrictions:
-//
-// 1. The origin of this software must not be misrepresented; you must not
-// claim that you wrote the original software. If you use this software
-// in a product, an acknowledgment in the product documentation would be
-// appreciated but is not required.
-// 2. Altered source versions must be plainly marked as such, and must not be
-// misrepresented as being the original software.
-// 3. This notice may not be removed or altered from any source distribution.
+// See asmjit.h or LICENSE.md for license and copyright information
+// SPDX-License-Identifier: Zlib
#ifndef ASMJIT_CORE_CONSTPOOL_H_INCLUDED
#define ASMJIT_CORE_CONSTPOOL_H_INCLUDED
@@ -33,23 +15,22 @@ ASMJIT_BEGIN_NAMESPACE
//! \addtogroup asmjit_utilities
//! \{
-// ============================================================================
-// [asmjit::ConstPool]
-// ============================================================================
+//! Constant pool scope.
+enum class ConstPoolScope : uint32_t {
+ //! Local constant, always embedded right after the current function.
+ kLocal = 0,
+ //! Global constant, embedded at the end of the currently compiled code.
+ kGlobal = 1,
+
+ //! Maximum value of `ConstPoolScope`.
+ kMaxValue = kGlobal
+};
//! Constant pool.
class ConstPool {
public:
ASMJIT_NONCOPYABLE(ConstPool)
- //! Constant pool scope.
- enum Scope : uint32_t {
- //! Local constant, always embedded right after the current function.
- kScopeLocal = 0,
- //! Global constant, embedded at the end of the currently compiled code.
- kScopeGlobal = 1
- };
-
//! \cond INTERNAL
//! Index of a given size in const-pool table.
@@ -60,7 +41,8 @@ public:
kIndex8 = 3,
kIndex16 = 4,
kIndex32 = 5,
- kIndexCount = 6
+ kIndex64 = 6,
+ kIndexCount = 7
};
//! Zone-allocated const-pool gap created by two differently aligned constants.
@@ -193,6 +175,9 @@ public:
//! \endcond
+ //! \name Members
+ //! \{
+
//! Zone allocator.
Zone* _zone;
//! Tree per size.
@@ -206,6 +191,10 @@ public:
size_t _size;
//! Required pool alignment.
size_t _alignment;
+ //! Minimum item size in the pool.
+ size_t _minItemSize;
+
+ //! \}
//! \name Construction & Destruction
//! \{
@@ -226,6 +215,8 @@ public:
inline size_t size() const noexcept { return _size; }
//! Returns minimum alignment.
inline size_t alignment() const noexcept { return _alignment; }
+ //! Returns the minimum size of all items added to the constant pool.
+ inline size_t minItemSize() const noexcept { return _minItemSize; }
//! \}
@@ -234,21 +225,18 @@ public:
//! Adds a constant to the constant pool.
//!
- //! The constant must have known size, which is 1, 2, 4, 8, 16 or 32 bytes.
- //! The constant is added to the pool only if it doesn't not exist, otherwise
- //! cached value is returned.
+ //! The constant must have known size, which is 1, 2, 4, 8, 16 or 32 bytes. The constant is added to the pool only
+ //! if it doesn't not exist, otherwise cached value is returned.
//!
- //! AsmJit is able to subdivide added constants, so for example if you add
- //! 8-byte constant 0x1122334455667788 it will create the following slots:
+ //! AsmJit is able to subdivide added constants, so for example if you add 8-byte constant 0x1122334455667788 it
+ //! will create the following slots:
//!
//! 8-byte: 0x1122334455667788
//! 4-byte: 0x11223344, 0x55667788
//!
- //! The reason is that when combining MMX/SSE/AVX code some patterns are used
- //! frequently. However, AsmJit is not able to reallocate a constant that has
- //! been already added. For example if you try to add 4-byte constant and then
- //! 8-byte constant having the same 4-byte pattern as the previous one, two
- //! independent slots will be generated by the pool.
+ //! The reason is that when combining MMX/SSE/AVX code some patterns are used frequently. However, AsmJit is not
+ //! able to reallocate a constant that has been already added. For example if you try to add 4-byte constant and
+ //! then 8-byte constant having the same 4-byte pattern as the previous one, two independent slots will be used.
ASMJIT_API Error add(const void* data, size_t size, size_t& dstOffset) noexcept;
//! Fills the destination with the content of this constant pool.
diff --git a/3rdparty/asmjit/src/asmjit/core/cpuinfo.cpp b/3rdparty/asmjit/src/asmjit/core/cpuinfo.cpp
index edc7d172227..7bf7407f005 100644
--- a/3rdparty/asmjit/src/asmjit/core/cpuinfo.cpp
+++ b/3rdparty/asmjit/src/asmjit/core/cpuinfo.cpp
@@ -1,28 +1,11 @@
-// AsmJit - Machine code generation for C++
+// This file is part of AsmJit project <https://asmjit.com>
//
-// * Official AsmJit Home Page: https://asmjit.com
-// * Official Github Repository: https://github.com/asmjit/asmjit
-//
-// Copyright (c) 2008-2020 The AsmJit Authors
-//
-// This software is provided 'as-is', without any express or implied
-// warranty. In no event will the authors be held liable for any damages
-// arising from the use of this software.
-//
-// Permission is granted to anyone to use this software for any purpose,
-// including commercial applications, and to alter it and redistribute it
-// freely, subject to the following restrictions:
-//
-// 1. The origin of this software must not be misrepresented; you must not
-// claim that you wrote the original software. If you use this software
-// in a product, an acknowledgment in the product documentation would be
-// appreciated but is not required.
-// 2. Altered source versions must be plainly marked as such, and must not be
-// misrepresented as being the original software.
-// 3. This notice may not be removed or altered from any source distribution.
+// See asmjit.h or LICENSE.md for license and copyright information
+// SPDX-License-Identifier: Zlib
#include "../core/api-build_p.h"
#include "../core/cpuinfo.h"
+#include "../core/support.h"
#if !defined(_WIN32)
#include <errno.h>
@@ -30,11 +13,27 @@
#include <unistd.h>
#endif
+// Required by `getauxval()` on Linux.
+#if defined(__linux__)
+ #include <sys/auxv.h>
+#endif
+
+//! Required to detect CPU and features on Apple platforms.
+#if defined(__APPLE__)
+ #include <mach/machine.h>
+ #include <sys/types.h>
+ #include <sys/sysctl.h>
+#endif
+
+// Required by `__cpuidex()` and `_xgetbv()`.
+#if defined(_MSC_VER)
+ #include <intrin.h>
+#endif
+
ASMJIT_BEGIN_NAMESPACE
-// ============================================================================
-// [asmjit::CpuInfo - Detect - CPU NumThreads]
-// ============================================================================
+// CpuInfo - Detect - HW-Thread Count
+// ==================================
#if defined(_WIN32)
static inline uint32_t detectHWThreadCount() noexcept {
@@ -53,37 +52,1103 @@ static inline uint32_t detectHWThreadCount() noexcept {
}
#endif
-// ============================================================================
-// [asmjit::CpuInfo - Detect - CPU Features]
-// ============================================================================
+// CpuInfo - Detect - X86
+// ======================
+
+#if ASMJIT_ARCH_X86
+
+struct cpuid_t { uint32_t eax, ebx, ecx, edx; };
+struct xgetbv_t { uint32_t eax, edx; };
-#if defined(ASMJIT_BUILD_X86) && ASMJIT_ARCH_X86
-namespace x86 { void detectCpu(CpuInfo& cpu) noexcept; }
+// Executes `cpuid` instruction.
+static inline void cpuidQuery(cpuid_t* out, uint32_t inEax, uint32_t inEcx = 0) noexcept {
+#if defined(_MSC_VER)
+ __cpuidex(reinterpret_cast<int*>(out), inEax, inEcx);
+#elif defined(__GNUC__) && ASMJIT_ARCH_X86 == 32
+ __asm__ __volatile__(
+ "mov %%ebx, %%edi\n"
+ "cpuid\n"
+ "xchg %%edi, %%ebx\n" : "=a"(out->eax), "=D"(out->ebx), "=c"(out->ecx), "=d"(out->edx) : "a"(inEax), "c"(inEcx));
+#elif defined(__GNUC__) && ASMJIT_ARCH_X86 == 64
+ __asm__ __volatile__(
+ "mov %%rbx, %%rdi\n"
+ "cpuid\n"
+ "xchg %%rdi, %%rbx\n" : "=a"(out->eax), "=D"(out->ebx), "=c"(out->ecx), "=d"(out->edx) : "a"(inEax), "c"(inEcx));
+#else
+ #error "[asmjit] x86::cpuidQuery() - Unsupported compiler."
#endif
+}
-#if defined(ASMJIT_BUILD_ARM) && ASMJIT_ARCH_ARM
-namespace arm { void detectCpu(CpuInfo& cpu) noexcept; }
+// Executes 'xgetbv' instruction.
+static inline void xgetbvQuery(xgetbv_t* out, uint32_t inEcx) noexcept {
+#if defined(_MSC_VER)
+ uint64_t value = _xgetbv(inEcx);
+ out->eax = uint32_t(value & 0xFFFFFFFFu);
+ out->edx = uint32_t(value >> 32);
+#elif defined(__GNUC__)
+ uint32_t outEax;
+ uint32_t outEdx;
+
+ // Replaced, because the world is not perfect:
+ // __asm__ __volatile__("xgetbv" : "=a"(outEax), "=d"(outEdx) : "c"(inEcx));
+ __asm__ __volatile__(".byte 0x0F, 0x01, 0xD0" : "=a"(outEax), "=d"(outEdx) : "c"(inEcx));
+
+ out->eax = outEax;
+ out->edx = outEdx;
+#else
+ out->eax = 0;
+ out->edx = 0;
#endif
+}
+
+// Map a 12-byte vendor string returned by `cpuid` into a `CpuInfo::Vendor` ID.
+static inline void simplifyCpuVendor(CpuInfo& cpu, uint32_t d0, uint32_t d1, uint32_t d2) noexcept {
+ struct Vendor {
+ char normalized[8];
+ union { char text[12]; uint32_t d[3]; };
+ };
+
+ static const Vendor table[] = {
+ { { 'A', 'M', 'D' }, {{ 'A', 'u', 't', 'h', 'e', 'n', 't', 'i', 'c', 'A', 'M', 'D' }} },
+ { { 'I', 'N', 'T', 'E', 'L' }, {{ 'G', 'e', 'n', 'u', 'i', 'n', 'e', 'I', 'n', 't', 'e', 'l' }} },
+ { { 'V', 'I', 'A' }, {{ 'C', 'e', 'n', 't', 'a', 'u', 'r', 'H', 'a', 'u', 'l', 's' }} },
+ { { 'V', 'I', 'A' }, {{ 'V', 'I', 'A', 0 , 'V', 'I', 'A', 0 , 'V', 'I', 'A', 0 }} },
+ { { 'U', 'N', 'K', 'N', 'O', 'W', 'N' }, {{ 0 }} }
+ };
+
+ uint32_t i;
+ for (i = 0; i < ASMJIT_ARRAY_SIZE(table) - 1; i++)
+ if (table[i].d[0] == d0 && table[i].d[1] == d1 && table[i].d[2] == d2)
+ break;
+ memcpy(cpu._vendor.str, table[i].normalized, 8);
+}
+
+static ASMJIT_FAVOR_SIZE void simplifyCpuBrand(char* s) noexcept {
+ char* d = s;
+
+ char c = s[0];
+ char prev = 0;
+
+ // Used to always clear the current character to ensure that the result
+ // doesn't contain garbage after a new null terminator is placed at the end.
+ s[0] = '\0';
+
+ for (;;) {
+ if (!c)
+ break;
+
+ if (!(c == ' ' && (prev == '@' || s[1] == ' ' || s[1] == '@'))) {
+ *d++ = c;
+ prev = c;
+ }
+
+ c = *++s;
+ s[0] = '\0';
+ }
+
+ d[0] = '\0';
+}
+
+static ASMJIT_FAVOR_SIZE void detectX86Cpu(CpuInfo& cpu) noexcept {
+ using Support::bitTest;
+
+ cpuid_t regs;
+ xgetbv_t xcr0 { 0, 0 };
+ CpuFeatures::X86& features = cpu.features().x86();
+
+ cpu._wasDetected = true;
+ cpu._maxLogicalProcessors = 1;
+
+ // We are gonna execute CPUID, which was introduced by I486, so it's the requirement.
+ features.add(CpuFeatures::X86::kI486);
+
+ // CPUID EAX=0
+ // -----------
+
+ // Get vendor string/id.
+ cpuidQuery(&regs, 0x0);
+
+ uint32_t maxId = regs.eax;
+ uint32_t maxSubLeafId_0x7 = 0;
+
+ simplifyCpuVendor(cpu, regs.ebx, regs.edx, regs.ecx);
+
+ // CPUID EAX=1
+ // -----------
+
+ if (maxId >= 0x1) {
+ // Get feature flags in ECX/EDX and family/model in EAX.
+ cpuidQuery(&regs, 0x1);
+
+ // Fill family and model fields.
+ uint32_t modelId = (regs.eax >> 4) & 0x0F;
+ uint32_t familyId = (regs.eax >> 8) & 0x0F;
+
+ // Use extended family and model fields.
+ if (familyId == 0x06u || familyId == 0x0Fu)
+ modelId += (((regs.eax >> 16) & 0x0Fu) << 4);
+
+ if (familyId == 0x0Fu)
+ familyId += ((regs.eax >> 20) & 0xFFu);
+
+ cpu._modelId = modelId;
+ cpu._familyId = familyId;
+ cpu._brandId = ((regs.ebx ) & 0xFF);
+ cpu._processorType = ((regs.eax >> 12) & 0x03);
+ cpu._maxLogicalProcessors = ((regs.ebx >> 16) & 0xFF);
+ cpu._stepping = ((regs.eax ) & 0x0F);
+ cpu._cacheLineSize = ((regs.ebx >> 8) & 0xFF) * 8;
+
+ features.addIf(bitTest(regs.ecx, 0), CpuFeatures::X86::kSSE3);
+ features.addIf(bitTest(regs.ecx, 1), CpuFeatures::X86::kPCLMULQDQ);
+ features.addIf(bitTest(regs.ecx, 3), CpuFeatures::X86::kMONITOR);
+ features.addIf(bitTest(regs.ecx, 5), CpuFeatures::X86::kVMX);
+ features.addIf(bitTest(regs.ecx, 6), CpuFeatures::X86::kSMX);
+ features.addIf(bitTest(regs.ecx, 9), CpuFeatures::X86::kSSSE3);
+ features.addIf(bitTest(regs.ecx, 13), CpuFeatures::X86::kCMPXCHG16B);
+ features.addIf(bitTest(regs.ecx, 19), CpuFeatures::X86::kSSE4_1);
+ features.addIf(bitTest(regs.ecx, 20), CpuFeatures::X86::kSSE4_2);
+ features.addIf(bitTest(regs.ecx, 22), CpuFeatures::X86::kMOVBE);
+ features.addIf(bitTest(regs.ecx, 23), CpuFeatures::X86::kPOPCNT);
+ features.addIf(bitTest(regs.ecx, 25), CpuFeatures::X86::kAESNI);
+ features.addIf(bitTest(regs.ecx, 26), CpuFeatures::X86::kXSAVE);
+ features.addIf(bitTest(regs.ecx, 27), CpuFeatures::X86::kOSXSAVE);
+ features.addIf(bitTest(regs.ecx, 30), CpuFeatures::X86::kRDRAND);
+ features.addIf(bitTest(regs.edx, 0), CpuFeatures::X86::kFPU);
+ features.addIf(bitTest(regs.edx, 4), CpuFeatures::X86::kRDTSC);
+ features.addIf(bitTest(regs.edx, 5), CpuFeatures::X86::kMSR);
+ features.addIf(bitTest(regs.edx, 8), CpuFeatures::X86::kCMPXCHG8B);
+ features.addIf(bitTest(regs.edx, 15), CpuFeatures::X86::kCMOV);
+ features.addIf(bitTest(regs.edx, 19), CpuFeatures::X86::kCLFLUSH);
+ features.addIf(bitTest(regs.edx, 23), CpuFeatures::X86::kMMX);
+ features.addIf(bitTest(regs.edx, 24), CpuFeatures::X86::kFXSR);
+ features.addIf(bitTest(regs.edx, 25), CpuFeatures::X86::kSSE);
+ features.addIf(bitTest(regs.edx, 25), CpuFeatures::X86::kSSE, CpuFeatures::X86::kSSE2);
+ features.addIf(bitTest(regs.edx, 28), CpuFeatures::X86::kMT);
+
+ // Get the content of XCR0 if supported by the CPU and enabled by the OS.
+ if (features.hasXSAVE() && features.hasOSXSAVE()) {
+ xgetbvQuery(&xcr0, 0);
+ }
+
+ // Detect AVX+.
+ if (bitTest(regs.ecx, 28)) {
+ // - XCR0[2:1] == 11b
+ // XMM & YMM states need to be enabled by OS.
+ if ((xcr0.eax & 0x00000006u) == 0x00000006u) {
+ features.add(CpuFeatures::X86::kAVX);
+ features.addIf(bitTest(regs.ecx, 12), CpuFeatures::X86::kFMA);
+ features.addIf(bitTest(regs.ecx, 29), CpuFeatures::X86::kF16C);
+ }
+ }
+ }
+
+ constexpr uint32_t kXCR0_AMX_Bits = 0x3u << 17;
+ bool amxEnabledByOS = (xcr0.eax & kXCR0_AMX_Bits) == kXCR0_AMX_Bits;
+
+#if defined(__APPLE__)
+ // Apple platform provides on-demand AVX512 support. When an AVX512 instruction is used the first time it results
+ // in #UD, which would cause the thread being promoted to use AVX512 support by the OS in addition to enabling the
+ // necessary bits in XCR0 register.
+ bool avx512EnabledByOS = true;
+#else
+ // - XCR0[2:1] == 11b - XMM/YMM states need to be enabled by OS.
+ // - XCR0[7:5] == 111b - Upper 256-bit of ZMM0-XMM15 and ZMM16-ZMM31 need to be enabled by OS.
+ constexpr uint32_t kXCR0_AVX512_Bits = (0x3u << 1) | (0x7u << 5);
+ bool avx512EnabledByOS = (xcr0.eax & kXCR0_AVX512_Bits) == kXCR0_AVX512_Bits;
+#endif
+
+ // CPUID EAX=7 ECX=0
+ // -----------------
+
+ // Detect new features if the processor supports CPUID-07.
+ bool maybeMPX = false;
+
+ if (maxId >= 0x7) {
+ cpuidQuery(&regs, 0x7);
+
+ maybeMPX = bitTest(regs.ebx, 14);
+ maxSubLeafId_0x7 = regs.eax;
+
+ features.addIf(bitTest(regs.ebx, 0), CpuFeatures::X86::kFSGSBASE);
+ features.addIf(bitTest(regs.ebx, 3), CpuFeatures::X86::kBMI);
+ features.addIf(bitTest(regs.ebx, 4), CpuFeatures::X86::kHLE);
+ features.addIf(bitTest(regs.ebx, 7), CpuFeatures::X86::kSMEP);
+ features.addIf(bitTest(regs.ebx, 8), CpuFeatures::X86::kBMI2);
+ features.addIf(bitTest(regs.ebx, 9), CpuFeatures::X86::kERMS);
+ features.addIf(bitTest(regs.ebx, 11), CpuFeatures::X86::kRTM);
+ features.addIf(bitTest(regs.ebx, 18), CpuFeatures::X86::kRDSEED);
+ features.addIf(bitTest(regs.ebx, 19), CpuFeatures::X86::kADX);
+ features.addIf(bitTest(regs.ebx, 20), CpuFeatures::X86::kSMAP);
+ features.addIf(bitTest(regs.ebx, 23), CpuFeatures::X86::kCLFLUSHOPT);
+ features.addIf(bitTest(regs.ebx, 24), CpuFeatures::X86::kCLWB);
+ features.addIf(bitTest(regs.ebx, 29), CpuFeatures::X86::kSHA);
+ features.addIf(bitTest(regs.ecx, 0), CpuFeatures::X86::kPREFETCHWT1);
+ features.addIf(bitTest(regs.ecx, 4), CpuFeatures::X86::kOSPKE);
+ features.addIf(bitTest(regs.ecx, 5), CpuFeatures::X86::kWAITPKG);
+ features.addIf(bitTest(regs.ecx, 7), CpuFeatures::X86::kCET_SS);
+ features.addIf(bitTest(regs.ecx, 8), CpuFeatures::X86::kGFNI);
+ features.addIf(bitTest(regs.ecx, 9), CpuFeatures::X86::kVAES);
+ features.addIf(bitTest(regs.ecx, 10), CpuFeatures::X86::kVPCLMULQDQ);
+ features.addIf(bitTest(regs.ecx, 22), CpuFeatures::X86::kRDPID);
+ features.addIf(bitTest(regs.ecx, 25), CpuFeatures::X86::kCLDEMOTE);
+ features.addIf(bitTest(regs.ecx, 27), CpuFeatures::X86::kMOVDIRI);
+ features.addIf(bitTest(regs.ecx, 28), CpuFeatures::X86::kMOVDIR64B);
+ features.addIf(bitTest(regs.ecx, 29), CpuFeatures::X86::kENQCMD);
+ features.addIf(bitTest(regs.edx, 5), CpuFeatures::X86::kUINTR);
+ features.addIf(bitTest(regs.edx, 14), CpuFeatures::X86::kSERIALIZE);
+ features.addIf(bitTest(regs.edx, 16), CpuFeatures::X86::kTSXLDTRK);
+ features.addIf(bitTest(regs.edx, 18), CpuFeatures::X86::kPCONFIG);
+ features.addIf(bitTest(regs.edx, 20), CpuFeatures::X86::kCET_IBT);
+
+ // Detect 'TSX' - Requires at least one of `HLE` and `RTM` features.
+ if (features.hasHLE() || features.hasRTM())
+ features.add(CpuFeatures::X86::kTSX);
+
+ // Detect 'AVX2' - Requires AVX as well.
+ if (bitTest(regs.ebx, 5) && features.hasAVX())
+ features.add(CpuFeatures::X86::kAVX2);
+
+ // Detect 'AVX512'.
+ if (avx512EnabledByOS && bitTest(regs.ebx, 16)) {
+ features.add(CpuFeatures::X86::kAVX512_F);
+
+ features.addIf(bitTest(regs.ebx, 17), CpuFeatures::X86::kAVX512_DQ);
+ features.addIf(bitTest(regs.ebx, 21), CpuFeatures::X86::kAVX512_IFMA);
+ features.addIf(bitTest(regs.ebx, 26), CpuFeatures::X86::kAVX512_PFI);
+ features.addIf(bitTest(regs.ebx, 27), CpuFeatures::X86::kAVX512_ERI);
+ features.addIf(bitTest(regs.ebx, 28), CpuFeatures::X86::kAVX512_CDI);
+ features.addIf(bitTest(regs.ebx, 30), CpuFeatures::X86::kAVX512_BW);
+ features.addIf(bitTest(regs.ebx, 31), CpuFeatures::X86::kAVX512_VL);
+ features.addIf(bitTest(regs.ecx, 1), CpuFeatures::X86::kAVX512_VBMI);
+ features.addIf(bitTest(regs.ecx, 6), CpuFeatures::X86::kAVX512_VBMI2);
+ features.addIf(bitTest(regs.ecx, 11), CpuFeatures::X86::kAVX512_VNNI);
+ features.addIf(bitTest(regs.ecx, 12), CpuFeatures::X86::kAVX512_BITALG);
+ features.addIf(bitTest(regs.ecx, 14), CpuFeatures::X86::kAVX512_VPOPCNTDQ);
+ features.addIf(bitTest(regs.edx, 2), CpuFeatures::X86::kAVX512_4VNNIW);
+ features.addIf(bitTest(regs.edx, 3), CpuFeatures::X86::kAVX512_4FMAPS);
+ features.addIf(bitTest(regs.edx, 8), CpuFeatures::X86::kAVX512_VP2INTERSECT);
+ features.addIf(bitTest(regs.edx, 23), CpuFeatures::X86::kAVX512_FP16);
+ }
+
+ // Detect 'AMX'.
+ if (amxEnabledByOS) {
+ features.addIf(bitTest(regs.edx, 22), CpuFeatures::X86::kAMX_BF16);
+ features.addIf(bitTest(regs.edx, 24), CpuFeatures::X86::kAMX_TILE);
+ features.addIf(bitTest(regs.edx, 25), CpuFeatures::X86::kAMX_INT8);
+ }
+ }
+
+ // CPUID EAX=7 ECX=1
+ // -----------------
+
+ if (features.hasAVX512_F() && maxSubLeafId_0x7 >= 1) {
+ cpuidQuery(&regs, 0x7, 1);
+
+ features.addIf(bitTest(regs.eax, 3), CpuFeatures::X86::kAVX_VNNI);
+ features.addIf(bitTest(regs.eax, 5), CpuFeatures::X86::kAVX512_BF16);
+ features.addIf(bitTest(regs.eax, 22), CpuFeatures::X86::kHRESET);
+ }
+
+ // CPUID EAX=13 ECX=0
+ // ------------------
+
+ if (maxId >= 0xD) {
+ cpuidQuery(&regs, 0xD, 0);
+
+ // Both CPUID result and XCR0 has to be enabled to have support for MPX.
+ if (((regs.eax & xcr0.eax) & 0x00000018u) == 0x00000018u && maybeMPX)
+ features.add(CpuFeatures::X86::kMPX);
-// ============================================================================
-// [asmjit::CpuInfo - Detect - Static Initializer]
-// ============================================================================
+ cpuidQuery(&regs, 0xD, 1);
+
+ features.addIf(bitTest(regs.eax, 0), CpuFeatures::X86::kXSAVEOPT);
+ features.addIf(bitTest(regs.eax, 1), CpuFeatures::X86::kXSAVEC);
+ features.addIf(bitTest(regs.eax, 3), CpuFeatures::X86::kXSAVES);
+ }
+
+ // CPUID EAX=14 ECX=0
+ // ------------------
+
+ if (maxId >= 0xE) {
+ cpuidQuery(&regs, 0xE, 0);
+
+ features.addIf(bitTest(regs.ebx, 4), CpuFeatures::X86::kPTWRITE);
+ }
+
+ // CPUID EAX=0x80000000...maxId
+ // ----------------------------
+
+ maxId = 0x80000000u;
+ uint32_t i = maxId;
+
+ // The highest EAX that we understand.
+ constexpr uint32_t kHighestProcessedEAX = 0x8000001Fu;
+
+ // Several CPUID calls are required to get the whole branc string. It's easier
+ // to copy one DWORD at a time instead of copying the string a byte by byte.
+ uint32_t* brand = cpu._brand.u32;
+ do {
+ cpuidQuery(&regs, i);
+ switch (i) {
+ case 0x80000000u:
+ maxId = Support::min<uint32_t>(regs.eax, kHighestProcessedEAX);
+ break;
+
+ case 0x80000001u:
+ features.addIf(bitTest(regs.ecx, 0), CpuFeatures::X86::kLAHFSAHF);
+ features.addIf(bitTest(regs.ecx, 2), CpuFeatures::X86::kSVM);
+ features.addIf(bitTest(regs.ecx, 5), CpuFeatures::X86::kLZCNT);
+ features.addIf(bitTest(regs.ecx, 6), CpuFeatures::X86::kSSE4A);
+ features.addIf(bitTest(regs.ecx, 7), CpuFeatures::X86::kMSSE);
+ features.addIf(bitTest(regs.ecx, 8), CpuFeatures::X86::kPREFETCHW);
+ features.addIf(bitTest(regs.ecx, 12), CpuFeatures::X86::kSKINIT);
+ features.addIf(bitTest(regs.ecx, 15), CpuFeatures::X86::kLWP);
+ features.addIf(bitTest(regs.ecx, 21), CpuFeatures::X86::kTBM);
+ features.addIf(bitTest(regs.ecx, 29), CpuFeatures::X86::kMONITORX);
+ features.addIf(bitTest(regs.edx, 20), CpuFeatures::X86::kNX);
+ features.addIf(bitTest(regs.edx, 21), CpuFeatures::X86::kFXSROPT);
+ features.addIf(bitTest(regs.edx, 22), CpuFeatures::X86::kMMX2);
+ features.addIf(bitTest(regs.edx, 27), CpuFeatures::X86::kRDTSCP);
+ features.addIf(bitTest(regs.edx, 29), CpuFeatures::X86::kPREFETCHW);
+ features.addIf(bitTest(regs.edx, 30), CpuFeatures::X86::k3DNOW2, CpuFeatures::X86::kMMX2);
+ features.addIf(bitTest(regs.edx, 31), CpuFeatures::X86::kPREFETCHW);
+
+ if (features.hasAVX()) {
+ features.addIf(bitTest(regs.ecx, 11), CpuFeatures::X86::kXOP);
+ features.addIf(bitTest(regs.ecx, 16), CpuFeatures::X86::kFMA4);
+ }
+
+ // This feature seems to be only supported by AMD.
+ if (cpu.isVendor("AMD")) {
+ features.addIf(bitTest(regs.ecx, 4), CpuFeatures::X86::kALTMOVCR8);
+ }
+ break;
+
+ case 0x80000002u:
+ case 0x80000003u:
+ case 0x80000004u:
+ *brand++ = regs.eax;
+ *brand++ = regs.ebx;
+ *brand++ = regs.ecx;
+ *brand++ = regs.edx;
+
+ // Go directly to the next one we are interested in.
+ if (i == 0x80000004u)
+ i = 0x80000008u - 1;
+ break;
+
+ case 0x80000008u:
+ features.addIf(bitTest(regs.ebx, 0), CpuFeatures::X86::kCLZERO);
+ features.addIf(bitTest(regs.ebx, 0), CpuFeatures::X86::kRDPRU);
+ features.addIf(bitTest(regs.ebx, 8), CpuFeatures::X86::kMCOMMIT);
+ features.addIf(bitTest(regs.ebx, 9), CpuFeatures::X86::kWBNOINVD);
+
+ // Go directly to the next one we are interested in.
+ i = 0x8000001Fu - 1;
+ break;
+
+ case 0x8000001Fu:
+ features.addIf(bitTest(regs.eax, 4), CpuFeatures::X86::kSNP);
+ break;
+ }
+ } while (++i <= maxId);
+
+ // Simplify CPU brand string a bit by removing some unnecessary spaces.
+ simplifyCpuBrand(cpu._brand.str);
+}
+
+#endif // ASMJIT_ARCH_X86
+
+// CpuInfo - Detect - ARM
+// ======================
+
+// The most relevant and accurate information can be found here:
+// https://github.com/llvm-project/llvm/blob/master/lib/Target/AArch64/AArch64.td
+// https://github.com/apple/llvm-project/blob/apple/main/llvm/lib/Target/AArch64/AArch64.td (Apple fork)
+//
+// Other resources:
+// https://en.wikipedia.org/wiki/AArch64
+// https://en.wikipedia.org/wiki/Apple_silicon#List_of_Apple_processors
+// https://developer.arm.com/architectures/learn-the-architecture/understanding-the-armv8-x-extensions/single-page
+
+#if ASMJIT_ARCH_ARM
+
+static inline void populateBaseARMFeatures(CpuInfo& cpu) noexcept {
+#if ASMJIT_ARCH_ARM == 32
+ // No baseline flags at the moment.
+ DebugUtils::unused(cpu);
+#else
+ // AArch64 is based on ARMv8-A and later.
+ cpu.addFeature(CpuFeatures::ARM::kARMv6);
+ cpu.addFeature(CpuFeatures::ARM::kARMv7);
+ cpu.addFeature(CpuFeatures::ARM::kARMv8a);
+
+ // AArch64 comes with these features by default.
+ cpu.addFeature(CpuFeatures::ARM::kVFPv2);
+ cpu.addFeature(CpuFeatures::ARM::kVFPv3);
+ cpu.addFeature(CpuFeatures::ARM::kVFPv4);
+ cpu.addFeature(CpuFeatures::ARM::kASIMD);
+ cpu.addFeature(CpuFeatures::ARM::kIDIVA);
+#endif
+}
+
+// Detects ARM version by macros defined at compile time. This means that AsmJit will report features forced at
+// compile time that should always be provided by the target CPU. This also means that if we don't provide any
+// means to detect CPU features the features reported by AsmJit will at least not report less features than the
+// target it was compiled to.
+ASMJIT_MAYBE_UNUSED
+static ASMJIT_FAVOR_SIZE void detectARMFeaturesViaCompilerFlags(CpuInfo& cpu) noexcept {
+ DebugUtils::unused(cpu);
+
+#if ASMJIT_ARCH_ARM == 32
+
+ // ARM targets have no baseline at the moment.
+# if defined(__ARM_ARCH_7A__)
+ cpu.addFeature(CpuFeatures::ARM::kARMv7);
+# endif
+# if defined(__ARM_ARCH_8A__)
+ cpu.addFeature(CpuFeatures::ARM::kARMv8a);
+# endif
+
+# if defined(__TARGET_ARCH_THUMB)
+ cpu.addFeature(CpuFeatures::ARM::kTHUMB);
+# if __TARGET_ARCH_THUMB >= 4
+ cpu.addFeature(CpuFeatures::ARM::kTHUMBv2);
+# endif
+# endif
+
+# if defined(__ARM_FEATURE_FMA)
+ cpu.addFeature(CpuFeatures::ARM::kVFPv3);
+ cpu.addFeature(CpuFeatures::ARM::kVFPv4);
+# endif
+
+# if defined(__ARM_NEON)
+ cpu.addFeature(CpuFeatures::ARM::kASIMD);
+# endif
+
+# if defined(__ARM_FEATURE_IDIV) && defined(__TARGET_ARCH_THUMB)
+ cpu.addFeature(CpuFeatures::ARM::kIDIVT);
+#endif
+# if defined(__ARM_FEATURE_IDIV) && !defined(__TARGET_ARCH_THUMB)
+ cpu.addFeature(CpuFeatures::ARM::kIDIVA);
+# endif
+
+#endif
+
+#if defined(__ARM_ARCH_8_1A__)
+ cpu.addFeature(CpuFeatures::ARM::kARMv8_1a);
+#endif
+#if defined(__ARM_ARCH_8_2A__)
+ cpu.addFeature(CpuFeatures::ARM::kARMv8_2a);
+#endif
+#if defined(__ARM_ARCH_8_3A__)
+ cpu.addFeature(CpuFeatures::ARM::kARMv8_3a);
+#endif
+#if defined(__ARM_ARCH_8_4A__)
+ cpu.addFeature(CpuFeatures::ARM::kARMv8_4a);
+#endif
+#if defined(__ARM_ARCH_8_5A__)
+ cpu.addFeature(CpuFeatures::ARM::kARMv8_5a);
+#endif
+#if defined(__ARM_ARCH_8_6A__)
+ cpu.addFeature(CpuFeatures::ARM::kARMv8_6a);
+#endif
+#if defined(__ARM_ARCH_8_7A__)
+ cpu.addFeature(CpuFeatures::ARM::kARMv8_7a);
+#endif
+
+#if defined(__ARM_FEATURE_AES)
+ cpu.addFeature(CpuFeatures::ARM::kAES);
+#endif
+
+#if defined(__ARM_FEATURE_BF16_SCALAR_ARITHMETIC) && defined(__ARM_FEATURE_BF16_VECTOR_ARITHMETIC)
+ cpu.addFeature(CpuFeatures::ARM::kBF16);
+#endif
+
+#if defined(__ARM_FEATURE_CRC32)
+ cpu.addFeature(CpuFeatures::ARM::kCRC32);
+#endif
+
+#if defined(__ARM_FEATURE_CRYPTO)
+ cpu.addFeature(CpuFeatures::ARM::kAES,
+ CpuFeatures::ARM::kSHA1,
+ CpuFeatures::ARM::kSHA2);
+#endif
+
+#if defined(__ARM_FEATURE_DOTPROD)
+ cpu.addFeature(CpuFeatures::ARM::kDOTPROD);
+#endif
+
+#if defined(__ARM_FEATURE_FP16FML) || defined(__ARM_FEATURE_FP16_FML)
+ cpu.addFeature(CpuFeatures::ARM::kFP16FML);
+#endif
+
+#if defined(__ARM_FEATURE_FP16_SCALAR_ARITHMETIC)
+ cpu.addFeature(CpuFeatures::ARM::kFP16FULL);
+#endif
+
+#if defined(__ARM_FEATURE_FRINT)
+ cpu.addFeature(CpuFeatures::ARM::kFRINT);
+#endif
+
+#if defined(__ARM_FEATURE_JCVT)
+ cpu.addFeature(CpuFeatures::ARM::kFJCVTZS);
+#endif
+
+#if defined(__ARM_FEATURE_MATMUL_INT8)
+ cpu.addFeature(CpuFeatures::ARM::kI8MM);
+#endif
+
+#if defined(__ARM_FEATURE_ATOMICS)
+ cpu.addFeature(CpuFeatures::ARM::kLSE);
+#endif
+
+#if defined(__ARM_FEATURE_MEMORY_TAGGING)
+ cpu.addFeature(CpuFeatures::ARM::kMTE);
+#endif
+
+#if defined(__ARM_FEATURE_QRDMX)
+ cpu.addFeature(CpuFeatures::ARM::kRDM);
+#endif
+
+#if defined(__ARM_FEATURE_RNG)
+ cpu.addFeature(CpuFeatures::ARM::kRNG);
+#endif
+
+#if defined(__ARM_FEATURE_SHA2)
+ cpu.addFeature(CpuFeatures::ARM::kSHA2);
+#endif
+
+#if defined(__ARM_FEATURE_SHA3)
+ cpu.addFeature(CpuFeatures::ARM::kSHA3);
+#endif
+
+#if defined(__ARM_FEATURE_SHA512)
+ cpu.addFeature(CpuFeatures::ARM::kSHA512);
+#endif
+
+#if defined(__ARM_FEATURE_SM3)
+ cpu.addFeature(CpuFeatures::ARM::kSM3);
+#endif
+
+#if defined(__ARM_FEATURE_SM4)
+ cpu.addFeature(CpuFeatures::ARM::kSM4);
+#endif
+
+#if defined(__ARM_FEATURE_SVE) || defined(__ARM_FEATURE_SVE_VECTOR_OPERATORS)
+ cpu.addFeature(CpuFeatures::ARM::kSVE);
+#endif
+
+#if defined(__ARM_FEATURE_SVE_MATMUL_INT8)
+ cpu.addFeature(CpuFeatures::ARM::kSVE_I8MM);
+#endif
+
+#if defined(__ARM_FEATURE_SVE_MATMUL_FP32)
+ cpu.addFeature(CpuFeatures::ARM::kSVE_F32MM);
+#endif
+
+#if defined(__ARM_FEATURE_SVE_MATMUL_FP64)
+ cpu.addFeature(CpuFeatures::ARM::kSVE_F64MM);
+#endif
+
+#if defined(__ARM_FEATURE_SVE2)
+ cpu.addFeature(CpuFeatures::ARM::kSVE2);
+#endif
+
+#if defined(__ARM_FEATURE_SVE2_AES)
+ cpu.addFeature(CpuFeatures::ARM::kSVE2_AES);
+#endif
+
+#if defined(__ARM_FEATURE_SVE2_BITPERM)
+ cpu.addFeature(CpuFeatures::ARM::kSVE2_BITPERM);
+#endif
+
+#if defined(__ARM_FEATURE_SVE2_SHA3)
+ cpu.addFeature(CpuFeatures::ARM::kSVE2_SHA3);
+#endif
+
+#if defined(__ARM_FEATURE_SVE2_SM4)
+ cpu.addFeature(CpuFeatures::ARM::kSVE2_SM4);
+#endif
+
+#if defined(__ARM_FEATURE_TME)
+ cpu.addFeature(CpuFeatures::ARM::kTME);
+#endif
+}
+
+ASMJIT_MAYBE_UNUSED
+static ASMJIT_FAVOR_SIZE void expandARMFeaturesByVersion(CpuInfo& cpu) noexcept {
+ CpuFeatures::ARM& features = cpu.features().arm();
+
+ if (features.hasARMv8_7a()) {
+ features.add(CpuFeatures::ARM::kARMv8_6a);
+ }
+
+ if (features.hasARMv8_6a()) {
+ features.add(CpuFeatures::ARM::kARMv8_5a,
+ CpuFeatures::ARM::kBF16);
+
+ if (features.hasSVE())
+ features.add(CpuFeatures::ARM::kSVE_I8MM);
+ }
+
+ if (features.hasARMv8_5a()) {
+ features.add(CpuFeatures::ARM::kARMv8_4a,
+ CpuFeatures::ARM::kALTNZCV,
+ CpuFeatures::ARM::kBTI,
+ CpuFeatures::ARM::kFRINT,
+ CpuFeatures::ARM::kSB,
+ CpuFeatures::ARM::kSSBS);
+ }
+
+ if (features.hasARMv8_4a()) {
+ features.add(CpuFeatures::ARM::kARMv8_3a,
+ CpuFeatures::ARM::kDIT,
+ CpuFeatures::ARM::kDOTPROD,
+ CpuFeatures::ARM::kFLAGM,
+ CpuFeatures::ARM::kPMU,
+ CpuFeatures::ARM::kRCPC_IMMO);
+ }
+
+ if (features.hasARMv8_3a()) {
+ features.add(CpuFeatures::ARM::kARMv8_2a,
+ CpuFeatures::ARM::kFCMA,
+ CpuFeatures::ARM::kFJCVTZS);
+ }
+
+ if (features.hasARMv8_2a()) {
+ features.add(CpuFeatures::ARM::kARMv8_1a);
+ }
+
+ if (features.hasARMv8_1a()) {
+ features.add(CpuFeatures::ARM::kARMv8a,
+ CpuFeatures::ARM::kCRC32,
+ CpuFeatures::ARM::kLSE,
+ CpuFeatures::ARM::kRDM);
+ }
+
+ if (features.hasARMv8a()) {
+ features.add(CpuFeatures::ARM::kARMv7,
+ CpuFeatures::ARM::kVFPv2,
+ CpuFeatures::ARM::kVFPv3,
+ CpuFeatures::ARM::kVFPv4,
+ CpuFeatures::ARM::kVFP_D32,
+ CpuFeatures::ARM::kASIMD,
+ CpuFeatures::ARM::kIDIVA);
+ }
+}
+
+// CpuInfo - Detect - ARM [Windows]
+// ================================
+
+#if defined(_WIN32)
+struct WinPFPMapping {
+ uint8_t featureId;
+ uint8_t pfpFeatureId;
+};
+
+static ASMJIT_FAVOR_SIZE void detectPFPFeatures(CpuInfo& cpu, const WinPFPMapping* mapping, size_t size) noexcept {
+ for (size_t i = 0; i < size; i++)
+ if (::IsProcessorFeaturePresent(mapping[i].pfpFeatureId))
+ cpu.addFeature(mapping[i].featureId);
+}
+
+//! Detect ARM CPU features on Windows.
+//!
+//! The detection is based on `IsProcessorFeaturePresent()` API call.
+static ASMJIT_FAVOR_SIZE void detectARMCpu(CpuInfo& cpu) noexcept {
+ cpu._wasDetected = true;
+ populateBaseARMFeatures(cpu);
+
+ CpuFeatures::ARM& features = cpu.features().arm();
+
+ // Win32 for ARM requires ARMv7 with DSP extensions, VFPv3, and uses THUMBv2 by default.
+#if ASMJIT_ARCH_ARM == 32
+ features.add(CpuFeatures::ARM::kTHUMB);
+ features.add(CpuFeatures::ARM::kTHUMBv2);
+ features.add(CpuFeatures::ARM::kARMv6);
+ features.add(CpuFeatures::ARM::kARMv7);
+ features.add(CpuFeatures::ARM::kEDSP);
+ features.add(CpuFeatures::ARM::kVFPv2);
+ features.add(CpuFeatures::ARM::kVFPv3);
+#endif
+
+ // Windows for ARM requires ASIMD.
+ features.add(CpuFeatures::ARM::kASIMD);
+
+ // Detect additional CPU features by calling `IsProcessorFeaturePresent()`.
+ static const WinPFPMapping mapping[] = {
+#if ASMJIT_ARCH_ARM == 32
+ { uint8_t(CpuFeatures::ARM::kVFP_D32) , 18 }, // PF_ARM_VFP_32_REGISTERS_AVAILABLE
+ { uint8_t(CpuFeatures::ARM::kIDIVT) , 24 }, // PF_ARM_DIVIDE_INSTRUCTION_AVAILABLE
+ { uint8_t(CpuFeatures::ARM::kVFPv4) , 27 }, // PF_ARM_FMAC_INSTRUCTIONS_AVAILABLE
+ { uint8_t(CpuFeatures::ARM::kARMv8a) , 29 }, // PF_ARM_V8_INSTRUCTIONS_AVAILABLE
+#endif
+ { uint8_t(CpuFeatures::ARM::kAES) , 30 }, // PF_ARM_V8_CRYPTO_INSTRUCTIONS_AVAILABLE
+ { uint8_t(CpuFeatures::ARM::kCRC32) , 31 }, // PF_ARM_V8_CRC32_INSTRUCTIONS_AVAILABLE
+ { uint8_t(CpuFeatures::ARM::kLSE) , 34 } // PF_ARM_V81_ATOMIC_INSTRUCTIONS_AVAILABLE
+
+ };
+ detectPFPFeatures(cpu, mapping, ASMJIT_ARRAY_SIZE(mapping));
+
+ // Windows provides several instructions under a single flag:
+ if (features.hasAES()) {
+ features.add(CpuFeatures::ARM::kSHA1,
+ CpuFeatures::ARM::kSHA2);
+ }
+
+ expandARMFeaturesByVersion(cpu);
+}
+
+// CpuInfo - Detect - ARM [Linux]
+// ==============================
+
+#elif defined(__linux__)
+
+struct LinuxHWCapMapping {
+ uint8_t featureId;
+ uint8_t hwCapBit;
+};
+
+static ASMJIT_FAVOR_SIZE void detectHWCaps(CpuInfo& cpu, unsigned long type, const LinuxHWCapMapping* mapping, size_t size) noexcept {
+ unsigned long mask = getauxval(type);
+ for (size_t i = 0; i < size; i++)
+ cpu.features().addIf(Support::bitTest(mask, mapping[i].hwCapBit), mapping[i].featureId);
+}
+
+#if ASMJIT_ARCH_ARM == 32
+
+// `AT_HWCAP` provides ARMv7 (and less) related flags.
+static const LinuxHWCapMapping hwCapMapping[] = {
+ { uint8_t(CpuFeatures::ARM::kVFPv2) , 6 }, // HWCAP_VFP
+ { uint8_t(CpuFeatures::ARM::kEDSP) , 7 }, // HWCAP_EDSP
+ { uint8_t(CpuFeatures::ARM::kASIMD) , 12 }, // HWCAP_NEON
+ { uint8_t(CpuFeatures::ARM::kVFPv3) , 13 }, // HWCAP_VFPv3
+ { uint8_t(CpuFeatures::ARM::kVFPv4) , 16 }, // HWCAP_VFPv4
+ { uint8_t(CpuFeatures::ARM::kIDIVA) , 17 }, // HWCAP_IDIVA
+ { uint8_t(CpuFeatures::ARM::kIDIVT) , 18 }, // HWCAP_IDIVT
+ { uint8_t(CpuFeatures::ARM::kVFP_D32) , 19 } // HWCAP_VFPD32
+};
+
+// `AT_HWCAP2` provides ARMv8+ related flags.
+static const LinuxHWCapMapping hwCap2Mapping[] = {
+ { uint8_t(CpuFeatures::ARM::kAES) , 0 }, // HWCAP2_AES
+ { uint8_t(CpuFeatures::ARM::kPMULL) , 1 }, // HWCAP2_PMULL
+ { uint8_t(CpuFeatures::ARM::kSHA1) , 2 }, // HWCAP2_SHA1
+ { uint8_t(CpuFeatures::ARM::kSHA2) , 3 }, // HWCAP2_SHA2
+ { uint8_t(CpuFeatures::ARM::kCRC32) , 4 } // HWCAP2_CRC32
+};
+
+static ASMJIT_FAVOR_SIZE void detectARMCpu(CpuInfo& cpu) noexcept {
+ cpu._wasDetected = true;
+
+ populateBaseARMFeatures(cpu);
+
+ CpuFeatures::ARM& features = cpu.features().arm();
+
+ detectHWCaps(cpu, AT_HWCAP, hwCapMapping, ASMJIT_ARRAY_SIZE(hwCapMapping));
+ detectHWCaps(cpu, AT_HWCAP2, hwCap2Mapping, ASMJIT_ARRAY_SIZE(hwCap2Mapping));
+
+ // VFPv3 implies VFPv2.
+ if (features.hasVFPv3())
+ features.add(CpuFeatures::ARM::kVFPv2);
+
+ // VFPv2 implies ARMv6.
+ if (features.hasVFPv2())
+ features.add(CpuFeatures::ARM::kARMv6);
+
+ // ARMv7 provides VFPv3|ASIMD.
+ if (features.hasVFPv3() || features.hasASIMD())
+ features.add(CpuFeatures::ARM::kARMv7);
+
+ // ARMv8 provives AES, CRC32, PMULL, SHA1, and SHA2.
+ if (features.hasAES() || features.hasCRC32() || features.hasPMULL() || features.hasSHA1() || features.hasSHA2())
+ features.add(CpuFeatures::ARM::kARMv8a);
+}
+
+#else
+
+// `AT_HWCAP` provides ARMv8+ related flags.
+static const LinuxHWCapMapping hwCapMapping[] = {
+ /*
+ { uint8_t(CpuFeatures::ARM::k) , 0 }, // HWCAP_FP
+ */
+ { uint8_t(CpuFeatures::ARM::kASIMD) , 1 }, // HWCAP_ASIMD
+ /*
+ { uint8_t(CpuFeatures::ARM::k) , 2 }, // HWCAP_EVTSTRM
+ */
+ { uint8_t(CpuFeatures::ARM::kAES) , 3 }, // HWCAP_AES
+ { uint8_t(CpuFeatures::ARM::kPMULL) , 4 }, // HWCAP_PMULL
+ { uint8_t(CpuFeatures::ARM::kSHA1) , 5 }, // HWCAP_SHA1
+ { uint8_t(CpuFeatures::ARM::kSHA2) , 6 }, // HWCAP_SHA2
+ { uint8_t(CpuFeatures::ARM::kCRC32) , 7 }, // HWCAP_CRC32
+ { uint8_t(CpuFeatures::ARM::kLSE) , 8 }, // HWCAP_ATOMICS
+ { uint8_t(CpuFeatures::ARM::kFP16CONV) , 9 }, // HWCAP_FPHP
+ { uint8_t(CpuFeatures::ARM::kFP16FULL) , 10 }, // HWCAP_ASIMDHP
+ { uint8_t(CpuFeatures::ARM::kCPUID) , 11 }, // HWCAP_CPUID
+ { uint8_t(CpuFeatures::ARM::kRDM) , 12 }, // HWCAP_ASIMDRDM
+ { uint8_t(CpuFeatures::ARM::kFJCVTZS) , 13 }, // HWCAP_JSCVT
+ { uint8_t(CpuFeatures::ARM::kFCMA) , 14 }, // HWCAP_FCMA
+ /*
+ { uint8_t(CpuFeatures::ARM::k) , 15 }, // HWCAP_LRCPC
+ { uint8_t(CpuFeatures::ARM::k) , 16 }, // HWCAP_DCPOP
+ */
+ { uint8_t(CpuFeatures::ARM::kSHA3) , 17 }, // HWCAP_SHA3
+ { uint8_t(CpuFeatures::ARM::kSM3) , 18 }, // HWCAP_SM3
+ { uint8_t(CpuFeatures::ARM::kSM4) , 19 }, // HWCAP_SM4
+ { uint8_t(CpuFeatures::ARM::kDOTPROD) , 20 }, // HWCAP_ASIMDDP
+ { uint8_t(CpuFeatures::ARM::kSHA512) , 21 }, // HWCAP_SHA512
+ { uint8_t(CpuFeatures::ARM::kSVE) , 22 }, // HWCAP_SVE
+ { uint8_t(CpuFeatures::ARM::kFP16FML) , 23 }, // HWCAP_ASIMDFHM
+ { uint8_t(CpuFeatures::ARM::kDIT) , 24 }, // HWCAP_DIT
+ /*
+ { uint8_t(CpuFeatures::ARM::k) , 25 }, // HWCAP_USCAT
+ { uint8_t(CpuFeatures::ARM::k) , 26 }, // HWCAP_ILRCPC
+ */
+ { uint8_t(CpuFeatures::ARM::kFLAGM) , 27 }, // HWCAP_FLAGM
+ { uint8_t(CpuFeatures::ARM::kSSBS) , 28 }, // HWCAP_SSBS
+ { uint8_t(CpuFeatures::ARM::kSB) , 29 } // HWCAP_SB
+ /*
+ { uint8_t(CpuFeatures::ARM::k) , 30 }, // HWCAP_PACA
+ { uint8_t(CpuFeatures::ARM::k) , 31 } // HWCAP_PACG
+ */
+};
+
+// `AT_HWCAP2` provides ARMv8+ related flags.
+static const LinuxHWCapMapping hwCapMapping2[] = {
+ /*
+ { uint8_t(CpuFeatures::ARM::k) , 0 }, // HWCAP2_DCPODP
+ */
+ { uint8_t(CpuFeatures::ARM::kSVE2) , 1 }, // HWCAP2_SVE2
+ { uint8_t(CpuFeatures::ARM::kSVE2_AES) , 2 }, // HWCAP2_SVEAES
+ { uint8_t(CpuFeatures::ARM::kSVE_PMULL) , 3 }, // HWCAP2_SVEPMULL
+ { uint8_t(CpuFeatures::ARM::kSVE2_BITPERM), 4 }, // HWCAP2_SVEBITPERM
+ { uint8_t(CpuFeatures::ARM::kSVE2_SHA3) , 5 }, // HWCAP2_SVESHA3
+ { uint8_t(CpuFeatures::ARM::kSVE2_SM4) , 6 }, // HWCAP2_SVESM4
+ { uint8_t(CpuFeatures::ARM::kALTNZCV) , 7 }, // HWCAP2_FLAGM2
+ { uint8_t(CpuFeatures::ARM::kFRINT) , 8 }, // HWCAP2_FRINT
+ { uint8_t(CpuFeatures::ARM::kSVE_I8MM) , 9 }, // HWCAP2_SVEI8MM
+ { uint8_t(CpuFeatures::ARM::kSVE_F32MM) , 10 }, // HWCAP2_SVEF32MM
+ { uint8_t(CpuFeatures::ARM::kSVE_F64MM) , 11 }, // HWCAP2_SVEF64MM
+ { uint8_t(CpuFeatures::ARM::kSVE_BF16) , 12 }, // HWCAP2_SVEBF16
+ { uint8_t(CpuFeatures::ARM::kI8MM) , 13 }, // HWCAP2_I8MM
+ { uint8_t(CpuFeatures::ARM::kBF16) , 14 }, // HWCAP2_BF16
+ { uint8_t(CpuFeatures::ARM::kDGH) , 15 }, // HWCAP2_DGH
+ { uint8_t(CpuFeatures::ARM::kRNG) , 16 }, // HWCAP2_RNG
+ { uint8_t(CpuFeatures::ARM::kBTI) , 17 }, // HWCAP2_BTI
+ { uint8_t(CpuFeatures::ARM::kMTE) , 18 } // HWCAP2_MTE
+};
+
+static ASMJIT_FAVOR_SIZE void detectARMCpu(CpuInfo& cpu) noexcept {
+ cpu._wasDetected = true;
+ populateBaseARMFeatures(cpu);
+
+ detectHWCaps(cpu, AT_HWCAP, hwCapMapping, ASMJIT_ARRAY_SIZE(hwCapMapping));
+ detectHWCaps(cpu, AT_HWCAP2, hwCapMapping2, ASMJIT_ARRAY_SIZE(hwCapMapping2));
+}
+
+#endif
+
+// CpuInfo - Detect - ARM [Apple]
+// ==============================
+
+#elif defined(__APPLE__)
+
+namespace AppleHWId {
+ enum CpuFamily : uint32_t {
+ // Generic ARM.
+ kCpuFamily_ARM_9 = 0xE73283AEu,
+ kCpuFamily_ARM_11 = 0x8FF620D8u,
+ kCpuFamily_ARM_12 = 0xBD1B0AE9u,
+ kCpuFamily_ARM_13 = 0x0CC90E64u,
+ kCpuFamily_ARM_14 = 0x96077EF1u,
+ kCpuFamily_ARM_15 = 0xA8511BCAu,
+
+ // Apple design.
+ kCpuFamily_SWIFT = 0x1E2D6381u,
+ kCpuFamily_CYCLONE = 0x37A09642u,
+ kCpuFamily_TYPHOON = 0x2C91A47Eu,
+ kCpuFamily_TWISTER = 0x92FB37C8u,
+ kCpuFamily_HURRICANE = 0x67CEEE93u,
+ kCpuFamily_MONSOON_MISTRAL = 0xE81E7EF6u,
+ kCpuFamily_VORTEX_TEMPEST = 0x07D34B9Fu,
+ kCpuFamily_LIGHTNING_THUNDER = 0x462504D2u,
+ kCpuFamily_FIRESTORM_ICESTORM = 0x1B588BB3u
+ };
+};
+
+static ASMJIT_FAVOR_SIZE uint32_t queryARMCpuFamilyId() noexcept {
+ uint32_t result = 0;
+ size_t size = sizeof(result);
+
+ int res = sysctlbyname("hw.cpufamily", &result, &size, nullptr, 0);
+ if (res != 0)
+ return 0;
+ else
+ return result;
+}
+
+static ASMJIT_FAVOR_SIZE void detectARMCpu(CpuInfo& cpu) noexcept {
+ cpu._wasDetected = true;
+ populateBaseARMFeatures(cpu);
+
+ uint32_t cpuFamilyId = queryARMCpuFamilyId();
+ CpuFeatures::ARM& features = cpu.features().arm();
+
+ switch (cpuFamilyId) {
+ case AppleHWId::kCpuFamily_ARM_9:
+ case AppleHWId::kCpuFamily_ARM_11:
+ case AppleHWId::kCpuFamily_ARM_12:
+ break;
+
+ // ARM Cortex A8.
+ case AppleHWId::kCpuFamily_ARM_13:
+ break;
+
+ // ARM Cortex A9.
+ case AppleHWId::kCpuFamily_ARM_14:
+ break;
+
+ // ARM Cortex A7 - ARMv7k.
+ case AppleHWId::kCpuFamily_ARM_15:
+ features.add(CpuFeatures::ARM::kARMv7);
+ break;
+
+ // Apple A6/A6X - ARMv7s.
+ case AppleHWId::kCpuFamily_SWIFT:
+ features.add(CpuFeatures::ARM::kARMv7);
+ break;
+
+ // Apple A7 - ARMv8.0-A.
+ case AppleHWId::kCpuFamily_CYCLONE:
+ features.add(CpuFeatures::ARM::kARMv8a,
+ CpuFeatures::ARM::kAES,
+ CpuFeatures::ARM::kSHA1,
+ CpuFeatures::ARM::kSHA2);
+ break;
+
+ // Apple A8 - ARMv8.0-A.
+ case AppleHWId::kCpuFamily_TYPHOON:
+ features.add(CpuFeatures::ARM::kARMv8a,
+ CpuFeatures::ARM::kAES,
+ CpuFeatures::ARM::kSHA1,
+ CpuFeatures::ARM::kSHA2);
+ break;
+
+ // Apple A9 - ARMv8.0-A.
+ case AppleHWId::kCpuFamily_TWISTER:
+ features.add(CpuFeatures::ARM::kARMv8a,
+ CpuFeatures::ARM::kAES,
+ CpuFeatures::ARM::kSHA1,
+ CpuFeatures::ARM::kSHA2);
+ break;
+
+ // Apple A10 - ARMv8.1-A.
+ case AppleHWId::kCpuFamily_HURRICANE:
+ features.add(CpuFeatures::ARM::kARMv8_1a,
+ CpuFeatures::ARM::kAES,
+ CpuFeatures::ARM::kRDM,
+ CpuFeatures::ARM::kSHA1,
+ CpuFeatures::ARM::kSHA2);
+
+ break;
+
+ // Apple A11 - ARMv8.2-A.
+ case AppleHWId::kCpuFamily_MONSOON_MISTRAL:
+ features.add(CpuFeatures::ARM::kARMv8_2a,
+ CpuFeatures::ARM::kAES,
+ CpuFeatures::ARM::kFP16FULL,
+ CpuFeatures::ARM::kSHA1,
+ CpuFeatures::ARM::kSHA2);
+ break;
+
+ // Apple A12 - ARMv8.3-A.
+ case AppleHWId::kCpuFamily_VORTEX_TEMPEST:
+ features.add(CpuFeatures::ARM::kARMv8_3a,
+ CpuFeatures::ARM::kAES,
+ CpuFeatures::ARM::kFP16FULL,
+ CpuFeatures::ARM::kSHA1,
+ CpuFeatures::ARM::kSHA2);
+ break;
+
+ // Apple A13 - ARMv8.4-A.
+ case AppleHWId::kCpuFamily_LIGHTNING_THUNDER:
+ features.add(CpuFeatures::ARM::kARMv8_4a,
+ CpuFeatures::ARM::kAES,
+ CpuFeatures::ARM::kFP16FML,
+ CpuFeatures::ARM::kFP16FULL,
+ CpuFeatures::ARM::kSHA1,
+ CpuFeatures::ARM::kSHA2,
+ CpuFeatures::ARM::kSHA3,
+ CpuFeatures::ARM::kSHA512);
+ break;
+
+ // Apple A14/M1 - ARMv8.5-A.
+ case AppleHWId::kCpuFamily_FIRESTORM_ICESTORM:
+ features.add(CpuFeatures::ARM::kARMv8_4a,
+ CpuFeatures::ARM::kAES,
+ CpuFeatures::ARM::kALTNZCV,
+ CpuFeatures::ARM::kFP16FML,
+ CpuFeatures::ARM::kFP16FULL,
+ CpuFeatures::ARM::kFRINT,
+ CpuFeatures::ARM::kSB,
+ CpuFeatures::ARM::kSHA1,
+ CpuFeatures::ARM::kSHA2,
+ CpuFeatures::ARM::kSHA3,
+ CpuFeatures::ARM::kSHA512,
+ CpuFeatures::ARM::kSSBS);
+ break;
+
+ default:
+ cpu._wasDetected = false;
+ break;
+ }
+
+ expandARMFeaturesByVersion(cpu);
+}
+
+// CpuInfo - Detect - ARM [Unknown]
+// ================================
+
+#else
+
+#if ASMJIT_ARCH_ARM == 64
+ #pragma message("[asmjit] Disabling runtime CPU detection - unsupported OS/CPU combination (Unknown OS with AArch64 CPU)")
+#else
+ #pragma message("[asmjit] Disabling runtime CPU detection - unsupported OS/CPU combination (Unknown OS with ARM CPU)")
+#endif
+
+static ASMJIT_FAVOR_SIZE void detectARMCpu(CpuInfo& cpu) noexcept {
+ populateBaseARMFeatures(cpu);
+ detectARMFeaturesViaCompilerFlags(cpu);
+ expandARMFeaturesByVersion(cpu);
+}
+#endif
+
+#endif
+
+// CpuInfo - Detect - Host
+// =======================
static uint32_t cpuInfoInitialized;
static CpuInfo cpuInfoGlobal(Globals::NoInit);
const CpuInfo& CpuInfo::host() noexcept {
- // This should never cause a problem as the resulting information should
- // always be the same.
+ // This should never cause a problem as the resulting information should always be the same. In the worst case we
+ // would just overwrite it non-atomically.
if (!cpuInfoInitialized) {
CpuInfo cpuInfoLocal;
-#if defined(ASMJIT_BUILD_X86) && ASMJIT_ARCH_X86
- x86::detectCpu(cpuInfoLocal);
-#endif
+ cpuInfoLocal._arch = Arch::kHost;
+ cpuInfoLocal._subArch = SubArch::kHost;
-#if defined(ASMJIT_BUILD_ARM) && ASMJIT_ARCH_ARM
- arm::detectCpu(cpuInfoLocal);
+#if ASMJIT_ARCH_X86
+ detectX86Cpu(cpuInfoLocal);
+#elif ASMJIT_ARCH_ARM
+ detectARMCpu(cpuInfoLocal);
+#else
+ #pragma message("[asmjit] Disabling runtime CPU detection - unsupported OS/CPU combination (Unknown CPU)")
#endif
cpuInfoLocal._hwThreadCount = detectHWThreadCount();
diff --git a/3rdparty/asmjit/src/asmjit/core/cpuinfo.h b/3rdparty/asmjit/src/asmjit/core/cpuinfo.h
index ee2c9e5514a..4af5c3a82f9 100644
--- a/3rdparty/asmjit/src/asmjit/core/cpuinfo.h
+++ b/3rdparty/asmjit/src/asmjit/core/cpuinfo.h
@@ -1,52 +1,679 @@
-// AsmJit - Machine code generation for C++
+// This file is part of AsmJit project <https://asmjit.com>
//
-// * Official AsmJit Home Page: https://asmjit.com
-// * Official Github Repository: https://github.com/asmjit/asmjit
-//
-// Copyright (c) 2008-2020 The AsmJit Authors
-//
-// This software is provided 'as-is', without any express or implied
-// warranty. In no event will the authors be held liable for any damages
-// arising from the use of this software.
-//
-// Permission is granted to anyone to use this software for any purpose,
-// including commercial applications, and to alter it and redistribute it
-// freely, subject to the following restrictions:
-//
-// 1. The origin of this software must not be misrepresented; you must not
-// claim that you wrote the original software. If you use this software
-// in a product, an acknowledgment in the product documentation would be
-// appreciated but is not required.
-// 2. Altered source versions must be plainly marked as such, and must not be
-// misrepresented as being the original software.
-// 3. This notice may not be removed or altered from any source distribution.
+// See asmjit.h or LICENSE.md for license and copyright information
+// SPDX-License-Identifier: Zlib
#ifndef ASMJIT_CORE_CPUINFO_H_INCLUDED
#define ASMJIT_CORE_CPUINFO_H_INCLUDED
-#include "../core/arch.h"
-#include "../core/features.h"
+#include "../core/archtraits.h"
+#include "../core/environment.h"
#include "../core/globals.h"
#include "../core/string.h"
+#include "../core/support.h"
ASMJIT_BEGIN_NAMESPACE
//! \addtogroup asmjit_core
//! \{
-// ============================================================================
-// [asmjit::CpuInfo]
-// ============================================================================
+//! CPU features information.
+//!
+//! Each feature is represented by a single bit in an embedded bit array.
+class CpuFeatures {
+public:
+ //! A word that is used to represents feature bits.
+ typedef Support::BitWord BitWord;
+ //! Iterator that can iterate all CPU features set.
+ typedef Support::BitVectorIterator<BitWord> Iterator;
+
+ //! \name Constants
+ //! \{
+
+ //! \cond INTERNAL
+ enum : uint32_t {
+ kMaxFeatures = 256,
+ kNumBitWords = kMaxFeatures / Support::kBitWordSizeInBits
+ };
+ //! \endcond
+
+ //! \}
+
+ //! \name Data
+ //! \{
+
+ //! CPU features data.
+ struct Data {
+ //! \name Members
+ //! \{
+
+ //! Data bits.
+ Support::Array<BitWord, kNumBitWords> _bits;
+
+ //! \}
+
+ //! \name Overloaded Operators
+ //! \{
+
+ inline bool operator==(const Data& other) noexcept { return eq(other); }
+ inline bool operator!=(const Data& other) noexcept { return !eq(other); }
+
+ //! \}
+
+ //! \name Accessors
+ //! \{
+
+ //! Returns true if there are no features set.
+ inline bool empty() const noexcept { return _bits.aggregate<Support::Or>(0) == 0; }
+
+ //! Returns all features as array of bitwords (see \ref Support::BitWord).
+ inline BitWord* bits() noexcept { return _bits.data(); }
+ //! Returns all features as array of bitwords (const).
+ inline const BitWord* bits() const noexcept { return _bits.data(); }
+
+ //! Returns the number of BitWords returned by \ref bits().
+ inline size_t bitWordCount() const noexcept { return kNumBitWords; }
+
+ //! Returns \ref Support::BitVectorIterator, that can be used to iterate over all features efficiently.
+ inline Iterator iterator() const noexcept { return Iterator(_bits.data(), kNumBitWords); }
+
+ //! Tests whether the feature `featureId` is present.
+ template<typename FeatureId>
+ ASMJIT_FORCE_INLINE bool has(const FeatureId& featureId) const noexcept {
+ ASMJIT_ASSERT(uint32_t(featureId) < kMaxFeatures);
+
+ uint32_t idx = uint32_t(featureId) / Support::kBitWordSizeInBits;
+ uint32_t bit = uint32_t(featureId) % Support::kBitWordSizeInBits;
+
+ return bool((_bits[idx] >> bit) & 0x1);
+ }
+
+ //! Tests whether all features as defined by `other` are present.
+ ASMJIT_FORCE_INLINE bool hasAll(const Data& other) const noexcept {
+ for (uint32_t i = 0; i < kNumBitWords; i++)
+ if ((_bits[i] & other._bits[i]) != other._bits[i])
+ return false;
+ return true;
+ }
+
+ //! \}
+
+ //! \name Manipulation
+ //! \{
+
+ inline void reset() noexcept { _bits.fill(0); }
+
+ //! Adds the given CPU `featureId` to the list of features.
+ template<typename FeatureId>
+ ASMJIT_FORCE_INLINE void add(const FeatureId& featureId) noexcept {
+ ASMJIT_ASSERT(uint32_t(featureId) < kMaxFeatures);
+
+ uint32_t idx = uint32_t(featureId) / Support::kBitWordSizeInBits;
+ uint32_t bit = uint32_t(featureId) % Support::kBitWordSizeInBits;
+
+ _bits[idx] |= BitWord(1) << bit;
+ }
+
+ template<typename FeatureId, typename... Args>
+ ASMJIT_FORCE_INLINE void add(const FeatureId& featureId, Args&&... otherFeatureIds) noexcept {
+ add(featureId);
+ add(std::forward<Args>(otherFeatureIds)...);
+ }
+
+ template<typename FeatureId>
+ ASMJIT_FORCE_INLINE void addIf(bool condition, const FeatureId& featureId) noexcept {
+ ASMJIT_ASSERT(uint32_t(featureId) < kMaxFeatures);
+
+ uint32_t idx = uint32_t(featureId) / Support::kBitWordSizeInBits;
+ uint32_t bit = uint32_t(featureId) % Support::kBitWordSizeInBits;
+
+ _bits[idx] |= BitWord(condition) << bit;
+ }
+
+ template<typename FeatureId, typename... Args>
+ ASMJIT_FORCE_INLINE void addIf(bool condition, const FeatureId& featureId, Args&&... otherFeatureIds) noexcept {
+ addIf(condition, featureId);
+ addIf(condition, std::forward<Args>(otherFeatureIds)...);
+ }
+
+ //! Removes the given CPU `featureId` from the list of features.
+ template<typename FeatureId>
+ ASMJIT_FORCE_INLINE void remove(const FeatureId& featureId) noexcept {
+ ASMJIT_ASSERT(uint32_t(featureId) < kMaxFeatures);
+
+ uint32_t idx = uint32_t(featureId) / Support::kBitWordSizeInBits;
+ uint32_t bit = uint32_t(featureId) % Support::kBitWordSizeInBits;
+
+ _bits[idx] &= ~(BitWord(1) << bit);
+ }
+
+ template<typename FeatureId, typename... Args>
+ ASMJIT_FORCE_INLINE void remove(const FeatureId& featureId, Args&&... otherFeatureIds) noexcept {
+ remove(featureId);
+ remove(std::forward<Args>(otherFeatureIds)...);
+ }
+
+ //! Tests whether this CPU features data matches `other`.
+ ASMJIT_FORCE_INLINE bool eq(const Data& other) const noexcept { return _bits == other._bits; }
+
+ //! \}
+
+ };
+
+ //! X86 specific features data.
+ struct X86 : public Data {
+ //! X86 CPU feature identifiers.
+ enum Id : uint8_t {
+ // @EnumValuesBegin{"enum": "CpuFeatures::X86"}@
+ kNone, //!< No feature (never set, used internally).
+
+ kMT, //!< CPU has multi-threading capabilities.
+ kNX, //!< CPU has Not-Execute-Bit aka DEP (data-execution prevention).
+ k3DNOW, //!< CPU has 3DNOW (3DNOW base instructions) [AMD].
+ k3DNOW2, //!< CPU has 3DNOW2 (enhanced 3DNOW) [AMD].
+ kADX, //!< CPU has ADX (multi-precision add-carry instruction extensions).
+ kAESNI, //!< CPU has AESNI (AES encode/decode instructions).
+ kALTMOVCR8, //!< CPU has LOCK MOV R<->CR0 (supports `MOV R<->CR8` via `LOCK MOV R<->CR0` in 32-bit mode) [AMD].
+ kAMX_BF16, //!< CPU has AMX_BF16 (advanced matrix extensions - BF16 instructions).
+ kAMX_INT8, //!< CPU has AMX_INT8 (advanced matrix extensions - INT8 instructions).
+ kAMX_TILE, //!< CPU has AMX_TILE (advanced matrix extensions).
+ kAVX, //!< CPU has AVX (advanced vector extensions).
+ kAVX2, //!< CPU has AVX2 (advanced vector extensions 2).
+ kAVX512_4FMAPS, //!< CPU has AVX512_FMAPS (FMA packed single).
+ kAVX512_4VNNIW, //!< CPU has AVX512_VNNIW (vector NN instructions word variable precision).
+ kAVX512_BF16, //!< CPU has AVX512_BF16 (BFLOAT16 support instruction).
+ kAVX512_BITALG, //!< CPU has AVX512_BITALG (VPOPCNT[B|W], VPSHUFBITQMB).
+ kAVX512_BW, //!< CPU has AVX512_BW (packed BYTE|WORD).
+ kAVX512_CDI, //!< CPU has AVX512_CDI (conflict detection).
+ kAVX512_DQ, //!< CPU has AVX512_DQ (packed DWORD|QWORD).
+ kAVX512_ERI, //!< CPU has AVX512_ERI (exponential and reciprocal).
+ kAVX512_F, //!< CPU has AVX512_F (AVX512 foundation).
+ kAVX512_FP16, //!< CPU has AVX512_FP16 (FP16 extensions).
+ kAVX512_IFMA, //!< CPU has AVX512_IFMA (integer fused-multiply-add using 52-bit precision).
+ kAVX512_PFI, //!< CPU has AVX512_PFI (prefetch instructions).
+ kAVX512_VBMI, //!< CPU has AVX512_VBMI (vector byte manipulation).
+ kAVX512_VBMI2, //!< CPU has AVX512_VBMI2 (vector byte manipulation 2).
+ kAVX512_VL, //!< CPU has AVX512_VL (vector length extensions).
+ kAVX512_VNNI, //!< CPU has AVX512_VNNI (vector neural network instructions).
+ kAVX512_VP2INTERSECT, //!< CPU has AVX512_VP2INTERSECT
+ kAVX512_VPOPCNTDQ, //!< CPU has AVX512_VPOPCNTDQ (VPOPCNT[D|Q] instructions).
+ kAVX_VNNI, //!< CPU has AVX_VNNI (VEX encoding of vpdpbusd/vpdpbusds/vpdpwssd/vpdpwssds).
+ kBMI, //!< CPU has BMI (bit manipulation instructions #1).
+ kBMI2, //!< CPU has BMI2 (bit manipulation instructions #2).
+ kCET_IBT, //!< CPU has CET-IBT (indirect branch tracking).
+ kCET_SS, //!< CPU has CET-SS.
+ kCLDEMOTE, //!< CPU has CLDEMOTE (cache line demote).
+ kCLFLUSH, //!< CPU has CLFUSH (Cache Line flush).
+ kCLFLUSHOPT, //!< CPU has CLFUSHOPT (Cache Line flush - optimized).
+ kCLWB, //!< CPU has CLWB.
+ kCLZERO, //!< CPU has CLZERO.
+ kCMOV, //!< CPU has CMOV (CMOV and FCMOV instructions).
+ kCMPXCHG16B, //!< CPU has CMPXCHG16B (compare-exchange 16 bytes) [X86_64].
+ kCMPXCHG8B, //!< CPU has CMPXCHG8B (compare-exchange 8 bytes).
+ kENCLV, //!< CPU has ENCLV.
+ kENQCMD, //!< CPU has ENQCMD (enqueue stores).
+ kERMS, //!< CPU has ERMS (enhanced REP MOVSB/STOSB).
+ kF16C, //!< CPU has F16C.
+ kFMA, //!< CPU has FMA (fused-multiply-add 3 operand form).
+ kFMA4, //!< CPU has FMA4 (fused-multiply-add 4 operand form).
+ kFPU, //!< CPU has FPU (FPU support).
+ kFSGSBASE, //!< CPU has FSGSBASE.
+ kFXSR, //!< CPU has FXSR (FXSAVE/FXRSTOR instructions).
+ kFXSROPT, //!< CPU has FXSROTP (FXSAVE/FXRSTOR is optimized).
+ kGEODE, //!< CPU has GEODE extensions (3DNOW additions).
+ kGFNI, //!< CPU has GFNI (Galois field instructions).
+ kHLE, //!< CPU has HLE.
+ kHRESET, //!< CPU has HRESET.
+ kI486, //!< CPU has I486 features (I486+ support).
+ kLAHFSAHF, //!< CPU has LAHF/SAHF (LAHF/SAHF in 64-bit mode) [X86_64].
+ kLWP, //!< CPU has LWP (lightweight profiling) [AMD].
+ kLZCNT, //!< CPU has LZCNT (LZCNT instruction).
+ kMCOMMIT, //!< CPU has MCOMMIT (MCOMMIT instruction).
+ kMMX, //!< CPU has MMX (MMX base instructions).
+ kMMX2, //!< CPU has MMX2 (MMX extensions or MMX2).
+ kMONITOR, //!< CPU has MONITOR (MONITOR/MWAIT instructions).
+ kMONITORX, //!< CPU has MONITORX (MONITORX/MWAITX instructions).
+ kMOVBE, //!< CPU has MOVBE (move with byte-order swap).
+ kMOVDIR64B, //!< CPU has MOVDIR64B (move 64 bytes as direct store).
+ kMOVDIRI, //!< CPU has MOVDIRI (move dword/qword as direct store).
+ kMPX, //!< CPU has MPX (memory protection extensions).
+ kMSR, //!< CPU has MSR (RDMSR/WRMSR instructions).
+ kMSSE, //!< CPU has MSSE (misaligned SSE support).
+ kOSXSAVE, //!< CPU has OSXSAVE (XSAVE enabled by OS).
+ kOSPKE, //!< CPU has OSPKE (PKE enabled by OS).
+ kPCLMULQDQ, //!< CPU has PCLMULQDQ (packed carry-less multiplication).
+ kPCONFIG, //!< CPU has PCONFIG (PCONFIG instruction).
+ kPOPCNT, //!< CPU has POPCNT (POPCNT instruction).
+ kPREFETCHW, //!< CPU has PREFETCHW.
+ kPREFETCHWT1, //!< CPU has PREFETCHWT1.
+ kPTWRITE, //!< CPU has PTWRITE.
+ kRDPID, //!< CPU has RDPID.
+ kRDPRU, //!< CPU has RDPRU.
+ kRDRAND, //!< CPU has RDRAND.
+ kRDSEED, //!< CPU has RDSEED.
+ kRDTSC, //!< CPU has RDTSC.
+ kRDTSCP, //!< CPU has RDTSCP.
+ kRTM, //!< CPU has RTM.
+ kSERIALIZE, //!< CPU has SERIALIZE.
+ kSHA, //!< CPU has SHA (SHA-1 and SHA-256 instructions).
+ kSKINIT, //!< CPU has SKINIT (SKINIT/STGI instructions) [AMD].
+ kSMAP, //!< CPU has SMAP (supervisor-mode access prevention).
+ kSMEP, //!< CPU has SMEP (supervisor-mode execution prevention).
+ kSMX, //!< CPU has SMX (safer mode extensions).
+ kSNP, //!< CPU has SNP.
+ kSSE, //!< CPU has SSE.
+ kSSE2, //!< CPU has SSE2.
+ kSSE3, //!< CPU has SSE3.
+ kSSE4_1, //!< CPU has SSE4.1.
+ kSSE4_2, //!< CPU has SSE4.2.
+ kSSE4A, //!< CPU has SSE4A [AMD].
+ kSSSE3, //!< CPU has SSSE3.
+ kSVM, //!< CPU has SVM (virtualization) [AMD].
+ kTBM, //!< CPU has TBM (trailing bit manipulation) [AMD].
+ kTSX, //!< CPU has TSX.
+ kTSXLDTRK, //!< CPU has TSXLDTRK.
+ kUINTR, //!< CPU has UINTR (user interrupts).
+ kVAES, //!< CPU has VAES (vector AES 256|512 bit support).
+ kVMX, //!< CPU has VMX (virtualization) [INTEL].
+ kVPCLMULQDQ, //!< CPU has VPCLMULQDQ (vector PCLMULQDQ 256|512-bit support).
+ kWAITPKG, //!< CPU has WAITPKG (UMONITOR, UMWAIT, TPAUSE).
+ kWBNOINVD, //!< CPU has WBNOINVD.
+ kXOP, //!< CPU has XOP (XOP instructions) [AMD].
+ kXSAVE, //!< CPU has XSAVE.
+ kXSAVEC, //!< CPU has XSAVEC.
+ kXSAVEOPT, //!< CPU has XSAVEOPT.
+ kXSAVES, //!< CPU has XSAVES.
+ // @EnumValuesEnd@
+
+ kMaxValue = kXSAVES
+ };
+
+ #define ASMJIT_X86_FEATURE(FEATURE) \
+ inline bool has##FEATURE() const noexcept { return has(X86::k##FEATURE); }
+
+ ASMJIT_X86_FEATURE(MT)
+ ASMJIT_X86_FEATURE(NX)
+ ASMJIT_X86_FEATURE(3DNOW)
+ ASMJIT_X86_FEATURE(3DNOW2)
+ ASMJIT_X86_FEATURE(ADX)
+ ASMJIT_X86_FEATURE(AESNI)
+ ASMJIT_X86_FEATURE(ALTMOVCR8)
+ ASMJIT_X86_FEATURE(AMX_BF16)
+ ASMJIT_X86_FEATURE(AMX_INT8)
+ ASMJIT_X86_FEATURE(AMX_TILE)
+ ASMJIT_X86_FEATURE(AVX)
+ ASMJIT_X86_FEATURE(AVX2)
+ ASMJIT_X86_FEATURE(AVX512_4FMAPS)
+ ASMJIT_X86_FEATURE(AVX512_4VNNIW)
+ ASMJIT_X86_FEATURE(AVX512_BF16)
+ ASMJIT_X86_FEATURE(AVX512_BITALG)
+ ASMJIT_X86_FEATURE(AVX512_BW)
+ ASMJIT_X86_FEATURE(AVX512_CDI)
+ ASMJIT_X86_FEATURE(AVX512_DQ)
+ ASMJIT_X86_FEATURE(AVX512_ERI)
+ ASMJIT_X86_FEATURE(AVX512_F)
+ ASMJIT_X86_FEATURE(AVX512_FP16)
+ ASMJIT_X86_FEATURE(AVX512_IFMA)
+ ASMJIT_X86_FEATURE(AVX512_PFI)
+ ASMJIT_X86_FEATURE(AVX512_VBMI)
+ ASMJIT_X86_FEATURE(AVX512_VBMI2)
+ ASMJIT_X86_FEATURE(AVX512_VL)
+ ASMJIT_X86_FEATURE(AVX512_VNNI)
+ ASMJIT_X86_FEATURE(AVX512_VP2INTERSECT)
+ ASMJIT_X86_FEATURE(AVX512_VPOPCNTDQ)
+ ASMJIT_X86_FEATURE(AVX_VNNI)
+ ASMJIT_X86_FEATURE(BMI)
+ ASMJIT_X86_FEATURE(BMI2)
+ ASMJIT_X86_FEATURE(CET_IBT)
+ ASMJIT_X86_FEATURE(CET_SS)
+ ASMJIT_X86_FEATURE(CLDEMOTE)
+ ASMJIT_X86_FEATURE(CLFLUSH)
+ ASMJIT_X86_FEATURE(CLFLUSHOPT)
+ ASMJIT_X86_FEATURE(CLWB)
+ ASMJIT_X86_FEATURE(CLZERO)
+ ASMJIT_X86_FEATURE(CMOV)
+ ASMJIT_X86_FEATURE(CMPXCHG16B)
+ ASMJIT_X86_FEATURE(CMPXCHG8B)
+ ASMJIT_X86_FEATURE(ENCLV)
+ ASMJIT_X86_FEATURE(ENQCMD)
+ ASMJIT_X86_FEATURE(ERMS)
+ ASMJIT_X86_FEATURE(F16C)
+ ASMJIT_X86_FEATURE(FMA)
+ ASMJIT_X86_FEATURE(FMA4)
+ ASMJIT_X86_FEATURE(FPU)
+ ASMJIT_X86_FEATURE(FSGSBASE)
+ ASMJIT_X86_FEATURE(FXSR)
+ ASMJIT_X86_FEATURE(FXSROPT)
+ ASMJIT_X86_FEATURE(GEODE)
+ ASMJIT_X86_FEATURE(GFNI)
+ ASMJIT_X86_FEATURE(HLE)
+ ASMJIT_X86_FEATURE(HRESET)
+ ASMJIT_X86_FEATURE(I486)
+ ASMJIT_X86_FEATURE(LAHFSAHF)
+ ASMJIT_X86_FEATURE(LWP)
+ ASMJIT_X86_FEATURE(LZCNT)
+ ASMJIT_X86_FEATURE(MCOMMIT)
+ ASMJIT_X86_FEATURE(MMX)
+ ASMJIT_X86_FEATURE(MMX2)
+ ASMJIT_X86_FEATURE(MONITOR)
+ ASMJIT_X86_FEATURE(MONITORX)
+ ASMJIT_X86_FEATURE(MOVBE)
+ ASMJIT_X86_FEATURE(MOVDIR64B)
+ ASMJIT_X86_FEATURE(MOVDIRI)
+ ASMJIT_X86_FEATURE(MPX)
+ ASMJIT_X86_FEATURE(MSR)
+ ASMJIT_X86_FEATURE(MSSE)
+ ASMJIT_X86_FEATURE(OSXSAVE)
+ ASMJIT_X86_FEATURE(OSPKE)
+ ASMJIT_X86_FEATURE(PCLMULQDQ)
+ ASMJIT_X86_FEATURE(PCONFIG)
+ ASMJIT_X86_FEATURE(POPCNT)
+ ASMJIT_X86_FEATURE(PREFETCHW)
+ ASMJIT_X86_FEATURE(PREFETCHWT1)
+ ASMJIT_X86_FEATURE(PTWRITE)
+ ASMJIT_X86_FEATURE(RDPID)
+ ASMJIT_X86_FEATURE(RDPRU)
+ ASMJIT_X86_FEATURE(RDRAND)
+ ASMJIT_X86_FEATURE(RDSEED)
+ ASMJIT_X86_FEATURE(RDTSC)
+ ASMJIT_X86_FEATURE(RDTSCP)
+ ASMJIT_X86_FEATURE(RTM)
+ ASMJIT_X86_FEATURE(SERIALIZE)
+ ASMJIT_X86_FEATURE(SHA)
+ ASMJIT_X86_FEATURE(SKINIT)
+ ASMJIT_X86_FEATURE(SMAP)
+ ASMJIT_X86_FEATURE(SMEP)
+ ASMJIT_X86_FEATURE(SMX)
+ ASMJIT_X86_FEATURE(SNP)
+ ASMJIT_X86_FEATURE(SSE)
+ ASMJIT_X86_FEATURE(SSE2)
+ ASMJIT_X86_FEATURE(SSE3)
+ ASMJIT_X86_FEATURE(SSE4_1)
+ ASMJIT_X86_FEATURE(SSE4_2)
+ ASMJIT_X86_FEATURE(SSE4A)
+ ASMJIT_X86_FEATURE(SSSE3)
+ ASMJIT_X86_FEATURE(SVM)
+ ASMJIT_X86_FEATURE(TBM)
+ ASMJIT_X86_FEATURE(TSX)
+ ASMJIT_X86_FEATURE(TSXLDTRK)
+ ASMJIT_X86_FEATURE(UINTR)
+ ASMJIT_X86_FEATURE(VAES)
+ ASMJIT_X86_FEATURE(VMX)
+ ASMJIT_X86_FEATURE(VPCLMULQDQ)
+ ASMJIT_X86_FEATURE(WAITPKG)
+ ASMJIT_X86_FEATURE(WBNOINVD)
+ ASMJIT_X86_FEATURE(XOP)
+ ASMJIT_X86_FEATURE(XSAVE)
+ ASMJIT_X86_FEATURE(XSAVEC)
+ ASMJIT_X86_FEATURE(XSAVEOPT)
+ ASMJIT_X86_FEATURE(XSAVES)
+
+ #undef ASMJIT_X86_FEATURE
+ };
+
+ //! ARM specific features data.
+ struct ARM : public Data {
+ //! ARM CPU feature identifiers.
+ enum Id : uint8_t {
+ // @EnumValuesBegin{"enum": "CpuFeatures::ARM"}@
+ kNone = 0, //!< No feature (never set, used internally).
+ kTHUMB, //!< THUMB v1 ISA.
+ kTHUMBv2, //!< THUMB v2 ISA.
+
+ kARMv6, //!< ARMv6 ISA.
+ kARMv7, //!< ARMv7 ISA.
+ kARMv8a, //!< ARMv8-A ISA.
+ kARMv8_1a, //!< ARMv8.1-A ISA.
+ kARMv8_2a, //!< ARMv8.2-A ISA.
+ kARMv8_3a, //!< ARMv8.3-A ISA.
+ kARMv8_4a, //!< ARMv8.4-A ISA.
+ kARMv8_5a, //!< ARMv8.5-A ISA.
+ kARMv8_6a, //!< ARMv8.6-A ISA.
+ kARMv8_7a, //!< ARMv8.7-A ISA.
+
+ kVFPv2, //!< CPU has VFPv2 instruction set.
+ kVFPv3, //!< CPU has VFPv3 instruction set.
+ kVFPv4, //!< CPU has VFPv4 instruction set.
+ kVFP_D32, //!< CPU has 32 VFP-D (64-bit) registers.
+
+ kAES, //!< CPU has AES (AArch64 only).
+ kALTNZCV, //!< CPU has ALTNZCV (AArch64 only).
+ kASIMD, //!< CPU has Advanced SIMD (NEON on ARM/THUMB).
+ kBF16, //!< CPU has BF16 (AArch64 only).
+ kBTI, //!< CPU has BTI (branch target identification).
+ kCPUID, //!< CPU has accessible CPUID register (ID_AA64ZFR0_EL1).
+ kCRC32, //!< CPU has CRC32 .
+ kDGH, //!< CPU has DGH (AArch64 only).
+ kDIT, //!< CPU has data independent timing instructions (DIT).
+ kDOTPROD, //!< CPU has DOTPROD (SDOT/UDOT).
+ kEDSP, //!< CPU has EDSP (ARM/THUMB only).
+ kFCMA, //!< CPU has FCMA (FCADD/FCMLA).
+ kFJCVTZS, //!< CPU has FJCVTZS (AArch64 only).
+ kFLAGM, //!< CPU has FLAGM (AArch64 only).
+ kFP16CONV, //!< CPU has FP16 (half-float) conversion.
+ kFP16FML, //!< CPU has FMLAL{2}/FMLSL{2}
+ kFP16FULL, //!< CPU has full support for FP16.
+ kFRINT, //!< CPU has FRINT[32|64][X|Z] (AArch64 only).
+ kI8MM, //!< CPU has I8MM (AArch64 only).
+ kIDIVA, //!< CPU has hardware SDIV and UDIV (ARM mode).
+ kIDIVT, //!< CPU has hardware SDIV and UDIV (THUMB mode).
+ kLSE, //!< CPU has large system extensions (LSE) (AArch64 only).
+ kMTE, //!< CPU has MTE (AArch64 only).
+ kRCPC_IMMO, //!< CPU has RCPC_IMMO (AArch64 only).
+ kRDM, //!< CPU has RDM (AArch64 only).
+ kPMU, //!< CPU has PMU (AArch64 only).
+ kPMULL, //!< CPU has PMULL (AArch64 only).
+ kRNG, //!< CPU has random number generation (RNG).
+ kSB, //!< CPU has speculative barrier SB (AArch64 only).
+ kSHA1, //!< CPU has SHA1.
+ kSHA2, //!< CPU has SHA2.
+ kSHA3, //!< CPU has SHA3.
+ kSHA512, //!< CPU has SHA512.
+ kSM3, //!< CPU has SM3.
+ kSM4, //!< CPU has SM4.
+ kSSBS, //!< CPU has SSBS.
+ kSVE, //!< CPU has SVE (AArch64 only).
+ kSVE_BF16, //!< CPU has SVE-BF16 (AArch64 only).
+ kSVE_F32MM, //!< CPU has SVE-F32MM (AArch64 only).
+ kSVE_F64MM, //!< CPU has SVE-F64MM (AArch64 only).
+ kSVE_I8MM, //!< CPU has SVE-I8MM (AArch64 only).
+ kSVE_PMULL, //!< CPU has SVE-PMULL (AArch64 only).
+ kSVE2, //!< CPU has SVE2 (AArch64 only).
+ kSVE2_AES, //!< CPU has SVE2-AES (AArch64 only).
+ kSVE2_BITPERM, //!< CPU has SVE2-BITPERM (AArch64 only).
+ kSVE2_SHA3, //!< CPU has SVE2-SHA3 (AArch64 only).
+ kSVE2_SM4, //!< CPU has SVE2-SM4 (AArch64 only).
+ kTME, //!< CPU has transactional memory extensions (TME).
+ // @EnumValuesEnd@
+
+ kMaxValue = kTME
+ };
+
+ #define ASMJIT_ARM_FEATURE(FEATURE) \
+ inline bool has##FEATURE() const noexcept { return has(ARM::k##FEATURE); }
+
+ ASMJIT_ARM_FEATURE(THUMB)
+ ASMJIT_ARM_FEATURE(THUMBv2)
+
+ ASMJIT_ARM_FEATURE(ARMv6)
+ ASMJIT_ARM_FEATURE(ARMv7)
+ ASMJIT_ARM_FEATURE(ARMv8a)
+ ASMJIT_ARM_FEATURE(ARMv8_1a)
+ ASMJIT_ARM_FEATURE(ARMv8_2a)
+ ASMJIT_ARM_FEATURE(ARMv8_3a)
+ ASMJIT_ARM_FEATURE(ARMv8_4a)
+ ASMJIT_ARM_FEATURE(ARMv8_5a)
+ ASMJIT_ARM_FEATURE(ARMv8_6a)
+ ASMJIT_ARM_FEATURE(ARMv8_7a)
+
+ ASMJIT_ARM_FEATURE(VFPv2)
+ ASMJIT_ARM_FEATURE(VFPv3)
+ ASMJIT_ARM_FEATURE(VFPv4)
+ ASMJIT_ARM_FEATURE(VFP_D32)
+
+ ASMJIT_ARM_FEATURE(AES)
+ ASMJIT_ARM_FEATURE(ALTNZCV)
+ ASMJIT_ARM_FEATURE(ASIMD)
+ ASMJIT_ARM_FEATURE(BF16)
+ ASMJIT_ARM_FEATURE(BTI)
+ ASMJIT_ARM_FEATURE(CPUID)
+ ASMJIT_ARM_FEATURE(CRC32)
+ ASMJIT_ARM_FEATURE(DGH)
+ ASMJIT_ARM_FEATURE(DIT)
+ ASMJIT_ARM_FEATURE(DOTPROD)
+ ASMJIT_ARM_FEATURE(EDSP)
+ ASMJIT_ARM_FEATURE(FCMA)
+ ASMJIT_ARM_FEATURE(FLAGM)
+ ASMJIT_ARM_FEATURE(FP16CONV)
+ ASMJIT_ARM_FEATURE(FP16FML)
+ ASMJIT_ARM_FEATURE(FP16FULL)
+ ASMJIT_ARM_FEATURE(FRINT)
+ ASMJIT_ARM_FEATURE(IDIVA)
+ ASMJIT_ARM_FEATURE(IDIVT)
+ ASMJIT_ARM_FEATURE(LSE)
+ ASMJIT_ARM_FEATURE(MTE)
+ ASMJIT_ARM_FEATURE(FJCVTZS)
+ ASMJIT_ARM_FEATURE(I8MM)
+ ASMJIT_ARM_FEATURE(RCPC_IMMO)
+ ASMJIT_ARM_FEATURE(RDM)
+ ASMJIT_ARM_FEATURE(PMU)
+ ASMJIT_ARM_FEATURE(PMULL)
+ ASMJIT_ARM_FEATURE(RNG)
+ ASMJIT_ARM_FEATURE(SB)
+ ASMJIT_ARM_FEATURE(SHA1)
+ ASMJIT_ARM_FEATURE(SHA2)
+ ASMJIT_ARM_FEATURE(SHA3)
+ ASMJIT_ARM_FEATURE(SHA512)
+ ASMJIT_ARM_FEATURE(SM3)
+ ASMJIT_ARM_FEATURE(SM4)
+ ASMJIT_ARM_FEATURE(SSBS)
+ ASMJIT_ARM_FEATURE(SVE)
+ ASMJIT_ARM_FEATURE(SVE_BF16)
+ ASMJIT_ARM_FEATURE(SVE_F32MM)
+ ASMJIT_ARM_FEATURE(SVE_F64MM)
+ ASMJIT_ARM_FEATURE(SVE_I8MM)
+ ASMJIT_ARM_FEATURE(SVE_PMULL)
+ ASMJIT_ARM_FEATURE(SVE2)
+ ASMJIT_ARM_FEATURE(SVE2_AES)
+ ASMJIT_ARM_FEATURE(SVE2_BITPERM)
+ ASMJIT_ARM_FEATURE(SVE2_SHA3)
+ ASMJIT_ARM_FEATURE(SVE2_SM4)
+ ASMJIT_ARM_FEATURE(TME)
+
+ #undef ASMJIT_ARM_FEATURE
+ };
+
+ static_assert(uint32_t(X86::kMaxValue) < kMaxFeatures, "The number of X86 CPU features cannot exceed CpuFeatures::kMaxFeatures");
+ static_assert(uint32_t(ARM::kMaxValue) < kMaxFeatures, "The number of ARM CPU features cannot exceed CpuFeatures::kMaxFeatures");
+
+ //! \}
+
+ //! \name Members
+ //! \{
+
+ Data _data {};
+
+ //! \}
+
+ //! \name Construction & Destruction
+ //! \{
+
+ inline CpuFeatures() noexcept {}
+ inline CpuFeatures(const CpuFeatures& other) noexcept = default;
+ inline explicit CpuFeatures(Globals::NoInit_) noexcept {}
+
+ //! \}
+
+ //! \name Overloaded Operators
+ //! \{
+
+ inline CpuFeatures& operator=(const CpuFeatures& other) noexcept = default;
+
+ inline bool operator==(const CpuFeatures& other) noexcept { return eq(other); }
+ inline bool operator!=(const CpuFeatures& other) noexcept { return !eq(other); }
+
+ //! \}
+
+ //! \name Accessors
+ //! \{
+
+ //! Returns true if there are no features set.
+ inline bool empty() const noexcept { return _data.empty(); }
+
+ //! Casts this base class into a derived type `T`.
+ template<typename T = Data>
+ inline T& data() noexcept { return static_cast<T&>(_data); }
+
+ //! Casts this base class into a derived type `T` (const).
+ template<typename T = Data>
+ inline const T& data() const noexcept { return static_cast<const T&>(_data); }
+
+ //! Returns CpuFeatures::Data as \ref CpuFeatures::X86.
+ inline X86& x86() noexcept { return data<X86>(); }
+ //! Returns CpuFeatures::Data as \ref CpuFeatures::X86 (const).
+ inline const X86& x86() const noexcept { return data<X86>(); }
+
+ //! Returns CpuFeatures::Data as \ref CpuFeatures::ARM.
+ inline ARM& arm() noexcept { return data<ARM>(); }
+ //! Returns CpuFeatures::Data as \ref CpuFeatures::ARM (const).
+ inline const ARM& arm() const noexcept { return data<ARM>(); }
+
+ //! Returns all features as array of bitwords (see \ref Support::BitWord).
+ inline BitWord* bits() noexcept { return _data.bits(); }
+ //! Returns all features as array of bitwords (const).
+ inline const BitWord* bits() const noexcept { return _data.bits(); }
+ //! Returns the number of BitWords returned by \ref bits().
+ inline size_t bitWordCount() const noexcept { return _data.bitWordCount(); }
+
+ //! Returns \ref Support::BitVectorIterator, that can be used to iterate over all features efficiently.
+ inline Iterator iterator() const noexcept { return _data.iterator(); }
+
+ //! Tests whether the feature `featureId` is present.
+ template<typename FeatureId>
+ inline bool has(const FeatureId& featureId) const noexcept { return _data.has(featureId); }
+
+ //! Tests whether all features as defined by `other` are present.
+ inline bool hasAll(const CpuFeatures& other) const noexcept { return _data.hasAll(other._data); }
+
+ //! \}
+
+ //! \name Manipulation
+ //! \{
+
+ inline void reset() noexcept { _data.reset(); }
+
+ //! Adds the given CPU `featureId` to the list of features.
+ template<typename... Args>
+ inline void add(Args&&... args) noexcept { return _data.add(std::forward<Args>(args)...); }
+
+ //! Adds the given CPU `featureId` to the list of features if `condition` is true.
+ template<typename... Args>
+ inline void addIf(bool condition, Args&&... args) noexcept { return _data.addIf(condition, std::forward<Args>(args)...); }
+
+ //! Removes the given CPU `featureId` from the list of features.
+ template<typename... Args>
+ inline void remove(Args&&... args) noexcept { return _data.remove(std::forward<Args>(args)...); }
+
+ //! Tests whether this CPU features matches `other`.
+ inline bool eq(const CpuFeatures& other) const noexcept { return _data.eq(other._data); }
+
+ //! \}
+};
//! CPU information.
class CpuInfo {
public:
+ //! \name Members
+ //! \{
+
//! Architecture.
- uint8_t _arch;
+ Arch _arch;
//! Sub-architecture.
- uint8_t _subArch;
+ SubArch _subArch;
+ //! True if the CPU was detected, false if the detection failed or it's not available.
+ bool _wasDetected;
//! Reserved for future use.
- uint16_t _reserved;
+ uint8_t _reserved;
//! CPU family ID.
uint32_t _familyId;
//! CPU model ID.
@@ -69,7 +696,9 @@ public:
//! CPU brand string.
FixedString<64> _brand;
//! CPU features.
- BaseFeatures _features;
+ CpuFeatures _features;
+
+ //! \}
//! \name Construction & Destruction
//! \{
@@ -83,10 +712,10 @@ public:
//! Returns the host CPU information.
ASMJIT_API static const CpuInfo& host() noexcept;
- //! Initializes CpuInfo to the given architecture, see \ref Environment.
- inline void initArch(uint32_t arch, uint32_t subArch = 0u) noexcept {
- _arch = uint8_t(arch);
- _subArch = uint8_t(subArch);
+ //! Initializes CpuInfo architecture and sub-architecture members to `arch` and `subArch`, respectively.
+ inline void initArch(Arch arch, SubArch subArch = SubArch::kUnknown) noexcept {
+ _arch = arch;
+ _subArch = subArch;
}
inline void reset() noexcept { memset(this, 0, sizeof(*this)); }
@@ -103,46 +732,76 @@ public:
//! \name Accessors
//! \{
- //! Returns the CPU architecture id, see \ref Environment::Arch.
- inline uint32_t arch() const noexcept { return _arch; }
- //! Returns the CPU architecture sub-id, see \ref Environment::SubArch.
- inline uint32_t subArch() const noexcept { return _subArch; }
+ //! Returns the CPU architecture this information relates to.
+ inline Arch arch() const noexcept { return _arch; }
+
+ //! Returns the CPU sub-architecture this information relates to.
+ inline SubArch subArch() const noexcept { return _subArch; }
+
+ //! Returns whether the CPU was detected successfully.
+ //!
+ //! If the returned value is false it means that AsmJit either failed to detect the CPU or it doesn't have
+ //! implementation targeting the host architecture and operating system.
+ inline bool wasDetected() const noexcept { return _wasDetected; }
//! Returns the CPU family ID.
+ //!
+ //! Family identifier matches the FamilyId read by using CPUID on X86 architecture.
inline uint32_t familyId() const noexcept { return _familyId; }
+
//! Returns the CPU model ID.
+ //!
+ //! Family identifier matches the ModelId read by using CPUID on X86 architecture.
+
inline uint32_t modelId() const noexcept { return _modelId; }
//! Returns the CPU brand id.
+ //!
+ //! Family identifier matches the BrandId read by using CPUID on X86 architecture.
inline uint32_t brandId() const noexcept { return _brandId; }
+
//! Returns the CPU stepping.
+ //!
+ //! Family identifier matches the Stepping information read by using CPUID on X86 architecture.
inline uint32_t stepping() const noexcept { return _stepping; }
+
//! Returns the processor type.
+ //!
+ //! Family identifier matches the ProcessorType read by using CPUID on X86 architecture.
inline uint32_t processorType() const noexcept { return _processorType; }
- //! Returns the number of maximum logical processors.
+
+ //! Returns the maximum number of logical processors.
inline uint32_t maxLogicalProcessors() const noexcept { return _maxLogicalProcessors; }
//! Returns the size of a cache line flush.
inline uint32_t cacheLineSize() const noexcept { return _cacheLineSize; }
+
//! Returns number of hardware threads available.
inline uint32_t hwThreadCount() const noexcept { return _hwThreadCount; }
- //! Returns the CPU vendor.
+ //! Returns a CPU vendor string.
inline const char* vendor() const noexcept { return _vendor.str; }
- //! Tests whether the CPU vendor is equal to `s`.
+ //! Tests whether the CPU vendor string is equal to `s`.
inline bool isVendor(const char* s) const noexcept { return _vendor.eq(s); }
- //! Returns the CPU brand string.
+ //! Returns a CPU brand string.
inline const char* brand() const noexcept { return _brand.str; }
- //! Returns all CPU features as `BaseFeatures`, cast to your arch-specific class
- //! if needed.
- template<typename T = BaseFeatures>
- inline const T& features() const noexcept { return _features.as<T>(); }
+ //! Returns CPU features.
+ inline CpuFeatures& features() noexcept { return _features; }
+ //! Returns CPU features (const).
+ inline const CpuFeatures& features() const noexcept { return _features; }
//! Tests whether the CPU has the given `feature`.
- inline bool hasFeature(uint32_t featureId) const noexcept { return _features.has(featureId); }
- //! Adds the given CPU `feature` to the list of this CpuInfo features.
- inline CpuInfo& addFeature(uint32_t featureId) noexcept { _features.add(featureId); return *this; }
+ template<typename FeatureId>
+ inline bool hasFeature(const FeatureId& featureId) const noexcept { return _features.has(featureId); }
+
+ //! Adds the given CPU `featureId` to the list of features.
+ template<typename... Args>
+ inline void addFeature(Args&&... args) noexcept { return _features.add(std::forward<Args>(args)...); }
+
+ //! Removes the given CPU `featureId` from the list of features.
+ template<typename... Args>
+ inline void removeFeature(Args&&... args) noexcept { return _features.remove(std::forward<Args>(args)...); }
//! \}
};
diff --git a/3rdparty/asmjit/src/asmjit/core/datatypes.h b/3rdparty/asmjit/src/asmjit/core/datatypes.h
deleted file mode 100644
index 2f6cc1e5b42..00000000000
--- a/3rdparty/asmjit/src/asmjit/core/datatypes.h
+++ /dev/null
@@ -1,1071 +0,0 @@
-// AsmJit - Machine code generation for C++
-//
-// * Official AsmJit Home Page: https://asmjit.com
-// * Official Github Repository: https://github.com/asmjit/asmjit
-//
-// Copyright (c) 2008-2020 The AsmJit Authors
-//
-// This software is provided 'as-is', without any express or implied
-// warranty. In no event will the authors be held liable for any damages
-// arising from the use of this software.
-//
-// Permission is granted to anyone to use this software for any purpose,
-// including commercial applications, and to alter it and redistribute it
-// freely, subject to the following restrictions:
-//
-// 1. The origin of this software must not be misrepresented; you must not
-// claim that you wrote the original software. If you use this software
-// in a product, an acknowledgment in the product documentation would be
-// appreciated but is not required.
-// 2. Altered source versions must be plainly marked as such, and must not be
-// misrepresented as being the original software.
-// 3. This notice may not be removed or altered from any source distribution.
-
-#ifndef ASMJIT_CORE_DATATYPES_H_INCLUDED
-#define ASMJIT_CORE_DATATYPES_H_INCLUDED
-
-#include "../core/globals.h"
-
-#ifndef ASMJIT_NO_DEPRECATED
-
-ASMJIT_BEGIN_NAMESPACE
-
-// ============================================================================
-// [asmjit::Data64]
-// ============================================================================
-
-//! 64-bit data useful for creating SIMD constants.
-union ASMJIT_DEPRECATED_STRUCT("Data64 is deprecated and will be removed in the future") Data64 {
- //! Array of eight 8-bit signed integers.
- int8_t sb[8];
- //! Array of eight 8-bit unsigned integers.
- uint8_t ub[8];
- //! Array of four 16-bit signed integers.
- int16_t sw[4];
- //! Array of four 16-bit unsigned integers.
- uint16_t uw[4];
- //! Array of two 32-bit signed integers.
- int32_t sd[2];
- //! Array of two 32-bit unsigned integers.
- uint32_t ud[2];
- //! Array of one 64-bit signed integer.
- int64_t sq[1];
- //! Array of one 64-bit unsigned integer.
- uint64_t uq[1];
-
- //! Array of two SP-FP values.
- float sf[2];
- //! Array of one DP-FP value.
- double df[1];
-
- //! \name Construction & Destruction
- //! \{
-
- //! Sets all eight 8-bit signed integers.
- static inline Data64 fromI8(int8_t x0) noexcept {
- Data64 self;
- self.setI8(x0);
- return self;
- }
-
- //! Sets all eight 8-bit unsigned integers.
- static inline Data64 fromU8(uint8_t x0) noexcept {
- Data64 self;
- self.setU8(x0);
- return self;
- }
-
- //! Sets all eight 8-bit signed integers.
- static inline Data64 fromI8(
- int8_t x0, int8_t x1, int8_t x2, int8_t x3, int8_t x4, int8_t x5, int8_t x6, int8_t x7) noexcept {
-
- Data64 self;
- self.setI8(x0, x1, x2, x3, x4, x5, x6, x7);
- return self;
- }
-
- //! Sets all eight 8-bit unsigned integers.
- static inline Data64 fromU8(
- uint8_t x0, uint8_t x1, uint8_t x2, uint8_t x3, uint8_t x4, uint8_t x5, uint8_t x6, uint8_t x7) noexcept {
-
- Data64 self;
- self.setU8(x0, x1, x2, x3, x4, x5, x6, x7);
- return self;
- }
-
- //! Sets all four 16-bit signed integers.
- static inline Data64 fromI16(int16_t x0) noexcept {
- Data64 self;
- self.setI16(x0);
- return self;
- }
-
- //! Sets all four 16-bit unsigned integers.
- static inline Data64 fromU16(uint16_t x0) noexcept {
- Data64 self;
- self.setU16(x0);
- return self;
- }
-
- //! Sets all four 16-bit signed integers.
- static inline Data64 fromI16(int16_t x0, int16_t x1, int16_t x2, int16_t x3) noexcept {
- Data64 self;
- self.setI16(x0, x1, x2, x3);
- return self;
- }
-
- //! Sets all four 16-bit unsigned integers.
- static inline Data64 fromU16(uint16_t x0, uint16_t x1, uint16_t x2, uint16_t x3) noexcept {
- Data64 self;
- self.setU16(x0, x1, x2, x3);
- return self;
- }
-
- //! Sets all two 32-bit signed integers.
- static inline Data64 fromI32(int32_t x0) noexcept {
- Data64 self;
- self.setI32(x0);
- return self;
- }
-
- //! Sets all two 32-bit unsigned integers.
- static inline Data64 fromU32(uint32_t x0) noexcept {
- Data64 self;
- self.setU32(x0);
- return self;
- }
-
- //! Sets all two 32-bit signed integers.
- static inline Data64 fromI32(int32_t x0, int32_t x1) noexcept {
- Data64 self;
- self.setI32(x0, x1);
- return self;
- }
-
- //! Sets all two 32-bit unsigned integers.
- static inline Data64 fromU32(uint32_t x0, uint32_t x1) noexcept {
- Data64 self;
- self.setU32(x0, x1);
- return self;
- }
-
- //! Sets 64-bit signed integer.
- static inline Data64 fromI64(int64_t x0) noexcept {
- Data64 self;
- self.setI64(x0);
- return self;
- }
-
- //! Sets 64-bit unsigned integer.
- static inline Data64 fromU64(uint64_t x0) noexcept {
- Data64 self;
- self.setU64(x0);
- return self;
- }
-
- //! Sets all two SP-FP values.
- static inline Data64 fromF32(float x0) noexcept {
- Data64 self;
- self.setF32(x0);
- return self;
- }
-
- //! Sets all two SP-FP values.
- static inline Data64 fromF32(float x0, float x1) noexcept {
- Data64 self;
- self.setF32(x0, x1);
- return self;
- }
-
- //! Sets all two SP-FP values.
- static inline Data64 fromF64(double x0) noexcept {
- Data64 self;
- self.setF64(x0);
- return self;
- }
-
- //! \}
-
- //! \name Accessors
- //! \{
-
- //! Sets all eight 8-bit signed integers.
- inline void setI8(int8_t x0) noexcept {
- setU8(uint8_t(x0));
- }
-
- //! Sets all eight 8-bit unsigned integers.
- inline void setU8(uint8_t x0) noexcept {
- if (ASMJIT_ARCH_BITS >= 64) {
- uint64_t xq = uint64_t(x0) * 0x0101010101010101u;
- uq[0] = xq;
- }
- else {
- uint32_t xd = uint32_t(x0) * 0x01010101u;
- ud[0] = xd;
- ud[1] = xd;
- }
- }
-
- //! Sets all eight 8-bit signed integers.
- inline void setI8(
- int8_t x0, int8_t x1, int8_t x2, int8_t x3, int8_t x4, int8_t x5, int8_t x6, int8_t x7) noexcept {
-
- sb[0] = x0; sb[1] = x1; sb[2] = x2; sb[3] = x3;
- sb[4] = x4; sb[5] = x5; sb[6] = x6; sb[7] = x7;
- }
-
- //! Sets all eight 8-bit unsigned integers.
- inline void setU8(
- uint8_t x0, uint8_t x1, uint8_t x2, uint8_t x3, uint8_t x4, uint8_t x5, uint8_t x6, uint8_t x7) noexcept {
-
- ub[0] = x0; ub[1] = x1; ub[2] = x2; ub[3] = x3;
- ub[4] = x4; ub[5] = x5; ub[6] = x6; ub[7] = x7;
- }
-
- //! Sets all four 16-bit signed integers.
- inline void setI16(int16_t x0) noexcept {
- setU16(uint16_t(x0));
- }
-
- //! Sets all four 16-bit unsigned integers.
- inline void setU16(uint16_t x0) noexcept {
- if (ASMJIT_ARCH_BITS >= 64) {
- uint64_t xq = uint64_t(x0) * 0x0001000100010001u;
- uq[0] = xq;
- }
- else {
- uint32_t xd = uint32_t(x0) * 0x00010001u;
- ud[0] = xd;
- ud[1] = xd;
- }
- }
-
- //! Sets all four 16-bit signed integers.
- inline void setI16(int16_t x0, int16_t x1, int16_t x2, int16_t x3) noexcept {
- sw[0] = x0; sw[1] = x1; sw[2] = x2; sw[3] = x3;
- }
-
- //! Sets all four 16-bit unsigned integers.
- inline void setU16(uint16_t x0, uint16_t x1, uint16_t x2, uint16_t x3) noexcept {
- uw[0] = x0; uw[1] = x1; uw[2] = x2; uw[3] = x3;
- }
-
- //! Sets all two 32-bit signed integers.
- inline void setI32(int32_t x0) noexcept {
- sd[0] = x0; sd[1] = x0;
- }
-
- //! Sets all two 32-bit unsigned integers.
- inline void setU32(uint32_t x0) noexcept {
- ud[0] = x0; ud[1] = x0;
- }
-
- //! Sets all two 32-bit signed integers.
- inline void setI32(int32_t x0, int32_t x1) noexcept {
- sd[0] = x0; sd[1] = x1;
- }
-
- //! Sets all two 32-bit unsigned integers.
- inline void setU32(uint32_t x0, uint32_t x1) noexcept {
- ud[0] = x0; ud[1] = x1;
- }
-
- //! Sets 64-bit signed integer.
- inline void setI64(int64_t x0) noexcept {
- sq[0] = x0;
- }
-
- //! Sets 64-bit unsigned integer.
- inline void setU64(uint64_t x0) noexcept {
- uq[0] = x0;
- }
-
- //! Sets all two SP-FP values.
- inline void setF32(float x0) noexcept {
- sf[0] = x0; sf[1] = x0;
- }
-
- //! Sets all two SP-FP values.
- inline void setF32(float x0, float x1) noexcept {
- sf[0] = x0; sf[1] = x1;
- }
-
- //! Sets all two SP-FP values.
- inline void setF64(double x0) noexcept {
- df[0] = x0;
- }
-};
-
-// ============================================================================
-// [asmjit::Data128]
-// ============================================================================
-
-//! 128-bit data useful for creating SIMD constants.
-union ASMJIT_DEPRECATED_STRUCT("Data128 is deprecated and will be removed in the future") Data128 {
- //! Array of sixteen 8-bit signed integers.
- int8_t sb[16];
- //! Array of sixteen 8-bit unsigned integers.
- uint8_t ub[16];
- //! Array of eight 16-bit signed integers.
- int16_t sw[8];
- //! Array of eight 16-bit unsigned integers.
- uint16_t uw[8];
- //! Array of four 32-bit signed integers.
- int32_t sd[4];
- //! Array of four 32-bit unsigned integers.
- uint32_t ud[4];
- //! Array of two 64-bit signed integers.
- int64_t sq[2];
- //! Array of two 64-bit unsigned integers.
- uint64_t uq[2];
-
- //! Array of four 32-bit single precision floating points.
- float sf[4];
- //! Array of two 64-bit double precision floating points.
- double df[2];
-
- //! \name Construction & Destruction
- //! \{
-
- //! Sets all sixteen 8-bit signed integers.
- static inline Data128 fromI8(int8_t x0) noexcept {
- Data128 self;
- self.setI8(x0);
- return self;
- }
-
- //! Sets all sixteen 8-bit unsigned integers.
- static inline Data128 fromU8(uint8_t x0) noexcept {
- Data128 self;
- self.setU8(x0);
- return self;
- }
-
- //! Sets all sixteen 8-bit signed integers.
- static inline Data128 fromI8(
- int8_t x0 , int8_t x1 , int8_t x2 , int8_t x3 ,
- int8_t x4 , int8_t x5 , int8_t x6 , int8_t x7 ,
- int8_t x8 , int8_t x9 , int8_t x10, int8_t x11,
- int8_t x12, int8_t x13, int8_t x14, int8_t x15) noexcept {
-
- Data128 self;
- self.setI8(x0, x1, x2, x3, x4, x5, x6, x7, x8, x9, x10, x11, x12, x13, x14, x15);
- return self;
- }
-
- //! Sets all sixteen 8-bit unsigned integers.
- static inline Data128 fromU8(
- uint8_t x0 , uint8_t x1 , uint8_t x2 , uint8_t x3 ,
- uint8_t x4 , uint8_t x5 , uint8_t x6 , uint8_t x7 ,
- uint8_t x8 , uint8_t x9 , uint8_t x10, uint8_t x11,
- uint8_t x12, uint8_t x13, uint8_t x14, uint8_t x15) noexcept {
-
- Data128 self;
- self.setU8(x0, x1, x2, x3, x4, x5, x6, x7, x8, x9, x10, x11, x12, x13, x14, x15);
- return self;
- }
-
- //! Sets all eight 16-bit signed integers.
- static inline Data128 fromI16(int16_t x0) noexcept {
- Data128 self;
- self.setI16(x0);
- return self;
- }
-
- //! Sets all eight 16-bit unsigned integers.
- static inline Data128 fromU16(uint16_t x0) noexcept {
- Data128 self;
- self.setU16(x0);
- return self;
- }
-
- //! Sets all eight 16-bit signed integers.
- static inline Data128 fromI16(
- int16_t x0, int16_t x1, int16_t x2, int16_t x3, int16_t x4, int16_t x5, int16_t x6, int16_t x7) noexcept {
-
- Data128 self;
- self.setI16(x0, x1, x2, x3, x4, x5, x6, x7);
- return self;
- }
-
- //! Sets all eight 16-bit unsigned integers.
- static inline Data128 fromU16(
- uint16_t x0, uint16_t x1, uint16_t x2, uint16_t x3, uint16_t x4, uint16_t x5, uint16_t x6, uint16_t x7) noexcept {
-
- Data128 self;
- self.setU16(x0, x1, x2, x3, x4, x5, x6, x7);
- return self;
- }
-
- //! Sets all four 32-bit signed integers.
- static inline Data128 fromI32(int32_t x0) noexcept {
- Data128 self;
- self.setI32(x0);
- return self;
- }
-
- //! Sets all four 32-bit unsigned integers.
- static inline Data128 fromU32(uint32_t x0) noexcept {
- Data128 self;
- self.setU32(x0);
- return self;
- }
-
- //! Sets all four 32-bit signed integers.
- static inline Data128 fromI32(int32_t x0, int32_t x1, int32_t x2, int32_t x3) noexcept {
- Data128 self;
- self.setI32(x0, x1, x2, x3);
- return self;
- }
-
- //! Sets all four 32-bit unsigned integers.
- static inline Data128 fromU32(uint32_t x0, uint32_t x1, uint32_t x2, uint32_t x3) noexcept {
- Data128 self;
- self.setU32(x0, x1, x2, x3);
- return self;
- }
-
- //! Sets all two 64-bit signed integers.
- static inline Data128 fromI64(int64_t x0) noexcept {
- Data128 self;
- self.setI64(x0);
- return self;
- }
-
- //! Sets all two 64-bit unsigned integers.
- static inline Data128 fromU64(uint64_t x0) noexcept {
- Data128 self;
- self.setU64(x0);
- return self;
- }
-
- //! Sets all two 64-bit signed integers.
- static inline Data128 fromI64(int64_t x0, int64_t x1) noexcept {
- Data128 self;
- self.setI64(x0, x1);
- return self;
- }
-
- //! Sets all two 64-bit unsigned integers.
- static inline Data128 fromU64(uint64_t x0, uint64_t x1) noexcept {
- Data128 self;
- self.setU64(x0, x1);
- return self;
- }
-
- //! Sets all four SP-FP floats.
- static inline Data128 fromF32(float x0) noexcept {
- Data128 self;
- self.setF32(x0);
- return self;
- }
-
- //! Sets all four SP-FP floats.
- static inline Data128 fromF32(float x0, float x1, float x2, float x3) noexcept {
- Data128 self;
- self.setF32(x0, x1, x2, x3);
- return self;
- }
-
- //! Sets all two DP-FP floats.
- static inline Data128 fromF64(double x0) noexcept {
- Data128 self;
- self.setF64(x0);
- return self;
- }
-
- //! Sets all two DP-FP floats.
- static inline Data128 fromF64(double x0, double x1) noexcept {
- Data128 self;
- self.setF64(x0, x1);
- return self;
- }
-
- //! \}
-
- //! \name Accessors
- //! \{
-
- //! Sets all sixteen 8-bit signed integers.
- inline void setI8(int8_t x0) noexcept {
- setU8(uint8_t(x0));
- }
-
- //! Sets all sixteen 8-bit unsigned integers.
- inline void setU8(uint8_t x0) noexcept {
- if (ASMJIT_ARCH_BITS >= 64) {
- uint64_t xq = uint64_t(x0) * 0x0101010101010101u;
- uq[0] = xq;
- uq[1] = xq;
- }
- else {
- uint32_t xd = uint32_t(x0) * 0x01010101u;
- ud[0] = xd;
- ud[1] = xd;
- ud[2] = xd;
- ud[3] = xd;
- }
- }
-
- //! Sets all sixteen 8-bit signed integers.
- inline void setI8(
- int8_t x0 , int8_t x1 , int8_t x2 , int8_t x3 ,
- int8_t x4 , int8_t x5 , int8_t x6 , int8_t x7 ,
- int8_t x8 , int8_t x9 , int8_t x10, int8_t x11,
- int8_t x12, int8_t x13, int8_t x14, int8_t x15) noexcept {
-
- sb[0 ] = x0 ; sb[1 ] = x1 ; sb[2 ] = x2 ; sb[3 ] = x3 ;
- sb[4 ] = x4 ; sb[5 ] = x5 ; sb[6 ] = x6 ; sb[7 ] = x7 ;
- sb[8 ] = x8 ; sb[9 ] = x9 ; sb[10] = x10; sb[11] = x11;
- sb[12] = x12; sb[13] = x13; sb[14] = x14; sb[15] = x15;
- }
-
- //! Sets all sixteen 8-bit unsigned integers.
- inline void setU8(
- uint8_t x0 , uint8_t x1 , uint8_t x2 , uint8_t x3 ,
- uint8_t x4 , uint8_t x5 , uint8_t x6 , uint8_t x7 ,
- uint8_t x8 , uint8_t x9 , uint8_t x10, uint8_t x11,
- uint8_t x12, uint8_t x13, uint8_t x14, uint8_t x15) noexcept {
-
- ub[0 ] = x0 ; ub[1 ] = x1 ; ub[2 ] = x2 ; ub[3 ] = x3 ;
- ub[4 ] = x4 ; ub[5 ] = x5 ; ub[6 ] = x6 ; ub[7 ] = x7 ;
- ub[8 ] = x8 ; ub[9 ] = x9 ; ub[10] = x10; ub[11] = x11;
- ub[12] = x12; ub[13] = x13; ub[14] = x14; ub[15] = x15;
- }
-
- //! Sets all eight 16-bit signed integers.
- inline void setI16(int16_t x0) noexcept {
- setU16(uint16_t(x0));
- }
-
- //! Sets all eight 16-bit unsigned integers.
- inline void setU16(uint16_t x0) noexcept {
- if (ASMJIT_ARCH_BITS >= 64) {
- uint64_t xq = uint64_t(x0) * 0x0001000100010001u;
- uq[0] = xq;
- uq[1] = xq;
- }
- else {
- uint32_t xd = uint32_t(x0) * 0x00010001u;
- ud[0] = xd;
- ud[1] = xd;
- ud[2] = xd;
- ud[3] = xd;
- }
- }
-
- //! Sets all eight 16-bit signed integers.
- inline void setI16(
- int16_t x0, int16_t x1, int16_t x2, int16_t x3, int16_t x4, int16_t x5, int16_t x6, int16_t x7) noexcept {
-
- sw[0] = x0; sw[1] = x1; sw[2] = x2; sw[3] = x3;
- sw[4] = x4; sw[5] = x5; sw[6] = x6; sw[7] = x7;
- }
-
- //! Sets all eight 16-bit unsigned integers.
- inline void setU16(
- uint16_t x0, uint16_t x1, uint16_t x2, uint16_t x3, uint16_t x4, uint16_t x5, uint16_t x6, uint16_t x7) noexcept {
-
- uw[0] = x0; uw[1] = x1; uw[2] = x2; uw[3] = x3;
- uw[4] = x4; uw[5] = x5; uw[6] = x6; uw[7] = x7;
- }
-
- //! Sets all four 32-bit signed integers.
- inline void setI32(int32_t x0) noexcept {
- setU32(uint32_t(x0));
- }
-
- //! Sets all four 32-bit unsigned integers.
- inline void setU32(uint32_t x0) noexcept {
- if (ASMJIT_ARCH_BITS >= 64) {
- uint64_t t = (uint64_t(x0) << 32) + x0;
- uq[0] = t;
- uq[1] = t;
- }
- else {
- ud[0] = x0;
- ud[1] = x0;
- ud[2] = x0;
- ud[3] = x0;
- }
- }
-
- //! Sets all four 32-bit signed integers.
- inline void setI32(int32_t x0, int32_t x1, int32_t x2, int32_t x3) noexcept {
- sd[0] = x0; sd[1] = x1; sd[2] = x2; sd[3] = x3;
- }
-
- //! Sets all four 32-bit unsigned integers.
- inline void setU32(uint32_t x0, uint32_t x1, uint32_t x2, uint32_t x3) noexcept {
- ud[0] = x0; ud[1] = x1; ud[2] = x2; ud[3] = x3;
- }
-
- //! Sets all two 64-bit signed integers.
- inline void setI64(int64_t x0) noexcept {
- sq[0] = x0; sq[1] = x0;
- }
-
- //! Sets all two 64-bit unsigned integers.
- inline void setU64(uint64_t x0) noexcept {
- uq[0] = x0; uq[1] = x0;
- }
-
- //! Sets all two 64-bit signed integers.
- inline void setI64(int64_t x0, int64_t x1) noexcept {
- sq[0] = x0; sq[1] = x1;
- }
-
- //! Sets all two 64-bit unsigned integers.
- inline void setU64(uint64_t x0, uint64_t x1) noexcept {
- uq[0] = x0; uq[1] = x1;
- }
-
- //! Sets all four SP-FP floats.
- inline void setF32(float x0) noexcept {
- sf[0] = x0; sf[1] = x0; sf[2] = x0; sf[3] = x0;
- }
-
- //! Sets all four SP-FP floats.
- inline void setF32(float x0, float x1, float x2, float x3) noexcept {
- sf[0] = x0; sf[1] = x1; sf[2] = x2; sf[3] = x3;
- }
-
- //! Sets all two DP-FP floats.
- inline void setF64(double x0) noexcept {
- df[0] = x0; df[1] = x0;
- }
-
- //! Sets all two DP-FP floats.
- inline void setF64(double x0, double x1) noexcept {
- df[0] = x0; df[1] = x1;
- }
-};
-
-// ============================================================================
-// [asmjit::Data256]
-// ============================================================================
-
-//! 256-bit data useful for creating SIMD constants.
-union ASMJIT_DEPRECATED_STRUCT("Data256 is deprecated and will be removed in the future") Data256 {
- //! Array of thirty two 8-bit signed integers.
- int8_t sb[32];
- //! Array of thirty two 8-bit unsigned integers.
- uint8_t ub[32];
- //! Array of sixteen 16-bit signed integers.
- int16_t sw[16];
- //! Array of sixteen 16-bit unsigned integers.
- uint16_t uw[16];
- //! Array of eight 32-bit signed integers.
- int32_t sd[8];
- //! Array of eight 32-bit unsigned integers.
- uint32_t ud[8];
- //! Array of four 64-bit signed integers.
- int64_t sq[4];
- //! Array of four 64-bit unsigned integers.
- uint64_t uq[4];
-
- //! Array of eight 32-bit single precision floating points.
- float sf[8];
- //! Array of four 64-bit double precision floating points.
- double df[4];
-
- //! \name Construction & Destruction
- //! \{
-
- //! Sets all thirty two 8-bit signed integers.
- static inline Data256 fromI8(int8_t x0) noexcept {
- Data256 self;
- self.setI8(x0);
- return self;
- }
-
- //! Sets all thirty two 8-bit unsigned integers.
- static inline Data256 fromU8(uint8_t x0) noexcept {
- Data256 self;
- self.setU8(x0);
- return self;
- }
-
- //! Sets all thirty two 8-bit signed integers.
- static inline Data256 fromI8(
- int8_t x0 , int8_t x1 , int8_t x2 , int8_t x3 ,
- int8_t x4 , int8_t x5 , int8_t x6 , int8_t x7 ,
- int8_t x8 , int8_t x9 , int8_t x10, int8_t x11,
- int8_t x12, int8_t x13, int8_t x14, int8_t x15,
- int8_t x16, int8_t x17, int8_t x18, int8_t x19,
- int8_t x20, int8_t x21, int8_t x22, int8_t x23,
- int8_t x24, int8_t x25, int8_t x26, int8_t x27,
- int8_t x28, int8_t x29, int8_t x30, int8_t x31) noexcept {
-
- Data256 self;
- self.setI8(
- x0, x1 , x2 , x3 , x4 , x5 , x6 , x7 , x8 , x9 , x10, x11, x12, x13, x14, x15,
- x16, x17, x18, x19, x20, x21, x22, x23, x24, x25, x26, x27, x28, x29, x30, x31);
- return self;
- }
-
- //! Sets all thirty two 8-bit unsigned integers.
- static inline Data256 fromU8(
- uint8_t x0 , uint8_t x1 , uint8_t x2 , uint8_t x3 ,
- uint8_t x4 , uint8_t x5 , uint8_t x6 , uint8_t x7 ,
- uint8_t x8 , uint8_t x9 , uint8_t x10, uint8_t x11,
- uint8_t x12, uint8_t x13, uint8_t x14, uint8_t x15,
- uint8_t x16, uint8_t x17, uint8_t x18, uint8_t x19,
- uint8_t x20, uint8_t x21, uint8_t x22, uint8_t x23,
- uint8_t x24, uint8_t x25, uint8_t x26, uint8_t x27,
- uint8_t x28, uint8_t x29, uint8_t x30, uint8_t x31) noexcept {
-
- Data256 self;
- self.setU8(
- x0, x1 , x2 , x3 , x4 , x5 , x6 , x7 , x8 , x9 , x10, x11, x12, x13, x14, x15,
- x16, x17, x18, x19, x20, x21, x22, x23, x24, x25, x26, x27, x28, x29, x30, x31);
- return self;
- }
-
- //! Sets all sixteen 16-bit signed integers.
- static inline Data256 fromI16(int16_t x0) noexcept {
- Data256 self;
- self.setI16(x0);
- return self;
- }
-
- //! Sets all sixteen 16-bit unsigned integers.
- static inline Data256 fromU16(uint16_t x0) noexcept {
- Data256 self;
- self.setU16(x0);
- return self;
- }
-
- //! Sets all sixteen 16-bit signed integers.
- static inline Data256 fromI16(
- int16_t x0, int16_t x1, int16_t x2 , int16_t x3 , int16_t x4 , int16_t x5 , int16_t x6 , int16_t x7 ,
- int16_t x8, int16_t x9, int16_t x10, int16_t x11, int16_t x12, int16_t x13, int16_t x14, int16_t x15) noexcept {
-
- Data256 self;
- self.setI16(x0, x1, x2, x3, x4, x5, x6, x7, x8, x9, x10, x11, x12, x13, x14, x15);
- return self;
- }
-
- //! Sets all sixteen 16-bit unsigned integers.
- static inline Data256 fromU16(
- uint16_t x0, uint16_t x1, uint16_t x2 , uint16_t x3 , uint16_t x4 , uint16_t x5 , uint16_t x6 , uint16_t x7 ,
- uint16_t x8, uint16_t x9, uint16_t x10, uint16_t x11, uint16_t x12, uint16_t x13, uint16_t x14, uint16_t x15) noexcept {
-
- Data256 self;
- self.setU16(x0, x1, x2, x3, x4, x5, x6, x7, x8, x9, x10, x11, x12, x13, x14, x15);
- return self;
- }
-
- //! Sets all eight 32-bit signed integers.
- static inline Data256 fromI32(int32_t x0) noexcept {
- Data256 self;
- self.setI32(x0);
- return self;
- }
-
- //! Sets all eight 32-bit unsigned integers.
- static inline Data256 fromU32(uint32_t x0) noexcept {
- Data256 self;
- self.setU32(x0);
- return self;
- }
-
- //! Sets all eight 32-bit signed integers.
- static inline Data256 fromI32(
- int32_t x0, int32_t x1, int32_t x2, int32_t x3,
- int32_t x4, int32_t x5, int32_t x6, int32_t x7) noexcept {
-
- Data256 self;
- self.setI32(x0, x1, x2, x3, x4, x5, x6, x7);
- return self;
- }
-
- //! Sets all eight 32-bit unsigned integers.
- static inline Data256 fromU32(
- uint32_t x0, uint32_t x1, uint32_t x2, uint32_t x3,
- uint32_t x4, uint32_t x5, uint32_t x6, uint32_t x7) noexcept {
-
- Data256 self;
- self.setU32(x0, x1, x2, x3, x4, x5, x6, x7);
- return self;
- }
-
- //! Sets all four 64-bit signed integers.
- static inline Data256 fromI64(int64_t x0) noexcept {
- Data256 self;
- self.setI64(x0);
- return self;
- }
-
- //! Sets all four 64-bit unsigned integers.
- static inline Data256 fromU64(uint64_t x0) noexcept {
- Data256 self;
- self.setU64(x0);
- return self;
- }
-
- //! Sets all four 64-bit signed integers.
- static inline Data256 fromI64(int64_t x0, int64_t x1, int64_t x2, int64_t x3) noexcept {
- Data256 self;
- self.setI64(x0, x1, x2, x3);
- return self;
- }
-
- //! Sets all four 64-bit unsigned integers.
- static inline Data256 fromU64(uint64_t x0, uint64_t x1, uint64_t x2, uint64_t x3) noexcept {
- Data256 self;
- self.setU64(x0, x1, x2, x3);
- return self;
- }
-
- //! Sets all eight SP-FP floats.
- static inline Data256 fromF32(float x0) noexcept {
- Data256 self;
- self.setF32(x0);
- return self;
- }
-
- //! Sets all eight SP-FP floats.
- static inline Data256 fromF32(
- float x0, float x1, float x2, float x3,
- float x4, float x5, float x6, float x7) noexcept {
-
- Data256 self;
- self.setF32(x0, x1, x2, x3, x4, x5, x6, x7);
- return self;
- }
-
- //! Sets all four DP-FP floats.
- static inline Data256 fromF64(double x0) noexcept {
- Data256 self;
- self.setF64(x0);
- return self;
- }
-
- //! Sets all four DP-FP floats.
- static inline Data256 fromF64(double x0, double x1, double x2, double x3) noexcept {
- Data256 self;
- self.setF64(x0, x1, x2, x3);
- return self;
- }
-
- //! \}
-
- //! \name Accessors
- //! \{
-
- //! Sets all thirty two 8-bit signed integers.
- inline void setI8(int8_t x0) noexcept {
- setU8(uint8_t(x0));
- }
-
- //! Sets all thirty two 8-bit unsigned integers.
- inline void setU8(uint8_t x0) noexcept {
- if (ASMJIT_ARCH_BITS >= 64) {
- uint64_t xq = uint64_t(x0) * 0x0101010101010101u;
- uq[0] = xq;
- uq[1] = xq;
- uq[2] = xq;
- uq[3] = xq;
- }
- else {
- uint32_t xd = uint32_t(x0) * 0x01010101u;
- ud[0] = xd;
- ud[1] = xd;
- ud[2] = xd;
- ud[3] = xd;
- ud[4] = xd;
- ud[5] = xd;
- ud[6] = xd;
- ud[7] = xd;
- }
- }
-
- //! Sets all thirty two 8-bit signed integers.
- inline void setI8(
- int8_t x0 , int8_t x1 , int8_t x2 , int8_t x3 ,
- int8_t x4 , int8_t x5 , int8_t x6 , int8_t x7 ,
- int8_t x8 , int8_t x9 , int8_t x10, int8_t x11,
- int8_t x12, int8_t x13, int8_t x14, int8_t x15,
- int8_t x16, int8_t x17, int8_t x18, int8_t x19,
- int8_t x20, int8_t x21, int8_t x22, int8_t x23,
- int8_t x24, int8_t x25, int8_t x26, int8_t x27,
- int8_t x28, int8_t x29, int8_t x30, int8_t x31) noexcept {
-
- sb[0 ] = x0 ; sb[1 ] = x1 ; sb[2 ] = x2 ; sb[3 ] = x3 ;
- sb[4 ] = x4 ; sb[5 ] = x5 ; sb[6 ] = x6 ; sb[7 ] = x7 ;
- sb[8 ] = x8 ; sb[9 ] = x9 ; sb[10] = x10; sb[11] = x11;
- sb[12] = x12; sb[13] = x13; sb[14] = x14; sb[15] = x15;
- sb[16] = x16; sb[17] = x17; sb[18] = x18; sb[19] = x19;
- sb[20] = x20; sb[21] = x21; sb[22] = x22; sb[23] = x23;
- sb[24] = x24; sb[25] = x25; sb[26] = x26; sb[27] = x27;
- sb[28] = x28; sb[29] = x29; sb[30] = x30; sb[31] = x31;
- }
-
- //! Sets all thirty two 8-bit unsigned integers.
- inline void setU8(
- uint8_t x0 , uint8_t x1 , uint8_t x2 , uint8_t x3 ,
- uint8_t x4 , uint8_t x5 , uint8_t x6 , uint8_t x7 ,
- uint8_t x8 , uint8_t x9 , uint8_t x10, uint8_t x11,
- uint8_t x12, uint8_t x13, uint8_t x14, uint8_t x15,
- uint8_t x16, uint8_t x17, uint8_t x18, uint8_t x19,
- uint8_t x20, uint8_t x21, uint8_t x22, uint8_t x23,
- uint8_t x24, uint8_t x25, uint8_t x26, uint8_t x27,
- uint8_t x28, uint8_t x29, uint8_t x30, uint8_t x31) noexcept {
-
- ub[0 ] = x0 ; ub[1 ] = x1 ; ub[2 ] = x2 ; ub[3 ] = x3 ;
- ub[4 ] = x4 ; ub[5 ] = x5 ; ub[6 ] = x6 ; ub[7 ] = x7 ;
- ub[8 ] = x8 ; ub[9 ] = x9 ; ub[10] = x10; ub[11] = x11;
- ub[12] = x12; ub[13] = x13; ub[14] = x14; ub[15] = x15;
- ub[16] = x16; ub[17] = x17; ub[18] = x18; ub[19] = x19;
- ub[20] = x20; ub[21] = x21; ub[22] = x22; ub[23] = x23;
- ub[24] = x24; ub[25] = x25; ub[26] = x26; ub[27] = x27;
- ub[28] = x28; ub[29] = x29; ub[30] = x30; ub[31] = x31;
- }
-
- //! Sets all sixteen 16-bit signed integers.
- inline void setI16(int16_t x0) noexcept {
- setU16(uint16_t(x0));
- }
-
- //! Sets all eight 16-bit unsigned integers.
- inline void setU16(uint16_t x0) noexcept {
- if (ASMJIT_ARCH_BITS >= 64) {
- uint64_t xq = uint64_t(x0) * 0x0001000100010001u;
- uq[0] = xq;
- uq[1] = xq;
- uq[2] = xq;
- uq[3] = xq;
- }
- else {
- uint32_t xd = uint32_t(x0) * 0x00010001u;
- ud[0] = xd;
- ud[1] = xd;
- ud[2] = xd;
- ud[3] = xd;
- ud[4] = xd;
- ud[5] = xd;
- ud[6] = xd;
- ud[7] = xd;
- }
- }
-
- //! Sets all sixteen 16-bit signed integers.
- inline void setI16(
- int16_t x0, int16_t x1, int16_t x2 , int16_t x3 , int16_t x4 , int16_t x5 , int16_t x6 , int16_t x7,
- int16_t x8, int16_t x9, int16_t x10, int16_t x11, int16_t x12, int16_t x13, int16_t x14, int16_t x15) noexcept {
-
- sw[0 ] = x0 ; sw[1 ] = x1 ; sw[2 ] = x2 ; sw[3 ] = x3 ;
- sw[4 ] = x4 ; sw[5 ] = x5 ; sw[6 ] = x6 ; sw[7 ] = x7 ;
- sw[8 ] = x8 ; sw[9 ] = x9 ; sw[10] = x10; sw[11] = x11;
- sw[12] = x12; sw[13] = x13; sw[14] = x14; sw[15] = x15;
- }
-
- //! Sets all sixteen 16-bit unsigned integers.
- inline void setU16(
- uint16_t x0, uint16_t x1, uint16_t x2 , uint16_t x3 , uint16_t x4 , uint16_t x5 , uint16_t x6 , uint16_t x7,
- uint16_t x8, uint16_t x9, uint16_t x10, uint16_t x11, uint16_t x12, uint16_t x13, uint16_t x14, uint16_t x15) noexcept {
-
- uw[0 ] = x0 ; uw[1 ] = x1 ; uw[2 ] = x2 ; uw[3 ] = x3 ;
- uw[4 ] = x4 ; uw[5 ] = x5 ; uw[6 ] = x6 ; uw[7 ] = x7 ;
- uw[8 ] = x8 ; uw[9 ] = x9 ; uw[10] = x10; uw[11] = x11;
- uw[12] = x12; uw[13] = x13; uw[14] = x14; uw[15] = x15;
- }
-
- //! Sets all eight 32-bit signed integers.
- inline void setI32(int32_t x0) noexcept {
- setU32(uint32_t(x0));
- }
-
- //! Sets all eight 32-bit unsigned integers.
- inline void setU32(uint32_t x0) noexcept {
- if (ASMJIT_ARCH_BITS >= 64) {
- uint64_t xq = (uint64_t(x0) << 32) + x0;
- uq[0] = xq;
- uq[1] = xq;
- uq[2] = xq;
- uq[3] = xq;
- }
- else {
- ud[0] = x0;
- ud[1] = x0;
- ud[2] = x0;
- ud[3] = x0;
- ud[4] = x0;
- ud[5] = x0;
- ud[6] = x0;
- ud[7] = x0;
- }
- }
-
- //! Sets all eight 32-bit signed integers.
- inline void setI32(
- int32_t x0, int32_t x1, int32_t x2, int32_t x3,
- int32_t x4, int32_t x5, int32_t x6, int32_t x7) noexcept {
-
- sd[0] = x0; sd[1] = x1; sd[2] = x2; sd[3] = x3;
- sd[4] = x4; sd[5] = x5; sd[6] = x6; sd[7] = x7;
- }
-
- //! Sets all eight 32-bit unsigned integers.
- inline void setU32(
- uint32_t x0, uint32_t x1, uint32_t x2, uint32_t x3,
- uint32_t x4, uint32_t x5, uint32_t x6, uint32_t x7) noexcept {
-
- ud[0] = x0; ud[1] = x1; ud[2] = x2; ud[3] = x3;
- ud[4] = x4; ud[5] = x5; ud[6] = x6; ud[7] = x7;
- }
-
- //! Sets all four 64-bit signed integers.
- inline void setI64(int64_t x0) noexcept {
- sq[0] = x0; sq[1] = x0; sq[2] = x0; sq[3] = x0;
- }
-
- //! Sets all four 64-bit unsigned integers.
- inline void setU64(uint64_t x0) noexcept {
- uq[0] = x0; uq[1] = x0; uq[2] = x0; uq[3] = x0;
- }
-
- //! Sets all four 64-bit signed integers.
- inline void setI64(int64_t x0, int64_t x1, int64_t x2, int64_t x3) noexcept {
- sq[0] = x0; sq[1] = x1; sq[2] = x2; sq[3] = x3;
- }
-
- //! Sets all four 64-bit unsigned integers.
- inline void setU64(uint64_t x0, uint64_t x1, uint64_t x2, uint64_t x3) noexcept {
- uq[0] = x0; uq[1] = x1; uq[2] = x2; uq[3] = x3;
- }
-
- //! Sets all eight SP-FP floats.
- inline void setF32(float x0) noexcept {
- sf[0] = x0; sf[1] = x0; sf[2] = x0; sf[3] = x0;
- sf[4] = x0; sf[5] = x0; sf[6] = x0; sf[7] = x0;
- }
-
- //! Sets all eight SP-FP floats.
- inline void setF32(
- float x0, float x1, float x2, float x3,
- float x4, float x5, float x6, float x7) noexcept {
-
- sf[0] = x0; sf[1] = x1; sf[2] = x2; sf[3] = x3;
- sf[4] = x4; sf[5] = x5; sf[6] = x6; sf[7] = x7;
- }
-
- //! Sets all four DP-FP floats.
- inline void setF64(double x0) noexcept {
- df[0] = x0; df[1] = x0; df[2] = x0; df[3] = x0;
- }
-
- //! Sets all four DP-FP floats.
- inline void setF64(double x0, double x1, double x2, double x3) noexcept {
- df[0] = x0; df[1] = x1; df[2] = x2; df[3] = x3;
- }
-
- //! \}
-};
-
-ASMJIT_END_NAMESPACE
-
-#endif // !ASMJIT_NO_DEPRECATED
-#endif // ASMJIT_CORE_DATATYPES_H_INCLUDED
diff --git a/3rdparty/asmjit/src/asmjit/core/emithelper.cpp b/3rdparty/asmjit/src/asmjit/core/emithelper.cpp
new file mode 100644
index 00000000000..bcdf098f48b
--- /dev/null
+++ b/3rdparty/asmjit/src/asmjit/core/emithelper.cpp
@@ -0,0 +1,323 @@
+// This file is part of AsmJit project <https://asmjit.com>
+//
+// See asmjit.h or LICENSE.md for license and copyright information
+// SPDX-License-Identifier: Zlib
+
+#include "../core/api-build_p.h"
+#include "../core/archtraits.h"
+#include "../core/emithelper_p.h"
+#include "../core/formatter.h"
+#include "../core/funcargscontext_p.h"
+#include "../core/radefs_p.h"
+
+// Can be used for debugging...
+// #define ASMJIT_DUMP_ARGS_ASSIGNMENT
+
+ASMJIT_BEGIN_NAMESPACE
+
+// BaseEmitHelper - Formatting
+// ===========================
+
+#ifdef ASMJIT_DUMP_ARGS_ASSIGNMENT
+static void dumpFuncValue(String& sb, Arch arch, const FuncValue& value) noexcept {
+ Formatter::formatTypeId(sb, value.typeId());
+ sb.append('@');
+
+ if (value.isIndirect())
+ sb.append('[');
+
+ if (value.isReg())
+ Formatter::formatRegister(sb, 0, nullptr, arch, value.regType(), value.regId());
+ else if (value.isStack())
+ sb.appendFormat("[%d]", value.stackOffset());
+ else
+ sb.append("<none>");
+
+ if (value.isIndirect())
+ sb.append(']');
+}
+
+static void dumpAssignment(String& sb, const FuncArgsContext& ctx) noexcept {
+ typedef FuncArgsContext::Var Var;
+
+ Arch arch = ctx.arch();
+ uint32_t varCount = ctx.varCount();
+
+ for (uint32_t i = 0; i < varCount; i++) {
+ const Var& var = ctx.var(i);
+ const FuncValue& dst = var.out;
+ const FuncValue& cur = var.cur;
+
+ sb.appendFormat("Var%u: ", i);
+ dumpFuncValue(sb, arch, dst);
+ sb.append(" <- ");
+ dumpFuncValue(sb, arch, cur);
+
+ if (var.isDone())
+ sb.append(" {Done}");
+
+ sb.append('\n');
+ }
+}
+#endif
+
+// BaseEmitHelper - EmitArgsAssignment
+// ===================================
+
+ASMJIT_FAVOR_SIZE Error BaseEmitHelper::emitArgsAssignment(const FuncFrame& frame, const FuncArgsAssignment& args) {
+ typedef FuncArgsContext::Var Var;
+ typedef FuncArgsContext::WorkData WorkData;
+
+ enum WorkFlags : uint32_t {
+ kWorkNone = 0x00,
+ kWorkDidSome = 0x01,
+ kWorkPending = 0x02,
+ kWorkPostponed = 0x04
+ };
+
+ Arch arch = frame.arch();
+ const ArchTraits& archTraits = ArchTraits::byArch(arch);
+
+ RAConstraints constraints;
+ FuncArgsContext ctx;
+
+ ASMJIT_PROPAGATE(constraints.init(arch));
+ ASMJIT_PROPAGATE(ctx.initWorkData(frame, args, &constraints));
+
+#ifdef ASMJIT_DUMP_ARGS_ASSIGNMENT
+ {
+ String sb;
+ dumpAssignment(sb, ctx);
+ printf("%s\n", sb.data());
+ }
+#endif
+
+ auto& workData = ctx._workData;
+ uint32_t varCount = ctx._varCount;
+ uint32_t saVarId = ctx._saVarId;
+
+ BaseReg sp = BaseReg(_emitter->_gpSignature, archTraits.spRegId());
+ BaseReg sa = sp;
+
+ if (frame.hasDynamicAlignment()) {
+ if (frame.hasPreservedFP())
+ sa.setId(archTraits.fpRegId());
+ else
+ sa.setId(saVarId < varCount ? ctx._vars[saVarId].cur.regId() : frame.saRegId());
+ }
+
+ // Register to stack and stack to stack moves must be first as now we have
+ // the biggest chance of having as many as possible unassigned registers.
+
+ if (ctx._stackDstMask) {
+ // Base address of all arguments passed by stack.
+ BaseMem baseArgPtr(sa, int32_t(frame.saOffset(sa.id())));
+ BaseMem baseStackPtr(sp, 0);
+
+ for (uint32_t varId = 0; varId < varCount; varId++) {
+ Var& var = ctx._vars[varId];
+
+ if (!var.out.isStack())
+ continue;
+
+ FuncValue& cur = var.cur;
+ FuncValue& out = var.out;
+
+ ASMJIT_ASSERT(cur.isReg() || cur.isStack());
+ BaseReg reg;
+
+ BaseMem dstStackPtr = baseStackPtr.cloneAdjusted(out.stackOffset());
+ BaseMem srcStackPtr = baseArgPtr.cloneAdjusted(cur.stackOffset());
+
+ if (cur.isIndirect()) {
+ if (cur.isStack()) {
+ // TODO: Indirect stack.
+ return DebugUtils::errored(kErrorInvalidAssignment);
+ }
+ else {
+ srcStackPtr.setBaseId(cur.regId());
+ }
+ }
+
+ if (cur.isReg() && !cur.isIndirect()) {
+ WorkData& wd = workData[archTraits.regTypeToGroup(cur.regType())];
+ uint32_t regId = cur.regId();
+
+ reg.setSignatureAndId(archTraits.regTypeToSignature(cur.regType()), regId);
+ wd.unassign(varId, regId);
+ }
+ else {
+ // Stack to reg move - tricky since we move stack to stack we can decide which register to use. In general
+ // we follow the rule that IntToInt moves will use GP regs with possibility to signature or zero extend,
+ // and all other moves will either use GP or VEC regs depending on the size of the move.
+ OperandSignature signature = getSuitableRegForMemToMemMove(arch, out.typeId(), cur.typeId());
+ if (ASMJIT_UNLIKELY(!signature.isValid()))
+ return DebugUtils::errored(kErrorInvalidState);
+
+ WorkData& wd = workData[signature.regGroup()];
+ RegMask availableRegs = wd.availableRegs();
+ if (ASMJIT_UNLIKELY(!availableRegs))
+ return DebugUtils::errored(kErrorInvalidState);
+
+ uint32_t availableId = Support::ctz(availableRegs);
+ reg.setSignatureAndId(signature, availableId);
+
+ ASMJIT_PROPAGATE(emitArgMove(reg, out.typeId(), srcStackPtr, cur.typeId()));
+ }
+
+ if (cur.isIndirect() && cur.isReg())
+ workData[RegGroup::kGp].unassign(varId, cur.regId());
+
+ // Register to stack move.
+ ASMJIT_PROPAGATE(emitRegMove(dstStackPtr, reg, cur.typeId()));
+ var.markDone();
+ }
+ }
+
+ // Shuffle all registers that are currently assigned accordingly to target assignment.
+
+ uint32_t workFlags = kWorkNone;
+ for (;;) {
+ for (uint32_t varId = 0; varId < varCount; varId++) {
+ Var& var = ctx._vars[varId];
+ if (var.isDone() || !var.cur.isReg())
+ continue;
+
+ FuncValue& cur = var.cur;
+ FuncValue& out = var.out;
+
+ RegGroup curGroup = archTraits.regTypeToGroup(cur.regType());
+ RegGroup outGroup = archTraits.regTypeToGroup(out.regType());
+
+ uint32_t curId = cur.regId();
+ uint32_t outId = out.regId();
+
+ if (curGroup != outGroup) {
+ // TODO: Conversion is not supported.
+ return DebugUtils::errored(kErrorInvalidAssignment);
+ }
+ else {
+ WorkData& wd = workData[outGroup];
+ if (!wd.isAssigned(outId)) {
+EmitMove:
+ ASMJIT_PROPAGATE(
+ emitArgMove(
+ BaseReg(archTraits.regTypeToSignature(out.regType()), outId), out.typeId(),
+ BaseReg(archTraits.regTypeToSignature(cur.regType()), curId), cur.typeId()));
+
+ wd.reassign(varId, outId, curId);
+ cur.initReg(out.regType(), outId, out.typeId());
+
+ if (outId == out.regId())
+ var.markDone();
+ workFlags |= kWorkDidSome | kWorkPending;
+ }
+ else {
+ uint32_t altId = wd._physToVarId[outId];
+ Var& altVar = ctx._vars[altId];
+
+ if (!altVar.out.isInitialized() || (altVar.out.isReg() && altVar.out.regId() == curId)) {
+ // Only few architectures provide swap operations, and only for few register groups.
+ if (archTraits.hasInstRegSwap(curGroup)) {
+ RegType highestType = Support::max(cur.regType(), altVar.cur.regType());
+ if (Support::isBetween(highestType, RegType::kGp8Lo, RegType::kGp16))
+ highestType = RegType::kGp32;
+
+ OperandSignature signature = archTraits.regTypeToSignature(highestType);
+ ASMJIT_PROPAGATE(
+ emitRegSwap(BaseReg(signature, outId), BaseReg(signature, curId)));
+
+ wd.swap(varId, curId, altId, outId);
+ cur.setRegId(outId);
+ var.markDone();
+ altVar.cur.setRegId(curId);
+
+ if (altVar.out.isInitialized())
+ altVar.markDone();
+ workFlags |= kWorkDidSome;
+ }
+ else {
+ // If there is a scratch register it can be used to perform the swap.
+ RegMask availableRegs = wd.availableRegs();
+ if (availableRegs) {
+ RegMask inOutRegs = wd.dstRegs();
+ if (availableRegs & ~inOutRegs)
+ availableRegs &= ~inOutRegs;
+ outId = Support::ctz(availableRegs);
+ goto EmitMove;
+ }
+ else {
+ workFlags |= kWorkPending;
+ }
+ }
+ }
+ else {
+ workFlags |= kWorkPending;
+ }
+ }
+ }
+ }
+
+ if (!(workFlags & kWorkPending))
+ break;
+
+ // If we did nothing twice it means that something is really broken.
+ if ((workFlags & (kWorkDidSome | kWorkPostponed)) == kWorkPostponed)
+ return DebugUtils::errored(kErrorInvalidState);
+
+ workFlags = (workFlags & kWorkDidSome) ? kWorkNone : kWorkPostponed;
+ }
+
+ // Load arguments passed by stack into registers. This is pretty simple and
+ // it never requires multiple iterations like the previous phase.
+
+ if (ctx._hasStackSrc) {
+ uint32_t iterCount = 1;
+ if (frame.hasDynamicAlignment() && !frame.hasPreservedFP())
+ sa.setId(saVarId < varCount ? ctx._vars[saVarId].cur.regId() : frame.saRegId());
+
+ // Base address of all arguments passed by stack.
+ BaseMem baseArgPtr(sa, int32_t(frame.saOffset(sa.id())));
+
+ for (uint32_t iter = 0; iter < iterCount; iter++) {
+ for (uint32_t varId = 0; varId < varCount; varId++) {
+ Var& var = ctx._vars[varId];
+ if (var.isDone())
+ continue;
+
+ if (var.cur.isStack()) {
+ ASMJIT_ASSERT(var.out.isReg());
+
+ uint32_t outId = var.out.regId();
+ RegType outType = var.out.regType();
+
+ RegGroup group = archTraits.regTypeToGroup(outType);
+ WorkData& wd = workData[group];
+
+ if (outId == sa.id() && group == RegGroup::kGp) {
+ // This register will be processed last as we still need `saRegId`.
+ if (iterCount == 1) {
+ iterCount++;
+ continue;
+ }
+ wd.unassign(wd._physToVarId[outId], outId);
+ }
+
+ BaseReg dstReg = BaseReg(archTraits.regTypeToSignature(outType), outId);
+ BaseMem srcMem = baseArgPtr.cloneAdjusted(var.cur.stackOffset());
+
+ ASMJIT_PROPAGATE(emitArgMove(
+ dstReg, var.out.typeId(),
+ srcMem, var.cur.typeId()));
+
+ wd.assign(varId, outId);
+ var.cur.initReg(outType, outId, var.cur.typeId(), FuncValue::kFlagIsDone);
+ }
+ }
+ }
+ }
+
+ return kErrorOk;
+}
+
+ASMJIT_END_NAMESPACE
diff --git a/3rdparty/asmjit/src/asmjit/core/emithelper_p.h b/3rdparty/asmjit/src/asmjit/core/emithelper_p.h
new file mode 100644
index 00000000000..0333959e144
--- /dev/null
+++ b/3rdparty/asmjit/src/asmjit/core/emithelper_p.h
@@ -0,0 +1,58 @@
+// This file is part of AsmJit project <https://asmjit.com>
+//
+// See asmjit.h or LICENSE.md for license and copyright information
+// SPDX-License-Identifier: Zlib
+
+#ifndef ASMJIT_CORE_EMITHELPER_P_H_INCLUDED
+#define ASMJIT_CORE_EMITHELPER_P_H_INCLUDED
+
+#include "../core/emitter.h"
+#include "../core/operand.h"
+#include "../core/type.h"
+
+ASMJIT_BEGIN_NAMESPACE
+
+//! \cond INTERNAL
+//! \addtogroup asmjit_core
+//! \{
+
+//! Helper class that provides utilities for each supported architecture.
+class BaseEmitHelper {
+public:
+ BaseEmitter* _emitter;
+
+ inline explicit BaseEmitHelper(BaseEmitter* emitter = nullptr) noexcept
+ : _emitter(emitter) {}
+
+ inline BaseEmitter* emitter() const noexcept { return _emitter; }
+ inline void setEmitter(BaseEmitter* emitter) noexcept { _emitter = emitter; }
+
+ //! Emits a pure move operation between two registers or the same type or between a register and its home
+ //! slot. This function does not handle register conversion.
+ virtual Error emitRegMove(
+ const Operand_& dst_,
+ const Operand_& src_, TypeId typeId, const char* comment = nullptr) = 0;
+
+ //! Emits swap between two registers.
+ virtual Error emitRegSwap(
+ const BaseReg& a,
+ const BaseReg& b, const char* comment = nullptr) = 0;
+
+ //! Emits move from a function argument (either register or stack) to a register.
+ //!
+ //! This function can handle the necessary conversion from one argument to another, and from one register type
+ //! to another, if it's possible. Any attempt of conversion that requires third register of a different group
+ //! (for example conversion from K to MMX on X86/X64) will fail.
+ virtual Error emitArgMove(
+ const BaseReg& dst_, TypeId dstTypeId,
+ const Operand_& src_, TypeId srcTypeId, const char* comment = nullptr) = 0;
+
+ Error emitArgsAssignment(const FuncFrame& frame, const FuncArgsAssignment& args);
+};
+
+//! \}
+//! \endcond
+
+ASMJIT_END_NAMESPACE
+
+#endif // ASMJIT_CORE_EMITHELPER_P_H_INCLUDED
diff --git a/3rdparty/asmjit/src/asmjit/core/emitter.cpp b/3rdparty/asmjit/src/asmjit/core/emitter.cpp
index b6ecc3d3cca..92d67a7e5b5 100644
--- a/3rdparty/asmjit/src/asmjit/core/emitter.cpp
+++ b/3rdparty/asmjit/src/asmjit/core/emitter.cpp
@@ -1,25 +1,7 @@
-// AsmJit - Machine code generation for C++
+// This file is part of AsmJit project <https://asmjit.com>
//
-// * Official AsmJit Home Page: https://asmjit.com
-// * Official Github Repository: https://github.com/asmjit/asmjit
-//
-// Copyright (c) 2008-2020 The AsmJit Authors
-//
-// This software is provided 'as-is', without any express or implied
-// warranty. In no event will the authors be held liable for any damages
-// arising from the use of this software.
-//
-// Permission is granted to anyone to use this software for any purpose,
-// including commercial applications, and to alter it and redistribute it
-// freely, subject to the following restrictions:
-//
-// 1. The origin of this software must not be misrepresented; you must not
-// claim that you wrote the original software. If you use this software
-// in a product, an acknowledgment in the product documentation would be
-// appreciated but is not required.
-// 2. Altered source versions must be plainly marked as such, and must not be
-// misrepresented as being the original software.
-// 3. This notice may not be removed or altered from any source distribution.
+// See asmjit.h or LICENSE.md for license and copyright information
+// SPDX-License-Identifier: Zlib
#include "../core/api-build_p.h"
#include "../core/emitterutils_p.h"
@@ -27,104 +9,87 @@
#include "../core/logger.h"
#include "../core/support.h"
-#ifdef ASMJIT_BUILD_X86
- #include "../x86/x86internal_p.h"
- #include "../x86/x86instdb_p.h"
-#endif // ASMJIT_BUILD_X86
-
-#ifdef ASMJIT_BUILD_ARM
- #include "../arm/arminternal_p.h"
- #include "../arm/arminstdb.h"
-#endif // ASMJIT_BUILD_ARM
-
ASMJIT_BEGIN_NAMESPACE
-// ============================================================================
-// [asmjit::BaseEmitter - Construction / Destruction]
-// ============================================================================
-
-BaseEmitter::BaseEmitter(uint32_t emitterType) noexcept
- : _emitterType(uint8_t(emitterType)),
- _emitterFlags(0),
- _validationFlags(0),
- _validationOptions(0),
- _encodingOptions(0),
- _forcedInstOptions(BaseInst::kOptionReserved),
- _privateData(0),
- _code(nullptr),
- _logger(nullptr),
- _errorHandler(nullptr),
- _environment(),
- _gpRegInfo(),
- _instOptions(0),
- _extraReg(),
- _inlineComment(nullptr) {}
+// BaseEmitter - Construction & Destruction
+// ========================================
+
+BaseEmitter::BaseEmitter(EmitterType emitterType) noexcept
+ : _emitterType(emitterType) {}
BaseEmitter::~BaseEmitter() noexcept {
if (_code) {
- _addEmitterFlags(kFlagDestroyed);
+ _addEmitterFlags(EmitterFlags::kDestroyed);
_code->detach(this);
}
}
-// ============================================================================
-// [asmjit::BaseEmitter - Finalize]
-// ============================================================================
+// BaseEmitter - Finalize
+// ======================
Error BaseEmitter::finalize() {
// Does nothing by default, overridden by `BaseBuilder` and `BaseCompiler`.
return kErrorOk;
}
-// ============================================================================
-// [asmjit::BaseEmitter - Internals]
-// ============================================================================
+// BaseEmitter - Internals
+// =======================
-static constexpr uint32_t kEmitterPreservedFlags =
- BaseEmitter::kFlagOwnLogger |
- BaseEmitter::kFlagOwnErrorHandler ;
+static constexpr EmitterFlags kEmitterPreservedFlags = EmitterFlags::kOwnLogger | EmitterFlags::kOwnErrorHandler;
static ASMJIT_NOINLINE void BaseEmitter_updateForcedOptions(BaseEmitter* self) noexcept {
- bool hasLogger = self->_logger != nullptr;
- bool hasValidationOptions;
+ bool emitComments = false;
+ bool hasDiagnosticOptions = false;
+
+ if (self->emitterType() == EmitterType::kAssembler) {
+ // Assembler: Don't emit comments if logger is not attached.
+ emitComments = self->_code != nullptr && self->_logger != nullptr;
+ hasDiagnosticOptions = self->hasDiagnosticOption(DiagnosticOptions::kValidateAssembler);
+ }
+ else {
+ // Builder/Compiler: Always emit comments, we cannot assume they won't be used.
+ emitComments = self->_code != nullptr;
+ hasDiagnosticOptions = self->hasDiagnosticOption(DiagnosticOptions::kValidateIntermediate);
+ }
- if (self->emitterType() == BaseEmitter::kTypeAssembler)
- hasValidationOptions = self->hasValidationOption(BaseEmitter::kValidationOptionAssembler);
+ if (emitComments)
+ self->_addEmitterFlags(EmitterFlags::kLogComments);
else
- hasValidationOptions = self->hasValidationOption(BaseEmitter::kValidationOptionIntermediate);
+ self->_clearEmitterFlags(EmitterFlags::kLogComments);
- self->_forcedInstOptions &= ~BaseInst::kOptionReserved;
- if (hasLogger || hasValidationOptions)
- self->_forcedInstOptions |= BaseInst::kOptionReserved;
+ // The reserved option tells emitter (Assembler/Builder/Compiler) that there may be either a border
+ // case (CodeHolder not attached, for example) or that logging or validation is required.
+ if (self->_code == nullptr || self->_logger || hasDiagnosticOptions)
+ self->_forcedInstOptions |= InstOptions::kReserved;
+ else
+ self->_forcedInstOptions &= ~InstOptions::kReserved;
}
-// ============================================================================
-// [asmjit::BaseEmitter - Validation Options]
-// ============================================================================
+// BaseEmitter - Diagnostic Options
+// ================================
-void BaseEmitter::addValidationOptions(uint32_t options) noexcept {
- _validationOptions = uint8_t(_validationOptions | options);
+void BaseEmitter::addDiagnosticOptions(DiagnosticOptions options) noexcept {
+ _diagnosticOptions |= options;
BaseEmitter_updateForcedOptions(this);
}
-void BaseEmitter::clearValidationOptions(uint32_t options) noexcept {
- _validationOptions = uint8_t(_validationOptions | options);
+void BaseEmitter::clearDiagnosticOptions(DiagnosticOptions options) noexcept {
+ _diagnosticOptions &= ~options;
BaseEmitter_updateForcedOptions(this);
}
-// ============================================================================
-// [asmjit::BaseEmitter - Logging]
-// ============================================================================
+// BaseEmitter - Logging
+// =====================
void BaseEmitter::setLogger(Logger* logger) noexcept {
#ifndef ASMJIT_NO_LOGGING
if (logger) {
_logger = logger;
- _addEmitterFlags(kFlagOwnLogger);
+ _addEmitterFlags(EmitterFlags::kOwnLogger);
}
else {
_logger = nullptr;
- _clearEmitterFlags(kFlagOwnLogger);
+ _clearEmitterFlags(EmitterFlags::kOwnLogger);
if (_code)
_logger = _code->logger();
}
@@ -134,18 +99,17 @@ void BaseEmitter::setLogger(Logger* logger) noexcept {
#endif
}
-// ============================================================================
-// [asmjit::BaseEmitter - Error Handling]
-// ============================================================================
+// BaseEmitter - Error Handling
+// ============================
void BaseEmitter::setErrorHandler(ErrorHandler* errorHandler) noexcept {
if (errorHandler) {
_errorHandler = errorHandler;
- _addEmitterFlags(kFlagOwnErrorHandler);
+ _addEmitterFlags(EmitterFlags::kOwnErrorHandler);
}
else {
_errorHandler = nullptr;
- _clearEmitterFlags(kFlagOwnErrorHandler);
+ _clearEmitterFlags(EmitterFlags::kOwnErrorHandler);
if (_code)
_errorHandler = _code->errorHandler();
}
@@ -161,58 +125,55 @@ Error BaseEmitter::reportError(Error err, const char* message) {
return err;
}
-// ============================================================================
-// [asmjit::BaseEmitter - Labels]
-// ============================================================================
+// BaseEmitter - Labels
+// ====================
Label BaseEmitter::labelByName(const char* name, size_t nameSize, uint32_t parentId) noexcept {
- return Label(_code ? _code->labelIdByName(name, nameSize, parentId) : uint32_t(Globals::kInvalidId));
+ return Label(_code ? _code->labelIdByName(name, nameSize, parentId) : Globals::kInvalidId);
}
bool BaseEmitter::isLabelValid(uint32_t labelId) const noexcept {
return _code && labelId < _code->labelCount();
}
-// ============================================================================
-// [asmjit::BaseEmitter - Emit (Low-Level)]
-// ============================================================================
+// BaseEmitter - Emit (Low-Level)
+// ==============================
using EmitterUtils::noExt;
-Error BaseEmitter::_emitI(uint32_t instId) {
+Error BaseEmitter::_emitI(InstId instId) {
return _emit(instId, noExt[0], noExt[1], noExt[2], noExt);
}
-Error BaseEmitter::_emitI(uint32_t instId, const Operand_& o0) {
+Error BaseEmitter::_emitI(InstId instId, const Operand_& o0) {
return _emit(instId, o0, noExt[1], noExt[2], noExt);
}
-Error BaseEmitter::_emitI(uint32_t instId, const Operand_& o0, const Operand_& o1) {
+Error BaseEmitter::_emitI(InstId instId, const Operand_& o0, const Operand_& o1) {
return _emit(instId, o0, o1, noExt[2], noExt);
}
-Error BaseEmitter::_emitI(uint32_t instId, const Operand_& o0, const Operand_& o1, const Operand_& o2) {
+Error BaseEmitter::_emitI(InstId instId, const Operand_& o0, const Operand_& o1, const Operand_& o2) {
return _emit(instId, o0, o1, o2, noExt);
}
-Error BaseEmitter::_emitI(uint32_t instId, const Operand_& o0, const Operand_& o1, const Operand_& o2, const Operand_& o3) {
+Error BaseEmitter::_emitI(InstId instId, const Operand_& o0, const Operand_& o1, const Operand_& o2, const Operand_& o3) {
Operand_ opExt[3] = { o3 };
return _emit(instId, o0, o1, o2, opExt);
}
-Error BaseEmitter::_emitI(uint32_t instId, const Operand_& o0, const Operand_& o1, const Operand_& o2, const Operand_& o3, const Operand_& o4) {
+Error BaseEmitter::_emitI(InstId instId, const Operand_& o0, const Operand_& o1, const Operand_& o2, const Operand_& o3, const Operand_& o4) {
Operand_ opExt[3] = { o3, o4 };
return _emit(instId, o0, o1, o2, opExt);
}
-Error BaseEmitter::_emitI(uint32_t instId, const Operand_& o0, const Operand_& o1, const Operand_& o2, const Operand_& o3, const Operand_& o4, const Operand_& o5) {
+Error BaseEmitter::_emitI(InstId instId, const Operand_& o0, const Operand_& o1, const Operand_& o2, const Operand_& o3, const Operand_& o4, const Operand_& o5) {
Operand_ opExt[3] = { o3, o4, o5 };
return _emit(instId, o0, o1, o2, opExt);
}
-Error BaseEmitter::_emitOpArray(uint32_t instId, const Operand_* operands, size_t opCount) {
+Error BaseEmitter::_emitOpArray(InstId instId, const Operand_* operands, size_t opCount) {
const Operand_* op = operands;
-
Operand_ opExt[3];
switch (opCount) {
@@ -248,75 +209,50 @@ Error BaseEmitter::_emitOpArray(uint32_t instId, const Operand_* operands, size_
}
}
-// ============================================================================
-// [asmjit::BaseEmitter - Emit (High-Level)]
-// ============================================================================
+// BaseEmitter - Emit Utilities
+// ============================
-ASMJIT_FAVOR_SIZE Error BaseEmitter::emitProlog(const FuncFrame& frame) {
+Error BaseEmitter::emitProlog(const FuncFrame& frame) {
if (ASMJIT_UNLIKELY(!_code))
return DebugUtils::errored(kErrorNotInitialized);
-#ifdef ASMJIT_BUILD_X86
- if (environment().isFamilyX86())
- return x86::X86Internal::emitProlog(as<x86::Emitter>(), frame);
-#endif
-
-#ifdef ASMJIT_BUILD_ARM
- if (environment().isFamilyARM())
- return arm::ArmInternal::emitProlog(as<arm::Emitter>(), frame);
-#endif
-
- return DebugUtils::errored(kErrorInvalidArch);
+ return _funcs.emitProlog(this, frame);
}
-ASMJIT_FAVOR_SIZE Error BaseEmitter::emitEpilog(const FuncFrame& frame) {
+Error BaseEmitter::emitEpilog(const FuncFrame& frame) {
if (ASMJIT_UNLIKELY(!_code))
return DebugUtils::errored(kErrorNotInitialized);
-#ifdef ASMJIT_BUILD_X86
- if (environment().isFamilyX86())
- return x86::X86Internal::emitEpilog(as<x86::Emitter>(), frame);
-#endif
-
-#ifdef ASMJIT_BUILD_ARM
- if (environment().isFamilyARM())
- return arm::ArmInternal::emitEpilog(as<arm::Emitter>(), frame);
-#endif
-
- return DebugUtils::errored(kErrorInvalidArch);
+ return _funcs.emitEpilog(this, frame);
}
-ASMJIT_FAVOR_SIZE Error BaseEmitter::emitArgsAssignment(const FuncFrame& frame, const FuncArgsAssignment& args) {
+Error BaseEmitter::emitArgsAssignment(const FuncFrame& frame, const FuncArgsAssignment& args) {
if (ASMJIT_UNLIKELY(!_code))
return DebugUtils::errored(kErrorNotInitialized);
-#ifdef ASMJIT_BUILD_X86
- if (environment().isFamilyX86())
- return x86::X86Internal::emitArgsAssignment(as<x86::Emitter>(), frame, args);
-#endif
-
-#ifdef ASMJIT_BUILD_ARM
- if (environment().isFamilyARM())
- return arm::ArmInternal::emitArgsAssignment(as<arm::Emitter>(), frame, args);
-#endif
-
- return DebugUtils::errored(kErrorInvalidArch);
+ return _funcs.emitArgsAssignment(this, frame, args);
}
-// ============================================================================
-// [asmjit::BaseEmitter - Comment]
-// ============================================================================
+// BaseEmitter - Comment
+// =====================
Error BaseEmitter::commentf(const char* fmt, ...) {
- if (ASMJIT_UNLIKELY(!_code))
- return DebugUtils::errored(kErrorNotInitialized);
+ if (!hasEmitterFlag(EmitterFlags::kLogComments)) {
+ if (!hasEmitterFlag(EmitterFlags::kAttached))
+ return reportError(DebugUtils::errored(kErrorNotInitialized));
+ return kErrorOk;
+ }
#ifndef ASMJIT_NO_LOGGING
+ StringTmp<1024> sb;
+
va_list ap;
va_start(ap, fmt);
- Error err = commentv(fmt, ap);
+ Error err = sb.appendVFormat(fmt, ap);
va_end(ap);
- return err;
+
+ ASMJIT_PROPAGATE(err);
+ return comment(sb.data(), sb.size());
#else
DebugUtils::unused(fmt);
return kErrorOk;
@@ -324,16 +260,17 @@ Error BaseEmitter::commentf(const char* fmt, ...) {
}
Error BaseEmitter::commentv(const char* fmt, va_list ap) {
- if (ASMJIT_UNLIKELY(!_code))
- return DebugUtils::errored(kErrorNotInitialized);
+ if (!hasEmitterFlag(EmitterFlags::kLogComments)) {
+ if (!hasEmitterFlag(EmitterFlags::kAttached))
+ return reportError(DebugUtils::errored(kErrorNotInitialized));
+ return kErrorOk;
+ }
#ifndef ASMJIT_NO_LOGGING
StringTmp<1024> sb;
Error err = sb.appendVFormat(fmt, ap);
- if (ASMJIT_UNLIKELY(err))
- return err;
-
+ ASMJIT_PROPAGATE(err);
return comment(sb.data(), sb.size());
#else
DebugUtils::unused(fmt, ap);
@@ -341,13 +278,17 @@ Error BaseEmitter::commentv(const char* fmt, va_list ap) {
#endif
}
-// ============================================================================
-// [asmjit::BaseEmitter - Events]
-// ============================================================================
+// BaseEmitter - Events
+// ====================
Error BaseEmitter::onAttach(CodeHolder* code) noexcept {
_code = code;
_environment = code->environment();
+ _addEmitterFlags(EmitterFlags::kAttached);
+
+ const ArchTraits& archTraits = ArchTraits::byArch(code->arch());
+ RegType nativeRegType = Environment::is32Bit(code->arch()) ? RegType::kGp32 : RegType::kGp64;
+ _gpSignature = archTraits.regTypeToSignature(nativeRegType);
onSettingsUpdated();
return kErrorOk;
@@ -356,20 +297,20 @@ Error BaseEmitter::onAttach(CodeHolder* code) noexcept {
Error BaseEmitter::onDetach(CodeHolder* code) noexcept {
DebugUtils::unused(code);
- _clearEmitterFlags(~kEmitterPreservedFlags);
- _forcedInstOptions = BaseInst::kOptionReserved;
- _privateData = 0;
-
if (!hasOwnLogger())
_logger = nullptr;
if (!hasOwnErrorHandler())
_errorHandler = nullptr;
+ _clearEmitterFlags(~kEmitterPreservedFlags);
+ _forcedInstOptions = InstOptions::kReserved;
+ _privateData = 0;
+
_environment.reset();
- _gpRegInfo.reset();
+ _gpSignature.reset();
- _instOptions = 0;
+ _instOptions = InstOptions::kNone;
_extraReg.reset();
_inlineComment = nullptr;
diff --git a/3rdparty/asmjit/src/asmjit/core/emitter.h b/3rdparty/asmjit/src/asmjit/core/emitter.h
index cfdb6951488..b8afd6b8e06 100644
--- a/3rdparty/asmjit/src/asmjit/core/emitter.h
+++ b/3rdparty/asmjit/src/asmjit/core/emitter.h
@@ -1,31 +1,14 @@
-// AsmJit - Machine code generation for C++
+// This file is part of AsmJit project <https://asmjit.com>
//
-// * Official AsmJit Home Page: https://asmjit.com
-// * Official Github Repository: https://github.com/asmjit/asmjit
-//
-// Copyright (c) 2008-2020 The AsmJit Authors
-//
-// This software is provided 'as-is', without any express or implied
-// warranty. In no event will the authors be held liable for any damages
-// arising from the use of this software.
-//
-// Permission is granted to anyone to use this software for any purpose,
-// including commercial applications, and to alter it and redistribute it
-// freely, subject to the following restrictions:
-//
-// 1. The origin of this software must not be misrepresented; you must not
-// claim that you wrote the original software. If you use this software
-// in a product, an acknowledgment in the product documentation would be
-// appreciated but is not required.
-// 2. Altered source versions must be plainly marked as such, and must not be
-// misrepresented as being the original software.
-// 3. This notice may not be removed or altered from any source distribution.
+// See asmjit.h or LICENSE.md for license and copyright information
+// SPDX-License-Identifier: Zlib
#ifndef ASMJIT_CORE_EMITTER_H_INCLUDED
#define ASMJIT_CORE_EMITTER_H_INCLUDED
-#include "../core/arch.h"
+#include "../core/archtraits.h"
#include "../core/codeholder.h"
+#include "../core/formatter.h"
#include "../core/inst.h"
#include "../core/operand.h"
#include "../core/type.h"
@@ -35,187 +18,273 @@ ASMJIT_BEGIN_NAMESPACE
//! \addtogroup asmjit_core
//! \{
-// ============================================================================
-// [Forward Declarations]
-// ============================================================================
-
class ConstPool;
class FuncFrame;
class FuncArgsAssignment;
-// ============================================================================
-// [asmjit::BaseEmitter]
-// ============================================================================
+//! Align mode, used by \ref BaseEmitter::align().
+enum class AlignMode : uint8_t {
+ //! Align executable code.
+ kCode = 0,
+ //! Align non-executable code.
+ kData = 1,
+ //! Align by a sequence of zeros.
+ kZero = 2,
+
+ //! Maximum value of `AlignMode`.
+ kMaxValue = kZero
+};
+
+//! Emitter type used by \ref BaseEmitter.
+enum class EmitterType : uint8_t {
+ //! Unknown or uninitialized.
+ kNone = 0,
+ //! Emitter inherits from \ref BaseAssembler.
+ kAssembler = 1,
+ //! Emitter inherits from \ref BaseBuilder.
+ kBuilder = 2,
+ //! Emitter inherits from \ref BaseCompiler.
+ kCompiler = 3,
+
+ //! Maximum value of `EmitterType`.
+ kMaxValue = kCompiler
+};
+
+//! Emitter flags, used by \ref BaseEmitter.
+enum class EmitterFlags : uint8_t {
+ //! No flags.
+ kNone = 0u,
+ //! Emitter is attached to CodeHolder.
+ kAttached = 0x01u,
+ //! The emitter must emit comments.
+ kLogComments = 0x08u,
+ //! The emitter has its own \ref Logger (not propagated from \ref CodeHolder).
+ kOwnLogger = 0x10u,
+ //! The emitter has its own \ref ErrorHandler (not propagated from \ref CodeHolder).
+ kOwnErrorHandler = 0x20u,
+ //! The emitter was finalized.
+ kFinalized = 0x40u,
+ //! The emitter was destroyed.
+ //!
+ //! This flag is used for a very short time when an emitter is being destroyed by
+ //! CodeHolder.
+ kDestroyed = 0x80u
+};
+ASMJIT_DEFINE_ENUM_FLAGS(EmitterFlags)
+
+//! Encoding options.
+enum class EncodingOptions : uint32_t {
+ //! No encoding options.
+ kNone = 0,
+
+ //! Emit instructions that are optimized for size, if possible.
+ //!
+ //! Default: false.
+ //!
+ //! X86 Specific
+ //! ------------
+ //!
+ //! When this option is set it the assembler will try to fix instructions if possible into operation equivalent
+ //! instructions that take less bytes by taking advantage of implicit zero extension. For example instruction
+ //! like `mov r64, imm` and `and r64, imm` can be translated to `mov r32, imm` and `and r32, imm` when the
+ //! immediate constant is lesser than `2^31`.
+ kOptimizeForSize = 0x00000001u,
+
+ //! Emit optimized code-alignment sequences.
+ //!
+ //! Default: false.
+ //!
+ //! X86 Specific
+ //! ------------
+ //!
+ //! Default align sequence used by X86 architecture is one-byte (0x90) opcode that is often shown by disassemblers
+ //! as NOP. However there are more optimized align sequences for 2-11 bytes that may execute faster on certain CPUs.
+ //! If this feature is enabled AsmJit will generate specialized sequences for alignment between 2 to 11 bytes.
+ kOptimizedAlign = 0x00000002u,
+
+ //! Emit jump-prediction hints.
+ //!
+ //! Default: false.
+ //!
+ //! X86 Specific
+ //! ------------
+ //!
+ //! Jump prediction is usually based on the direction of the jump. If the jump is backward it is usually predicted as
+ //! taken; and if the jump is forward it is usually predicted as not-taken. The reason is that loops generally use
+ //! backward jumps and conditions usually use forward jumps. However this behavior can be overridden by using
+ //! instruction prefixes. If this option is enabled these hints will be emitted.
+ //!
+ //! This feature is disabled by default, because the only processor that used to take into consideration prediction
+ //! hints was P4. Newer processors implement heuristics for branch prediction and ignore static hints. This means
+ //! that this feature can be only used for annotation purposes.
+ kPredictedJumps = 0x00000010u
+};
+ASMJIT_DEFINE_ENUM_FLAGS(EncodingOptions)
+
+//! Diagnostic options are used to tell emitters and their passes to perform diagnostics when emitting or processing
+//! user code. These options control validation and extra diagnostics that can be performed by higher level emitters.
+//!
+//! Instruction Validation
+//! ----------------------
+//!
+//! \ref BaseAssembler implementation perform by default only basic checks that are necessary to identify all
+//! variations of an instruction so the correct encoding can be selected. This is fine for production-ready code
+//! as the assembler doesn't have to perform checks that would slow it down. However, sometimes these checks are
+//! beneficial especially when the project that uses AsmJit is in a development phase, in which mistakes happen
+//! often. To make the experience of using AsmJit seamless it offers validation features that can be controlled
+//! by \ref DiagnosticOptions.
+//!
+//! Compiler Diagnostics
+//! --------------------
+//!
+//! Diagnostic options work with \ref BaseCompiler passes (precisely with its register allocation pass). These options
+//! can be used to enable logging of all operations that the Compiler does.
+enum class DiagnosticOptions : uint32_t {
+ //! No validation options.
+ kNone = 0,
+
+ //! Perform strict validation in \ref BaseAssembler::emit() implementations.
+ //!
+ //! This flag ensures that each instruction is checked before it's encoded into a binary representation. This flag
+ //! is only relevant for \ref BaseAssembler implementations, but can be set in any other emitter type, in that case
+ //! if that emitter needs to create an assembler on its own, for the purpose of \ref BaseEmitter::finalize() it
+ //! would propagate this flag to such assembler so all instructions passed to it are explicitly validated.
+ //!
+ //! Default: false.
+ kValidateAssembler = 0x00000001u,
+
+ //! Perform strict validation in \ref BaseBuilder::emit() and \ref BaseCompiler::emit() implementations.
+ //!
+ //! This flag ensures that each instruction is checked before an \ref InstNode representing the instruction is
+ //! created by \ref BaseBuilder or \ref BaseCompiler. This option could be more useful than \ref kValidateAssembler
+ //! in cases in which there is an invalid instruction passed to an assembler, which was invalid much earlier, most
+ //! likely when such instruction was passed to Builder/Compiler.
+ //!
+ //! This is a separate option that was introduced, because it's possible to manipulate the instruction stream
+ //! emitted by \ref BaseBuilder and \ref BaseCompiler - this means that it's allowed to emit invalid instructions
+ //! (for example with missing operands) that will be fixed later before finalizing it.
+ //!
+ //! Default: false.
+ kValidateIntermediate = 0x00000002u,
+
+ //! Annotate all nodes processed by register allocator (Compiler/RA).
+ //!
+ //! \note Annotations don't need debug options, however, some debug options like `kRADebugLiveness` may influence
+ //! their output (for example the mentioned option would add liveness information to per-instruction annotation).
+ kRAAnnotate = 0x00000080u,
+
+ //! Debug CFG generation and other related algorithms / operations (Compiler/RA).
+ kRADebugCFG = 0x00000100u,
+
+ //! Debug liveness analysis (Compiler/RA).
+ kRADebugLiveness = 0x00000200u,
+
+ //! Debug register allocation assignment (Compiler/RA).
+ kRADebugAssignment = 0x00000400u,
+
+ //! Debug the removal of code part of unreachable blocks.
+ kRADebugUnreachable = 0x00000800u,
-//! Provides a base foundation to emit code - specialized by `Assembler` and
-//! `BaseBuilder`.
+ //! Enable all debug options (Compiler/RA).
+ kRADebugAll = 0x0000FF00u,
+};
+ASMJIT_DEFINE_ENUM_FLAGS(DiagnosticOptions)
+
+//! Provides a base foundation to emitting code - specialized by \ref BaseAssembler and \ref BaseBuilder.
class ASMJIT_VIRTAPI BaseEmitter {
public:
ASMJIT_BASE_CLASS(BaseEmitter)
+ //! \name Members
+ //! \{
+
//! See \ref EmitterType.
- uint8_t _emitterType;
- //! See \ref BaseEmitter::EmitterFlags.
- uint8_t _emitterFlags;
- //! Validation flags in case validation is used, see \ref InstAPI::ValidationFlags.
+ EmitterType _emitterType = EmitterType::kNone;
+ //! See \ref EmitterFlags.
+ EmitterFlags _emitterFlags = EmitterFlags::kNone;
+ //! Validation flags in case validation is used.
//!
- //! \note Validation flags are specific to the emitter and they are setup at
- //! construction time and then never changed.
- uint8_t _validationFlags;
- //! Validation options, see \ref ValidationOptions.
- uint8_t _validationOptions;
+ //! \note Validation flags are specific to the emitter and they are setup at construction time and then never
+ //! changed.
+ ValidationFlags _validationFlags = ValidationFlags::kNone;
+ //! Validation options.
+ DiagnosticOptions _diagnosticOptions = DiagnosticOptions::kNone;
- //! Encoding options, see \ref EncodingOptions.
- uint32_t _encodingOptions;
+ //! All supported architectures in a bit-mask, where LSB is the bit with a zero index.
+ uint64_t _archMask = 0;
+
+ //! Encoding options.
+ EncodingOptions _encodingOptions = EncodingOptions::kNone;
//! Forced instruction options, combined with \ref _instOptions by \ref emit().
- uint32_t _forcedInstOptions;
+ InstOptions _forcedInstOptions = InstOptions::kReserved;
//! Internal private data used freely by any emitter.
- uint32_t _privateData;
+ uint32_t _privateData = 0;
//! CodeHolder the emitter is attached to.
- CodeHolder* _code;
+ CodeHolder* _code = nullptr;
//! Attached \ref Logger.
- Logger* _logger;
+ Logger* _logger = nullptr;
//! Attached \ref ErrorHandler.
- ErrorHandler* _errorHandler;
+ ErrorHandler* _errorHandler = nullptr;
//! Describes the target environment, matches \ref CodeHolder::environment().
- Environment _environment;
+ Environment _environment {};
//! Native GP register signature and signature related information.
- RegInfo _gpRegInfo;
+ OperandSignature _gpSignature {};
//! Next instruction options (affects the next instruction).
- uint32_t _instOptions;
+ InstOptions _instOptions = InstOptions::kNone;
//! Extra register (op-mask {k} on AVX-512) (affects the next instruction).
- RegOnly _extraReg;
+ RegOnly _extraReg {};
//! Inline comment of the next instruction (affects the next instruction).
- const char* _inlineComment;
-
- //! Emitter type.
- enum EmitterType : uint32_t {
- //! Unknown or uninitialized.
- kTypeNone = 0,
- //! Emitter inherits from \ref BaseAssembler.
- kTypeAssembler = 1,
- //! Emitter inherits from \ref BaseBuilder.
- kTypeBuilder = 2,
- //! Emitter inherits from \ref BaseCompiler.
- kTypeCompiler = 3,
-
- //! Count of emitter types.
- kTypeCount = 4
- };
+ const char* _inlineComment = nullptr;
- //! Emitter flags.
- enum EmitterFlags : uint32_t {
- //! The emitter has its own \ref Logger (not propagated from \ref CodeHolder).
- kFlagOwnLogger = 0x10u,
- //! The emitter has its own \ref ErrorHandler (not propagated from \ref CodeHolder).
- kFlagOwnErrorHandler = 0x20u,
- //! The emitter was finalized.
- kFlagFinalized = 0x40u,
- //! The emitter was destroyed.
- kFlagDestroyed = 0x80u
+ //! Function callbacks used by emitter implementation.
+ //!
+ //! These are typically shared between Assembler/Builder/Compiler of a single backend.
+ struct Funcs {
+ typedef Error (ASMJIT_CDECL* EmitProlog)(BaseEmitter* emitter, const FuncFrame& frame);
+ typedef Error (ASMJIT_CDECL* EmitEpilog)(BaseEmitter* emitter, const FuncFrame& frame);
+ typedef Error (ASMJIT_CDECL* EmitArgsAssignment)(BaseEmitter* emitter, const FuncFrame& frame, const FuncArgsAssignment& args);
+
+ typedef Error (ASMJIT_CDECL* FormatInstruction)(
+ String& sb,
+ FormatFlags formatFlags,
+ const BaseEmitter* emitter,
+ Arch arch,
+ const BaseInst& inst, const Operand_* operands, size_t opCount) ASMJIT_NOEXCEPT_TYPE;
+
+ typedef Error (ASMJIT_CDECL* ValidateFunc)(Arch arch, const BaseInst& inst, const Operand_* operands, size_t opCount, ValidationFlags validationFlags) ASMJIT_NOEXCEPT_TYPE;
+
+ //! Emit prolog implementation.
+ EmitProlog emitProlog;
+ //! Emit epilog implementation.
+ EmitEpilog emitEpilog;
+ //! Emit arguments assignment implementation.
+ EmitArgsAssignment emitArgsAssignment;
+ //! Instruction formatter implementation.
+ FormatInstruction formatInstruction;
+ //! Instruction validation implementation.
+ ValidateFunc validate;
+
+ //! Resets all functions to nullptr.
+ inline void reset() noexcept {
+ emitProlog = nullptr;
+ emitEpilog = nullptr;
+ emitArgsAssignment = nullptr;
+ validate = nullptr;
+ }
};
- //! Encoding options.
- enum EncodingOptions : uint32_t {
- //! Emit instructions that are optimized for size, if possible.
- //!
- //! Default: false.
- //!
- //! X86 Specific
- //! ------------
- //!
- //! When this option is set it the assembler will try to fix instructions
- //! if possible into operation equivalent instructions that take less bytes
- //! by taking advantage of implicit zero extension. For example instruction
- //! like `mov r64, imm` and `and r64, imm` can be translated to `mov r32, imm`
- //! and `and r32, imm` when the immediate constant is lesser than `2^31`.
- kEncodingOptionOptimizeForSize = 0x00000001u,
-
- //! Emit optimized code-alignment sequences.
- //!
- //! Default: false.
- //!
- //! X86 Specific
- //! ------------
- //!
- //! Default align sequence used by X86 architecture is one-byte (0x90)
- //! opcode that is often shown by disassemblers as NOP. However there are
- //! more optimized align sequences for 2-11 bytes that may execute faster
- //! on certain CPUs. If this feature is enabled AsmJit will generate
- //! specialized sequences for alignment between 2 to 11 bytes.
- kEncodingOptionOptimizedAlign = 0x00000002u,
-
- //! Emit jump-prediction hints.
- //!
- //! Default: false.
- //!
- //! X86 Specific
- //! ------------
- //!
- //! Jump prediction is usually based on the direction of the jump. If the
- //! jump is backward it is usually predicted as taken; and if the jump is
- //! forward it is usually predicted as not-taken. The reason is that loops
- //! generally use backward jumps and conditions usually use forward jumps.
- //! However this behavior can be overridden by using instruction prefixes.
- //! If this option is enabled these hints will be emitted.
- //!
- //! This feature is disabled by default, because the only processor that
- //! used to take into consideration prediction hints was P4. Newer processors
- //! implement heuristics for branch prediction and ignore static hints. This
- //! means that this feature can be only used for annotation purposes.
- kEncodingOptionPredictedJumps = 0x00000010u
- };
+ Funcs _funcs {};
-#ifndef ASMJIT_NO_DEPRECATED
- enum EmitterOptions : uint32_t {
- kOptionOptimizedForSize = kEncodingOptionOptimizeForSize,
- kOptionOptimizedAlign = kEncodingOptionOptimizedAlign,
- kOptionPredictedJumps = kEncodingOptionPredictedJumps
- };
-#endif
-
- //! Validation options are used to tell emitters to perform strict validation
- //! of instructions passed to \ref emit().
- //!
- //! \ref BaseAssembler implementation perform by default only basic checks
- //! that are necessary to identify all variations of an instruction so the
- //! correct encoding can be selected. This is fine for production-ready code
- //! as the assembler doesn't have to perform checks that would slow it down.
- //! However, sometimes these checks are beneficial especially when the project
- //! that uses AsmJit is in a development phase, in which mistakes happen often.
- //! To make the experience of using AsmJit seamless it offers validation
- //! features that can be controlled by `ValidationOptions`.
- enum ValidationOptions : uint32_t {
- //! Perform strict validation in \ref BaseAssembler::emit() implementations.
- //!
- //! This flag ensures that each instruction is checked before it's encoded
- //! into a binary representation. This flag is only relevant for \ref
- //! BaseAssembler implementations, but can be set in any other emitter type,
- //! in that case if that emitter needs to create an assembler on its own,
- //! for the purpose of \ref finalize() it would propagate this flag to such
- //! assembler so all instructions passed to it are explicitly validated.
- //!
- //! Default: false.
- kValidationOptionAssembler = 0x00000001u,
-
- //! Perform strict validation in \ref BaseBuilder::emit() and \ref
- //! BaseCompiler::emit() implementations.
- //!
- //! This flag ensures that each instruction is checked before an \ref
- //! InstNode representing the instruction is created by Builder or Compiler.
- //!
- //! Default: false.
- kValidationOptionIntermediate = 0x00000002u
- };
+ //! \}
//! \name Construction & Destruction
//! \{
- ASMJIT_API explicit BaseEmitter(uint32_t emitterType) noexcept;
+ ASMJIT_API explicit BaseEmitter(EmitterType emitterType) noexcept;
ASMJIT_API virtual ~BaseEmitter() noexcept;
//! \}
@@ -235,28 +304,28 @@ public:
//! \{
//! Returns the type of this emitter, see `EmitterType`.
- inline uint32_t emitterType() const noexcept { return _emitterType; }
+ inline EmitterType emitterType() const noexcept { return _emitterType; }
//! Returns emitter flags , see `Flags`.
- inline uint32_t emitterFlags() const noexcept { return _emitterFlags; }
+ inline EmitterFlags emitterFlags() const noexcept { return _emitterFlags; }
//! Tests whether the emitter inherits from `BaseAssembler`.
- inline bool isAssembler() const noexcept { return _emitterType == kTypeAssembler; }
+ inline bool isAssembler() const noexcept { return _emitterType == EmitterType::kAssembler; }
//! Tests whether the emitter inherits from `BaseBuilder`.
//!
//! \note Both Builder and Compiler emitters would return `true`.
- inline bool isBuilder() const noexcept { return _emitterType >= kTypeBuilder; }
+ inline bool isBuilder() const noexcept { return uint32_t(_emitterType) >= uint32_t(EmitterType::kBuilder); }
//! Tests whether the emitter inherits from `BaseCompiler`.
- inline bool isCompiler() const noexcept { return _emitterType == kTypeCompiler; }
+ inline bool isCompiler() const noexcept { return _emitterType == EmitterType::kCompiler; }
//! Tests whether the emitter has the given `flag` enabled.
- inline bool hasEmitterFlag(uint32_t flag) const noexcept { return (_emitterFlags & flag) != 0; }
+ inline bool hasEmitterFlag(EmitterFlags flag) const noexcept { return Support::test(_emitterFlags, flag); }
//! Tests whether the emitter is finalized.
- inline bool isFinalized() const noexcept { return hasEmitterFlag(kFlagFinalized); }
+ inline bool isFinalized() const noexcept { return hasEmitterFlag(EmitterFlags::kFinalized); }
//! Tests whether the emitter is destroyed (only used during destruction).
- inline bool isDestroyed() const noexcept { return hasEmitterFlag(kFlagDestroyed); }
+ inline bool isDestroyed() const noexcept { return hasEmitterFlag(EmitterFlags::kDestroyed); }
- inline void _addEmitterFlags(uint32_t flags) noexcept { _emitterFlags = uint8_t(_emitterFlags | flags); }
- inline void _clearEmitterFlags(uint32_t flags) noexcept { _emitterFlags = uint8_t(_emitterFlags & ~flags); }
+ inline void _addEmitterFlags(EmitterFlags flags) noexcept { _emitterFlags |= flags; }
+ inline void _clearEmitterFlags(EmitterFlags flags) noexcept { _emitterFlags &= _emitterFlags & ~flags; }
//! \}
@@ -266,7 +335,7 @@ public:
//! Returns the CodeHolder this emitter is attached to.
inline CodeHolder* code() const noexcept { return _code; }
- //! Returns the target environment, see \ref Environment.
+ //! Returns the target environment.
//!
//! The returned \ref Environment reference matches \ref CodeHolder::environment().
inline const Environment& environment() const noexcept { return _environment; }
@@ -277,9 +346,9 @@ public:
inline bool is64Bit() const noexcept { return environment().is64Bit(); }
//! Returns the target architecture type.
- inline uint32_t arch() const noexcept { return environment().arch(); }
+ inline Arch arch() const noexcept { return environment().arch(); }
//! Returns the target architecture sub-type.
- inline uint32_t subArch() const noexcept { return environment().subArch(); }
+ inline SubArch subArch() const noexcept { return environment().subArch(); }
//! Returns the target architecture's GP register size (4 or 8 bytes).
inline uint32_t registerSize() const noexcept { return environment().registerSize(); }
@@ -294,12 +363,10 @@ public:
//! Finalizes this emitter.
//!
- //! Materializes the content of the emitter by serializing it to the attached
- //! \ref CodeHolder through an architecture specific \ref BaseAssembler. This
- //! function won't do anything if the emitter inherits from \ref BaseAssembler
- //! as assemblers emit directly to a \ref CodeBuffer held by \ref CodeHolder.
- //! However, if this is an emitter that inherits from \ref BaseBuilder or \ref
- //! BaseCompiler then these emitters need the materialization phase as they
+ //! Materializes the content of the emitter by serializing it to the attached \ref CodeHolder through an architecture
+ //! specific \ref BaseAssembler. This function won't do anything if the emitter inherits from \ref BaseAssembler as
+ //! assemblers emit directly to a \ref CodeBuffer held by \ref CodeHolder. However, if this is an emitter that
+ //! inherits from \ref BaseBuilder or \ref BaseCompiler then these emitters need the materialization phase as they
//! store their content in a representation not visible to \ref CodeHolder.
ASMJIT_API virtual Error finalize();
@@ -313,29 +380,27 @@ public:
//! Tests whether the emitter has its own logger.
//!
- //! Own logger means that it overrides the possible logger that may be used
- //! by \ref CodeHolder this emitter is attached to.
- inline bool hasOwnLogger() const noexcept { return hasEmitterFlag(kFlagOwnLogger); }
+ //! Own logger means that it overrides the possible logger that may be used by \ref CodeHolder this emitter is
+ //! attached to.
+ inline bool hasOwnLogger() const noexcept { return hasEmitterFlag(EmitterFlags::kOwnLogger); }
//! Returns the logger this emitter uses.
//!
- //! The returned logger is either the emitter's own logger or it's logger
- //! used by \ref CodeHolder this emitter is attached to.
+ //! The returned logger is either the emitter's own logger or it's logger used by \ref CodeHolder this emitter
+ //! is attached to.
inline Logger* logger() const noexcept { return _logger; }
//! Sets or resets the logger of the emitter.
//!
- //! If the `logger` argument is non-null then the logger will be considered
- //! emitter's own logger, see \ref hasOwnLogger() for more details. If the
- //! given `logger` is null then the emitter will automatically use logger
+ //! If the `logger` argument is non-null then the logger will be considered emitter's own logger, see \ref
+ //! hasOwnLogger() for more details. If the given `logger` is null then the emitter will automatically use logger
//! that is attached to the \ref CodeHolder this emitter is attached to.
ASMJIT_API void setLogger(Logger* logger) noexcept;
//! Resets the logger of this emitter.
//!
- //! The emitter will bail to using a logger attached to \ref CodeHolder this
- //! emitter is attached to, or no logger at all if \ref CodeHolder doesn't
- //! have one.
+ //! The emitter will bail to using a logger attached to \ref CodeHolder this emitter is attached to, or no logger
+ //! at all if \ref CodeHolder doesn't have one.
inline void resetLogger() noexcept { return setLogger(nullptr); }
//! \}
@@ -348,14 +413,14 @@ public:
//! Tests whether the emitter has its own error handler.
//!
- //! Own error handler means that it overrides the possible error handler that
- //! may be used by \ref CodeHolder this emitter is attached to.
- inline bool hasOwnErrorHandler() const noexcept { return hasEmitterFlag(kFlagOwnErrorHandler); }
+ //! Own error handler means that it overrides the possible error handler that may be used by \ref CodeHolder this
+ //! emitter is attached to.
+ inline bool hasOwnErrorHandler() const noexcept { return hasEmitterFlag(EmitterFlags::kOwnErrorHandler); }
//! Returns the error handler this emitter uses.
//!
- //! The returned error handler is either the emitter's own error handler or
- //! it's error handler used by \ref CodeHolder this emitter is attached to.
+ //! The returned error handler is either the emitter's own error handler or it's error handler used by
+ //! \ref CodeHolder this emitter is attached to.
inline ErrorHandler* errorHandler() const noexcept { return _errorHandler; }
//! Sets or resets the error handler of the emitter.
@@ -365,11 +430,9 @@ public:
inline void resetErrorHandler() noexcept { setErrorHandler(nullptr); }
//! Handles the given error in the following way:
- //! 1. If the emitter has \ref ErrorHandler attached, it calls its
- //! \ref ErrorHandler::handleError() member function first, and
- //! then returns the error. The `handleError()` function may throw.
- //! 2. if the emitter doesn't have \ref ErrorHandler, the error is
- //! simply returned.
+ //! 1. If the emitter has \ref ErrorHandler attached, it calls its \ref ErrorHandler::handleError() member function
+ //! first, and then returns the error. The `handleError()` function may throw.
+ //! 2. if the emitter doesn't have \ref ErrorHandler, the error is simply returned.
ASMJIT_API Error reportError(Error err, const char* message = nullptr);
//! \}
@@ -377,61 +440,51 @@ public:
//! \name Encoding Options
//! \{
- //! Returns encoding options, see \ref EncodingOptions.
- inline uint32_t encodingOptions() const noexcept { return _encodingOptions; }
+ //! Returns encoding options.
+ inline EncodingOptions encodingOptions() const noexcept { return _encodingOptions; }
//! Tests whether the encoding `option` is set.
- inline bool hasEncodingOption(uint32_t option) const noexcept { return (_encodingOptions & option) != 0; }
+ inline bool hasEncodingOption(EncodingOptions option) const noexcept { return Support::test(_encodingOptions, option); }
- //! Enables the given encoding `options`, see \ref EncodingOptions.
- inline void addEncodingOptions(uint32_t options) noexcept { _encodingOptions |= options; }
- //! Disables the given encoding `options`, see \ref EncodingOptions.
- inline void clearEncodingOptions(uint32_t options) noexcept { _encodingOptions &= ~options; }
+ //! Enables the given encoding `options`.
+ inline void addEncodingOptions(EncodingOptions options) noexcept { _encodingOptions |= options; }
+ //! Disables the given encoding `options`.
+ inline void clearEncodingOptions(EncodingOptions options) noexcept { _encodingOptions &= ~options; }
//! \}
- //! \name Validation Options
+ //! \name Diagnostic Options
//! \{
- //! Returns the emitter's validation options, see \ref ValidationOptions.
- inline uint32_t validationOptions() const noexcept {
- return _validationOptions;
- }
+ //! Returns the emitter's diagnostic options.
+ inline DiagnosticOptions diagnosticOptions() const noexcept { return _diagnosticOptions; }
- //! Tests whether the given `option` is present in validation options.
- inline bool hasValidationOption(uint32_t option) const noexcept {
- return (_validationOptions & option) != 0;
- }
+ //! Tests whether the given `option` is present in the emitter's diagnostic options.
+ inline bool hasDiagnosticOption(DiagnosticOptions option) const noexcept { return Support::test(_diagnosticOptions, option); }
- //! Activates the given validation `options`, see \ref ValidationOptions.
+ //! Activates the given diagnostic `options`.
//!
- //! This function is used to activate explicit validation options that will
- //! be then used by all emitter implementations. There are in general two
- //! possibilities:
+ //! This function is used to activate explicit validation options that will be then used by all emitter
+ //! implementations. There are in general two possibilities:
//!
- //! - Architecture specific assembler is used. In this case a
- //! \ref kValidationOptionAssembler can be used to turn on explicit
- //! validation that will be used before an instruction is emitted.
- //! This means that internally an extra step will be performed to
- //! make sure that the instruction is correct. This is needed, because
- //! by default assemblers prefer speed over strictness.
+ //! - Architecture specific assembler is used. In this case a \ref DiagnosticOptions::kValidateAssembler can be
+ //! used to turn on explicit validation that will be used before an instruction is emitted. This means that
+ //! internally an extra step will be performed to make sure that the instruction is correct. This is needed,
+ //! because by default assemblers prefer speed over strictness.
//!
//! This option should be used in debug builds as it's pretty expensive.
//!
- //! - Architecture specific builder or compiler is used. In this case
- //! the user can turn on \ref kValidationOptionIntermediate option
- //! that adds explicit validation step before the Builder or Compiler
- //! creates an \ref InstNode to represent an emitted instruction. Error
- //! will be returned if the instruction is ill-formed. In addition,
- //! also \ref kValidationOptionAssembler can be used, which would not be
- //! consumed by Builder / Compiler directly, but it would be propagated
- //! to an architecture specific \ref BaseAssembler implementation it
- //! creates during \ref BaseEmitter::finalize().
- ASMJIT_API void addValidationOptions(uint32_t options) noexcept;
+ //! - Architecture specific builder or compiler is used. In this case the user can turn on
+ //! \ref DiagnosticOptions::kValidateIntermediate option that adds explicit validation step before the Builder
+ //! or Compiler creates an \ref InstNode to represent an emitted instruction. Error will be returned if the
+ //! instruction is ill-formed. In addition, also \ref DiagnosticOptions::kValidateAssembler can be used, which
+ //! would not be consumed by Builder / Compiler directly, but it would be propagated to an architecture specific
+ //! \ref BaseAssembler implementation it creates during \ref BaseEmitter::finalize().
+ ASMJIT_API void addDiagnosticOptions(DiagnosticOptions options) noexcept;
//! Deactivates the given validation `options`.
//!
- //! See \ref addValidationOptions() and \ref ValidationOptions for more details.
- ASMJIT_API void clearValidationOptions(uint32_t options) noexcept;
+ //! See \ref addDiagnosticOptions() and \ref DiagnosticOptions for more details.
+ ASMJIT_API void clearDiagnosticOptions(DiagnosticOptions options) noexcept;
//! \}
@@ -440,20 +493,19 @@ public:
//! Returns forced instruction options.
//!
- //! Forced instruction options are merged with next instruction options before
- //! the instruction is encoded. These options have some bits reserved that are
- //! used by error handling, logging, and instruction validation purposes. Other
- //! options are globals that affect each instruction.
- inline uint32_t forcedInstOptions() const noexcept { return _forcedInstOptions; }
+ //! Forced instruction options are merged with next instruction options before the instruction is encoded. These
+ //! options have some bits reserved that are used by error handling, logging, and instruction validation purposes.
+ //! Other options are globals that affect each instruction.
+ inline InstOptions forcedInstOptions() const noexcept { return _forcedInstOptions; }
//! Returns options of the next instruction.
- inline uint32_t instOptions() const noexcept { return _instOptions; }
+ inline InstOptions instOptions() const noexcept { return _instOptions; }
//! Returns options of the next instruction.
- inline void setInstOptions(uint32_t options) noexcept { _instOptions = options; }
+ inline void setInstOptions(InstOptions options) noexcept { _instOptions = options; }
//! Adds options of the next instruction.
- inline void addInstOptions(uint32_t options) noexcept { _instOptions |= options; }
+ inline void addInstOptions(InstOptions options) noexcept { _instOptions |= options; }
//! Resets options of the next instruction.
- inline void resetInstOptions() noexcept { _instOptions = 0; }
+ inline void resetInstOptions() noexcept { _instOptions = InstOptions::kNone; }
//! Tests whether the extra register operand is valid.
inline bool hasExtraReg() const noexcept { return _extraReg.isReg(); }
@@ -470,9 +522,8 @@ public:
inline const char* inlineComment() const noexcept { return _inlineComment; }
//! Sets comment/annotation of the next instruction.
//!
- //! \note This string is set back to null by `_emit()`, but until that it has
- //! to remain valid as the Emitter is not required to make a copy of it (and
- //! it would be slow to do that for each instruction).
+ //! \note This string is set back to null by `_emit()`, but until that it has to remain valid as the Emitter is not
+ //! required to make a copy of it (and it would be slow to do that for each instruction).
inline void setInlineComment(const char* s) noexcept { _inlineComment = s; }
//! Resets the comment/annotation to nullptr.
inline void resetInlineComment() noexcept { _inlineComment = nullptr; }
@@ -492,14 +543,19 @@ public:
//! Creates a new label.
virtual Label newLabel() = 0;
//! Creates a new named label.
- virtual Label newNamedLabel(const char* name, size_t nameSize = SIZE_MAX, uint32_t type = Label::kTypeGlobal, uint32_t parentId = Globals::kInvalidId) = 0;
+ virtual Label newNamedLabel(const char* name, size_t nameSize = SIZE_MAX, LabelType type = LabelType::kGlobal, uint32_t parentId = Globals::kInvalidId) = 0;
+
+ //! Creates a new anonymous label with a name, which can only be used for debugging purposes.
+ inline Label newAnonymousLabel(const char* name, size_t nameSize = SIZE_MAX) { return newNamedLabel(name, nameSize, LabelType::kAnonymous); }
+ //! Creates a new external label.
+ inline Label newExternalLabel(const char* name, size_t nameSize = SIZE_MAX) { return newNamedLabel(name, nameSize, LabelType::kExternal); }
//! Returns `Label` by `name`.
//!
//! Returns invalid Label in case that the name is invalid or label was not found.
//!
- //! \note This function doesn't trigger ErrorHandler in case the name is invalid
- //! or no such label exist. You must always check the validity of the `Label` returned.
+ //! \note This function doesn't trigger ErrorHandler in case the name is invalid or no such label exist. You must
+ //! always check the validity of the `Label` returned.
ASMJIT_API Label labelByName(const char* name, size_t nameSize = SIZE_MAX, uint32_t parentId = Globals::kInvalidId) noexcept;
//! Binds the `label` to the current position of the current section.
@@ -517,41 +573,39 @@ public:
//! \name Emit
//! \{
- // NOTE: These `emit()` helpers are designed to address a code-bloat generated
- // by C++ compilers to call a function having many arguments. Each parameter to
- // `_emit()` requires some code to pass it, which means that if we default to
- // 5 arguments in `_emit()` and instId the C++ compiler would have to generate
- // a virtual function call having 5 parameters and additional `this` argument,
- // which is quite a lot. Since by default most instructions have 2 to 3 operands
- // it's better to introduce helpers that pass from 0 to 6 operands that help to
- // reduce the size of emit(...) function call.
+ // NOTE: These `emit()` helpers are designed to address a code-bloat generated by C++ compilers to call a function
+ // having many arguments. Each parameter to `_emit()` requires some code to pass it, which means that if we default
+ // to 5 arguments in `_emit()` and instId the C++ compiler would have to generate a virtual function call having 5
+ // parameters and additional `this` argument, which is quite a lot. Since by default most instructions have 2 to 3
+ // operands it's better to introduce helpers that pass from 0 to 6 operands that help to reduce the size of emit(...)
+ // function call.
//! Emits an instruction (internal).
- ASMJIT_API Error _emitI(uint32_t instId);
+ ASMJIT_API Error _emitI(InstId instId);
//! \overload
- ASMJIT_API Error _emitI(uint32_t instId, const Operand_& o0);
+ ASMJIT_API Error _emitI(InstId instId, const Operand_& o0);
//! \overload
- ASMJIT_API Error _emitI(uint32_t instId, const Operand_& o0, const Operand_& o1);
+ ASMJIT_API Error _emitI(InstId instId, const Operand_& o0, const Operand_& o1);
//! \overload
- ASMJIT_API Error _emitI(uint32_t instId, const Operand_& o0, const Operand_& o1, const Operand_& o2);
+ ASMJIT_API Error _emitI(InstId instId, const Operand_& o0, const Operand_& o1, const Operand_& o2);
//! \overload
- ASMJIT_API Error _emitI(uint32_t instId, const Operand_& o0, const Operand_& o1, const Operand_& o2, const Operand_& o3);
+ ASMJIT_API Error _emitI(InstId instId, const Operand_& o0, const Operand_& o1, const Operand_& o2, const Operand_& o3);
//! \overload
- ASMJIT_API Error _emitI(uint32_t instId, const Operand_& o0, const Operand_& o1, const Operand_& o2, const Operand_& o3, const Operand_& o4);
+ ASMJIT_API Error _emitI(InstId instId, const Operand_& o0, const Operand_& o1, const Operand_& o2, const Operand_& o3, const Operand_& o4);
//! \overload
- ASMJIT_API Error _emitI(uint32_t instId, const Operand_& o0, const Operand_& o1, const Operand_& o2, const Operand_& o3, const Operand_& o4, const Operand_& o5);
+ ASMJIT_API Error _emitI(InstId instId, const Operand_& o0, const Operand_& o1, const Operand_& o2, const Operand_& o3, const Operand_& o4, const Operand_& o5);
//! Emits an instruction `instId` with the given `operands`.
template<typename... Args>
- ASMJIT_INLINE Error emit(uint32_t instId, Args&&... operands) {
+ ASMJIT_FORCE_INLINE Error emit(InstId instId, Args&&... operands) {
return _emitI(instId, Support::ForwardOp<Args>::forward(operands)...);
}
- inline Error emitOpArray(uint32_t instId, const Operand_* operands, size_t opCount) {
+ ASMJIT_FORCE_INLINE Error emitOpArray(InstId instId, const Operand_* operands, size_t opCount) {
return _emitOpArray(instId, operands, opCount);
}
- inline Error emitInst(const BaseInst& inst, const Operand_* operands, size_t opCount) {
+ ASMJIT_FORCE_INLINE Error emitInst(const BaseInst& inst, const Operand_* operands, size_t opCount) {
setInstOptions(inst.options());
setExtraReg(inst.extraReg());
return _emitOpArray(inst.id(), operands, opCount);
@@ -559,9 +613,9 @@ public:
//! \cond INTERNAL
//! Emits an instruction - all 6 operands must be defined.
- virtual Error _emit(uint32_t instId, const Operand_& o0, const Operand_& o1, const Operand_& o2, const Operand_* oExt) = 0;
+ virtual Error _emit(InstId instId, const Operand_& o0, const Operand_& o1, const Operand_& o2, const Operand_* oExt) = 0;
//! Emits instruction having operands stored in array.
- virtual Error _emitOpArray(uint32_t instId, const Operand_* operands, size_t opCount);
+ ASMJIT_API virtual Error _emitOpArray(InstId instId, const Operand_* operands, size_t opCount);
//! \endcond
//! \}
@@ -580,9 +634,10 @@ public:
//! Aligns the current CodeBuffer position to the `alignment` specified.
//!
- //! The sequence that is used to fill the gap between the aligned location
- //! and the current location depends on the align `mode`, see \ref AlignMode.
- virtual Error align(uint32_t alignMode, uint32_t alignment) = 0;
+ //! The sequence that is used to fill the gap between the aligned location and the current location depends on the
+ //! align `mode`, see \ref AlignMode. The `alignment` argument specifies alignment in bytes, so for example when
+ //! it's `32` it means that the code buffer will be aligned to `32` bytes.
+ virtual Error align(AlignMode alignMode, uint32_t alignment) = 0;
//! \}
@@ -595,46 +650,50 @@ public:
//! Embeds a typed data array.
//!
//! This is the most flexible function for embedding data as it allows to:
- //! - Assign a `typeId` to the data, so the emitter knows the type of
- //! items stored in `data`. Binary data should use \ref Type::kIdU8.
- //! - Repeat the given data `repeatCount` times, so the data can be used
- //! as a fill pattern for example, or as a pattern used by SIMD instructions.
- virtual Error embedDataArray(uint32_t typeId, const void* data, size_t itemCount, size_t repeatCount = 1) = 0;
+ //!
+ //! - Assign a `typeId` to the data, so the emitter knows the type of items stored in `data`. Binary data should
+ //! use \ref TypeId::kUInt8.
+ //!
+ //! - Repeat the given data `repeatCount` times, so the data can be used as a fill pattern for example, or as a
+ //! pattern used by SIMD instructions.
+ virtual Error embedDataArray(TypeId typeId, const void* data, size_t itemCount, size_t repeatCount = 1) = 0;
//! Embeds int8_t `value` repeated by `repeatCount`.
- inline Error embedInt8(int8_t value, size_t repeatCount = 1) { return embedDataArray(Type::kIdI8, &value, 1, repeatCount); }
+ inline Error embedInt8(int8_t value, size_t repeatCount = 1) { return embedDataArray(TypeId::kInt8, &value, 1, repeatCount); }
//! Embeds uint8_t `value` repeated by `repeatCount`.
- inline Error embedUInt8(uint8_t value, size_t repeatCount = 1) { return embedDataArray(Type::kIdU8, &value, 1, repeatCount); }
+ inline Error embedUInt8(uint8_t value, size_t repeatCount = 1) { return embedDataArray(TypeId::kUInt8, &value, 1, repeatCount); }
//! Embeds int16_t `value` repeated by `repeatCount`.
- inline Error embedInt16(int16_t value, size_t repeatCount = 1) { return embedDataArray(Type::kIdI16, &value, 1, repeatCount); }
+ inline Error embedInt16(int16_t value, size_t repeatCount = 1) { return embedDataArray(TypeId::kInt16, &value, 1, repeatCount); }
//! Embeds uint16_t `value` repeated by `repeatCount`.
- inline Error embedUInt16(uint16_t value, size_t repeatCount = 1) { return embedDataArray(Type::kIdU16, &value, 1, repeatCount); }
+ inline Error embedUInt16(uint16_t value, size_t repeatCount = 1) { return embedDataArray(TypeId::kUInt16, &value, 1, repeatCount); }
//! Embeds int32_t `value` repeated by `repeatCount`.
- inline Error embedInt32(int32_t value, size_t repeatCount = 1) { return embedDataArray(Type::kIdI32, &value, 1, repeatCount); }
+ inline Error embedInt32(int32_t value, size_t repeatCount = 1) { return embedDataArray(TypeId::kInt32, &value, 1, repeatCount); }
//! Embeds uint32_t `value` repeated by `repeatCount`.
- inline Error embedUInt32(uint32_t value, size_t repeatCount = 1) { return embedDataArray(Type::kIdU32, &value, 1, repeatCount); }
+ inline Error embedUInt32(uint32_t value, size_t repeatCount = 1) { return embedDataArray(TypeId::kUInt32, &value, 1, repeatCount); }
//! Embeds int64_t `value` repeated by `repeatCount`.
- inline Error embedInt64(int64_t value, size_t repeatCount = 1) { return embedDataArray(Type::kIdI64, &value, 1, repeatCount); }
+ inline Error embedInt64(int64_t value, size_t repeatCount = 1) { return embedDataArray(TypeId::kInt64, &value, 1, repeatCount); }
//! Embeds uint64_t `value` repeated by `repeatCount`.
- inline Error embedUInt64(uint64_t value, size_t repeatCount = 1) { return embedDataArray(Type::kIdU64, &value, 1, repeatCount); }
+ inline Error embedUInt64(uint64_t value, size_t repeatCount = 1) { return embedDataArray(TypeId::kUInt64, &value, 1, repeatCount); }
//! Embeds a floating point `value` repeated by `repeatCount`.
- inline Error embedFloat(float value, size_t repeatCount = 1) { return embedDataArray(Type::kIdF32, &value, 1, repeatCount); }
+ inline Error embedFloat(float value, size_t repeatCount = 1) { return embedDataArray(TypeId(TypeUtils::TypeIdOfT<float>::kTypeId), &value, 1, repeatCount); }
//! Embeds a floating point `value` repeated by `repeatCount`.
- inline Error embedDouble(double value, size_t repeatCount = 1) { return embedDataArray(Type::IdOfT<double>::kTypeId, &value, 1, repeatCount); }
+ inline Error embedDouble(double value, size_t repeatCount = 1) { return embedDataArray(TypeId(TypeUtils::TypeIdOfT<double>::kTypeId), &value, 1, repeatCount); }
//! Embeds a constant pool at the current offset by performing the following:
- //! 1. Aligns by using kAlignData to the minimum `pool` alignment.
+ //! 1. Aligns by using AlignMode::kData to the minimum `pool` alignment.
//! 2. Binds the ConstPool label so it's bound to an aligned location.
//! 3. Emits ConstPool content.
virtual Error embedConstPool(const Label& label, const ConstPool& pool) = 0;
- //! Embeds an absolute label address as data (4 or 8 bytes).
- virtual Error embedLabel(const Label& label) = 0;
+ //! Embeds an absolute `label` address as data.
+ //!
+ //! The `dataSize` is an optional argument that can be used to specify the size of the address data. If it's zero
+ //! (default) the address size is deduced from the target architecture (either 4 or 8 bytes).
+ virtual Error embedLabel(const Label& label, size_t dataSize = 0) = 0;
- //! Embeds a delta (distance) between the `label` and `base` calculating it
- //! as `label - base`. This function was designed to make it easier to embed
- //! lookup tables where each index is a relative distance of two labels.
- virtual Error embedLabelDelta(const Label& label, const Label& base, size_t dataSize) = 0;
+ //! Embeds a delta (distance) between the `label` and `base` calculating it as `label - base`. This function was
+ //! designed to make it easier to embed lookup tables where each index is a relative distance of two labels.
+ virtual Error embedLabelDelta(const Label& label, const Label& base, size_t dataSize = 0) = 0;
//! \}
@@ -655,52 +714,24 @@ public:
//! \{
//! Called after the emitter was attached to `CodeHolder`.
- virtual Error onAttach(CodeHolder* code) noexcept = 0;
+ virtual Error onAttach(CodeHolder* ASMJIT_NONNULL(code)) noexcept = 0;
//! Called after the emitter was detached from `CodeHolder`.
- virtual Error onDetach(CodeHolder* code) noexcept = 0;
+ virtual Error onDetach(CodeHolder* ASMJIT_NONNULL(code)) noexcept = 0;
- //! Called when \ref CodeHolder has updated an important setting, which
- //! involves the following:
+ //! Called when \ref CodeHolder has updated an important setting, which involves the following:
+ //!
+ //! - \ref Logger has been changed (\ref CodeHolder::setLogger() has been called).
//!
- //! - \ref Logger has been changed (\ref CodeHolder::setLogger() has been
- //! called).
- //! - \ref ErrorHandler has been changed (\ref CodeHolder::setErrorHandler()
- //! has been called).
+ //! - \ref ErrorHandler has been changed (\ref CodeHolder::setErrorHandler() has been called).
//!
- //! This function ensures that the settings are properly propagated from
- //! \ref CodeHolder to the emitter.
+ //! This function ensures that the settings are properly propagated from \ref CodeHolder to the emitter.
//!
- //! \note This function is virtual and can be overridden, however, if you
- //! do so, always call \ref BaseEmitter::onSettingsUpdated() within your
- //! own implementation to ensure that the emitter is in a consisten state.
+ //! \note This function is virtual and can be overridden, however, if you do so, always call \ref
+ //! BaseEmitter::onSettingsUpdated() within your own implementation to ensure that the emitter is
+ //! in a consistent state.
ASMJIT_API virtual void onSettingsUpdated() noexcept;
//! \}
-
-#ifndef ASMJIT_NO_DEPRECATED
- ASMJIT_DEPRECATED("Use environment() instead")
- inline CodeInfo codeInfo() const noexcept {
- return CodeInfo(_environment, _code ? _code->baseAddress() : Globals::kNoBaseAddress);
- }
-
- ASMJIT_DEPRECATED("Use arch() instead")
- inline uint32_t archId() const noexcept { return arch(); }
-
- ASMJIT_DEPRECATED("Use registerSize() instead")
- inline uint32_t gpSize() const noexcept { return registerSize(); }
-
- ASMJIT_DEPRECATED("Use encodingOptions() instead")
- inline uint32_t emitterOptions() const noexcept { return encodingOptions(); }
-
- ASMJIT_DEPRECATED("Use addEncodingOptions() instead")
- inline void addEmitterOptions(uint32_t options) noexcept { addEncodingOptions(options); }
-
- ASMJIT_DEPRECATED("Use clearEncodingOptions() instead")
- inline void clearEmitterOptions(uint32_t options) noexcept { clearEncodingOptions(options); }
-
- ASMJIT_DEPRECATED("Use forcedInstOptions() instead")
- inline uint32_t globalInstOptions() const noexcept { return forcedInstOptions(); }
-#endif // !ASMJIT_NO_DEPRECATED
};
//! \}
diff --git a/3rdparty/asmjit/src/asmjit/core/emitterutils.cpp b/3rdparty/asmjit/src/asmjit/core/emitterutils.cpp
index 1115934e21e..f36a1b37745 100644
--- a/3rdparty/asmjit/src/asmjit/core/emitterutils.cpp
+++ b/3rdparty/asmjit/src/asmjit/core/emitterutils.cpp
@@ -1,57 +1,33 @@
-// AsmJit - Machine code generation for C++
+// This file is part of AsmJit project <https://asmjit.com>
//
-// * Official AsmJit Home Page: https://asmjit.com
-// * Official Github Repository: https://github.com/asmjit/asmjit
-//
-// Copyright (c) 2008-2020 The AsmJit Authors
-//
-// This software is provided 'as-is', without any express or implied
-// warranty. In no event will the authors be held liable for any damages
-// arising from the use of this software.
-//
-// Permission is granted to anyone to use this software for any purpose,
-// including commercial applications, and to alter it and redistribute it
-// freely, subject to the following restrictions:
-//
-// 1. The origin of this software must not be misrepresented; you must not
-// claim that you wrote the original software. If you use this software
-// in a product, an acknowledgment in the product documentation would be
-// appreciated but is not required.
-// 2. Altered source versions must be plainly marked as such, and must not be
-// misrepresented as being the original software.
-// 3. This notice may not be removed or altered from any source distribution.
+// See asmjit.h or LICENSE.md for license and copyright information
+// SPDX-License-Identifier: Zlib
#include "../core/api-build_p.h"
#include "../core/assembler.h"
#include "../core/emitterutils_p.h"
-#include "../core/formatter.h"
+#include "../core/formatter_p.h"
#include "../core/logger.h"
#include "../core/support.h"
ASMJIT_BEGIN_NAMESPACE
-// ============================================================================
-// [asmjit::EmitterUtils]
-// ============================================================================
-
namespace EmitterUtils {
#ifndef ASMJIT_NO_LOGGING
-Error formatLine(String& sb, const uint8_t* binData, size_t binSize, size_t dispSize, size_t immSize, const char* comment) noexcept {
- size_t currentSize = sb.size();
- size_t commentSize = comment ? Support::strLen(comment, Globals::kMaxCommentSize) : 0;
-
- ASMJIT_ASSERT(binSize >= dispSize);
+Error finishFormattedLine(String& sb, const FormatOptions& formatOptions, const uint8_t* binData, size_t binSize, size_t offsetSize, size_t immSize, const char* comment) noexcept {
+ ASMJIT_ASSERT(binSize >= offsetSize);
const size_t kNoBinSize = SIZE_MAX;
+ size_t commentSize = comment ? Support::strLen(comment, Globals::kMaxCommentSize) : 0;
+
if ((binSize != 0 && binSize != kNoBinSize) || commentSize) {
- size_t align = kMaxInstLineSize;
char sep = ';';
+ size_t padding = Formatter::paddingFromOptions(formatOptions, FormatPaddingGroup::kRegularLine);
for (size_t i = (binSize == kNoBinSize); i < 2; i++) {
- size_t begin = sb.size();
- ASMJIT_PROPAGATE(sb.padEnd(align));
+ ASMJIT_PROPAGATE(sb.padEnd(padding));
if (sep) {
ASMJIT_PROPAGATE(sb.append(sep));
@@ -60,8 +36,8 @@ Error formatLine(String& sb, const uint8_t* binData, size_t binSize, size_t disp
// Append binary data or comment.
if (i == 0) {
- ASMJIT_PROPAGATE(sb.appendHex(binData, binSize - dispSize - immSize));
- ASMJIT_PROPAGATE(sb.appendChars('.', dispSize * 2));
+ ASMJIT_PROPAGATE(sb.appendHex(binData, binSize - offsetSize - immSize));
+ ASMJIT_PROPAGATE(sb.appendChars('.', offsetSize * 2));
ASMJIT_PROPAGATE(sb.appendHex(binData + binSize - immSize, immSize));
if (commentSize == 0) break;
}
@@ -69,9 +45,8 @@ Error formatLine(String& sb, const uint8_t* binData, size_t binSize, size_t disp
ASMJIT_PROPAGATE(sb.append(comment, commentSize));
}
- currentSize += sb.size() - begin;
- align += kMaxBinarySize;
sep = '|';
+ padding += Formatter::paddingFromOptions(formatOptions, FormatPaddingGroup::kMachineCode);
}
}
@@ -82,55 +57,59 @@ void logLabelBound(BaseAssembler* self, const Label& label) noexcept {
Logger* logger = self->logger();
StringTmp<512> sb;
- size_t binSize = logger->hasFlag(FormatOptions::kFlagMachineCode) ? size_t(0) : SIZE_MAX;
+ size_t binSize = logger->hasFlag(FormatFlags::kMachineCode) ? size_t(0) : SIZE_MAX;
- sb.appendChars(' ', logger->indentation(FormatOptions::kIndentationLabel));
+ sb.appendChars(' ', logger->indentation(FormatIndentationGroup::kLabel));
Formatter::formatLabel(sb, logger->flags(), self, label.id());
sb.append(':');
- EmitterUtils::formatLine(sb, nullptr, binSize, 0, 0, self->_inlineComment);
+ finishFormattedLine(sb, logger->options(), nullptr, binSize, 0, 0, self->_inlineComment);
logger->log(sb.data(), sb.size());
}
void logInstructionEmitted(
BaseAssembler* self,
- uint32_t instId, uint32_t options, const Operand_& o0, const Operand_& o1, const Operand_& o2, const Operand_* opExt,
+ InstId instId,
+ InstOptions options,
+ const Operand_& o0, const Operand_& o1, const Operand_& o2, const Operand_* opExt,
uint32_t relSize, uint32_t immSize, uint8_t* afterCursor) {
Logger* logger = self->logger();
ASMJIT_ASSERT(logger != nullptr);
StringTmp<256> sb;
- uint32_t flags = logger->flags();
+ FormatFlags formatFlags = logger->flags();
uint8_t* beforeCursor = self->bufferPtr();
intptr_t emittedSize = (intptr_t)(afterCursor - beforeCursor);
Operand_ opArray[Globals::kMaxOpCount];
- EmitterUtils::opArrayFromEmitArgs(opArray, o0, o1, o2, opExt);
+ opArrayFromEmitArgs(opArray, o0, o1, o2, opExt);
- sb.appendChars(' ', logger->indentation(FormatOptions::kIndentationCode));
- Formatter::formatInstruction(sb, flags, self, self->arch(), BaseInst(instId, options, self->extraReg()), opArray, Globals::kMaxOpCount);
+ sb.appendChars(' ', logger->indentation(FormatIndentationGroup::kCode));
+ self->_funcs.formatInstruction(sb, formatFlags, self, self->arch(), BaseInst(instId, options, self->extraReg()), opArray, Globals::kMaxOpCount);
- if ((flags & FormatOptions::kFlagMachineCode) != 0)
- EmitterUtils::formatLine(sb, self->bufferPtr(), size_t(emittedSize), relSize, immSize, self->inlineComment());
+ if (Support::test(formatFlags, FormatFlags::kMachineCode))
+ finishFormattedLine(sb, logger->options(), self->bufferPtr(), size_t(emittedSize), relSize, immSize, self->inlineComment());
else
- EmitterUtils::formatLine(sb, nullptr, SIZE_MAX, 0, 0, self->inlineComment());
+ finishFormattedLine(sb, logger->options(), nullptr, SIZE_MAX, 0, 0, self->inlineComment());
logger->log(sb);
}
Error logInstructionFailed(
BaseAssembler* self,
Error err,
- uint32_t instId, uint32_t options, const Operand_& o0, const Operand_& o1, const Operand_& o2, const Operand_* opExt) {
+ InstId instId,
+ InstOptions options,
+ const Operand_& o0, const Operand_& o1, const Operand_& o2, const Operand_* opExt) {
StringTmp<256> sb;
sb.append(DebugUtils::errorAsString(err));
sb.append(": ");
Operand_ opArray[Globals::kMaxOpCount];
- EmitterUtils::opArrayFromEmitArgs(opArray, o0, o1, o2, opExt);
+ opArrayFromEmitArgs(opArray, o0, o1, o2, opExt);
- Formatter::formatInstruction(sb, 0, self, self->arch(), BaseInst(instId, options, self->extraReg()), opArray, Globals::kMaxOpCount);
+ self->_funcs.formatInstruction(sb, FormatFlags::kNone, self, self->arch(), BaseInst(instId, options, self->extraReg()), opArray, Globals::kMaxOpCount);
if (self->inlineComment()) {
sb.append(" ; ");
diff --git a/3rdparty/asmjit/src/asmjit/core/emitterutils_p.h b/3rdparty/asmjit/src/asmjit/core/emitterutils_p.h
index 7e222d3ad00..b7610e70261 100644
--- a/3rdparty/asmjit/src/asmjit/core/emitterutils_p.h
+++ b/3rdparty/asmjit/src/asmjit/core/emitterutils_p.h
@@ -1,25 +1,7 @@
-// AsmJit - Machine code generation for C++
+// This file is part of AsmJit project <https://asmjit.com>
//
-// * Official AsmJit Home Page: https://asmjit.com
-// * Official Github Repository: https://github.com/asmjit/asmjit
-//
-// Copyright (c) 2008-2020 The AsmJit Authors
-//
-// This software is provided 'as-is', without any express or implied
-// warranty. In no event will the authors be held liable for any damages
-// arising from the use of this software.
-//
-// Permission is granted to anyone to use this software for any purpose,
-// including commercial applications, and to alter it and redistribute it
-// freely, subject to the following restrictions:
-//
-// 1. The origin of this software must not be misrepresented; you must not
-// claim that you wrote the original software. If you use this software
-// in a product, an acknowledgment in the product documentation would be
-// appreciated but is not required.
-// 2. Altered source versions must be plainly marked as such, and must not be
-// misrepresented as being the original software.
-// 3. This notice may not be removed or altered from any source distribution.
+// See asmjit.h or LICENSE.md for license and copyright information
+// SPDX-License-Identifier: Zlib
#ifndef ASMJIT_CORE_EMITTERUTILS_P_H_INCLUDED
#define ASMJIT_CORE_EMITTERUTILS_P_H_INCLUDED
@@ -30,26 +12,26 @@
ASMJIT_BEGIN_NAMESPACE
class BaseAssembler;
+class FormatOptions;
//! \cond INTERNAL
//! \addtogroup asmjit_core
//! \{
-// ============================================================================
-// [asmjit::EmitterUtils]
-// ============================================================================
-
+//! Utilities used by various emitters, mostly Assembler implementations.
namespace EmitterUtils {
-static const Operand_ noExt[3] {};
+//! Default paddings used by Emitter utils and Formatter.
+
+static constexpr Operand noExt[3];
-enum kOpIndex {
+enum kOpIndex : uint32_t {
kOp3 = 0,
kOp4 = 1,
kOp5 = 2
};
-static ASMJIT_INLINE uint32_t opCountFromEmitArgs(const Operand_& o0, const Operand_& o1, const Operand_& o2, const Operand_* opExt) noexcept {
+static ASMJIT_FORCE_INLINE uint32_t opCountFromEmitArgs(const Operand_& o0, const Operand_& o1, const Operand_& o2, const Operand_* opExt) noexcept {
uint32_t opCount = 0;
if (opExt[kOp3].isNone()) {
@@ -67,7 +49,7 @@ static ASMJIT_INLINE uint32_t opCountFromEmitArgs(const Operand_& o0, const Oper
return opCount;
}
-static ASMJIT_INLINE void opArrayFromEmitArgs(Operand_ dst[Globals::kMaxOpCount], const Operand_& o0, const Operand_& o1, const Operand_& o2, const Operand_* opExt) noexcept {
+static ASMJIT_FORCE_INLINE void opArrayFromEmitArgs(Operand_ dst[Globals::kMaxOpCount], const Operand_& o0, const Operand_& o1, const Operand_& o2, const Operand_* opExt) noexcept {
dst[0].copyFrom(o0);
dst[1].copyFrom(o1);
dst[2].copyFrom(o2);
@@ -77,25 +59,23 @@ static ASMJIT_INLINE void opArrayFromEmitArgs(Operand_ dst[Globals::kMaxOpCount]
}
#ifndef ASMJIT_NO_LOGGING
-enum : uint32_t {
- // Has to be big to be able to hold all metadata compiler can assign to a
- // single instruction.
- kMaxInstLineSize = 44,
- kMaxBinarySize = 26
-};
-
-Error formatLine(String& sb, const uint8_t* binData, size_t binSize, size_t dispSize, size_t immSize, const char* comment) noexcept;
+Error finishFormattedLine(String& sb, const FormatOptions& formatOptions, const uint8_t* binData, size_t binSize, size_t offsetSize, size_t immSize, const char* comment) noexcept;
void logLabelBound(BaseAssembler* self, const Label& label) noexcept;
void logInstructionEmitted(
BaseAssembler* self,
- uint32_t instId, uint32_t options, const Operand_& o0, const Operand_& o1, const Operand_& o2, const Operand_* opExt,
+ InstId instId,
+ InstOptions options,
+ const Operand_& o0, const Operand_& o1, const Operand_& o2, const Operand_* opExt,
uint32_t relSize, uint32_t immSize, uint8_t* afterCursor);
Error logInstructionFailed(
BaseAssembler* self,
- Error err, uint32_t instId, uint32_t options, const Operand_& o0, const Operand_& o1, const Operand_& o2, const Operand_* opExt);
+ Error err,
+ InstId instId,
+ InstOptions options,
+ const Operand_& o0, const Operand_& o1, const Operand_& o2, const Operand_* opExt);
#endif
}
diff --git a/3rdparty/asmjit/src/asmjit/core/environment.cpp b/3rdparty/asmjit/src/asmjit/core/environment.cpp
index 3be2b15a590..9a694af610e 100644
--- a/3rdparty/asmjit/src/asmjit/core/environment.cpp
+++ b/3rdparty/asmjit/src/asmjit/core/environment.cpp
@@ -1,25 +1,7 @@
-// AsmJit - Machine code generation for C++
+// This file is part of AsmJit project <https://asmjit.com>
//
-// * Official AsmJit Home Page: https://asmjit.com
-// * Official Github Repository: https://github.com/asmjit/asmjit
-//
-// Copyright (c) 2008-2020 The AsmJit Authors
-//
-// This software is provided 'as-is', without any express or implied
-// warranty. In no event will the authors be held liable for any damages
-// arising from the use of this software.
-//
-// Permission is granted to anyone to use this software for any purpose,
-// including commercial applications, and to alter it and redistribute it
-// freely, subject to the following restrictions:
-//
-// 1. The origin of this software must not be misrepresented; you must not
-// claim that you wrote the original software. If you use this software
-// in a product, an acknowledgment in the product documentation would be
-// appreciated but is not required.
-// 2. Altered source versions must be plainly marked as such, and must not be
-// misrepresented as being the original software.
-// 3. This notice may not be removed or altered from any source distribution.
+// See asmjit.h or LICENSE.md for license and copyright information
+// SPDX-License-Identifier: Zlib
#include "../core/api-build_p.h"
#include "../core/environment.h"
diff --git a/3rdparty/asmjit/src/asmjit/core/environment.h b/3rdparty/asmjit/src/asmjit/core/environment.h
index 99b34ec9dbd..7e328a97c8e 100644
--- a/3rdparty/asmjit/src/asmjit/core/environment.h
+++ b/3rdparty/asmjit/src/asmjit/core/environment.h
@@ -1,30 +1,12 @@
-// AsmJit - Machine code generation for C++
+// This file is part of AsmJit project <https://asmjit.com>
//
-// * Official AsmJit Home Page: https://asmjit.com
-// * Official Github Repository: https://github.com/asmjit/asmjit
-//
-// Copyright (c) 2008-2020 The AsmJit Authors
-//
-// This software is provided 'as-is', without any express or implied
-// warranty. In no event will the authors be held liable for any damages
-// arising from the use of this software.
-//
-// Permission is granted to anyone to use this software for any purpose,
-// including commercial applications, and to alter it and redistribute it
-// freely, subject to the following restrictions:
-//
-// 1. The origin of this software must not be misrepresented; you must not
-// claim that you wrote the original software. If you use this software
-// in a product, an acknowledgment in the product documentation would be
-// appreciated but is not required.
-// 2. Altered source versions must be plainly marked as such, and must not be
-// misrepresented as being the original software.
-// 3. This notice may not be removed or altered from any source distribution.
+// See asmjit.h or LICENSE.md for license and copyright information
+// SPDX-License-Identifier: Zlib
#ifndef ASMJIT_CORE_ENVIRONMENT_H_INCLUDED
#define ASMJIT_CORE_ENVIRONMENT_H_INCLUDED
-#include "../core/globals.h"
+#include "../core/archtraits.h"
#if defined(__APPLE__)
#include <TargetConditionals.h>
@@ -35,301 +17,222 @@ ASMJIT_BEGIN_NAMESPACE
//! \addtogroup asmjit_core
//! \{
-// ============================================================================
-// [asmjit::Environment]
-// ============================================================================
-
-//! Represents an environment, which is usually related to a \ref Target.
-//!
-//! Environment has usually an 'arch-subarch-vendor-os-abi' format, which is
-//! sometimes called "Triple" (historically it used to be 3 only parts) or
-//! "Tuple", which is a convention used by Debian Linux.
+//! Vendor.
//!
-//! AsmJit doesn't support all possible combinations or architectures and ABIs,
-//! however, it models the environment similarly to other compilers for future
-//! extensibility.
-class Environment {
-public:
- //! Architecture type, see \ref Arch.
- uint8_t _arch;
- //! Sub-architecture type, see \ref SubArch.
- uint8_t _subArch;
- //! Vendor type, see \ref Vendor.
- uint8_t _vendor;
- //! Platform type, see \ref Platform.
- uint8_t _platform;
- //! ABI type, see \ref Abi.
- uint8_t _abi;
- //! Object format, see \ref Format.
- uint8_t _format;
- //! Reserved for future use, must be zero.
- uint16_t _reserved;
-
- //! Architecture.
- enum Arch : uint32_t {
- //! Unknown or uninitialized architecture.
- kArchUnknown = 0,
-
- //! Mask used by 32-bit architectures (odd are 32-bit, even are 64-bit).
- kArch32BitMask = 0x01,
- //! Mask used by big-endian architectures.
- kArchBigEndianMask = 0x80u,
-
- //! 32-bit X86 architecture.
- kArchX86 = 1,
- //! 64-bit X86 architecture also known as X86_64 and AMD64.
- kArchX64 = 2,
-
- //! 32-bit RISC-V architecture.
- kArchRISCV32 = 3,
- //! 64-bit RISC-V architecture.
- kArchRISCV64 = 4,
-
- //! 32-bit ARM architecture (little endian).
- kArchARM = 5,
- //! 32-bit ARM architecture (big endian).
- kArchARM_BE = kArchARM | kArchBigEndianMask,
- //! 64-bit ARM architecture in (little endian).
- kArchAArch64 = 6,
- //! 64-bit ARM architecture in (big endian).
- kArchAArch64_BE = kArchAArch64 | kArchBigEndianMask,
- //! 32-bit ARM in Thumb mode (little endian).
- kArchThumb = 7,
- //! 32-bit ARM in Thumb mode (big endian).
- kArchThumb_BE = kArchThumb | kArchBigEndianMask,
-
- // 8 is not used, even numbers are 64-bit architectures.
-
- //! 32-bit MIPS architecture in (little endian).
- kArchMIPS_LE = 9,
- //! 32-bit MIPS architecture in (big endian).
- kArchMIPS_BE = kArchMIPS_LE | kArchBigEndianMask,
- //! 64-bit MIPS architecture in (little endian).
- kArchMIPS64_LE = 10,
- //! 64-bit MIPS architecture in (big endian).
- kArchMIPS64_BE = kArchMIPS64_LE | kArchBigEndianMask,
-
- //! Count of architectures.
- kArchCount
- };
-
- //! Sub-architecture.
- enum SubArch : uint32_t {
- //! Unknown or uninitialized architecture sub-type.
- kSubArchUnknown = 0,
-
- //! Count of sub-architectures.
- kSubArchCount
- };
-
- //! Vendor.
- //!
- //! \note AsmJit doesn't use vendor information at the moment. It's provided
- //! for future use, if required.
- enum Vendor : uint32_t {
- //! Unknown or uninitialized vendor.
- kVendorUnknown = 0,
-
- //! Count of vendor identifiers.
- kVendorCount
- };
-
- //! Platform / OS.
- enum Platform : uint32_t {
- //! Unknown or uninitialized platform.
- kPlatformUnknown = 0,
-
- //! Windows OS.
- kPlatformWindows,
-
- //! Other platform, most likely POSIX based.
- kPlatformOther,
-
- //! Linux OS.
- kPlatformLinux,
- //! GNU/Hurd OS.
- kPlatformHurd,
-
- //! FreeBSD OS.
- kPlatformFreeBSD,
- //! OpenBSD OS.
- kPlatformOpenBSD,
- //! NetBSD OS.
- kPlatformNetBSD,
- //! DragonFly BSD OS.
- kPlatformDragonFlyBSD,
-
- //! Haiku OS.
- kPlatformHaiku,
-
- //! Apple OSX.
- kPlatformOSX,
- //! Apple iOS.
- kPlatformIOS,
- //! Apple TVOS.
- kPlatformTVOS,
- //! Apple WatchOS.
- kPlatformWatchOS,
-
- //! Emscripten platform.
- kPlatformEmscripten,
-
- //! Count of platform identifiers.
- kPlatformCount
- };
-
- //! ABI.
- enum Abi : uint32_t {
- //! Unknown or uninitialied environment.
- kAbiUnknown = 0,
- //! Microsoft ABI.
- kAbiMSVC,
- //! GNU ABI.
- kAbiGNU,
- //! Android Environment / ABI.
- kAbiAndroid,
- //! Cygwin ABI.
- kAbiCygwin,
-
- //! Count of known ABI types.
- kAbiCount
- };
-
- //! Object format.
- //!
- //! \note AsmJit doesn't really use anything except \ref kFormatUnknown and
- //! \ref kFormatJIT at the moment. Object file formats are provided for
- //! future extensibility and a possibility to generate object files at some
- //! point.
- enum Format : uint32_t {
- //! Unknown or uninitialized object format.
- kFormatUnknown = 0,
-
- //! JIT code generation object, most likely \ref JitRuntime or a custom
- //! \ref Target implementation.
- kFormatJIT,
-
- //! Executable and linkable format (ELF).
- kFormatELF,
- //! Common object file format.
- kFormatCOFF,
- //! Extended COFF object format.
- kFormatXCOFF,
- //! Mach object file format.
- kFormatMachO,
-
- //! Count of object format types.
- kFormatCount
- };
-
- //! \name Environment Detection
- //! \{
-
-#ifdef _DOXYGEN
- //! Architecture detected at compile-time (architecture of the host).
- static constexpr Arch kArchHost = DETECTED_AT_COMPILE_TIME;
- //! Sub-architecture detected at compile-time (sub-architecture of the host).
- static constexpr SubArch kSubArchHost = DETECTED_AT_COMPILE_TIME;
- //! Vendor detected at compile-time (vendor of the host).
- static constexpr Vendor kVendorHost = DETECTED_AT_COMPILE_TIME;
- //! Platform detected at compile-time (platform of the host).
- static constexpr Platform kPlatformHost = DETECTED_AT_COMPILE_TIME;
- //! ABI detected at compile-time (ABI of the host).
- static constexpr Abi kAbiHost = DETECTED_AT_COMPILE_TIME;
+//! \note AsmJit doesn't use vendor information at the moment. It's provided for future use, if required.
+enum class Vendor : uint8_t {
+ //! Unknown or uninitialized platform vendor.
+ kUnknown = 0,
+
+ //! Maximum value of `PlatformVendor`.
+ kMaxValue = kUnknown,
+
+ //! Platform vendor detected at compile-time.
+ kHost =
+#if defined(_DOXYGEN)
+ DETECTED_AT_COMPILE_TIME
#else
- static constexpr Arch kArchHost =
- ASMJIT_ARCH_X86 == 32 ? kArchX86 :
- ASMJIT_ARCH_X86 == 64 ? kArchX64 :
-
- ASMJIT_ARCH_ARM == 32 && ASMJIT_ARCH_LE ? kArchARM :
- ASMJIT_ARCH_ARM == 32 && ASMJIT_ARCH_BE ? kArchARM_BE :
- ASMJIT_ARCH_ARM == 64 && ASMJIT_ARCH_LE ? kArchAArch64 :
- ASMJIT_ARCH_ARM == 64 && ASMJIT_ARCH_BE ? kArchAArch64_BE :
-
- ASMJIT_ARCH_MIPS == 32 && ASMJIT_ARCH_LE ? kArchMIPS_LE :
- ASMJIT_ARCH_MIPS == 32 && ASMJIT_ARCH_BE ? kArchMIPS_BE :
- ASMJIT_ARCH_MIPS == 64 && ASMJIT_ARCH_LE ? kArchMIPS64_LE :
- ASMJIT_ARCH_MIPS == 64 && ASMJIT_ARCH_BE ? kArchMIPS64_BE :
-
- kArchUnknown;
-
- static constexpr SubArch kSubArchHost =
- kSubArchUnknown;
+ kUnknown
+#endif
+};
- static constexpr Vendor kVendorHost =
- kVendorUnknown;
+//! Platform - runtime environment or operating system.
+enum class Platform : uint8_t {
+ //! Unknown or uninitialized platform.
+ kUnknown = 0,
+
+ //! Windows OS.
+ kWindows,
+
+ //! Other platform that is not Windows, most likely POSIX based.
+ kOther,
+
+ //! Linux OS.
+ kLinux,
+ //! GNU/Hurd OS.
+ kHurd,
+
+ //! FreeBSD OS.
+ kFreeBSD,
+ //! OpenBSD OS.
+ kOpenBSD,
+ //! NetBSD OS.
+ kNetBSD,
+ //! DragonFly BSD OS.
+ kDragonFlyBSD,
+
+ //! Haiku OS.
+ kHaiku,
+
+ //! Apple OSX.
+ kOSX,
+ //! Apple iOS.
+ kIOS,
+ //! Apple TVOS.
+ kTVOS,
+ //! Apple WatchOS.
+ kWatchOS,
+
+ //! Emscripten platform.
+ kEmscripten,
+
+ //! Maximum value of `Platform`.
+ kMaxValue = kEmscripten,
- static constexpr Platform kPlatformHost =
-#if defined(__EMSCRIPTEN__)
- kPlatformEmscripten
+ //! Platform detected at compile-time (platform of the host).
+ kHost =
+#if defined(_DOXYGEN)
+ DETECTED_AT_COMPILE_TIME
+#elif defined(__EMSCRIPTEN__)
+ kEmscripten
#elif defined(_WIN32)
- kPlatformWindows
+ kWindows
#elif defined(__linux__)
- kPlatformLinux
+ kLinux
#elif defined(__gnu_hurd__)
- kPlatformHurd
+ kHurd
#elif defined(__FreeBSD__)
- kPlatformFreeBSD
+ kFreeBSD
#elif defined(__OpenBSD__)
- kPlatformOpenBSD
+ kOpenBSD
#elif defined(__NetBSD__)
- kPlatformNetBSD
+ kNetBSD
#elif defined(__DragonFly__)
- kPlatformDragonFlyBSD
+ kDragonFlyBSD
#elif defined(__HAIKU__)
- kPlatformHaiku
+ kHaiku
#elif defined(__APPLE__) && TARGET_OS_OSX
- kPlatformOSX
+ kOSX
#elif defined(__APPLE__) && TARGET_OS_TV
- kPlatformTVOS
+ kTVOS
#elif defined(__APPLE__) && TARGET_OS_WATCH
- kPlatformWatchOS
+ kWatchOS
#elif defined(__APPLE__) && TARGET_OS_IPHONE
- kPlatformIOS
+ kIOS
#else
- kPlatformOther
+ kOther
#endif
- ;
+};
- static constexpr Abi kAbiHost =
-#if defined(_MSC_VER)
- kAbiMSVC
+//! Platform ABI (application binary interface).
+enum class PlatformABI : uint8_t {
+ //! Unknown or uninitialied environment.
+ kUnknown = 0,
+ //! Microsoft ABI.
+ kMSVC,
+ //! GNU ABI.
+ kGNU,
+ //! Android Environment / ABI.
+ kAndroid,
+ //! Cygwin ABI.
+ kCygwin,
+
+ //! Maximum value of `PlatformABI`.
+ kMaxValue,
+
+ //! Host ABI detected at compile-time.
+ kHost =
+#if defined(_DOXYGEN)
+ DETECTED_AT_COMPILE_TIME
+#elif defined(_MSC_VER)
+ kMSVC
#elif defined(__CYGWIN__)
- kAbiCygwin
+ kCygwin
#elif defined(__MINGW32__) || defined(__GLIBC__)
- kAbiGNU
+ kGNU
#elif defined(__ANDROID__)
- kAbiAndroid
+ kAndroid
#else
- kAbiUnknown
+ kUnknown
#endif
- ;
+};
-#endif
+//! Object format.
+//!
+//! \note AsmJit doesn't really use anything except \ref ObjectFormat::kUnknown and \ref ObjectFormat::kJIT at
+//! the moment. Object file formats are provided for future extensibility and a possibility to generate object
+//! files at some point.
+enum class ObjectFormat : uint8_t {
+ //! Unknown or uninitialized object format.
+ kUnknown = 0,
+
+ //! JIT code generation object, most likely \ref JitRuntime or a custom
+ //! \ref Target implementation.
+ kJIT,
+
+ //! Executable and linkable format (ELF).
+ kELF,
+ //! Common object file format.
+ kCOFF,
+ //! Extended COFF object format.
+ kXCOFF,
+ //! Mach object file format.
+ kMachO,
+
+ //! Maximum value of `ObjectFormat`.
+ kMaxValue
+};
+
+//! Represents an environment, which is usually related to a \ref Target.
+//!
+//! Environment has usually an 'arch-subarch-vendor-os-abi' format, which is sometimes called "Triple" (historically
+//! it used to be 3 only parts) or "Tuple", which is a convention used by Debian Linux.
+//!
+//! AsmJit doesn't support all possible combinations or architectures and ABIs, however, it models the environment
+//! similarly to other compilers for future extensibility.
+class Environment {
+public:
+ //! \name Members
+ //! \{
+
+ //! Architecture.
+ Arch _arch;
+ //! Sub-architecture type.
+ SubArch _subArch;
+ //! Vendor type.
+ Vendor _vendor;
+ //! Platform.
+ Platform _platform;
+ //! Platform ABI.
+ PlatformABI _platformABI;
+ //! Object format.
+ ObjectFormat _objectFormat;
+ //! Reserved for future use, must be zero.
+ uint8_t _reserved[2];
//! \}
- //! \name Construction / Destruction
+ //! \name Construction & Destruction
//! \{
inline Environment() noexcept :
- _arch(uint8_t(kArchUnknown)),
- _subArch(uint8_t(kSubArchUnknown)),
- _vendor(uint8_t(kVendorUnknown)),
- _platform(uint8_t(kPlatformUnknown)),
- _abi(uint8_t(kAbiUnknown)),
- _format(uint8_t(kFormatUnknown)),
- _reserved(0) {}
+ _arch(Arch::kUnknown),
+ _subArch(SubArch::kUnknown),
+ _vendor(Vendor::kUnknown),
+ _platform(Platform::kUnknown),
+ _platformABI(PlatformABI::kUnknown),
+ _objectFormat(ObjectFormat::kUnknown),
+ _reserved { 0, 0 } {}
+
+ inline explicit Environment(
+ Arch arch,
+ SubArch subArch = SubArch::kUnknown,
+ Vendor vendor = Vendor::kUnknown,
+ Platform platform = Platform::kUnknown,
+ PlatformABI abi = PlatformABI::kUnknown,
+ ObjectFormat objectFormat = ObjectFormat::kUnknown) noexcept {
+
+ init(arch, subArch, vendor, platform, abi, objectFormat);
+ }
inline Environment(const Environment& other) noexcept = default;
- inline explicit Environment(uint32_t arch,
- uint32_t subArch = kSubArchUnknown,
- uint32_t vendor = kVendorUnknown,
- uint32_t platform = kPlatformUnknown,
- uint32_t abi = kAbiUnknown,
- uint32_t format = kFormatUnknown) noexcept {
- init(arch, subArch, vendor, platform, abi, format);
+ //! Returns the host environment constructed from preprocessor macros defined by the compiler.
+ //!
+ //! The returned environment should precisely match the target host architecture, sub-architecture, platform,
+ //! and ABI.
+ static inline Environment host() noexcept {
+ return Environment(Arch::kHost, SubArch::kHost, Vendor::kHost, Platform::kHost, PlatformABI::kHost, ObjectFormat::kUnknown);
}
//! \}
@@ -355,10 +258,10 @@ public:
return _packed() == 0;
}
- //! Tests whether the environment is intialized, which means it must have
+ //! Tests whether the environment is initialized, which means it must have
//! a valid architecture.
inline bool isInitialized() const noexcept {
- return _arch != kArchUnknown;
+ return _arch != Arch::kUnknown;
}
inline uint64_t _packed() const noexcept {
@@ -369,47 +272,61 @@ public:
//! Resets all members of the environment to zero / unknown.
inline void reset() noexcept {
- _arch = uint8_t(kArchUnknown);
- _subArch = uint8_t(kSubArchUnknown);
- _vendor = uint8_t(kVendorUnknown);
- _platform = uint8_t(kPlatformUnknown);
- _abi = uint8_t(kAbiUnknown);
- _format = uint8_t(kFormatUnknown);
- _reserved = 0;
+ _arch = Arch::kUnknown;
+ _subArch = SubArch::kUnknown;
+ _vendor = Vendor::kUnknown;
+ _platform = Platform::kUnknown;
+ _platformABI = PlatformABI::kUnknown;
+ _objectFormat = ObjectFormat::kUnknown;
+ _reserved[0] = 0;
+ _reserved[1] = 0;
}
inline bool equals(const Environment& other) const noexcept {
return _packed() == other._packed();
}
- //! Returns the architecture, see \ref Arch.
- inline uint32_t arch() const noexcept { return _arch; }
- //! Returns the sub-architecture, see \ref SubArch.
- inline uint32_t subArch() const noexcept { return _subArch; }
- //! Returns vendor, see \ref Vendor.
- inline uint32_t vendor() const noexcept { return _vendor; }
- //! Returns target's platform or operating system, see \ref Platform.
- inline uint32_t platform() const noexcept { return _platform; }
- //! Returns target's ABI, see \ref Abi.
- inline uint32_t abi() const noexcept { return _abi; }
- //! Returns target's object format, see \ref Format.
- inline uint32_t format() const noexcept { return _format; }
-
- inline void init(uint32_t arch,
- uint32_t subArch = kSubArchUnknown,
- uint32_t vendor = kVendorUnknown,
- uint32_t platform = kPlatformUnknown,
- uint32_t abi = kAbiUnknown,
- uint32_t format = kFormatUnknown) noexcept {
- _arch = uint8_t(arch);
- _subArch = uint8_t(subArch);
- _vendor = uint8_t(vendor);
- _platform = uint8_t(platform);
- _abi = uint8_t(abi);
- _format = uint8_t(format);
- _reserved = 0;
+ //! Returns the architecture.
+ inline Arch arch() const noexcept { return _arch; }
+ //! Returns the sub-architecture.
+ inline SubArch subArch() const noexcept { return _subArch; }
+ //! Returns vendor.
+ inline Vendor vendor() const noexcept { return _vendor; }
+ //! Returns target's platform or operating system.
+ inline Platform platform() const noexcept { return _platform; }
+ //! Returns target's ABI.
+ inline PlatformABI platformABI() const noexcept { return _platformABI; }
+ //! Returns target's object format.
+ inline ObjectFormat objectFormat() const noexcept { return _objectFormat; }
+
+ inline void init(
+ Arch arch,
+ SubArch subArch = SubArch::kUnknown,
+ Vendor vendor = Vendor::kUnknown,
+ Platform platform = Platform::kUnknown,
+ PlatformABI platformABI = PlatformABI::kUnknown,
+ ObjectFormat objectFormat = ObjectFormat::kUnknown) noexcept {
+
+ _arch = arch;
+ _subArch = subArch;
+ _vendor = vendor;
+ _platform = platform;
+ _platformABI = platformABI;
+ _objectFormat = objectFormat;
+ _reserved[0] = 0;
+ _reserved[1] = 0;
}
+ inline bool isArchX86() const noexcept { return _arch == Arch::kX86; }
+ inline bool isArchX64() const noexcept { return _arch == Arch::kX64; }
+ inline bool isArchARM() const noexcept { return isArchARM(_arch); }
+ inline bool isArchThumb() const noexcept { return isArchThumb(_arch); }
+ inline bool isArchAArch64() const noexcept { return isArchAArch64(_arch); }
+ inline bool isArchMIPS32() const noexcept { return isArchMIPS32(_arch); }
+ inline bool isArchMIPS64() const noexcept { return isArchMIPS64(_arch); }
+ inline bool isArchRISCV32() const noexcept { return _arch == Arch::kRISCV32; }
+ inline bool isArchRISCV64() const noexcept { return _arch == Arch::kRISCV64; }
+
//! Tests whether the architecture is 32-bit.
inline bool is32Bit() const noexcept { return is32Bit(_arch); }
//! Tests whether the architecture is 64-bit.
@@ -422,45 +339,49 @@ public:
//! Tests whether this architecture is of X86 family.
inline bool isFamilyX86() const noexcept { return isFamilyX86(_arch); }
- //! Tests whether this architecture is of ARM family.
- inline bool isFamilyRISCV() const noexcept { return isFamilyRISCV(_arch); }
- //! Tests whether this architecture is of ARM family.
+ //! Tests whether this architecture family is ARM, THUMB, or AArch64.
inline bool isFamilyARM() const noexcept { return isFamilyARM(_arch); }
- //! Tests whether this architecture is of ARM family.
+ //! Tests whether this architecture family is AArch32 (ARM or THUMB).
+ inline bool isFamilyAArch32() const noexcept { return isFamilyAArch32(_arch); }
+ //! Tests whether this architecture family is AArch64.
+ inline bool isFamilyAArch64() const noexcept { return isFamilyAArch64(_arch); }
+ //! Tests whether this architecture family is MISP or MIPS64.
inline bool isFamilyMIPS() const noexcept { return isFamilyMIPS(_arch); }
+ //! Tests whether this architecture family is RISC-V (both 32-bit and 64-bit).
+ inline bool isFamilyRISCV() const noexcept { return isFamilyRISCV(_arch); }
//! Tests whether the environment platform is Windows.
- inline bool isPlatformWindows() const noexcept { return _platform == kPlatformWindows; }
+ inline bool isPlatformWindows() const noexcept { return _platform == Platform::kWindows; }
//! Tests whether the environment platform is Linux.
- inline bool isPlatformLinux() const noexcept { return _platform == kPlatformLinux; }
+ inline bool isPlatformLinux() const noexcept { return _platform == Platform::kLinux; }
//! Tests whether the environment platform is Hurd.
- inline bool isPlatformHurd() const noexcept { return _platform == kPlatformHurd; }
+ inline bool isPlatformHurd() const noexcept { return _platform == Platform::kHurd; }
//! Tests whether the environment platform is Haiku.
- inline bool isPlatformHaiku() const noexcept { return _platform == kPlatformHaiku; }
+ inline bool isPlatformHaiku() const noexcept { return _platform == Platform::kHaiku; }
//! Tests whether the environment platform is any BSD.
inline bool isPlatformBSD() const noexcept {
- return _platform == kPlatformFreeBSD ||
- _platform == kPlatformOpenBSD ||
- _platform == kPlatformNetBSD ||
- _platform == kPlatformDragonFlyBSD;
+ return _platform == Platform::kFreeBSD ||
+ _platform == Platform::kOpenBSD ||
+ _platform == Platform::kNetBSD ||
+ _platform == Platform::kDragonFlyBSD;
}
//! Tests whether the environment platform is any Apple platform (OSX, iOS, TVOS, WatchOS).
inline bool isPlatformApple() const noexcept {
- return _platform == kPlatformOSX ||
- _platform == kPlatformIOS ||
- _platform == kPlatformTVOS ||
- _platform == kPlatformWatchOS;
+ return _platform == Platform::kOSX ||
+ _platform == Platform::kIOS ||
+ _platform == Platform::kTVOS ||
+ _platform == Platform::kWatchOS;
}
//! Tests whether the ABI is MSVC.
- inline bool isAbiMSVC() const noexcept { return _abi == kAbiMSVC; }
+ inline bool isMSVC() const noexcept { return _platformABI == PlatformABI::kMSVC; }
//! Tests whether the ABI is GNU.
- inline bool isAbiGNU() const noexcept { return _abi == kAbiGNU; }
+ inline bool isGNU() const noexcept { return _platformABI == PlatformABI::kGNU; }
//! Returns a calculated stack alignment for this environment.
ASMJIT_API uint32_t stackAlignment() const noexcept;
@@ -469,123 +390,119 @@ public:
uint32_t registerSize() const noexcept { return registerSizeFromArch(_arch); }
//! Sets the architecture to `arch`.
- inline void setArch(uint32_t arch) noexcept { _arch = uint8_t(arch); }
+ inline void setArch(Arch arch) noexcept { _arch = arch; }
//! Sets the sub-architecture to `subArch`.
- inline void setSubArch(uint32_t subArch) noexcept { _subArch = uint8_t(subArch); }
+ inline void setSubArch(SubArch subArch) noexcept { _subArch = subArch; }
//! Sets the vendor to `vendor`.
- inline void setVendor(uint32_t vendor) noexcept { _vendor = uint8_t(vendor); }
+ inline void setVendor(Vendor vendor) noexcept { _vendor = vendor; }
//! Sets the platform to `platform`.
- inline void setPlatform(uint32_t platform) noexcept { _platform = uint8_t(platform); }
- //! Sets the ABI to `abi`.
- inline void setAbi(uint32_t abi) noexcept { _abi = uint8_t(abi); }
- //! Sets the object format to `format`.
- inline void setFormat(uint32_t format) noexcept { _format = uint8_t(format); }
+ inline void setPlatform(Platform platform) noexcept { _platform = platform; }
+ //! Sets the ABI to `platformABI`.
+ inline void setPlatformABI(PlatformABI platformABI) noexcept { _platformABI = platformABI; }
+ //! Sets the object format to `objectFormat`.
+ inline void setObjectFormat(ObjectFormat objectFormat) noexcept { _objectFormat = objectFormat; }
//! \}
//! \name Static Utilities
//! \{
+ static inline bool isDefinedArch(Arch arch) noexcept {
+ return uint32_t(arch) <= uint32_t(Arch::kMaxValue);
+ }
+
+ static inline bool isValidArch(Arch arch) noexcept {
+ return arch != Arch::kUnknown && uint32_t(arch) <= uint32_t(Arch::kMaxValue);
+ }
+
//! Tests whether the given architecture `arch` is 32-bit.
- static inline bool is32Bit(uint32_t arch) noexcept {
- return (arch & kArch32BitMask) == kArch32BitMask;
+ static inline bool is32Bit(Arch arch) noexcept {
+ return (uint32_t(arch) & uint32_t(Arch::k32BitMask)) == uint32_t(Arch::k32BitMask);
}
//! Tests whether the given architecture `arch` is 64-bit.
- static inline bool is64Bit(uint32_t arch) noexcept {
- return (arch & kArch32BitMask) == 0;
+ static inline bool is64Bit(Arch arch) noexcept {
+ return (uint32_t(arch) & uint32_t(Arch::k32BitMask)) == 0;
}
//! Tests whether the given architecture `arch` is little endian.
- static inline bool isLittleEndian(uint32_t arch) noexcept {
- return (arch & kArchBigEndianMask) == 0;
+ static inline bool isLittleEndian(Arch arch) noexcept {
+ return uint32_t(arch) < uint32_t(Arch::kBigEndian);
}
//! Tests whether the given architecture `arch` is big endian.
- static inline bool isBigEndian(uint32_t arch) noexcept {
- return (arch & kArchBigEndianMask) == kArchBigEndianMask;
+ static inline bool isBigEndian(Arch arch) noexcept {
+ return uint32_t(arch) >= uint32_t(Arch::kBigEndian);
+ }
+
+ //! Tests whether the given architecture is Thumb or Thumb_BE.
+ static inline bool isArchThumb(Arch arch) noexcept {
+ return arch == Arch::kThumb || arch == Arch::kThumb_BE;
+ }
+
+ //! Tests whether the given architecture is ARM or ARM_BE.
+ static inline bool isArchARM(Arch arch) noexcept {
+ return arch == Arch::kARM || arch == Arch::kARM_BE;
+ }
+
+ //! Tests whether the given architecture is AArch64 or AArch64_BE.
+ static inline bool isArchAArch64(Arch arch) noexcept {
+ return arch == Arch::kAArch64 || arch == Arch::kAArch64_BE;
+ }
+
+ //! Tests whether the given architecture is MIPS32_LE or MIPS32_BE.
+ static inline bool isArchMIPS32(Arch arch) noexcept {
+ return arch == Arch::kMIPS32_LE || arch == Arch::kMIPS32_BE;
+ }
+
+ //! Tests whether the given architecture is MIPS64_LE or MIPS64_BE.
+ static inline bool isArchMIPS64(Arch arch) noexcept {
+ return arch == Arch::kMIPS64_LE || arch == Arch::kMIPS64_BE;
}
//! Tests whether the given architecture family is X86 or X64.
- static inline bool isFamilyX86(uint32_t arch) noexcept {
- return arch == kArchX86 ||
- arch == kArchX64;
+ static inline bool isFamilyX86(Arch arch) noexcept {
+ return arch == Arch::kX86 || arch == Arch::kX64;
}
- //! Tests whether the given architecture family is RISC-V (both 32-bit and 64-bit).
- static inline bool isFamilyRISCV(uint32_t arch) noexcept {
- return arch == kArchRISCV32 ||
- arch == kArchRISCV64;
+ //! Tests whether the given architecture family is ARM, THUMB, or AArch64.
+ static inline bool isFamilyARM(Arch arch) noexcept {
+ return isArchARM(arch) || isArchAArch64(arch) || isArchThumb(arch);
+ }
+
+ //! Tests whether the given architecture family is AArch32 (ARM or THUMB).
+ static inline bool isFamilyAArch32(Arch arch) noexcept {
+ return isArchARM(arch) || isArchThumb(arch);
}
- //! Tests whether the given architecture family is ARM, Thumb, or AArch64.
- static inline bool isFamilyARM(uint32_t arch) noexcept {
- arch &= ~kArchBigEndianMask;
- return arch == kArchARM ||
- arch == kArchAArch64 ||
- arch == kArchThumb;
+ //! Tests whether the given architecture family is AArch64.
+ static inline bool isFamilyAArch64(Arch arch) noexcept {
+ return isArchAArch64(arch);
}
//! Tests whether the given architecture family is MISP or MIPS64.
- static inline bool isFamilyMIPS(uint32_t arch) noexcept {
- arch &= ~kArchBigEndianMask;
- return arch == kArchMIPS_LE ||
- arch == kArchMIPS64_LE;
+ static inline bool isFamilyMIPS(Arch arch) noexcept {
+ return isArchMIPS32(arch) || isArchMIPS64(arch);
+ }
+
+ //! Tests whether the given architecture family is RISC-V (both 32-bit and 64-bit).
+ static inline bool isFamilyRISCV(Arch arch) noexcept {
+ return arch == Arch::kRISCV32 || arch == Arch::kRISCV64;
}
//! Returns a native general purpose register size from the given architecture.
- static uint32_t registerSizeFromArch(uint32_t arch) noexcept {
+ static inline uint32_t registerSizeFromArch(Arch arch) noexcept {
return is32Bit(arch) ? 4u : 8u;
}
//! \}
};
-//! Returns the host environment constructed from preprocessor macros defined
-//! by the compiler.
-//!
-//! The returned environment should precisely match the target host architecture,
-//! sub-architecture, platform, and ABI.
-static ASMJIT_INLINE Environment hostEnvironment() noexcept {
- return Environment(Environment::kArchHost,
- Environment::kSubArchHost,
- Environment::kVendorHost,
- Environment::kPlatformHost,
- Environment::kAbiHost,
- Environment::kFormatUnknown);
-}
-
static_assert(sizeof(Environment) == 8,
"Environment must occupy exactly 8 bytes.");
//! \}
-#ifndef ASMJIT_NO_DEPRECATED
-class ASMJIT_DEPRECATED_STRUCT("Use Environment instead") ArchInfo : public Environment {
-public:
- inline ArchInfo() noexcept : Environment() {}
-
- inline ArchInfo(const Environment& other) noexcept : Environment(other) {}
- inline explicit ArchInfo(uint32_t arch, uint32_t subArch = kSubArchUnknown) noexcept
- : Environment(arch, subArch) {}
-
- enum Id : uint32_t {
- kIdNone = Environment::kArchUnknown,
- kIdX86 = Environment::kArchX86,
- kIdX64 = Environment::kArchX64,
- kIdA32 = Environment::kArchARM,
- kIdA64 = Environment::kArchAArch64,
- kIdHost = Environment::kArchHost
- };
-
- enum SubType : uint32_t {
- kSubIdNone = Environment::kSubArchUnknown
- };
-
- static inline ArchInfo host() noexcept { return ArchInfo(hostEnvironment()); }
-};
-#endif // !ASMJIT_NO_DEPRECATED
-
ASMJIT_END_NAMESPACE
#endif // ASMJIT_CORE_ENVIRONMENT_H_INCLUDED
diff --git a/3rdparty/asmjit/src/asmjit/core/errorhandler.cpp b/3rdparty/asmjit/src/asmjit/core/errorhandler.cpp
index 8372d75a463..5a7dac52356 100644
--- a/3rdparty/asmjit/src/asmjit/core/errorhandler.cpp
+++ b/3rdparty/asmjit/src/asmjit/core/errorhandler.cpp
@@ -1,36 +1,13 @@
-
-// AsmJit - Machine code generation for C++
-//
-// * Official AsmJit Home Page: https://asmjit.com
-// * Official Github Repository: https://github.com/asmjit/asmjit
-//
-// Copyright (c) 2008-2020 The AsmJit Authors
+// This file is part of AsmJit project <https://asmjit.com>
//
-// This software is provided 'as-is', without any express or implied
-// warranty. In no event will the authors be held liable for any damages
-// arising from the use of this software.
-//
-// Permission is granted to anyone to use this software for any purpose,
-// including commercial applications, and to alter it and redistribute it
-// freely, subject to the following restrictions:
-//
-// 1. The origin of this software must not be misrepresented; you must not
-// claim that you wrote the original software. If you use this software
-// in a product, an acknowledgment in the product documentation would be
-// appreciated but is not required.
-// 2. Altered source versions must be plainly marked as such, and must not be
-// misrepresented as being the original software.
-// 3. This notice may not be removed or altered from any source distribution.
+// See asmjit.h or LICENSE.md for license and copyright information
+// SPDX-License-Identifier: Zlib
#include "../core/api-build_p.h"
#include "../core/errorhandler.h"
ASMJIT_BEGIN_NAMESPACE
-// ============================================================================
-// [asmjit::ErrorHandler]
-// ============================================================================
-
ErrorHandler::ErrorHandler() noexcept {}
ErrorHandler::~ErrorHandler() noexcept {}
diff --git a/3rdparty/asmjit/src/asmjit/core/errorhandler.h b/3rdparty/asmjit/src/asmjit/core/errorhandler.h
index 2337cd8d841..5151d43304e 100644
--- a/3rdparty/asmjit/src/asmjit/core/errorhandler.h
+++ b/3rdparty/asmjit/src/asmjit/core/errorhandler.h
@@ -1,25 +1,7 @@
-// AsmJit - Machine code generation for C++
+// This file is part of AsmJit project <https://asmjit.com>
//
-// * Official AsmJit Home Page: https://asmjit.com
-// * Official Github Repository: https://github.com/asmjit/asmjit
-//
-// Copyright (c) 2008-2020 The AsmJit Authors
-//
-// This software is provided 'as-is', without any express or implied
-// warranty. In no event will the authors be held liable for any damages
-// arising from the use of this software.
-//
-// Permission is granted to anyone to use this software for any purpose,
-// including commercial applications, and to alter it and redistribute it
-// freely, subject to the following restrictions:
-//
-// 1. The origin of this software must not be misrepresented; you must not
-// claim that you wrote the original software. If you use this software
-// in a product, an acknowledgment in the product documentation would be
-// appreciated but is not required.
-// 2. Altered source versions must be plainly marked as such, and must not be
-// misrepresented as being the original software.
-// 3. This notice may not be removed or altered from any source distribution.
+// See asmjit.h or LICENSE.md for license and copyright information
+// SPDX-License-Identifier: Zlib
#ifndef ASMJIT_CORE_ERRORHANDLER_H_INCLUDED
#define ASMJIT_CORE_ERRORHANDLER_H_INCLUDED
@@ -31,44 +13,31 @@ ASMJIT_BEGIN_NAMESPACE
//! \addtogroup asmjit_error_handling
//! \{
-// ============================================================================
-// [Forward Declarations]
-// ============================================================================
-
class BaseEmitter;
-// ============================================================================
-// [asmjit::ErrorHandler]
-// ============================================================================
-
//! Error handler can be used to override the default behavior of error handling.
//!
-//! It's available to all classes that inherit `BaseEmitter`. Override
-//! \ref ErrorHandler::handleError() to implement your own error handler.
+//! It's available to all classes that inherit `BaseEmitter`. Override \ref ErrorHandler::handleError() to implement
+//! your own error handler.
//!
//! The following use-cases are supported:
//!
-//! - Record the error and continue code generation. This is the simplest
-//! approach that can be used to at least log possible errors.
-//! - Throw an exception. AsmJit doesn't use exceptions and is completely
-//! exception-safe, but it's perfectly legal to throw an exception from
-//! the error handler.
-//! - Use plain old C's `setjmp()` and `longjmp()`. Asmjit always puts Assembler,
-//! Builder and Compiler to a consistent state before calling \ref handleError(),
-//! so `longjmp()` can be used without issues to cancel the code-generation if
-//! an error occurred. This method can be used if exception handling in your
-//! project is turned off and you still want some comfort. In most cases it
-//! should be safe as AsmJit uses \ref Zone memory and the ownership of memory
-//! it allocates always ends with the instance that allocated it. If using this
-//! approach please never jump outside the life-time of \ref CodeHolder and
-//! \ref BaseEmitter.
-//!
-//! \ref ErrorHandler can be attached to \ref CodeHolder or \ref BaseEmitter,
-//! which has a priority. The example below uses error handler that just prints
-//! the error, but lets AsmJit continue:
+//! - Record the error and continue code generation. This is the simplest approach that can be used to at least log
+//! possible errors.
+//! - Throw an exception. AsmJit doesn't use exceptions and is completely exception-safe, but it's perfectly legal
+//! to throw an exception from the error handler.
+//! - Use plain old C's `setjmp()` and `longjmp()`. Asmjit always puts Assembler, Builder and Compiler to
+//! a consistent state before calling \ref handleError(), so `longjmp()` can be used without issues to cancel the
+//! code generation if an error occurred. This method can be used if exception handling in your project is turned
+//! off and you still want some comfort. In most cases it should be safe as AsmJit uses \ref Zone memory and the
+//! ownership of memory it allocates always ends with the instance that allocated it. If using this approach please
+//! never jump outside the life-time of \ref CodeHolder and \ref BaseEmitter.
+//!
+//! \ref ErrorHandler can be attached to \ref CodeHolder or \ref BaseEmitter, which has a priority. The example below
+//! uses error handler that just prints the error, but lets AsmJit continue:
//!
//! ```
-//! // Error Handling #1 - Logging and returing Error.
+//! // Error Handling #1 - Logging and returning Error.
//! #include <asmjit/x86.h>
//! #include <stdio.h>
//!
@@ -108,12 +77,10 @@ class BaseEmitter;
//! }
//! ```
//!
-//! If error happens during instruction emitting / encoding the assembler behaves
-//! transactionally - the output buffer won't advance if encoding failed, thus
-//! either a fully encoded instruction or nothing is emitted. The error handling
-//! shown above is useful, but it's still not the best way of dealing with errors
-//! in AsmJit. The following example shows how to use exception handling to handle
-//! errors in a more C++ way:
+//! If error happens during instruction emitting / encoding the assembler behaves transactionally - the output buffer
+//! won't advance if encoding failed, thus either a fully encoded instruction or nothing is emitted. The error handling
+//! shown above is useful, but it's still not the best way of dealing with errors in AsmJit. The following example
+//! shows how to use exception handling to handle errors in a more C++ way:
//!
//! ```
//! // Error Handling #2 - Throwing an exception.
@@ -168,13 +135,10 @@ class BaseEmitter;
//! }
//! ```
//!
-//! If C++ exceptions are not what you like or your project turns off them
-//! completely there is still a way of reducing the error handling to a minimum
-//! by using a standard setjmp/longjmp approach. AsmJit is exception-safe and
-//! cleans up everything before calling the ErrorHandler, so any approach is
-//! safe. You can simply jump from the error handler without causing any
-//! side-effects or memory leaks. The following example demonstrates how it
-//! could be done:
+//! If C++ exceptions are not what you like or your project turns off them completely there is still a way of reducing
+//! the error handling to a minimum by using a standard setjmp/longjmp approach. AsmJit is exception-safe and cleans
+//! up everything before calling the ErrorHandler, so any approach is safe. You can simply jump from the error handler
+//! without causing any side-effects or memory leaks. The following example demonstrates how it could be done:
//!
//! ```
//! // Error Handling #3 - Using setjmp/longjmp if exceptions are not allowed.
@@ -223,40 +187,37 @@ class ASMJIT_VIRTAPI ErrorHandler {
public:
ASMJIT_BASE_CLASS(ErrorHandler)
- // --------------------------------------------------------------------------
- // [Construction / Destruction]
- // --------------------------------------------------------------------------
+ //! \name Construction & Destruction
+ //! \{
//! Creates a new `ErrorHandler` instance.
ASMJIT_API ErrorHandler() noexcept;
//! Destroys the `ErrorHandler` instance.
ASMJIT_API virtual ~ErrorHandler() noexcept;
- // --------------------------------------------------------------------------
- // [Handle Error]
- // --------------------------------------------------------------------------
+ //! \}
+
+ //! \name Interface
+ //! \{
//! Error handler (must be reimplemented).
//!
- //! Error handler is called after an error happened and before it's propagated
- //! to the caller. There are multiple ways how the error handler can be used:
+ //! Error handler is called after an error happened and before it's propagated to the caller. There are multiple
+ //! ways how the error handler can be used:
//!
- //! 1. User-based error handling without throwing exception or using C's
- //! `longjmp()`. This is for users that don't use exceptions and want
- //! customized error handling.
+ //! 1. User-based error handling without throwing exception or using C's`longjmp()`. This is for users that don't
+ //! use exceptions and want customized error handling.
//!
- //! 2. Throwing an exception. AsmJit doesn't use exceptions and is completely
- //! exception-safe, but you can throw exception from your error handler if
- //! this way is the preferred way of handling errors in your project.
+ //! 2. Throwing an exception. AsmJit doesn't use exceptions and is completely exception-safe, but you can throw
+ //! exception from your error handler if this way is the preferred way of handling errors in your project.
//!
- //! 3. Using plain old C's `setjmp()` and `longjmp()`. Asmjit always puts
- //! `BaseEmitter` to a consistent state before calling `handleError()`
- //! so `longjmp()` can be used without any issues to cancel the code
- //! generation if an error occurred. There is no difference between
- //! exceptions and `longjmp()` from AsmJit's perspective, however,
- //! never jump outside of `CodeHolder` and `BaseEmitter` scope as you
- //! would leak memory.
+ //! 3. Using plain old C's `setjmp()` and `longjmp()`. Asmjit always puts `BaseEmitter` to a consistent state before
+ //! calling `handleError()` so `longjmp()` can be used without any issues to cancel the code generation if an
+ //! error occurred. There is no difference between exceptions and `longjmp()` from AsmJit's perspective, however,
+ //! never jump outside of `CodeHolder` and `BaseEmitter` scope as you would leak memory.
virtual void handleError(Error err, const char* message, BaseEmitter* origin) = 0;
+
+ //! \}
};
//! \}
diff --git a/3rdparty/asmjit/src/asmjit/core/features.h b/3rdparty/asmjit/src/asmjit/core/features.h
deleted file mode 100644
index fd28472c91f..00000000000
--- a/3rdparty/asmjit/src/asmjit/core/features.h
+++ /dev/null
@@ -1,186 +0,0 @@
-// AsmJit - Machine code generation for C++
-//
-// * Official AsmJit Home Page: https://asmjit.com
-// * Official Github Repository: https://github.com/asmjit/asmjit
-//
-// Copyright (c) 2008-2020 The AsmJit Authors
-//
-// This software is provided 'as-is', without any express or implied
-// warranty. In no event will the authors be held liable for any damages
-// arising from the use of this software.
-//
-// Permission is granted to anyone to use this software for any purpose,
-// including commercial applications, and to alter it and redistribute it
-// freely, subject to the following restrictions:
-//
-// 1. The origin of this software must not be misrepresented; you must not
-// claim that you wrote the original software. If you use this software
-// in a product, an acknowledgment in the product documentation would be
-// appreciated but is not required.
-// 2. Altered source versions must be plainly marked as such, and must not be
-// misrepresented as being the original software.
-// 3. This notice may not be removed or altered from any source distribution.
-
-#ifndef ASMJIT_CORE_FEATURES_H_INCLUDED
-#define ASMJIT_CORE_FEATURES_H_INCLUDED
-
-#include "../core/globals.h"
-#include "../core/support.h"
-
-ASMJIT_BEGIN_NAMESPACE
-
-//! \addtogroup asmjit_core
-//! \{
-
-// ============================================================================
-// [asmjit::BaseFeatures]
-// ============================================================================
-
-//! Base class that provides information about CPU features.
-//!
-//! Internally each feature is repreesnted by a single bit in an embedded
-//! bit-array, however, feature bits are defined by an architecture specific
-//! implementations, like \ref x86::Features.
-class BaseFeatures {
-public:
- typedef Support::BitWord BitWord;
- typedef Support::BitVectorIterator<BitWord> Iterator;
-
- enum : uint32_t {
- kMaxFeatures = 128,
- kNumBitWords = kMaxFeatures / Support::kBitWordSizeInBits
- };
-
- BitWord _bits[kNumBitWords];
-
- //! \name Construction & Destruction
- //! \{
-
- inline BaseFeatures() noexcept { reset(); }
- inline BaseFeatures(const BaseFeatures& other) noexcept = default;
- inline explicit BaseFeatures(Globals::NoInit_) noexcept {}
-
- inline void reset() noexcept {
- for (size_t i = 0; i < kNumBitWords; i++)
- _bits[i] = 0;
- }
-
- //! \}
-
- //! \name Overloaded Operators
- //! \{
-
- inline BaseFeatures& operator=(const BaseFeatures& other) noexcept = default;
-
- inline bool operator==(const BaseFeatures& other) noexcept { return eq(other); }
- inline bool operator!=(const BaseFeatures& other) noexcept { return !eq(other); }
-
- //! \}
-
- //! \name Cast
- //! \{
-
- //! Casts this base class into a derived type `T`.
- template<typename T>
- inline T& as() noexcept { return static_cast<T&>(*this); }
-
- //! Casts this base class into a derived type `T` (const).
- template<typename T>
- inline const T& as() const noexcept { return static_cast<const T&>(*this); }
-
- //! \}
-
- //! \name Accessors
- //! \{
-
- inline bool empty() const noexcept {
- for (uint32_t i = 0; i < kNumBitWords; i++)
- if (_bits[i])
- return false;
- return true;
- }
-
- //! Returns all features as array of bitwords (see \ref Support::BitWord).
- inline BitWord* bits() noexcept { return _bits; }
- //! Returns all features as array of bitwords (const).
- inline const BitWord* bits() const noexcept { return _bits; }
-
- //! Returns the number of BitWords returned by \ref bits().
- inline size_t bitWordCount() const noexcept { return kNumBitWords; }
-
- //! Returns \ref Support::BitVectorIterator, that can be used to iterate
- //! all features efficiently
- inline Iterator iterator() const noexcept {
- return Iterator(_bits, kNumBitWords);
- }
-
- //! Tests whether the feature `featureId` is present.
- inline bool has(uint32_t featureId) const noexcept {
- ASMJIT_ASSERT(featureId < kMaxFeatures);
-
- uint32_t idx = featureId / Support::kBitWordSizeInBits;
- uint32_t bit = featureId % Support::kBitWordSizeInBits;
-
- return bool((_bits[idx] >> bit) & 0x1);
- }
-
- //! Tests whether all features as defined by `other` are present.
- inline bool hasAll(const BaseFeatures& other) const noexcept {
- for (uint32_t i = 0; i < kNumBitWords; i++)
- if ((_bits[i] & other._bits[i]) != other._bits[i])
- return false;
- return true;
- }
-
- //! \}
-
- //! \name Utilities
- //! \{
-
- //! Adds the given CPU `featureId` to the list of features.
- inline void add(uint32_t featureId) noexcept {
- ASMJIT_ASSERT(featureId < kMaxFeatures);
-
- uint32_t idx = featureId / Support::kBitWordSizeInBits;
- uint32_t bit = featureId % Support::kBitWordSizeInBits;
-
- _bits[idx] |= BitWord(1) << bit;
- }
-
- template<typename... Args>
- inline void add(uint32_t featureId, Args... otherIds) noexcept {
- add(featureId);
- add(otherIds...);
- }
-
- //! Removes the given CPU `featureId` from the list of features.
- inline void remove(uint32_t featureId) noexcept {
- ASMJIT_ASSERT(featureId < kMaxFeatures);
-
- uint32_t idx = featureId / Support::kBitWordSizeInBits;
- uint32_t bit = featureId % Support::kBitWordSizeInBits;
-
- _bits[idx] &= ~(BitWord(1) << bit);
- }
-
- template<typename... Args>
- inline void remove(uint32_t featureId, Args... otherIds) noexcept {
- remove(featureId);
- remove(otherIds...);
- }
-
- inline bool eq(const BaseFeatures& other) const noexcept {
- for (size_t i = 0; i < kNumBitWords; i++)
- if (_bits[i] != other._bits[i])
- return false;
- return true;
- }
-
- //! \}
-};
-
-//! \}
-
-ASMJIT_END_NAMESPACE
-
-#endif // ASMJIT_CORE_FEATURES_H_INCLUDED
diff --git a/3rdparty/asmjit/src/asmjit/core/formatter.cpp b/3rdparty/asmjit/src/asmjit/core/formatter.cpp
index 404edaf3820..1c4b7b6c6fa 100644
--- a/3rdparty/asmjit/src/asmjit/core/formatter.cpp
+++ b/3rdparty/asmjit/src/asmjit/core/formatter.cpp
@@ -1,44 +1,27 @@
-// AsmJit - Machine code generation for C++
+// This file is part of AsmJit project <https://asmjit.com>
//
-// * Official AsmJit Home Page: https://asmjit.com
-// * Official Github Repository: https://github.com/asmjit/asmjit
-//
-// Copyright (c) 2008-2020 The AsmJit Authors
-//
-// This software is provided 'as-is', without any express or implied
-// warranty. In no event will the authors be held liable for any damages
-// arising from the use of this software.
-//
-// Permission is granted to anyone to use this software for any purpose,
-// including commercial applications, and to alter it and redistribute it
-// freely, subject to the following restrictions:
-//
-// 1. The origin of this software must not be misrepresented; you must not
-// claim that you wrote the original software. If you use this software
-// in a product, an acknowledgment in the product documentation would be
-// appreciated but is not required.
-// 2. Altered source versions must be plainly marked as such, and must not be
-// misrepresented as being the original software.
-// 3. This notice may not be removed or altered from any source distribution.
+// See asmjit.h or LICENSE.md for license and copyright information
+// SPDX-License-Identifier: Zlib
#include "../core/api-build_p.h"
#ifndef ASMJIT_NO_LOGGING
+#include "../core/archtraits.h"
#include "../core/builder.h"
#include "../core/codeholder.h"
#include "../core/compiler.h"
#include "../core/emitter.h"
-#include "../core/formatter.h"
+#include "../core/formatter_p.h"
#include "../core/string.h"
#include "../core/support.h"
#include "../core/type.h"
-#ifdef ASMJIT_BUILD_X86
+#if !defined(ASMJIT_NO_X86)
#include "../x86/x86formatter_p.h"
#endif
-#ifdef ASMJIT_BUILD_ARM
- #include "../arm/armformatter_p.h"
+#if !defined(ASMJIT_NO_AARCH64)
+ #include "../arm/a64formatter_p.h"
#endif
ASMJIT_BEGIN_NAMESPACE
@@ -47,46 +30,64 @@ ASMJIT_BEGIN_NAMESPACE
class VirtReg;
#endif
-// ============================================================================
-// [asmjit::Formatter]
-// ============================================================================
-
namespace Formatter {
-Error formatTypeId(String& sb, uint32_t typeId) noexcept {
- if (typeId == Type::kIdVoid)
+static const char wordNameTable[][8] = {
+ "db",
+ "dw",
+ "dd",
+ "dq",
+ "byte",
+ "half",
+ "word",
+ "hword",
+ "dword",
+ "qword",
+ "xword",
+ "short",
+ "long",
+ "quad"
+};
+
+
+Error formatTypeId(String& sb, TypeId typeId) noexcept {
+ if (typeId == TypeId::kVoid)
return sb.append("void");
- if (!Type::isValid(typeId))
+ if (!TypeUtils::isValid(typeId))
return sb.append("unknown");
const char* typeName = "unknown";
- uint32_t typeSize = Type::sizeOf(typeId);
-
- uint32_t baseId = Type::baseOf(typeId);
- switch (baseId) {
- case Type::kIdIntPtr : typeName = "iptr" ; break;
- case Type::kIdUIntPtr: typeName = "uptr" ; break;
- case Type::kIdI8 : typeName = "i8" ; break;
- case Type::kIdU8 : typeName = "u8" ; break;
- case Type::kIdI16 : typeName = "i16" ; break;
- case Type::kIdU16 : typeName = "u16" ; break;
- case Type::kIdI32 : typeName = "i32" ; break;
- case Type::kIdU32 : typeName = "u32" ; break;
- case Type::kIdI64 : typeName = "i64" ; break;
- case Type::kIdU64 : typeName = "u64" ; break;
- case Type::kIdF32 : typeName = "f32" ; break;
- case Type::kIdF64 : typeName = "f64" ; break;
- case Type::kIdF80 : typeName = "f80" ; break;
- case Type::kIdMask8 : typeName = "mask8" ; break;
- case Type::kIdMask16 : typeName = "mask16"; break;
- case Type::kIdMask32 : typeName = "mask32"; break;
- case Type::kIdMask64 : typeName = "mask64"; break;
- case Type::kIdMmx32 : typeName = "mmx32" ; break;
- case Type::kIdMmx64 : typeName = "mmx64" ; break;
+ uint32_t typeSize = TypeUtils::sizeOf(typeId);
+ TypeId scalarType = TypeUtils::scalarOf(typeId);
+
+ switch (scalarType) {
+ case TypeId::kIntPtr : typeName = "intptr" ; break;
+ case TypeId::kUIntPtr: typeName = "uintptr"; break;
+ case TypeId::kInt8 : typeName = "int8" ; break;
+ case TypeId::kUInt8 : typeName = "uint8" ; break;
+ case TypeId::kInt16 : typeName = "int16" ; break;
+ case TypeId::kUInt16 : typeName = "uint16" ; break;
+ case TypeId::kInt32 : typeName = "int32" ; break;
+ case TypeId::kUInt32 : typeName = "uint32" ; break;
+ case TypeId::kInt64 : typeName = "int64" ; break;
+ case TypeId::kUInt64 : typeName = "uint64" ; break;
+ case TypeId::kFloat32: typeName = "float32"; break;
+ case TypeId::kFloat64: typeName = "float64"; break;
+ case TypeId::kFloat80: typeName = "float80"; break;
+ case TypeId::kMask8 : typeName = "mask8" ; break;
+ case TypeId::kMask16 : typeName = "mask16" ; break;
+ case TypeId::kMask32 : typeName = "mask32" ; break;
+ case TypeId::kMask64 : typeName = "mask64" ; break;
+ case TypeId::kMmx32 : typeName = "mmx32" ; break;
+ case TypeId::kMmx64 : typeName = "mmx64" ; break;
+
+ default:
+ typeName = "unknown";
+ break;
}
- uint32_t baseSize = Type::sizeOf(baseId);
+ uint32_t baseSize = TypeUtils::sizeOf(scalarType);
if (typeSize > baseSize) {
uint32_t count = typeSize / baseSize;
return sb.appendFormat("%sx%u", typeName, unsigned(count));
@@ -98,15 +99,15 @@ Error formatTypeId(String& sb, uint32_t typeId) noexcept {
Error formatFeature(
String& sb,
- uint32_t arch,
+ Arch arch,
uint32_t featureId) noexcept {
-#ifdef ASMJIT_BUILD_X86
+#if !defined(ASMJIT_NO_X86)
if (Environment::isFamilyX86(arch))
return x86::FormatterInternal::formatFeature(sb, featureId);
#endif
-#ifdef ASMJIT_BUILD_ARM
+#if !defined(ASMJIT_NO_AARCH32) && !defined(ASMJIT_NO_AARCH64)
if (Environment::isFamilyARM(arch))
return arm::FormatterInternal::formatFeature(sb, featureId);
#endif
@@ -116,7 +117,7 @@ Error formatFeature(
Error formatLabel(
String& sb,
- uint32_t formatFlags,
+ FormatFlags formatFlags,
const BaseEmitter* emitter,
uint32_t labelId) noexcept {
@@ -140,6 +141,9 @@ Error formatLabel(
ASMJIT_PROPAGATE(sb.append('.'));
}
+
+ if (le->type() == LabelType::kAnonymous)
+ ASMJIT_PROPAGATE(sb.append("L%u@", labelId));
return sb.append(le->name());
}
else {
@@ -149,20 +153,20 @@ Error formatLabel(
Error formatRegister(
String& sb,
- uint32_t formatFlags,
+ FormatFlags formatFlags,
const BaseEmitter* emitter,
- uint32_t arch,
- uint32_t regType,
+ Arch arch,
+ RegType regType,
uint32_t regId) noexcept {
-#ifdef ASMJIT_BUILD_X86
+#if !defined(ASMJIT_NO_X86)
if (Environment::isFamilyX86(arch))
return x86::FormatterInternal::formatRegister(sb, formatFlags, emitter, arch, regType, regId);
#endif
-#ifdef ASMJIT_BUILD_ARM
- if (Environment::isFamilyARM(arch))
- return arm::FormatterInternal::formatRegister(sb, formatFlags, emitter, arch, regType, regId);
+#if !defined(ASMJIT_NO_AARCH64)
+ if (Environment::isFamilyAArch64(arch))
+ return a64::FormatterInternal::formatRegister(sb, formatFlags, emitter, arch, regType, regId);
#endif
return kErrorInvalidArch;
@@ -170,47 +174,127 @@ Error formatRegister(
Error formatOperand(
String& sb,
- uint32_t formatFlags,
+ FormatFlags formatFlags,
const BaseEmitter* emitter,
- uint32_t arch,
+ Arch arch,
const Operand_& op) noexcept {
-#ifdef ASMJIT_BUILD_X86
+#if !defined(ASMJIT_NO_X86)
if (Environment::isFamilyX86(arch))
return x86::FormatterInternal::formatOperand(sb, formatFlags, emitter, arch, op);
#endif
-#ifdef ASMJIT_BUILD_ARM
- if (Environment::isFamilyARM(arch))
- return arm::FormatterInternal::formatOperand(sb, formatFlags, emitter, arch, op);
+#if !defined(ASMJIT_NO_AARCH64)
+ if (Environment::isFamilyAArch64(arch))
+ return a64::FormatterInternal::formatOperand(sb, formatFlags, emitter, arch, op);
#endif
return kErrorInvalidArch;
}
+ASMJIT_API Error formatDataType(
+ String& sb,
+ FormatFlags formatFlags,
+ Arch arch,
+ TypeId typeId) noexcept
+{
+ DebugUtils::unused(formatFlags);
+
+ if (ASMJIT_UNLIKELY(uint32_t(arch) > uint32_t(Arch::kMaxValue)))
+ return DebugUtils::errored(kErrorInvalidArch);
+
+ uint32_t typeSize = TypeUtils::sizeOf(typeId);
+ if (typeSize == 0 || typeSize > 8)
+ return DebugUtils::errored(kErrorInvalidState);
+
+ uint32_t typeSizeLog2 = Support::ctz(typeSize);
+ return sb.append(wordNameTable[size_t(ArchTraits::byArch(arch).typeNameIdByIndex(typeSizeLog2))]);
+}
+
+static Error formatDataHelper(String& sb, const char* typeName, uint32_t typeSize, const uint8_t* data, size_t itemCount) noexcept {
+ sb.append('.');
+ sb.append(typeName);
+ sb.append(' ');
+
+ for (size_t i = 0; i < itemCount; i++) {
+ uint64_t v = 0;
+
+ if (i != 0)
+ ASMJIT_PROPAGATE(sb.append(", ", 2));
+
+ switch (typeSize) {
+ case 1: v = data[0]; break;
+ case 2: v = Support::readU16u(data); break;
+ case 4: v = Support::readU32u(data); break;
+ case 8: v = Support::readU64u(data); break;
+ }
+
+ ASMJIT_PROPAGATE(sb.appendUInt(v, 16, typeSize * 2, StringFormatFlags::kAlternate));
+ data += typeSize;
+ }
+
+ return kErrorOk;
+}
+
+Error formatData(
+ String& sb,
+ FormatFlags formatFlags,
+ Arch arch,
+ TypeId typeId, const void* data, size_t itemCount, size_t repeatCount) noexcept
+{
+ DebugUtils::unused(formatFlags);
+
+ if (ASMJIT_UNLIKELY(!Environment::isDefinedArch(arch)))
+ return DebugUtils::errored(kErrorInvalidArch);
+
+ uint32_t typeSize = TypeUtils::sizeOf(typeId);
+ if (typeSize == 0)
+ return DebugUtils::errored(kErrorInvalidState);
+
+ if (!Support::isPowerOf2(typeSize)) {
+ itemCount *= typeSize;
+ typeSize = 1;
+ }
+
+ while (typeSize > 8u) {
+ typeSize >>= 1;
+ itemCount <<= 1;
+ }
+
+ uint32_t typeSizeLog2 = Support::ctz(typeSize);
+ const char* wordName = wordNameTable[size_t(ArchTraits::byArch(arch).typeNameIdByIndex(typeSizeLog2))];
+
+ if (repeatCount > 1)
+ ASMJIT_PROPAGATE(sb.appendFormat(".repeat %zu ", repeatCount));
+
+ return formatDataHelper(sb, wordName, typeSize, static_cast<const uint8_t*>(data), itemCount);
+}
+
Error formatInstruction(
String& sb,
- uint32_t formatFlags,
+ FormatFlags formatFlags,
const BaseEmitter* emitter,
- uint32_t arch,
+ Arch arch,
const BaseInst& inst, const Operand_* operands, size_t opCount) noexcept {
-#ifdef ASMJIT_BUILD_X86
+#if !defined(ASMJIT_NO_X86)
if (Environment::isFamilyX86(arch))
return x86::FormatterInternal::formatInstruction(sb, formatFlags, emitter, arch, inst, operands, opCount);
#endif
-#ifdef ASMJIT_BUILD_ARM
+#if !defined(ASMJIT_NO_AARCH64)
if (Environment::isFamilyARM(arch))
- return arm::FormatterInternal::formatInstruction(sb, formatFlags, emitter, arch, inst, operands, opCount);
+ return a64::FormatterInternal::formatInstruction(sb, formatFlags, emitter, arch, inst, operands, opCount);
#endif
return kErrorInvalidArch;
}
#ifndef ASMJIT_NO_BUILDER
-static Error formatFuncValue(String& sb, uint32_t formatFlags, const BaseEmitter* emitter, FuncValue value) noexcept {
- uint32_t typeId = value.typeId();
+
+#ifndef ASMJIT_NO_COMPILER
+static Error formatFuncValue(String& sb, FormatFlags formatFlags, const BaseEmitter* emitter, FuncValue value) noexcept {
+ TypeId typeId = value.typeId();
ASMJIT_PROPAGATE(formatTypeId(sb, typeId));
if (value.isAssigned()) {
@@ -237,84 +321,100 @@ static Error formatFuncValue(String& sb, uint32_t formatFlags, const BaseEmitter
return kErrorOk;
}
-static Error formatFuncRets(
+static Error formatFuncValuePack(
String& sb,
- uint32_t formatFlags,
- const BaseEmitter* emitter,
- const FuncDetail& fd,
- VirtReg* const* vRegs) noexcept {
+ FormatFlags formatFlags,
+ const BaseCompiler* cc,
+ const FuncValuePack& pack,
+ const RegOnly* vRegs) noexcept {
- if (!fd.hasRet())
+ size_t count = pack.count();
+ if (!count)
return sb.append("void");
- for (uint32_t i = 0; i < fd.retCount(); i++) {
- if (i) ASMJIT_PROPAGATE(sb.append(", "));
- ASMJIT_PROPAGATE(formatFuncValue(sb, formatFlags, emitter, fd.ret(i)));
+ if (count > 1)
+ sb.append('[');
+
+ for (uint32_t valueIndex = 0; valueIndex < count; valueIndex++) {
+ const FuncValue& value = pack[valueIndex];
+ if (!value)
+ break;
+
+ if (valueIndex)
+ ASMJIT_PROPAGATE(sb.append(", "));
+
+ ASMJIT_PROPAGATE(formatFuncValue(sb, formatFlags, cc, value));
-#ifndef ASMJIT_NO_COMPILER
if (vRegs) {
- static const char nullRet[] = "<none>";
- ASMJIT_PROPAGATE(sb.appendFormat(" %s", vRegs[i] ? vRegs[i]->name() : nullRet));
+ const VirtReg* virtReg = nullptr;
+ static const char nullReg[] = "<none>";
+
+ if (vRegs[valueIndex].isReg() && cc->isVirtIdValid(vRegs[valueIndex].id()))
+ virtReg = cc->virtRegById(vRegs[valueIndex].id());
+
+ ASMJIT_PROPAGATE(sb.appendFormat(" %s", virtReg ? virtReg->name() : nullReg));
}
-#else
- DebugUtils::unused(vRegs);
-#endif
}
+ if (count > 1)
+ sb.append(']');
+
return kErrorOk;
}
+static Error formatFuncRets(
+ String& sb,
+ FormatFlags formatFlags,
+ const BaseCompiler* cc,
+ const FuncDetail& fd) noexcept {
+
+ return formatFuncValuePack(sb, formatFlags, cc, fd.retPack(), nullptr);
+}
+
static Error formatFuncArgs(
String& sb,
- uint32_t formatFlags,
- const BaseEmitter* emitter,
+ FormatFlags formatFlags,
+ const BaseCompiler* cc,
const FuncDetail& fd,
- VirtReg* const* vRegs) noexcept {
+ const FuncNode::ArgPack* argPacks) noexcept {
- uint32_t count = fd.argCount();
- if (!count)
+ uint32_t argCount = fd.argCount();
+ if (!argCount)
return sb.append("void");
- for (uint32_t i = 0; i < count; i++) {
- if (i)
+ for (uint32_t argIndex = 0; argIndex < argCount; argIndex++) {
+ if (argIndex)
ASMJIT_PROPAGATE(sb.append(", "));
- ASMJIT_PROPAGATE(formatFuncValue(sb, formatFlags, emitter, fd.arg(i)));
-
-#ifndef ASMJIT_NO_COMPILER
- if (vRegs) {
- static const char nullArg[] = "<none>";
- ASMJIT_PROPAGATE(sb.appendFormat(" %s", vRegs[i] ? vRegs[i]->name() : nullArg));
- }
-#else
- DebugUtils::unused(vRegs);
-#endif
+ ASMJIT_PROPAGATE(formatFuncValuePack(sb, formatFlags, cc, fd.argPack(argIndex), argPacks[argIndex]._data));
}
return kErrorOk;
}
+#endif
Error formatNode(
String& sb,
- uint32_t formatFlags,
+ const FormatOptions& formatOptions,
const BaseBuilder* builder,
const BaseNode* node) noexcept {
- if (node->hasPosition() && (formatFlags & FormatOptions::kFlagPositions) != 0)
+ if (node->hasPosition() && formatOptions.hasFlag(FormatFlags::kPositions))
ASMJIT_PROPAGATE(sb.appendFormat("<%05u> ", node->position()));
+ size_t startLineIndex = sb.size();
+
switch (node->type()) {
- case BaseNode::kNodeInst:
- case BaseNode::kNodeJump: {
+ case NodeType::kInst:
+ case NodeType::kJump: {
const InstNode* instNode = node->as<InstNode>();
- ASMJIT_PROPAGATE(
- formatInstruction(sb, formatFlags, builder,
- builder->arch(),
- instNode->baseInst(), instNode->operands(), instNode->opCount()));
+ ASMJIT_PROPAGATE(builder->_funcs.formatInstruction(sb, formatOptions.flags(), builder,
+ builder->arch(),
+ instNode->baseInst(), instNode->operands(), instNode->opCount()));
break;
}
- case BaseNode::kNodeSection: {
+ case NodeType::kSection: {
const SectionNode* sectionNode = node->as<SectionNode>();
if (builder->_code->isSectionValid(sectionNode->id())) {
const Section* section = builder->_code->sectionById(sectionNode->id());
@@ -323,60 +423,64 @@ Error formatNode(
break;
}
- case BaseNode::kNodeLabel: {
+ case NodeType::kLabel: {
const LabelNode* labelNode = node->as<LabelNode>();
- ASMJIT_PROPAGATE(formatLabel(sb, formatFlags, builder, labelNode->labelId()));
+ ASMJIT_PROPAGATE(formatLabel(sb, formatOptions.flags(), builder, labelNode->labelId()));
ASMJIT_PROPAGATE(sb.append(":"));
break;
}
- case BaseNode::kNodeAlign: {
+ case NodeType::kAlign: {
const AlignNode* alignNode = node->as<AlignNode>();
- ASMJIT_PROPAGATE(
- sb.appendFormat("align %u (%s)",
- alignNode->alignment(),
- alignNode->alignMode() == kAlignCode ? "code" : "data"));
+ ASMJIT_PROPAGATE(sb.appendFormat(".align %u (%s)",
+ alignNode->alignment(),
+ alignNode->alignMode() == AlignMode::kCode ? "code" : "data"));
break;
}
- case BaseNode::kNodeEmbedData: {
+ case NodeType::kEmbedData: {
const EmbedDataNode* embedNode = node->as<EmbedDataNode>();
- ASMJIT_PROPAGATE(sb.append("embed "));
- if (embedNode->repeatCount() != 1)
- ASMJIT_PROPAGATE(sb.appendFormat("[repeat=%zu] ", size_t(embedNode->repeatCount())));
- ASMJIT_PROPAGATE(sb.appendFormat("%u bytes", embedNode->dataSize()));
+ ASMJIT_PROPAGATE(sb.append('.'));
+ ASMJIT_PROPAGATE(formatDataType(sb, formatOptions.flags(), builder->arch(), embedNode->typeId()));
+ ASMJIT_PROPAGATE(sb.appendFormat(" {Count=%zu Repeat=%zu TotalSize=%zu}", embedNode->itemCount(), embedNode->repeatCount(), embedNode->dataSize()));
break;
}
- case BaseNode::kNodeEmbedLabel: {
+ case NodeType::kEmbedLabel: {
const EmbedLabelNode* embedNode = node->as<EmbedLabelNode>();
ASMJIT_PROPAGATE(sb.append(".label "));
- ASMJIT_PROPAGATE(formatLabel(sb, formatFlags, builder, embedNode->labelId()));
+ ASMJIT_PROPAGATE(formatLabel(sb, formatOptions.flags(), builder, embedNode->labelId()));
break;
}
- case BaseNode::kNodeEmbedLabelDelta: {
+ case NodeType::kEmbedLabelDelta: {
const EmbedLabelDeltaNode* embedNode = node->as<EmbedLabelDeltaNode>();
ASMJIT_PROPAGATE(sb.append(".label ("));
- ASMJIT_PROPAGATE(formatLabel(sb, formatFlags, builder, embedNode->labelId()));
+ ASMJIT_PROPAGATE(formatLabel(sb, formatOptions.flags(), builder, embedNode->labelId()));
ASMJIT_PROPAGATE(sb.append(" - "));
- ASMJIT_PROPAGATE(formatLabel(sb, formatFlags, builder, embedNode->baseLabelId()));
+ ASMJIT_PROPAGATE(formatLabel(sb, formatOptions.flags(), builder, embedNode->baseLabelId()));
ASMJIT_PROPAGATE(sb.append(")"));
break;
}
- case BaseNode::kNodeComment: {
+ case NodeType::kConstPool: {
+ const ConstPoolNode* constPoolNode = node->as<ConstPoolNode>();
+ ASMJIT_PROPAGATE(sb.appendFormat("[ConstPool Size=%zu Alignment=%zu]", constPoolNode->size(), constPoolNode->alignment()));
+ break;
+ };
+
+ case NodeType::kComment: {
const CommentNode* commentNode = node->as<CommentNode>();
ASMJIT_PROPAGATE(sb.appendFormat("; %s", commentNode->inlineComment()));
break;
}
- case BaseNode::kNodeSentinel: {
+ case NodeType::kSentinel: {
const SentinelNode* sentinelNode = node->as<SentinelNode>();
const char* sentinelName = nullptr;
switch (sentinelNode->sentinelType()) {
- case SentinelNode::kSentinelFuncEnd:
+ case SentinelType::kFuncEnd:
sentinelName = "[FuncEnd]";
break;
@@ -390,20 +494,22 @@ Error formatNode(
}
#ifndef ASMJIT_NO_COMPILER
- case BaseNode::kNodeFunc: {
+ case NodeType::kFunc: {
const FuncNode* funcNode = node->as<FuncNode>();
- ASMJIT_PROPAGATE(formatLabel(sb, formatFlags, builder, funcNode->labelId()));
- ASMJIT_PROPAGATE(sb.append(": "));
+ if (builder->isCompiler()) {
+ ASMJIT_PROPAGATE(formatLabel(sb, formatOptions.flags(), builder, funcNode->labelId()));
+ ASMJIT_PROPAGATE(sb.append(": "));
- ASMJIT_PROPAGATE(formatFuncRets(sb, formatFlags, builder, funcNode->detail(), nullptr));
- ASMJIT_PROPAGATE(sb.append(" Func("));
- ASMJIT_PROPAGATE(formatFuncArgs(sb, formatFlags, builder, funcNode->detail(), funcNode->args()));
- ASMJIT_PROPAGATE(sb.append(")"));
+ ASMJIT_PROPAGATE(formatFuncRets(sb, formatOptions.flags(), static_cast<const BaseCompiler*>(builder), funcNode->detail()));
+ ASMJIT_PROPAGATE(sb.append(" Func("));
+ ASMJIT_PROPAGATE(formatFuncArgs(sb, formatOptions.flags(), static_cast<const BaseCompiler*>(builder), funcNode->detail(), funcNode->argPacks()));
+ ASMJIT_PROPAGATE(sb.append(")"));
+ }
break;
}
- case BaseNode::kNodeFuncRet: {
+ case NodeType::kFuncRet: {
const FuncRetNode* retNode = node->as<FuncRetNode>();
ASMJIT_PROPAGATE(sb.append("[FuncRet]"));
@@ -411,18 +517,17 @@ Error formatNode(
const Operand_& op = retNode->_opArray[i];
if (!op.isNone()) {
ASMJIT_PROPAGATE(sb.append(i == 0 ? " " : ", "));
- ASMJIT_PROPAGATE(formatOperand(sb, formatFlags, builder, builder->arch(), op));
+ ASMJIT_PROPAGATE(formatOperand(sb, formatOptions.flags(), builder, builder->arch(), op));
}
}
break;
}
- case BaseNode::kNodeInvoke: {
+ case NodeType::kInvoke: {
const InvokeNode* invokeNode = node->as<InvokeNode>();
- ASMJIT_PROPAGATE(
- formatInstruction(sb, formatFlags, builder,
- builder->arch(),
- invokeNode->baseInst(), invokeNode->operands(), invokeNode->opCount()));
+ ASMJIT_PROPAGATE(builder->_funcs.formatInstruction(sb, formatOptions.flags(), builder,
+ builder->arch(),
+ invokeNode->baseInst(), invokeNode->operands(), invokeNode->opCount()));
break;
}
#endif
@@ -433,28 +538,38 @@ Error formatNode(
}
}
+ if (node->hasInlineComment()) {
+ size_t requiredPadding = paddingFromOptions(formatOptions, FormatPaddingGroup::kRegularLine);
+ size_t currentPadding = sb.size() - startLineIndex;
+
+ if (currentPadding < requiredPadding)
+ ASMJIT_PROPAGATE(sb.appendChars(' ', requiredPadding - currentPadding));
+
+ ASMJIT_PROPAGATE(sb.append("; "));
+ ASMJIT_PROPAGATE(sb.append(node->inlineComment()));
+ }
+
return kErrorOk;
}
-
Error formatNodeList(
String& sb,
- uint32_t formatFlags,
+ const FormatOptions& formatOptions,
const BaseBuilder* builder) noexcept {
- return formatNodeList(sb, formatFlags, builder, builder->firstNode(), nullptr);
+ return formatNodeList(sb, formatOptions, builder, builder->firstNode(), nullptr);
}
Error formatNodeList(
String& sb,
- uint32_t formatFlags,
+ const FormatOptions& formatOptions,
const BaseBuilder* builder,
const BaseNode* begin,
const BaseNode* end) noexcept {
const BaseNode* node = begin;
while (node != end) {
- ASMJIT_PROPAGATE(formatNode(sb, formatFlags, builder, node));
+ ASMJIT_PROPAGATE(formatNode(sb, formatOptions, builder, node));
ASMJIT_PROPAGATE(sb.append('\n'));
node = node->next();
}
diff --git a/3rdparty/asmjit/src/asmjit/core/formatter.h b/3rdparty/asmjit/src/asmjit/core/formatter.h
index 81d1c77ccdf..d7a4b93476a 100644
--- a/3rdparty/asmjit/src/asmjit/core/formatter.h
+++ b/3rdparty/asmjit/src/asmjit/core/formatter.h
@@ -1,122 +1,98 @@
-// AsmJit - Machine code generation for C++
+// This file is part of AsmJit project <https://asmjit.com>
//
-// * Official AsmJit Home Page: https://asmjit.com
-// * Official Github Repository: https://github.com/asmjit/asmjit
-//
-// Copyright (c) 2008-2020 The AsmJit Authors
-//
-// This software is provided 'as-is', without any express or implied
-// warranty. In no event will the authors be held liable for any damages
-// arising from the use of this software.
-//
-// Permission is granted to anyone to use this software for any purpose,
-// including commercial applications, and to alter it and redistribute it
-// freely, subject to the following restrictions:
-//
-// 1. The origin of this software must not be misrepresented; you must not
-// claim that you wrote the original software. If you use this software
-// in a product, an acknowledgment in the product documentation would be
-// appreciated but is not required.
-// 2. Altered source versions must be plainly marked as such, and must not be
-// misrepresented as being the original software.
-// 3. This notice may not be removed or altered from any source distribution.
+// See asmjit.h or LICENSE.md for license and copyright information
+// SPDX-License-Identifier: Zlib
#ifndef ASMJIT_CORE_FORMATTER_H_INCLUDED
#define ASMJIT_CORE_FORMATTER_H_INCLUDED
+#include "../core/globals.h"
#include "../core/inst.h"
#include "../core/string.h"
-
-#ifndef ASMJIT_NO_LOGGING
+#include "../core/support.h"
ASMJIT_BEGIN_NAMESPACE
//! \addtogroup asmjit_logging
//! \{
-// ============================================================================
-// [Forward Declarations]
-// ============================================================================
-
+class BaseBuilder;
class BaseEmitter;
+class BaseNode;
struct Operand_;
-#ifndef ASMJIT_NO_BUILDER
-class BaseBuilder;
-class BaseNode;
-#endif
+//! Format flags used by \ref Logger and \ref FormatOptions.
+enum class FormatFlags : uint32_t {
+ //! No formatting flags.
+ kNone = 0u,
+
+ //! Show also binary form of each logged instruction (Assembler).
+ kMachineCode = 0x00000001u,
+ //! Show a text explanation of some immediate values.
+ kExplainImms = 0x00000002u,
+ //! Use hexadecimal notation of immediate values.
+ kHexImms = 0x00000004u,
+ //! Use hexadecimal notation of addresses and offsets in addresses.
+ kHexOffsets = 0x00000008u,
+ //! Show casts between virtual register types (Compiler output).
+ kRegCasts = 0x00000010u,
+ //! Show positions associated with nodes (Compiler output).
+ kPositions = 0x00000020u
+};
+ASMJIT_DEFINE_ENUM_FLAGS(FormatFlags)
+
+//! Format indentation group, used by \ref FormatOptions.
+enum class FormatIndentationGroup : uint32_t {
+ //! Indentation used for instructions and directives.
+ kCode = 0u,
+ //! Indentation used for labels and function nodes.
+ kLabel = 1u,
+ //! Indentation used for comments (not inline comments).
+ kComment = 2u,
+
+ //! \cond INTERNAL
+ //! Reserved for future use.
+ kReserved = 3u,
+ //! \endcond
+
+ //! Maximum value of `FormatIndentationGroup`.
+ kMaxValue = kReserved
+};
-// ============================================================================
-// [asmjit::FormatOptions]
-// ============================================================================
+//! Format padding group, used by \ref FormatOptions.
+enum class FormatPaddingGroup : uint32_t {
+ //! Describes padding of a regular line, which can represent instruction, data, or assembler directives.
+ kRegularLine = 0,
+ //! Describes padding of machine code dump that is visible next to the instruction, if enabled.
+ kMachineCode = 1,
+
+ //! Maximum value of `FormatPaddingGroup`.
+ kMaxValue = kMachineCode
+};
//! Formatting options used by \ref Logger and \ref Formatter.
class FormatOptions {
public:
- //! Format flags, see \ref Flags.
- uint32_t _flags;
- //! Indentation by type, see \ref IndentationType.
- uint8_t _indentation[4];
-
- //! Flags can enable a logging feature.
- enum Flags : uint32_t {
- //! No flags.
- kNoFlags = 0u,
-
- //! Show also binary form of each logged instruction (Assembler).
- kFlagMachineCode = 0x00000001u,
- //! Show a text explanation of some immediate values.
- kFlagExplainImms = 0x00000002u,
- //! Use hexadecimal notation of immediate values.
- kFlagHexImms = 0x00000004u,
- //! Use hexadecimal notation of address offsets.
- kFlagHexOffsets = 0x00000008u,
- //! Show casts between virtual register types (Compiler).
- kFlagRegCasts = 0x00000010u,
- //! Show positions associated with nodes (Compiler).
- kFlagPositions = 0x00000020u,
- //! Annotate nodes that are lowered by passes.
- kFlagAnnotations = 0x00000040u,
-
- // TODO: These must go, keep this only for formatting.
- //! Show an additional output from passes.
- kFlagDebugPasses = 0x00000080u,
- //! Show an additional output from RA.
- kFlagDebugRA = 0x00000100u
- };
-
- //! Describes indentation type of code, label, or comment in logger output.
- enum IndentationType : uint32_t {
- //! Indentation used for instructions and directives.
- kIndentationCode = 0u,
- //! Indentation used for labels and function nodes.
- kIndentationLabel = 1u,
- //! Indentation used for comments (not inline comments).
- kIndentationComment = 2u,
- //! \cond INTERNAL
- //! Reserved for future use.
- kIndentationReserved = 3u
- //! \endcond
- };
-
- //! \name Construction & Destruction
+ //! \name Members
//! \{
- //! Creates a default-initialized FormatOptions.
- constexpr FormatOptions() noexcept
- : _flags(0),
- _indentation { 0, 0, 0, 0 } {}
+ //! Format flags.
+ FormatFlags _flags = FormatFlags::kNone;
+ //! Indentations for each indentation group.
+ Support::Array<uint8_t, uint32_t(FormatIndentationGroup::kMaxValue) + 1> _indentation {};
+ //! Paddings for each padding group.
+ Support::Array<uint16_t, uint32_t(FormatPaddingGroup::kMaxValue) + 1> _padding {};
- constexpr FormatOptions(const FormatOptions& other) noexcept = default;
- inline FormatOptions& operator=(const FormatOptions& other) noexcept = default;
+ //! \}
+
+ //! \name Reset
+ //! \{
//! Resets FormatOptions to its default initialized state.
inline void reset() noexcept {
- _flags = 0;
- _indentation[0] = 0;
- _indentation[1] = 0;
- _indentation[2] = 0;
- _indentation[3] = 0;
+ _flags = FormatFlags::kNone;
+ _indentation.fill(uint8_t(0));
+ _padding.fill(uint16_t(0));
}
//! \}
@@ -125,90 +101,109 @@ public:
//! \{
//! Returns format flags.
- constexpr uint32_t flags() const noexcept { return _flags; }
+ inline FormatFlags flags() const noexcept { return _flags; }
//! Tests whether the given `flag` is set in format flags.
- constexpr bool hasFlag(uint32_t flag) const noexcept { return (_flags & flag) != 0; }
+ inline bool hasFlag(FormatFlags flag) const noexcept { return Support::test(_flags, flag); }
+
//! Resets all format flags to `flags`.
- inline void setFlags(uint32_t flags) noexcept { _flags = flags; }
+ inline void setFlags(FormatFlags flags) noexcept { _flags = flags; }
//! Adds `flags` to format flags.
- inline void addFlags(uint32_t flags) noexcept { _flags |= flags; }
+ inline void addFlags(FormatFlags flags) noexcept { _flags |= flags; }
//! Removes `flags` from format flags.
- inline void clearFlags(uint32_t flags) noexcept { _flags &= ~flags; }
-
- //! Returns indentation for the given `type`, see \ref IndentationType.
- constexpr uint8_t indentation(uint32_t type) const noexcept { return _indentation[type]; }
- //! Sets indentation for the given `type`, see \ref IndentationType.
- inline void setIndentation(uint32_t type, uint32_t n) noexcept { _indentation[type] = uint8_t(n); }
- //! Resets indentation for the given `type` to zero.
- inline void resetIndentation(uint32_t type) noexcept { _indentation[type] = uint8_t(0); }
+ inline void clearFlags(FormatFlags flags) noexcept { _flags &= ~flags; }
+
+ //! Returns indentation for the given indentation `group`.
+ inline uint8_t indentation(FormatIndentationGroup group) const noexcept { return _indentation[group]; }
+ //! Sets indentation for the given indentation `group`.
+ inline void setIndentation(FormatIndentationGroup group, uint32_t n) noexcept { _indentation[group] = uint8_t(n); }
+ //! Resets indentation for the given indentation `group` to zero.
+ inline void resetIndentation(FormatIndentationGroup group) noexcept { _indentation[group] = uint8_t(0); }
+
+ //! Returns pading for the given padding `group`.
+ inline size_t padding(FormatPaddingGroup group) const noexcept { return _padding[group]; }
+ //! Sets pading for the given padding `group`.
+ inline void setPadding(FormatPaddingGroup group, size_t n) noexcept { _padding[group] = uint16_t(n); }
+ //! Resets pading for the given padding `group` to zero, which means that a default padding will be used
+ //! based on the target architecture properties.
+ inline void resetPadding(FormatPaddingGroup group) noexcept { _padding[group] = uint16_t(0); }
//! \}
};
-// ============================================================================
-// [asmjit::Formatter]
-// ============================================================================
-
//! Provides formatting functionality to format operands, instructions, and nodes.
namespace Formatter {
+#ifndef ASMJIT_NO_LOGGING
+
//! Appends a formatted `typeId` to the output string `sb`.
ASMJIT_API Error formatTypeId(
String& sb,
- uint32_t typeId) noexcept;
+ TypeId typeId) noexcept;
//! Appends a formatted `featureId` to the output string `sb`.
//!
-//! See \ref BaseFeatures.
+//! See \ref CpuFeatures.
ASMJIT_API Error formatFeature(
String& sb,
- uint32_t arch,
+ Arch arch,
uint32_t featureId) noexcept;
//! Appends a formatted register to the output string `sb`.
//!
-//! \note Emitter is optional, but it's required to format virtual registers,
-//! which won't be formatted properly if the `emitter` is not provided.
+//! \note Emitter is optional, but it's required to format virtual registers, which won't be formatted properly
+//! if the `emitter` is not provided.
ASMJIT_API Error formatRegister(
String& sb,
- uint32_t formatFlags,
+ FormatFlags formatFlags,
const BaseEmitter* emitter,
- uint32_t arch,
- uint32_t regType,
+ Arch arch,
+ RegType regType,
uint32_t regId) noexcept;
//! Appends a formatted label to the output string `sb`.
//!
-//! \note Emitter is optional, but it's required to format named labels
-//! properly, otherwise the formatted as it is an anonymous label.
+//! \note Emitter is optional, but it's required to format named labels properly, otherwise the formatted as
+//! it is an anonymous label.
ASMJIT_API Error formatLabel(
String& sb,
- uint32_t formatFlags,
+ FormatFlags formatFlags,
const BaseEmitter* emitter,
uint32_t labelId) noexcept;
//! Appends a formatted operand to the output string `sb`.
//!
-//! \note Emitter is optional, but it's required to format named labels and
-//! virtual registers. See \ref formatRegister() and \ref formatLabel() for
-//! more details.
+//! \note Emitter is optional, but it's required to format named labels and virtual registers. See
+//! \ref formatRegister() and \ref formatLabel() for more details.
ASMJIT_API Error formatOperand(
String& sb,
- uint32_t formatFlags,
+ FormatFlags formatFlags,
const BaseEmitter* emitter,
- uint32_t arch,
+ Arch arch,
const Operand_& op) noexcept;
+//! Appends a formatted data-type to the output string `sb`.
+ASMJIT_API Error formatDataType(
+ String& sb,
+ FormatFlags formatFlags,
+ Arch arch,
+ TypeId typeId) noexcept;
+
+//! Appends a formatted data to the output string `sb`.
+ASMJIT_API Error formatData(
+ String& sb,
+ FormatFlags formatFlags,
+ Arch arch,
+ TypeId typeId, const void* data, size_t itemCount, size_t repeatCount = 1) noexcept;
+
//! Appends a formatted instruction to the output string `sb`.
//!
-//! \note Emitter is optional, but it's required to format named labels and
-//! virtual registers. See \ref formatRegister() and \ref formatLabel() for
-//! more details.
+//! \note Emitter is optional, but it's required to format named labels and virtual registers. See
+//! \ref formatRegister() and \ref formatLabel() for more details.
ASMJIT_API Error formatInstruction(
String& sb,
- uint32_t formatFlags,
+ FormatFlags formatFlags,
const BaseEmitter* emitter,
- uint32_t arch,
+ Arch arch,
const BaseInst& inst, const Operand_* operands, size_t opCount) noexcept;
#ifndef ASMJIT_NO_BUILDER
@@ -217,7 +212,7 @@ ASMJIT_API Error formatInstruction(
//! The `node` must belong to the provided `builder`.
ASMJIT_API Error formatNode(
String& sb,
- uint32_t formatFlags,
+ const FormatOptions& formatOptions,
const BaseBuilder* builder,
const BaseNode* node) noexcept;
@@ -226,27 +221,27 @@ ASMJIT_API Error formatNode(
//! All nodes that are part of the given `builder` will be appended.
ASMJIT_API Error formatNodeList(
String& sb,
- uint32_t formatFlags,
+ const FormatOptions& formatOptions,
const BaseBuilder* builder) noexcept;
//! Appends formatted nodes to the output string `sb`.
//!
-//! This function works the same as \ref formatNode(), but appends more nodes
-//! to the output string, separating each node with a newline '\n' character.
+//! This function works the same as \ref formatNode(), but appends more nodes to the output string,
+//! separating each node with a newline '\n' character.
ASMJIT_API Error formatNodeList(
String& sb,
- uint32_t formatFlags,
+ const FormatOptions& formatOptions,
const BaseBuilder* builder,
const BaseNode* begin,
const BaseNode* end) noexcept;
#endif
+#endif
+
} // {Formatter}
//! \}
ASMJIT_END_NAMESPACE
-#endif
-
#endif // ASMJIT_CORE_FORMATTER_H_INCLUDED
diff --git a/3rdparty/asmjit/src/asmjit/core/formatter_p.h b/3rdparty/asmjit/src/asmjit/core/formatter_p.h
new file mode 100644
index 00000000000..6070fd74f24
--- /dev/null
+++ b/3rdparty/asmjit/src/asmjit/core/formatter_p.h
@@ -0,0 +1,34 @@
+// This file is part of AsmJit project <https://asmjit.com>
+//
+// See asmjit.h or LICENSE.md for license and copyright information
+// SPDX-License-Identifier: Zlib
+
+#ifndef ASMJIT_CORE_FORMATTER_P_H_INCLUDED
+#define ASMJIT_CORE_FORMATTER_P_H_INCLUDED
+
+#include "../core/formatter.h"
+
+ASMJIT_BEGIN_NAMESPACE
+
+//! \cond INTERNAL
+//! \addtogroup asmjit_logging
+//! \{
+
+namespace Formatter {
+
+static ASMJIT_FORCE_INLINE size_t paddingFromOptions(const FormatOptions& formatOptions, FormatPaddingGroup group) noexcept {
+ static constexpr uint16_t _defaultPaddingTable[uint32_t(FormatPaddingGroup::kMaxValue) + 1] = { 44, 26 };
+ static_assert(uint32_t(FormatPaddingGroup::kMaxValue) + 1 == 2, "If a new group is defined it must be added here");
+
+ size_t padding = formatOptions.padding(group);
+ return padding ? padding : size_t(_defaultPaddingTable[uint32_t(group)]);
+}
+
+} // {Formatter}
+
+//! \}
+//! \endcond
+
+ASMJIT_END_NAMESPACE
+
+#endif // ASMJIT_CORE_FORMATTER_H_P_INCLUDED
diff --git a/3rdparty/asmjit/src/asmjit/core/func.cpp b/3rdparty/asmjit/src/asmjit/core/func.cpp
index 514ae9db4e1..04dc2aaf208 100644
--- a/3rdparty/asmjit/src/asmjit/core/func.cpp
+++ b/3rdparty/asmjit/src/asmjit/core/func.cpp
@@ -1,49 +1,49 @@
-// AsmJit - Machine code generation for C++
+// This file is part of AsmJit project <https://asmjit.com>
//
-// * Official AsmJit Home Page: https://asmjit.com
-// * Official Github Repository: https://github.com/asmjit/asmjit
-//
-// Copyright (c) 2008-2020 The AsmJit Authors
-//
-// This software is provided 'as-is', without any express or implied
-// warranty. In no event will the authors be held liable for any damages
-// arising from the use of this software.
-//
-// Permission is granted to anyone to use this software for any purpose,
-// including commercial applications, and to alter it and redistribute it
-// freely, subject to the following restrictions:
-//
-// 1. The origin of this software must not be misrepresented; you must not
-// claim that you wrote the original software. If you use this software
-// in a product, an acknowledgment in the product documentation would be
-// appreciated but is not required.
-// 2. Altered source versions must be plainly marked as such, and must not be
-// misrepresented as being the original software.
-// 3. This notice may not be removed or altered from any source distribution.
+// See asmjit.h or LICENSE.md for license and copyright information
+// SPDX-License-Identifier: Zlib
#include "../core/api-build_p.h"
-#include "../core/arch.h"
+#include "../core/archtraits.h"
#include "../core/func.h"
+#include "../core/operand.h"
#include "../core/type.h"
+#include "../core/funcargscontext_p.h"
-#ifdef ASMJIT_BUILD_X86
- #include "../x86/x86internal_p.h"
- #include "../x86/x86operand.h"
+#if !defined(ASMJIT_NO_X86)
+ #include "../x86/x86func_p.h"
#endif
-#ifdef ASMJIT_BUILD_ARM
- #include "../arm/arminternal_p.h"
- #include "../arm/armoperand.h"
+#if !defined(ASMJIT_NO_AARCH64)
+ #include "../arm/a64func_p.h"
#endif
ASMJIT_BEGIN_NAMESPACE
-// ============================================================================
-// [asmjit::FuncDetail - Init / Reset]
-// ============================================================================
+// CallConv - Init & Reset
+// =======================
+
+ASMJIT_FAVOR_SIZE Error CallConv::init(CallConvId ccId, const Environment& environment) noexcept {
+ reset();
+
+#if !defined(ASMJIT_NO_X86)
+ if (environment.isFamilyX86())
+ return x86::FuncInternal::initCallConv(*this, ccId, environment);
+#endif
+
+#if !defined(ASMJIT_NO_AARCH64)
+ if (environment.isFamilyAArch64())
+ return a64::FuncInternal::initCallConv(*this, ccId, environment);
+#endif
+
+ return DebugUtils::errored(kErrorInvalidArgument);
+}
+
+// FuncDetail - Init / Reset
+// =========================
ASMJIT_FAVOR_SIZE Error FuncDetail::init(const FuncSignature& signature, const Environment& environment) noexcept {
- uint32_t ccId = signature.callConv();
+ CallConvId ccId = signature.callConvId();
uint32_t argCount = signature.argCount();
if (ASMJIT_UNLIKELY(argCount > Globals::kMaxFuncArgs))
@@ -53,91 +53,234 @@ ASMJIT_FAVOR_SIZE Error FuncDetail::init(const FuncSignature& signature, const E
ASMJIT_PROPAGATE(cc.init(ccId, environment));
uint32_t registerSize = Environment::registerSizeFromArch(cc.arch());
- uint32_t deabstractDelta = Type::deabstractDeltaOfSize(registerSize);
+ uint32_t deabstractDelta = TypeUtils::deabstractDeltaOfSize(registerSize);
- const uint8_t* args = signature.args();
- for (uint32_t i = 0; i < argCount; i++) {
- FuncValue& arg = _args[i];
- arg.initTypeId(Type::deabstract(args[i], deabstractDelta));
+ const TypeId* signatureArgs = signature.args();
+ for (uint32_t argIndex = 0; argIndex < argCount; argIndex++) {
+ FuncValuePack& argPack = _args[argIndex];
+ argPack[0].initTypeId(TypeUtils::deabstract(signatureArgs[argIndex], deabstractDelta));
}
+
_argCount = uint8_t(argCount);
_vaIndex = uint8_t(signature.vaIndex());
- uint32_t ret = signature.ret();
- if (ret != Type::kIdVoid) {
- _rets[0].initTypeId(Type::deabstract(ret, deabstractDelta));
- _retCount = 1;
- }
+ TypeId ret = signature.ret();
+ if (ret != TypeId::kVoid)
+ _rets[0].initTypeId(TypeUtils::deabstract(ret, deabstractDelta));
-#ifdef ASMJIT_BUILD_X86
+#if !defined(ASMJIT_NO_X86)
if (environment.isFamilyX86())
- return x86::X86Internal::initFuncDetail(*this, signature, registerSize);
+ return x86::FuncInternal::initFuncDetail(*this, signature, registerSize);
#endif
-#ifdef ASMJIT_BUILD_ARM
- if (environment.isFamilyARM())
- return arm::ArmInternal::initFuncDetail(*this, signature, registerSize);
+#if !defined(ASMJIT_NO_AARCH64)
+ if (environment.isFamilyAArch64())
+ return a64::FuncInternal::initFuncDetail(*this, signature, registerSize);
#endif
- // We should never bubble here as if `cc.init()` succeeded then there has to
- // be an implementation for the current architecture. However, stay safe.
+ // We should never bubble here as if `cc.init()` succeeded then there has to be an implementation for the current
+ // architecture. However, stay safe.
return DebugUtils::errored(kErrorInvalidArgument);
}
-// ============================================================================
-// [asmjit::FuncFrame - Init / Reset / Finalize]
-// ============================================================================
+// FuncFrame - Init
+// ================
ASMJIT_FAVOR_SIZE Error FuncFrame::init(const FuncDetail& func) noexcept {
-#ifdef ASMJIT_BUILD_X86
- if (Environment::isFamilyX86(func.callConv().arch()))
- return x86::X86Internal::initFuncFrame(*this, func);
-#endif
+ Arch arch = func.callConv().arch();
+ if (!Environment::isValidArch(arch))
+ return DebugUtils::errored(kErrorInvalidArch);
-#ifdef ASMJIT_BUILD_ARM
- if (Environment::isFamilyARM(func.callConv().arch()))
- return arm::ArmInternal::initFuncFrame(*this, func);
-#endif
+ const ArchTraits& archTraits = ArchTraits::byArch(arch);
- return DebugUtils::errored(kErrorInvalidArgument);
+ // Initializing FuncFrame means making a copy of some properties of `func`. Properties like `_localStackSize` will
+ // be set by the user before the frame is finalized.
+ reset();
+
+ _arch = arch;
+ _spRegId = uint8_t(archTraits.spRegId());
+ _saRegId = uint8_t(BaseReg::kIdBad);
+
+ uint32_t naturalStackAlignment = func.callConv().naturalStackAlignment();
+ uint32_t minDynamicAlignment = Support::max<uint32_t>(naturalStackAlignment, 16);
+
+ if (minDynamicAlignment == naturalStackAlignment)
+ minDynamicAlignment <<= 1;
+
+ _naturalStackAlignment = uint8_t(naturalStackAlignment);
+ _minDynamicAlignment = uint8_t(minDynamicAlignment);
+ _redZoneSize = uint8_t(func.redZoneSize());
+ _spillZoneSize = uint8_t(func.spillZoneSize());
+ _finalStackAlignment = uint8_t(_naturalStackAlignment);
+
+ if (func.hasFlag(CallConvFlags::kCalleePopsStack)) {
+ _calleeStackCleanup = uint16_t(func.argStackSize());
+ }
+
+ // Initial masks of dirty and preserved registers.
+ for (RegGroup group : RegGroupVirtValues{}) {
+ _dirtyRegs[group] = func.usedRegs(group);
+ _preservedRegs[group] = func.preservedRegs(group);
+ }
+
+ // Exclude stack pointer - this register is never included in saved GP regs.
+ _preservedRegs[RegGroup::kGp] &= ~Support::bitMask(archTraits.spRegId());
+
+ // The size and alignment of save/restore area of registers for each virtual register group
+ _saveRestoreRegSize = func.callConv()._saveRestoreRegSize;
+ _saveRestoreAlignment = func.callConv()._saveRestoreAlignment;
+
+ return kErrorOk;
}
+// FuncFrame - Finalize
+// ====================
+
ASMJIT_FAVOR_SIZE Error FuncFrame::finalize() noexcept {
-#ifdef ASMJIT_BUILD_X86
- if (Environment::isFamilyX86(arch()))
- return x86::X86Internal::finalizeFuncFrame(*this);
-#endif
+ if (!Environment::isValidArch(arch()))
+ return DebugUtils::errored(kErrorInvalidArch);
-#ifdef ASMJIT_BUILD_ARM
- if (Environment::isFamilyARM(arch()))
- return arm::ArmInternal::finalizeFuncFrame(*this);
-#endif
+ const ArchTraits& archTraits = ArchTraits::byArch(arch());
- return DebugUtils::errored(kErrorInvalidArgument);
+ uint32_t registerSize = _saveRestoreRegSize[RegGroup::kGp];
+ uint32_t vectorSize = _saveRestoreRegSize[RegGroup::kVec];
+ uint32_t returnAddressSize = archTraits.hasLinkReg() ? 0u : registerSize;
+
+ // The final stack alignment must be updated accordingly to call and local stack alignments.
+ uint32_t stackAlignment = _finalStackAlignment;
+ ASMJIT_ASSERT(stackAlignment == Support::max(_naturalStackAlignment,
+ _callStackAlignment,
+ _localStackAlignment));
+
+ bool hasFP = hasPreservedFP();
+ bool hasDA = hasDynamicAlignment();
+
+ uint32_t kSp = archTraits.spRegId();
+ uint32_t kFp = archTraits.fpRegId();
+ uint32_t kLr = archTraits.linkRegId();
+
+ // Make frame pointer dirty if the function uses it.
+ if (hasFP) {
+ _dirtyRegs[RegGroup::kGp] |= Support::bitMask(kFp);
+
+ // Currently required by ARM, if this works differently across architectures we would have to generalize most
+ // likely in CallConv.
+ if (kLr != BaseReg::kIdBad)
+ _dirtyRegs[RegGroup::kGp] |= Support::bitMask(kLr);
+ }
+
+ // These two are identical if the function doesn't align its stack dynamically.
+ uint32_t saRegId = _saRegId;
+ if (saRegId == BaseReg::kIdBad)
+ saRegId = kSp;
+
+ // Fix stack arguments base-register from SP to FP in case it was not picked before and the function performs
+ // dynamic stack alignment.
+ if (hasDA && saRegId == kSp)
+ saRegId = kFp;
+
+ // Mark as dirty any register but SP if used as SA pointer.
+ if (saRegId != kSp)
+ _dirtyRegs[RegGroup::kGp] |= Support::bitMask(saRegId);
+
+ _spRegId = uint8_t(kSp);
+ _saRegId = uint8_t(saRegId);
+
+ // Setup stack size used to save preserved registers.
+ uint32_t saveRestoreSizes[2] {};
+ for (RegGroup group : RegGroupVirtValues{})
+ saveRestoreSizes[size_t(!archTraits.hasInstPushPop(group))]
+ += Support::alignUp(Support::popcnt(savedRegs(group)) * saveRestoreRegSize(group), saveRestoreAlignment(group));
+
+ _pushPopSaveSize = uint16_t(saveRestoreSizes[0]);
+ _extraRegSaveSize = uint16_t(saveRestoreSizes[1]);
+
+ uint32_t v = 0; // The beginning of the stack frame relative to SP after prolog.
+ v += callStackSize(); // Count 'callStackSize' <- This is used to call functions.
+ v = Support::alignUp(v, stackAlignment); // Align to function's stack alignment.
+
+ _localStackOffset = v; // Store 'localStackOffset' <- Function's local stack starts here.
+ v += localStackSize(); // Count 'localStackSize' <- Function's local stack ends here.
+
+ // If the function's stack must be aligned, calculate the alignment necessary to store vector registers, and set
+ // `FuncAttributes::kAlignedVecSR` to inform PEI that it can use instructions that perform aligned stores/loads.
+ if (stackAlignment >= vectorSize && _extraRegSaveSize) {
+ addAttributes(FuncAttributes::kAlignedVecSR);
+ v = Support::alignUp(v, vectorSize); // Align 'extraRegSaveOffset'.
+ }
+
+ _extraRegSaveOffset = v; // Store 'extraRegSaveOffset' <- Non-GP save/restore starts here.
+ v += _extraRegSaveSize; // Count 'extraRegSaveSize' <- Non-GP save/restore ends here.
+
+ // Calculate if dynamic alignment (DA) slot (stored as offset relative to SP) is required and its offset.
+ if (hasDA && !hasFP) {
+ _daOffset = v; // Store 'daOffset' <- DA pointer would be stored here.
+ v += registerSize; // Count 'daOffset'.
+ }
+ else {
+ _daOffset = FuncFrame::kTagInvalidOffset;
+ }
+
+ // Link Register
+ // -------------
+ //
+ // The stack is aligned after the function call as the return address is stored in a link register. Some
+ // architectures may require to always have aligned stack after PUSH/POP operation, which is represented
+ // by ArchTraits::stackAlignmentConstraint().
+ //
+ // No Link Register (X86/X64)
+ // --------------------------
+ //
+ // The return address should be stored after GP save/restore regs. It has the same size as `registerSize`
+ // (basically the native register/pointer size). We don't adjust it now as `v` now contains the exact size
+ // that the function requires to adjust (call frame + stack frame, vec stack size). The stack (if we consider
+ // this size) is misaligned now, as it's always aligned before the function call - when `call()` is executed
+ // it pushes the current EIP|RIP onto the stack, and misaligns it by 12 or 8 bytes (depending on the
+ // architecture). So count number of bytes needed to align it up to the function's CallFrame (the beginning).
+ if (v || hasFuncCalls() || !returnAddressSize)
+ v += Support::alignUpDiff(v + pushPopSaveSize() + returnAddressSize, stackAlignment);
+
+ _pushPopSaveOffset = v; // Store 'pushPopSaveOffset' <- Function's push/pop save/restore starts here.
+ _stackAdjustment = v; // Store 'stackAdjustment' <- SA used by 'add SP, SA' and 'sub SP, SA'.
+ v += _pushPopSaveSize; // Count 'pushPopSaveSize' <- Function's push/pop save/restore ends here.
+ _finalStackSize = v; // Store 'finalStackSize' <- Final stack used by the function.
+
+ if (!archTraits.hasLinkReg())
+ v += registerSize; // Count 'ReturnAddress' <- As CALL pushes onto stack.
+
+ // If the function performs dynamic stack alignment then the stack-adjustment must be aligned.
+ if (hasDA)
+ _stackAdjustment = Support::alignUp(_stackAdjustment, stackAlignment);
+
+ // Calculate where the function arguments start relative to SP.
+ _saOffsetFromSP = hasDA ? FuncFrame::kTagInvalidOffset : v;
+
+ // Calculate where the function arguments start relative to FP or user-provided register.
+ _saOffsetFromSA = hasFP ? returnAddressSize + registerSize // Return address + frame pointer.
+ : returnAddressSize + _pushPopSaveSize; // Return address + all push/pop regs.
+
+ return kErrorOk;
}
-// ============================================================================
-// [asmjit::FuncArgsAssignment]
-// ============================================================================
+// FuncArgsAssignment - UpdateFuncFrame
+// ====================================
ASMJIT_FAVOR_SIZE Error FuncArgsAssignment::updateFuncFrame(FuncFrame& frame) const noexcept {
- uint32_t arch = frame.arch();
+ Arch arch = frame.arch();
const FuncDetail* func = funcDetail();
if (!func)
return DebugUtils::errored(kErrorInvalidState);
-#ifdef ASMJIT_BUILD_X86
- if (Environment::isFamilyX86(arch))
- return x86::X86Internal::argsToFuncFrame(*this, frame);
-#endif
-
-#ifdef ASMJIT_BUILD_ARM
- if (Environment::isFamilyARM(arch))
- return arm::ArmInternal::argsToFuncFrame(*this, frame);
-#endif
+ RAConstraints constraints;
+ ASMJIT_PROPAGATE(constraints.init(arch));
- return DebugUtils::errored(kErrorInvalidArch);
+ FuncArgsContext ctx;
+ ASMJIT_PROPAGATE(ctx.initWorkData(frame, *this, &constraints));
+ ASMJIT_PROPAGATE(ctx.markDstRegsDirty(frame));
+ ASMJIT_PROPAGATE(ctx.markScratchRegs(frame));
+ ASMJIT_PROPAGATE(ctx.markStackArgsReg(frame));
+ return kErrorOk;
}
ASMJIT_END_NAMESPACE
diff --git a/3rdparty/asmjit/src/asmjit/core/func.h b/3rdparty/asmjit/src/asmjit/core/func.h
index 9c45c1f8b3d..8ecf1487ad2 100644
--- a/3rdparty/asmjit/src/asmjit/core/func.h
+++ b/3rdparty/asmjit/src/asmjit/core/func.h
@@ -1,31 +1,12 @@
-// AsmJit - Machine code generation for C++
+// This file is part of AsmJit project <https://asmjit.com>
//
-// * Official AsmJit Home Page: https://asmjit.com
-// * Official Github Repository: https://github.com/asmjit/asmjit
-//
-// Copyright (c) 2008-2020 The AsmJit Authors
-//
-// This software is provided 'as-is', without any express or implied
-// warranty. In no event will the authors be held liable for any damages
-// arising from the use of this software.
-//
-// Permission is granted to anyone to use this software for any purpose,
-// including commercial applications, and to alter it and redistribute it
-// freely, subject to the following restrictions:
-//
-// 1. The origin of this software must not be misrepresented; you must not
-// claim that you wrote the original software. If you use this software
-// in a product, an acknowledgment in the product documentation would be
-// appreciated but is not required.
-// 2. Altered source versions must be plainly marked as such, and must not be
-// misrepresented as being the original software.
-// 3. This notice may not be removed or altered from any source distribution.
+// See asmjit.h or LICENSE.md for license and copyright information
+// SPDX-License-Identifier: Zlib
#ifndef ASMJIT_CORE_FUNC_H_INCLUDED
#define ASMJIT_CORE_FUNC_H_INCLUDED
-#include "../core/arch.h"
-#include "../core/callconv.h"
+#include "../core/archtraits.h"
#include "../core/environment.h"
#include "../core/operand.h"
#include "../core/type.h"
@@ -36,69 +17,393 @@ ASMJIT_BEGIN_NAMESPACE
//! \addtogroup asmjit_function
//! \{
-// ============================================================================
-// [asmjit::FuncArgIndex]
-// ============================================================================
+//! Calling convention id.
+//!
+//! Calling conventions can be divided into the following groups:
+//!
+//! - Universal - calling conventions are applicable to any target. They will be converted to a target dependent
+//! calling convention at runtime by \ref CallConv::init() with some help from \ref Environment. The purpose of
+//! these calling conventions is to make using functions less target dependent and closer to C and C++.
+//!
+//! - Target specific - calling conventions that are used by a particular architecture and ABI. For example
+//! Windows 64-bit calling convention and AMD64 SystemV calling convention.
+enum class CallConvId : uint8_t {
+ //! None or invalid (can't be used).
+ kNone = 0,
+
+ // Universal Calling Conventions
+ // -----------------------------
+
+ //! Standard function call or explicit `__cdecl` where it can be specified.
+ //!
+ //! This is a universal calling convention, which is used to initialize specific calling connventions based on
+ //! architecture, platform, and its ABI.
+ kCDecl = 1,
-//! Function argument index (lo/hi).
-enum FuncArgIndex : uint32_t {
- //! Maximum number of function arguments supported by AsmJit.
- kFuncArgCount = Globals::kMaxFuncArgs,
- //! Extended maximum number of arguments (used internally).
- kFuncArgCountLoHi = kFuncArgCount * 2,
+ //! `__stdcall` on targets that support this calling convention (X86).
+ //!
+ //! \note This calling convention is only supported on 32-bit X86. If used on environment that doesn't support
+ //! this calling convention it will be replaced by \ref CallConvId::kCDecl.
+ kStdCall = 2,
- //! Index to the LO part of function argument (default).
+ //! `__fastcall` on targets that support this calling convention (X86).
//!
- //! This value is typically omitted and added only if there is HI argument
- //! accessed.
- kFuncArgLo = 0,
+ //! \note This calling convention is only supported on 32-bit X86. If used on environment that doesn't support
+ //! this calling convention it will be replaced by \ref CallConvId::kCDecl.
+ kFastCall = 3,
- //! Index to the HI part of function argument.
+ //! `__vectorcall` on targets that support this calling convention (X86/X64).
+ //!
+ //! \note This calling convention is only supported on 32-bit and 64-bit X86 architecture on Windows platform.
+ //! If used on environment that doesn't support this calling it will be replaced by \ref CallConvId::kCDecl.
+ kVectorCall = 4,
+
+ //! `__thiscall` on targets that support this calling convention (X86).
+ //!
+ //! \note This calling convention is only supported on 32-bit X86 Windows platform. If used on environment that
+ //! doesn't support this calling convention it will be replaced by \ref CallConvId::kCDecl.
+ kThisCall = 5,
+
+ //! `__attribute__((regparm(1)))` convention (GCC and Clang).
+ kRegParm1 = 6,
+ //! `__attribute__((regparm(2)))` convention (GCC and Clang).
+ kRegParm2 = 7,
+ //! `__attribute__((regparm(3)))` convention (GCC and Clang).
+ kRegParm3 = 8,
+
+ //! Soft-float calling convention (ARM).
//!
- //! HI part of function argument depends on target architecture. On x86 it's
- //! typically used to transfer 64-bit integers (they form a pair of 32-bit
- //! integers).
- kFuncArgHi = kFuncArgCount
+ //! Floating point arguments are passed via general purpose registers.
+ kSoftFloat = 9,
+
+ //! Hard-float calling convention (ARM).
+ //!
+ //! Floating point arguments are passed via SIMD registers.
+ kHardFloat = 10,
+
+ //! AsmJit specific calling convention designed for calling functions inside a multimedia code that don't use many
+ //! registers internally, but are long enough to be called and not inlined. These functions are usually used to
+ //! calculate trigonometric functions, logarithms, etc...
+ kLightCall2 = 16,
+ kLightCall3 = 17,
+ kLightCall4 = 18,
+
+ // ABI-Specific Calling Conventions
+ // --------------------------------
+
+ //! X64 System-V calling convention.
+ kX64SystemV = 32,
+ //! X64 Windows calling convention.
+ kX64Windows = 33,
+
+ //! Maximum value of `CallConvId`.
+ kMaxValue = kX64Windows,
+
+ // Host Calling Conventions
+ // ------------------------
+
+ //! Host calling convention detected at compile-time.
+ kHost =
+#if defined(_DOXYGEN)
+ DETECTED_AT_COMPILE_TIME
+#elif ASMJIT_ARCH_ARM == 32 && defined(__SOFTFP__)
+ kSoftFloat
+#elif ASMJIT_ARCH_ARM == 32 && !defined(__SOFTFP__)
+ kHardFloat
+#else
+ kCDecl
+#endif
+};
+
+//! Strategy used by calling conventions to assign registers to function arguments.
+//!
+//! Calling convention strategy describes how AsmJit should convert function arguments used by \ref FuncSignature
+//! into register identifiers and stack offsets. The \ref CallConvStrategy::kDefault strategy assigns registers
+//! and then stack whereas \ref CallConvStrategy::kX64Windows strategy does register shadowing as defined by WIN64
+//! calling convention, which is only used by 64-bit Windows.
+enum class CallConvStrategy : uint8_t {
+ //! Default register assignment strategy.
+ kDefault = 0,
+ //! Windows 64-bit ABI register assignment strategy.
+ kX64Windows = 1,
+ //! Windows 64-bit __vectorcall register assignment strategy.
+ kX64VectorCall = 2,
+
+ //! Maximum value of `CallConvStrategy`.
+ kMaxValue = kX64VectorCall
+};
+
+//! Calling convention flags.
+enum class CallConvFlags : uint32_t {
+ //! No flags.
+ kNone = 0,
+ //! Callee is responsible for cleaning up the stack.
+ kCalleePopsStack = 0x0001u,
+ //! Pass vector arguments indirectly (as a pointer).
+ kIndirectVecArgs = 0x0002u,
+ //! Pass F32 and F64 arguments via VEC128 register.
+ kPassFloatsByVec = 0x0004u,
+ //! Pass MMX and vector arguments via stack if the function has variable arguments.
+ kPassVecByStackIfVA = 0x0008u,
+ //! MMX registers are passed and returned via GP registers.
+ kPassMmxByGp = 0x0010u,
+ //! MMX registers are passed and returned via XMM registers.
+ kPassMmxByXmm = 0x0020u,
+ //! Calling convention can be used with variable arguments.
+ kVarArgCompatible = 0x0080u
};
+ASMJIT_DEFINE_ENUM_FLAGS(CallConvFlags)
+
+//! Function calling convention.
+//!
+//! Function calling convention is a scheme that defines how function parameters are passed and how function
+//! returns its result. AsmJit defines a variety of architecture and OS specific calling conventions and also
+//! provides a compile time detection to make the code-generation easier.
+struct CallConv {
+ //! \name Constants
+ //! \{
+
+ enum : uint32_t {
+ //! Maximum number of register arguments per register group.
+ //!
+ //! \note This is not really AsmJit's limitatation, it's just the number that makes sense considering all common
+ //! calling conventions. Usually even conventions that use registers to pass function arguments are limited to 8
+ //! and less arguments passed via registers per group.
+ kMaxRegArgsPerGroup = 16
+ };
+
+ //! \}
+
+ //! \name Members
+ //! \{
+
+ //! Target architecture.
+ Arch _arch;
+ //! Calling convention id.
+ CallConvId _id;
+ //! Register assignment strategy.
+ CallConvStrategy _strategy;
+
+ //! Red zone size (AMD64 == 128 bytes).
+ uint8_t _redZoneSize;
+ //! Spill zone size (WIN-X64 == 32 bytes).
+ uint8_t _spillZoneSize;
+ //! Natural stack alignment as defined by OS/ABI.
+ uint8_t _naturalStackAlignment;
+
+ //! Calling convention flags.
+ CallConvFlags _flags;
+
+ //! Size to save/restore per register group.
+ Support::Array<uint8_t, Globals::kNumVirtGroups> _saveRestoreRegSize;
+ //! Alignment of save/restore groups.
+ Support::Array<uint8_t, Globals::kNumVirtGroups> _saveRestoreAlignment;
+
+ //! Mask of all passed registers, per group.
+ Support::Array<RegMask, Globals::kNumVirtGroups> _passedRegs;
+ //! Mask of all preserved registers, per group.
+ Support::Array<RegMask, Globals::kNumVirtGroups> _preservedRegs;
+
+ //! Passed registers' order.
+ union RegOrder {
+ //! Passed registers, ordered.
+ uint8_t id[kMaxRegArgsPerGroup];
+ //! Packed IDs in `uint32_t` array.
+ uint32_t packed[(kMaxRegArgsPerGroup + 3) / 4];
+ };
+
+ //! Passed registers' order, per register group.
+ Support::Array<RegOrder, Globals::kNumVirtGroups> _passedOrder;
+
+ //! \}
+
+ //! \name Construction & Destruction
+ //! \{
+
+ //! Initializes this calling convention to the given `ccId` based on the `environment`.
+ //!
+ //! See \ref CallConvId and \ref Environment for more details.
+ ASMJIT_API Error init(CallConvId ccId, const Environment& environment) noexcept;
+
+ //! Resets this CallConv struct into a defined state.
+ //!
+ //! It's recommended to reset the \ref CallConv struct in case you would like create a custom calling convention
+ //! as it prevents from using an uninitialized data (CallConv doesn't have a constructor that would initialize it,
+ //! it's just a struct).
+ inline void reset() noexcept {
+ memset(this, 0, sizeof(*this));
+ memset(_passedOrder.data(), 0xFF, sizeof(_passedOrder));
+ }
+
+ //! \}
+
+ //! \name Accessors
+ //! \{
+
+ //! Returns the target architecture of this calling convention.
+ inline Arch arch() const noexcept { return _arch; }
+ //! Sets the target architecture of this calling convention.
+ inline void setArch(Arch arch) noexcept { _arch = arch; }
+
+ //! Returns the calling convention id.
+ inline CallConvId id() const noexcept { return _id; }
+ //! Sets the calling convention id.
+ inline void setId(CallConvId ccId) noexcept { _id = ccId; }
+
+ //! Returns the strategy used to assign registers to arguments.
+ inline CallConvStrategy strategy() const noexcept { return _strategy; }
+ //! Sets the strategy used to assign registers to arguments.
+ inline void setStrategy(CallConvStrategy ccStrategy) noexcept { _strategy = ccStrategy; }
+
+ //! Tests whether the calling convention has the given `flag` set.
+ inline bool hasFlag(CallConvFlags flag) const noexcept { return Support::test(_flags, flag); }
+ //! Returns the calling convention flags, see `Flags`.
+ inline CallConvFlags flags() const noexcept { return _flags; }
+ //! Adds the calling convention flags, see `Flags`.
+ inline void setFlags(CallConvFlags flag) noexcept { _flags = flag; };
+ //! Adds the calling convention flags, see `Flags`.
+ inline void addFlags(CallConvFlags flags) noexcept { _flags |= flags; };
+
+ //! Tests whether this calling convention specifies 'RedZone'.
+ inline bool hasRedZone() const noexcept { return _redZoneSize != 0; }
+ //! Tests whether this calling convention specifies 'SpillZone'.
+ inline bool hasSpillZone() const noexcept { return _spillZoneSize != 0; }
+
+ //! Returns size of 'RedZone'.
+ inline uint32_t redZoneSize() const noexcept { return _redZoneSize; }
+ //! Returns size of 'SpillZone'.
+ inline uint32_t spillZoneSize() const noexcept { return _spillZoneSize; }
+
+ //! Sets size of 'RedZone'.
+ inline void setRedZoneSize(uint32_t size) noexcept { _redZoneSize = uint8_t(size); }
+ //! Sets size of 'SpillZone'.
+ inline void setSpillZoneSize(uint32_t size) noexcept { _spillZoneSize = uint8_t(size); }
+
+ //! Returns a natural stack alignment.
+ inline uint32_t naturalStackAlignment() const noexcept { return _naturalStackAlignment; }
+ //! Sets a natural stack alignment.
+ //!
+ //! This function can be used to override the default stack alignment in case that you know that it's alignment is
+ //! different. For example it allows to implement custom calling conventions that guarantee higher stack alignment.
+ inline void setNaturalStackAlignment(uint32_t value) noexcept { _naturalStackAlignment = uint8_t(value); }
+
+ //! Returns the size of a register (or its part) to be saved and restored of the given `group`.
+ inline uint32_t saveRestoreRegSize(RegGroup group) const noexcept { return _saveRestoreRegSize[group]; }
+ //! Sets the size of a vector register (or its part) to be saved and restored.
+ inline void setSaveRestoreRegSize(RegGroup group, uint32_t size) noexcept { _saveRestoreRegSize[group] = uint8_t(size); }
+
+ //! Returns the alignment of a save-restore area of the given `group`.
+ inline uint32_t saveRestoreAlignment(RegGroup group) const noexcept { return _saveRestoreAlignment[group]; }
+ //! Sets the alignment of a save-restore area of the given `group`.
+ inline void setSaveRestoreAlignment(RegGroup group, uint32_t alignment) noexcept { _saveRestoreAlignment[group] = uint8_t(alignment); }
+
+ //! Returns the order of passed registers of the given `group`.
+ inline const uint8_t* passedOrder(RegGroup group) const noexcept {
+ ASMJIT_ASSERT(group <= RegGroup::kMaxVirt);
+ return _passedOrder[size_t(group)].id;
+ }
+
+ //! Returns the mask of passed registers of the given `group`.
+ inline RegMask passedRegs(RegGroup group) const noexcept {
+ ASMJIT_ASSERT(group <= RegGroup::kMaxVirt);
+ return _passedRegs[size_t(group)];
+ }
+
+ inline void _setPassedPacked(RegGroup group, uint32_t p0, uint32_t p1, uint32_t p2, uint32_t p3) noexcept {
+ ASMJIT_ASSERT(group <= RegGroup::kMaxVirt);
+
+ _passedOrder[group].packed[0] = p0;
+ _passedOrder[group].packed[1] = p1;
+ _passedOrder[group].packed[2] = p2;
+ _passedOrder[group].packed[3] = p3;
+ }
+
+ //! Resets the order and mask of passed registers.
+ inline void setPassedToNone(RegGroup group) noexcept {
+ ASMJIT_ASSERT(group <= RegGroup::kMaxVirt);
+
+ _setPassedPacked(group, 0xFFFFFFFFu, 0xFFFFFFFFu, 0xFFFFFFFFu, 0xFFFFFFFFu);
+ _passedRegs[size_t(group)] = 0u;
+ }
+
+ //! Sets the order and mask of passed registers.
+ inline void setPassedOrder(RegGroup group, uint32_t a0, uint32_t a1 = 0xFF, uint32_t a2 = 0xFF, uint32_t a3 = 0xFF, uint32_t a4 = 0xFF, uint32_t a5 = 0xFF, uint32_t a6 = 0xFF, uint32_t a7 = 0xFF) noexcept {
+ ASMJIT_ASSERT(group <= RegGroup::kMaxVirt);
+
+ // NOTE: This should always be called with all arguments known at compile time, so even if it looks scary it
+ // should be translated into few instructions.
+ _setPassedPacked(group, Support::bytepack32_4x8(a0, a1, a2, a3),
+ Support::bytepack32_4x8(a4, a5, a6, a7),
+ 0xFFFFFFFFu,
+ 0xFFFFFFFFu);
+
+ _passedRegs[group] = (a0 != 0xFF ? 1u << a0 : 0u) |
+ (a1 != 0xFF ? 1u << a1 : 0u) |
+ (a2 != 0xFF ? 1u << a2 : 0u) |
+ (a3 != 0xFF ? 1u << a3 : 0u) |
+ (a4 != 0xFF ? 1u << a4 : 0u) |
+ (a5 != 0xFF ? 1u << a5 : 0u) |
+ (a6 != 0xFF ? 1u << a6 : 0u) |
+ (a7 != 0xFF ? 1u << a7 : 0u) ;
+ }
+
+ //! Returns preserved register mask of the given `group`.
+ inline RegMask preservedRegs(RegGroup group) const noexcept {
+ ASMJIT_ASSERT(group <= RegGroup::kMaxVirt);
+ return _preservedRegs[group];
+ }
+
+ //! Sets preserved register mask of the given `group`.
+ inline void setPreservedRegs(RegGroup group, RegMask regs) noexcept {
+ ASMJIT_ASSERT(group <= RegGroup::kMaxVirt);
+ _preservedRegs[group] = regs;
+ }
-// ============================================================================
-// [asmjit::FuncSignature]
-// ============================================================================
+ //! \}
+};
//! Function signature.
//!
-//! Contains information about function return type, count of arguments and
-//! their TypeIds. Function signature is a low level structure which doesn't
-//! contain platform specific or calling convention specific information.
+//! Contains information about function return type, count of arguments and their TypeIds. Function signature is
+//! a low level structure which doesn't contain platform specific or calling convention specific information.
struct FuncSignature {
+ //! \name Constants
+ //! \{
+
+ enum : uint8_t {
+ //! Doesn't have variable number of arguments (`...`).
+ kNoVarArgs = 0xFFu
+ };
+
+ //! \}
+
+ //! \name Members
+ //! \{
+
//! Calling convention id.
- uint8_t _callConv;
+ CallConvId _ccId;
//! Count of arguments.
uint8_t _argCount;
//! Index of a first VA or `kNoVarArgs`.
uint8_t _vaIndex;
//! Return value TypeId.
- uint8_t _ret;
+ TypeId _ret;
//! Function arguments TypeIds.
- const uint8_t* _args;
+ const TypeId* _args;
- enum : uint8_t {
- //! Doesn't have variable number of arguments (`...`).
- kNoVarArgs = 0xFF
- };
+ //! \}
//! \name Initializtion & Reset
//! \{
//! Initializes the function signature.
- inline void init(uint32_t ccId, uint32_t vaIndex, uint32_t ret, const uint8_t* args, uint32_t argCount) noexcept {
- ASMJIT_ASSERT(ccId <= 0xFF);
+ inline void init(CallConvId ccId, uint32_t vaIndex, TypeId ret, const TypeId* args, uint32_t argCount) noexcept {
ASMJIT_ASSERT(argCount <= 0xFF);
- _callConv = uint8_t(ccId);
+ _ccId = ccId;
_argCount = uint8_t(argCount);
_vaIndex = uint8_t(vaIndex);
- _ret = uint8_t(ret);
+ _ret = ret;
_args = args;
}
@@ -110,9 +415,9 @@ struct FuncSignature {
//! \{
//! Returns the calling convention.
- inline uint32_t callConv() const noexcept { return _callConv; }
+ inline CallConvId callConvId() const noexcept { return _ccId; }
//! Sets the calling convention to `ccId`;
- inline void setCallConv(uint32_t ccId) noexcept { _callConv = uint8_t(ccId); }
+ inline void setCallConvId(CallConvId ccId) noexcept { _ccId = ccId; }
//! Tests whether the function has variable number of arguments (...).
inline bool hasVarArgs() const noexcept { return _vaIndex != kNoVarArgs; }
@@ -126,48 +431,40 @@ struct FuncSignature {
//! Returns the number of function arguments.
inline uint32_t argCount() const noexcept { return _argCount; }
- inline bool hasRet() const noexcept { return _ret != Type::kIdVoid; }
+ inline bool hasRet() const noexcept { return _ret != TypeId::kVoid; }
//! Returns the return value type.
- inline uint32_t ret() const noexcept { return _ret; }
+ inline TypeId ret() const noexcept { return _ret; }
//! Returns the type of the argument at index `i`.
- inline uint32_t arg(uint32_t i) const noexcept {
+ inline TypeId arg(uint32_t i) const noexcept {
ASMJIT_ASSERT(i < _argCount);
return _args[i];
}
//! Returns the array of function arguments' types.
- inline const uint8_t* args() const noexcept { return _args; }
+ inline const TypeId* args() const noexcept { return _args; }
//! \}
};
-// ============================================================================
-// [asmjit::FuncSignatureT]
-// ============================================================================
-
template<typename... RET_ARGS>
class FuncSignatureT : public FuncSignature {
public:
- inline FuncSignatureT(uint32_t ccId = CallConv::kIdHost, uint32_t vaIndex = kNoVarArgs) noexcept {
- static const uint8_t ret_args[] = { (uint8_t(Type::IdOfT<RET_ARGS>::kTypeId))... };
+ inline FuncSignatureT(CallConvId ccId = CallConvId::kHost, uint32_t vaIndex = kNoVarArgs) noexcept {
+ static constexpr TypeId ret_args[] = { (TypeId(TypeUtils::TypeIdOfT<RET_ARGS>::kTypeId))... };
init(ccId, vaIndex, ret_args[0], ret_args + 1, uint32_t(ASMJIT_ARRAY_SIZE(ret_args) - 1));
}
};
-// ============================================================================
-// [asmjit::FuncSignatureBuilder]
-// ============================================================================
-
//! Function signature builder.
class FuncSignatureBuilder : public FuncSignature {
public:
- uint8_t _builderArgList[kFuncArgCount];
+ TypeId _builderArgList[Globals::kMaxFuncArgs];
//! \name Initializtion & Reset
//! \{
- inline FuncSignatureBuilder(uint32_t ccId = CallConv::kIdHost, uint32_t vaIndex = kNoVarArgs) noexcept {
- init(ccId, vaIndex, Type::kIdVoid, _builderArgList, 0);
+ inline FuncSignatureBuilder(CallConvId ccId = CallConvId::kHost, uint32_t vaIndex = kNoVarArgs) noexcept {
+ init(ccId, vaIndex, TypeId::kVoid, _builderArgList, 0);
}
//! \}
@@ -176,42 +473,39 @@ public:
//! \{
//! Sets the return type to `retType`.
- inline void setRet(uint32_t retType) noexcept { _ret = uint8_t(retType); }
+ inline void setRet(TypeId retType) noexcept { _ret = retType; }
//! Sets the return type based on `T`.
template<typename T>
- inline void setRetT() noexcept { setRet(Type::IdOfT<T>::kTypeId); }
+ inline void setRetT() noexcept { setRet(TypeId(TypeUtils::TypeIdOfT<T>::kTypeId)); }
//! Sets the argument at index `index` to `argType`.
- inline void setArg(uint32_t index, uint32_t argType) noexcept {
+ inline void setArg(uint32_t index, TypeId argType) noexcept {
ASMJIT_ASSERT(index < _argCount);
- _builderArgList[index] = uint8_t(argType);
+ _builderArgList[index] = argType;
}
//! Sets the argument at index `i` to the type based on `T`.
template<typename T>
- inline void setArgT(uint32_t index) noexcept { setArg(index, Type::IdOfT<T>::kTypeId); }
+ inline void setArgT(uint32_t index) noexcept { setArg(index, TypeId(TypeUtils::TypeIdOfT<T>::kTypeId)); }
//! Appends an argument of `type` to the function prototype.
- inline void addArg(uint32_t type) noexcept {
- ASMJIT_ASSERT(_argCount < kFuncArgCount);
- _builderArgList[_argCount++] = uint8_t(type);
+ inline void addArg(TypeId type) noexcept {
+ ASMJIT_ASSERT(_argCount < Globals::kMaxFuncArgs);
+ _builderArgList[_argCount++] = type;
}
//! Appends an argument of type based on `T` to the function prototype.
template<typename T>
- inline void addArgT() noexcept { addArg(Type::IdOfT<T>::kTypeId); }
+ inline void addArgT() noexcept { addArg(TypeId(TypeUtils::TypeIdOfT<T>::kTypeId)); }
//! \}
};
-// ============================================================================
-// [asmjit::FuncValue]
-// ============================================================================
-
-//! Argument or return value as defined by `FuncSignature`, but with register
-//! or stack address (and other metadata) assigned to it.
+//! Argument or return value (or its part) as defined by `FuncSignature`, but with register or stack address
+//! (and other metadata) assigned.
struct FuncValue {
- uint32_t _data;
+ //! \name Constants
+ //! \{
- enum Parts : uint32_t {
+ enum Bits : uint32_t {
kTypeIdShift = 0, //!< TypeId shift.
kTypeIdMask = 0x000000FFu, //!< TypeId mask.
@@ -230,23 +524,33 @@ struct FuncValue {
kRegTypeMask = 0xFF000000u //!< RegType mask.
};
- //! \name Initializtion & Reset
+ //! \}
+
+ //! \name Members
//! \{
- // These initialize the whole `FuncValue` to either register or stack. Useful
- // when you know all of these properties and wanna just set it up.
+ uint32_t _data;
+
+ //! \}
+
+ //! \name Initializtion & Reset
+ //!
+ //! These initialize the whole `FuncValue` to either register or stack. Useful when you know all of these
+ //! properties and wanna just set it up.
+ //!
+ //! \{
//! Initializes the `typeId` of this `FuncValue`.
- inline void initTypeId(uint32_t typeId) noexcept {
- _data = typeId << kTypeIdShift;
+ inline void initTypeId(TypeId typeId) noexcept {
+ _data = uint32_t(typeId) << kTypeIdShift;
}
- inline void initReg(uint32_t regType, uint32_t regId, uint32_t typeId, uint32_t flags = 0) noexcept {
- _data = (regType << kRegTypeShift) | (regId << kRegIdShift) | (typeId << kTypeIdShift) | kFlagIsReg | flags;
+ inline void initReg(RegType regType, uint32_t regId, TypeId typeId, uint32_t flags = 0) noexcept {
+ _data = (uint32_t(regType) << kRegTypeShift) | (regId << kRegIdShift) | (uint32_t(typeId) << kTypeIdShift) | kFlagIsReg | flags;
}
- inline void initStack(int32_t offset, uint32_t typeId) noexcept {
- _data = (uint32_t(offset) << kStackOffsetShift) | (typeId << kTypeIdShift) | kFlagIsStack;
+ inline void initStack(int32_t offset, TypeId typeId) noexcept {
+ _data = (uint32_t(offset) << kStackOffsetShift) | (uint32_t(typeId) << kTypeIdShift) | kFlagIsStack;
}
//! Resets the value to its unassigned state.
@@ -255,15 +559,15 @@ struct FuncValue {
//! \}
//! \name Assign
+ //!
+ //! These initialize only part of `FuncValue`, useful when building `FuncValue` incrementally. The caller
+ //! should first init the type-id by caliing `initTypeId` and then continue building either register or stack.
+ //!
//! \{
- // These initialize only part of `FuncValue`, useful when building `FuncValue`
- // incrementally. The caller should first init the type-id by caliing `initTypeId`
- // and then continue building either register or stack.
-
- inline void assignRegData(uint32_t regType, uint32_t regId) noexcept {
+ inline void assignRegData(RegType regType, uint32_t regId) noexcept {
ASMJIT_ASSERT((_data & (kRegTypeMask | kRegIdMask)) == 0);
- _data |= (regType << kRegTypeShift) | (regId << kRegIdShift) | kFlagIsReg;
+ _data |= (uint32_t(regType) << kRegTypeShift) | (regId << kRegIdShift) | kFlagIsReg;
}
inline void assignStackOffset(int32_t offset) noexcept {
@@ -276,10 +580,13 @@ struct FuncValue {
//! \name Accessors
//! \{
+ //! Returns true if the value is initialized (explicit bool cast).
+ inline explicit operator bool() const noexcept { return _data != 0; }
+
inline void _replaceValue(uint32_t mask, uint32_t value) noexcept { _data = (_data & ~mask) | value; }
//! Tests whether the `FuncValue` has a flag `flag` set.
- inline bool hasFlag(uint32_t flag) const noexcept { return (_data & flag) != 0; }
+ inline bool hasFlag(uint32_t flag) const noexcept { return Support::test(_data, flag); }
//! Adds `flags` to `FuncValue`.
inline void addFlags(uint32_t flags) noexcept { _data |= flags; }
//! Clears `flags` of `FuncValue`.
@@ -300,9 +607,9 @@ struct FuncValue {
inline bool isDone() const noexcept { return hasFlag(kFlagIsDone); }
//! Returns a register type of the register used to pass function argument or return value.
- inline uint32_t regType() const noexcept { return (_data & kRegTypeMask) >> kRegTypeShift; }
+ inline RegType regType() const noexcept { return RegType((_data & kRegTypeMask) >> kRegTypeShift); }
//! Sets a register type of the register used to pass function argument or return value.
- inline void setRegType(uint32_t regType) noexcept { _replaceValue(kRegTypeMask, regType << kRegTypeShift); }
+ inline void setRegType(RegType regType) noexcept { _replaceValue(kRegTypeMask, uint32_t(regType) << kRegTypeShift); }
//! Returns a physical id of the register used to pass function argument or return value.
inline uint32_t regId() const noexcept { return (_data & kRegIdMask) >> kRegIdShift; }
@@ -314,50 +621,170 @@ struct FuncValue {
//! Sets a stack offset of this argument.
inline void setStackOffset(int32_t offset) noexcept { _replaceValue(kStackOffsetMask, uint32_t(offset) << kStackOffsetShift); }
- //! Tests whether the argument or return value has associated `Type::Id`.
- inline bool hasTypeId() const noexcept { return (_data & kTypeIdMask) != 0; }
+ //! Tests whether the argument or return value has associated `TypeId`.
+ inline bool hasTypeId() const noexcept { return Support::test(_data, kTypeIdMask); }
//! Returns a TypeId of this argument or return value.
- inline uint32_t typeId() const noexcept { return (_data & kTypeIdMask) >> kTypeIdShift; }
+ inline TypeId typeId() const noexcept { return TypeId((_data & kTypeIdMask) >> kTypeIdShift); }
//! Sets a TypeId of this argument or return value.
- inline void setTypeId(uint32_t typeId) noexcept { _replaceValue(kTypeIdMask, typeId << kTypeIdShift); }
+ inline void setTypeId(TypeId typeId) noexcept { _replaceValue(kTypeIdMask, uint32_t(typeId) << kTypeIdShift); }
+
+ //! \}
+};
+
+//! Contains multiple `FuncValue` instances in an array so functions that use multiple registers for arguments or
+//! return values can represent all inputs and outputs.
+struct FuncValuePack {
+public:
+ //! \name Members
+ //! \{
+
+ //! Values of the pack.
+ FuncValue _values[Globals::kMaxValuePack];
+
+ //! \}
+
+ //! \name Initialization & Reset
+ //! \{
+
+ //! Resets all values in the pack.
+ inline void reset() noexcept {
+ for (size_t i = 0; i < Globals::kMaxValuePack; i++)
+ _values[i].reset();
+ }
+
+ //! \}
+
+ //! \name Accessors
+ //! \{
+
+ //! Calculates how many values are in the pack, checking for non-values from the end.
+ inline uint32_t count() const noexcept {
+ uint32_t n = Globals::kMaxValuePack;
+ while (n && !_values[n - 1])
+ n--;
+ return n;
+ }
+
+ inline FuncValue* values() noexcept { return _values; }
+ inline const FuncValue* values() const noexcept { return _values; }
+
+ inline void resetValue(size_t index) noexcept {
+ ASMJIT_ASSERT(index < Globals::kMaxValuePack);
+ _values[index].reset();
+ }
+
+ inline bool hasValue(size_t index) noexcept {
+ ASMJIT_ASSERT(index < Globals::kMaxValuePack);
+ return _values[index].isInitialized();
+ }
+
+ inline void assignReg(size_t index, const BaseReg& reg, TypeId typeId = TypeId::kVoid) noexcept {
+ ASMJIT_ASSERT(index < Globals::kMaxValuePack);
+ ASMJIT_ASSERT(reg.isPhysReg());
+ _values[index].initReg(reg.type(), reg.id(), typeId);
+ }
+
+ inline void assignReg(size_t index, RegType regType, uint32_t regId, TypeId typeId = TypeId::kVoid) noexcept {
+ ASMJIT_ASSERT(index < Globals::kMaxValuePack);
+ _values[index].initReg(regType, regId, typeId);
+ }
+
+ inline void assignStack(size_t index, int32_t offset, TypeId typeId = TypeId::kVoid) noexcept {
+ ASMJIT_ASSERT(index < Globals::kMaxValuePack);
+ _values[index].initStack(offset, typeId);
+ }
+
+ inline FuncValue& operator[](size_t index) {
+ ASMJIT_ASSERT(index < Globals::kMaxValuePack);
+ return _values[index];
+ }
+
+ inline const FuncValue& operator[](size_t index) const {
+ ASMJIT_ASSERT(index < Globals::kMaxValuePack);
+ return _values[index];
+ }
//! \}
};
-// ============================================================================
-// [asmjit::FuncDetail]
-// ============================================================================
+//! Attributes are designed in a way that all are initially false, and user or \ref FuncFrame finalizer adds
+//! them when necessary.
+enum class FuncAttributes : uint32_t {
+ //! No attributes.
+ kNoAttributes = 0,
+
+ //! Function has variable number of arguments.
+ kHasVarArgs = 0x00000001u,
+ //! Preserve frame pointer (don't omit FP).
+ kHasPreservedFP = 0x00000010u,
+ //! Function calls other functions (is not leaf).
+ kHasFuncCalls = 0x00000020u,
+ //! Function has aligned save/restore of vector registers.
+ kAlignedVecSR = 0x00000040u,
+ //! FuncFrame is finalized and can be used by prolog/epilog inserter (PEI).
+ kIsFinalized = 0x00000800u,
+
+ // X86 Specific Attributes
+ // -----------------------
+
+ //! Enables the use of AVX within the function's body, prolog, and epilog (X86).
+ //!
+ //! This flag instructs prolog and epilog emitter to use AVX instead of SSE for manipulating XMM registers.
+ kX86_AVXEnabled = 0x00010000u,
-//! Function detail - CallConv and expanded FuncSignature.
+ //! Enables the use of AVX-512 within the function's body, prolog, and epilog (X86).
+ //!
+ //! This flag instructs Compiler register allocator to use additional 16 registers introduced by AVX-512.
+ //! Additionally, if the functions saves full width of ZMM registers (custom calling conventions only) then
+ //! the prolog/epilog inserter would use AVX-512 move instructions to emit the save and restore sequence.
+ kX86_AVX512Enabled = 0x00020000u,
+
+ //! This flag instructs the epilog writer to emit EMMS instruction before RET (X86).
+ kX86_MMXCleanup = 0x00040000u,
+
+ //! This flag instructs the epilog writer to emit VZEROUPPER instruction before RET (X86).
+ kX86_AVXCleanup = 0x00080000u
+};
+ASMJIT_DEFINE_ENUM_FLAGS(FuncAttributes)
+
+//! Function detail - \ref CallConv and expanded \ref FuncSignature.
//!
-//! Function detail is architecture and OS dependent representation of a function.
-//! It contains calling convention and expanded function signature so all
-//! arguments have assigned either register type & id or stack address.
+//! Function detail is architecture and OS dependent representation of a function. It contains a materialized
+//! calling convention and expanded function signature so all arguments have assigned either register type/id
+//! or stack address.
class FuncDetail {
public:
+ //! \name Constants
+ //! \{
+
+ enum : uint8_t {
+ //! Doesn't have variable number of arguments (`...`).
+ kNoVarArgs = 0xFFu
+ };
+
+ //! \}
+
+ //! \name Members
+ //! \{
+
//! Calling convention.
CallConv _callConv;
//! Number of function arguments.
uint8_t _argCount;
- //! Number of function return values.
- uint8_t _retCount;
//! Variable arguments index of `kNoVarArgs`.
uint8_t _vaIndex;
//! Reserved for future use.
- uint8_t _reserved;
- //! Registers that contains arguments.
- uint32_t _usedRegs[BaseReg::kGroupVirt];
+ uint16_t _reserved;
+ //! Registers that contain arguments.
+ Support::Array<RegMask, Globals::kNumVirtGroups> _usedRegs;
//! Size of arguments passed by stack.
uint32_t _argStackSize;
- //! Function return values.
- FuncValue _rets[2];
+ //! Function return value(s).
+ FuncValuePack _rets;
//! Function arguments.
- FuncValue _args[kFuncArgCountLoHi];
+ FuncValuePack _args[Globals::kMaxFuncArgs];
- enum : uint8_t {
- //! Doesn't have variable number of arguments (`...`).
- kNoVarArgs = 0xFF
- };
+ //! \}
//! \name Construction & Destruction
//! \{
@@ -378,56 +805,65 @@ public:
inline const CallConv& callConv() const noexcept { return _callConv; }
//! Returns the associated calling convention flags, see `CallConv::Flags`.
- inline uint32_t flags() const noexcept { return _callConv.flags(); }
+ inline CallConvFlags flags() const noexcept { return _callConv.flags(); }
//! Checks whether a CallConv `flag` is set, see `CallConv::Flags`.
- inline bool hasFlag(uint32_t ccFlag) const noexcept { return _callConv.hasFlag(ccFlag); }
+ inline bool hasFlag(CallConvFlags ccFlag) const noexcept { return _callConv.hasFlag(ccFlag); }
- //! Returns count of function return values.
- inline uint32_t retCount() const noexcept { return _retCount; }
+ //! Tests whether the function has a return value.
+ inline bool hasRet() const noexcept { return bool(_rets[0]); }
//! Returns the number of function arguments.
inline uint32_t argCount() const noexcept { return _argCount; }
- //! Tests whether the function has a return value.
- inline bool hasRet() const noexcept { return _retCount != 0; }
- //! Returns function return value associated with the given `index`.
- inline FuncValue& ret(uint32_t index = 0) noexcept {
- ASMJIT_ASSERT(index < ASMJIT_ARRAY_SIZE(_rets));
- return _rets[index];
+ //! Returns function return values.
+ inline FuncValuePack& retPack() noexcept { return _rets; }
+ //! Returns function return values.
+ inline const FuncValuePack& retPack() const noexcept { return _rets; }
+
+ //! Returns a function return value associated with the given `valueIndex`.
+ inline FuncValue& ret(size_t valueIndex = 0) noexcept { return _rets[valueIndex]; }
+ //! Returns a function return value associated with the given `valueIndex` (const).
+ inline const FuncValue& ret(size_t valueIndex = 0) const noexcept { return _rets[valueIndex]; }
+
+ //! Returns function argument packs array.
+ inline FuncValuePack* argPacks() noexcept { return _args; }
+ //! Returns function argument packs array (const).
+ inline const FuncValuePack* argPacks() const noexcept { return _args; }
+
+ //! Returns function argument pack at the given `argIndex`.
+ inline FuncValuePack& argPack(size_t argIndex) noexcept {
+ ASMJIT_ASSERT(argIndex < Globals::kMaxFuncArgs);
+ return _args[argIndex];
}
- //! Returns function return value associated with the given `index` (const).
- inline const FuncValue& ret(uint32_t index = 0) const noexcept {
- ASMJIT_ASSERT(index < ASMJIT_ARRAY_SIZE(_rets));
- return _rets[index];
- }
-
- //! Returns function arguments array.
- inline FuncValue* args() noexcept { return _args; }
- //! Returns function arguments array (const).
- inline const FuncValue* args() const noexcept { return _args; }
- inline bool hasArg(uint32_t index) const noexcept {
- ASMJIT_ASSERT(index < kFuncArgCountLoHi);
- return _args[index].isInitialized();
+ //! Returns function argument pack at the given `argIndex` (const).
+ inline const FuncValuePack& argPack(size_t argIndex) const noexcept {
+ ASMJIT_ASSERT(argIndex < Globals::kMaxFuncArgs);
+ return _args[argIndex];
}
- //! Returns function argument at the given `index`.
- inline FuncValue& arg(uint32_t index) noexcept {
- ASMJIT_ASSERT(index < kFuncArgCountLoHi);
- return _args[index];
+ //! Returns an argument at `valueIndex` from the argument pack at the given `argIndex`.
+ inline FuncValue& arg(size_t argIndex, size_t valueIndex = 0) noexcept {
+ ASMJIT_ASSERT(argIndex < Globals::kMaxFuncArgs);
+ return _args[argIndex][valueIndex];
}
- //! Returnsfunction argument at the given index `index` (const).
- inline const FuncValue& arg(uint32_t index) const noexcept {
- ASMJIT_ASSERT(index < kFuncArgCountLoHi);
- return _args[index];
+ //! Returns an argument at `valueIndex` from the argument pack at the given `argIndex` (const).
+ inline const FuncValue& arg(size_t argIndex, size_t valueIndex = 0) const noexcept {
+ ASMJIT_ASSERT(argIndex < Globals::kMaxFuncArgs);
+ return _args[argIndex][valueIndex];
}
- inline void resetArg(uint32_t index) noexcept {
- ASMJIT_ASSERT(index < kFuncArgCountLoHi);
- _args[index].reset();
+ //! Resets an argument at the given `argIndex`.
+ //!
+ //! If the argument is a parameter pack (has multiple values) all values are reset.
+ inline void resetArg(size_t argIndex) noexcept {
+ ASMJIT_ASSERT(argIndex < Globals::kMaxFuncArgs);
+ _args[argIndex].reset();
}
+ //! Tests whether the function has variable arguments.
inline bool hasVarArgs() const noexcept { return _vaIndex != kNoVarArgs; }
+ //! Returns an index of a first variable argument.
inline uint32_t vaIndex() const noexcept { return _vaIndex; }
//! Tests whether the function passes one or more argument by stack.
@@ -435,43 +871,55 @@ public:
//! Returns stack size needed for function arguments passed on the stack.
inline uint32_t argStackSize() const noexcept { return _argStackSize; }
+ //! Returns red zone size.
inline uint32_t redZoneSize() const noexcept { return _callConv.redZoneSize(); }
+ //! Returns spill zone size.
inline uint32_t spillZoneSize() const noexcept { return _callConv.spillZoneSize(); }
+ //! Returns natural stack alignment.
inline uint32_t naturalStackAlignment() const noexcept { return _callConv.naturalStackAlignment(); }
- inline uint32_t passedRegs(uint32_t group) const noexcept { return _callConv.passedRegs(group); }
- inline uint32_t preservedRegs(uint32_t group) const noexcept { return _callConv.preservedRegs(group); }
+ //! Returns a mask of all passed registers of the given register `group`.
+ inline RegMask passedRegs(RegGroup group) const noexcept { return _callConv.passedRegs(group); }
+ //! Returns a mask of all preserved registers of the given register `group`.
+ inline RegMask preservedRegs(RegGroup group) const noexcept { return _callConv.preservedRegs(group); }
- inline uint32_t usedRegs(uint32_t group) const noexcept {
- ASMJIT_ASSERT(group < BaseReg::kGroupVirt);
- return _usedRegs[group];
+ //! Returns a mask of all used registers of the given register `group`.
+ inline RegMask usedRegs(RegGroup group) const noexcept {
+ ASMJIT_ASSERT(group <= RegGroup::kMaxVirt);
+ return _usedRegs[size_t(group)];
}
- inline void addUsedRegs(uint32_t group, uint32_t regs) noexcept {
- ASMJIT_ASSERT(group < BaseReg::kGroupVirt);
- _usedRegs[group] |= regs;
+ //! Adds `regs` to the mask of used registers of the given register `group`.
+ inline void addUsedRegs(RegGroup group, RegMask regs) noexcept {
+ ASMJIT_ASSERT(group <= RegGroup::kMaxVirt);
+ _usedRegs[size_t(group)] |= regs;
}
//! \}
};
-// ============================================================================
-// [asmjit::FuncFrame]
-// ============================================================================
-
//! Function frame.
//!
-//! Function frame is used directly by prolog and epilog insertion (PEI) utils.
-//! It provides information necessary to insert a proper and ABI comforming
-//! prolog and epilog. Function frame calculation is based on `CallConv` and
+//! Function frame is used directly by prolog and epilog insertion (PEI) utils. It provides information necessary to
+//! insert a proper and ABI comforming prolog and epilog. Function frame calculation is based on `CallConv` and
//! other function attributes.
//!
+//! SSE vs AVX vs AVX-512
+//! ---------------------
+//!
+//! Function frame provides a way to tell prolog/epilog inserter to use AVX instructions instead of SSE. Use
+//! `setAvxEnabled()` and `setAvx512Enabled()` to enable AVX and/or AVX-512, respectively. Enabling AVX-512
+//! is mostly for Compiler as it would use 32 SIMD registers instead of 16 when enabled.
+//!
+//! \note If your code uses AVX instructions and AVX is not enabled there would be a performance hit in case that
+//! some registers had to be saved/restored in function's prolog/epilog, respectively. Thus, it's recommended to
+//! always let the function frame know about the use of AVX.
+//!
//! Function Frame Structure
//! ------------------------
//!
-//! Various properties can contribute to the size and structure of the function
-//! frame. The function frame in most cases won't use all of the properties
-//! illustrated (for example Spill Zone and Red Zone are never used together).
+//! Various properties can contribute to the size and structure of the function frame. The function frame in most
+//! cases won't use all of the properties illustrated (for example Spill Zone and Red Zone are never used together).
//!
//! ```
//! +-----------------------------+
@@ -492,39 +940,24 @@ public:
//! ```
class FuncFrame {
public:
- enum Tag : uint32_t {
+ //! \name Constants
+ //! \{
+
+ enum : uint32_t {
//! Tag used to inform that some offset is invalid.
kTagInvalidOffset = 0xFFFFFFFFu
};
- //! Attributes are designed in a way that all are initially false, and user
- //! or FuncFrame finalizer adds them when necessary.
- enum Attributes : uint32_t {
- //! Function has variable number of arguments.
- kAttrHasVarArgs = 0x00000001u,
- //! Preserve frame pointer (don't omit FP).
- kAttrHasPreservedFP = 0x00000010u,
- //! Function calls other functions (is not leaf).
- kAttrHasFuncCalls = 0x00000020u,
-
- //! Use AVX instead of SSE for all operations (X86).
- kAttrX86AvxEnabled = 0x00010000u,
- //! Emit VZEROUPPER instruction in epilog (X86).
- kAttrX86AvxCleanup = 0x00020000u,
- //! Emit EMMS instruction in epilog (X86).
- kAttrX86MmxCleanup = 0x00040000u,
-
- //! Function has aligned save/restore of vector registers.
- kAttrAlignedVecSR = 0x40000000u,
- //! FuncFrame is finalized and can be used by PEI.
- kAttrIsFinalized = 0x80000000u
- };
+ //! \}
+
+ //! \name Members
+ //! \{
//! Function attributes.
- uint32_t _attributes;
+ FuncAttributes _attributes;
- //! Architecture, see \ref Environment::Arch.
- uint8_t _arch;
+ //! Target architecture.
+ Arch _arch;
//! SP register ID (to access call stack and local stack).
uint8_t _spRegId;
//! SA register ID (to access stack arguments).
@@ -569,18 +1002,24 @@ public:
uint32_t _stackAdjustment;
//! Registers that are dirty.
- uint32_t _dirtyRegs[BaseReg::kGroupVirt];
+ Support::Array<RegMask, Globals::kNumVirtGroups> _dirtyRegs;
//! Registers that must be preserved (copied from CallConv).
- uint32_t _preservedRegs[BaseReg::kGroupVirt];
+ Support::Array<RegMask, Globals::kNumVirtGroups> _preservedRegs;
+ //! Size to save/restore per register group.
+ Support::Array<uint8_t, Globals::kNumVirtGroups> _saveRestoreRegSize;
+ //! Alignment of save/restore area per register group.
+ Support::Array<uint8_t, Globals::kNumVirtGroups> _saveRestoreAlignment;
+
+ //! Stack size required to save registers with push/pop.
+ uint16_t _pushPopSaveSize;
+ //! Stack size required to save extra registers that cannot use push/pop.
+ uint16_t _extraRegSaveSize;
+ //! Offset where registers saved/restored via push/pop are stored
+ uint32_t _pushPopSaveOffset;
+ //! Offset where extra ragisters that cannot use push/pop are stored.
+ uint32_t _extraRegSaveOffset;
- //! Final stack size required to save GP regs.
- uint16_t _gpSaveSize;
- //! Final Stack size required to save other than GP regs.
- uint16_t _nonGpSaveSize;
- //! Final offset where saved GP regs are stored.
- uint32_t _gpSaveOffset;
- //! Final offset where saved other than GP regs are stored.
- uint32_t _nonGpSaveOffset;
+ //! \}
//! \name Construction & Destruction
//! \{
@@ -603,65 +1042,72 @@ public:
//! \{
//! Returns the target architecture of the function frame.
- inline uint32_t arch() const noexcept { return _arch; }
+ inline Arch arch() const noexcept { return _arch; }
//! Returns function frame attributes, see `Attributes`.
- inline uint32_t attributes() const noexcept { return _attributes; }
+ inline FuncAttributes attributes() const noexcept { return _attributes; }
//! Checks whether the FuncFame contains an attribute `attr`.
- inline bool hasAttribute(uint32_t attr) const noexcept { return (_attributes & attr) != 0; }
+ inline bool hasAttribute(FuncAttributes attr) const noexcept { return Support::test(_attributes, attr); }
//! Adds attributes `attrs` to the FuncFrame.
- inline void addAttributes(uint32_t attrs) noexcept { _attributes |= attrs; }
+ inline void addAttributes(FuncAttributes attrs) noexcept { _attributes |= attrs; }
//! Clears attributes `attrs` from the FrameFrame.
- inline void clearAttributes(uint32_t attrs) noexcept { _attributes &= ~attrs; }
+ inline void clearAttributes(FuncAttributes attrs) noexcept { _attributes &= ~attrs; }
//! Tests whether the function has variable number of arguments.
- inline bool hasVarArgs() const noexcept { return hasAttribute(kAttrHasVarArgs); }
+ inline bool hasVarArgs() const noexcept { return hasAttribute(FuncAttributes::kHasVarArgs); }
//! Sets the variable arguments flag.
- inline void setVarArgs() noexcept { addAttributes(kAttrHasVarArgs); }
+ inline void setVarArgs() noexcept { addAttributes(FuncAttributes::kHasVarArgs); }
//! Resets variable arguments flag.
- inline void resetVarArgs() noexcept { clearAttributes(kAttrHasVarArgs); }
+ inline void resetVarArgs() noexcept { clearAttributes(FuncAttributes::kHasVarArgs); }
//! Tests whether the function preserves frame pointer (EBP|ESP on X86).
- inline bool hasPreservedFP() const noexcept { return hasAttribute(kAttrHasPreservedFP); }
+ inline bool hasPreservedFP() const noexcept { return hasAttribute(FuncAttributes::kHasPreservedFP); }
//! Enables preserved frame pointer.
- inline void setPreservedFP() noexcept { addAttributes(kAttrHasPreservedFP); }
+ inline void setPreservedFP() noexcept { addAttributes(FuncAttributes::kHasPreservedFP); }
//! Disables preserved frame pointer.
- inline void resetPreservedFP() noexcept { clearAttributes(kAttrHasPreservedFP); }
+ inline void resetPreservedFP() noexcept { clearAttributes(FuncAttributes::kHasPreservedFP); }
//! Tests whether the function calls other functions.
- inline bool hasFuncCalls() const noexcept { return hasAttribute(kAttrHasFuncCalls); }
+ inline bool hasFuncCalls() const noexcept { return hasAttribute(FuncAttributes::kHasFuncCalls); }
//! Sets `kFlagHasCalls` to true.
- inline void setFuncCalls() noexcept { addAttributes(kAttrHasFuncCalls); }
+ inline void setFuncCalls() noexcept { addAttributes(FuncAttributes::kHasFuncCalls); }
//! Sets `kFlagHasCalls` to false.
- inline void resetFuncCalls() noexcept { clearAttributes(kAttrHasFuncCalls); }
-
- //! Tests whether the function contains AVX cleanup - 'vzeroupper' instruction in epilog.
- inline bool hasAvxCleanup() const noexcept { return hasAttribute(kAttrX86AvxCleanup); }
- //! Enables AVX cleanup.
- inline void setAvxCleanup() noexcept { addAttributes(kAttrX86AvxCleanup); }
- //! Disables AVX cleanup.
- inline void resetAvxCleanup() noexcept { clearAttributes(kAttrX86AvxCleanup); }
+ inline void resetFuncCalls() noexcept { clearAttributes(FuncAttributes::kHasFuncCalls); }
+
+ //! Tests whether the function has AVX enabled.
+ inline bool isAvxEnabled() const noexcept { return hasAttribute(FuncAttributes::kX86_AVXEnabled); }
+ //! Enables AVX use.
+ inline void setAvxEnabled() noexcept { addAttributes(FuncAttributes::kX86_AVXEnabled); }
+ //! Disables AVX use.
+ inline void resetAvxEnabled() noexcept { clearAttributes(FuncAttributes::kX86_AVXEnabled); }
+
+ //! Tests whether the function has AVX-512 enabled.
+ inline bool isAvx512Enabled() const noexcept { return hasAttribute(FuncAttributes::kX86_AVX512Enabled); }
+ //! Enables AVX-512 use.
+ inline void setAvx512Enabled() noexcept { addAttributes(FuncAttributes::kX86_AVX512Enabled); }
+ //! Disables AVX-512 use.
+ inline void resetAvx512Enabled() noexcept { clearAttributes(FuncAttributes::kX86_AVX512Enabled); }
+
+ //! Tests whether the function has MMX cleanup - 'emms' instruction in epilog.
+ inline bool hasMmxCleanup() const noexcept { return hasAttribute(FuncAttributes::kX86_MMXCleanup); }
+ //! Enables MMX cleanup.
+ inline void setMmxCleanup() noexcept { addAttributes(FuncAttributes::kX86_MMXCleanup); }
+ //! Disables MMX cleanup.
+ inline void resetMmxCleanup() noexcept { clearAttributes(FuncAttributes::kX86_MMXCleanup); }
- //! Tests whether the function contains AVX cleanup - 'vzeroupper' instruction in epilog.
- inline bool isAvxEnabled() const noexcept { return hasAttribute(kAttrX86AvxEnabled); }
+ //! Tests whether the function has AVX cleanup - 'vzeroupper' instruction in epilog.
+ inline bool hasAvxCleanup() const noexcept { return hasAttribute(FuncAttributes::kX86_AVXCleanup); }
//! Enables AVX cleanup.
- inline void setAvxEnabled() noexcept { addAttributes(kAttrX86AvxEnabled); }
+ inline void setAvxCleanup() noexcept { addAttributes(FuncAttributes::kX86_AVXCleanup); }
//! Disables AVX cleanup.
- inline void resetAvxEnabled() noexcept { clearAttributes(kAttrX86AvxEnabled); }
-
- //! Tests whether the function contains MMX cleanup - 'emms' instruction in epilog.
- inline bool hasMmxCleanup() const noexcept { return hasAttribute(kAttrX86MmxCleanup); }
- //! Enables MMX cleanup.
- inline void setMmxCleanup() noexcept { addAttributes(kAttrX86MmxCleanup); }
- //! Disables MMX cleanup.
- inline void resetMmxCleanup() noexcept { clearAttributes(kAttrX86MmxCleanup); }
+ inline void resetAvxCleanup() noexcept { clearAttributes(FuncAttributes::kX86_AVXCleanup); }
//! Tests whether the function uses call stack.
inline bool hasCallStack() const noexcept { return _callStackSize != 0; }
//! Tests whether the function uses local stack.
inline bool hasLocalStack() const noexcept { return _localStackSize != 0; }
//! Tests whether vector registers can be saved and restored by using aligned reads and writes.
- inline bool hasAlignedVecSR() const noexcept { return hasAttribute(kAttrAlignedVecSR); }
+ inline bool hasAlignedVecSR() const noexcept { return hasAttribute(FuncAttributes::kAlignedVecSR); }
//! Tests whether the function has to align stack dynamically.
inline bool hasDynamicAlignment() const noexcept { return _finalStackAlignment >= _minDynamicAlignment; }
@@ -757,28 +1203,26 @@ public:
inline uint32_t saOffsetFromSP() const noexcept { return _saOffsetFromSP; }
inline uint32_t saOffsetFromSA() const noexcept { return _saOffsetFromSA; }
- //! Returns mask of registers of the given register `group` that are modified
- //! by the function. The engine would then calculate which registers must be
- //! saved & restored by the function by using the data provided by the calling
- //! convention.
- inline uint32_t dirtyRegs(uint32_t group) const noexcept {
- ASMJIT_ASSERT(group < BaseReg::kGroupVirt);
+ //! Returns mask of registers of the given register `group` that are modified by the function. The engine would
+ //! then calculate which registers must be saved & restored by the function by using the data provided by the
+ //! calling convention.
+ inline RegMask dirtyRegs(RegGroup group) const noexcept {
+ ASMJIT_ASSERT(group <= RegGroup::kMaxVirt);
return _dirtyRegs[group];
}
//! Sets which registers (as a mask) are modified by the function.
//!
- //! \remarks Please note that this will completely overwrite the existing
- //! register mask, use `addDirtyRegs()` to modify the existing register
- //! mask.
- inline void setDirtyRegs(uint32_t group, uint32_t regs) noexcept {
- ASMJIT_ASSERT(group < BaseReg::kGroupVirt);
+ //! \remarks Please note that this will completely overwrite the existing register mask, use `addDirtyRegs()`
+ //! to modify the existing register mask.
+ inline void setDirtyRegs(RegGroup group, RegMask regs) noexcept {
+ ASMJIT_ASSERT(group <= RegGroup::kMaxVirt);
_dirtyRegs[group] = regs;
}
//! Adds which registers (as a mask) are modified by the function.
- inline void addDirtyRegs(uint32_t group, uint32_t regs) noexcept {
- ASMJIT_ASSERT(group < BaseReg::kGroupVirt);
+ inline void addDirtyRegs(RegGroup group, RegMask regs) noexcept {
+ ASMJIT_ASSERT(group <= RegGroup::kMaxVirt);
_dirtyRegs[group] |= regs;
}
@@ -790,7 +1234,7 @@ public:
//! \overload
template<typename... Args>
- ASMJIT_INLINE void addDirtyRegs(const BaseReg& reg, Args&&... args) noexcept {
+ inline void addDirtyRegs(const BaseReg& reg, Args&&... args) noexcept {
addDirtyRegs(reg);
addDirtyRegs(std::forward<Args>(args)...);
}
@@ -800,52 +1244,62 @@ public:
_dirtyRegs[i] = 0xFFFFFFFFu;
}
- inline void setAllDirty(uint32_t group) noexcept {
- ASMJIT_ASSERT(group < BaseReg::kGroupVirt);
+ inline void setAllDirty(RegGroup group) noexcept {
+ ASMJIT_ASSERT(group <= RegGroup::kMaxVirt);
_dirtyRegs[group] = 0xFFFFFFFFu;
}
- //! Returns a calculated mask of registers of the given `group` that will be
- //! saved and restored in the function's prolog and epilog, respectively. The
- //! register mask is calculated from both `dirtyRegs` (provided by user) and
+ //! Returns a calculated mask of registers of the given `group` that will be saved and restored in the function's
+ //! prolog and epilog, respectively. The register mask is calculated from both `dirtyRegs` (provided by user) and
//! `preservedMask` (provided by the calling convention).
- inline uint32_t savedRegs(uint32_t group) const noexcept {
- ASMJIT_ASSERT(group < BaseReg::kGroupVirt);
+ inline RegMask savedRegs(RegGroup group) const noexcept {
+ ASMJIT_ASSERT(group <= RegGroup::kMaxVirt);
return _dirtyRegs[group] & _preservedRegs[group];
}
//! Returns the mask of preserved registers of the given register `group`.
//!
- //! Preserved registers are those that must survive the function call
- //! unmodified. The function can only modify preserved registers it they
- //! are saved and restored in funciton's prolog and epilog, respectively.
- inline uint32_t preservedRegs(uint32_t group) const noexcept {
- ASMJIT_ASSERT(group < BaseReg::kGroupVirt);
+ //! Preserved registers are those that must survive the function call unmodified. The function can only modify
+ //! preserved registers it they are saved and restored in funciton's prolog and epilog, respectively.
+ inline RegMask preservedRegs(RegGroup group) const noexcept {
+ ASMJIT_ASSERT(group <= RegGroup::kMaxVirt);
return _preservedRegs[group];
}
+ inline uint32_t saveRestoreRegSize(RegGroup group) const noexcept {
+ ASMJIT_ASSERT(group <= RegGroup::kMaxVirt);
+ return _saveRestoreRegSize[group];
+ }
+
+ inline uint32_t saveRestoreAlignment(RegGroup group) const noexcept {
+ ASMJIT_ASSERT(group <= RegGroup::kMaxVirt);
+ return _saveRestoreAlignment[group];
+ }
+
inline bool hasSARegId() const noexcept { return _saRegId != BaseReg::kIdBad; }
inline uint32_t saRegId() const noexcept { return _saRegId; }
inline void setSARegId(uint32_t regId) { _saRegId = uint8_t(regId); }
inline void resetSARegId() { setSARegId(BaseReg::kIdBad); }
- //! Returns stack size required to save GP registers.
- inline uint32_t gpSaveSize() const noexcept { return _gpSaveSize; }
- //! Returns stack size required to save other than GP registers (MM, XMM|YMM|ZMM, K, VFP, etc...).
- inline uint32_t nonGpSaveSize() const noexcept { return _nonGpSaveSize; }
+ //! Returns stack size required to save/restore registers via push/pop.
+ inline uint32_t pushPopSaveSize() const noexcept { return _pushPopSaveSize; }
+ //! Returns an offset to the stack where registers are saved via push/pop.
+ inline uint32_t pushPopSaveOffset() const noexcept { return _pushPopSaveOffset; }
- //! Returns an offset to the stack where general purpose registers are saved.
- inline uint32_t gpSaveOffset() const noexcept { return _gpSaveOffset; }
- //! Returns an offset to the stack where other than GP registers are saved.
- inline uint32_t nonGpSaveOffset() const noexcept { return _nonGpSaveOffset; }
+ //! Returns stack size required to save/restore extra registers that don't use push/pop/
+ //!
+ //! \note On X86 this covers all registers except GP registers, on other architectures it can be always
+ //! zero (for example AArch64 saves all registers via push/pop like instructions, so this would be zero).
+ inline uint32_t extraRegSaveSize() const noexcept { return _extraRegSaveSize; }
+ //! Returns an offset to the stack where extra registers are saved.
+ inline uint32_t extraRegSaveOffset() const noexcept { return _extraRegSaveOffset; }
//! Tests whether the functions contains stack adjustment.
inline bool hasStackAdjustment() const noexcept { return _stackAdjustment != 0; }
//! Returns function's stack adjustment used in function's prolog and epilog.
//!
- //! If the returned value is zero it means that the stack is not adjusted.
- //! This can mean both that the stack is not used and/or the stack is only
- //! adjusted by instructions that pust/pop registers into/from stack.
+ //! If the returned value is zero it means that the stack is not adjusted. This can mean both that the stack
+ //! is not used and/or the stack is only adjusted by instructions that pust/pop registers into/from stack.
inline uint32_t stackAdjustment() const noexcept { return _stackAdjustment; }
//! \}
@@ -858,14 +1312,13 @@ public:
//! \}
};
-// ============================================================================
-// [asmjit::FuncArgsAssignment]
-// ============================================================================
-
-//! A helper class that can be used to assign a physical register for each
-//! function argument. Use with `BaseEmitter::emitArgsAssignment()`.
+//! A helper class that can be used to assign a physical register for each function argument. Use with
+//! `BaseEmitter::emitArgsAssignment()`.
class FuncArgsAssignment {
public:
+ //! \name Members
+ //! \{
+
//! Function detail.
const FuncDetail* _funcDetail;
//! Register that can be used to access arguments passed by stack.
@@ -873,7 +1326,9 @@ public:
//! Reserved for future use.
uint8_t _reserved[3];
//! Mapping of each function argument.
- FuncValue _args[kFuncArgCountLoHi];
+ FuncValuePack _argPacks[Globals::kMaxFuncArgs];
+
+ //! \}
//! \name Construction & Destruction
//! \{
@@ -888,7 +1343,7 @@ public:
_funcDetail = fd;
_saRegId = uint8_t(BaseReg::kIdBad);
memset(_reserved, 0, sizeof(_reserved));
- memset(_args, 0, sizeof(_args));
+ memset(_argPacks, 0, sizeof(_argPacks));
}
//! \}
@@ -904,46 +1359,61 @@ public:
inline void setSARegId(uint32_t regId) { _saRegId = uint8_t(regId); }
inline void resetSARegId() { _saRegId = uint8_t(BaseReg::kIdBad); }
- inline FuncValue& arg(uint32_t index) noexcept {
- ASMJIT_ASSERT(index < ASMJIT_ARRAY_SIZE(_args));
- return _args[index];
+ inline FuncValue& arg(size_t argIndex, size_t valueIndex) noexcept {
+ ASMJIT_ASSERT(argIndex < ASMJIT_ARRAY_SIZE(_argPacks));
+ return _argPacks[argIndex][valueIndex];
+ }
+ inline const FuncValue& arg(size_t argIndex, size_t valueIndex) const noexcept {
+ ASMJIT_ASSERT(argIndex < ASMJIT_ARRAY_SIZE(_argPacks));
+ return _argPacks[argIndex][valueIndex];
}
- inline const FuncValue& arg(uint32_t index) const noexcept {
- ASMJIT_ASSERT(index < ASMJIT_ARRAY_SIZE(_args));
- return _args[index];
+
+ inline bool isAssigned(size_t argIndex, size_t valueIndex) const noexcept {
+ ASMJIT_ASSERT(argIndex < ASMJIT_ARRAY_SIZE(_argPacks));
+ return _argPacks[argIndex][valueIndex].isAssigned();
+ }
+
+ inline void assignReg(size_t argIndex, const BaseReg& reg, TypeId typeId = TypeId::kVoid) noexcept {
+ ASMJIT_ASSERT(argIndex < ASMJIT_ARRAY_SIZE(_argPacks));
+ ASMJIT_ASSERT(reg.isPhysReg());
+ _argPacks[argIndex][0].initReg(reg.type(), reg.id(), typeId);
+ }
+
+ inline void assignReg(size_t argIndex, RegType regType, uint32_t regId, TypeId typeId = TypeId::kVoid) noexcept {
+ ASMJIT_ASSERT(argIndex < ASMJIT_ARRAY_SIZE(_argPacks));
+ _argPacks[argIndex][0].initReg(regType, regId, typeId);
}
- inline bool isAssigned(uint32_t argIndex) const noexcept {
- ASMJIT_ASSERT(argIndex < ASMJIT_ARRAY_SIZE(_args));
- return _args[argIndex].isAssigned();
+ inline void assignStack(size_t argIndex, int32_t offset, TypeId typeId = TypeId::kVoid) noexcept {
+ ASMJIT_ASSERT(argIndex < ASMJIT_ARRAY_SIZE(_argPacks));
+ _argPacks[argIndex][0].initStack(offset, typeId);
}
- inline void assignReg(uint32_t argIndex, const BaseReg& reg, uint32_t typeId = Type::kIdVoid) noexcept {
- ASMJIT_ASSERT(argIndex < ASMJIT_ARRAY_SIZE(_args));
+ inline void assignRegInPack(size_t argIndex, size_t valueIndex, const BaseReg& reg, TypeId typeId = TypeId::kVoid) noexcept {
+ ASMJIT_ASSERT(argIndex < ASMJIT_ARRAY_SIZE(_argPacks));
ASMJIT_ASSERT(reg.isPhysReg());
- _args[argIndex].initReg(reg.type(), reg.id(), typeId);
+ _argPacks[argIndex][valueIndex].initReg(reg.type(), reg.id(), typeId);
}
- inline void assignReg(uint32_t argIndex, uint32_t regType, uint32_t regId, uint32_t typeId = Type::kIdVoid) noexcept {
- ASMJIT_ASSERT(argIndex < ASMJIT_ARRAY_SIZE(_args));
- _args[argIndex].initReg(regType, regId, typeId);
+ inline void assignRegInPack(size_t argIndex, size_t valueIndex, RegType regType, uint32_t regId, TypeId typeId = TypeId::kVoid) noexcept {
+ ASMJIT_ASSERT(argIndex < ASMJIT_ARRAY_SIZE(_argPacks));
+ _argPacks[argIndex][valueIndex].initReg(regType, regId, typeId);
}
- inline void assignStack(uint32_t argIndex, int32_t offset, uint32_t typeId = Type::kIdVoid) {
- ASMJIT_ASSERT(argIndex < ASMJIT_ARRAY_SIZE(_args));
- _args[argIndex].initStack(offset, typeId);
+ inline void assignStackInPack(size_t argIndex, size_t valueIndex, int32_t offset, TypeId typeId = TypeId::kVoid) noexcept {
+ ASMJIT_ASSERT(argIndex < ASMJIT_ARRAY_SIZE(_argPacks));
+ _argPacks[argIndex][valueIndex].initStack(offset, typeId);
}
- // NOTE: All `assignAll()` methods are shortcuts to assign all arguments at
- // once, however, since registers are passed all at once these initializers
- // don't provide any way to pass TypeId and/or to keep any argument between
+ // NOTE: All `assignAll()` methods are shortcuts to assign all arguments at once, however, since registers are
+ // passed all at once these initializers don't provide any way to pass TypeId and/or to keep any argument between
// the arguments passed unassigned.
- inline void _assignAllInternal(uint32_t argIndex, const BaseReg& reg) noexcept {
+ inline void _assignAllInternal(size_t argIndex, const BaseReg& reg) noexcept {
assignReg(argIndex, reg);
}
template<typename... Args>
- inline void _assignAllInternal(uint32_t argIndex, const BaseReg& reg, Args&&... args) noexcept {
+ inline void _assignAllInternal(size_t argIndex, const BaseReg& reg, Args&&... args) noexcept {
assignReg(argIndex, reg);
_assignAllInternal(argIndex + 1, std::forward<Args>(args)...);
}
@@ -960,9 +1430,8 @@ public:
//! Update `FuncFrame` based on function's arguments assignment.
//!
- //! \note You MUST call this in orher to use `BaseEmitter::emitArgsAssignment()`,
- //! otherwise the FuncFrame would not contain the information necessary to
- //! assign all arguments into the registers and/or stack specified.
+ //! \note You MUST call this in orher to use `BaseEmitter::emitArgsAssignment()`, otherwise the FuncFrame would
+ //! not contain the information necessary to assign all arguments into the registers and/or stack specified.
ASMJIT_API Error updateFuncFrame(FuncFrame& frame) const noexcept;
//! \}
diff --git a/3rdparty/asmjit/src/asmjit/core/funcargscontext.cpp b/3rdparty/asmjit/src/asmjit/core/funcargscontext.cpp
new file mode 100644
index 00000000000..1db50a7082a
--- /dev/null
+++ b/3rdparty/asmjit/src/asmjit/core/funcargscontext.cpp
@@ -0,0 +1,293 @@
+// This file is part of AsmJit project <https://asmjit.com>
+//
+// See asmjit.h or LICENSE.md for license and copyright information
+// SPDX-License-Identifier: Zlib
+
+#include "../core/api-build_p.h"
+#include "../core/funcargscontext_p.h"
+
+ASMJIT_BEGIN_NAMESPACE
+
+//! \cond INTERNAL
+//! \addtogroup asmjit_core
+//! \{
+
+FuncArgsContext::FuncArgsContext() noexcept {
+ for (RegGroup group : RegGroupVirtValues{})
+ _workData[size_t(group)].reset();
+}
+
+ASMJIT_FAVOR_SIZE Error FuncArgsContext::initWorkData(const FuncFrame& frame, const FuncArgsAssignment& args, const RAConstraints* constraints) noexcept {
+ Arch arch = frame.arch();
+ const FuncDetail& func = *args.funcDetail();
+
+ _archTraits = &ArchTraits::byArch(arch);
+ _constraints = constraints;
+ _arch = arch;
+
+ // Initialize `_archRegs`.
+ for (RegGroup group : RegGroupVirtValues{})
+ _workData[group]._archRegs = _constraints->availableRegs(group);
+
+ if (frame.hasPreservedFP())
+ _workData[size_t(RegGroup::kGp)]._archRegs &= ~Support::bitMask(archTraits().fpRegId());
+
+ // Extract information from all function arguments/assignments and build Var[] array.
+ uint32_t varId = 0;
+ for (uint32_t argIndex = 0; argIndex < Globals::kMaxFuncArgs; argIndex++) {
+ for (uint32_t valueIndex = 0; valueIndex < Globals::kMaxValuePack; valueIndex++) {
+ const FuncValue& dst_ = args.arg(argIndex, valueIndex);
+ if (!dst_.isAssigned())
+ continue;
+
+ const FuncValue& src_ = func.arg(argIndex, valueIndex);
+ if (ASMJIT_UNLIKELY(!src_.isAssigned()))
+ return DebugUtils::errored(kErrorInvalidState);
+
+ Var& var = _vars[varId];
+ var.init(src_, dst_);
+
+ FuncValue& src = var.cur;
+ FuncValue& dst = var.out;
+
+ RegGroup dstGroup = RegGroup::kMaxValue;
+ uint32_t dstId = BaseReg::kIdBad;
+ WorkData* dstWd = nullptr;
+
+ // Not supported.
+ if (src.isIndirect())
+ return DebugUtils::errored(kErrorInvalidAssignment);
+
+ if (dst.isReg()) {
+ RegType dstType = dst.regType();
+ if (ASMJIT_UNLIKELY(!archTraits().hasRegType(dstType)))
+ return DebugUtils::errored(kErrorInvalidRegType);
+
+ // Copy TypeId from source if the destination doesn't have it. The RA used by BaseCompiler would never
+ // leave TypeId undefined, but users of FuncAPI can just assign phys regs without specifying the type.
+ if (!dst.hasTypeId())
+ dst.setTypeId(archTraits().regTypeToTypeId(dst.regType()));
+
+ dstGroup = archTraits().regTypeToGroup(dstType);
+ if (ASMJIT_UNLIKELY(dstGroup > RegGroup::kMaxVirt))
+ return DebugUtils::errored(kErrorInvalidRegGroup);
+
+ dstWd = &_workData[dstGroup];
+ dstId = dst.regId();
+ if (ASMJIT_UNLIKELY(dstId >= 32 || !Support::bitTest(dstWd->archRegs(), dstId)))
+ return DebugUtils::errored(kErrorInvalidPhysId);
+
+ if (ASMJIT_UNLIKELY(Support::bitTest(dstWd->dstRegs(), dstId)))
+ return DebugUtils::errored(kErrorOverlappedRegs);
+
+ dstWd->_dstRegs |= Support::bitMask(dstId);
+ dstWd->_dstShuf |= Support::bitMask(dstId);
+ dstWd->_usedRegs |= Support::bitMask(dstId);
+ }
+ else {
+ if (!dst.hasTypeId())
+ dst.setTypeId(src.typeId());
+
+ OperandSignature signature = getSuitableRegForMemToMemMove(arch, dst.typeId(), src.typeId());
+ if (ASMJIT_UNLIKELY(!signature.isValid()))
+ return DebugUtils::errored(kErrorInvalidState);
+ _stackDstMask = uint8_t(_stackDstMask | Support::bitMask(signature.regGroup()));
+ }
+
+ if (src.isReg()) {
+ uint32_t srcId = src.regId();
+ RegGroup srcGroup = archTraits().regTypeToGroup(src.regType());
+
+ if (dstGroup == srcGroup) {
+ ASMJIT_ASSERT(dstWd != nullptr);
+ dstWd->assign(varId, srcId);
+
+ // The best case, register is allocated where it is expected to be.
+ if (dstId == srcId)
+ var.markDone();
+ }
+ else {
+ if (ASMJIT_UNLIKELY(srcGroup > RegGroup::kMaxVirt))
+ return DebugUtils::errored(kErrorInvalidState);
+
+ WorkData& srcData = _workData[size_t(srcGroup)];
+ srcData.assign(varId, srcId);
+ }
+ }
+ else {
+ if (dstWd)
+ dstWd->_numStackArgs++;
+ _hasStackSrc = true;
+ }
+
+ varId++;
+ }
+ }
+
+ // Initialize WorkData::workRegs.
+ for (RegGroup group : RegGroupVirtValues{}) {
+ _workData[group]._workRegs =
+ (_workData[group].archRegs() & (frame.dirtyRegs(group) | ~frame.preservedRegs(group))) | _workData[group].dstRegs() | _workData[group].assignedRegs();
+ }
+
+ // Create a variable that represents `SARegId` if necessary.
+ bool saRegRequired = _hasStackSrc && frame.hasDynamicAlignment() && !frame.hasPreservedFP();
+
+ WorkData& gpRegs = _workData[RegGroup::kGp];
+ uint32_t saCurRegId = frame.saRegId();
+ uint32_t saOutRegId = args.saRegId();
+
+ if (saCurRegId != BaseReg::kIdBad) {
+ // Check if the provided `SARegId` doesn't collide with input registers.
+ if (ASMJIT_UNLIKELY(gpRegs.isAssigned(saCurRegId)))
+ return DebugUtils::errored(kErrorOverlappedRegs);
+ }
+
+ if (saOutRegId != BaseReg::kIdBad) {
+ // Check if the provided `SARegId` doesn't collide with argument assignments.
+ if (ASMJIT_UNLIKELY(Support::bitTest(gpRegs.dstRegs(), saOutRegId)))
+ return DebugUtils::errored(kErrorOverlappedRegs);
+ saRegRequired = true;
+ }
+
+ if (saRegRequired) {
+ TypeId ptrTypeId = Environment::is32Bit(arch) ? TypeId::kUInt32 : TypeId::kUInt64;
+ RegType ptrRegType = Environment::is32Bit(arch) ? RegType::kGp32 : RegType::kGp64;
+
+ _saVarId = uint8_t(varId);
+ _hasPreservedFP = frame.hasPreservedFP();
+
+ Var& var = _vars[varId];
+ var.reset();
+
+ if (saCurRegId == BaseReg::kIdBad) {
+ if (saOutRegId != BaseReg::kIdBad && !gpRegs.isAssigned(saOutRegId)) {
+ saCurRegId = saOutRegId;
+ }
+ else {
+ RegMask availableRegs = gpRegs.availableRegs();
+ if (!availableRegs)
+ availableRegs = gpRegs.archRegs() & ~gpRegs.workRegs();
+
+ if (ASMJIT_UNLIKELY(!availableRegs))
+ return DebugUtils::errored(kErrorNoMorePhysRegs);
+
+ saCurRegId = Support::ctz(availableRegs);
+ }
+ }
+
+ var.cur.initReg(ptrRegType, saCurRegId, ptrTypeId);
+ gpRegs.assign(varId, saCurRegId);
+ gpRegs._workRegs |= Support::bitMask(saCurRegId);
+
+ if (saOutRegId != BaseReg::kIdBad) {
+ var.out.initReg(ptrRegType, saOutRegId, ptrTypeId);
+ gpRegs._dstRegs |= Support::bitMask(saOutRegId);
+ gpRegs._workRegs |= Support::bitMask(saOutRegId);
+ }
+ else {
+ var.markDone();
+ }
+
+ varId++;
+ }
+
+ _varCount = varId;
+
+ // Detect register swaps.
+ for (varId = 0; varId < _varCount; varId++) {
+ Var& var = _vars[varId];
+ if (var.cur.isReg() && var.out.isReg()) {
+ uint32_t srcId = var.cur.regId();
+ uint32_t dstId = var.out.regId();
+
+ RegGroup group = archTraits().regTypeToGroup(var.cur.regType());
+ if (group != archTraits().regTypeToGroup(var.out.regType()))
+ continue;
+
+ WorkData& wd = _workData[group];
+ if (wd.isAssigned(dstId)) {
+ Var& other = _vars[wd._physToVarId[dstId]];
+ if (archTraits().regTypeToGroup(other.out.regType()) == group && other.out.regId() == srcId) {
+ wd._numSwaps++;
+ _regSwapsMask = uint8_t(_regSwapsMask | Support::bitMask(group));
+ }
+ }
+ }
+ }
+
+ return kErrorOk;
+}
+
+ASMJIT_FAVOR_SIZE Error FuncArgsContext::markDstRegsDirty(FuncFrame& frame) noexcept {
+ for (RegGroup group : RegGroupVirtValues{}) {
+ WorkData& wd = _workData[group];
+ uint32_t regs = wd.usedRegs() | wd._dstShuf;
+
+ wd._workRegs |= regs;
+ frame.addDirtyRegs(group, regs);
+ }
+
+ return kErrorOk;
+}
+
+ASMJIT_FAVOR_SIZE Error FuncArgsContext::markScratchRegs(FuncFrame& frame) noexcept {
+ uint32_t groupMask = 0;
+
+ // Handle stack to stack moves.
+ groupMask |= _stackDstMask;
+
+ // Handle register swaps.
+ groupMask |= _regSwapsMask & ~Support::bitMask(RegGroup::kGp);
+
+ if (!groupMask)
+ return kErrorOk;
+
+ // Selects one dirty register per affected group that can be used as a scratch register.
+ for (RegGroup group : RegGroupVirtValues{}) {
+ if (Support::bitTest(groupMask, group)) {
+ WorkData& wd = _workData[group];
+
+ // Initially, pick some clobbered or dirty register.
+ RegMask workRegs = wd.workRegs();
+ RegMask regs = workRegs & ~(wd.usedRegs() | wd._dstShuf);
+
+ // If that didn't work out pick some register which is not in 'used'.
+ if (!regs)
+ regs = workRegs & ~wd.usedRegs();
+
+ // If that didn't work out pick any other register that is allocable.
+ // This last resort case will, however, result in marking one more
+ // register dirty.
+ if (!regs)
+ regs = wd.archRegs() & ~workRegs;
+
+ // If that didn't work out we will have to use XORs instead of MOVs.
+ if (!regs)
+ continue;
+
+ RegMask regMask = Support::blsi(regs);
+ wd._workRegs |= regMask;
+ frame.addDirtyRegs(group, regMask);
+ }
+ }
+
+ return kErrorOk;
+}
+
+ASMJIT_FAVOR_SIZE Error FuncArgsContext::markStackArgsReg(FuncFrame& frame) noexcept {
+ if (_saVarId != kVarIdNone) {
+ const Var& var = _vars[_saVarId];
+ frame.setSARegId(var.cur.regId());
+ }
+ else if (frame.hasPreservedFP()) {
+ frame.setSARegId(archTraits().fpRegId());
+ }
+
+ return kErrorOk;
+}
+
+//! \}
+//! \endcond
+
+ASMJIT_END_NAMESPACE
diff --git a/3rdparty/asmjit/src/asmjit/core/funcargscontext_p.h b/3rdparty/asmjit/src/asmjit/core/funcargscontext_p.h
new file mode 100644
index 00000000000..72ee10585a4
--- /dev/null
+++ b/3rdparty/asmjit/src/asmjit/core/funcargscontext_p.h
@@ -0,0 +1,199 @@
+// This file is part of AsmJit project <https://asmjit.com>
+//
+// See asmjit.h or LICENSE.md for license and copyright information
+// SPDX-License-Identifier: Zlib
+
+#ifndef ASMJIT_CORE_FUNCARGSCONTEXT_P_H_INCLUDED
+#define ASMJIT_CORE_FUNCARGSCONTEXT_P_H_INCLUDED
+
+#include "../core/archtraits.h"
+#include "../core/environment.h"
+#include "../core/func.h"
+#include "../core/operand.h"
+#include "../core/radefs_p.h"
+#include "../core/support.h"
+
+ASMJIT_BEGIN_NAMESPACE
+
+//! \cond INTERNAL
+//! \addtogroup asmjit_core
+//! \{
+
+static inline OperandSignature getSuitableRegForMemToMemMove(Arch arch, TypeId dstTypeId, TypeId srcTypeId) noexcept {
+ const ArchTraits& archTraits = ArchTraits::byArch(arch);
+
+ uint32_t dstSize = TypeUtils::sizeOf(dstTypeId);
+ uint32_t srcSize = TypeUtils::sizeOf(srcTypeId);
+ uint32_t maxSize = Support::max<uint32_t>(dstSize, srcSize);
+ uint32_t regSize = Environment::registerSizeFromArch(arch);
+
+ OperandSignature signature{0};
+ if (maxSize <= regSize || (TypeUtils::isInt(dstTypeId) && TypeUtils::isInt(srcTypeId)))
+ signature = maxSize <= 4 ? archTraits.regTypeToSignature(RegType::kGp32)
+ : archTraits.regTypeToSignature(RegType::kGp64);
+ else if (maxSize <= 8 && archTraits.hasRegType(RegType::kVec64))
+ signature = archTraits.regTypeToSignature(RegType::kVec64);
+ else if (maxSize <= 16 && archTraits.hasRegType(RegType::kVec128))
+ signature = archTraits.regTypeToSignature(RegType::kVec128);
+ else if (maxSize <= 32 && archTraits.hasRegType(RegType::kVec256))
+ signature = archTraits.regTypeToSignature(RegType::kVec256);
+ else if (maxSize <= 64 && archTraits.hasRegType(RegType::kVec512))
+ signature = archTraits.regTypeToSignature(RegType::kVec512);
+
+ return signature;
+}
+
+class FuncArgsContext {
+public:
+ enum VarId : uint32_t {
+ kVarIdNone = 0xFF
+ };
+
+ //! Contains information about a single argument or SA register that may need shuffling.
+ struct Var {
+ FuncValue cur;
+ FuncValue out;
+
+ inline void init(const FuncValue& cur_, const FuncValue& out_) noexcept {
+ cur = cur_;
+ out = out_;
+ }
+
+ //! Reset the value to its unassigned state.
+ inline void reset() noexcept {
+ cur.reset();
+ out.reset();
+ }
+
+ inline bool isDone() const noexcept { return cur.isDone(); }
+ inline void markDone() noexcept { cur.addFlags(FuncValue::kFlagIsDone); }
+ };
+
+ struct WorkData {
+ //! All allocable registers provided by the architecture.
+ RegMask _archRegs;
+ //! All registers that can be used by the shuffler.
+ RegMask _workRegs;
+ //! Registers used by the shuffler (all).
+ RegMask _usedRegs;
+ //! Assigned registers.
+ RegMask _assignedRegs;
+ //! Destination registers assigned to arguments or SA.
+ RegMask _dstRegs;
+ //! Destination registers that require shuffling.
+ RegMask _dstShuf;
+ //! Number of register swaps.
+ uint8_t _numSwaps;
+ //! Number of stack loads.
+ uint8_t _numStackArgs;
+ //! Reserved (only used as padding).
+ uint8_t _reserved[6];
+ //! Physical ID to variable ID mapping.
+ uint8_t _physToVarId[32];
+
+ inline void reset() noexcept {
+ _archRegs = 0;
+ _workRegs = 0;
+ _usedRegs = 0;
+ _assignedRegs = 0;
+ _dstRegs = 0;
+ _dstShuf = 0;
+ _numSwaps = 0;
+ _numStackArgs = 0;
+ memset(_reserved, 0, sizeof(_reserved));
+ memset(_physToVarId, kVarIdNone, 32);
+ }
+
+ inline bool isAssigned(uint32_t regId) const noexcept {
+ ASMJIT_ASSERT(regId < 32);
+ return Support::bitTest(_assignedRegs, regId);
+ }
+
+ inline void assign(uint32_t varId, uint32_t regId) noexcept {
+ ASMJIT_ASSERT(!isAssigned(regId));
+ ASMJIT_ASSERT(_physToVarId[regId] == kVarIdNone);
+
+ _physToVarId[regId] = uint8_t(varId);
+ _assignedRegs ^= Support::bitMask(regId);
+ }
+
+ inline void reassign(uint32_t varId, uint32_t newId, uint32_t oldId) noexcept {
+ ASMJIT_ASSERT( isAssigned(oldId));
+ ASMJIT_ASSERT(!isAssigned(newId));
+ ASMJIT_ASSERT(_physToVarId[oldId] == varId);
+ ASMJIT_ASSERT(_physToVarId[newId] == kVarIdNone);
+
+ _physToVarId[oldId] = uint8_t(kVarIdNone);
+ _physToVarId[newId] = uint8_t(varId);
+ _assignedRegs ^= Support::bitMask(newId) ^ Support::bitMask(oldId);
+ }
+
+ inline void swap(uint32_t aVarId, uint32_t aRegId, uint32_t bVarId, uint32_t bRegId) noexcept {
+ ASMJIT_ASSERT(isAssigned(aRegId));
+ ASMJIT_ASSERT(isAssigned(bRegId));
+ ASMJIT_ASSERT(_physToVarId[aRegId] == aVarId);
+ ASMJIT_ASSERT(_physToVarId[bRegId] == bVarId);
+
+ _physToVarId[aRegId] = uint8_t(bVarId);
+ _physToVarId[bRegId] = uint8_t(aVarId);
+ }
+
+ inline void unassign(uint32_t varId, uint32_t regId) noexcept {
+ ASMJIT_ASSERT(isAssigned(regId));
+ ASMJIT_ASSERT(_physToVarId[regId] == varId);
+
+ DebugUtils::unused(varId);
+ _physToVarId[regId] = uint8_t(kVarIdNone);
+ _assignedRegs ^= Support::bitMask(regId);
+ }
+
+ inline RegMask archRegs() const noexcept { return _archRegs; }
+ inline RegMask workRegs() const noexcept { return _workRegs; }
+ inline RegMask usedRegs() const noexcept { return _usedRegs; }
+ inline RegMask assignedRegs() const noexcept { return _assignedRegs; }
+ inline RegMask dstRegs() const noexcept { return _dstRegs; }
+ inline RegMask availableRegs() const noexcept { return _workRegs & ~_assignedRegs; }
+ };
+
+ //! Architecture traits.
+ const ArchTraits* _archTraits = nullptr;
+ //! Architecture constraints.
+ const RAConstraints* _constraints = nullptr;
+ //! Target architecture.
+ Arch _arch = Arch::kUnknown;
+ //! Has arguments passed via stack (SRC).
+ bool _hasStackSrc = false;
+ //! Has preserved frame-pointer (FP).
+ bool _hasPreservedFP = false;
+ //! Has arguments assigned to stack (DST).
+ uint8_t _stackDstMask = 0;
+ //! Register swap groups (bit-mask).
+ uint8_t _regSwapsMask = 0;
+ uint8_t _saVarId = kVarIdNone;
+ uint32_t _varCount = 0;
+ Support::Array<WorkData, Globals::kNumVirtGroups> _workData;
+ Var _vars[Globals::kMaxFuncArgs * Globals::kMaxValuePack + 1];
+
+ FuncArgsContext() noexcept;
+
+ inline const ArchTraits& archTraits() const noexcept { return *_archTraits; }
+ inline Arch arch() const noexcept { return _arch; }
+
+ inline uint32_t varCount() const noexcept { return _varCount; }
+ inline size_t indexOf(const Var* var) const noexcept { return (size_t)(var - _vars); }
+
+ inline Var& var(size_t varId) noexcept { return _vars[varId]; }
+ inline const Var& var(size_t varId) const noexcept { return _vars[varId]; }
+
+ Error initWorkData(const FuncFrame& frame, const FuncArgsAssignment& args, const RAConstraints* constraints) noexcept;
+ Error markScratchRegs(FuncFrame& frame) noexcept;
+ Error markDstRegsDirty(FuncFrame& frame) noexcept;
+ Error markStackArgsReg(FuncFrame& frame) noexcept;
+};
+
+//! \}
+//! \endcond
+
+ASMJIT_END_NAMESPACE
+
+#endif // ASMJIT_CORE_FUNCARGSCONTEXT_P_H_INCLUDED
diff --git a/3rdparty/asmjit/src/asmjit/core/globals.cpp b/3rdparty/asmjit/src/asmjit/core/globals.cpp
index 7ec66283e80..2bbd0c0577d 100644
--- a/3rdparty/asmjit/src/asmjit/core/globals.cpp
+++ b/3rdparty/asmjit/src/asmjit/core/globals.cpp
@@ -1,25 +1,7 @@
-// AsmJit - Machine code generation for C++
+// This file is part of AsmJit project <https://asmjit.com>
//
-// * Official AsmJit Home Page: https://asmjit.com
-// * Official Github Repository: https://github.com/asmjit/asmjit
-//
-// Copyright (c) 2008-2020 The AsmJit Authors
-//
-// This software is provided 'as-is', without any express or implied
-// warranty. In no event will the authors be held liable for any damages
-// arising from the use of this software.
-//
-// Permission is granted to anyone to use this software for any purpose,
-// including commercial applications, and to alter it and redistribute it
-// freely, subject to the following restrictions:
-//
-// 1. The origin of this software must not be misrepresented; you must not
-// claim that you wrote the original software. If you use this software
-// in a product, an acknowledgment in the product documentation would be
-// appreciated but is not required.
-// 2. Altered source versions must be plainly marked as such, and must not be
-// misrepresented as being the original software.
-// 3. This notice may not be removed or altered from any source distribution.
+// See asmjit.h or LICENSE.md for license and copyright information
+// SPDX-License-Identifier: Zlib
#include "../core/api-build_p.h"
#include "../core/globals.h"
@@ -27,9 +9,8 @@
ASMJIT_BEGIN_NAMESPACE
-// ============================================================================
-// [asmjit::DebugUtils]
-// ============================================================================
+// DebugUtils - Error As String
+// ============================
ASMJIT_FAVOR_SIZE const char* DebugUtils::errorAsString(Error err) noexcept {
#ifndef ASMJIT_NO_TEXT
@@ -54,7 +35,6 @@ ASMJIT_FAVOR_SIZE const char* DebugUtils::errorAsString(Error err) noexcept {
"LabelNameTooLong\0"
"InvalidLabelName\0"
"InvalidParentLabel\0"
- "NonLocalLabelCannotHaveParent\0"
"InvalidSection\0"
"TooManySections\0"
"InvalidSectionName\0"
@@ -67,6 +47,7 @@ ASMJIT_FAVOR_SIZE const char* DebugUtils::errorAsString(Error err) noexcept {
"InvalidRegGroup\0"
"InvalidPhysId\0"
"InvalidVirtId\0"
+ "InvalidElementIndex\0"
"InvalidPrefixCombination\0"
"InvalidLockPrefix\0"
"InvalidXAcquirePrefix\0"
@@ -96,6 +77,7 @@ ASMJIT_FAVOR_SIZE const char* DebugUtils::errorAsString(Error err) noexcept {
"InvalidUseOfGpq\0"
"InvalidUseOfF80\0"
"NotConsecutiveRegs\0"
+ "ConsecutiveRegsAllocation\0"
"IllegalVirtReg\0"
"TooManyVirtRegs\0"
"NoMorePhysRegs\0"
@@ -103,14 +85,15 @@ ASMJIT_FAVOR_SIZE const char* DebugUtils::errorAsString(Error err) noexcept {
"OverlappingStackRegWithRegArg\0"
"ExpressionLabelNotBound\0"
"ExpressionOverflow\0"
+ "FailedToOpenAnonymousMemory\0"
"<Unknown>\0";
static const uint16_t sErrorIndex[] = {
0, 3, 15, 31, 44, 56, 71, 90, 108, 123, 132, 148, 165, 178, 192, 210, 230,
- 247, 264, 283, 313, 328, 344, 363, 382, 400, 422, 440, 459, 474, 490, 504,
- 518, 543, 561, 583, 605, 622, 639, 655, 671, 687, 704, 719, 734, 754, 774,
- 794, 827, 847, 862, 879, 898, 919, 939, 953, 974, 988, 1006, 1022, 1038,
- 1057, 1072, 1088, 1103, 1118, 1148, 1172, 1191
+ 247, 264, 283, 298, 314, 333, 352, 370, 392, 410, 429, 444, 460, 474, 488,
+ 508, 533, 551, 573, 595, 612, 629, 645, 661, 677, 694, 709, 724, 744, 764,
+ 784, 817, 837, 852, 869, 888, 909, 929, 943, 964, 978, 996, 1012, 1028, 1047,
+ 1073, 1088, 1104, 1119, 1134, 1164, 1188, 1207, 1235
};
// @EnumStringEnd@
@@ -122,6 +105,9 @@ ASMJIT_FAVOR_SIZE const char* DebugUtils::errorAsString(Error err) noexcept {
#endif
}
+// DebugUtils - Debug Output
+// =========================
+
ASMJIT_FAVOR_SIZE void DebugUtils::debugOutput(const char* str) noexcept {
#if defined(_WIN32)
::OutputDebugStringA(str);
@@ -130,6 +116,9 @@ ASMJIT_FAVOR_SIZE void DebugUtils::debugOutput(const char* str) noexcept {
#endif
}
+// DebugUtils - Fatal Errors
+// =========================
+
ASMJIT_FAVOR_SIZE void DebugUtils::assertionFailed(const char* file, int line, const char* msg) noexcept {
char str[1024];
diff --git a/3rdparty/asmjit/src/asmjit/core/globals.h b/3rdparty/asmjit/src/asmjit/core/globals.h
index 67a8769a403..f2d3c6e63df 100644
--- a/3rdparty/asmjit/src/asmjit/core/globals.h
+++ b/3rdparty/asmjit/src/asmjit/core/globals.h
@@ -1,25 +1,7 @@
-// AsmJit - Machine code generation for C++
+// This file is part of AsmJit project <https://asmjit.com>
//
-// * Official AsmJit Home Page: https://asmjit.com
-// * Official Github Repository: https://github.com/asmjit/asmjit
-//
-// Copyright (c) 2008-2020 The AsmJit Authors
-//
-// This software is provided 'as-is', without any express or implied
-// warranty. In no event will the authors be held liable for any damages
-// arising from the use of this software.
-//
-// Permission is granted to anyone to use this software for any purpose,
-// including commercial applications, and to alter it and redistribute it
-// freely, subject to the following restrictions:
-//
-// 1. The origin of this software must not be misrepresented; you must not
-// claim that you wrote the original software. If you use this software
-// in a product, an acknowledgment in the product documentation would be
-// appreciated but is not required.
-// 2. Altered source versions must be plainly marked as such, and must not be
-// misrepresented as being the original software.
-// 3. This notice may not be removed or altered from any source distribution.
+// See asmjit.h or LICENSE.md for license and copyright information
+// SPDX-License-Identifier: Zlib
#ifndef ASMJIT_CORE_GLOBALS_H_INCLUDED
#define ASMJIT_CORE_GLOBALS_H_INCLUDED
@@ -28,10 +10,6 @@
ASMJIT_BEGIN_NAMESPACE
-// ============================================================================
-// [asmjit::Support]
-// ============================================================================
-
//! \cond INTERNAL
//! \addtogroup asmjit_utilities
//! \{
@@ -43,21 +21,21 @@ namespace Support {
#if defined(ASMJIT_NO_STDCXX)
namespace Support {
- ASMJIT_INLINE void* operatorNew(size_t n) noexcept { return malloc(n); }
- ASMJIT_INLINE void operatorDelete(void* p) noexcept { if (p) free(p); }
+ ASMJIT_FORCE_INLINE void* operatorNew(size_t n) noexcept { return malloc(n); }
+ ASMJIT_FORCE_INLINE void operatorDelete(void* p) noexcept { if (p) free(p); }
} // {Support}
-#define ASMJIT_BASE_CLASS(TYPE) \
- ASMJIT_INLINE void* operator new(size_t n) noexcept { \
- return Support::operatorNew(n); \
- } \
- \
- ASMJIT_INLINE void operator delete(void* p) noexcept { \
- Support::operatorDelete(p); \
- } \
- \
- ASMJIT_INLINE void* operator new(size_t, void* p) noexcept { return p; } \
- ASMJIT_INLINE void operator delete(void*, void*) noexcept {}
+#define ASMJIT_BASE_CLASS(TYPE) \
+ ASMJIT_FORCE_INLINE void* operator new(size_t n) noexcept { \
+ return Support::operatorNew(n); \
+ } \
+ \
+ ASMJIT_FORCE_INLINE void operator delete(void* p) noexcept { \
+ Support::operatorDelete(p); \
+ } \
+ \
+ ASMJIT_FORCE_INLINE void* operator new(size_t, void* p) noexcept { return p; } \
+ ASMJIT_FORCE_INLINE void operator delete(void*, void*) noexcept {}
#else
#define ASMJIT_BASE_CLASS(TYPE)
#endif
@@ -65,100 +43,88 @@ namespace Support {
//! \}
//! \endcond
-// ============================================================================
-// [asmjit::Globals]
-// ============================================================================
-
//! \addtogroup asmjit_core
//! \{
+//! Byte order.
+enum class ByteOrder {
+ //! Little endian.
+ kLE = 0,
+ //! Big endian.
+ kBE = 1,
+ //! Native byte order of the target architecture.
+ kNative = ASMJIT_ARCH_LE ? kLE : kBE,
+ //! Swapped byte order of the target architecture.
+ kSwapped = ASMJIT_ARCH_LE ? kBE : kLE
+};
+
+//! A policy that can be used with some `reset()` member functions.
+enum class ResetPolicy : uint32_t {
+ //! Soft reset, doesn't deallocate memory (default).
+ kSoft = 0,
+ //! Hard reset, releases all memory used, if any.
+ kHard = 1
+};
+
//! Contains typedefs, constants, and variables used globally by AsmJit.
namespace Globals {
-// ============================================================================
-// [asmjit::Globals::<global>]
-// ============================================================================
-
//! Host memory allocator overhead.
-constexpr uint32_t kAllocOverhead = uint32_t(sizeof(intptr_t) * 4);
+static constexpr uint32_t kAllocOverhead = uint32_t(sizeof(intptr_t) * 4);
//! Host memory allocator alignment.
-constexpr uint32_t kAllocAlignment = 8;
+static constexpr uint32_t kAllocAlignment = 8;
//! Aggressive growing strategy threshold.
-constexpr uint32_t kGrowThreshold = 1024 * 1024 * 16;
+static constexpr uint32_t kGrowThreshold = 1024 * 1024 * 16;
//! Maximum depth of RB-Tree is:
//!
//! `2 * log2(n + 1)`
//!
-//! Size of RB node is at least two pointers (without data),
-//! so a theoretical architecture limit would be:
+//! Size of RB node is at least two pointers (without data), so a theoretical architecture limit would be:
//!
//! `2 * log2(addressableMemorySize / sizeof(Node) + 1)`
//!
-//! Which yields 30 on 32-bit arch and 61 on 64-bit arch.
-//! The final value was adjusted by +1 for safety reasons.
-constexpr uint32_t kMaxTreeHeight = (ASMJIT_ARCH_BITS == 32 ? 30 : 61) + 1;
+//! Which yields 30 on 32-bit arch and 61 on 64-bit arch. The final value was adjusted by +1 for safety reasons.
+static constexpr uint32_t kMaxTreeHeight = (ASMJIT_ARCH_BITS == 32 ? 30 : 61) + 1;
//! Maximum number of operands per a single instruction.
-constexpr uint32_t kMaxOpCount = 6;
+static constexpr uint32_t kMaxOpCount = 6;
//! Maximum arguments of a function supported by the Compiler / Function API.
-constexpr uint32_t kMaxFuncArgs = 16;
+static constexpr uint32_t kMaxFuncArgs = 16;
+
+//! The number of values that can be assigned to a single function argument or
+//! return value.
+static constexpr uint32_t kMaxValuePack = 4;
//! Maximum number of physical registers AsmJit can use per register group.
-constexpr uint32_t kMaxPhysRegs = 32;
+static constexpr uint32_t kMaxPhysRegs = 32;
//! Maximum alignment.
-constexpr uint32_t kMaxAlignment = 64;
+static constexpr uint32_t kMaxAlignment = 64;
//! Maximum label or symbol size in bytes.
-constexpr uint32_t kMaxLabelNameSize = 2048;
+static constexpr uint32_t kMaxLabelNameSize = 2048;
//! Maximum section name size.
-constexpr uint32_t kMaxSectionNameSize = 35;
+static constexpr uint32_t kMaxSectionNameSize = 35;
//! Maximum size of comment.
-constexpr uint32_t kMaxCommentSize = 1024;
+static constexpr uint32_t kMaxCommentSize = 1024;
//! Invalid identifier.
-constexpr uint32_t kInvalidId = 0xFFFFFFFFu;
+static constexpr uint32_t kInvalidId = 0xFFFFFFFFu;
//! Returned by `indexOf()` and similar when working with containers that use 32-bit index/size.
-constexpr uint32_t kNotFound = 0xFFFFFFFFu;
+static constexpr uint32_t kNotFound = 0xFFFFFFFFu;
//! Invalid base address.
-constexpr uint64_t kNoBaseAddress = ~uint64_t(0);
+static constexpr uint64_t kNoBaseAddress = ~uint64_t(0);
-// ============================================================================
-// [asmjit::Globals::ResetPolicy]
-// ============================================================================
-
-//! Reset policy used by most `reset()` functions.
-enum ResetPolicy : uint32_t {
- //! Soft reset, doesn't deallocate memory (default).
- kResetSoft = 0,
- //! Hard reset, releases all memory used, if any.
- kResetHard = 1
-};
-
-// ============================================================================
-// [asmjit::Globals::Link]
-// ============================================================================
-
-enum Link : uint32_t {
- kLinkLeft = 0,
- kLinkRight = 1,
-
- kLinkPrev = 0,
- kLinkNext = 1,
-
- kLinkFirst = 0,
- kLinkLast = 1,
-
- kLinkCount = 2
-};
+//! Number of virtual register groups.
+static constexpr uint32_t kNumVirtGroups = 4;
struct Init_ {};
struct NoInit_ {};
@@ -168,24 +134,6 @@ static const constexpr NoInit_ NoInit {};
} // {Globals}
-// ============================================================================
-// [asmjit::ByteOrder]
-// ============================================================================
-
-//! Byte order.
-namespace ByteOrder {
- enum : uint32_t {
- kLE = 0,
- kBE = 1,
- kNative = ASMJIT_ARCH_LE ? kLE : kBE,
- kSwapped = ASMJIT_ARCH_LE ? kBE : kLE
- };
-}
-
-// ============================================================================
-// [asmjit::ptr_as_func / func_as_ptr]
-// ============================================================================
-
template<typename Func>
static inline Func ptr_as_func(void* func) noexcept { return Support::ptr_cast_impl<Func, void*>(func); }
@@ -194,10 +142,6 @@ static inline void* func_as_ptr(Func func) noexcept { return Support::ptr_cast_i
//! \}
-// ============================================================================
-// [asmjit::Error]
-// ============================================================================
-
//! \addtogroup asmjit_error_handling
//! \{
@@ -219,9 +163,8 @@ enum ErrorCode : uint32_t {
//! Invalid state.
//!
- //! If this error is returned it means that either you are doing something
- //! wrong or AsmJit caught itself by doing something wrong. This error should
- //! never be ignored.
+ //! If this error is returned it means that either you are doing something wrong or AsmJit caught itself by
+ //! doing something wrong. This error should never be ignored.
kErrorInvalidState,
//! Invalid or incompatible architecture.
@@ -249,9 +192,8 @@ enum ErrorCode : uint32_t {
kErrorInvalidDirective,
//! Attempt to use uninitialized label.
kErrorInvalidLabel,
- //! Label index overflow - a single \ref BaseAssembler instance can hold
- //! almost 2^32 (4 billion) labels. If there is an attempt to create more
- //! labels then this error is returned.
+ //! Label index overflow - a single \ref BaseAssembler instance can hold almost 2^32 (4 billion) labels. If
+ //! there is an attempt to create more labels then this error is returned.
kErrorTooManyLabels,
//! Label is already bound.
kErrorLabelAlreadyBound,
@@ -261,10 +203,9 @@ enum ErrorCode : uint32_t {
kErrorLabelNameTooLong,
//! Label must always be local if it's anonymous (without a name).
kErrorInvalidLabelName,
- //! Parent id passed to \ref CodeHolder::newNamedLabelEntry() was invalid.
+ //! Parent id passed to \ref CodeHolder::newNamedLabelEntry() was either invalid or parent is not supported
+ //! by the requested `LabelType`.
kErrorInvalidParentLabel,
- //! Parent id specified for a non-local (global) label.
- kErrorNonLocalLabelCannotHaveParent,
//! Invalid section.
kErrorInvalidSection,
@@ -292,27 +233,29 @@ enum ErrorCode : uint32_t {
kErrorInvalidPhysId,
//! Invalid virtual register id.
kErrorInvalidVirtId,
- //! Invalid prefix combination.
+ //! Invalid element index (ARM).
+ kErrorInvalidElementIndex,
+ //! Invalid prefix combination (X86|X64).
kErrorInvalidPrefixCombination,
- //! Invalid LOCK prefix.
+ //! Invalid LOCK prefix (X86|X64).
kErrorInvalidLockPrefix,
- //! Invalid XACQUIRE prefix.
+ //! Invalid XACQUIRE prefix (X86|X64).
kErrorInvalidXAcquirePrefix,
- //! Invalid XRELEASE prefix.
+ //! Invalid XRELEASE prefix (X86|X64).
kErrorInvalidXReleasePrefix,
- //! Invalid REP prefix.
+ //! Invalid REP prefix (X86|X64).
kErrorInvalidRepPrefix,
- //! Invalid REX prefix.
+ //! Invalid REX prefix (X86|X64).
kErrorInvalidRexPrefix,
- //! Invalid {...} register.
+ //! Invalid {...} register (X86|X64).
kErrorInvalidExtraReg,
- //! Invalid {k} use (not supported by the instruction).
+ //! Invalid {k} use (not supported by the instruction) (X86|X64).
kErrorInvalidKMaskUse,
- //! Invalid {k}{z} use (not supported by the instruction).
+ //! Invalid {k}{z} use (not supported by the instruction) (X86|X64).
kErrorInvalidKZeroUse,
- //! Invalid broadcast - Currently only related to invalid use of AVX-512 {1tox}.
+ //! Invalid broadcast - Currently only related to invalid use of AVX-512 {1tox} (X86|X64).
kErrorInvalidBroadcast,
- //! Invalid 'embedded-rounding' {er} or 'suppress-all-exceptions' {sae} (AVX-512).
+ //! Invalid 'embedded-rounding' {er} or 'suppress-all-exceptions' {sae} (AVX-512) (X86|X64).
kErrorInvalidEROrSAE,
//! Invalid address used (not encodable).
kErrorInvalidAddress,
@@ -350,11 +293,12 @@ enum ErrorCode : uint32_t {
kErrorInvalidUseOfGpbHi,
//! Invalid use of a 64-bit GPQ register in 32-bit mode.
kErrorInvalidUseOfGpq,
- //! Invalid use of an 80-bit float (\ref Type::kIdF80).
+ //! Invalid use of an 80-bit float (\ref TypeId::kFloat80).
kErrorInvalidUseOfF80,
- //! Some registers in the instruction muse be consecutive (some ARM and AVX512
- //! neural-net instructions).
+ //! Instruction requires the use of consecutive registers, but registers in operands weren't (AVX512, ASIMD load/store, etc...).
kErrorNotConsecutiveRegs,
+ //! Failed to allocate consecutive registers - allocable registers either too restricted or a bug in RW info.
+ kErrorConsecutiveRegsAllocation,
//! Illegal virtual register - reported by instruction validation.
kErrorIllegalVirtReg,
@@ -373,29 +317,28 @@ enum ErrorCode : uint32_t {
//! Arithmetic overflow during expression evaluation.
kErrorExpressionOverflow,
+ //! Failed to open anonymous memory handle or file descriptor.
+ kErrorFailedToOpenAnonymousMemory,
+
// @EnumValuesEnd@
//! Count of AsmJit error codes.
kErrorCount
};
-// ============================================================================
-// [asmjit::DebugUtils]
-// ============================================================================
-
//! Debugging utilities.
namespace DebugUtils {
//! \cond INTERNAL
//! Used to silence warnings about unused arguments or variables.
template<typename... Args>
-static ASMJIT_INLINE void unused(Args&&...) noexcept {}
+static inline void unused(Args&&...) noexcept {}
//! \endcond
//! Returns the error `err` passed.
//!
-//! Provided for debugging purposes. Putting a breakpoint inside `errored` can
-//! help with tracing the origin of any error reported / returned by AsmJit.
+//! Provided for debugging purposes. Putting a breakpoint inside `errored` can help with tracing the origin of any
+//! error reported / returned by AsmJit.
static constexpr Error errored(Error err) noexcept { return err; }
//! Returns a printable version of `asmjit::Error` code.
@@ -410,12 +353,10 @@ ASMJIT_API void debugOutput(const char* str) noexcept;
//! \param line Line in the source file.
//! \param msg Message to display.
//!
-//! If you have problems with assertion failures a breakpoint can be put
-//! at \ref assertionFailed() function (asmjit/core/globals.cpp). A call stack
-//! will be available when such assertion failure is triggered. AsmJit always
-//! returns errors on failures, assertions are a last resort and usually mean
-//! unrecoverable state due to out of range array access or totally invalid
-//! arguments like nullptr where a valid pointer should be provided, etc...
+//! If you have problems with assertion failures a breakpoint can be put at \ref assertionFailed() function
+//! (asmjit/core/globals.cpp). A call stack will be available when such assertion failure is triggered. AsmJit
+//! always returns errors on failures, assertions are a last resort and usually mean unrecoverable state due to out
+//! of range array access or totally invalid arguments like nullptr where a valid pointer should be provided, etc...
ASMJIT_API void ASMJIT_NORETURN assertionFailed(const char* file, int line, const char* msg) noexcept;
} // {DebugUtils}
@@ -436,9 +377,8 @@ ASMJIT_API void ASMJIT_NORETURN assertionFailed(const char* file, int line, cons
//! \def ASMJIT_PROPAGATE(...)
//!
-//! Propagates a possible `Error` produced by `...` to the caller by returning
-//! the error immediately. Used by AsmJit internally, but kept public for users
-//! that want to use the same technique to propagate errors to the caller.
+//! Propagates a possible `Error` produced by `...` to the caller by returning the error immediately. Used by AsmJit
+//! internally, but kept public for users that want to use the same technique to propagate errors to the caller.
#define ASMJIT_PROPAGATE(...) \
do { \
::asmjit::Error _err = __VA_ARGS__; \
diff --git a/3rdparty/asmjit/src/asmjit/core/inst.cpp b/3rdparty/asmjit/src/asmjit/core/inst.cpp
index a233b9383bf..8f29d8b7585 100644
--- a/3rdparty/asmjit/src/asmjit/core/inst.cpp
+++ b/3rdparty/asmjit/src/asmjit/core/inst.cpp
@@ -1,133 +1,109 @@
-// AsmJit - Machine code generation for C++
+// This file is part of AsmJit project <https://asmjit.com>
//
-// * Official AsmJit Home Page: https://asmjit.com
-// * Official Github Repository: https://github.com/asmjit/asmjit
-//
-// Copyright (c) 2008-2020 The AsmJit Authors
-//
-// This software is provided 'as-is', without any express or implied
-// warranty. In no event will the authors be held liable for any damages
-// arising from the use of this software.
-//
-// Permission is granted to anyone to use this software for any purpose,
-// including commercial applications, and to alter it and redistribute it
-// freely, subject to the following restrictions:
-//
-// 1. The origin of this software must not be misrepresented; you must not
-// claim that you wrote the original software. If you use this software
-// in a product, an acknowledgment in the product documentation would be
-// appreciated but is not required.
-// 2. Altered source versions must be plainly marked as such, and must not be
-// misrepresented as being the original software.
-// 3. This notice may not be removed or altered from any source distribution.
+// See asmjit.h or LICENSE.md for license and copyright information
+// SPDX-License-Identifier: Zlib
#include "../core/api-build_p.h"
-#ifdef ASMJIT_BUILD_X86
-
-#include "../core/arch.h"
+#include "../core/archtraits.h"
#include "../core/inst.h"
-#ifdef ASMJIT_BUILD_X86
+#if !defined(ASMJIT_NO_X86)
#include "../x86/x86instapi_p.h"
#endif
-#ifdef ASMJIT_BUILD_ARM
- #include "../arm/arminstapi_p.h"
+#if !defined(ASMJIT_NO_AARCH64)
+ #include "../arm/a64instapi_p.h"
#endif
ASMJIT_BEGIN_NAMESPACE
-// ============================================================================
-// [asmjit::InstAPI - Text]
-// ============================================================================
+// InstAPI - InstId <-> String
+// ===========================
#ifndef ASMJIT_NO_TEXT
-Error InstAPI::instIdToString(uint32_t arch, uint32_t instId, String& output) noexcept {
-#ifdef ASMJIT_BUILD_X86
+Error InstAPI::instIdToString(Arch arch, InstId instId, String& output) noexcept {
+#if !defined(ASMJIT_NO_X86)
if (Environment::isFamilyX86(arch))
return x86::InstInternal::instIdToString(arch, instId, output);
#endif
-#ifdef ASMJIT_BUILD_ARM
- if (Environment::isFamilyARM(arch))
- return arm::InstInternal::instIdToString(arch, instId, output);
+#if !defined(ASMJIT_NO_AARCH64)
+ if (Environment::isFamilyAArch64(arch))
+ return a64::InstInternal::instIdToString(arch, instId, output);
#endif
return DebugUtils::errored(kErrorInvalidArch);
}
-uint32_t InstAPI::stringToInstId(uint32_t arch, const char* s, size_t len) noexcept {
-#ifdef ASMJIT_BUILD_X86
+InstId InstAPI::stringToInstId(Arch arch, const char* s, size_t len) noexcept {
+#if !defined(ASMJIT_NO_X86)
if (Environment::isFamilyX86(arch))
return x86::InstInternal::stringToInstId(arch, s, len);
#endif
-#ifdef ASMJIT_BUILD_ARM
- if (Environment::isFamilyARM(arch))
- return arm::InstInternal::stringToInstId(arch, s, len);
+#if !defined(ASMJIT_NO_AARCH64)
+ if (Environment::isFamilyAArch64(arch))
+ return a64::InstInternal::stringToInstId(arch, s, len);
#endif
return 0;
}
#endif // !ASMJIT_NO_TEXT
-// ============================================================================
-// [asmjit::InstAPI - Validate]
-// ============================================================================
+// InstAPI - Validate
+// ==================
#ifndef ASMJIT_NO_VALIDATION
-Error InstAPI::validate(uint32_t arch, const BaseInst& inst, const Operand_* operands, size_t opCount, uint32_t validationFlags) noexcept {
-#ifdef ASMJIT_BUILD_X86
+Error InstAPI::validate(Arch arch, const BaseInst& inst, const Operand_* operands, size_t opCount, ValidationFlags validationFlags) noexcept {
+#if !defined(ASMJIT_NO_X86)
if (Environment::isFamilyX86(arch))
return x86::InstInternal::validate(arch, inst, operands, opCount, validationFlags);
#endif
-#ifdef ASMJIT_BUILD_ARM
- if (Environment::isFamilyARM(arch))
- return arm::InstInternal::validate(arch, inst, operands, opCount, validationFlags);
+#if !defined(ASMJIT_NO_AARCH64)
+ if (Environment::isFamilyAArch64(arch))
+ return a64::InstInternal::validate(arch, inst, operands, opCount, validationFlags);
#endif
return DebugUtils::errored(kErrorInvalidArch);
}
#endif // !ASMJIT_NO_VALIDATION
-// ============================================================================
-// [asmjit::InstAPI - QueryRWInfo]
-// ============================================================================
+// InstAPI - QueryRWInfo
+// =====================
#ifndef ASMJIT_NO_INTROSPECTION
-Error InstAPI::queryRWInfo(uint32_t arch, const BaseInst& inst, const Operand_* operands, size_t opCount, InstRWInfo* out) noexcept {
+Error InstAPI::queryRWInfo(Arch arch, const BaseInst& inst, const Operand_* operands, size_t opCount, InstRWInfo* out) noexcept {
if (ASMJIT_UNLIKELY(opCount > Globals::kMaxOpCount))
return DebugUtils::errored(kErrorInvalidArgument);
-#ifdef ASMJIT_BUILD_X86
+#if !defined(ASMJIT_NO_X86)
if (Environment::isFamilyX86(arch))
return x86::InstInternal::queryRWInfo(arch, inst, operands, opCount, out);
#endif
-#ifdef ASMJIT_BUILD_ARM
- if (Environment::isFamilyARM(arch))
- return arm::InstInternal::queryRWInfo(arch, inst, operands, opCount, out);
+#if !defined(ASMJIT_NO_AARCH64)
+ if (Environment::isFamilyAArch64(arch))
+ return a64::InstInternal::queryRWInfo(arch, inst, operands, opCount, out);
#endif
return DebugUtils::errored(kErrorInvalidArch);
}
#endif // !ASMJIT_NO_INTROSPECTION
-// ============================================================================
-// [asmjit::InstAPI - QueryFeatures]
-// ============================================================================
+// InstAPI - QueryFeatures
+// =======================
#ifndef ASMJIT_NO_INTROSPECTION
-Error InstAPI::queryFeatures(uint32_t arch, const BaseInst& inst, const Operand_* operands, size_t opCount, BaseFeatures* out) noexcept {
-#ifdef ASMJIT_BUILD_X86
+Error InstAPI::queryFeatures(Arch arch, const BaseInst& inst, const Operand_* operands, size_t opCount, CpuFeatures* out) noexcept {
+#if !defined(ASMJIT_NO_X86)
if (Environment::isFamilyX86(arch))
return x86::InstInternal::queryFeatures(arch, inst, operands, opCount, out);
#endif
-#ifdef ASMJIT_BUILD_ARM
- if (Environment::isFamilyARM(arch))
- return arm::InstInternal::queryFeatures(arch, inst, operands, opCount, out);
+#if !defined(ASMJIT_NO_AARCH64)
+ if (Environment::isFamilyAArch64(arch))
+ return a64::InstInternal::queryFeatures(arch, inst, operands, opCount, out);
#endif
return DebugUtils::errored(kErrorInvalidArch);
@@ -135,5 +111,3 @@ Error InstAPI::queryFeatures(uint32_t arch, const BaseInst& inst, const Operand_
#endif // !ASMJIT_NO_INTROSPECTION
ASMJIT_END_NAMESPACE
-
-#endif // ASMJIT_BUILD_X86
diff --git a/3rdparty/asmjit/src/asmjit/core/inst.h b/3rdparty/asmjit/src/asmjit/core/inst.h
index e34f93c87f1..23106315619 100644
--- a/3rdparty/asmjit/src/asmjit/core/inst.h
+++ b/3rdparty/asmjit/src/asmjit/core/inst.h
@@ -1,25 +1,7 @@
-// AsmJit - Machine code generation for C++
+// This file is part of AsmJit project <https://asmjit.com>
//
-// * Official AsmJit Home Page: https://asmjit.com
-// * Official Github Repository: https://github.com/asmjit/asmjit
-//
-// Copyright (c) 2008-2020 The AsmJit Authors
-//
-// This software is provided 'as-is', without any express or implied
-// warranty. In no event will the authors be held liable for any damages
-// arising from the use of this software.
-//
-// Permission is granted to anyone to use this software for any purpose,
-// including commercial applications, and to alter it and redistribute it
-// freely, subject to the following restrictions:
-//
-// 1. The origin of this software must not be misrepresented; you must not
-// claim that you wrote the original software. If you use this software
-// in a product, an acknowledgment in the product documentation would be
-// appreciated but is not required.
-// 2. Altered source versions must be plainly marked as such, and must not be
-// misrepresented as being the original software.
-// 3. This notice may not be removed or altered from any source distribution.
+// See asmjit.h or LICENSE.md for license and copyright information
+// SPDX-License-Identifier: Zlib
#ifndef ASMJIT_CORE_INST_H_INCLUDED
#define ASMJIT_CORE_INST_H_INCLUDED
@@ -34,20 +16,203 @@ ASMJIT_BEGIN_NAMESPACE
//! \addtogroup asmjit_instruction_db
//! \{
-// ============================================================================
-// [asmjit::BaseInst]
-// ============================================================================
+//! Describes an instruction id and modifiers used together with the id.
+//!
+//! Each architecture has a set of valid instructions indexed from 0. Instruction with 0 id is, however, a special
+//! instruction that describes a "no instruction" or "invalid instruction". Different architectures can assign a.
+//! different instruction to the same id, each architecture typicall has its own instructions indexed from 1.
+//!
+//! Instruction identifiers listed by architecture:
+//!
+//! - \ref x86::Inst (X86 and X86_64)
+//! - \ref a64::Inst (AArch64)
+typedef uint32_t InstId;
+
+//! Instruction id parts.
+//!
+//! A mask that specifies a bit-layout of \ref InstId.
+enum class InstIdParts : uint32_t {
+ // Common Masks
+ // ------------
+
+ //! Real id without any modifiers (always 16 least significant bits).
+ kRealId = 0x0000FFFFu,
+ //! Instruction is abstract (or virtual, IR, etc...).
+ kAbstract = 0x80000000u,
+
+ // ARM Specific
+ // ------------
+
+ //! AArch32 first data type, used by ASIMD instructions (`inst.dt.dt2`).
+ kA32_DT = 0x000F0000u,
+ //! AArch32 second data type, used by ASIMD instructions (`inst.dt.dt2`).
+ kA32_DT2 = 0x00F00000u,
+ //! AArch32/AArch64 condition code.
+ kARM_Cond = 0x78000000u
+};
+
+//! Instruction options.
+//!
+//! Instruction options complement instruction identifier and attributes.
+enum class InstOptions : uint32_t {
+ //! No options.
+ kNone = 0,
+
+ //! Used internally by emitters for handling errors and rare cases.
+ kReserved = 0x00000001u,
+
+ //! Prevents following a jump during compilation (Compiler).
+ kUnfollow = 0x00000002u,
-//! Instruction id, options, and extraReg in a single structure. This structure
-//! exists mainly to simplify analysis and validation API that requires `BaseInst`
-//! and `Operand[]` array.
+ //! Overwrite the destination operand(s) (Compiler).
+ //!
+ //! Hint that is important for register liveness analysis. It tells the compiler that the destination operand will
+ //! be overwritten now or by adjacent instructions. Compiler knows when a register is completely overwritten by a
+ //! single instruction, for example you don't have to mark "movaps" or "pxor x, x", however, if a pair of
+ //! instructions is used and the first of them doesn't completely overwrite the content of the destination,
+ //! Compiler fails to mark that register as dead.
+ //!
+ //! X86 Specific
+ //! ------------
+ //!
+ //! - All instructions that always overwrite at least the size of the register the virtual-register uses, for
+ //! example "mov", "movq", "movaps" don't need the overwrite option to be used - conversion, shuffle, and
+ //! other miscellaneous instructions included.
+ //!
+ //! - All instructions that clear the destination register if all operands are the same, for example "xor x, x",
+ //! "pcmpeqb x x", etc...
+ //!
+ //! - Consecutive instructions that partially overwrite the variable until there is no old content require
+ //! `BaseCompiler::overwrite()` to be used. Some examples (not always the best use cases thought):
+ //!
+ //! - `movlps xmm0, ?` followed by `movhps xmm0, ?` and vice versa
+ //! - `movlpd xmm0, ?` followed by `movhpd xmm0, ?` and vice versa
+ //! - `mov al, ?` followed by `and ax, 0xFF`
+ //! - `mov al, ?` followed by `mov ah, al`
+ //! - `pinsrq xmm0, ?, 0` followed by `pinsrq xmm0, ?, 1`
+ //!
+ //! - If the allocated virtual register is used temporarily for scalar operations. For example if you allocate a
+ //! full vector like `x86::Compiler::newXmm()` and then use that vector for scalar operations you should use
+ //! `overwrite()` directive:
+ //!
+ //! - `sqrtss x, y` - only LO element of `x` is changed, if you don't
+ //! use HI elements, use `compiler.overwrite().sqrtss(x, y)`.
+ kOverwrite = 0x00000004u,
+
+ //! Emit short-form of the instruction.
+ kShortForm = 0x00000010u,
+ //! Emit long-form of the instruction.
+ kLongForm = 0x00000020u,
+
+ //! Conditional jump is likely to be taken.
+ kTaken = 0x00000040u,
+ //! Conditional jump is unlikely to be taken.
+ kNotTaken = 0x00000080u,
+
+ // X86 & X64 Options
+ // -----------------
+
+ //! Use ModMR instead of ModRM if applicable.
+ kX86_ModMR = 0x00000100u,
+ //! Use ModRM instead of ModMR if applicable.
+ kX86_ModRM = 0x00000200u,
+ //! Use 3-byte VEX prefix if possible (AVX) (must be 0x00000400).
+ kX86_Vex3 = 0x00000400u,
+ //! Use VEX prefix when both VEX|EVEX prefixes are available (HINT: AVX_VNNI).
+ kX86_Vex = 0x00000800u,
+ //! Use 4-byte EVEX prefix if possible (AVX-512) (must be 0x00001000).
+ kX86_Evex = 0x00001000u,
+
+ //! LOCK prefix (lock-enabled instructions only).
+ kX86_Lock = 0x00002000u,
+ //! REP prefix (string instructions only).
+ kX86_Rep = 0x00004000u,
+ //! REPNE prefix (string instructions only).
+ kX86_Repne = 0x00008000u,
+
+ //! XACQUIRE prefix (only allowed instructions).
+ kX86_XAcquire = 0x00010000u,
+ //! XRELEASE prefix (only allowed instructions).
+ kX86_XRelease = 0x00020000u,
+
+ //! AVX-512: embedded-rounding {er} and implicit {sae}.
+ kX86_ER = 0x00040000u,
+ //! AVX-512: suppress-all-exceptions {sae}.
+ kX86_SAE = 0x00080000u,
+ //! AVX-512: round-to-nearest (even) {rn-sae} (bits 00).
+ kX86_RN_SAE = 0x00000000u,
+ //! AVX-512: round-down (toward -inf) {rd-sae} (bits 01).
+ kX86_RD_SAE = 0x00200000u,
+ //! AVX-512: round-up (toward +inf) {ru-sae} (bits 10).
+ kX86_RU_SAE = 0x00400000u,
+ //! AVX-512: round-toward-zero (truncate) {rz-sae} (bits 11).
+ kX86_RZ_SAE = 0x00600000u,
+ //! AVX-512: Use zeroing {k}{z} instead of merging {k}.
+ kX86_ZMask = 0x00800000u,
+
+ //! AVX-512: Mask to get embedded rounding bits (2 bits).
+ kX86_ERMask = kX86_RZ_SAE,
+ //! AVX-512: Mask of all possible AVX-512 options except EVEX prefix flag.
+ kX86_AVX512Mask = 0x00FC0000u,
+
+ //! Force REX.B and/or VEX.B field (X64 only).
+ kX86_OpCodeB = 0x01000000u,
+ //! Force REX.X and/or VEX.X field (X64 only).
+ kX86_OpCodeX = 0x02000000u,
+ //! Force REX.R and/or VEX.R field (X64 only).
+ kX86_OpCodeR = 0x04000000u,
+ //! Force REX.W and/or VEX.W field (X64 only).
+ kX86_OpCodeW = 0x08000000u,
+ //! Force REX prefix (X64 only).
+ kX86_Rex = 0x40000000u,
+ //! Invalid REX prefix (set by X86 or when AH|BH|CH|DH regs are used on X64).
+ kX86_InvalidRex = 0x80000000u
+};
+ASMJIT_DEFINE_ENUM_FLAGS(InstOptions)
+
+//! Instruction control flow.
+enum class InstControlFlow : uint32_t {
+ //! Regular instruction.
+ kRegular = 0u,
+ //! Unconditional jump.
+ kJump = 1u,
+ //! Conditional jump (branch).
+ kBranch = 2u,
+ //! Function call.
+ kCall = 3u,
+ //! Function return.
+ kReturn = 4u,
+
+ //! Maximum value of `InstType`.
+ kMaxValue = kReturn
+};
+
+//! Hint that is used when both input operands to the instruction are the same.
+//!
+//! Provides hints to the instrution RW query regarding special cases in which two or more operands are the same
+//! registers. This is required by instructions such as XOR, AND, OR, SUB, etc... These hints will influence the
+//! RW operations query.
+enum class InstSameRegHint : uint8_t {
+ //! No special handling.
+ kNone = 0,
+ //! Operands become read-only, the operation doesn't change the content - `X & X` and similar.
+ kRO = 1,
+ //! Operands become write-only, the content of the input(s) don't matter - `X ^ X`, `X - X`, and similar.
+ kWO = 2
+};
+
+//! Instruction id, options, and extraReg in a single structure. This structure exists mainly to simplify analysis
+//! and validation API that requires `BaseInst` and `Operand[]` array.
class BaseInst {
public:
- //! Instruction id, see \ref BaseInst::Id or {arch-specific}::Inst::Id.
- uint32_t _id;
- //! Instruction options, see \ref BaseInst::Options or {arch-specific}::Inst::Options.
- uint32_t _options;
- //! Extra register used by instruction (either REP register or AVX-512 selector).
+ //! \name Members
+ //! \{
+
+ //! Instruction id with modifiers.
+ InstId _id;
+ //! Instruction options.
+ InstOptions _options;
+ //! Extra register used by the instruction (either REP register or AVX-512 selector).
RegOnly _extraReg;
enum Id : uint32_t {
@@ -57,124 +222,66 @@ public:
kIdAbstract = 0x80000000u
};
- enum Options : uint32_t {
- //! Used internally by emitters for handling errors and rare cases.
- kOptionReserved = 0x00000001u,
-
- //! Prevents following a jump during compilation (BaseCompiler).
- kOptionUnfollow = 0x00000010u,
-
- //! Overwrite the destination operand(s) (BaseCompiler).
- //!
- //! Hint that is important for register liveness analysis. It tells the
- //! compiler that the destination operand will be overwritten now or by
- //! adjacent instructions. BaseCompiler knows when a register is completely
- //! overwritten by a single instruction, for example you don't have to
- //! mark "movaps" or "pxor x, x", however, if a pair of instructions is
- //! used and the first of them doesn't completely overwrite the content
- //! of the destination, BaseCompiler fails to mark that register as dead.
- //!
- //! X86 Specific
- //! ------------
- //!
- //! - All instructions that always overwrite at least the size of the
- //! register the virtual-register uses , for example "mov", "movq",
- //! "movaps" don't need the overwrite option to be used - conversion,
- //! shuffle, and other miscellaneous instructions included.
- //!
- //! - All instructions that clear the destination register if all operands
- //! are the same, for example "xor x, x", "pcmpeqb x x", etc...
- //!
- //! - Consecutive instructions that partially overwrite the variable until
- //! there is no old content require `BaseCompiler::overwrite()` to be used.
- //! Some examples (not always the best use cases thought):
- //!
- //! - `movlps xmm0, ?` followed by `movhps xmm0, ?` and vice versa
- //! - `movlpd xmm0, ?` followed by `movhpd xmm0, ?` and vice versa
- //! - `mov al, ?` followed by `and ax, 0xFF`
- //! - `mov al, ?` followed by `mov ah, al`
- //! - `pinsrq xmm0, ?, 0` followed by `pinsrq xmm0, ?, 1`
- //!
- //! - If allocated variable is used temporarily for scalar operations. For
- //! example if you allocate a full vector like `x86::Compiler::newXmm()`
- //! and then use that vector for scalar operations you should use
- //! `overwrite()` directive:
- //!
- //! - `sqrtss x, y` - only LO element of `x` is changed, if you don't
- //! use HI elements, use `compiler.overwrite().sqrtss(x, y)`.
- kOptionOverwrite = 0x00000020u,
-
- //! Emit short-form of the instruction.
- kOptionShortForm = 0x00000040u,
- //! Emit long-form of the instruction.
- kOptionLongForm = 0x00000080u,
-
- //! Conditional jump is likely to be taken.
- kOptionTaken = 0x00000100u,
- //! Conditional jump is unlikely to be taken.
- kOptionNotTaken = 0x00000200u
- };
-
- //! Control type.
- enum ControlType : uint32_t {
- //! No control type (doesn't jump).
- kControlNone = 0u,
- //! Unconditional jump.
- kControlJump = 1u,
- //! Conditional jump (branch).
- kControlBranch = 2u,
- //! Function call.
- kControlCall = 3u,
- //! Function return.
- kControlReturn = 4u
- };
+ //! \}
//! \name Construction & Destruction
//! \{
//! Creates a new BaseInst instance with `id` and `options` set.
//!
- //! Default values of `id` and `options` are zero, which means none instruciton.
- //! Such instruction is guaranteed to never exist for any architecture supported
- //! by AsmJit.
- inline explicit BaseInst(uint32_t id = 0, uint32_t options = 0) noexcept
- : _id(id),
+ //! Default values of `id` and `options` are zero, which means 'none' instruction. Such instruction is guaranteed
+ //! to never exist for any architecture supported by AsmJit.
+ inline explicit BaseInst(InstId instId = 0, InstOptions options = InstOptions::kNone) noexcept
+ : _id(instId),
_options(options),
_extraReg() {}
- inline BaseInst(uint32_t id, uint32_t options, const RegOnly& extraReg) noexcept
- : _id(id),
+ inline BaseInst(InstId instId, InstOptions options, const RegOnly& extraReg) noexcept
+ : _id(instId),
_options(options),
_extraReg(extraReg) {}
- inline BaseInst(uint32_t id, uint32_t options, const BaseReg& extraReg) noexcept
- : _id(id),
+ inline BaseInst(InstId instId, InstOptions options, const BaseReg& extraReg) noexcept
+ : _id(instId),
_options(options),
_extraReg { extraReg.signature(), extraReg.id() } {}
//! \}
- //! \name Instruction ID
+ //! \name Instruction id and modifiers
//! \{
- //! Returns the instruction id.
- inline uint32_t id() const noexcept { return _id; }
- //! Sets the instruction id to the given `id`.
- inline void setId(uint32_t id) noexcept { _id = id; }
- //! Resets the instruction id to zero, see \ref kIdNone.
+ //! Returns the instruction id with modifiers.
+ inline InstId id() const noexcept { return _id; }
+ //! Sets the instruction id and modiiers from `id`.
+ inline void setId(InstId id) noexcept { _id = id; }
+ //! Resets the instruction id and modifiers to zero, see \ref kIdNone.
inline void resetId() noexcept { _id = 0; }
+ //! Returns a real instruction id that doesn't contain any modifiers.
+ inline InstId realId() const noexcept { return _id & uint32_t(InstIdParts::kRealId); }
+
+ template<InstIdParts kPart>
+ inline uint32_t getInstIdPart() const noexcept {
+ return (uint32_t(_id) & uint32_t(kPart)) >> Support::ConstCTZ<uint32_t(kPart)>::value;
+ }
+
+ template<InstIdParts kPart>
+ inline void setInstIdPart(uint32_t value) noexcept {
+ _id = (_id & ~uint32_t(kPart)) | (value << Support::ConstCTZ<uint32_t(kPart)>::value);
+ }
+
//! \}
//! \name Instruction Options
//! \{
- inline uint32_t options() const noexcept { return _options; }
- inline bool hasOption(uint32_t option) const noexcept { return (_options & option) != 0; }
- inline void setOptions(uint32_t options) noexcept { _options = options; }
- inline void addOptions(uint32_t options) noexcept { _options |= options; }
- inline void clearOptions(uint32_t options) noexcept { _options &= ~options; }
- inline void resetOptions() noexcept { _options = 0; }
+ inline InstOptions options() const noexcept { return _options; }
+ inline bool hasOption(InstOptions option) const noexcept { return Support::test(_options, option); }
+ inline void setOptions(InstOptions options) noexcept { _options = options; }
+ inline void addOptions(InstOptions options) noexcept { _options |= options; }
+ inline void clearOptions(InstOptions options) noexcept { _options &= ~options; }
+ inline void resetOptions() noexcept { _options = InstOptions::kNone; }
//! \}
@@ -189,22 +296,167 @@ public:
inline void resetExtraReg() noexcept { _extraReg.reset(); }
//! \}
+
+ //! \name ARM Specific
+ //! \{
+
+ inline arm::CondCode armCondCode() const noexcept { return (arm::CondCode)getInstIdPart<InstIdParts::kARM_Cond>(); }
+ inline void setArmCondCode(arm::CondCode cc) noexcept { setInstIdPart<InstIdParts::kARM_Cond>(uint32_t(cc)); }
+
+ //! \}
+
+ //! \name Statics
+ //! \{
+
+ static inline constexpr InstId composeARMInstId(uint32_t id, arm::CondCode cc) noexcept {
+ return id | (uint32_t(cc) << Support::ConstCTZ<uint32_t(InstIdParts::kARM_Cond)>::value);
+ }
+
+ static inline constexpr arm::CondCode extractARMCondCode(uint32_t id) noexcept {
+ return (arm::CondCode)((uint32_t(id) & uint32_t(InstIdParts::kARM_Cond)) >> Support::ConstCTZ<uint32_t(InstIdParts::kARM_Cond)>::value);
+ }
+
+ //! \}
+};
+
+//! CPU read/write flags used by \ref InstRWInfo.
+//!
+//! These flags can be used to get a basic overview about CPU specifics flags used by instructions.
+enum class CpuRWFlags : uint32_t {
+ //! No flags.
+ kNone = 0x00000000u,
+
+ // Common RW Flags (0x000000FF)
+ // ----------------------------
+
+ //! Carry flag.
+ kCF = 0x00000001u,
+ //! Signed overflow flag.
+ kOF = 0x00000002u,
+ //! Sign flag (negative/sign, if set).
+ kSF = 0x00000004u,
+ //! Zero and/or equality flag (1 if zero/equal).
+ kZF = 0x00000008u,
+
+ // X86 Specific RW Flags (0xFFFFFF00)
+ // ----------------------------------
+
+ //! Carry flag (X86, X86_64).
+ kX86_CF = kCF,
+ //! Overflow flag (X86, X86_64).
+ kX86_OF = kOF,
+ //! Sign flag (X86, X86_64).
+ kX86_SF = kSF,
+ //! Zero flag (X86, X86_64).
+ kX86_ZF = kZF,
+
+ //! Adjust flag (X86, X86_64).
+ kX86_AF = 0x00000100u,
+ //! Parity flag (X86, X86_64).
+ kX86_PF = 0x00000200u,
+ //! Direction flag (X86, X86_64).
+ kX86_DF = 0x00000400u,
+ //! Interrupt enable flag (X86, X86_64).
+ kX86_IF = 0x00000800u,
+
+ //! Alignment check flag (X86, X86_64).
+ kX86_AC = 0x00001000u,
+
+ //! FPU C0 status flag (X86, X86_64).
+ kX86_C0 = 0x00010000u,
+ //! FPU C1 status flag (X86, X86_64).
+ kX86_C1 = 0x00020000u,
+ //! FPU C2 status flag (X86, X86_64).
+ kX86_C2 = 0x00040000u,
+ //! FPU C3 status flag (X86, X86_64).
+ kX86_C3 = 0x00080000u
};
+ASMJIT_DEFINE_ENUM_FLAGS(CpuRWFlags)
+
+//! Operand read/write flags describe how the operand is accessed and some additional features.
+enum class OpRWFlags {
+ //! No flags.
+ kNone = 0,
+
+ //! Operand is read.
+ kRead = 0x00000001u,
-// ============================================================================
-// [asmjit::OpRWInfo]
-// ============================================================================
+ //! Operand is written.
+ kWrite = 0x00000002u,
+
+ //! Operand is both read and written.
+ kRW = 0x00000003u,
+
+ //! Register operand can be replaced by a memory operand.
+ kRegMem = 0x00000004u,
+
+ //! The register must be allocated to the index of the previous register + 1.
+ //!
+ //! This flag is used by all architectures to describe instructions that use consecutive registers, where only the
+ //! first one is encoded in the instruction, and the others are just a sequence that starts with the first one. On
+ //! X86/X86_64 architecture this is used by instructions such as V4FMADDPS, V4FMADDSS, V4FNMADDPS, V4FNMADDSS,
+ //! VP4DPWSSD, VP4DPWSSDS, VP2INTERSECTD, and VP2INTERSECTQ. On ARM/AArch64 this is used by vector load and store
+ //! instructions that can load or store multiple registers at once.
+ kConsecutive = 0x00000008u,
+
+ //! The `extendByteMask()` represents a zero extension.
+ kZExt = 0x00000010u,
+
+ //! Register operand must use \ref OpRWInfo::physId().
+ kRegPhysId = 0x00000100u,
+ //! Base register of a memory operand must use \ref OpRWInfo::physId().
+ kMemPhysId = 0x00000200u,
+
+ //! This memory operand is only used to encode registers and doesn't access memory.
+ //!
+ //! X86 Specific
+ //! ------------
+ //!
+ //! Instructions that use such feature include BNDLDX, BNDSTX, and LEA.
+ kMemFake = 0x000000400u,
+
+ //! Base register of the memory operand will be read.
+ kMemBaseRead = 0x00001000u,
+ //! Base register of the memory operand will be written.
+ kMemBaseWrite = 0x00002000u,
+ //! Base register of the memory operand will be read & written.
+ kMemBaseRW = 0x00003000u,
+
+ //! Index register of the memory operand will be read.
+ kMemIndexRead = 0x00004000u,
+ //! Index register of the memory operand will be written.
+ kMemIndexWrite = 0x00008000u,
+ //! Index register of the memory operand will be read & written.
+ kMemIndexRW = 0x0000C000u,
+
+ //! Base register of the memory operand will be modified before the operation.
+ kMemBasePreModify = 0x00010000u,
+ //! Base register of the memory operand will be modified after the operation.
+ kMemBasePostModify = 0x00020000u
+};
+ASMJIT_DEFINE_ENUM_FLAGS(OpRWFlags)
+
+// Don't remove these asserts. Read/Write flags are used extensively
+// by Compiler and they must always be compatible with constants below.
+static_assert(uint32_t(OpRWFlags::kRead) == 0x1, "OpRWFlags::kRead flag must be 0x1");
+static_assert(uint32_t(OpRWFlags::kWrite) == 0x2, "OpRWFlags::kWrite flag must be 0x2");
+static_assert(uint32_t(OpRWFlags::kRegMem) == 0x4, "OpRWFlags::kRegMem flag must be 0x4");
//! Read/Write information related to a single operand, used by \ref InstRWInfo.
struct OpRWInfo {
- //! Read/Write flags, see \ref OpRWInfo::Flags.
- uint32_t _opFlags;
+ //! \name Members
+ //! \{
+
+ //! Read/Write flags.
+ OpRWFlags _opFlags;
//! Physical register index, if required.
uint8_t _physId;
//! Size of a possible memory operand that can replace a register operand.
uint8_t _rmSize;
+ //! If non-zero, then this is a consecutive lead register, and the value describes how many registers follow.
+ uint8_t _consecutiveLeadCount;
//! Reserved for future use.
- uint8_t _reserved[2];
+ uint8_t _reserved[1];
//! Read bit-mask where each bit represents one byte read from Reg/Mem.
uint64_t _readByteMask;
//! Write bit-mask where each bit represents one byte written to Reg/Mem.
@@ -212,61 +464,7 @@ struct OpRWInfo {
//! Zero/Sign extend bit-mask where each bit represents one byte written to Reg/Mem.
uint64_t _extendByteMask;
- //! Flags describe how the operand is accessed and some additional information.
- enum Flags : uint32_t {
- //! Operand is read.
- kRead = 0x00000001u,
-
- //! Operand is written.
- kWrite = 0x00000002u,
-
- //! Operand is both read and written.
- kRW = 0x00000003u,
-
- //! Register operand can be replaced by a memory operand.
- kRegMem = 0x00000004u,
-
- //! The `extendByteMask()` represents a zero extension.
- kZExt = 0x00000010u,
-
- //! Register operand must use \ref physId().
- kRegPhysId = 0x00000100u,
- //! Base register of a memory operand must use \ref physId().
- kMemPhysId = 0x00000200u,
-
- //! This memory operand is only used to encode registers and doesn't access memory.
- //!
- //! X86 Specific
- //! ------------
- //!
- //! Instructions that use such feature include BNDLDX, BNDSTX, and LEA.
- kMemFake = 0x000000400u,
-
- //! Base register of the memory operand will be read.
- kMemBaseRead = 0x00001000u,
- //! Base register of the memory operand will be written.
- kMemBaseWrite = 0x00002000u,
- //! Base register of the memory operand will be read & written.
- kMemBaseRW = 0x00003000u,
-
- //! Index register of the memory operand will be read.
- kMemIndexRead = 0x00004000u,
- //! Index register of the memory operand will be written.
- kMemIndexWrite = 0x00008000u,
- //! Index register of the memory operand will be read & written.
- kMemIndexRW = 0x0000C000u,
-
- //! Base register of the memory operand will be modified before the operation.
- kMemBasePreModify = 0x00010000u,
- //! Base register of the memory operand will be modified after the operation.
- kMemBasePostModify = 0x00020000u
- };
-
- // Don't remove these asserts. Read/Write flags are used extensively
- // by Compiler and they must always be compatible with constants below.
- static_assert(kRead == 0x1, "OpRWInfo::kRead flag must be 0x1");
- static_assert(kWrite == 0x2, "OpRWInfo::kWrite flag must be 0x2");
- static_assert(kRegMem == 0x4, "OpRWInfo::kRegMem flag must be 0x4");
+ //! \}
//! \name Reset
//! \{
@@ -276,20 +474,21 @@ struct OpRWInfo {
//! Resets this operand info (resets all members) and set common information
//! to the given `opFlags`, `regSize`, and possibly `physId`.
- inline void reset(uint32_t opFlags, uint32_t regSize, uint32_t physId = BaseReg::kIdBad) noexcept {
+ inline void reset(OpRWFlags opFlags, uint32_t regSize, uint32_t physId = BaseReg::kIdBad) noexcept {
_opFlags = opFlags;
_physId = uint8_t(physId);
- _rmSize = uint8_t((opFlags & kRegMem) ? regSize : uint32_t(0));
+ _rmSize = Support::test(opFlags, OpRWFlags::kRegMem) ? uint8_t(regSize) : uint8_t(0);
+ _consecutiveLeadCount = 0;
_resetReserved();
uint64_t mask = Support::lsbMask<uint64_t>(regSize);
- _readByteMask = opFlags & kRead ? mask : uint64_t(0);
- _writeByteMask = opFlags & kWrite ? mask : uint64_t(0);
+ _readByteMask = Support::test(opFlags, OpRWFlags::kRead) ? mask : uint64_t(0);
+ _writeByteMask = Support::test(opFlags, OpRWFlags::kWrite) ? mask : uint64_t(0);
_extendByteMask = 0;
}
inline void _resetReserved() noexcept {
- memset(_reserved, 0, sizeof(_reserved));
+ _reserved[0] = 0;
}
//! \}
@@ -297,73 +496,77 @@ struct OpRWInfo {
//! \name Operand Flags
//! \{
- //! Returns operand flags, see \ref Flags.
- inline uint32_t opFlags() const noexcept { return _opFlags; }
+ //! Returns operand flags.
+ inline OpRWFlags opFlags() const noexcept { return _opFlags; }
//! Tests whether operand flags contain the given `flag`.
- inline bool hasOpFlag(uint32_t flag) const noexcept { return (_opFlags & flag) != 0; }
+ inline bool hasOpFlag(OpRWFlags flag) const noexcept { return Support::test(_opFlags, flag); }
//! Adds the given `flags` to operand flags.
- inline void addOpFlags(uint32_t flags) noexcept { _opFlags |= flags; }
+ inline void addOpFlags(OpRWFlags flags) noexcept { _opFlags |= flags; }
//! Removes the given `flags` from operand flags.
- inline void clearOpFlags(uint32_t flags) noexcept { _opFlags &= ~flags; }
+ inline void clearOpFlags(OpRWFlags flags) noexcept { _opFlags &= ~flags; }
//! Tests whether this operand is read from.
- inline bool isRead() const noexcept { return hasOpFlag(kRead); }
+ inline bool isRead() const noexcept { return hasOpFlag(OpRWFlags::kRead); }
//! Tests whether this operand is written to.
- inline bool isWrite() const noexcept { return hasOpFlag(kWrite); }
+ inline bool isWrite() const noexcept { return hasOpFlag(OpRWFlags::kWrite); }
//! Tests whether this operand is both read and write.
- inline bool isReadWrite() const noexcept { return (_opFlags & kRW) == kRW; }
+ inline bool isReadWrite() const noexcept { return (_opFlags & OpRWFlags::kRW) == OpRWFlags::kRW; }
//! Tests whether this operand is read only.
- inline bool isReadOnly() const noexcept { return (_opFlags & kRW) == kRead; }
+ inline bool isReadOnly() const noexcept { return (_opFlags & OpRWFlags::kRW) == OpRWFlags::kRead; }
//! Tests whether this operand is write only.
- inline bool isWriteOnly() const noexcept { return (_opFlags & kRW) == kWrite; }
+ inline bool isWriteOnly() const noexcept { return (_opFlags & OpRWFlags::kRW) == OpRWFlags::kWrite; }
+
+ //! Returns the type of a lead register, which is followed by consecutive registers.
+ inline uint32_t consecutiveLeadCount() const noexcept { return _consecutiveLeadCount; }
//! Tests whether this operand is Reg/Mem
//!
//! Reg/Mem operands can use either register or memory.
- inline bool isRm() const noexcept { return hasOpFlag(kRegMem); }
+ inline bool isRm() const noexcept { return hasOpFlag(OpRWFlags::kRegMem); }
//! Tests whether the operand will be zero extended.
- inline bool isZExt() const noexcept { return hasOpFlag(kZExt); }
+ inline bool isZExt() const noexcept { return hasOpFlag(OpRWFlags::kZExt); }
//! \}
//! \name Memory Flags
//! \{
- //! Tests whether this is a fake memory operand, which is only used, because
- //! of encoding. Fake memory operands do not access any memory, they are only
- //! used to encode registers.
- inline bool isMemFake() const noexcept { return hasOpFlag(kMemFake); }
+ //! Tests whether this is a fake memory operand, which is only used, because of encoding. Fake memory operands do
+ //! not access any memory, they are only used to encode registers.
+ inline bool isMemFake() const noexcept { return hasOpFlag(OpRWFlags::kMemFake); }
+ //! Tests whether the instruction's memory BASE register is used.
+ inline bool isMemBaseUsed() const noexcept { return hasOpFlag(OpRWFlags::kMemBaseRW); }
//! Tests whether the instruction reads from its BASE registers.
- inline bool isMemBaseRead() const noexcept { return hasOpFlag(kMemBaseRead); }
+ inline bool isMemBaseRead() const noexcept { return hasOpFlag(OpRWFlags::kMemBaseRead); }
//! Tests whether the instruction writes to its BASE registers.
- inline bool isMemBaseWrite() const noexcept { return hasOpFlag(kMemBaseWrite); }
+ inline bool isMemBaseWrite() const noexcept { return hasOpFlag(OpRWFlags::kMemBaseWrite); }
//! Tests whether the instruction reads and writes from/to its BASE registers.
- inline bool isMemBaseReadWrite() const noexcept { return (_opFlags & kMemBaseRW) == kMemBaseRW; }
+ inline bool isMemBaseReadWrite() const noexcept { return (_opFlags & OpRWFlags::kMemBaseRW) == OpRWFlags::kMemBaseRW; }
//! Tests whether the instruction only reads from its BASE registers.
- inline bool isMemBaseReadOnly() const noexcept { return (_opFlags & kMemBaseRW) == kMemBaseRead; }
+ inline bool isMemBaseReadOnly() const noexcept { return (_opFlags & OpRWFlags::kMemBaseRW) == OpRWFlags::kMemBaseRead; }
//! Tests whether the instruction only writes to its BASE registers.
- inline bool isMemBaseWriteOnly() const noexcept { return (_opFlags & kMemBaseRW) == kMemBaseWrite; }
+ inline bool isMemBaseWriteOnly() const noexcept { return (_opFlags & OpRWFlags::kMemBaseRW) == OpRWFlags::kMemBaseWrite; }
- //! Tests whether the instruction modifies the BASE register before it uses
- //! it to calculate the target address.
- inline bool isMemBasePreModify() const noexcept { return hasOpFlag(kMemBasePreModify); }
- //! Tests whether the instruction modifies the BASE register after it uses
- //! it to calculate the target address.
- inline bool isMemBasePostModify() const noexcept { return hasOpFlag(kMemBasePostModify); }
+ //! Tests whether the instruction modifies the BASE register before it uses it to calculate the target address.
+ inline bool isMemBasePreModify() const noexcept { return hasOpFlag(OpRWFlags::kMemBasePreModify); }
+ //! Tests whether the instruction modifies the BASE register after it uses it to calculate the target address.
+ inline bool isMemBasePostModify() const noexcept { return hasOpFlag(OpRWFlags::kMemBasePostModify); }
+ //! Tests whether the instruction's memory INDEX register is used.
+ inline bool isMemIndexUsed() const noexcept { return hasOpFlag(OpRWFlags::kMemIndexRW); }
//! Tests whether the instruction reads the INDEX registers.
- inline bool isMemIndexRead() const noexcept { return hasOpFlag(kMemIndexRead); }
+ inline bool isMemIndexRead() const noexcept { return hasOpFlag(OpRWFlags::kMemIndexRead); }
//! Tests whether the instruction writes to its INDEX registers.
- inline bool isMemIndexWrite() const noexcept { return hasOpFlag(kMemIndexWrite); }
+ inline bool isMemIndexWrite() const noexcept { return hasOpFlag(OpRWFlags::kMemIndexWrite); }
//! Tests whether the instruction reads and writes from/to its INDEX registers.
- inline bool isMemIndexReadWrite() const noexcept { return (_opFlags & kMemIndexRW) == kMemIndexRW; }
+ inline bool isMemIndexReadWrite() const noexcept { return (_opFlags & OpRWFlags::kMemIndexRW) == OpRWFlags::kMemIndexRW; }
//! Tests whether the instruction only reads from its INDEX registers.
- inline bool isMemIndexReadOnly() const noexcept { return (_opFlags & kMemIndexRW) == kMemIndexRead; }
+ inline bool isMemIndexReadOnly() const noexcept { return (_opFlags & OpRWFlags::kMemIndexRW) == OpRWFlags::kMemIndexRead; }
//! Tests whether the instruction only writes to its INDEX registers.
- inline bool isMemIndexWriteOnly() const noexcept { return (_opFlags & kMemIndexRW) == kMemIndexWrite; }
+ inline bool isMemIndexWriteOnly() const noexcept { return (_opFlags & OpRWFlags::kMemIndexRW) == OpRWFlags::kMemIndexWrite; }
//! \}
@@ -411,18 +614,17 @@ struct OpRWInfo {
//! \}
};
-// ============================================================================
-// [asmjit::InstRWInfo]
-// ============================================================================
-
//! Read/Write information of an instruction.
struct InstRWInfo {
+ //! \name Members
+ //! \{
+
//! Instruction flags (there are no flags at the moment, this field is reserved).
uint32_t _instFlags;
- //! Mask of CPU flags read.
- uint32_t _readFlags;
- //! Mask of CPU flags written.
- uint32_t _writeFlags;
+ //! CPU flags read.
+ CpuRWFlags _readFlags;
+ //! CPU flags written.
+ CpuRWFlags _writeFlags;
//! Count of operands.
uint8_t _opCount;
//! CPU feature required for replacing register operand with memory operand.
@@ -434,6 +636,8 @@ struct InstRWInfo {
//! Read/Write info of instruction operands.
OpRWInfo _operands[Globals::kMaxOpCount];
+ //! \}
+
//! \name Commons
//! \{
@@ -442,40 +646,29 @@ struct InstRWInfo {
//! \}
- //! \name Instruction Flags
- //!
+ //! \name CPU Flags Information
//! \{
- inline uint32_t instFlags() const noexcept { return _instFlags; }
- inline bool hasInstFlag(uint32_t flag) const noexcept { return (_instFlags & flag) != 0; }
-
- //! }
-
- //! \name CPU Flags Read/Write Information
- //! \{
-
- //! Returns read flags of the instruction.
- inline uint32_t readFlags() const noexcept { return _readFlags; }
- //! Returns write flags of the instruction.
- inline uint32_t writeFlags() const noexcept { return _writeFlags; }
+ //! Returns a mask of CPU flags read.
+ inline CpuRWFlags readFlags() const noexcept { return _readFlags; }
+ //! Returns a mask of CPU flags written.
+ inline CpuRWFlags writeFlags() const noexcept { return _writeFlags; }
//! \}
//! \name Reg/Mem Information
//! \{
- //! Returns the CPU feature required to replace a register operand with memory
- //! operand. If the returned feature is zero (none) then this instruction
- //! either doesn't provide memory operand combination or there is no extra
- //! CPU feature required.
+ //! Returns the CPU feature required to replace a register operand with memory operand. If the returned feature is
+ //! zero (none) then this instruction either doesn't provide memory operand combination or there is no extra CPU
+ //! feature required.
//!
//! X86 Specific
//! ------------
//!
- //! Some AVX+ instructions may require extra features for replacing registers
- //! with memory operands, for example VPSLLDQ instruction only supports
- //! 'reg/reg/imm' combination on AVX/AVX2 capable CPUs and requires AVX-512 for
- //! 'reg/mem/imm' combination.
+ //! Some AVX+ instructions may require extra features for replacing registers with memory operands, for example
+ //! VPSLLDQ instruction only supports `vpslldq reg, reg, imm` combination on AVX/AVX2 capable CPUs and requires
+ //! AVX-512 for `vpslldq reg, mem, imm` combination.
inline uint32_t rmFeature() const noexcept { return _rmFeature; }
//! \}
@@ -501,49 +694,43 @@ struct InstRWInfo {
//! \}
};
-// ============================================================================
-// [asmjit::InstAPI]
-// ============================================================================
-
-//! Instruction API.
-namespace InstAPI {
-
//! Validation flags that can be used with \ref InstAPI::validate().
-enum ValidationFlags : uint32_t {
+enum class ValidationFlags : uint32_t {
+ //! No flags.
+ kNone = 0,
//! Allow virtual registers in the instruction.
- kValidationFlagVirtRegs = 0x01u
+ kEnableVirtRegs = 0x01u
};
+ASMJIT_DEFINE_ENUM_FLAGS(ValidationFlags)
+
+//! Instruction API.
+namespace InstAPI {
#ifndef ASMJIT_NO_TEXT
-//! Appends the name of the instruction specified by `instId` and `instOptions`
-//! into the `output` string.
+//! Appends the name of the instruction specified by `instId` and `instOptions` into the `output` string.
//!
-//! \note Instruction options would only affect instruction prefix & suffix,
-//! other options would be ignored. If `instOptions` is zero then only raw
-//! instruction name (without any additional text) will be appended.
-ASMJIT_API Error instIdToString(uint32_t arch, uint32_t instId, String& output) noexcept;
-
-//! Parses an instruction name in the given string `s`. Length is specified
-//! by `len` argument, which can be `SIZE_MAX` if `s` is known to be null
-//! terminated.
+//! \note Instruction options would only affect instruction prefix & suffix, other options would be ignored.
+//! If `instOptions` is zero then only raw instruction name (without any additional text) will be appended.
+ASMJIT_API Error instIdToString(Arch arch, InstId instId, String& output) noexcept;
+
+//! Parses an instruction name in the given string `s`. Length is specified by `len` argument, which can be
+//! `SIZE_MAX` if `s` is known to be null terminated.
//!
-//! Returns the parsed instruction id or \ref BaseInst::kIdNone if no such
-//! instruction exists.
-ASMJIT_API uint32_t stringToInstId(uint32_t arch, const char* s, size_t len) noexcept;
+//! Returns the parsed instruction id or \ref BaseInst::kIdNone if no such instruction exists.
+ASMJIT_API InstId stringToInstId(Arch arch, const char* s, size_t len) noexcept;
#endif // !ASMJIT_NO_TEXT
#ifndef ASMJIT_NO_VALIDATION
-//! Validates the given instruction considering the validation `flags`, see
-//! \ref ValidationFlags.
-ASMJIT_API Error validate(uint32_t arch, const BaseInst& inst, const Operand_* operands, size_t opCount, uint32_t validationFlags = 0) noexcept;
+//! Validates the given instruction considering the given `validationFlags`.
+ASMJIT_API Error validate(Arch arch, const BaseInst& inst, const Operand_* operands, size_t opCount, ValidationFlags validationFlags = ValidationFlags::kNone) noexcept;
#endif // !ASMJIT_NO_VALIDATION
#ifndef ASMJIT_NO_INTROSPECTION
//! Gets Read/Write information of the given instruction.
-ASMJIT_API Error queryRWInfo(uint32_t arch, const BaseInst& inst, const Operand_* operands, size_t opCount, InstRWInfo* out) noexcept;
+ASMJIT_API Error queryRWInfo(Arch arch, const BaseInst& inst, const Operand_* operands, size_t opCount, InstRWInfo* out) noexcept;
//! Gets CPU features required by the given instruction.
-ASMJIT_API Error queryFeatures(uint32_t arch, const BaseInst& inst, const Operand_* operands, size_t opCount, BaseFeatures* out) noexcept;
+ASMJIT_API Error queryFeatures(Arch arch, const BaseInst& inst, const Operand_* operands, size_t opCount, CpuFeatures* out) noexcept;
#endif // !ASMJIT_NO_INTROSPECTION
} // {InstAPI}
diff --git a/3rdparty/asmjit/src/asmjit/core/jitallocator.cpp b/3rdparty/asmjit/src/asmjit/core/jitallocator.cpp
index b2285113d3d..19fbe4b2338 100644
--- a/3rdparty/asmjit/src/asmjit/core/jitallocator.cpp
+++ b/3rdparty/asmjit/src/asmjit/core/jitallocator.cpp
@@ -1,30 +1,12 @@
-// AsmJit - Machine code generation for C++
+// This file is part of AsmJit project <https://asmjit.com>
//
-// * Official AsmJit Home Page: https://asmjit.com
-// * Official Github Repository: https://github.com/asmjit/asmjit
-//
-// Copyright (c) 2008-2020 The AsmJit Authors
-//
-// This software is provided 'as-is', without any express or implied
-// warranty. In no event will the authors be held liable for any damages
-// arising from the use of this software.
-//
-// Permission is granted to anyone to use this software for any purpose,
-// including commercial applications, and to alter it and redistribute it
-// freely, subject to the following restrictions:
-//
-// 1. The origin of this software must not be misrepresented; you must not
-// claim that you wrote the original software. If you use this software
-// in a product, an acknowledgment in the product documentation would be
-// appreciated but is not required.
-// 2. Altered source versions must be plainly marked as such, and must not be
-// misrepresented as being the original software.
-// 3. This notice may not be removed or altered from any source distribution.
+// See asmjit.h or LICENSE.md for license and copyright information
+// SPDX-License-Identifier: Zlib
#include "../core/api-build_p.h"
#ifndef ASMJIT_NO_JIT
-#include "../core/arch.h"
+#include "../core/archtraits.h"
#include "../core/jitallocator.h"
#include "../core/osutils_p.h"
#include "../core/support.h"
@@ -35,24 +17,24 @@
ASMJIT_BEGIN_NAMESPACE
-// ============================================================================
-// [asmjit::JitAllocator - Constants]
-// ============================================================================
+// JitAllocator - Constants
+// ========================
-enum JitAllocatorConstants : uint32_t {
- //! Number of pools to use when `JitAllocator::kOptionUseMultiplePools` is set.
- //!
- //! Each pool increases granularity twice to make memory management more
- //! efficient. Ideal number of pools appears to be 3 to 4 as it distributes
- //! small and large functions properly.
- kJitAllocatorMultiPoolCount = 3,
+//! Number of pools to use when `JitAllocatorOptions::kUseMultiplePools` is set.
+//!
+//! Each pool increases granularity twice to make memory management more
+//! efficient. Ideal number of pools appears to be 3 to 4 as it distributes
+//! small and large functions properly.
+static constexpr uint32_t kJitAllocatorMultiPoolCount = 3;
- //! Minimum granularity (and the default granularity for pool #0).
- kJitAllocatorBaseGranularity = 64,
+//! Minimum granularity (and the default granularity for pool #0).
+static constexpr uint32_t kJitAllocatorBaseGranularity = 64;
- //! Maximum block size (16MB).
- kJitAllocatorMaxBlockSize = 1024 * 1024 * 16
-};
+//! Maximum block size (32MB).
+static constexpr uint32_t kJitAllocatorMaxBlockSize = 1024 * 1024 * 32;
+
+// JitAllocator - Fill Pattern
+// ===========================
static inline uint32_t JitAllocator_defaultFillPattern() noexcept {
// X86 and X86_64 - 4x 'int3' instruction.
@@ -63,88 +45,97 @@ static inline uint32_t JitAllocator_defaultFillPattern() noexcept {
return 0u;
}
-// ============================================================================
-// [asmjit::JitAllocator - BitFlipIterator]
-// ============================================================================
+// JitAllocator - BitVectorRangeIterator
+// =====================================
-//! BitWord[] iterator used by `JitAllocator` that can flip the search pattern
-//! during iteration.
-template<typename T>
-class BitFlipIterator {
+template<typename T, uint32_t B>
+class BitVectorRangeIterator {
public:
- ASMJIT_INLINE BitFlipIterator(const T* data, size_t numBitWords, size_t start = 0, T xorMask = 0) noexcept {
- init(data, numBitWords, start, xorMask);
- }
+ const T* _ptr;
+ size_t _idx;
+ size_t _end;
+ T _bitWord;
- ASMJIT_INLINE void init(const T* data, size_t numBitWords, size_t start = 0, T xorMask = 0) noexcept {
- const T* ptr = data + (start / Support::bitSizeOf<T>());
- size_t idx = Support::alignDown(start, Support::bitSizeOf<T>());
- size_t end = numBitWords * Support::bitSizeOf<T>();
+ enum : uint32_t { kBitWordSize = Support::bitSizeOf<T>() };
+ enum : T { kXorMask = B == 0 ? Support::allOnes<T>() : T(0) };
- T bitWord = T(0);
- if (idx < end) {
- bitWord = (*ptr++ ^ xorMask) & (Support::allOnes<T>() << (start % Support::bitSizeOf<T>()));
- while (!bitWord && (idx += Support::bitSizeOf<T>()) < end)
- bitWord = *ptr++ ^ xorMask;
- }
+ ASMJIT_FORCE_INLINE BitVectorRangeIterator(const T* data, size_t numBitWords) noexcept {
+ init(data, numBitWords);
+ }
- _ptr = ptr;
- _idx = idx;
- _end = end;
- _current = bitWord;
- _xorMask = xorMask;
+ ASMJIT_FORCE_INLINE BitVectorRangeIterator(const T* data, size_t numBitWords, size_t start, size_t end) noexcept {
+ init(data, numBitWords, start, end);
}
- ASMJIT_INLINE bool hasNext() const noexcept {
- return _current != T(0);
+ ASMJIT_FORCE_INLINE void init(const T* data, size_t numBitWords) noexcept {
+ init(data, numBitWords, 0, numBitWords * kBitWordSize);
}
- ASMJIT_INLINE size_t next() noexcept {
- T bitWord = _current;
- ASMJIT_ASSERT(bitWord != T(0));
+ ASMJIT_FORCE_INLINE void init(const T* data, size_t numBitWords, size_t start, size_t end) noexcept {
+ ASMJIT_ASSERT(numBitWords >= (end + kBitWordSize - 1) / kBitWordSize);
+ DebugUtils::unused(numBitWords);
- uint32_t bit = Support::ctz(bitWord);
- bitWord ^= T(1u) << bit;
+ size_t idx = Support::alignDown(start, kBitWordSize);
+ const T* ptr = data + (idx / kBitWordSize);
- size_t n = _idx + bit;
- while (!bitWord && (_idx += Support::bitSizeOf<T>()) < _end)
- bitWord = *_ptr++ ^ _xorMask;
+ T bitWord = 0;
+ if (idx < end)
+ bitWord = (*ptr ^ kXorMask) & (Support::allOnes<T>() << (start % kBitWordSize));
- _current = bitWord;
- return n;
+ _ptr = ptr;
+ _idx = idx;
+ _end = end;
+ _bitWord = bitWord;
}
- ASMJIT_INLINE size_t nextAndFlip() noexcept {
- T bitWord = _current;
- ASMJIT_ASSERT(bitWord != T(0));
+ ASMJIT_FORCE_INLINE bool nextRange(size_t* rangeStart, size_t* rangeEnd, size_t rangeHint = std::numeric_limits<size_t>::max()) noexcept {
+ // Skip all empty BitWords.
+ while (_bitWord == 0) {
+ _idx += kBitWordSize;
+ if (_idx >= _end)
+ return false;
+ _bitWord = (*++_ptr) ^ kXorMask;
+ }
- uint32_t bit = Support::ctz(bitWord);
- bitWord ^= Support::allOnes<T>() << bit;
- _xorMask ^= Support::allOnes<T>();
+ size_t i = Support::ctz(_bitWord);
- size_t n = _idx + bit;
- while (!bitWord && (_idx += Support::bitSizeOf<T>()) < _end)
- bitWord = *_ptr++ ^ _xorMask;
+ *rangeStart = _idx + i;
+ _bitWord = ~(_bitWord ^ ~(Support::allOnes<T>() << i));
- _current = bitWord;
- return n;
- }
+ if (_bitWord == 0) {
+ *rangeEnd = Support::min(_idx + kBitWordSize, _end);
+ while (*rangeEnd - *rangeStart < rangeHint) {
+ _idx += kBitWordSize;
+ if (_idx >= _end)
+ break;
- ASMJIT_INLINE size_t peekNext() const noexcept {
- ASMJIT_ASSERT(_current != T(0));
- return _idx + Support::ctz(_current);
- }
+ _bitWord = (*++_ptr) ^ kXorMask;
+ if (_bitWord != Support::allOnes<T>()) {
+ size_t j = Support::ctz(~_bitWord);
+ *rangeEnd = Support::min(_idx + j, _end);
+ _bitWord = _bitWord ^ ~(Support::allOnes<T>() << j);
+ break;
+ }
- const T* _ptr;
- size_t _idx;
- size_t _end;
- T _current;
- T _xorMask;
+ *rangeEnd = Support::min(_idx + kBitWordSize, _end);
+ _bitWord = 0;
+ continue;
+ }
+
+ return true;
+ }
+ else {
+ size_t j = Support::ctz(_bitWord);
+ *rangeEnd = Support::min(_idx + j, _end);
+
+ _bitWord = ~(_bitWord ^ ~(Support::allOnes<T>() << j));
+ return true;
+ }
+ }
};
-// ============================================================================
-// [asmjit::JitAllocator - Pool]
-// ============================================================================
+// JitAllocator - Pool
+// ===================
class JitAllocatorBlock;
@@ -152,6 +143,27 @@ class JitAllocatorPool {
public:
ASMJIT_NONCOPYABLE(JitAllocatorPool)
+ //! Double linked list of blocks.
+ ZoneList<JitAllocatorBlock> blocks;
+ //! Where to start looking first.
+ JitAllocatorBlock* cursor;
+
+ //! Count of blocks.
+ uint32_t blockCount;
+ //! Allocation granularity.
+ uint16_t granularity;
+ //! Log2(granularity).
+ uint8_t granularityLog2;
+ //! Count of empty blocks (either 0 or 1 as we won't keep more blocks empty).
+ uint8_t emptyBlockCount;
+
+ //! Number of bits reserved across all blocks.
+ size_t totalAreaSize;
+ //! Number of bits used across all blocks.
+ size_t totalAreaUsed;
+ //! Overhead of all blocks (in bytes).
+ size_t totalOverheadBytes;
+
inline JitAllocatorPool(uint32_t granularity) noexcept
: blocks(),
cursor(nullptr),
@@ -179,32 +191,10 @@ public:
using namespace Support;
return alignUp<size_t>(areaSize, kBitWordSizeInBits) / kBitWordSizeInBits;
}
-
- //! Double linked list of blocks.
- ZoneList<JitAllocatorBlock> blocks;
- //! Where to start looking first.
- JitAllocatorBlock* cursor;
-
- //! Count of blocks.
- uint32_t blockCount;
- //! Allocation granularity.
- uint16_t granularity;
- //! Log2(granularity).
- uint8_t granularityLog2;
- //! Count of empty blocks (either 0 or 1 as we won't keep more blocks empty).
- uint8_t emptyBlockCount;
-
- //! Number of bits reserved across all blocks.
- size_t totalAreaSize;
- //! Number of bits used across all blocks.
- size_t totalAreaUsed;
- //! Overhead of all blocks (in bytes).
- size_t totalOverheadBytes;
};
-// ============================================================================
-// [asmjit::JitAllocator - Block]
-// ============================================================================
+// JitAllocator - Block
+// ====================
class JitAllocatorBlock : public ZoneTreeNodeT<JitAllocatorBlock>,
public ZoneListNode<JitAllocatorBlock> {
@@ -220,6 +210,32 @@ public:
kFlagDualMapped = 0x00000004u
};
+ //! Link to the pool that owns this block.
+ JitAllocatorPool* _pool;
+ //! Virtual memory mapping - either single mapping (both pointers equal) or
+ //! dual mapping, where one pointer is Read+Execute and the second Read+Write.
+ VirtMem::DualMapping _mapping;
+ //! Virtual memory size (block size) [bytes].
+ size_t _blockSize;
+
+ //! Block flags.
+ uint32_t _flags;
+ //! Size of the whole block area (bit-vector size).
+ uint32_t _areaSize;
+ //! Used area (number of bits in bit-vector used).
+ uint32_t _areaUsed;
+ //! The largest unused continuous area in the bit-vector (or `areaSize` to initiate rescan).
+ uint32_t _largestUnusedArea;
+ //! Start of a search range (for unused bits).
+ uint32_t _searchStart;
+ //! End of a search range (for unused bits).
+ uint32_t _searchEnd;
+
+ //! Used bit-vector (0 = unused, 1 = used).
+ Support::BitWord* _usedBitVector;
+ //! Stop bit-vector (0 = don't care, 1 = stop).
+ Support::BitWord* _stopBitVector;
+
inline JitAllocatorBlock(
JitAllocatorPool* pool,
VirtMem::DualMapping mapping,
@@ -229,88 +245,135 @@ public:
Support::BitWord* stopBitVector,
uint32_t areaSize) noexcept
: ZoneTreeNodeT(),
- pool(pool),
- mapping(mapping),
- blockSize(blockSize),
- flags(blockFlags),
- areaSize(areaSize),
- areaUsed(0),
- largestUnusedArea(areaSize),
- searchStart(0),
- searchEnd(areaSize),
- usedBitVector(usedBitVector),
- stopBitVector(stopBitVector) {}
-
- inline uint8_t* roPtr() const noexcept { return static_cast<uint8_t*>(mapping.ro); }
- inline uint8_t* rwPtr() const noexcept { return static_cast<uint8_t*>(mapping.rw); }
-
- inline bool hasFlag(uint32_t f) const noexcept { return (flags & f) != 0; }
- inline void addFlags(uint32_t f) noexcept { flags |= f; }
- inline void clearFlags(uint32_t f) noexcept { flags &= ~f; }
-
- inline uint32_t areaAvailable() const noexcept { return areaSize - areaUsed; }
-
- inline void increaseUsedArea(uint32_t value) noexcept {
- areaUsed += value;
- pool->totalAreaUsed += value;
- }
+ _pool(pool),
+ _mapping(mapping),
+ _blockSize(blockSize),
+ _flags(blockFlags),
+ _areaSize(areaSize),
+ _areaUsed(0),
+ _largestUnusedArea(areaSize),
+ _searchStart(0),
+ _searchEnd(areaSize),
+ _usedBitVector(usedBitVector),
+ _stopBitVector(stopBitVector) {}
+
+ inline JitAllocatorPool* pool() const noexcept { return _pool; }
+
+ inline uint8_t* rxPtr() const noexcept { return static_cast<uint8_t*>(_mapping.rx); }
+ inline uint8_t* rwPtr() const noexcept { return static_cast<uint8_t*>(_mapping.rw); }
+
+ inline bool hasFlag(uint32_t f) const noexcept { return (_flags & f) != 0; }
+ inline void addFlags(uint32_t f) noexcept { _flags |= f; }
+ inline void clearFlags(uint32_t f) noexcept { _flags &= ~f; }
+
+ inline bool isDirty() const noexcept { return hasFlag(kFlagDirty); }
+ inline void makeDirty() noexcept { addFlags(kFlagDirty); }
+
+ inline size_t blockSize() const noexcept { return _blockSize; }
+
+ inline uint32_t areaSize() const noexcept { return _areaSize; }
+ inline uint32_t areaUsed() const noexcept { return _areaUsed; }
+ inline uint32_t areaAvailable() const noexcept { return _areaSize - _areaUsed; }
+ inline uint32_t largestUnusedArea() const noexcept { return _largestUnusedArea; }
inline void decreaseUsedArea(uint32_t value) noexcept {
- areaUsed -= value;
- pool->totalAreaUsed -= value;
+ _areaUsed -= value;
+ _pool->totalAreaUsed -= value;
}
- // RBTree default CMP uses '<' and '>' operators.
- inline bool operator<(const JitAllocatorBlock& other) const noexcept { return roPtr() < other.roPtr(); }
- inline bool operator>(const JitAllocatorBlock& other) const noexcept { return roPtr() > other.roPtr(); }
+ inline void markAllocatedArea(uint32_t allocatedAreaStart, uint32_t allocatedAreaEnd) noexcept {
+ uint32_t allocatedAreaSize = allocatedAreaEnd - allocatedAreaStart;
- // Special implementation for querying blocks by `key`, which must be in `[BlockPtr, BlockPtr + BlockSize)` range.
- inline bool operator<(const uint8_t* key) const noexcept { return roPtr() + blockSize <= key; }
- inline bool operator>(const uint8_t* key) const noexcept { return roPtr() > key; }
+ // Mark the newly allocated space as occupied and also the sentinel.
+ Support::bitVectorFill(_usedBitVector, allocatedAreaStart, allocatedAreaSize);
+ Support::bitVectorSetBit(_stopBitVector, allocatedAreaEnd - 1, true);
- //! Link to the pool that owns this block.
- JitAllocatorPool* pool;
- //! Virtual memory mapping - either single mapping (both pointers equal) or
- //! dual mapping, where one pointer is Read+Execute and the second Read+Write.
- VirtMem::DualMapping mapping;
- //! Virtual memory size (block size) [bytes].
- size_t blockSize;
+ // Update search region and statistics.
+ _pool->totalAreaUsed += allocatedAreaSize;
+ _areaUsed += allocatedAreaSize;
- //! Block flags.
- uint32_t flags;
- //! Size of the whole block area (bit-vector size).
- uint32_t areaSize;
- //! Used area (number of bits in bit-vector used).
- uint32_t areaUsed;
- //! The largest unused continuous area in the bit-vector (or `areaSize` to initiate rescan).
- uint32_t largestUnusedArea;
- //! Start of a search range (for unused bits).
- uint32_t searchStart;
- //! End of a search range (for unused bits).
- uint32_t searchEnd;
+ if (areaAvailable() == 0) {
+ _searchStart = _areaSize;
+ _searchEnd = 0;
+ _largestUnusedArea = 0;
+ clearFlags(kFlagDirty);
+ }
+ else {
+ if (_searchStart == allocatedAreaStart)
+ _searchStart = allocatedAreaEnd;
+ if (_searchEnd == allocatedAreaEnd)
+ _searchEnd = allocatedAreaStart;
+ addFlags(kFlagDirty);
+ }
+ }
- //! Used bit-vector (0 = unused, 1 = used).
- Support::BitWord* usedBitVector;
- //! Stop bit-vector (0 = don't care, 1 = stop).
- Support::BitWord* stopBitVector;
+ inline void markReleasedArea(uint32_t releasedAreaStart, uint32_t releasedAreaEnd) noexcept {
+ uint32_t releasedAreaSize = releasedAreaEnd - releasedAreaStart;
+
+ // Update the search region and statistics.
+ _pool->totalAreaUsed -= releasedAreaSize;
+ _areaUsed -= releasedAreaSize;
+ _searchStart = Support::min(_searchStart, releasedAreaStart);
+ _searchEnd = Support::max(_searchEnd, releasedAreaEnd);
+
+ // Unmark occupied bits and also the sentinel.
+ Support::bitVectorClear(_usedBitVector, releasedAreaStart, releasedAreaSize);
+ Support::bitVectorSetBit(_stopBitVector, releasedAreaEnd - 1, false);
+
+ if (areaUsed() == 0) {
+ _searchStart = 0;
+ _searchEnd = _areaSize;
+ _largestUnusedArea = _areaSize;
+ addFlags(kFlagEmpty);
+ clearFlags(kFlagDirty);
+ }
+ else {
+ addFlags(kFlagDirty);
+ }
+ }
+
+ inline void markShrunkArea(uint32_t shrunkAreaStart, uint32_t shrunkAreaEnd) noexcept {
+ uint32_t shrunkAreaSize = shrunkAreaEnd - shrunkAreaStart;
+
+ // Shrunk area cannot start at zero as it would mean that we have shrunk the first
+ // block to zero bytes, which is not allowed as such block must be released instead.
+ ASMJIT_ASSERT(shrunkAreaStart != 0);
+ ASMJIT_ASSERT(shrunkAreaSize != 0);
+
+ // Update the search region and statistics.
+ _pool->totalAreaUsed -= shrunkAreaSize;
+ _areaUsed -= shrunkAreaSize;
+ _searchStart = Support::min(_searchStart, shrunkAreaStart);
+ _searchEnd = Support::max(_searchEnd, shrunkAreaEnd);
+
+ // Unmark the released space and move the sentinel.
+ Support::bitVectorClear(_usedBitVector, shrunkAreaStart, shrunkAreaSize);
+ Support::bitVectorSetBit(_stopBitVector, shrunkAreaEnd - 1, false);
+ Support::bitVectorSetBit(_stopBitVector, shrunkAreaStart - 1, true);
+
+ addFlags(kFlagDirty);
+ }
+
+ // RBTree default CMP uses '<' and '>' operators.
+ inline bool operator<(const JitAllocatorBlock& other) const noexcept { return rxPtr() < other.rxPtr(); }
+ inline bool operator>(const JitAllocatorBlock& other) const noexcept { return rxPtr() > other.rxPtr(); }
+
+ // Special implementation for querying blocks by `key`, which must be in `[BlockPtr, BlockPtr + BlockSize)` range.
+ inline bool operator<(const uint8_t* key) const noexcept { return rxPtr() + _blockSize <= key; }
+ inline bool operator>(const uint8_t* key) const noexcept { return rxPtr() > key; }
};
-// ============================================================================
-// [asmjit::JitAllocator - PrivateImpl]
-// ============================================================================
+// JitAllocator - PrivateImpl
+// ==========================
class JitAllocatorPrivateImpl : public JitAllocator::Impl {
public:
- inline JitAllocatorPrivateImpl(JitAllocatorPool* pools, size_t poolCount) noexcept
- : JitAllocator::Impl {},
- pools(pools),
- poolCount(poolCount) {}
- inline ~JitAllocatorPrivateImpl() noexcept {}
-
//! Lock for thread safety.
mutable Lock lock;
//! System page size (also a minimum block size).
uint32_t pageSize;
+ //! Number of active allocations.
+ size_t allocationCount;
//! Blocks from all pools in RBTree.
ZoneTree<JitAllocatorBlock> tree;
@@ -318,14 +381,21 @@ public:
JitAllocatorPool* pools;
//! Number of allocator pools.
size_t poolCount;
+
+ inline JitAllocatorPrivateImpl(JitAllocatorPool* pools, size_t poolCount) noexcept
+ : JitAllocator::Impl {},
+ pageSize(0),
+ allocationCount(0),
+ pools(pools),
+ poolCount(poolCount) {}
+ inline ~JitAllocatorPrivateImpl() noexcept {}
};
static const JitAllocator::Impl JitAllocatorImpl_none {};
static const JitAllocator::CreateParams JitAllocatorParams_none {};
-// ============================================================================
-// [asmjit::JitAllocator - Utilities]
-// ============================================================================
+// JitAllocator - Utilities
+// ========================
static inline JitAllocatorPrivateImpl* JitAllocatorImpl_new(const JitAllocator::CreateParams* params) noexcept {
VirtMem::Info vmInfo = VirtMem::info();
@@ -333,14 +403,14 @@ static inline JitAllocatorPrivateImpl* JitAllocatorImpl_new(const JitAllocator::
if (!params)
params = &JitAllocatorParams_none;
- uint32_t options = params->options;
+ JitAllocatorOptions options = params->options;
uint32_t blockSize = params->blockSize;
uint32_t granularity = params->granularity;
uint32_t fillPattern = params->fillPattern;
// Setup pool count to [1..3].
size_t poolCount = 1;
- if (options & JitAllocator::kOptionUseMultiplePools)
+ if (Support::test(options, JitAllocatorOptions::kUseMultiplePools))
poolCount = kJitAllocatorMultiPoolCount;;
// Setup block size [64kB..256MB].
@@ -352,7 +422,7 @@ static inline JitAllocatorPrivateImpl* JitAllocatorImpl_new(const JitAllocator::
granularity = kJitAllocatorBaseGranularity;
// Setup fill-pattern.
- if (!(options & JitAllocator::kOptionCustomFillPattern))
+ if (uint32_t(options & JitAllocatorOptions::kCustomFillPattern) == 0)
fillPattern = JitAllocator_defaultFillPattern();
size_t size = sizeof(JitAllocatorPrivateImpl) + sizeof(JitAllocatorPool) * poolCount;
@@ -401,7 +471,7 @@ static inline size_t JitAllocatorImpl_bitVectorSizeToByteSize(uint32_t areaSize)
static inline size_t JitAllocatorImpl_calculateIdealBlockSize(JitAllocatorPrivateImpl* impl, JitAllocatorPool* pool, size_t allocationSize) noexcept {
JitAllocatorBlock* last = pool->blocks.last();
- size_t blockSize = last ? last->blockSize : size_t(impl->blockSize);
+ size_t blockSize = last ? last->blockSize() : size_t(impl->blockSize);
if (blockSize < kJitAllocatorMaxBlockSize)
blockSize *= 2u;
@@ -444,26 +514,32 @@ static JitAllocatorBlock* JitAllocatorImpl_newBlock(JitAllocatorPrivateImpl* imp
uint32_t blockFlags = 0;
if (bitWords != nullptr) {
- if (impl->options & JitAllocator::kOptionUseDualMapping) {
- err = VirtMem::allocDualMapping(&virtMem, blockSize, VirtMem::kAccessReadWrite | VirtMem::kAccessExecute);
+ if (Support::test(impl->options, JitAllocatorOptions::kUseDualMapping)) {
+ err = VirtMem::allocDualMapping(&virtMem, blockSize, VirtMem::MemoryFlags::kAccessRWX);
blockFlags |= JitAllocatorBlock::kFlagDualMapped;
}
else {
- err = VirtMem::alloc(&virtMem.ro, blockSize, VirtMem::kAccessReadWrite | VirtMem::kAccessExecute);
- virtMem.rw = virtMem.ro;
+ err = VirtMem::alloc(&virtMem.rx, blockSize, VirtMem::MemoryFlags::kAccessRWX);
+ virtMem.rw = virtMem.rx;
}
}
// Out of memory.
if (ASMJIT_UNLIKELY(!block || !bitWords || err != kErrorOk)) {
- if (bitWords) ::free(bitWords);
- if (block) ::free(block);
+ if (bitWords)
+ ::free(bitWords);
+
+ if (block)
+ ::free(block);
+
return nullptr;
}
// Fill the memory if the secure mode is enabled.
- if (impl->options & JitAllocator::kOptionFillUnusedMemory)
+ if (Support::test(impl->options, JitAllocatorOptions::kFillUnusedMemory)) {
+ VirtMem::ProtectJitReadWriteScope scope(virtMem.rw, blockSize);
JitAllocatorImpl_fillPattern(virtMem.rw, impl->fillPattern, blockSize);
+ }
memset(bitWords, 0, size_t(numBitWords) * 2 * sizeof(BitWord));
return new(block) JitAllocatorBlock(pool, virtMem, blockSize, blockFlags, bitWords, bitWords + numBitWords, areaSize);
@@ -472,17 +548,17 @@ static JitAllocatorBlock* JitAllocatorImpl_newBlock(JitAllocatorPrivateImpl* imp
static void JitAllocatorImpl_deleteBlock(JitAllocatorPrivateImpl* impl, JitAllocatorBlock* block) noexcept {
DebugUtils::unused(impl);
- if (block->flags & JitAllocatorBlock::kFlagDualMapped)
- VirtMem::releaseDualMapping(&block->mapping, block->blockSize);
+ if (block->hasFlag(JitAllocatorBlock::kFlagDualMapped))
+ VirtMem::releaseDualMapping(&block->_mapping, block->blockSize());
else
- VirtMem::release(block->mapping.ro, block->blockSize);
+ VirtMem::release(block->rxPtr(), block->blockSize());
- ::free(block->usedBitVector);
+ ::free(block->_usedBitVector);
::free(block);
}
static void JitAllocatorImpl_insertBlock(JitAllocatorPrivateImpl* impl, JitAllocatorBlock* block) noexcept {
- JitAllocatorPool* pool = block->pool;
+ JitAllocatorPool* pool = block->pool();
if (!pool->cursor)
pool->cursor = block;
@@ -493,12 +569,12 @@ static void JitAllocatorImpl_insertBlock(JitAllocatorPrivateImpl* impl, JitAlloc
// Update statistics.
pool->blockCount++;
- pool->totalAreaSize += block->areaSize;
- pool->totalOverheadBytes += sizeof(JitAllocatorBlock) + JitAllocatorImpl_bitVectorSizeToByteSize(block->areaSize) * 2u;
+ pool->totalAreaSize += block->areaSize();
+ pool->totalOverheadBytes += sizeof(JitAllocatorBlock) + JitAllocatorImpl_bitVectorSizeToByteSize(block->areaSize()) * 2u;
}
static void JitAllocatorImpl_removeBlock(JitAllocatorPrivateImpl* impl, JitAllocatorBlock* block) noexcept {
- JitAllocatorPool* pool = block->pool;
+ JitAllocatorPool* pool = block->pool();
// Remove from RBTree and List.
if (pool->cursor == block)
@@ -509,48 +585,50 @@ static void JitAllocatorImpl_removeBlock(JitAllocatorPrivateImpl* impl, JitAlloc
// Update statistics.
pool->blockCount--;
- pool->totalAreaSize -= block->areaSize;
- pool->totalOverheadBytes -= sizeof(JitAllocatorBlock) + JitAllocatorImpl_bitVectorSizeToByteSize(block->areaSize) * 2u;
+ pool->totalAreaSize -= block->areaSize();
+ pool->totalOverheadBytes -= sizeof(JitAllocatorBlock) + JitAllocatorImpl_bitVectorSizeToByteSize(block->areaSize()) * 2u;
}
static void JitAllocatorImpl_wipeOutBlock(JitAllocatorPrivateImpl* impl, JitAllocatorBlock* block) noexcept {
- JitAllocatorPool* pool = block->pool;
-
if (block->hasFlag(JitAllocatorBlock::kFlagEmpty))
return;
- uint32_t areaSize = block->areaSize;
+ JitAllocatorPool* pool = block->pool();
+ uint32_t areaSize = block->areaSize();
uint32_t granularity = pool->granularity;
size_t numBitWords = pool->bitWordCountFromAreaSize(areaSize);
- if (impl->options & JitAllocator::kOptionFillUnusedMemory) {
- BitFlipIterator<Support::BitWord> it(block->usedBitVector, numBitWords);
+ VirtMem::protectJitMemory(VirtMem::ProtectJitAccess::kReadWrite);
+ if (Support::test(impl->options, JitAllocatorOptions::kFillUnusedMemory)) {
+ uint8_t* rwPtr = block->rwPtr();
+ BitVectorRangeIterator<Support::BitWord, 0> it(block->_usedBitVector, pool->bitWordCountFromAreaSize(block->areaSize()));
- while (it.hasNext()) {
- uint32_t start = uint32_t(it.nextAndFlip());
- uint32_t end = areaSize;
+ size_t rangeStart;
+ size_t rangeEnd;
- if (it.hasNext())
- end = uint32_t(it.nextAndFlip());
+ while (it.nextRange(&rangeStart, &rangeEnd)) {
+ uint8_t* spanPtr = rwPtr + rangeStart * granularity;
+ size_t spanSize = (rangeEnd - rangeStart) * granularity;
- JitAllocatorImpl_fillPattern(block->rwPtr() + start * granularity, impl->fillPattern, (end - start) * granularity);
+ JitAllocatorImpl_fillPattern(spanPtr, impl->fillPattern, spanSize);
+ VirtMem::flushInstructionCache(spanPtr, spanSize);
}
}
+ VirtMem::protectJitMemory(VirtMem::ProtectJitAccess::kReadExecute);
- memset(block->usedBitVector, 0, size_t(numBitWords) * sizeof(Support::BitWord));
- memset(block->stopBitVector, 0, size_t(numBitWords) * sizeof(Support::BitWord));
+ memset(block->_usedBitVector, 0, size_t(numBitWords) * sizeof(Support::BitWord));
+ memset(block->_stopBitVector, 0, size_t(numBitWords) * sizeof(Support::BitWord));
- block->areaUsed = 0;
- block->largestUnusedArea = areaSize;
- block->searchStart = 0;
- block->searchEnd = areaSize;
+ block->_areaUsed = 0;
+ block->_largestUnusedArea = areaSize;
+ block->_searchStart = 0;
+ block->_searchEnd = areaSize;
block->addFlags(JitAllocatorBlock::kFlagEmpty);
block->clearFlags(JitAllocatorBlock::kFlagDirty);
}
-// ============================================================================
-// [asmjit::JitAllocator - Construction / Destruction]
-// ============================================================================
+// JitAllocator - Construction & Destruction
+// =========================================
JitAllocator::JitAllocator(const CreateParams* params) noexcept {
_impl = JitAllocatorImpl_new(params);
@@ -562,15 +640,14 @@ JitAllocator::~JitAllocator() noexcept {
if (_impl == &JitAllocatorImpl_none)
return;
- reset(Globals::kResetHard);
+ reset(ResetPolicy::kHard);
JitAllocatorImpl_destroy(static_cast<JitAllocatorPrivateImpl*>(_impl));
}
-// ============================================================================
-// [asmjit::JitAllocator - Reset]
-// ============================================================================
+// JitAllocator - Reset
+// ====================
-void JitAllocator::reset(uint32_t resetPolicy) noexcept {
+void JitAllocator::reset(ResetPolicy resetPolicy) noexcept {
if (_impl == &JitAllocatorImpl_none)
return;
@@ -583,7 +660,7 @@ void JitAllocator::reset(uint32_t resetPolicy) noexcept {
JitAllocatorBlock* block = pool.blocks.first();
JitAllocatorBlock* blockToKeep = nullptr;
- if (resetPolicy != Globals::kResetHard && !(impl->options & kOptionImmediateRelease)) {
+ if (resetPolicy != ResetPolicy::kHard && uint32_t(impl->options & JitAllocatorOptions::kImmediateRelease) == 0) {
blockToKeep = block;
block = block->next();
}
@@ -606,9 +683,8 @@ void JitAllocator::reset(uint32_t resetPolicy) noexcept {
}
}
-// ============================================================================
-// [asmjit::JitAllocator - Statistics]
-// ============================================================================
+// JitAllocator - Statistics
+// =========================
JitAllocator::Statistics JitAllocator::statistics() const noexcept {
Statistics statistics;
@@ -626,23 +702,24 @@ JitAllocator::Statistics JitAllocator::statistics() const noexcept {
statistics._usedSize += size_t(pool.totalAreaUsed) * pool.granularity;
statistics._overheadSize += size_t(pool.totalOverheadBytes);
}
+
+ statistics._allocationCount = impl->allocationCount;
}
return statistics;
}
-// ============================================================================
-// [asmjit::JitAllocator - Alloc / Release]
-// ============================================================================
+// JitAllocator - Alloc & Release
+// ==============================
-Error JitAllocator::alloc(void** roPtrOut, void** rwPtrOut, size_t size) noexcept {
+Error JitAllocator::alloc(void** rxPtrOut, void** rwPtrOut, size_t size) noexcept {
if (ASMJIT_UNLIKELY(_impl == &JitAllocatorImpl_none))
return DebugUtils::errored(kErrorNotInitialized);
JitAllocatorPrivateImpl* impl = static_cast<JitAllocatorPrivateImpl*>(_impl);
constexpr uint32_t kNoIndex = std::numeric_limits<uint32_t>::max();
- *roPtrOut = nullptr;
+ *rxPtrOut = nullptr;
*rwPtrOut = nullptr;
// Align to the minimum granularity by default.
@@ -666,55 +743,38 @@ Error JitAllocator::alloc(void** roPtrOut, void** rwPtrOut, size_t size) noexcep
do {
JitAllocatorBlock* next = block->hasNext() ? block->next() : pool->blocks.first();
if (block->areaAvailable() >= areaSize) {
- if (block->hasFlag(JitAllocatorBlock::kFlagDirty) || block->largestUnusedArea >= areaSize) {
- uint32_t blockAreaSize = block->areaSize;
- uint32_t searchStart = block->searchStart;
- uint32_t searchEnd = block->searchEnd;
-
- BitFlipIterator<Support::BitWord> it(
- block->usedBitVector,
- pool->bitWordCountFromAreaSize(searchEnd),
- searchStart,
- Support::allOnes<Support::BitWord>());
-
- // If there is unused area available then there has to be at least one match.
- ASMJIT_ASSERT(it.hasNext());
-
- uint32_t bestArea = blockAreaSize;
- uint32_t largestArea = 0;
- uint32_t holeIndex = uint32_t(it.peekNext());
- uint32_t holeEnd = holeIndex;
-
- searchStart = holeIndex;
- do {
- holeIndex = uint32_t(it.nextAndFlip());
- if (holeIndex >= searchEnd) break;
-
- holeEnd = it.hasNext() ? Support::min(searchEnd, uint32_t(it.nextAndFlip())) : searchEnd;
- uint32_t holeSize = holeEnd - holeIndex;
-
- if (holeSize >= areaSize && bestArea >= holeSize) {
- largestArea = Support::max(largestArea, bestArea);
- bestArea = holeSize;
- areaIndex = holeIndex;
- }
- else {
- largestArea = Support::max(largestArea, holeSize);
+ if (block->isDirty() || block->largestUnusedArea() >= areaSize) {
+ BitVectorRangeIterator<Support::BitWord, 0> it(block->_usedBitVector, pool->bitWordCountFromAreaSize(block->areaSize()), block->_searchStart, block->_searchEnd);
+
+ size_t rangeStart = 0;
+ size_t rangeEnd = block->areaSize();
+
+ size_t searchStart = SIZE_MAX;
+ size_t largestArea = 0;
+
+ while (it.nextRange(&rangeStart, &rangeEnd, areaSize)) {
+ size_t rangeSize = rangeEnd - rangeStart;
+ if (rangeSize >= areaSize) {
+ areaIndex = uint32_t(rangeStart);
+ break;
}
- } while (it.hasNext());
- searchEnd = holeEnd;
-
- // Because we have traversed the entire block, we can now mark the
- // largest unused area that can be used to cache the next traversal.
- block->searchStart = searchStart;
- block->searchEnd = searchEnd;
- block->largestUnusedArea = largestArea;
- block->clearFlags(JitAllocatorBlock::kFlagDirty);
-
- if (areaIndex != kNoIndex) {
- if (searchStart == areaIndex)
- block->searchStart += areaSize;
+
+ searchStart = Support::min(searchStart, rangeStart);
+ largestArea = Support::max(largestArea, rangeSize);
+ }
+
+ if (areaIndex != kNoIndex)
break;
+
+ if (searchStart != SIZE_MAX) {
+ // Because we have iterated over the entire block, we can now mark the
+ // largest unused area that can be used to cache the next traversal.
+ size_t searchEnd = rangeEnd;
+
+ block->_searchStart = uint32_t(searchStart);
+ block->_searchEnd = uint32_t(searchEnd);
+ block->_largestUnusedArea = uint32_t(largestArea);
+ block->clearFlags(JitAllocatorBlock::kFlagDirty);
}
}
}
@@ -730,159 +790,127 @@ Error JitAllocator::alloc(void** roPtrOut, void** rwPtrOut, size_t size) noexcep
return DebugUtils::errored(kErrorOutOfMemory);
block = JitAllocatorImpl_newBlock(impl, pool, blockSize);
+ areaIndex = 0;
if (ASMJIT_UNLIKELY(!block))
return DebugUtils::errored(kErrorOutOfMemory);
JitAllocatorImpl_insertBlock(impl, block);
- areaIndex = 0;
- block->searchStart = areaSize;
- block->largestUnusedArea = block->areaSize - areaSize;
+ block->_searchStart = areaSize;
+ block->_largestUnusedArea = block->areaSize() - areaSize;
}
-
- // Update statistics.
- block->increaseUsedArea(areaSize);
-
- // Handle special cases.
- if (block->hasFlag(JitAllocatorBlock::kFlagEmpty)) {
+ else if (block->hasFlag(JitAllocatorBlock::kFlagEmpty)) {
pool->emptyBlockCount--;
block->clearFlags(JitAllocatorBlock::kFlagEmpty);
}
- if (block->areaAvailable() == 0) {
- // The whole block is filled.
- block->searchStart = block->areaSize;
- block->searchEnd = 0;
- block->largestUnusedArea = 0;
- block->clearFlags(JitAllocatorBlock::kFlagDirty);
- }
-
- // Mark the newly allocated space as occupied and also the sentinel.
- Support::bitVectorFill(block->usedBitVector, areaIndex, areaSize);
- Support::bitVectorSetBit(block->stopBitVector, areaIndex + areaSize - 1, true);
+ // Update statistics.
+ impl->allocationCount++;
+ block->markAllocatedArea(areaIndex, areaIndex + areaSize);
// Return a pointer to the allocated memory.
size_t offset = pool->byteSizeFromAreaSize(areaIndex);
- ASMJIT_ASSERT(offset <= block->blockSize - size);
+ ASMJIT_ASSERT(offset <= block->blockSize() - size);
- *roPtrOut = block->roPtr() + offset;
+ *rxPtrOut = block->rxPtr() + offset;
*rwPtrOut = block->rwPtr() + offset;
return kErrorOk;
}
-Error JitAllocator::release(void* ro) noexcept {
+Error JitAllocator::release(void* rxPtr) noexcept {
if (ASMJIT_UNLIKELY(_impl == &JitAllocatorImpl_none))
return DebugUtils::errored(kErrorNotInitialized);
- if (ASMJIT_UNLIKELY(!ro))
+ if (ASMJIT_UNLIKELY(!rxPtr))
return DebugUtils::errored(kErrorInvalidArgument);
JitAllocatorPrivateImpl* impl = static_cast<JitAllocatorPrivateImpl*>(_impl);
LockGuard guard(impl->lock);
- JitAllocatorBlock* block = impl->tree.get(static_cast<uint8_t*>(ro));
+ JitAllocatorBlock* block = impl->tree.get(static_cast<uint8_t*>(rxPtr));
if (ASMJIT_UNLIKELY(!block))
return DebugUtils::errored(kErrorInvalidState);
// Offset relative to the start of the block.
- JitAllocatorPool* pool = block->pool;
- size_t offset = (size_t)((uint8_t*)ro - block->roPtr());
+ JitAllocatorPool* pool = block->pool();
+ size_t offset = (size_t)((uint8_t*)rxPtr - block->rxPtr());
// The first bit representing the allocated area and its size.
uint32_t areaIndex = uint32_t(offset >> pool->granularityLog2);
- uint32_t areaLast = uint32_t(Support::bitVectorIndexOf(block->stopBitVector, areaIndex, true));
- uint32_t areaSize = areaLast - areaIndex + 1;
+ uint32_t areaEnd = uint32_t(Support::bitVectorIndexOf(block->_stopBitVector, areaIndex, true)) + 1;
+ uint32_t areaSize = areaEnd - areaIndex;
- // Update the search region and statistics.
- block->searchStart = Support::min(block->searchStart, areaIndex);
- block->searchEnd = Support::max(block->searchEnd, areaLast + 1);
- block->addFlags(JitAllocatorBlock::kFlagDirty);
- block->decreaseUsedArea(areaSize);
-
- // Clear all occupied bits and also the sentinel.
- Support::bitVectorClear(block->usedBitVector, areaIndex, areaSize);
- Support::bitVectorSetBit(block->stopBitVector, areaLast, false);
+ impl->allocationCount--;
+ block->markReleasedArea(areaIndex, areaEnd);
// Fill the released memory if the secure mode is enabled.
- if (impl->options & kOptionFillUnusedMemory)
- JitAllocatorImpl_fillPattern(block->rwPtr() + areaIndex * pool->granularity, impl->fillPattern, areaSize * pool->granularity);
+ if (Support::test(impl->options, JitAllocatorOptions::kFillUnusedMemory)) {
+ uint8_t* spanPtr = block->rwPtr() + areaIndex * pool->granularity;
+ size_t spanSize = areaSize * pool->granularity;
+
+ VirtMem::ProtectJitReadWriteScope scope(spanPtr, spanSize);
+ JitAllocatorImpl_fillPattern(spanPtr, impl->fillPattern, spanSize);
+ }
// Release the whole block if it became empty.
- if (block->areaUsed == 0) {
- if (pool->emptyBlockCount || (impl->options & kOptionImmediateRelease)) {
+ if (block->areaUsed() == 0) {
+ if (pool->emptyBlockCount || Support::test(impl->options, JitAllocatorOptions::kImmediateRelease)) {
JitAllocatorImpl_removeBlock(impl, block);
JitAllocatorImpl_deleteBlock(impl, block);
}
else {
pool->emptyBlockCount++;
- block->largestUnusedArea = areaSize;
- block->searchStart = 0;
- block->searchEnd = areaSize;
- block->addFlags(JitAllocatorBlock::kFlagEmpty);
- block->clearFlags(JitAllocatorBlock::kFlagDirty);
}
}
return kErrorOk;
}
-Error JitAllocator::shrink(void* ro, size_t newSize) noexcept {
+Error JitAllocator::shrink(void* rxPtr, size_t newSize) noexcept {
if (ASMJIT_UNLIKELY(_impl == &JitAllocatorImpl_none))
return DebugUtils::errored(kErrorNotInitialized);
- if (ASMJIT_UNLIKELY(!ro))
+ if (ASMJIT_UNLIKELY(!rxPtr))
return DebugUtils::errored(kErrorInvalidArgument);
if (ASMJIT_UNLIKELY(newSize == 0))
- return release(ro);
+ return release(rxPtr);
JitAllocatorPrivateImpl* impl = static_cast<JitAllocatorPrivateImpl*>(_impl);
LockGuard guard(impl->lock);
- JitAllocatorBlock* block = impl->tree.get(static_cast<uint8_t*>(ro));
+ JitAllocatorBlock* block = impl->tree.get(static_cast<uint8_t*>(rxPtr));
if (ASMJIT_UNLIKELY(!block))
return DebugUtils::errored(kErrorInvalidArgument);
// Offset relative to the start of the block.
- JitAllocatorPool* pool = block->pool;
- size_t offset = (size_t)((uint8_t*)ro - block->roPtr());
+ JitAllocatorPool* pool = block->pool();
+ size_t offset = (size_t)((uint8_t*)rxPtr - block->rxPtr());
// The first bit representing the allocated area and its size.
- uint32_t areaIndex = uint32_t(offset >> pool->granularityLog2);
- uint32_t areaOldSize = uint32_t(Support::bitVectorIndexOf(block->stopBitVector, areaIndex, true)) + 1 - areaIndex;
- uint32_t areaNewSize = pool->areaSizeFromByteSize(newSize);
-
- if (ASMJIT_UNLIKELY(areaNewSize > areaOldSize))
- return DebugUtils::errored(kErrorInvalidState);
+ uint32_t areaStart = uint32_t(offset >> pool->granularityLog2);
+ uint32_t areaEnd = uint32_t(Support::bitVectorIndexOf(block->_stopBitVector, areaStart, true)) + 1;
- uint32_t areaDiff = areaOldSize - areaNewSize;
- if (!areaDiff)
- return kErrorOk;
+ uint32_t areaPrevSize = areaEnd - areaStart;
+ uint32_t areaShrunkSize = pool->areaSizeFromByteSize(newSize);
- // Update the search region and statistics.
- block->searchStart = Support::min(block->searchStart, areaIndex + areaNewSize);
- block->searchEnd = Support::max(block->searchEnd, areaIndex + areaOldSize);
- block->addFlags(JitAllocatorBlock::kFlagDirty);
- block->decreaseUsedArea(areaDiff);
+ if (ASMJIT_UNLIKELY(areaShrunkSize > areaPrevSize))
+ return DebugUtils::errored(kErrorInvalidState);
- // Unmark the released space and move the sentinel.
- Support::bitVectorClear(block->usedBitVector, areaIndex + areaNewSize, areaDiff);
- Support::bitVectorSetBit(block->stopBitVector, areaIndex + areaOldSize - 1, false);
- Support::bitVectorSetBit(block->stopBitVector, areaIndex + areaNewSize - 1, true);
+ uint32_t areaDiff = areaPrevSize - areaShrunkSize;
+ if (areaDiff) {
+ block->markShrunkArea(areaStart + areaShrunkSize, areaEnd);
- // Fill released memory if the secure mode is enabled.
- if (impl->options & kOptionFillUnusedMemory)
- JitAllocatorImpl_fillPattern(
- block->rwPtr() + (areaIndex + areaOldSize) * pool->granularity,
- fillPattern(),
- areaDiff * pool->granularity);
+ // Fill released memory if the secure mode is enabled.
+ if (Support::test(impl->options, JitAllocatorOptions::kFillUnusedMemory))
+ JitAllocatorImpl_fillPattern(block->rwPtr() + (areaStart + areaShrunkSize) * pool->granularity, fillPattern(), areaDiff * pool->granularity);
+ }
return kErrorOk;
}
-// ============================================================================
-// [asmjit::JitAllocator - Unit]
-// ============================================================================
+// JitAllocator - Tests
+// ====================
#if defined(ASMJIT_TEST)
// A pseudo random number generator based on a paper by Sebastiano Vigna:
@@ -938,11 +966,6 @@ public:
// Helper class to verify that JitAllocator doesn't return addresses that overlap.
class JitAllocatorWrapper {
public:
- inline explicit JitAllocatorWrapper(const JitAllocator::CreateParams* params) noexcept
- : _zone(1024 * 1024),
- _heap(&_zone),
- _allocator(params) {}
-
// Address to a memory region of a given size.
class Range {
public:
@@ -968,6 +991,16 @@ public:
inline bool operator>(const uint8_t* key) const noexcept { return addr > key; }
};
+ Zone _zone;
+ ZoneAllocator _heap;
+ ZoneTree<Record> _records;
+ JitAllocator _allocator;
+
+ explicit JitAllocatorWrapper(const JitAllocator::CreateParams* params) noexcept
+ : _zone(1024 * 1024),
+ _heap(&_zone),
+ _allocator(params) {}
+
void _insert(void* p_, size_t size) noexcept {
uint8_t* p = static_cast<uint8_t*>(p_);
uint8_t* pEnd = p + size - 1;
@@ -976,52 +1009,54 @@ public:
record = _records.get(p);
if (record)
- EXPECT(record == nullptr,
- "Address [%p:%p] collides with a newly allocated [%p:%p]\n", record->addr, record->addr + record->size, p, p + size);
+ EXPECT(record == nullptr, "Address [%p:%p] collides with a newly allocated [%p:%p]\n", record->addr, record->addr + record->size, p, p + size);
record = _records.get(pEnd);
if (record)
- EXPECT(record == nullptr,
- "Address [%p:%p] collides with a newly allocated [%p:%p]\n", record->addr, record->addr + record->size, p, p + size);
+ EXPECT(record == nullptr, "Address [%p:%p] collides with a newly allocated [%p:%p]\n", record->addr, record->addr + record->size, p, p + size);
record = _heap.newT<Record>(p, size);
- EXPECT(record != nullptr,
- "Out of memory, cannot allocate 'Record'");
+ EXPECT(record != nullptr, "Out of memory, cannot allocate 'Record'");
_records.insert(record);
}
void _remove(void* p) noexcept {
Record* record = _records.get(static_cast<uint8_t*>(p));
- EXPECT(record != nullptr,
- "Address [%p] doesn't exist\n", p);
+ EXPECT(record != nullptr, "Address [%p] doesn't exist\n", p);
_records.remove(record);
_heap.release(record, sizeof(Record));
}
void* alloc(size_t size) noexcept {
- void* roPtr;
+ void* rxPtr;
void* rwPtr;
- Error err = _allocator.alloc(&roPtr, &rwPtr, size);
- EXPECT(err == kErrorOk,
- "JitAllocator failed to allocate '%u' bytes\n", unsigned(size));
+ Error err = _allocator.alloc(&rxPtr, &rwPtr, size);
+ EXPECT(err == kErrorOk, "JitAllocator failed to allocate %zu bytes\n", size);
- _insert(roPtr, size);
- return roPtr;
+ _insert(rxPtr, size);
+ return rxPtr;
}
void release(void* p) noexcept {
_remove(p);
- EXPECT(_allocator.release(p) == kErrorOk,
- "JitAllocator failed to release '%p'\n", p);
+ EXPECT(_allocator.release(p) == kErrorOk, "JitAllocator failed to release '%p'\n", p);
}
- Zone _zone;
- ZoneAllocator _heap;
- ZoneTree<Record> _records;
- JitAllocator _allocator;
+ void shrink(void* p, size_t newSize) noexcept {
+ Record* record = _records.get(static_cast<uint8_t*>(p));
+ EXPECT(record != nullptr, "Address [%p] doesn't exist\n", p);
+
+ if (!newSize)
+ return release(p);
+
+ Error err = _allocator.shrink(p, newSize);
+ EXPECT(err == kErrorOk, "JitAllocator failed to shrink %p to %zu bytes\n", p, newSize);
+
+ record->size = newSize;
+ }
};
static void JitAllocatorTest_shuffle(void** ptrArray, size_t count, Random& prng) noexcept {
@@ -1031,10 +1066,38 @@ static void JitAllocatorTest_shuffle(void** ptrArray, size_t count, Random& prng
static void JitAllocatorTest_usage(JitAllocator& allocator) noexcept {
JitAllocator::Statistics stats = allocator.statistics();
- INFO(" Block Count : %9llu [Blocks]" , (unsigned long long)(stats.blockCount()));
- INFO(" Reserved (VirtMem): %9llu [Bytes]" , (unsigned long long)(stats.reservedSize()));
- INFO(" Used (VirtMem): %9llu [Bytes] (%.1f%%)", (unsigned long long)(stats.usedSize()), stats.usedSizeAsPercent());
- INFO(" Overhead (HeapMem): %9llu [Bytes] (%.1f%%)", (unsigned long long)(stats.overheadSize()), stats.overheadSizeAsPercent());
+ INFO(" Block Count : %9llu [Blocks]" , (unsigned long long)(stats.blockCount()));
+ INFO(" Reserved (VirtMem): %9llu [Bytes]" , (unsigned long long)(stats.reservedSize()));
+ INFO(" Used (VirtMem): %9llu [Bytes] (%.1f%%)", (unsigned long long)(stats.usedSize()), stats.usedSizeAsPercent());
+ INFO(" Overhead (HeapMem): %9llu [Bytes] (%.1f%%)", (unsigned long long)(stats.overheadSize()), stats.overheadSizeAsPercent());
+}
+
+template<typename T, size_t kPatternSize, bool Bit>
+static void BitVectorRangeIterator_testRandom(Random& rnd, size_t count) noexcept {
+ for (size_t i = 0; i < count; i++) {
+ T in[kPatternSize];
+ T out[kPatternSize];
+
+ for (size_t j = 0; j < kPatternSize; j++) {
+ in[j] = T(uint64_t(rnd.nextUInt32() & 0xFFu) * 0x0101010101010101);
+ out[j] = Bit == 0 ? Support::allOnes<T>() : T(0);
+ }
+
+ {
+ BitVectorRangeIterator<T, Bit> it(in, kPatternSize);
+ size_t rangeStart, rangeEnd;
+ while (it.nextRange(&rangeStart, &rangeEnd)) {
+ if (Bit)
+ Support::bitVectorFill(out, rangeStart, rangeEnd - rangeStart);
+ else
+ Support::bitVectorClear(out, rangeStart, rangeEnd - rangeStart);
+ }
+ }
+
+ for (size_t j = 0; j < kPatternSize; j++) {
+ EXPECT(in[j] == out[j], "Invalid pattern detected at [%zu] (%llX != %llX)", j, (unsigned long long)in[j], (unsigned long long)out[j]);
+ }
+ }
}
UNIT(jit_allocator) {
@@ -1042,62 +1105,44 @@ UNIT(jit_allocator) {
struct TestParams {
const char* name;
- uint32_t options;
+ JitAllocatorOptions options;
uint32_t blockSize;
uint32_t granularity;
};
- #define OPT(OPTION) JitAllocator::OPTION
static TestParams testParams[] = {
- { "Default", 0, 0, 0 },
- { "16MB blocks", 0, 16 * 1024 * 1024, 0 },
- { "256B granularity", 0, 0, 256 },
- { "kOptionUseDualMapping", OPT(kOptionUseDualMapping), 0, 0 },
- { "kOptionUseMultiplePools", OPT(kOptionUseMultiplePools), 0, 0 },
- { "kOptionFillUnusedMemory", OPT(kOptionFillUnusedMemory), 0, 0 },
- { "kOptionImmediateRelease", OPT(kOptionImmediateRelease), 0, 0 },
- { "kOptionUseDualMapping | kOptionFillUnusedMemory", OPT(kOptionUseDualMapping) | OPT(kOptionFillUnusedMemory), 0, 0 }
+ { "Default", JitAllocatorOptions::kNone, 0, 0 },
+ { "16MB blocks", JitAllocatorOptions::kNone, 16 * 1024 * 1024, 0 },
+ { "256B granularity", JitAllocatorOptions::kNone, 0, 256 },
+ { "kUseDualMapping", JitAllocatorOptions::kUseDualMapping, 0, 0 },
+ { "kUseMultiplePools", JitAllocatorOptions::kUseMultiplePools, 0, 0 },
+ { "kFillUnusedMemory", JitAllocatorOptions::kFillUnusedMemory, 0, 0 },
+ { "kImmediateRelease", JitAllocatorOptions::kImmediateRelease, 0, 0 },
+ { "kUseDualMapping | kFillUnusedMemory", JitAllocatorOptions::kUseDualMapping | JitAllocatorOptions::kFillUnusedMemory, 0, 0 }
};
- #undef OPT
- INFO("BitFlipIterator<uint32_t>");
+ INFO("BitVectorRangeIterator<uint32_t>");
{
- static const uint32_t bits[] = { 0x80000000u, 0x80000000u, 0x00000000u, 0x80000000u };
- BitFlipIterator<uint32_t> it(bits, ASMJIT_ARRAY_SIZE(bits));
-
- EXPECT(it.hasNext());
- EXPECT(it.nextAndFlip() == 31);
- EXPECT(it.hasNext());
- EXPECT(it.nextAndFlip() == 32);
- EXPECT(it.hasNext());
- EXPECT(it.nextAndFlip() == 63);
- EXPECT(it.hasNext());
- EXPECT(it.nextAndFlip() == 64);
- EXPECT(it.hasNext());
- EXPECT(it.nextAndFlip() == 127);
- EXPECT(!it.hasNext());
+ Random rnd;
+ BitVectorRangeIterator_testRandom<uint32_t, 64, 0>(rnd, kCount);
}
- INFO("BitFlipIterator<uint64_t>");
+ INFO("BitVectorRangeIterator<uint64_t>");
{
- static const uint64_t bits[] = { 0xFFFFFFFFFFFFFFFFu, 0xFFFFFFFFFFFFFFFF, 0, 0 };
- BitFlipIterator<uint64_t> it(bits, ASMJIT_ARRAY_SIZE(bits));
-
- EXPECT(it.hasNext());
- EXPECT(it.nextAndFlip() == 0);
- EXPECT(it.hasNext());
- EXPECT(it.nextAndFlip() == 128);
- EXPECT(!it.hasNext());
+ Random rnd;
+ BitVectorRangeIterator_testRandom<uint64_t, 64, 0>(rnd, kCount);
}
for (uint32_t testId = 0; testId < ASMJIT_ARRAY_SIZE(testParams); testId++) {
- INFO("Testing JitAllocator: %s", testParams[testId].name);
+ INFO("JitAllocator(%s)", testParams[testId].name);
JitAllocator::CreateParams params {};
params.options = testParams[testId].options;
params.blockSize = testParams[testId].blockSize;
params.granularity = testParams[testId].granularity;
+ size_t fixedBlockSize = 256;
+
JitAllocatorWrapper wrapper(&params);
Random prng(100);
@@ -1109,39 +1154,84 @@ UNIT(jit_allocator) {
EXPECT(ptrArray != nullptr,
"Couldn't allocate '%u' bytes for pointer-array", unsigned(sizeof(void*) * size_t(kCount)));
- INFO(" Allocating virtual memory...");
+ // Random blocks tests...
+ INFO(" Allocating random blocks...");
for (i = 0; i < kCount; i++)
ptrArray[i] = wrapper.alloc((prng.nextUInt32() % 1024) + 8);
JitAllocatorTest_usage(wrapper._allocator);
- INFO(" Releasing virtual memory...");
+ INFO(" Releasing all allocated blocks from the beginning...");
for (i = 0; i < kCount; i++)
wrapper.release(ptrArray[i]);
JitAllocatorTest_usage(wrapper._allocator);
- INFO(" Allocating virtual memory...", kCount);
+ INFO(" Allocating random blocks again...", kCount);
for (i = 0; i < kCount; i++)
ptrArray[i] = wrapper.alloc((prng.nextUInt32() % 1024) + 8);
JitAllocatorTest_usage(wrapper._allocator);
- INFO(" Shuffling...");
+ INFO(" Shuffling allocated blocks...");
JitAllocatorTest_shuffle(ptrArray, unsigned(kCount), prng);
- INFO(" Releasing 50%% blocks...");
+ INFO(" Releasing 50%% of allocated blocks...");
for (i = 0; i < kCount / 2; i++)
wrapper.release(ptrArray[i]);
JitAllocatorTest_usage(wrapper._allocator);
- INFO(" Allocating 50%% blocks again...");
+ INFO(" Allocating 50%% more blocks again...");
for (i = 0; i < kCount / 2; i++)
ptrArray[i] = wrapper.alloc((prng.nextUInt32() % 1024) + 8);
JitAllocatorTest_usage(wrapper._allocator);
- INFO(" Releasing virtual memory...");
+ INFO(" Releasing all allocated blocks from the end...");
+ for (i = 0; i < kCount; i++)
+ wrapper.release(ptrArray[kCount - i - 1]);
+ JitAllocatorTest_usage(wrapper._allocator);
+
+ // Fixed blocks tests...
+ INFO(" Allocating %zuB blocks...", fixedBlockSize);
+ for (i = 0; i < kCount / 2; i++)
+ ptrArray[i] = wrapper.alloc(fixedBlockSize);
+ JitAllocatorTest_usage(wrapper._allocator);
+
+ INFO(" Shrinking each %zuB block to 1 byte", fixedBlockSize);
+ for (i = 0; i < kCount / 2; i++)
+ wrapper.shrink(ptrArray[i], 1);
+ JitAllocatorTest_usage(wrapper._allocator);
+
+ INFO(" Allocating more 64B blocks...", 64);
+ for (i = kCount / 2; i < kCount; i++)
+ ptrArray[i] = wrapper.alloc(64);
+ JitAllocatorTest_usage(wrapper._allocator);
+
+ INFO(" Releasing all blocks from the beginning...");
+ for (i = 0; i < kCount; i++)
+ wrapper.release(ptrArray[i]);
+ JitAllocatorTest_usage(wrapper._allocator);
+
+ INFO(" Allocating %zuB blocks...", fixedBlockSize);
for (i = 0; i < kCount; i++)
+ ptrArray[i] = wrapper.alloc(fixedBlockSize);
+ JitAllocatorTest_usage(wrapper._allocator);
+
+ INFO(" Shuffling allocated blocks...");
+ JitAllocatorTest_shuffle(ptrArray, unsigned(kCount), prng);
+
+ INFO(" Releasing 50%% of allocated blocks...");
+ for (i = 0; i < kCount / 2; i++)
wrapper.release(ptrArray[i]);
JitAllocatorTest_usage(wrapper._allocator);
+ INFO(" Allocating 50%% more %zuB blocks again...", fixedBlockSize);
+ for (i = 0; i < kCount / 2; i++)
+ ptrArray[i] = wrapper.alloc(fixedBlockSize);
+ JitAllocatorTest_usage(wrapper._allocator);
+
+ INFO(" Releasing all allocated blocks from the end...");
+ for (i = 0; i < kCount; i++)
+ wrapper.release(ptrArray[kCount - i - 1]);
+ JitAllocatorTest_usage(wrapper._allocator);
+
::free(ptrArray);
}
}
diff --git a/3rdparty/asmjit/src/asmjit/core/jitallocator.h b/3rdparty/asmjit/src/asmjit/core/jitallocator.h
index 9cd0a1f7b7e..e8fe69519ee 100644
--- a/3rdparty/asmjit/src/asmjit/core/jitallocator.h
+++ b/3rdparty/asmjit/src/asmjit/core/jitallocator.h
@@ -1,25 +1,7 @@
-// AsmJit - Machine code generation for C++
+// This file is part of AsmJit project <https://asmjit.com>
//
-// * Official AsmJit Home Page: https://asmjit.com
-// * Official Github Repository: https://github.com/asmjit/asmjit
-//
-// Copyright (c) 2008-2020 The AsmJit Authors
-//
-// This software is provided 'as-is', without any express or implied
-// warranty. In no event will the authors be held liable for any damages
-// arising from the use of this software.
-//
-// Permission is granted to anyone to use this software for any purpose,
-// including commercial applications, and to alter it and redistribute it
-// freely, subject to the following restrictions:
-//
-// 1. The origin of this software must not be misrepresented; you must not
-// claim that you wrote the original software. If you use this software
-// in a product, an acknowledgment in the product documentation would be
-// appreciated but is not required.
-// 2. Altered source versions must be plainly marked as such, and must not be
-// misrepresented as being the original software.
-// 3. This notice may not be removed or altered from any source distribution.
+// See asmjit.h or LICENSE.md for license and copyright information
+// SPDX-License-Identifier: Zlib
#ifndef ASMJIT_CORE_JITALLOCATOR_H_INCLUDED
#define ASMJIT_CORE_JITALLOCATOR_H_INCLUDED
@@ -35,37 +17,67 @@ ASMJIT_BEGIN_NAMESPACE
//! \addtogroup asmjit_virtual_memory
//! \{
-// ============================================================================
-// [asmjit::JitAllocator]
-// ============================================================================
+//! Options used by \ref JitAllocator.
+enum class JitAllocatorOptions : uint32_t {
+ //! No options.
+ kNone = 0,
+
+ //! Enables the use of an anonymous memory-mapped memory that is mapped into two buffers having a different pointer.
+ //! The first buffer has read and execute permissions and the second buffer has read+write permissions.
+ //!
+ //! See \ref VirtMem::allocDualMapping() for more details about this feature.
+ kUseDualMapping = 0x00000001u,
+
+ //! Enables the use of multiple pools with increasing granularity instead of a single pool. This flag would enable
+ //! 3 internal pools in total having 64, 128, and 256 bytes granularity.
+ //!
+ //! This feature is only recommended for users that generate a lot of code and would like to minimize the overhead
+ //! of `JitAllocator` itself by having blocks of different allocation granularities. Using this feature only for
+ //! few allocations won't pay off as the allocator may need to create more blocks initially before it can take the
+ //! advantage of variable block granularity.
+ kUseMultiplePools = 0x00000002u,
+
+ //! Always fill reserved memory by a fill-pattern.
+ //!
+ //! Causes a new block to be cleared by the fill pattern and freshly released memory to be cleared before making
+ //! it ready for another use.
+ kFillUnusedMemory = 0x00000004u,
+
+ //! When this flag is set the allocator would immediately release unused blocks during `release()` or `reset()`.
+ //! When this flag is not set the allocator would keep one empty block in each pool to prevent excessive virtual
+ //! memory allocations and deallocations in border cases, which involve constantly allocating and deallocating a
+ //! single block caused by repetitive calling `alloc()` and `release()` when the allocator has either no blocks
+ //! or have all blocks fully occupied.
+ kImmediateRelease = 0x00000008u,
+
+ //! Use a custom fill pattern, must be combined with `kFlagFillUnusedMemory`.
+ kCustomFillPattern = 0x10000000u
+};
+ASMJIT_DEFINE_ENUM_FLAGS(JitAllocatorOptions)
//! A simple implementation of memory manager that uses `asmjit::VirtMem`
//! functions to manage virtual memory for JIT compiled code.
//!
//! Implementation notes:
//!
-//! - Granularity of allocated blocks is different than granularity for a typical
-//! C malloc. In addition, the allocator can use several memory pools having a
-//! different granularity to minimize the maintenance overhead. Multiple pools
+//! - Granularity of allocated blocks is different than granularity for a typical C malloc. In addition, the allocator
+//! can use several memory pools having a different granularity to minimize the maintenance overhead. Multiple pools
//! feature requires `kFlagUseMultiplePools` flag to be set.
//!
-//! - The allocator doesn't store any information in executable memory, instead,
-//! the implementation uses two bit-vectors to manage allocated memory of each
-//! allocator-block. The first bit-vector called 'used' is used to track used
-//! memory (where each bit represents memory size defined by granularity) and
-//! the second bit vector called 'stop' is used as a sentinel to mark where
-//! the allocated area ends.
+//! - The allocator doesn't store any information in executable memory, instead, the implementation uses two
+//! bit-vectors to manage allocated memory of each allocator-block. The first bit-vector called 'used' is used to
+//! track used memory (where each bit represents memory size defined by granularity) and the second bit vector called
+//! 'stop' is used as a sentinel to mark where the allocated area ends.
//!
-//! - Internally, the allocator also uses RB tree to keep track of all blocks
-//! across all pools. Each inserted block is added to the tree so it can be
-//! matched fast during `release()` and `shrink()`.
+//! - Internally, the allocator also uses RB tree to keep track of all blocks across all pools. Each inserted block is
+//! added to the tree so it can be matched fast during `release()` and `shrink()`.
class JitAllocator {
public:
ASMJIT_NONCOPYABLE(JitAllocator)
struct Impl {
- //! Allocator options, see \ref JitAllocator::Options.
- uint32_t options;
+ //! Allocator options.
+ JitAllocatorOptions options;
//! Base block size (0 if the allocator is not initialized).
uint32_t blockSize;
//! Base granularity (0 if the allocator is not initialized).
@@ -77,45 +89,6 @@ public:
//! Allocator implementation (private).
Impl* _impl;
- enum Options : uint32_t {
- //! Enables the use of an anonymous memory-mapped memory that is mapped into
- //! two buffers having a different pointer. The first buffer has read and
- //! execute permissions and the second buffer has read+write permissions.
- //!
- //! See \ref VirtMem::allocDualMapping() for more details about this feature.
- kOptionUseDualMapping = 0x00000001u,
-
- //! Enables the use of multiple pools with increasing granularity instead of
- //! a single pool. This flag would enable 3 internal pools in total having
- //! 64, 128, and 256 bytes granularity.
- //!
- //! This feature is only recommended for users that generate a lot of code
- //! and would like to minimize the overhead of `JitAllocator` itself by
- //! having blocks of different allocation granularities. Using this feature
- //! only for few allocations won't pay off as the allocator may need to
- //! create more blocks initially before it can take the advantage of
- //! variable block granularity.
- kOptionUseMultiplePools = 0x00000002u,
-
- //! Always fill reserved memory by a fill-pattern.
- //!
- //! Causes a new block to be cleared by the fill pattern and freshly
- //! released memory to be cleared before making it ready for another use.
- kOptionFillUnusedMemory = 0x00000004u,
-
- //! When this flag is set the allocator would immediately release unused
- //! blocks during `release()` or `reset()`. When this flag is not set the
- //! allocator would keep one empty block in each pool to prevent excessive
- //! virtual memory allocations and deallocations in border cases, which
- //! involve constantly allocating and deallocating a single block caused
- //! by repetitive calling `alloc()` and `release()` when the allocator has
- //! either no blocks or have all blocks fully occupied.
- kOptionImmediateRelease = 0x00000008u,
-
- //! Use a custom fill pattern, must be combined with `kFlagFillUnusedMemory`.
- kOptionCustomFillPattern = 0x10000000u
- };
-
//! \name Construction & Destruction
//! \{
@@ -132,39 +105,35 @@ public:
//! JitAllocator allocator(&params);
//! ```
struct CreateParams {
- //! Allocator options, see \ref JitAllocator::Options.
+ //! Allocator options.
//!
//! No options are used by default.
- uint32_t options;
+ JitAllocatorOptions options = JitAllocatorOptions::kNone;
//! Base size of a single block in bytes (default 64kB).
//!
- //! \remarks Block size must be equal or greater to page size and must be
- //! power of 2. If the input is not valid then the default block size will
- //! be used instead.
- uint32_t blockSize;
+ //! \remarks Block size must be equal to or greater than page size and must be power of 2. If the input is not
+ //! valid then the default block size will be used instead.
+ uint32_t blockSize = 0;
- //! Base granularity (and also natural alignment) of allocations in bytes
- //! (default 64).
+ //! Base granularity (and also natural alignment) of allocations in bytes (default 64).
//!
- //! Since the `JitAllocator` uses bit-arrays to mark used memory the
- //! granularity also specifies how many bytes correspond to a single bit in
- //! such bit-array. Higher granularity means more waste of virtual memory
- //! (as it increases the natural alignment), but smaller bit-arrays as less
- //! bits would be required per a single block.
- uint32_t granularity;
+ //! Since the `JitAllocator` uses bit-arrays to mark used memory the granularity also specifies how many bytes
+ //! correspond to a single bit in such bit-array. Higher granularity means more waste of virtual memory (as it
+ //! increases the natural alignment), but smaller bit-arrays as less bits would be required per a single block.
+ uint32_t granularity = 0;
//! Patter to use to fill unused memory.
//!
- //! Only used if \ref kOptionCustomFillPattern is set.
- uint32_t fillPattern;
+ //! Only used if \ref JitAllocatorOptions::kCustomFillPattern is set.
+ uint32_t fillPattern = 0;
// Reset the content of `CreateParams`.
inline void reset() noexcept { memset(this, 0, sizeof(*this)); }
};
//! Creates a `JitAllocator` instance.
- explicit ASMJIT_API JitAllocator(const CreateParams* params = nullptr) noexcept;
+ ASMJIT_API explicit JitAllocator(const CreateParams* params = nullptr) noexcept;
//! Destroys the `JitAllocator` instance and release all blocks held.
ASMJIT_API ~JitAllocator() noexcept;
@@ -172,10 +141,9 @@ public:
//! Free all allocated memory - makes all pointers returned by `alloc()` invalid.
//!
- //! \remarks This function is not thread-safe as it's designed to be used when
- //! nobody else is using allocator. The reason is that there is no point of
- //1 calling `reset()` when the allocator is still in use.
- ASMJIT_API void reset(uint32_t resetPolicy = Globals::kResetSoft) noexcept;
+ //! \remarks This function is not thread-safe as it's designed to be used when nobody else is using allocator.
+ //! The reason is that there is no point of calling `reset()` when the allocator is still in use.
+ ASMJIT_API void reset(ResetPolicy resetPolicy = ResetPolicy::kSoft) noexcept;
//! \}
@@ -183,9 +151,9 @@ public:
//! \{
//! Returns allocator options, see `Flags`.
- inline uint32_t options() const noexcept { return _impl->options; }
+ inline JitAllocatorOptions options() const noexcept { return _impl->options; }
//! Tests whether the allocator has the given `option` set.
- inline bool hasOption(uint32_t option) const noexcept { return (_impl->options & option) != 0; }
+ inline bool hasOption(JitAllocatorOptions option) const noexcept { return uint32_t(_impl->options & option) != 0; }
//! Returns a base block size (a minimum size of block that the allocator would allocate).
inline uint32_t blockSize() const noexcept { return _impl->blockSize; }
@@ -199,20 +167,31 @@ public:
//! \name Alloc & Release
//! \{
- //! Allocate `size` bytes of virtual memory.
+ //! Allocates a new memory block of the requested `size`.
//!
- //! \remarks This function is thread-safe.
- ASMJIT_API Error alloc(void** roPtrOut, void** rwPtrOut, size_t size) noexcept;
+ //! When the function is successful it stores two pointers in `rxPtrOut` and `rwPtrOut`. The pointers will be
+ //! different only if `kOptionUseDualMapping` was used to setup the allocator (in that case the `rxPtrOut` would
+ //! point to a Read+Execute region and `rwPtrOut` would point to a Read+Write region of the same memory-mapped block.
+ ASMJIT_API Error alloc(void** rxPtrOut, void** rwPtrOut, size_t size) noexcept;
- //! Release a memory returned by `alloc()`.
+ //! Releases a memory block returned by `alloc()`.
//!
//! \remarks This function is thread-safe.
- ASMJIT_API Error release(void* ro) noexcept;
+ ASMJIT_API Error release(void* rxPtr) noexcept;
- //! Free extra memory allocated with `p` by restricting it to `newSize` size.
+ //! Frees extra memory allocated with `rxPtr` by shrinking it to the given `newSize`.
//!
//! \remarks This function is thread-safe.
- ASMJIT_API Error shrink(void* ro, size_t newSize) noexcept;
+ ASMJIT_API Error shrink(void* rxPtr, size_t newSize) noexcept;
+
+ //! Queries information about an allocated memory block that contains the given `rxPtr`.
+ //!
+ //! The function returns `kErrorOk` when `rxPtr` is matched and fills `rxPtrOut`, `rwPtrOut`, and `sizeOut` output
+ //! arguments. The returned `rxPtrOut` and `rwPtrOut` pointers point to the beginning of the block, and `sizeOut`
+ //! describes the total amount of bytes this allocation uses - `sizeOut` will always be aligned to the allocation
+ //! granularity, so for example if an allocation was 1 byte and the size granularity is 64, the returned `sizeOut`
+ //! will be 64 bytes, because that's what the allocator sees.
+ ASMJIT_API Error query(void* rxPtr, void** rxPtrOut, void** rwPtrOut, size_t* sizeOut) const noexcept;
//! \}
@@ -223,6 +202,8 @@ public:
struct Statistics {
//! Number of blocks `JitAllocator` maintains.
size_t _blockCount;
+ //! Number of active allocations.
+ size_t _allocationCount;
//! How many bytes are currently used / allocated.
size_t _usedSize;
//! How many bytes are currently reserved by the allocator.
@@ -239,6 +220,8 @@ public:
//! Returns count of blocks managed by `JitAllocator` at the moment.
inline size_t blockCount() const noexcept { return _blockCount; }
+ //! Returns the number of active allocations.
+ inline size_t allocationCount() const noexcept { return _allocationCount; }
//! Returns how many bytes are currently used.
inline size_t usedSize() const noexcept { return _usedSize; }
diff --git a/3rdparty/asmjit/src/asmjit/core/jitruntime.cpp b/3rdparty/asmjit/src/asmjit/core/jitruntime.cpp
index 1127c866aad..491c2040fbe 100644
--- a/3rdparty/asmjit/src/asmjit/core/jitruntime.cpp
+++ b/3rdparty/asmjit/src/asmjit/core/jitruntime.cpp
@@ -1,25 +1,7 @@
-// AsmJit - Machine code generation for C++
+// This file is part of AsmJit project <https://asmjit.com>
//
-// * Official AsmJit Home Page: https://asmjit.com
-// * Official Github Repository: https://github.com/asmjit/asmjit
-//
-// Copyright (c) 2008-2020 The AsmJit Authors
-//
-// This software is provided 'as-is', without any express or implied
-// warranty. In no event will the authors be held liable for any damages
-// arising from the use of this software.
-//
-// Permission is granted to anyone to use this software for any purpose,
-// including commercial applications, and to alter it and redistribute it
-// freely, subject to the following restrictions:
-//
-// 1. The origin of this software must not be misrepresented; you must not
-// claim that you wrote the original software. If you use this software
-// in a product, an acknowledgment in the product documentation would be
-// appreciated but is not required.
-// 2. Altered source versions must be plainly marked as such, and must not be
-// misrepresented as being the original software.
-// 3. This notice may not be removed or altered from any source distribution.
+// See asmjit.h or LICENSE.md for license and copyright information
+// SPDX-License-Identifier: Zlib
#include "../core/api-build_p.h"
#ifndef ASMJIT_NO_JIT
@@ -29,36 +11,14 @@
ASMJIT_BEGIN_NAMESPACE
-// ============================================================================
-// [asmjit::JitRuntime - Utilities]
-// ============================================================================
-
-// Only useful on non-x86 architectures.
-static inline void JitRuntime_flushInstructionCache(const void* p, size_t size) noexcept {
-#if defined(_WIN32) && !ASMJIT_ARCH_X86
- // Windows has a built-in support in `kernel32.dll`.
- ::FlushInstructionCache(::GetCurrentProcess(), p, size);
-#else
- DebugUtils::unused(p, size);
-#endif
-}
-
-// ============================================================================
-// [asmjit::JitRuntime - Construction / Destruction]
-// ============================================================================
-
JitRuntime::JitRuntime(const JitAllocator::CreateParams* params) noexcept
: _allocator(params) {
- _environment = hostEnvironment();
- _environment.setFormat(Environment::kFormatJIT);
+ _environment = Environment::host();
+ _environment.setObjectFormat(ObjectFormat::kJIT);
}
JitRuntime::~JitRuntime() noexcept {}
-// ============================================================================
-// [asmjit::JitRuntime - Interface]
-// ============================================================================
-
Error JitRuntime::_add(void** dst, CodeHolder* code) noexcept {
*dst = nullptr;
@@ -69,41 +29,45 @@ Error JitRuntime::_add(void** dst, CodeHolder* code) noexcept {
if (ASMJIT_UNLIKELY(estimatedCodeSize == 0))
return DebugUtils::errored(kErrorNoCodeGenerated);
- uint8_t* ro;
+ uint8_t* rx;
uint8_t* rw;
- ASMJIT_PROPAGATE(_allocator.alloc((void**)&ro, (void**)&rw, estimatedCodeSize));
+ ASMJIT_PROPAGATE(_allocator.alloc((void**)&rx, (void**)&rw, estimatedCodeSize));
// Relocate the code.
- Error err = code->relocateToBase(uintptr_t((void*)ro));
+ Error err = code->relocateToBase(uintptr_t((void*)rx));
if (ASMJIT_UNLIKELY(err)) {
- _allocator.release(ro);
+ _allocator.release(rx);
return err;
}
// Recalculate the final code size and shrink the memory we allocated for it
// in case that some relocations didn't require records in an address table.
size_t codeSize = code->codeSize();
+ if (codeSize < estimatedCodeSize)
+ _allocator.shrink(rx, codeSize);
- for (Section* section : code->_sections) {
- size_t offset = size_t(section->offset());
- size_t bufferSize = size_t(section->bufferSize());
- size_t virtualSize = size_t(section->virtualSize());
+ if (codeSize < estimatedCodeSize)
+ _allocator.shrink(rx, codeSize);
- ASMJIT_ASSERT(offset + bufferSize <= codeSize);
- memcpy(rw + offset, section->data(), bufferSize);
+ {
+ VirtMem::ProtectJitReadWriteScope rwScope(rx, codeSize);
- if (virtualSize > bufferSize) {
- ASMJIT_ASSERT(offset + virtualSize <= codeSize);
- memset(rw + offset + bufferSize, 0, virtualSize - bufferSize);
- }
- }
+ for (Section* section : code->_sections) {
+ size_t offset = size_t(section->offset());
+ size_t bufferSize = size_t(section->bufferSize());
+ size_t virtualSize = size_t(section->virtualSize());
- if (codeSize < estimatedCodeSize)
- _allocator.shrink(ro, codeSize);
+ ASMJIT_ASSERT(offset + bufferSize <= codeSize);
+ memcpy(rw + offset, section->data(), bufferSize);
- flush(ro, codeSize);
- *dst = ro;
+ if (virtualSize > bufferSize) {
+ ASMJIT_ASSERT(offset + virtualSize <= codeSize);
+ memset(rw + offset + bufferSize, 0, virtualSize - bufferSize);
+ }
+ }
+ }
+ *dst = rx;
return kErrorOk;
}
@@ -111,10 +75,6 @@ Error JitRuntime::_release(void* p) noexcept {
return _allocator.release(p);
}
-void JitRuntime::flush(const void* p, size_t size) noexcept {
- JitRuntime_flushInstructionCache(p, size);
-}
-
ASMJIT_END_NAMESPACE
#endif
diff --git a/3rdparty/asmjit/src/asmjit/core/jitruntime.h b/3rdparty/asmjit/src/asmjit/core/jitruntime.h
index 91880e688c0..6f35e21277a 100644
--- a/3rdparty/asmjit/src/asmjit/core/jitruntime.h
+++ b/3rdparty/asmjit/src/asmjit/core/jitruntime.h
@@ -1,25 +1,7 @@
-// AsmJit - Machine code generation for C++
+// This file is part of AsmJit project <https://asmjit.com>
//
-// * Official AsmJit Home Page: https://asmjit.com
-// * Official Github Repository: https://github.com/asmjit/asmjit
-//
-// Copyright (c) 2008-2020 The AsmJit Authors
-//
-// This software is provided 'as-is', without any express or implied
-// warranty. In no event will the authors be held liable for any damages
-// arising from the use of this software.
-//
-// Permission is granted to anyone to use this software for any purpose,
-// including commercial applications, and to alter it and redistribute it
-// freely, subject to the following restrictions:
-//
-// 1. The origin of this software must not be misrepresented; you must not
-// claim that you wrote the original software. If you use this software
-// in a product, an acknowledgment in the product documentation would be
-// appreciated but is not required.
-// 2. Altered source versions must be plainly marked as such, and must not be
-// misrepresented as being the original software.
-// 3. This notice may not be removed or altered from any source distribution.
+// See asmjit.h or LICENSE.md for license and copyright information
+// SPDX-License-Identifier: Zlib
#ifndef ASMJIT_CORE_JITRUNTIME_H_INCLUDED
#define ASMJIT_CORE_JITRUNTIME_H_INCLUDED
@@ -38,10 +20,6 @@ class CodeHolder;
//! \addtogroup asmjit_virtual_memory
//! \{
-// ============================================================================
-// [asmjit::JitRuntime]
-// ============================================================================
-
//! JIT execution runtime is a special `Target` that is designed to store and
//! execute the generated code.
class ASMJIT_VIRTAPI JitRuntime : public Target {
@@ -55,11 +33,11 @@ public:
//! \{
//! Creates a `JitRuntime` instance.
- explicit ASMJIT_API JitRuntime(const JitAllocator::CreateParams* params = nullptr) noexcept;
+ ASMJIT_API explicit JitRuntime(const JitAllocator::CreateParams* params = nullptr) noexcept;
//! Destroys the `JitRuntime` instance.
ASMJIT_API virtual ~JitRuntime() noexcept;
- inline void reset(uint32_t resetPolicy = Globals::kResetSoft) noexcept {
+ inline void reset(ResetPolicy resetPolicy = ResetPolicy::kSoft) noexcept {
_allocator.reset(resetPolicy);
}
@@ -79,12 +57,10 @@ public:
// NOTE: To allow passing function pointers to `add()` and `release()` the
// virtual methods are prefixed with `_` and called from templates instead.
- //! Allocates memory needed for a code stored in the `CodeHolder` and relocates
- //! the code to the pointer allocated.
+ //! Allocates memory needed for a code stored in the `CodeHolder` and relocates the code to the pointer allocated.
//!
- //! The beginning of the memory allocated for the function is returned in `dst`.
- //! If failed `Error` code is returned and `dst` is explicitly set to `nullptr`
- //! (this means that you don't have to set it to null before calling `add()`).
+ //! The beginning of the memory allocated for the function is returned in `dst`. If failed `Error` code is returned
+ //! and `dst` is explicitly set to `nullptr` (this means that you don't have to set it to null before calling `add()`).
template<typename Func>
inline Error add(Func* dst, CodeHolder* code) noexcept {
return _add(Support::ptr_cast_impl<void**, Func*>(dst), code);
@@ -102,19 +78,6 @@ public:
//! Type-unsafe version of `release()`.
ASMJIT_API virtual Error _release(void* p) noexcept;
- //! Flushes an instruction cache.
- //!
- //! This member function is called after the code has been copied to the
- //! destination buffer. It is only useful for JIT code generation as it
- //! causes a flush of the processor's cache.
- //!
- //! Flushing is basically a NOP under X86, but is needed by architectures
- //! that do not have a transparent instruction cache like ARM.
- //!
- //! This function can also be overridden to improve compatibility with tools
- //! such as Valgrind, however, it's not an official part of AsmJit.
- ASMJIT_API virtual void flush(const void* p, size_t size) noexcept;
-
//! \}
};
diff --git a/3rdparty/asmjit/src/asmjit/core/logger.cpp b/3rdparty/asmjit/src/asmjit/core/logger.cpp
index 22e0b9af08a..4567b3c9389 100644
--- a/3rdparty/asmjit/src/asmjit/core/logger.cpp
+++ b/3rdparty/asmjit/src/asmjit/core/logger.cpp
@@ -1,25 +1,7 @@
-// AsmJit - Machine code generation for C++
+// This file is part of AsmJit project <https://asmjit.com>
//
-// * Official AsmJit Home Page: https://asmjit.com
-// * Official Github Repository: https://github.com/asmjit/asmjit
-//
-// Copyright (c) 2008-2020 The AsmJit Authors
-//
-// This software is provided 'as-is', without any express or implied
-// warranty. In no event will the authors be held liable for any damages
-// arising from the use of this software.
-//
-// Permission is granted to anyone to use this software for any purpose,
-// including commercial applications, and to alter it and redistribute it
-// freely, subject to the following restrictions:
-//
-// 1. The origin of this software must not be misrepresented; you must not
-// claim that you wrote the original software. If you use this software
-// in a product, an acknowledgment in the product documentation would be
-// appreciated but is not required.
-// 2. Altered source versions must be plainly marked as such, and must not be
-// misrepresented as being the original software.
-// 3. This notice may not be removed or altered from any source distribution.
+// See asmjit.h or LICENSE.md for license and copyright information
+// SPDX-License-Identifier: Zlib
#include "../core/api-build_p.h"
#ifndef ASMJIT_NO_LOGGING
@@ -30,18 +12,13 @@
ASMJIT_BEGIN_NAMESPACE
-// ============================================================================
-// [asmjit::Logger - Construction / Destruction]
-// ============================================================================
+// Logger - Implementation
+// =======================
Logger::Logger() noexcept
: _options() {}
Logger::~Logger() noexcept {}
-// ============================================================================
-// [asmjit::Logger - Logging]
-// ============================================================================
-
Error Logger::logf(const char* fmt, ...) noexcept {
Error err;
va_list ap;
@@ -59,40 +36,13 @@ Error Logger::logv(const char* fmt, va_list ap) noexcept {
return log(sb);
}
-Error Logger::logBinary(const void* data, size_t size) noexcept {
- static const char prefix[] = "db ";
-
- StringTmp<256> sb;
- sb.append(prefix, ASMJIT_ARRAY_SIZE(prefix) - 1);
-
- size_t i = size;
- const uint8_t* s = static_cast<const uint8_t*>(data);
-
- while (i) {
- uint32_t n = uint32_t(Support::min<size_t>(i, 16));
- sb.truncate(ASMJIT_ARRAY_SIZE(prefix) - 1);
- sb.appendHex(s, n);
- sb.append('\n');
- ASMJIT_PROPAGATE(log(sb));
- s += n;
- i -= n;
- }
-
- return kErrorOk;
-}
-
-// ============================================================================
-// [asmjit::FileLogger - Construction / Destruction]
-// ============================================================================
+// FileLogger - Implementation
+// ===========================
FileLogger::FileLogger(FILE* file) noexcept
: _file(file) {}
FileLogger::~FileLogger() noexcept {}
-// ============================================================================
-// [asmjit::FileLogger - Logging]
-// ============================================================================
-
Error FileLogger::_log(const char* data, size_t size) noexcept {
if (!_file)
return kErrorOk;
@@ -104,17 +54,12 @@ Error FileLogger::_log(const char* data, size_t size) noexcept {
return kErrorOk;
}
-// ============================================================================
-// [asmjit::StringLogger - Construction / Destruction]
-// ============================================================================
+// StringLogger - Implementation
+// =============================
StringLogger::StringLogger() noexcept {}
StringLogger::~StringLogger() noexcept {}
-// ============================================================================
-// [asmjit::StringLogger - Logging]
-// ============================================================================
-
Error StringLogger::_log(const char* data, size_t size) noexcept {
return _content.append(data, size);
}
diff --git a/3rdparty/asmjit/src/asmjit/core/logger.h b/3rdparty/asmjit/src/asmjit/core/logger.h
index 2840869b476..d416a50d84d 100644
--- a/3rdparty/asmjit/src/asmjit/core/logger.h
+++ b/3rdparty/asmjit/src/asmjit/core/logger.h
@@ -1,25 +1,7 @@
-// AsmJit - Machine code generation for C++
+// This file is part of AsmJit project <https://asmjit.com>
//
-// * Official AsmJit Home Page: https://asmjit.com
-// * Official Github Repository: https://github.com/asmjit/asmjit
-//
-// Copyright (c) 2008-2020 The AsmJit Authors
-//
-// This software is provided 'as-is', without any express or implied
-// warranty. In no event will the authors be held liable for any damages
-// arising from the use of this software.
-//
-// Permission is granted to anyone to use this software for any purpose,
-// including commercial applications, and to alter it and redistribute it
-// freely, subject to the following restrictions:
-//
-// 1. The origin of this software must not be misrepresented; you must not
-// claim that you wrote the original software. If you use this software
-// in a product, an acknowledgment in the product documentation would be
-// appreciated but is not required.
-// 2. Altered source versions must be plainly marked as such, and must not be
-// misrepresented as being the original software.
-// 3. This notice may not be removed or altered from any source distribution.
+// See asmjit.h or LICENSE.md for license and copyright information
+// SPDX-License-Identifier: Zlib
#ifndef ASMJIT_CORE_LOGGING_H_INCLUDED
#define ASMJIT_CORE_LOGGING_H_INCLUDED
@@ -35,15 +17,10 @@ ASMJIT_BEGIN_NAMESPACE
//! \addtogroup asmjit_logging
//! \{
-// ============================================================================
-// [asmjit::Logger]
-// ============================================================================
-
//! Logging interface.
//!
-//! This class can be inherited and reimplemented to fit into your own logging
-//! needs. When reimplementing a logger use \ref Logger::_log() method to log
-//! customize the output.
+//! This class can be inherited and reimplemented to fit into your own logging needs. When reimplementing a logger
+//! use \ref Logger::_log() method to log customize the output.
//!
//! There are two `Logger` implementations offered by AsmJit:
//! - \ref FileLogger - logs into a `FILE*`.
@@ -73,25 +50,35 @@ public:
inline FormatOptions& options() noexcept { return _options; }
//! \overload
inline const FormatOptions& options() const noexcept { return _options; }
+ //! Sets formatting options of this Logger to `options`.
+ inline void setOptions(const FormatOptions& options) noexcept { _options = options; }
+ //! Resets formatting options of this Logger to defaults.
+ inline void resetOptions() noexcept { _options.reset(); }
- //! Returns formatting flags, see \ref FormatOptions::Flags.
- inline uint32_t flags() const noexcept { return _options.flags(); }
+ //! Returns formatting flags.
+ inline FormatFlags flags() const noexcept { return _options.flags(); }
//! Tests whether the logger has the given `flag` enabled.
- inline bool hasFlag(uint32_t flag) const noexcept { return _options.hasFlag(flag); }
- //! Sets formatting flags to `flags`, see \ref FormatOptions::Flags.
- inline void setFlags(uint32_t flags) noexcept { _options.setFlags(flags); }
- //! Enables the given formatting `flags`, see \ref FormatOptions::Flags.
- inline void addFlags(uint32_t flags) noexcept { _options.addFlags(flags); }
- //! Disables the given formatting `flags`, see \ref FormatOptions::Flags.
- inline void clearFlags(uint32_t flags) noexcept { _options.clearFlags(flags); }
-
- //! Returns indentation of `type`, see \ref FormatOptions::IndentationType.
- inline uint32_t indentation(uint32_t type) const noexcept { return _options.indentation(type); }
- //! Sets indentation of the given indentation `type` to `n` spaces, see \ref
- //! FormatOptions::IndentationType.
- inline void setIndentation(uint32_t type, uint32_t n) noexcept { _options.setIndentation(type, n); }
- //! Resets indentation of the given indentation `type` to 0 spaces.
- inline void resetIndentation(uint32_t type) noexcept { _options.resetIndentation(type); }
+ inline bool hasFlag(FormatFlags flag) const noexcept { return _options.hasFlag(flag); }
+ //! Sets formatting flags to `flags`.
+ inline void setFlags(FormatFlags flags) noexcept { _options.setFlags(flags); }
+ //! Enables the given formatting `flags`.
+ inline void addFlags(FormatFlags flags) noexcept { _options.addFlags(flags); }
+ //! Disables the given formatting `flags`.
+ inline void clearFlags(FormatFlags flags) noexcept { _options.clearFlags(flags); }
+
+ //! Returns indentation of a given indentation `group`.
+ inline uint32_t indentation(FormatIndentationGroup type) const noexcept { return _options.indentation(type); }
+ //! Sets indentation of the given indentation `group` to `n` spaces.
+ inline void setIndentation(FormatIndentationGroup type, uint32_t n) noexcept { _options.setIndentation(type, n); }
+ //! Resets indentation of the given indentation `group` to 0 spaces.
+ inline void resetIndentation(FormatIndentationGroup type) noexcept { _options.resetIndentation(type); }
+
+ //! Returns padding of a given padding `group`.
+ inline size_t padding(FormatPaddingGroup type) const noexcept { return _options.padding(type); }
+ //! Sets padding of a given padding `group` to `n`.
+ inline void setPadding(FormatPaddingGroup type, uint32_t n) noexcept { _options.setPadding(type, n); }
+ //! Resets padding of a given padding `group` to 0, which means that a default will be used.
+ inline void resetPadding(FormatPaddingGroup type) noexcept { _options.resetPadding(type); }
//! \}
@@ -100,9 +87,8 @@ public:
//! Logs `str` - must be reimplemented.
//!
- //! The function can accept either a null terminated string if `size` is
- //! `SIZE_MAX` or a non-null terminated string of the given `size`. The
- //! function cannot assume that the data is null terminated and must handle
+ //! The function can accept either a null terminated string if `size` is `SIZE_MAX` or a non-null terminated
+ //! string of the given `size`. The function cannot assume that the data is null terminated and must handle
//! non-null terminated inputs.
virtual Error _log(const char* data, size_t size) noexcept = 0;
@@ -111,24 +97,15 @@ public:
//! Logs content of a string `str`.
inline Error log(const String& str) noexcept { return _log(str.data(), str.size()); }
- //! Formats the message by using `snprintf()` and then passes the formatted
- //! string to \ref _log().
+ //! Formats the message by using `snprintf()` and then passes the formatted string to \ref _log().
ASMJIT_API Error logf(const char* fmt, ...) noexcept;
- //! Formats the message by using `vsnprintf()` and then passes the formatted
- //! string to \ref _log().
+ //! Formats the message by using `vsnprintf()` and then passes the formatted string to \ref _log().
ASMJIT_API Error logv(const char* fmt, va_list ap) noexcept;
- //! Logs binary `data` of the given `size`.
- ASMJIT_API Error logBinary(const void* data, size_t size) noexcept;
-
//! \}
};
-// ============================================================================
-// [asmjit::FileLogger]
-// ============================================================================
-
//! Logger that can log to a `FILE*`.
class ASMJIT_VIRTAPI FileLogger : public Logger {
public:
@@ -149,17 +126,14 @@ public:
//! \name Accessors
//! \{
- //! Returns the logging output stream or null if the logger has no output
- //! stream.
+ //! Returns the logging output stream or null if the logger has no output stream.
inline FILE* file() const noexcept { return _file; }
//! Sets the logging output stream to `stream` or null.
//!
- //! \note If the `file` is null the logging will be disabled. When a logger
- //! is attached to `CodeHolder` or any emitter the logging API will always
- //! be called regardless of the output file. This means that if you really
- //! want to disable logging at emitter level you must not attach a logger
- //! to it.
+ //! \note If the `file` is null the logging will be disabled. When a logger is attached to `CodeHolder` or any
+ //! emitter the logging API will always be called regardless of the output file. This means that if you really
+ //! want to disable logging at emitter level you must not attach a logger to it.
inline void setFile(FILE* file) noexcept { _file = file; }
//! \}
@@ -167,10 +141,6 @@ public:
ASMJIT_API Error _log(const char* data, size_t size = SIZE_MAX) noexcept override;
};
-// ============================================================================
-// [asmjit::StringLogger]
-// ============================================================================
-
//! Logger that stores everything in an internal string buffer.
class ASMJIT_VIRTAPI StringLogger : public Logger {
public:
diff --git a/3rdparty/asmjit/src/asmjit/core/misc_p.h b/3rdparty/asmjit/src/asmjit/core/misc_p.h
index b1056f473ae..5cd934e4628 100644
--- a/3rdparty/asmjit/src/asmjit/core/misc_p.h
+++ b/3rdparty/asmjit/src/asmjit/core/misc_p.h
@@ -1,25 +1,7 @@
-// AsmJit - Machine code generation for C++
+// This file is part of AsmJit project <https://asmjit.com>
//
-// * Official AsmJit Home Page: https://asmjit.com
-// * Official Github Repository: https://github.com/asmjit/asmjit
-//
-// Copyright (c) 2008-2020 The AsmJit Authors
-//
-// This software is provided 'as-is', without any express or implied
-// warranty. In no event will the authors be held liable for any damages
-// arising from the use of this software.
-//
-// Permission is granted to anyone to use this software for any purpose,
-// including commercial applications, and to alter it and redistribute it
-// freely, subject to the following restrictions:
-//
-// 1. The origin of this software must not be misrepresented; you must not
-// claim that you wrote the original software. If you use this software
-// in a product, an acknowledgment in the product documentation would be
-// appreciated but is not required.
-// 2. Altered source versions must be plainly marked as such, and must not be
-// misrepresented as being the original software.
-// 3. This notice may not be removed or altered from any source distribution.
+// See asmjit.h or LICENSE.md for license and copyright information
+// SPDX-License-Identifier: Zlib
#ifndef ASMJIT_CORE_MISC_P_H_INCLUDED
#define ASMJIT_CORE_MISC_P_H_INCLUDED
@@ -32,9 +14,11 @@ ASMJIT_BEGIN_NAMESPACE
//! \addtogroup asmjit_utilities
//! \{
-#define ASMJIT_LOOKUP_TABLE_8(T, I) T((I)), T((I+1)), T((I+2)), T((I+3)), T((I+4)), T((I+5)), T((I+6)), T((I+7))
+#define ASMJIT_LOOKUP_TABLE_4(T, I) T((I)), T((I+1)), T((I+2)), T((I+3))
+#define ASMJIT_LOOKUP_TABLE_8(T, I) ASMJIT_LOOKUP_TABLE_4(T, I), ASMJIT_LOOKUP_TABLE_4(T, I + 4)
#define ASMJIT_LOOKUP_TABLE_16(T, I) ASMJIT_LOOKUP_TABLE_8(T, I), ASMJIT_LOOKUP_TABLE_8(T, I + 8)
#define ASMJIT_LOOKUP_TABLE_32(T, I) ASMJIT_LOOKUP_TABLE_16(T, I), ASMJIT_LOOKUP_TABLE_16(T, I + 16)
+#define ASMJIT_LOOKUP_TABLE_40(T, I) ASMJIT_LOOKUP_TABLE_16(T, I), ASMJIT_LOOKUP_TABLE_16(T, I + 16), ASMJIT_LOOKUP_TABLE_8(T, I + 32)
#define ASMJIT_LOOKUP_TABLE_64(T, I) ASMJIT_LOOKUP_TABLE_32(T, I), ASMJIT_LOOKUP_TABLE_32(T, I + 32)
#define ASMJIT_LOOKUP_TABLE_128(T, I) ASMJIT_LOOKUP_TABLE_64(T, I), ASMJIT_LOOKUP_TABLE_64(T, I + 64)
#define ASMJIT_LOOKUP_TABLE_256(T, I) ASMJIT_LOOKUP_TABLE_128(T, I), ASMJIT_LOOKUP_TABLE_128(T, I + 128)
diff --git a/3rdparty/asmjit/src/asmjit/core/operand.cpp b/3rdparty/asmjit/src/asmjit/core/operand.cpp
index 46bb23a289c..ee026817f8e 100644
--- a/3rdparty/asmjit/src/asmjit/core/operand.cpp
+++ b/3rdparty/asmjit/src/asmjit/core/operand.cpp
@@ -1,36 +1,22 @@
-// AsmJit - Machine code generation for C++
+// This file is part of AsmJit project <https://asmjit.com>
//
-// * Official AsmJit Home Page: https://asmjit.com
-// * Official Github Repository: https://github.com/asmjit/asmjit
-//
-// Copyright (c) 2008-2020 The AsmJit Authors
-//
-// This software is provided 'as-is', without any express or implied
-// warranty. In no event will the authors be held liable for any damages
-// arising from the use of this software.
-//
-// Permission is granted to anyone to use this software for any purpose,
-// including commercial applications, and to alter it and redistribute it
-// freely, subject to the following restrictions:
-//
-// 1. The origin of this software must not be misrepresented; you must not
-// claim that you wrote the original software. If you use this software
-// in a product, an acknowledgment in the product documentation would be
-// appreciated but is not required.
-// 2. Altered source versions must be plainly marked as such, and must not be
-// misrepresented as being the original software.
-// 3. This notice may not be removed or altered from any source distribution.
+// See asmjit.h or LICENSE.md for license and copyright information
+// SPDX-License-Identifier: Zlib
#include "../core/api-build_p.h"
#include "../core/operand.h"
ASMJIT_BEGIN_NAMESPACE
-// ============================================================================
-// [asmjit::Operand - Unit]
-// ============================================================================
+// Operand - Tests
+// ===============
#if defined(ASMJIT_TEST)
+enum class StrongEnumForImmTests : uint32_t {
+ kValue0,
+ kValue0xFFFFFFFF = 0xFFFFFFFFu
+};
+
UNIT(operand) {
INFO("Checking operand sizes");
EXPECT(sizeof(Operand) == 16);
@@ -65,22 +51,23 @@ UNIT(operand) {
EXPECT(dummy.as<BaseReg>().isValid() == false);
// Create some register (not specific to any architecture).
- uint32_t rSig = Operand::kOpReg | (1 << Operand::kSignatureRegTypeShift ) |
- (2 << Operand::kSignatureRegGroupShift) |
- (8 << Operand::kSignatureSizeShift ) ;
+ OperandSignature rSig = OperandSignature::fromOpType(OperandType::kReg) |
+ OperandSignature::fromRegType(RegType::kVec128) |
+ OperandSignature::fromRegGroup(RegGroup::kVec) |
+ OperandSignature::fromSize(8);
BaseReg r1(rSig, 5);
EXPECT(r1.isValid() == true);
EXPECT(r1.isReg() == true);
- EXPECT(r1.isReg(1) == true);
+ EXPECT(r1.isReg(RegType::kVec128) == true);
EXPECT(r1.isPhysReg() == true);
EXPECT(r1.isVirtReg() == false);
EXPECT(r1.signature() == rSig);
- EXPECT(r1.type() == 1);
- EXPECT(r1.group() == 2);
+ EXPECT(r1.type() == RegType::kVec128);
+ EXPECT(r1.group() == RegGroup::kVec);
EXPECT(r1.size() == 8);
EXPECT(r1.id() == 5);
- EXPECT(r1.isReg(1, 5) == true); // RegType and Id.
+ EXPECT(r1.isReg(RegType::kVec128, 5) == true); // RegType and Id.
EXPECT(r1._data[0] == 0);
EXPECT(r1._data[1] == 0);
@@ -88,7 +75,7 @@ UNIT(operand) {
BaseReg r2(r1, 6);
EXPECT(r2.isValid() == true);
EXPECT(r2.isReg() == true);
- EXPECT(r2.isReg(1) == true);
+ EXPECT(r2.isReg(RegType::kVec128) == true);
EXPECT(r2.isPhysReg() == true);
EXPECT(r2.isVirtReg() == false);
EXPECT(r2.signature() == rSig);
@@ -96,7 +83,7 @@ UNIT(operand) {
EXPECT(r2.group() == r1.group());
EXPECT(r2.size() == r1.size());
EXPECT(r2.id() == 6);
- EXPECT(r2.isReg(1, 6) == true);
+ EXPECT(r2.isReg(RegType::kVec128, 6) == true);
r1.reset();
EXPECT(!r1.isReg());
@@ -126,10 +113,19 @@ UNIT(operand) {
INFO("Checking basic functionality of Imm");
Imm immValue(-42);
+ EXPECT(immValue.type() == ImmType::kInt);
EXPECT(Imm(-1).value() == -1);
EXPECT(imm(-1).value() == -1);
EXPECT(immValue.value() == -42);
EXPECT(imm(0xFFFFFFFF).value() == int64_t(0xFFFFFFFF));
+
+ Imm immDouble(0.4);
+ EXPECT(immDouble.type() == ImmType::kDouble);
+ EXPECT(immDouble.valueAs<double>() == 0.4);
+ EXPECT(immDouble == imm(0.4));
+
+ EXPECT(Imm(StrongEnumForImmTests::kValue0).value() == 0);
+ EXPECT(Imm(StrongEnumForImmTests::kValue0xFFFFFFFF).value() == 0xFFFFFFFFu);
}
#endif
diff --git a/3rdparty/asmjit/src/asmjit/core/operand.h b/3rdparty/asmjit/src/asmjit/core/operand.h
index 01cc1eaa560..2f81a217f1b 100644
--- a/3rdparty/asmjit/src/asmjit/core/operand.h
+++ b/3rdparty/asmjit/src/asmjit/core/operand.h
@@ -1,225 +1,478 @@
-// AsmJit - Machine code generation for C++
+// This file is part of AsmJit project <https://asmjit.com>
//
-// * Official AsmJit Home Page: https://asmjit.com
-// * Official Github Repository: https://github.com/asmjit/asmjit
-//
-// Copyright (c) 2008-2020 The AsmJit Authors
-//
-// This software is provided 'as-is', without any express or implied
-// warranty. In no event will the authors be held liable for any damages
-// arising from the use of this software.
-//
-// Permission is granted to anyone to use this software for any purpose,
-// including commercial applications, and to alter it and redistribute it
-// freely, subject to the following restrictions:
-//
-// 1. The origin of this software must not be misrepresented; you must not
-// claim that you wrote the original software. If you use this software
-// in a product, an acknowledgment in the product documentation would be
-// appreciated but is not required.
-// 2. Altered source versions must be plainly marked as such, and must not be
-// misrepresented as being the original software.
-// 3. This notice may not be removed or altered from any source distribution.
+// See asmjit.h or LICENSE.md for license and copyright information
+// SPDX-License-Identifier: Zlib
#ifndef ASMJIT_CORE_OPERAND_H_INCLUDED
#define ASMJIT_CORE_OPERAND_H_INCLUDED
+#include "../core/archcommons.h"
#include "../core/support.h"
+#include "../core/type.h"
ASMJIT_BEGIN_NAMESPACE
-// ============================================================================
-// [Macros]
-// ============================================================================
-
-//! Adds a template specialization for `REG_TYPE` into the local `RegTraits`.
-#define ASMJIT_DEFINE_REG_TRAITS(REG, REG_TYPE, GROUP, SIZE, COUNT, TYPE_ID) \
-template<> \
-struct RegTraits<REG_TYPE> { \
- typedef REG RegT; \
- \
- static constexpr uint32_t kValid = 1; \
- static constexpr uint32_t kCount = COUNT; \
- static constexpr uint32_t kTypeId = TYPE_ID; \
- \
- static constexpr uint32_t kType = REG_TYPE; \
- static constexpr uint32_t kGroup = GROUP; \
- static constexpr uint32_t kSize = SIZE; \
- \
- static constexpr uint32_t kSignature = \
- (Operand::kOpReg << Operand::kSignatureOpShift ) | \
- (kType << Operand::kSignatureRegTypeShift ) | \
- (kGroup << Operand::kSignatureRegGroupShift) | \
- (kSize << Operand::kSignatureSizeShift ) ; \
-}
-
-//! Adds constructors and member functions to a class that implements abstract
-//! register. Abstract register is register that doesn't have type or signature
-//! yet, it's a base class like `x86::Reg` or `arm::Reg`.
-#define ASMJIT_DEFINE_ABSTRACT_REG(REG, BASE) \
-public: \
- /*! Default constructor that only setups basics. */ \
- constexpr REG() noexcept \
- : BASE(kSignature, kIdBad) {} \
- \
- /*! Makes a copy of the `other` register operand. */ \
- constexpr REG(const REG& other) noexcept \
- : BASE(other) {} \
- \
- /*! Makes a copy of the `other` register having id set to `rId` */ \
- constexpr REG(const BaseReg& other, uint32_t rId) noexcept \
- : BASE(other, rId) {} \
- \
- /*! Creates a register based on `signature` and `rId`. */ \
- constexpr REG(uint32_t signature, uint32_t rId) noexcept \
- : BASE(signature, rId) {} \
- \
- /*! Creates a completely uninitialized REG register operand (garbage). */ \
- inline explicit REG(Globals::NoInit_) noexcept \
- : BASE(Globals::NoInit) {} \
- \
- /*! Creates a new register from register type and id. */ \
- static inline REG fromTypeAndId(uint32_t rType, uint32_t rId) noexcept { \
- return REG(signatureOf(rType), rId); \
- } \
- \
- /*! Clones the register operand. */ \
- constexpr REG clone() const noexcept { return REG(*this); } \
- \
- inline REG& operator=(const REG& other) noexcept = default;
-
-//! Adds constructors and member functions to a class that implements final
-//! register. Final registers MUST HAVE a valid signature.
-#define ASMJIT_DEFINE_FINAL_REG(REG, BASE, TRAITS) \
-public: \
- static constexpr uint32_t kThisType = TRAITS::kType; \
- static constexpr uint32_t kThisGroup = TRAITS::kGroup; \
- static constexpr uint32_t kThisSize = TRAITS::kSize; \
- static constexpr uint32_t kSignature = TRAITS::kSignature; \
- \
- ASMJIT_DEFINE_ABSTRACT_REG(REG, BASE) \
- \
- /*! Creates a register operand having its id set to `rId`. */ \
- constexpr explicit REG(uint32_t rId) noexcept \
- : BASE(kSignature, rId) {}
-
//! \addtogroup asmjit_assembler
//! \{
-// ============================================================================
-// [asmjit::Operand_]
-// ============================================================================
+//! Operand type used by \ref Operand_.
+enum class OperandType : uint32_t {
+ //! Not an operand or not initialized.
+ kNone = 0,
+ //! Operand is a register.
+ kReg = 1,
+ //! Operand is a memory.
+ kMem = 2,
+ //! Operand is an immediate value.
+ kImm = 3,
+ //! Operand is a label.
+ kLabel = 4,
+
+ //! Maximum value of `OperandType`.
+ kMaxValue = kLabel
+};
-//! Constructor-less `Operand`.
-//!
-//! Contains no initialization code and can be used safely to define an array
-//! of operands that won't be initialized. This is an `Operand` compatible
-//! data structure designed to be statically initialized, static const, or to
-//! be used by the user to define an array of operands without having them
-//! default initialized.
-//!
-//! The key difference between `Operand` and `Operand_`:
+static_assert(uint32_t(OperandType::kMem) == uint32_t(OperandType::kReg) + 1,
+ "AsmJit requires that `OperandType::kMem` equals to `OperandType::kReg + 1`");
+
+//! Register mask is a convenience typedef that describes a mask where each bit describes a physical register id
+//! in the same \ref RegGroup. At the moment 32 bits are enough as AsmJit doesn't support any architecture that
+//! would provide more than 32 registers for a register group.
+typedef uint32_t RegMask;
+
+//! Register type.
//!
-//! ```
-//! Operand_ xArray[10]; // Not initialized, contains garbage.
-//! Operand yArray[10]; // All operands initialized to none.
-//! ```
-struct Operand_ {
- //! Operand's signature that provides operand type and additional information.
- uint32_t _signature;
- //! Either base id as used by memory operand or any id as used by others.
- uint32_t _baseId;
+//! Provides a unique type that can be used to identify a register or its view.
+enum class RegType : uint8_t {
+ //! No register - unused, invalid, multiple meanings.
+ kNone = 0,
- //! Data specific to the operand type.
+ //! This is not a register type. This value is reserved for a \ref Label that used in \ref BaseMem as a base.
//!
- //! The reason we don't use union is that we have `constexpr` constructors that
- //! construct operands and other `constexpr` functions that return wither another
- //! Operand or something else. These cannot generally work with unions so we also
- //! cannot use `union` if we want to be standard compliant.
- uint32_t _data[2];
+ //! Label tag is used as a sub-type, forming a unique signature across all operand types as 0x1 is never associated
+ //! with any register type. This means that a memory operand's BASE register can be constructed from virtually any
+ //! operand (register vs. label) by just assigning its type (register type or label-tag) and operand id.
+ kLabelTag = 1,
+
+ //! Universal type describing program counter (PC) or instruction pointer (IP) register, if the target architecture
+ //! actually exposes it as a separate register type, which most modern targets do.
+ kPC = 2,
+
+ //! 8-bit low general purpose register (X86).
+ kGp8Lo = 3,
+ //! 8-bit high general purpose register (X86).
+ kGp8Hi = 4,
+ //! 16-bit general purpose register (X86).
+ kGp16 = 5,
+ //! 32-bit general purpose register (X86|ARM).
+ kGp32 = 6,
+ //! 64-bit general purpose register (X86|ARM).
+ kGp64 = 7,
+ //! 8-bit view of a vector register (ARM).
+ kVec8 = 8,
+ //! 16-bit view of a vector register (ARM).
+ kVec16 = 9,
+ //! 32-bit view of a vector register (ARM).
+ kVec32 = 10,
+ //! 64-bit view of a vector register (ARM).
+ //!
+ //! \note This is never used for MMX registers on X86, MMX registers have its own category.
+ kVec64 = 11,
+ //! 128-bit view of a vector register (X86|ARM).
+ kVec128 = 12,
+ //! 256-bit view of a vector register (X86).
+ kVec256 = 13,
+ //! 512-bit view of a vector register (X86).
+ kVec512 = 14,
+ //! 1024-bit view of a vector register (future).
+ kVec1024 = 15,
+ //! View of a vector register, which width is implementation specific (AArch64).
+ kVecNLen = 16,
+
+ //! Mask register (X86).
+ kMask = 17,
+
+ //! Start of architecture dependent register types.
+ kExtra = 18,
+
+ // X86 Specific Register Types
+ // ---------------------------
+
+ // X86 Specific Register Types
+ // ===========================
+
+ //! Instruction pointer (RIP), only addressable in \ref x86::Mem in 64-bit targets.
+ kX86_Rip = kPC,
+ //! Low GPB register (AL, BL, CL, DL, ...).
+ kX86_GpbLo = kGp8Lo,
+ //! High GPB register (AH, BH, CH, DH only).
+ kX86_GpbHi = kGp8Hi,
+ //! GPW register.
+ kX86_Gpw = kGp16,
+ //! GPD register.
+ kX86_Gpd = kGp32,
+ //! GPQ register (64-bit).
+ kX86_Gpq = kGp64,
+ //! XMM register (SSE+).
+ kX86_Xmm = kVec128,
+ //! YMM register (AVX+).
+ kX86_Ymm = kVec256,
+ //! ZMM register (AVX512+).
+ kX86_Zmm = kVec512,
+ //! K register (AVX512+).
+ kX86_KReg = kMask,
+ //! MMX register.
+ kX86_Mm = kExtra + 0,
+ //! Segment register (None, ES, CS, SS, DS, FS, GS).
+ kX86_SReg = kExtra + 1,
+ //! Control register (CR).
+ kX86_CReg = kExtra + 2,
+ //! Debug register (DR).
+ kX86_DReg = kExtra + 3,
+ //! FPU (x87) register.
+ kX86_St = kExtra + 4,
+ //! Bound register (BND).
+ kX86_Bnd = kExtra + 5,
+ //! TMM register (AMX_TILE)
+ kX86_Tmm = kExtra + 6,
+
+ // ARM Specific Register Types
+ // ===========================
+
+ //! Program pointer (PC) register (AArch64).
+ kARM_PC = kPC,
+ //! 32-bit general purpose register (R or W).
+ kARM_GpW = kGp32,
+ //! 64-bit general purpose register (X).
+ kARM_GpX = kGp64,
+ //! 8-bit view of VFP/ASIMD register (B).
+ kARM_VecB = kVec8,
+ //! 16-bit view of VFP/ASIMD register (H).
+ kARM_VecH = kVec16,
+ //! 32-bit view of VFP/ASIMD register (S).
+ kARM_VecS = kVec32,
+ //! 64-bit view of VFP/ASIMD register (D).
+ kARM_VecD = kVec64,
+ //! 128-bit view of VFP/ASIMD register (Q|V).
+ kARM_VecV = kVec128,
+
+ //! Maximum value of `RegType`.
+ kMaxValue = 31
+};
+ASMJIT_DEFINE_ENUM_COMPARE(RegType)
- //! Indexes to `_data` array.
- enum DataIndex : uint32_t {
- kDataMemIndexId = 0,
- kDataMemOffsetLo = 1,
+//! Register group.
+//!
+//! Provides a unique value that identifies groups of registers and their views.
+enum class RegGroup : uint8_t {
+ //! General purpose register group compatible with all backends.
+ kGp = 0,
+ //! Vector register group compatible with all backends.
+ //!
+ //! Describes X86 XMM|YMM|ZMM registers ARM/AArch64 V registers.
+ kVec = 1,
+
+ //! Extra virtual group #2 that can be used by Compiler for register allocation.
+ kExtraVirt2 = 2,
+ //! Extra virtual group #3 that can be used by Compiler for register allocation.
+ kExtraVirt3 = 3,
+
+ //! Program counter group.
+ kPC = 4,
+
+ //! Extra non-virtual group that can be used by registers not managed by Compiler.
+ kExtraNonVirt = 5,
+
+ // X86 Specific Register Groups
+ // ----------------------------
+
+ //! K register group (KReg) - maps to \ref RegGroup::kExtraVirt2 (X86, X86_64).
+ kX86_K = kExtraVirt2,
+ //! MMX register group (MM) - maps to \ref RegGroup::kExtraVirt3 (X86, X86_64).
+ kX86_MM = kExtraVirt3,
+
+ //! Instruction pointer (X86, X86_64).
+ kX86_Rip = kPC,
+ //! Segment register group (X86, X86_64).
+ kX86_SReg = kExtraNonVirt + 0,
+ //! CR register group (X86, X86_64).
+ kX86_CReg = kExtraNonVirt + 1,
+ //! DR register group (X86, X86_64).
+ kX86_DReg = kExtraNonVirt + 2,
+ //! FPU register group (X86, X86_64).
+ kX86_St = kExtraNonVirt + 3,
+ //! BND register group (X86, X86_64).
+ kX86_Bnd = kExtraNonVirt + 4,
+ //! TMM register group (X86, X86_64).
+ kX86_Tmm = kExtraNonVirt + 5,
+
+ //! First group - only used in loops.
+ k0 = 0,
+ //! Last value of a virtual register that is managed by \ref BaseCompiler.
+ kMaxVirt = Globals::kNumVirtGroups - 1,
+ //! Maximum value of `RegGroup`.
+ kMaxValue = 15
+};
+ASMJIT_DEFINE_ENUM_COMPARE(RegGroup)
- kDataImmValueLo = ASMJIT_ARCH_LE ? 0 : 1,
- kDataImmValueHi = ASMJIT_ARCH_LE ? 1 : 0
- };
+typedef Support::EnumValues<RegGroup, RegGroup::kGp, RegGroup::kMaxVirt> RegGroupVirtValues;
- //! Operand types that can be encoded in `Operand`.
- enum OpType : uint32_t {
- //! Not an operand or not initialized.
- kOpNone = 0,
- //! Operand is a register.
- kOpReg = 1,
- //! Operand is a memory.
- kOpMem = 2,
- //! Operand is an immediate value.
- kOpImm = 3,
- //! Operand is a label.
- kOpLabel = 4
- };
- static_assert(kOpMem == kOpReg + 1, "asmjit::Operand requires `kOpMem` to be `kOpReg+1`.");
-
- //! Label tag.
- enum LabelTag {
- //! Label tag is used as a sub-type, forming a unique signature across all
- //! operand types as 0x1 is never associated with any register type. This
- //! means that a memory operand's BASE register can be constructed from
- //! virtually any operand (register vs. label) by just assigning its type
- //! (register type or label-tag) and operand id.
- kLabelTag = 0x1
- };
+//! Operand signature is a 32-bit number describing \ref Operand and some of its payload.
+//!
+//! In AsmJit operand signature is used to store additional payload of register, memory, and immediate operands.
+//! In practice the biggest pressure on OperandSignature is from \ref BaseMem and architecture specific memory
+//! operands that need to store additional payload that cannot be stored elsewhere as values of all other members
+//! are fully specified by \ref BaseMem.
+struct OperandSignature {
+ //! \name Constants
+ //! \{
- // \cond INTERNAL
- enum SignatureBits : uint32_t {
+ enum : uint32_t {
// Operand type (3 least significant bits).
// |........|........|........|.....XXX|
- kSignatureOpShift = 0,
- kSignatureOpMask = 0x07u << kSignatureOpShift,
+ kOpTypeShift = 0,
+ kOpTypeMask = 0x07u << kOpTypeShift,
// Register type (5 bits).
// |........|........|........|XXXXX...|
- kSignatureRegTypeShift = 3,
- kSignatureRegTypeMask = 0x1Fu << kSignatureRegTypeShift,
+ kRegTypeShift = 3,
+ kRegTypeMask = 0x1Fu << kRegTypeShift,
// Register group (4 bits).
// |........|........|....XXXX|........|
- kSignatureRegGroupShift = 8,
- kSignatureRegGroupMask = 0x0Fu << kSignatureRegGroupShift,
+ kRegGroupShift = 8,
+ kRegGroupMask = 0x0Fu << kRegGroupShift,
// Memory base type (5 bits).
// |........|........|........|XXXXX...|
- kSignatureMemBaseTypeShift = 3,
- kSignatureMemBaseTypeMask = 0x1Fu << kSignatureMemBaseTypeShift,
+ kMemBaseTypeShift = 3,
+ kMemBaseTypeMask = 0x1Fu << kMemBaseTypeShift,
// Memory index type (5 bits).
// |........|........|...XXXXX|........|
- kSignatureMemIndexTypeShift = 8,
- kSignatureMemIndexTypeMask = 0x1Fu << kSignatureMemIndexTypeShift,
+ kMemIndexTypeShift = 8,
+ kMemIndexTypeMask = 0x1Fu << kMemIndexTypeShift,
// Memory base+index combined (10 bits).
// |........|........|...XXXXX|XXXXX...|
- kSignatureMemBaseIndexShift = 3,
- kSignatureMemBaseIndexMask = 0x3FFu << kSignatureMemBaseIndexShift,
+ kMemBaseIndexShift = 3,
+ kMemBaseIndexMask = 0x3FFu << kMemBaseIndexShift,
+
+ // This memory operand represents a home-slot or stack (Compiler) (1 bit).
+ // |........|........|..X.....|........|
+ kMemRegHomeShift = 13,
+ kMemRegHomeFlag = 0x01u << kMemRegHomeShift,
- // Memory address type (2 bits).
- // |........|........|.XX.....|........|
- kSignatureMemAddrTypeShift = 13,
- kSignatureMemAddrTypeMask = 0x03u << kSignatureMemAddrTypeShift,
+ // Immediate type (1 bit).
+ // |........|........|........|....X...|
+ kImmTypeShift = 3,
+ kImmTypeMask = 0x01u << kImmTypeShift,
- // This memory operand represents a home-slot or stack (BaseCompiler).
- // |........|........|X.......|........|
- kSignatureMemRegHomeShift = 15,
- kSignatureMemRegHomeFlag = 0x01u << kSignatureMemRegHomeShift,
+ // Predicate used by either registers or immediate values (4 bits).
+ // |........|XXXX....|........|........|
+ kPredicateShift = 20,
+ kPredicateMask = 0x0Fu << kPredicateShift,
// Operand size (8 most significant bits).
// |XXXXXXXX|........|........|........|
- kSignatureSizeShift = 24,
- kSignatureSizeMask = 0xFFu << kSignatureSizeShift
+ kSizeShift = 24,
+ kSizeMask = 0xFFu << kSizeShift
+ };
+
+ //! \}
+
+ //! \name Members
+ //! \{
+
+ uint32_t _bits;
+
+ //! \}
+
+ //! \name Overloaded Operators
+ //!
+ //! Overloaded operators make `OperandSignature` behave like regular integer.
+ //!
+ //! \{
+
+ inline constexpr bool operator!() const noexcept { return _bits != 0; }
+ inline constexpr explicit operator bool() const noexcept { return _bits != 0; }
+
+ inline OperandSignature& operator|=(uint32_t x) noexcept { _bits |= x; return *this; }
+ inline OperandSignature& operator&=(uint32_t x) noexcept { _bits &= x; return *this; }
+ inline OperandSignature& operator^=(uint32_t x) noexcept { _bits ^= x; return *this; }
+
+ inline OperandSignature& operator|=(const OperandSignature& other) noexcept { return operator|=(other._bits); }
+ inline OperandSignature& operator&=(const OperandSignature& other) noexcept { return operator&=(other._bits); }
+ inline OperandSignature& operator^=(const OperandSignature& other) noexcept { return operator^=(other._bits); }
+
+ inline constexpr OperandSignature operator~() const noexcept { return OperandSignature{~_bits}; }
+
+ inline constexpr OperandSignature operator|(uint32_t x) const noexcept { return OperandSignature{_bits | x}; }
+ inline constexpr OperandSignature operator&(uint32_t x) const noexcept { return OperandSignature{_bits & x}; }
+ inline constexpr OperandSignature operator^(uint32_t x) const noexcept { return OperandSignature{_bits ^ x}; }
+
+ inline constexpr OperandSignature operator|(const OperandSignature& other) const noexcept { return OperandSignature{_bits | other._bits}; }
+ inline constexpr OperandSignature operator&(const OperandSignature& other) const noexcept { return OperandSignature{_bits & other._bits}; }
+ inline constexpr OperandSignature operator^(const OperandSignature& other) const noexcept { return OperandSignature{_bits ^ other._bits}; }
+
+ inline constexpr bool operator==(uint32_t x) const noexcept { return _bits == x; }
+ inline constexpr bool operator!=(uint32_t x) const noexcept { return _bits != x; }
+
+ inline constexpr bool operator==(const OperandSignature& other) const noexcept { return _bits == other._bits; }
+ inline constexpr bool operator!=(const OperandSignature& other) const noexcept { return _bits != other._bits; }
+
+ //! \}
+
+ //! \name Accessors
+ //! \{
+
+ inline void reset() noexcept { _bits = 0; }
+
+ inline constexpr uint32_t bits() const noexcept { return _bits; }
+ inline void setBits(uint32_t bits) noexcept { _bits = bits; }
+
+ template<uint32_t kFieldMask, uint32_t kFieldShift = Support::ConstCTZ<kFieldMask>::value>
+ inline constexpr bool hasField() const noexcept {
+ return (_bits & kFieldMask) != 0;
+ }
+
+ template<uint32_t kFieldMask, uint32_t kFieldShift = Support::ConstCTZ<kFieldMask>::value>
+ inline constexpr bool hasField(uint32_t value) const noexcept {
+ return (_bits & kFieldMask) != value << kFieldShift;
+ }
+
+ template<uint32_t kFieldMask, uint32_t kFieldShift = Support::ConstCTZ<kFieldMask>::value>
+ inline constexpr uint32_t getField() const noexcept {
+ return (_bits >> kFieldShift) & (kFieldMask >> kFieldShift);
+ }
+
+ template<uint32_t kFieldMask, uint32_t kFieldShift = Support::ConstCTZ<kFieldMask>::value>
+ inline void setField(uint32_t value) noexcept {
+ ASMJIT_ASSERT((value & ~(kFieldMask >> kFieldShift)) == 0);
+ _bits = (_bits & ~kFieldMask) | (value << kFieldShift);
+ }
+
+ inline constexpr OperandSignature subset(uint32_t mask) const noexcept { return OperandSignature{_bits & mask}; }
+
+ template<uint32_t kFieldMask>
+ inline constexpr bool matchesSignature(const OperandSignature& signature) const noexcept {
+ return (_bits & kFieldMask) == signature._bits;
+ }
+
+ template<uint32_t kFieldMask>
+ inline constexpr bool matchesFields(uint32_t bits) const noexcept {
+ return (_bits & kFieldMask) == bits;
+ }
+
+ template<uint32_t kFieldMask>
+ inline constexpr bool matchesFields(const OperandSignature& fields) const noexcept {
+ return (_bits & kFieldMask) == fields._bits;
+ }
+
+ inline constexpr bool isValid() const noexcept { return _bits != 0; }
+
+ inline constexpr OperandType opType() const noexcept { return (OperandType)getField<kOpTypeMask>(); }
+
+ inline constexpr RegType regType() const noexcept { return (RegType)getField<kRegTypeMask>(); }
+ inline constexpr RegGroup regGroup() const noexcept { return (RegGroup)getField<kRegGroupMask>(); }
+
+ inline constexpr RegType memBaseType() const noexcept { return (RegType)getField<kMemBaseTypeMask>(); }
+ inline constexpr RegType memIndexType() const noexcept { return (RegType)getField<kMemIndexTypeMask>(); }
+
+ inline constexpr uint32_t predicate() const noexcept { return getField<kPredicateMask>(); }
+ inline constexpr uint32_t size() const noexcept { return getField<kSizeMask>(); }
+
+ inline void setOpType(OperandType opType) noexcept { setField<kOpTypeMask>(uint32_t(opType)); }
+ inline void setRegType(RegType regType) noexcept { setField<kRegTypeMask>(uint32_t(regType)); }
+ inline void setRegGroup(RegGroup regGroup) noexcept { setField<kRegGroupMask>(uint32_t(regGroup)); }
+
+ inline void setMemBaseType(RegGroup baseType) noexcept { setField<kMemBaseTypeMask>(uint32_t(baseType)); }
+ inline void setMemIndexType(RegGroup indexType) noexcept { setField<kMemIndexTypeMask>(uint32_t(indexType)); }
+
+ inline void setPredicate(uint32_t predicate) noexcept { setField<kPredicateMask>(predicate); }
+ inline void setSize(uint32_t size) noexcept { setField<kSizeMask>(size); }
+
+ //! \}
+
+ //! \name Static Constructors
+ //! \{
+
+ static inline constexpr OperandSignature fromBits(uint32_t bits) noexcept {
+ return OperandSignature{bits};
+ }
+
+ template<uint32_t kFieldMask, typename T>
+ static inline constexpr OperandSignature fromValue(const T& value) noexcept {
+ return OperandSignature{uint32_t(value) << Support::ConstCTZ<kFieldMask>::value};
+ }
+
+ static inline constexpr OperandSignature fromOpType(OperandType opType) noexcept {
+ return OperandSignature{uint32_t(opType) << kOpTypeShift};
+ }
+
+ static inline constexpr OperandSignature fromRegType(RegType regType) noexcept {
+ return OperandSignature{uint32_t(regType) << kRegTypeShift};
+ }
+
+ static inline constexpr OperandSignature fromRegGroup(RegGroup regGroup) noexcept {
+ return OperandSignature{uint32_t(regGroup) << kRegGroupShift};
+ }
+
+ static inline constexpr OperandSignature fromRegTypeAndGroup(RegType regType, RegGroup regGroup) noexcept {
+ return fromRegType(regType) | fromRegGroup(regGroup);
+ }
+
+ static inline constexpr OperandSignature fromMemBaseType(RegType baseType) noexcept {
+ return OperandSignature{uint32_t(baseType) << kMemBaseTypeShift};
+ }
+
+ static inline constexpr OperandSignature fromMemIndexType(RegType indexType) noexcept {
+ return OperandSignature{uint32_t(indexType) << kMemIndexTypeShift};
+ }
+
+ static inline constexpr OperandSignature fromPredicate(uint32_t predicate) noexcept {
+ return OperandSignature{predicate << kPredicateShift};
+ }
+
+ static inline constexpr OperandSignature fromSize(uint32_t size) noexcept {
+ return OperandSignature{size << kSizeShift};
+ }
+
+ //! \}
+};
+
+//! Base class representing an operand in AsmJit (non-default constructed version).
+//!
+//! Contains no initialization code and can be used safely to define an array of operands that won't be initialized.
+//! This is a \ref Operand base structure designed to be statically initialized, static const, or to be used by user
+//! code to define an array of operands without having them default initialized at construction time.
+//!
+//! The key difference between \ref Operand and \ref Operand_ is:
+//!
+//! ```
+//! Operand_ xArray[10]; // Not initialized, contains garbage.
+//! Operand_ yArray[10] {}; // All operands initialized to none explicitly (zero initialized).
+//! Operand yArray[10]; // All operands initialized to none implicitly (zero initialized).
+//! ```
+struct Operand_ {
+ //! \name Types
+ //! \{
+
+ typedef OperandSignature Signature;
+
+ //! \}
+
+ //! \name Constants
+ //! \{
+
+ // Indexes to `_data` array.
+ enum DataIndex : uint32_t {
+ kDataMemIndexId = 0,
+ kDataMemOffsetLo = 1,
+
+ kDataImmValueLo = ASMJIT_ARCH_LE ? 0 : 1,
+ kDataImmValueHi = ASMJIT_ARCH_LE ? 1 : 0
};
- //! \endcond
//! Constants useful for VirtId <-> Index translation.
enum VirtIdConstants : uint32_t {
@@ -231,22 +484,40 @@ struct Operand_ {
kVirtIdCount = uint32_t(kVirtIdMax - kVirtIdMin + 1)
};
- //! Tests whether the given `id` is a valid virtual register id. Since AsmJit
- //! supports both physical and virtual registers it must be able to distinguish
- //! between these two. The idea is that physical registers are always limited
- //! in size, so virtual identifiers start from `kVirtIdMin` and end at `kVirtIdMax`.
- static ASMJIT_INLINE bool isVirtId(uint32_t id) noexcept { return id - kVirtIdMin < uint32_t(kVirtIdCount); }
+ //! \}
+
+ //! \name Members
+ //! \{
+
+ //! Provides operand type and additional payload.
+ Signature _signature;
+ //! Either base id as used by memory operand or any id as used by others.
+ uint32_t _baseId;
+
+ //! Data specific to the operand type.
+ //!
+ //! The reason we don't use union is that we have `constexpr` constructors that construct operands and other
+ //!`constexpr` functions that return whether another Operand or something else. These cannot generally work with
+ //! unions so we also cannot use `union` if we want to be standard compliant.
+ uint32_t _data[2];
+
+ //! \}
+
+ //! Tests whether the given `id` is a valid virtual register id. Since AsmJit supports both physical and virtual
+ //! registers it must be able to distinguish between these two. The idea is that physical registers are always
+ //! limited in size, so virtual identifiers start from `kVirtIdMin` and end at `kVirtIdMax`.
+ static inline bool isVirtId(uint32_t id) noexcept { return id - kVirtIdMin < uint32_t(kVirtIdCount); }
//! Converts a real-id into a packed-id that can be stored in Operand.
- static ASMJIT_INLINE uint32_t indexToVirtId(uint32_t id) noexcept { return id + kVirtIdMin; }
+ static inline uint32_t indexToVirtId(uint32_t id) noexcept { return id + kVirtIdMin; }
//! Converts a packed-id back to real-id.
- static ASMJIT_INLINE uint32_t virtIdToIndex(uint32_t id) noexcept { return id - kVirtIdMin; }
+ static inline uint32_t virtIdToIndex(uint32_t id) noexcept { return id - kVirtIdMin; }
//! \name Construction & Destruction
//! \{
//! \cond INTERNAL
//! Initializes a `BaseReg` operand from `signature` and register `id`.
- inline void _initReg(uint32_t signature, uint32_t id) noexcept {
+ inline void _initReg(const Signature& signature, uint32_t id) noexcept {
_signature = signature;
_baseId = id;
_data[0] = 0;
@@ -260,14 +531,13 @@ struct Operand_ {
//! Resets the `Operand` to none.
//!
//! None operand is defined the following way:
- //! - Its signature is zero (kOpNone, and the rest zero as well).
+ //! - Its signature is zero (OperandType::kNone, and the rest zero as well).
//! - Its id is `0`.
//! - The reserved8_4 field is set to `0`.
//! - The reserved12_4 field is set to zero.
//!
- //! In other words, reset operands have all members set to zero. Reset operand
- //! must match the Operand state right after its construction. Alternatively,
- //! if you have an array of operands, you can simply use `memset()`.
+ //! In other words, reset operands have all members set to zero. Reset operand must match the Operand state
+ //! right after its construction. Alternatively, if you have an array of operands, you can simply use `memset()`.
//!
//! ```
//! using namespace asmjit;
@@ -286,7 +556,7 @@ struct Operand_ {
//! assert(a == b);
//! ```
inline void reset() noexcept {
- _signature = 0;
+ _signature.reset();
_baseId = 0;
_data[0] = 0;
_data[1] = 0;
@@ -294,13 +564,13 @@ struct Operand_ {
//! \}
- //! \name Operator Overloads
+ //! \name Overloaded Operators
//! \{
//! Tests whether this operand is the same as `other`.
- constexpr bool operator==(const Operand_& other) const noexcept { return equals(other); }
+ inline constexpr bool operator==(const Operand_& other) const noexcept { return equals(other); }
//! Tests whether this operand is not the same as `other`.
- constexpr bool operator!=(const Operand_& other) const noexcept { return !equals(other); }
+ inline constexpr bool operator!=(const Operand_& other) const noexcept { return !equals(other); }
//! \}
@@ -320,148 +590,116 @@ struct Operand_ {
//! \name Accessors
//! \{
- //! Tests whether the operand matches the given signature `sign`.
- constexpr bool hasSignature(uint32_t signature) const noexcept { return _signature == signature; }
- //! Tests whether the operand matches the signature of the `other` operand.
- constexpr bool hasSignature(const Operand_& other) const noexcept { return _signature == other.signature(); }
+ //! Tests whether the operand's signature matches the signature of the `other` operand.
+ inline constexpr bool hasSignature(const Operand_& other) const noexcept { return _signature == other._signature; }
+ //! Tests whether the operand's signature matches the given signature `sign`.
+ inline constexpr bool hasSignature(const Signature& other) const noexcept { return _signature == other; }
//! Returns operand signature as unsigned 32-bit integer.
//!
- //! Signature is first 4 bytes of the operand data. It's used mostly for
- //! operand checking as it's much faster to check 4 bytes at once than having
- //! to check these bytes individually.
- constexpr uint32_t signature() const noexcept { return _signature; }
+ //! Signature is first 4 bytes of the operand data. It's used mostly for operand checking as it's
+ //! much faster to check packed 4 bytes at once than having to check these bytes individually.
+ inline constexpr Signature signature() const noexcept { return _signature; }
//! Sets the operand signature, see `signature()`.
//!
//! \note Improper use of `setSignature()` can lead to hard-to-debug errors.
- inline void setSignature(uint32_t signature) noexcept { _signature = signature; }
-
- //! \cond INTERNAL
- template<uint32_t mask>
- constexpr bool _hasSignaturePart() const noexcept {
- return (_signature & mask) != 0;
- }
-
- template<uint32_t mask>
- constexpr uint32_t _getSignaturePart() const noexcept {
- return (_signature >> Support::constCtz(mask)) & (mask >> Support::constCtz(mask));
- }
-
- template<uint32_t mask>
- inline void _setSignaturePart(uint32_t value) noexcept {
- ASMJIT_ASSERT((value & ~(mask >> Support::constCtz(mask))) == 0);
- _signature = (_signature & ~mask) | (value << Support::constCtz(mask));
- }
- //! \endcond
+ inline void setSignature(const Signature& signature) noexcept { _signature = signature; }
//! Returns the type of the operand, see `OpType`.
- constexpr uint32_t opType() const noexcept { return _getSignaturePart<kSignatureOpMask>(); }
- //! Tests whether the operand is none (`kOpNone`).
- constexpr bool isNone() const noexcept { return _signature == 0; }
- //! Tests whether the operand is a register (`kOpReg`).
- constexpr bool isReg() const noexcept { return opType() == kOpReg; }
- //! Tests whether the operand is a memory location (`kOpMem`).
- constexpr bool isMem() const noexcept { return opType() == kOpMem; }
- //! Tests whether the operand is an immediate (`kOpImm`).
- constexpr bool isImm() const noexcept { return opType() == kOpImm; }
- //! Tests whether the operand is a label (`kOpLabel`).
- constexpr bool isLabel() const noexcept { return opType() == kOpLabel; }
+ inline constexpr OperandType opType() const noexcept { return _signature.opType(); }
+ //! Tests whether the operand is none (`OperandType::kNone`).
+ inline constexpr bool isNone() const noexcept { return _signature == Signature::fromBits(0); }
+ //! Tests whether the operand is a register (`OperandType::kReg`).
+ inline constexpr bool isReg() const noexcept { return opType() == OperandType::kReg; }
+ //! Tests whether the operand is a memory location (`OperandType::kMem`).
+ inline constexpr bool isMem() const noexcept { return opType() == OperandType::kMem; }
+ //! Tests whether the operand is an immediate (`OperandType::kImm`).
+ inline constexpr bool isImm() const noexcept { return opType() == OperandType::kImm; }
+ //! Tests whether the operand is a label (`OperandType::kLabel`).
+ inline constexpr bool isLabel() const noexcept { return opType() == OperandType::kLabel; }
//! Tests whether the operand is a physical register.
- constexpr bool isPhysReg() const noexcept { return isReg() && _baseId < 0xFFu; }
+ inline constexpr bool isPhysReg() const noexcept { return isReg() && _baseId < 0xFFu; }
//! Tests whether the operand is a virtual register.
- constexpr bool isVirtReg() const noexcept { return isReg() && _baseId > 0xFFu; }
+ inline constexpr bool isVirtReg() const noexcept { return isReg() && _baseId > 0xFFu; }
//! Tests whether the operand specifies a size (i.e. the size is not zero).
- constexpr bool hasSize() const noexcept { return _hasSignaturePart<kSignatureSizeMask>(); }
+ inline constexpr bool hasSize() const noexcept { return _signature.hasField<Signature::kSizeMask>(); }
//! Tests whether the size of the operand matches `size`.
- constexpr bool hasSize(uint32_t s) const noexcept { return size() == s; }
+ inline constexpr bool hasSize(uint32_t s) const noexcept { return size() == s; }
//! Returns the size of the operand in bytes.
//!
//! The value returned depends on the operand type:
//! * None - Should always return zero size.
- //! * Reg - Should always return the size of the register. If the register
- //! size depends on architecture (like `x86::CReg` and `x86::DReg`)
- //! the size returned should be the greatest possible (so it should
- //! return 64-bit size in such case).
+ //! * Reg - Should always return the size of the register. If the register size depends on architecture
+ //! (like `x86::CReg` and `x86::DReg`) the size returned should be the greatest possible (so it
+ //! should return 64-bit size in such case).
//! * Mem - Size is optional and will be in most cases zero.
//! * Imm - Should always return zero size.
//! * Label - Should always return zero size.
- constexpr uint32_t size() const noexcept { return _getSignaturePart<kSignatureSizeMask>(); }
+ inline constexpr uint32_t size() const noexcept { return _signature.getField<Signature::kSizeMask>(); }
//! Returns the operand id.
//!
//! The value returned should be interpreted accordingly to the operand type:
//! * None - Should be `0`.
//! * Reg - Physical or virtual register id.
- //! * Mem - Multiple meanings - BASE address (register or label id), or
- //! high value of a 64-bit absolute address.
+ //! * Mem - Multiple meanings - BASE address (register or label id), or high value of a 64-bit absolute address.
//! * Imm - Should be `0`.
- //! * Label - Label id if it was created by using `newLabel()` or
- //! `Globals::kInvalidId` if the label is invalid or not
- //! initialized.
- constexpr uint32_t id() const noexcept { return _baseId; }
+ //! * Label - Label id if it was created by using `newLabel()` or `Globals::kInvalidId` if the label is invalid or
+ //! not initialized.
+ inline constexpr uint32_t id() const noexcept { return _baseId; }
//! Tests whether the operand is 100% equal to `other` operand.
//!
//! \note This basically performs a binary comparison, if aby bit is
//! different the operands are not equal.
- constexpr bool equals(const Operand_& other) const noexcept {
+ inline constexpr bool equals(const Operand_& other) const noexcept {
return (_signature == other._signature) &
(_baseId == other._baseId ) &
(_data[0] == other._data[0] ) &
(_data[1] == other._data[1] ) ;
}
-#ifndef ASMJIT_NO_DEPRECATED
- ASMJIT_DEPRECATED("Use equals() instead")
- constexpr bool isEqual(const Operand_& other) const noexcept { return equals(other); }
-#endif //!ASMJIT_NO_DEPRECATED
-
- //! Tests whether the operand is a register matching `rType`.
- constexpr bool isReg(uint32_t rType) const noexcept {
- return (_signature & (kSignatureOpMask | kSignatureRegTypeMask)) ==
- ((kOpReg << kSignatureOpShift) | (rType << kSignatureRegTypeShift));
+ //! Tests whether the operand is a register matching the given register `type`.
+ inline constexpr bool isReg(RegType type) const noexcept {
+ return _signature.subset(Signature::kOpTypeMask | Signature::kRegTypeMask) == (Signature::fromOpType(OperandType::kReg) | Signature::fromRegType(type));
}
- //! Tests whether the operand is register and of `rType` and `rId`.
- constexpr bool isReg(uint32_t rType, uint32_t rId) const noexcept {
- return isReg(rType) && id() == rId;
+ //! Tests whether the operand is register and of register `type` and `id`.
+ inline constexpr bool isReg(RegType type, uint32_t id) const noexcept {
+ return isReg(type) && this->id() == id;
}
//! Tests whether the operand is a register or memory.
- constexpr bool isRegOrMem() const noexcept {
- return Support::isBetween<uint32_t>(opType(), kOpReg, kOpMem);
+ inline constexpr bool isRegOrMem() const noexcept {
+ return Support::isBetween<uint32_t>(uint32_t(opType()), uint32_t(OperandType::kReg), uint32_t(OperandType::kMem));
}
//! \}
};
-// ============================================================================
-// [asmjit::Operand]
-// ============================================================================
-
-//! Operand can contain register, memory location, immediate, or label.
+//! Base class representing an operand in AsmJit (default constructed version).
class Operand : public Operand_ {
public:
//! \name Construction & Destruction
//! \{
//! Creates `kOpNone` operand having all members initialized to zero.
- constexpr Operand() noexcept
- : Operand_{ kOpNone, 0u, { 0u, 0u }} {}
+ inline constexpr Operand() noexcept
+ : Operand_{ Signature::fromOpType(OperandType::kNone), 0u, { 0u, 0u }} {}
//! Creates a cloned `other` operand.
- constexpr Operand(const Operand& other) noexcept = default;
+ inline constexpr Operand(const Operand& other) noexcept = default;
//! Creates a cloned `other` operand.
- constexpr explicit Operand(const Operand_& other)
+ inline constexpr explicit Operand(const Operand_& other)
: Operand_(other) {}
//! Creates an operand initialized to raw `[u0, u1, u2, u3]` values.
- constexpr Operand(Globals::Init_, uint32_t u0, uint32_t u1, uint32_t u2, uint32_t u3) noexcept
+ inline constexpr Operand(Globals::Init_, const Signature& u0, uint32_t u1, uint32_t u2, uint32_t u3) noexcept
: Operand_{ u0, u1, { u2, u3 }} {}
//! Creates an uninitialized operand (dangerous).
@@ -469,7 +707,7 @@ public:
//! \}
- //! \name Operator Overloads
+ //! \name Overloaded Operators
//! \{
inline Operand& operator=(const Operand& other) noexcept = default;
@@ -477,26 +715,21 @@ public:
//! \}
- //! \name Utilities
+ //! \name Clone
//! \{
//! Clones this operand and returns its copy.
- constexpr Operand clone() const noexcept { return Operand(*this); }
+ inline constexpr Operand clone() const noexcept { return Operand(*this); }
//! \}
};
static_assert(sizeof(Operand) == 16, "asmjit::Operand must be exactly 16 bytes long");
-// ============================================================================
-// [asmjit::Label]
-// ============================================================================
-
//! Label (jump target or data location).
//!
-//! Label represents a location in code typically used as a jump target, but
-//! may be also a reference to some data or a static variable. Label has to be
-//! explicitly created by BaseEmitter.
+//! Label represents a location in code typically used as a jump target, but may be also a reference to some data or
+//! a static variable. Label has to be explicitly created by BaseEmitter.
//!
//! Example of using labels:
//!
@@ -519,39 +752,27 @@ static_assert(sizeof(Operand) == 16, "asmjit::Operand must be exactly 16 bytes l
//! ```
class Label : public Operand {
public:
- //! Type of the Label.
- enum LabelType : uint32_t {
- //! Anonymous (unnamed) label.
- kTypeAnonymous = 0,
- //! Local label (always has parentId).
- kTypeLocal = 1,
- //! Global label (never has parentId).
- kTypeGlobal = 2,
- //! Number of label types.
- kTypeCount = 3
- };
-
//! \name Construction & Destruction
//! \{
//! Creates a label operand without ID (you must set the ID to make it valid).
- constexpr Label() noexcept
- : Operand(Globals::Init, kOpLabel, Globals::kInvalidId, 0, 0) {}
+ inline constexpr Label() noexcept
+ : Operand(Globals::Init, Signature::fromOpType(OperandType::kLabel), Globals::kInvalidId, 0, 0) {}
//! Creates a cloned label operand of `other`.
- constexpr Label(const Label& other) noexcept
+ inline constexpr Label(const Label& other) noexcept
: Operand(other) {}
//! Creates a label operand of the given `id`.
- constexpr explicit Label(uint32_t id) noexcept
- : Operand(Globals::Init, kOpLabel, id, 0, 0) {}
+ inline constexpr explicit Label(uint32_t id) noexcept
+ : Operand(Globals::Init, Signature::fromOpType(OperandType::kLabel), id, 0, 0) {}
inline explicit Label(Globals::NoInit_) noexcept
: Operand(Globals::NoInit) {}
//! Resets the label, will reset all properties and set its ID to `Globals::kInvalidId`.
inline void reset() noexcept {
- _signature = kOpLabel;
+ _signature = Signature::fromOpType(OperandType::kLabel);
_baseId = Globals::kInvalidId;
_data[0] = 0;
_data[1] = 0;
@@ -570,155 +791,77 @@ public:
//! \{
//! Tests whether the label was created by CodeHolder and/or an attached emitter.
- constexpr bool isValid() const noexcept { return _baseId != Globals::kInvalidId; }
+ inline constexpr bool isValid() const noexcept { return _baseId != Globals::kInvalidId; }
//! Sets the label `id`.
inline void setId(uint32_t id) noexcept { _baseId = id; }
//! \}
};
-// ============================================================================
-// [asmjit::BaseRegTraits]
-// ============================================================================
-
//! \cond INTERNAL
//! Default register traits.
struct BaseRegTraits {
- //! RegType is not valid by default.
- static constexpr uint32_t kValid = 0;
- //! Count of registers (0 if none).
- static constexpr uint32_t kCount = 0;
- //! Everything is void by default.
- static constexpr uint32_t kTypeId = 0;
-
- //! Zero type by default.
- static constexpr uint32_t kType = 0;
- //! Zero group by default.
- static constexpr uint32_t kGroup = 0;
- //! No size by default.
- static constexpr uint32_t kSize = 0;
-
- //! Empty signature by default.
- static constexpr uint32_t kSignature = Operand::kOpReg;
+ enum : uint32_t {
+ //! \ref TypeId representing this register type, could be \ref TypeId::kVoid if such type doesn't exist.
+ kTypeId = uint32_t(TypeId::kVoid),
+ //! RegType is not valid by default.
+ kValid = 0,
+ //! Count of registers (0 if none).
+ kCount = 0,
+
+ //! Zero type by default (defeaults to None).
+ kType = uint32_t(RegType::kNone),
+ //! Zero group by default (defaults to GP).
+ kGroup = uint32_t(RegGroup::kGp),
+ //! No size by default.
+ kSize = 0,
+
+ //! Empty signature by default (not even having operand type set to register).
+ kSignature = 0
+ };
};
//! \endcond
-// ============================================================================
-// [asmjit::BaseReg]
-// ============================================================================
-
-//! Structure that allows to extract a register information based on the signature.
-//!
-//! This information is compatible with operand's signature (32-bit integer)
-//! and `RegInfo` just provides easy way to access it.
-struct RegInfo {
- inline void reset(uint32_t signature = 0) noexcept { _signature = signature; }
- inline void setSignature(uint32_t signature) noexcept { _signature = signature; }
-
- template<uint32_t mask>
- constexpr uint32_t _getSignaturePart() const noexcept {
- return (_signature >> Support::constCtz(mask)) & (mask >> Support::constCtz(mask));
- }
-
- constexpr bool isValid() const noexcept { return _signature != 0; }
- constexpr uint32_t signature() const noexcept { return _signature; }
- constexpr uint32_t opType() const noexcept { return _getSignaturePart<Operand::kSignatureOpMask>(); }
- constexpr uint32_t group() const noexcept { return _getSignaturePart<Operand::kSignatureRegGroupMask>(); }
- constexpr uint32_t type() const noexcept { return _getSignaturePart<Operand::kSignatureRegTypeMask>(); }
- constexpr uint32_t size() const noexcept { return _getSignaturePart<Operand::kSignatureSizeMask>(); }
-
- uint32_t _signature;
-};
-
//! Physical or virtual register operand.
class BaseReg : public Operand {
public:
- //! Architecture neutral register types.
- //!
- //! These must be reused by any platform that contains that types. All GP
- //! and VEC registers are also allowed by design to be part of a BASE|INDEX
- //! of a memory operand.
- enum RegType : uint32_t {
- //! No register - unused, invalid, multiple meanings.
- kTypeNone = 0,
-
- // (1 is used as a LabelTag)
-
- //! 8-bit low general purpose register (X86).
- kTypeGp8Lo = 2,
- //! 8-bit high general purpose register (X86).
- kTypeGp8Hi = 3,
- //! 16-bit general purpose register (X86).
- kTypeGp16 = 4,
- //! 32-bit general purpose register (X86|ARM).
- kTypeGp32 = 5,
- //! 64-bit general purpose register (X86|ARM).
- kTypeGp64 = 6,
- //! 32-bit view of a vector register (ARM).
- kTypeVec32 = 7,
- //! 64-bit view of a vector register (ARM).
- kTypeVec64 = 8,
- //! 128-bit view of a vector register (X86|ARM).
- kTypeVec128 = 9,
- //! 256-bit view of a vector register (X86).
- kTypeVec256 = 10,
- //! 512-bit view of a vector register (X86).
- kTypeVec512 = 11,
- //! 1024-bit view of a vector register (future).
- kTypeVec1024 = 12,
- //! Other0 register, should match `kOther0` group.
- kTypeOther0 = 13,
- //! Other1 register, should match `kOther1` group.
- kTypeOther1 = 14,
- //! Universal id of IP/PC register (if separate).
- kTypeIP = 15,
- //! Start of platform dependent register types (must be honored).
- kTypeCustom = 16,
- //! Maximum possible register id of all architectures.
- kTypeMax = 31
- };
-
- //! Register group (architecture neutral), and some limits.
- enum RegGroup : uint32_t {
- //! General purpose register group compatible with all backends.
- kGroupGp = 0,
- //! Vector register group compatible with all backends.
- kGroupVec = 1,
- //! Group that is architecture dependent.
- kGroupOther0 = 2,
- //! Group that is architecture dependent.
- kGroupOther1 = 3,
- //! Count of register groups used by virtual registers.
- kGroupVirt = 4,
- //! Count of register groups used by physical registers.
- kGroupCount = 16
- };
+ //! \name Constants
+ //! \{
- enum Id : uint32_t {
+ enum : uint32_t {
//! None or any register (mostly internal).
- kIdBad = 0xFFu
+ kIdBad = 0xFFu,
+
+ kBaseSignatureMask =
+ Signature::kOpTypeMask |
+ Signature::kRegTypeMask |
+ Signature::kRegGroupMask |
+ Signature::kSizeMask,
+
+ kTypeNone = uint32_t(RegType::kNone),
+ kSignature = Signature::fromOpType(OperandType::kReg).bits()
};
- static constexpr uint32_t kSignature = kOpReg;
+ //! \}
//! \name Construction & Destruction
//! \{
//! Creates a dummy register operand.
- constexpr BaseReg() noexcept
- : Operand(Globals::Init, kSignature, kIdBad, 0, 0) {}
+ inline constexpr BaseReg() noexcept
+ : Operand(Globals::Init, Signature::fromOpType(OperandType::kReg), kIdBad, 0, 0) {}
//! Creates a new register operand which is the same as `other` .
- constexpr BaseReg(const BaseReg& other) noexcept
+ inline constexpr BaseReg(const BaseReg& other) noexcept
: Operand(other) {}
- //! Creates a new register operand compatible with `other`, but with a different `rId`.
- constexpr BaseReg(const BaseReg& other, uint32_t rId) noexcept
- : Operand(Globals::Init, other._signature, rId, 0, 0) {}
+ //! Creates a new register operand compatible with `other`, but with a different `id`.
+ inline constexpr BaseReg(const BaseReg& other, uint32_t id) noexcept
+ : Operand(Globals::Init, other._signature, id, 0, 0) {}
- //! Creates a register initialized to `signature` and `rId`.
- constexpr BaseReg(uint32_t signature, uint32_t rId) noexcept
- : Operand(Globals::Init, signature, rId, 0, 0) {}
+ //! Creates a register initialized to the given `signature` and `id`.
+ inline constexpr BaseReg(const Signature& signature, uint32_t id) noexcept
+ : Operand(Globals::Init, signature, id, 0, 0) {}
inline explicit BaseReg(Globals::NoInit_) noexcept
: Operand(Globals::NoInit) {}
@@ -735,75 +878,102 @@ public:
//! \name Accessors
//! \{
+ //! Returns base signature of the register associated with each register type.
+ //!
+ //! Base signature only contains the operand type, register type, register group, and register size. It doesn't
+ //! contain element type, predicate, or other architecture-specific data. Base signature is a signature that is
+ //! provided by architecture-specific `RegTraits`, like \ref x86::RegTraits.
+ inline constexpr OperandSignature baseSignature() const noexcept { return _signature & kBaseSignatureMask; }
+
+ //! Tests whether the operand's base signature matches the given signature `sign`.
+ inline constexpr bool hasBaseSignature(uint32_t signature) const noexcept { return baseSignature() == signature; }
+ //! Tests whether the operand's base signature matches the given signature `sign`.
+ inline constexpr bool hasBaseSignature(const OperandSignature& signature) const noexcept { return baseSignature() == signature; }
+ //! Tests whether the operand's base signature matches the base signature of the `other` operand.
+ inline constexpr bool hasBaseSignature(const BaseReg& other) const noexcept { return baseSignature() == other.baseSignature(); }
+
//! Tests whether this register is the same as `other`.
//!
- //! This is just an optimization. Registers by default only use the first
- //! 8 bytes of Operand data, so this method takes advantage of this knowledge
- //! and only compares these 8 bytes. If both operands were created correctly
- //! both \ref equals() and \ref isSame() should give the same answer, however,
- //! if any of these two contains garbage or other metadata in the upper 8
- //! bytes then \ref isSame() may return `true` in cases in which \ref equals()
+ //! This is just an optimization. Registers by default only use the first 8 bytes of Operand data, so this method
+ //! takes advantage of this knowledge and only compares these 8 bytes. If both operands were created correctly
+ //! both \ref equals() and \ref isSame() should give the same answer, however, if any of these two contains garbage
+ //! or other metadata in the upper 8 bytes then \ref isSame() may return `true` in cases in which \ref equals()
//! returns false.
- constexpr bool isSame(const BaseReg& other) const noexcept {
+ inline constexpr bool isSame(const BaseReg& other) const noexcept {
return (_signature == other._signature) & (_baseId == other._baseId);
}
//! Tests whether the register is valid (either virtual or physical).
- constexpr bool isValid() const noexcept { return (_signature != 0) & (_baseId != kIdBad); }
+ inline constexpr bool isValid() const noexcept { return (_signature != 0) & (_baseId != kIdBad); }
//! Tests whether this is a physical register.
- constexpr bool isPhysReg() const noexcept { return _baseId < kIdBad; }
+ inline constexpr bool isPhysReg() const noexcept { return _baseId < kIdBad; }
//! Tests whether this is a virtual register.
- constexpr bool isVirtReg() const noexcept { return _baseId > kIdBad; }
+ inline constexpr bool isVirtReg() const noexcept { return _baseId > kIdBad; }
//! Tests whether the register type matches `type` - same as `isReg(type)`, provided for convenience.
- constexpr bool isType(uint32_t type) const noexcept { return (_signature & kSignatureRegTypeMask) == (type << kSignatureRegTypeShift); }
+ inline constexpr bool isType(RegType type) const noexcept { return _signature.subset(Signature::kRegTypeMask) == Signature::fromRegType(type); }
//! Tests whether the register group matches `group`.
- constexpr bool isGroup(uint32_t group) const noexcept { return (_signature & kSignatureRegGroupMask) == (group << kSignatureRegGroupShift); }
+ inline constexpr bool isGroup(RegGroup group) const noexcept { return _signature.subset(Signature::kRegGroupMask) == Signature::fromRegGroup(group); }
//! Tests whether the register is a general purpose register (any size).
- constexpr bool isGp() const noexcept { return isGroup(kGroupGp); }
+ inline constexpr bool isGp() const noexcept { return isGroup(RegGroup::kGp); }
//! Tests whether the register is a vector register.
- constexpr bool isVec() const noexcept { return isGroup(kGroupVec); }
+ inline constexpr bool isVec() const noexcept { return isGroup(RegGroup::kVec); }
using Operand_::isReg;
//! Same as `isType()`, provided for convenience.
- constexpr bool isReg(uint32_t rType) const noexcept { return isType(rType); }
- //! Tests whether the register type matches `type` and register id matches `rId`.
- constexpr bool isReg(uint32_t rType, uint32_t rId) const noexcept { return isType(rType) && id() == rId; }
+ inline constexpr bool isReg(RegType rType) const noexcept { return isType(rType); }
+ //! Tests whether the register type matches `type` and register id matches `id`.
+ inline constexpr bool isReg(RegType rType, uint32_t id) const noexcept { return isType(rType) && this->id() == id; }
- //! Returns the type of the register.
- constexpr uint32_t type() const noexcept { return _getSignaturePart<kSignatureRegTypeMask>(); }
+ //! Returns the register type.
+ inline constexpr RegType type() const noexcept { return _signature.regType(); }
//! Returns the register group.
- constexpr uint32_t group() const noexcept { return _getSignaturePart<kSignatureRegGroupMask>(); }
+ inline constexpr RegGroup group() const noexcept { return _signature.regGroup(); }
+
+ //! Returns operation predicate of the register (ARM/AArch64).
+ //!
+ //! The meaning depends on architecture, for example on ARM hardware this describes \ref arm::ShiftOp
+ //! of the register.
+ inline constexpr uint32_t predicate() const noexcept { return _signature.getField<Signature::kPredicateMask>(); }
+
+ //! Sets operation predicate of the register to `predicate` (ARM/AArch64).
+ //!
+ //! The meaning depends on architecture, for example on ARM hardware this describes \ref arm::ShiftOp
+ //! of the register.
+ inline void setPredicate(uint32_t predicate) noexcept { _signature.setField<Signature::kPredicateMask>(predicate); }
+
+ //! Resets shift operation type of the register to the default value (ARM/AArch64).
+ inline void resetPredicate() noexcept { _signature.setField<Signature::kPredicateMask>(0); }
//! Clones the register operand.
- constexpr BaseReg clone() const noexcept { return BaseReg(*this); }
+ inline constexpr BaseReg clone() const noexcept { return BaseReg(*this); }
//! Casts this register to `RegT` by also changing its signature.
//!
//! \note Improper use of `cloneAs()` can lead to hard-to-debug errors.
template<typename RegT>
- constexpr RegT cloneAs() const noexcept { return RegT(RegT::kSignature, id()); }
+ inline constexpr RegT cloneAs() const noexcept { return RegT(Signature(RegT::kSignature), id()); }
//! Casts this register to `other` by also changing its signature.
//!
//! \note Improper use of `cloneAs()` can lead to hard-to-debug errors.
template<typename RegT>
- constexpr RegT cloneAs(const RegT& other) const noexcept { return RegT(other.signature(), id()); }
+ inline constexpr RegT cloneAs(const RegT& other) const noexcept { return RegT(other.signature(), id()); }
- //! Sets the register id to `rId`.
- inline void setId(uint32_t rId) noexcept { _baseId = rId; }
+ //! Sets the register id to `id`.
+ inline void setId(uint32_t id) noexcept { _baseId = id; }
//! Sets a 32-bit operand signature based on traits of `RegT`.
template<typename RegT>
inline void setSignatureT() noexcept { _signature = RegT::kSignature; }
- //! Sets the register `signature` and `rId`.
- inline void setSignatureAndId(uint32_t signature, uint32_t rId) noexcept {
+ //! Sets the register `signature` and `id`.
+ inline void setSignatureAndId(const OperandSignature& signature, uint32_t id) noexcept {
_signature = signature;
- _baseId = rId;
+ _baseId = id;
}
//! \}
@@ -814,39 +984,36 @@ public:
//! Tests whether the `op` operand is a general purpose register.
static inline bool isGp(const Operand_& op) noexcept {
// Check operand type and register group. Not interested in register type and size.
- const uint32_t kSgn = (kOpReg << kSignatureOpShift ) |
- (kGroupGp << kSignatureRegGroupShift) ;
- return (op.signature() & (kSignatureOpMask | kSignatureRegGroupMask)) == kSgn;
+ return op.signature().subset(Signature::kOpTypeMask | Signature::kRegGroupMask) == (Signature::fromOpType(OperandType::kReg) | Signature::fromRegGroup(RegGroup::kGp));
}
//! Tests whether the `op` operand is a vector register.
static inline bool isVec(const Operand_& op) noexcept {
// Check operand type and register group. Not interested in register type and size.
- const uint32_t kSgn = (kOpReg << kSignatureOpShift ) |
- (kGroupVec << kSignatureRegGroupShift) ;
- return (op.signature() & (kSignatureOpMask | kSignatureRegGroupMask)) == kSgn;
+ return op.signature().subset(Signature::kOpTypeMask | Signature::kRegGroupMask) == (Signature::fromOpType(OperandType::kReg) | Signature::fromRegGroup(RegGroup::kVec));
}
- //! Tests whether the `op` is a general purpose register of the given `rId`.
- static inline bool isGp(const Operand_& op, uint32_t rId) noexcept { return isGp(op) & (op.id() == rId); }
- //! Tests whether the `op` is a vector register of the given `rId`.
- static inline bool isVec(const Operand_& op, uint32_t rId) noexcept { return isVec(op) & (op.id() == rId); }
+ //! Tests whether the `op` is a general purpose register of the given `id`.
+ static inline bool isGp(const Operand_& op, uint32_t id) noexcept { return isGp(op) & (op.id() == id); }
+ //! Tests whether the `op` is a vector register of the given `id`.
+ static inline bool isVec(const Operand_& op, uint32_t id) noexcept { return isVec(op) & (op.id() == id); }
//! \}
};
-// ============================================================================
-// [asmjit::RegOnly]
-// ============================================================================
-
-//! RegOnly is 8-byte version of `BaseReg` that allows to store either register
-//! or nothing.
+//! RegOnly is 8-byte version of `BaseReg` that allows to store either register or nothing.
//!
-//! This class was designed to decrease the space consumed by each extra "operand"
-//! in `BaseEmitter` and `InstNode` classes.
+//! It's designed to decrease the space consumed by an extra "operand" in \ref BaseEmitter and \ref InstNode.
struct RegOnly {
- //! Type of the operand, either `kOpNone` or `kOpReg`.
- uint32_t _signature;
+ //! \name Types
+ //! \{
+
+ typedef OperandSignature Signature;
+
+ //! \}
+
+ //! Operand signature - only \ref OperandType::kNone and \ref OperandType::kReg are supported.
+ Signature _signature;
//! Physical or virtual register id.
uint32_t _id;
@@ -854,7 +1021,7 @@ struct RegOnly {
//! \{
//! Initializes the `RegOnly` instance to hold register `signature` and `id`.
- inline void init(uint32_t signature, uint32_t id) noexcept {
+ inline void init(const OperandSignature& signature, uint32_t id) noexcept {
_signature = signature;
_id = id;
}
@@ -863,7 +1030,7 @@ struct RegOnly {
inline void init(const RegOnly& reg) noexcept { init(reg.signature(), reg.id()); }
//! Resets the `RegOnly` members to zeros (none).
- inline void reset() noexcept { init(0, 0); }
+ inline void reset() noexcept { init(Signature::fromBits(0), 0); }
//! \}
@@ -871,40 +1038,30 @@ struct RegOnly {
//! \{
//! Tests whether this ExtraReg is none (same as calling `Operand_::isNone()`).
- constexpr bool isNone() const noexcept { return _signature == 0; }
+ inline constexpr bool isNone() const noexcept { return _signature == 0; }
//! Tests whether the register is valid (either virtual or physical).
- constexpr bool isReg() const noexcept { return _signature != 0; }
+ inline constexpr bool isReg() const noexcept { return _signature != 0; }
//! Tests whether this is a physical register.
- constexpr bool isPhysReg() const noexcept { return _id < BaseReg::kIdBad; }
+ inline constexpr bool isPhysReg() const noexcept { return _id < BaseReg::kIdBad; }
//! Tests whether this is a virtual register (used by `BaseCompiler`).
- constexpr bool isVirtReg() const noexcept { return _id > BaseReg::kIdBad; }
+ inline constexpr bool isVirtReg() const noexcept { return _id > BaseReg::kIdBad; }
//! Returns the register signature or 0 if no register is assigned.
- constexpr uint32_t signature() const noexcept { return _signature; }
+ inline constexpr OperandSignature signature() const noexcept { return _signature; }
//! Returns the register id.
//!
- //! \note Always check whether the register is assigned before using the
- //! returned identifier as non-assigned `RegOnly` instance would return
- //! zero id, which is still a valid register id.
- constexpr uint32_t id() const noexcept { return _id; }
+ //! \note Always check whether the register is assigned before using the returned identifier as
+ //! non-assigned `RegOnly` instance would return zero id, which is still a valid register id.
+ inline constexpr uint32_t id() const noexcept { return _id; }
//! Sets the register id.
inline void setId(uint32_t id) noexcept { _id = id; }
- //! \cond INTERNAL
- //!
- //! Extracts information from operand's signature.
- template<uint32_t mask>
- constexpr uint32_t _getSignaturePart() const noexcept {
- return (_signature >> Support::constCtz(mask)) & (mask >> Support::constCtz(mask));
- }
- //! \endcond
-
- //! Returns the type of the register.
- constexpr uint32_t type() const noexcept { return _getSignaturePart<Operand::kSignatureRegTypeMask>(); }
+ //! Returns the register type.
+ inline constexpr RegType type() const noexcept { return _signature.regType(); }
//! Returns the register group.
- constexpr uint32_t group() const noexcept { return _getSignaturePart<Operand::kSignatureRegGroupMask>(); }
+ inline constexpr RegGroup group() const noexcept { return _signature.regGroup(); }
//! \}
@@ -913,100 +1070,132 @@ struct RegOnly {
//! Converts this ExtraReg to a real `RegT` operand.
template<typename RegT>
- constexpr RegT toReg() const noexcept { return RegT(_signature, _id); }
+ inline constexpr RegT toReg() const noexcept { return RegT(_signature, _id); }
//! \}
};
-// ============================================================================
-// [asmjit::BaseMem]
-// ============================================================================
+//! \cond INTERNAL
+//! Adds a template specialization for `REG_TYPE` into the local `RegTraits`.
+#define ASMJIT_DEFINE_REG_TRAITS(REG, REG_TYPE, GROUP, SIZE, COUNT, TYPE_ID) \
+template<> \
+struct RegTraits<REG_TYPE> { \
+ typedef REG RegT; \
+ \
+ enum : uint32_t { \
+ kValid = uint32_t(true), \
+ kCount = uint32_t(COUNT), \
+ kType = uint32_t(REG_TYPE), \
+ kGroup = uint32_t(GROUP), \
+ kSize = uint32_t(SIZE), \
+ kTypeId = uint32_t(TYPE_ID), \
+ \
+ kSignature = (OperandSignature::fromOpType(OperandType::kReg) | \
+ OperandSignature::fromRegType(REG_TYPE) | \
+ OperandSignature::fromRegGroup(GROUP) | \
+ OperandSignature::fromSize(kSize)).bits(), \
+ }; \
+}
+
+//! Adds constructors and member functions to a class that implements abstract register. Abstract register is register
+//! that doesn't have type or signature yet, it's a base class like `x86::Reg` or `arm::Reg`.
+#define ASMJIT_DEFINE_ABSTRACT_REG(REG, BASE) \
+public: \
+ /*! Default constructor that only setups basics. */ \
+ inline constexpr REG() noexcept \
+ : BASE(Signature{kSignature}, kIdBad) {} \
+ \
+ /*! Makes a copy of the `other` register operand. */ \
+ inline constexpr REG(const REG& other) noexcept \
+ : BASE(other) {} \
+ \
+ /*! Makes a copy of the `other` register having id set to `id` */ \
+ inline constexpr REG(const BaseReg& other, uint32_t id) noexcept \
+ : BASE(other, id) {} \
+ \
+ /*! Creates a register based on `signature` and `id`. */ \
+ inline constexpr REG(const OperandSignature& sgn, uint32_t id) noexcept \
+ : BASE(sgn, id) {} \
+ \
+ /*! Creates a completely uninitialized REG register operand (garbage). */ \
+ inline explicit REG(Globals::NoInit_) noexcept \
+ : BASE(Globals::NoInit) {} \
+ \
+ /*! Creates a new register from register type and id. */ \
+ static inline REG fromTypeAndId(RegType type, uint32_t id) noexcept { \
+ return REG(signatureOf(type), id); \
+ } \
+ \
+ /*! Clones the register operand. */ \
+ inline constexpr REG clone() const noexcept { return REG(*this); } \
+ \
+ inline REG& operator=(const REG& other) noexcept = default;
+
+//! Adds constructors and member functions to a class that implements final register. Final registers MUST HAVE a valid
+//! signature.
+#define ASMJIT_DEFINE_FINAL_REG(REG, BASE, TRAITS) \
+public: \
+ enum : uint32_t { \
+ kThisType = TRAITS::kType, \
+ kThisGroup = TRAITS::kGroup, \
+ kThisSize = TRAITS::kSize, \
+ kSignature = TRAITS::kSignature \
+ }; \
+ \
+ ASMJIT_DEFINE_ABSTRACT_REG(REG, BASE) \
+ \
+ /*! Creates a register operand having its id set to `id`. */ \
+ inline constexpr explicit REG(uint32_t id) noexcept \
+ : BASE(Signature{kSignature}, id) {}
+//! \endcond
//! Base class for all memory operands.
//!
-//! \note It's tricky to pack all possible cases that define a memory operand
-//! into just 16 bytes. The `BaseMem` splits data into the following parts:
+//! The data is split into the following parts:
//!
-//! BASE - Base register or label - requires 36 bits total. 4 bits are used to
-//! encode the type of the BASE operand (label vs. register type) and
-//! the remaining 32 bits define the BASE id, which can be a physical or
-//! virtual register index. If BASE type is zero, which is never used as
-//! a register-type and label doesn't use it as well then BASE field
-//! contains a high DWORD of a possible 64-bit absolute address, which is
-//! possible on X64.
+//! - BASE - Base register or label - requires 36 bits total. 4 bits are used to encode the type of the BASE operand
+//! (label vs. register type) and the remaining 32 bits define the BASE id, which can be a physical or virtual
+//! register index. If BASE type is zero, which is never used as a register type and label doesn't use it as well
+//! then BASE field contains a high DWORD of a possible 64-bit absolute address, which is possible on X64.
//!
-//! INDEX - Index register (or theoretically Label, which doesn't make sense).
-//! Encoding is similar to BASE - it also requires 36 bits and splits
-//! the encoding to INDEX type (4 bits defining the register type) and
-//! id (32-bits).
+//! - INDEX - Index register (or theoretically Label, which doesn't make sense). Encoding is similar to BASE - it
+//! also requires 36 bits and splits the encoding to INDEX type (4 bits defining the register type) and 32-bit id.
//!
-//! OFFSET - A relative offset of the address. Basically if BASE is specified
-//! the relative displacement adjusts BASE and an optional INDEX. if
-//! BASE is not specified then the OFFSET should be considered as ABSOLUTE
-//! address (at least on X86). In that case its low 32 bits are stored in
-//! DISPLACEMENT field and the remaining high 32 bits are stored in BASE.
+//! - OFFSET - A relative offset of the address. Basically if BASE is specified the relative displacement adjusts
+//! BASE and an optional INDEX. if BASE is not specified then the OFFSET should be considered as ABSOLUTE address
+//! (at least on X86). In that case its low 32 bits are stored in DISPLACEMENT field and the remaining high 32
+//! bits are stored in BASE.
//!
-//! OTHER - There is rest 8 bits that can be used for whatever purpose. The
-//! x86::Mem operand uses these bits to store segment override prefix and
-//! index shift (scale).
+//! - OTHER - There is rest 8 bits that can be used for whatever purpose. For example \ref x86::Mem operand uses
+//! these bits to store segment override prefix and index shift (or scale).
class BaseMem : public Operand {
public:
- //! Address type.
- enum AddrType : uint32_t {
- //! Default address type, Assembler will select the best type when necessary.
- kAddrTypeDefault = 0,
- //! Absolute address type.
- kAddrTypeAbs = 1,
- //! Relative address type.
- kAddrTypeRel = 2
- };
-
- // Shortcuts.
- enum SignatureMem : uint32_t {
- kSignatureMemAbs = kAddrTypeAbs << kSignatureMemAddrTypeShift,
- kSignatureMemRel = kAddrTypeRel << kSignatureMemAddrTypeShift
- };
-
- //! \cond INTERNAL
- //! Used internally to construct `BaseMem` operand from decomposed data.
- struct Decomposed {
- uint32_t baseType;
- uint32_t baseId;
- uint32_t indexType;
- uint32_t indexId;
- int32_t offset;
- uint32_t size;
- uint32_t flags;
- };
- //! \endcond
-
//! \name Construction & Destruction
//! \{
//! Creates a default `BaseMem` operand, that points to [0].
- constexpr BaseMem() noexcept
- : Operand(Globals::Init, kOpMem, 0, 0, 0) {}
+ inline constexpr BaseMem() noexcept
+ : Operand(Globals::Init, Signature::fromOpType(OperandType::kMem), 0, 0, 0) {}
//! Creates a `BaseMem` operand that is a clone of `other`.
- constexpr BaseMem(const BaseMem& other) noexcept
+ inline constexpr BaseMem(const BaseMem& other) noexcept
: Operand(other) {}
- //! \cond INTERNAL
-
- //! Creates a `BaseMem` operand from 4 integers as used by `Operand_` struct.
- constexpr BaseMem(Globals::Init_, uint32_t u0, uint32_t u1, uint32_t u2, uint32_t u3) noexcept
- : Operand(Globals::Init, u0, u1, u2, u3) {}
-
- constexpr BaseMem(const Decomposed& d) noexcept
+ //! Creates a `BaseMem` operand from `baseReg` and `offset`.
+ //!
+ //! \note This is an architecture independent constructor that can be used to create an architecture
+ //! independent memory operand to be used in portable code that can handle multiple architectures.
+ inline constexpr explicit BaseMem(const BaseReg& baseReg, int32_t offset = 0) noexcept
: Operand(Globals::Init,
- kOpMem | (d.baseType << kSignatureMemBaseTypeShift )
- | (d.indexType << kSignatureMemIndexTypeShift)
- | (d.size << kSignatureSizeShift )
- | d.flags,
- d.baseId,
- d.indexId,
- uint32_t(d.offset)) {}
+ Signature::fromOpType(OperandType::kMem) | Signature::fromMemBaseType(baseReg.type()),
+ baseReg.id(),
+ 0,
+ uint32_t(offset)) {}
+ //! \cond INTERNAL
+ //! Creates a `BaseMem` operand from 4 integers as used by `Operand_` struct.
+ inline constexpr BaseMem(const OperandSignature& u0, uint32_t baseId, uint32_t indexId, int32_t offset) noexcept
+ : Operand(Globals::Init, u0, baseId, indexId, uint32_t(offset)) {}
//! \endcond
//! Creates a completely uninitialized `BaseMem` operand.
@@ -1015,7 +1204,7 @@ public:
//! Resets the memory operand - after the reset the memory points to [0].
inline void reset() noexcept {
- _signature = kOpMem;
+ _signature = Signature::fromOpType(OperandType::kMem);
_baseId = 0;
_data[0] = 0;
_data[1] = 0;
@@ -1034,79 +1223,82 @@ public:
//! \{
//! Clones the memory operand.
- constexpr BaseMem clone() const noexcept { return BaseMem(*this); }
+ inline constexpr BaseMem clone() const noexcept { return BaseMem(*this); }
- //! Returns the address type (see \ref AddrType) of the memory operand.
- //!
- //! By default, address type of newly created memory operands is always \ref kAddrTypeDefault.
- constexpr uint32_t addrType() const noexcept { return _getSignaturePart<kSignatureMemAddrTypeMask>(); }
- //! Sets the address type to `addrType`, see \ref AddrType.
- inline void setAddrType(uint32_t addrType) noexcept { _setSignaturePart<kSignatureMemAddrTypeMask>(addrType); }
- //! Resets the address type to \ref kAddrTypeDefault.
- inline void resetAddrType() noexcept { _setSignaturePart<kSignatureMemAddrTypeMask>(0); }
-
- //! Tests whether the address type is \ref kAddrTypeAbs.
- constexpr bool isAbs() const noexcept { return addrType() == kAddrTypeAbs; }
- //! Sets the address type to \ref kAddrTypeAbs.
- inline void setAbs() noexcept { setAddrType(kAddrTypeAbs); }
-
- //! Tests whether the address type is \ref kAddrTypeRel.
- constexpr bool isRel() const noexcept { return addrType() == kAddrTypeRel; }
- //! Sets the address type to \ref kAddrTypeRel.
- inline void setRel() noexcept { setAddrType(kAddrTypeRel); }
+ //! Creates a new copy of this memory operand adjusted by `off`.
+ inline BaseMem cloneAdjusted(int64_t off) const noexcept {
+ BaseMem result(*this);
+ result.addOffset(off);
+ return result;
+ }
//! Tests whether this memory operand is a register home (only used by \ref asmjit_compiler)
- constexpr bool isRegHome() const noexcept { return _hasSignaturePart<kSignatureMemRegHomeFlag>(); }
+ inline constexpr bool isRegHome() const noexcept { return _signature.hasField<Signature::kMemRegHomeFlag>(); }
//! Mark this memory operand as register home (only used by \ref asmjit_compiler).
- inline void setRegHome() noexcept { _signature |= kSignatureMemRegHomeFlag; }
+ inline void setRegHome() noexcept { _signature |= Signature::kMemRegHomeFlag; }
//! Marks this operand to not be a register home (only used by \ref asmjit_compiler).
- inline void clearRegHome() noexcept { _signature &= ~kSignatureMemRegHomeFlag; }
+ inline void clearRegHome() noexcept { _signature &= ~Signature::kMemRegHomeFlag; }
//! Tests whether the memory operand has a BASE register or label specified.
- constexpr bool hasBase() const noexcept { return (_signature & kSignatureMemBaseTypeMask) != 0; }
+ inline constexpr bool hasBase() const noexcept {
+ return (_signature & Signature::kMemBaseTypeMask) != 0;
+ }
+
//! Tests whether the memory operand has an INDEX register specified.
- constexpr bool hasIndex() const noexcept { return (_signature & kSignatureMemIndexTypeMask) != 0; }
+ inline constexpr bool hasIndex() const noexcept {
+ return (_signature & Signature::kMemIndexTypeMask) != 0;
+ }
+
//! Tests whether the memory operand has BASE or INDEX register.
- constexpr bool hasBaseOrIndex() const noexcept { return (_signature & kSignatureMemBaseIndexMask) != 0; }
+ inline constexpr bool hasBaseOrIndex() const noexcept {
+ return (_signature & Signature::kMemBaseIndexMask) != 0;
+ }
+
//! Tests whether the memory operand has BASE and INDEX register.
- constexpr bool hasBaseAndIndex() const noexcept { return (_signature & kSignatureMemBaseTypeMask) != 0 && (_signature & kSignatureMemIndexTypeMask) != 0; }
+ inline constexpr bool hasBaseAndIndex() const noexcept {
+ return (_signature & Signature::kMemBaseTypeMask) != 0 && (_signature & Signature::kMemIndexTypeMask) != 0;
+ }
- //! Tests whether the BASE operand is a register (registers start after `kLabelTag`).
- constexpr bool hasBaseReg() const noexcept { return (_signature & kSignatureMemBaseTypeMask) > (Label::kLabelTag << kSignatureMemBaseTypeShift); }
//! Tests whether the BASE operand is a label.
- constexpr bool hasBaseLabel() const noexcept { return (_signature & kSignatureMemBaseTypeMask) == (Label::kLabelTag << kSignatureMemBaseTypeShift); }
- //! Tests whether the INDEX operand is a register (registers start after `kLabelTag`).
- constexpr bool hasIndexReg() const noexcept { return (_signature & kSignatureMemIndexTypeMask) > (Label::kLabelTag << kSignatureMemIndexTypeShift); }
+ inline constexpr bool hasBaseLabel() const noexcept {
+ return _signature.subset(Signature::kMemBaseTypeMask) == Signature::fromMemBaseType(RegType::kLabelTag);
+ }
+
+ //! Tests whether the BASE operand is a register (registers start after `RegType::kLabelTag`).
+ inline constexpr bool hasBaseReg() const noexcept {
+ return _signature.subset(Signature::kMemBaseTypeMask).bits() > Signature::fromMemBaseType(RegType::kLabelTag).bits();
+ }
- //! Returns the type of the BASE register (0 if this memory operand doesn't
- //! use the BASE register).
+ //! Tests whether the INDEX operand is a register (registers start after `RegType::kLabelTag`).
+ inline constexpr bool hasIndexReg() const noexcept {
+ return _signature.subset(Signature::kMemIndexTypeMask).bits() > Signature::fromMemIndexType(RegType::kLabelTag).bits();
+ }
+
+ //! Returns the type of the BASE register (0 if this memory operand doesn't use the BASE register).
//!
- //! \note If the returned type is one (a value never associated to a register
- //! type) the BASE is not register, but it's a label. One equals to `kLabelTag`.
- //! You should always check `hasBaseLabel()` before using `baseId()` result.
- constexpr uint32_t baseType() const noexcept { return _getSignaturePart<kSignatureMemBaseTypeMask>(); }
+ //! \note If the returned type is one (a value never associated to a register type) the BASE is not register, but it
+ //! is a label. One equals to `kLabelTag`. You should always check `hasBaseLabel()` before using `baseId()` result.
+ inline constexpr RegType baseType() const noexcept { return _signature.memBaseType(); }
//! Returns the type of an INDEX register (0 if this memory operand doesn't
//! use the INDEX register).
- constexpr uint32_t indexType() const noexcept { return _getSignaturePart<kSignatureMemIndexTypeMask>(); }
+ inline constexpr RegType indexType() const noexcept { return _signature.memIndexType(); }
//! This is used internally for BASE+INDEX validation.
- constexpr uint32_t baseAndIndexTypes() const noexcept { return _getSignaturePart<kSignatureMemBaseIndexMask>(); }
+ inline constexpr uint32_t baseAndIndexTypes() const noexcept { return _signature.getField<Signature::kMemBaseIndexMask>(); }
- //! Returns both BASE (4:0 bits) and INDEX (9:5 bits) types combined into a
- //! single value.
+ //! Returns both BASE (4:0 bits) and INDEX (9:5 bits) types combined into a single value.
//!
- //! \remarks Returns id of the BASE register or label (if the BASE was
- //! specified as label).
- constexpr uint32_t baseId() const noexcept { return _baseId; }
+ //! \remarks Returns id of the BASE register or label (if the BASE was specified as label).
+ inline constexpr uint32_t baseId() const noexcept { return _baseId; }
//! Returns the id of the INDEX register.
- constexpr uint32_t indexId() const noexcept { return _data[kDataMemIndexId]; }
+ inline constexpr uint32_t indexId() const noexcept { return _data[kDataMemIndexId]; }
//! Sets the id of the BASE register (without modifying its type).
- inline void setBaseId(uint32_t rId) noexcept { _baseId = rId; }
+ inline void setBaseId(uint32_t id) noexcept { _baseId = id; }
//! Sets the id of the INDEX register (without modifying its type).
- inline void setIndexId(uint32_t rId) noexcept { _data[kDataMemIndexId] = rId; }
+ inline void setIndexId(uint32_t id) noexcept { _data[kDataMemIndexId] = id; }
//! Sets the base register to type and id of the given `base` operand.
inline void setBase(const BaseReg& base) noexcept { return _setBase(base.type(), base.id()); }
@@ -1114,56 +1306,54 @@ public:
inline void setIndex(const BaseReg& index) noexcept { return _setIndex(index.type(), index.id()); }
//! \cond INTERNAL
- inline void _setBase(uint32_t rType, uint32_t rId) noexcept {
- _setSignaturePart<kSignatureMemBaseTypeMask>(rType);
- _baseId = rId;
+ inline void _setBase(RegType type, uint32_t id) noexcept {
+ _signature.setField<Signature::kMemBaseTypeMask>(uint32_t(type));
+ _baseId = id;
}
- inline void _setIndex(uint32_t rType, uint32_t rId) noexcept {
- _setSignaturePart<kSignatureMemIndexTypeMask>(rType);
- _data[kDataMemIndexId] = rId;
+ inline void _setIndex(RegType type, uint32_t id) noexcept {
+ _signature.setField<Signature::kMemIndexTypeMask>(uint32_t(type));
+ _data[kDataMemIndexId] = id;
}
//! \endcond
//! Resets the memory operand's BASE register or label.
- inline void resetBase() noexcept { _setBase(0, 0); }
+ inline void resetBase() noexcept { _setBase(RegType::kNone, 0); }
//! Resets the memory operand's INDEX register.
- inline void resetIndex() noexcept { _setIndex(0, 0); }
+ inline void resetIndex() noexcept { _setIndex(RegType::kNone, 0); }
//! Sets the memory operand size (in bytes).
- inline void setSize(uint32_t size) noexcept { _setSignaturePart<kSignatureSizeMask>(size); }
+ inline void setSize(uint32_t size) noexcept { _signature.setField<Signature::kSizeMask>(size); }
//! Tests whether the memory operand has a 64-bit offset or absolute address.
//!
//! If this is true then `hasBase()` must always report false.
- constexpr bool isOffset64Bit() const noexcept { return baseType() == 0; }
+ inline constexpr bool isOffset64Bit() const noexcept { return baseType() == RegType::kNone; }
//! Tests whether the memory operand has a non-zero offset or absolute address.
- constexpr bool hasOffset() const noexcept {
+ inline constexpr bool hasOffset() const noexcept {
return (_data[kDataMemOffsetLo] | uint32_t(_baseId & Support::bitMaskFromBool<uint32_t>(isOffset64Bit()))) != 0;
}
//! Returns either relative offset or absolute address as 64-bit integer.
- constexpr int64_t offset() const noexcept {
+ inline constexpr int64_t offset() const noexcept {
return isOffset64Bit() ? int64_t(uint64_t(_data[kDataMemOffsetLo]) | (uint64_t(_baseId) << 32))
: int64_t(int32_t(_data[kDataMemOffsetLo])); // Sign extend 32-bit offset.
}
//! Returns a 32-bit low part of a 64-bit offset or absolute address.
- constexpr int32_t offsetLo32() const noexcept { return int32_t(_data[kDataMemOffsetLo]); }
+ inline constexpr int32_t offsetLo32() const noexcept { return int32_t(_data[kDataMemOffsetLo]); }
//! Returns a 32-but high part of a 64-bit offset or absolute address.
//!
//! \note This function is UNSAFE and returns garbage if `isOffset64Bit()`
//! returns false. Never use it blindly without checking it first.
- constexpr int32_t offsetHi32() const noexcept { return int32_t(_baseId); }
+ inline constexpr int32_t offsetHi32() const noexcept { return int32_t(_baseId); }
//! Sets a 64-bit offset or an absolute address to `offset`.
//!
- //! \note This functions attempts to set both high and low parts of a 64-bit
- //! offset, however, if the operand has a BASE register it will store only the
- //! low 32 bits of the offset / address as there is no way to store both BASE
- //! and 64-bit offset, and there is currently no architecture that has such
- //! capability targeted by AsmJit.
+ //! \note This functions attempts to set both high and low parts of a 64-bit offset, however, if the operand has
+ //! a BASE register it will store only the low 32 bits of the offset / address as there is no way to store both
+ //! BASE and 64-bit offset, and there is currently no architecture that has such capability targeted by AsmJit.
inline void setOffset(int64_t offset) noexcept {
uint32_t lo = uint32_t(uint64_t(offset) & 0xFFFFFFFFu);
uint32_t hi = uint32_t(uint64_t(offset) >> 32);
@@ -1177,9 +1367,8 @@ public:
//! Adjusts the offset by `offset`.
//!
- //! \note This is a fast function that doesn't use the HI 32-bits of a
- //! 64-bit offset. Use it only if you know that there is a BASE register
- //! and the offset is only 32 bits anyway.
+ //! \note This is a fast function that doesn't use the HI 32-bits of a 64-bit offset. Use it only if you know that
+ //! there is a BASE register and the offset is only 32 bits anyway.
//! Adjusts the memory operand offset by a `offset`.
inline void addOffset(int64_t offset) noexcept {
@@ -1193,48 +1382,87 @@ public:
}
}
- //! Adds `offset` to a low 32-bit offset part (don't use without knowing how
- //! BaseMem works).
+ //! Adds `offset` to a low 32-bit offset part (don't use without knowing how BaseMem works).
inline void addOffsetLo32(int32_t offset) noexcept { _data[kDataMemOffsetLo] += uint32_t(offset); }
//! Resets the memory offset to zero.
inline void resetOffset() noexcept { setOffset(0); }
- //! Resets the lo part of the memory offset to zero (don't use without knowing
- //! how BaseMem works).
+ //! Resets the lo part of the memory offset to zero (don't use without knowing how BaseMem works).
inline void resetOffsetLo32() noexcept { setOffsetLo32(0); }
//! \}
};
-// ============================================================================
-// [asmjit::Imm]
-// ============================================================================
+//! Type of the an immediate value.
+enum class ImmType : uint32_t {
+ //! Immediate is integer.
+ kInt = 0,
+ //! Immediate is a floating point stored as double-precision.
+ kDouble = 1
+};
-//! Immediate operand.
-//!
-//! Immediate operand is usually part of instruction itself. It's inlined after
-//! or before the instruction opcode. Immediates can be only signed or unsigned
-//! integers.
-//!
-//! To create an immediate operand use `asmjit::imm()` helper, which can be used
-//! with any type, not just the default 64-bit int.
+//! Immediate operands are encoded with instruction data.
class Imm : public Operand {
public:
+ //! \cond INTERNAL
+ template<typename T>
+ struct IsConstexprConstructibleAsImmType
+ : public std::integral_constant<bool, std::is_enum<T>::value ||
+ std::is_pointer<T>::value ||
+ std::is_integral<T>::value ||
+ std::is_function<T>::value> {};
+
+ template<typename T>
+ struct IsConvertibleToImmType
+ : public std::integral_constant<bool, IsConstexprConstructibleAsImmType<T>::value ||
+ std::is_floating_point<T>::value> {};
+ //! \endcond
+
//! \name Construction & Destruction
//! \{
//! Creates a new immediate value (initial value is 0).
- constexpr Imm() noexcept
- : Operand(Globals::Init, kOpImm, 0, 0, 0) {}
+ inline constexpr Imm() noexcept
+ : Operand(Globals::Init, Signature::fromOpType(OperandType::kImm), 0, 0, 0) {}
//! Creates a new immediate value from `other`.
- constexpr Imm(const Imm& other) noexcept
+ inline constexpr Imm(const Imm& other) noexcept
: Operand(other) {}
- //! Creates a new signed immediate value, assigning the value to `val`.
- constexpr explicit Imm(int64_t val) noexcept
- : Operand(Globals::Init, kOpImm, 0, Support::unpackU32At0(val), Support::unpackU32At1(val)) {}
+ //! Creates a new immediate value from ARM/AArch64 specific `shift`.
+ inline constexpr Imm(const arm::Shift& shift) noexcept
+ : Operand(Globals::Init,
+ Signature::fromOpType(OperandType::kImm) | Signature::fromPredicate(uint32_t(shift.op())),
+ 0,
+ Support::unpackU32At0(shift.value()),
+ Support::unpackU32At1(shift.value())) {}
+
+ //! Creates a new signed immediate value, assigning the value to `val` and an architecture-specific predicate
+ //! to `predicate`.
+ //!
+ //! \note Predicate is currently only used by ARM architectures.
+ template<typename T, typename = typename std::enable_if<IsConstexprConstructibleAsImmType<typename std::decay<T>::type>::value>::type>
+ inline constexpr Imm(const T& val, const uint32_t predicate = 0) noexcept
+ : Operand(Globals::Init,
+ Signature::fromOpType(OperandType::kImm) | Signature::fromPredicate(predicate),
+ 0,
+ Support::unpackU32At0(int64_t(val)),
+ Support::unpackU32At1(int64_t(val))) {}
+
+ inline Imm(const float& val, const uint32_t predicate = 0) noexcept
+ : Operand(Globals::Init,
+ Signature::fromOpType(OperandType::kImm) | Signature::fromPredicate(predicate),
+ 0,
+ 0,
+ 0) { setValue(val); }
+
+ inline Imm(const double& val, const uint32_t predicate = 0) noexcept
+ : Operand(Globals::Init,
+ Signature::fromOpType(OperandType::kImm) | Signature::fromPredicate(predicate),
+ 0,
+ 0,
+ 0) { setValue(val); }
inline explicit Imm(Globals::NoInit_) noexcept
: Operand(Globals::NoInit) {}
@@ -1252,53 +1480,77 @@ public:
//! \name Accessors
//! \{
+ //! Returns immediate type.
+ inline constexpr ImmType type() const noexcept { return (ImmType)_signature.getField<Signature::kImmTypeMask>(); }
+ //! Sets the immediate type to `type`.
+ inline void setType(ImmType type) noexcept { _signature.setField<Signature::kImmTypeMask>(uint32_t(type)); }
+ //! Resets immediate type to \ref ImmType::kInt.
+ inline void resetType() noexcept { setType(ImmType::kInt); }
+
+ //! Returns operation predicate of the immediate.
+ //!
+ //! The meaning depends on architecture, for example on ARM hardware this describes \ref arm::ShiftOp
+ //! of the immediate.
+ inline constexpr uint32_t predicate() const noexcept { return _signature.getField<Signature::kPredicateMask>(); }
+
+ //! Sets operation predicate of the immediate to `predicate`.
+ //!
+ //! The meaning depends on architecture, for example on ARM hardware this describes \ref arm::ShiftOp
+ //! of the immediate.
+ inline void setPredicate(uint32_t predicate) noexcept { _signature.setField<Signature::kPredicateMask>(predicate); }
+
+ //! Resets the shift operation type of the immediate to the default value (no operation).
+ inline void resetPredicate() noexcept { _signature.setField<Signature::kPredicateMask>(0); }
+
//! Returns the immediate value as `int64_t`, which is the internal format Imm uses.
- constexpr int64_t value() const noexcept {
+ inline constexpr int64_t value() const noexcept {
return int64_t((uint64_t(_data[kDataImmValueHi]) << 32) | _data[kDataImmValueLo]);
}
+ //! Tests whether this immediate value is integer of any size.
+ inline constexpr uint32_t isInt() const noexcept { return type() == ImmType::kInt; }
+ //! Tests whether this immediate value is a double precision floating point value.
+ inline constexpr uint32_t isDouble() const noexcept { return type() == ImmType::kDouble; }
+
//! Tests whether the immediate can be casted to 8-bit signed integer.
- constexpr bool isInt8() const noexcept { return Support::isInt8(value()); }
+ inline constexpr bool isInt8() const noexcept { return type() == ImmType::kInt && Support::isInt8(value()); }
//! Tests whether the immediate can be casted to 8-bit unsigned integer.
- constexpr bool isUInt8() const noexcept { return Support::isUInt8(value()); }
+ inline constexpr bool isUInt8() const noexcept { return type() == ImmType::kInt && Support::isUInt8(value()); }
//! Tests whether the immediate can be casted to 16-bit signed integer.
- constexpr bool isInt16() const noexcept { return Support::isInt16(value()); }
+ inline constexpr bool isInt16() const noexcept { return type() == ImmType::kInt && Support::isInt16(value()); }
//! Tests whether the immediate can be casted to 16-bit unsigned integer.
- constexpr bool isUInt16() const noexcept { return Support::isUInt16(value()); }
+ inline constexpr bool isUInt16() const noexcept { return type() == ImmType::kInt && Support::isUInt16(value()); }
//! Tests whether the immediate can be casted to 32-bit signed integer.
- constexpr bool isInt32() const noexcept { return Support::isInt32(value()); }
+ inline constexpr bool isInt32() const noexcept { return type() == ImmType::kInt && Support::isInt32(value()); }
//! Tests whether the immediate can be casted to 32-bit unsigned integer.
- constexpr bool isUInt32() const noexcept { return _data[kDataImmValueHi] == 0; }
+ inline constexpr bool isUInt32() const noexcept { return type() == ImmType::kInt && _data[kDataImmValueHi] == 0; }
//! Returns the immediate value casted to `T`.
//!
- //! The value is masked before it's casted to `T` so the returned value is
- //! simply the representation of `T` considering the original value's lowest
- //! bits.
+ //! The value is masked before it's casted to `T` so the returned value is simply the representation of `T`
+ //! considering the original value's lowest bits.
template<typename T>
- constexpr T valueAs() const noexcept {
- return T(uint64_t(value()) & Support::allOnes<typename std::make_unsigned<T>::type>());
- }
+ inline T valueAs() const noexcept { return Support::immediateToT<T>(value()); }
//! Returns low 32-bit signed integer.
- constexpr int32_t int32Lo() const noexcept { return int32_t(_data[kDataImmValueLo]); }
+ inline constexpr int32_t int32Lo() const noexcept { return int32_t(_data[kDataImmValueLo]); }
//! Returns high 32-bit signed integer.
- constexpr int32_t int32Hi() const noexcept { return int32_t(_data[kDataImmValueHi]); }
+ inline constexpr int32_t int32Hi() const noexcept { return int32_t(_data[kDataImmValueHi]); }
//! Returns low 32-bit signed integer.
- constexpr uint32_t uint32Lo() const noexcept { return _data[kDataImmValueLo]; }
+ inline constexpr uint32_t uint32Lo() const noexcept { return _data[kDataImmValueLo]; }
//! Returns high 32-bit signed integer.
- constexpr uint32_t uint32Hi() const noexcept { return _data[kDataImmValueHi]; }
+ inline constexpr uint32_t uint32Hi() const noexcept { return _data[kDataImmValueHi]; }
//! Sets immediate value to `val`, the value is casted to a signed 64-bit integer.
template<typename T>
inline void setValue(const T& val) noexcept {
- int64_t val64 = int64_t(Support::asNormalized(val));
- _data[kDataImmValueHi] = uint32_t(uint64_t(val64) >> 32);
- _data[kDataImmValueLo] = uint32_t(uint64_t(val64) & 0xFFFFFFFFu);
+ _setValueInternal(Support::immediateFromT(val), std::is_floating_point<T>::value ? ImmType::kDouble : ImmType::kInt);
}
- inline void setDouble(double d) noexcept {
- setValue(Support::bitCast<uint64_t>(d));
+ inline void _setValueInternal(int64_t val, ImmType type) noexcept {
+ setType(type);
+ _data[kDataImmValueHi] = uint32_t(uint64_t(val) >> 32);
+ _data[kDataImmValueLo] = uint32_t(uint64_t(val) & 0xFFFFFFFFu);
}
//! \}
@@ -1307,7 +1559,7 @@ public:
//! \{
//! Clones the immediate operand.
- constexpr Imm clone() const noexcept { return Imm(*this); }
+ inline constexpr Imm clone() const noexcept { return Imm(*this); }
inline void signExtend8Bits() noexcept { setValue(int64_t(valueAs<int8_t>())); }
inline void signExtend16Bits() noexcept { setValue(int64_t(valueAs<int16_t>())); }
@@ -1318,67 +1570,14 @@ public:
inline void zeroExtend32Bits() noexcept { _data[kDataImmValueHi] = 0u; }
//! \}
-
-#ifndef ASMJIT_NO_DEPRECATED
- ASMJIT_DEPRECATED("Use valueAs<int8_t>() instead")
- inline int8_t i8() const noexcept { return valueAs<int8_t>(); }
-
- ASMJIT_DEPRECATED("Use valueAs<uint8_t>() instead")
- inline uint8_t u8() const noexcept { return valueAs<uint8_t>(); }
-
- ASMJIT_DEPRECATED("Use valueAs<int16_t>() instead")
- inline int16_t i16() const noexcept { return valueAs<int16_t>(); }
-
- ASMJIT_DEPRECATED("Use valueAs<uint16_t>() instead")
- inline uint16_t u16() const noexcept { return valueAs<uint16_t>(); }
-
- ASMJIT_DEPRECATED("Use valueAs<int32_t>() instead")
- inline int32_t i32() const noexcept { return valueAs<int32_t>(); }
-
- ASMJIT_DEPRECATED("Use valueAs<uint32_t>() instead")
- inline uint32_t u32() const noexcept { return valueAs<uint32_t>(); }
-
- ASMJIT_DEPRECATED("Use value() instead")
- inline int64_t i64() const noexcept { return value(); }
-
- ASMJIT_DEPRECATED("Use valueAs<uint64_t>() instead")
- inline uint64_t u64() const noexcept { return valueAs<uint64_t>(); }
-
- ASMJIT_DEPRECATED("Use valueAs<intptr_t>() instead")
- inline intptr_t iptr() const noexcept { return valueAs<intptr_t>(); }
-
- ASMJIT_DEPRECATED("Use valueAs<uintptr_t>() instead")
- inline uintptr_t uptr() const noexcept { return valueAs<uintptr_t>(); }
-
- ASMJIT_DEPRECATED("Use int32Lo() instead")
- inline int32_t i32Lo() const noexcept { return int32Lo(); }
-
- ASMJIT_DEPRECATED("Use uint32Lo() instead")
- inline uint32_t u32Lo() const noexcept { return uint32Lo(); }
-
- ASMJIT_DEPRECATED("Use int32Hi() instead")
- inline int32_t i32Hi() const noexcept { return int32Hi(); }
-
- ASMJIT_DEPRECATED("Use uint32Hi() instead")
- inline uint32_t u32Hi() const noexcept { return uint32Hi(); }
-#endif // !ASMJIT_NO_DEPRECATED
};
//! Creates a new immediate operand.
-//!
-//! Using `imm(x)` is much nicer than using `Imm(x)` as this is a template
-//! which can accept any integer including pointers and function pointers.
template<typename T>
-static constexpr Imm imm(T val) noexcept {
- return Imm(std::is_signed<T>::value ? int64_t(val) : int64_t(uint64_t(val)));
-}
+static inline constexpr Imm imm(const T& val) noexcept { return Imm(val); }
//! \}
-// ============================================================================
-// [asmjit::Globals::none]
-// ============================================================================
-
namespace Globals {
//! \ingroup asmjit_assembler
//!
@@ -1386,31 +1585,25 @@ namespace Globals {
static constexpr const Operand none;
}
-// ============================================================================
-// [asmjit::Support::ForwardOp]
-// ============================================================================
-
//! \cond INTERNAL
namespace Support {
-template<typename T, bool IsIntegral>
+template<typename T, bool kIsImm>
struct ForwardOpImpl {
- static ASMJIT_INLINE const T& forward(const T& value) noexcept { return value; }
+ static inline const T& forward(const T& value) noexcept { return value; }
};
template<typename T>
struct ForwardOpImpl<T, true> {
- static ASMJIT_INLINE Imm forward(const T& value) noexcept { return Imm(value); }
+ static inline Imm forward(const T& value) noexcept { return Imm(value); }
};
-//! Either forwards operand T or returns a new operand for T if T is a type
-//! convertible to operand. At the moment this is only used to convert integers
-//! to \ref Imm operands.
+//! Either forwards operand T or returns a new operand that wraps it if T is a type convertible to operand.
+//! At the moment this is only used to convert integers, floats, and enumarations to \ref Imm operands.
template<typename T>
-struct ForwardOp : public ForwardOpImpl<T, std::is_integral<typename std::decay<T>::type>::value> {};
-
-}
+struct ForwardOp : public ForwardOpImpl<T, Imm::IsConvertibleToImmType<typename std::decay<T>::type>::value> {};
+} // {Support}
//! \endcond
ASMJIT_END_NAMESPACE
diff --git a/3rdparty/asmjit/src/asmjit/core/osutils.cpp b/3rdparty/asmjit/src/asmjit/core/osutils.cpp
index e2f34efb33e..fa900bfbb4c 100644
--- a/3rdparty/asmjit/src/asmjit/core/osutils.cpp
+++ b/3rdparty/asmjit/src/asmjit/core/osutils.cpp
@@ -1,25 +1,7 @@
-// AsmJit - Machine code generation for C++
+// This file is part of AsmJit project <https://asmjit.com>
//
-// * Official AsmJit Home Page: https://asmjit.com
-// * Official Github Repository: https://github.com/asmjit/asmjit
-//
-// Copyright (c) 2008-2020 The AsmJit Authors
-//
-// This software is provided 'as-is', without any express or implied
-// warranty. In no event will the authors be held liable for any damages
-// arising from the use of this software.
-//
-// Permission is granted to anyone to use this software for any purpose,
-// including commercial applications, and to alter it and redistribute it
-// freely, subject to the following restrictions:
-//
-// 1. The origin of this software must not be misrepresented; you must not
-// claim that you wrote the original software. If you use this software
-// in a product, an acknowledgment in the product documentation would be
-// appreciated but is not required.
-// 2. Altered source versions must be plainly marked as such, and must not be
-// misrepresented as being the original software.
-// 3. This notice may not be removed or altered from any source distribution.
+// See asmjit.h or LICENSE.md for license and copyright information
+// SPDX-License-Identifier: Zlib
#include "../core/api-build_p.h"
#include "../core/osutils.h"
@@ -36,10 +18,6 @@
ASMJIT_BEGIN_NAMESPACE
-// ============================================================================
-// [asmjit::OSUtils - GetTickCount]
-// ============================================================================
-
uint32_t OSUtils::getTickCount() noexcept {
#if defined(_WIN32)
enum HiResStatus : uint32_t {
diff --git a/3rdparty/asmjit/src/asmjit/core/osutils.h b/3rdparty/asmjit/src/asmjit/core/osutils.h
index a4691295b20..3c5c3d94c1e 100644
--- a/3rdparty/asmjit/src/asmjit/core/osutils.h
+++ b/3rdparty/asmjit/src/asmjit/core/osutils.h
@@ -1,25 +1,7 @@
-// AsmJit - Machine code generation for C++
+// This file is part of AsmJit project <https://asmjit.com>
//
-// * Official AsmJit Home Page: https://asmjit.com
-// * Official Github Repository: https://github.com/asmjit/asmjit
-//
-// Copyright (c) 2008-2020 The AsmJit Authors
-//
-// This software is provided 'as-is', without any express or implied
-// warranty. In no event will the authors be held liable for any damages
-// arising from the use of this software.
-//
-// Permission is granted to anyone to use this software for any purpose,
-// including commercial applications, and to alter it and redistribute it
-// freely, subject to the following restrictions:
-//
-// 1. The origin of this software must not be misrepresented; you must not
-// claim that you wrote the original software. If you use this software
-// in a product, an acknowledgment in the product documentation would be
-// appreciated but is not required.
-// 2. Altered source versions must be plainly marked as such, and must not be
-// misrepresented as being the original software.
-// 3. This notice may not be removed or altered from any source distribution.
+// See asmjit.h or LICENSE.md for license and copyright information
+// SPDX-License-Identifier: Zlib
#ifndef ASMJIT_CORE_OSUTILS_H_INCLUDED
#define ASMJIT_CORE_OSUTILS_H_INCLUDED
@@ -31,22 +13,14 @@ ASMJIT_BEGIN_NAMESPACE
//! \addtogroup asmjit_utilities
//! \{
-// ============================================================================
-// [asmjit::OSUtils]
-// ============================================================================
-
//! Operating system utilities.
namespace OSUtils {
//! Gets the current CPU tick count, used for benchmarking (1ms resolution).
ASMJIT_API uint32_t getTickCount() noexcept;
};
-// ============================================================================
-// [asmjit::Lock]
-// ============================================================================
//! \cond INTERNAL
-
//! Lock.
//!
//! Lock is internal, it cannot be used outside of AsmJit, however, its internal
@@ -72,11 +46,11 @@ public:
Handle _handle;
#endif
- inline Lock() noexcept;
- inline ~Lock() noexcept;
+ ASMJIT_FORCE_INLINE Lock() noexcept;
+ ASMJIT_FORCE_INLINE ~Lock() noexcept;
- inline void lock() noexcept;
- inline void unlock() noexcept;
+ ASMJIT_FORCE_INLINE void lock() noexcept;
+ ASMJIT_FORCE_INLINE void unlock() noexcept;
};
//! \endcond
diff --git a/3rdparty/asmjit/src/asmjit/core/osutils_p.h b/3rdparty/asmjit/src/asmjit/core/osutils_p.h
index 31db308bdcf..fd87e731123 100644
--- a/3rdparty/asmjit/src/asmjit/core/osutils_p.h
+++ b/3rdparty/asmjit/src/asmjit/core/osutils_p.h
@@ -1,25 +1,7 @@
-// AsmJit - Machine code generation for C++
+// This file is part of AsmJit project <https://asmjit.com>
//
-// * Official AsmJit Home Page: https://asmjit.com
-// * Official Github Repository: https://github.com/asmjit/asmjit
-//
-// Copyright (c) 2008-2020 The AsmJit Authors
-//
-// This software is provided 'as-is', without any express or implied
-// warranty. In no event will the authors be held liable for any damages
-// arising from the use of this software.
-//
-// Permission is granted to anyone to use this software for any purpose,
-// including commercial applications, and to alter it and redistribute it
-// freely, subject to the following restrictions:
-//
-// 1. The origin of this software must not be misrepresented; you must not
-// claim that you wrote the original software. If you use this software
-// in a product, an acknowledgment in the product documentation would be
-// appreciated but is not required.
-// 2. Altered source versions must be plainly marked as such, and must not be
-// misrepresented as being the original software.
-// 3. This notice may not be removed or altered from any source distribution.
+// See asmjit.h or LICENSE.md for license and copyright information
+// SPDX-License-Identifier: Zlib
#ifndef ASMJIT_CORE_OSUTILS_P_H_INCLUDED
#define ASMJIT_CORE_OSUTILS_P_H_INCLUDED
@@ -32,47 +14,39 @@ ASMJIT_BEGIN_NAMESPACE
//! \addtogroup asmjit_utilities
//! \{
-// ============================================================================
-// [asmjit::Lock]
-// ============================================================================
-
#if defined(_WIN32)
// Windows implementation.
static_assert(sizeof(Lock::Handle) == sizeof(CRITICAL_SECTION), "asmjit::Lock::Handle layout must match CRITICAL_SECTION");
static_assert(alignof(Lock::Handle) == alignof(CRITICAL_SECTION), "asmjit::Lock::Handle alignment must match CRITICAL_SECTION");
-inline Lock::Lock() noexcept { InitializeCriticalSection(reinterpret_cast<CRITICAL_SECTION*>(&_handle)); }
-inline Lock::~Lock() noexcept { DeleteCriticalSection(reinterpret_cast<CRITICAL_SECTION*>(&_handle)); }
-inline void Lock::lock() noexcept { EnterCriticalSection(reinterpret_cast<CRITICAL_SECTION*>(&_handle)); }
-inline void Lock::unlock() noexcept { LeaveCriticalSection(reinterpret_cast<CRITICAL_SECTION*>(&_handle)); }
+ASMJIT_FORCE_INLINE Lock::Lock() noexcept { InitializeCriticalSection(reinterpret_cast<CRITICAL_SECTION*>(&_handle)); }
+ASMJIT_FORCE_INLINE Lock::~Lock() noexcept { DeleteCriticalSection(reinterpret_cast<CRITICAL_SECTION*>(&_handle)); }
+ASMJIT_FORCE_INLINE void Lock::lock() noexcept { EnterCriticalSection(reinterpret_cast<CRITICAL_SECTION*>(&_handle)); }
+ASMJIT_FORCE_INLINE void Lock::unlock() noexcept { LeaveCriticalSection(reinterpret_cast<CRITICAL_SECTION*>(&_handle)); }
#elif !defined(__EMSCRIPTEN__)
// PThread implementation.
#ifdef PTHREAD_MUTEX_INITIALIZER
-inline Lock::Lock() noexcept : _handle(PTHREAD_MUTEX_INITIALIZER) {}
+ASMJIT_FORCE_INLINE Lock::Lock() noexcept : _handle(PTHREAD_MUTEX_INITIALIZER) {}
#else
-inline Lock::Lock() noexcept { pthread_mutex_init(&_handle, nullptr); }
+ASMJIT_FORCE_INLINE Lock::Lock() noexcept { pthread_mutex_init(&_handle, nullptr); }
#endif
-inline Lock::~Lock() noexcept { pthread_mutex_destroy(&_handle); }
-inline void Lock::lock() noexcept { pthread_mutex_lock(&_handle); }
-inline void Lock::unlock() noexcept { pthread_mutex_unlock(&_handle); }
+ASMJIT_FORCE_INLINE Lock::~Lock() noexcept { pthread_mutex_destroy(&_handle); }
+ASMJIT_FORCE_INLINE void Lock::lock() noexcept { pthread_mutex_lock(&_handle); }
+ASMJIT_FORCE_INLINE void Lock::unlock() noexcept { pthread_mutex_unlock(&_handle); }
#else
// Dummy implementation - Emscripten or other unsupported platform.
-inline Lock::Lock() noexcept {}
-inline Lock::~Lock() noexcept {}
-inline void Lock::lock() noexcept {}
-inline void Lock::unlock() noexcept {}
+ASMJIT_FORCE_INLINE Lock::Lock() noexcept {}
+ASMJIT_FORCE_INLINE Lock::~Lock() noexcept {}
+ASMJIT_FORCE_INLINE void Lock::lock() noexcept {}
+ASMJIT_FORCE_INLINE void Lock::unlock() noexcept {}
#endif
-// ============================================================================
-// [asmjit::LockGuard]
-// ============================================================================
-
//! Scoped lock.
class LockGuard {
public:
diff --git a/3rdparty/asmjit/src/asmjit/core/raassignment_p.h b/3rdparty/asmjit/src/asmjit/core/raassignment_p.h
index 2618afd0ece..22a97e2b369 100644
--- a/3rdparty/asmjit/src/asmjit/core/raassignment_p.h
+++ b/3rdparty/asmjit/src/asmjit/core/raassignment_p.h
@@ -1,25 +1,7 @@
-// AsmJit - Machine code generation for C++
+// This file is part of AsmJit project <https://asmjit.com>
//
-// * Official AsmJit Home Page: https://asmjit.com
-// * Official Github Repository: https://github.com/asmjit/asmjit
-//
-// Copyright (c) 2008-2020 The AsmJit Authors
-//
-// This software is provided 'as-is', without any express or implied
-// warranty. In no event will the authors be held liable for any damages
-// arising from the use of this software.
-//
-// Permission is granted to anyone to use this software for any purpose,
-// including commercial applications, and to alter it and redistribute it
-// freely, subject to the following restrictions:
-//
-// 1. The origin of this software must not be misrepresented; you must not
-// claim that you wrote the original software. If you use this software
-// in a product, an acknowledgment in the product documentation would be
-// appreciated but is not required.
-// 2. Altered source versions must be plainly marked as such, and must not be
-// misrepresented as being the original software.
-// 3. This notice may not be removed or altered from any source distribution.
+// See asmjit.h or LICENSE.md for license and copyright information
+// SPDX-License-Identifier: Zlib
#ifndef ASMJIT_CORE_RAASSIGNMENT_P_H_INCLUDED
#define ASMJIT_CORE_RAASSIGNMENT_P_H_INCLUDED
@@ -35,14 +17,16 @@ ASMJIT_BEGIN_NAMESPACE
//! \addtogroup asmjit_ra
//! \{
-// ============================================================================
-// [asmjit::RAAssignment]
-// ============================================================================
-
+//! Holds the current register assignment.
+//!
+//! Has two purposes:
+//!
+//! 1. Holds register assignment of a local register allocator (see \ref RALocalAllocator).
+//! 2. Holds register assignment of the entry of basic blocks (see \ref RABlock).
class RAAssignment {
+public:
ASMJIT_NONCOPYABLE(RAAssignment)
-public:
enum Ids : uint32_t {
kPhysNone = 0xFF,
kWorkNone = RAWorkReg::kIdNone
@@ -54,6 +38,17 @@ public:
};
struct Layout {
+ //! Index of architecture registers per group.
+ RARegIndex physIndex;
+ //! Count of architecture registers per group.
+ RARegCount physCount;
+ //! Count of physical registers of all groups.
+ uint32_t physTotal;
+ //! Count of work registers.
+ uint32_t workCount;
+ //! WorkRegs data (vector).
+ const RAWorkRegs* workRegs;
+
inline void reset() noexcept {
physIndex.reset();
physCount.reset();
@@ -61,56 +56,57 @@ public:
workCount = 0;
workRegs = nullptr;
}
-
- RARegIndex physIndex; //!< Index of architecture registers per group.
- RARegCount physCount; //!< Count of architecture registers per group.
- uint32_t physTotal; //!< Count of physical registers of all groups.
- uint32_t workCount; //!< Count of work registers.
- const RAWorkRegs* workRegs; //!< WorkRegs data (vector).
};
struct PhysToWorkMap {
- static inline size_t sizeOf(uint32_t count) noexcept {
- return sizeof(PhysToWorkMap) - sizeof(uint32_t) + size_t(count) * sizeof(uint32_t);
+ //! Assigned registers (each bit represents one physical reg).
+ RARegMask assigned;
+ //! Dirty registers (spill slot out of sync or no spill slot).
+ RARegMask dirty;
+ //! PhysReg to WorkReg mapping.
+ uint32_t workIds[1 /* ... */];
+
+ static inline size_t sizeOf(size_t count) noexcept {
+ return sizeof(PhysToWorkMap) - sizeof(uint32_t) + count * sizeof(uint32_t);
}
- inline void reset(uint32_t count) noexcept {
+ inline void reset(size_t count) noexcept {
assigned.reset();
dirty.reset();
- for (uint32_t i = 0; i < count; i++)
+ for (size_t i = 0; i < count; i++)
workIds[i] = kWorkNone;
}
- inline void copyFrom(const PhysToWorkMap* other, uint32_t count) noexcept {
+ inline void copyFrom(const PhysToWorkMap* other, size_t count) noexcept {
size_t size = sizeOf(count);
memcpy(this, other, size);
}
-
- RARegMask assigned; //!< Assigned registers (each bit represents one physical reg).
- RARegMask dirty; //!< Dirty registers (spill slot out of sync or no spill slot).
- uint32_t workIds[1 /* ... */]; //!< PhysReg to WorkReg mapping.
};
struct WorkToPhysMap {
- static inline size_t sizeOf(uint32_t count) noexcept {
+ //! WorkReg to PhysReg mapping
+ uint8_t physIds[1 /* ... */];
+
+ static inline size_t sizeOf(size_t count) noexcept {
return size_t(count) * sizeof(uint8_t);
}
- inline void reset(uint32_t count) noexcept {
- for (uint32_t i = 0; i < count; i++)
+ inline void reset(size_t count) noexcept {
+ for (size_t i = 0; i < count; i++)
physIds[i] = kPhysNone;
}
- inline void copyFrom(const WorkToPhysMap* other, uint32_t count) noexcept {
+ inline void copyFrom(const WorkToPhysMap* other, size_t count) noexcept {
size_t size = sizeOf(count);
if (ASMJIT_LIKELY(size))
memcpy(this, other, size);
}
-
- uint8_t physIds[1 /* ... */]; //!< WorkReg to PhysReg mapping
};
+ //! \name Members
+ //! \{
+
//! Physical registers layout.
Layout _layout;
//! WorkReg to PhysReg mapping.
@@ -118,7 +114,9 @@ public:
//! PhysReg to WorkReg mapping and assigned/dirty bits.
PhysToWorkMap* _physToWorkMap;
//! Optimization to translate PhysRegs to WorkRegs faster.
- uint32_t* _physToWorkIds[BaseReg::kGroupVirt];
+ Support::Array<uint32_t*, Globals::kNumVirtGroups> _physToWorkIds;
+
+ //! \}
//! \name Construction & Destruction
//! \{
@@ -128,31 +126,30 @@ public:
resetMaps();
}
- inline void initLayout(const RARegCount& physCount, const RAWorkRegs& workRegs) noexcept {
+ ASMJIT_FORCE_INLINE void initLayout(const RARegCount& physCount, const RAWorkRegs& workRegs) noexcept {
// Layout must be initialized before data.
ASMJIT_ASSERT(_physToWorkMap == nullptr);
ASMJIT_ASSERT(_workToPhysMap == nullptr);
_layout.physIndex.buildIndexes(physCount);
_layout.physCount = physCount;
- _layout.physTotal = uint32_t(_layout.physIndex[BaseReg::kGroupVirt - 1]) +
- uint32_t(_layout.physCount[BaseReg::kGroupVirt - 1]) ;
+ _layout.physTotal = uint32_t(_layout.physIndex[RegGroup::kMaxVirt]) +
+ uint32_t(_layout.physCount[RegGroup::kMaxVirt]) ;
_layout.workCount = workRegs.size();
_layout.workRegs = &workRegs;
}
- inline void initMaps(PhysToWorkMap* physToWorkMap, WorkToPhysMap* workToPhysMap) noexcept {
+ ASMJIT_FORCE_INLINE void initMaps(PhysToWorkMap* physToWorkMap, WorkToPhysMap* workToPhysMap) noexcept {
_physToWorkMap = physToWorkMap;
_workToPhysMap = workToPhysMap;
- for (uint32_t group = 0; group < BaseReg::kGroupVirt; group++)
+ for (RegGroup group : RegGroupVirtValues{})
_physToWorkIds[group] = physToWorkMap->workIds + _layout.physIndex.get(group);
}
- inline void resetMaps() noexcept {
+ ASMJIT_FORCE_INLINE void resetMaps() noexcept {
_physToWorkMap = nullptr;
_workToPhysMap = nullptr;
- for (uint32_t group = 0; group < BaseReg::kGroupVirt; group++)
- _physToWorkIds[group] = nullptr;
+ _physToWorkIds.fill(nullptr);
}
//! \}
@@ -165,30 +162,30 @@ public:
inline RARegMask& assigned() noexcept { return _physToWorkMap->assigned; }
inline const RARegMask& assigned() const noexcept { return _physToWorkMap->assigned; }
- inline uint32_t assigned(uint32_t group) const noexcept { return _physToWorkMap->assigned[group]; }
+ inline uint32_t assigned(RegGroup group) const noexcept { return _physToWorkMap->assigned[group]; }
inline RARegMask& dirty() noexcept { return _physToWorkMap->dirty; }
inline const RARegMask& dirty() const noexcept { return _physToWorkMap->dirty; }
- inline uint32_t dirty(uint32_t group) const noexcept { return _physToWorkMap->dirty[group]; }
+ inline RegMask dirty(RegGroup group) const noexcept { return _physToWorkMap->dirty[group]; }
- inline uint32_t workToPhysId(uint32_t group, uint32_t workId) const noexcept {
+ inline uint32_t workToPhysId(RegGroup group, uint32_t workId) const noexcept {
DebugUtils::unused(group);
ASMJIT_ASSERT(workId != kWorkNone);
ASMJIT_ASSERT(workId < _layout.workCount);
return _workToPhysMap->physIds[workId];
}
- inline uint32_t physToWorkId(uint32_t group, uint32_t physId) const noexcept {
+ inline uint32_t physToWorkId(RegGroup group, uint32_t physId) const noexcept {
ASMJIT_ASSERT(physId < Globals::kMaxPhysRegs);
return _physToWorkIds[group][physId];
}
- inline bool isPhysAssigned(uint32_t group, uint32_t physId) const noexcept {
+ inline bool isPhysAssigned(RegGroup group, uint32_t physId) const noexcept {
ASMJIT_ASSERT(physId < Globals::kMaxPhysRegs);
return Support::bitTest(_physToWorkMap->assigned[group], physId);
}
- inline bool isPhysDirty(uint32_t group, uint32_t physId) const noexcept {
+ inline bool isPhysDirty(RegGroup group, uint32_t physId) const noexcept {
ASMJIT_ASSERT(physId < Globals::kMaxPhysRegs);
return Support::bitTest(_physToWorkMap->dirty[group], physId);
}
@@ -196,15 +193,15 @@ public:
//! \}
//! \name Assignment
+ //!
+ //! These are low-level allocation helpers that are used to update the current mappings between physical and
+ //! virt/work registers and also to update masks that represent allocated and dirty registers. These functions
+ //! don't emit any code; they are only used to update and keep all mappings in sync.
+ //!
//! \{
- // These are low-level allocation helpers that are used to update the current
- // mappings between physical and virt/work registers and also to update masks
- // that represent allocated and dirty registers. These functions don't emit
- // any code; they are only used to update and keep all mappings in sync.
-
//! Assign [VirtReg/WorkReg] to a physical register.
- ASMJIT_INLINE void assign(uint32_t group, uint32_t workId, uint32_t physId, uint32_t dirty) noexcept {
+ inline void assign(RegGroup group, uint32_t workId, uint32_t physId, bool dirty) noexcept {
ASMJIT_ASSERT(workToPhysId(group, workId) == kPhysNone);
ASMJIT_ASSERT(physToWorkId(group, physId) == kWorkNone);
ASMJIT_ASSERT(!isPhysAssigned(group, physId));
@@ -213,15 +210,15 @@ public:
_workToPhysMap->physIds[workId] = uint8_t(physId);
_physToWorkIds[group][physId] = workId;
- uint32_t regMask = Support::bitMask(physId);
+ RegMask regMask = Support::bitMask(physId);
_physToWorkMap->assigned[group] |= regMask;
- _physToWorkMap->dirty[group] |= regMask & Support::bitMaskFromBool<uint32_t>(dirty);
+ _physToWorkMap->dirty[group] |= regMask & Support::bitMaskFromBool<RegMask>(dirty);
verify();
}
//! Reassign [VirtReg/WorkReg] to `dstPhysId` from `srcPhysId`.
- ASMJIT_INLINE void reassign(uint32_t group, uint32_t workId, uint32_t dstPhysId, uint32_t srcPhysId) noexcept {
+ inline void reassign(RegGroup group, uint32_t workId, uint32_t dstPhysId, uint32_t srcPhysId) noexcept {
ASMJIT_ASSERT(dstPhysId != srcPhysId);
ASMJIT_ASSERT(workToPhysId(group, workId) == srcPhysId);
ASMJIT_ASSERT(physToWorkId(group, srcPhysId) == workId);
@@ -232,19 +229,19 @@ public:
_physToWorkIds[group][srcPhysId] = kWorkNone;
_physToWorkIds[group][dstPhysId] = workId;
- uint32_t srcMask = Support::bitMask(srcPhysId);
- uint32_t dstMask = Support::bitMask(dstPhysId);
+ RegMask srcMask = Support::bitMask(srcPhysId);
+ RegMask dstMask = Support::bitMask(dstPhysId);
- uint32_t dirty = (_physToWorkMap->dirty[group] & srcMask) != 0;
- uint32_t regMask = dstMask | srcMask;
+ bool dirty = (_physToWorkMap->dirty[group] & srcMask) != 0;
+ RegMask regMask = dstMask | srcMask;
_physToWorkMap->assigned[group] ^= regMask;
- _physToWorkMap->dirty[group] ^= regMask & Support::bitMaskFromBool<uint32_t>(dirty);
+ _physToWorkMap->dirty[group] ^= regMask & Support::bitMaskFromBool<RegMask>(dirty);
verify();
}
- ASMJIT_INLINE void swap(uint32_t group, uint32_t aWorkId, uint32_t aPhysId, uint32_t bWorkId, uint32_t bPhysId) noexcept {
+ inline void swap(RegGroup group, uint32_t aWorkId, uint32_t aPhysId, uint32_t bWorkId, uint32_t bPhysId) noexcept {
ASMJIT_ASSERT(aPhysId != bPhysId);
ASMJIT_ASSERT(workToPhysId(group, aWorkId) == aPhysId);
ASMJIT_ASSERT(workToPhysId(group, bWorkId) == bPhysId);
@@ -258,21 +255,17 @@ public:
_physToWorkIds[group][aPhysId] = bWorkId;
_physToWorkIds[group][bPhysId] = aWorkId;
- uint32_t aMask = Support::bitMask(aPhysId);
- uint32_t bMask = Support::bitMask(bPhysId);
-
- uint32_t flipMask = Support::bitMaskFromBool<uint32_t>(
- ((_physToWorkMap->dirty[group] & aMask) != 0) ^
- ((_physToWorkMap->dirty[group] & bMask) != 0));
-
- uint32_t regMask = aMask | bMask;
+ RegMask aMask = Support::bitMask(aPhysId);
+ RegMask bMask = Support::bitMask(bPhysId);
+ RegMask flipMask = Support::bitMaskFromBool<RegMask>(((_physToWorkMap->dirty[group] & aMask) != 0) ^ ((_physToWorkMap->dirty[group] & bMask) != 0));
+ RegMask regMask = aMask | bMask;
_physToWorkMap->dirty[group] ^= regMask & flipMask;
verify();
}
//! Unassign [VirtReg/WorkReg] from a physical register.
- ASMJIT_INLINE void unassign(uint32_t group, uint32_t workId, uint32_t physId) noexcept {
+ inline void unassign(RegGroup group, uint32_t workId, uint32_t physId) noexcept {
ASMJIT_ASSERT(physId < Globals::kMaxPhysRegs);
ASMJIT_ASSERT(workToPhysId(group, workId) == physId);
ASMJIT_ASSERT(physToWorkId(group, physId) == workId);
@@ -281,22 +274,22 @@ public:
_workToPhysMap->physIds[workId] = kPhysNone;
_physToWorkIds[group][physId] = kWorkNone;
- uint32_t regMask = Support::bitMask(physId);
+ RegMask regMask = Support::bitMask(physId);
_physToWorkMap->assigned[group] &= ~regMask;
_physToWorkMap->dirty[group] &= ~regMask;
verify();
}
- inline void makeClean(uint32_t group, uint32_t workId, uint32_t physId) noexcept {
+ inline void makeClean(RegGroup group, uint32_t workId, uint32_t physId) noexcept {
DebugUtils::unused(workId);
- uint32_t regMask = Support::bitMask(physId);
+ RegMask regMask = Support::bitMask(physId);
_physToWorkMap->dirty[group] &= ~regMask;
}
- inline void makeDirty(uint32_t group, uint32_t workId, uint32_t physId) noexcept {
+ inline void makeDirty(RegGroup group, uint32_t workId, uint32_t physId) noexcept {
DebugUtils::unused(workId);
- uint32_t regMask = Support::bitMask(physId);
+ RegMask regMask = Support::bitMask(physId);
_physToWorkMap->dirty[group] |= regMask;
}
@@ -305,12 +298,10 @@ public:
//! \name Utilities
//! \{
- inline void swap(RAAssignment& other) noexcept {
+ ASMJIT_FORCE_INLINE void swap(RAAssignment& other) noexcept {
std::swap(_workToPhysMap, other._workToPhysMap);
std::swap(_physToWorkMap, other._physToWorkMap);
-
- for (uint32_t group = 0; group < BaseReg::kGroupVirt; group++)
- std::swap(_physToWorkIds[group], other._physToWorkIds[group]);
+ _physToWorkIds.swap(other._physToWorkIds);
}
inline void copyFrom(const PhysToWorkMap* physToWorkMap, const WorkToPhysMap* workToPhysMap) noexcept {
@@ -364,7 +355,7 @@ public:
uint32_t physId = _workToPhysMap->physIds[workId];
if (physId != kPhysNone) {
const RAWorkReg* workReg = _layout.workRegs->at(workId);
- uint32_t group = workReg->group();
+ RegGroup group = workReg->group();
ASMJIT_ASSERT(_physToWorkIds[group][physId] == workId);
}
}
@@ -372,7 +363,7 @@ public:
// Verify PhysToWorkMap.
{
- for (uint32_t group = 0; group < BaseReg::kGroupVirt; group++) {
+ for (RegGroup group : RegGroupVirtValues{}) {
uint32_t physCount = _layout.physCount[group];
for (uint32_t physId = 0; physId < physCount; physId++) {
uint32_t workId = _physToWorkIds[group][physId];
diff --git a/3rdparty/asmjit/src/asmjit/core/rabuilders_p.h b/3rdparty/asmjit/src/asmjit/core/rabuilders_p.h
index 50624bf58cd..1b763030c45 100644
--- a/3rdparty/asmjit/src/asmjit/core/rabuilders_p.h
+++ b/3rdparty/asmjit/src/asmjit/core/rabuilders_p.h
@@ -1,25 +1,7 @@
-// AsmJit - Machine code generation for C++
+// This file is part of AsmJit project <https://asmjit.com>
//
-// * Official AsmJit Home Page: https://asmjit.com
-// * Official Github Repository: https://github.com/asmjit/asmjit
-//
-// Copyright (c) 2008-2020 The AsmJit Authors
-//
-// This software is provided 'as-is', without any express or implied
-// warranty. In no event will the authors be held liable for any damages
-// arising from the use of this software.
-//
-// Permission is granted to anyone to use this software for any purpose,
-// including commercial applications, and to alter it and redistribute it
-// freely, subject to the following restrictions:
-//
-// 1. The origin of this software must not be misrepresented; you must not
-// claim that you wrote the original software. If you use this software
-// in a product, an acknowledgment in the product documentation would be
-// appreciated but is not required.
-// 2. Altered source versions must be plainly marked as such, and must not be
-// misrepresented as being the original software.
-// 3. This notice may not be removed or altered from any source distribution.
+// See asmjit.h or LICENSE.md for license and copyright information
+// SPDX-License-Identifier: Zlib
#ifndef ASMJIT_CORE_RABUILDERS_P_H_INCLUDED
#define ASMJIT_CORE_RABUILDERS_P_H_INCLUDED
@@ -36,81 +18,73 @@ ASMJIT_BEGIN_NAMESPACE
//! \addtogroup asmjit_ra
//! \{
-// ============================================================================
-// [asmjit::RACFGBuilder]
-// ============================================================================
-
template<typename This>
-class RACFGBuilder {
+class RACFGBuilderT {
public:
- RAPass* _pass;
- BaseCompiler* _cc;
-
- RABlock* _curBlock;
- RABlock* _retBlock;
- FuncNode* _funcNode;
- RARegsStats _blockRegStats;
- uint32_t _exitLabelId;
- ZoneVector<uint32_t> _sharedAssignmentsMap;
+ enum : uint32_t {
+ kRootIndentation = 2,
+ kCodeIndentation = 4,
+
+ // NOTE: This is a bit hacky. There are some nodes which are processed twice (see `onBeforeInvoke()` and
+ // `onBeforeRet()`) as they can insert some nodes around them. Since we don't have any flags to mark these
+ // we just use their position that is [at that time] unassigned.
+ kNodePositionDidOnBefore = 0xFFFFFFFFu
+ };
+
+ //! \name Members
+ //! \{
+
+ BaseRAPass* _pass = nullptr;
+ BaseCompiler* _cc = nullptr;
+ RABlock* _curBlock = nullptr;
+ RABlock* _retBlock = nullptr;
+ FuncNode* _funcNode = nullptr;
+ RARegsStats _blockRegStats {};
+ uint32_t _exitLabelId = Globals::kInvalidId;
+ ZoneVector<uint32_t> _sharedAssignmentsMap {};
// Only used by logging, it's fine to be here to prevent more #ifdefs...
- bool _hasCode;
- RABlock* _lastLoggedBlock;
+ bool _hasCode = false;
+ RABlock* _lastLoggedBlock = nullptr;
#ifndef ASMJIT_NO_LOGGING
- Logger* _logger;
- uint32_t _logFlags;
+ Logger* _logger = nullptr;
+ FormatOptions _formatOptions {};
StringTmp<512> _sb;
#endif
- static constexpr uint32_t kRootIndentation = 2;
- static constexpr uint32_t kCodeIndentation = 4;
+ //! \}
- // NOTE: This is a bit hacky. There are some nodes which are processed twice
- // (see `onBeforeInvoke()` and `onBeforeRet()`) as they can insert some nodes
- // around them. Since we don't have any flags to mark these we just use their
- // position that is [at that time] unassigned.
- static constexpr uint32_t kNodePositionDidOnBefore = 0xFFFFFFFFu;
-
- inline RACFGBuilder(RAPass* pass) noexcept
+ inline RACFGBuilderT(BaseRAPass* pass) noexcept
: _pass(pass),
- _cc(pass->cc()),
- _curBlock(nullptr),
- _retBlock(nullptr),
- _funcNode(nullptr),
- _blockRegStats{},
- _exitLabelId(Globals::kInvalidId),
- _hasCode(false),
- _lastLoggedBlock(nullptr) {
+ _cc(pass->cc()) {
#ifndef ASMJIT_NO_LOGGING
- _logger = _pass->debugLogger();
- _logFlags = FormatOptions::kFlagPositions;
-
+ _logger = _pass->hasDiagnosticOption(DiagnosticOptions::kRADebugCFG) ? _pass->logger() : nullptr;
if (_logger)
- _logFlags |= _logger->flags();
+ _formatOptions = _logger->options();
#endif
}
inline BaseCompiler* cc() const noexcept { return _cc; }
- // --------------------------------------------------------------------------
- // [Run]
- // --------------------------------------------------------------------------
+ //! \name Run
+ //! \{
//! Called per function by an architecture-specific CFG builder.
Error run() noexcept {
- log("[RAPass::BuildCFG]\n");
+ log("[BuildCFG]\n");
ASMJIT_PROPAGATE(prepare());
logNode(_funcNode, kRootIndentation);
logBlock(_curBlock, kRootIndentation);
+ RABlock* entryBlock = _curBlock;
BaseNode* node = _funcNode->next();
if (ASMJIT_UNLIKELY(!node))
return DebugUtils::errored(kErrorInvalidState);
- _curBlock->setFirst(node);
- _curBlock->setLast(node);
+ _curBlock->setFirst(_funcNode);
+ _curBlock->setLast(_funcNode);
RAInstBuilder ib;
ZoneVector<RABlock*> blocksWithUnknownJumps;
@@ -123,12 +97,11 @@ public:
// Instruction | Jump | Invoke | Return
// ------------------------------------
- // Handle `InstNode`, `InvokeNode`, and `FuncRetNode`. All of them
- // share the same interface that provides operands that have read/write
- // semantics.
+ // Handle `InstNode`, `InvokeNode`, and `FuncRetNode`. All of them share the same interface that provides
+ // operands that have read/write semantics.
if (ASMJIT_UNLIKELY(!_curBlock)) {
- // Unreachable code has to be removed, we cannot allocate registers
- // in such code as we cannot do proper liveness analysis in such case.
+ // Unreachable code has to be removed, we cannot allocate registers in such code as we cannot do proper
+ // liveness analysis in such case.
removeNode(node);
node = next;
continue;
@@ -138,15 +111,13 @@ public:
if (node->isInvoke() || node->isFuncRet()) {
if (node->position() != kNodePositionDidOnBefore) {
- // Call and Reg are complicated as they may insert some surrounding
- // code around them. The simplest approach is to get the previous
- // node, call the `onBefore()` handlers and then check whether
- // anything changed and restart if so. By restart we mean that the
- // current `node` would go back to the first possible inserted node
- // by `onBeforeInvoke()` or `onBeforeRet()`.
+ // Call and Reg are complicated as they may insert some surrounding code around them. The simplest
+ // approach is to get the previous node, call the `onBefore()` handlers and then check whether
+ // anything changed and restart if so. By restart we mean that the current `node` would go back to
+ // the first possible inserted node by `onBeforeInvoke()` or `onBeforeRet()`.
BaseNode* prev = node->prev();
- if (node->type() == BaseNode::kNodeInvoke)
+ if (node->type() == NodeType::kInvoke)
ASMJIT_PROPAGATE(static_cast<This*>(this)->onBeforeInvoke(node->as<InvokeNode>()));
else
ASMJIT_PROPAGATE(static_cast<This*>(this)->onBeforeRet(node->as<FuncRetNode>()));
@@ -176,9 +147,9 @@ public:
InstNode* inst = node->as<InstNode>();
logNode(inst, kCodeIndentation);
- uint32_t controlType = BaseInst::kControlNone;
+ InstControlFlow cf = InstControlFlow::kRegular;
ib.reset();
- ASMJIT_PROPAGATE(static_cast<This*>(this)->onInst(inst, controlType, ib));
+ ASMJIT_PROPAGATE(static_cast<This*>(this)->onInst(inst, cf, ib));
if (node->isInvoke()) {
ASMJIT_PROPAGATE(static_cast<This*>(this)->onInvoke(inst->as<InvokeNode>(), ib));
@@ -186,20 +157,20 @@ public:
if (node->isFuncRet()) {
ASMJIT_PROPAGATE(static_cast<This*>(this)->onRet(inst->as<FuncRetNode>(), ib));
- controlType = BaseInst::kControlReturn;
+ cf = InstControlFlow::kReturn;
}
- if (controlType == BaseInst::kControlJump) {
+ if (cf == InstControlFlow::kJump) {
uint32_t fixedRegCount = 0;
for (RATiedReg& tiedReg : ib) {
RAWorkReg* workReg = _pass->workRegById(tiedReg.workId());
- if (workReg->group() == BaseReg::kGroupGp) {
+ if (workReg->group() == RegGroup::kGp) {
uint32_t useId = tiedReg.useId();
if (useId == BaseReg::kIdBad) {
useId = _pass->_scratchRegIndexes[fixedRegCount++];
tiedReg.setUseId(useId);
}
- _curBlock->addExitScratchGpRegs(Support::bitMask<uint32_t>(useId));
+ _curBlock->addExitScratchGpRegs(Support::bitMask(useId));
}
}
}
@@ -207,14 +178,14 @@ public:
ASMJIT_PROPAGATE(_pass->assignRAInst(inst, _curBlock, ib));
_blockRegStats.combineWith(ib._stats);
- if (controlType != BaseInst::kControlNone) {
+ if (cf != InstControlFlow::kRegular) {
// Support for conditional and unconditional jumps.
- if (controlType == BaseInst::kControlJump || controlType == BaseInst::kControlBranch) {
+ if (cf == InstControlFlow::kJump || cf == InstControlFlow::kBranch) {
_curBlock->setLast(node);
- _curBlock->addFlags(RABlock::kFlagHasTerminator);
+ _curBlock->addFlags(RABlockFlags::kHasTerminator);
_curBlock->makeConstructed(_blockRegStats);
- if (!(inst->instOptions() & BaseInst::kOptionUnfollow)) {
+ if (!inst->hasOption(InstOptions::kUnfollow)) {
// Jmp/Jcc/Call/Loop/etc...
uint32_t opCount = inst->opCount();
const Operand* opArray = inst->operands();
@@ -232,15 +203,17 @@ public:
if (ASMJIT_UNLIKELY(!targetBlock))
return DebugUtils::errored(kErrorOutOfMemory);
+ targetBlock->makeTargetable();
ASMJIT_PROPAGATE(_curBlock->appendSuccessor(targetBlock));
}
else {
- // Not a label - could be jump with reg/mem operand, which
- // means that it can go anywhere. Such jumps must either be
- // annotated so the CFG can be properly constructed, otherwise
- // we assume the worst case - can jump to every basic block.
+ // Not a label - could be jump with reg/mem operand, which means that it can go anywhere. Such jumps
+ // must either be annotated so the CFG can be properly constructed, otherwise we assume the worst case
+ // - can jump to any basic block.
JumpAnnotation* jumpAnnotation = nullptr;
- if (inst->type() == BaseNode::kNodeJump)
+ _curBlock->addFlags(RABlockFlags::kHasJumpTable);
+
+ if (inst->type() == NodeType::kJump)
jumpAnnotation = inst->as<JumpNode>()->annotation();
if (jumpAnnotation) {
@@ -256,6 +229,7 @@ public:
// Prevents adding basic-block successors multiple times.
if (!targetBlock->hasTimestamp(timestamp)) {
targetBlock->setTimestamp(timestamp);
+ targetBlock->makeTargetable();
ASMJIT_PROPAGATE(_curBlock->appendSuccessor(targetBlock));
}
}
@@ -267,13 +241,11 @@ public:
}
}
- if (controlType == BaseInst::kControlJump) {
- // Unconditional jump makes the code after the jump unreachable,
- // which will be removed instantly during the CFG construction;
- // as we cannot allocate registers for instructions that are not
- // part of any block. Of course we can leave these instructions
- // as they are, however, that would only postpone the problem as
- // assemblers can't encode instructions that use virtual registers.
+ if (cf == InstControlFlow::kJump) {
+ // Unconditional jump makes the code after the jump unreachable, which will be removed instantly during
+ // the CFG construction; as we cannot allocate registers for instructions that are not part of any block.
+ // Of course we can leave these instructions as they are, however, that would only postpone the problem
+ // as assemblers can't encode instructions that use virtual registers.
_curBlock = nullptr;
}
else {
@@ -282,7 +254,7 @@ public:
return DebugUtils::errored(kErrorInvalidState);
RABlock* consecutiveBlock;
- if (node->type() == BaseNode::kNodeLabel) {
+ if (node->type() == NodeType::kLabel) {
if (node->hasPassData()) {
consecutiveBlock = node->passData<RABlock>();
}
@@ -299,7 +271,7 @@ public:
return DebugUtils::errored(kErrorOutOfMemory);
}
- _curBlock->addFlags(RABlock::kFlagHasConsecutive);
+ _curBlock->addFlags(RABlockFlags::kHasConsecutive);
ASMJIT_PROPAGATE(_curBlock->prependSuccessor(consecutiveBlock));
_curBlock = consecutiveBlock;
@@ -315,7 +287,7 @@ public:
}
}
- if (controlType == BaseInst::kControlReturn) {
+ if (cf == InstControlFlow::kReturn) {
_curBlock->setLast(node);
_curBlock->makeConstructed(_blockRegStats);
ASMJIT_PROPAGATE(_curBlock->appendSuccessor(_retBlock));
@@ -324,30 +296,30 @@ public:
}
}
}
- else if (node->type() == BaseNode::kNodeLabel) {
+ else if (node->type() == NodeType::kLabel) {
// Label - Basic-Block Management
// ------------------------------
if (!_curBlock) {
- // If the current code is unreachable the label makes it reachable
- // again. We may remove the whole block in the future if it's not
- // referenced.
+ // If the current code is unreachable the label makes it reachable again. We may remove the whole block in
+ // the future if it's not referenced though.
_curBlock = node->passData<RABlock>();
if (_curBlock) {
- // If the label has a block assigned we can either continue with
- // it or skip it if the block has been constructed already.
+ // If the label has a block assigned we can either continue with it or skip it if the block has been
+ // constructed already.
if (_curBlock->isConstructed())
break;
}
else {
- // No block assigned, to create a new one, and assign it.
+ // No block assigned - create a new one and assign it.
_curBlock = _pass->newBlock(node);
if (ASMJIT_UNLIKELY(!_curBlock))
return DebugUtils::errored(kErrorOutOfMemory);
node->setPassData<RABlock>(_curBlock);
}
+ _curBlock->makeTargetable();
_hasCode = false;
_blockRegStats.reset();
ASMJIT_PROPAGATE(_pass->addBlock(_curBlock));
@@ -355,20 +327,21 @@ public:
else {
if (node->hasPassData()) {
RABlock* consecutive = node->passData<RABlock>();
+ consecutive->makeTargetable();
+
if (_curBlock == consecutive) {
- // The label currently processed is part of the current block. This
- // is only possible for multiple labels that are right next to each
- // other, or are separated by non-code nodes like directives and comments.
+ // The label currently processed is part of the current block. This is only possible for multiple labels
+ // that are right next to each other or labels that are separated by non-code nodes like directives and
+ // comments.
if (ASMJIT_UNLIKELY(_hasCode))
return DebugUtils::errored(kErrorInvalidState);
}
else {
- // Label makes the current block constructed. There is a chance that the
- // Label is not used, but we don't know that at this point. In the worst
- // case there would be two blocks next to each other, it's just fine.
+ // Label makes the current block constructed. There is a chance that the Label is not used, but we don't
+ // know that at this point. In the worst case there would be two blocks next to each other, it's just fine.
ASMJIT_ASSERT(_curBlock->last() != node);
_curBlock->setLast(node->prev());
- _curBlock->addFlags(RABlock::kFlagHasConsecutive);
+ _curBlock->addFlags(RABlockFlags::kHasConsecutive);
_curBlock->makeConstructed(_blockRegStats);
ASMJIT_PROPAGATE(_curBlock->appendSuccessor(consecutive));
@@ -381,17 +354,18 @@ public:
}
else {
// First time we see this label.
- if (_hasCode) {
- // Cannot continue the current block if it already contains some
- // code. We need to create a new block and make it a successor.
+ if (_hasCode || _curBlock == entryBlock) {
+ // Cannot continue the current block if it already contains some code or it's a block entry. We need to
+ // create a new block and make it a successor.
ASMJIT_ASSERT(_curBlock->last() != node);
_curBlock->setLast(node->prev());
- _curBlock->addFlags(RABlock::kFlagHasConsecutive);
+ _curBlock->addFlags(RABlockFlags::kHasConsecutive);
_curBlock->makeConstructed(_blockRegStats);
RABlock* consecutive = _pass->newBlock(node);
if (ASMJIT_UNLIKELY(!consecutive))
return DebugUtils::errored(kErrorOutOfMemory);
+ consecutive->makeTargetable();
ASMJIT_PROPAGATE(_curBlock->appendSuccessor(consecutive));
ASMJIT_PROPAGATE(_pass->addBlock(consecutive));
@@ -424,7 +398,7 @@ public:
logNode(node, kCodeIndentation);
- if (node->type() == BaseNode::kNodeSentinel) {
+ if (node->type() == NodeType::kSentinel) {
if (node == _funcNode->endNode()) {
// Make sure we didn't flow here if this is the end of the function sentinel.
if (ASMJIT_UNLIKELY(_curBlock))
@@ -432,7 +406,7 @@ public:
break;
}
}
- else if (node->type() == BaseNode::kNodeFunc) {
+ else if (node->type() == NodeType::kFunc) {
// RAPass can only compile a single function at a time. If we
// encountered a function it must be the current one, bail if not.
if (ASMJIT_UNLIKELY(node != _funcNode))
@@ -447,10 +421,9 @@ public:
// Advance to the next node.
node = next;
- // NOTE: We cannot encounter a NULL node, because every function must be
- // terminated by a sentinel (`stop`) node. If we encountered a NULL node it
- // means that something went wrong and this node list is corrupted; bail in
- // such case.
+ // NOTE: We cannot encounter a NULL node, because every function must be terminated by a sentinel (`stop`)
+ // node. If we encountered a NULL node it means that something went wrong and this node list is corrupted;
+ // bail in such case.
if (ASMJIT_UNLIKELY(!node))
return DebugUtils::errored(kErrorInvalidState);
}
@@ -464,9 +437,10 @@ public:
return _pass->initSharedAssignments(_sharedAssignmentsMap);
}
- // --------------------------------------------------------------------------
- // [Prepare]
- // --------------------------------------------------------------------------
+ //! \}
+
+ //! \name Prepare
+ //! \{
//! Prepares the CFG builder of the current function.
Error prepare() noexcept {
@@ -479,6 +453,8 @@ public:
if (ASMJIT_UNLIKELY(!_retBlock))
return DebugUtils::errored(kErrorOutOfMemory);
+
+ _retBlock->makeTargetable();
ASMJIT_PROPAGATE(_pass->addExitBlock(_retBlock));
if (node != func) {
@@ -501,11 +477,12 @@ public:
return _pass->addBlock(_curBlock);
}
- // --------------------------------------------------------------------------
- // [Utilities]
- // --------------------------------------------------------------------------
+ //! \}
- //! Called when a `node` is removed, e.g. bacause of a dead code elimination.
+ //! \name Utilities
+ //! \{
+
+ //! Called when a `node` is removed, e.g. because of a dead code elimination.
void removeNode(BaseNode* node) noexcept {
logNode(node, kRootIndentation, "<Removed>");
cc()->removeNode(node);
@@ -513,21 +490,20 @@ public:
//! Handles block with unknown jump, which could be a jump to a jump table.
//!
- //! If we encounter such block we basically insert all existing blocks as
- //! successors except the function entry block and a natural successor, if
- //! such block exists.
+ //! If we encounter such block we basically insert all existing blocks as successors except the function entry
+ //! block and a natural successor, if such block exists.
Error handleBlockWithUnknownJump(RABlock* block) noexcept {
RABlocks& blocks = _pass->blocks();
size_t blockCount = blocks.size();
// NOTE: Iterate from `1` as the first block is the entry block, we don't
- // allow the entry to be a successor of block that ends with unknown jump.
+ // allow the entry to be a successor of any block.
RABlock* consecutive = block->consecutive();
for (size_t i = 1; i < blockCount; i++) {
- RABlock* successor = blocks[i];
- if (successor == consecutive)
+ RABlock* candidate = blocks[i];
+ if (candidate == consecutive || !candidate->isTargetable())
continue;
- block->appendSuccessor(successor);
+ block->appendSuccessor(candidate);
}
return shareAssignmentAcrossSuccessors(block);
@@ -567,9 +543,10 @@ public:
return kErrorOk;
}
- // --------------------------------------------------------------------------
- // [Logging]
- // --------------------------------------------------------------------------
+ //! \}
+
+ //! \name Logging
+ //! \{
#ifndef ASMJIT_NO_LOGGING
template<typename... Args>
@@ -603,7 +580,7 @@ public:
_sb.append(action);
_sb.append(' ');
}
- Formatter::formatNode(_sb, _logFlags, cc(), node);
+ Formatter::formatNode(_sb, _formatOptions, cc(), node);
_sb.append('\n');
_logger->log(_sb);
}
@@ -622,6 +599,8 @@ public:
DebugUtils::unused(node, indentation, action);
}
#endif
+
+ //! \}
};
//! \}
diff --git a/3rdparty/asmjit/src/asmjit/core/radefs_p.h b/3rdparty/asmjit/src/asmjit/core/radefs_p.h
index b77ed1bd738..426ac2926db 100644
--- a/3rdparty/asmjit/src/asmjit/core/radefs_p.h
+++ b/3rdparty/asmjit/src/asmjit/core/radefs_p.h
@@ -1,35 +1,18 @@
-// AsmJit - Machine code generation for C++
+// This file is part of AsmJit project <https://asmjit.com>
//
-// * Official AsmJit Home Page: https://asmjit.com
-// * Official Github Repository: https://github.com/asmjit/asmjit
-//
-// Copyright (c) 2008-2020 The AsmJit Authors
-//
-// This software is provided 'as-is', without any express or implied
-// warranty. In no event will the authors be held liable for any damages
-// arising from the use of this software.
-//
-// Permission is granted to anyone to use this software for any purpose,
-// including commercial applications, and to alter it and redistribute it
-// freely, subject to the following restrictions:
-//
-// 1. The origin of this software must not be misrepresented; you must not
-// claim that you wrote the original software. If you use this software
-// in a product, an acknowledgment in the product documentation would be
-// appreciated but is not required.
-// 2. Altered source versions must be plainly marked as such, and must not be
-// misrepresented as being the original software.
-// 3. This notice may not be removed or altered from any source distribution.
+// See asmjit.h or LICENSE.md for license and copyright information
+// SPDX-License-Identifier: Zlib
#ifndef ASMJIT_CORE_RADEFS_P_H_INCLUDED
#define ASMJIT_CORE_RADEFS_P_H_INCLUDED
#include "../core/api-config.h"
-#ifndef ASMJIT_NO_COMPILER
-
-#include "../core/compiler.h"
+#include "../core/archtraits.h"
+#include "../core/compilerdefs.h"
#include "../core/logger.h"
+#include "../core/operand.h"
#include "../core/support.h"
+#include "../core/type.h"
#include "../core/zone.h"
#include "../core/zonevector.h"
@@ -39,10 +22,6 @@ ASMJIT_BEGIN_NAMESPACE
//! \addtogroup asmjit_ra
//! \{
-// ============================================================================
-// [Logging]
-// ============================================================================
-
#ifndef ASMJIT_NO_LOGGING
# define ASMJIT_RA_LOG_FORMAT(...) \
do { \
@@ -60,95 +39,116 @@ ASMJIT_BEGIN_NAMESPACE
# define ASMJIT_RA_LOG_COMPLEX(...) ((void)0)
#endif
-// ============================================================================
-// [Forward Declarations]
-// ============================================================================
-
-class RAPass;
+class BaseRAPass;
class RABlock;
+class BaseNode;
struct RAStackSlot;
typedef ZoneVector<RABlock*> RABlocks;
typedef ZoneVector<RAWorkReg*> RAWorkRegs;
-// ============================================================================
-// [asmjit::RAStrategy]
-// ============================================================================
+//! Maximum number of consecutive registers aggregated from all supported backends.
+static constexpr uint32_t kMaxConsecutiveRegs = 4;
-struct RAStrategy {
- uint8_t _type;
+//! Provides architecture constraints used by register allocator.
+class RAConstraints {
+public:
+ //! \name Members
+ //! \{
- enum StrategyType : uint32_t {
- kStrategySimple = 0,
- kStrategyComplex = 1
- };
+ Support::Array<RegMask, Globals::kNumVirtGroups> _availableRegs {};
- inline RAStrategy() noexcept { reset(); }
- inline void reset() noexcept { memset(this, 0, sizeof(*this)); }
+ //! \}
- inline uint32_t type() const noexcept { return _type; }
- inline void setType(uint32_t type) noexcept { _type = uint8_t(type); }
+ ASMJIT_NOINLINE Error init(Arch arch) noexcept {
+ switch (arch) {
+ case Arch::kX86:
+ case Arch::kX64: {
+ uint32_t registerCount = arch == Arch::kX86 ? 8 : 16;
+ _availableRegs[RegGroup::kGp] = Support::lsbMask<RegMask>(registerCount) & ~Support::bitMask(4u);
+ _availableRegs[RegGroup::kVec] = Support::lsbMask<RegMask>(registerCount);
+ _availableRegs[RegGroup::kExtraVirt2] = Support::lsbMask<RegMask>(8);
+ _availableRegs[RegGroup::kExtraVirt3] = Support::lsbMask<RegMask>(8);
+ return kErrorOk;
+ }
- inline bool isSimple() const noexcept { return _type == kStrategySimple; }
- inline bool isComplex() const noexcept { return _type >= kStrategyComplex; }
-};
+ case Arch::kAArch64: {
+ _availableRegs[RegGroup::kGp] = 0xFFFFFFFFu & ~Support::bitMask(18, 31u);
+ _availableRegs[RegGroup::kVec] = 0xFFFFFFFFu;
+ _availableRegs[RegGroup::kExtraVirt2] = 0;
+ _availableRegs[RegGroup::kExtraVirt3] = 0;
+ return kErrorOk;
+ }
+
+ default:
+ return DebugUtils::errored(kErrorInvalidArch);
+ }
+ }
-// ============================================================================
-// [asmjit::RAArchTraits]
-// ============================================================================
+ inline RegMask availableRegs(RegGroup group) const noexcept { return _availableRegs[group]; }
+};
-//! Traits.
-struct RAArchTraits {
- enum Flags : uint32_t {
- //! Registers can be swapped by a single instruction.
- kHasSwap = 0x01u
- };
+enum class RAStrategyType : uint8_t {
+ kSimple = 0,
+ kComplex = 1
+};
+ASMJIT_DEFINE_ENUM_COMPARE(RAStrategyType)
- uint8_t _flags[BaseReg::kGroupVirt];
+enum class RAStrategyFlags : uint8_t {
+ kNone = 0
+};
+ASMJIT_DEFINE_ENUM_FLAGS(RAStrategyFlags)
- //! \name Construction & Destruction
+//! Register allocation strategy.
+//!
+//! The idea is to select the best register allocation strategy for each virtual register group based on the
+//! complexity of the code.
+struct RAStrategy {
+ //! \name Members
//! \{
- inline RAArchTraits() noexcept { reset(); }
- inline void reset() noexcept { memset(_flags, 0, sizeof(_flags)); }
+ RAStrategyType _type = RAStrategyType::kSimple;
+ RAStrategyFlags _flags = RAStrategyFlags::kNone;
//! \}
//! \name Accessors
//! \{
- inline bool hasFlag(uint32_t group, uint32_t flag) const noexcept { return (_flags[group] & flag) != 0; }
- inline bool hasSwap(uint32_t group) const noexcept { return hasFlag(group, kHasSwap); }
-
- inline uint8_t& operator[](uint32_t group) noexcept {
- ASMJIT_ASSERT(group < BaseReg::kGroupVirt);
- return _flags[group];
+ inline void reset() noexcept {
+ _type = RAStrategyType::kSimple;
+ _flags = RAStrategyFlags::kNone;
}
- inline const uint8_t& operator[](uint32_t group) const noexcept {
- ASMJIT_ASSERT(group < BaseReg::kGroupVirt);
- return _flags[group];
- }
+ inline RAStrategyType type() const noexcept { return _type; }
+ inline void setType(RAStrategyType type) noexcept { _type = type; }
+
+ inline bool isSimple() const noexcept { return _type == RAStrategyType::kSimple; }
+ inline bool isComplex() const noexcept { return _type >= RAStrategyType::kComplex; }
+
+ inline RAStrategyFlags flags() const noexcept { return _flags; }
+ inline bool hasFlag(RAStrategyFlags flag) const noexcept { return Support::test(_flags, flag); }
+ inline void addFlags(RAStrategyFlags flags) noexcept { _flags |= flags; }
//! \}
};
-// ============================================================================
-// [asmjit::RARegCount]
-// ============================================================================
-
//! Count of virtual or physical registers per group.
//!
-//! \note This class uses 8-bit integers to represent counters, it's only used
-//! in places where this is sufficient - for example total count of machine's
-//! physical registers, count of virtual registers per instruction, etc. There
-//! is also `RALiveCount`, which uses 32-bit integers and is indeed much safer.
+//! \note This class uses 8-bit integers to represent counters, it's only used in places where this is sufficient,
+//! for example total count of machine's physical registers, count of virtual registers per instruction, etc...
+//! There is also `RALiveCount`, which uses 32-bit integers and is indeed much safer.
struct RARegCount {
+ //! \name Members
+ //! \{
+
union {
uint8_t _regs[4];
uint32_t _packed;
};
+ //! \}
+
//! \name Construction & Destruction
//! \{
@@ -160,62 +160,57 @@ struct RARegCount {
//! \name Overloaded Operators
//! \{
- inline uint8_t& operator[](uint32_t index) noexcept {
- ASMJIT_ASSERT(index < BaseReg::kGroupVirt);
- return _regs[index];
+ inline uint8_t& operator[](RegGroup group) noexcept {
+ ASMJIT_ASSERT(group <= RegGroup::kMaxVirt);
+ return _regs[size_t(group)];
}
- inline const uint8_t& operator[](uint32_t index) const noexcept {
- ASMJIT_ASSERT(index < BaseReg::kGroupVirt);
- return _regs[index];
+ inline const uint8_t& operator[](RegGroup group) const noexcept {
+ ASMJIT_ASSERT(group <= RegGroup::kMaxVirt);
+ return _regs[size_t(group)];
}
- inline RARegCount& operator=(const RARegCount& other) noexcept = default;
-
inline bool operator==(const RARegCount& other) const noexcept { return _packed == other._packed; }
inline bool operator!=(const RARegCount& other) const noexcept { return _packed != other._packed; }
//! \}
- //! \name Utilities
+ //! \name Accessors
//! \{
//! Returns the count of registers by the given register `group`.
- inline uint32_t get(uint32_t group) const noexcept {
- ASMJIT_ASSERT(group < BaseReg::kGroupVirt);
+ inline uint32_t get(RegGroup group) const noexcept {
+ ASMJIT_ASSERT(group <= RegGroup::kMaxVirt);
- uint32_t shift = Support::byteShiftOfDWordStruct(group);
+ uint32_t shift = Support::byteShiftOfDWordStruct(uint32_t(group));
return (_packed >> shift) & uint32_t(0xFF);
}
//! Sets the register count by a register `group`.
- inline void set(uint32_t group, uint32_t n) noexcept {
- ASMJIT_ASSERT(group < BaseReg::kGroupVirt);
+ inline void set(RegGroup group, uint32_t n) noexcept {
+ ASMJIT_ASSERT(group <= RegGroup::kMaxVirt);
ASMJIT_ASSERT(n <= 0xFF);
- uint32_t shift = Support::byteShiftOfDWordStruct(group);
+ uint32_t shift = Support::byteShiftOfDWordStruct(uint32_t(group));
_packed = (_packed & ~uint32_t(0xFF << shift)) + (n << shift);
}
//! Adds the register count by a register `group`.
- inline void add(uint32_t group, uint32_t n = 1) noexcept {
- ASMJIT_ASSERT(group < BaseReg::kGroupVirt);
- ASMJIT_ASSERT(0xFF - uint32_t(_regs[group]) >= n);
+ inline void add(RegGroup group, uint32_t n = 1) noexcept {
+ ASMJIT_ASSERT(group <= RegGroup::kMaxVirt);
+ ASMJIT_ASSERT(0xFF - uint32_t(_regs[size_t(group)]) >= n);
- uint32_t shift = Support::byteShiftOfDWordStruct(group);
+ uint32_t shift = Support::byteShiftOfDWordStruct(uint32_t(group));
_packed += n << shift;
}
//! \}
};
-// ============================================================================
-// [asmjit::RARegIndex]
-// ============================================================================
-
+//! Provides mapping that can be used to fast index architecture register groups.
struct RARegIndex : public RARegCount {
//! Build register indexes based on the given `count` of registers.
- inline void buildIndexes(const RARegCount& count) noexcept {
+ ASMJIT_FORCE_INLINE void buildIndexes(const RARegCount& count) noexcept {
uint32_t x = uint32_t(count._regs[0]);
uint32_t y = uint32_t(count._regs[1]) + x;
uint32_t z = uint32_t(count._regs[2]) + y;
@@ -226,55 +221,35 @@ struct RARegIndex : public RARegCount {
}
};
-// ============================================================================
-// [asmjit::RARegMask]
-// ============================================================================
-
//! Registers mask.
struct RARegMask {
- uint32_t _masks[BaseReg::kGroupVirt];
+ //! \name Members
+ //! \{
+
+ Support::Array<RegMask, Globals::kNumVirtGroups> _masks;
+
+ //! \}
//! \name Construction & Destruction
//! \{
- inline void init(const RARegMask& other) noexcept {
- for (uint32_t i = 0; i < BaseReg::kGroupVirt; i++)
- _masks[i] = other._masks[i];
- }
-
+ inline void init(const RARegMask& other) noexcept { _masks = other._masks; }
//! Reset all register masks to zero.
- inline void reset() noexcept {
- for (uint32_t i = 0; i < BaseReg::kGroupVirt; i++)
- _masks[i] = 0;
- }
+ inline void reset() noexcept { _masks.fill(0); }
//! \}
//! \name Overloaded Operators
//! \{
- inline RARegMask& operator=(const RARegMask& other) noexcept = default;
+ inline bool operator==(const RARegMask& other) const noexcept { return _masks == other._masks; }
+ inline bool operator!=(const RARegMask& other) const noexcept { return _masks != other._masks; }
- inline bool operator==(const RARegMask& other) const noexcept {
- return _masks[0] == other._masks[0] &&
- _masks[1] == other._masks[1] &&
- _masks[2] == other._masks[2] &&
- _masks[3] == other._masks[3] ;
- }
-
- inline bool operator!=(const RARegMask& other) const noexcept {
- return !operator==(other);
- }
+ template<typename Index>
+ inline uint32_t& operator[](const Index& index) noexcept { return _masks[index]; }
- inline uint32_t& operator[](uint32_t index) noexcept {
- ASMJIT_ASSERT(index < BaseReg::kGroupVirt);
- return _masks[index];
- }
-
- inline const uint32_t& operator[](uint32_t index) const noexcept {
- ASMJIT_ASSERT(index < BaseReg::kGroupVirt);
- return _masks[index];
- }
+ template<typename Index>
+ inline const uint32_t& operator[](const Index& index) const noexcept { return _masks[index]; }
//! \}
@@ -283,42 +258,34 @@ struct RARegMask {
//! Tests whether all register masks are zero (empty).
inline bool empty() const noexcept {
- uint32_t m = 0;
- for (uint32_t i = 0; i < BaseReg::kGroupVirt; i++)
- m |= _masks[i];
- return m == 0;
+ return _masks.aggregate<Support::Or>() == 0;
}
- inline bool has(uint32_t group, uint32_t mask = 0xFFFFFFFFu) const noexcept {
- ASMJIT_ASSERT(group < BaseReg::kGroupVirt);
+ inline bool has(RegGroup group, RegMask mask = 0xFFFFFFFFu) const noexcept {
return (_masks[group] & mask) != 0;
}
template<class Operator>
inline void op(const RARegMask& other) noexcept {
- for (uint32_t i = 0; i < BaseReg::kGroupVirt; i++)
- _masks[i] = Operator::op(_masks[i], other._masks[i]);
+ _masks.combine<Operator>(other._masks);
}
template<class Operator>
- inline void op(uint32_t group, uint32_t input) noexcept {
+ inline void op(RegGroup group, uint32_t input) noexcept {
_masks[group] = Operator::op(_masks[group], input);
}
//! \}
};
-// ============================================================================
-// [asmjit::RARegsStats]
-// ============================================================================
-
-//! Information associated with each instruction, propagated to blocks, loops,
-//! and the whole function. This information can be used to do minor decisions
-//! before the register allocator tries to do its job. For example to use fast
-//! register allocation inside a block or loop it cannot have clobbered and/or
-//! fixed registers, etc...
-struct RARegsStats {
- uint32_t _packed;
+//! Information associated with each instruction, propagated to blocks, loops, and the whole function. This
+//! information can be used to do minor decisions before the register allocator tries to do its job. For
+//! example to use fast register allocation inside a block or loop it cannot have clobbered and/or fixed
+//! registers, etc...
+class RARegsStats {
+public:
+ //! \name Constants
+ //! \{
enum Index : uint32_t {
kIndexUsed = 0,
@@ -332,46 +299,54 @@ struct RARegsStats {
kMaskClobbered = 0xFFu << kIndexClobbered
};
+ //! \}
+
+ //! \name Members
+ //! \{
+
+ uint32_t _packed = 0;
+
+ //! \}
+
+ //! \name Accessors
+ //! \{
+
inline void reset() noexcept { _packed = 0; }
inline void combineWith(const RARegsStats& other) noexcept { _packed |= other._packed; }
inline bool hasUsed() const noexcept { return (_packed & kMaskUsed) != 0u; }
- inline bool hasUsed(uint32_t group) const noexcept { return (_packed & Support::bitMask(kIndexUsed + group)) != 0u; }
- inline void makeUsed(uint32_t group) noexcept { _packed |= Support::bitMask(kIndexUsed + group); }
+ inline bool hasUsed(RegGroup group) const noexcept { return (_packed & Support::bitMask(kIndexUsed + uint32_t(group))) != 0u; }
+ inline void makeUsed(RegGroup group) noexcept { _packed |= Support::bitMask(kIndexUsed + uint32_t(group)); }
inline bool hasFixed() const noexcept { return (_packed & kMaskFixed) != 0u; }
- inline bool hasFixed(uint32_t group) const noexcept { return (_packed & Support::bitMask(kIndexFixed + group)) != 0u; }
- inline void makeFixed(uint32_t group) noexcept { _packed |= Support::bitMask(kIndexFixed + group); }
+ inline bool hasFixed(RegGroup group) const noexcept { return (_packed & Support::bitMask(kIndexFixed + uint32_t(group))) != 0u; }
+ inline void makeFixed(RegGroup group) noexcept { _packed |= Support::bitMask(kIndexFixed + uint32_t(group)); }
inline bool hasClobbered() const noexcept { return (_packed & kMaskClobbered) != 0u; }
- inline bool hasClobbered(uint32_t group) const noexcept { return (_packed & Support::bitMask(kIndexClobbered + group)) != 0u; }
- inline void makeClobbered(uint32_t group) noexcept { _packed |= Support::bitMask(kIndexClobbered + group); }
-};
+ inline bool hasClobbered(RegGroup group) const noexcept { return (_packed & Support::bitMask(kIndexClobbered + uint32_t(group))) != 0u; }
+ inline void makeClobbered(RegGroup group) noexcept { _packed |= Support::bitMask(kIndexClobbered + uint32_t(group)); }
-// ============================================================================
-// [asmjit::RALiveCount]
-// ============================================================================
+ //! \}
+};
//! Count of live registers, per group.
class RALiveCount {
public:
- uint32_t n[BaseReg::kGroupVirt];
+ //! \name Members
+ //! \{
+
+ Support::Array<uint32_t, Globals::kNumVirtGroups> n {};
+
+ //! \}
//! \name Construction & Destruction
//! \{
- inline RALiveCount() noexcept { reset(); }
+ inline RALiveCount() noexcept = default;
inline RALiveCount(const RALiveCount& other) noexcept = default;
- inline void init(const RALiveCount& other) noexcept {
- for (uint32_t group = 0; group < BaseReg::kGroupVirt; group++)
- n[group] = other.n[group];
- }
-
- inline void reset() noexcept {
- for (uint32_t group = 0; group < BaseReg::kGroupVirt; group++)
- n[group] = 0;
- }
+ inline void init(const RALiveCount& other) noexcept { n = other.n; }
+ inline void reset() noexcept { n.fill(0); }
//! \}
@@ -380,8 +355,8 @@ public:
inline RALiveCount& operator=(const RALiveCount& other) noexcept = default;
- inline uint32_t& operator[](uint32_t group) noexcept { return n[group]; }
- inline const uint32_t& operator[](uint32_t group) const noexcept { return n[group]; }
+ inline uint32_t& operator[](RegGroup group) noexcept { return n[group]; }
+ inline const uint32_t& operator[](RegGroup group) const noexcept { return n[group]; }
//! \}
@@ -389,26 +364,29 @@ public:
//! \{
template<class Operator>
- inline void op(const RALiveCount& other) noexcept {
- for (uint32_t group = 0; group < BaseReg::kGroupVirt; group++)
- n[group] = Operator::op(n[group], other.n[group]);
- }
+ inline void op(const RALiveCount& other) noexcept { n.combine<Operator>(other.n); }
//! \}
};
-// ============================================================================
-// [asmjit::RALiveInterval]
-// ============================================================================
-
struct RALiveInterval {
- uint32_t a, b;
+ //! \name Constants
+ //! \{
- enum Misc : uint32_t {
+ enum : uint32_t {
kNaN = 0,
kInf = 0xFFFFFFFFu
};
+ //! \}
+
+ //! \name Members
+ //! \{
+
+ uint32_t a, b;
+
+ //! \}
+
//! \name Construction & Destruction
//! \{
@@ -441,15 +419,17 @@ struct RALiveInterval {
//! \}
};
-// ============================================================================
-// [asmjit::RALiveSpan<T>]
-// ============================================================================
-
+//! Live span with payload of type `T`.
template<typename T>
class RALiveSpan : public RALiveInterval, public T {
public:
+ //! \name Types
+ //! \{
+
typedef T DataType;
+ //! \}
+
//! \name Construction & Destruction
//! \{
@@ -487,14 +467,11 @@ public:
//! \}
};
-// ============================================================================
-// [asmjit::RALiveSpans<T>]
-// ============================================================================
-
+//! Vector of `RALiveSpan<T>` with additional convenience API.
template<typename T>
class RALiveSpans {
public:
- ASMJIT_NONCOPYABLE(RALiveSpans<T>)
+ ASMJIT_NONCOPYABLE(RALiveSpans)
typedef typename T::DataType DataType;
ZoneVector<T> _data;
@@ -531,12 +508,12 @@ public:
inline void swap(RALiveSpans<T>& other) noexcept { _data.swap(other._data); }
//! Open the current live span.
- ASMJIT_INLINE Error openAt(ZoneAllocator* allocator, uint32_t start, uint32_t end) noexcept {
+ ASMJIT_FORCE_INLINE Error openAt(ZoneAllocator* allocator, uint32_t start, uint32_t end) noexcept {
bool wasOpen;
return openAt(allocator, start, end, wasOpen);
}
- ASMJIT_INLINE Error openAt(ZoneAllocator* allocator, uint32_t start, uint32_t end, bool& wasOpen) noexcept {
+ ASMJIT_FORCE_INLINE Error openAt(ZoneAllocator* allocator, uint32_t start, uint32_t end, bool& wasOpen) noexcept {
uint32_t size = _data.size();
wasOpen = false;
@@ -552,7 +529,7 @@ public:
return _data.append(allocator, T(start, end));
}
- inline void closeAt(uint32_t end) noexcept {
+ ASMJIT_FORCE_INLINE void closeAt(uint32_t end) noexcept {
ASMJIT_ASSERT(!empty());
uint32_t size = _data.size();
@@ -561,9 +538,8 @@ public:
//! Returns the sum of width of all spans.
//!
- //! \note Don't overuse, this iterates over all spans so it's O(N).
- //! It should be only called once and then cached.
- ASMJIT_INLINE uint32_t width() const noexcept {
+ //! \note Don't overuse, this iterates over all spans so it's O(N). It should be only called once and then cached.
+ inline uint32_t width() const noexcept {
uint32_t width = 0;
for (const T& span : _data)
width += span.width();
@@ -577,7 +553,7 @@ public:
return intersects(*this, other);
}
- ASMJIT_INLINE Error nonOverlappingUnionOf(ZoneAllocator* allocator, const RALiveSpans<T>& x, const RALiveSpans<T>& y, const DataType& yData) noexcept {
+ ASMJIT_FORCE_INLINE Error nonOverlappingUnionOf(ZoneAllocator* allocator, const RALiveSpans<T>& x, const RALiveSpans<T>& y, const DataType& yData) noexcept {
uint32_t finalSize = x.size() + y.size();
ASMJIT_PROPAGATE(_data.reserve(allocator, finalSize));
@@ -588,9 +564,8 @@ public:
const T* xEnd = xSpan + x.size();
const T* yEnd = ySpan + y.size();
- // Loop until we have intersection or either `xSpan == xEnd` or `ySpan == yEnd`,
- // which means that there is no intersection. We advance either `xSpan` or `ySpan`
- // depending on their ranges.
+ // Loop until we have intersection or either `xSpan == xEnd` or `ySpan == yEnd`, which means that there is no
+ // intersection. We advance either `xSpan` or `ySpan` depending on their ranges.
if (xSpan != xEnd && ySpan != yEnd) {
uint32_t xa, ya;
xa = xSpan->a;
@@ -631,16 +606,15 @@ public:
return kErrorOk;
}
- static ASMJIT_INLINE bool intersects(const RALiveSpans<T>& x, const RALiveSpans<T>& y) noexcept {
+ static ASMJIT_FORCE_INLINE bool intersects(const RALiveSpans<T>& x, const RALiveSpans<T>& y) noexcept {
const T* xSpan = x.data();
const T* ySpan = y.data();
const T* xEnd = xSpan + x.size();
const T* yEnd = ySpan + y.size();
- // Loop until we have intersection or either `xSpan == xEnd` or `ySpan == yEnd`,
- // which means that there is no intersection. We advance either `xSpan` or `ySpan`
- // depending on their end positions.
+ // Loop until we have intersection or either `xSpan == xEnd` or `ySpan == yEnd`, which means that there is no
+ // intersection. We advance either `xSpan` or `ySpan` depending on their end positions.
if (xSpan == xEnd || ySpan == yEnd)
return false;
@@ -667,26 +641,12 @@ public:
//! \}
};
-// ============================================================================
-// [asmjit::RALiveStats]
-// ============================================================================
-
//! Statistics about a register liveness.
class RALiveStats {
public:
- uint32_t _width;
- float _freq;
- float _priority;
-
- //! \name Construction & Destruction
- //! \{
-
- inline RALiveStats()
- : _width(0),
- _freq(0.0f),
- _priority(0.0f) {}
-
- //! \}
+ uint32_t _width = 0;
+ float _freq = 0.0f;
+ float _priority = 0.0f;
//! \name Accessors
//! \{
@@ -698,10 +658,6 @@ public:
//! \}
};
-// ============================================================================
-// [asmjit::LiveRegData]
-// ============================================================================
-
struct LiveRegData {
uint32_t id;
@@ -717,177 +673,255 @@ struct LiveRegData {
typedef RALiveSpan<LiveRegData> LiveRegSpan;
typedef RALiveSpans<LiveRegSpan> LiveRegSpans;
-// ============================================================================
-// [asmjit::RATiedReg]
-// ============================================================================
+//! Flags used by \ref RATiedReg.
+//!
+//! Register access information is encoded in 4 flags in total:
+//!
+//! - `kRead` - Register is Read (ReadWrite if combined with `kWrite`).
+//! - `kWrite` - Register is Written (ReadWrite if combined with `kRead`).
+//! - `kUse` - Encoded as Read or ReadWrite.
+//! - `kOut` - Encoded as WriteOnly.
+//!
+//! Let's describe all of these on two X86 instructions:
+//!
+//! - ADD x{R|W|Use}, x{R|Use} -> {x:R|W|Use }
+//! - LEA x{ W|Out}, [x{R|Use} + x{R|Out}] -> {x:R|W|Use|Out }
+//! - ADD x{R|W|Use}, y{R|Use} -> {x:R|W|Use y:R|Use}
+//! - LEA x{ W|Out}, [x{R|Use} + y{R|Out}] -> {x:R|W|Use|Out y:R|Use}
+//!
+//! It should be obvious from the example above how these flags get created. Each operand contains READ/WRITE
+//! information, which is then merged to RATiedReg's flags. However, we also need to represent the possitility
+//! to view the operation as two independent operations - USE and OUT, because the register allocator first
+//! allocates USE registers, and then assigns OUT registers independently of USE registers.
+enum class RATiedFlags : uint32_t {
+ //! No flags.
+ kNone = 0,
+
+ // Access Flags
+ // ------------
+
+ //! Register is read.
+ kRead = uint32_t(OpRWFlags::kRead),
+ //! Register is written.
+ kWrite = uint32_t(OpRWFlags::kWrite),
+ //! Register both read and written.
+ kRW = uint32_t(OpRWFlags::kRW),
+
+ // Use / Out Flags
+ // ---------------
+
+ //! Register has a USE slot (read/rw).
+ kUse = 0x00000004u,
+ //! Register has an OUT slot (write-only).
+ kOut = 0x00000008u,
+ //! Register in USE slot can be patched to memory.
+ kUseRM = 0x00000010u,
+ //! Register in OUT slot can be patched to memory.
+ kOutRM = 0x00000020u,
+
+ //! Register has a fixed USE slot.
+ kUseFixed = 0x00000040u,
+ //! Register has a fixed OUT slot.
+ kOutFixed = 0x00000080u,
+ //! Register USE slot has been allocated.
+ kUseDone = 0x00000100u,
+ //! Register OUT slot has been allocated.
+ kOutDone = 0x00000200u,
+
+ // Consecutive Flags / Data
+ // ------------------------
+
+ kUseConsecutive = 0x00000400u,
+ kOutConsecutive = 0x00000800u,
+ kLeadConsecutive = 0x00001000u,
+ kConsecutiveData = 0x00006000u,
+
+ // Liveness Flags
+ // --------------
+
+ //! Register must be duplicated (function call only).
+ kDuplicate = 0x00010000u,
+ //! Last occurrence of this VirtReg in basic block.
+ kLast = 0x00020000u,
+ //! Kill this VirtReg after use.
+ kKill = 0x00040000u,
+
+ // X86 Specific Flags
+ // ------------------
+
+ // Architecture specific flags are used during RATiedReg building to ensure that architecture-specific constraints
+ // are handled properly. These flags are not really needed after RATiedReg[] is built and copied to `RAInst`.
+
+ //! This RATiedReg references GPB-LO or GPB-HI.
+ kX86_Gpb = 0x01000000u,
+
+ // Instruction Flags (Never used by RATiedReg)
+ // -------------------------------------------
+
+ //! Instruction is transformable to another instruction if necessary.
+ //!
+ //! This is flag that is only used by \ref RAInst to inform register allocator that the instruction has some
+ //! constraints that can only be solved by transforming the instruction into another instruction, most likely
+ //! by changing its InstId.
+ kInst_IsTransformable = 0x80000000u
+};
+ASMJIT_DEFINE_ENUM_FLAGS(RATiedFlags)
+
+static_assert(uint32_t(RATiedFlags::kRead ) == 0x1, "RATiedFlags::kRead must be 0x1");
+static_assert(uint32_t(RATiedFlags::kWrite) == 0x2, "RATiedFlags::kWrite must be 0x2");
+static_assert(uint32_t(RATiedFlags::kRW ) == 0x3, "RATiedFlags::kRW must be 0x3");
-//! Tied register merges one ore more register operand into a single entity. It
-//! contains information about its access (Read|Write) and allocation slots
-//! (Use|Out) that are used by the register allocator and liveness analysis.
+//! Tied register merges one ore more register operand into a single entity. It contains information about its access
+//! (Read|Write) and allocation slots (Use|Out) that are used by the register allocator and liveness analysis.
struct RATiedReg {
+ //! \name Members
+ //! \{
+
//! WorkReg id.
uint32_t _workId;
+ //! WorkReg id that is an immediate consecutive parent of this register, or Globals::kInvalidId if it has no parent.
+ uint32_t _consecutiveParent;
//! Allocation flags.
- uint32_t _flags;
- //! Registers where input {R|X} can be allocated to.
- uint32_t _allocableRegs;
- //! Indexes used to rewrite USE regs.
- uint32_t _useRewriteMask;
- //! Indexes used to rewrite OUT regs.
- uint32_t _outRewriteMask;
+ RATiedFlags _flags;
union {
struct {
//! How many times the VirtReg is referenced in all operands.
uint8_t _refCount;
+ //! Size of a memory operand in case that it's use instead of the register.
+ uint8_t _rmSize;
//! Physical register for use operation (ReadOnly / ReadWrite).
uint8_t _useId;
//! Physical register for out operation (WriteOnly).
uint8_t _outId;
- //! Reserved for future use (padding).
- uint8_t _rmSize;
};
//! Packed data.
uint32_t _packed;
};
- //! Flags.
- //!
- //! Register access information is encoded in 4 flags in total:
- //!
- //! - `kRead` - Register is Read (ReadWrite if combined with `kWrite`).
- //! - `kWrite` - Register is Written (ReadWrite if combined with `kRead`).
- //! - `kUse` - Encoded as Read or ReadWrite.
- //! - `kOut` - Encoded as WriteOnly.
- //!
- //! Let's describe all of these on two X86 instructions:
- //!
- //! - ADD x{R|W|Use}, x{R|Use} -> {x:R|W|Use }
- //! - LEA x{ W|Out}, [x{R|Use} + x{R|Out}] -> {x:R|W|Use|Out }
- //! - ADD x{R|W|Use}, y{R|Use} -> {x:R|W|Use y:R|Use}
- //! - LEA x{ W|Out}, [x{R|Use} + y{R|Out}] -> {x:R|W|Use|Out y:R|Use}
- //!
- //! It should be obvious from the example above how these flags get created.
- //! Each operand contains READ/WRITE information, which is then merged to
- //! RATiedReg's flags. However, we also need to represent the possitility to
- //! use see the operation as two independent operations - USE and OUT, because
- //! the register allocator will first allocate USE registers, and then assign
- //! OUT registers independently of USE registers.
- enum Flags : uint32_t {
- kRead = OpRWInfo::kRead, //!< Register is read.
- kWrite = OpRWInfo::kWrite, //!< Register is written.
- kRW = OpRWInfo::kRW, //!< Register both read and written.
-
- kUse = 0x00000100u, //!< Register has a USE slot (read/rw).
- kOut = 0x00000200u, //!< Register has an OUT slot (write-only).
- kUseRM = 0x00000400u, //!< Register in USE slot can be patched to memory.
- kOutRM = 0x00000800u, //!< Register in OUT slot can be patched to memory.
-
- kUseFixed = 0x00001000u, //!< Register has a fixed USE slot.
- kOutFixed = 0x00002000u, //!< Register has a fixed OUT slot.
- kUseDone = 0x00004000u, //!< Register USE slot has been allocated.
- kOutDone = 0x00008000u, //!< Register OUT slot has been allocated.
-
- kDuplicate = 0x00010000u, //!< Register must be duplicated (function call only).
- kLast = 0x00020000u, //!< Last occurrence of this VirtReg in basic block.
- kKill = 0x00040000u, //!< Kill this VirtReg after use.
-
- // Architecture specific flags are used during RATiedReg building to ensure
- // that architecture-specific constraints are handled properly. These flags
- // are not really needed after RATiedReg[] is built and copied to `RAInst`.
-
- kX86Gpb = 0x01000000u //!< This RATiedReg references GPB-LO or GPB-HI.
- };
+ //! Registers where inputs {R|X} can be allocated to.
+ RegMask _useRegMask;
+ //! Registers where outputs {W} can be allocated to.
+ RegMask _outRegMask;
+ //! Indexes used to rewrite USE regs.
+ uint32_t _useRewriteMask;
+ //! Indexes used to rewrite OUT regs.
+ uint32_t _outRewriteMask;
+
+ //! \}
+
+ //! \name Statics
+ //! \{
- static_assert(kRead == 0x1, "RATiedReg::kRead flag must be 0x1");
- static_assert(kWrite == 0x2, "RATiedReg::kWrite flag must be 0x2");
- static_assert(kRW == 0x3, "RATiedReg::kRW combination must be 0x3");
+ static inline RATiedFlags consecutiveDataToFlags(uint32_t offset) noexcept {
+ ASMJIT_ASSERT(offset < 4);
+ constexpr uint32_t kOffsetShift = Support::ConstCTZ<uint32_t(RATiedFlags::kConsecutiveData)>::value;
+ return (RATiedFlags)(offset << kOffsetShift);
+ }
+
+ static inline uint32_t consecutiveDataFromFlags(RATiedFlags flags) noexcept {
+ constexpr uint32_t kOffsetShift = Support::ConstCTZ<uint32_t(RATiedFlags::kConsecutiveData)>::value;
+ return uint32_t(flags & RATiedFlags::kConsecutiveData) >> kOffsetShift;
+ }
+
+ //! \}
//! \name Construction & Destruction
//! \{
- ASMJIT_INLINE void init(uint32_t workId, uint32_t flags, uint32_t allocableRegs, uint32_t useId, uint32_t useRewriteMask, uint32_t outId, uint32_t outRewriteMask, uint32_t rmSize = 0) noexcept {
+ inline void init(uint32_t workId, RATiedFlags flags, RegMask useRegMask, uint32_t useId, uint32_t useRewriteMask, RegMask outRegMask, uint32_t outId, uint32_t outRewriteMask, uint32_t rmSize = 0, uint32_t consecutiveParent = Globals::kInvalidId) noexcept {
_workId = workId;
+ _consecutiveParent = consecutiveParent;
_flags = flags;
- _allocableRegs = allocableRegs;
- _useRewriteMask = useRewriteMask;
- _outRewriteMask = outRewriteMask;
_refCount = 1;
+ _rmSize = uint8_t(rmSize);
_useId = uint8_t(useId);
_outId = uint8_t(outId);
- _rmSize = uint8_t(rmSize);
+ _useRegMask = useRegMask;
+ _outRegMask = outRegMask;
+ _useRewriteMask = useRewriteMask;
+ _outRewriteMask = outRewriteMask;
}
//! \}
- //! \name Overloaded Operators
- //! \{
-
- inline RATiedReg& operator=(const RATiedReg& other) noexcept = default;
-
- //! \}
-
//! \name Accessors
//! \{
//! Returns the associated WorkReg id.
inline uint32_t workId() const noexcept { return _workId; }
- //! Checks if the given `flag` is set, see `Flags`.
- inline bool hasFlag(uint32_t flag) const noexcept { return (_flags & flag) != 0; }
+ inline bool hasConsecutiveParent() const noexcept { return _consecutiveParent != Globals::kInvalidId; }
+ inline uint32_t consecutiveParent() const noexcept { return _consecutiveParent; }
+ inline uint32_t consecutiveData() const noexcept { return consecutiveDataFromFlags(_flags); }
- //! Returns TiedReg flags, see `RATiedReg::Flags`.
- inline uint32_t flags() const noexcept { return _flags; }
- //! Adds tied register flags, see `Flags`.
- inline void addFlags(uint32_t flags) noexcept { _flags |= flags; }
+ //! Returns TiedReg flags.
+ inline RATiedFlags flags() const noexcept { return _flags; }
+ //! Checks if the given `flag` is set.
+ inline bool hasFlag(RATiedFlags flag) const noexcept { return Support::test(_flags, flag); }
+ //! Adds tied register flags.
+ inline void addFlags(RATiedFlags flags) noexcept { _flags |= flags; }
//! Tests whether the register is read (writes `true` also if it's Read/Write).
- inline bool isRead() const noexcept { return hasFlag(kRead); }
+ inline bool isRead() const noexcept { return hasFlag(RATiedFlags::kRead); }
//! Tests whether the register is written (writes `true` also if it's Read/Write).
- inline bool isWrite() const noexcept { return hasFlag(kWrite); }
+ inline bool isWrite() const noexcept { return hasFlag(RATiedFlags::kWrite); }
//! Tests whether the register is read only.
- inline bool isReadOnly() const noexcept { return (_flags & kRW) == kRead; }
+ inline bool isReadOnly() const noexcept { return (_flags & RATiedFlags::kRW) == RATiedFlags::kRead; }
//! Tests whether the register is write only.
- inline bool isWriteOnly() const noexcept { return (_flags & kRW) == kWrite; }
+ inline bool isWriteOnly() const noexcept { return (_flags & RATiedFlags::kRW) == RATiedFlags::kWrite; }
//! Tests whether the register is read and written.
- inline bool isReadWrite() const noexcept { return (_flags & kRW) == kRW; }
+ inline bool isReadWrite() const noexcept { return (_flags & RATiedFlags::kRW) == RATiedFlags::kRW; }
//! Tests whether the tied register has use operand (Read/ReadWrite).
- inline bool isUse() const noexcept { return hasFlag(kUse); }
+ inline bool isUse() const noexcept { return hasFlag(RATiedFlags::kUse); }
//! Tests whether the tied register has out operand (Write).
- inline bool isOut() const noexcept { return hasFlag(kOut); }
+ inline bool isOut() const noexcept { return hasFlag(RATiedFlags::kOut); }
+
+ //! Tests whether the tied register has \ref RATiedFlags::kLeadConsecutive flag set.
+ inline bool isLeadConsecutive() const noexcept { return hasFlag(RATiedFlags::kLeadConsecutive); }
+ //! Tests whether the tied register has \ref RATiedFlags::kUseConsecutive flag set.
+ inline bool isUseConsecutive() const noexcept { return hasFlag(RATiedFlags::kUseConsecutive); }
+ //! Tests whether the tied register has \ref RATiedFlags::kOutConsecutive flag set.
+ inline bool isOutConsecutive() const noexcept { return hasFlag(RATiedFlags::kOutConsecutive); }
+
+ //! Tests whether the tied register has any consecutive flag.
+ inline bool hasAnyConsecutiveFlag() const noexcept { return hasFlag(RATiedFlags::kLeadConsecutive | RATiedFlags::kUseConsecutive | RATiedFlags::kOutConsecutive); }
//! Tests whether the USE slot can be patched to memory operand.
- inline bool hasUseRM() const noexcept { return hasFlag(kUseRM); }
+ inline bool hasUseRM() const noexcept { return hasFlag(RATiedFlags::kUseRM); }
//! Tests whether the OUT slot can be patched to memory operand.
- inline bool hasOutRM() const noexcept { return hasFlag(kOutRM); }
+ inline bool hasOutRM() const noexcept { return hasFlag(RATiedFlags::kOutRM); }
inline uint32_t rmSize() const noexcept { return _rmSize; }
inline void makeReadOnly() noexcept {
- _flags = (_flags & ~(kOut | kWrite)) | kUse;
+ _flags = (_flags & ~(RATiedFlags::kOut | RATiedFlags::kWrite)) | RATiedFlags::kUse;
_useRewriteMask |= _outRewriteMask;
_outRewriteMask = 0;
}
inline void makeWriteOnly() noexcept {
- _flags = (_flags & ~(kUse | kRead)) | kOut;
+ _flags = (_flags & ~(RATiedFlags::kUse | RATiedFlags::kRead)) | RATiedFlags::kOut;
_outRewriteMask |= _useRewriteMask;
_useRewriteMask = 0;
}
//! Tests whether the register would duplicate.
- inline bool isDuplicate() const noexcept { return hasFlag(kDuplicate); }
+ inline bool isDuplicate() const noexcept { return hasFlag(RATiedFlags::kDuplicate); }
//! Tests whether the register (and the instruction it's part of) appears last in the basic block.
- inline bool isLast() const noexcept { return hasFlag(kLast); }
+ inline bool isLast() const noexcept { return hasFlag(RATiedFlags::kLast); }
//! Tests whether the register should be killed after USEd and/or OUTed.
- inline bool isKill() const noexcept { return hasFlag(kKill); }
+ inline bool isKill() const noexcept { return hasFlag(RATiedFlags::kKill); }
//! Tests whether the register is OUT or KILL (used internally by local register allocator).
- inline bool isOutOrKill() const noexcept { return hasFlag(kOut | kKill); }
+ inline bool isOutOrKill() const noexcept { return hasFlag(RATiedFlags::kOut | RATiedFlags::kKill); }
- inline uint32_t allocableRegs() const noexcept { return _allocableRegs; }
+ //! Returns a register mask that describes allocable USE registers (Read/ReadWrite access).
+ inline RegMask useRegMask() const noexcept { return _useRegMask; }
+ //! Returns a register mask that describes allocable OUT registers (WriteOnly access).
+ inline RegMask outRegMask() const noexcept { return _outRegMask; }
inline uint32_t refCount() const noexcept { return _refCount; }
inline void addRefCount(uint32_t n = 1) noexcept { _refCount = uint8_t(_refCount + n); }
@@ -910,107 +944,145 @@ struct RATiedReg {
//! Sets a physical register used for 'out' operation.
inline void setOutId(uint32_t index) noexcept { _outId = uint8_t(index); }
- inline bool isUseDone() const noexcept { return hasFlag(kUseDone); }
- inline bool isOutDone() const noexcept { return hasFlag(kUseDone); }
+ inline bool isUseDone() const noexcept { return hasFlag(RATiedFlags::kUseDone); }
+ inline bool isOutDone() const noexcept { return hasFlag(RATiedFlags::kUseDone); }
- inline void markUseDone() noexcept { addFlags(kUseDone); }
- inline void markOutDone() noexcept { addFlags(kUseDone); }
+ inline void markUseDone() noexcept { addFlags(RATiedFlags::kUseDone); }
+ inline void markOutDone() noexcept { addFlags(RATiedFlags::kUseDone); }
//! \}
};
-// ============================================================================
-// [asmjit::RAWorkReg]
-// ============================================================================
+//! Flags used by \ref RAWorkReg.
+enum class RAWorkRegFlags : uint32_t {
+ //! No flags.
+ kNone = 0,
+
+ //! This register has already been allocated.
+ kAllocated = 0x00000001u,
+ //! Has been coalesced to another WorkReg.
+ kCoalesced = 0x00000002u,
+
+ //! Set when this register is used as a LEAD consecutive register at least once.
+ kLeadConsecutive = 0x00000004u,
+ //! Used to mark consecutive registers during processing.
+ kProcessedConsecutive = 0x00000008u,
+
+ //! Stack slot has to be allocated.
+ kStackUsed = 0x00000010u,
+ //! Stack allocation is preferred.
+ kStackPreferred = 0x00000020u,
+ //! Marked for stack argument reassignment.
+ kStackArgToStack = 0x00000040u
+};
+ASMJIT_DEFINE_ENUM_FLAGS(RAWorkRegFlags)
+//! Work register provides additional data of \ref VirtReg that is used by register allocator.
+//!
+//! In general when a virtual register is found by register allocator it maps it to \ref RAWorkReg
+//! and then only works with it. The reason for such mapping is that users can create many virtual
+//! registers, which are not used inside a register allocation scope (which is currently always a
+//! function). So register allocator basically scans the function for virtual registers and maps
+//! them into WorkRegs, which receive a temporary ID (workId), which starts from zero. This WorkId
+//! is then used in bit-arrays and other mappings.
class RAWorkReg {
public:
ASMJIT_NONCOPYABLE(RAWorkReg)
- //! RAPass specific ID used during analysis and allocation.
- uint32_t _workId;
- //! Copy of ID used by `VirtReg`.
- uint32_t _virtId;
+ //! \name Constants
+ //! \{
- //! Permanent association with `VirtReg`.
- VirtReg* _virtReg;
- //! Temporary association with `RATiedReg`.
- RATiedReg* _tiedReg;
+ enum : uint32_t {
+ kIdNone = 0xFFFFFFFFu
+ };
+
+ enum : uint32_t {
+ kNoArgIndex = 0xFFu
+ };
+
+ //! \}
+
+ //! \name Members
+ //! \{
+
+ //! RAPass specific ID used during analysis and allocation.
+ uint32_t _workId = 0;
+ //! Copy of ID used by \ref VirtReg.
+ uint32_t _virtId = 0;
+
+ //! Permanent association with \ref VirtReg.
+ VirtReg* _virtReg = nullptr;
+ //! Temporary association with \ref RATiedReg.
+ RATiedReg* _tiedReg = nullptr;
//! Stack slot associated with the register.
- RAStackSlot* _stackSlot;
+ RAStackSlot* _stackSlot = nullptr;
- //! Copy of a signature used by `VirtReg`.
- RegInfo _info;
+ //! Copy of a signature used by \ref VirtReg.
+ OperandSignature _signature {};
//! RAPass specific flags used during analysis and allocation.
- uint32_t _flags;
- //! IDs of all physical registers this WorkReg has been allocated to.
- uint32_t _allocatedMask;
- //! IDs of all physical registers that are clobbered during the lifetime of
- //! this WorkReg.
+ RAWorkRegFlags _flags = RAWorkRegFlags::kNone;
+
+ //! Constains all USE ids collected from all instructions.
//!
- //! This mask should be updated by `RAPass::buildLiveness()`, because it's
- //! global and should be updated after unreachable code has been removed.
- uint32_t _clobberSurvivalMask;
+ //! If this mask is non-zero and not a power of two, it means that the register is used multiple times in
+ //! instructions where it requires to have a different use ID. This means that in general it's not possible
+ //! to keep this register in a single home.
+ RegMask _useIdMask = 0;
+ //! Preferred mask of registers (if non-zero) to allocate this register to.
+ //!
+ //! If this mask is zero it means that either there is no intersection of preferred registers collected from all
+ //! TiedRegs or there is no preference at all (the register can be allocated to any register all the time).
+ RegMask _preferredMask = 0xFFFFFFFFu;
+ //! Consecutive mask, which was collected from all instructions where this register was used as a lead consecutive
+ //! register.
+ RegMask _consecutiveMask = 0xFFFFFFFFu;
+ //! IDs of all physical registers that are clobbered during the lifetime of this WorkReg.
+ //!
+ //! This mask should be updated by `RAPass::buildLiveness()`, because it's global and should
+ //! be updated after unreachable code has been removed.
+ RegMask _clobberSurvivalMask = 0;
+ //! IDs of all physical registers this WorkReg has been allocated to.
+ RegMask _allocatedMask = 0;
//! A byte-mask where each bit represents one valid byte of the register.
- uint64_t _regByteMask;
+ uint64_t _regByteMask = 0;
//! Argument index (or `kNoArgIndex` if none).
- uint8_t _argIndex;
+ uint8_t _argIndex = kNoArgIndex;
+ //! Argument value index in the pack (0 by default).
+ uint8_t _argValueIndex = 0;
//! Global home register ID (if any, assigned by RA).
- uint8_t _homeRegId;
+ uint8_t _homeRegId = BaseReg::kIdBad;
//! Global hint register ID (provided by RA or user).
- uint8_t _hintRegId;
+ uint8_t _hintRegId = BaseReg::kIdBad;
//! Live spans of the `VirtReg`.
- LiveRegSpans _liveSpans;
+ LiveRegSpans _liveSpans {};
//! Live statistics.
- RALiveStats _liveStats;
+ RALiveStats _liveStats {};
//! All nodes that read/write this VirtReg/WorkReg.
- ZoneVector<BaseNode*> _refs;
+ ZoneVector<BaseNode*> _refs {};
//! All nodes that write to this VirtReg/WorkReg.
- ZoneVector<BaseNode*> _writes;
-
- enum Ids : uint32_t {
- kIdNone = 0xFFFFFFFFu
- };
+ ZoneVector<BaseNode*> _writes {};
- enum Flags : uint32_t {
- //! Has been coalesced to another WorkReg.
- kFlagCoalesced = 0x00000001u,
- //! Stack slot has to be allocated.
- kFlagStackUsed = 0x00000002u,
- //! Stack allocation is preferred.
- kFlagStackPreferred = 0x00000004u,
- //! Marked for stack argument reassignment.
- kFlagStackArgToStack = 0x00000008u
- };
+ //! Contains work IDs of all immediate consecutive registers of this register.
+ //!
+ //! \note This bit array only contains immediate consecutives. This means that if this is a register that is
+ //! followed by 3 more registers, then it would still have only a single immediate. The rest registers would
+ //! have immediate consecutive registers as well, except the last one.
+ ZoneBitVector _immediateConsecutives {};
- enum ArgIndex : uint32_t {
- kNoArgIndex = 0xFFu
- };
+ //! \}
//! \name Construction & Destruction
//! \{
- ASMJIT_INLINE RAWorkReg(VirtReg* vReg, uint32_t workId) noexcept
+ inline RAWorkReg(VirtReg* vReg, uint32_t workId) noexcept
: _workId(workId),
_virtId(vReg->id()),
_virtReg(vReg),
- _tiedReg(nullptr),
- _stackSlot(nullptr),
- _info(vReg->info()),
- _flags(0),
- _allocatedMask(0),
- _clobberSurvivalMask(0),
- _regByteMask(0),
- _argIndex(kNoArgIndex),
- _homeRegId(BaseReg::kIdBad),
- _hintRegId(BaseReg::kIdBad),
- _liveSpans(),
- _liveStats(),
- _refs() {}
+ _signature(vReg->signature()) {}
//! \}
@@ -1023,24 +1095,33 @@ public:
inline const char* name() const noexcept { return _virtReg->name(); }
inline uint32_t nameSize() const noexcept { return _virtReg->nameSize(); }
- inline uint32_t typeId() const noexcept { return _virtReg->typeId(); }
+ inline TypeId typeId() const noexcept { return _virtReg->typeId(); }
+
+ inline RAWorkRegFlags flags() const noexcept { return _flags; }
+ inline bool hasFlag(RAWorkRegFlags flag) const noexcept { return Support::test(_flags, flag); }
+ inline void addFlags(RAWorkRegFlags flags) noexcept { _flags |= flags; }
- inline bool hasFlag(uint32_t flag) const noexcept { return (_flags & flag) != 0; }
- inline uint32_t flags() const noexcept { return _flags; }
- inline void addFlags(uint32_t flags) noexcept { _flags |= flags; }
+ inline bool isAllocated() const noexcept { return hasFlag(RAWorkRegFlags::kAllocated); }
+ inline void markAllocated() noexcept { addFlags(RAWorkRegFlags::kAllocated); }
- inline bool isStackUsed() const noexcept { return hasFlag(kFlagStackUsed); }
- inline void markStackUsed() noexcept { addFlags(kFlagStackUsed); }
+ inline bool isLeadConsecutive() const noexcept { return hasFlag(RAWorkRegFlags::kLeadConsecutive); }
+ inline void markLeadConsecutive() noexcept { addFlags(RAWorkRegFlags::kLeadConsecutive); }
- inline bool isStackPreferred() const noexcept { return hasFlag(kFlagStackPreferred); }
- inline void markStackPreferred() noexcept { addFlags(kFlagStackPreferred); }
+ inline bool isProcessedConsecutive() const noexcept { return hasFlag(RAWorkRegFlags::kProcessedConsecutive); }
+ inline void markProcessedConsecutive() noexcept { addFlags(RAWorkRegFlags::kProcessedConsecutive); }
+
+ inline bool isStackUsed() const noexcept { return hasFlag(RAWorkRegFlags::kStackUsed); }
+ inline void markStackUsed() noexcept { addFlags(RAWorkRegFlags::kStackUsed); }
+
+ inline bool isStackPreferred() const noexcept { return hasFlag(RAWorkRegFlags::kStackPreferred); }
+ inline void markStackPreferred() noexcept { addFlags(RAWorkRegFlags::kStackPreferred); }
//! Tests whether this RAWorkReg has been coalesced with another one (cannot be used anymore).
- inline bool isCoalesced() const noexcept { return hasFlag(kFlagCoalesced); }
+ inline bool isCoalesced() const noexcept { return hasFlag(RAWorkRegFlags::kCoalesced); }
- inline const RegInfo& info() const noexcept { return _info; }
- inline uint32_t group() const noexcept { return _info.group(); }
- inline uint32_t signature() const noexcept { return _info.signature(); }
+ inline OperandSignature signature() const noexcept { return _signature; }
+ inline RegType type() const noexcept { return _signature.regType(); }
+ inline RegGroup group() const noexcept { return _signature.regGroup(); }
inline VirtReg* virtReg() const noexcept { return _virtReg; }
@@ -1060,7 +1141,12 @@ public:
inline bool hasArgIndex() const noexcept { return _argIndex != kNoArgIndex; }
inline uint32_t argIndex() const noexcept { return _argIndex; }
- inline void setArgIndex(uint32_t index) noexcept { _argIndex = uint8_t(index); }
+ inline uint32_t argValueIndex() const noexcept { return _argValueIndex; }
+
+ inline void setArgIndex(uint32_t argIndex, uint32_t valueIndex) noexcept {
+ _argIndex = uint8_t(argIndex);
+ _argValueIndex = uint8_t(valueIndex);
+ }
inline bool hasHomeRegId() const noexcept { return _homeRegId != BaseReg::kIdBad; }
inline uint32_t homeRegId() const noexcept { return _homeRegId; }
@@ -1070,15 +1156,39 @@ public:
inline uint32_t hintRegId() const noexcept { return _hintRegId; }
inline void setHintRegId(uint32_t physId) noexcept { _hintRegId = uint8_t(physId); }
- inline uint32_t allocatedMask() const noexcept { return _allocatedMask; }
- inline void addAllocatedMask(uint32_t mask) noexcept { _allocatedMask |= mask; }
+ inline RegMask useIdMask() const noexcept { return _useIdMask; }
+ inline bool hasUseIdMask() const noexcept { return _useIdMask != 0u; }
+ inline bool hasMultipleUseIds() const noexcept { return _useIdMask != 0u && !Support::isPowerOf2(_useIdMask); }
+ inline void addUseIdMask(RegMask mask) noexcept { _useIdMask |= mask; }
+
+ inline RegMask preferredMask() const noexcept { return _preferredMask; }
+ inline bool hasPrereffedMask() const noexcept { return _preferredMask != 0xFFFFFFFFu; }
+ inline void restrictPreferredMask(RegMask mask) noexcept { _preferredMask &= mask; }
+
+ inline RegMask consecutiveMask() const noexcept { return _consecutiveMask; }
+ inline bool hasConsecutiveMask() const noexcept { return _consecutiveMask != 0xFFFFFFFFu; }
+ inline void restrictConsecutiveMask(RegMask mask) noexcept { _consecutiveMask &= mask; }
- inline uint32_t clobberSurvivalMask() const noexcept { return _clobberSurvivalMask; }
- inline void addClobberSurvivalMask(uint32_t mask) noexcept { _clobberSurvivalMask |= mask; }
+ inline RegMask clobberSurvivalMask() const noexcept { return _clobberSurvivalMask; }
+ inline void addClobberSurvivalMask(RegMask mask) noexcept { _clobberSurvivalMask |= mask; }
+
+ inline RegMask allocatedMask() const noexcept { return _allocatedMask; }
+ inline void addAllocatedMask(RegMask mask) noexcept { _allocatedMask |= mask; }
inline uint64_t regByteMask() const noexcept { return _regByteMask; }
inline void setRegByteMask(uint64_t mask) noexcept { _regByteMask = mask; }
+ inline bool hasImmediateConsecutives() const noexcept { return !_immediateConsecutives.empty(); }
+ inline const ZoneBitVector& immediateConsecutives() const noexcept { return _immediateConsecutives; }
+
+ inline Error addImmediateConsecutive(ZoneAllocator* allocator, uint32_t workId) noexcept {
+ if (_immediateConsecutives.size() <= workId)
+ ASMJIT_PROPAGATE(_immediateConsecutives.resize(allocator, workId + 1));
+
+ _immediateConsecutives.setBit(workId, true);
+ return kErrorOk;
+ }
+
//! \}
};
@@ -1087,5 +1197,4 @@ public:
ASMJIT_END_NAMESPACE
-#endif // !ASMJIT_NO_COMPILER
#endif // ASMJIT_CORE_RADEFS_P_H_INCLUDED
diff --git a/3rdparty/asmjit/src/asmjit/core/ralocal.cpp b/3rdparty/asmjit/src/asmjit/core/ralocal.cpp
index 88cb86bde18..54bc524bf3b 100644
--- a/3rdparty/asmjit/src/asmjit/core/ralocal.cpp
+++ b/3rdparty/asmjit/src/asmjit/core/ralocal.cpp
@@ -1,25 +1,7 @@
-// AsmJit - Machine code generation for C++
+// This file is part of AsmJit project <https://asmjit.com>
//
-// * Official AsmJit Home Page: https://asmjit.com
-// * Official Github Repository: https://github.com/asmjit/asmjit
-//
-// Copyright (c) 2008-2020 The AsmJit Authors
-//
-// This software is provided 'as-is', without any express or implied
-// warranty. In no event will the authors be held liable for any damages
-// arising from the use of this software.
-//
-// Permission is granted to anyone to use this software for any purpose,
-// including commercial applications, and to alter it and redistribute it
-// freely, subject to the following restrictions:
-//
-// 1. The origin of this software must not be misrepresented; you must not
-// claim that you wrote the original software. If you use this software
-// in a product, an acknowledgment in the product documentation would be
-// appreciated but is not required.
-// 2. Altered source versions must be plainly marked as such, and must not be
-// misrepresented as being the original software.
-// 3. This notice may not be removed or altered from any source distribution.
+// See asmjit.h or LICENSE.md for license and copyright information
+// SPDX-License-Identifier: Zlib
#include "../core/api-build_p.h"
#ifndef ASMJIT_NO_COMPILER
@@ -29,20 +11,18 @@
ASMJIT_BEGIN_NAMESPACE
-// ============================================================================
-// [asmjit::RALocalAllocator - Utilities]
-// ============================================================================
+// RALocalAllocator - Utilities
+// ============================
-static ASMJIT_INLINE RATiedReg* RALocal_findTiedRegByWorkId(RATiedReg* tiedRegs, size_t count, uint32_t workId) noexcept {
+static ASMJIT_FORCE_INLINE RATiedReg* RALocal_findTiedRegByWorkId(RATiedReg* tiedRegs, size_t count, uint32_t workId) noexcept {
for (size_t i = 0; i < count; i++)
if (tiedRegs[i].workId() == workId)
return &tiedRegs[i];
return nullptr;
}
-// ============================================================================
-// [asmjit::RALocalAllocator - Init / Reset]
-// ============================================================================
+// RALocalAllocator - Init & Reset
+// ===============================
Error RALocalAllocator::init() noexcept {
PhysToWorkMap* physToWorkMap;
@@ -67,9 +47,8 @@ Error RALocalAllocator::init() noexcept {
return kErrorOk;
}
-// ============================================================================
-// [asmjit::RALocalAllocator - Assignment]
-// ============================================================================
+// RALocalAllocator - Assignment
+// =============================
Error RALocalAllocator::makeInitialAssignment() noexcept {
FuncNode* func = _pass->func();
@@ -80,55 +59,61 @@ Error RALocalAllocator::makeInitialAssignment() noexcept {
uint32_t numIter = 1;
for (uint32_t iter = 0; iter < numIter; iter++) {
- for (uint32_t i = 0; i < argCount; i++) {
- // Unassigned argument.
- VirtReg* virtReg = func->arg(i);
- if (!virtReg) continue;
-
- // Unreferenced argument.
- RAWorkReg* workReg = virtReg->workReg();
- if (!workReg) continue;
-
- // Overwritten argument.
- uint32_t workId = workReg->workId();
- if (!liveIn.bitAt(workId))
- continue;
+ for (uint32_t argIndex = 0; argIndex < argCount; argIndex++) {
+ for (uint32_t valueIndex = 0; valueIndex < Globals::kMaxValuePack; valueIndex++) {
+ // Unassigned argument.
+ const RegOnly& regArg = func->argPack(argIndex)[valueIndex];
+ if (!regArg.isReg() || !_cc->isVirtIdValid(regArg.id()))
+ continue;
- uint32_t group = workReg->group();
- if (_curAssignment.workToPhysId(group, workId) != RAAssignment::kPhysNone)
- continue;
+ VirtReg* virtReg = _cc->virtRegById(regArg.id());
- uint32_t allocableRegs = _availableRegs[group] & ~_curAssignment.assigned(group);
- if (iter == 0) {
- // First iteration: Try to allocate to home RegId.
- if (workReg->hasHomeRegId()) {
- uint32_t physId = workReg->homeRegId();
- if (Support::bitTest(allocableRegs, physId)) {
- _curAssignment.assign(group, workId, physId, true);
- _pass->_argsAssignment.assignReg(i, workReg->info().type(), physId, workReg->typeId());
- continue;
+ // Unreferenced argument.
+ RAWorkReg* workReg = virtReg->workReg();
+ if (!workReg)
+ continue;
+
+ // Overwritten argument.
+ uint32_t workId = workReg->workId();
+ if (!liveIn.bitAt(workId))
+ continue;
+
+ RegGroup group = workReg->group();
+ if (_curAssignment.workToPhysId(group, workId) != RAAssignment::kPhysNone)
+ continue;
+
+ RegMask allocableRegs = _availableRegs[group] & ~_curAssignment.assigned(group);
+ if (iter == 0) {
+ // First iteration: Try to allocate to home RegId.
+ if (workReg->hasHomeRegId()) {
+ uint32_t physId = workReg->homeRegId();
+ if (Support::bitTest(allocableRegs, physId)) {
+ _curAssignment.assign(group, workId, physId, true);
+ _pass->_argsAssignment.assignRegInPack(argIndex, valueIndex, workReg->type(), physId, workReg->typeId());
+ continue;
+ }
}
- }
- numIter = 2;
- }
- else {
- // Second iteration: Pick any other register if the is an unassigned one or assign to stack.
- if (allocableRegs) {
- uint32_t physId = Support::ctz(allocableRegs);
- _curAssignment.assign(group, workId, physId, true);
- _pass->_argsAssignment.assignReg(i, workReg->info().type(), physId, workReg->typeId());
+ numIter = 2;
}
else {
- // This register will definitely need stack, create the slot now and assign also `argIndex`
- // to it. We will patch `_argsAssignment` later after RAStackAllocator finishes.
- RAStackSlot* slot = _pass->getOrCreateStackSlot(workReg);
- if (ASMJIT_UNLIKELY(!slot))
- return DebugUtils::errored(kErrorOutOfMemory);
-
- // This means STACK_ARG may be moved to STACK.
- workReg->addFlags(RAWorkReg::kFlagStackArgToStack);
- _pass->_numStackArgsToStackSlots++;
+ // Second iteration: Pick any other register if the is an unassigned one or assign to stack.
+ if (allocableRegs) {
+ uint32_t physId = Support::ctz(allocableRegs);
+ _curAssignment.assign(group, workId, physId, true);
+ _pass->_argsAssignment.assignRegInPack(argIndex, valueIndex, workReg->type(), physId, workReg->typeId());
+ }
+ else {
+ // This register will definitely need stack, create the slot now and assign also `argIndex`
+ // to it. We will patch `_argsAssignment` later after RAStackAllocator finishes.
+ RAStackSlot* slot = _pass->getOrCreateStackSlot(workReg);
+ if (ASMJIT_UNLIKELY(!slot))
+ return DebugUtils::errored(kErrorOutOfMemory);
+
+ // This means STACK_ARG may be moved to STACK.
+ workReg->addFlags(RAWorkRegFlags::kStackArgToStack);
+ _pass->_numStackArgsToStackSlots++;
+ }
}
}
}
@@ -161,15 +146,15 @@ Error RALocalAllocator::switchToAssignment(
if (tryMode)
return kErrorOk;
- for (uint32_t group = 0; group < BaseReg::kGroupVirt; group++) {
- // ------------------------------------------------------------------------
- // STEP 1:
+ for (RegGroup group : RegGroupVirtValues{}) {
+ // STEP 1
+ // ------
+ //
// - KILL all registers that are not live at `dst`,
// - SPILL all registers that are not assigned at `dst`.
- // ------------------------------------------------------------------------
if (!tryMode) {
- Support::BitWordIterator<uint32_t> it(cur.assigned(group));
+ Support::BitWordIterator<RegMask> it(cur.assigned(group));
while (it.hasNext()) {
uint32_t physId = it.next();
uint32_t workId = cur.physToWorkId(group, physId);
@@ -191,19 +176,18 @@ Error RALocalAllocator::switchToAssignment(
}
}
- // ------------------------------------------------------------------------
- // STEP 2:
- // - MOVE and SWAP registers from their current assignments into their
- // DST assignments.
+ // STEP 2
+ // ------
+ //
+ // - MOVE and SWAP registers from their current assignments into their DST assignments.
// - Build `willLoadRegs` mask of registers scheduled for `onLoadReg()`.
- // ------------------------------------------------------------------------
// Current run-id (1 means more aggressive decisions).
int32_t runId = -1;
// Remaining registers scheduled for `onLoadReg()`.
- uint32_t willLoadRegs = 0;
+ RegMask willLoadRegs = 0;
// Remaining registers to be allocated in this loop.
- uint32_t affectedRegs = dst.assigned(group);
+ RegMask affectedRegs = dst.assigned(group);
while (affectedRegs) {
if (++runId == 2) {
@@ -214,10 +198,10 @@ Error RALocalAllocator::switchToAssignment(
break;
}
- Support::BitWordIterator<uint32_t> it(affectedRegs);
+ Support::BitWordIterator<RegMask> it(affectedRegs);
while (it.hasNext()) {
uint32_t physId = it.next();
- uint32_t physMask = Support::bitMask(physId);
+ RegMask physMask = Support::bitMask<RegMask>(physId);
uint32_t curWorkId = cur.physToWorkId(group, physId);
uint32_t dstWorkId = dst.physToWorkId(group, physId);
@@ -239,7 +223,7 @@ Error RALocalAllocator::switchToAssignment(
// Reset as we will do some changes to the current assignment.
runId = -1;
- if (_archTraits.hasSwap(group)) {
+ if (_archTraits->hasInstRegSwap(group)) {
ASMJIT_PROPAGATE(onSwapReg(group, curWorkId, physId, dstWorkId, altPhysId));
}
else {
@@ -248,7 +232,7 @@ Error RALocalAllocator::switchToAssignment(
ASMJIT_PROPAGATE(onKillReg(group, curWorkId, physId));
}
else {
- uint32_t allocableRegs = _pass->_availableRegs[group] & ~cur.assigned(group);
+ RegMask allocableRegs = _pass->_availableRegs[group] & ~cur.assigned(group);
// If possible don't conflict with assigned regs at DST.
if (allocableRegs & ~dst.assigned(group))
@@ -290,9 +274,8 @@ Cleared:
// CUR dirty, DST not dirty (the assert is just to visualize the condition).
ASMJIT_ASSERT(!dst.isPhysDirty(group, physId) && cur.isPhysDirty(group, physId));
- // If `dstReadOnly` is true it means that that block was already
- // processed and we cannot change from CLEAN to DIRTY. In that case
- // the register has to be saved as it cannot enter the block DIRTY.
+ // If `dstReadOnly` is true it means that that block was already processed and we cannot change from
+ // CLEAN to DIRTY. In that case the register has to be saved as it cannot enter the block DIRTY.
if (dstReadOnly)
ASMJIT_PROPAGATE(onSaveReg(group, dstWorkId, physId));
else
@@ -315,13 +298,13 @@ Cleared:
}
}
- // ------------------------------------------------------------------------
- // STEP 3:
+ // STEP 3
+ // ------
+ //
// - Load registers specified by `willLoadRegs`.
- // ------------------------------------------------------------------------
{
- Support::BitWordIterator<uint32_t> it(willLoadRegs);
+ Support::BitWordIterator<RegMask> it(willLoadRegs);
while (it.hasNext()) {
uint32_t physId = it.next();
@@ -345,7 +328,7 @@ Cleared:
}
if (!tryMode) {
- // Hre is a code that dumps the conflicting part if something fails here:
+ // Here is a code that dumps the conflicting part if something fails here:
// if (!dst.equals(cur)) {
// uint32_t physTotal = dst._layout.physTotal;
// uint32_t workCount = dst._layout.workCount;
@@ -370,9 +353,9 @@ Cleared:
return kErrorOk;
}
-Error RALocalAllocator::spillGpScratchRegsBeforeEntry(uint32_t scratchRegs) noexcept {
- uint32_t group = BaseReg::kGroupGp;
- Support::BitWordIterator<uint32_t> it(scratchRegs);
+Error RALocalAllocator::spillScratchGpRegsBeforeEntry(RegMask scratchRegs) noexcept {
+ RegGroup group = RegGroup::kGp;
+ Support::BitWordIterator<RegMask> it(scratchRegs);
while (it.hasNext()) {
uint32_t physId = it.next();
@@ -385,15 +368,15 @@ Error RALocalAllocator::spillGpScratchRegsBeforeEntry(uint32_t scratchRegs) noex
return kErrorOk;
}
-// ============================================================================
-// [asmjit::RALocalAllocator - Allocation]
-// ============================================================================
+// RALocalAllocator - Allocation
+// =============================
Error RALocalAllocator::allocInst(InstNode* node) noexcept {
RAInst* raInst = node->passData<RAInst>();
RATiedReg* outTiedRegs[Globals::kMaxPhysRegs];
RATiedReg* dupTiedRegs[Globals::kMaxPhysRegs];
+ RATiedReg* consecutiveRegs[kMaxConsecutiveRegs];
// The cursor must point to the previous instruction for a possible instruction insertion.
_cc->_setCursor(node->prev());
@@ -406,34 +389,43 @@ Error RALocalAllocator::allocInst(InstNode* node) noexcept {
// Whether we already replaced register operand with memory operand.
bool rmAllocated = false;
- for (uint32_t group = 0; group < BaseReg::kGroupVirt; group++) {
+ for (RegGroup group : RegGroupVirtValues{}) {
uint32_t i, count = this->tiedCount(group);
RATiedReg* tiedRegs = this->tiedRegs(group);
- uint32_t willUse = _raInst->_usedRegs[group];
- uint32_t willOut = _raInst->_clobberedRegs[group];
- uint32_t willFree = 0;
- uint32_t usePending = count;
+ RegMask willUse = _raInst->_usedRegs[group];
+ RegMask willOut = _raInst->_clobberedRegs[group];
+ RegMask willFree = 0;
+ uint32_t usePending = count;
uint32_t outTiedCount = 0;
uint32_t dupTiedCount = 0;
+ uint32_t consecutiveMask = 0;
- // ------------------------------------------------------------------------
- // STEP 1:
+ // STEP 1
+ // ------
//
- // Calculate `willUse` and `willFree` masks based on tied registers we have.
+ // Calculate `willUse` and `willFree` masks based on tied registers we have. In addition, aggregate information
+ // regarding consecutive registers used by this instruction. We need that to make USE/OUT assignments.
//
- // We don't do any assignment decisions at this stage as we just need to
- // collect some information first. Then, after we populate all masks needed
- // we can finally make some decisions in the second loop. The main reason
- // for this is that we really need `willFree` to make assignment decisions
- // for `willUse`, because if we mark some registers that will be freed, we
- // can consider them in decision making afterwards.
- // ------------------------------------------------------------------------
+ // We don't do any assignment decisions at this stage as we just need to collect some information first. Then,
+ // after we populate all masks needed we can finally make some decisions in the second loop. The main reason
+ // for this is that we really need `willFree` to make assignment decisions for `willUse`, because if we mark
+ // some registers that will be freed, we can consider them in decision making afterwards.
for (i = 0; i < count; i++) {
RATiedReg* tiedReg = &tiedRegs[i];
+ if (tiedReg->hasAnyConsecutiveFlag()) {
+ uint32_t consecutiveOffset = tiedReg->isLeadConsecutive() ? uint32_t(0) : tiedReg->consecutiveData();
+
+ if (ASMJIT_UNLIKELY(Support::bitTest(consecutiveMask, consecutiveOffset)))
+ return DebugUtils::errored(kErrorInvalidState);
+
+ consecutiveMask |= Support::bitMask(consecutiveOffset);
+ consecutiveRegs[consecutiveOffset] = tiedReg;
+ }
+
// Add OUT and KILL to `outPending` for CLOBBERing and/or OUT assignment.
if (tiedReg->isOutOrKill())
outTiedRegs[outTiedCount++] = tiedReg;
@@ -447,12 +439,16 @@ Error RALocalAllocator::allocInst(InstNode* node) noexcept {
continue;
}
+ // Don't assign anything here if this is a consecutive USE - we will handle this in STEP 2 instead.
+ if (tiedReg->isUseConsecutive())
+ continue;
+
uint32_t workId = tiedReg->workId();
uint32_t assignedId = _curAssignment.workToPhysId(group, workId);
if (tiedReg->hasUseId()) {
// If the register has `useId` it means it can only be allocated in that register.
- uint32_t useMask = Support::bitMask(tiedReg->useId());
+ RegMask useMask = Support::bitMask(tiedReg->useId());
// RAInstBuilder must have collected `usedRegs` on-the-fly.
ASMJIT_ASSERT((willUse & useMask) != 0);
@@ -471,9 +467,9 @@ Error RALocalAllocator::allocInst(InstNode* node) noexcept {
}
else {
// Check if the register must be moved to `allocableRegs`.
- uint32_t allocableRegs = tiedReg->allocableRegs();
+ RegMask allocableRegs = tiedReg->useRegMask();
if (assignedId != RAAssignment::kPhysNone) {
- uint32_t assignedMask = Support::bitMask(assignedId);
+ RegMask assignedMask = Support::bitMask(assignedId);
if ((allocableRegs & ~willUse) & assignedMask) {
tiedReg->setUseId(assignedId);
tiedReg->markUseDone();
@@ -489,24 +485,107 @@ Error RALocalAllocator::allocInst(InstNode* node) noexcept {
}
}
- // ------------------------------------------------------------------------
- // STEP 2:
+ // STEP 2
+ // ------
+ //
+ // Verify that all the consecutive registers are really consecutive. Terminate if there is a gap. In addition,
+ // decide which USE ids will be used in case that this consecutive sequence is USE (OUT registers are allocated
+ // in a different step).
+ uint32_t consecutiveCount = 0;
+
+ if (consecutiveMask) {
+ if ((consecutiveMask & (consecutiveMask + 1u)) != 0)
+ return DebugUtils::errored(kErrorInvalidState);
+
+ // Count of trailing ones is the count of consecutive registers. There cannot be gap.
+ consecutiveCount = Support::ctz(~consecutiveMask);
+
+ // Prioritize allocation that would result in least moves even when moving registers away from their homes.
+ RATiedReg* lead = consecutiveRegs[0];
+
+ // Assign the best possible USE Ids to all consecutives.
+ if (lead->isUseConsecutive()) {
+ uint32_t bestScore = 0;
+ uint32_t bestLeadReg = 0xFFFFFFFF;
+ RegMask allocableRegs = (_availableRegs[group] | willFree) & ~willUse;
+
+ uint32_t assignments[kMaxConsecutiveRegs];
+
+ for (i = 0; i < consecutiveCount; i++)
+ assignments[i] = _curAssignment.workToPhysId(group, consecutiveRegs[i]->workId());
+
+ Support::BitWordIterator<uint32_t> it(lead->useRegMask());
+ while (it.hasNext()) {
+ uint32_t regIndex = it.next();
+ if (Support::bitTest(lead->useRegMask(), regIndex)) {
+ uint32_t score = 15;
+
+ for (i = 0; i < consecutiveCount; i++) {
+ uint32_t consecutiveIndex = regIndex + i;
+ if (!Support::bitTest(allocableRegs, consecutiveIndex)) {
+ score = 0;
+ break;
+ }
+
+ RAWorkReg* workReg = workRegById(consecutiveRegs[i]->workId());
+ score += uint32_t(workReg->homeRegId() == consecutiveIndex);
+ score += uint32_t(assignments[i] == consecutiveIndex) * 2;
+ }
+
+ if (score > bestScore) {
+ bestScore = score;
+ bestLeadReg = regIndex;
+ }
+ }
+ }
+
+ if (bestLeadReg == 0xFFFFFFFF)
+ return DebugUtils::errored(kErrorConsecutiveRegsAllocation);
+
+ for (i = 0; i < consecutiveCount; i++) {
+ uint32_t consecutiveIndex = bestLeadReg + i;
+
+ RATiedReg* tiedReg = consecutiveRegs[i];
+ RegMask useMask = Support::bitMask(consecutiveIndex);
+
+ uint32_t workId = tiedReg->workId();
+ uint32_t assignedId = _curAssignment.workToPhysId(group, workId);
+
+ tiedReg->setUseId(consecutiveIndex);
+
+ if (assignedId == consecutiveIndex) {
+ // If the register is already allocated in this one, mark it done and continue.
+ tiedReg->markUseDone();
+ if (tiedReg->isWrite())
+ _curAssignment.makeDirty(group, workId, assignedId);
+ usePending--;
+ willUse |= useMask;
+ }
+ else {
+ willUse |= useMask;
+ willFree |= useMask & _curAssignment.assigned(group);
+ }
+ }
+ }
+ }
+
+ // STEP 3
+ // ------
//
- // Do some decision making to find the best candidates of registers that
- // need to be assigned, moved, and/or spilled. Only USE registers are
- // considered here, OUT will be decided later after all CLOBBERed and OUT
+ // Do some decision making to find the best candidates of registers that need to be assigned, moved, and/or
+ // spilled. Only USE registers are considered here, OUT will be decided later after all CLOBBERed and OUT
// registers are unassigned.
- // ------------------------------------------------------------------------
if (usePending) {
// TODO: Not sure `liveRegs` should be used, maybe willUse and willFree would be enough and much more clear.
// All registers that are currently alive without registers that will be freed.
- uint32_t liveRegs = _curAssignment.assigned(group) & ~willFree;
+ RegMask liveRegs = _curAssignment.assigned(group) & ~willFree;
for (i = 0; i < count; i++) {
RATiedReg* tiedReg = &tiedRegs[i];
- if (tiedReg->isUseDone()) continue;
+ if (tiedReg->isUseDone())
+ continue;
uint32_t workId = tiedReg->workId();
uint32_t assignedId = _curAssignment.workToPhysId(group, workId);
@@ -534,18 +613,17 @@ Error RALocalAllocator::allocInst(InstNode* node) noexcept {
}
if (!tiedReg->hasUseId()) {
- uint32_t allocableRegs = tiedReg->allocableRegs() & ~(willFree | willUse);
-
// DECIDE where to assign the USE register.
+ RegMask allocableRegs = tiedReg->useRegMask() & ~(willFree | willUse);
uint32_t useId = decideOnAssignment(group, workId, assignedId, allocableRegs);
- uint32_t useMask = Support::bitMask(useId);
+ RegMask useMask = Support::bitMask(useId);
willUse |= useMask;
willFree |= useMask & liveRegs;
tiedReg->setUseId(useId);
if (assignedId != RAAssignment::kPhysNone) {
- uint32_t assignedMask = Support::bitMask(assignedId);
+ RegMask assignedMask = Support::bitMask(assignedId);
willFree |= assignedMask;
liveRegs &= ~assignedMask;
@@ -575,19 +653,18 @@ Error RALocalAllocator::allocInst(InstNode* node) noexcept {
}
}
- // Initially all used regs will be marked clobbered.
- uint32_t clobberedByInst = willUse | willOut;
+ // Initially all used regs will be marked as clobbered.
+ RegMask clobberedByInst = willUse | willOut;
- // ------------------------------------------------------------------------
- // STEP 3:
+ // STEP 4
+ // ------
//
- // Free all registers that we marked as `willFree`. Only registers that are not
- // USEd by the instruction are considered as we don't want to free regs we need.
- // ------------------------------------------------------------------------
+ // Free all registers that we marked as `willFree`. Only registers that are not USEd by the instruction are
+ // considered as we don't want to free regs we need.
if (willFree) {
- uint32_t allocableRegs = _availableRegs[group] & ~(_curAssignment.assigned(group) | willFree | willUse | willOut);
- Support::BitWordIterator<uint32_t> it(willFree);
+ RegMask allocableRegs = _availableRegs[group] & ~(_curAssignment.assigned(group) | willFree | willUse | willOut);
+ Support::BitWordIterator<RegMask> it(willFree);
do {
uint32_t assignedId = it.next();
@@ -609,21 +686,17 @@ Error RALocalAllocator::allocInst(InstNode* node) noexcept {
} while (it.hasNext());
}
- // ------------------------------------------------------------------------
- // STEP 4:
+ // STEP 5
+ // ------
//
- // ALLOCATE / SHUFFLE all registers that we marked as `willUse` and weren't
- // allocated yet. This is a bit complicated as the allocation is iterative.
- // In some cases we have to wait before allocating a particual physical
- // register as it's still occupied by some other one, which we need to move
- // before we can use it. In this case we skip it and allocate another some
- // other instead (making it free for another iteration).
+ // ALLOCATE / SHUFFLE all registers that we marked as `willUse` and weren't allocated yet. This is a bit
+ // complicated as the allocation is iterative. In some cases we have to wait before allocating a particual
+ // physical register as it's still occupied by some other one, which we need to move before we can use it.
+ // In this case we skip it and allocate another some other instead (making it free for another iteration).
//
- // NOTE: Iterations are mostly important for complicated allocations like
- // function calls, where there can be up to N registers used at once. Asm
- // instructions won't run the loop more than once in 99.9% of cases as they
- // use 2..3 registers in average.
- // ------------------------------------------------------------------------
+ // NOTE: Iterations are mostly important for complicated allocations like function calls, where there can
+ // be up to N registers used at once. Asm instructions won't run the loop more than once in 99.9% of cases
+ // as they use 2..3 registers in average.
if (usePending) {
bool mustSwap = false;
@@ -632,7 +705,8 @@ Error RALocalAllocator::allocInst(InstNode* node) noexcept {
for (i = 0; i < count; i++) {
RATiedReg* thisTiedReg = &tiedRegs[i];
- if (thisTiedReg->isUseDone()) continue;
+ if (thisTiedReg->isUseDone())
+ continue;
uint32_t thisWorkId = thisTiedReg->workId();
uint32_t thisPhysId = _curAssignment.workToPhysId(group, thisWorkId);
@@ -645,11 +719,10 @@ Error RALocalAllocator::allocInst(InstNode* node) noexcept {
if (targetWorkId != RAAssignment::kWorkNone) {
RAWorkReg* targetWorkReg = workRegById(targetWorkId);
- // Swapping two registers can solve two allocation tasks by emitting
- // just a single instruction. However, swap is only available on few
- // architectures and it's definitely not available for each register
- // group. Calling `onSwapReg()` before checking these would be fatal.
- if (_archTraits.hasSwap(group) && thisPhysId != RAAssignment::kPhysNone) {
+ // Swapping two registers can solve two allocation tasks by emitting just a single instruction. However,
+ // swap is only available on few architectures and it's definitely not available for each register group.
+ // Calling `onSwapReg()` before checking these would be fatal.
+ if (_archTraits->hasInstRegSwap(group) && thisPhysId != RAAssignment::kPhysNone) {
ASMJIT_PROPAGATE(onSwapReg(group, thisWorkId, thisPhysId, targetWorkId, targetPhysId));
thisTiedReg->markUseDone();
@@ -671,10 +744,9 @@ Error RALocalAllocator::allocInst(InstNode* node) noexcept {
if (!mustSwap)
continue;
- // Only branched here if the previous iteration did nothing. This is
- // essentially a SWAP operation without having a dedicated instruction
- // for that purpose (vector registers, etc). The simplest way to
- // handle such case is to SPILL the target register.
+ // Only branched here if the previous iteration did nothing. This is essentially a SWAP operation without
+ // having a dedicated instruction for that purpose (vector registers, etc). The simplest way to handle
+ // such case is to SPILL the target register.
ASMJIT_PROPAGATE(onSpillReg(group, targetWorkId, targetPhysId));
}
@@ -700,11 +772,10 @@ Error RALocalAllocator::allocInst(InstNode* node) noexcept {
} while (usePending);
}
- // ------------------------------------------------------------------------
- // STEP 5:
+ // STEP 6
+ // ------
//
// KILL registers marked as KILL/OUT.
- // ------------------------------------------------------------------------
uint32_t outPending = outTiedCount;
if (outTiedCount) {
@@ -714,28 +785,27 @@ Error RALocalAllocator::allocInst(InstNode* node) noexcept {
uint32_t workId = tiedReg->workId();
uint32_t physId = _curAssignment.workToPhysId(group, workId);
- // Must check if it's allocated as KILL can be related to OUT (like KILL
- // immediately after OUT, which could mean the register is not assigned).
+ // Must check if it's allocated as KILL can be related to OUT (like KILL immediately after OUT, which could
+ // mean the register is not assigned).
if (physId != RAAssignment::kPhysNone) {
ASMJIT_PROPAGATE(onKillReg(group, workId, physId));
willOut &= ~Support::bitMask(physId);
}
- // We still maintain number of pending registers for OUT assignment.
- // So, if this is only KILL, not OUT, we can safely decrement it.
+ // We still maintain number of pending registers for OUT assignment. So, if this is only KILL, not OUT, we
+ // can safely decrement it.
outPending -= !tiedReg->isOut();
}
}
- // ------------------------------------------------------------------------
- // STEP 6:
+ // STEP 7
+ // ------
//
- // SPILL registers that will be CLOBBERed. Since OUT and KILL were
- // already processed this is used mostly to handle function CALLs.
- // ------------------------------------------------------------------------
+ // SPILL registers that will be CLOBBERed. Since OUT and KILL were already processed this is used mostly to
+ // handle function CALLs.
if (willOut) {
- Support::BitWordIterator<uint32_t> it(willOut);
+ Support::BitWordIterator<RegMask> it(willOut);
do {
uint32_t physId = it.next();
uint32_t workId = _curAssignment.physToWorkId(group, physId);
@@ -747,47 +817,90 @@ Error RALocalAllocator::allocInst(InstNode* node) noexcept {
} while (it.hasNext());
}
- // ------------------------------------------------------------------------
- // STEP 7:
+ // STEP 8
+ // ------
//
// Duplication.
- // ------------------------------------------------------------------------
for (i = 0; i < dupTiedCount; i++) {
RATiedReg* tiedReg = dupTiedRegs[i];
uint32_t workId = tiedReg->workId();
uint32_t srcId = tiedReg->useId();
- Support::BitWordIterator<uint32_t> it(tiedReg->_allocableRegs);
+ Support::BitWordIterator<RegMask> it(tiedReg->useRegMask());
while (it.hasNext()) {
uint32_t dstId = it.next();
if (dstId == srcId)
continue;
- _pass->onEmitMove(workId, dstId, srcId);
+ _pass->emitMove(workId, dstId, srcId);
}
}
- // ------------------------------------------------------------------------
- // STEP 8:
+ // STEP 9
+ // ------
//
// Assign OUT registers.
- // ------------------------------------------------------------------------
if (outPending) {
- // Live registers, we need a separate variable (outside of `_curAssignment)
- // to hold these because of KILLed registers. If we KILL a register here it
- // will go out from `_curAssignment`, but we cannot assign to it in here.
- uint32_t liveRegs = _curAssignment.assigned(group);
+ // Live registers, we need a separate register (outside of `_curAssignment) to hold these because of KILLed
+ // registers. If we KILL a register here it will go out from `_curAssignment`, but we cannot assign to it in
+ // here.
+ RegMask liveRegs = _curAssignment.assigned(group);
// Must avoid as they have been already OUTed (added during the loop).
- uint32_t outRegs = 0;
+ RegMask outRegs = 0;
// Must avoid as they collide with already allocated ones.
- uint32_t avoidRegs = willUse & ~clobberedByInst;
+ RegMask avoidRegs = willUse & ~clobberedByInst;
+
+ // Assign the best possible OUT ids of all consecutives.
+ if (consecutiveCount) {
+ RATiedReg* lead = consecutiveRegs[0];
+ if (lead->isOutConsecutive()) {
+ uint32_t bestScore = 0;
+ uint32_t bestLeadReg = 0xFFFFFFFF;
+ RegMask allocableRegs = _availableRegs[group] & ~(outRegs | avoidRegs);
+
+ Support::BitWordIterator<uint32_t> it(lead->outRegMask());
+ while (it.hasNext()) {
+ uint32_t regIndex = it.next();
+ if (Support::bitTest(lead->outRegMask(), regIndex)) {
+ uint32_t score = 15;
+
+ for (i = 0; i < consecutiveCount; i++) {
+ uint32_t consecutiveIndex = regIndex + i;
+ if (!Support::bitTest(allocableRegs, consecutiveIndex)) {
+ score = 0;
+ break;
+ }
+
+ RAWorkReg* workReg = workRegById(consecutiveRegs[i]->workId());
+ score += uint32_t(workReg->homeRegId() == consecutiveIndex);
+ }
+
+ if (score > bestScore) {
+ bestScore = score;
+ bestLeadReg = regIndex;
+ }
+ }
+ }
+
+ if (bestLeadReg == 0xFFFFFFFF)
+ return DebugUtils::errored(kErrorConsecutiveRegsAllocation);
+ for (i = 0; i < consecutiveCount; i++) {
+ uint32_t consecutiveIndex = bestLeadReg + i;
+ RATiedReg* tiedReg = consecutiveRegs[i];
+ tiedReg->setOutId(consecutiveIndex);
+ }
+ }
+ }
+
+ // Allocate OUT registers.
for (i = 0; i < outTiedCount; i++) {
RATiedReg* tiedReg = outTiedRegs[i];
- if (!tiedReg->isOut()) continue;
+ if (!tiedReg->isOut())
+ continue;
uint32_t workId = tiedReg->workId();
uint32_t assignedId = _curAssignment.workToPhysId(group, workId);
@@ -797,7 +910,7 @@ Error RALocalAllocator::allocInst(InstNode* node) noexcept {
uint32_t physId = tiedReg->outId();
if (physId == RAAssignment::kPhysNone) {
- uint32_t allocableRegs = _availableRegs[group] & ~(outRegs | avoidRegs);
+ RegMask allocableRegs = tiedReg->outRegMask() & ~(outRegs | avoidRegs);
if (!(allocableRegs & ~liveRegs)) {
// There are no more registers, decide which one to spill.
@@ -835,9 +948,8 @@ Error RALocalAllocator::allocInst(InstNode* node) noexcept {
}
Error RALocalAllocator::spillAfterAllocation(InstNode* node) noexcept {
- // This is experimental feature that would spill registers that don't have
- // home-id and are last in this basic block. This prevents saving these regs
- // in other basic blocks and then restoring them (mostly relevant for loops).
+ // This is experimental feature that would spill registers that don't have home-id and are last in this basic block.
+ // This prevents saving these regs in other basic blocks and then restoring them (mostly relevant for loops).
RAInst* raInst = node->passData<RAInst>();
uint32_t count = raInst->tiedCount();
@@ -847,7 +959,7 @@ Error RALocalAllocator::spillAfterAllocation(InstNode* node) noexcept {
uint32_t workId = tiedReg->workId();
RAWorkReg* workReg = workRegById(workId);
if (!workReg->hasHomeRegId()) {
- uint32_t group = workReg->group();
+ RegGroup group = workReg->group();
uint32_t assignedId = _curAssignment.workToPhysId(group, workId);
if (assignedId != RAAssignment::kPhysNone) {
_cc->_setCursor(node);
@@ -894,9 +1006,8 @@ Error RALocalAllocator::allocBranch(InstNode* node, RABlock* target, RABlock* co
BaseNode* curCursor = _cc->cursor();
if (curCursor != injectionPoint) {
- // Additional instructions emitted to switch from the current state to
- // the `target` state. This means that we have to move these instructions
- // into an independent code block and patch the jump location.
+ // Additional instructions emitted to switch from the current state to the `target` state. This means
+ // that we have to move these instructions into an independent code block and patch the jump location.
Operand& targetOp = node->op(node->opCount() - 1);
if (ASMJIT_UNLIKELY(!targetOp.isLabel()))
return DebugUtils::errored(kErrorInvalidState);
@@ -907,12 +1018,12 @@ Error RALocalAllocator::allocBranch(InstNode* node, RABlock* target, RABlock* co
// Patch `target` to point to the `trampoline` we just created.
targetOp = trampoline;
- // Clear a possible SHORT form as we have no clue now if the SHORT form would
- // be encodable after patching the target to `trampoline` (X86 specific).
- node->clearInstOptions(BaseInst::kOptionShortForm);
+ // Clear a possible SHORT form as we have no clue now if the SHORT form would be encodable after patching
+ // the target to `trampoline` (X86 specific).
+ node->clearOptions(InstOptions::kShortForm);
// Finalize the switch assignment sequence.
- ASMJIT_PROPAGATE(_pass->onEmitJump(savedTarget));
+ ASMJIT_PROPAGATE(_pass->emitJump(savedTarget));
_cc->_setCursor(injectionPoint);
_cc->bind(trampoline);
}
@@ -928,12 +1039,12 @@ Error RALocalAllocator::allocBranch(InstNode* node, RABlock* target, RABlock* co
}
Error RALocalAllocator::allocJumpTable(InstNode* node, const RABlocks& targets, RABlock* cont) noexcept {
+ // TODO: Do we really need to use `cont`?
+ DebugUtils::unused(cont);
+
if (targets.empty())
return DebugUtils::errored(kErrorInvalidState);
- if (targets.size() == 1)
- return allocBranch(node, targets[0], cont);
-
// The cursor must point to the previous instruction for a possible instruction insertion.
_cc->_setCursor(node->prev());
@@ -965,11 +1076,10 @@ Error RALocalAllocator::allocJumpTable(InstNode* node, const RABlocks& targets,
return kErrorOk;
}
-// ============================================================================
-// [asmjit::RALocalAllocator - Decision Making]
-// ============================================================================
+// RALocalAllocator - Decision Making
+// ==================================
-uint32_t RALocalAllocator::decideOnAssignment(uint32_t group, uint32_t workId, uint32_t physId, uint32_t allocableRegs) const noexcept {
+uint32_t RALocalAllocator::decideOnAssignment(RegGroup group, uint32_t workId, uint32_t physId, RegMask allocableRegs) const noexcept {
ASMJIT_ASSERT(allocableRegs != 0);
DebugUtils::unused(group, physId);
@@ -983,14 +1093,14 @@ uint32_t RALocalAllocator::decideOnAssignment(uint32_t group, uint32_t workId, u
}
// Prefer registers used upon block entries.
- uint32_t previouslyAssignedRegs = workReg->allocatedMask();
+ RegMask previouslyAssignedRegs = workReg->allocatedMask();
if (allocableRegs & previouslyAssignedRegs)
allocableRegs &= previouslyAssignedRegs;
return Support::ctz(allocableRegs);
}
-uint32_t RALocalAllocator::decideOnReassignment(uint32_t group, uint32_t workId, uint32_t physId, uint32_t allocableRegs) const noexcept {
+uint32_t RALocalAllocator::decideOnReassignment(RegGroup group, uint32_t workId, uint32_t physId, RegMask allocableRegs) const noexcept {
ASMJIT_ASSERT(allocableRegs != 0);
DebugUtils::unused(group, physId);
@@ -1008,12 +1118,12 @@ uint32_t RALocalAllocator::decideOnReassignment(uint32_t group, uint32_t workId,
return RAAssignment::kPhysNone;
}
-uint32_t RALocalAllocator::decideOnSpillFor(uint32_t group, uint32_t workId, uint32_t spillableRegs, uint32_t* spillWorkId) const noexcept {
+uint32_t RALocalAllocator::decideOnSpillFor(RegGroup group, uint32_t workId, RegMask spillableRegs, uint32_t* spillWorkId) const noexcept {
// May be used in the future to decide which register would be best to spill so `workId` can be assigned.
DebugUtils::unused(workId);
ASMJIT_ASSERT(spillableRegs != 0);
- Support::BitWordIterator<uint32_t> it(spillableRegs);
+ Support::BitWordIterator<RegMask> it(spillableRegs);
uint32_t bestPhysId = it.next();
uint32_t bestWorkId = _curAssignment.physToWorkId(group, bestPhysId);
diff --git a/3rdparty/asmjit/src/asmjit/core/ralocal_p.h b/3rdparty/asmjit/src/asmjit/core/ralocal_p.h
index c944aad2bb4..05467c5b265 100644
--- a/3rdparty/asmjit/src/asmjit/core/ralocal_p.h
+++ b/3rdparty/asmjit/src/asmjit/core/ralocal_p.h
@@ -1,25 +1,7 @@
-// AsmJit - Machine code generation for C++
+// This file is part of AsmJit project <https://asmjit.com>
//
-// * Official AsmJit Home Page: https://asmjit.com
-// * Official Github Repository: https://github.com/asmjit/asmjit
-//
-// Copyright (c) 2008-2020 The AsmJit Authors
-//
-// This software is provided 'as-is', without any express or implied
-// warranty. In no event will the authors be held liable for any damages
-// arising from the use of this software.
-//
-// Permission is granted to anyone to use this software for any purpose,
-// including commercial applications, and to alter it and redistribute it
-// freely, subject to the following restrictions:
-//
-// 1. The origin of this software must not be misrepresented; you must not
-// claim that you wrote the original software. If you use this software
-// in a product, an acknowledgment in the product documentation would be
-// appreciated but is not required.
-// 2. Altered source versions must be plainly marked as such, and must not be
-// misrepresented as being the original software.
-// 3. This notice may not be removed or altered from any source distribution.
+// See asmjit.h or LICENSE.md for license and copyright information
+// SPDX-License-Identifier: Zlib
#ifndef ASMJIT_CORE_RALOCAL_P_H_INCLUDED
#define ASMJIT_CORE_RALOCAL_P_H_INCLUDED
@@ -38,10 +20,6 @@ ASMJIT_BEGIN_NAMESPACE
//! \addtogroup asmjit_ra
//! \{
-// ============================================================================
-// [asmjit::RALocalAllocator]
-// ============================================================================
-
//! Local register allocator.
class RALocalAllocator {
public:
@@ -50,13 +28,13 @@ public:
typedef RAAssignment::PhysToWorkMap PhysToWorkMap;
typedef RAAssignment::WorkToPhysMap WorkToPhysMap;
- //! Link to `RAPass`.
- RAPass* _pass;
+ //! Link to `BaseRAPass`.
+ BaseRAPass* _pass;
//! Link to `BaseCompiler`.
BaseCompiler* _cc;
//! Architecture traits.
- RAArchTraits _archTraits;
+ const ArchTraits* _archTraits;
//! Registers available to the allocator.
RARegMask _availableRegs;
//! Registers clobbered by the allocator.
@@ -82,7 +60,7 @@ public:
//! \name Construction & Destruction
//! \{
- inline RALocalAllocator(RAPass* pass) noexcept
+ inline RALocalAllocator(BaseRAPass* pass) noexcept
: _pass(pass),
_cc(pass->cc()),
_archTraits(pass->_archTraits),
@@ -119,14 +97,14 @@ public:
//! Returns all tied regs as `RATiedReg` array.
inline RATiedReg* tiedRegs() const noexcept { return _raInst->tiedRegs(); }
//! Returns tied registers grouped by the given `group`.
- inline RATiedReg* tiedRegs(uint32_t group) const noexcept { return _raInst->tiedRegs(group); }
+ inline RATiedReg* tiedRegs(RegGroup group) const noexcept { return _raInst->tiedRegs(group); }
//! Returns count of all TiedRegs used by the instruction.
inline uint32_t tiedCount() const noexcept { return _tiedTotal; }
//! Returns count of TiedRegs used by the given register `group`.
- inline uint32_t tiedCount(uint32_t group) const noexcept { return _tiedCount.get(group); }
+ inline uint32_t tiedCount(RegGroup group) const noexcept { return _tiedCount.get(group); }
- inline bool isGroupUsed(uint32_t group) const noexcept { return _tiedCount[group] != 0; }
+ inline bool isGroupUsed(RegGroup group) const noexcept { return _tiedCount[group] != 0; }
//! \}
@@ -139,14 +117,12 @@ public:
const PhysToWorkMap* physToWorkMap,
const WorkToPhysMap* workToPhysMap) noexcept;
- //! Switch to the given assignment by reassigning all register and emitting
- //! code that reassigns them. This is always used to switch to a previously
- //! stored assignment.
+ //! Switch to the given assignment by reassigning all register and emitting code that reassigns them.
+ //! This is always used to switch to a previously stored assignment.
//!
- //! If `tryMode` is true then the final assignment doesn't have to be exactly
- //! same as specified by `dstPhysToWorkMap` and `dstWorkToPhysMap`. This mode
- //! is only used before conditional jumps that already have assignment to
- //! generate a code sequence that is always executed regardless of the flow.
+ //! If `tryMode` is true then the final assignment doesn't have to be exactly same as specified by `dstPhysToWorkMap`
+ //! and `dstWorkToPhysMap`. This mode is only used before conditional jumps that already have assignment to generate
+ //! a code sequence that is always executed regardless of the flow.
Error switchToAssignment(
PhysToWorkMap* dstPhysToWorkMap,
WorkToPhysMap* dstWorkToPhysMap,
@@ -155,10 +131,10 @@ public:
bool tryMode) noexcept;
inline Error spillRegsBeforeEntry(RABlock* block) noexcept {
- return spillGpScratchRegsBeforeEntry(block->entryScratchGpRegs());
+ return spillScratchGpRegsBeforeEntry(block->entryScratchGpRegs());
}
- Error spillGpScratchRegsBeforeEntry(uint32_t scratchRegs) noexcept;
+ Error spillScratchGpRegsBeforeEntry(uint32_t scratchRegs) noexcept;
//! \}
@@ -185,7 +161,7 @@ public:
return uint32_t(int32_t(freq * float(kCostOfFrequency)));
}
- inline uint32_t calculateSpillCost(uint32_t group, uint32_t workId, uint32_t assignedId) const noexcept {
+ inline uint32_t calculateSpillCost(RegGroup group, uint32_t workId, uint32_t assignedId) const noexcept {
RAWorkReg* workReg = workRegById(workId);
uint32_t cost = costByFrequency(workReg->liveStats().freq());
@@ -196,18 +172,18 @@ public:
}
//! Decides on register assignment.
- uint32_t decideOnAssignment(uint32_t group, uint32_t workId, uint32_t assignedId, uint32_t allocableRegs) const noexcept;
+ uint32_t decideOnAssignment(RegGroup group, uint32_t workId, uint32_t assignedId, RegMask allocableRegs) const noexcept;
- //! Decides on whether to MOVE or SPILL the given WorkReg, because it's allocated
- //! in a physical register that have to be used by another WorkReg.
+ //! Decides on whether to MOVE or SPILL the given WorkReg, because it's allocated in a physical register that have
+ //! to be used by another WorkReg.
//!
- //! The function must return either `RAAssignment::kPhysNone`, which means that
- //! the WorkReg of `workId` should be spilled, or a valid physical register ID,
- //! which means that the register should be moved to that physical register instead.
- uint32_t decideOnReassignment(uint32_t group, uint32_t workId, uint32_t assignedId, uint32_t allocableRegs) const noexcept;
+ //! The function must return either `RAAssignment::kPhysNone`, which means that the WorkReg of `workId` should be
+ //! spilled, or a valid physical register ID, which means that the register should be moved to that physical register
+ //! instead.
+ uint32_t decideOnReassignment(RegGroup group, uint32_t workId, uint32_t assignedId, RegMask allocableRegs) const noexcept;
//! Decides on best spill given a register mask `spillableRegs`
- uint32_t decideOnSpillFor(uint32_t group, uint32_t workId, uint32_t spillableRegs, uint32_t* spillWorkId) const noexcept;
+ uint32_t decideOnSpillFor(RegGroup group, uint32_t workId, RegMask spillableRegs, uint32_t* spillWorkId) const noexcept;
//! \}
@@ -216,56 +192,56 @@ public:
//! Emits a move between a destination and source register, and fixes the
//! register assignment.
- inline Error onMoveReg(uint32_t group, uint32_t workId, uint32_t dstPhysId, uint32_t srcPhysId) noexcept {
+ inline Error onMoveReg(RegGroup group, uint32_t workId, uint32_t dstPhysId, uint32_t srcPhysId) noexcept {
if (dstPhysId == srcPhysId) return kErrorOk;
_curAssignment.reassign(group, workId, dstPhysId, srcPhysId);
- return _pass->onEmitMove(workId, dstPhysId, srcPhysId);
+ return _pass->emitMove(workId, dstPhysId, srcPhysId);
}
//! Emits a swap between two physical registers and fixes their assignment.
//!
//! \note Target must support this operation otherwise this would ASSERT.
- inline Error onSwapReg(uint32_t group, uint32_t aWorkId, uint32_t aPhysId, uint32_t bWorkId, uint32_t bPhysId) noexcept {
+ inline Error onSwapReg(RegGroup group, uint32_t aWorkId, uint32_t aPhysId, uint32_t bWorkId, uint32_t bPhysId) noexcept {
_curAssignment.swap(group, aWorkId, aPhysId, bWorkId, bPhysId);
- return _pass->onEmitSwap(aWorkId, aPhysId, bWorkId, bPhysId);
+ return _pass->emitSwap(aWorkId, aPhysId, bWorkId, bPhysId);
}
//! Emits a load from [VirtReg/WorkReg]'s spill slot to a physical register
//! and makes it assigned and clean.
- inline Error onLoadReg(uint32_t group, uint32_t workId, uint32_t physId) noexcept {
+ inline Error onLoadReg(RegGroup group, uint32_t workId, uint32_t physId) noexcept {
_curAssignment.assign(group, workId, physId, RAAssignment::kClean);
- return _pass->onEmitLoad(workId, physId);
+ return _pass->emitLoad(workId, physId);
}
//! Emits a save a physical register to a [VirtReg/WorkReg]'s spill slot,
//! keeps it assigned, and makes it clean.
- inline Error onSaveReg(uint32_t group, uint32_t workId, uint32_t physId) noexcept {
+ inline Error onSaveReg(RegGroup group, uint32_t workId, uint32_t physId) noexcept {
ASMJIT_ASSERT(_curAssignment.workToPhysId(group, workId) == physId);
ASMJIT_ASSERT(_curAssignment.physToWorkId(group, physId) == workId);
_curAssignment.makeClean(group, workId, physId);
- return _pass->onEmitSave(workId, physId);
+ return _pass->emitSave(workId, physId);
}
//! Assigns a register, the content of it is undefined at this point.
- inline Error onAssignReg(uint32_t group, uint32_t workId, uint32_t physId, uint32_t dirty) noexcept {
+ inline Error onAssignReg(RegGroup group, uint32_t workId, uint32_t physId, bool dirty) noexcept {
_curAssignment.assign(group, workId, physId, dirty);
return kErrorOk;
}
//! Spills a variable/register, saves the content to the memory-home if modified.
- inline Error onSpillReg(uint32_t group, uint32_t workId, uint32_t physId) noexcept {
+ inline Error onSpillReg(RegGroup group, uint32_t workId, uint32_t physId) noexcept {
if (_curAssignment.isPhysDirty(group, physId))
ASMJIT_PROPAGATE(onSaveReg(group, workId, physId));
return onKillReg(group, workId, physId);
}
- inline Error onDirtyReg(uint32_t group, uint32_t workId, uint32_t physId) noexcept {
+ inline Error onDirtyReg(RegGroup group, uint32_t workId, uint32_t physId) noexcept {
_curAssignment.makeDirty(group, workId, physId);
return kErrorOk;
}
- inline Error onKillReg(uint32_t group, uint32_t workId, uint32_t physId) noexcept {
+ inline Error onKillReg(RegGroup group, uint32_t workId, uint32_t physId) noexcept {
_curAssignment.unassign(group, workId, physId);
return kErrorOk;
}
diff --git a/3rdparty/asmjit/src/asmjit/core/rapass.cpp b/3rdparty/asmjit/src/asmjit/core/rapass.cpp
index c5b5ce88a16..79709f69d63 100644
--- a/3rdparty/asmjit/src/asmjit/core/rapass.cpp
+++ b/3rdparty/asmjit/src/asmjit/core/rapass.cpp
@@ -1,25 +1,7 @@
-// AsmJit - Machine code generation for C++
+// This file is part of AsmJit project <https://asmjit.com>
//
-// * Official AsmJit Home Page: https://asmjit.com
-// * Official Github Repository: https://github.com/asmjit/asmjit
-//
-// Copyright (c) 2008-2020 The AsmJit Authors
-//
-// This software is provided 'as-is', without any express or implied
-// warranty. In no event will the authors be held liable for any damages
-// arising from the use of this software.
-//
-// Permission is granted to anyone to use this software for any purpose,
-// including commercial applications, and to alter it and redistribute it
-// freely, subject to the following restrictions:
-//
-// 1. The origin of this software must not be misrepresented; you must not
-// claim that you wrote the original software. If you use this software
-// in a product, an acknowledgment in the product documentation would be
-// appreciated but is not required.
-// 2. Altered source versions must be plainly marked as such, and must not be
-// misrepresented as being the original software.
-// 3. This notice may not be removed or altered from any source distribution.
+// See asmjit.h or LICENSE.md for license and copyright information
+// SPDX-License-Identifier: Zlib
#include "../core/api-build_p.h"
#ifndef ASMJIT_NO_COMPILER
@@ -33,16 +15,14 @@
ASMJIT_BEGIN_NAMESPACE
-// ============================================================================
-// [asmjit::RABlock - Control Flow]
-// ============================================================================
+// RABlock - Control Flow
+// ======================
Error RABlock::appendSuccessor(RABlock* successor) noexcept {
RABlock* predecessor = this;
- if (predecessor->_successors.contains(successor))
+ if (predecessor->hasSuccessor(successor))
return kErrorOk;
- ASMJIT_ASSERT(!successor->_predecessors.contains(predecessor));
ASMJIT_PROPAGATE(successor->_predecessors.willGrow(allocator()));
ASMJIT_PROPAGATE(predecessor->_successors.willGrow(allocator()));
@@ -56,9 +36,8 @@ Error RABlock::appendSuccessor(RABlock* successor) noexcept {
Error RABlock::prependSuccessor(RABlock* successor) noexcept {
RABlock* predecessor = this;
- if (predecessor->_successors.contains(successor))
+ if (predecessor->hasSuccessor(successor))
return kErrorOk;
- ASMJIT_ASSERT(!successor->_predecessors.contains(predecessor));
ASMJIT_PROPAGATE(successor->_predecessors.willGrow(allocator()));
ASMJIT_PROPAGATE(predecessor->_successors.willGrow(allocator()));
@@ -69,51 +48,16 @@ Error RABlock::prependSuccessor(RABlock* successor) noexcept {
return kErrorOk;
}
-// ============================================================================
-// [asmjit::RAPass - Construction / Destruction]
-// ============================================================================
-
-RAPass::RAPass() noexcept
- : FuncPass("RAPass"),
- _allocator(),
- _logger(nullptr),
- _debugLogger(nullptr),
- _loggerFlags(0),
- _func(nullptr),
- _stop(nullptr),
- _extraBlock(nullptr),
- _blocks(),
- _exits(),
- _pov(),
- _instructionCount(0),
- _createdBlockCount(0),
- _sharedAssignments(),
- _lastTimestamp(0),
- _archRegsInfo(nullptr),
- _archTraits(),
- _physRegIndex(),
- _physRegCount(),
- _physRegTotal(0),
- _scratchRegIndexes{},
- _availableRegs(),
- _availableRegCount(),
- _clobberedRegs(),
- _globalMaxLiveCount(),
- _globalLiveSpans {},
- _temporaryMem(),
- _sp(),
- _fp(),
- _stackAllocator(),
- _argsAssignment(),
- _numStackArgsToStackSlots(0),
- _maxWorkRegNameSize(0) {}
-RAPass::~RAPass() noexcept {}
-
-// ============================================================================
-// [asmjit::RAPass - RunOnFunction]
-// ============================================================================
-
-static void RAPass_reset(RAPass* self, FuncDetail* funcDetail) noexcept {
+// BaseRAPass - Construction & Destruction
+// =======================================
+
+BaseRAPass::BaseRAPass() noexcept : FuncPass("BaseRAPass") {}
+BaseRAPass::~BaseRAPass() noexcept {}
+
+// BaseRAPass - RunOnFunction
+// ==========================
+
+static void BaseRAPass_reset(BaseRAPass* self, FuncDetail* funcDetail) noexcept {
ZoneAllocator* allocator = self->allocator();
self->_blocks.reset();
@@ -126,25 +70,20 @@ static void RAPass_reset(RAPass* self, FuncDetail* funcDetail) noexcept {
self->_sharedAssignments.reset();
self->_lastTimestamp = 0;
- self->_archRegsInfo = nullptr;
- self->_archTraits.reset();
+ self->_archTraits = nullptr;
self->_physRegIndex.reset();
self->_physRegCount.reset();
self->_physRegTotal = 0;
-
- for (size_t i = 0; i < ASMJIT_ARRAY_SIZE(self->_scratchRegIndexes); i++)
- self->_scratchRegIndexes[i] = BaseReg::kIdBad;
+ self->_scratchRegIndexes.fill(BaseReg::kIdBad);
self->_availableRegs.reset();
self->_availableRegCount.reset();
self->_clobberedRegs.reset();
self->_workRegs.reset();
- for (uint32_t group = 0; group < BaseReg::kGroupVirt; group++) {
- self->_workRegsOfGroup[group].reset();
- self->_strategy[group].reset();
- self->_globalLiveSpans[group] = nullptr;
- }
+ self->_workRegsOfGroup.forEach([](RAWorkRegs& regs) { regs.reset(); });
+ self->_strategy.forEach([](RAStrategy& strategy) { strategy.reset(); });
+ self->_globalLiveSpans.fill(nullptr);
self->_globalMaxLiveCount.reset();
self->_temporaryMem.reset();
@@ -154,25 +93,32 @@ static void RAPass_reset(RAPass* self, FuncDetail* funcDetail) noexcept {
self->_maxWorkRegNameSize = 0;
}
-static void RAPass_resetVirtRegData(RAPass* self) noexcept {
- // Zero everything so it cannot be used by accident.
+static void BaseRAPass_resetVirtRegData(BaseRAPass* self) noexcept {
for (RAWorkReg* wReg : self->_workRegs) {
VirtReg* vReg = wReg->virtReg();
+
+ // Update the information regarding the stack of the virtual register.
+ if (wReg->hasStackSlot()) {
+ RAStackSlot* slot = wReg->stackSlot();
+ vReg->assignStackSlot(slot->offset());
+ }
+
+ // Reset work reg association so it cannot be used by accident (RAWorkReg data will be destroyed).
vReg->_workReg = nullptr;
}
}
-Error RAPass::runOnFunction(Zone* zone, Logger* logger, FuncNode* func) {
+Error BaseRAPass::runOnFunction(Zone* zone, Logger* logger, FuncNode* func) {
_allocator.reset(zone);
#ifndef ASMJIT_NO_LOGGING
_logger = logger;
- _debugLogger = nullptr;
+ _formatOptions.reset();
+ _diagnosticOptions = DiagnosticOptions::kNone;
if (logger) {
- _loggerFlags = logger->flags();
- if (_loggerFlags & FormatOptions::kFlagDebugPasses)
- _debugLogger = logger;
+ _formatOptions = logger->options();
+ _diagnosticOptions = _cb->diagnosticOptions();
}
#else
DebugUtils::unused(logger);
@@ -184,7 +130,7 @@ Error RAPass::runOnFunction(Zone* zone, Logger* logger, FuncNode* func) {
_stop = end->next();
_extraBlock = end;
- RAPass_reset(this, &_func->_funcDetail);
+ BaseRAPass_reset(this, &_func->_funcDetail);
// Initialize architecture-specific members.
onInit();
@@ -196,16 +142,16 @@ Error RAPass::runOnFunction(Zone* zone, Logger* logger, FuncNode* func) {
onDone();
// Reset possible connections introduced by the register allocator.
- RAPass_resetVirtRegData(this);
+ BaseRAPass_resetVirtRegData(this);
// Reset all core structures and everything that depends on the passed `Zone`.
- RAPass_reset(this, nullptr);
+ BaseRAPass_reset(this, nullptr);
_allocator.reset(nullptr);
#ifndef ASMJIT_NO_LOGGING
_logger = nullptr;
- _debugLogger = nullptr;
- _loggerFlags = 0;
+ _formatOptions.reset();
+ _diagnosticOptions = DiagnosticOptions::kNone;
#endif
_func = nullptr;
@@ -215,25 +161,24 @@ Error RAPass::runOnFunction(Zone* zone, Logger* logger, FuncNode* func) {
// Reset `Zone` as nothing should persist between `runOnFunction()` calls.
zone->reset();
- // We alter the compiler cursor, because it doesn't make sense to reference
- // it after the compilation - some nodes may disappear and the old cursor
- // can go out anyway.
+ // We alter the compiler cursor, because it doesn't make sense to reference it after the compilation - some
+ // nodes may disappear and the old cursor can go out anyway.
cc()->_setCursor(cc()->lastNode());
return err;
}
-Error RAPass::onPerformAllSteps() noexcept {
+Error BaseRAPass::onPerformAllSteps() noexcept {
ASMJIT_PROPAGATE(buildCFG());
- ASMJIT_PROPAGATE(buildViews());
- ASMJIT_PROPAGATE(removeUnreachableBlocks());
+ ASMJIT_PROPAGATE(buildCFGViews());
+ ASMJIT_PROPAGATE(removeUnreachableCode());
- ASMJIT_PROPAGATE(buildDominators());
+ ASMJIT_PROPAGATE(buildCFGDominators());
ASMJIT_PROPAGATE(buildLiveness());
ASMJIT_PROPAGATE(assignArgIndexToWorkRegs());
#ifndef ASMJIT_NO_LOGGING
- if (logger() && logger()->hasFlag(FormatOptions::kFlagAnnotations))
+ if (hasDiagnosticOption(DiagnosticOptions::kRAAnnotate))
ASMJIT_PROPAGATE(annotateCode());
#endif
@@ -248,11 +193,10 @@ Error RAPass::onPerformAllSteps() noexcept {
return kErrorOk;
}
-// ============================================================================
-// [asmjit::RAPass - CFG - Basic Block Management]
-// ============================================================================
+// BaseRAPass - CFG - Basic Block Management
+// =========================================
-RABlock* RAPass::newBlock(BaseNode* initialNode) noexcept {
+RABlock* BaseRAPass::newBlock(BaseNode* initialNode) noexcept {
RABlock* block = zone()->newT<RABlock>(this);
if (ASMJIT_UNLIKELY(!block))
return nullptr;
@@ -264,7 +208,7 @@ RABlock* RAPass::newBlock(BaseNode* initialNode) noexcept {
return block;
}
-RABlock* RAPass::newBlockOrExistingAt(LabelNode* cbLabel, BaseNode** stoppedAt) noexcept {
+RABlock* BaseRAPass::newBlockOrExistingAt(LabelNode* cbLabel, BaseNode** stoppedAt) noexcept {
if (cbLabel->hasPassData())
return cbLabel->passData<RABlock>();
@@ -272,9 +216,8 @@ RABlock* RAPass::newBlockOrExistingAt(LabelNode* cbLabel, BaseNode** stoppedAt)
BaseNode* node = cbLabel->prev();
RABlock* block = nullptr;
- // Try to find some label, but terminate the loop on any code. We try hard to
- // coalesce code that contains two consecutive labels or a combination of
- // non-code nodes between 2 or more labels.
+ // Try to find some label, but terminate the loop on any code. We try hard to coalesce code that contains two
+ // consecutive labels or a combination of non-code nodes between 2 or more labels.
//
// Possible cases that would share the same basic block:
//
@@ -290,16 +233,15 @@ RABlock* RAPass::newBlockOrExistingAt(LabelNode* cbLabel, BaseNode** stoppedAt)
size_t nPendingLabels = 0;
while (node) {
- if (node->type() == BaseNode::kNodeLabel) {
- // Function has a different NodeType, just make sure this was not messed
- // up as we must never associate BasicBlock with a `func` itself.
+ if (node->type() == NodeType::kLabel) {
+ // Function has a different NodeType, just make sure this was not messed up as we must never associate
+ // BasicBlock with a `func` itself.
ASMJIT_ASSERT(node != func);
block = node->passData<RABlock>();
if (block) {
- // Exit node has always a block associated with it. If we went here it
- // means that `cbLabel` passed here is after the end of the function
- // and cannot be merged with the function exit block.
+ // Exit node has always a block associated with it. If we went here it means that `cbLabel` passed here
+ // is after the end of the function and cannot be merged with the function exit block.
if (node == func->exitNode())
block = nullptr;
break;
@@ -307,7 +249,7 @@ RABlock* RAPass::newBlockOrExistingAt(LabelNode* cbLabel, BaseNode** stoppedAt)
nPendingLabels++;
}
- else if (node->type() == BaseNode::kNodeAlign) {
+ else if (node->type() == NodeType::kAlign) {
// Align node is fine.
}
else {
@@ -332,7 +274,7 @@ RABlock* RAPass::newBlockOrExistingAt(LabelNode* cbLabel, BaseNode** stoppedAt)
while (nPendingLabels) {
node = node->prev();
for (;;) {
- if (node->type() == BaseNode::kNodeLabel) {
+ if (node->type() == NodeType::kLabel) {
node->setPassData<RABlock>(block);
nPendingLabels--;
break;
@@ -351,7 +293,7 @@ RABlock* RAPass::newBlockOrExistingAt(LabelNode* cbLabel, BaseNode** stoppedAt)
return block;
}
-Error RAPass::addBlock(RABlock* block) noexcept {
+Error BaseRAPass::addBlock(RABlock* block) noexcept {
ASMJIT_PROPAGATE(_blocks.willGrow(allocator()));
block->_blockId = blockCount();
@@ -359,11 +301,10 @@ Error RAPass::addBlock(RABlock* block) noexcept {
return kErrorOk;
}
-// ============================================================================
-// [asmjit::RAPass - CFG - Build]
-// ============================================================================
+// BaseRAPass - CFG - Build
+// ========================
-Error RAPass::initSharedAssignments(const ZoneVector<uint32_t>& sharedAssignmentsMap) noexcept {
+Error BaseRAPass::initSharedAssignments(const ZoneVector<uint32_t>& sharedAssignmentsMap) noexcept {
if (sharedAssignmentsMap.empty())
return kErrorOk;
@@ -378,22 +319,31 @@ Error RAPass::initSharedAssignments(const ZoneVector<uint32_t>& sharedAssignment
ASMJIT_PROPAGATE(_sharedAssignments.resize(allocator(), count));
- // Aggregate all entry scratch GP regs from blocks of the same assignment to
- // the assignment itself. It will then be used instead of RABlock's own scratch
- // regs mask, as shared assignments have precedence.
+ // Aggregate all entry scratch GP regs from blocks of the same assignment to the assignment itself. It will then be
+ // used instead of RABlock's own scratch regs mask, as shared assignments have precedence.
for (RABlock* block : _blocks) {
+ if (block->hasJumpTable()) {
+ const RABlocks& successors = block->successors();
+ if (!successors.empty()) {
+ RABlock* firstSuccessor = successors[0];
+ // NOTE: Shared assignments connect all possible successors so we only need the first to propagate exit scratch
+ // GP registers.
+ ASMJIT_ASSERT(firstSuccessor->hasSharedAssignmentId());
+ RASharedAssignment& sa = _sharedAssignments[firstSuccessor->sharedAssignmentId()];
+ sa.addEntryScratchGpRegs(block->exitScratchGpRegs());
+ }
+ }
if (block->hasSharedAssignmentId()) {
RASharedAssignment& sa = _sharedAssignments[block->sharedAssignmentId()];
- sa.addScratchGpRegs(block->_entryScratchGpRegs);
+ sa.addEntryScratchGpRegs(block->_entryScratchGpRegs);
}
}
return kErrorOk;
}
-// ============================================================================
-// [asmjit::RAPass - CFG - Views Order]
-// ============================================================================
+// BaseRAPass - CFG - Views Order
+// ==============================
class RABlockVisitItem {
public:
@@ -414,10 +364,10 @@ public:
uint32_t _index;
};
-Error RAPass::buildViews() noexcept {
+Error BaseRAPass::buildCFGViews() noexcept {
#ifndef ASMJIT_NO_LOGGING
- Logger* logger = debugLogger();
- ASMJIT_RA_LOG_FORMAT("[RAPass::BuildViews]\n");
+ Logger* logger = getLoggerIf(DiagnosticOptions::kRADebugCFG);
+ ASMJIT_RA_LOG_FORMAT("[BuildCFGViews]\n");
#endif
uint32_t count = blockCount();
@@ -485,11 +435,10 @@ Error RAPass::buildViews() noexcept {
return kErrorOk;
}
-// ============================================================================
-// [asmjit::RAPass - CFG - Dominators]
-// ============================================================================
+// BaseRAPass - CFG - Dominators
+// =============================
-static ASMJIT_INLINE RABlock* intersectBlocks(RABlock* b1, RABlock* b2) noexcept {
+static ASMJIT_FORCE_INLINE RABlock* intersectBlocks(RABlock* b1, RABlock* b2) noexcept {
while (b1 != b2) {
while (b2->povOrder() > b1->povOrder()) b1 = b1->iDom();
while (b1->povOrder() > b2->povOrder()) b2 = b2->iDom();
@@ -498,10 +447,10 @@ static ASMJIT_INLINE RABlock* intersectBlocks(RABlock* b1, RABlock* b2) noexcept
}
// Based on "A Simple, Fast Dominance Algorithm".
-Error RAPass::buildDominators() noexcept {
+Error BaseRAPass::buildCFGDominators() noexcept {
#ifndef ASMJIT_NO_LOGGING
- Logger* logger = debugLogger();
- ASMJIT_RA_LOG_FORMAT("[RAPass::BuildDominators]\n");
+ Logger* logger = getLoggerIf(DiagnosticOptions::kRADebugCFG);
+ ASMJIT_RA_LOG_FORMAT("[BuildCFGDominators]\n");
#endif
if (_blocks.empty())
@@ -529,11 +478,13 @@ Error RAPass::buildDominators() noexcept {
uint32_t j = preds.size();
while (j) {
RABlock* p = preds[--j];
- if (!p->iDom()) continue;
+ if (!p->iDom())
+ continue;
iDom = !iDom ? p : intersectBlocks(iDom, p);
}
if (block->iDom() != iDom) {
+ ASMJIT_ASSUME(iDom != nullptr);
ASMJIT_RA_LOG_FORMAT(" IDom of #%u -> #%u\n", block->blockId(), iDom->blockId());
block->setIDom(iDom);
changed = true;
@@ -545,7 +496,7 @@ Error RAPass::buildDominators() noexcept {
return kErrorOk;
}
-bool RAPass::_strictlyDominates(const RABlock* a, const RABlock* b) const noexcept {
+bool BaseRAPass::_strictlyDominates(const RABlock* a, const RABlock* b) const noexcept {
ASMJIT_ASSERT(a != nullptr); // There must be at least one block if this function is
ASMJIT_ASSERT(b != nullptr); // called, as both `a` and `b` must be valid blocks.
ASMJIT_ASSERT(a != b); // Checked by `dominates()` and `strictlyDominates()`.
@@ -562,7 +513,7 @@ bool RAPass::_strictlyDominates(const RABlock* a, const RABlock* b) const noexce
return iDom != entryBlock;
}
-const RABlock* RAPass::_nearestCommonDominator(const RABlock* a, const RABlock* b) const noexcept {
+const RABlock* BaseRAPass::_nearestCommonDominator(const RABlock* a, const RABlock* b) const noexcept {
ASMJIT_ASSERT(a != nullptr); // There must be at least one block if this function is
ASMJIT_ASSERT(b != nullptr); // called, as both `a` and `b` must be valid blocks.
ASMJIT_ASSERT(a != b); // Checked by `dominates()` and `properlyDominates()`.
@@ -599,11 +550,10 @@ const RABlock* RAPass::_nearestCommonDominator(const RABlock* a, const RABlock*
return entryBlock;
}
-// ============================================================================
-// [asmjit::RAPass - CFG - Utilities]
-// ============================================================================
+// BaseRAPass - CFG - Utilities
+// ============================
-Error RAPass::removeUnreachableBlocks() noexcept {
+Error BaseRAPass::removeUnreachableCode() noexcept {
uint32_t numAllBlocks = blockCount();
uint32_t numReachableBlocks = reachableBlockCount();
@@ -612,8 +562,9 @@ Error RAPass::removeUnreachableBlocks() noexcept {
return kErrorOk;
#ifndef ASMJIT_NO_LOGGING
- Logger* logger = debugLogger();
- ASMJIT_RA_LOG_FORMAT("[RAPass::RemoveUnreachableBlocks (%u of %u unreachable)]\n", numAllBlocks - numReachableBlocks, numAllBlocks);
+ StringTmp<256> sb;
+ Logger* logger = getLoggerIf(DiagnosticOptions::kRADebugUnreachable);
+ ASMJIT_RA_LOG_FORMAT("[RemoveUnreachableCode - detected %u of %u unreachable blocks]\n", numAllBlocks - numReachableBlocks, numAllBlocks);
#endif
for (uint32_t i = 0; i < numAllBlocks; i++) {
@@ -621,7 +572,7 @@ Error RAPass::removeUnreachableBlocks() noexcept {
if (block->isReachable())
continue;
- ASMJIT_RA_LOG_FORMAT(" Removing block {%u}\n", i);
+ ASMJIT_RA_LOG_FORMAT(" Removing code from unreachable block {%u}\n", i);
BaseNode* first = block->first();
BaseNode* last = block->last();
@@ -632,8 +583,16 @@ Error RAPass::removeUnreachableBlocks() noexcept {
while (node != afterLast) {
BaseNode* next = node->next();
- if (node->isCode() || node->isRemovable())
+ if (node->isCode() || node->isRemovable()) {
+#ifndef ASMJIT_NO_LOGGING
+ if (logger) {
+ sb.clear();
+ Formatter::formatNode(sb, _formatOptions, cc(), node);
+ logger->logf(" %s\n", sb.data());
+ }
+#endif
cc()->removeNode(node);
+ }
node = next;
}
@@ -650,13 +609,13 @@ Error RAPass::removeUnreachableBlocks() noexcept {
return kErrorOk;
}
-BaseNode* RAPass::findSuccessorStartingAt(BaseNode* node) noexcept {
+BaseNode* BaseRAPass::findSuccessorStartingAt(BaseNode* node) noexcept {
while (node && (node->isInformative() || node->hasNoEffect()))
node = node->next();
return node;
}
-bool RAPass::isNextTo(BaseNode* node, BaseNode* target) noexcept {
+bool BaseRAPass::isNextTo(BaseNode* node, BaseNode* target) noexcept {
for (;;) {
node = node->next();
if (node == target)
@@ -670,16 +629,15 @@ bool RAPass::isNextTo(BaseNode* node, BaseNode* target) noexcept {
}
}
-// ============================================================================
-// [asmjit::RAPass - ?]
-// ============================================================================
+// BaseRAPass - Registers - VirtReg / WorkReg Mapping
+// ==================================================
-Error RAPass::_asWorkReg(VirtReg* vReg, RAWorkReg** out) noexcept {
+Error BaseRAPass::_asWorkReg(VirtReg* vReg, RAWorkReg** out) noexcept {
// Checked by `asWorkReg()` - must be true.
ASMJIT_ASSERT(vReg->_workReg == nullptr);
- uint32_t group = vReg->group();
- ASMJIT_ASSERT(group < BaseReg::kGroupVirt);
+ RegGroup group = vReg->group();
+ ASMJIT_ASSERT(group <= RegGroup::kMaxVirt);
RAWorkRegs& wRegs = workRegs();
RAWorkRegs& wRegsByGroup = workRegs(group);
@@ -704,7 +662,7 @@ Error RAPass::_asWorkReg(VirtReg* vReg, RAWorkReg** out) noexcept {
return kErrorOk;
}
-RAAssignment::WorkToPhysMap* RAPass::newWorkToPhysMap() noexcept {
+RAAssignment::WorkToPhysMap* BaseRAPass::newWorkToPhysMap() noexcept {
uint32_t count = workRegCount();
size_t size = WorkToPhysMap::sizeOf(count);
@@ -723,7 +681,7 @@ RAAssignment::WorkToPhysMap* RAPass::newWorkToPhysMap() noexcept {
return map;
}
-RAAssignment::PhysToWorkMap* RAPass::newPhysToWorkMap() noexcept {
+RAAssignment::PhysToWorkMap* BaseRAPass::newPhysToWorkMap() noexcept {
uint32_t count = physRegTotal();
size_t size = PhysToWorkMap::sizeOf(count);
@@ -735,22 +693,21 @@ RAAssignment::PhysToWorkMap* RAPass::newPhysToWorkMap() noexcept {
return map;
}
-// ============================================================================
-// [asmjit::RAPass - Registers - Liveness Analysis and Statistics]
-// ============================================================================
+// BaseRAPass - Registers - Liveness Analysis and Statistics
+// =========================================================
namespace LiveOps {
typedef ZoneBitVector::BitWord BitWord;
struct In {
- static ASMJIT_INLINE BitWord op(BitWord dst, BitWord out, BitWord gen, BitWord kill) noexcept {
+ static ASMJIT_FORCE_INLINE BitWord op(BitWord dst, BitWord out, BitWord gen, BitWord kill) noexcept {
DebugUtils::unused(dst);
return (out | gen) & ~kill;
}
};
template<typename Operator>
- static ASMJIT_INLINE bool op(BitWord* dst, const BitWord* a, uint32_t n) noexcept {
+ static ASMJIT_FORCE_INLINE bool op(BitWord* dst, const BitWord* a, uint32_t n) noexcept {
BitWord changed = 0;
for (uint32_t i = 0; i < n; i++) {
@@ -765,7 +722,7 @@ namespace LiveOps {
}
template<typename Operator>
- static ASMJIT_INLINE bool op(BitWord* dst, const BitWord* a, const BitWord* b, uint32_t n) noexcept {
+ static ASMJIT_FORCE_INLINE bool op(BitWord* dst, const BitWord* a, const BitWord* b, uint32_t n) noexcept {
BitWord changed = 0;
for (uint32_t i = 0; i < n; i++) {
@@ -780,7 +737,7 @@ namespace LiveOps {
}
template<typename Operator>
- static ASMJIT_INLINE bool op(BitWord* dst, const BitWord* a, const BitWord* b, const BitWord* c, uint32_t n) noexcept {
+ static ASMJIT_FORCE_INLINE bool op(BitWord* dst, const BitWord* a, const BitWord* b, const BitWord* c, uint32_t n) noexcept {
BitWord changed = 0;
for (uint32_t i = 0; i < n; i++) {
@@ -794,7 +751,7 @@ namespace LiveOps {
return changed != 0;
}
- static ASMJIT_INLINE bool recalcInOut(RABlock* block, uint32_t numBitWords, bool initial = false) noexcept {
+ static ASMJIT_FORCE_INLINE bool recalcInOut(RABlock* block, uint32_t numBitWords, bool initial = false) noexcept {
bool changed = initial;
const RABlocks& successors = block->successors();
@@ -812,13 +769,13 @@ namespace LiveOps {
}
}
-ASMJIT_FAVOR_SPEED Error RAPass::buildLiveness() noexcept {
+ASMJIT_FAVOR_SPEED Error BaseRAPass::buildLiveness() noexcept {
#ifndef ASMJIT_NO_LOGGING
- Logger* logger = debugLogger();
+ Logger* logger = getLoggerIf(DiagnosticOptions::kRADebugLiveness);
StringTmp<512> sb;
#endif
- ASMJIT_RA_LOG_FORMAT("[RAPass::BuildLiveness]\n");
+ ASMJIT_RA_LOG_FORMAT("[BuildLiveness]\n");
uint32_t i;
@@ -842,9 +799,8 @@ ASMJIT_FAVOR_SPEED Error RAPass::buildLiveness() noexcept {
ASMJIT_PROPAGATE(nOutsPerWorkReg.resize(allocator(), numWorkRegs));
ASMJIT_PROPAGATE(nInstsPerBlock.resize(allocator(), numAllBlocks));
- // --------------------------------------------------------------------------
- // Calculate GEN/KILL of each block.
- // --------------------------------------------------------------------------
+ // Calculate GEN/KILL of Each Block
+ // --------------------------------
for (i = 0; i < numReachableBlocks; i++) {
RABlock* block = _pov[i];
@@ -875,9 +831,9 @@ ASMJIT_FAVOR_SPEED Error RAPass::buildLiveness() noexcept {
// KILL - if this VirtReg is killed afterwards.
// LAST - if this VirtReg is last in this basic block.
if (block->kill().bitAt(workId))
- tiedReg->addFlags(RATiedReg::kKill);
+ tiedReg->addFlags(RATiedFlags::kKill);
else if (!block->gen().bitAt(workId))
- tiedReg->addFlags(RATiedReg::kLast);
+ tiedReg->addFlags(RATiedFlags::kLast);
if (tiedReg->isWriteOnly()) {
// KILL.
@@ -888,6 +844,16 @@ ASMJIT_FAVOR_SPEED Error RAPass::buildLiveness() noexcept {
block->kill().setBit(workId, false);
block->gen().setBit(workId, true);
}
+
+ if (tiedReg->isLeadConsecutive()) {
+ RAWorkReg* workReg = workRegById(workId);
+ workReg->markLeadConsecutive();
+ }
+
+ if (tiedReg->hasConsecutiveParent()) {
+ RAWorkReg* consecutiveParentReg = workRegById(tiedReg->consecutiveParent());
+ consecutiveParentReg->addImmediateConsecutive(allocator(), workId);
+ }
}
nInsts++;
@@ -903,9 +869,8 @@ ASMJIT_FAVOR_SPEED Error RAPass::buildLiveness() noexcept {
nInstsPerBlock[block->blockId()] = nInsts;
}
- // --------------------------------------------------------------------------
- // Calculate IN/OUT of each block.
- // --------------------------------------------------------------------------
+ // Calculate IN/OUT of Each Block
+ // ------------------------------
{
ZoneStack<RABlock*> workList;
@@ -956,9 +921,8 @@ ASMJIT_FAVOR_SPEED Error RAPass::buildLiveness() noexcept {
}
});
- // --------------------------------------------------------------------------
- // Reserve the space in each `RAWorkReg` for references.
- // --------------------------------------------------------------------------
+ // Reserve the space in each `RAWorkReg` for references
+ // ----------------------------------------------------
for (i = 0; i < numWorkRegs; i++) {
RAWorkReg* workReg = workRegById(i);
@@ -966,9 +930,8 @@ ASMJIT_FAVOR_SPEED Error RAPass::buildLiveness() noexcept {
ASMJIT_PROPAGATE(workReg->_writes.reserve(allocator(), nOutsPerWorkReg[i]));
}
- // --------------------------------------------------------------------------
- // Assign block and instruction positions, build LiveCount and LiveSpans.
- // --------------------------------------------------------------------------
+ // Assign block and instruction positions, build LiveCount and LiveSpans
+ // ---------------------------------------------------------------------
uint32_t position = 2;
for (i = 0; i < numAllBlocks; i++) {
@@ -1016,17 +979,17 @@ ASMJIT_FAVOR_SPEED Error RAPass::buildLiveness() noexcept {
if (tiedReg->isWrite())
workReg->_writes.appendUnsafe(node);
- // We couldn't calculate this in previous steps, but since we know all LIVE-OUT
- // at this point it becomes trivial. If this is the last instruction that uses
- // this `workReg` and it's not LIVE-OUT then it is KILLed here.
+ // We couldn't calculate this in previous steps, but since we know all LIVE-OUT at this point it becomes
+ // trivial. If this is the last instruction that uses this `workReg` and it's not LIVE-OUT then it is
+ // KILLed here.
if (tiedReg->isLast() && !block->liveOut().bitAt(workId))
- tiedReg->addFlags(RATiedReg::kKill);
+ tiedReg->addFlags(RATiedFlags::kKill);
LiveRegSpans& liveSpans = workReg->liveSpans();
bool wasOpen;
ASMJIT_PROPAGATE(liveSpans.openAt(allocator(), position + !tiedReg->isRead(), endPosition, wasOpen));
- uint32_t group = workReg->group();
+ RegGroup group = workReg->group();
if (!wasOpen) {
curLiveCount[group]++;
raInst->_liveCount[group]++;
@@ -1037,16 +1000,30 @@ ASMJIT_FAVOR_SPEED Error RAPass::buildLiveness() noexcept {
curLiveCount[group]--;
}
- // Update `RAWorkReg::hintRegId`.
- if (tiedReg->hasUseId() && !workReg->hasHintRegId()) {
+ // Update `RAWorkReg::useIdMask` and `RAWorkReg::hintRegId`.
+ if (tiedReg->hasUseId()) {
uint32_t useId = tiedReg->useId();
- if (!(raInst->_clobberedRegs[group] & Support::bitMask(useId)))
+ workReg->addUseIdMask(Support::bitMask(useId));
+ if (!workReg->hasHintRegId() && !Support::bitTest(raInst->_clobberedRegs[group], useId))
workReg->setHintRegId(useId);
}
+ if (tiedReg->useRegMask()) {
+ workReg->restrictPreferredMask(tiedReg->useRegMask());
+ if (workReg->isLeadConsecutive())
+ workReg->restrictConsecutiveMask(tiedReg->useRegMask());
+ }
+
+ if (tiedReg->outRegMask()) {
+ workReg->restrictPreferredMask(tiedReg->outRegMask());
+ if (workReg->isLeadConsecutive())
+ workReg->restrictConsecutiveMask(tiedReg->outRegMask());
+ }
+
// Update `RAWorkReg::clobberedSurvivalMask`.
- if (raInst->_clobberedRegs[group] && !tiedReg->isOutOrKill())
+ if (raInst->_clobberedRegs[group] && !tiedReg->isOutOrKill()) {
workReg->addClobberSurvivalMask(raInst->_clobberedRegs[group]);
+ }
}
position += 2;
@@ -1065,9 +1042,8 @@ ASMJIT_FAVOR_SPEED Error RAPass::buildLiveness() noexcept {
ASMJIT_ASSERT(position == block->endPosition());
}
- // --------------------------------------------------------------------------
- // Calculate WorkReg statistics.
- // --------------------------------------------------------------------------
+ // Calculate WorkReg statistics
+ // ----------------------------
for (i = 0; i < numWorkRegs; i++) {
RAWorkReg* workReg = _workRegs[i];
@@ -1095,37 +1071,45 @@ ASMJIT_FAVOR_SPEED Error RAPass::buildLiveness() noexcept {
return kErrorOk;
}
-Error RAPass::assignArgIndexToWorkRegs() noexcept {
+Error BaseRAPass::assignArgIndexToWorkRegs() noexcept {
ZoneBitVector& liveIn = entryBlock()->liveIn();
uint32_t argCount = func()->argCount();
- for (uint32_t i = 0; i < argCount; i++) {
- // Unassigned argument.
- VirtReg* virtReg = func()->arg(i);
- if (!virtReg) continue;
+ for (uint32_t argIndex = 0; argIndex < argCount; argIndex++) {
+ for (uint32_t valueIndex = 0; valueIndex < Globals::kMaxValuePack; valueIndex++) {
+ // Unassigned argument.
+ const RegOnly& regArg = func()->argPack(argIndex)[valueIndex];
+ if (!regArg.isReg() || !cc()->isVirtIdValid(regArg.id()))
+ continue;
+
+ VirtReg* virtReg = cc()->virtRegById(regArg.id());
+ if (!virtReg)
+ continue;
- // Unreferenced argument.
- RAWorkReg* workReg = virtReg->workReg();
- if (!workReg) continue;
+ // Unreferenced argument.
+ RAWorkReg* workReg = virtReg->workReg();
+ if (!workReg)
+ continue;
- // Overwritten argument.
- uint32_t workId = workReg->workId();
- if (!liveIn.bitAt(workId))
- continue;
+ // Overwritten argument.
+ uint32_t workId = workReg->workId();
+ if (!liveIn.bitAt(workId))
+ continue;
- workReg->setArgIndex(i);
+ workReg->setArgIndex(argIndex, valueIndex);
+ const FuncValue& arg = func()->detail().arg(argIndex, valueIndex);
- const FuncValue& arg = func()->detail().arg(i);
- if (arg.isReg() && _archRegsInfo->regInfo[arg.regType()].group() == workReg->group()) {
- workReg->setHintRegId(arg.regId());
+ if (arg.isReg() && _archTraits->regTypeToGroup(arg.regType()) == workReg->group()) {
+ workReg->setHintRegId(arg.regId());
+ }
}
}
return kErrorOk;
}
-// ============================================================================
-// [asmjit::RAPass - Allocation - Global]
-// ============================================================================
+
+// BaseRAPass - Allocation - Global
+// ================================
#ifndef ASMJIT_NO_LOGGING
static void RAPass_dumpSpans(String& sb, uint32_t index, const LiveRegSpans& liveSpans) noexcept {
@@ -1141,26 +1125,29 @@ static void RAPass_dumpSpans(String& sb, uint32_t index, const LiveRegSpans& liv
}
#endif
-Error RAPass::runGlobalAllocator() noexcept {
+Error BaseRAPass::runGlobalAllocator() noexcept {
ASMJIT_PROPAGATE(initGlobalLiveSpans());
- for (uint32_t group = 0; group < BaseReg::kGroupVirt; group++) {
+ for (RegGroup group : RegGroupVirtValues{}) {
ASMJIT_PROPAGATE(binPack(group));
}
return kErrorOk;
}
-ASMJIT_FAVOR_SPEED Error RAPass::initGlobalLiveSpans() noexcept {
- for (uint32_t group = 0; group < BaseReg::kGroupVirt; group++) {
+ASMJIT_FAVOR_SPEED Error BaseRAPass::initGlobalLiveSpans() noexcept {
+ for (RegGroup group : RegGroupVirtValues{}) {
size_t physCount = _physRegCount[group];
- LiveRegSpans* liveSpans = allocator()->allocT<LiveRegSpans>(physCount * sizeof(LiveRegSpans));
+ LiveRegSpans* liveSpans = nullptr;
- if (ASMJIT_UNLIKELY(!liveSpans))
- return DebugUtils::errored(kErrorOutOfMemory);
+ if (physCount) {
+ liveSpans = allocator()->allocT<LiveRegSpans>(physCount * sizeof(LiveRegSpans));
+ if (ASMJIT_UNLIKELY(!liveSpans))
+ return DebugUtils::errored(kErrorOutOfMemory);
- for (size_t physId = 0; physId < physCount; physId++)
- new(&liveSpans[physId]) LiveRegSpans();
+ for (size_t physId = 0; physId < physCount; physId++)
+ new(&liveSpans[physId]) LiveRegSpans();
+ }
_globalLiveSpans[group] = liveSpans;
}
@@ -1168,24 +1155,31 @@ ASMJIT_FAVOR_SPEED Error RAPass::initGlobalLiveSpans() noexcept {
return kErrorOk;
}
-ASMJIT_FAVOR_SPEED Error RAPass::binPack(uint32_t group) noexcept {
+struct RAConsecutiveReg {
+ RAWorkReg* workReg;
+ RAWorkReg* parentReg;
+};
+
+ASMJIT_FAVOR_SPEED Error BaseRAPass::binPack(RegGroup group) noexcept {
if (workRegCount(group) == 0)
return kErrorOk;
#ifndef ASMJIT_NO_LOGGING
- Logger* logger = debugLogger();
+ Logger* logger = getLoggerIf(DiagnosticOptions::kRADebugAssignment);
StringTmp<512> sb;
- ASMJIT_RA_LOG_FORMAT("[RAPass::BinPack] Available=%u (0x%08X) Count=%u\n",
+ ASMJIT_RA_LOG_FORMAT("[BinPack] Available=%u (0x%08X) Count=%u RegGroup=%u\n",
Support::popcnt(_availableRegs[group]),
_availableRegs[group],
- workRegCount(group));
+ workRegCount(group),
+ uint32_t(group));
#endif
uint32_t i;
uint32_t physCount = _physRegCount[group];
RAWorkRegs workRegs;
+ ZoneVector<RAConsecutiveReg> consecutiveRegs;
LiveRegSpans tmpSpans;
ASMJIT_PROPAGATE(workRegs.concat(allocator(), this->workRegs(group)));
@@ -1194,28 +1188,35 @@ ASMJIT_FAVOR_SPEED Error RAPass::binPack(uint32_t group) noexcept {
});
uint32_t numWorkRegs = workRegs.size();
- uint32_t availableRegs = _availableRegs[group];
+ RegMask availableRegs = _availableRegs[group];
- // First try to pack everything that provides register-id hint as these are
- // most likely function arguments and fixed (precolored) virtual registers.
+ // First try to pack everything that provides register-id hint as these are most likely function arguments and fixed
+ // (precolored) virtual registers.
if (!workRegs.empty()) {
uint32_t dstIndex = 0;
for (i = 0; i < numWorkRegs; i++) {
RAWorkReg* workReg = workRegs[i];
+
+ if (workReg->isLeadConsecutive()) {
+ ASMJIT_PROPAGATE(consecutiveRegs.append(allocator(), RAConsecutiveReg{workReg, nullptr}));
+ workReg->markProcessedConsecutive();
+ }
+
if (workReg->hasHintRegId()) {
uint32_t physId = workReg->hintRegId();
- if (availableRegs & Support::bitMask(physId)) {
+ if (Support::bitTest(availableRegs, physId)) {
LiveRegSpans& live = _globalLiveSpans[group][physId];
Error err = tmpSpans.nonOverlappingUnionOf(allocator(), live, workReg->liveSpans(), LiveRegData(workReg->virtId()));
if (err == kErrorOk) {
- workReg->setHomeRegId(physId);
live.swap(tmpSpans);
+ workReg->setHomeRegId(physId);
+ workReg->markAllocated();
continue;
}
- if (ASMJIT_UNLIKELY(err != 0xFFFFFFFFu))
+ if (err != 0xFFFFFFFFu)
return err;
}
}
@@ -1227,18 +1228,108 @@ ASMJIT_FAVOR_SPEED Error RAPass::binPack(uint32_t group) noexcept {
numWorkRegs = dstIndex;
}
+ // Allocate consecutive registers - both leads and all consecutives. This is important and prioritized over the rest,
+ // because once a lead is allocated we really need to allocate its consecutives, otherwise we may bin pack other
+ // registers into their places, which would result in wrong hints to the local allocator, and then into many moves
+ // or spills.
+ if (!consecutiveRegs.empty()) {
+ // This loop appends all other consecutive registers into `consecutiveRegs` array. Leads are at the beginning,
+ // non-leads follow.
+ i = 0;
+ for (;;) {
+ uint32_t stop = consecutiveRegs.size();
+ if (i == stop)
+ break;
+
+ while (i < stop) {
+ RAWorkReg* workReg = consecutiveRegs[i].workReg;
+ if (workReg->hasImmediateConsecutives()) {
+ ZoneBitVector::ForEachBitSet it(workReg->immediateConsecutives());
+ while (it.hasNext()) {
+ uint32_t consecutiveWorkId = uint32_t(it.next());
+ RAWorkReg* consecutiveReg = workRegById(consecutiveWorkId);
+ if (!consecutiveReg->isProcessedConsecutive()) {
+ ASMJIT_PROPAGATE(consecutiveRegs.append(allocator(), RAConsecutiveReg{consecutiveReg, workReg}));
+ consecutiveReg->markProcessedConsecutive();
+ }
+ }
+ }
+ i++;
+ }
+ }
+
+ uint32_t numConsecutiveRegs = consecutiveRegs.size();
+ for (i = 0; i < numConsecutiveRegs; i++) {
+ RAWorkReg* workReg = consecutiveRegs[i].workReg;
+ if (workReg->isAllocated())
+ continue;
+
+ RAWorkReg* parentReg = consecutiveRegs[i].parentReg;
+ RegMask physRegs = 0;
+
+ if (!parentReg) {
+ physRegs = availableRegs & workReg->preferredMask();
+ if (!physRegs) {
+ physRegs = availableRegs & workReg->consecutiveMask();
+
+ // NOTE: This should never be true as it would mean we would never allocate this virtual register
+ // (not here, and not later when local register allocator processes RATiedReg sets).
+ if (ASMJIT_UNLIKELY(!physRegs))
+ return DebugUtils::errored(kErrorConsecutiveRegsAllocation);
+ }
+ }
+ else if (parentReg->hasHomeRegId()) {
+ uint32_t consecutiveId = parentReg->homeRegId() + 1;
+
+ // NOTE: We don't support wrapping. If this goes beyond all allocable registers there is something wrong.
+ if (consecutiveId > 31 || !Support::bitTest(availableRegs, consecutiveId))
+ return DebugUtils::errored(kErrorConsecutiveRegsAllocation);
+
+ workReg->setHintRegId(consecutiveId);
+ physRegs = Support::bitMask(consecutiveId);
+ }
+
+ while (physRegs) {
+ uint32_t physId = Support::bitSizeOf<RegMask>() - 1 - Support::clz(physRegs);
+
+ LiveRegSpans& live = _globalLiveSpans[group][physId];
+ Error err = tmpSpans.nonOverlappingUnionOf(allocator(), live, workReg->liveSpans(), LiveRegData(workReg->virtId()));
+
+ if (err == kErrorOk) {
+ workReg->setHomeRegId(physId);
+ workReg->markAllocated();
+ live.swap(tmpSpans);
+ break;
+ }
+
+ if (ASMJIT_UNLIKELY(err != 0xFFFFFFFFu))
+ return err;
+
+ physRegs ^= Support::bitMask(physId);
+ }
+ }
+ }
+
// Try to pack the rest.
if (!workRegs.empty()) {
uint32_t dstIndex = 0;
for (i = 0; i < numWorkRegs; i++) {
RAWorkReg* workReg = workRegs[i];
- uint32_t physRegs = availableRegs;
+
+ if (workReg->isAllocated())
+ continue;
+
+ RegMask physRegs = availableRegs;
+ if (physRegs & workReg->preferredMask())
+ physRegs &= workReg->preferredMask();
while (physRegs) {
- uint32_t physId = Support::ctz(physRegs);
+ RegMask preferredMask = physRegs;
+ uint32_t physId = Support::ctz(preferredMask);
+
if (workReg->clobberSurvivalMask()) {
- uint32_t preferredMask = physRegs & workReg->clobberSurvivalMask();
+ preferredMask &= workReg->clobberSurvivalMask();
if (preferredMask)
physId = Support::ctz(preferredMask);
}
@@ -1248,6 +1339,7 @@ ASMJIT_FAVOR_SPEED Error RAPass::binPack(uint32_t group) noexcept {
if (err == kErrorOk) {
workReg->setHomeRegId(physId);
+ workReg->markAllocated();
live.swap(tmpSpans);
break;
}
@@ -1286,7 +1378,7 @@ ASMJIT_FAVOR_SPEED Error RAPass::binPack(uint32_t group) noexcept {
ASMJIT_RA_LOG_FORMAT(" Completed.\n");
}
else {
- _strategy[group].setType(RAStrategy::kStrategyComplex);
+ _strategy[group].setType(RAStrategyType::kComplex);
for (RAWorkReg* workReg : workRegs)
workReg->markStackPreferred();
@@ -1307,11 +1399,10 @@ ASMJIT_FAVOR_SPEED Error RAPass::binPack(uint32_t group) noexcept {
return kErrorOk;
}
-// ============================================================================
-// [asmjit::RAPass - Allocation - Local]
-// ============================================================================
+// BaseRAPass - Allocation - Local
+// ===============================
-Error RAPass::runLocalAllocator() noexcept {
+Error BaseRAPass::runLocalAllocator() noexcept {
RALocalAllocator lra(this);
ASMJIT_PROPAGATE(lra.init());
@@ -1332,9 +1423,8 @@ Error RAPass::runLocalAllocator() noexcept {
lra.makeInitialAssignment();
ASMJIT_PROPAGATE(setBlockEntryAssignment(block, block, lra._curAssignment));
- // The loop starts from the first block and iterates blocks in order, however,
- // the algorithm also allows to jump to any other block when finished if it's
- // a jump target. In-order iteration just makes sure that all blocks are visited.
+ // The loop starts from the first block and iterates blocks in order, however, the algorithm also allows to jump to
+ // any other block when finished if it's a jump target. In-order iteration just makes sure that all blocks are visited.
for (;;) {
BaseNode* first = block->first();
BaseNode* last = block->last();
@@ -1380,8 +1470,8 @@ Error RAPass::runLocalAllocator() noexcept {
}
ASMJIT_PROPAGATE(lra.allocInst(inst));
- if (inst->type() == BaseNode::kNodeInvoke)
- ASMJIT_PROPAGATE(onEmitPreCall(inst->as<InvokeNode>()));
+ if (inst->type() == NodeType::kInvoke)
+ ASMJIT_PROPAGATE(emitPreCall(inst->as<InvokeNode>()));
else
ASMJIT_PROPAGATE(lra.spillAfterAllocation(inst));
}
@@ -1443,13 +1533,12 @@ Error RAPass::runLocalAllocator() noexcept {
return kErrorOk;
}
-Error RAPass::setBlockEntryAssignment(RABlock* block, const RABlock* fromBlock, const RAAssignment& fromAssignment) noexcept {
+Error BaseRAPass::setBlockEntryAssignment(RABlock* block, const RABlock* fromBlock, const RAAssignment& fromAssignment) noexcept {
if (block->hasSharedAssignmentId()) {
uint32_t sharedAssignmentId = block->sharedAssignmentId();
- // Shouldn't happen. Entry assignment of a block that has a shared-state
- // will assign to all blocks with the same sharedAssignmentId. It's a bug if
- // the shared state has been already assigned.
+ // Shouldn't happen. Entry assignment of a block that has a shared-state will assign to all blocks
+ // with the same sharedAssignmentId. It's a bug if the shared state has been already assigned.
if (!_sharedAssignments[sharedAssignmentId].empty())
return DebugUtils::errored(kErrorInvalidState);
@@ -1488,7 +1577,7 @@ Error RAPass::setBlockEntryAssignment(RABlock* block, const RABlock* fromBlock,
uint32_t workId = uint32_t(it.next());
RAWorkReg* workReg = workRegById(workId);
- uint32_t group = workReg->group();
+ RegGroup group = workReg->group();
uint32_t physId = as.workToPhysId(group, workId);
if (physId != RAAssignment::kPhysNone)
@@ -1499,7 +1588,7 @@ Error RAPass::setBlockEntryAssignment(RABlock* block, const RABlock* fromBlock,
return blockEntryAssigned(as);
}
-Error RAPass::setSharedAssignment(uint32_t sharedAssignmentId, const RAAssignment& fromAssignment) noexcept {
+Error BaseRAPass::setSharedAssignment(uint32_t sharedAssignmentId, const RAAssignment& fromAssignment) noexcept {
ASMJIT_ASSERT(_sharedAssignments[sharedAssignmentId].empty());
PhysToWorkMap* physToWorkMap = clonePhysToWorkMap(fromAssignment.physToWorkMap());
@@ -1515,7 +1604,7 @@ Error RAPass::setSharedAssignment(uint32_t sharedAssignmentId, const RAAssignmen
RAAssignment as;
as.initLayout(_physRegCount, workRegs());
- uint32_t sharedAssigned[BaseReg::kGroupVirt] {};
+ Support::Array<uint32_t, Globals::kNumVirtGroups> sharedAssigned {};
for (RABlock* block : blocks()) {
if (block->sharedAssignmentId() == sharedAssignmentId) {
@@ -1533,9 +1622,9 @@ Error RAPass::setSharedAssignment(uint32_t sharedAssignmentId, const RAAssignmen
const ZoneBitVector& liveIn = block->liveIn();
sharedLiveIn.or_(liveIn);
- for (uint32_t group = 0; group < BaseReg::kGroupVirt; group++) {
+ for (RegGroup group : RegGroupVirtValues{}) {
sharedAssigned[group] |= entryPhysToWorkMap->assigned[group];
- Support::BitWordIterator<uint32_t> it(entryPhysToWorkMap->assigned[group]);
+ Support::BitWordIterator<RegMask> it(entryPhysToWorkMap->assigned[group]);
while (it.hasNext()) {
uint32_t physId = it.next();
@@ -1551,8 +1640,8 @@ Error RAPass::setSharedAssignment(uint32_t sharedAssignmentId, const RAAssignmen
{
as.initMaps(physToWorkMap, workToPhysMap);
- for (uint32_t group = 0; group < BaseReg::kGroupVirt; group++) {
- Support::BitWordIterator<uint32_t> it(_availableRegs[group] & ~sharedAssigned[group]);
+ for (RegGroup group : RegGroupVirtValues{}) {
+ Support::BitWordIterator<RegMask> it(_availableRegs[group] & ~sharedAssigned[group]);
while (it.hasNext()) {
uint32_t physId = it.next();
@@ -1567,14 +1656,13 @@ Error RAPass::setSharedAssignment(uint32_t sharedAssignmentId, const RAAssignmen
return blockEntryAssigned(as);
}
-Error RAPass::blockEntryAssigned(const RAAssignment& as) noexcept {
- // Complex allocation strategy requires to record register assignments upon
- // block entry (or per shared state).
- for (uint32_t group = 0; group < BaseReg::kGroupVirt; group++) {
+Error BaseRAPass::blockEntryAssigned(const RAAssignment& as) noexcept {
+ // Complex allocation strategy requires to record register assignments upon block entry (or per shared state).
+ for (RegGroup group : RegGroupVirtValues{}) {
if (!_strategy[group].isComplex())
continue;
- Support::BitWordIterator<uint32_t> it(as.assigned(group));
+ Support::BitWordIterator<RegMask> it(as.assigned(group));
while (it.hasNext()) {
uint32_t physId = it.next();
uint32_t workId = as.physToWorkId(group, physId);
@@ -1587,11 +1675,10 @@ Error RAPass::blockEntryAssigned(const RAAssignment& as) noexcept {
return kErrorOk;
}
-// ============================================================================
-// [asmjit::RAPass - Allocation - Utilities]
-// ============================================================================
+// BaseRAPass - Allocation - Utilities
+// ===================================
-Error RAPass::useTemporaryMem(BaseMem& out, uint32_t size, uint32_t alignment) noexcept {
+Error BaseRAPass::useTemporaryMem(BaseMem& out, uint32_t size, uint32_t alignment) noexcept {
ASMJIT_ASSERT(alignment <= 64);
if (_temporaryMem.isNone()) {
@@ -1611,22 +1698,19 @@ Error RAPass::useTemporaryMem(BaseMem& out, uint32_t size, uint32_t alignment) n
return kErrorOk;
}
-// ============================================================================
-// [asmjit::RAPass - Allocation - Prolog / Epilog]
-// ============================================================================
+// BaseRAPass - Allocation - Prolog & Epilog
+// =========================================
-Error RAPass::updateStackFrame() noexcept {
- // Update some StackFrame information that we updated during allocation. The
- // only information we don't have at the moment is final local stack size,
- // which is calculated last.
+Error BaseRAPass::updateStackFrame() noexcept {
+ // Update some StackFrame information that we updated during allocation. The only information we don't have at the
+ // moment is final local stack size, which is calculated last.
FuncFrame& frame = func()->frame();
- for (uint32_t group = 0; group < BaseReg::kGroupVirt; group++)
+ for (RegGroup group : RegGroupVirtValues{})
frame.addDirtyRegs(group, _clobberedRegs[group]);
frame.setLocalStackAlignment(_stackAllocator.alignment());
- // If there are stack arguments that are not assigned to registers upon entry
- // and the function doesn't require dynamic stack alignment we keep these
- // arguments where they are. This will also mark all stack slots that match
+ // If there are stack arguments that are not assigned to registers upon entry and the function doesn't require
+ // dynamic stack alignment we keep these arguments where they are. This will also mark all stack slots that match
// these arguments as allocated.
if (_numStackArgsToStackSlots)
ASMJIT_PROPAGATE(_markStackArgsToKeep());
@@ -1635,8 +1719,8 @@ Error RAPass::updateStackFrame() noexcept {
ASMJIT_PROPAGATE(_stackAllocator.calculateStackFrame());
frame.setLocalStackSize(_stackAllocator.stackSize());
- // Update the stack frame based on `_argsAssignment` and finalize it.
- // Finalization means to apply final calculation to the stack layout.
+ // Update the stack frame based on `_argsAssignment` and finalize it. Finalization means to apply final calculation
+ // to the stack layout.
ASMJIT_PROPAGATE(_argsAssignment.updateFuncFrame(frame));
ASMJIT_PROPAGATE(frame.finalize());
@@ -1644,16 +1728,15 @@ Error RAPass::updateStackFrame() noexcept {
if (frame.localStackOffset() != 0)
ASMJIT_PROPAGATE(_stackAllocator.adjustSlotOffsets(int32_t(frame.localStackOffset())));
- // Again, if there are stack arguments allocated in function's stack we have
- // to handle them. This handles all cases (either regular or dynamic stack
- // alignment).
+ // Again, if there are stack arguments allocated in function's stack we have to handle them. This handles all cases
+ // (either regular or dynamic stack alignment).
if (_numStackArgsToStackSlots)
ASMJIT_PROPAGATE(_updateStackArgs());
return kErrorOk;
}
-Error RAPass::_markStackArgsToKeep() noexcept {
+Error BaseRAPass::_markStackArgsToKeep() noexcept {
FuncFrame& frame = func()->frame();
bool hasSAReg = frame.hasPreservedFP() || !frame.hasDynamicAlignment();
@@ -1662,29 +1745,27 @@ Error RAPass::_markStackArgsToKeep() noexcept {
for (uint32_t workId = 0; workId < numWorkRegs; workId++) {
RAWorkReg* workReg = workRegs[workId];
- if (workReg->hasFlag(RAWorkReg::kFlagStackArgToStack)) {
+ if (workReg->hasFlag(RAWorkRegFlags::kStackArgToStack)) {
ASMJIT_ASSERT(workReg->hasArgIndex());
const FuncValue& srcArg = _func->detail().arg(workReg->argIndex());
- // If the register doesn't have stack slot then we failed. It doesn't
- // make much sense as it was marked as `kFlagStackArgToStack`, which
- // requires the WorkReg was live-in upon function entry.
+ // If the register doesn't have stack slot then we failed. It doesn't make much sense as it was marked as
+ // `kFlagStackArgToStack`, which requires the WorkReg was live-in upon function entry.
RAStackSlot* slot = workReg->stackSlot();
if (ASMJIT_UNLIKELY(!slot))
return DebugUtils::errored(kErrorInvalidState);
if (hasSAReg && srcArg.isStack() && !srcArg.isIndirect()) {
- uint32_t typeSize = Type::sizeOf(srcArg.typeId());
+ uint32_t typeSize = TypeUtils::sizeOf(srcArg.typeId());
if (typeSize == slot->size()) {
slot->addFlags(RAStackSlot::kFlagStackArg);
continue;
}
}
- // NOTE: Update StackOffset here so when `_argsAssignment.updateFuncFrame()`
- // is called it will take into consideration moving to stack slots. Without
- // this we may miss some scratch registers later.
- FuncValue& dstArg = _argsAssignment.arg(workReg->argIndex());
+ // NOTE: Update StackOffset here so when `_argsAssignment.updateFuncFrame()` is called it will take into
+ // consideration moving to stack slots. Without this we may miss some scratch registers later.
+ FuncValue& dstArg = _argsAssignment.arg(workReg->argIndex(), workReg->argValueIndex());
dstArg.assignStackOffset(0);
}
}
@@ -1692,14 +1773,14 @@ Error RAPass::_markStackArgsToKeep() noexcept {
return kErrorOk;
}
-Error RAPass::_updateStackArgs() noexcept {
+Error BaseRAPass::_updateStackArgs() noexcept {
FuncFrame& frame = func()->frame();
RAWorkRegs& workRegs = _workRegs;
uint32_t numWorkRegs = workRegCount();
for (uint32_t workId = 0; workId < numWorkRegs; workId++) {
RAWorkReg* workReg = workRegs[workId];
- if (workReg->hasFlag(RAWorkReg::kFlagStackArgToStack)) {
+ if (workReg->hasFlag(RAWorkRegFlags::kStackArgToStack)) {
ASMJIT_ASSERT(workReg->hasArgIndex());
RAStackSlot* slot = workReg->stackSlot();
@@ -1717,7 +1798,7 @@ Error RAPass::_updateStackArgs() noexcept {
}
}
else {
- FuncValue& dstArg = _argsAssignment.arg(workReg->argIndex());
+ FuncValue& dstArg = _argsAssignment.arg(workReg->argIndex(), workReg->argValueIndex());
dstArg.setStackOffset(slot->offset());
}
}
@@ -1726,12 +1807,12 @@ Error RAPass::_updateStackArgs() noexcept {
return kErrorOk;
}
-Error RAPass::insertPrologEpilog() noexcept {
+Error BaseRAPass::insertPrologEpilog() noexcept {
FuncFrame& frame = _func->frame();
cc()->_setCursor(func());
ASMJIT_PROPAGATE(cc()->emitProlog(frame));
- ASMJIT_PROPAGATE(cc()->emitArgsAssignment(frame, _argsAssignment));
+ ASMJIT_PROPAGATE(_iEmitHelper->emitArgsAssignment(frame, _argsAssignment));
cc()->_setCursor(func()->exitNode());
ASMJIT_PROPAGATE(cc()->emitEpilog(frame));
@@ -1739,113 +1820,18 @@ Error RAPass::insertPrologEpilog() noexcept {
return kErrorOk;
}
-// ============================================================================
-// [asmjit::RAPass - Rewriter]
-// ============================================================================
-
-Error RAPass::rewrite() noexcept {
-#ifndef ASMJIT_NO_LOGGING
- Logger* logger = debugLogger();
- ASMJIT_RA_LOG_FORMAT("[RAPass::Rewrite]\n");
-#endif
+// BaseRAPass - Rewriter
+// =====================
+Error BaseRAPass::rewrite() noexcept {
return _rewrite(_func, _stop);
}
-ASMJIT_FAVOR_SPEED Error RAPass::_rewrite(BaseNode* first, BaseNode* stop) noexcept {
- uint32_t virtCount = cc()->_vRegArray.size();
-
- BaseNode* node = first;
- while (node != stop) {
- BaseNode* next = node->next();
- if (node->isInst()) {
- InstNode* inst = node->as<InstNode>();
- RAInst* raInst = node->passData<RAInst>();
-
- Operand* operands = inst->operands();
- uint32_t opCount = inst->opCount();
- uint32_t i;
-
- // Rewrite virtual registers into physical registers.
- if (ASMJIT_LIKELY(raInst)) {
- // If the instruction contains pass data (raInst) then it was a subject
- // for register allocation and must be rewritten to use physical regs.
- RATiedReg* tiedRegs = raInst->tiedRegs();
- uint32_t tiedCount = raInst->tiedCount();
-
- for (i = 0; i < tiedCount; i++) {
- RATiedReg* tiedReg = &tiedRegs[i];
-
- Support::BitWordIterator<uint32_t> useIt(tiedReg->useRewriteMask());
- uint32_t useId = tiedReg->useId();
- while (useIt.hasNext()) inst->rewriteIdAtIndex(useIt.next(), useId);
-
- Support::BitWordIterator<uint32_t> outIt(tiedReg->outRewriteMask());
- uint32_t outId = tiedReg->outId();
- while (outIt.hasNext()) inst->rewriteIdAtIndex(outIt.next(), outId);
- }
-
- // This data is allocated by Zone passed to `runOnFunction()`, which
- // will be reset after the RA pass finishes. So reset this data to
- // prevent having a dead pointer after RA pass is complete.
- node->resetPassData();
-
- if (ASMJIT_UNLIKELY(node->type() != BaseNode::kNodeInst)) {
- // FuncRet terminates the flow, it must either be removed if the exit
- // label is next to it (optimization) or patched to an architecture
- // dependent jump instruction that jumps to the function's exit before
- // the epilog.
- if (node->type() == BaseNode::kNodeFuncRet) {
- RABlock* block = raInst->block();
- if (!isNextTo(node, _func->exitNode())) {
- cc()->_setCursor(node->prev());
- ASMJIT_PROPAGATE(onEmitJump(_func->exitNode()->label()));
- }
-
- BaseNode* prev = node->prev();
- cc()->removeNode(node);
- block->setLast(prev);
- }
- }
- }
-
- // Rewrite stack slot addresses.
- for (i = 0; i < opCount; i++) {
- Operand& op = operands[i];
- if (op.isMem()) {
- BaseMem& mem = op.as<BaseMem>();
- if (mem.isRegHome()) {
- uint32_t virtIndex = Operand::virtIdToIndex(mem.baseId());
- if (ASMJIT_UNLIKELY(virtIndex >= virtCount))
- return DebugUtils::errored(kErrorInvalidVirtId);
-
- VirtReg* virtReg = cc()->virtRegByIndex(virtIndex);
- RAWorkReg* workReg = virtReg->workReg();
- ASMJIT_ASSERT(workReg != nullptr);
-
- RAStackSlot* slot = workReg->stackSlot();
- int32_t offset = slot->offset();
-
- mem._setBase(_sp.type(), slot->baseRegId());
- mem.clearRegHome();
- mem.addOffsetLo32(offset);
- }
- }
- }
- }
-
- node = next;
- }
-
- return kErrorOk;
-}
-
-// ============================================================================
-// [asmjit::RAPass - Logging]
-// ============================================================================
+// BaseRAPass - Logging
+// ====================
#ifndef ASMJIT_NO_LOGGING
-static void RAPass_dumpRAInst(RAPass* pass, String& sb, const RAInst* raInst) noexcept {
+static void RAPass_formatLiveness(BaseRAPass* pass, String& sb, const RAInst* raInst) noexcept {
const RATiedReg* tiedRegs = raInst->tiedRegs();
uint32_t tiedCount = raInst->tiedCount();
@@ -1860,16 +1846,25 @@ static void RAPass_dumpRAInst(RAPass* pass, String& sb, const RAInst* raInst) no
tiedReg.isRead() ? 'R' :
tiedReg.isWrite() ? 'W' : '?');
+ if (tiedReg.isLeadConsecutive())
+ sb.appendFormat("|Lead[%u]", tiedReg.consecutiveData() + 1u);
+
if (tiedReg.hasUseId())
sb.appendFormat("|Use=%u", tiedReg.useId());
else if (tiedReg.isUse())
sb.append("|Use");
+ if (tiedReg.isUseConsecutive() && !tiedReg.isLeadConsecutive())
+ sb.appendFormat("+%u", tiedReg.consecutiveData());
+
if (tiedReg.hasOutId())
sb.appendFormat("|Out=%u", tiedReg.outId());
else if (tiedReg.isOut())
sb.append("|Out");
+ if (tiedReg.isOutConsecutive() && !tiedReg.isLeadConsecutive())
+ sb.appendFormat("+%u", tiedReg.consecutiveData());
+
if (tiedReg.isLast())
sb.append("|Last");
@@ -1880,8 +1875,7 @@ static void RAPass_dumpRAInst(RAPass* pass, String& sb, const RAInst* raInst) no
}
}
-ASMJIT_FAVOR_SIZE Error RAPass::annotateCode() noexcept {
- uint32_t loggerFlags = _loggerFlags;
+ASMJIT_FAVOR_SIZE Error BaseRAPass::annotateCode() noexcept {
StringTmp<1024> sb;
for (const RABlock* block : _blocks) {
@@ -1891,21 +1885,18 @@ ASMJIT_FAVOR_SIZE Error RAPass::annotateCode() noexcept {
BaseNode* last = block->last();
for (;;) {
sb.clear();
- Formatter::formatNode(sb, loggerFlags, cc(), node);
+ Formatter::formatNode(sb, _formatOptions, cc(), node);
- if ((loggerFlags & FormatOptions::kFlagDebugRA) != 0 && node->isInst() && node->hasPassData()) {
+ if (hasDiagnosticOption(DiagnosticOptions::kRADebugLiveness) && node->isInst() && node->hasPassData()) {
const RAInst* raInst = node->passData<RAInst>();
if (raInst->tiedCount() > 0) {
sb.padEnd(40);
sb.append(" | ");
- RAPass_dumpRAInst(this, sb, raInst);
+ RAPass_formatLiveness(this, sb, raInst);
}
}
- node->setInlineComment(
- static_cast<char*>(
- cc()->_dataZone.dup(sb.data(), sb.size(), true)));
-
+ node->setInlineComment(static_cast<char*>(cc()->_dataZone.dup(sb.data(), sb.size(), true)));
if (node == last)
break;
node = node->next();
@@ -1915,7 +1906,7 @@ ASMJIT_FAVOR_SIZE Error RAPass::annotateCode() noexcept {
return kErrorOk;
}
-ASMJIT_FAVOR_SIZE Error RAPass::_dumpBlockIds(String& sb, const RABlocks& blocks) noexcept {
+ASMJIT_FAVOR_SIZE Error BaseRAPass::_dumpBlockIds(String& sb, const RABlocks& blocks) noexcept {
for (uint32_t i = 0, size = blocks.size(); i < size; i++) {
const RABlock* block = blocks[i];
if (i != 0)
@@ -1926,7 +1917,7 @@ ASMJIT_FAVOR_SIZE Error RAPass::_dumpBlockIds(String& sb, const RABlocks& blocks
return kErrorOk;
}
-ASMJIT_FAVOR_SIZE Error RAPass::_dumpBlockLiveness(String& sb, const RABlock* block) noexcept {
+ASMJIT_FAVOR_SIZE Error BaseRAPass::_dumpBlockLiveness(String& sb, const RABlock* block) noexcept {
for (uint32_t liveType = 0; liveType < RABlock::kLiveCount; liveType++) {
const char* bitsName = liveType == RABlock::kLiveIn ? "IN " :
liveType == RABlock::kLiveOut ? "OUT " :
@@ -1958,7 +1949,7 @@ ASMJIT_FAVOR_SIZE Error RAPass::_dumpBlockLiveness(String& sb, const RABlock* bl
return kErrorOk;
}
-ASMJIT_FAVOR_SIZE Error RAPass::_dumpLiveSpans(String& sb) noexcept {
+ASMJIT_FAVOR_SIZE Error BaseRAPass::_dumpLiveSpans(String& sb) noexcept {
uint32_t numWorkRegs = _workRegs.size();
uint32_t maxSize = _maxWorkRegNameSize;
diff --git a/3rdparty/asmjit/src/asmjit/core/rapass_p.h b/3rdparty/asmjit/src/asmjit/core/rapass_p.h
index df5eb9d7aad..098c5c9e1dc 100644
--- a/3rdparty/asmjit/src/asmjit/core/rapass_p.h
+++ b/3rdparty/asmjit/src/asmjit/core/rapass_p.h
@@ -1,25 +1,7 @@
-// AsmJit - Machine code generation for C++
+// This file is part of AsmJit project <https://asmjit.com>
//
-// * Official AsmJit Home Page: https://asmjit.com
-// * Official Github Repository: https://github.com/asmjit/asmjit
-//
-// Copyright (c) 2008-2020 The AsmJit Authors
-//
-// This software is provided 'as-is', without any express or implied
-// warranty. In no event will the authors be held liable for any damages
-// arising from the use of this software.
-//
-// Permission is granted to anyone to use this software for any purpose,
-// including commercial applications, and to alter it and redistribute it
-// freely, subject to the following restrictions:
-//
-// 1. The origin of this software must not be misrepresented; you must not
-// claim that you wrote the original software. If you use this software
-// in a product, an acknowledgment in the product documentation would be
-// appreciated but is not required.
-// 2. Altered source versions must be plainly marked as such, and must not be
-// misrepresented as being the original software.
-// 3. This notice may not be removed or altered from any source distribution.
+// See asmjit.h or LICENSE.md for license and copyright information
+// SPDX-License-Identifier: Zlib
#ifndef ASMJIT_CORE_RAPASS_P_H_INCLUDED
#define ASMJIT_CORE_RAPASS_P_H_INCLUDED
@@ -27,6 +9,8 @@
#include "../core/api-config.h"
#ifndef ASMJIT_NO_COMPILER
+#include "../core/compiler.h"
+#include "../core/emithelper_p.h"
#include "../core/raassignment_p.h"
#include "../core/radefs_p.h"
#include "../core/rastack_p.h"
@@ -38,9 +22,34 @@ ASMJIT_BEGIN_NAMESPACE
//! \addtogroup asmjit_ra
//! \{
-// ============================================================================
-// [asmjit::RABlock]
-// ============================================================================
+//! Flags used by \ref RABlock.
+enum class RABlockFlags : uint32_t {
+ //! No flags.
+ kNone = 0,
+
+ //! Block has been constructed from nodes.
+ kIsConstructed = 0x00000001u,
+ //! Block is reachable (set by `buildCFGViews()`).
+ kIsReachable = 0x00000002u,
+ //! Block is a target (has an associated label or multiple labels).
+ kIsTargetable = 0x00000004u,
+ //! Block has been allocated.
+ kIsAllocated = 0x00000008u,
+ //! Block is a function-exit.
+ kIsFuncExit = 0x00000010u,
+
+ //! Block has a terminator (jump, conditional jump, ret).
+ kHasTerminator = 0x00000100u,
+ //! Block naturally flows to the next block.
+ kHasConsecutive = 0x00000200u,
+ //! Block has a jump to a jump-table at the end.
+ kHasJumpTable = 0x00000400u,
+ //! Block contains fixed registers (precolored).
+ kHasFixedRegs = 0x00000800u,
+ //! Block contains function calls.
+ kHasFuncCalls = 0x00001000u
+};
+ASMJIT_DEFINE_ENUM_FLAGS(RABlockFlags)
//! Basic block used by register allocator pass.
class RABlock {
@@ -50,155 +59,135 @@ public:
typedef RAAssignment::PhysToWorkMap PhysToWorkMap;
typedef RAAssignment::WorkToPhysMap WorkToPhysMap;
- enum Id : uint32_t {
+ //! \name Constants
+ //! \{
+
+ enum : uint32_t {
+ //! Unassigned block id.
kUnassignedId = 0xFFFFFFFFu
};
- //! Basic block flags.
- enum Flags : uint32_t {
- //! Block has been constructed from nodes.
- kFlagIsConstructed = 0x00000001u,
- //! Block is reachable (set by `buildViews()`).
- kFlagIsReachable = 0x00000002u,
- //! Block has been allocated.
- kFlagIsAllocated = 0x00000004u,
- //! Block is a function-exit.
- kFlagIsFuncExit = 0x00000008u,
-
- //! Block has a terminator (jump, conditional jump, ret).
- kFlagHasTerminator = 0x00000010u,
- //! Block naturally flows to the next block.
- kFlagHasConsecutive = 0x00000020u,
- //! Block contains fixed registers (precolored).
- kFlagHasFixedRegs = 0x00000040u,
- //! Block contains function calls.
- kFlagHasFuncCalls = 0x00000080u
+ enum LiveType : uint32_t {
+ kLiveIn = 0,
+ kLiveOut = 1,
+ kLiveGen = 2,
+ kLiveKill = 3,
+ kLiveCount = 4
};
+ //! \}
+
+ //! \name Members
+ //! \{
+
//! Register allocator pass.
- RAPass* _ra;
+ BaseRAPass* _ra;
//! Block id (indexed from zero).
- uint32_t _blockId;
+ uint32_t _blockId = kUnassignedId;
//! Block flags, see `Flags`.
- uint32_t _flags;
+ RABlockFlags _flags = RABlockFlags::kNone;
//! First `BaseNode` of this block (inclusive).
- BaseNode* _first;
+ BaseNode* _first = nullptr;
//! Last `BaseNode` of this block (inclusive).
- BaseNode* _last;
+ BaseNode* _last = nullptr;
//! Initial position of this block (inclusive).
- uint32_t _firstPosition;
+ uint32_t _firstPosition = 0;
//! End position of this block (exclusive).
- uint32_t _endPosition;
+ uint32_t _endPosition = 0;
//! Weight of this block (default 0, each loop adds one).
- uint32_t _weight;
+ uint32_t _weight = 0;
//! Post-order view order, used during POV construction.
- uint32_t _povOrder;
+ uint32_t _povOrder = 0;
//! Basic statistics about registers.
- RARegsStats _regsStats;
+ RARegsStats _regsStats = RARegsStats();
//! Maximum live-count per register group.
- RALiveCount _maxLiveCount;
+ RALiveCount _maxLiveCount = RALiveCount();
//! Timestamp (used by block visitors).
- mutable uint64_t _timestamp;
+ mutable uint64_t _timestamp = 0;
//! Immediate dominator of this block.
- RABlock* _idom;
+ RABlock* _idom = nullptr;
//! Block predecessors.
- RABlocks _predecessors;
+ RABlocks _predecessors {};
//! Block successors.
- RABlocks _successors;
-
- enum LiveType : uint32_t {
- kLiveIn = 0,
- kLiveOut = 1,
- kLiveGen = 2,
- kLiveKill = 3,
- kLiveCount = 4
- };
+ RABlocks _successors {};
//! Liveness in/out/use/kill.
- ZoneBitVector _liveBits[kLiveCount];
+ ZoneBitVector _liveBits[kLiveCount] {};
- //! Shared assignment it or `Globals::kInvalidId` if this block doesn't
- //! have shared assignment. See `RASharedAssignment` for more details.
- uint32_t _sharedAssignmentId;
+ //! Shared assignment it or `Globals::kInvalidId` if this block doesn't have shared assignment.
+ //! See \ref RASharedAssignment for more details.
+ uint32_t _sharedAssignmentId = Globals::kInvalidId;
//! Scratch registers that cannot be allocated upon block entry.
- uint32_t _entryScratchGpRegs;
+ RegMask _entryScratchGpRegs = 0;
//! Scratch registers used at exit, by a terminator instruction.
- uint32_t _exitScratchGpRegs;
+ RegMask _exitScratchGpRegs = 0;
//! Register assignment (PhysToWork) on entry.
- PhysToWorkMap* _entryPhysToWorkMap;
+ PhysToWorkMap* _entryPhysToWorkMap = nullptr;
//! Register assignment (WorkToPhys) on entry.
- WorkToPhysMap* _entryWorkToPhysMap;
+ WorkToPhysMap* _entryWorkToPhysMap = nullptr;
+
+ //! \}
//! \name Construction & Destruction
//! \{
- inline RABlock(RAPass* ra) noexcept
- : _ra(ra),
- _blockId(kUnassignedId),
- _flags(0),
- _first(nullptr),
- _last(nullptr),
- _firstPosition(0),
- _endPosition(0),
- _weight(0),
- _povOrder(kUnassignedId),
- _regsStats(),
- _maxLiveCount(),
- _timestamp(0),
- _idom(nullptr),
- _predecessors(),
- _successors(),
- _sharedAssignmentId(Globals::kInvalidId),
- _entryScratchGpRegs(0),
- _exitScratchGpRegs(0),
- _entryPhysToWorkMap(nullptr),
- _entryWorkToPhysMap(nullptr) {}
+ inline RABlock(BaseRAPass* ra) noexcept
+ : _ra(ra) {}
//! \}
//! \name Accessors
//! \{
- inline RAPass* pass() const noexcept { return _ra; }
+ inline BaseRAPass* pass() const noexcept { return _ra; }
inline ZoneAllocator* allocator() const noexcept;
inline uint32_t blockId() const noexcept { return _blockId; }
- inline uint32_t flags() const noexcept { return _flags; }
+ inline RABlockFlags flags() const noexcept { return _flags; }
- inline bool hasFlag(uint32_t flag) const noexcept { return (_flags & flag) != 0; }
- inline void addFlags(uint32_t flags) noexcept { _flags |= flags; }
+ inline bool hasFlag(RABlockFlags flag) const noexcept { return Support::test(_flags, flag); }
+ inline void addFlags(RABlockFlags flags) noexcept { _flags |= flags; }
inline bool isAssigned() const noexcept { return _blockId != kUnassignedId; }
- inline bool isConstructed() const noexcept { return hasFlag(kFlagIsConstructed); }
- inline bool isReachable() const noexcept { return hasFlag(kFlagIsReachable); }
- inline bool isAllocated() const noexcept { return hasFlag(kFlagIsAllocated); }
- inline bool isFuncExit() const noexcept { return hasFlag(kFlagIsFuncExit); }
+ inline bool isConstructed() const noexcept { return hasFlag(RABlockFlags::kIsConstructed); }
+ inline bool isReachable() const noexcept { return hasFlag(RABlockFlags::kIsReachable); }
+ inline bool isTargetable() const noexcept { return hasFlag(RABlockFlags::kIsTargetable); }
+ inline bool isAllocated() const noexcept { return hasFlag(RABlockFlags::kIsAllocated); }
+ inline bool isFuncExit() const noexcept { return hasFlag(RABlockFlags::kIsFuncExit); }
+ inline bool hasTerminator() const noexcept { return hasFlag(RABlockFlags::kHasTerminator); }
+ inline bool hasConsecutive() const noexcept { return hasFlag(RABlockFlags::kHasConsecutive); }
+ inline bool hasJumpTable() const noexcept { return hasFlag(RABlockFlags::kHasJumpTable); }
inline void makeConstructed(const RARegsStats& regStats) noexcept {
- _flags |= kFlagIsConstructed;
+ _flags |= RABlockFlags::kIsConstructed;
_regsStats.combineWith(regStats);
}
- inline void makeReachable() noexcept { _flags |= kFlagIsReachable; }
- inline void makeAllocated() noexcept { _flags |= kFlagIsAllocated; }
+ inline void makeReachable() noexcept { _flags |= RABlockFlags::kIsReachable; }
+ inline void makeTargetable() noexcept { _flags |= RABlockFlags::kIsTargetable; }
+ inline void makeAllocated() noexcept { _flags |= RABlockFlags::kIsAllocated; }
inline const RARegsStats& regsStats() const noexcept { return _regsStats; }
- inline bool hasTerminator() const noexcept { return hasFlag(kFlagHasTerminator); }
- inline bool hasConsecutive() const noexcept { return hasFlag(kFlagHasConsecutive); }
-
inline bool hasPredecessors() const noexcept { return !_predecessors.empty(); }
inline bool hasSuccessors() const noexcept { return !_successors.empty(); }
+ inline bool hasSuccessor(RABlock* block) noexcept {
+ if (block->_predecessors.size() < _successors.size())
+ return block->_predecessors.contains(this);
+ else
+ return _successors.contains(block);
+ }
+
inline const RABlocks& predecessors() const noexcept { return _predecessors; }
inline const RABlocks& successors() const noexcept { return _successors; }
@@ -216,10 +205,11 @@ public:
inline uint32_t povOrder() const noexcept { return _povOrder; }
- inline uint32_t entryScratchGpRegs() const noexcept;
- inline uint32_t exitScratchGpRegs() const noexcept { return _exitScratchGpRegs; }
+ inline RegMask entryScratchGpRegs() const noexcept;
+ inline RegMask exitScratchGpRegs() const noexcept { return _exitScratchGpRegs; }
- inline void addExitScratchGpRegs(uint32_t regMask) noexcept { _exitScratchGpRegs |= regMask; }
+ inline void addEntryScratchGpRegs(RegMask regMask) noexcept { _entryScratchGpRegs |= regMask; }
+ inline void addExitScratchGpRegs(RegMask regMask) noexcept { _exitScratchGpRegs |= regMask; }
inline bool hasSharedAssignmentId() const noexcept { return _sharedAssignmentId != Globals::kInvalidId; }
inline uint32_t sharedAssignmentId() const noexcept { return _sharedAssignmentId; }
@@ -270,11 +260,9 @@ public:
//! \name Utilities
//! \{
- //! Adds a successor to this block, and predecessor to `successor`, making
- //! connection on both sides.
+ //! Adds a successor to this block, and predecessor to `successor`, making connection on both sides.
//!
- //! This API must be used to manage successors and predecessors, never manage
- //! it manually.
+ //! This API must be used to manage successors and predecessors, never manage it manually.
Error appendSuccessor(RABlock* successor) noexcept;
//! Similar to `appendSuccessor()`, but does prepend instead append.
@@ -285,19 +273,18 @@ public:
//! \}
};
-// ============================================================================
-// [asmjit::RAInst]
-// ============================================================================
-
//! Register allocator's data associated with each `InstNode`.
class RAInst {
public:
ASMJIT_NONCOPYABLE(RAInst)
+ //! \name Members
+ //! \{
+
//! Parent block.
RABlock* _block;
- //! Instruction flags.
- uint32_t _flags;
+ //! Aggregated RATiedFlags from all operands & instruction specific flags.
+ RATiedFlags _flags;
//! Total count of RATiedReg's.
uint32_t _tiedTotal;
//! Index of RATiedReg's per register group.
@@ -313,14 +300,12 @@ public:
//! Tied registers.
RATiedReg _tiedRegs[1];
- enum Flags : uint32_t {
- kFlagIsTerminator = 0x00000001u
- };
+ //! \}
//! \name Construction & Destruction
//! \{
- ASMJIT_INLINE RAInst(RABlock* block, uint32_t flags, uint32_t tiedTotal, const RARegMask& clobberedRegs) noexcept {
+ inline RAInst(RABlock* block, RATiedFlags flags, uint32_t tiedTotal, const RARegMask& clobberedRegs) noexcept {
_block = block;
_flags = flags;
_tiedTotal = tiedTotal;
@@ -337,18 +322,18 @@ public:
//! \{
//! Returns the instruction flags.
- inline uint32_t flags() const noexcept { return _flags; }
+ inline RATiedFlags flags() const noexcept { return _flags; }
//! Tests whether the instruction has flag `flag`.
- inline bool hasFlag(uint32_t flag) const noexcept { return (_flags & flag) != 0; }
+ inline bool hasFlag(RATiedFlags flag) const noexcept { return Support::test(_flags, flag); }
//! Replaces the existing instruction flags with `flags`.
- inline void setFlags(uint32_t flags) noexcept { _flags = flags; }
+ inline void setFlags(RATiedFlags flags) noexcept { _flags = flags; }
//! Adds instruction `flags` to this RAInst.
- inline void addFlags(uint32_t flags) noexcept { _flags |= flags; }
+ inline void addFlags(RATiedFlags flags) noexcept { _flags |= flags; }
//! Clears instruction `flags` from this RAInst.
- inline void clearFlags(uint32_t flags) noexcept { _flags &= ~flags; }
+ inline void clearFlags(RATiedFlags flags) noexcept { _flags &= ~flags; }
- //! Returns whether the RAInst represents an instruction that terminates this basic block.
- inline bool isTerminator() const noexcept { return hasFlag(kFlagIsTerminator); }
+ //! Tests whether this instruction can be transformed to another instruction if necessary.
+ inline bool isTransformable() const noexcept { return hasFlag(RATiedFlags::kInst_IsTransformable); }
//! Returns the associated block with this RAInst.
inline RABlock* block() const noexcept { return _block; }
@@ -356,12 +341,12 @@ public:
//! Returns tied registers (all).
inline RATiedReg* tiedRegs() const noexcept { return const_cast<RATiedReg*>(_tiedRegs); }
//! Returns tied registers for a given `group`.
- inline RATiedReg* tiedRegs(uint32_t group) const noexcept { return const_cast<RATiedReg*>(_tiedRegs) + _tiedIndex.get(group); }
+ inline RATiedReg* tiedRegs(RegGroup group) const noexcept { return const_cast<RATiedReg*>(_tiedRegs) + _tiedIndex.get(group); }
//! Returns count of all tied registers.
inline uint32_t tiedCount() const noexcept { return _tiedTotal; }
//! Returns count of tied registers of a given `group`.
- inline uint32_t tiedCount(uint32_t group) const noexcept { return _tiedCount[group]; }
+ inline uint32_t tiedCount(RegGroup group) const noexcept { return _tiedCount[group]; }
//! Returns `RATiedReg` at the given `index`.
inline RATiedReg* tiedAt(uint32_t index) const noexcept {
@@ -370,8 +355,8 @@ public:
}
//! Returns `RATiedReg` at the given `index` of the given register `group`.
- inline RATiedReg* tiedOf(uint32_t group, uint32_t index) const noexcept {
- ASMJIT_ASSERT(index < _tiedCount._regs[group]);
+ inline RATiedReg* tiedOf(RegGroup group, uint32_t index) const noexcept {
+ ASMJIT_ASSERT(index < _tiedCount.get(group));
return tiedRegs(group) + index;
}
@@ -390,20 +375,18 @@ public:
//! \}
};
-// ============================================================================
-// [asmjit::RAInstBuilder]
-// ============================================================================
-
-//! A helper class that is used to build an array of RATiedReg items that are
-//! then copied to `RAInst`.
+//! A helper class that is used to build an array of RATiedReg items that are then copied to `RAInst`.
class RAInstBuilder {
public:
ASMJIT_NONCOPYABLE(RAInstBuilder)
+ //! \name Members
+ //! \{
+
//! Flags combined from all RATiedReg's.
- uint32_t _aggregatedFlags;
+ RATiedFlags _aggregatedFlags;
//! Flags that will be cleared before storing the aggregated flags to `RAInst`.
- uint32_t _forbiddenFlags;
+ RATiedFlags _forbiddenFlags;
RARegCount _count;
RARegsStats _stats;
@@ -415,6 +398,8 @@ public:
//! Array of temporary tied registers.
RATiedReg _tiedRegs[128];
+ //! \}
+
//! \name Construction & Destruction
//! \{
@@ -422,8 +407,8 @@ public:
inline void init() noexcept { reset(); }
inline void reset() noexcept {
- _aggregatedFlags = 0;
- _forbiddenFlags = 0;
+ _aggregatedFlags = RATiedFlags::kNone;
+ _forbiddenFlags = RATiedFlags::kNone;
_count.reset();
_stats.reset();
_used.reset();
@@ -436,11 +421,11 @@ public:
//! \name Accessors
//! \{
- inline uint32_t aggregatedFlags() const noexcept { return _aggregatedFlags; }
- inline uint32_t forbiddenFlags() const noexcept { return _forbiddenFlags; }
+ inline RATiedFlags aggregatedFlags() const noexcept { return _aggregatedFlags; }
+ inline RATiedFlags forbiddenFlags() const noexcept { return _forbiddenFlags; }
- inline void addAggregatedFlags(uint32_t flags) noexcept { _aggregatedFlags |= flags; }
- inline void addForbiddenFlags(uint32_t flags) noexcept { _forbiddenFlags |= flags; }
+ inline void addAggregatedFlags(RATiedFlags flags) noexcept { _aggregatedFlags |= flags; }
+ inline void addForbiddenFlags(RATiedFlags flags) noexcept { _forbiddenFlags |= flags; }
//! Returns the number of tied registers added to the builder.
inline uint32_t tiedRegCount() const noexcept { return uint32_t((size_t)(_cur - _tiedRegs)); }
@@ -468,19 +453,26 @@ public:
//! \name Utilities
//! \{
- Error add(RAWorkReg* workReg, uint32_t flags, uint32_t allocable, uint32_t useId, uint32_t useRewriteMask, uint32_t outId, uint32_t outRewriteMask, uint32_t rmSize = 0) noexcept {
- uint32_t group = workReg->group();
+ Error add(
+ RAWorkReg* workReg,
+ RATiedFlags flags,
+ RegMask useRegMask, uint32_t useId, uint32_t useRewriteMask,
+ RegMask outRegMask, uint32_t outId, uint32_t outRewriteMask,
+ uint32_t rmSize = 0,
+ uint32_t consecutiveParent = Globals::kInvalidId) noexcept {
+
+ RegGroup group = workReg->group();
RATiedReg* tiedReg = workReg->tiedReg();
if (useId != BaseReg::kIdBad) {
_stats.makeFixed(group);
_used[group] |= Support::bitMask(useId);
- flags |= RATiedReg::kUseFixed;
+ flags |= RATiedFlags::kUseFixed;
}
if (outId != BaseReg::kIdBad) {
_clobbered[group] |= Support::bitMask(outId);
- flags |= RATiedReg::kOutFixed;
+ flags |= RATiedFlags::kOutFixed;
}
_aggregatedFlags |= flags;
@@ -491,13 +483,19 @@ public:
ASMJIT_ASSERT(tiedRegCount() < ASMJIT_ARRAY_SIZE(_tiedRegs));
tiedReg = _cur++;
- tiedReg->init(workReg->workId(), flags, allocable, useId, useRewriteMask, outId, outRewriteMask, rmSize);
+ tiedReg->init(workReg->workId(), flags, useRegMask, useId, useRewriteMask, outRegMask, outId, outRewriteMask, rmSize, consecutiveParent);
workReg->setTiedReg(tiedReg);
_count.add(group);
return kErrorOk;
}
else {
+ if (consecutiveParent != tiedReg->consecutiveParent()) {
+ if (tiedReg->consecutiveParent() != Globals::kInvalidId)
+ return DebugUtils::errored(kErrorInvalidState);
+ tiedReg->_consecutiveParent = consecutiveParent;
+ }
+
if (useId != BaseReg::kIdBad) {
if (ASMJIT_UNLIKELY(tiedReg->hasUseId()))
return DebugUtils::errored(kErrorOverlappedRegs);
@@ -512,8 +510,9 @@ public:
tiedReg->addRefCount();
tiedReg->addFlags(flags);
- tiedReg->_allocableRegs &= allocable;
+ tiedReg->_useRegMask &= useRegMask;
tiedReg->_useRewriteMask |= useRewriteMask;
+ tiedReg->_outRegMask &= outRegMask;
tiedReg->_outRewriteMask |= outRewriteMask;
tiedReg->_rmSize = uint8_t(Support::max<uint32_t>(tiedReg->rmSize(), rmSize));
return kErrorOk;
@@ -523,9 +522,9 @@ public:
Error addCallArg(RAWorkReg* workReg, uint32_t useId) noexcept {
ASMJIT_ASSERT(useId != BaseReg::kIdBad);
- uint32_t flags = RATiedReg::kUse | RATiedReg::kRead | RATiedReg::kUseFixed;
- uint32_t group = workReg->group();
- uint32_t allocable = Support::bitMask(useId);
+ RATiedFlags flags = RATiedFlags::kUse | RATiedFlags::kRead | RATiedFlags::kUseFixed;
+ RegGroup group = workReg->group();
+ RegMask allocable = Support::bitMask(useId);
_aggregatedFlags |= flags;
_used[group] |= allocable;
@@ -538,7 +537,7 @@ public:
ASMJIT_ASSERT(tiedRegCount() < ASMJIT_ARRAY_SIZE(_tiedRegs));
tiedReg = _cur++;
- tiedReg->init(workReg->workId(), flags, allocable, useId, 0, BaseReg::kIdBad, 0);
+ tiedReg->init(workReg->workId(), flags, allocable, useId, 0, allocable, BaseReg::kIdBad, 0);
workReg->setTiedReg(tiedReg);
_count.add(group);
@@ -546,12 +545,12 @@ public:
}
else {
if (tiedReg->hasUseId()) {
- flags |= RATiedReg::kDuplicate;
- tiedReg->_allocableRegs |= allocable;
+ flags |= RATiedFlags::kDuplicate;
+ tiedReg->_useRegMask |= allocable;
}
else {
tiedReg->setUseId(useId);
- tiedReg->_allocableRegs &= allocable;
+ tiedReg->_useRegMask &= allocable;
}
tiedReg->addRefCount();
@@ -563,12 +562,12 @@ public:
Error addCallRet(RAWorkReg* workReg, uint32_t outId) noexcept {
ASMJIT_ASSERT(outId != BaseReg::kIdBad);
- uint32_t flags = RATiedReg::kOut | RATiedReg::kWrite | RATiedReg::kOutFixed;
- uint32_t group = workReg->group();
- uint32_t allocable = Support::bitMask(outId);
+ RATiedFlags flags = RATiedFlags::kOut | RATiedFlags::kWrite | RATiedFlags::kOutFixed;
+ RegGroup group = workReg->group();
+ RegMask outRegs = Support::bitMask(outId);
_aggregatedFlags |= flags;
- _used[group] |= allocable;
+ _used[group] |= outRegs;
_stats.makeFixed(group);
_stats.makeUsed(group);
@@ -578,7 +577,7 @@ public:
ASMJIT_ASSERT(tiedRegCount() < ASMJIT_ARRAY_SIZE(_tiedRegs));
tiedReg = _cur++;
- tiedReg->init(workReg->workId(), flags, allocable, BaseReg::kIdBad, 0, outId, 0);
+ tiedReg->init(workReg->workId(), flags, Support::allOnes<RegMask>(), BaseReg::kIdBad, 0, outRegs, outId, 0);
workReg->setTiedReg(tiedReg);
_count.add(group);
@@ -598,160 +597,159 @@ public:
//! \}
};
-// ============================================================================
-// [asmjit::RASharedAssignment]
-// ============================================================================
-
+//! Intersection of multiple register assignments.
+//!
+//! See \ref RAAssignment for more information about register assignments.
class RASharedAssignment {
public:
typedef RAAssignment::PhysToWorkMap PhysToWorkMap;
typedef RAAssignment::WorkToPhysMap WorkToPhysMap;
- //! Bit-mask of registers that cannot be used upon a block entry, for each
- //! block that has this shared assignment. Scratch registers can come from
- //! ISA limits (like jecx/loop instructions on x86) or because the registers
- //! are used by jump/branch instruction that uses registers to perform an
- //! indirect jump.
- uint32_t _entryScratchGpRegs;
+ //! \name Members
+ //! \{
+
+ //! Bit-mask of registers that cannot be used upon a block entry, for each block that has this shared assignment.
+ //! Scratch registers can come from ISA limits (like jecx/loop instructions on x86) or because the registers are
+ //! used by jump/branch instruction that uses registers to perform an indirect jump.
+ RegMask _entryScratchGpRegs = 0;
//! Union of all live-in registers.
- ZoneBitVector _liveIn;
+ ZoneBitVector _liveIn {};
//! Register assignment (PhysToWork).
- PhysToWorkMap* _physToWorkMap;
+ PhysToWorkMap* _physToWorkMap = nullptr;
//! Register assignment (WorkToPhys).
- WorkToPhysMap* _workToPhysMap;
+ WorkToPhysMap* _workToPhysMap = nullptr;
- //! Provided for clarity, most likely never called as we initialize a vector
- //! of shared assignments to zero.
- inline RASharedAssignment() noexcept
- : _entryScratchGpRegs(0),
- _liveIn(),
- _physToWorkMap(nullptr),
- _workToPhysMap(nullptr) {}
+ //! \}
- inline uint32_t entryScratchGpRegs() const noexcept { return _entryScratchGpRegs; }
- inline void addScratchGpRegs(uint32_t mask) noexcept { _entryScratchGpRegs |= mask; }
+ //! \name Accessors
+ //! \{
+
+ inline bool empty() const noexcept { return _physToWorkMap == nullptr; }
+
+ inline RegMask entryScratchGpRegs() const noexcept { return _entryScratchGpRegs; }
+ inline void addEntryScratchGpRegs(RegMask mask) noexcept { _entryScratchGpRegs |= mask; }
inline const ZoneBitVector& liveIn() const noexcept { return _liveIn; }
inline PhysToWorkMap* physToWorkMap() const noexcept { return _physToWorkMap; }
inline WorkToPhysMap* workToPhysMap() const noexcept { return _workToPhysMap; }
- inline bool empty() const noexcept {
- return _physToWorkMap == nullptr;
- }
-
inline void assignMaps(PhysToWorkMap* physToWorkMap, WorkToPhysMap* workToPhysMap) noexcept {
_physToWorkMap = physToWorkMap;
_workToPhysMap = workToPhysMap;
}
-};
-// ============================================================================
-// [asmjit::RAPass]
-// ============================================================================
+ //! \}
+};
//! Register allocation pass used by `BaseCompiler`.
-class RAPass : public FuncPass {
+class BaseRAPass : public FuncPass {
public:
- ASMJIT_NONCOPYABLE(RAPass)
+ ASMJIT_NONCOPYABLE(BaseRAPass)
typedef FuncPass Base;
- enum Weights : uint32_t {
+ enum : uint32_t {
kCallArgWeight = 80
};
typedef RAAssignment::PhysToWorkMap PhysToWorkMap;
typedef RAAssignment::WorkToPhysMap WorkToPhysMap;
+ //! \name Members
+ //! \{
+
//! Allocator that uses zone passed to `runOnFunction()`.
- ZoneAllocator _allocator;
+ ZoneAllocator _allocator {};
+ //! Emit helper.
+ BaseEmitHelper* _iEmitHelper = nullptr;
+
//! Logger, disabled if null.
- Logger* _logger;
- //! Debug logger, non-null only if `kOptionDebugPasses` option is set.
- Logger* _debugLogger;
- //! Logger flags.
- uint32_t _loggerFlags;
+ Logger* _logger = nullptr;
+ //! Format options, copied from Logger, or zeroed if there is no logger.
+ FormatOptions _formatOptions {};
+ //! Diagnostic options, copied from Emitter, or zeroed if there is no logger.
+ DiagnosticOptions _diagnosticOptions {};
//! Function being processed.
- FuncNode* _func;
+ FuncNode* _func = nullptr;
//! Stop node.
- BaseNode* _stop;
+ BaseNode* _stop = nullptr;
//! Node that is used to insert extra code after the function body.
- BaseNode* _extraBlock;
+ BaseNode* _extraBlock = nullptr;
//! Blocks (first block is the entry, always exists).
- RABlocks _blocks;
+ RABlocks _blocks {};
//! Function exit blocks (usually one, but can contain more).
- RABlocks _exits;
+ RABlocks _exits {};
//! Post order view (POV).
- RABlocks _pov;
+ RABlocks _pov {};
//! Number of instruction nodes.
- uint32_t _instructionCount;
+ uint32_t _instructionCount = 0;
//! Number of created blocks (internal).
- uint32_t _createdBlockCount;
+ uint32_t _createdBlockCount = 0;
- //! SharedState blocks.
- ZoneVector<RASharedAssignment> _sharedAssignments;
+ //! Shared assignment blocks.
+ ZoneVector<RASharedAssignment> _sharedAssignments {};
//! Timestamp generator (incremental).
- mutable uint64_t _lastTimestamp;
+ mutable uint64_t _lastTimestamp = 0;
- //!< Architecture registers information.
- const ArchRegs* _archRegsInfo;
//! Architecture traits.
- RAArchTraits _archTraits;
+ const ArchTraits* _archTraits = nullptr;
//! Index to physical registers in `RAAssignment::PhysToWorkMap`.
- RARegIndex _physRegIndex;
+ RARegIndex _physRegIndex = RARegIndex();
//! Count of physical registers in `RAAssignment::PhysToWorkMap`.
- RARegCount _physRegCount;
+ RARegCount _physRegCount = RARegCount();
//! Total number of physical registers.
- uint32_t _physRegTotal;
+ uint32_t _physRegTotal = 0;
//! Indexes of a possible scratch registers that can be selected if necessary.
- uint8_t _scratchRegIndexes[2];
+ Support::Array<uint8_t, 2> _scratchRegIndexes {};
//! Registers available for allocation.
- RARegMask _availableRegs;
+ RARegMask _availableRegs = RARegMask();
//! Count of physical registers per group.
- RARegCount _availableRegCount;
+ RARegCount _availableRegCount = RARegCount();
//! Registers clobbered by the function.
- RARegMask _clobberedRegs;
+ RARegMask _clobberedRegs = RARegMask();
//! Work registers (registers used by the function).
RAWorkRegs _workRegs;
//! Work registers per register group.
- RAWorkRegs _workRegsOfGroup[BaseReg::kGroupVirt];
+ Support::Array<RAWorkRegs, Globals::kNumVirtGroups> _workRegsOfGroup;
//! Register allocation strategy per register group.
- RAStrategy _strategy[BaseReg::kGroupVirt];
+ Support::Array<RAStrategy, Globals::kNumVirtGroups> _strategy;
//! Global max live-count (from all blocks) per register group.
- RALiveCount _globalMaxLiveCount;
+ RALiveCount _globalMaxLiveCount = RALiveCount();
//! Global live spans per register group.
- LiveRegSpans* _globalLiveSpans[BaseReg::kGroupVirt];
+ Support::Array<LiveRegSpans*, Globals::kNumVirtGroups> _globalLiveSpans {};
//! Temporary stack slot.
- Operand _temporaryMem;
+ Operand _temporaryMem = Operand();
//! Stack pointer.
- BaseReg _sp;
+ BaseReg _sp = BaseReg();
//! Frame pointer.
- BaseReg _fp;
+ BaseReg _fp = BaseReg();
//! Stack manager.
- RAStackAllocator _stackAllocator;
+ RAStackAllocator _stackAllocator {};
//! Function arguments assignment.
- FuncArgsAssignment _argsAssignment;
+ FuncArgsAssignment _argsAssignment {};
//! Some StackArgs have to be assigned to StackSlots.
- uint32_t _numStackArgsToStackSlots;
+ uint32_t _numStackArgsToStackSlots = 0;
//! Maximum name-size computed from all WorkRegs.
- uint32_t _maxWorkRegNameSize;
+ uint32_t _maxWorkRegNameSize = 0;
//! Temporary string builder used to format comments.
StringTmp<80> _tmpString;
- //! \name Construction & Reset
+ //! \}
+
+ //! \name Construction & Destruction
//! \{
- RAPass() noexcept;
- virtual ~RAPass() noexcept;
+ BaseRAPass() noexcept;
+ virtual ~BaseRAPass() noexcept;
//! \}
@@ -760,8 +758,14 @@ public:
//! Returns \ref Logger passed to \ref runOnFunction().
inline Logger* logger() const noexcept { return _logger; }
- //! Returns \ref Logger passed to \ref runOnFunction() or null if `kOptionDebugPasses` is not set.
- inline Logger* debugLogger() const noexcept { return _debugLogger; }
+
+ //! Returns either a valid logger if the given `option` is set and logging is enabled, or nullptr.
+ inline Logger* getLoggerIf(DiagnosticOptions option) const noexcept { return Support::test(_diagnosticOptions, option) ? _logger : nullptr; }
+
+ //! Returns whether the diagnostic `option` is enabled.
+ //!
+ //! \note Returns false if there is no logger (as diagnostics without logging make no sense).
+ inline bool hasDiagnosticOption(DiagnosticOptions option) const noexcept { return Support::test(_diagnosticOptions, option); }
//! Returns \ref Zone passed to \ref runOnFunction().
inline Zone* zone() const noexcept { return _allocator.zone(); }
@@ -791,7 +795,7 @@ public:
//! \name Utilities
//! \{
- inline void makeUnavailable(uint32_t group, uint32_t regId) noexcept {
+ inline void makeUnavailable(RegGroup group, uint32_t regId) noexcept {
_availableRegs[group] &= ~Support::bitMask(regId);
_availableRegCount[group]--;
}
@@ -842,12 +846,11 @@ public:
//! Returns the count of reachable basic blocks (returns size of `_pov` array).
inline uint32_t reachableBlockCount() const noexcept { return _pov.size(); }
- //! Tests whether the CFG has dangling blocks - these were created by `newBlock()`,
- //! but not added to CFG through `addBlocks()`. If `true` is returned and the
- //! CFG is constructed it means that something is missing and it's incomplete.
+ //! Tests whether the CFG has dangling blocks - these were created by `newBlock()`, but not added to CFG through
+ //! `addBlocks()`. If `true` is returned and the CFG is constructed it means that something is missing and it's
+ //! incomplete.
//!
- //! \note This is only used to check if the number of created blocks matches
- //! the number of added blocks.
+ //! \note This is only used to check if the number of created blocks matches the number of added blocks.
inline bool hasDanglingBlocks() const noexcept { return _createdBlockCount != blockCount(); }
//! Gest a next timestamp to be used to mark CFG blocks.
@@ -855,31 +858,29 @@ public:
//! Createss a new `RABlock` instance.
//!
- //! \note New blocks don't have ID assigned until they are added to the block
- //! array by calling `addBlock()`.
+ //! \note New blocks don't have ID assigned until they are added to the block array by calling `addBlock()`.
RABlock* newBlock(BaseNode* initialNode = nullptr) noexcept;
- //! Tries to find a neighboring LabelNode (without going through code) that is
- //! already connected with `RABlock`. If no label is found then a new RABlock
- //! is created and assigned to all possible labels in a backward direction.
+ //! Tries to find a neighboring LabelNode (without going through code) that is already connected with `RABlock`.
+ //! If no label is found then a new RABlock is created and assigned to all possible labels in a backward direction.
RABlock* newBlockOrExistingAt(LabelNode* cbLabel, BaseNode** stoppedAt = nullptr) noexcept;
//! Adds the given `block` to the block list and assign it a unique block id.
Error addBlock(RABlock* block) noexcept;
inline Error addExitBlock(RABlock* block) noexcept {
- block->addFlags(RABlock::kFlagIsFuncExit);
+ block->addFlags(RABlockFlags::kIsFuncExit);
return _exits.append(allocator(), block);
}
- ASMJIT_INLINE RAInst* newRAInst(RABlock* block, uint32_t flags, uint32_t tiedRegCount, const RARegMask& clobberedRegs) noexcept {
+ ASMJIT_FORCE_INLINE RAInst* newRAInst(RABlock* block, RATiedFlags flags, uint32_t tiedRegCount, const RARegMask& clobberedRegs) noexcept {
void* p = zone()->alloc(RAInst::sizeOf(tiedRegCount));
if (ASMJIT_UNLIKELY(!p))
return nullptr;
return new(p) RAInst(block, flags, tiedRegCount, clobberedRegs);
}
- ASMJIT_INLINE Error assignRAInst(BaseNode* node, RABlock* block, RAInstBuilder& ib) noexcept {
+ ASMJIT_FORCE_INLINE Error assignRAInst(BaseNode* node, RABlock* block, RAInstBuilder& ib) noexcept {
uint32_t tiedRegCount = ib.tiedRegCount();
RAInst* raInst = newRAInst(block, ib.aggregatedFlags(), tiedRegCount, ib._clobbered);
@@ -887,7 +888,7 @@ public:
return DebugUtils::errored(kErrorOutOfMemory);
RARegIndex index;
- uint32_t flagsFilter = ~ib.forbiddenFlags();
+ RATiedFlags flagsFilter = ~ib.forbiddenFlags();
index.buildIndexes(ib._count);
raInst->_tiedIndex = index;
@@ -898,15 +899,15 @@ public:
RAWorkReg* workReg = workRegById(tiedReg->workId());
workReg->resetTiedReg();
- uint32_t group = workReg->group();
+ RegGroup group = workReg->group();
if (tiedReg->hasUseId()) {
- block->addFlags(RABlock::kFlagHasFixedRegs);
+ block->addFlags(RABlockFlags::kHasFixedRegs);
raInst->_usedRegs[group] |= Support::bitMask(tiedReg->useId());
}
if (tiedReg->hasOutId()) {
- block->addFlags(RABlock::kFlagHasFixedRegs);
+ block->addFlags(RABlockFlags::kHasFixedRegs);
}
RATiedReg& dst = raInst->_tiedRegs[index[group]++];
@@ -914,7 +915,7 @@ public:
dst._flags &= flagsFilter;
if (!tiedReg->isDuplicate())
- dst._allocableRegs &= ~ib._used[group];
+ dst._useRegMask &= ~ib._used[group];
}
node->setPassData<RAInst>(raInst);
@@ -928,20 +929,17 @@ public:
//! Traverse the whole function and do the following:
//!
- //! 1. Construct CFG (represented by `RABlock`) by populating `_blocks` and
- //! `_exits`. Blocks describe the control flow of the function and contain
- //! some additional information that is used by the register allocator.
+ //! 1. Construct CFG (represented by `RABlock`) by populating `_blocks` and `_exits`. Blocks describe the control
+ //! flow of the function and contain some additional information that is used by the register allocator.
//!
- //! 2. Remove unreachable code immediately. This is not strictly necessary
- //! for BaseCompiler itself as the register allocator cannot reach such
- //! nodes, but keeping instructions that use virtual registers would fail
- //! during instruction encoding phase (Assembler).
+ //! 2. Remove unreachable code immediately. This is not strictly necessary for BaseCompiler itself as the register
+ //! allocator cannot reach such nodes, but keeping instructions that use virtual registers would fail during
+ //! instruction encoding phase (Assembler).
//!
- //! 3. `RAInst` is created for each `InstNode` or compatible. It contains
- //! information that is essential for further analysis and register
- //! allocation.
+ //! 3. `RAInst` is created for each `InstNode` or compatible. It contains information that is essential for further
+ //! analysis and register allocation.
//!
- //! Use `RACFGBuilder` template that provides the necessary boilerplate.
+ //! Use `RACFGBuilderT` template that provides the necessary boilerplate.
virtual Error buildCFG() noexcept = 0;
//! Called after the CFG is built.
@@ -953,7 +951,7 @@ public:
//! \{
//! Constructs CFG views (only POV at the moment).
- Error buildViews() noexcept;
+ Error buildCFGViews() noexcept;
//! \}
@@ -961,13 +959,11 @@ public:
//! \{
// Terminology:
- // - A node `X` dominates a node `Z` if any path from the entry point to
- // `Z` has to go through `X`.
- // - A node `Z` post-dominates a node `X` if any path from `X` to the end
- // of the graph has to go through `Z`.
+ // - A node `X` dominates a node `Z` if any path from the entry point to `Z` has to go through `X`.
+ // - A node `Z` post-dominates a node `X` if any path from `X` to the end of the graph has to go through `Z`.
//! Constructs a dominator-tree from CFG.
- Error buildDominators() noexcept;
+ Error buildCFGDominators() noexcept;
bool _strictlyDominates(const RABlock* a, const RABlock* b) const noexcept;
const RABlock* _nearestCommonDominator(const RABlock* a, const RABlock* b) const noexcept;
@@ -987,17 +983,15 @@ public:
//! \name CFG - Utilities
//! \{
- Error removeUnreachableBlocks() noexcept;
+ Error removeUnreachableCode() noexcept;
- //! Returns `node` or some node after that is ideal for beginning a new block.
- //! This function is mostly used after a conditional or unconditional jump to
- //! select the successor node. In some cases the next node could be a label,
+ //! Returns `node` or some node after that is ideal for beginning a new block. This function is mostly used after
+ //! a conditional or unconditional jump to select the successor node. In some cases the next node could be a label,
//! which means it could have assigned some block already.
BaseNode* findSuccessorStartingAt(BaseNode* node) noexcept;
- //! Returns `true` of the `node` can flow to `target` without reaching code
- //! nor data. It's used to eliminate jumps to labels that are next right to
- //! them.
+ //! Returns `true` of the `node` can flow to `target` without reaching code nor data. It's used to eliminate jumps
+ //! to labels that are next right to them.
bool isNextTo(BaseNode* node, BaseNode* target) noexcept;
//! \}
@@ -1007,25 +1001,25 @@ public:
//! Returns a native size of the general-purpose register of the target architecture.
inline uint32_t registerSize() const noexcept { return _sp.size(); }
- inline uint32_t availableRegCount(uint32_t group) const noexcept { return _availableRegCount[group]; }
+ inline uint32_t availableRegCount(RegGroup group) const noexcept { return _availableRegCount[group]; }
inline RAWorkReg* workRegById(uint32_t workId) const noexcept { return _workRegs[workId]; }
inline RAWorkRegs& workRegs() noexcept { return _workRegs; }
- inline RAWorkRegs& workRegs(uint32_t group) noexcept { return _workRegsOfGroup[group]; }
+ inline RAWorkRegs& workRegs(RegGroup group) noexcept { return _workRegsOfGroup[group]; }
inline const RAWorkRegs& workRegs() const noexcept { return _workRegs; }
- inline const RAWorkRegs& workRegs(uint32_t group) const noexcept { return _workRegsOfGroup[group]; }
+ inline const RAWorkRegs& workRegs(RegGroup group) const noexcept { return _workRegsOfGroup[group]; }
inline uint32_t workRegCount() const noexcept { return _workRegs.size(); }
- inline uint32_t workRegCount(uint32_t group) const noexcept { return _workRegsOfGroup[group].size(); }
+ inline uint32_t workRegCount(RegGroup group) const noexcept { return _workRegsOfGroup[group].size(); }
inline void _buildPhysIndex() noexcept {
_physRegIndex.buildIndexes(_physRegCount);
- _physRegTotal = uint32_t(_physRegIndex[BaseReg::kGroupVirt - 1]) +
- uint32_t(_physRegCount[BaseReg::kGroupVirt - 1]) ;
+ _physRegTotal = uint32_t(_physRegIndex[RegGroup::kMaxVirt]) +
+ uint32_t(_physRegCount[RegGroup::kMaxVirt]) ;
}
- inline uint32_t physRegIndex(uint32_t group) const noexcept { return _physRegIndex[group]; }
+ inline uint32_t physRegIndex(RegGroup group) const noexcept { return _physRegIndex[group]; }
inline uint32_t physRegTotal() const noexcept { return _physRegTotal; }
Error _asWorkReg(VirtReg* vReg, RAWorkReg** out) noexcept;
@@ -1037,7 +1031,7 @@ public:
return *out ? kErrorOk : _asWorkReg(vReg, out);
}
- inline Error virtIndexAsWorkReg(uint32_t vIndex, RAWorkReg** out) noexcept {
+ ASMJIT_FORCE_INLINE Error virtIndexAsWorkReg(uint32_t vIndex, RAWorkReg** out) noexcept {
const ZoneVector<VirtReg*>& virtRegs = cc()->virtRegs();
if (ASMJIT_UNLIKELY(vIndex >= virtRegs.size()))
return DebugUtils::errored(kErrorInvalidVirtId);
@@ -1058,7 +1052,10 @@ public:
inline BaseMem workRegAsMem(RAWorkReg* workReg) noexcept {
getOrCreateStackSlot(workReg);
- return BaseMem(BaseMem::Decomposed { _sp.type(), workReg->virtId(), BaseReg::kTypeNone, 0, 0, 0, BaseMem::kSignatureMemRegHomeFlag });
+ return BaseMem(OperandSignature::fromOpType(OperandType::kMem) |
+ OperandSignature::fromMemBaseType(_sp.type()) |
+ OperandSignature::fromBits(OperandSignature::kMemRegHomeFlag),
+ workReg->virtId(), 0, 0);
}
WorkToPhysMap* newWorkToPhysMap() noexcept;
@@ -1098,7 +1095,7 @@ public:
//! Initializes data structures used for global live spans.
Error initGlobalLiveSpans() noexcept;
- Error binPack(uint32_t group) noexcept;
+ Error binPack(RegGroup group) noexcept;
//! \}
@@ -1127,7 +1124,7 @@ public:
//! \name Function Prolog & Epilog
//! \{
- Error updateStackFrame() noexcept;
+ virtual Error updateStackFrame() noexcept;
Error _markStackArgsToKeep() noexcept;
Error _updateStackArgs() noexcept;
Error insertPrologEpilog() noexcept;
@@ -1138,7 +1135,7 @@ public:
//! \{
Error rewrite() noexcept;
- Error _rewrite(BaseNode* first, BaseNode* stop) noexcept;
+ virtual Error _rewrite(BaseNode* first, BaseNode* stop) noexcept = 0;
//! \}
@@ -1158,22 +1155,22 @@ public:
//! \name Emit
//! \{
- virtual Error onEmitMove(uint32_t workId, uint32_t dstPhysId, uint32_t srcPhysId) noexcept = 0;
- virtual Error onEmitSwap(uint32_t aWorkId, uint32_t aPhysId, uint32_t bWorkId, uint32_t bPhysId) noexcept = 0;
+ virtual Error emitMove(uint32_t workId, uint32_t dstPhysId, uint32_t srcPhysId) noexcept = 0;
+ virtual Error emitSwap(uint32_t aWorkId, uint32_t aPhysId, uint32_t bWorkId, uint32_t bPhysId) noexcept = 0;
- virtual Error onEmitLoad(uint32_t workId, uint32_t dstPhysId) noexcept = 0;
- virtual Error onEmitSave(uint32_t workId, uint32_t srcPhysId) noexcept = 0;
+ virtual Error emitLoad(uint32_t workId, uint32_t dstPhysId) noexcept = 0;
+ virtual Error emitSave(uint32_t workId, uint32_t srcPhysId) noexcept = 0;
- virtual Error onEmitJump(const Label& label) noexcept = 0;
- virtual Error onEmitPreCall(InvokeNode* invokeNode) noexcept = 0;
+ virtual Error emitJump(const Label& label) noexcept = 0;
+ virtual Error emitPreCall(InvokeNode* invokeNode) noexcept = 0;
//! \}
};
inline ZoneAllocator* RABlock::allocator() const noexcept { return _ra->allocator(); }
-inline uint32_t RABlock::entryScratchGpRegs() const noexcept {
- uint32_t regs = _entryScratchGpRegs;
+inline RegMask RABlock::entryScratchGpRegs() const noexcept {
+ RegMask regs = _entryScratchGpRegs;
if (hasSharedAssignmentId())
regs = _ra->_sharedAssignments[_sharedAssignmentId].entryScratchGpRegs();
return regs;
diff --git a/3rdparty/asmjit/src/asmjit/core/rastack.cpp b/3rdparty/asmjit/src/asmjit/core/rastack.cpp
index b886279a5f3..2b7ed592df5 100644
--- a/3rdparty/asmjit/src/asmjit/core/rastack.cpp
+++ b/3rdparty/asmjit/src/asmjit/core/rastack.cpp
@@ -1,25 +1,7 @@
-// AsmJit - Machine code generation for C++
+// This file is part of AsmJit project <https://asmjit.com>
//
-// * Official AsmJit Home Page: https://asmjit.com
-// * Official Github Repository: https://github.com/asmjit/asmjit
-//
-// Copyright (c) 2008-2020 The AsmJit Authors
-//
-// This software is provided 'as-is', without any express or implied
-// warranty. In no event will the authors be held liable for any damages
-// arising from the use of this software.
-//
-// Permission is granted to anyone to use this software for any purpose,
-// including commercial applications, and to alter it and redistribute it
-// freely, subject to the following restrictions:
-//
-// 1. The origin of this software must not be misrepresented; you must not
-// claim that you wrote the original software. If you use this software
-// in a product, an acknowledgment in the product documentation would be
-// appreciated but is not required.
-// 2. Altered source versions must be plainly marked as such, and must not be
-// misrepresented as being the original software.
-// 3. This notice may not be removed or altered from any source distribution.
+// See asmjit.h or LICENSE.md for license and copyright information
+// SPDX-License-Identifier: Zlib
#include "../core/api-build_p.h"
#ifndef ASMJIT_NO_COMPILER
@@ -29,9 +11,8 @@
ASMJIT_BEGIN_NAMESPACE
-// ============================================================================
-// [asmjit::RAStackAllocator - Slots]
-// ============================================================================
+// RAStackAllocator - Slots
+// ========================
RAStackSlot* RAStackAllocator::newSlot(uint32_t baseRegId, uint32_t size, uint32_t alignment, uint32_t flags) noexcept {
if (ASMJIT_UNLIKELY(_slots.willGrow(allocator(), 1) != kErrorOk))
@@ -55,9 +36,8 @@ RAStackSlot* RAStackAllocator::newSlot(uint32_t baseRegId, uint32_t size, uint32
return slot;
}
-// ============================================================================
-// [asmjit::RAStackAllocator - Utilities]
-// ============================================================================
+// RAStackAllocator - Utilities
+// ============================
struct RAStackGap {
inline RAStackGap() noexcept
@@ -82,10 +62,9 @@ Error RAStackAllocator::calculateStackFrame() noexcept {
// STEP 1:
//
- // Update usage based on the size of the slot. We boost smaller slots in a way
- // that 32-bit register has higher priority than a 128-bit register, however,
- // if one 128-bit register is used 4 times more than some other 32-bit register
- // it will overweight it.
+ // Update usage based on the size of the slot. We boost smaller slots in a way that 32-bit register has higher
+ // priority than a 128-bit register, however, if one 128-bit register is used 4 times more than some other 32-bit
+ // register it will overweight it.
for (RAStackSlot* slot : _slots) {
uint32_t alignment = slot->alignment();
ASMJIT_ASSERT(alignment > 0);
@@ -98,8 +77,8 @@ Error RAStackAllocator::calculateStackFrame() noexcept {
else
weight = power;
- // If overflown, which has less chance of winning a lottery, just use max
- // possible weight. In such case it probably doesn't matter at all.
+ // If overflown, which has less chance of winning a lottery, just use max possible weight. In such case it
+ // probably doesn't matter at all.
if (weight > 0xFFFFFFFFu)
weight = 0xFFFFFFFFu;
@@ -116,12 +95,11 @@ Error RAStackAllocator::calculateStackFrame() noexcept {
// STEP 3:
//
- // Calculate offset of each slot. We start from the slot that has the highest
- // weight and advance to slots with lower weight. It could look that offsets
- // start from the first slot in our list and then simply increase, but it's
- // not always the case as we also try to fill all gaps introduced by the fact
- // that slots are sorted by weight and not by size & alignment, so when we need
- // to align some slot we distribute the gap caused by the alignment to `gaps`.
+ // Calculate offset of each slot. We start from the slot that has the highest weight and advance to slots with
+ // lower weight. It could look that offsets start from the first slot in our list and then simply increase, but
+ // it's not always the case as we also try to fill all gaps introduced by the fact that slots are sorted by
+ // weight and not by size & alignment, so when we need to align some slot we distribute the gap caused by the
+ // alignment to `gaps`.
uint32_t offset = 0;
ZoneVector<RAStackGap> gaps[kSizeCount - 1];
diff --git a/3rdparty/asmjit/src/asmjit/core/rastack_p.h b/3rdparty/asmjit/src/asmjit/core/rastack_p.h
index 33d4e1d15e8..90640b4dea8 100644
--- a/3rdparty/asmjit/src/asmjit/core/rastack_p.h
+++ b/3rdparty/asmjit/src/asmjit/core/rastack_p.h
@@ -1,25 +1,7 @@
-// AsmJit - Machine code generation for C++
+// This file is part of AsmJit project <https://asmjit.com>
//
-// * Official AsmJit Home Page: https://asmjit.com
-// * Official Github Repository: https://github.com/asmjit/asmjit
-//
-// Copyright (c) 2008-2020 The AsmJit Authors
-//
-// This software is provided 'as-is', without any express or implied
-// warranty. In no event will the authors be held liable for any damages
-// arising from the use of this software.
-//
-// Permission is granted to anyone to use this software for any purpose,
-// including commercial applications, and to alter it and redistribute it
-// freely, subject to the following restrictions:
-//
-// 1. The origin of this software must not be misrepresented; you must not
-// claim that you wrote the original software. If you use this software
-// in a product, an acknowledgment in the product documentation would be
-// appreciated but is not required.
-// 2. Altered source versions must be plainly marked as such, and must not be
-// misrepresented as being the original software.
-// 3. This notice may not be removed or altered from any source distribution.
+// See asmjit.h or LICENSE.md for license and copyright information
+// SPDX-License-Identifier: Zlib
#ifndef ASMJIT_CORE_RASTACK_P_H_INCLUDED
#define ASMJIT_CORE_RASTACK_P_H_INCLUDED
@@ -35,26 +17,25 @@ ASMJIT_BEGIN_NAMESPACE
//! \addtogroup asmjit_ra
//! \{
-// ============================================================================
-// [asmjit::RAStackSlot]
-// ============================================================================
-
//! Stack slot.
struct RAStackSlot {
//! Stack slot flags.
//!
//! TODO: kFlagStackArg is not used by the current implementation, do we need to keep it?
- enum Flags : uint32_t {
+ enum Flags : uint16_t {
//! Stack slot is register home slot.
kFlagRegHome = 0x0001u,
//! Stack slot position matches argument passed via stack.
- kFlagStackArg = 0x0002u
+ kFlagStackArg = 0x0002u
};
enum ArgIndex : uint32_t {
kNoArgIndex = 0xFF
};
+ //! \name Members
+ //! \{
+
//! Base register used to address the stack.
uint8_t _baseRegId;
//! Minimum alignment required by the slot.
@@ -71,6 +52,8 @@ struct RAStackSlot {
//! Stack offset, calculated by \ref RAStackAllocator::calculateStackFrame().
int32_t _offset;
+ //! \}
+
//! \name Accessors
//! \{
@@ -101,10 +84,6 @@ struct RAStackSlot {
typedef ZoneVector<RAStackSlot*> RAStackSlots;
-// ============================================================================
-// [asmjit::RAStackAllocator]
-// ============================================================================
-
//! Stack allocator.
class RAStackAllocator {
public:
@@ -121,6 +100,9 @@ public:
kSizeCount = 7
};
+ //! \name Members
+ //! \{
+
//! Allocator used to allocate internal data.
ZoneAllocator* _allocator;
//! Count of bytes used by all slots.
@@ -132,7 +114,9 @@ public:
//! Stack slots vector.
RAStackSlots _slots;
- //! \name Construction / Destruction
+ //! \}
+
+ //! \name Construction & Destruction
//! \{
inline RAStackAllocator() noexcept
diff --git a/3rdparty/asmjit/src/asmjit/core/string.cpp b/3rdparty/asmjit/src/asmjit/core/string.cpp
index e059884c844..83dc6efdaac 100644
--- a/3rdparty/asmjit/src/asmjit/core/string.cpp
+++ b/3rdparty/asmjit/src/asmjit/core/string.cpp
@@ -1,25 +1,7 @@
-// AsmJit - Machine code generation for C++
+// This file is part of AsmJit project <https://asmjit.com>
//
-// * Official AsmJit Home Page: https://asmjit.com
-// * Official Github Repository: https://github.com/asmjit/asmjit
-//
-// Copyright (c) 2008-2020 The AsmJit Authors
-//
-// This software is provided 'as-is', without any express or implied
-// warranty. In no event will the authors be held liable for any damages
-// arising from the use of this software.
-//
-// Permission is granted to anyone to use this software for any purpose,
-// including commercial applications, and to alter it and redistribute it
-// freely, subject to the following restrictions:
-//
-// 1. The origin of this software must not be misrepresented; you must not
-// claim that you wrote the original software. If you use this software
-// in a product, an acknowledgment in the product documentation would be
-// appreciated but is not required.
-// 2. Altered source versions must be plainly marked as such, and must not be
-// misrepresented as being the original software.
-// 3. This notice may not be removed or altered from any source distribution.
+// See asmjit.h or LICENSE.md for license and copyright information
+// SPDX-License-Identifier: Zlib
#include "../core/api-build_p.h"
#include "../core/string.h"
@@ -27,18 +9,16 @@
ASMJIT_BEGIN_NAMESPACE
-// ============================================================================
-// [asmjit::String - Globals]
-// ============================================================================
+// String - Globals
+// ================
-static const char String_baseN[] = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
+static const char String_baseN[] = "0123456789ABCDEF";
constexpr size_t kMinAllocSize = 64;
constexpr size_t kMaxAllocSize = SIZE_MAX - Globals::kGrowThreshold;
-// ============================================================================
-// [asmjit::String]
-// ============================================================================
+// String - Clear & Reset
+// ======================
Error String::reset() noexcept {
if (_type == kTypeLarge)
@@ -49,7 +29,7 @@ Error String::reset() noexcept {
}
Error String::clear() noexcept {
- if (isLarge()) {
+ if (isLargeOrExternal()) {
_large.size = 0;
_large.data[0] = '\0';
}
@@ -60,12 +40,15 @@ Error String::clear() noexcept {
return kErrorOk;
}
-char* String::prepare(uint32_t op, size_t size) noexcept {
+// String - Prepare
+// ================
+
+char* String::prepare(ModifyOp op, size_t size) noexcept {
char* curData;
size_t curSize;
size_t curCapacity;
- if (isLarge()) {
+ if (isLargeOrExternal()) {
curData = this->_large.data;
curSize = this->_large.size;
curCapacity = this->_large.capacity;
@@ -76,7 +59,7 @@ char* String::prepare(uint32_t op, size_t size) noexcept {
curCapacity = kSSOCapacity;
}
- if (op == kOpAssign) {
+ if (op == ModifyOp::kAssign) {
if (size > curCapacity) {
// Prevent arithmetic overflow.
if (ASMJIT_UNLIKELY(size >= kMaxAllocSize))
@@ -150,6 +133,9 @@ char* String::prepare(uint32_t op, size_t size) noexcept {
}
}
+// String - Assign
+// ===============
+
Error String::assign(const char* data, size_t size) noexcept {
char* dst = nullptr;
@@ -157,7 +143,7 @@ Error String::assign(const char* data, size_t size) noexcept {
if (size == SIZE_MAX)
size = data ? strlen(data) : size_t(0);
- if (isLarge()) {
+ if (isLargeOrExternal()) {
if (size <= _large.capacity) {
dst = _large.data;
_large.size = size;
@@ -171,7 +157,7 @@ Error String::assign(const char* data, size_t size) noexcept {
if (ASMJIT_UNLIKELY(!dst))
return DebugUtils::errored(kErrorOutOfMemory);
- if (!isExternal())
+ if (_type == kTypeLarge)
::free(_large.data);
_large.type = kTypeLarge;
@@ -210,11 +196,10 @@ Error String::assign(const char* data, size_t size) noexcept {
return kErrorOk;
}
-// ============================================================================
-// [asmjit::String - Operations]
-// ============================================================================
+// String - Operations
+// ===================
-Error String::_opString(uint32_t op, const char* str, size_t size) noexcept {
+Error String::_opString(ModifyOp op, const char* str, size_t size) noexcept {
if (size == SIZE_MAX)
size = str ? strlen(str) : size_t(0);
@@ -229,7 +214,7 @@ Error String::_opString(uint32_t op, const char* str, size_t size) noexcept {
return kErrorOk;
}
-Error String::_opChar(uint32_t op, char c) noexcept {
+Error String::_opChar(ModifyOp op, char c) noexcept {
char* p = prepare(op, 1);
if (!p)
return DebugUtils::errored(kErrorOutOfMemory);
@@ -238,7 +223,7 @@ Error String::_opChar(uint32_t op, char c) noexcept {
return kErrorOk;
}
-Error String::_opChars(uint32_t op, char c, size_t n) noexcept {
+Error String::_opChars(ModifyOp op, char c, size_t n) noexcept {
if (!n)
return kErrorOk;
@@ -255,8 +240,8 @@ Error String::padEnd(size_t n, char c) noexcept {
return n > size ? appendChars(c, n - size) : kErrorOk;
}
-Error String::_opNumber(uint32_t op, uint64_t i, uint32_t base, size_t width, uint32_t flags) noexcept {
- if (base < 2 || base > 36)
+Error String::_opNumber(ModifyOp op, uint64_t i, uint32_t base, size_t width, StringFormatFlags flags) noexcept {
+ if (base == 0)
base = 10;
char buf[128];
@@ -265,40 +250,63 @@ Error String::_opNumber(uint32_t op, uint64_t i, uint32_t base, size_t width, ui
uint64_t orig = i;
char sign = '\0';
- // --------------------------------------------------------------------------
- // [Sign]
- // --------------------------------------------------------------------------
+ // Format Sign
+ // -----------
- if ((flags & kFormatSigned) != 0 && int64_t(i) < 0) {
+ if (Support::test(flags, StringFormatFlags::kSigned) && int64_t(i) < 0) {
i = uint64_t(-int64_t(i));
sign = '-';
}
- else if ((flags & kFormatShowSign) != 0) {
+ else if (Support::test(flags, StringFormatFlags::kShowSign)) {
sign = '+';
}
- else if ((flags & kFormatShowSpace) != 0) {
+ else if (Support::test(flags, StringFormatFlags::kShowSpace)) {
sign = ' ';
}
- // --------------------------------------------------------------------------
- // [Number]
- // --------------------------------------------------------------------------
+ // Format Number
+ // -------------
- do {
- uint64_t d = i / base;
- uint64_t r = i % base;
+ switch (base) {
+ case 2:
+ case 8:
+ case 16: {
+ uint32_t shift = Support::ctz(base);
+ uint32_t mask = base - 1;
- *--p = String_baseN[r];
- i = d;
- } while (i);
+ do {
+ uint64_t d = i >> shift;
+ size_t r = size_t(i & mask);
+
+ *--p = String_baseN[r];
+ i = d;
+ } while (i);
+
+ break;
+ }
+
+ case 10: {
+ do {
+ uint64_t d = i / 10;
+ uint64_t r = i % 10;
+
+ *--p = char(uint32_t('0') + uint32_t(r));
+ i = d;
+ } while (i);
+
+ break;
+ }
+
+ default:
+ return DebugUtils::errored(kErrorInvalidArgument);
+ }
size_t numberSize = (size_t)(buf + ASMJIT_ARRAY_SIZE(buf) - p);
- // --------------------------------------------------------------------------
- // [Alternate Form]
- // --------------------------------------------------------------------------
+ // Alternate Form
+ // --------------
- if ((flags & kFormatAlternate) != 0) {
+ if (Support::test(flags, StringFormatFlags::kAlternate)) {
if (base == 8) {
if (orig != 0)
*--p = '0';
@@ -309,9 +317,8 @@ Error String::_opNumber(uint32_t op, uint64_t i, uint32_t base, size_t width, ui
}
}
- // --------------------------------------------------------------------------
- // [Width]
- // --------------------------------------------------------------------------
+ // String Width
+ // ------------
if (sign != 0)
*--p = sign;
@@ -324,9 +331,8 @@ Error String::_opNumber(uint32_t op, uint64_t i, uint32_t base, size_t width, ui
else
width -= numberSize;
- // --------------------------------------------------------------------------
- // Write]
- // --------------------------------------------------------------------------
+ // Finalize
+ // --------
size_t prefixSize = (size_t)(buf + ASMJIT_ARRAY_SIZE(buf) - p) - numberSize;
char* data = prepare(op, prefixSize + width + numberSize);
@@ -344,7 +350,7 @@ Error String::_opNumber(uint32_t op, uint64_t i, uint32_t base, size_t width, ui
return kErrorOk;
}
-Error String::_opHex(uint32_t op, const void* data, size_t size, char separator) noexcept {
+Error String::_opHex(ModifyOp op, const void* data, size_t size, char separator) noexcept {
char* dst;
const uint8_t* src = static_cast<const uint8_t*>(data);
@@ -388,7 +394,7 @@ Error String::_opHex(uint32_t op, const void* data, size_t size, char separator)
return kErrorOk;
}
-Error String::_opFormat(uint32_t op, const char* fmt, ...) noexcept {
+Error String::_opFormat(ModifyOp op, const char* fmt, ...) noexcept {
Error err;
va_list ap;
@@ -399,8 +405,8 @@ Error String::_opFormat(uint32_t op, const char* fmt, ...) noexcept {
return err;
}
-Error String::_opVFormat(uint32_t op, const char* fmt, va_list ap) noexcept {
- size_t startAt = (op == kOpAssign) ? size_t(0) : size();
+Error String::_opVFormat(ModifyOp op, const char* fmt, va_list ap) noexcept {
+ size_t startAt = (op == ModifyOp::kAssign) ? size_t(0) : size();
size_t remainingCapacity = capacity() - startAt;
char buf[1024];
@@ -441,7 +447,7 @@ Error String::_opVFormat(uint32_t op, const char* fmt, va_list ap) noexcept {
}
Error String::truncate(size_t newSize) noexcept {
- if (isLarge()) {
+ if (isLargeOrExternal()) {
if (newSize < _large.size) {
_large.data[newSize] = '\0';
_large.size = newSize;
@@ -478,15 +484,14 @@ bool String::eq(const char* other, size_t size) const noexcept {
}
}
-// ============================================================================
-// [asmjit::Support - Unit]
-// ============================================================================
+// String - Tests
+// ==============
#if defined(ASMJIT_TEST)
UNIT(core_string) {
String s;
- EXPECT(s.isLarge() == false);
+ EXPECT(s.isLargeOrExternal() == false);
EXPECT(s.isExternal() == false);
EXPECT(s.assign('a') == kErrorOk);
@@ -520,14 +525,14 @@ UNIT(core_string) {
const char* large = "Large string that will not fit into SSO buffer";
EXPECT(s.assign(large) == kErrorOk);
- EXPECT(s.isLarge() == true);
+ EXPECT(s.isLargeOrExternal() == true);
EXPECT(s.size() == strlen(large));
EXPECT(s.capacity() > String::kSSOCapacity);
EXPECT(s.eq(large) == true);
EXPECT(s.eq(large, strlen(large)) == true);
const char* additional = " (additional content)";
- EXPECT(s.isLarge() == true);
+ EXPECT(s.isLargeOrExternal() == true);
EXPECT(s.append(additional) == kErrorOk);
EXPECT(s.size() == strlen(large) + strlen(additional));
@@ -535,13 +540,16 @@ UNIT(core_string) {
EXPECT(s.size() == 0);
EXPECT(s.empty() == true);
EXPECT(s.data()[0] == '\0');
- EXPECT(s.isLarge() == true); // Clear should never release the memory.
+ EXPECT(s.isLargeOrExternal() == true); // Clear should never release the memory.
EXPECT(s.appendUInt(1234) == kErrorOk);
EXPECT(s.eq("1234") == true);
+ EXPECT(s.assignUInt(0xFFFF, 16, 0, StringFormatFlags::kAlternate) == kErrorOk);
+ EXPECT(s.eq("0xFFFF"));
+
StringTmp<64> sTmp;
- EXPECT(sTmp.isLarge());
+ EXPECT(sTmp.isLargeOrExternal());
EXPECT(sTmp.isExternal());
EXPECT(sTmp.appendChars(' ', 1000) == kErrorOk);
EXPECT(!sTmp.isExternal());
diff --git a/3rdparty/asmjit/src/asmjit/core/string.h b/3rdparty/asmjit/src/asmjit/core/string.h
index 4c490d87b1d..2562e66194a 100644
--- a/3rdparty/asmjit/src/asmjit/core/string.h
+++ b/3rdparty/asmjit/src/asmjit/core/string.h
@@ -1,25 +1,7 @@
-// AsmJit - Machine code generation for C++
+// This file is part of AsmJit project <https://asmjit.com>
//
-// * Official AsmJit Home Page: https://asmjit.com
-// * Official Github Repository: https://github.com/asmjit/asmjit
-//
-// Copyright (c) 2008-2020 The AsmJit Authors
-//
-// This software is provided 'as-is', without any express or implied
-// warranty. In no event will the authors be held liable for any damages
-// arising from the use of this software.
-//
-// Permission is granted to anyone to use this software for any purpose,
-// including commercial applications, and to alter it and redistribute it
-// freely, subject to the following restrictions:
-//
-// 1. The origin of this software must not be misrepresented; you must not
-// claim that you wrote the original software. If you use this software
-// in a product, an acknowledgment in the product documentation would be
-// appreciated but is not required.
-// 2. Altered source versions must be plainly marked as such, and must not be
-// misrepresented as being the original software.
-// 3. This notice may not be removed or altered from any source distribution.
+// See asmjit.h or LICENSE.md for license and copyright information
+// SPDX-License-Identifier: Zlib
#ifndef ASMJIT_CORE_STRING_H_INCLUDED
#define ASMJIT_CORE_STRING_H_INCLUDED
@@ -32,20 +14,41 @@ ASMJIT_BEGIN_NAMESPACE
//! \addtogroup asmjit_utilities
//! \{
-// ============================================================================
-// [asmjit::FixedString]
-// ============================================================================
+//! Format flags used by \ref String API.
+enum class StringFormatFlags : uint32_t {
+ //! No flags.
+ kNone = 0x00000000u,
+ //! Show sign.
+ kShowSign = 0x00000001u,
+ //! Show space.
+ kShowSpace = 0x00000002u,
+ //! Alternate form (use 0x when formatting HEX number).
+ kAlternate = 0x00000004u,
+ //! The input is signed.
+ kSigned = 0x80000000u
+};
+ASMJIT_DEFINE_ENUM_FLAGS(StringFormatFlags)
-//! A fixed string - only useful for strings that would never exceed `N - 1`
-//! characters; always null-terminated.
+//! Fixed string - only useful for strings that would never exceed `N - 1` characters; always null-terminated.
template<size_t N>
union FixedString {
+ //! \name Constants
+ //! \{
+
+ // This cannot be constexpr as GCC 4.8 refuses constexpr members of unions.
enum : uint32_t {
- kNumU32 = uint32_t((N + sizeof(uint32_t) - 1) / sizeof(uint32_t))
+ kNumUInt32Words = uint32_t((N + sizeof(uint32_t) - 1) / sizeof(uint32_t))
};
- char str[kNumU32 * sizeof(uint32_t)];
- uint32_t u32[kNumU32];
+ //! \}
+
+ //! \name Members
+ //! \{
+
+ char str[kNumUInt32Words * sizeof(uint32_t)];
+ uint32_t u32[kNumUInt32Words];
+
+ //! \}
//! \name Utilities
//! \{
@@ -56,46 +59,31 @@ union FixedString {
//! \}
};
-// ============================================================================
-// [asmjit::String]
-// ============================================================================
//! A simple non-reference counted string that uses small string optimization (SSO).
//!
//! This string has 3 allocation possibilities:
//!
-//! 1. Small - embedded buffer is used for up to `kSSOCapacity` characters.
-//! This should handle most small strings and thus avoid dynamic
-//! memory allocation for most use-cases.
+//! 1. Small - embedded buffer is used for up to `kSSOCapacity` characters. This should handle most small
+//! strings and thus avoid dynamic memory allocation for most use-cases.
//!
-//! 2. Large - string that doesn't fit into an embedded buffer (or string
-//! that was truncated from a larger buffer) and is owned by
-//! AsmJit. When you destroy the string AsmJit would automatically
+//! 2. Large - string that doesn't fit into an embedded buffer (or string that was truncated from a larger
+//! buffer) and is owned by AsmJit. When you destroy the string AsmJit would automatically
//! release the large buffer.
//!
-//! 3. External - like Large (2), however, the large buffer is not owned by
-//! AsmJit and won't be released when the string is destroyed
-//! or reallocated. This is mostly useful for working with
-//! larger temporary strings allocated on stack or with immutable
-//! strings.
+//! 3. External - like Large (2), however, the large buffer is not owned by AsmJit and won't be released when
+//! the string is destroyed or reallocated. This is mostly useful for working with larger temporary
+//! strings allocated on stack or with immutable strings.
class String {
public:
ASMJIT_NONCOPYABLE(String)
//! String operation.
- enum Op : uint32_t {
+ enum class ModifyOp : uint32_t {
//! Assignment - a new content replaces the current one.
- kOpAssign = 0,
+ kAssign = 0,
//! Append - a new content is appended to the string.
- kOpAppend = 1
- };
-
- //! String format flags.
- enum FormatFlags : uint32_t {
- kFormatShowSign = 0x00000001u,
- kFormatShowSpace = 0x00000002u,
- kFormatAlternate = 0x00000004u,
- kFormatSigned = 0x80000000u
+ kAppend = 1
};
//! \cond INTERNAL
@@ -106,8 +94,10 @@ public:
//! String type.
enum Type : uint8_t {
- kTypeLarge = 0x1Fu, //!< Large string (owned by String).
- kTypeExternal = 0x20u //!< External string (zone allocated or not owned by String).
+ //! Large string (owned by String).
+ kTypeLarge = 0x1Fu,
+ //! External string (zone allocated or not owned by String).
+ kTypeExternal = 0x20u
};
union Raw {
@@ -179,20 +169,20 @@ public:
//! \name Accessors
//! \{
- inline bool isLarge() const noexcept { return _type >= kTypeLarge; }
inline bool isExternal() const noexcept { return _type == kTypeExternal; }
+ inline bool isLargeOrExternal() const noexcept { return _type >= kTypeLarge; }
//! Tests whether the string is empty.
inline bool empty() const noexcept { return size() == 0; }
//! Returns the size of the string.
- inline size_t size() const noexcept { return isLarge() ? size_t(_large.size) : size_t(_type); }
+ inline size_t size() const noexcept { return isLargeOrExternal() ? size_t(_large.size) : size_t(_type); }
//! Returns the capacity of the string.
- inline size_t capacity() const noexcept { return isLarge() ? _large.capacity : size_t(kSSOCapacity); }
+ inline size_t capacity() const noexcept { return isLargeOrExternal() ? _large.capacity : size_t(kSSOCapacity); }
//! Returns the data of the string.
- inline char* data() noexcept { return isLarge() ? _large.data : _small.data; }
+ inline char* data() noexcept { return isLargeOrExternal() ? _large.data : _small.data; }
//! \overload
- inline const char* data() const noexcept { return isLarge() ? _large.data : _small.data; }
+ inline const char* data() const noexcept { return isLargeOrExternal() ? _large.data : _small.data; }
inline char* start() noexcept { return data(); }
inline const char* start() const noexcept { return data(); }
@@ -213,15 +203,15 @@ public:
//! Clears the content of the string.
ASMJIT_API Error clear() noexcept;
- ASMJIT_API char* prepare(uint32_t op, size_t size) noexcept;
+ ASMJIT_API char* prepare(ModifyOp op, size_t size) noexcept;
- ASMJIT_API Error _opString(uint32_t op, const char* str, size_t size = SIZE_MAX) noexcept;
- ASMJIT_API Error _opChar(uint32_t op, char c) noexcept;
- ASMJIT_API Error _opChars(uint32_t op, char c, size_t n) noexcept;
- ASMJIT_API Error _opNumber(uint32_t op, uint64_t i, uint32_t base = 0, size_t width = 0, uint32_t flags = 0) noexcept;
- ASMJIT_API Error _opHex(uint32_t op, const void* data, size_t size, char separator = '\0') noexcept;
- ASMJIT_API Error _opFormat(uint32_t op, const char* fmt, ...) noexcept;
- ASMJIT_API Error _opVFormat(uint32_t op, const char* fmt, va_list ap) noexcept;
+ ASMJIT_API Error _opString(ModifyOp op, const char* str, size_t size = SIZE_MAX) noexcept;
+ ASMJIT_API Error _opChar(ModifyOp op, char c) noexcept;
+ ASMJIT_API Error _opChars(ModifyOp op, char c, size_t n) noexcept;
+ ASMJIT_API Error _opNumber(ModifyOp op, uint64_t i, uint32_t base = 0, size_t width = 0, StringFormatFlags flags = StringFormatFlags::kNone) noexcept;
+ ASMJIT_API Error _opHex(ModifyOp op, const void* data, size_t size, char separator = '\0') noexcept;
+ ASMJIT_API Error _opFormat(ModifyOp op, const char* fmt, ...) noexcept;
+ ASMJIT_API Error _opVFormat(ModifyOp op, const char* fmt, va_list ap) noexcept;
//! Replaces the current of the string with `data` of the given `size`.
//!
@@ -235,45 +225,45 @@ public:
//! Replaces the current of the string by a single `c` character.
inline Error assign(char c) noexcept {
- return _opChar(kOpAssign, c);
+ return _opChar(ModifyOp::kAssign, c);
}
//! Replaces the current of the string by a `c` character, repeated `n` times.
inline Error assignChars(char c, size_t n) noexcept {
- return _opChars(kOpAssign, c, n);
+ return _opChars(ModifyOp::kAssign, c, n);
}
//! Replaces the current of the string by a formatted integer `i` (signed).
- inline Error assignInt(int64_t i, uint32_t base = 0, size_t width = 0, uint32_t flags = 0) noexcept {
- return _opNumber(kOpAssign, uint64_t(i), base, width, flags | kFormatSigned);
+ inline Error assignInt(int64_t i, uint32_t base = 0, size_t width = 0, StringFormatFlags flags = StringFormatFlags::kNone) noexcept {
+ return _opNumber(ModifyOp::kAssign, uint64_t(i), base, width, flags | StringFormatFlags::kSigned);
}
//! Replaces the current of the string by a formatted integer `i` (unsigned).
- inline Error assignUInt(uint64_t i, uint32_t base = 0, size_t width = 0, uint32_t flags = 0) noexcept {
- return _opNumber(kOpAssign, i, base, width, flags);
+ inline Error assignUInt(uint64_t i, uint32_t base = 0, size_t width = 0, StringFormatFlags flags = StringFormatFlags::kNone) noexcept {
+ return _opNumber(ModifyOp::kAssign, i, base, width, flags);
}
//! Replaces the current of the string by the given `data` converted to a HEX string.
inline Error assignHex(const void* data, size_t size, char separator = '\0') noexcept {
- return _opHex(kOpAssign, data, size, separator);
+ return _opHex(ModifyOp::kAssign, data, size, separator);
}
//! Replaces the current of the string by a formatted string `fmt`.
template<typename... Args>
inline Error assignFormat(const char* fmt, Args&&... args) noexcept {
- return _opFormat(kOpAssign, fmt, std::forward<Args>(args)...);
+ return _opFormat(ModifyOp::kAssign, fmt, std::forward<Args>(args)...);
}
//! Replaces the current of the string by a formatted string `fmt` (va_list version).
inline Error assignVFormat(const char* fmt, va_list ap) noexcept {
- return _opVFormat(kOpAssign, fmt, ap);
+ return _opVFormat(ModifyOp::kAssign, fmt, ap);
}
//! Appends `str` having the given size `size` to the string.
//!
//! Null terminated strings can set `size` to `SIZE_MAX`.
inline Error append(const char* str, size_t size = SIZE_MAX) noexcept {
- return _opString(kOpAppend, str, size);
+ return _opString(ModifyOp::kAppend, str, size);
}
//! Appends `other` string to this string.
@@ -283,38 +273,38 @@ public:
//! Appends a single `c` character.
inline Error append(char c) noexcept {
- return _opChar(kOpAppend, c);
+ return _opChar(ModifyOp::kAppend, c);
}
//! Appends `c` character repeated `n` times.
inline Error appendChars(char c, size_t n) noexcept {
- return _opChars(kOpAppend, c, n);
+ return _opChars(ModifyOp::kAppend, c, n);
}
//! Appends a formatted integer `i` (signed).
- inline Error appendInt(int64_t i, uint32_t base = 0, size_t width = 0, uint32_t flags = 0) noexcept {
- return _opNumber(kOpAppend, uint64_t(i), base, width, flags | kFormatSigned);
+ inline Error appendInt(int64_t i, uint32_t base = 0, size_t width = 0, StringFormatFlags flags = StringFormatFlags::kNone) noexcept {
+ return _opNumber(ModifyOp::kAppend, uint64_t(i), base, width, flags | StringFormatFlags::kSigned);
}
//! Appends a formatted integer `i` (unsigned).
- inline Error appendUInt(uint64_t i, uint32_t base = 0, size_t width = 0, uint32_t flags = 0) noexcept {
- return _opNumber(kOpAppend, i, base, width, flags);
+ inline Error appendUInt(uint64_t i, uint32_t base = 0, size_t width = 0, StringFormatFlags flags = StringFormatFlags::kNone) noexcept {
+ return _opNumber(ModifyOp::kAppend, i, base, width, flags);
}
//! Appends the given `data` converted to a HEX string.
inline Error appendHex(const void* data, size_t size, char separator = '\0') noexcept {
- return _opHex(kOpAppend, data, size, separator);
+ return _opHex(ModifyOp::kAppend, data, size, separator);
}
//! Appends a formatted string `fmt` with `args`.
template<typename... Args>
inline Error appendFormat(const char* fmt, Args&&... args) noexcept {
- return _opFormat(kOpAppend, fmt, std::forward<Args>(args)...);
+ return _opFormat(ModifyOp::kAppend, fmt, std::forward<Args>(args)...);
}
//! Appends a formatted string `fmt` (va_list version).
inline Error appendVFormat(const char* fmt, va_list ap) noexcept {
- return _opVFormat(kOpAppend, fmt, ap);
+ return _opVFormat(ModifyOp::kAppend, fmt, ap);
}
ASMJIT_API Error padEnd(size_t n, char c = ' ') noexcept;
@@ -332,46 +322,28 @@ public:
//! Resets string to embedded and makes it empty (zero length, zero first char)
//!
- //! \note This is always called internally after an external buffer was released
- //! as it zeroes all bytes used by String's embedded storage.
+ //! \note This is always called internally after an external buffer was released as it zeroes all bytes
+ //! used by String's embedded storage.
inline void _resetInternal() noexcept {
for (size_t i = 0; i < ASMJIT_ARRAY_SIZE(_raw.uptr); i++)
_raw.uptr[i] = 0;
}
inline void _setSize(size_t newSize) noexcept {
- if (isLarge())
+ if (isLargeOrExternal())
_large.size = newSize;
else
_small.type = uint8_t(newSize);
}
//! \}
-
-#ifndef ASMJIT_NO_DEPRECATED
- ASMJIT_DEPRECATED("Use assign() instead of assignString()")
- inline Error assignString(const char* data, size_t size = SIZE_MAX) noexcept { return assign(data, size); }
-
- ASMJIT_DEPRECATED("Use assign() instead of assignChar()")
- inline Error assignChar(char c) noexcept { return assign(c); }
-
- ASMJIT_DEPRECATED("Use append() instead of appendString()")
- inline Error appendString(const char* data, size_t size = SIZE_MAX) noexcept { return append(data, size); }
-
- ASMJIT_DEPRECATED("Use append() instead of appendChar()")
- inline Error appendChar(char c) noexcept { return append(c); }
-#endif // !ASMJIT_NO_DEPRECATED
};
-// ============================================================================
-// [asmjit::StringTmp]
-// ============================================================================
-
//! Temporary string builder, has statically allocated `N` bytes.
template<size_t N>
class StringTmp : public String {
public:
- ASMJIT_NONCOPYABLE(StringTmp<N>)
+ ASMJIT_NONCOPYABLE(StringTmp)
//! Embedded data.
char _embeddedData[Support::alignUp(N + 1, sizeof(size_t))];
diff --git a/3rdparty/asmjit/src/asmjit/core/support.cpp b/3rdparty/asmjit/src/asmjit/core/support.cpp
index a99477dc9fe..245398fe732 100644
--- a/3rdparty/asmjit/src/asmjit/core/support.cpp
+++ b/3rdparty/asmjit/src/asmjit/core/support.cpp
@@ -1,34 +1,15 @@
-// AsmJit - Machine code generation for C++
+// This file is part of AsmJit project <https://asmjit.com>
//
-// * Official AsmJit Home Page: https://asmjit.com
-// * Official Github Repository: https://github.com/asmjit/asmjit
-//
-// Copyright (c) 2008-2020 The AsmJit Authors
-//
-// This software is provided 'as-is', without any express or implied
-// warranty. In no event will the authors be held liable for any damages
-// arising from the use of this software.
-//
-// Permission is granted to anyone to use this software for any purpose,
-// including commercial applications, and to alter it and redistribute it
-// freely, subject to the following restrictions:
-//
-// 1. The origin of this software must not be misrepresented; you must not
-// claim that you wrote the original software. If you use this software
-// in a product, an acknowledgment in the product documentation would be
-// appreciated but is not required.
-// 2. Altered source versions must be plainly marked as such, and must not be
-// misrepresented as being the original software.
-// 3. This notice may not be removed or altered from any source distribution.
+// See asmjit.h or LICENSE.md for license and copyright information
+// SPDX-License-Identifier: Zlib
#include "../core/api-build_p.h"
#include "../core/support.h"
ASMJIT_BEGIN_NAMESPACE
-// ============================================================================
-// [asmjit::Support - Unit]
-// ============================================================================
+// Support - Tests
+// ===============
#if defined(ASMJIT_TEST)
template<typename T>
@@ -85,10 +66,14 @@ static void testBitUtils() noexcept {
for (i = 0; i < 63; i++) EXPECT(Support::blsi(uint64_t(3) << i) == uint64_t(1) << i);
INFO("Support::ctz()");
+ for (i = 0; i < 32; i++) EXPECT(Support::Internal::clzFallback(uint32_t(1) << i) == 31 - i);
+ for (i = 0; i < 64; i++) EXPECT(Support::Internal::clzFallback(uint64_t(1) << i) == 63 - i);
+ for (i = 0; i < 32; i++) EXPECT(Support::Internal::ctzFallback(uint32_t(1) << i) == i);
+ for (i = 0; i < 64; i++) EXPECT(Support::Internal::ctzFallback(uint64_t(1) << i) == i);
+ for (i = 0; i < 32; i++) EXPECT(Support::clz(uint32_t(1) << i) == 31 - i);
+ for (i = 0; i < 64; i++) EXPECT(Support::clz(uint64_t(1) << i) == 63 - i);
for (i = 0; i < 32; i++) EXPECT(Support::ctz(uint32_t(1) << i) == i);
for (i = 0; i < 64; i++) EXPECT(Support::ctz(uint64_t(1) << i) == i);
- for (i = 0; i < 32; i++) EXPECT(Support::constCtz(uint32_t(1) << i) == i);
- for (i = 0; i < 64; i++) EXPECT(Support::constCtz(uint64_t(1) << i) == i);
INFO("Support::bitMask()");
EXPECT(Support::bitMask(0, 1, 7) == 0x83u);
@@ -134,8 +119,10 @@ static void testBitUtils() noexcept {
static void testIntUtils() noexcept {
INFO("Support::byteswap()");
+ EXPECT(Support::byteswap16(int32_t(0x0102)) == int32_t(0x0201));
EXPECT(Support::byteswap32(int32_t(0x01020304)) == int32_t(0x04030201));
EXPECT(Support::byteswap32(uint32_t(0x01020304)) == uint32_t(0x04030201));
+ EXPECT(Support::byteswap64(uint64_t(0x0102030405060708)) == uint64_t(0x0807060504030201));
INFO("Support::bytepack()");
union BytePackData {
diff --git a/3rdparty/asmjit/src/asmjit/core/support.h b/3rdparty/asmjit/src/asmjit/core/support.h
index 9e2bee477cb..e55b8084dbf 100644
--- a/3rdparty/asmjit/src/asmjit/core/support.h
+++ b/3rdparty/asmjit/src/asmjit/core/support.h
@@ -1,25 +1,7 @@
-// AsmJit - Machine code generation for C++
+// This file is part of AsmJit project <https://asmjit.com>
//
-// * Official AsmJit Home Page: https://asmjit.com
-// * Official Github Repository: https://github.com/asmjit/asmjit
-//
-// Copyright (c) 2008-2020 The AsmJit Authors
-//
-// This software is provided 'as-is', without any express or implied
-// warranty. In no event will the authors be held liable for any damages
-// arising from the use of this software.
-//
-// Permission is granted to anyone to use this software for any purpose,
-// including commercial applications, and to alter it and redistribute it
-// freely, subject to the following restrictions:
-//
-// 1. The origin of this software must not be misrepresented; you must not
-// claim that you wrote the original software. If you use this software
-// in a product, an acknowledgment in the product documentation would be
-// appreciated but is not required.
-// 2. Altered source versions must be plainly marked as such, and must not be
-// misrepresented as being the original software.
-// 3. This notice may not be removed or altered from any source distribution.
+// See asmjit.h or LICENSE.md for license and copyright information
+// SPDX-License-Identifier: Zlib
#ifndef ASMJIT_CORE_SUPPORT_H_INCLUDED
#define ASMJIT_CORE_SUPPORT_H_INCLUDED
@@ -35,39 +17,34 @@ ASMJIT_BEGIN_NAMESPACE
//! \addtogroup asmjit_utilities
//! \{
-//! Contains support classes and functions that may be used by AsmJit source
-//! and header files. Anything defined here is considered internal and should
-//! not be used outside of AsmJit and related projects like AsmTK.
+//! Contains support classes and functions that may be used by AsmJit source and header files. Anything defined
+//! here is considered internal and should not be used outside of AsmJit and related projects like AsmTK.
namespace Support {
-// ============================================================================
-// [asmjit::Support - Architecture Features & Constraints]
-// ============================================================================
+// Support - Basic Traits
+// ======================
-//! \cond INTERNAL
-static constexpr bool kUnalignedAccess16 = ASMJIT_ARCH_X86 != 0;
-static constexpr bool kUnalignedAccess32 = ASMJIT_ARCH_X86 != 0;
-static constexpr bool kUnalignedAccess64 = ASMJIT_ARCH_X86 != 0;
-//! \endcond
-
-// ============================================================================
-// [asmjit::Support - Internal]
-// ============================================================================
+#if ASMJIT_ARCH_X86
+typedef uint8_t FastUInt8;
+#else
+typedef uint32_t FastUInt8;
+#endif
//! \cond INTERNAL
namespace Internal {
template<typename T, size_t Alignment>
- struct AlignedInt {};
-
- template<> struct AlignedInt<uint16_t, 1> { typedef uint16_t ASMJIT_ALIGN_TYPE(T, 1); };
- template<> struct AlignedInt<uint16_t, 2> { typedef uint16_t T; };
- template<> struct AlignedInt<uint32_t, 1> { typedef uint32_t ASMJIT_ALIGN_TYPE(T, 1); };
- template<> struct AlignedInt<uint32_t, 2> { typedef uint32_t ASMJIT_ALIGN_TYPE(T, 2); };
- template<> struct AlignedInt<uint32_t, 4> { typedef uint32_t T; };
- template<> struct AlignedInt<uint64_t, 1> { typedef uint64_t ASMJIT_ALIGN_TYPE(T, 1); };
- template<> struct AlignedInt<uint64_t, 2> { typedef uint64_t ASMJIT_ALIGN_TYPE(T, 2); };
- template<> struct AlignedInt<uint64_t, 4> { typedef uint64_t ASMJIT_ALIGN_TYPE(T, 4); };
- template<> struct AlignedInt<uint64_t, 8> { typedef uint64_t T; };
+ struct AliasedUInt {};
+
+ template<> struct AliasedUInt<uint16_t, 2> { typedef uint16_t ASMJIT_MAY_ALIAS T; };
+ template<> struct AliasedUInt<uint32_t, 4> { typedef uint32_t ASMJIT_MAY_ALIAS T; };
+ template<> struct AliasedUInt<uint64_t, 8> { typedef uint64_t ASMJIT_MAY_ALIAS T; };
+
+ template<> struct AliasedUInt<uint16_t, 1> { typedef uint16_t ASMJIT_MAY_ALIAS ASMJIT_ALIGN_TYPE(T, 1); };
+ template<> struct AliasedUInt<uint32_t, 1> { typedef uint32_t ASMJIT_MAY_ALIAS ASMJIT_ALIGN_TYPE(T, 1); };
+ template<> struct AliasedUInt<uint32_t, 2> { typedef uint32_t ASMJIT_MAY_ALIAS ASMJIT_ALIGN_TYPE(T, 2); };
+ template<> struct AliasedUInt<uint64_t, 1> { typedef uint64_t ASMJIT_MAY_ALIAS ASMJIT_ALIGN_TYPE(T, 1); };
+ template<> struct AliasedUInt<uint64_t, 2> { typedef uint64_t ASMJIT_MAY_ALIAS ASMJIT_ALIGN_TYPE(T, 2); };
+ template<> struct AliasedUInt<uint64_t, 4> { typedef uint64_t ASMJIT_MAY_ALIAS ASMJIT_ALIGN_TYPE(T, 4); };
// StdInt - Make an int-type by size (signed or unsigned) that is the
// same as types defined by <stdint.h>.
@@ -90,27 +67,9 @@ namespace Internal {
}
//! \endcond
-// ============================================================================
-// [asmjit::Support - Basic Traits]
-// ============================================================================
-
template<typename T>
static constexpr bool isUnsigned() noexcept { return std::is_unsigned<T>::value; }
-// ============================================================================
-// [asmjit::Support - FastUInt8]
-// ============================================================================
-
-#if ASMJIT_ARCH_X86
-typedef uint8_t FastUInt8;
-#else
-typedef unsigned int FastUInt8;
-#endif
-
-// ============================================================================
-// [asmjit::Support - asInt / asUInt / asNormalized]
-// ============================================================================
-
//! Casts an integer `x` to either `int32_t` or `int64_t` depending on `T`.
template<typename T>
static constexpr typename Internal::Int32Or64<T, 0>::Type asInt(const T& x) noexcept {
@@ -135,15 +94,33 @@ static constexpr typename Internal::StdInt<sizeof(T), isUnsigned<T>()>::Type asS
return (typename Internal::StdInt<sizeof(T), isUnsigned<T>()>::Type)x;
}
-// ============================================================================
-// [asmjit::Support - BitCast]
-// ============================================================================
+//! A helper class that can be used to iterate over enum values.
+template<typename T, T from = (T)0, T to = T::kMaxValue>
+struct EnumValues {
+ typedef typename std::underlying_type<T>::type ValueType;
+
+ struct Iterator {
+ ValueType value;
+
+ inline T operator*() const { return (T)value; }
+ inline void operator++() { ++value; }
+
+ inline bool operator==(const Iterator& other) const noexcept { return value == other.value; }
+ inline bool operator!=(const Iterator& other) const noexcept { return value != other.value; }
+ };
+
+ inline Iterator begin() const noexcept { return Iterator{ValueType(from)}; }
+ inline Iterator end() const noexcept { return Iterator{ValueType(to) + 1}; }
+};
+
+// Support - BitCast
+// =================
//! \cond
namespace Internal {
template<typename DstT, typename SrcT>
union BitCastUnion {
- ASMJIT_INLINE BitCastUnion(SrcT src) noexcept : src(src) {}
+ inline BitCastUnion(SrcT src) noexcept : src(src) {}
SrcT src;
DstT dst;
};
@@ -156,9 +133,8 @@ namespace Internal {
template<typename Dst, typename Src>
static inline Dst bitCast(const Src& x) noexcept { return Internal::BitCastUnion<Dst, Src>(x).dst; }
-// ============================================================================
-// [asmjit::Support - BitOps]
-// ============================================================================
+// Support - BitOps
+// ================
//! Storage used to store a pack of bits (should by compatible with a machine word).
typedef Internal::StdInt<sizeof(uintptr_t), 1>::Type BitWord;
@@ -200,6 +176,12 @@ static constexpr X sar(const X& x, const Y& y) noexcept {
return X(S(x) >> y);
}
+template<typename X, typename Y>
+static constexpr X ror(const X& x, const Y& y) noexcept {
+ typedef typename std::make_unsigned<X>::type U;
+ return X((U(x) >> y) | (U(x) << (bitSizeOf<U>() - y)));
+}
+
//! Returns `x | (x >> y)` - helper used by some bit manipulation helpers.
template<typename X, typename Y>
static constexpr X or_shr(const X& x, const Y& y) noexcept { return X(x | shr(x, y)); }
@@ -211,32 +193,61 @@ static constexpr T blsi(T x) noexcept {
return T(U(x) & neg(U(x)));
}
-//! Generate a trailing bit-mask that has `n` least significant (trailing) bits set.
+//! Tests whether the given value `x` has `n`th bit set.
+template<typename T, typename IndexT>
+static constexpr bool bitTest(T x, IndexT n) noexcept {
+ typedef typename std::make_unsigned<T>::type U;
+ return (U(x) & (U(1) << asStdInt(n))) != 0;
+}
+
+// Tests whether the given `value` is a consecutive mask of bits that starts at
+// the least significant bit.
+template<typename T>
+static inline constexpr bool isLsbMask(const T& value) {
+ typedef typename std::make_unsigned<T>::type U;
+ return value && ((U(value) + 1u) & U(value)) == 0;
+}
+
+// Tests whether the given value contains at least one bit or whether it's a
+// bit-mask of consecutive bits.
+//
+// This function is similar to \ref isLsbMask(), but the mask doesn't have to
+// start at a least significant bit.
+template<typename T>
+static inline constexpr bool isConsecutiveMask(const T& value) {
+ typedef typename std::make_unsigned<T>::type U;
+ return value && isLsbMask((U(value) - 1u) | U(value));
+}
+
+//! Generates a trailing bit-mask that has `n` least significant (trailing) bits set.
template<typename T, typename CountT>
static constexpr T lsbMask(const CountT& n) noexcept {
typedef typename std::make_unsigned<T>::type U;
return (sizeof(U) < sizeof(uintptr_t))
// Prevent undefined behavior by using a larger type than T.
? T(U((uintptr_t(1) << n) - uintptr_t(1)))
- // Prevent undefined behavior by performing `n & (nBits - 1)` so it's always within the range.
- : shr(sar(neg(T(n)), bitSizeOf<T>() - 1u),
- neg(T(n)) & CountT(bitSizeOf<T>() - 1u));
+ // Prevent undefined behavior by checking `n` before shift.
+ : n ? T(shr(allOnes<T>(), bitSizeOf<T>() - size_t(n))) : T(0);
}
-//! Tests whether the given value `x` has `n`th bit set.
-template<typename T, typename IndexT>
-static constexpr bool bitTest(T x, IndexT n) noexcept {
+//! Generats a leading bit-mask that has `n` most significant (leading) bits set.
+template<typename T, typename CountT>
+static constexpr T msbMask(const CountT& n) noexcept {
typedef typename std::make_unsigned<T>::type U;
- return (U(x) & (U(1) << n)) != 0;
+ return (sizeof(U) < sizeof(uintptr_t))
+ // Prevent undefined behavior by using a larger type than T.
+ ? T(allOnes<uintptr_t>() >> (bitSizeOf<uintptr_t>() - n))
+ // Prevent undefined behavior by performing `n & (nBits - 1)` so it's always within the range.
+ : T(sar(U(n != 0) << (bitSizeOf<U>() - 1), n ? uint32_t(n - 1) : uint32_t(0)));
}
//! Returns a bit-mask that has `x` bit set.
-template<typename T>
-static constexpr uint32_t bitMask(T x) noexcept { return (1u << x); }
+template<typename Index>
+static constexpr uint32_t bitMask(const Index& x) noexcept { return (1u << asUInt(x)); }
//! Returns a bit-mask that has `x` bit set (multiple arguments).
-template<typename T, typename... Args>
-static constexpr uint32_t bitMask(T x, Args... args) noexcept { return bitMask(x) | bitMask(args...); }
+template<typename Index, typename... Args>
+static constexpr uint32_t bitMask(const Index& x, Args... args) noexcept { return bitMask(x) | bitMask(args...); }
//! Converts a boolean value `b` to zero or full mask (all bits set).
template<typename DstT, typename SrcT>
@@ -245,6 +256,10 @@ static constexpr DstT bitMaskFromBool(SrcT b) noexcept {
return DstT(U(0) - U(b));
}
+//! Tests whether `a & b` is non-zero.
+template<typename A, typename B>
+static inline constexpr bool test(A a, B b) noexcept { return (asUInt(a) & asUInt(b)) != 0; }
+
//! \cond
namespace Internal {
// Fills all trailing bits right from the first most significant bit set.
@@ -265,73 +280,162 @@ static constexpr T fillTrailingBits(const T& x) noexcept {
return T(Internal::fillTrailingBitsImpl(U(x)));
}
-// ============================================================================
-// [asmjit::Support - CTZ]
-// ============================================================================
+// Support - Count Leading/Trailing Zeros
+// ======================================
//! \cond
namespace Internal {
- static constexpr uint32_t constCtzImpl(uint32_t xAndNegX) noexcept {
- return 31 - ((xAndNegX & 0x0000FFFFu) ? 16 : 0)
- - ((xAndNegX & 0x00FF00FFu) ? 8 : 0)
- - ((xAndNegX & 0x0F0F0F0Fu) ? 4 : 0)
- - ((xAndNegX & 0x33333333u) ? 2 : 0)
- - ((xAndNegX & 0x55555555u) ? 1 : 0);
+namespace {
+
+template<typename T>
+struct BitScanData { T x; uint32_t n; };
+
+template<typename T, uint32_t N>
+struct BitScanCalc {
+ static constexpr BitScanData<T> advanceLeft(const BitScanData<T>& data, uint32_t n) noexcept {
+ return BitScanData<T> { data.x << n, data.n + n };
}
- static constexpr uint32_t constCtzImpl(uint64_t xAndNegX) noexcept {
- return 63 - ((xAndNegX & 0x00000000FFFFFFFFu) ? 32 : 0)
- - ((xAndNegX & 0x0000FFFF0000FFFFu) ? 16 : 0)
- - ((xAndNegX & 0x00FF00FF00FF00FFu) ? 8 : 0)
- - ((xAndNegX & 0x0F0F0F0F0F0F0F0Fu) ? 4 : 0)
- - ((xAndNegX & 0x3333333333333333u) ? 2 : 0)
- - ((xAndNegX & 0x5555555555555555u) ? 1 : 0);
+ static constexpr BitScanData<T> advanceRight(const BitScanData<T>& data, uint32_t n) noexcept {
+ return BitScanData<T> { data.x >> n, data.n + n };
}
- template<typename T>
- static constexpr uint32_t constCtz(T x) noexcept {
- return constCtzImpl(x & neg(x));
+ static constexpr BitScanData<T> clz(const BitScanData<T>& data) noexcept {
+ return BitScanCalc<T, N / 2>::clz(advanceLeft(data, data.x & (allOnes<T>() << (bitSizeOf<T>() - N)) ? uint32_t(0) : N));
}
- static ASMJIT_INLINE uint32_t ctz(uint32_t x) noexcept {
- #if defined(__GNUC__)
- return uint32_t(__builtin_ctz(x));
- #elif defined(_MSC_VER) && (ASMJIT_ARCH_X86 || ASMJIT_ARCH_ARM)
- unsigned long i;
- _BitScanForward(&i, x);
- return uint32_t(i);
- #else
- return constCtz(x);
- #endif
+ static constexpr BitScanData<T> ctz(const BitScanData<T>& data) noexcept {
+ return BitScanCalc<T, N / 2>::ctz(advanceRight(data, data.x & (allOnes<T>() >> (bitSizeOf<T>() - N)) ? uint32_t(0) : N));
}
+};
- static ASMJIT_INLINE uint32_t ctz(uint64_t x) noexcept {
- #if defined(__GNUC__)
- return uint32_t(__builtin_ctzll(x));
- #elif defined(_MSC_VER) && (ASMJIT_ARCH_X86 == 64 || ASMJIT_ARCH_ARM == 64)
- unsigned long i;
- _BitScanForward64(&i, x);
- return uint32_t(i);
- #else
- return constCtz(x);
- #endif
+template<typename T>
+struct BitScanCalc<T, 0> {
+ static constexpr BitScanData<T> clz(const BitScanData<T>& ctx) noexcept {
+ return BitScanData<T> { 0, ctx.n - uint32_t(ctx.x >> (bitSizeOf<T>() - 1)) };
}
+
+ static constexpr BitScanData<T> ctz(const BitScanData<T>& ctx) noexcept {
+ return BitScanData<T> { 0, ctx.n - uint32_t(ctx.x & 0x1) };
+ }
+};
+
+template<typename T>
+constexpr uint32_t clzFallback(const T& x) noexcept {
+ return BitScanCalc<T, bitSizeOf<T>() / 2u>::clz(BitScanData<T>{x, 1}).n;
+}
+
+template<typename T>
+constexpr uint32_t ctzFallback(const T& x) noexcept {
+ return BitScanCalc<T, bitSizeOf<T>() / 2u>::ctz(BitScanData<T>{x, 1}).n;
}
+
+template<typename T> inline uint32_t clzImpl(const T& x) noexcept { return clzFallback(asUInt(x)); }
+template<typename T> inline uint32_t ctzImpl(const T& x) noexcept { return ctzFallback(asUInt(x)); }
+
+#if !defined(ASMJIT_NO_INTRINSICS)
+# if defined(__GNUC__)
+template<> inline uint32_t clzImpl(const uint32_t& x) noexcept { return uint32_t(__builtin_clz(x)); }
+template<> inline uint32_t clzImpl(const uint64_t& x) noexcept { return uint32_t(__builtin_clzll(x)); }
+template<> inline uint32_t ctzImpl(const uint32_t& x) noexcept { return uint32_t(__builtin_ctz(x)); }
+template<> inline uint32_t ctzImpl(const uint64_t& x) noexcept { return uint32_t(__builtin_ctzll(x)); }
+# elif defined(_MSC_VER)
+template<> inline uint32_t clzImpl(const uint32_t& x) noexcept { unsigned long i; _BitScanReverse(&i, x); return uint32_t(i ^ 31); }
+template<> inline uint32_t ctzImpl(const uint32_t& x) noexcept { unsigned long i; _BitScanForward(&i, x); return uint32_t(i); }
+# if ASMJIT_ARCH_X86 == 64 || ASMJIT_ARCH_ARM == 64
+template<> inline uint32_t clzImpl(const uint64_t& x) noexcept { unsigned long i; _BitScanReverse64(&i, x); return uint32_t(i ^ 63); }
+template<> inline uint32_t ctzImpl(const uint64_t& x) noexcept { unsigned long i; _BitScanForward64(&i, x); return uint32_t(i); }
+# endif
+# endif
+#endif
+
+} // {anonymous}
+} // {Internal}
//! \endcond
-//! Count trailing zeros in `x` (returns a position of a first bit set in `x`).
+//! Count leading zeros in `x` (returns a position of a first bit set in `x`).
//!
//! \note The input MUST NOT be zero, otherwise the result is undefined.
template<typename T>
-static inline uint32_t ctz(T x) noexcept { return Internal::ctz(asUInt(x)); }
+static inline uint32_t clz(T x) noexcept { return Internal::clzImpl(asUInt(x)); }
-//! Count trailing zeros in `x` (constant expression).
+//! Count trailing zeros in `x` (returns a position of a first bit set in `x`).
+//!
+//! \note The input MUST NOT be zero, otherwise the result is undefined.
template<typename T>
-static constexpr uint32_t constCtz(T x) noexcept { return Internal::constCtz(asUInt(x)); }
+static inline uint32_t ctz(T x) noexcept { return Internal::ctzImpl(asUInt(x)); }
+
+template<uint64_t kInput>
+struct ConstCTZ {
+ static constexpr uint32_t value =
+ (kInput & (uint64_t(1) << 0)) ? 0 :
+ (kInput & (uint64_t(1) << 1)) ? 1 :
+ (kInput & (uint64_t(1) << 2)) ? 2 :
+ (kInput & (uint64_t(1) << 3)) ? 3 :
+ (kInput & (uint64_t(1) << 4)) ? 4 :
+ (kInput & (uint64_t(1) << 5)) ? 5 :
+ (kInput & (uint64_t(1) << 6)) ? 6 :
+ (kInput & (uint64_t(1) << 7)) ? 7 :
+ (kInput & (uint64_t(1) << 8)) ? 8 :
+ (kInput & (uint64_t(1) << 9)) ? 9 :
+ (kInput & (uint64_t(1) << 10)) ? 10 :
+ (kInput & (uint64_t(1) << 11)) ? 11 :
+ (kInput & (uint64_t(1) << 12)) ? 12 :
+ (kInput & (uint64_t(1) << 13)) ? 13 :
+ (kInput & (uint64_t(1) << 14)) ? 14 :
+ (kInput & (uint64_t(1) << 15)) ? 15 :
+ (kInput & (uint64_t(1) << 16)) ? 16 :
+ (kInput & (uint64_t(1) << 17)) ? 17 :
+ (kInput & (uint64_t(1) << 18)) ? 18 :
+ (kInput & (uint64_t(1) << 19)) ? 19 :
+ (kInput & (uint64_t(1) << 20)) ? 20 :
+ (kInput & (uint64_t(1) << 21)) ? 21 :
+ (kInput & (uint64_t(1) << 22)) ? 22 :
+ (kInput & (uint64_t(1) << 23)) ? 23 :
+ (kInput & (uint64_t(1) << 24)) ? 24 :
+ (kInput & (uint64_t(1) << 25)) ? 25 :
+ (kInput & (uint64_t(1) << 26)) ? 26 :
+ (kInput & (uint64_t(1) << 27)) ? 27 :
+ (kInput & (uint64_t(1) << 28)) ? 28 :
+ (kInput & (uint64_t(1) << 29)) ? 29 :
+ (kInput & (uint64_t(1) << 30)) ? 30 :
+ (kInput & (uint64_t(1) << 31)) ? 31 :
+ (kInput & (uint64_t(1) << 32)) ? 32 :
+ (kInput & (uint64_t(1) << 33)) ? 33 :
+ (kInput & (uint64_t(1) << 34)) ? 34 :
+ (kInput & (uint64_t(1) << 35)) ? 35 :
+ (kInput & (uint64_t(1) << 36)) ? 36 :
+ (kInput & (uint64_t(1) << 37)) ? 37 :
+ (kInput & (uint64_t(1) << 38)) ? 38 :
+ (kInput & (uint64_t(1) << 39)) ? 39 :
+ (kInput & (uint64_t(1) << 40)) ? 40 :
+ (kInput & (uint64_t(1) << 41)) ? 41 :
+ (kInput & (uint64_t(1) << 42)) ? 42 :
+ (kInput & (uint64_t(1) << 43)) ? 43 :
+ (kInput & (uint64_t(1) << 44)) ? 44 :
+ (kInput & (uint64_t(1) << 45)) ? 45 :
+ (kInput & (uint64_t(1) << 46)) ? 46 :
+ (kInput & (uint64_t(1) << 47)) ? 47 :
+ (kInput & (uint64_t(1) << 48)) ? 48 :
+ (kInput & (uint64_t(1) << 49)) ? 49 :
+ (kInput & (uint64_t(1) << 50)) ? 50 :
+ (kInput & (uint64_t(1) << 51)) ? 51 :
+ (kInput & (uint64_t(1) << 52)) ? 52 :
+ (kInput & (uint64_t(1) << 53)) ? 53 :
+ (kInput & (uint64_t(1) << 54)) ? 54 :
+ (kInput & (uint64_t(1) << 55)) ? 55 :
+ (kInput & (uint64_t(1) << 56)) ? 56 :
+ (kInput & (uint64_t(1) << 57)) ? 57 :
+ (kInput & (uint64_t(1) << 58)) ? 58 :
+ (kInput & (uint64_t(1) << 59)) ? 59 :
+ (kInput & (uint64_t(1) << 60)) ? 60 :
+ (kInput & (uint64_t(1) << 61)) ? 61 :
+ (kInput & (uint64_t(1) << 62)) ? 62 :
+ (kInput & (uint64_t(1) << 63)) ? 63 : 64;
+};
-// ============================================================================
-// [asmjit::Support - PopCnt]
-// ============================================================================
+// Support - PopCnt
+// ================
// Based on the following resource:
// http://graphics.stanford.edu/~seander/bithacks.html
@@ -390,9 +494,8 @@ static inline uint32_t popcnt(T x) noexcept { return Internal::popcntImpl(asUInt
template<typename T>
static inline uint32_t constPopcnt(T x) noexcept { return Internal::constPopcntImpl(asUInt(x)); }
-// ============================================================================
-// [asmjit::Support - Min/Max]
-// ============================================================================
+// Support - Min/Max
+// =================
// NOTE: These are constexpr `min()` and `max()` implementations that are not
// exactly the same as `std::min()` and `std::max()`. The return value is not
@@ -410,14 +513,36 @@ static constexpr T max(const T& a, const T& b) noexcept { return a < b ? b : a;
template<typename T, typename... Args>
static constexpr T max(const T& a, const T& b, Args&&... args) noexcept { return max(max(a, b), std::forward<Args>(args)...); }
-// ============================================================================
-// [asmjit::Support - Overflow Arithmetic]
-// ============================================================================
+// Support - Immediate Helpers
+// ===========================
+
+namespace Internal {
+ template<typename T, bool IsFloat>
+ struct ImmConv {
+ static inline int64_t fromT(const T& x) noexcept { return int64_t(x); }
+ static inline T toT(int64_t x) noexcept { return T(uint64_t(x) & Support::allOnes<typename std::make_unsigned<T>::type>()); }
+ };
+
+ template<typename T>
+ struct ImmConv<T, true> {
+ static inline int64_t fromT(const T& x) noexcept { return int64_t(bitCast<int64_t>(double(x))); }
+ static inline T toT(int64_t x) noexcept { return T(bitCast<double>(x)); }
+ };
+}
+
+template<typename T>
+static inline int64_t immediateFromT(const T& x) noexcept { return Internal::ImmConv<T, std::is_floating_point<T>::value>::fromT(x); }
+
+template<typename T>
+static inline T immediateToT(int64_t x) noexcept { return Internal::ImmConv<T, std::is_floating_point<T>::value>::toT(x); }
+
+// Support - Overflow Arithmetic
+// =============================
//! \cond
namespace Internal {
template<typename T>
- ASMJIT_INLINE T addOverflowFallback(T x, T y, FastUInt8* of) noexcept {
+ inline T addOverflowFallback(T x, T y, FastUInt8* of) noexcept {
typedef typename std::make_unsigned<T>::type U;
U result = U(x) + U(y);
@@ -426,7 +551,7 @@ namespace Internal {
}
template<typename T>
- ASMJIT_INLINE T subOverflowFallback(T x, T y, FastUInt8* of) noexcept {
+ inline T subOverflowFallback(T x, T y, FastUInt8* of) noexcept {
typedef typename std::make_unsigned<T>::type U;
U result = U(x) - U(y);
@@ -435,7 +560,7 @@ namespace Internal {
}
template<typename T>
- ASMJIT_INLINE T mulOverflowFallback(T x, T y, FastUInt8* of) noexcept {
+ inline T mulOverflowFallback(T x, T y, FastUInt8* of) noexcept {
typedef typename Internal::StdInt<sizeof(T) * 2, isUnsigned<T>()>::Type I;
typedef typename std::make_unsigned<I>::type U;
@@ -453,32 +578,32 @@ namespace Internal {
}
template<>
- ASMJIT_INLINE int64_t mulOverflowFallback(int64_t x, int64_t y, FastUInt8* of) noexcept {
+ inline int64_t mulOverflowFallback(int64_t x, int64_t y, FastUInt8* of) noexcept {
int64_t result = int64_t(uint64_t(x) * uint64_t(y));
*of = FastUInt8(*of | FastUInt8(x && (result / x != y)));
return result;
}
template<>
- ASMJIT_INLINE uint64_t mulOverflowFallback(uint64_t x, uint64_t y, FastUInt8* of) noexcept {
+ inline uint64_t mulOverflowFallback(uint64_t x, uint64_t y, FastUInt8* of) noexcept {
uint64_t result = x * y;
*of = FastUInt8(*of | FastUInt8(y != 0 && allOnes<uint64_t>() / y < x));
return result;
}
// These can be specialized.
- template<typename T> ASMJIT_INLINE T addOverflowImpl(const T& x, const T& y, FastUInt8* of) noexcept { return addOverflowFallback(x, y, of); }
- template<typename T> ASMJIT_INLINE T subOverflowImpl(const T& x, const T& y, FastUInt8* of) noexcept { return subOverflowFallback(x, y, of); }
- template<typename T> ASMJIT_INLINE T mulOverflowImpl(const T& x, const T& y, FastUInt8* of) noexcept { return mulOverflowFallback(x, y, of); }
+ template<typename T> inline T addOverflowImpl(const T& x, const T& y, FastUInt8* of) noexcept { return addOverflowFallback(x, y, of); }
+ template<typename T> inline T subOverflowImpl(const T& x, const T& y, FastUInt8* of) noexcept { return subOverflowFallback(x, y, of); }
+ template<typename T> inline T mulOverflowImpl(const T& x, const T& y, FastUInt8* of) noexcept { return mulOverflowFallback(x, y, of); }
#if defined(__GNUC__) && !defined(ASMJIT_NO_INTRINSICS)
#if defined(__clang__) || __GNUC__ >= 5
- #define ASMJIT_ARITH_OVERFLOW_SPECIALIZE(FUNC, T, RESULT_T, BUILTIN) \
- template<> \
- ASMJIT_INLINE T FUNC(const T& x, const T& y, FastUInt8* of) noexcept { \
- RESULT_T result; \
- *of = FastUInt8(*of | (BUILTIN((RESULT_T)x, (RESULT_T)y, &result))); \
- return T(result); \
+ #define ASMJIT_ARITH_OVERFLOW_SPECIALIZE(FUNC, T, RESULT_T, BUILTIN) \
+ template<> \
+ inline T FUNC(const T& x, const T& y, FastUInt8* of) noexcept { \
+ RESULT_T result; \
+ *of = FastUInt8(*of | (BUILTIN((RESULT_T)x, (RESULT_T)y, &result))); \
+ return T(result); \
}
ASMJIT_ARITH_OVERFLOW_SPECIALIZE(addOverflowImpl, int32_t , int , __builtin_sadd_overflow )
ASMJIT_ARITH_OVERFLOW_SPECIALIZE(addOverflowImpl, uint32_t, unsigned int , __builtin_uadd_overflow )
@@ -498,12 +623,12 @@ namespace Internal {
// There is a bug in MSVC that makes these specializations unusable, maybe in the future...
#if defined(_MSC_VER) && 0
- #define ASMJIT_ARITH_OVERFLOW_SPECIALIZE(FUNC, T, ALT_T, BUILTIN) \
- template<> \
- ASMJIT_INLINE T FUNC(T x, T y, FastUInt8* of) noexcept { \
- ALT_T result; \
- *of = FastUInt8(*of | BUILTIN(0, (ALT_T)x, (ALT_T)y, &result)); \
- return T(result); \
+ #define ASMJIT_ARITH_OVERFLOW_SPECIALIZE(FUNC, T, ALT_T, BUILTIN) \
+ template<> \
+ inline T FUNC(T x, T y, FastUInt8* of) noexcept { \
+ ALT_T result; \
+ *of = FastUInt8(*of | BUILTIN(0, (ALT_T)x, (ALT_T)y, &result)); \
+ return T(result); \
}
ASMJIT_ARITH_OVERFLOW_SPECIALIZE(addOverflowImpl, uint32_t, unsigned int , _addcarry_u32 )
ASMJIT_ARITH_OVERFLOW_SPECIALIZE(subOverflowImpl, uint32_t, unsigned int , _subborrow_u32)
@@ -517,17 +642,16 @@ namespace Internal {
//! \endcond
template<typename T>
-static ASMJIT_INLINE T addOverflow(const T& x, const T& y, FastUInt8* of) noexcept { return T(Internal::addOverflowImpl(asStdInt(x), asStdInt(y), of)); }
+static inline T addOverflow(const T& x, const T& y, FastUInt8* of) noexcept { return T(Internal::addOverflowImpl(asStdInt(x), asStdInt(y), of)); }
template<typename T>
-static ASMJIT_INLINE T subOverflow(const T& x, const T& y, FastUInt8* of) noexcept { return T(Internal::subOverflowImpl(asStdInt(x), asStdInt(y), of)); }
+static inline T subOverflow(const T& x, const T& y, FastUInt8* of) noexcept { return T(Internal::subOverflowImpl(asStdInt(x), asStdInt(y), of)); }
template<typename T>
-static ASMJIT_INLINE T mulOverflow(const T& x, const T& y, FastUInt8* of) noexcept { return T(Internal::mulOverflowImpl(asStdInt(x), asStdInt(y), of)); }
+static inline T mulOverflow(const T& x, const T& y, FastUInt8* of) noexcept { return T(Internal::mulOverflowImpl(asStdInt(x), asStdInt(y), of)); }
-// ============================================================================
-// [asmjit::Support - Alignment]
-// ============================================================================
+// Support - Alignment
+// ===================
template<typename X, typename Y>
static constexpr bool isAligned(X base, Y alignment) noexcept {
@@ -568,9 +692,8 @@ static constexpr X alignDown(X x, Y alignment) noexcept {
return (X)( (U)x & ~((U)(alignment) - 1u) );
}
-// ============================================================================
-// [asmjit::Support - NumGranularized]
-// ============================================================================
+// Support - NumGranularized
+// =========================
//! Calculates the number of elements that would be required if `base` is
//! granularized by `granularity`. This function can be used to calculate
@@ -581,9 +704,8 @@ static constexpr X numGranularized(X base, Y granularity) noexcept {
return X((U(base) + U(granularity) - 1) / U(granularity));
}
-// ============================================================================
-// [asmjit::Support - IsBetween]
-// ============================================================================
+// Support - IsBetween
+// ===================
//! Checks whether `x` is greater than or equal to `a` and lesser than or equal to `b`.
template<typename T>
@@ -591,9 +713,8 @@ static constexpr bool isBetween(const T& x, const T& a, const T& b) noexcept {
return x >= a && x <= b;
}
-// ============================================================================
-// [asmjit::Support - IsInt / IsUInt]
-// ============================================================================
+// Support - IsInt & IsUInt
+// ========================
//! Checks whether the given integer `x` can be casted to a 4-bit signed integer.
template<typename T>
@@ -601,8 +722,16 @@ static constexpr bool isInt4(T x) noexcept {
typedef typename std::make_signed<T>::type S;
typedef typename std::make_unsigned<T>::type U;
- return std::is_signed<T>::value ? isBetween<S>(S(x), -8, 7)
- : U(x) <= U(7u);
+ return std::is_signed<T>::value ? isBetween<S>(S(x), -8, 7) : U(x) <= U(7u);
+}
+
+//! Checks whether the given integer `x` can be casted to a 7-bit signed integer.
+template<typename T>
+static constexpr bool isInt7(T x) noexcept {
+ typedef typename std::make_signed<T>::type S;
+ typedef typename std::make_unsigned<T>::type U;
+
+ return std::is_signed<T>::value ? isBetween<S>(S(x), -64, 63) : U(x) <= U(63u);
}
//! Checks whether the given integer `x` can be casted to an 8-bit signed integer.
@@ -611,8 +740,27 @@ static constexpr bool isInt8(T x) noexcept {
typedef typename std::make_signed<T>::type S;
typedef typename std::make_unsigned<T>::type U;
- return std::is_signed<T>::value ? sizeof(T) <= 1 || isBetween<S>(S(x), -128, 127)
- : U(x) <= U(127u);
+ return std::is_signed<T>::value ? sizeof(T) <= 1 || isBetween<S>(S(x), -128, 127) : U(x) <= U(127u);
+}
+
+//! Checks whether the given integer `x` can be casted to a 9-bit signed integer.
+template<typename T>
+static constexpr bool isInt9(T x) noexcept {
+ typedef typename std::make_signed<T>::type S;
+ typedef typename std::make_unsigned<T>::type U;
+
+ return std::is_signed<T>::value ? sizeof(T) <= 1 || isBetween<S>(S(x), -256, 255)
+ : sizeof(T) <= 1 || U(x) <= U(255u);
+}
+
+//! Checks whether the given integer `x` can be casted to a 10-bit signed integer.
+template<typename T>
+static constexpr bool isInt10(T x) noexcept {
+ typedef typename std::make_signed<T>::type S;
+ typedef typename std::make_unsigned<T>::type U;
+
+ return std::is_signed<T>::value ? sizeof(T) <= 1 || isBetween<S>(S(x), -512, 511)
+ : sizeof(T) <= 1 || U(x) <= U(511u);
}
//! Checks whether the given integer `x` can be casted to a 16-bit signed integer.
@@ -686,17 +834,40 @@ static constexpr bool isIntOrUInt32(T x) noexcept {
return sizeof(T) <= 4 ? true : (uint32_t(uint64_t(x) >> 32) + 1u) <= 1u;
}
-// ============================================================================
-// [asmjit::Support - ByteSwap]
-// ============================================================================
+static bool inline isEncodableOffset32(int32_t offset, uint32_t nBits) noexcept {
+ uint32_t nRev = 32 - nBits;
+ return Support::sar(Support::shl(offset, nRev), nRev) == offset;
+}
+
+static bool inline isEncodableOffset64(int64_t offset, uint32_t nBits) noexcept {
+ uint32_t nRev = 64 - nBits;
+ return Support::sar(Support::shl(offset, nRev), nRev) == offset;
+}
+
+// Support - ByteSwap
+// ==================
+
+static inline uint16_t byteswap16(uint16_t x) noexcept {
+ return uint16_t(((x >> 8) & 0xFFu) | ((x & 0xFFu) << 8));
+}
-static constexpr uint32_t byteswap32(uint32_t x) noexcept {
+static inline uint32_t byteswap32(uint32_t x) noexcept {
return (x << 24) | (x >> 24) | ((x << 8) & 0x00FF0000u) | ((x >> 8) & 0x0000FF00);
}
-// ============================================================================
-// [asmjit::Support - BytePack / Unpack]
-// ============================================================================
+static inline uint64_t byteswap64(uint64_t x) noexcept {
+#if (defined(__GNUC__) || defined(__clang__)) && !defined(ASMJIT_NO_INTRINSICS)
+ return uint64_t(__builtin_bswap64(uint64_t(x)));
+#elif defined(_MSC_VER) && !defined(ASMJIT_NO_INTRINSICS)
+ return uint64_t(_byteswap_uint64(uint64_t(x)));
+#else
+ return (uint64_t(byteswap32(uint32_t(uint64_t(x) >> 32 ))) ) |
+ (uint64_t(byteswap32(uint32_t(uint64_t(x) & 0xFFFFFFFFu))) << 32) ;
+#endif
+}
+
+// Support - BytePack & Unpack
+// ===========================
//! Pack four 8-bit integer into a 32-bit integer as it is an array of `{b0,b1,b2,b3}`.
static constexpr uint32_t bytepack32_4x8(uint32_t a, uint32_t b, uint32_t c, uint32_t d) noexcept {
@@ -709,17 +880,15 @@ static constexpr uint32_t unpackU32At0(T x) noexcept { return ASMJIT_ARCH_LE ? u
template<typename T>
static constexpr uint32_t unpackU32At1(T x) noexcept { return ASMJIT_ARCH_BE ? uint32_t(uint64_t(x) & 0xFFFFFFFFu) : uint32_t(uint64_t(x) >> 32); }
-// ============================================================================
-// [asmjit::Support - Position of byte (in bit-shift)]
-// ============================================================================
+// Support - Position of byte (in bit-shift)
+// =========================================
static inline uint32_t byteShiftOfDWordStruct(uint32_t index) noexcept {
return ASMJIT_ARCH_LE ? index * 8 : (uint32_t(sizeof(uint32_t)) - 1u - index) * 8;
}
-// ============================================================================
-// [asmjit::Support - String Utilities]
-// ============================================================================
+// Support - String Utilities
+// ==========================
template<typename T>
static constexpr T asciiToLower(T c) noexcept { return T(c ^ T(T(c >= T('A') && c <= T('Z')) << 5)); }
@@ -727,7 +896,7 @@ static constexpr T asciiToLower(T c) noexcept { return T(c ^ T(T(c >= T('A') &&
template<typename T>
static constexpr T asciiToUpper(T c) noexcept { return T(c ^ T(T(c >= T('a') && c <= T('z')) << 5)); }
-static ASMJIT_INLINE size_t strLen(const char* s, size_t maxSize) noexcept {
+static ASMJIT_FORCE_INLINE size_t strLen(const char* s, size_t maxSize) noexcept {
size_t i = 0;
while (i < maxSize && s[i] != '\0')
i++;
@@ -746,7 +915,7 @@ static inline uint32_t hashString(const char* data, size_t size) noexcept {
return hashCode;
}
-static ASMJIT_INLINE const char* findPackedString(const char* p, uint32_t id) noexcept {
+static ASMJIT_FORCE_INLINE const char* findPackedString(const char* p, uint32_t id) noexcept {
uint32_t i = 0;
while (i < id) {
while (p[0])
@@ -762,7 +931,7 @@ static ASMJIT_INLINE const char* findPackedString(const char* p, uint32_t id) no
//! `a` is a null terminated instruction name from arch-specific `nameData[]`
//! table. `b` is a possibly non-null terminated instruction name passed to
//! `InstAPI::stringToInstId()`.
-static ASMJIT_INLINE int cmpInstName(const char* a, const char* b, size_t size) noexcept {
+static ASMJIT_FORCE_INLINE int cmpInstName(const char* a, const char* b, size_t size) noexcept {
for (size_t i = 0; i < size; i++) {
int c = int(uint8_t(a[i])) - int(uint8_t(b[i]));
if (c != 0) return c;
@@ -770,257 +939,251 @@ static ASMJIT_INLINE int cmpInstName(const char* a, const char* b, size_t size)
return int(uint8_t(a[size]));
}
-// ============================================================================
-// [asmjit::Support - Read / Write]
-// ============================================================================
+// Support - Memory Read Access - 8 Bits
+// =====================================
-static inline uint32_t readU8(const void* p) noexcept { return uint32_t(static_cast<const uint8_t*>(p)[0]); }
-static inline int32_t readI8(const void* p) noexcept { return int32_t(static_cast<const int8_t*>(p)[0]); }
+static inline uint8_t readU8(const void* p) noexcept { return static_cast<const uint8_t*>(p)[0]; }
+static inline int8_t readI8(const void* p) noexcept { return static_cast<const int8_t*>(p)[0]; }
-template<uint32_t BO, size_t Alignment>
-static inline uint32_t readU16x(const void* p) noexcept {
- if (BO == ByteOrder::kNative && (kUnalignedAccess16 || Alignment >= 2)) {
- typedef typename Internal::AlignedInt<uint16_t, Alignment>::T U16AlignedToN;
- return uint32_t(static_cast<const U16AlignedToN*>(p)[0]);
- }
- else {
- uint32_t hi = readU8(static_cast<const uint8_t*>(p) + (BO == ByteOrder::kLE ? 1 : 0));
- uint32_t lo = readU8(static_cast<const uint8_t*>(p) + (BO == ByteOrder::kLE ? 0 : 1));
- return shl(hi, 8) | lo;
- }
-}
+// Support - Memory Read Access - 16 Bits
+// ======================================
-template<uint32_t BO, size_t Alignment>
-static inline int32_t readI16x(const void* p) noexcept {
- if (BO == ByteOrder::kNative && (kUnalignedAccess16 || Alignment >= 2)) {
- typedef typename Internal::AlignedInt<uint16_t, Alignment>::T U16AlignedToN;
- return int32_t(int16_t(static_cast<const U16AlignedToN*>(p)[0]));
- }
- else {
- int32_t hi = readI8(static_cast<const uint8_t*>(p) + (BO == ByteOrder::kLE ? 1 : 0));
- uint32_t lo = readU8(static_cast<const uint8_t*>(p) + (BO == ByteOrder::kLE ? 0 : 1));
- return shl(hi, 8) | int32_t(lo);
- }
+template<ByteOrder BO, size_t Alignment>
+static inline uint16_t readU16x(const void* p) noexcept {
+ typedef typename Internal::AliasedUInt<uint16_t, Alignment>::T U16AlignedToN;
+ uint16_t x = static_cast<const U16AlignedToN*>(p)[0];
+ return BO == ByteOrder::kNative ? x : byteswap16(x);
}
-template<uint32_t BO = ByteOrder::kNative>
+template<size_t Alignment = 1>
+static inline uint16_t readU16u(const void* p) noexcept { return readU16x<ByteOrder::kNative, Alignment>(p); }
+template<size_t Alignment = 1>
+static inline uint16_t readU16uLE(const void* p) noexcept { return readU16x<ByteOrder::kLE, Alignment>(p); }
+template<size_t Alignment = 1>
+static inline uint16_t readU16uBE(const void* p) noexcept { return readU16x<ByteOrder::kBE, Alignment>(p); }
+
+static inline uint16_t readU16a(const void* p) noexcept { return readU16x<ByteOrder::kNative, 2>(p); }
+static inline uint16_t readU16aLE(const void* p) noexcept { return readU16x<ByteOrder::kLE, 2>(p); }
+static inline uint16_t readU16aBE(const void* p) noexcept { return readU16x<ByteOrder::kBE, 2>(p); }
+
+template<ByteOrder BO, size_t Alignment>
+static inline int16_t readI16x(const void* p) noexcept { return int16_t(readU16x<BO, Alignment>(p)); }
+
+template<size_t Alignment = 1>
+static inline int16_t readI16u(const void* p) noexcept { return int16_t(readU16x<ByteOrder::kNative, Alignment>(p)); }
+template<size_t Alignment = 1>
+static inline int16_t readI16uLE(const void* p) noexcept { return int16_t(readU16x<ByteOrder::kLE, Alignment>(p)); }
+template<size_t Alignment = 1>
+static inline int16_t readI16uBE(const void* p) noexcept { return int16_t(readU16x<ByteOrder::kBE, Alignment>(p)); }
+
+static inline int16_t readI16a(const void* p) noexcept { return int16_t(readU16x<ByteOrder::kNative, 2>(p)); }
+static inline int16_t readI16aLE(const void* p) noexcept { return int16_t(readU16x<ByteOrder::kLE, 2>(p)); }
+static inline int16_t readI16aBE(const void* p) noexcept { return int16_t(readU16x<ByteOrder::kBE, 2>(p)); }
+
+// Support - Memory Read Access - 24 Bits
+// ======================================
+
+template<ByteOrder BO = ByteOrder::kNative>
static inline uint32_t readU24u(const void* p) noexcept {
uint32_t b0 = readU8(static_cast<const uint8_t*>(p) + (BO == ByteOrder::kLE ? 2 : 0));
uint32_t b1 = readU8(static_cast<const uint8_t*>(p) + (BO == ByteOrder::kLE ? 1 : 1));
uint32_t b2 = readU8(static_cast<const uint8_t*>(p) + (BO == ByteOrder::kLE ? 0 : 2));
- return shl(b0, 16) | shl(b1, 8) | b2;
+ return (b0 << 16) | (b1 << 8) | b2;
}
-template<uint32_t BO, size_t Alignment>
+static inline uint32_t readU24uLE(const void* p) noexcept { return readU24u<ByteOrder::kLE>(p); }
+static inline uint32_t readU24uBE(const void* p) noexcept { return readU24u<ByteOrder::kBE>(p); }
+
+// Support - Memory Read Access - 32 Bits
+// ======================================
+
+template<ByteOrder BO, size_t Alignment>
static inline uint32_t readU32x(const void* p) noexcept {
- if (kUnalignedAccess32 || Alignment >= 4) {
- typedef typename Internal::AlignedInt<uint32_t, Alignment>::T U32AlignedToN;
- uint32_t x = static_cast<const U32AlignedToN*>(p)[0];
- return BO == ByteOrder::kNative ? x : byteswap32(x);
- }
- else {
- uint32_t hi = readU16x<BO, Alignment >= 2 ? size_t(2) : Alignment>(static_cast<const uint8_t*>(p) + (BO == ByteOrder::kLE ? 2 : 0));
- uint32_t lo = readU16x<BO, Alignment >= 2 ? size_t(2) : Alignment>(static_cast<const uint8_t*>(p) + (BO == ByteOrder::kLE ? 0 : 2));
- return shl(hi, 16) | lo;
- }
+ typedef typename Internal::AliasedUInt<uint32_t, Alignment>::T U32AlignedToN;
+ uint32_t x = static_cast<const U32AlignedToN*>(p)[0];
+ return BO == ByteOrder::kNative ? x : byteswap32(x);
}
-template<uint32_t BO, size_t Alignment>
+template<size_t Alignment = 1>
+static inline uint32_t readU32u(const void* p) noexcept { return readU32x<ByteOrder::kNative, Alignment>(p); }
+template<size_t Alignment = 1>
+static inline uint32_t readU32uLE(const void* p) noexcept { return readU32x<ByteOrder::kLE, Alignment>(p); }
+template<size_t Alignment = 1>
+static inline uint32_t readU32uBE(const void* p) noexcept { return readU32x<ByteOrder::kBE, Alignment>(p); }
+
+static inline uint32_t readU32a(const void* p) noexcept { return readU32x<ByteOrder::kNative, 4>(p); }
+static inline uint32_t readU32aLE(const void* p) noexcept { return readU32x<ByteOrder::kLE, 4>(p); }
+static inline uint32_t readU32aBE(const void* p) noexcept { return readU32x<ByteOrder::kBE, 4>(p); }
+
+template<ByteOrder BO, size_t Alignment>
+static inline uint32_t readI32x(const void* p) noexcept { return int32_t(readU32x<BO, Alignment>(p)); }
+
+template<size_t Alignment = 1>
+static inline int32_t readI32u(const void* p) noexcept { return int32_t(readU32x<ByteOrder::kNative, Alignment>(p)); }
+template<size_t Alignment = 1>
+static inline int32_t readI32uLE(const void* p) noexcept { return int32_t(readU32x<ByteOrder::kLE, Alignment>(p)); }
+template<size_t Alignment = 1>
+static inline int32_t readI32uBE(const void* p) noexcept { return int32_t(readU32x<ByteOrder::kBE, Alignment>(p)); }
+
+static inline int32_t readI32a(const void* p) noexcept { return int32_t(readU32x<ByteOrder::kNative, 4>(p)); }
+static inline int32_t readI32aLE(const void* p) noexcept { return int32_t(readU32x<ByteOrder::kLE, 4>(p)); }
+static inline int32_t readI32aBE(const void* p) noexcept { return int32_t(readU32x<ByteOrder::kBE, 4>(p)); }
+
+// Support - Memory Read Access - 64 Bits
+// ======================================
+
+template<ByteOrder BO, size_t Alignment>
static inline uint64_t readU64x(const void* p) noexcept {
- if (BO == ByteOrder::kNative && (kUnalignedAccess64 || Alignment >= 8)) {
- typedef typename Internal::AlignedInt<uint64_t, Alignment>::T U64AlignedToN;
- return static_cast<const U64AlignedToN*>(p)[0];
- }
- else {
- uint32_t hi = readU32x<BO, Alignment >= 4 ? size_t(4) : Alignment>(static_cast<const uint8_t*>(p) + (BO == ByteOrder::kLE ? 4 : 0));
- uint32_t lo = readU32x<BO, Alignment >= 4 ? size_t(4) : Alignment>(static_cast<const uint8_t*>(p) + (BO == ByteOrder::kLE ? 0 : 4));
- return shl(uint64_t(hi), 32) | lo;
- }
+ typedef typename Internal::AliasedUInt<uint64_t, Alignment>::T U64AlignedToN;
+ uint64_t x = static_cast<const U64AlignedToN*>(p)[0];
+ return BO == ByteOrder::kNative ? x : byteswap64(x);
}
-template<uint32_t BO, size_t Alignment>
-static inline int32_t readI32x(const void* p) noexcept { return int32_t(readU32x<BO, Alignment>(p)); }
+template<size_t Alignment = 1>
+static inline uint64_t readU64u(const void* p) noexcept { return readU64x<ByteOrder::kNative, Alignment>(p); }
+template<size_t Alignment = 1>
+static inline uint64_t readU64uLE(const void* p) noexcept { return readU64x<ByteOrder::kLE, Alignment>(p); }
+template<size_t Alignment = 1>
+static inline uint64_t readU64uBE(const void* p) noexcept { return readU64x<ByteOrder::kBE, Alignment>(p); }
+
+static inline uint64_t readU64a(const void* p) noexcept { return readU64x<ByteOrder::kNative, 8>(p); }
+static inline uint64_t readU64aLE(const void* p) noexcept { return readU64x<ByteOrder::kLE, 8>(p); }
+static inline uint64_t readU64aBE(const void* p) noexcept { return readU64x<ByteOrder::kBE, 8>(p); }
-template<uint32_t BO, size_t Alignment>
+template<ByteOrder BO, size_t Alignment>
static inline int64_t readI64x(const void* p) noexcept { return int64_t(readU64x<BO, Alignment>(p)); }
-template<size_t Alignment> static inline int32_t readI16xLE(const void* p) noexcept { return readI16x<ByteOrder::kLE, Alignment>(p); }
-template<size_t Alignment> static inline int32_t readI16xBE(const void* p) noexcept { return readI16x<ByteOrder::kBE, Alignment>(p); }
-template<size_t Alignment> static inline uint32_t readU16xLE(const void* p) noexcept { return readU16x<ByteOrder::kLE, Alignment>(p); }
-template<size_t Alignment> static inline uint32_t readU16xBE(const void* p) noexcept { return readU16x<ByteOrder::kBE, Alignment>(p); }
-template<size_t Alignment> static inline int32_t readI32xLE(const void* p) noexcept { return readI32x<ByteOrder::kLE, Alignment>(p); }
-template<size_t Alignment> static inline int32_t readI32xBE(const void* p) noexcept { return readI32x<ByteOrder::kBE, Alignment>(p); }
-template<size_t Alignment> static inline uint32_t readU32xLE(const void* p) noexcept { return readU32x<ByteOrder::kLE, Alignment>(p); }
-template<size_t Alignment> static inline uint32_t readU32xBE(const void* p) noexcept { return readU32x<ByteOrder::kBE, Alignment>(p); }
-template<size_t Alignment> static inline int64_t readI64xLE(const void* p) noexcept { return readI64x<ByteOrder::kLE, Alignment>(p); }
-template<size_t Alignment> static inline int64_t readI64xBE(const void* p) noexcept { return readI64x<ByteOrder::kBE, Alignment>(p); }
-template<size_t Alignment> static inline uint64_t readU64xLE(const void* p) noexcept { return readU64x<ByteOrder::kLE, Alignment>(p); }
-template<size_t Alignment> static inline uint64_t readU64xBE(const void* p) noexcept { return readU64x<ByteOrder::kBE, Alignment>(p); }
-
-static inline int32_t readI16a(const void* p) noexcept { return readI16x<ByteOrder::kNative, 2>(p); }
-static inline int32_t readI16u(const void* p) noexcept { return readI16x<ByteOrder::kNative, 1>(p); }
-static inline uint32_t readU16a(const void* p) noexcept { return readU16x<ByteOrder::kNative, 2>(p); }
-static inline uint32_t readU16u(const void* p) noexcept { return readU16x<ByteOrder::kNative, 1>(p); }
-
-static inline int32_t readI16aLE(const void* p) noexcept { return readI16xLE<2>(p); }
-static inline int32_t readI16uLE(const void* p) noexcept { return readI16xLE<1>(p); }
-static inline uint32_t readU16aLE(const void* p) noexcept { return readU16xLE<2>(p); }
-static inline uint32_t readU16uLE(const void* p) noexcept { return readU16xLE<1>(p); }
-
-static inline int32_t readI16aBE(const void* p) noexcept { return readI16xBE<2>(p); }
-static inline int32_t readI16uBE(const void* p) noexcept { return readI16xBE<1>(p); }
-static inline uint32_t readU16aBE(const void* p) noexcept { return readU16xBE<2>(p); }
-static inline uint32_t readU16uBE(const void* p) noexcept { return readU16xBE<1>(p); }
+template<size_t Alignment = 1>
+static inline int64_t readI64u(const void* p) noexcept { return int64_t(readU64x<ByteOrder::kNative, Alignment>(p)); }
+template<size_t Alignment = 1>
+static inline int64_t readI64uLE(const void* p) noexcept { return int64_t(readU64x<ByteOrder::kLE, Alignment>(p)); }
+template<size_t Alignment = 1>
+static inline int64_t readI64uBE(const void* p) noexcept { return int64_t(readU64x<ByteOrder::kBE, Alignment>(p)); }
-static inline uint32_t readU24uLE(const void* p) noexcept { return readU24u<ByteOrder::kLE>(p); }
-static inline uint32_t readU24uBE(const void* p) noexcept { return readU24u<ByteOrder::kBE>(p); }
+static inline int64_t readI64a(const void* p) noexcept { return int64_t(readU64x<ByteOrder::kNative, 8>(p)); }
+static inline int64_t readI64aLE(const void* p) noexcept { return int64_t(readU64x<ByteOrder::kLE, 8>(p)); }
+static inline int64_t readI64aBE(const void* p) noexcept { return int64_t(readU64x<ByteOrder::kBE, 8>(p)); }
-static inline int32_t readI32a(const void* p) noexcept { return readI32x<ByteOrder::kNative, 4>(p); }
-static inline int32_t readI32u(const void* p) noexcept { return readI32x<ByteOrder::kNative, 1>(p); }
-static inline uint32_t readU32a(const void* p) noexcept { return readU32x<ByteOrder::kNative, 4>(p); }
-static inline uint32_t readU32u(const void* p) noexcept { return readU32x<ByteOrder::kNative, 1>(p); }
+// Support - Memory Write Access - 8 Bits
+// ======================================
-static inline int32_t readI32aLE(const void* p) noexcept { return readI32xLE<4>(p); }
-static inline int32_t readI32uLE(const void* p) noexcept { return readI32xLE<1>(p); }
-static inline uint32_t readU32aLE(const void* p) noexcept { return readU32xLE<4>(p); }
-static inline uint32_t readU32uLE(const void* p) noexcept { return readU32xLE<1>(p); }
+static inline void writeU8(void* p, uint8_t x) noexcept { static_cast<uint8_t*>(p)[0] = x; }
+static inline void writeI8(void* p, int8_t x) noexcept { static_cast<int8_t*>(p)[0] = x; }
-static inline int32_t readI32aBE(const void* p) noexcept { return readI32xBE<4>(p); }
-static inline int32_t readI32uBE(const void* p) noexcept { return readI32xBE<1>(p); }
-static inline uint32_t readU32aBE(const void* p) noexcept { return readU32xBE<4>(p); }
-static inline uint32_t readU32uBE(const void* p) noexcept { return readU32xBE<1>(p); }
+// Support - Memory Write Access - 16 Bits
+// =======================================
-static inline int64_t readI64a(const void* p) noexcept { return readI64x<ByteOrder::kNative, 8>(p); }
-static inline int64_t readI64u(const void* p) noexcept { return readI64x<ByteOrder::kNative, 1>(p); }
-static inline uint64_t readU64a(const void* p) noexcept { return readU64x<ByteOrder::kNative, 8>(p); }
-static inline uint64_t readU64u(const void* p) noexcept { return readU64x<ByteOrder::kNative, 1>(p); }
-
-static inline int64_t readI64aLE(const void* p) noexcept { return readI64xLE<8>(p); }
-static inline int64_t readI64uLE(const void* p) noexcept { return readI64xLE<1>(p); }
-static inline uint64_t readU64aLE(const void* p) noexcept { return readU64xLE<8>(p); }
-static inline uint64_t readU64uLE(const void* p) noexcept { return readU64xLE<1>(p); }
-
-static inline int64_t readI64aBE(const void* p) noexcept { return readI64xBE<8>(p); }
-static inline int64_t readI64uBE(const void* p) noexcept { return readI64xBE<1>(p); }
-static inline uint64_t readU64aBE(const void* p) noexcept { return readU64xBE<8>(p); }
-static inline uint64_t readU64uBE(const void* p) noexcept { return readU64xBE<1>(p); }
-
-static inline void writeU8(void* p, uint32_t x) noexcept { static_cast<uint8_t*>(p)[0] = uint8_t(x & 0xFFu); }
-static inline void writeI8(void* p, int32_t x) noexcept { static_cast<uint8_t*>(p)[0] = uint8_t(x & 0xFF); }
-
-template<uint32_t BO = ByteOrder::kNative, size_t Alignment = 1>
-static inline void writeU16x(void* p, uint32_t x) noexcept {
- if (BO == ByteOrder::kNative && (kUnalignedAccess16 || Alignment >= 2)) {
- typedef typename Internal::AlignedInt<uint16_t, Alignment>::T U16AlignedToN;
- static_cast<U16AlignedToN*>(p)[0] = uint16_t(x & 0xFFFFu);
- }
- else {
- static_cast<uint8_t*>(p)[0] = uint8_t((x >> (BO == ByteOrder::kLE ? 0 : 8)) & 0xFFu);
- static_cast<uint8_t*>(p)[1] = uint8_t((x >> (BO == ByteOrder::kLE ? 8 : 0)) & 0xFFu);
- }
+template<ByteOrder BO = ByteOrder::kNative, size_t Alignment = 1>
+static inline void writeU16x(void* p, uint16_t x) noexcept {
+ typedef typename Internal::AliasedUInt<uint16_t, Alignment>::T U16AlignedToN;
+ static_cast<U16AlignedToN*>(p)[0] = BO == ByteOrder::kNative ? x : byteswap16(x);
}
-template<uint32_t BO = ByteOrder::kNative>
+template<size_t Alignment = 1>
+static inline void writeU16uLE(void* p, uint16_t x) noexcept { writeU16x<ByteOrder::kLE, Alignment>(p, x); }
+template<size_t Alignment = 1>
+static inline void writeU16uBE(void* p, uint16_t x) noexcept { writeU16x<ByteOrder::kBE, Alignment>(p, x); }
+
+static inline void writeU16a(void* p, uint16_t x) noexcept { writeU16x<ByteOrder::kNative, 2>(p, x); }
+static inline void writeU16aLE(void* p, uint16_t x) noexcept { writeU16x<ByteOrder::kLE, 2>(p, x); }
+static inline void writeU16aBE(void* p, uint16_t x) noexcept { writeU16x<ByteOrder::kBE, 2>(p, x); }
+
+
+template<ByteOrder BO = ByteOrder::kNative, size_t Alignment = 1>
+static inline void writeI16x(void* p, int16_t x) noexcept { writeU16x<BO, Alignment>(p, uint16_t(x)); }
+
+template<size_t Alignment = 1>
+static inline void writeI16uLE(void* p, int16_t x) noexcept { writeU16x<ByteOrder::kLE, Alignment>(p, uint16_t(x)); }
+template<size_t Alignment = 1>
+static inline void writeI16uBE(void* p, int16_t x) noexcept { writeU16x<ByteOrder::kBE, Alignment>(p, uint16_t(x)); }
+
+static inline void writeI16a(void* p, int16_t x) noexcept { writeU16x<ByteOrder::kNative, 2>(p, uint16_t(x)); }
+static inline void writeI16aLE(void* p, int16_t x) noexcept { writeU16x<ByteOrder::kLE, 2>(p, uint16_t(x)); }
+static inline void writeI16aBE(void* p, int16_t x) noexcept { writeU16x<ByteOrder::kBE, 2>(p, uint16_t(x)); }
+
+// Support - Memory Write Access - 24 Bits
+// =======================================
+
+template<ByteOrder BO = ByteOrder::kNative>
static inline void writeU24u(void* p, uint32_t v) noexcept {
static_cast<uint8_t*>(p)[0] = uint8_t((v >> (BO == ByteOrder::kLE ? 0 : 16)) & 0xFFu);
static_cast<uint8_t*>(p)[1] = uint8_t((v >> (BO == ByteOrder::kLE ? 8 : 8)) & 0xFFu);
static_cast<uint8_t*>(p)[2] = uint8_t((v >> (BO == ByteOrder::kLE ? 16 : 0)) & 0xFFu);
}
-template<uint32_t BO = ByteOrder::kNative, size_t Alignment = 1>
-static inline void writeU32x(void* p, uint32_t x) noexcept {
- if (kUnalignedAccess32 || Alignment >= 4) {
- typedef typename Internal::AlignedInt<uint32_t, Alignment>::T U32AlignedToN;
- static_cast<U32AlignedToN*>(p)[0] = (BO == ByteOrder::kNative) ? x : Support::byteswap32(x);
- }
- else {
- writeU16x<BO, Alignment >= 2 ? size_t(2) : Alignment>(static_cast<uint8_t*>(p) + 0, x >> (BO == ByteOrder::kLE ? 0 : 16));
- writeU16x<BO, Alignment >= 2 ? size_t(2) : Alignment>(static_cast<uint8_t*>(p) + 2, x >> (BO == ByteOrder::kLE ? 16 : 0));
- }
-}
-
-template<uint32_t BO = ByteOrder::kNative, size_t Alignment = 1>
-static inline void writeU64x(void* p, uint64_t x) noexcept {
- if (BO == ByteOrder::kNative && (kUnalignedAccess64 || Alignment >= 8)) {
- typedef typename Internal::AlignedInt<uint64_t, Alignment>::T U64AlignedToN;
- static_cast<U64AlignedToN*>(p)[0] = x;
- }
- else {
- writeU32x<BO, Alignment >= 4 ? size_t(4) : Alignment>(static_cast<uint8_t*>(p) + 0, uint32_t((x >> (BO == ByteOrder::kLE ? 0 : 32)) & 0xFFFFFFFFu));
- writeU32x<BO, Alignment >= 4 ? size_t(4) : Alignment>(static_cast<uint8_t*>(p) + 4, uint32_t((x >> (BO == ByteOrder::kLE ? 32 : 0)) & 0xFFFFFFFFu));
- }
-}
+static inline void writeU24uLE(void* p, uint32_t v) noexcept { writeU24u<ByteOrder::kLE>(p, v); }
+static inline void writeU24uBE(void* p, uint32_t v) noexcept { writeU24u<ByteOrder::kBE>(p, v); }
-template<uint32_t BO = ByteOrder::kNative, size_t Alignment = 1> static inline void writeI16x(void* p, int32_t x) noexcept { writeU16x<BO, Alignment>(p, uint32_t(x)); }
-template<uint32_t BO = ByteOrder::kNative, size_t Alignment = 1> static inline void writeI32x(void* p, int32_t x) noexcept { writeU32x<BO, Alignment>(p, uint32_t(x)); }
-template<uint32_t BO = ByteOrder::kNative, size_t Alignment = 1> static inline void writeI64x(void* p, int64_t x) noexcept { writeU64x<BO, Alignment>(p, uint64_t(x)); }
+// Support - Memory Write Access - 32 Bits
+// =======================================
-template<size_t Alignment = 1> static inline void writeI16xLE(void* p, int32_t x) noexcept { writeI16x<ByteOrder::kLE, Alignment>(p, x); }
-template<size_t Alignment = 1> static inline void writeI16xBE(void* p, int32_t x) noexcept { writeI16x<ByteOrder::kBE, Alignment>(p, x); }
-template<size_t Alignment = 1> static inline void writeU16xLE(void* p, uint32_t x) noexcept { writeU16x<ByteOrder::kLE, Alignment>(p, x); }
-template<size_t Alignment = 1> static inline void writeU16xBE(void* p, uint32_t x) noexcept { writeU16x<ByteOrder::kBE, Alignment>(p, x); }
+template<ByteOrder BO = ByteOrder::kNative, size_t Alignment = 1>
+static inline void writeU32x(void* p, uint32_t x) noexcept {
+ typedef typename Internal::AliasedUInt<uint32_t, Alignment>::T U32AlignedToN;
+ static_cast<U32AlignedToN*>(p)[0] = (BO == ByteOrder::kNative) ? x : Support::byteswap32(x);
+}
-template<size_t Alignment = 1> static inline void writeI32xLE(void* p, int32_t x) noexcept { writeI32x<ByteOrder::kLE, Alignment>(p, x); }
-template<size_t Alignment = 1> static inline void writeI32xBE(void* p, int32_t x) noexcept { writeI32x<ByteOrder::kBE, Alignment>(p, x); }
-template<size_t Alignment = 1> static inline void writeU32xLE(void* p, uint32_t x) noexcept { writeU32x<ByteOrder::kLE, Alignment>(p, x); }
-template<size_t Alignment = 1> static inline void writeU32xBE(void* p, uint32_t x) noexcept { writeU32x<ByteOrder::kBE, Alignment>(p, x); }
+template<size_t Alignment = 1>
+static inline void writeU32u(void* p, uint32_t x) noexcept { writeU32x<ByteOrder::kNative, Alignment>(p, x); }
+template<size_t Alignment = 1>
+static inline void writeU32uLE(void* p, uint32_t x) noexcept { writeU32x<ByteOrder::kLE, Alignment>(p, x); }
+template<size_t Alignment = 1>
+static inline void writeU32uBE(void* p, uint32_t x) noexcept { writeU32x<ByteOrder::kBE, Alignment>(p, x); }
-template<size_t Alignment = 1> static inline void writeI64xLE(void* p, int64_t x) noexcept { writeI64x<ByteOrder::kLE, Alignment>(p, x); }
-template<size_t Alignment = 1> static inline void writeI64xBE(void* p, int64_t x) noexcept { writeI64x<ByteOrder::kBE, Alignment>(p, x); }
-template<size_t Alignment = 1> static inline void writeU64xLE(void* p, uint64_t x) noexcept { writeU64x<ByteOrder::kLE, Alignment>(p, x); }
-template<size_t Alignment = 1> static inline void writeU64xBE(void* p, uint64_t x) noexcept { writeU64x<ByteOrder::kBE, Alignment>(p, x); }
+static inline void writeU32a(void* p, uint32_t x) noexcept { writeU32x<ByteOrder::kNative, 4>(p, x); }
+static inline void writeU32aLE(void* p, uint32_t x) noexcept { writeU32x<ByteOrder::kLE, 4>(p, x); }
+static inline void writeU32aBE(void* p, uint32_t x) noexcept { writeU32x<ByteOrder::kBE, 4>(p, x); }
-static inline void writeI16a(void* p, int32_t x) noexcept { writeI16x<ByteOrder::kNative, 2>(p, x); }
-static inline void writeI16u(void* p, int32_t x) noexcept { writeI16x<ByteOrder::kNative, 1>(p, x); }
-static inline void writeU16a(void* p, uint32_t x) noexcept { writeU16x<ByteOrder::kNative, 2>(p, x); }
-static inline void writeU16u(void* p, uint32_t x) noexcept { writeU16x<ByteOrder::kNative, 1>(p, x); }
+template<ByteOrder BO = ByteOrder::kNative, size_t Alignment = 1>
+static inline void writeI32x(void* p, int32_t x) noexcept { writeU32x<BO, Alignment>(p, uint32_t(x)); }
-static inline void writeI16aLE(void* p, int32_t x) noexcept { writeI16xLE<2>(p, x); }
-static inline void writeI16uLE(void* p, int32_t x) noexcept { writeI16xLE<1>(p, x); }
-static inline void writeU16aLE(void* p, uint32_t x) noexcept { writeU16xLE<2>(p, x); }
-static inline void writeU16uLE(void* p, uint32_t x) noexcept { writeU16xLE<1>(p, x); }
+template<size_t Alignment = 1>
+static inline void writeI32u(void* p, int32_t x) noexcept { writeU32x<ByteOrder::kNative, Alignment>(p, uint32_t(x)); }
+template<size_t Alignment = 1>
+static inline void writeI32uLE(void* p, int32_t x) noexcept { writeU32x<ByteOrder::kLE, Alignment>(p, uint32_t(x)); }
+template<size_t Alignment = 1>
+static inline void writeI32uBE(void* p, int32_t x) noexcept { writeU32x<ByteOrder::kBE, Alignment>(p, uint32_t(x)); }
-static inline void writeI16aBE(void* p, int32_t x) noexcept { writeI16xBE<2>(p, x); }
-static inline void writeI16uBE(void* p, int32_t x) noexcept { writeI16xBE<1>(p, x); }
-static inline void writeU16aBE(void* p, uint32_t x) noexcept { writeU16xBE<2>(p, x); }
-static inline void writeU16uBE(void* p, uint32_t x) noexcept { writeU16xBE<1>(p, x); }
+static inline void writeI32a(void* p, int32_t x) noexcept { writeU32x<ByteOrder::kNative, 4>(p, uint32_t(x)); }
+static inline void writeI32aLE(void* p, int32_t x) noexcept { writeU32x<ByteOrder::kLE, 4>(p, uint32_t(x)); }
+static inline void writeI32aBE(void* p, int32_t x) noexcept { writeU32x<ByteOrder::kBE, 4>(p, uint32_t(x)); }
-static inline void writeU24uLE(void* p, uint32_t v) noexcept { writeU24u<ByteOrder::kLE>(p, v); }
-static inline void writeU24uBE(void* p, uint32_t v) noexcept { writeU24u<ByteOrder::kBE>(p, v); }
+// Support - Memory Write Access - 64 Bits
+// =======================================
-static inline void writeI32a(void* p, int32_t x) noexcept { writeI32x<ByteOrder::kNative, 4>(p, x); }
-static inline void writeI32u(void* p, int32_t x) noexcept { writeI32x<ByteOrder::kNative, 1>(p, x); }
-static inline void writeU32a(void* p, uint32_t x) noexcept { writeU32x<ByteOrder::kNative, 4>(p, x); }
-static inline void writeU32u(void* p, uint32_t x) noexcept { writeU32x<ByteOrder::kNative, 1>(p, x); }
-
-static inline void writeI32aLE(void* p, int32_t x) noexcept { writeI32xLE<4>(p, x); }
-static inline void writeI32uLE(void* p, int32_t x) noexcept { writeI32xLE<1>(p, x); }
-static inline void writeU32aLE(void* p, uint32_t x) noexcept { writeU32xLE<4>(p, x); }
-static inline void writeU32uLE(void* p, uint32_t x) noexcept { writeU32xLE<1>(p, x); }
+template<ByteOrder BO = ByteOrder::kNative, size_t Alignment = 1>
+static inline void writeU64x(void* p, uint64_t x) noexcept {
+ typedef typename Internal::AliasedUInt<uint64_t, Alignment>::T U64AlignedToN;
+ static_cast<U64AlignedToN*>(p)[0] = BO == ByteOrder::kNative ? x : byteswap64(x);
+}
-static inline void writeI32aBE(void* p, int32_t x) noexcept { writeI32xBE<4>(p, x); }
-static inline void writeI32uBE(void* p, int32_t x) noexcept { writeI32xBE<1>(p, x); }
-static inline void writeU32aBE(void* p, uint32_t x) noexcept { writeU32xBE<4>(p, x); }
-static inline void writeU32uBE(void* p, uint32_t x) noexcept { writeU32xBE<1>(p, x); }
+template<size_t Alignment = 1>
+static inline void writeU64u(void* p, uint64_t x) noexcept { writeU64x<ByteOrder::kNative, Alignment>(p, x); }
+template<size_t Alignment = 1>
+static inline void writeU64uLE(void* p, uint64_t x) noexcept { writeU64x<ByteOrder::kLE, Alignment>(p, x); }
+template<size_t Alignment = 1>
+static inline void writeU64uBE(void* p, uint64_t x) noexcept { writeU64x<ByteOrder::kBE, Alignment>(p, x); }
-static inline void writeI64a(void* p, int64_t x) noexcept { writeI64x<ByteOrder::kNative, 8>(p, x); }
-static inline void writeI64u(void* p, int64_t x) noexcept { writeI64x<ByteOrder::kNative, 1>(p, x); }
static inline void writeU64a(void* p, uint64_t x) noexcept { writeU64x<ByteOrder::kNative, 8>(p, x); }
-static inline void writeU64u(void* p, uint64_t x) noexcept { writeU64x<ByteOrder::kNative, 1>(p, x); }
+static inline void writeU64aLE(void* p, uint64_t x) noexcept { writeU64x<ByteOrder::kLE, 8>(p, x); }
+static inline void writeU64aBE(void* p, uint64_t x) noexcept { writeU64x<ByteOrder::kBE, 8>(p, x); }
+
+template<ByteOrder BO = ByteOrder::kNative, size_t Alignment = 1>
+static inline void writeI64x(void* p, int64_t x) noexcept { writeU64x<BO, Alignment>(p, uint64_t(x)); }
-static inline void writeI64aLE(void* p, int64_t x) noexcept { writeI64xLE<8>(p, x); }
-static inline void writeI64uLE(void* p, int64_t x) noexcept { writeI64xLE<1>(p, x); }
-static inline void writeU64aLE(void* p, uint64_t x) noexcept { writeU64xLE<8>(p, x); }
-static inline void writeU64uLE(void* p, uint64_t x) noexcept { writeU64xLE<1>(p, x); }
+template<size_t Alignment = 1>
+static inline void writeI64u(void* p, int64_t x) noexcept { writeU64x<ByteOrder::kNative, Alignment>(p, uint64_t(x)); }
+template<size_t Alignment = 1>
+static inline void writeI64uLE(void* p, int64_t x) noexcept { writeU64x<ByteOrder::kLE, Alignment>(p, uint64_t(x)); }
+template<size_t Alignment = 1>
+static inline void writeI64uBE(void* p, int64_t x) noexcept { writeU64x<ByteOrder::kBE, Alignment>(p, uint64_t(x)); }
-static inline void writeI64aBE(void* p, int64_t x) noexcept { writeI64xBE<8>(p, x); }
-static inline void writeI64uBE(void* p, int64_t x) noexcept { writeI64xBE<1>(p, x); }
-static inline void writeU64aBE(void* p, uint64_t x) noexcept { writeU64xBE<8>(p, x); }
-static inline void writeU64uBE(void* p, uint64_t x) noexcept { writeU64xBE<1>(p, x); }
+static inline void writeI64a(void* p, int64_t x) noexcept { writeU64x<ByteOrder::kNative, 8>(p, uint64_t(x)); }
+static inline void writeI64aLE(void* p, int64_t x) noexcept { writeU64x<ByteOrder::kLE, 8>(p, uint64_t(x)); }
+static inline void writeI64aBE(void* p, int64_t x) noexcept { writeU64x<ByteOrder::kBE, 8>(p, uint64_t(x)); }
-// ============================================================================
-// [asmjit::Support - Operators]
-// ============================================================================
+// Support - Operators
+// ===================
//! \cond INTERNAL
struct Set { template<typename T> static inline T op(T x, T y) noexcept { DebugUtils::unused(x); return y; } };
@@ -1036,9 +1199,8 @@ struct Min { template<typename T> static inline T op(T x, T y) noexcept { ret
struct Max { template<typename T> static inline T op(T x, T y) noexcept { return max<T>(x, y); } };
//! \endcond
-// ============================================================================
-// [asmjit::Support - BitWordIterator]
-// ============================================================================
+// Support - BitWordIterator
+// =========================
//! Iterates over each bit in a number which is set to 1.
//!
@@ -1056,13 +1218,13 @@ struct Max { template<typename T> static inline T op(T x, T y) noexcept { ret
template<typename T>
class BitWordIterator {
public:
- inline explicit BitWordIterator(T bitWord) noexcept
+ ASMJIT_FORCE_INLINE explicit BitWordIterator(T bitWord) noexcept
: _bitWord(bitWord) {}
- inline void init(T bitWord) noexcept { _bitWord = bitWord; }
- inline bool hasNext() const noexcept { return _bitWord != 0; }
+ ASMJIT_FORCE_INLINE void init(T bitWord) noexcept { _bitWord = bitWord; }
+ ASMJIT_FORCE_INLINE bool hasNext() const noexcept { return _bitWord != 0; }
- inline uint32_t next() noexcept {
+ ASMJIT_FORCE_INLINE uint32_t next() noexcept {
ASMJIT_ASSERT(_bitWord != 0);
uint32_t index = ctz(_bitWord);
_bitWord ^= T(1u) << index;
@@ -1072,9 +1234,31 @@ public:
T _bitWord;
};
-// ============================================================================
-// [asmjit::Support - BitVectorOps]
-// ============================================================================
+// Support - BitWordFlipIterator
+// =============================
+
+template<typename T>
+class BitWordFlipIterator {
+public:
+ ASMJIT_FORCE_INLINE explicit BitWordFlipIterator(T bitWord) noexcept
+ : _bitWord(bitWord) {}
+
+ ASMJIT_FORCE_INLINE void init(T bitWord) noexcept { _bitWord = bitWord; }
+ ASMJIT_FORCE_INLINE bool hasNext() const noexcept { return _bitWord != 0; }
+
+ ASMJIT_FORCE_INLINE uint32_t nextAndFlip() noexcept {
+ ASMJIT_ASSERT(_bitWord != 0);
+ uint32_t index = ctz(_bitWord);
+ _bitWord ^= T(1u) << index;
+ return index;
+ }
+
+ T _bitWord;
+ T _xorMask;
+};
+
+// Support - BitVectorOps
+// ======================
//! \cond
namespace Internal {
@@ -1178,9 +1362,8 @@ static inline size_t bitVectorIndexOf(T* buf, size_t start, bool value) noexcept
}
}
-// ============================================================================
-// [asmjit::Support - BitVectorIterator]
-// ============================================================================
+// Support - BitVectorIterator
+// ===========================
template<typename T>
class BitVectorIterator {
@@ -1190,13 +1373,13 @@ public:
size_t _end;
T _current;
- ASMJIT_INLINE BitVectorIterator(const BitVectorIterator& other) noexcept = default;
+ ASMJIT_FORCE_INLINE BitVectorIterator(const BitVectorIterator& other) noexcept = default;
- ASMJIT_INLINE BitVectorIterator(const T* data, size_t numBitWords, size_t start = 0) noexcept {
+ ASMJIT_FORCE_INLINE BitVectorIterator(const T* data, size_t numBitWords, size_t start = 0) noexcept {
init(data, numBitWords, start);
}
- ASMJIT_INLINE void init(const T* data, size_t numBitWords, size_t start = 0) noexcept {
+ ASMJIT_FORCE_INLINE void init(const T* data, size_t numBitWords, size_t start = 0) noexcept {
const T* ptr = data + (start / bitSizeOf<T>());
size_t idx = alignDown(start, bitSizeOf<T>());
size_t end = numBitWords * bitSizeOf<T>();
@@ -1214,11 +1397,11 @@ public:
_current = bitWord;
}
- ASMJIT_INLINE bool hasNext() const noexcept {
+ ASMJIT_FORCE_INLINE bool hasNext() const noexcept {
return _current != T(0);
}
- ASMJIT_INLINE size_t next() noexcept {
+ ASMJIT_FORCE_INLINE size_t next() noexcept {
T bitWord = _current;
ASMJIT_ASSERT(bitWord != T(0));
@@ -1233,20 +1416,21 @@ public:
return n;
}
- ASMJIT_INLINE size_t peekNext() const noexcept {
+ ASMJIT_FORCE_INLINE size_t peekNext() const noexcept {
ASMJIT_ASSERT(_current != T(0));
return _idx + ctz(_current);
}
};
-// ============================================================================
-// [asmjit::Support - BitVectorOpIterator]
-// ============================================================================
+// Support - BitVectorOpIterator
+// =============================
template<typename T, class OperatorT>
class BitVectorOpIterator {
public:
- static constexpr uint32_t kTSizeInBits = bitSizeOf<T>();
+ enum : uint32_t {
+ kTSizeInBits = bitSizeOf<T>()
+ };
const T* _aPtr;
const T* _bPtr;
@@ -1254,11 +1438,11 @@ public:
size_t _end;
T _current;
- ASMJIT_INLINE BitVectorOpIterator(const T* aData, const T* bData, size_t numBitWords, size_t start = 0) noexcept {
+ ASMJIT_FORCE_INLINE BitVectorOpIterator(const T* aData, const T* bData, size_t numBitWords, size_t start = 0) noexcept {
init(aData, bData, numBitWords, start);
}
- ASMJIT_INLINE void init(const T* aData, const T* bData, size_t numBitWords, size_t start = 0) noexcept {
+ ASMJIT_FORCE_INLINE void init(const T* aData, const T* bData, size_t numBitWords, size_t start = 0) noexcept {
const T* aPtr = aData + (start / bitSizeOf<T>());
const T* bPtr = bData + (start / bitSizeOf<T>());
size_t idx = alignDown(start, bitSizeOf<T>());
@@ -1278,11 +1462,11 @@ public:
_current = bitWord;
}
- ASMJIT_INLINE bool hasNext() noexcept {
+ ASMJIT_FORCE_INLINE bool hasNext() noexcept {
return _current != T(0);
}
- ASMJIT_INLINE size_t next() noexcept {
+ ASMJIT_FORCE_INLINE size_t next() noexcept {
T bitWord = _current;
ASMJIT_ASSERT(bitWord != T(0));
@@ -1298,29 +1482,29 @@ public:
}
};
-// ============================================================================
-// [asmjit::Support - Sorting]
-// ============================================================================
+// Support - Sorting
+// =================
//! Sort order.
-enum SortOrder : uint32_t {
- kSortAscending = 0, //!< Ascending.
- kSortDescending = 1 //!< Descending.
+enum class SortOrder : uint32_t {
+ //!< Ascending order.
+ kAscending = 0,
+ //!< Descending order.
+ kDescending = 1
};
//! A helper class that provides comparison of any user-defined type that
//! implements `<` and `>` operators (primitive types are supported as well).
-template<uint32_t Order = kSortAscending>
+template<SortOrder kOrder = SortOrder::kAscending>
struct Compare {
template<typename A, typename B>
inline int operator()(const A& a, const B& b) const noexcept {
- return Order == kSortAscending ? int(a > b) - int(a < b)
- : int(a < b) - int(a > b);
+ return kOrder == SortOrder::kAscending ? int(a > b) - int(a < b) : int(a < b) - int(a > b);
}
};
//! Insertion sort.
-template<typename T, typename CompareT = Compare<kSortAscending>>
+template<typename T, typename CompareT = Compare<SortOrder::kAscending>>
static inline void iSort(T* base, size_t size, const CompareT& cmp = CompareT()) noexcept {
for (T* pm = base + 1; pm < base + size; pm++)
for (T* pl = pm; pl > base && cmp(pl[-1], pl[0]) > 0; pl--)
@@ -1332,8 +1516,10 @@ namespace Internal {
//! Quick-sort implementation.
template<typename T, class CompareT>
struct QSortImpl {
- static constexpr size_t kStackSize = 64 * 2;
- static constexpr size_t kISortThreshold = 7;
+ enum : size_t {
+ kStackSize = 64 * 2,
+ kISortThreshold = 7
+ };
// Based on "PDCLib - Public Domain C Library" and rewritten to C++.
static void sort(T* base, size_t size, const CompareT& cmp) noexcept {
@@ -1398,91 +1584,162 @@ namespace Internal {
//! Quick sort implementation.
//!
-//! The main reason to provide a custom qsort implementation is that we needed
-//! something that will never throw `bad_alloc` exception. This implementation
-//! doesn't use dynamic memory allocation.
-template<typename T, class CompareT = Compare<kSortAscending>>
+//! The main reason to provide a custom qsort implementation is that we needed something that will
+//! never throw `bad_alloc` exception. This implementation doesn't use dynamic memory allocation.
+template<typename T, class CompareT = Compare<SortOrder::kAscending>>
static inline void qSort(T* base, size_t size, const CompareT& cmp = CompareT()) noexcept {
Internal::QSortImpl<T, CompareT>::sort(base, size, cmp);
}
-// ============================================================================
-// [asmjit::Support - Iterators]
-// ============================================================================
+// Support - Array
+// ===============
-template<typename T>
-class Iterator {
-public:
- constexpr Iterator(T* p) noexcept : _p(p) {}
- constexpr Iterator(const Iterator& other) noexcept = default;
+//! Array type, similar to std::array<T, N>, with the possibility to use enums in operator[].
+//!
+//! \note The array has C semantics - the elements in the array are not initialized.
+template<typename T, size_t N>
+struct Array {
+ //! \name Members
+ //! \{
- inline Iterator& operator=(const Iterator& other) noexcept = default;
+ //! The underlying array data, use \ref data() to access it.
+ T _data[N];
- inline Iterator operator+(size_t n) const noexcept { return Iterator(_p + n); }
- inline Iterator operator-(size_t n) const noexcept { return Iterator(_p - n); }
+ //! \}
- inline Iterator& operator+=(size_t n) noexcept { _p += n; return *this; }
- inline Iterator& operator-=(size_t n) noexcept { _p -= n; return *this; }
+ //! \cond
+ // std compatibility.
+ typedef T value_type;
+ typedef size_t size_type;
+ typedef ptrdiff_t difference_type;
- inline Iterator& operator++() noexcept { return operator+=(1); }
- inline Iterator& operator--() noexcept { return operator-=(1); }
+ typedef value_type& reference;
+ typedef const value_type& const_reference;
- inline Iterator operator++(int) noexcept { T* prev = _p; operator+=(1); return Iterator(prev); }
- inline Iterator operator--(int) noexcept { T* prev = _p; operator-=(1); return Iterator(prev); }
+ typedef value_type* pointer;
+ typedef const value_type* const_pointer;
- inline bool operator==(const Iterator& other) noexcept { return _p == other._p; }
- inline bool operator!=(const Iterator& other) noexcept { return _p != other._p; }
+ typedef pointer iterator;
+ typedef const_pointer const_iterator;
+ //! \endcond
- inline T& operator*() const noexcept { return _p[0]; }
+ //! \name Overloaded Operators
+ //! \{
- T* _p;
-};
+ template<typename Index>
+ inline T& operator[](const Index& index) noexcept {
+ typedef typename Internal::StdInt<sizeof(Index), 1>::Type U;
+ ASMJIT_ASSERT(U(index) < N);
+ return _data[U(index)];
+ }
-template<typename T>
-class ReverseIterator {
-public:
- constexpr ReverseIterator(T* p) noexcept : _p(p) {}
- constexpr ReverseIterator(const ReverseIterator& other) noexcept = default;
+ template<typename Index>
+ inline const T& operator[](const Index& index) const noexcept {
+ typedef typename Internal::StdInt<sizeof(Index), 1>::Type U;
+ ASMJIT_ASSERT(U(index) < N);
+ return _data[U(index)];
+ }
+
+ inline bool operator==(const Array& other) const noexcept {
+ for (size_t i = 0; i < N; i++)
+ if (_data[i] != other._data[i])
+ return false;
+ return true;
+ }
+
+ inline bool operator!=(const Array& other) const noexcept {
+ return !operator==(other);
+ }
+
+ //! \}
+
+ //! \name Accessors
+ //! \{
+
+ inline bool empty() const noexcept { return false; }
+ inline size_t size() const noexcept { return N; }
+
+ inline T* data() noexcept { return _data; }
+ inline const T* data() const noexcept { return _data; }
+
+ inline T& front() noexcept { return _data[0]; }
+ inline const T& front() const noexcept { return _data[0]; }
+
+ inline T& back() noexcept { return _data[N - 1]; }
+ inline const T& back() const noexcept { return _data[N - 1]; }
+
+ inline T* begin() noexcept { return _data; }
+ inline T* end() noexcept { return _data + N; }
- inline ReverseIterator& operator=(const ReverseIterator& other) noexcept = default;
+ inline const T* begin() const noexcept { return _data; }
+ inline const T* end() const noexcept { return _data + N; }
- inline ReverseIterator operator+(size_t n) const noexcept { return ReverseIterator(_p + n); }
- inline ReverseIterator operator-(size_t n) const noexcept { return ReverseIterator(_p - n); }
+ inline const T* cbegin() const noexcept { return _data; }
+ inline const T* cend() const noexcept { return _data + N; }
- inline ReverseIterator& operator+=(size_t n) noexcept { _p -= n; return *this; }
- inline ReverseIterator& operator-=(size_t n) noexcept { _p += n; return *this; }
+ //! \}
+
+ //! \name Utilities
+ //! \{
- inline ReverseIterator& operator++() noexcept { return operator+=(1); }
- inline ReverseIterator& operator--() noexcept { return operator-=(1); }
+ inline void swap(Array& other) noexcept {
+ for (size_t i = 0; i < N; i++)
+ std::swap(_data[i], other._data[i]);
+ }
- inline ReverseIterator operator++(int) noexcept { T* prev = _p; operator+=(1); return ReverseIterator(prev); }
- inline ReverseIterator operator--(int) noexcept { T* prev = _p; operator-=(1); return ReverseIterator(prev); }
+ inline void fill(const T& value) noexcept {
+ for (size_t i = 0; i < N; i++)
+ _data[i] = value;
+ }
- inline bool operator==(const ReverseIterator& other) noexcept { return _p == other._p; }
- inline bool operator!=(const ReverseIterator& other) noexcept { return _p != other._p; }
+ inline void copyFrom(const Array& other) noexcept {
+ for (size_t i = 0; i < N; i++)
+ _data[i] = other._data[i];
+ }
- inline T& operator*() const noexcept { return _p[-1]; }
+ template<typename Operator>
+ inline void combine(const Array& other) noexcept {
+ for (size_t i = 0; i < N; i++)
+ _data[i] = Operator::op(_data[i], other._data[i]);
+ }
- T* _p;
+ template<typename Operator>
+ inline T aggregate(T initialValue = T()) const noexcept {
+ T value = initialValue;
+ for (size_t i = 0; i < N; i++)
+ value = Operator::op(value, _data[i]);
+ return value;
+ }
+
+ template<typename Fn>
+ inline void forEach(Fn&& fn) noexcept {
+ for (size_t i = 0; i < N; i++)
+ fn(_data[i]);
+ }
+ //! \}
};
-// ============================================================================
-// [asmjit::Support::Temporary]
-// ============================================================================
+// Support::Temporary
+// ==================
//! Used to pass a temporary buffer to:
//!
//! - Containers that use user-passed buffer as an initial storage (still can grow).
//! - Zone allocator that would use the temporary buffer as a first block.
struct Temporary {
+ //! \name Members
+ //! \{
+
void* _data;
size_t _size;
+ //! \}
+
//! \name Construction & Destruction
//! \{
- constexpr Temporary(const Temporary& other) noexcept = default;
- constexpr Temporary(void* data, size_t size) noexcept
+ inline constexpr Temporary(const Temporary& other) noexcept = default;
+ inline constexpr Temporary(void* data, size_t size) noexcept
: _data(data),
_size(size) {}
@@ -1500,9 +1757,9 @@ struct Temporary {
//! Returns the data storage.
template<typename T = void>
- constexpr T* data() const noexcept { return static_cast<T*>(_data); }
+ inline constexpr T* data() const noexcept { return static_cast<T*>(_data); }
//! Returns the data storage size in bytes.
- constexpr size_t size() const noexcept { return _size; }
+ inline constexpr size_t size() const noexcept { return _size; }
//! \}
};
diff --git a/3rdparty/asmjit/src/asmjit/core/target.cpp b/3rdparty/asmjit/src/asmjit/core/target.cpp
index 9ce94f32410..fef025d709a 100644
--- a/3rdparty/asmjit/src/asmjit/core/target.cpp
+++ b/3rdparty/asmjit/src/asmjit/core/target.cpp
@@ -1,37 +1,14 @@
-// AsmJit - Machine code generation for C++
+// This file is part of AsmJit project <https://asmjit.com>
//
-// * Official AsmJit Home Page: https://asmjit.com
-// * Official Github Repository: https://github.com/asmjit/asmjit
-//
-// Copyright (c) 2008-2020 The AsmJit Authors
-//
-// This software is provided 'as-is', without any express or implied
-// warranty. In no event will the authors be held liable for any damages
-// arising from the use of this software.
-//
-// Permission is granted to anyone to use this software for any purpose,
-// including commercial applications, and to alter it and redistribute it
-// freely, subject to the following restrictions:
-//
-// 1. The origin of this software must not be misrepresented; you must not
-// claim that you wrote the original software. If you use this software
-// in a product, an acknowledgment in the product documentation would be
-// appreciated but is not required.
-// 2. Altered source versions must be plainly marked as such, and must not be
-// misrepresented as being the original software.
-// 3. This notice may not be removed or altered from any source distribution.
+// See asmjit.h or LICENSE.md for license and copyright information
+// SPDX-License-Identifier: Zlib
#include "../core/api-build_p.h"
#include "../core/target.h"
ASMJIT_BEGIN_NAMESPACE
-// ============================================================================
-// [asmjit::Target - Construction / Destruction]
-// ============================================================================
-
-Target::Target() noexcept
- : _environment() {}
+Target::Target() noexcept : _environment() {}
Target::~Target() noexcept {}
ASMJIT_END_NAMESPACE
diff --git a/3rdparty/asmjit/src/asmjit/core/target.h b/3rdparty/asmjit/src/asmjit/core/target.h
index 4d144c64ee2..23b0c6294c9 100644
--- a/3rdparty/asmjit/src/asmjit/core/target.h
+++ b/3rdparty/asmjit/src/asmjit/core/target.h
@@ -1,30 +1,12 @@
-// AsmJit - Machine code generation for C++
+// This file is part of AsmJit project <https://asmjit.com>
//
-// * Official AsmJit Home Page: https://asmjit.com
-// * Official Github Repository: https://github.com/asmjit/asmjit
-//
-// Copyright (c) 2008-2020 The AsmJit Authors
-//
-// This software is provided 'as-is', without any express or implied
-// warranty. In no event will the authors be held liable for any damages
-// arising from the use of this software.
-//
-// Permission is granted to anyone to use this software for any purpose,
-// including commercial applications, and to alter it and redistribute it
-// freely, subject to the following restrictions:
-//
-// 1. The origin of this software must not be misrepresented; you must not
-// claim that you wrote the original software. If you use this software
-// in a product, an acknowledgment in the product documentation would be
-// appreciated but is not required.
-// 2. Altered source versions must be plainly marked as such, and must not be
-// misrepresented as being the original software.
-// 3. This notice may not be removed or altered from any source distribution.
+// See asmjit.h or LICENSE.md for license and copyright information
+// SPDX-License-Identifier: Zlib
#ifndef ASMJIT_CORE_TARGET_H_INCLUDED
#define ASMJIT_CORE_TARGET_H_INCLUDED
-#include "../core/arch.h"
+#include "../core/archtraits.h"
#include "../core/func.h"
ASMJIT_BEGIN_NAMESPACE
@@ -32,98 +14,6 @@ ASMJIT_BEGIN_NAMESPACE
//! \addtogroup asmjit_core
//! \{
-// ============================================================================
-// [asmjit::CodeInfo]
-// ============================================================================
-
-#ifndef ASMJIT_NO_DEPRECATED
-//! Basic information about a code (or target). It describes its architecture,
-//! code generation mode (or optimization level), and base address.
-class ASMJIT_DEPRECATED_STRUCT("Use Environment instead of CodeInfo") CodeInfo {
-public:
- //!< Environment information.
- Environment _environment;
- //! Base address.
- uint64_t _baseAddress;
-
- //! \name Construction & Destruction
- //! \{
-
- inline CodeInfo() noexcept
- : _environment(),
- _baseAddress(Globals::kNoBaseAddress) {}
-
- inline explicit CodeInfo(uint32_t arch, uint32_t subArch = 0, uint64_t baseAddress = Globals::kNoBaseAddress) noexcept
- : _environment(arch, subArch),
- _baseAddress(baseAddress) {}
-
- inline explicit CodeInfo(const Environment& environment, uint64_t baseAddress = Globals::kNoBaseAddress) noexcept
- : _environment(environment),
- _baseAddress(baseAddress) {}
-
-
- inline CodeInfo(const CodeInfo& other) noexcept { init(other); }
-
- inline bool isInitialized() const noexcept {
- return _environment.arch() != Environment::kArchUnknown;
- }
-
- inline void init(const CodeInfo& other) noexcept {
- *this = other;
- }
-
- inline void init(uint32_t arch, uint32_t subArch = 0, uint64_t baseAddress = Globals::kNoBaseAddress) noexcept {
- _environment.init(arch, subArch);
- _baseAddress = baseAddress;
- }
-
- inline void reset() noexcept {
- _environment.reset();
- _baseAddress = Globals::kNoBaseAddress;
- }
-
- //! \}
-
- //! \name Overloaded Operators
- //! \{
-
- inline CodeInfo& operator=(const CodeInfo& other) noexcept = default;
-
- inline bool operator==(const CodeInfo& other) const noexcept { return ::memcmp(this, &other, sizeof(*this)) == 0; }
- inline bool operator!=(const CodeInfo& other) const noexcept { return ::memcmp(this, &other, sizeof(*this)) != 0; }
-
- //! \}
-
- //! \name Accessors
- //! \{
-
- //! Returns the target environment information, see \ref Environment.
- inline const Environment& environment() const noexcept { return _environment; }
-
- //! Returns the target architecture, see \ref Environment::Arch.
- inline uint32_t arch() const noexcept { return _environment.arch(); }
- //! Returns the target sub-architecture, see \ref Environment::SubArch.
- inline uint32_t subArch() const noexcept { return _environment.subArch(); }
- //! Returns the native size of the target's architecture GP register.
- inline uint32_t gpSize() const noexcept { return _environment.registerSize(); }
-
- //! Tests whether this CodeInfo has a base address set.
- inline bool hasBaseAddress() const noexcept { return _baseAddress != Globals::kNoBaseAddress; }
- //! Returns the base address or \ref Globals::kNoBaseAddress if it's not set.
- inline uint64_t baseAddress() const noexcept { return _baseAddress; }
- //! Sets base address to `p`.
- inline void setBaseAddress(uint64_t p) noexcept { _baseAddress = p; }
- //! Resets base address (implicitly sets it to \ref Globals::kNoBaseAddress).
- inline void resetBaseAddress() noexcept { _baseAddress = Globals::kNoBaseAddress; }
-
- //! \}
-};
-#endif // !ASMJIT_NO_DEPRECATED
-
-// ============================================================================
-// [asmjit::Target]
-// ============================================================================
-
//! Target is an abstract class that describes a machine code target.
class ASMJIT_VIRTAPI Target {
public:
@@ -146,24 +36,12 @@ public:
//! \name Accessors
//! \{
- //! Returns CodeInfo of this target.
- //!
- //! CodeInfo can be used to setup a CodeHolder in case you plan to generate a
- //! code compatible and executable by this Runtime.
+ //! Returns target's environment.
inline const Environment& environment() const noexcept { return _environment; }
-
- //! Returns the target architecture, see \ref Environment::Arch.
- inline uint32_t arch() const noexcept { return _environment.arch(); }
- //! Returns the target sub-architecture, see \ref Environment::SubArch.
- inline uint32_t subArch() const noexcept { return _environment.subArch(); }
-
-#ifndef ASMJIT_NO_DEPRECATED
- ASMJIT_DEPRECATED("Use environment() instead")
- inline CodeInfo codeInfo() const noexcept { return CodeInfo(_environment); }
-
- ASMJIT_DEPRECATED("Use environment().format() instead")
- inline uint32_t targetType() const noexcept { return _environment.format(); }
-#endif // !ASMJIT_NO_DEPRECATED
+ //! Returns the target architecture.
+ inline Arch arch() const noexcept { return _environment.arch(); }
+ //! Returns the target sub-architecture.
+ inline SubArch subArch() const noexcept { return _environment.subArch(); }
//! \}
};
diff --git a/3rdparty/asmjit/src/asmjit/core/type.cpp b/3rdparty/asmjit/src/asmjit/core/type.cpp
index 97892d9815e..536fb8818f8 100644
--- a/3rdparty/asmjit/src/asmjit/core/type.cpp
+++ b/3rdparty/asmjit/src/asmjit/core/type.cpp
@@ -1,25 +1,7 @@
-// AsmJit - Machine code generation for C++
+// This file is part of AsmJit project <https://asmjit.com>
//
-// * Official AsmJit Home Page: https://asmjit.com
-// * Official Github Repository: https://github.com/asmjit/asmjit
-//
-// Copyright (c) 2008-2020 The AsmJit Authors
-//
-// This software is provided 'as-is', without any express or implied
-// warranty. In no event will the authors be held liable for any damages
-// arising from the use of this software.
-//
-// Permission is granted to anyone to use this software for any purpose,
-// including commercial applications, and to alter it and redistribute it
-// freely, subject to the following restrictions:
-//
-// 1. The origin of this software must not be misrepresented; you must not
-// claim that you wrote the original software. If you use this software
-// in a product, an acknowledgment in the product documentation would be
-// appreciated but is not required.
-// 2. Altered source versions must be plainly marked as such, and must not be
-// misrepresented as being the original software.
-// 3. This notice may not be removed or altered from any source distribution.
+// See asmjit.h or LICENSE.md for license and copyright information
+// SPDX-License-Identifier: Zlib
#include "../core/api-build_p.h"
#include "../core/misc_p.h"
@@ -27,66 +9,66 @@
ASMJIT_BEGIN_NAMESPACE
-// ============================================================================
-// [asmjit::Type]
-// ============================================================================
-
-namespace Type {
+namespace TypeUtils {
-template<uint32_t TYPE_ID>
-struct BaseOfTypeId {
- static constexpr uint32_t kTypeId =
- isBase (TYPE_ID) ? TYPE_ID :
- isMask8 (TYPE_ID) ? kIdU8 :
- isMask16(TYPE_ID) ? kIdU16 :
- isMask32(TYPE_ID) ? kIdU32 :
- isMask64(TYPE_ID) ? kIdU64 :
- isMmx32 (TYPE_ID) ? kIdI32 :
- isMmx64 (TYPE_ID) ? kIdI64 :
- isVec32 (TYPE_ID) ? TYPE_ID + kIdI8 - _kIdVec32Start :
- isVec64 (TYPE_ID) ? TYPE_ID + kIdI8 - _kIdVec64Start :
- isVec128(TYPE_ID) ? TYPE_ID + kIdI8 - _kIdVec128Start :
- isVec256(TYPE_ID) ? TYPE_ID + kIdI8 - _kIdVec256Start :
- isVec512(TYPE_ID) ? TYPE_ID + kIdI8 - _kIdVec512Start : 0;
+template<uint32_t Index>
+struct ScalarOfTypeId {
+ enum : uint32_t {
+ kTypeId = uint32_t(
+ isScalar(TypeId(Index)) ? TypeId(Index) :
+ isMask8 (TypeId(Index)) ? TypeId::kUInt8 :
+ isMask16(TypeId(Index)) ? TypeId::kUInt16 :
+ isMask32(TypeId(Index)) ? TypeId::kUInt32 :
+ isMask64(TypeId(Index)) ? TypeId::kUInt64 :
+ isMmx32 (TypeId(Index)) ? TypeId::kUInt32 :
+ isMmx64 (TypeId(Index)) ? TypeId::kUInt64 :
+ isVec32 (TypeId(Index)) ? TypeId((Index - uint32_t(TypeId::_kVec32Start ) + uint32_t(TypeId::kInt8)) & 0xFF) :
+ isVec64 (TypeId(Index)) ? TypeId((Index - uint32_t(TypeId::_kVec64Start ) + uint32_t(TypeId::kInt8)) & 0xFF) :
+ isVec128(TypeId(Index)) ? TypeId((Index - uint32_t(TypeId::_kVec128Start) + uint32_t(TypeId::kInt8)) & 0xFF) :
+ isVec256(TypeId(Index)) ? TypeId((Index - uint32_t(TypeId::_kVec256Start) + uint32_t(TypeId::kInt8)) & 0xFF) :
+ isVec512(TypeId(Index)) ? TypeId((Index - uint32_t(TypeId::_kVec512Start) + uint32_t(TypeId::kInt8)) & 0xFF) : TypeId::kVoid)
+ };
};
-template<uint32_t TYPE_ID>
+template<uint32_t Index>
struct SizeOfTypeId {
- static constexpr uint32_t kTypeSize =
- isInt8 (TYPE_ID) ? 1 :
- isUInt8 (TYPE_ID) ? 1 :
- isInt16 (TYPE_ID) ? 2 :
- isUInt16 (TYPE_ID) ? 2 :
- isInt32 (TYPE_ID) ? 4 :
- isUInt32 (TYPE_ID) ? 4 :
- isInt64 (TYPE_ID) ? 8 :
- isUInt64 (TYPE_ID) ? 8 :
- isFloat32(TYPE_ID) ? 4 :
- isFloat64(TYPE_ID) ? 8 :
- isFloat80(TYPE_ID) ? 10 :
- isMask8 (TYPE_ID) ? 1 :
- isMask16 (TYPE_ID) ? 2 :
- isMask32 (TYPE_ID) ? 4 :
- isMask64 (TYPE_ID) ? 8 :
- isMmx32 (TYPE_ID) ? 4 :
- isMmx64 (TYPE_ID) ? 8 :
- isVec32 (TYPE_ID) ? 4 :
- isVec64 (TYPE_ID) ? 8 :
- isVec128 (TYPE_ID) ? 16 :
- isVec256 (TYPE_ID) ? 32 :
- isVec512 (TYPE_ID) ? 64 : 0;
+ enum : uint32_t {
+ kTypeSize =
+ isInt8 (TypeId(Index)) ? 1 :
+ isUInt8 (TypeId(Index)) ? 1 :
+ isInt16 (TypeId(Index)) ? 2 :
+ isUInt16 (TypeId(Index)) ? 2 :
+ isInt32 (TypeId(Index)) ? 4 :
+ isUInt32 (TypeId(Index)) ? 4 :
+ isInt64 (TypeId(Index)) ? 8 :
+ isUInt64 (TypeId(Index)) ? 8 :
+ isFloat32(TypeId(Index)) ? 4 :
+ isFloat64(TypeId(Index)) ? 8 :
+ isFloat80(TypeId(Index)) ? 10 :
+ isMask8 (TypeId(Index)) ? 1 :
+ isMask16 (TypeId(Index)) ? 2 :
+ isMask32 (TypeId(Index)) ? 4 :
+ isMask64 (TypeId(Index)) ? 8 :
+ isMmx32 (TypeId(Index)) ? 4 :
+ isMmx64 (TypeId(Index)) ? 8 :
+ isVec32 (TypeId(Index)) ? 4 :
+ isVec64 (TypeId(Index)) ? 8 :
+ isVec128 (TypeId(Index)) ? 16 :
+ isVec256 (TypeId(Index)) ? 32 :
+ isVec512 (TypeId(Index)) ? 64 : 0
+ };
};
const TypeData _typeData = {
- #define VALUE(X) BaseOfTypeId<X>::kTypeId
+ #define VALUE(x) TypeId(ScalarOfTypeId<x>::kTypeId)
{ ASMJIT_LOOKUP_TABLE_256(VALUE, 0) },
#undef VALUE
- #define VALUE(X) SizeOfTypeId<X>::kTypeSize
+ #define VALUE(x) SizeOfTypeId<x>::kTypeSize
{ ASMJIT_LOOKUP_TABLE_256(VALUE, 0) }
#undef VALUE
};
-} // {Type}
+} // {TypeUtils}
ASMJIT_END_NAMESPACE
diff --git a/3rdparty/asmjit/src/asmjit/core/type.h b/3rdparty/asmjit/src/asmjit/core/type.h
index ef03ecb8360..3754959e4c3 100644
--- a/3rdparty/asmjit/src/asmjit/core/type.h
+++ b/3rdparty/asmjit/src/asmjit/core/type.h
@@ -1,210 +1,237 @@
-// AsmJit - Machine code generation for C++
+// This file is part of AsmJit project <https://asmjit.com>
//
-// * Official AsmJit Home Page: https://asmjit.com
-// * Official Github Repository: https://github.com/asmjit/asmjit
-//
-// Copyright (c) 2008-2020 The AsmJit Authors
-//
-// This software is provided 'as-is', without any express or implied
-// warranty. In no event will the authors be held liable for any damages
-// arising from the use of this software.
-//
-// Permission is granted to anyone to use this software for any purpose,
-// including commercial applications, and to alter it and redistribute it
-// freely, subject to the following restrictions:
-//
-// 1. The origin of this software must not be misrepresented; you must not
-// claim that you wrote the original software. If you use this software
-// in a product, an acknowledgment in the product documentation would be
-// appreciated but is not required.
-// 2. Altered source versions must be plainly marked as such, and must not be
-// misrepresented as being the original software.
-// 3. This notice may not be removed or altered from any source distribution.
+// See asmjit.h or LICENSE.md for license and copyright information
+// SPDX-License-Identifier: Zlib
#ifndef ASMJIT_CORE_TYPE_H_INCLUDED
#define ASMJIT_CORE_TYPE_H_INCLUDED
#include "../core/globals.h"
+#include "../core/support.h"
ASMJIT_BEGIN_NAMESPACE
//! \addtogroup asmjit_core
//! \{
-// ============================================================================
-// [asmjit::Type]
-// ============================================================================
-
-//! Provides a minimalist type-system that is used by Asmjit library.
-namespace Type {
-
-//! TypeId.
+//! Type identifier provides a minimalist type system used across AsmJit library.
//!
-//! This is an additional information that can be used to describe a value-type
-//! of physical or virtual register. it's used mostly by BaseCompiler to describe
-//! register representation (the group of data stored in the register and the
-//! width used) and it's also used by APIs that allow to describe and work with
-//! function signatures.
-enum Id : uint32_t {
- kIdVoid = 0, //!< Void type.
-
- _kIdBaseStart = 32,
- _kIdBaseEnd = 44,
-
- _kIdIntStart = 32,
- _kIdIntEnd = 41,
-
- kIdIntPtr = 32, //!< Abstract signed integer type that has a native size.
- kIdUIntPtr = 33, //!< Abstract unsigned integer type that has a native size.
-
- kIdI8 = 34, //!< 8-bit signed integer type.
- kIdU8 = 35, //!< 8-bit unsigned integer type.
- kIdI16 = 36, //!< 16-bit signed integer type.
- kIdU16 = 37, //!< 16-bit unsigned integer type.
- kIdI32 = 38, //!< 32-bit signed integer type.
- kIdU32 = 39, //!< 32-bit unsigned integer type.
- kIdI64 = 40, //!< 64-bit signed integer type.
- kIdU64 = 41, //!< 64-bit unsigned integer type.
-
- _kIdFloatStart = 42,
- _kIdFloatEnd = 44,
-
- kIdF32 = 42, //!< 32-bit floating point type.
- kIdF64 = 43, //!< 64-bit floating point type.
- kIdF80 = 44, //!< 80-bit floating point type.
-
- _kIdMaskStart = 45,
- _kIdMaskEnd = 48,
-
- kIdMask8 = 45, //!< 8-bit opmask register (K).
- kIdMask16 = 46, //!< 16-bit opmask register (K).
- kIdMask32 = 47, //!< 32-bit opmask register (K).
- kIdMask64 = 48, //!< 64-bit opmask register (K).
-
- _kIdMmxStart = 49,
- _kIdMmxEnd = 50,
-
- kIdMmx32 = 49, //!< 64-bit MMX register only used for 32 bits.
- kIdMmx64 = 50, //!< 64-bit MMX register.
-
- _kIdVec32Start = 51,
- _kIdVec32End = 60,
-
- kIdI8x4 = 51,
- kIdU8x4 = 52,
- kIdI16x2 = 53,
- kIdU16x2 = 54,
- kIdI32x1 = 55,
- kIdU32x1 = 56,
- kIdF32x1 = 59,
-
- _kIdVec64Start = 61,
- _kIdVec64End = 70,
-
- kIdI8x8 = 61,
- kIdU8x8 = 62,
- kIdI16x4 = 63,
- kIdU16x4 = 64,
- kIdI32x2 = 65,
- kIdU32x2 = 66,
- kIdI64x1 = 67,
- kIdU64x1 = 68,
- kIdF32x2 = 69,
- kIdF64x1 = 70,
-
- _kIdVec128Start = 71,
- _kIdVec128End = 80,
-
- kIdI8x16 = 71,
- kIdU8x16 = 72,
- kIdI16x8 = 73,
- kIdU16x8 = 74,
- kIdI32x4 = 75,
- kIdU32x4 = 76,
- kIdI64x2 = 77,
- kIdU64x2 = 78,
- kIdF32x4 = 79,
- kIdF64x2 = 80,
-
- _kIdVec256Start = 81,
- _kIdVec256End = 90,
-
- kIdI8x32 = 81,
- kIdU8x32 = 82,
- kIdI16x16 = 83,
- kIdU16x16 = 84,
- kIdI32x8 = 85,
- kIdU32x8 = 86,
- kIdI64x4 = 87,
- kIdU64x4 = 88,
- kIdF32x8 = 89,
- kIdF64x4 = 90,
-
- _kIdVec512Start = 91,
- _kIdVec512End = 100,
-
- kIdI8x64 = 91,
- kIdU8x64 = 92,
- kIdI16x32 = 93,
- kIdU16x32 = 94,
- kIdI32x16 = 95,
- kIdU32x16 = 96,
- kIdI64x8 = 97,
- kIdU64x8 = 98,
- kIdF32x16 = 99,
- kIdF64x8 = 100,
-
- kIdCount = 101,
- kIdMax = 255
+//! This is an additional information that can be used to describe a value-type of physical or virtual register. It's
+//! used mostly by BaseCompiler to describe register representation (the group of data stored in the register and the
+//! width used) and it's also used by APIs that allow to describe and work with function signatures.
+enum class TypeId : uint8_t {
+ //! Void type.
+ kVoid = 0,
+
+ _kBaseStart = 32,
+ _kBaseEnd = 44,
+
+ _kIntStart = 32,
+ _kIntEnd = 41,
+
+ //! Abstract signed integer type that has a native size.
+ kIntPtr = 32,
+ //! Abstract unsigned integer type that has a native size.
+ kUIntPtr = 33,
+
+ //! 8-bit signed integer type.
+ kInt8 = 34,
+ //! 8-bit unsigned integer type.
+ kUInt8 = 35,
+ //! 16-bit signed integer type.
+ kInt16 = 36,
+ //! 16-bit unsigned integer type.
+ kUInt16 = 37,
+ //! 32-bit signed integer type.
+ kInt32 = 38,
+ //! 32-bit unsigned integer type.
+ kUInt32 = 39,
+ //! 64-bit signed integer type.
+ kInt64 = 40,
+ //! 64-bit unsigned integer type.
+ kUInt64 = 41,
+
+ _kFloatStart = 42,
+ _kFloatEnd = 44,
+
+ //! 32-bit floating point type.
+ kFloat32 = 42,
+ //! 64-bit floating point type.
+ kFloat64 = 43,
+ //! 80-bit floating point type.
+ kFloat80 = 44,
+
+ _kMaskStart = 45,
+ _kMaskEnd = 48,
+
+ //! 8-bit opmask register (K).
+ kMask8 = 45,
+ //! 16-bit opmask register (K).
+ kMask16 = 46,
+ //! 32-bit opmask register (K).
+ kMask32 = 47,
+ //! 64-bit opmask register (K).
+ kMask64 = 48,
+
+ _kMmxStart = 49,
+ _kMmxEnd = 50,
+
+ //! 64-bit MMX register only used for 32 bits.
+ kMmx32 = 49,
+ //! 64-bit MMX register.
+ kMmx64 = 50,
+
+ _kVec32Start = 51,
+ _kVec32End = 60,
+
+ kInt8x4 = 51,
+ kUInt8x4 = 52,
+ kInt16x2 = 53,
+ kUInt16x2 = 54,
+ kInt32x1 = 55,
+ kUInt32x1 = 56,
+ kFloat32x1 = 59,
+
+ _kVec64Start = 61,
+ _kVec64End = 70,
+
+ kInt8x8 = 61,
+ kUInt8x8 = 62,
+ kInt16x4 = 63,
+ kUInt16x4 = 64,
+ kInt32x2 = 65,
+ kUInt32x2 = 66,
+ kInt64x1 = 67,
+ kUInt64x1 = 68,
+ kFloat32x2 = 69,
+ kFloat64x1 = 70,
+
+ _kVec128Start = 71,
+ _kVec128End = 80,
+
+ kInt8x16 = 71,
+ kUInt8x16 = 72,
+ kInt16x8 = 73,
+ kUInt16x8 = 74,
+ kInt32x4 = 75,
+ kUInt32x4 = 76,
+ kInt64x2 = 77,
+ kUInt64x2 = 78,
+ kFloat32x4 = 79,
+ kFloat64x2 = 80,
+
+ _kVec256Start = 81,
+ _kVec256End = 90,
+
+ kInt8x32 = 81,
+ kUInt8x32 = 82,
+ kInt16x16 = 83,
+ kUInt16x16 = 84,
+ kInt32x8 = 85,
+ kUInt32x8 = 86,
+ kInt64x4 = 87,
+ kUInt64x4 = 88,
+ kFloat32x8 = 89,
+ kFloat64x4 = 90,
+
+ _kVec512Start = 91,
+ _kVec512End = 100,
+
+ kInt8x64 = 91,
+ kUInt8x64 = 92,
+ kInt16x32 = 93,
+ kUInt16x32 = 94,
+ kInt32x16 = 95,
+ kUInt32x16 = 96,
+ kInt64x8 = 97,
+ kUInt64x8 = 98,
+ kFloat32x16 = 99,
+ kFloat64x8 = 100,
+
+ kLastAssigned = kFloat64x8,
+
+ kMaxValue = 255
};
+ASMJIT_DEFINE_ENUM_COMPARE(TypeId)
+
+//! Type identifier utilities.
+namespace TypeUtils {
struct TypeData {
- uint8_t baseOf[kIdMax + 1];
- uint8_t sizeOf[kIdMax + 1];
+ TypeId scalarOf[uint32_t(TypeId::kMaxValue) + 1];
+ uint8_t sizeOf[uint32_t(TypeId::kMaxValue) + 1];
};
ASMJIT_VARAPI const TypeData _typeData;
-static constexpr bool isVoid(uint32_t typeId) noexcept { return typeId == 0; }
-static constexpr bool isValid(uint32_t typeId) noexcept { return typeId >= _kIdIntStart && typeId <= _kIdVec512End; }
-static constexpr bool isBase(uint32_t typeId) noexcept { return typeId >= _kIdBaseStart && typeId <= _kIdBaseEnd; }
-static constexpr bool isAbstract(uint32_t typeId) noexcept { return typeId >= kIdIntPtr && typeId <= kIdUIntPtr; }
-
-static constexpr bool isInt(uint32_t typeId) noexcept { return typeId >= _kIdIntStart && typeId <= _kIdIntEnd; }
-static constexpr bool isInt8(uint32_t typeId) noexcept { return typeId == kIdI8; }
-static constexpr bool isUInt8(uint32_t typeId) noexcept { return typeId == kIdU8; }
-static constexpr bool isInt16(uint32_t typeId) noexcept { return typeId == kIdI16; }
-static constexpr bool isUInt16(uint32_t typeId) noexcept { return typeId == kIdU16; }
-static constexpr bool isInt32(uint32_t typeId) noexcept { return typeId == kIdI32; }
-static constexpr bool isUInt32(uint32_t typeId) noexcept { return typeId == kIdU32; }
-static constexpr bool isInt64(uint32_t typeId) noexcept { return typeId == kIdI64; }
-static constexpr bool isUInt64(uint32_t typeId) noexcept { return typeId == kIdU64; }
-
-static constexpr bool isGp8(uint32_t typeId) noexcept { return typeId >= kIdI8 && typeId <= kIdU8; }
-static constexpr bool isGp16(uint32_t typeId) noexcept { return typeId >= kIdI16 && typeId <= kIdU16; }
-static constexpr bool isGp32(uint32_t typeId) noexcept { return typeId >= kIdI32 && typeId <= kIdU32; }
-static constexpr bool isGp64(uint32_t typeId) noexcept { return typeId >= kIdI64 && typeId <= kIdU64; }
-
-static constexpr bool isFloat(uint32_t typeId) noexcept { return typeId >= _kIdFloatStart && typeId <= _kIdFloatEnd; }
-static constexpr bool isFloat32(uint32_t typeId) noexcept { return typeId == kIdF32; }
-static constexpr bool isFloat64(uint32_t typeId) noexcept { return typeId == kIdF64; }
-static constexpr bool isFloat80(uint32_t typeId) noexcept { return typeId == kIdF80; }
-
-static constexpr bool isMask(uint32_t typeId) noexcept { return typeId >= _kIdMaskStart && typeId <= _kIdMaskEnd; }
-static constexpr bool isMask8(uint32_t typeId) noexcept { return typeId == kIdMask8; }
-static constexpr bool isMask16(uint32_t typeId) noexcept { return typeId == kIdMask16; }
-static constexpr bool isMask32(uint32_t typeId) noexcept { return typeId == kIdMask32; }
-static constexpr bool isMask64(uint32_t typeId) noexcept { return typeId == kIdMask64; }
-
-static constexpr bool isMmx(uint32_t typeId) noexcept { return typeId >= _kIdMmxStart && typeId <= _kIdMmxEnd; }
-static constexpr bool isMmx32(uint32_t typeId) noexcept { return typeId == kIdMmx32; }
-static constexpr bool isMmx64(uint32_t typeId) noexcept { return typeId == kIdMmx64; }
-
-static constexpr bool isVec(uint32_t typeId) noexcept { return typeId >= _kIdVec32Start && typeId <= _kIdVec512End; }
-static constexpr bool isVec32(uint32_t typeId) noexcept { return typeId >= _kIdVec32Start && typeId <= _kIdVec32End; }
-static constexpr bool isVec64(uint32_t typeId) noexcept { return typeId >= _kIdVec64Start && typeId <= _kIdVec64End; }
-static constexpr bool isVec128(uint32_t typeId) noexcept { return typeId >= _kIdVec128Start && typeId <= _kIdVec128End; }
-static constexpr bool isVec256(uint32_t typeId) noexcept { return typeId >= _kIdVec256Start && typeId <= _kIdVec256End; }
-static constexpr bool isVec512(uint32_t typeId) noexcept { return typeId >= _kIdVec512Start && typeId <= _kIdVec512End; }
+//! Returns the scalar type of `typeId`.
+static inline TypeId scalarOf(TypeId typeId) noexcept { return _typeData.scalarOf[uint32_t(typeId)]; }
+
+//! Returns the size [in bytes] of `typeId`.
+static inline uint32_t sizeOf(TypeId typeId) noexcept { return _typeData.sizeOf[uint32_t(typeId)]; }
+
+//! Tests whether a given type `typeId` is between `a` and `b`.
+static inline constexpr bool isBetween(TypeId typeId, TypeId a, TypeId b) noexcept {
+ return Support::isBetween(uint32_t(typeId), uint32_t(a), uint32_t(b));
+}
+
+//! Tests whether a given type `typeId` is \ref TypeId::kVoid.
+static inline constexpr bool isVoid(TypeId typeId) noexcept { return typeId == TypeId::kVoid; }
+//! Tests whether a given type `typeId` is a valid non-void type.
+static inline constexpr bool isValid(TypeId typeId) noexcept { return isBetween(typeId, TypeId::_kIntStart, TypeId::_kVec512End); }
+//! Tests whether a given type `typeId` is scalar (has no vector part).
+static inline constexpr bool isScalar(TypeId typeId) noexcept { return isBetween(typeId, TypeId::_kBaseStart, TypeId::_kBaseEnd); }
+//! Tests whether a given type `typeId` is abstract, which means that its size depends on register size.
+static inline constexpr bool isAbstract(TypeId typeId) noexcept { return isBetween(typeId, TypeId::kIntPtr, TypeId::kUIntPtr); }
+
+//! Tests whether a given type is a scalar integer (signed or unsigned) of any size.
+static inline constexpr bool isInt(TypeId typeId) noexcept { return isBetween(typeId, TypeId::_kIntStart, TypeId::_kIntEnd); }
+//! Tests whether a given type is a scalar 8-bit integer (signed).
+static inline constexpr bool isInt8(TypeId typeId) noexcept { return typeId == TypeId::kInt8; }
+//! Tests whether a given type is a scalar 8-bit integer (unsigned).
+static inline constexpr bool isUInt8(TypeId typeId) noexcept { return typeId == TypeId::kUInt8; }
+//! Tests whether a given type is a scalar 16-bit integer (signed).
+static inline constexpr bool isInt16(TypeId typeId) noexcept { return typeId == TypeId::kInt16; }
+//! Tests whether a given type is a scalar 16-bit integer (unsigned).
+static inline constexpr bool isUInt16(TypeId typeId) noexcept { return typeId == TypeId::kUInt16; }
+//! Tests whether a given type is a scalar 32-bit integer (signed).
+static inline constexpr bool isInt32(TypeId typeId) noexcept { return typeId == TypeId::kInt32; }
+//! Tests whether a given type is a scalar 32-bit integer (unsigned).
+static inline constexpr bool isUInt32(TypeId typeId) noexcept { return typeId == TypeId::kUInt32; }
+//! Tests whether a given type is a scalar 64-bit integer (signed).
+static inline constexpr bool isInt64(TypeId typeId) noexcept { return typeId == TypeId::kInt64; }
+//! Tests whether a given type is a scalar 64-bit integer (unsigned).
+static inline constexpr bool isUInt64(TypeId typeId) noexcept { return typeId == TypeId::kUInt64; }
+
+static inline constexpr bool isGp8(TypeId typeId) noexcept { return isBetween(typeId, TypeId::kInt8, TypeId::kUInt8); }
+static inline constexpr bool isGp16(TypeId typeId) noexcept { return isBetween(typeId, TypeId::kInt16, TypeId::kUInt16); }
+static inline constexpr bool isGp32(TypeId typeId) noexcept { return isBetween(typeId, TypeId::kInt32, TypeId::kUInt32); }
+static inline constexpr bool isGp64(TypeId typeId) noexcept { return isBetween(typeId, TypeId::kInt64, TypeId::kUInt64); }
+
+//! Tests whether a given type is a scalar floating point of any size.
+static inline constexpr bool isFloat(TypeId typeId) noexcept { return isBetween(typeId, TypeId::_kFloatStart, TypeId::_kFloatEnd); }
+//! Tests whether a given type is a scalar 32-bit float.
+static inline constexpr bool isFloat32(TypeId typeId) noexcept { return typeId == TypeId::kFloat32; }
+//! Tests whether a given type is a scalar 64-bit float.
+static inline constexpr bool isFloat64(TypeId typeId) noexcept { return typeId == TypeId::kFloat64; }
+//! Tests whether a given type is a scalar 80-bit float.
+static inline constexpr bool isFloat80(TypeId typeId) noexcept { return typeId == TypeId::kFloat80; }
+
+static inline constexpr bool isMask(TypeId typeId) noexcept { return isBetween(typeId, TypeId::_kMaskStart, TypeId::_kMaskEnd); }
+static inline constexpr bool isMask8(TypeId typeId) noexcept { return typeId == TypeId::kMask8; }
+static inline constexpr bool isMask16(TypeId typeId) noexcept { return typeId == TypeId::kMask16; }
+static inline constexpr bool isMask32(TypeId typeId) noexcept { return typeId == TypeId::kMask32; }
+static inline constexpr bool isMask64(TypeId typeId) noexcept { return typeId == TypeId::kMask64; }
+
+static inline constexpr bool isMmx(TypeId typeId) noexcept { return isBetween(typeId, TypeId::_kMmxStart, TypeId::_kMmxEnd); }
+static inline constexpr bool isMmx32(TypeId typeId) noexcept { return typeId == TypeId::kMmx32; }
+static inline constexpr bool isMmx64(TypeId typeId) noexcept { return typeId == TypeId::kMmx64; }
+
+static inline constexpr bool isVec(TypeId typeId) noexcept { return isBetween(typeId, TypeId::_kVec32Start, TypeId::_kVec512End); }
+static inline constexpr bool isVec32(TypeId typeId) noexcept { return isBetween(typeId, TypeId::_kVec32Start, TypeId::_kVec32End); }
+static inline constexpr bool isVec64(TypeId typeId) noexcept { return isBetween(typeId, TypeId::_kVec64Start, TypeId::_kVec64End); }
+static inline constexpr bool isVec128(TypeId typeId) noexcept { return isBetween(typeId, TypeId::_kVec128Start, TypeId::_kVec128End); }
+static inline constexpr bool isVec256(TypeId typeId) noexcept { return isBetween(typeId, TypeId::_kVec256Start, TypeId::_kVec256End); }
+static inline constexpr bool isVec512(TypeId typeId) noexcept { return isBetween(typeId, TypeId::_kVec512Start, TypeId::_kVec512End); }
//! \cond
enum TypeCategory : uint32_t {
@@ -215,157 +242,174 @@ enum TypeCategory : uint32_t {
kTypeCategoryFunction = 4
};
-template<typename T, uint32_t Category>
-struct IdOfT_ByCategory {}; // Fails if not specialized.
+template<typename T, TypeCategory kCategory>
+struct TypeIdOfT_ByCategory {}; // Fails if not specialized.
template<typename T>
-struct IdOfT_ByCategory<T, kTypeCategoryIntegral> {
+struct TypeIdOfT_ByCategory<T, kTypeCategoryIntegral> {
enum : uint32_t {
- kTypeId = (sizeof(T) == 1 && std::is_signed<T>::value) ? kIdI8 :
- (sizeof(T) == 1 && !std::is_signed<T>::value) ? kIdU8 :
- (sizeof(T) == 2 && std::is_signed<T>::value) ? kIdI16 :
- (sizeof(T) == 2 && !std::is_signed<T>::value) ? kIdU16 :
- (sizeof(T) == 4 && std::is_signed<T>::value) ? kIdI32 :
- (sizeof(T) == 4 && !std::is_signed<T>::value) ? kIdU32 :
- (sizeof(T) == 8 && std::is_signed<T>::value) ? kIdI64 :
- (sizeof(T) == 8 && !std::is_signed<T>::value) ? kIdU64 : kIdVoid
+ kTypeId = uint32_t(
+ (sizeof(T) == 1 && std::is_signed<T>::value) ? TypeId::kInt8 :
+ (sizeof(T) == 1 && !std::is_signed<T>::value) ? TypeId::kUInt8 :
+ (sizeof(T) == 2 && std::is_signed<T>::value) ? TypeId::kInt16 :
+ (sizeof(T) == 2 && !std::is_signed<T>::value) ? TypeId::kUInt16 :
+ (sizeof(T) == 4 && std::is_signed<T>::value) ? TypeId::kInt32 :
+ (sizeof(T) == 4 && !std::is_signed<T>::value) ? TypeId::kUInt32 :
+ (sizeof(T) == 8 && std::is_signed<T>::value) ? TypeId::kInt64 :
+ (sizeof(T) == 8 && !std::is_signed<T>::value) ? TypeId::kUInt64 : TypeId::kVoid)
};
};
template<typename T>
-struct IdOfT_ByCategory<T, kTypeCategoryFloatingPoint> {
+struct TypeIdOfT_ByCategory<T, kTypeCategoryFloatingPoint> {
enum : uint32_t {
- kTypeId = (sizeof(T) == 4 ) ? kIdF32 :
- (sizeof(T) == 8 ) ? kIdF64 :
- (sizeof(T) >= 10) ? kIdF80 : kIdVoid
+ kTypeId = uint32_t(
+ (sizeof(T) == 4 ) ? TypeId::kFloat32 :
+ (sizeof(T) == 8 ) ? TypeId::kFloat64 :
+ (sizeof(T) >= 10) ? TypeId::kFloat80 : TypeId::kVoid)
};
};
template<typename T>
-struct IdOfT_ByCategory<T, kTypeCategoryEnum>
- : public IdOfT_ByCategory<typename std::underlying_type<T>::type, kTypeCategoryIntegral> {};
+struct TypeIdOfT_ByCategory<T, kTypeCategoryEnum>
+ : public TypeIdOfT_ByCategory<typename std::underlying_type<T>::type, kTypeCategoryIntegral> {};
template<typename T>
-struct IdOfT_ByCategory<T, kTypeCategoryFunction> {
- enum: uint32_t { kTypeId = kIdUIntPtr };
+struct TypeIdOfT_ByCategory<T, kTypeCategoryFunction> {
+ enum : uint32_t {
+ kTypeId = uint32_t(TypeId::kUIntPtr)
+ };
};
//! \endcond
-//! IdOfT<> template allows to get a TypeId from a C++ type `T`.
-template<typename T>
-struct IdOfT
+//! TypeIdOfT<> template allows to get a TypeId from a C++ type `T`.
#ifdef _DOXYGEN
+template<typename T>
+struct TypeIdOfT {
//! TypeId of C++ type `T`.
- static constexpr uint32_t kTypeId = _TypeIdDeducedAtCompileTime_;
+ static constexpr TypeId kTypeId = _TypeIdDeducedAtCompileTime_;
+};
#else
- : public IdOfT_ByCategory<T,
+template<typename T>
+struct TypeIdOfT
+ : public TypeIdOfT_ByCategory<T,
std::is_enum<T>::value ? kTypeCategoryEnum :
std::is_integral<T>::value ? kTypeCategoryIntegral :
std::is_floating_point<T>::value ? kTypeCategoryFloatingPoint :
- std::is_function<T>::value ? kTypeCategoryFunction : kTypeCategoryUnknown>
+ std::is_function<T>::value ? kTypeCategoryFunction : kTypeCategoryUnknown> {};
#endif
-{};
//! \cond
template<typename T>
-struct IdOfT<T*> { enum : uint32_t { kTypeId = kIdUIntPtr }; };
+struct TypeIdOfT<T*> {
+ enum : uint32_t {
+ kTypeId = uint32_t(TypeId::kUIntPtr)
+ };
+};
template<typename T>
-struct IdOfT<T&> { enum : uint32_t { kTypeId = kIdUIntPtr }; };
+struct TypeIdOfT<T&> {
+ enum : uint32_t {
+ kTypeId = uint32_t(TypeId::kUIntPtr)
+ };
+};
//! \endcond
-static inline uint32_t baseOf(uint32_t typeId) noexcept {
- ASMJIT_ASSERT(typeId <= kIdMax);
- return _typeData.baseOf[typeId];
-}
-
-static inline uint32_t sizeOf(uint32_t typeId) noexcept {
- ASMJIT_ASSERT(typeId <= kIdMax);
- return _typeData.sizeOf[typeId];
-}
+//! Returns a corresponding \ref TypeId of `T` type.
+template<typename T>
+static inline constexpr TypeId typeIdOfT() noexcept { return TypeId(TypeIdOfT<T>::kTypeId); }
-//! Returns offset needed to convert a `kIntPtr` and `kUIntPtr` TypeId
-//! into a type that matches `registerSize` (general-purpose register size).
-//! If you find such TypeId it's then only about adding the offset to it.
+//! Returns offset needed to convert a `kIntPtr` and `kUIntPtr` TypeId into a type that matches `registerSize`
+//! (general-purpose register size). If you find such TypeId it's then only about adding the offset to it.
//!
//! For example:
//!
//! ```
-//! uint32_t registerSize = '4' or '8';
-//! uint32_t deabstractDelta = Type::deabstractDeltaOfSize(registerSize);
+//! uint32_t registerSize = /* 4 or 8 */;
+//! uint32_t deabstractDelta = TypeUtils::deabstractDeltaOfSize(registerSize);
//!
-//! uint32_t typeId = 'some type-id';
+//! TypeId typeId = 'some type-id';
//!
//! // Normalize some typeId into a non-abstract typeId.
-//! if (Type::isAbstract(typeId)) typeId += deabstractDelta;
+//! if (TypeUtils::isAbstract(typeId)) typeId += deabstractDelta;
//!
-//! // The same, but by using Type::deabstract() function.
-//! typeId = Type::deabstract(typeId, deabstractDelta);
+//! // The same, but by using TypeUtils::deabstract() function.
+//! typeId = TypeUtils::deabstract(typeId, deabstractDelta);
//! ```
-static constexpr uint32_t deabstractDeltaOfSize(uint32_t registerSize) noexcept {
- return registerSize >= 8 ? kIdI64 - kIdIntPtr : kIdI32 - kIdIntPtr;
+static inline constexpr uint32_t deabstractDeltaOfSize(uint32_t registerSize) noexcept {
+ return registerSize >= 8 ? uint32_t(TypeId::kInt64) - uint32_t(TypeId::kIntPtr)
+ : uint32_t(TypeId::kInt32) - uint32_t(TypeId::kIntPtr);
+}
+
+//! Deabstracts a given `typeId` into a native type by using `deabstractDelta`, which was previously
+//! calculated by calling \ref deabstractDeltaOfSize() with a target native register size.
+static inline constexpr TypeId deabstract(TypeId typeId, uint32_t deabstractDelta) noexcept {
+ return isAbstract(typeId) ? TypeId(uint32_t(typeId) + deabstractDelta) : typeId;
}
-static constexpr uint32_t deabstract(uint32_t typeId, uint32_t deabstractDelta) noexcept {
- return isAbstract(typeId) ? typeId + deabstractDelta : typeId;
+static inline constexpr TypeId scalarToVector(TypeId scalarTypeId, TypeId vecStartId) noexcept {
+ return TypeId(uint32_t(vecStartId) + uint32_t(scalarTypeId) - uint32_t(TypeId::kInt8));
}
+} // {TypeUtils}
+
+//! Provides type identifiers that can be used in templates instead of native types.
+namespace Type {
+
//! bool as C++ type-name.
struct Bool {};
//! int8_t as C++ type-name.
-struct I8 {};
+struct Int8 {};
//! uint8_t as C++ type-name.
-struct U8 {};
+struct UInt8 {};
//! int16_t as C++ type-name.
-struct I16 {};
+struct Int16 {};
//! uint16_t as C++ type-name.
-struct U16 {};
+struct UInt16 {};
//! int32_t as C++ type-name.
-struct I32 {};
+struct Int32 {};
//! uint32_t as C++ type-name.
-struct U32 {};
+struct UInt32 {};
//! int64_t as C++ type-name.
-struct I64 {};
+struct Int64 {};
//! uint64_t as C++ type-name.
-struct U64 {};
+struct UInt64 {};
//! intptr_t as C++ type-name.
-struct IPtr {};
+struct IntPtr {};
//! uintptr_t as C++ type-name.
-struct UPtr {};
+struct UIntPtr {};
//! float as C++ type-name.
-struct F32 {};
+struct Float32 {};
//! double as C++ type-name.
-struct F64 {};
+struct Float64 {};
} // {Type}
-// ============================================================================
-// [ASMJIT_DEFINE_TYPE_ID]
-// ============================================================================
-
//! \cond
-#define ASMJIT_DEFINE_TYPE_ID(T, TYPE_ID) \
-namespace Type { \
- template<> \
- struct IdOfT<T> { \
- enum : uint32_t { kTypeId = TYPE_ID }; \
- }; \
+#define ASMJIT_DEFINE_TYPE_ID(T, TYPE_ID) \
+namespace TypeUtils { \
+ template<> \
+ struct TypeIdOfT<T> { \
+ enum : uint32_t { \
+ kTypeId = uint32_t(TYPE_ID) \
+ }; \
+ }; \
}
-ASMJIT_DEFINE_TYPE_ID(void, kIdVoid);
-ASMJIT_DEFINE_TYPE_ID(Bool, kIdU8);
-ASMJIT_DEFINE_TYPE_ID(I8 , kIdI8);
-ASMJIT_DEFINE_TYPE_ID(U8 , kIdU8);
-ASMJIT_DEFINE_TYPE_ID(I16 , kIdI16);
-ASMJIT_DEFINE_TYPE_ID(U16 , kIdU16);
-ASMJIT_DEFINE_TYPE_ID(I32 , kIdI32);
-ASMJIT_DEFINE_TYPE_ID(U32 , kIdU32);
-ASMJIT_DEFINE_TYPE_ID(I64 , kIdI64);
-ASMJIT_DEFINE_TYPE_ID(U64 , kIdU64);
-ASMJIT_DEFINE_TYPE_ID(IPtr, kIdIntPtr);
-ASMJIT_DEFINE_TYPE_ID(UPtr, kIdUIntPtr);
-ASMJIT_DEFINE_TYPE_ID(F32 , kIdF32);
-ASMJIT_DEFINE_TYPE_ID(F64 , kIdF64);
+ASMJIT_DEFINE_TYPE_ID(void , TypeId::kVoid);
+ASMJIT_DEFINE_TYPE_ID(Type::Bool , TypeId::kUInt8);
+ASMJIT_DEFINE_TYPE_ID(Type::Int8 , TypeId::kInt8);
+ASMJIT_DEFINE_TYPE_ID(Type::UInt8 , TypeId::kUInt8);
+ASMJIT_DEFINE_TYPE_ID(Type::Int16 , TypeId::kInt16);
+ASMJIT_DEFINE_TYPE_ID(Type::UInt16 , TypeId::kUInt16);
+ASMJIT_DEFINE_TYPE_ID(Type::Int32 , TypeId::kInt32);
+ASMJIT_DEFINE_TYPE_ID(Type::UInt32 , TypeId::kUInt32);
+ASMJIT_DEFINE_TYPE_ID(Type::Int64 , TypeId::kInt64);
+ASMJIT_DEFINE_TYPE_ID(Type::UInt64 , TypeId::kUInt64);
+ASMJIT_DEFINE_TYPE_ID(Type::IntPtr , TypeId::kIntPtr);
+ASMJIT_DEFINE_TYPE_ID(Type::UIntPtr, TypeId::kUIntPtr);
+ASMJIT_DEFINE_TYPE_ID(Type::Float32, TypeId::kFloat32);
+ASMJIT_DEFINE_TYPE_ID(Type::Float64, TypeId::kFloat64);
//! \endcond
//! \}
diff --git a/3rdparty/asmjit/src/asmjit/core/virtmem.cpp b/3rdparty/asmjit/src/asmjit/core/virtmem.cpp
index 0606748ef7f..43766ef2cd2 100644
--- a/3rdparty/asmjit/src/asmjit/core/virtmem.cpp
+++ b/3rdparty/asmjit/src/asmjit/core/virtmem.cpp
@@ -1,25 +1,7 @@
-// AsmJit - Machine code generation for C++
+// This file is part of AsmJit project <https://asmjit.com>
//
-// * Official AsmJit Home Page: https://asmjit.com
-// * Official Github Repository: https://github.com/asmjit/asmjit
-//
-// Copyright (c) 2008-2020 The AsmJit Authors
-//
-// This software is provided 'as-is', without any express or implied
-// warranty. In no event will the authors be held liable for any damages
-// arising from the use of this software.
-//
-// Permission is granted to anyone to use this software for any purpose,
-// including commercial applications, and to alter it and redistribute it
-// freely, subject to the following restrictions:
-//
-// 1. The origin of this software must not be misrepresented; you must not
-// claim that you wrote the original software. If you use this software
-// in a product, an acknowledgment in the product documentation would be
-// appreciated but is not required.
-// 2. Altered source versions must be plainly marked as such, and must not be
-// misrepresented as being the original software.
-// 3. This notice may not be removed or altered from any source distribution.
+// See asmjit.h or LICENSE.md for license and copyright information
+// SPDX-License-Identifier: Zlib
#include "../core/api-build_p.h"
#ifndef ASMJIT_NO_JIT
@@ -44,9 +26,11 @@
// Apple recently introduced MAP_JIT flag, which we want to use.
#if defined(__APPLE__)
+ #include <pthread.h>
#include <TargetConditionals.h>
#if TARGET_OS_OSX
#include <sys/utsname.h>
+ #include <libkern/OSCacheControl.h> // sys_icache_invalidate().
#endif
// Older SDK doesn't define `MAP_JIT`.
#ifndef MAP_JIT
@@ -54,7 +38,7 @@
#endif
#endif
- // BSD/OSX: `MAP_ANONYMOUS` is not defined, `MAP_ANON` is.
+ // BSD/MAC: `MAP_ANONYMOUS` is not defined, `MAP_ANON` is.
#if !defined(MAP_ANONYMOUS)
#define MAP_ANONYMOUS MAP_ANON
#endif
@@ -62,28 +46,38 @@
#include <atomic>
-#if defined(__APPLE__)
+#if defined(__APPLE__) || defined(__BIONIC__)
#define ASMJIT_VM_SHM_DETECT 0
#else
#define ASMJIT_VM_SHM_DETECT 1
#endif
-ASMJIT_BEGIN_NAMESPACE
+// Android NDK doesn't provide `shm_open()` and `shm_unlink()`.
+#if defined(__BIONIC__)
+ #define ASMJIT_VM_SHM_AVAILABLE 0
+#else
+ #define ASMJIT_VM_SHM_AVAILABLE 1
+#endif
+
+#if defined(__APPLE__) && ASMJIT_ARCH_ARM >= 64
+ #define ASMJIT_HAS_PTHREAD_JIT_WRITE_PROTECT_NP
+#endif
+
+ASMJIT_BEGIN_SUB_NAMESPACE(VirtMem)
-// ============================================================================
-// [asmjit::VirtMem - Utilities]
-// ============================================================================
+// Virtual Memory Utilities
+// ========================
-static const uint32_t VirtMem_dualMappingFilter[2] = {
- VirtMem::kAccessWrite,
- VirtMem::kAccessExecute
+static const MemoryFlags dualMappingFilter[2] = {
+ MemoryFlags::kAccessWrite | MemoryFlags::kMMapMaxAccessWrite,
+ MemoryFlags::kAccessExecute | MemoryFlags::kMMapMaxAccessExecute
};
-// ============================================================================
-// [asmjit::VirtMem - Virtual Memory [Windows]]
-// ============================================================================
+// Virtual Memory [Windows]
+// ========================
#if defined(_WIN32)
+
struct ScopedHandle {
inline ScopedHandle() noexcept
: value(nullptr) {}
@@ -96,7 +90,7 @@ struct ScopedHandle {
HANDLE value;
};
-static void VirtMem_getInfo(VirtMem::Info& vmInfo) noexcept {
+static void getVMInfo(Info& vmInfo) noexcept {
SYSTEM_INFO systemInfo;
::GetSystemInfo(&systemInfo);
@@ -104,15 +98,15 @@ static void VirtMem_getInfo(VirtMem::Info& vmInfo) noexcept {
vmInfo.pageGranularity = systemInfo.dwAllocationGranularity;
}
-// Windows specific implementation that uses `VirtualAlloc` and `VirtualFree`.
-static DWORD VirtMem_accessToWinProtectFlags(uint32_t flags) noexcept {
+// Returns windows-specific protectFlags from \ref MemoryFlags.
+static DWORD protectFlagsFromMemoryFlags(MemoryFlags memoryFlags) noexcept {
DWORD protectFlags;
// READ|WRITE|EXECUTE.
- if (flags & VirtMem::kAccessExecute)
- protectFlags = (flags & VirtMem::kAccessWrite) ? PAGE_EXECUTE_READWRITE : PAGE_EXECUTE_READ;
- else if (flags & VirtMem::kAccessReadWrite)
- protectFlags = (flags & VirtMem::kAccessWrite) ? PAGE_READWRITE : PAGE_READONLY;
+ if (Support::test(memoryFlags, MemoryFlags::kAccessExecute))
+ protectFlags = Support::test(memoryFlags, MemoryFlags::kAccessWrite) ? PAGE_EXECUTE_READWRITE : PAGE_EXECUTE_READ;
+ else if (Support::test(memoryFlags, MemoryFlags::kAccessRW))
+ protectFlags = Support::test(memoryFlags, MemoryFlags::kAccessWrite) ? PAGE_READWRITE : PAGE_READONLY;
else
protectFlags = PAGE_NOACCESS;
@@ -120,19 +114,23 @@ static DWORD VirtMem_accessToWinProtectFlags(uint32_t flags) noexcept {
return protectFlags;
}
-static DWORD VirtMem_accessToWinDesiredAccess(uint32_t flags) noexcept {
- DWORD access = (flags & VirtMem::kAccessWrite) ? FILE_MAP_WRITE : FILE_MAP_READ;
- if (flags & VirtMem::kAccessExecute)
+static DWORD desiredAccessFromMemoryFlags(MemoryFlags memoryFlags) noexcept {
+ DWORD access = Support::test(memoryFlags, MemoryFlags::kAccessWrite) ? FILE_MAP_WRITE : FILE_MAP_READ;
+ if (Support::test(memoryFlags, MemoryFlags::kAccessExecute))
access |= FILE_MAP_EXECUTE;
return access;
}
-Error VirtMem::alloc(void** p, size_t size, uint32_t flags) noexcept {
+static HardenedRuntimeFlags getHardenedRuntimeFlags() noexcept {
+ return HardenedRuntimeFlags::kNone;
+}
+
+Error alloc(void** p, size_t size, MemoryFlags memoryFlags) noexcept {
*p = nullptr;
if (size == 0)
return DebugUtils::errored(kErrorInvalidArgument);
- DWORD protectFlags = VirtMem_accessToWinProtectFlags(flags);
+ DWORD protectFlags = protectFlagsFromMemoryFlags(memoryFlags);
void* result = ::VirtualAlloc(nullptr, size, MEM_COMMIT | MEM_RESERVE, protectFlags);
if (!result)
@@ -142,15 +140,15 @@ Error VirtMem::alloc(void** p, size_t size, uint32_t flags) noexcept {
return kErrorOk;
}
-Error VirtMem::release(void* p, size_t size) noexcept {
+Error release(void* p, size_t size) noexcept {
DebugUtils::unused(size);
if (ASMJIT_UNLIKELY(!::VirtualFree(p, 0, MEM_RELEASE)))
return DebugUtils::errored(kErrorInvalidArgument);
return kErrorOk;
}
-Error VirtMem::protect(void* p, size_t size, uint32_t flags) noexcept {
- DWORD protectFlags = VirtMem_accessToWinProtectFlags(flags);
+Error protect(void* p, size_t size, MemoryFlags memoryFlags) noexcept {
+ DWORD protectFlags = protectFlagsFromMemoryFlags(memoryFlags);
DWORD oldFlags;
if (::VirtualProtect(p, size, protectFlags, &oldFlags))
@@ -159,8 +157,8 @@ Error VirtMem::protect(void* p, size_t size, uint32_t flags) noexcept {
return DebugUtils::errored(kErrorInvalidArgument);
}
-Error VirtMem::allocDualMapping(DualMapping* dm, size_t size, uint32_t flags) noexcept {
- dm->ro = nullptr;
+Error allocDualMapping(DualMapping* dm, size_t size, MemoryFlags memoryFlags) noexcept {
+ dm->rx = nullptr;
dm->rw = nullptr;
if (size == 0)
@@ -180,7 +178,8 @@ Error VirtMem::allocDualMapping(DualMapping* dm, size_t size, uint32_t flags) no
void* ptr[2];
for (uint32_t i = 0; i < 2; i++) {
- DWORD desiredAccess = VirtMem_accessToWinDesiredAccess(flags & ~VirtMem_dualMappingFilter[i]);
+ MemoryFlags accessFlags = memoryFlags & ~dualMappingFilter[i];
+ DWORD desiredAccess = desiredAccessFromMemoryFlags(accessFlags);
ptr[i] = ::MapViewOfFile(handle.value, desiredAccess, 0, 0, size);
if (ptr[i] == nullptr) {
@@ -190,77 +189,52 @@ Error VirtMem::allocDualMapping(DualMapping* dm, size_t size, uint32_t flags) no
}
}
- dm->ro = ptr[0];
+ dm->rx = ptr[0];
dm->rw = ptr[1];
return kErrorOk;
}
-Error VirtMem::releaseDualMapping(DualMapping* dm, size_t size) noexcept {
+Error releaseDualMapping(DualMapping* dm, size_t size) noexcept {
DebugUtils::unused(size);
bool failed = false;
- if (!::UnmapViewOfFile(dm->ro))
+ if (!::UnmapViewOfFile(dm->rx))
failed = true;
- if (dm->ro != dm->rw && !UnmapViewOfFile(dm->rw))
+ if (dm->rx != dm->rw && !UnmapViewOfFile(dm->rw))
failed = true;
if (failed)
return DebugUtils::errored(kErrorInvalidArgument);
- dm->ro = nullptr;
+ dm->rx = nullptr;
dm->rw = nullptr;
return kErrorOk;
}
+
#endif
-// ============================================================================
-// [asmjit::VirtMem - Virtual Memory [Posix]]
-// ============================================================================
+// Virtual Memory [Posix]
+// ======================
#if !defined(_WIN32)
-struct ScopedFD {
- inline ScopedFD() noexcept
- : value(-1) {}
- inline ~ScopedFD() noexcept {
- if (value != -1)
- close(value);
- }
-
- int value;
-};
-
-static void VirtMem_getInfo(VirtMem::Info& vmInfo) noexcept {
+static void getVMInfo(Info& vmInfo) noexcept {
uint32_t pageSize = uint32_t(::getpagesize());
vmInfo.pageSize = pageSize;
vmInfo.pageGranularity = Support::max<uint32_t>(pageSize, 65536);
}
-// Some operating systems don't allow /dev/shm to be executable. On Linux this
-// happens when /dev/shm is mounted with 'noexec', which is enforced by systemd.
-// Other operating systems like OSX also restrict executable permissions regarding
-// /dev/shm, so we use a runtime detection before trying to allocate the requested
-// memory by the user. Sometimes we don't need the detection as we know it would
-// always result in 'kShmStrategyTmpDir'.
-enum ShmStrategy : uint32_t {
- kShmStrategyUnknown = 0,
- kShmStrategyDevShm = 1,
- kShmStrategyTmpDir = 2
-};
-
-// Posix specific implementation that uses `mmap()` and `munmap()`.
-static int VirtMem_accessToPosixProtection(uint32_t flags) noexcept {
- int protection = 0;
- if (flags & VirtMem::kAccessRead ) protection |= PROT_READ;
- if (flags & VirtMem::kAccessWrite ) protection |= PROT_READ | PROT_WRITE;
- if (flags & VirtMem::kAccessExecute) protection |= PROT_READ | PROT_EXEC;
- return protection;
+#if !defined(SHM_ANON)
+static const char* getTmpDir() noexcept {
+ const char* tmpDir = getenv("TMPDIR");
+ return tmpDir ? tmpDir : "/tmp";
}
+#endif
// Translates libc errors specific to VirtualMemory mapping to `asmjit::Error`.
-static Error VirtMem_makeErrorFromErrno(int e) noexcept {
+static Error asmjitErrorFromErrno(int e) noexcept {
switch (e) {
case EACCES:
case EAGAIN:
@@ -282,11 +256,168 @@ static Error VirtMem_makeErrorFromErrno(int e) noexcept {
}
}
+// Some operating systems don't allow /dev/shm to be executable. On Linux this happens when /dev/shm is mounted with
+// 'noexec', which is enforced by systemd. Other operating systems like MacOS also restrict executable permissions
+// regarding /dev/shm, so we use a runtime detection before attempting to allocate executable memory. Sometimes we
+// don't need the detection as we know it would always result in `ShmStrategy::kTmpDir`.
+enum class ShmStrategy : uint32_t {
+ kUnknown = 0,
+ kDevShm = 1,
+ kTmpDir = 2
+};
+
+class AnonymousMemory {
+public:
+ enum FileType : uint32_t {
+ kFileTypeNone,
+ kFileTypeShm,
+ kFileTypeTmp
+ };
+
+ int _fd;
+ FileType _fileType;
+ StringTmp<128> _tmpName;
+
+ inline AnonymousMemory() noexcept
+ : _fd(-1),
+ _fileType(kFileTypeNone),
+ _tmpName() {}
+
+ inline ~AnonymousMemory() noexcept {
+ unlink();
+ close();
+ }
+
+ inline int fd() const noexcept { return _fd; }
+
+ Error open(bool preferTmpOverDevShm) noexcept {
+#if defined(__linux__) && defined(__NR_memfd_create)
+ // Linux specific 'memfd_create' - if the syscall returns `ENOSYS` it means
+ // it's not available and we will never call it again (would be pointless).
+
+ // Zero initialized, if ever changed to '1' that would mean the syscall is not
+ // available and we must use `shm_open()` and `shm_unlink()`.
+ static volatile uint32_t memfd_create_not_supported;
+
+ if (!memfd_create_not_supported) {
+ _fd = (int)syscall(__NR_memfd_create, "vmem", 0);
+ if (ASMJIT_LIKELY(_fd >= 0))
+ return kErrorOk;
+
+ int e = errno;
+ if (e == ENOSYS)
+ memfd_create_not_supported = 1;
+ else
+ return DebugUtils::errored(asmjitErrorFromErrno(e));
+ }
+#endif
+
+#if defined(SHM_ANON)
+ // Originally FreeBSD extension, apparently works in other BSDs too.
+ DebugUtils::unused(preferTmpOverDevShm);
+ _fd = ::shm_open(SHM_ANON, O_RDWR | O_CREAT | O_EXCL, S_IRUSR | S_IWUSR);
+
+ if (ASMJIT_LIKELY(_fd >= 0))
+ return kErrorOk;
+ else
+ return DebugUtils::errored(asmjitErrorFromErrno(errno));
+#else
+ // POSIX API. We have to generate somehow a unique name. This is nothing cryptographic, just using a bit from
+ // the stack address to always have a different base for different threads (as threads have their own stack)
+ // and retries for avoiding collisions. We use `shm_open()` with flags that require creation of the file so we
+ // never open an existing shared memory.
+ static std::atomic<uint32_t> internalCounter;
+ const char* kShmFormat = "/shm-id-%016llX";
+
+ uint32_t kRetryCount = 100;
+ uint64_t bits = ((uintptr_t)(void*)this) & 0x55555555u;
+
+ for (uint32_t i = 0; i < kRetryCount; i++) {
+ bits -= uint64_t(OSUtils::getTickCount()) * 773703683;
+ bits = ((bits >> 14) ^ (bits << 6)) + uint64_t(++internalCounter) * 10619863;
+
+ bool useTmp = !ASMJIT_VM_SHM_DETECT || preferTmpOverDevShm;
+
+ if (useTmp) {
+ _tmpName.assign(getTmpDir());
+ _tmpName.appendFormat(kShmFormat, (unsigned long long)bits);
+ _fd = ::open(_tmpName.data(), O_RDWR | O_CREAT | O_EXCL, 0);
+ if (ASMJIT_LIKELY(_fd >= 0)) {
+ _fileType = kFileTypeTmp;
+ return kErrorOk;
+ }
+ }
+#if ASMJIT_VM_SHM_AVAILABLE
+ else {
+ _tmpName.assignFormat(kShmFormat, (unsigned long long)bits);
+ _fd = ::shm_open(_tmpName.data(), O_RDWR | O_CREAT | O_EXCL, S_IRUSR | S_IWUSR);
+ if (ASMJIT_LIKELY(_fd >= 0)) {
+ _fileType = kFileTypeShm;
+ return kErrorOk;
+ }
+ }
+#endif
+
+ int e = errno;
+ if (e != EEXIST)
+ return DebugUtils::errored(asmjitErrorFromErrno(e));
+ }
+
+ return DebugUtils::errored(kErrorFailedToOpenAnonymousMemory);
+#endif
+ }
+
+ void unlink() noexcept {
+ FileType type = _fileType;
+ _fileType = kFileTypeNone;
+
+#if ASMJIT_VM_SHM_AVAILABLE
+ if (type == kFileTypeShm) {
+ ::shm_unlink(_tmpName.data());
+ return;
+ }
+#endif
+
+ if (type == kFileTypeTmp) {
+ ::unlink(_tmpName.data());
+ return;
+ }
+ }
+
+ void close() noexcept {
+ if (_fd >= 0) {
+ ::close(_fd);
+ _fd = -1;
+ }
+ }
+
+ Error allocate(size_t size) noexcept {
+ // TODO: Improve this by using `posix_fallocate()` when available.
+ if (ftruncate(_fd, off_t(size)) != 0)
+ return DebugUtils::errored(asmjitErrorFromErrno(errno));
+
+ return kErrorOk;
+ }
+};
+
+// Returns `mmap()` protection flags from \ref MemoryFlags.
+static int mmProtFromMemoryFlags(MemoryFlags memoryFlags) noexcept {
+ int protection = 0;
+ if (Support::test(memoryFlags, MemoryFlags::kAccessRead)) protection |= PROT_READ;
+ if (Support::test(memoryFlags, MemoryFlags::kAccessWrite)) protection |= PROT_READ | PROT_WRITE;
+ if (Support::test(memoryFlags, MemoryFlags::kAccessExecute)) protection |= PROT_READ | PROT_EXEC;
+ return protection;
+}
+
#if defined(__APPLE__)
-// Detects whether the current process is hardened, which means that pages that
-// have WRITE and EXECUTABLE flags cannot be allocated without MAP_JIT flag.
-static ASMJIT_INLINE bool VirtMem_isHardened() noexcept {
- static volatile uint32_t globalHardenedFlag;
+// Detects whether the current process is hardened, which means that pages that have WRITE and EXECUTABLE flags cannot
+// be allocated without MAP_JIT flag.
+static inline bool hasHardenedRuntimeMacOS() noexcept {
+#if TARGET_OS_OSX && ASMJIT_ARCH_ARM >= 64
+ // MacOS on AArch64 has always hardened runtime enabled.
+ return true;
+#else
+ static std::atomic<uint32_t> globalHardenedFlag;
enum HardenedFlag : uint32_t {
kHardenedFlagUnknown = 0,
@@ -294,37 +425,40 @@ static ASMJIT_INLINE bool VirtMem_isHardened() noexcept {
kHardenedFlagEnabled = 2
};
- uint32_t flag = globalHardenedFlag;
+ uint32_t flag = globalHardenedFlag.load();
if (flag == kHardenedFlagUnknown) {
- VirtMem::Info memInfo;
- VirtMem_getInfo(memInfo);
+ size_t pageSize = ::getpagesize();
- void* ptr = mmap(nullptr, memInfo.pageSize, PROT_WRITE | PROT_EXEC, MAP_PRIVATE | MAP_ANONYMOUS, -1, 0);
+ void* ptr = mmap(nullptr, pageSize, PROT_WRITE | PROT_EXEC, MAP_PRIVATE | MAP_ANONYMOUS, -1, 0);
if (ptr == MAP_FAILED) {
flag = kHardenedFlagEnabled;
}
else {
flag = kHardenedFlagDisabled;
- munmap(ptr, memInfo.pageSize);
+ munmap(ptr, pageSize);
}
- globalHardenedFlag = flag;
+ globalHardenedFlag.store(flag);
}
return flag == kHardenedFlagEnabled;
+#endif
}
-// MAP_JIT flag required to run unsigned JIT code is only supported by kernel
-// version 10.14+ (Mojave) and IOS.
-static ASMJIT_INLINE bool VirtMem_hasMapJitSupport() noexcept {
-#if TARGET_OS_OSX
- static volatile int globalVersion;
+static inline bool hasMapJitSupportMacOS() noexcept {
+#if TARGET_OS_OSX && ASMJIT_ARCH_ARM >= 64
+ // MacOS for 64-bit AArch architecture always uses hardened runtime. Some documentation can be found here:
+ // - https://developer.apple.com/documentation/apple_silicon/porting_just-in-time_compilers_to_apple_silicon
+ return true;
+#elif TARGET_OS_OSX
+ // MAP_JIT flag required to run unsigned JIT code is only supported by kernel version 10.14+ (Mojave) and IOS.
+ static std::atomic<uint32_t> globalVersion;
- int ver = globalVersion;
+ int ver = globalVersion.load();
if (!ver) {
- struct utsname osname;
+ struct utsname osname {};
uname(&osname);
ver = atoi(osname.release);
- globalVersion = ver;
+ globalVersion.store(ver);
}
return ver >= 18;
#else
@@ -332,165 +466,124 @@ static ASMJIT_INLINE bool VirtMem_hasMapJitSupport() noexcept {
return true;
#endif
}
+#endif // __APPLE__
-static ASMJIT_INLINE int VirtMem_appleSpecificMMapFlags(uint32_t flags) {
- // Always use MAP_JIT flag if user asked for it (could be used for testing
- // on non-hardened processes) and detect whether it must be used when the
- // process is actually hardened (in that case it doesn't make sense to rely
- // on user `flags`).
- bool useMapJit = ((flags & VirtMem::kMMapEnableMapJit) != 0) || VirtMem_isHardened();
+// Detects whether the current process is hardened, which means that pages that have WRITE and EXECUTABLE flags
+// cannot be normally allocated. On MacOS such allocation requires MAP_JIT flag.
+static inline bool hasHardenedRuntime() noexcept {
+#if defined(__APPLE__)
+ return hasHardenedRuntimeMacOS();
+#else
+ return false;
+#endif
+}
+
+// Detects whether MAP_JIT is available.
+static inline bool hasMapJitSupport() noexcept {
+#if defined(__APPLE__)
+ return hasMapJitSupportMacOS();
+#else
+ return false;
+#endif
+}
+
+// Returns either MAP_JIT or 0 based on `flags` and the host operating system.
+static inline int mmMapJitFromMemoryFlags(MemoryFlags memoryFlags) noexcept {
+#if defined(__APPLE__)
+ // Always use MAP_JIT flag if user asked for it (could be used for testing on non-hardened processes) and detect
+ // whether it must be used when the process is actually hardened (in that case it doesn't make sense to rely on
+ // user `memoryFlags`).
+ bool useMapJit = Support::test(memoryFlags, MemoryFlags::kMMapEnableMapJit) || hasHardenedRuntime();
if (useMapJit)
- return VirtMem_hasMapJitSupport() ? int(MAP_JIT) : 0;
+ return hasMapJitSupport() ? int(MAP_JIT) : 0;
else
return 0;
-}
#else
-static ASMJIT_INLINE int VirtMem_appleSpecificMMapFlags(uint32_t flags) {
- DebugUtils::unused(flags);
+ DebugUtils::unused(memoryFlags);
return 0;
-}
#endif
-
-static const char* VirtMem_getTmpDir() noexcept {
- const char* tmpDir = getenv("TMPDIR");
- return tmpDir ? tmpDir : "/tmp";
}
-static Error VirtMem_openAnonymousMemory(int* fd, bool preferTmpOverDevShm) noexcept {
-#if defined(SYS_memfd_create)
- // Linux specific 'memfd_create' - if the syscall returns `ENOSYS` it means
- // it's not available and we will never call it again (would be pointless).
-
- // Zero initialized, if ever changed to '1' that would mean the syscall is not
- // available and we must use `shm_open()` and `shm_unlink()`.
- static volatile uint32_t memfd_create_not_supported;
-
- if (!memfd_create_not_supported) {
- *fd = (int)syscall(SYS_memfd_create, "vmem", 0);
- if (ASMJIT_LIKELY(*fd >= 0))
- return kErrorOk;
-
- int e = errno;
- if (e == ENOSYS)
- memfd_create_not_supported = 1;
- else
- return DebugUtils::errored(VirtMem_makeErrorFromErrno(e));
- }
-#endif
-
-#if defined(SHM_ANON)
- // Originally FreeBSD extension, apparently works in other BSDs too.
- DebugUtils::unused(preferTmpOverDevShm);
- *fd = shm_open(SHM_ANON, O_RDWR | O_CREAT | O_EXCL, S_IRUSR | S_IWUSR);
+// Returns BSD-specific `PROT_MAX()` flags.
+static inline int mmMaxProtFromMemoryFlags(MemoryFlags memoryFlags) noexcept {
+#if defined(PROT_MAX)
+ static constexpr uint32_t kMaxProtShift = Support::ConstCTZ<uint32_t(MemoryFlags::kMMapMaxAccessRead)>::value;
- if (ASMJIT_LIKELY(*fd >= 0))
- return kErrorOk;
+ if (Support::test(memoryFlags, MemoryFlags::kMMapMaxAccessReadWrite | MemoryFlags::kMMapMaxAccessExecute))
+ return PROT_MAX(mmProtFromMemoryFlags((MemoryFlags)(uint32_t(memoryFlags) >> kMaxProtShift)));
else
- return DebugUtils::errored(VirtMem_makeErrorFromErrno(errno));
+ return 0;
#else
- // POSIX API. We have to generate somehow a unique name. This is nothing
- // cryptographic, just using a bit from the stack address to always have
- // a different base for different threads (as threads have their own stack)
- // and retries for avoiding collisions. We use `shm_open()` with flags that
- // require creation of the file so we never open an existing shared memory.
- static std::atomic<uint32_t> internalCounter;
-
- StringTmp<128> uniqueName;
- const char* kShmFormat = "/shm-id-%08llX";
-
- uint32_t kRetryCount = 100;
- uint64_t bits = ((uintptr_t)(void*)&uniqueName) & 0x55555555u;
-
- for (uint32_t i = 0; i < kRetryCount; i++) {
- bits -= uint64_t(OSUtils::getTickCount()) * 773703683;
- bits = ((bits >> 14) ^ (bits << 6)) + uint64_t(++internalCounter) * 10619863;
-
- if (!ASMJIT_VM_SHM_DETECT || preferTmpOverDevShm) {
- uniqueName.assign(VirtMem_getTmpDir());
- uniqueName.appendFormat(kShmFormat, (unsigned long long)bits);
- *fd = open(uniqueName.data(), O_RDWR | O_CREAT | O_EXCL, 0);
- if (ASMJIT_LIKELY(*fd >= 0)) {
- unlink(uniqueName.data());
- return kErrorOk;
- }
- }
- else {
- uniqueName.assignFormat(kShmFormat, (unsigned long long)bits);
- *fd = shm_open(uniqueName.data(), O_RDWR | O_CREAT | O_EXCL, S_IRUSR | S_IWUSR);
- if (ASMJIT_LIKELY(*fd >= 0)) {
- shm_unlink(uniqueName.data());
- return kErrorOk;
- }
- }
-
- int e = errno;
- if (e == EEXIST)
- continue;
- else
- return DebugUtils::errored(VirtMem_makeErrorFromErrno(e));
- }
- return kErrorOk;
+ DebugUtils::unused(memoryFlags);
+ return 0;
#endif
}
#if ASMJIT_VM_SHM_DETECT
-static Error VirtMem_detectShmStrategy(uint32_t* strategyOut) noexcept {
- ScopedFD fd;
- VirtMem::Info vmInfo = VirtMem::info();
+static Error detectShmStrategy(ShmStrategy* strategyOut) noexcept {
+ AnonymousMemory anonMem;
+ Info vmInfo = info();
- ASMJIT_PROPAGATE(VirtMem_openAnonymousMemory(&fd.value, false));
- if (ftruncate(fd.value, off_t(vmInfo.pageSize)) != 0)
- return DebugUtils::errored(VirtMem_makeErrorFromErrno(errno));
+ ASMJIT_PROPAGATE(anonMem.open(false));
+ ASMJIT_PROPAGATE(anonMem.allocate(vmInfo.pageSize));
- void* ptr = mmap(nullptr, vmInfo.pageSize, PROT_READ | PROT_EXEC, MAP_SHARED, fd.value, 0);
+ void* ptr = mmap(nullptr, vmInfo.pageSize, PROT_READ | PROT_EXEC, MAP_SHARED, anonMem.fd(), 0);
if (ptr == MAP_FAILED) {
int e = errno;
if (e == EINVAL) {
- *strategyOut = kShmStrategyTmpDir;
+ *strategyOut = ShmStrategy::kTmpDir;
return kErrorOk;
}
- return DebugUtils::errored(VirtMem_makeErrorFromErrno(e));
+ return DebugUtils::errored(asmjitErrorFromErrno(e));
}
else {
munmap(ptr, vmInfo.pageSize);
- *strategyOut = kShmStrategyDevShm;
+ *strategyOut = ShmStrategy::kDevShm;
return kErrorOk;
}
}
#endif
+static Error getShmStrategy(ShmStrategy* strategyOut) noexcept {
#if ASMJIT_VM_SHM_DETECT
-static Error VirtMem_getShmStrategy(uint32_t* strategyOut) noexcept {
- // Initially don't assume anything. It has to be tested whether
- // '/dev/shm' was mounted with 'noexec' flag or not.
- static volatile uint32_t globalShmStrategy = kShmStrategyUnknown;
-
- uint32_t strategy = globalShmStrategy;
- if (strategy == kShmStrategyUnknown) {
- ASMJIT_PROPAGATE(VirtMem_detectShmStrategy(&strategy));
- globalShmStrategy = strategy;
+ // Initially don't assume anything. It has to be tested whether '/dev/shm' was mounted with 'noexec' flag or not.
+ static std::atomic<uint32_t> globalShmStrategy;
+
+ ShmStrategy strategy = static_cast<ShmStrategy>(globalShmStrategy.load());
+ if (strategy == ShmStrategy::kUnknown) {
+ ASMJIT_PROPAGATE(detectShmStrategy(&strategy));
+ globalShmStrategy.store(static_cast<uint32_t>(strategy));
}
*strategyOut = strategy;
return kErrorOk;
-}
#else
-static Error VirtMem_getShmStrategy(uint32_t* strategyOut) noexcept {
- *strategyOut = kShmStrategyTmpDir;
+ *strategyOut = ShmStrategy::kTmpDir;
return kErrorOk;
-}
#endif
+}
-Error VirtMem::alloc(void** p, size_t size, uint32_t flags) noexcept {
- *p = nullptr;
+static HardenedRuntimeFlags getHardenedRuntimeFlags() noexcept {
+ HardenedRuntimeFlags hrFlags = HardenedRuntimeFlags::kNone;
+
+ if (hasHardenedRuntime())
+ hrFlags |= HardenedRuntimeFlags::kEnabled;
+
+ if (hasMapJitSupport())
+ hrFlags |= HardenedRuntimeFlags::kMapJit;
+ return hrFlags;
+}
+
+Error alloc(void** p, size_t size, MemoryFlags memoryFlags) noexcept {
+ *p = nullptr;
if (size == 0)
return DebugUtils::errored(kErrorInvalidArgument);
- int protection = VirtMem_accessToPosixProtection(flags);
- int mmFlags = MAP_PRIVATE | MAP_ANONYMOUS | VirtMem_appleSpecificMMapFlags(flags);
- void* ptr = mmap(nullptr, size, protection, mmFlags, -1, 0);
+ int protection = mmProtFromMemoryFlags(memoryFlags) | mmMaxProtFromMemoryFlags(memoryFlags);
+ int mmFlags = MAP_PRIVATE | MAP_ANONYMOUS | mmMapJitFromMemoryFlags(memoryFlags);
+ void* ptr = mmap(nullptr, size, protection, mmFlags, -1, 0);
if (ptr == MAP_FAILED)
return DebugUtils::errored(kErrorOutOfMemory);
@@ -498,7 +591,7 @@ Error VirtMem::alloc(void** p, size_t size, uint32_t flags) noexcept {
return kErrorOk;
}
-Error VirtMem::release(void* p, size_t size) noexcept {
+Error release(void* p, size_t size) noexcept {
if (ASMJIT_UNLIKELY(munmap(p, size) != 0))
return DebugUtils::errored(kErrorInvalidArgument);
@@ -506,76 +599,98 @@ Error VirtMem::release(void* p, size_t size) noexcept {
}
-Error VirtMem::protect(void* p, size_t size, uint32_t flags) noexcept {
- int protection = VirtMem_accessToPosixProtection(flags);
+Error protect(void* p, size_t size, MemoryFlags memoryFlags) noexcept {
+ int protection = mmProtFromMemoryFlags(memoryFlags);
if (mprotect(p, size, protection) == 0)
return kErrorOk;
return DebugUtils::errored(kErrorInvalidArgument);
}
-Error VirtMem::allocDualMapping(DualMapping* dm, size_t size, uint32_t flags) noexcept {
- dm->ro = nullptr;
+Error allocDualMapping(DualMapping* dm, size_t size, MemoryFlags memoryFlags) noexcept {
+ dm->rx = nullptr;
dm->rw = nullptr;
if (off_t(size) <= 0)
return DebugUtils::errored(size == 0 ? kErrorInvalidArgument : kErrorTooLarge);
- bool preferTmpOverDevShm = (flags & kMappingPreferTmp) != 0;
+ bool preferTmpOverDevShm = Support::test(memoryFlags, MemoryFlags::kMappingPreferTmp);
if (!preferTmpOverDevShm) {
- uint32_t strategy;
- ASMJIT_PROPAGATE(VirtMem_getShmStrategy(&strategy));
- preferTmpOverDevShm = (strategy == kShmStrategyTmpDir);
+ ShmStrategy strategy;
+ ASMJIT_PROPAGATE(getShmStrategy(&strategy));
+ preferTmpOverDevShm = (strategy == ShmStrategy::kTmpDir);
}
- // ScopedFD will automatically close the file descriptor in its destructor.
- ScopedFD fd;
- ASMJIT_PROPAGATE(VirtMem_openAnonymousMemory(&fd.value, preferTmpOverDevShm));
- if (ftruncate(fd.value, off_t(size)) != 0)
- return DebugUtils::errored(VirtMem_makeErrorFromErrno(errno));
+ AnonymousMemory anonMem;
+ ASMJIT_PROPAGATE(anonMem.open(preferTmpOverDevShm));
+ ASMJIT_PROPAGATE(anonMem.allocate(size));
void* ptr[2];
for (uint32_t i = 0; i < 2; i++) {
- ptr[i] = mmap(nullptr, size, VirtMem_accessToPosixProtection(flags & ~VirtMem_dualMappingFilter[i]), MAP_SHARED, fd.value, 0);
+ MemoryFlags accessFlags = memoryFlags & ~dualMappingFilter[i];
+ int protection = mmProtFromMemoryFlags(accessFlags) | mmMaxProtFromMemoryFlags(accessFlags);
+
+ ptr[i] = mmap(nullptr, size, protection, MAP_SHARED, anonMem.fd(), 0);
if (ptr[i] == MAP_FAILED) {
- // Get the error now before `munmap` has a chance to clobber it.
+ // Get the error now before `munmap()` has a chance to clobber it.
int e = errno;
if (i == 1)
munmap(ptr[0], size);
- return DebugUtils::errored(VirtMem_makeErrorFromErrno(e));
+ return DebugUtils::errored(asmjitErrorFromErrno(e));
}
}
- dm->ro = ptr[0];
+ dm->rx = ptr[0];
dm->rw = ptr[1];
return kErrorOk;
}
-Error VirtMem::releaseDualMapping(DualMapping* dm, size_t size) noexcept {
- Error err = release(dm->ro, size);
- if (dm->ro != dm->rw)
+Error releaseDualMapping(DualMapping* dm, size_t size) noexcept {
+ Error err = release(dm->rx, size);
+ if (dm->rx != dm->rw)
err |= release(dm->rw, size);
if (err)
return DebugUtils::errored(kErrorInvalidArgument);
- dm->ro = nullptr;
+ dm->rx = nullptr;
dm->rw = nullptr;
return kErrorOk;
}
#endif
-// ============================================================================
-// [asmjit::VirtMem - Virtual Memory [Memory Info]]
-// ============================================================================
+// Virtual Memory - Flush Instruction Cache
+// ========================================
+
+void flushInstructionCache(void* p, size_t size) noexcept {
+#if ASMJIT_ARCH_X86
+ // X86/X86_64 architecture doesn't require to do anything to flush instruction cache.
+ DebugUtils::unused(p, size);
+#elif defined(__APPLE__)
+ sys_icache_invalidate(p, size);
+#elif defined(_WIN32)
+ // Windows has a built-in support in `kernel32.dll`.
+ FlushInstructionCache(GetCurrentProcess(), p, size);
+#elif defined(__GNUC__)
+ char* start = static_cast<char*>(p);
+ char* end = start + size;
+ __builtin___clear_cache(start, end);
+#else
+ #pragma message("asmjit::VirtMem::flushInstructionCache() doesn't have implementation for the target OS and compiler")
+ DebugUtils::unused(p, size);
+#endif
+}
+
+// Virtual Memory - Memory Info
+// ============================
-VirtMem::Info VirtMem::info() noexcept {
- static VirtMem::Info vmInfo;
+Info info() noexcept {
static std::atomic<uint32_t> vmInfoInitialized;
+ static Info vmInfo;
if (!vmInfoInitialized.load()) {
- VirtMem::Info localMemInfo;
- VirtMem_getInfo(localMemInfo);
+ Info localMemInfo;
+ getVMInfo(localMemInfo);
vmInfo = localMemInfo;
vmInfoInitialized.store(1u);
@@ -584,6 +699,24 @@ VirtMem::Info VirtMem::info() noexcept {
return vmInfo;
}
-ASMJIT_END_NAMESPACE
+// Virtual Memory - Hardened Runtime Info
+// ======================================
+
+HardenedRuntimeInfo hardenedRuntimeInfo() noexcept {
+ return HardenedRuntimeInfo { getHardenedRuntimeFlags() };
+}
+
+// Virtual Memory - Project JIT Memory
+// ===================================
+
+void protectJitMemory(ProtectJitAccess access) noexcept {
+#if defined(ASMJIT_HAS_PTHREAD_JIT_WRITE_PROTECT_NP)
+ pthread_jit_write_protect_np(static_cast<uint32_t>(access));
+#else
+ DebugUtils::unused(access);
+#endif
+}
+
+ASMJIT_END_SUB_NAMESPACE
#endif
diff --git a/3rdparty/asmjit/src/asmjit/core/virtmem.h b/3rdparty/asmjit/src/asmjit/core/virtmem.h
index 8d3ee01ee5b..50f09457eba 100644
--- a/3rdparty/asmjit/src/asmjit/core/virtmem.h
+++ b/3rdparty/asmjit/src/asmjit/core/virtmem.h
@@ -1,25 +1,7 @@
-// AsmJit - Machine code generation for C++
+// This file is part of AsmJit project <https://asmjit.com>
//
-// * Official AsmJit Home Page: https://asmjit.com
-// * Official Github Repository: https://github.com/asmjit/asmjit
-//
-// Copyright (c) 2008-2020 The AsmJit Authors
-//
-// This software is provided 'as-is', without any express or implied
-// warranty. In no event will the authors be held liable for any damages
-// arising from the use of this software.
-//
-// Permission is granted to anyone to use this software for any purpose,
-// including commercial applications, and to alter it and redistribute it
-// freely, subject to the following restrictions:
-//
-// 1. The origin of this software must not be misrepresented; you must not
-// claim that you wrote the original software. If you use this software
-// in a product, an acknowledgment in the product documentation would be
-// appreciated but is not required.
-// 2. Altered source versions must be plainly marked as such, and must not be
-// misrepresented as being the original software.
-// 3. This notice may not be removed or altered from any source distribution.
+// See asmjit.h or LICENSE.md for license and copyright information
+// SPDX-License-Identifier: Zlib
#ifndef ASMJIT_CORE_VIRTMEM_H_INCLUDED
#define ASMJIT_CORE_VIRTMEM_H_INCLUDED
@@ -34,43 +16,14 @@ ASMJIT_BEGIN_NAMESPACE
//! \addtogroup asmjit_virtual_memory
//! \{
-// ============================================================================
-// [asmjit::VirtMem]
-// ============================================================================
-
//! Virtual memory management.
namespace VirtMem {
-//! Virtual memory and memory mapping flags.
-enum Flags : uint32_t {
- //! No access flags.
- kAccessNone = 0x00000000u,
- //! Memory is readable.
- kAccessRead = 0x00000001u,
- //! Memory is writable (implies read access).
- kAccessWrite = 0x00000002u,
- //! Memory is executable (implies read access).
- kAccessExecute = 0x00000004u,
-
- //! A combination of `kAccessRead | kAccessWrite`
- kAccessReadWrite = 0x00000003u,
-
- //! Use a `MAP_JIT` flag available on Apple platforms (OSX Mojave+), which
- //! allows JIT code to be executed in OSX bundles. This flag is not turned
- //! on by default, because when a process uses `fork()` the child process
- //! has no access to the pages mapped with `MAP_JIT`, which could break code
- //! that doesn't expect this behavior.
- kMMapEnableMapJit = 0x00000010u,
-
- //! Not an access flag, only used by `allocDualMapping()` to override the
- //! default allocation strategy to always use a 'tmp' directory instead of
- //! "/dev/shm" (on POSIX platforms). Please note that this flag will be
- //! ignored if the operating system allows to allocate an executable memory
- //! by a different API than `open()` or `shm_open()`. For example on Linux
- //! `memfd_create()` is preferred and on BSDs `shm_open(SHM_ANON, ...)` is
- //! used if SHM_ANON is defined.
- kMappingPreferTmp = 0x80000000u
-};
+//! Flushes instruction cache in the given region.
+//!
+//! Only useful on non-x86 architectures, however, it's a good practice to call it on any platform to make your
+//! code more portable.
+ASMJIT_API void flushInstructionCache(void* p, size_t size) noexcept;
//! Virtual memory information.
struct Info {
@@ -80,61 +33,205 @@ struct Info {
uint32_t pageGranularity;
};
-//! Dual memory mapping used to map an anonymous memory into two memory regions
-//! where one region is read-only, but executable, and the second region is
-//! read+write, but not executable. Please see \ref VirtMem::allocDualMapping()
-//! for more details.
-struct DualMapping {
- //! Pointer to data with 'Read' or 'Read+Execute' access.
- void* ro;
- //! Pointer to data with 'Read-Write' access, but never 'Write+Execute'.
- void* rw;
-};
-
//! Returns virtual memory information, see `VirtMem::Info` for more details.
ASMJIT_API Info info() noexcept;
-//! Allocates virtual memory by either using `VirtualAlloc()` (Windows)
-//! or `mmap()` (POSIX).
+//! Virtual memory access and mmap-specific flags.
+enum class MemoryFlags : uint32_t {
+ //! No flags.
+ kNone = 0,
+
+ //! Memory is readable.
+ kAccessRead = 0x00000001u,
+
+ //! Memory is writable.
+ kAccessWrite = 0x00000002u,
+
+ //! Memory is executable.
+ kAccessExecute = 0x00000004u,
+
+ //! A combination of \ref MemoryFlags::kAccessRead and \ref MemoryFlags::kAccessWrite.
+ kAccessReadWrite = kAccessRead | kAccessWrite,
+
+ //! A combination of \ref MemoryFlags::kAccessRead, \ref MemoryFlags::kAccessWrite.
+ kAccessRW = kAccessRead | kAccessWrite,
+
+ //! A combination of \ref MemoryFlags::kAccessRead and \ref MemoryFlags::kAccessExecute.
+ kAccessRX = kAccessRead | kAccessExecute,
+
+ //! A combination of \ref MemoryFlags::kAccessRead, \ref MemoryFlags::kAccessWrite, and
+ //! \ref MemoryFlags::kAccessExecute.
+ kAccessRWX = kAccessRead | kAccessWrite | kAccessExecute,
+
+ //! Use a `MAP_JIT` flag available on Apple platforms (introduced by Mojave), which allows JIT code to be executed
+ //! in MAC bundles. This flag is not turned on by default, because when a process uses `fork()` the child process
+ //! has no access to the pages mapped with `MAP_JIT`, which could break code that doesn't expect this behavior.
+ //!
+ //! \note This flag can only be used with \ref VirtMem::alloc().
+ kMMapEnableMapJit = 0x00000010u,
+
+ //! Pass `PROT_MAX(PROT_READ)` to mmap() on platforms that support `PROT_MAX`.
+ //!
+ //! \note This flag can only be used with \ref VirtMem::alloc().
+ kMMapMaxAccessRead = 0x00000020u,
+ //! Pass `PROT_MAX(PROT_WRITE)` to mmap() on platforms that support `PROT_MAX`.
+ //!
+ //! \note This flag can only be used with \ref VirtMem::alloc().
+ kMMapMaxAccessWrite = 0x00000040u,
+ //! Pass `PROT_MAX(PROT_EXEC)` to mmap() on platforms that support `PROT_MAX`.
+ //!
+ //! \note This flag can only be used with \ref VirtMem::alloc().
+ kMMapMaxAccessExecute = 0x00000080u,
+
+ //! A combination of \ref MemoryFlags::kMMapMaxAccessRead and \ref MemoryFlags::kMMapMaxAccessWrite.
+ kMMapMaxAccessReadWrite = kMMapMaxAccessRead | kMMapMaxAccessWrite,
+
+ //! A combination of \ref MemoryFlags::kMMapMaxAccessRead and \ref MemoryFlags::kMMapMaxAccessWrite.
+ kMMapMaxAccessRW = kMMapMaxAccessRead | kMMapMaxAccessWrite,
+
+ //! A combination of \ref MemoryFlags::kMMapMaxAccessRead and \ref MemoryFlags::kMMapMaxAccessExecute.
+ kMMapMaxAccessRX = kMMapMaxAccessRead | kMMapMaxAccessExecute,
+
+ //! A combination of \ref MemoryFlags::kMMapMaxAccessRead, \ref MemoryFlags::kMMapMaxAccessWrite, \ref
+ //! MemoryFlags::kMMapMaxAccessExecute.
+ kMMapMaxAccessRWX = kMMapMaxAccessRead | kMMapMaxAccessWrite | kMMapMaxAccessExecute,
+
+ //! Not an access flag, only used by `allocDualMapping()` to override the default allocation strategy to always use
+ //! a 'tmp' directory instead of "/dev/shm" (on POSIX platforms). Please note that this flag will be ignored if the
+ //! operating system allows to allocate an executable memory by a different API than `open()` or `shm_open()`. For
+ //! example on Linux `memfd_create()` is preferred and on BSDs `shm_open(SHM_ANON, ...)` is used if SHM_ANON is
+ //! defined.
+ //!
+ //! \note This flag can only be used with \ref VirtMem::alloc().
+ kMappingPreferTmp = 0x80000000u
+};
+ASMJIT_DEFINE_ENUM_FLAGS(MemoryFlags)
+
+//! Allocates virtual memory by either using `mmap()` (POSIX) or `VirtualAlloc()` (Windows).
//!
-//! \note `size` should be aligned to a page size, use \ref VirtMem::info()
-//! to obtain it. Invalid size will not be corrected by the implementation
-//! and the allocation would not succeed in such case.
-ASMJIT_API Error alloc(void** p, size_t size, uint32_t flags) noexcept;
+//! \note `size` should be aligned to page size, use \ref VirtMem::info() to obtain it. Invalid size will not be
+//! corrected by the implementation and the allocation would not succeed in such case.
+ASMJIT_API Error alloc(void** p, size_t size, MemoryFlags flags) noexcept;
-//! Releases virtual memory previously allocated by \ref VirtMem::alloc() or
-//! \ref VirtMem::allocDualMapping().
+//! Releases virtual memory previously allocated by \ref VirtMem::alloc().
//!
-//! \note The size must be the same as used by \ref VirtMem::alloc(). If the
-//! size is not the same value the call will fail on any POSIX system, but
-//! pass on Windows, because of the difference of the implementation.
+//! \note The size must be the same as used by \ref VirtMem::alloc(). If the size is not the same value the call
+//! will fail on any POSIX system, but pass on Windows, because it's implemented differently.
ASMJIT_API Error release(void* p, size_t size) noexcept;
-//! A cross-platform wrapper around `mprotect()` (POSIX) and `VirtualProtect`
-//! (Windows).
-ASMJIT_API Error protect(void* p, size_t size, uint32_t flags) noexcept;
+//! A cross-platform wrapper around `mprotect()` (POSIX) and `VirtualProtect()` (Windows).
+ASMJIT_API Error protect(void* p, size_t size, MemoryFlags flags) noexcept;
-//! Allocates virtual memory and creates two views of it where the first view
-//! has no write access. This is an addition to the API that should be used
-//! in cases in which the operating system either enforces W^X security policy
-//! or the application wants to use this policy by default to improve security
-//! and prevent an accidental (or purposed) self-modifying code.
+//! Dual memory mapping used to map an anonymous memory into two memory regions where one region is read-only, but
+//! executable, and the second region is read+write, but not executable. See \ref VirtMem::allocDualMapping() for
+//! more details.
+struct DualMapping {
+ //! Pointer to data with 'Read+Execute' access (this memory is not writable).
+ void* rx;
+ //! Pointer to data with 'Read+Write' access (this memory is not executable).
+ void* rw;
+};
+
+//! Allocates virtual memory and creates two views of it where the first view has no write access. This is an addition
+//! to the API that should be used in cases in which the operating system either enforces W^X security policy or the
+//! application wants to use this policy by default to improve security and prevent an accidental (or purposed)
+//! self-modifying code.
//!
-//! The memory returned in the `dm` are two independent mappings of the same
-//! shared memory region. You must use \ref VirtMem::releaseDualMapping() to
-//! release it when it's no longer needed. Never use `VirtMem::release()` to
-//! release the memory returned by `allocDualMapping()` as that would fail on
-//! Windows.
+//! The memory returned in the `dm` are two independent mappings of the same shared memory region. You must use
+//! \ref VirtMem::releaseDualMapping() to release it when it's no longer needed. Never use `VirtMem::release()` to
+//! release the memory returned by `allocDualMapping()` as that would fail on Windows.
//!
//! \remarks Both pointers in `dm` would be set to `nullptr` if the function fails.
-ASMJIT_API Error allocDualMapping(DualMapping* dm, size_t size, uint32_t flags) noexcept;
+ASMJIT_API Error allocDualMapping(DualMapping* dm, size_t size, MemoryFlags flags) noexcept;
-//! Releases the virtual memory mapping previously allocated by
-//! \ref VirtMem::allocDualMapping().
+//! Releases virtual memory mapping previously allocated by \ref VirtMem::allocDualMapping().
//!
//! \remarks Both pointers in `dm` would be set to `nullptr` if the function succeeds.
ASMJIT_API Error releaseDualMapping(DualMapping* dm, size_t size) noexcept;
+//! Hardened runtime flags.
+enum class HardenedRuntimeFlags : uint32_t {
+ //! No flags.
+ kNone = 0,
+
+ //! Hardened runtime is enabled - it's not possible to have "Write & Execute" memory protection. The runtime
+ //! enforces W^X (either write or execute).
+ //!
+ //! \note If the runtime is hardened it means that an operating system specific protection is used. For example on
+ //! MacOS platform it's possible to allocate memory with MAP_JIT flag and then use `pthread_jit_write_protect_np()`
+ //! to temporarily swap access permissions for the current thread. Dual mapping is also a possibility on X86/X64
+ //! architecture.
+ kEnabled = 0x00000001u,
+
+ //! Read+Write+Execute can only be allocated with MAP_JIT flag (Apple specific).
+ kMapJit = 0x00000002u
+};
+ASMJIT_DEFINE_ENUM_FLAGS(HardenedRuntimeFlags)
+
+//! Hardened runtime information.
+struct HardenedRuntimeInfo {
+ //! Hardened runtime flags.
+ HardenedRuntimeFlags flags;
+};
+
+//! Returns runtime features provided by the OS.
+ASMJIT_API HardenedRuntimeInfo hardenedRuntimeInfo() noexcept;
+
+//! Values that can be used with `protectJitMemory()` function.
+enum class ProtectJitAccess : uint32_t {
+ //! Protect JIT memory with Read+Write permissions.
+ kReadWrite = 0,
+ //! Protect JIT memory with Read+Execute permissions.
+ kReadExecute = 1
+};
+
+//! Protects access of memory mapped with MAP_JIT flag for the current thread.
+//!
+//! \note This feature is only available on Apple hardware (AArch64) at the moment and and uses a non-portable
+//! `pthread_jit_write_protect_np()` call when available.
+//!
+//! This function must be called before and after a memory mapped with MAP_JIT flag is modified. Example:
+//!
+//! ```
+//! void* codePtr = ...;
+//! size_t codeSize = ...;
+//!
+//! VirtMem::protectJitMemory(VirtMem::ProtectJitAccess::kReadWrite);
+//! memcpy(codePtr, source, codeSize);
+//! VirtMem::protectJitMemory(VirtMem::ProtectJitAccess::kReadExecute);
+//! VirtMem::flushInstructionCache(codePtr, codeSize);
+//! ```
+//!
+//! See \ref ProtectJitReadWriteScope, which makes it simpler than the code above.
+ASMJIT_API void protectJitMemory(ProtectJitAccess access) noexcept;
+
+//! JIT protection scope that prepares the given memory block to be written to in the current thread.
+//!
+//! It calls `VirtMem::protectJitMemory(VirtMem::ProtectJitAccess::kReadWrite)` at construction time and
+//! `VirtMem::protectJitMemory(VirtMem::ProtectJitAccess::kReadExecute)` combined with `flushInstructionCache()`
+//! in destructor. The purpose of this class is to make writing to JIT memory easier.
+class ProtectJitReadWriteScope {
+public:
+ void* _rxPtr;
+ size_t _size;
+
+ //! Makes the given memory block RW protected.
+ ASMJIT_FORCE_INLINE ProtectJitReadWriteScope(void* rxPtr, size_t size) noexcept
+ : _rxPtr(rxPtr),
+ _size(size) {
+ protectJitMemory(ProtectJitAccess::kReadWrite);
+ }
+
+ // Not copyable.
+ ProtectJitReadWriteScope(const ProtectJitReadWriteScope& other) = delete;
+
+ //! Makes the memory block RX protected again and flushes instruction cache.
+ ASMJIT_FORCE_INLINE ~ProtectJitReadWriteScope() noexcept {
+ protectJitMemory(ProtectJitAccess::kReadExecute);
+ flushInstructionCache(_rxPtr, _size);
+ }
+};
+
} // VirtMem
//! \}
diff --git a/3rdparty/asmjit/src/asmjit/core/zone.cpp b/3rdparty/asmjit/src/asmjit/core/zone.cpp
index 61f7cec796d..d68e110b48c 100644
--- a/3rdparty/asmjit/src/asmjit/core/zone.cpp
+++ b/3rdparty/asmjit/src/asmjit/core/zone.cpp
@@ -1,25 +1,7 @@
-// AsmJit - Machine code generation for C++
+// This file is part of AsmJit project <https://asmjit.com>
//
-// * Official AsmJit Home Page: https://asmjit.com
-// * Official Github Repository: https://github.com/asmjit/asmjit
-//
-// Copyright (c) 2008-2020 The AsmJit Authors
-//
-// This software is provided 'as-is', without any express or implied
-// warranty. In no event will the authors be held liable for any damages
-// arising from the use of this software.
-//
-// Permission is granted to anyone to use this software for any purpose,
-// including commercial applications, and to alter it and redistribute it
-// freely, subject to the following restrictions:
-//
-// 1. The origin of this software must not be misrepresented; you must not
-// claim that you wrote the original software. If you use this software
-// in a product, an acknowledgment in the product documentation would be
-// appreciated but is not required.
-// 2. Altered source versions must be plainly marked as such, and must not be
-// misrepresented as being the original software.
-// 3. This notice may not be removed or altered from any source distribution.
+// See asmjit.h or LICENSE.md for license and copyright information
+// SPDX-License-Identifier: Zlib
#include "../core/api-build_p.h"
#include "../core/support.h"
@@ -27,17 +9,15 @@
ASMJIT_BEGIN_NAMESPACE
-// ============================================================================
-// [asmjit::Zone - Statics]
-// ============================================================================
+// Zone - Globals
+// ==============
-// Zero size block used by `Zone` that doesn't have any memory allocated.
-// Should be allocated in read-only memory and should never be modified.
+// Zero size block used by `Zone` that doesn't have any memory allocated. Should be allocated in read-only memory
+// and should never be modified.
const Zone::Block Zone::_zeroBlock = { nullptr, nullptr, 0 };
-// ============================================================================
-// [asmjit::Zone - Init / Reset]
-// ============================================================================
+// Zone - Init & Reset
+// ===================
void Zone::_init(size_t blockSize, size_t blockAlignment, const Support::Temporary* temporary) noexcept {
ASMJIT_ASSERT(blockSize >= kMinBlockSize);
@@ -66,28 +46,27 @@ void Zone::_init(size_t blockSize, size_t blockAlignment, const Support::Tempora
}
}
-void Zone::reset(uint32_t resetPolicy) noexcept {
+void Zone::reset(ResetPolicy resetPolicy) noexcept {
Block* cur = _block;
// Can't be altered.
if (cur == &_zeroBlock)
return;
- if (resetPolicy == Globals::kResetHard) {
+ if (resetPolicy == ResetPolicy::kHard) {
Block* initial = const_cast<Zone::Block*>(&_zeroBlock);
_ptr = initial->data();
_end = initial->data();
_block = initial;
- // Since cur can be in the middle of the double-linked list, we have to
- // traverse both directions (`prev` and `next`) separately to visit all.
+ // Since cur can be in the middle of the double-linked list, we have to traverse both directions (`prev` and
+ // `next`) separately to visit all.
Block* next = cur->next;
do {
Block* prev = cur->prev;
- // If this is the first block and this ZoneTmp is temporary then the
- // first block is statically allocated. We cannot free it and it makes
- // sense to keep it even when this is hard reset.
+ // If this is the first block and this ZoneTmp is temporary then the first block is statically allocated.
+ // We cannot free it and it makes sense to keep it even when this is hard reset.
if (prev == nullptr && _isTemporary) {
cur->prev = nullptr;
cur->next = nullptr;
@@ -113,9 +92,8 @@ void Zone::reset(uint32_t resetPolicy) noexcept {
}
}
-// ============================================================================
-// [asmjit::Zone - Alloc]
-// ============================================================================
+// Zone - Alloc
+// ============
void* Zone::_alloc(size_t size, size_t alignment) noexcept {
Block* curBlock = _block;
@@ -124,10 +102,9 @@ void* Zone::_alloc(size_t size, size_t alignment) noexcept {
size_t rawBlockAlignment = blockAlignment();
size_t minimumAlignment = Support::max<size_t>(alignment, rawBlockAlignment);
- // If the `Zone` has been cleared the current block doesn't have to be the
- // last one. Check if there is a block that can be used instead of allocating
- // a new one. If there is a `next` block it's completely unused, we don't have
- // to check for remaining bytes in that case.
+ // If the `Zone` has been cleared the current block doesn't have to be the last one. Check if there is a block
+ // that can be used instead of allocating a new one. If there is a `next` block it's completely unused, we don't
+ // have to check for remaining bytes in that case.
if (next) {
uint8_t* ptr = Support::alignUp(next->data(), minimumAlignment);
uint8_t* end = Support::alignDown(next->data() + next->size, rawBlockAlignment);
@@ -147,18 +124,16 @@ void* Zone::_alloc(size_t size, size_t alignment) noexcept {
if (ASMJIT_UNLIKELY(newSize > SIZE_MAX - kBlockSize - blockAlignmentOverhead))
return nullptr;
- // Allocate new block - we add alignment overhead to `newSize`, which becomes the
- // new block size, and we also add `kBlockOverhead` to the allocator as it includes
- // members of `Zone::Block` structure.
+ // Allocate new block - we add alignment overhead to `newSize`, which becomes the new block size, and we also add
+ // `kBlockOverhead` to the allocator as it includes members of `Zone::Block` structure.
newSize += blockAlignmentOverhead;
Block* newBlock = static_cast<Block*>(::malloc(newSize + kBlockSize));
if (ASMJIT_UNLIKELY(!newBlock))
return nullptr;
- // Align the pointer to `minimumAlignment` and adjust the size of this block
- // accordingly. It's the same as using `minimumAlignment - Support::alignUpDiff()`,
- // just written differently.
+ // Align the pointer to `minimumAlignment` and adjust the size of this block accordingly. It's the same as using
+ // `minimumAlignment - Support::alignUpDiff()`, just written differently.
{
newBlock->prev = nullptr;
newBlock->next = nullptr;
@@ -168,9 +143,8 @@ void* Zone::_alloc(size_t size, size_t alignment) noexcept {
newBlock->prev = curBlock;
curBlock->next = newBlock;
- // Does only happen if there is a next block, but the requested memory
- // can't fit into it. In this case a new buffer is allocated and inserted
- // between the current block and the next one.
+ // Does only happen if there is a next block, but the requested memory can't fit into it. In this case a new
+ // buffer is allocated and inserted between the current block and the next one.
if (next) {
newBlock->next = next;
next->prev = newBlock;
@@ -226,9 +200,8 @@ char* Zone::sformat(const char* fmt, ...) noexcept {
return static_cast<char*>(dup(buf, size));
}
-// ============================================================================
-// [asmjit::ZoneAllocator - Helpers]
-// ============================================================================
+// ZoneAllocator - Utilities
+// =========================
#if defined(ASMJIT_BUILD_DEBUG)
static bool ZoneAllocator_hasDynamicBlock(ZoneAllocator* self, ZoneAllocator::DynamicBlock* block) noexcept {
@@ -242,9 +215,8 @@ static bool ZoneAllocator_hasDynamicBlock(ZoneAllocator* self, ZoneAllocator::Dy
}
#endif
-// ============================================================================
-// [asmjit::ZoneAllocator - Init / Reset]
-// ============================================================================
+// ZoneAllocator - Init & Reset
+// ============================
void ZoneAllocator::reset(Zone* zone) noexcept {
// Free dynamic blocks.
@@ -260,9 +232,8 @@ void ZoneAllocator::reset(Zone* zone) noexcept {
_zone = zone;
}
-// ============================================================================
-// [asmjit::ZoneAllocator - Alloc / Release]
-// ============================================================================
+// asmjit::ZoneAllocator - Alloc & Release
+// =======================================
void* ZoneAllocator::_alloc(size_t size, size_t& allocatedSize) noexcept {
ASMJIT_ASSERT(isInitialized());
diff --git a/3rdparty/asmjit/src/asmjit/core/zone.h b/3rdparty/asmjit/src/asmjit/core/zone.h
index 52e9f125461..eaea252903e 100644
--- a/3rdparty/asmjit/src/asmjit/core/zone.h
+++ b/3rdparty/asmjit/src/asmjit/core/zone.h
@@ -1,25 +1,7 @@
-// AsmJit - Machine code generation for C++
+// This file is part of AsmJit project <https://asmjit.com>
//
-// * Official AsmJit Home Page: https://asmjit.com
-// * Official Github Repository: https://github.com/asmjit/asmjit
-//
-// Copyright (c) 2008-2020 The AsmJit Authors
-//
-// This software is provided 'as-is', without any express or implied
-// warranty. In no event will the authors be held liable for any damages
-// arising from the use of this software.
-//
-// Permission is granted to anyone to use this software for any purpose,
-// including commercial applications, and to alter it and redistribute it
-// freely, subject to the following restrictions:
-//
-// 1. The origin of this software must not be misrepresented; you must not
-// claim that you wrote the original software. If you use this software
-// in a product, an acknowledgment in the product documentation would be
-// appreciated but is not required.
-// 2. Altered source versions must be plainly marked as such, and must not be
-// misrepresented as being the original software.
-// 3. This notice may not be removed or altered from any source distribution.
+// See asmjit.h or LICENSE.md for license and copyright information
+// SPDX-License-Identifier: Zlib
#ifndef ASMJIT_CORE_ZONE_H_INCLUDED
#define ASMJIT_CORE_ZONE_H_INCLUDED
@@ -31,20 +13,14 @@ ASMJIT_BEGIN_NAMESPACE
//! \addtogroup asmjit_zone
//! \{
-// ============================================================================
-// [asmjit::Zone]
-// ============================================================================
-
//! Zone memory.
//!
-//! Zone is an incremental memory allocator that allocates memory by simply
-//! incrementing a pointer. It allocates blocks of memory by using C's `malloc()`,
-//! but divides these blocks into smaller segments requested by calling
+//! Zone is an incremental memory allocator that allocates memory by simply incrementing a pointer. It allocates
+//! blocks of memory by using C's `malloc()`, but divides these blocks into smaller segments requested by calling
//! `Zone::alloc()` and friends.
//!
-//! Zone has no function to release the allocated memory. It has to be released
-//! all at once by calling `reset()`. If you need a more friendly allocator that
-//! also supports `release()`, consider using `Zone` with `ZoneAllocator`.
+//! Zone has no function to release the allocated memory. It has to be released all at once by calling `reset()`.
+//! If you need a more friendly allocator that also supports `release()`, consider using `Zone` with `ZoneAllocator`.
class Zone {
public:
ASMJIT_NONCOPYABLE(Zone)
@@ -103,28 +79,31 @@ public:
//! Creates a new Zone.
//!
- //! The `blockSize` parameter describes the default size of the block. If the
- //! `size` parameter passed to `alloc()` is greater than the default size
- //! `Zone` will allocate and use a larger block, but it will not change the
+ //! The `blockSize` parameter describes the default size of the block. If the `size` parameter passed to `alloc()`
+ //! is greater than the default size `Zone` will allocate and use a larger block, but it will not change the
//! default `blockSize`.
//!
- //! It's not required, but it's good practice to set `blockSize` to a
- //! reasonable value that depends on the usage of `Zone`. Greater block sizes
- //! are generally safer and perform better than unreasonably low block sizes.
- ASMJIT_INLINE explicit Zone(size_t blockSize, size_t blockAlignment = 1) noexcept {
+ //! It's not required, but it's good practice to set `blockSize` to a reasonable value that depends on the usage
+ //! of `Zone`. Greater block sizes are generally safer and perform better than unreasonably low block sizes.
+ inline explicit Zone(size_t blockSize, size_t blockAlignment = 1) noexcept {
_init(blockSize, blockAlignment, nullptr);
}
- ASMJIT_INLINE Zone(size_t blockSize, size_t blockAlignment, const Support::Temporary& temporary) noexcept {
+ //! Creates a new Zone with a first block pointing to a `temporary` memory.
+ inline Zone(size_t blockSize, size_t blockAlignment, const Support::Temporary& temporary) noexcept {
_init(blockSize, blockAlignment, &temporary);
}
+ //! \overload
+ inline Zone(size_t blockSize, size_t blockAlignment, const Support::Temporary* temporary) noexcept {
+ _init(blockSize, blockAlignment, temporary);
+ }
+
//! Moves an existing `Zone`.
//!
- //! \note You cannot move an existing `ZoneTmp` as it uses embedded storage.
- //! Attempting to move `ZoneTmp` would result in assertion failure in debug
- //! mode and undefined behavior in release mode.
- ASMJIT_INLINE Zone(Zone&& other) noexcept
+ //! \note You cannot move an existing `ZoneTmp` as it uses embedded storage. Attempting to move `ZoneTmp` would
+ //! result in assertion failure in debug mode and undefined behavior in release mode.
+ inline Zone(Zone&& other) noexcept
: _ptr(other._ptr),
_end(other._end),
_block(other._block),
@@ -137,16 +116,16 @@ public:
//! Destroys the `Zone` instance.
//!
- //! This will destroy the `Zone` instance and release all blocks of memory
- //! allocated by it. It performs implicit `reset(Globals::kResetHard)`.
- ASMJIT_INLINE ~Zone() noexcept { reset(Globals::kResetHard); }
+ //! This will destroy the `Zone` instance and release all blocks of memory allocated by it. It performs implicit
+ //! `reset(ResetPolicy::kHard)`.
+ inline ~Zone() noexcept { reset(ResetPolicy::kHard); }
ASMJIT_API void _init(size_t blockSize, size_t blockAlignment, const Support::Temporary* temporary) noexcept;
//! Resets the `Zone` invalidating all blocks allocated.
//!
//! See `Globals::ResetPolicy` for more details.
- ASMJIT_API void reset(uint32_t resetPolicy = Globals::kResetSoft) noexcept;
+ ASMJIT_API void reset(ResetPolicy resetPolicy = ResetPolicy::kSoft) noexcept;
//! \}
@@ -154,29 +133,28 @@ public:
//! \{
//! Tests whether this `Zone` is actually a `ZoneTmp` that uses temporary memory.
- ASMJIT_INLINE bool isTemporary() const noexcept { return _isTemporary != 0; }
+ inline bool isTemporary() const noexcept { return _isTemporary != 0; }
//! Returns the default block size.
- ASMJIT_INLINE size_t blockSize() const noexcept { return _blockSize; }
+ inline size_t blockSize() const noexcept { return _blockSize; }
//! Returns the default block alignment.
- ASMJIT_INLINE size_t blockAlignment() const noexcept { return size_t(1) << _blockAlignmentShift; }
+ inline size_t blockAlignment() const noexcept { return size_t(1) << _blockAlignmentShift; }
//! Returns remaining size of the current block.
- ASMJIT_INLINE size_t remainingSize() const noexcept { return (size_t)(_end - _ptr); }
+ inline size_t remainingSize() const noexcept { return (size_t)(_end - _ptr); }
//! Returns the current zone cursor (dangerous).
//!
- //! This is a function that can be used to get exclusive access to the current
- //! block's memory buffer.
+ //! This is a function that can be used to get exclusive access to the current block's memory buffer.
template<typename T = uint8_t>
- ASMJIT_INLINE T* ptr() noexcept { return reinterpret_cast<T*>(_ptr); }
+ inline T* ptr() noexcept { return reinterpret_cast<T*>(_ptr); }
//! Returns the end of the current zone block, only useful if you use `ptr()`.
template<typename T = uint8_t>
- ASMJIT_INLINE T* end() noexcept { return reinterpret_cast<T*>(_end); }
+ inline T* end() noexcept { return reinterpret_cast<T*>(_end); }
//! Sets the current zone pointer to `ptr` (must be within the current block).
template<typename T>
- ASMJIT_INLINE void setPtr(T* ptr) noexcept {
+ inline void setPtr(T* ptr) noexcept {
uint8_t* p = reinterpret_cast<uint8_t*>(ptr);
ASMJIT_ASSERT(p >= _ptr && p <= _end);
_ptr = p;
@@ -184,7 +162,7 @@ public:
//! Sets the end zone pointer to `end` (must be within the current block).
template<typename T>
- ASMJIT_INLINE void setEnd(T* end) noexcept {
+ inline void setEnd(T* end) noexcept {
uint8_t* p = reinterpret_cast<uint8_t*>(end);
ASMJIT_ASSERT(p >= _ptr && p <= _end);
_end = p;
@@ -195,7 +173,7 @@ public:
//! \name Utilities
//! \{
- ASMJIT_INLINE void swap(Zone& other) noexcept {
+ inline void swap(Zone& other) noexcept {
// This could lead to a disaster.
ASMJIT_ASSERT(!this->isTemporary());
ASMJIT_ASSERT(!other.isTemporary());
@@ -207,30 +185,29 @@ public:
}
//! Aligns the current pointer to `alignment`.
- ASMJIT_INLINE void align(size_t alignment) noexcept {
+ inline void align(size_t alignment) noexcept {
_ptr = Support::min(Support::alignUp(_ptr, alignment), _end);
}
//! Ensures the remaining size is at least equal or greater than `size`.
//!
- //! \note This function doesn't respect any alignment. If you need to ensure
- //! there is enough room for an aligned allocation you need to call `align()`
- //! before calling `ensure()`.
- ASMJIT_INLINE Error ensure(size_t size) noexcept {
+ //! \note This function doesn't respect any alignment. If you need to ensure there is enough room for an aligned
+ //! allocation you need to call `align()` before calling `ensure()`.
+ inline Error ensure(size_t size) noexcept {
if (size <= remainingSize())
return kErrorOk;
else
return _alloc(0, 1) ? kErrorOk : DebugUtils::errored(kErrorOutOfMemory);
}
- ASMJIT_INLINE void _assignBlock(Block* block) noexcept {
+ inline void _assignBlock(Block* block) noexcept {
size_t alignment = blockAlignment();
_ptr = Support::alignUp(block->data(), alignment);
_end = Support::alignDown(block->data() + block->size, alignment);
_block = block;
}
- ASMJIT_INLINE void _assignZeroBlock() noexcept {
+ inline void _assignZeroBlock() noexcept {
Block* block = const_cast<Block*>(&_zeroBlock);
_ptr = block->data();
_end = block->data();
@@ -244,9 +221,8 @@ public:
//! Allocates the requested memory specified by `size`.
//!
- //! Pointer returned is valid until the `Zone` instance is destroyed or reset
- //! by calling `reset()`. If you plan to make an instance of C++ from the
- //! given pointer use placement `new` and `delete` operators:
+ //! Pointer returned is valid until the `Zone` instance is destroyed or reset by calling `reset()`. If you plan to
+ //! make an instance of C++ from the given pointer use placement `new` and `delete` operators:
//!
//! ```
//! using namespace asmjit;
@@ -274,7 +250,7 @@ public:
//! // Reset or destroy `Zone`.
//! zone.reset();
//! ```
- ASMJIT_INLINE void* alloc(size_t size) noexcept {
+ inline void* alloc(size_t size) noexcept {
if (ASMJIT_UNLIKELY(size > remainingSize()))
return _alloc(size, 1);
@@ -284,7 +260,7 @@ public:
}
//! Allocates the requested memory specified by `size` and `alignment`.
- ASMJIT_INLINE void* alloc(size_t size, size_t alignment) noexcept {
+ inline void* alloc(size_t size, size_t alignment) noexcept {
ASMJIT_ASSERT(Support::isPowerOf2(alignment));
uint8_t* ptr = Support::alignUp(_ptr, alignment);
@@ -298,7 +274,7 @@ public:
//! Allocates the requested memory specified by `size` without doing any checks.
//!
//! Can only be called if `remainingSize()` returns size at least equal to `size`.
- ASMJIT_INLINE void* allocNoCheck(size_t size) noexcept {
+ inline void* allocNoCheck(size_t size) noexcept {
ASMJIT_ASSERT(remainingSize() >= size);
uint8_t* ptr = _ptr;
@@ -309,7 +285,7 @@ public:
//! Allocates the requested memory specified by `size` and `alignment` without doing any checks.
//!
//! Performs the same operation as `Zone::allocNoCheck(size)` with `alignment` applied.
- ASMJIT_INLINE void* allocNoCheck(size_t size, size_t alignment) noexcept {
+ inline void* allocNoCheck(size_t size, size_t alignment) noexcept {
ASMJIT_ASSERT(Support::isPowerOf2(alignment));
uint8_t* ptr = Support::alignUp(_ptr, alignment);
@@ -324,25 +300,25 @@ public:
//! Like `alloc()`, but the return pointer is casted to `T*`.
template<typename T>
- ASMJIT_INLINE T* allocT(size_t size = sizeof(T), size_t alignment = alignof(T)) noexcept {
+ inline T* allocT(size_t size = sizeof(T), size_t alignment = alignof(T)) noexcept {
return static_cast<T*>(alloc(size, alignment));
}
//! Like `allocNoCheck()`, but the return pointer is casted to `T*`.
template<typename T>
- ASMJIT_INLINE T* allocNoCheckT(size_t size = sizeof(T), size_t alignment = alignof(T)) noexcept {
+ inline T* allocNoCheckT(size_t size = sizeof(T), size_t alignment = alignof(T)) noexcept {
return static_cast<T*>(allocNoCheck(size, alignment));
}
//! Like `allocZeroed()`, but the return pointer is casted to `T*`.
template<typename T>
- ASMJIT_INLINE T* allocZeroedT(size_t size = sizeof(T), size_t alignment = alignof(T)) noexcept {
+ inline T* allocZeroedT(size_t size = sizeof(T), size_t alignment = alignof(T)) noexcept {
return static_cast<T*>(allocZeroed(size, alignment));
}
//! Like `new(std::nothrow) T(...)`, but allocated by `Zone`.
template<typename T>
- ASMJIT_INLINE T* newT() noexcept {
+ inline T* newT() noexcept {
void* p = alloc(sizeof(T), alignof(T));
if (ASMJIT_UNLIKELY(!p))
return nullptr;
@@ -351,7 +327,7 @@ public:
//! Like `new(std::nothrow) T(...)`, but allocated by `Zone`.
template<typename T, typename... Args>
- ASMJIT_INLINE T* newT(Args&&... args) noexcept {
+ inline T* newT(Args&&... args) noexcept {
void* p = alloc(sizeof(T), alignof(T));
if (ASMJIT_UNLIKELY(!p))
return nullptr;
@@ -368,7 +344,7 @@ public:
ASMJIT_API void* dup(const void* data, size_t size, bool nullTerminate = false) noexcept;
//! Helper to duplicate data.
- ASMJIT_INLINE void* dupAligned(const void* data, size_t size, size_t alignment, bool nullTerminate = false) noexcept {
+ inline void* dupAligned(const void* data, size_t size, size_t alignment, bool nullTerminate = false) noexcept {
align(alignment);
return dup(data, size, nullTerminate);
}
@@ -379,19 +355,14 @@ public:
//! \}
};
-// ============================================================================
-// [b2d::ZoneTmp]
-// ============================================================================
-
//! \ref Zone with `N` bytes of a static storage, used for the initial block.
//!
-//! Temporary zones are used in cases where it's known that some memory will be
-//! required, but in many cases it won't exceed N bytes, so the whole operation
-//! can be performed without a dynamic memory allocation.
+//! Temporary zones are used in cases where it's known that some memory will be required, but in many cases it won't
+//! exceed N bytes, so the whole operation can be performed without a dynamic memory allocation.
template<size_t N>
class ZoneTmp : public Zone {
public:
- ASMJIT_NONCOPYABLE(ZoneTmp<N>)
+ ASMJIT_NONCOPYABLE(ZoneTmp)
//! Temporary storage, embedded after \ref Zone.
struct Storage {
@@ -399,35 +370,29 @@ public:
} _storage;
//! Creates a temporary zone. Dynamic block size is specified by `blockSize`.
- ASMJIT_INLINE explicit ZoneTmp(size_t blockSize, size_t blockAlignment = 1) noexcept
+ inline explicit ZoneTmp(size_t blockSize, size_t blockAlignment = 1) noexcept
: Zone(blockSize, blockAlignment, Support::Temporary(_storage.data, N)) {}
};
-// ============================================================================
-// [asmjit::ZoneAllocator]
-// ============================================================================
-
-//! Zone-based memory allocator that uses an existing `Zone` and provides a
-//! `release()` functionality on top of it. It uses `Zone` only for chunks
-//! that can be pooled, and uses libc `malloc()` for chunks that are large.
+//! Zone-based memory allocator that uses an existing `Zone` and provides a `release()` functionality on top of it.
+//! It uses `Zone` only for chunks that can be pooled, and uses libc `malloc()` for chunks that are large.
//!
-//! The advantage of ZoneAllocator is that it can allocate small chunks of memory
-//! really fast, and these chunks, when released, will be reused by consecutive
-//! calls to `alloc()`. Also, since ZoneAllocator uses `Zone`, you can turn any
-//! `Zone` into a `ZoneAllocator`, and use it in your `Pass` when necessary.
+//! The advantage of ZoneAllocator is that it can allocate small chunks of memory really fast, and these chunks,
+//! when released, will be reused by consecutive calls to `alloc()`. Also, since ZoneAllocator uses `Zone`, you can
+//! turn any `Zone` into a `ZoneAllocator`, and use it in your `Pass` when necessary.
//!
-//! ZoneAllocator is used by AsmJit containers to make containers having only
-//! few elements fast (and lightweight) and to allow them to grow and use
-//! dynamic blocks when require more storage.
+//! ZoneAllocator is used by AsmJit containers to make containers having only few elements fast (and lightweight)
+//! and to allow them to grow and use dynamic blocks when require more storage.
class ZoneAllocator {
public:
ASMJIT_NONCOPYABLE(ZoneAllocator)
//! \cond INTERNAL
- enum {
- // In short, we pool chunks of these sizes:
- // [32, 64, 96, 128, 192, 256, 320, 384, 448, 512]
+ // In short, we pool chunks of these sizes:
+ // [32, 64, 96, 128, 192, 256, 320, 384, 448, 512]
+
+ enum : uint32_t {
//! How many bytes per a low granularity pool (has to be at least 16).
kLoGranularity = 32,
//! Number of slots of a low granularity pool.
@@ -452,9 +417,8 @@ public:
Slot* next;
};
- //! A block of memory that has been allocated dynamically and is not part of
- //! block-list used by the allocator. This is used to keep track of all these
- //! blocks so they can be freed by `reset()` if not freed explicitly.
+ //! A block of memory that has been allocated dynamically and is not part of block-list used by the allocator.
+ //! This is used to keep track of all these blocks so they can be freed by `reset()` if not freed explicitly.
struct DynamicBlock {
DynamicBlock* prev;
DynamicBlock* next;
@@ -462,6 +426,9 @@ public:
//! \endcond
+ //! \name Members
+ //! \{
+
//! Zone used to allocate memory that fits into slots.
Zone* _zone;
//! Indexed slots containing released memory.
@@ -469,6 +436,8 @@ public:
//! Dynamic blocks for larger allocations (no slots).
DynamicBlock* _dynamicBlocks;
+ //! \}
+
//! \name Construction & Destruction
//! \{
@@ -496,9 +465,9 @@ public:
//! It's the same as calling `reset(zone)`.
inline void init(Zone* zone) noexcept { reset(zone); }
- //! Resets this `ZoneAllocator` and also forget about the current `Zone` which
- //! is attached (if any). Reset optionally attaches a new `zone` passed, or
- //! keeps the `ZoneAllocator` in an uninitialized state, if `zone` is null.
+ //! Resets this `ZoneAllocator` and also forget about the current `Zone` which is attached (if any). Reset
+ //! optionally attaches a new `zone` passed, or keeps the `ZoneAllocator` in an uninitialized state, if
+ //! `zone` is null.
ASMJIT_API void reset(Zone* zone = nullptr) noexcept;
//! \}
@@ -506,8 +475,7 @@ public:
//! \name Accessors
//! \{
- //! Returns the assigned `Zone` of this allocator or null if this `ZoneAllocator`
- //! is not initialized.
+ //! Returns the assigned `Zone` of this allocator or null if this `ZoneAllocator` is not initialized.
inline Zone* zone() const noexcept { return _zone; }
//! \}
@@ -516,10 +484,10 @@ public:
//! \name Internals
//! \{
- //! Returns the slot index to be used for `size`. Returns `true` if a valid slot
- //! has been written to `slot` and `allocatedSize` has been filled with slot
- //! exact size (`allocatedSize` can be equal or slightly greater than `size`).
- static ASMJIT_INLINE bool _getSlotIndex(size_t size, uint32_t& slot) noexcept {
+ //! Returns the slot index to be used for `size`. Returns `true` if a valid slot has been written to `slot` and
+ //! `allocatedSize` has been filled with slot exact size (`allocatedSize` can be equal or slightly greater than
+ //! `size`).
+ static inline bool _getSlotIndex(size_t size, uint32_t& slot) noexcept {
ASMJIT_ASSERT(size > 0);
if (size > kHiMaxSize)
return false;
@@ -533,7 +501,7 @@ public:
}
//! \overload
- static ASMJIT_INLINE bool _getSlotIndex(size_t size, uint32_t& slot, size_t& allocatedSize) noexcept {
+ static inline bool _getSlotIndex(size_t size, uint32_t& slot, size_t& allocatedSize) noexcept {
ASMJIT_ASSERT(size > 0);
if (size > kHiMaxSize)
return false;
@@ -571,9 +539,8 @@ public:
return _alloc(size, allocatedSize);
}
- //! Like `alloc(size)`, but provides a second argument `allocatedSize` that
- //! provides a way to know how big the block returned actually is. This is
- //! useful for containers to prevent growing too early.
+ //! Like `alloc(size)`, but provides a second argument `allocatedSize` that provides a way to know how big
+ //! the block returned actually is. This is useful for containers to prevent growing too early.
inline void* alloc(size_t size, size_t& allocatedSize) noexcept {
ASMJIT_ASSERT(isInitialized());
return _alloc(size, allocatedSize);
@@ -621,9 +588,8 @@ public:
return new(p) T(std::forward<Args>(args)...);
}
- //! Releases the memory previously allocated by `alloc()`. The `size` argument
- //! has to be the same as used to call `alloc()` or `allocatedSize` returned
- //! by `alloc()`.
+ //! Releases the memory previously allocated by `alloc()`. The `size` argument has to be the same as used to call
+ //! `alloc()` or `allocatedSize` returned by `alloc()`.
inline void release(void* p, size_t size) noexcept {
ASMJIT_ASSERT(isInitialized());
ASMJIT_ASSERT(p != nullptr);
diff --git a/3rdparty/asmjit/src/asmjit/core/zonehash.cpp b/3rdparty/asmjit/src/asmjit/core/zonehash.cpp
index fb48d85c6d2..3778fbe2260 100644
--- a/3rdparty/asmjit/src/asmjit/core/zonehash.cpp
+++ b/3rdparty/asmjit/src/asmjit/core/zonehash.cpp
@@ -1,25 +1,7 @@
-// AsmJit - Machine code generation for C++
+// This file is part of AsmJit project <https://asmjit.com>
//
-// * Official AsmJit Home Page: https://asmjit.com
-// * Official Github Repository: https://github.com/asmjit/asmjit
-//
-// Copyright (c) 2008-2020 The AsmJit Authors
-//
-// This software is provided 'as-is', without any express or implied
-// warranty. In no event will the authors be held liable for any damages
-// arising from the use of this software.
-//
-// Permission is granted to anyone to use this software for any purpose,
-// including commercial applications, and to alter it and redistribute it
-// freely, subject to the following restrictions:
-//
-// 1. The origin of this software must not be misrepresented; you must not
-// claim that you wrote the original software. If you use this software
-// in a product, an acknowledgment in the product documentation would be
-// appreciated but is not required.
-// 2. Altered source versions must be plainly marked as such, and must not be
-// misrepresented as being the original software.
-// 3. This notice may not be removed or altered from any source distribution.
+// See asmjit.h or LICENSE.md for license and copyright information
+// SPDX-License-Identifier: Zlib
#include "../core/api-build_p.h"
#include "../core/support.h"
@@ -28,9 +10,8 @@
ASMJIT_BEGIN_NAMESPACE
-// ============================================================================
-// [asmjit::ZoneHashBase - Helpers]
-// ============================================================================
+// ZoneHashBase - Prime Numbers
+// ============================
#define ASMJIT_POPULATE_PRIMES(ENTRY) \
ENTRY(2 , 0x80000000, 32), /* [N * 0x80000000 >> 32] (rcp=2147483648) */ \
@@ -183,9 +164,8 @@ static const uint8_t ZoneHash_primeShift[] = {
#undef E
};
-// ============================================================================
-// [asmjit::ZoneHashBase - Rehash]
-// ============================================================================
+// ZoneHashBase - Rehash
+// =====================
void ZoneHashBase::_rehash(ZoneAllocator* allocator, uint32_t primeIndex) noexcept {
ASMJIT_ASSERT(primeIndex < ASMJIT_ARRAY_SIZE(ZoneHash_primeArray));
@@ -225,9 +205,8 @@ void ZoneHashBase::_rehash(ZoneAllocator* allocator, uint32_t primeIndex) noexce
allocator->release(oldData, oldCount * sizeof(ZoneHashNode*));
}
-// ============================================================================
-// [asmjit::ZoneHashBase - Ops]
-// ============================================================================
+// ZoneHashBase - Operations
+// =========================
ZoneHashNode* ZoneHashBase::_insert(ZoneAllocator* allocator, ZoneHashNode* node) noexcept {
uint32_t hashMod = _calcMod(node->_hashCode);
@@ -266,9 +245,8 @@ ZoneHashNode* ZoneHashBase::_remove(ZoneAllocator* allocator, ZoneHashNode* node
return nullptr;
}
-// ============================================================================
-// [asmjit::ZoneHash - Unit]
-// ============================================================================
+// ZoneHashBase - Tests
+// ====================
#if defined(ASMJIT_TEST)
struct MyHashNode : public ZoneHashNode {
diff --git a/3rdparty/asmjit/src/asmjit/core/zonehash.h b/3rdparty/asmjit/src/asmjit/core/zonehash.h
index 0f1f21f148c..f332290b54d 100644
--- a/3rdparty/asmjit/src/asmjit/core/zonehash.h
+++ b/3rdparty/asmjit/src/asmjit/core/zonehash.h
@@ -1,25 +1,7 @@
-// AsmJit - Machine code generation for C++
+// This file is part of AsmJit project <https://asmjit.com>
//
-// * Official AsmJit Home Page: https://asmjit.com
-// * Official Github Repository: https://github.com/asmjit/asmjit
-//
-// Copyright (c) 2008-2020 The AsmJit Authors
-//
-// This software is provided 'as-is', without any express or implied
-// warranty. In no event will the authors be held liable for any damages
-// arising from the use of this software.
-//
-// Permission is granted to anyone to use this software for any purpose,
-// including commercial applications, and to alter it and redistribute it
-// freely, subject to the following restrictions:
-//
-// 1. The origin of this software must not be misrepresented; you must not
-// claim that you wrote the original software. If you use this software
-// in a product, an acknowledgment in the product documentation would be
-// appreciated but is not required.
-// 2. Altered source versions must be plainly marked as such, and must not be
-// misrepresented as being the original software.
-// 3. This notice may not be removed or altered from any source distribution.
+// See asmjit.h or LICENSE.md for license and copyright information
+// SPDX-License-Identifier: Zlib
#ifndef ASMJIT_CORE_ZONEHASH_H_INCLUDED
#define ASMJIT_CORE_ZONEHASH_H_INCLUDED
@@ -31,14 +13,9 @@ ASMJIT_BEGIN_NAMESPACE
//! \addtogroup asmjit_zone
//! \{
-// ============================================================================
-// [asmjit::ZoneHashNode]
-// ============================================================================
-
//! Node used by \ref ZoneHash template.
//!
-//! You must provide function `bool eq(const Key& key)` in order to make
-//! `ZoneHash::get()` working.
+//! You must provide function `bool eq(const Key& key)` in order to make `ZoneHash::get()` working.
class ZoneHashNode {
public:
ASMJIT_NONCOPYABLE(ZoneHashNode)
@@ -56,10 +33,6 @@ public:
uint32_t _customData;
};
-// ============================================================================
-// [asmjit::ZoneHashBase]
-// ============================================================================
-
//! Base class used by \ref ZoneHash template
class ZoneHashBase {
public:
@@ -162,20 +135,15 @@ public:
//! \}
};
-// ============================================================================
-// [asmjit::ZoneHash]
-// ============================================================================
-
//! Low-level hash table specialized for storing string keys and POD values.
//!
-//! This hash table allows duplicates to be inserted (the API is so low
-//! level that it's up to you if you allow it or not, as you should first
-//! `get()` the node and then modify it or insert a new node by using `insert()`,
-//! depending on the intention).
+//! This hash table allows duplicates to be inserted (the API is so low level that it's up to you if you allow it or
+//! not, as you should first `get()` the node and then modify it or insert a new node by using `insert()`, depending
+//! on the intention).
template<typename NodeT>
class ZoneHash : public ZoneHashBase {
public:
- ASMJIT_NONCOPYABLE(ZoneHash<NodeT>)
+ ASMJIT_NONCOPYABLE(ZoneHash)
typedef NodeT Node;
diff --git a/3rdparty/asmjit/src/asmjit/core/zonelist.cpp b/3rdparty/asmjit/src/asmjit/core/zonelist.cpp
index 3496aa8a2b9..d4b311d4307 100644
--- a/3rdparty/asmjit/src/asmjit/core/zonelist.cpp
+++ b/3rdparty/asmjit/src/asmjit/core/zonelist.cpp
@@ -1,25 +1,7 @@
-// AsmJit - Machine code generation for C++
+// This file is part of AsmJit project <https://asmjit.com>
//
-// * Official AsmJit Home Page: https://asmjit.com
-// * Official Github Repository: https://github.com/asmjit/asmjit
-//
-// Copyright (c) 2008-2020 The AsmJit Authors
-//
-// This software is provided 'as-is', without any express or implied
-// warranty. In no event will the authors be held liable for any damages
-// arising from the use of this software.
-//
-// Permission is granted to anyone to use this software for any purpose,
-// including commercial applications, and to alter it and redistribute it
-// freely, subject to the following restrictions:
-//
-// 1. The origin of this software must not be misrepresented; you must not
-// claim that you wrote the original software. If you use this software
-// in a product, an acknowledgment in the product documentation would be
-// appreciated but is not required.
-// 2. Altered source versions must be plainly marked as such, and must not be
-// misrepresented as being the original software.
-// 3. This notice may not be removed or altered from any source distribution.
+// See asmjit.h or LICENSE.md for license and copyright information
+// SPDX-License-Identifier: Zlib
#include "../core/api-build_p.h"
#include "../core/zone.h"
@@ -27,9 +9,8 @@
ASMJIT_BEGIN_NAMESPACE
-// ============================================================================
-// [asmjit::ZoneList - Unit]
-// ============================================================================
+// ZoneList - Tests
+// ================
#if defined(ASMJIT_TEST)
class MyListNode : public ZoneListNode<MyListNode> {};
diff --git a/3rdparty/asmjit/src/asmjit/core/zonelist.h b/3rdparty/asmjit/src/asmjit/core/zonelist.h
index bc726deca94..c5e00136589 100644
--- a/3rdparty/asmjit/src/asmjit/core/zonelist.h
+++ b/3rdparty/asmjit/src/asmjit/core/zonelist.h
@@ -1,25 +1,7 @@
-// AsmJit - Machine code generation for C++
+// This file is part of AsmJit project <https://asmjit.com>
//
-// * Official AsmJit Home Page: https://asmjit.com
-// * Official Github Repository: https://github.com/asmjit/asmjit
-//
-// Copyright (c) 2008-2020 The AsmJit Authors
-//
-// This software is provided 'as-is', without any express or implied
-// warranty. In no event will the authors be held liable for any damages
-// arising from the use of this software.
-//
-// Permission is granted to anyone to use this software for any purpose,
-// including commercial applications, and to alter it and redistribute it
-// freely, subject to the following restrictions:
-//
-// 1. The origin of this software must not be misrepresented; you must not
-// claim that you wrote the original software. If you use this software
-// in a product, an acknowledgment in the product documentation would be
-// appreciated but is not required.
-// 2. Altered source versions must be plainly marked as such, and must not be
-// misrepresented as being the original software.
-// 3. This notice may not be removed or altered from any source distribution.
+// See asmjit.h or LICENSE.md for license and copyright information
+// SPDX-License-Identifier: Zlib
#ifndef ASMJIT_CORE_ZONELIST_H_INCLUDED
#define ASMJIT_CORE_ZONELIST_H_INCLUDED
@@ -31,17 +13,28 @@ ASMJIT_BEGIN_NAMESPACE
//! \addtogroup asmjit_zone
//! \{
-// ============================================================================
-// [asmjit::ZoneListNode]
-// ============================================================================
-
//! Node used by \ref ZoneList template.
template<typename NodeT>
class ZoneListNode {
public:
ASMJIT_NONCOPYABLE(ZoneListNode)
- NodeT* _listNodes[Globals::kLinkCount];
+ //! \name Constants
+ //! \{
+
+ enum : size_t {
+ kNodeIndexPrev = 0,
+ kNodeIndexNext = 1
+ };
+
+ //! \}
+
+ //! \name Members
+ //! \{
+
+ NodeT* _listNodes[2];
+
+ //! \}
//! \name Construction & Destruction
//! \{
@@ -57,39 +50,50 @@ public:
//! \name Accessors
//! \{
- inline bool hasPrev() const noexcept { return _listNodes[Globals::kLinkPrev] != nullptr; }
- inline bool hasNext() const noexcept { return _listNodes[Globals::kLinkNext] != nullptr; }
+ inline bool hasPrev() const noexcept { return _listNodes[kNodeIndexPrev] != nullptr; }
+ inline bool hasNext() const noexcept { return _listNodes[kNodeIndexNext] != nullptr; }
- inline NodeT* prev() const noexcept { return _listNodes[Globals::kLinkPrev]; }
- inline NodeT* next() const noexcept { return _listNodes[Globals::kLinkNext]; }
+ inline NodeT* prev() const noexcept { return _listNodes[kNodeIndexPrev]; }
+ inline NodeT* next() const noexcept { return _listNodes[kNodeIndexNext]; }
//! \}
};
-// ============================================================================
-// [asmjit::ZoneList<T>]
-// ============================================================================
-
//! Zone allocated list container that uses nodes of `NodeT` type.
template <typename NodeT>
class ZoneList {
public:
ASMJIT_NONCOPYABLE(ZoneList)
- NodeT* _bounds[Globals::kLinkCount];
+ //! \name Constants
+ //! \{
+
+ enum : size_t {
+ kNodeIndexFirst = 0,
+ kNodeIndexLast = 1
+ };
+
+ //! \}
+
+ //! \name Members
+ //! \{
+
+ NodeT* _nodes[2];
+
+ //! \}
//! \name Construction & Destruction
//! \{
inline ZoneList() noexcept
- : _bounds { nullptr, nullptr } {}
+ : _nodes { nullptr, nullptr } {}
inline ZoneList(ZoneList&& other) noexcept
- : _bounds { other._bounds[0], other._bounds[1] } {}
+ : _nodes { other._nodes[0], other._nodes[1] } {}
inline void reset() noexcept {
- _bounds[0] = nullptr;
- _bounds[1] = nullptr;
+ _nodes[0] = nullptr;
+ _nodes[1] = nullptr;
}
//! \}
@@ -97,9 +101,9 @@ public:
//! \name Accessors
//! \{
- inline bool empty() const noexcept { return _bounds[0] == nullptr; }
- inline NodeT* first() const noexcept { return _bounds[Globals::kLinkFirst]; }
- inline NodeT* last() const noexcept { return _bounds[Globals::kLinkLast]; }
+ inline bool empty() const noexcept { return _nodes[0] == nullptr; }
+ inline NodeT* first() const noexcept { return _nodes[kNodeIndexFirst]; }
+ inline NodeT* last() const noexcept { return _nodes[kNodeIndexLast]; }
//! \}
@@ -107,23 +111,23 @@ public:
//! \{
inline void swap(ZoneList& other) noexcept {
- std::swap(_bounds[0], other._bounds[0]);
- std::swap(_bounds[1], other._bounds[1]);
+ std::swap(_nodes[0], other._nodes[0]);
+ std::swap(_nodes[1], other._nodes[1]);
}
- // Can be used to both prepend and append.
+ // Can be used to both append and prepend.
inline void _addNode(NodeT* node, size_t dir) noexcept {
- NodeT* prev = _bounds[dir];
+ NodeT* prev = _nodes[dir];
node->_listNodes[!dir] = prev;
- _bounds[dir] = node;
+ _nodes[dir] = node;
if (prev)
prev->_listNodes[dir] = node;
else
- _bounds[!dir] = node;
+ _nodes[!dir] = node;
}
- // Can be used to both prepend and append.
+ // Can be used to both append and prepend.
inline void _insertNode(NodeT* ref, NodeT* node, size_t dir) noexcept {
ASMJIT_ASSERT(ref != nullptr);
@@ -134,24 +138,24 @@ public:
if (next)
next->_listNodes[!dir] = node;
else
- _bounds[dir] = node;
+ _nodes[dir] = node;
node->_listNodes[!dir] = prev;
node->_listNodes[ dir] = next;
}
- inline void append(NodeT* node) noexcept { _addNode(node, Globals::kLinkLast); }
- inline void prepend(NodeT* node) noexcept { _addNode(node, Globals::kLinkFirst); }
+ inline void append(NodeT* node) noexcept { _addNode(node, kNodeIndexLast); }
+ inline void prepend(NodeT* node) noexcept { _addNode(node, kNodeIndexFirst); }
- inline void insertAfter(NodeT* ref, NodeT* node) noexcept { _insertNode(ref, node, Globals::kLinkNext); }
- inline void insertBefore(NodeT* ref, NodeT* node) noexcept { _insertNode(ref, node, Globals::kLinkPrev); }
+ inline void insertAfter(NodeT* ref, NodeT* node) noexcept { _insertNode(ref, node, NodeT::kNodeIndexNext); }
+ inline void insertBefore(NodeT* ref, NodeT* node) noexcept { _insertNode(ref, node, NodeT::kNodeIndexPrev); }
inline NodeT* unlink(NodeT* node) noexcept {
NodeT* prev = node->prev();
NodeT* next = node->next();
- if (prev) { prev->_listNodes[1] = next; node->_listNodes[0] = nullptr; } else { _bounds[0] = next; }
- if (next) { next->_listNodes[0] = prev; node->_listNodes[1] = nullptr; } else { _bounds[1] = prev; }
+ if (prev) { prev->_listNodes[1] = next; node->_listNodes[0] = nullptr; } else { _nodes[0] = next; }
+ if (next) { next->_listNodes[0] = prev; node->_listNodes[1] = nullptr; } else { _nodes[1] = prev; }
node->_listNodes[0] = nullptr;
node->_listNodes[1] = nullptr;
@@ -160,36 +164,36 @@ public:
}
inline NodeT* popFirst() noexcept {
- NodeT* node = _bounds[0];
+ NodeT* node = _nodes[0];
ASMJIT_ASSERT(node != nullptr);
NodeT* next = node->next();
- _bounds[0] = next;
+ _nodes[0] = next;
if (next) {
next->_listNodes[0] = nullptr;
node->_listNodes[1] = nullptr;
}
else {
- _bounds[1] = nullptr;
+ _nodes[1] = nullptr;
}
return node;
}
inline NodeT* pop() noexcept {
- NodeT* node = _bounds[1];
+ NodeT* node = _nodes[1];
ASMJIT_ASSERT(node != nullptr);
NodeT* prev = node->prev();
- _bounds[1] = prev;
+ _nodes[1] = prev;
if (prev) {
prev->_listNodes[1] = nullptr;
node->_listNodes[0] = nullptr;
}
else {
- _bounds[0] = nullptr;
+ _nodes[0] = nullptr;
}
return node;
diff --git a/3rdparty/asmjit/src/asmjit/core/zonestack.cpp b/3rdparty/asmjit/src/asmjit/core/zonestack.cpp
index 52841b5d396..77e6f202c7d 100644
--- a/3rdparty/asmjit/src/asmjit/core/zonestack.cpp
+++ b/3rdparty/asmjit/src/asmjit/core/zonestack.cpp
@@ -1,25 +1,7 @@
-// AsmJit - Machine code generation for C++
+// This file is part of AsmJit project <https://asmjit.com>
//
-// * Official AsmJit Home Page: https://asmjit.com
-// * Official Github Repository: https://github.com/asmjit/asmjit
-//
-// Copyright (c) 2008-2020 The AsmJit Authors
-//
-// This software is provided 'as-is', without any express or implied
-// warranty. In no event will the authors be held liable for any damages
-// arising from the use of this software.
-//
-// Permission is granted to anyone to use this software for any purpose,
-// including commercial applications, and to alter it and redistribute it
-// freely, subject to the following restrictions:
-//
-// 1. The origin of this software must not be misrepresented; you must not
-// claim that you wrote the original software. If you use this software
-// in a product, an acknowledgment in the product documentation would be
-// appreciated but is not required.
-// 2. Altered source versions must be plainly marked as such, and must not be
-// misrepresented as being the original software.
-// 3. This notice may not be removed or altered from any source distribution.
+// See asmjit.h or LICENSE.md for license and copyright information
+// SPDX-License-Identifier: Zlib
#include "../core/api-build_p.h"
#include "../core/zone.h"
@@ -27,15 +9,14 @@
ASMJIT_BEGIN_NAMESPACE
-// ============================================================================
-// [asmjit::ZoneStackBase - Init / Reset]
-// ============================================================================
+// ZoneStackBase - Init & Reset
+// ============================
Error ZoneStackBase::_init(ZoneAllocator* allocator, size_t middleIndex) noexcept {
ZoneAllocator* oldAllocator = _allocator;
if (oldAllocator) {
- Block* block = _block[Globals::kLinkFirst];
+ Block* block = _block[kBlockIndexFirst];
while (block) {
Block* next = block->next();
oldAllocator->release(block, kBlockSize);
@@ -43,8 +24,8 @@ Error ZoneStackBase::_init(ZoneAllocator* allocator, size_t middleIndex) noexcep
}
_allocator = nullptr;
- _block[Globals::kLinkLeft] = nullptr;
- _block[Globals::kLinkRight] = nullptr;
+ _block[kBlockIndexFirst] = nullptr;
+ _block[kBlockIndexLast] = nullptr;
}
if (allocator) {
@@ -52,22 +33,21 @@ Error ZoneStackBase::_init(ZoneAllocator* allocator, size_t middleIndex) noexcep
if (ASMJIT_UNLIKELY(!block))
return DebugUtils::errored(kErrorOutOfMemory);
- block->_link[Globals::kLinkLeft] = nullptr;
- block->_link[Globals::kLinkRight] = nullptr;
+ block->_link[kBlockIndexPrev] = nullptr;
+ block->_link[kBlockIndexNext] = nullptr;
block->_start = (uint8_t*)block + middleIndex;
block->_end = (uint8_t*)block + middleIndex;
_allocator = allocator;
- _block[Globals::kLinkLeft] = block;
- _block[Globals::kLinkRight] = block;
+ _block[kBlockIndexFirst] = block;
+ _block[kBlockIndexLast] = block;
}
return kErrorOk;
}
-// ============================================================================
-// [asmjit::ZoneStackBase - Ops]
-// ============================================================================
+// ZoneStackBase - Operations
+// ==========================
Error ZoneStackBase::_prepareBlock(uint32_t side, size_t initialIndex) noexcept {
ASMJIT_ASSERT(isInitialized());
@@ -109,9 +89,8 @@ void ZoneStackBase::_cleanupBlock(uint32_t side, size_t middleIndex) noexcept {
}
}
-// ============================================================================
-// [asmjit::ZoneStack - Unit]
-// ============================================================================
+// ZoneStack - Tests
+// =================
#if defined(ASMJIT_TEST)
template<typename T>
diff --git a/3rdparty/asmjit/src/asmjit/core/zonestack.h b/3rdparty/asmjit/src/asmjit/core/zonestack.h
index 2de6cdc05a7..aea7b6868fa 100644
--- a/3rdparty/asmjit/src/asmjit/core/zonestack.h
+++ b/3rdparty/asmjit/src/asmjit/core/zonestack.h
@@ -1,25 +1,7 @@
-// AsmJit - Machine code generation for C++
+// This file is part of AsmJit project <https://asmjit.com>
//
-// * Official AsmJit Home Page: https://asmjit.com
-// * Official Github Repository: https://github.com/asmjit/asmjit
-//
-// Copyright (c) 2008-2020 The AsmJit Authors
-//
-// This software is provided 'as-is', without any express or implied
-// warranty. In no event will the authors be held liable for any damages
-// arising from the use of this software.
-//
-// Permission is granted to anyone to use this software for any purpose,
-// including commercial applications, and to alter it and redistribute it
-// freely, subject to the following restrictions:
-//
-// 1. The origin of this software must not be misrepresented; you must not
-// claim that you wrote the original software. If you use this software
-// in a product, an acknowledgment in the product documentation would be
-// appreciated but is not required.
-// 2. Altered source versions must be plainly marked as such, and must not be
-// misrepresented as being the original software.
-// 3. This notice may not be removed or altered from any source distribution.
+// See asmjit.h or LICENSE.md for license and copyright information
+// SPDX-License-Identifier: Zlib
#ifndef ASMJIT_CORE_ZONESTACK_H_INCLUDED
#define ASMJIT_CORE_ZONESTACK_H_INCLUDED
@@ -31,24 +13,43 @@ ASMJIT_BEGIN_NAMESPACE
//! \addtogroup asmjit_zone
//! \{
-// ============================================================================
-// [asmjit::ZoneStackBase]
-// ============================================================================
-
//! Base class used by \ref ZoneStack.
class ZoneStackBase {
public:
ASMJIT_NONCOPYABLE(ZoneStackBase)
- static constexpr uint32_t kBlockSize = ZoneAllocator::kHiMaxSize;
+ //! \name Constants
+ //! \{
+
+ enum : size_t {
+ kBlockIndexPrev = 0,
+ kBlockIndexNext = 1,
+
+ kBlockIndexFirst = 0,
+ kBlockIndexLast = 1,
+
+ kBlockSize = ZoneAllocator::kHiMaxSize
+ };
+
+ //! \}
+
+ //! \name Types
+ //! \{
struct Block {
+ //! Next and previous blocks.
+ Block* _link[2];
+ //! Pointer to the start of the array.
+ void* _start;
+ //! Pointer to the end of the array.
+ void* _end;
+
inline bool empty() const noexcept { return _start == _end; }
- inline Block* prev() const noexcept { return _link[Globals::kLinkLeft]; }
- inline Block* next() const noexcept { return _link[Globals::kLinkRight]; }
+ inline Block* prev() const noexcept { return _link[kBlockIndexPrev]; }
+ inline Block* next() const noexcept { return _link[kBlockIndexNext]; }
- inline void setPrev(Block* block) noexcept { _link[Globals::kLinkLeft] = block; }
- inline void setNext(Block* block) noexcept { _link[Globals::kLinkRight] = block; }
+ inline void setPrev(Block* block) noexcept { _link[kBlockIndexPrev] = block; }
+ inline void setNext(Block* block) noexcept { _link[kBlockIndexNext] = block; }
template<typename T>
inline T* start() const noexcept { return static_cast<T*>(_start); }
@@ -74,18 +75,21 @@ public:
return (uintptr_t)_end <= ((uintptr_t)this + kEndBlockIndex - sizeof(T));
}
-
- Block* _link[Globals::kLinkCount]; //!< Next and previous blocks.
- void* _start; //!< Pointer to the start of the array.
- void* _end; //!< Pointer to the end of the array.
};
+ //! \}
+
+ //! \name Members
+ //! \{
+
//! Allocator used to allocate data.
ZoneAllocator* _allocator;
//! First and last blocks.
- Block* _block[Globals::kLinkCount];
+ Block* _block[2];
- //! \name Construction / Destruction
+ //! \}
+
+ //! \name Construction & Destruction
//! \{
inline ZoneStackBase() noexcept {
@@ -125,15 +129,14 @@ public:
//! \endcond
};
-// ============================================================================
-// [asmjit::ZoneStack<T>]
-// ============================================================================
-
//! Zone allocated stack container.
template<typename T>
class ZoneStack : public ZoneStackBase {
public:
- ASMJIT_NONCOPYABLE(ZoneStack<T>)
+ ASMJIT_NONCOPYABLE(ZoneStack)
+
+ //! \name Constants
+ //! \{
enum : uint32_t {
kNumBlockItems = uint32_t((kBlockSize - sizeof(Block)) / sizeof(T)),
@@ -142,7 +145,9 @@ public:
kEndBlockIndex = uint32_t(kStartBlockIndex + (kNumBlockItems ) * sizeof(T))
};
- //! \name Construction / Destruction
+ //! \}
+
+ //! \name Construction & Destruction
//! \{
inline ZoneStack() noexcept {}
@@ -155,13 +160,13 @@ public:
//! \name Utilities
//! \{
- ASMJIT_INLINE Error prepend(T item) noexcept {
+ inline Error prepend(T item) noexcept {
ASMJIT_ASSERT(isInitialized());
- Block* block = _block[Globals::kLinkFirst];
+ Block* block = _block[kBlockIndexFirst];
if (!block->canPrepend<T>()) {
- ASMJIT_PROPAGATE(_prepareBlock(Globals::kLinkFirst, kEndBlockIndex));
- block = _block[Globals::kLinkFirst];
+ ASMJIT_PROPAGATE(_prepareBlock(kBlockIndexFirst, kEndBlockIndex));
+ block = _block[kBlockIndexFirst];
}
T* ptr = block->start<T>() - 1;
@@ -171,13 +176,13 @@ public:
return kErrorOk;
}
- ASMJIT_INLINE Error append(T item) noexcept {
+ inline Error append(T item) noexcept {
ASMJIT_ASSERT(isInitialized());
- Block* block = _block[Globals::kLinkLast];
+ Block* block = _block[kBlockIndexLast];
if (!block->canAppend<T>()) {
- ASMJIT_PROPAGATE(_prepareBlock(Globals::kLinkLast, kStartBlockIndex));
- block = _block[Globals::kLinkLast];
+ ASMJIT_PROPAGATE(_prepareBlock(kBlockIndexLast, kStartBlockIndex));
+ block = _block[kBlockIndexLast];
}
T* ptr = block->end<T>();
@@ -188,11 +193,11 @@ public:
return kErrorOk;
}
- ASMJIT_INLINE T popFirst() noexcept {
+ inline T popFirst() noexcept {
ASMJIT_ASSERT(isInitialized());
ASMJIT_ASSERT(!empty());
- Block* block = _block[Globals::kLinkFirst];
+ Block* block = _block[kBlockIndexFirst];
ASMJIT_ASSERT(!block->empty());
T* ptr = block->start<T>();
@@ -200,16 +205,16 @@ public:
block->setStart(ptr);
if (block->empty())
- _cleanupBlock(Globals::kLinkFirst, kMidBlockIndex);
+ _cleanupBlock(kBlockIndexFirst, kMidBlockIndex);
return item;
}
- ASMJIT_INLINE T pop() noexcept {
+ inline T pop() noexcept {
ASMJIT_ASSERT(isInitialized());
ASMJIT_ASSERT(!empty());
- Block* block = _block[Globals::kLinkLast];
+ Block* block = _block[kBlockIndexLast];
ASMJIT_ASSERT(!block->empty());
T* ptr = block->end<T>();
@@ -219,7 +224,7 @@ public:
block->setEnd(ptr);
if (block->empty())
- _cleanupBlock(Globals::kLinkLast, kMidBlockIndex);
+ _cleanupBlock(kBlockIndexLast, kMidBlockIndex);
return item;
}
diff --git a/3rdparty/asmjit/src/asmjit/core/zonestring.h b/3rdparty/asmjit/src/asmjit/core/zonestring.h
index cb25b29ce7d..01f5bd89f6a 100644
--- a/3rdparty/asmjit/src/asmjit/core/zonestring.h
+++ b/3rdparty/asmjit/src/asmjit/core/zonestring.h
@@ -1,28 +1,10 @@
-// AsmJit - Machine code generation for C++
+// This file is part of AsmJit project <https://asmjit.com>
//
-// * Official AsmJit Home Page: https://asmjit.com
-// * Official Github Repository: https://github.com/asmjit/asmjit
-//
-// Copyright (c) 2008-2020 The AsmJit Authors
-//
-// This software is provided 'as-is', without any express or implied
-// warranty. In no event will the authors be held liable for any damages
-// arising from the use of this software.
-//
-// Permission is granted to anyone to use this software for any purpose,
-// including commercial applications, and to alter it and redistribute it
-// freely, subject to the following restrictions:
-//
-// 1. The origin of this software must not be misrepresented; you must not
-// claim that you wrote the original software. If you use this software
-// in a product, an acknowledgment in the product documentation would be
-// appreciated but is not required.
-// 2. Altered source versions must be plainly marked as such, and must not be
-// misrepresented as being the original software.
-// 3. This notice may not be removed or altered from any source distribution.
+// See asmjit.h or LICENSE.md for license and copyright information
+// SPDX-License-Identifier: Zlib
-#ifndef ASMJIT_CORE_SMALLSTRING_H_INCLUDED
-#define ASMJIT_CORE_SMALLSTRING_H_INCLUDED
+#ifndef ASMJIT_CORE_ZONESTRING_H_INCLUDED
+#define ASMJIT_CORE_ZONESTRING_H_INCLUDED
#include "../core/globals.h"
#include "../core/zone.h"
@@ -32,10 +14,6 @@ ASMJIT_BEGIN_NAMESPACE
//! \addtogroup asmjit_zone
//! \{
-// ============================================================================
-// [asmjit::ZoneStringBase]
-// ============================================================================
-
//! A helper class used by \ref ZoneString implementation.
struct ZoneStringBase {
union {
@@ -74,28 +52,34 @@ struct ZoneStringBase {
}
};
-// ============================================================================
-// [asmjit::ZoneString<N>]
-// ============================================================================
-
//! A string template that can be zone allocated.
//!
-//! Helps with creating strings that can be either statically allocated if they
-//! are small, or externally allocated in case their size exceeds the limit.
-//! The `N` represents the size of the whole `ZoneString` structure, based on
+//! Helps with creating strings that can be either statically allocated if they are small, or externally allocated
+//! in case their size exceeds the limit. The `N` represents the size of the whole `ZoneString` structure, based on
//! that size the maximum size of the internal buffer is determined.
template<size_t N>
class ZoneString {
public:
- static constexpr uint32_t kWholeSize =
- (N > sizeof(ZoneStringBase)) ? uint32_t(N) : uint32_t(sizeof(ZoneStringBase));
- static constexpr uint32_t kMaxEmbeddedSize = kWholeSize - 5;
+ //! \name Constants
+ //! \{
+
+ enum : uint32_t {
+ kWholeSize = (N > sizeof(ZoneStringBase)) ? uint32_t(N) : uint32_t(sizeof(ZoneStringBase)),
+ kMaxEmbeddedSize = kWholeSize - 5
+ };
+
+ //! \}
+
+ //! \name Members
+ //! \{
union {
ZoneStringBase _base;
char _wholeData[kWholeSize];
};
+ //! \}
+
//! \name Construction & Destruction
//! \{
@@ -120,9 +104,8 @@ public:
//! Copies a new `data` of the given `size` to the string.
//!
- //! If the `size` exceeds the internal buffer the given `zone` will be
- //! used to duplicate the data, otherwise the internal buffer will be
- //! used as a storage.
+ //! If the `size` exceeds the internal buffer the given `zone` will be used to duplicate the data, otherwise
+ //! the internal buffer will be used as a storage.
inline Error setData(Zone* zone, const char* data, size_t size) noexcept {
return _base.setData(zone, kMaxEmbeddedSize, data, size);
}
@@ -134,4 +117,4 @@ public:
ASMJIT_END_NAMESPACE
-#endif // ASMJIT_CORE_SMALLSTRING_H_INCLUDED
+#endif // ASMJIT_CORE_ZONESTRING_H_INCLUDED
diff --git a/3rdparty/asmjit/src/asmjit/core/zonetree.cpp b/3rdparty/asmjit/src/asmjit/core/zonetree.cpp
index a16f0928f8d..8c42af8c02f 100644
--- a/3rdparty/asmjit/src/asmjit/core/zonetree.cpp
+++ b/3rdparty/asmjit/src/asmjit/core/zonetree.cpp
@@ -1,25 +1,7 @@
-// AsmJit - Machine code generation for C++
+// This file is part of AsmJit project <https://asmjit.com>
//
-// * Official AsmJit Home Page: https://asmjit.com
-// * Official Github Repository: https://github.com/asmjit/asmjit
-//
-// Copyright (c) 2008-2020 The AsmJit Authors
-//
-// This software is provided 'as-is', without any express or implied
-// warranty. In no event will the authors be held liable for any damages
-// arising from the use of this software.
-//
-// Permission is granted to anyone to use this software for any purpose,
-// including commercial applications, and to alter it and redistribute it
-// freely, subject to the following restrictions:
-//
-// 1. The origin of this software must not be misrepresented; you must not
-// claim that you wrote the original software. If you use this software
-// in a product, an acknowledgment in the product documentation would be
-// appreciated but is not required.
-// 2. Altered source versions must be plainly marked as such, and must not be
-// misrepresented as being the original software.
-// 3. This notice may not be removed or altered from any source distribution.
+// See asmjit.h or LICENSE.md for license and copyright information
+// SPDX-License-Identifier: Zlib
#include "../core/api-build_p.h"
#include "../core/support.h"
@@ -28,9 +10,8 @@
ASMJIT_BEGIN_NAMESPACE
-// ============================================================================
-// [asmjit::ZoneTree - Unit]
-// ============================================================================
+// ZoneTreeBase - Tests
+// ====================
#if defined(ASMJIT_TEST)
template<typename NodeT>
diff --git a/3rdparty/asmjit/src/asmjit/core/zonetree.h b/3rdparty/asmjit/src/asmjit/core/zonetree.h
index 1877919d67b..c5dbc78f496 100644
--- a/3rdparty/asmjit/src/asmjit/core/zonetree.h
+++ b/3rdparty/asmjit/src/asmjit/core/zonetree.h
@@ -1,25 +1,7 @@
-// AsmJit - Machine code generation for C++
+// This file is part of AsmJit project <https://asmjit.com>
//
-// * Official AsmJit Home Page: https://asmjit.com
-// * Official Github Repository: https://github.com/asmjit/asmjit
-//
-// Copyright (c) 2008-2020 The AsmJit Authors
-//
-// This software is provided 'as-is', without any express or implied
-// warranty. In no event will the authors be held liable for any damages
-// arising from the use of this software.
-//
-// Permission is granted to anyone to use this software for any purpose,
-// including commercial applications, and to alter it and redistribute it
-// freely, subject to the following restrictions:
-//
-// 1. The origin of this software must not be misrepresented; you must not
-// claim that you wrote the original software. If you use this software
-// in a product, an acknowledgment in the product documentation would be
-// appreciated but is not required.
-// 2. Altered source versions must be plainly marked as such, and must not be
-// misrepresented as being the original software.
-// 3. This notice may not be removed or altered from any source distribution.
+// See asmjit.h or LICENSE.md for license and copyright information
+// SPDX-License-Identifier: Zlib
#ifndef ASMJIT_CORE_ZONETREE_H_INCLUDED
#define ASMJIT_CORE_ZONETREE_H_INCLUDED
@@ -31,10 +13,6 @@ ASMJIT_BEGIN_NAMESPACE
//! \addtogroup asmjit_zone
//! \{
-// ============================================================================
-// [asmjit::ZoneTreeNode]
-// ============================================================================
-
//! RB-Tree node.
//!
//! The color is stored in a least significant bit of the `left` node.
@@ -44,12 +22,22 @@ class ZoneTreeNode {
public:
ASMJIT_NONCOPYABLE(ZoneTreeNode)
+ //! \name Constants
+ //! \{
+
enum : uintptr_t {
kRedMask = 0x1,
kPtrMask = ~kRedMask
};
- uintptr_t _rbNodeData[Globals::kLinkCount];
+ //! \}
+
+ //! \name Members
+ //! \{
+
+ uintptr_t _rbNodeData[2];
+
+ //! \}
//! \name Construction & Destruction
//! \{
@@ -123,10 +111,6 @@ public:
//! \}
};
-// ============================================================================
-// [asmjit::ZoneTree]
-// ============================================================================
-
//! RB-Tree.
template<typename NodeT>
class ZoneTree {
@@ -164,8 +148,8 @@ public:
std::swap(_root, other._root);
}
- template<typename CompareT = Support::Compare<Support::kSortAscending>>
- void insert(NodeT* node, const CompareT& cmp = CompareT()) noexcept {
+ template<typename CompareT = Support::Compare<Support::SortOrder::kAscending>>
+ void insert(NodeT* ASMJIT_NONNULL(node), const CompareT& cmp = CompareT()) noexcept {
// Node to insert must not contain garbage.
ASMJIT_ASSERT(!node->hasLeft());
ASMJIT_ASSERT(!node->hasRight());
@@ -176,18 +160,18 @@ public:
return;
}
- ZoneTreeNode head; // False root node,
- head._setRight(_root); // having root on the right.
+ ZoneTreeNode head; // False root node,
+ head._setRight(_root); // having root on the right.
- ZoneTreeNode* g = nullptr; // Grandparent.
- ZoneTreeNode* p = nullptr; // Parent.
- ZoneTreeNode* t = &head; // Iterator.
- ZoneTreeNode* q = _root; // Query.
+ ZoneTreeNode* g = nullptr; // Grandparent.
+ ZoneTreeNode* p = nullptr; // Parent.
+ ZoneTreeNode* t = &head; // Iterator.
+ ZoneTreeNode* q = _root; // Query.
- size_t dir = 0; // Direction for accessing child nodes.
- size_t last = 0; // Not needed to initialize, but makes some tools happy.
+ size_t dir = 0; // Direction for accessing child nodes.
+ size_t last = 0; // Not needed to initialize, but makes some tools happy.
- node->_makeRed(); // New nodes are always red and violations fixed appropriately.
+ node->_makeRed(); // New nodes are always red and violations fixed appropriately.
// Search down the tree.
for (;;) {
@@ -204,9 +188,12 @@ public:
}
// Fix red violation.
- if (_isValidRed(q) && _isValidRed(p))
+ if (_isValidRed(q) && _isValidRed(p)) {
+ ASMJIT_ASSUME(g != nullptr);
+ ASMJIT_ASSUME(p != nullptr);
t->_setChild(t->_getRight() == g,
q == p->_getChild(last) ? _singleRotate(g, !last) : _doubleRotate(g, !last));
+ }
// Stop if found.
if (q == node)
@@ -229,8 +216,8 @@ public:
}
//! Remove node from RBTree.
- template<typename CompareT = Support::Compare<Support::kSortAscending>>
- void remove(ZoneTreeNode* node, const CompareT& cmp = CompareT()) noexcept {
+ template<typename CompareT = Support::Compare<Support::SortOrder::kAscending>>
+ void remove(ZoneTreeNode* ASMJIT_NONNULL(node), const CompareT& cmp = CompareT()) noexcept {
ZoneTreeNode head; // False root node,
head._setRight(_root); // having root on the right.
@@ -274,6 +261,9 @@ public:
q->_makeRed();
}
else {
+ ASMJIT_ASSUME(g != nullptr);
+ ASMJIT_ASSUME(s != nullptr);
+
size_t dir2 = g->_getRight() == p;
ZoneTreeNode* child = g->_getChild(dir2);
@@ -304,10 +294,9 @@ public:
p->_setChild(p->_getRight() == q,
q->_getChild(q->_getLeft() == nullptr));
- // NOTE: The original algorithm used a trick to just copy 'key/value' to
- // `f` and mark `q` for deletion. But this is unacceptable here as we
- // really want to destroy the passed `node`. So, we have to make sure that
- // we have really removed `f` and not `q`.
+ // NOTE: The original algorithm used a trick to just copy 'key/value' to `f` and mark `q` for deletion. But this
+ // is unacceptable here as we really want to destroy the passed `node`. So, we have to make sure that we have
+ // really removed `f` and not `q`.
if (f != q) {
ASMJIT_ASSERT(f != &head);
ASMJIT_ASSERT(f != gf);
@@ -337,8 +326,8 @@ public:
if (_root) _root->_makeBlack();
}
- template<typename KeyT, typename CompareT = Support::Compare<Support::kSortAscending>>
- ASMJIT_INLINE NodeT* get(const KeyT& key, const CompareT& cmp = CompareT()) const noexcept {
+ template<typename KeyT, typename CompareT = Support::Compare<Support::SortOrder::kAscending>>
+ inline NodeT* get(const KeyT& key, const CompareT& cmp = CompareT()) const noexcept {
ZoneTreeNode* node = _root;
while (node) {
auto result = cmp(*static_cast<const NodeT*>(node), key);
@@ -359,9 +348,12 @@ public:
static inline bool _isValidRed(ZoneTreeNode* node) noexcept { return ZoneTreeNode::_isValidRed(node); }
//! Single rotation.
- static ASMJIT_INLINE ZoneTreeNode* _singleRotate(ZoneTreeNode* root, size_t dir) noexcept {
+ static inline ZoneTreeNode* _singleRotate(ZoneTreeNode* ASMJIT_NONNULL(root), size_t dir) noexcept {
ZoneTreeNode* save = root->_getChild(!dir);
- root->_setChild(!dir, save->_getChild(dir));
+ ASMJIT_ASSUME(save != nullptr);
+
+ ZoneTreeNode* saveChild = save->_getChild(dir);
+ root->_setChild(!dir, saveChild);
save->_setChild( dir, root);
root->_makeRed();
save->_makeBlack();
@@ -369,8 +361,11 @@ public:
}
//! Double rotation.
- static ASMJIT_INLINE ZoneTreeNode* _doubleRotate(ZoneTreeNode* root, size_t dir) noexcept {
- root->_setChild(!dir, _singleRotate(root->_getChild(!dir), !dir));
+ static inline ZoneTreeNode* _doubleRotate(ZoneTreeNode* ASMJIT_NONNULL(root), size_t dir) noexcept {
+ ZoneTreeNode* child = root->_getChild(!dir);
+ ASMJIT_ASSUME(child != nullptr);
+
+ root->_setChild(!dir, _singleRotate(child, !dir));
return _singleRotate(root, dir);
}
diff --git a/3rdparty/asmjit/src/asmjit/core/zonevector.cpp b/3rdparty/asmjit/src/asmjit/core/zonevector.cpp
index 7ab53bf3547..dfec5d5f795 100644
--- a/3rdparty/asmjit/src/asmjit/core/zonevector.cpp
+++ b/3rdparty/asmjit/src/asmjit/core/zonevector.cpp
@@ -1,25 +1,7 @@
-// AsmJit - Machine code generation for C++
+// This file is part of AsmJit project <https://asmjit.com>
//
-// * Official AsmJit Home Page: https://asmjit.com
-// * Official Github Repository: https://github.com/asmjit/asmjit
-//
-// Copyright (c) 2008-2020 The AsmJit Authors
-//
-// This software is provided 'as-is', without any express or implied
-// warranty. In no event will the authors be held liable for any damages
-// arising from the use of this software.
-//
-// Permission is granted to anyone to use this software for any purpose,
-// including commercial applications, and to alter it and redistribute it
-// freely, subject to the following restrictions:
-//
-// 1. The origin of this software must not be misrepresented; you must not
-// claim that you wrote the original software. If you use this software
-// in a product, an acknowledgment in the product documentation would be
-// appreciated but is not required.
-// 2. Altered source versions must be plainly marked as such, and must not be
-// misrepresented as being the original software.
-// 3. This notice may not be removed or altered from any source distribution.
+// See asmjit.h or LICENSE.md for license and copyright information
+// SPDX-License-Identifier: Zlib
#include "../core/api-build_p.h"
#include "../core/support.h"
@@ -28,9 +10,8 @@
ASMJIT_BEGIN_NAMESPACE
-// ============================================================================
-// [asmjit::ZoneVectorBase - Helpers]
-// ============================================================================
+// ZoneVectorBase - Helpers
+// ========================
Error ZoneVectorBase::_grow(ZoneAllocator* allocator, uint32_t sizeOfT, uint32_t n) noexcept {
uint32_t threshold = Globals::kGrowThreshold / sizeOfT;
@@ -112,9 +93,8 @@ Error ZoneVectorBase::_resize(ZoneAllocator* allocator, uint32_t sizeOfT, uint32
return kErrorOk;
}
-// ============================================================================
-// [asmjit::ZoneBitVector - Ops]
-// ============================================================================
+// ZoneBitVector - Operations
+// ==========================
Error ZoneBitVector::copyFrom(ZoneAllocator* allocator, const ZoneBitVector& other) noexcept {
BitWord* data = _data;
@@ -126,7 +106,7 @@ Error ZoneBitVector::copyFrom(ZoneAllocator* allocator, const ZoneBitVector& oth
}
if (newSize > _capacity) {
- // Realloc needed... Calculate the minimum capacity (in bytes) requied.
+ // Realloc needed... Calculate the minimum capacity (in bytes) required.
uint32_t minimumCapacityInBits = Support::alignUp<uint32_t>(newSize, kBitWordSizeInBits);
if (ASMJIT_UNLIKELY(minimumCapacityInBits < newSize))
return DebugUtils::errored(kErrorOutOfMemory);
@@ -186,7 +166,7 @@ Error ZoneBitVector::_resize(ZoneAllocator* allocator, uint32_t newSize, uint32_
BitWord* data = _data;
if (newSize > _capacity) {
- // Realloc needed, calculate the minimum capacity (in bytes) requied.
+ // Realloc needed, calculate the minimum capacity (in bytes) required.
uint32_t minimumCapacityInBits = Support::alignUp<uint32_t>(idealCapacity, kBitWordSizeInBits);
if (ASMJIT_UNLIKELY(minimumCapacityInBits < newSize))
@@ -280,9 +260,8 @@ Error ZoneBitVector::_append(ZoneAllocator* allocator, bool value) noexcept {
return _resize(allocator, newSize, idealCapacity, value);
}
-// ============================================================================
-// [asmjit::ZoneVector / ZoneBitVector - Unit]
-// ============================================================================
+// ZoneVector / ZoneBitVector - Tests
+// ==================================
#if defined(ASMJIT_TEST)
template<typename T>
@@ -312,6 +291,8 @@ static void test_zone_vector(ZoneAllocator* allocator, const char* typeName) {
EXPECT(vec.size() == uint32_t(kMax));
EXPECT(vec.indexOf(T(kMax - 1)) == uint32_t(kMax - 1));
+ EXPECT(vec.rbegin()[0] == kMax - 1);
+
vec.release(allocator);
}
diff --git a/3rdparty/asmjit/src/asmjit/core/zonevector.h b/3rdparty/asmjit/src/asmjit/core/zonevector.h
index 770543baee1..447c08cb921 100644
--- a/3rdparty/asmjit/src/asmjit/core/zonevector.h
+++ b/3rdparty/asmjit/src/asmjit/core/zonevector.h
@@ -1,25 +1,7 @@
-// AsmJit - Machine code generation for C++
+// This file is part of AsmJit project <https://asmjit.com>
//
-// * Official AsmJit Home Page: https://asmjit.com
-// * Official Github Repository: https://github.com/asmjit/asmjit
-//
-// Copyright (c) 2008-2020 The AsmJit Authors
-//
-// This software is provided 'as-is', without any express or implied
-// warranty. In no event will the authors be held liable for any damages
-// arising from the use of this software.
-//
-// Permission is granted to anyone to use this software for any purpose,
-// including commercial applications, and to alter it and redistribute it
-// freely, subject to the following restrictions:
-//
-// 1. The origin of this software must not be misrepresented; you must not
-// claim that you wrote the original software. If you use this software
-// in a product, an acknowledgment in the product documentation would be
-// appreciated but is not required.
-// 2. Altered source versions must be plainly marked as such, and must not be
-// misrepresented as being the original software.
-// 3. This notice may not be removed or altered from any source distribution.
+// See asmjit.h or LICENSE.md for license and copyright information
+// SPDX-License-Identifier: Zlib
#ifndef ASMJIT_CORE_ZONEVECTOR_H_INCLUDED
#define ASMJIT_CORE_ZONEVECTOR_H_INCLUDED
@@ -32,10 +14,6 @@ ASMJIT_BEGIN_NAMESPACE
//! \addtogroup asmjit_zone
//! \{
-// ============================================================================
-// [asmjit::ZoneVectorBase]
-// ============================================================================
-
//! Base class used by \ref ZoneVector template.
class ZoneVectorBase {
public:
@@ -46,21 +24,18 @@ public:
typedef ptrdiff_t difference_type;
//! Vector data (untyped).
- void* _data;
+ void* _data = nullptr;
//! Size of the vector.
- size_type _size;
+ size_type _size = 0;
//! Capacity of the vector.
- size_type _capacity;
+ size_type _capacity = 0;
protected:
//! \name Construction & Destruction
//! \{
//! Creates a new instance of `ZoneVectorBase`.
- inline ZoneVectorBase() noexcept
- : _data(nullptr),
- _size(0),
- _capacity(0) {}
+ inline ZoneVectorBase() noexcept {}
inline ZoneVectorBase(ZoneVectorBase&& other) noexcept
: _data(other._data),
@@ -132,10 +107,6 @@ public:
//! \}
};
-// ============================================================================
-// [asmjit::ZoneVector<T>]
-// ============================================================================
-
//! Template used to store and manage array of Zone allocated data.
//!
//! This template has these advantages over other std::vector<>:
@@ -146,7 +117,7 @@ public:
template <typename T>
class ZoneVector : public ZoneVectorBase {
public:
- ASMJIT_NONCOPYABLE(ZoneVector<T>)
+ ASMJIT_NONCOPYABLE(ZoneVector)
// STL compatibility;
typedef T value_type;
@@ -155,10 +126,10 @@ public:
typedef T& reference;
typedef const T& const_reference;
- typedef Support::Iterator<T> iterator;
- typedef Support::Iterator<const T> const_iterator;
- typedef Support::ReverseIterator<T> reverse_iterator;
- typedef Support::ReverseIterator<const T> const_reverse_iterator;
+ typedef T* iterator;
+ typedef const T* const_iterator;
+ typedef std::reverse_iterator<iterator> reverse_iterator;
+ typedef std::reverse_iterator<const_iterator> const_reverse_iterator;
//! \name Construction & Destruction
//! \{
@@ -198,17 +169,17 @@ public:
inline iterator end() noexcept { return iterator(data() + _size); };
inline const_iterator end() const noexcept { return const_iterator(data() + _size); };
- inline reverse_iterator rbegin() noexcept { return reverse_iterator(data()); };
- inline const_reverse_iterator rbegin() const noexcept { return const_reverse_iterator(data()); };
+ inline reverse_iterator rbegin() noexcept { return reverse_iterator(end()); };
+ inline const_reverse_iterator rbegin() const noexcept { return const_reverse_iterator(end()); };
- inline reverse_iterator rend() noexcept { return reverse_iterator(data() + _size); };
- inline const_reverse_iterator rend() const noexcept { return const_reverse_iterator(data() + _size); };
+ inline reverse_iterator rend() noexcept { return reverse_iterator(begin()); };
+ inline const_reverse_iterator rend() const noexcept { return const_reverse_iterator(begin()); };
inline const_iterator cbegin() const noexcept { return const_iterator(data()); };
inline const_iterator cend() const noexcept { return const_iterator(data() + _size); };
- inline const_reverse_iterator crbegin() const noexcept { return const_reverse_iterator(data()); };
- inline const_reverse_iterator crend() const noexcept { return const_reverse_iterator(data() + _size); };
+ inline const_reverse_iterator crbegin() const noexcept { return const_reverse_iterator(cend()); };
+ inline const_reverse_iterator crend() const noexcept { return const_reverse_iterator(cbegin()); };
//! \}
@@ -216,10 +187,10 @@ public:
//! \{
//! Swaps this vector with `other`.
- inline void swap(ZoneVector<T>& other) noexcept { _swap(other); }
+ ASMJIT_FORCE_INLINE void swap(ZoneVector<T>& other) noexcept { _swap(other); }
//! Prepends `item` to the vector.
- inline Error prepend(ZoneAllocator* allocator, const T& item) noexcept {
+ ASMJIT_FORCE_INLINE Error prepend(ZoneAllocator* allocator, const T& item) noexcept {
if (ASMJIT_UNLIKELY(_size == _capacity))
ASMJIT_PROPAGATE(grow(allocator, 1));
@@ -231,7 +202,7 @@ public:
}
//! Inserts an `item` at the specified `index`.
- inline Error insert(ZoneAllocator* allocator, uint32_t index, const T& item) noexcept {
+ ASMJIT_FORCE_INLINE Error insert(ZoneAllocator* allocator, size_t index, const T& item) noexcept {
ASMJIT_ASSERT(index <= _size);
if (ASMJIT_UNLIKELY(_size == _capacity))
@@ -246,7 +217,7 @@ public:
}
//! Appends `item` to the vector.
- inline Error append(ZoneAllocator* allocator, const T& item) noexcept {
+ ASMJIT_FORCE_INLINE Error append(ZoneAllocator* allocator, const T& item) noexcept {
if (ASMJIT_UNLIKELY(_size == _capacity))
ASMJIT_PROPAGATE(grow(allocator, 1));
@@ -257,7 +228,7 @@ public:
}
//! Appends `other` vector at the end of this vector.
- inline Error concat(ZoneAllocator* allocator, const ZoneVector<T>& other) noexcept {
+ ASMJIT_FORCE_INLINE Error concat(ZoneAllocator* allocator, const ZoneVector<T>& other) noexcept {
uint32_t size = other._size;
if (_capacity - _size < size)
ASMJIT_PROPAGATE(grow(allocator, size));
@@ -272,10 +243,9 @@ public:
//! Prepends `item` to the vector (unsafe case).
//!
- //! Can only be used together with `willGrow()`. If `willGrow(N)` returns
- //! `kErrorOk` then N elements can be added to the vector without checking
- //! if there is a place for them. Used mostly internally.
- inline void prependUnsafe(const T& item) noexcept {
+ //! Can only be used together with `willGrow()`. If `willGrow(N)` returns `kErrorOk` then N elements
+ //! can be added to the vector without checking if there is a place for them. Used mostly internally.
+ ASMJIT_FORCE_INLINE void prependUnsafe(const T& item) noexcept {
ASMJIT_ASSERT(_size < _capacity);
T* data = static_cast<T*>(_data);
@@ -288,18 +258,27 @@ public:
//! Append s`item` to the vector (unsafe case).
//!
- //! Can only be used together with `willGrow()`. If `willGrow(N)` returns
- //! `kErrorOk` then N elements can be added to the vector without checking
- //! if there is a place for them. Used mostly internally.
- inline void appendUnsafe(const T& item) noexcept {
+ //! Can only be used together with `willGrow()`. If `willGrow(N)` returns `kErrorOk` then N elements
+ //! can be added to the vector without checking if there is a place for them. Used mostly internally.
+ ASMJIT_FORCE_INLINE void appendUnsafe(const T& item) noexcept {
ASMJIT_ASSERT(_size < _capacity);
memcpy(static_cast<T*>(_data) + _size, &item, sizeof(T));
_size++;
}
+ //! Inserts an `item` at the specified `index` (unsafe case).
+ ASMJIT_FORCE_INLINE void insertUnsafe(size_t index, const T& item) noexcept {
+ ASMJIT_ASSERT(_size < _capacity);
+ ASMJIT_ASSERT(index <= _size);
+
+ T* dst = static_cast<T*>(_data) + index;
+ ::memmove(dst + 1, dst, size_t(_size - index) * sizeof(T));
+ memcpy(dst, &item, sizeof(T));
+ _size++;
+ }
//! Concatenates all items of `other` at the end of the vector.
- inline void concatUnsafe(const ZoneVector<T>& other) noexcept {
+ ASMJIT_FORCE_INLINE void concatUnsafe(const ZoneVector<T>& other) noexcept {
uint32_t size = other._size;
ASMJIT_ASSERT(_capacity - _size >= size);
@@ -310,7 +289,7 @@ public:
}
//! Returns index of the given `val` or `Globals::kNotFound` if it doesn't exist.
- inline uint32_t indexOf(const T& val) const noexcept {
+ ASMJIT_FORCE_INLINE uint32_t indexOf(const T& val) const noexcept {
const T* data = static_cast<const T*>(_data);
uint32_t size = _size;
@@ -326,11 +305,11 @@ public:
}
//! Removes item at index `i`.
- inline void removeAt(uint32_t i) noexcept {
+ inline void removeAt(size_t i) noexcept {
ASMJIT_ASSERT(i < _size);
T* data = static_cast<T*>(_data) + i;
- uint32_t size = --_size - i;
+ size_t size = --_size - i;
if (size)
::memmove(data, data + 1, size_t(size) * sizeof(T));
@@ -344,7 +323,7 @@ public:
return data()[index];
}
- template<typename CompareT = Support::Compare<Support::kSortAscending>>
+ template<typename CompareT = Support::Compare<Support::SortOrder::kAscending>>
inline void sort(const CompareT& cmp = CompareT()) noexcept {
Support::qSort<T, CompareT>(data(), size(), cmp);
}
@@ -363,18 +342,16 @@ public:
//! Returns a reference to the first element of the vector.
//!
- //! \note The vector must have at least one element. Attempting to use
- //! `first()` on empty vector will trigger an assertion failure in debug
- //! builds.
+ //! \note The vector must have at least one element. Attempting to use `first()` on empty vector will trigger
+ //! an assertion failure in debug builds.
inline T& first() noexcept { return operator[](0); }
//! \overload
inline const T& first() const noexcept { return operator[](0); }
//! Returns a reference to the last element of the vector.
//!
- //! \note The vector must have at least one element. Attempting to use
- //! `last()` on empty vector will trigger an assertion failure in debug
- //! builds.
+ //! \note The vector must have at least one element. Attempting to use `last()` on empty vector will trigger
+ //! an assertion failure in debug builds.
inline T& last() noexcept { return operator[](_size - 1); }
//! \overload
inline const T& last() const noexcept { return operator[](_size - 1); }
@@ -396,9 +373,8 @@ public:
//! Resizes the vector to hold `n` elements.
//!
- //! If `n` is greater than the current size then the additional elements'
- //! content will be initialized to zero. If `n` is less than the current
- //! size then the vector will be truncated to exactly `n` elements.
+ //! If `n` is greater than the current size then the additional elements' content will be initialized to zero.
+ //! If `n` is less than the current size then the vector will be truncated to exactly `n` elements.
inline Error resize(ZoneAllocator* allocator, uint32_t n) noexcept {
return ZoneVectorBase::_resize(allocator, sizeof(T), n);
}
@@ -415,24 +391,33 @@ public:
//! \}
};
-// ============================================================================
-// [asmjit::ZoneBitVector]
-// ============================================================================
-
//! Zone-allocated bit vector.
class ZoneBitVector {
public:
typedef Support::BitWord BitWord;
- static constexpr uint32_t kBitWordSizeInBits = Support::kBitWordSizeInBits;
+
+ ASMJIT_NONCOPYABLE(ZoneBitVector)
+
+ //! \name Constants
+ //! \{
+
+ enum : uint32_t {
+ kBitWordSizeInBits = Support::kBitWordSizeInBits
+ };
+
+ //! \}
+
+ //! \name Members
+ //! \{
//! Bits.
- BitWord* _data;
+ BitWord* _data = nullptr;
//! Size of the bit-vector (in bits).
- uint32_t _size;
+ uint32_t _size = 0;
//! Capacity of the bit-vector (in bits).
- uint32_t _capacity;
+ uint32_t _capacity = 0;
- ASMJIT_NONCOPYABLE(ZoneBitVector)
+ //! \}
//! \cond INTERNAL
//! \name Internal
@@ -463,10 +448,7 @@ public:
//! \name Construction & Destruction
//! \{
- inline ZoneBitVector() noexcept
- : _data(nullptr),
- _size(0),
- _capacity(0) {}
+ inline ZoneBitVector() noexcept {}
inline ZoneBitVector(ZoneBitVector&& other) noexcept
: _data(other._data),
@@ -544,7 +526,7 @@ public:
Support::bitVectorFlipBit(_data, index);
}
- ASMJIT_INLINE Error append(ZoneAllocator* allocator, bool value) noexcept {
+ ASMJIT_FORCE_INLINE Error append(ZoneAllocator* allocator, bool value) noexcept {
uint32_t index = _size;
if (ASMJIT_UNLIKELY(index >= _capacity))
return _append(allocator, value);
@@ -563,35 +545,34 @@ public:
ASMJIT_API Error copyFrom(ZoneAllocator* allocator, const ZoneBitVector& other) noexcept;
- inline void clearAll() noexcept {
+ ASMJIT_FORCE_INLINE void clearAll() noexcept {
_zeroBits(_data, _wordsPerBits(_size));
}
- inline void fillAll() noexcept {
+ ASMJIT_FORCE_INLINE void fillAll() noexcept {
_fillBits(_data, _wordsPerBits(_size));
_clearUnusedBits();
}
- inline void clearBits(uint32_t start, uint32_t count) noexcept {
+ ASMJIT_FORCE_INLINE void clearBits(uint32_t start, uint32_t count) noexcept {
ASMJIT_ASSERT(start <= _size);
ASMJIT_ASSERT(_size - start >= count);
Support::bitVectorClear(_data, start, count);
}
- inline void fillBits(uint32_t start, uint32_t count) noexcept {
+ ASMJIT_FORCE_INLINE void fillBits(uint32_t start, uint32_t count) noexcept {
ASMJIT_ASSERT(start <= _size);
ASMJIT_ASSERT(_size - start >= count);
Support::bitVectorFill(_data, start, count);
}
- //! Performs a logical bitwise AND between bits specified in this array and bits
- //! in `other`. If `other` has less bits than `this` then all remaining bits are
- //! set to zero.
+ //! Performs a logical bitwise AND between bits specified in this array and bits in `other`. If `other` has less
+ //! bits than `this` then all remaining bits are set to zero.
//!
//! \note The size of the BitVector is unaffected by this operation.
- inline void and_(const ZoneBitVector& other) noexcept {
+ ASMJIT_FORCE_INLINE void and_(const ZoneBitVector& other) noexcept {
BitWord* dst = _data;
const BitWord* src = other._data;
@@ -611,12 +592,11 @@ public:
}
}
- //! Performs a logical bitwise AND between bits specified in this array and
- //! negated bits in `other`. If `other` has less bits than `this` then all
- //! remaining bits are kept intact.
+ //! Performs a logical bitwise AND between bits specified in this array and negated bits in `other`. If `other`
+ //! has less bits than `this` then all remaining bits are kept intact.
//!
//! \note The size of the BitVector is unaffected by this operation.
- inline void andNot(const ZoneBitVector& other) noexcept {
+ ASMJIT_FORCE_INLINE void andNot(const ZoneBitVector& other) noexcept {
BitWord* dst = _data;
const BitWord* src = other._data;
@@ -625,12 +605,11 @@ public:
dst[i] = dst[i] & ~src[i];
}
- //! Performs a logical bitwise OP between bits specified in this array and bits
- //! in `other`. If `other` has less bits than `this` then all remaining bits
- //! are kept intact.
+ //! Performs a logical bitwise OP between bits specified in this array and bits in `other`. If `other` has less
+ //! bits than `this` then all remaining bits are kept intact.
//!
//! \note The size of the BitVector is unaffected by this operation.
- inline void or_(const ZoneBitVector& other) noexcept {
+ ASMJIT_FORCE_INLINE void or_(const ZoneBitVector& other) noexcept {
BitWord* dst = _data;
const BitWord* src = other._data;
@@ -640,15 +619,16 @@ public:
_clearUnusedBits();
}
- inline void _clearUnusedBits() noexcept {
+ ASMJIT_FORCE_INLINE void _clearUnusedBits() noexcept {
uint32_t idx = _size / kBitWordSizeInBits;
uint32_t bit = _size % kBitWordSizeInBits;
- if (!bit) return;
+ if (!bit)
+ return;
_data[idx] &= (BitWord(1) << bit) - 1u;
}
- inline bool eq(const ZoneBitVector& other) const noexcept {
+ ASMJIT_FORCE_INLINE bool eq(const ZoneBitVector& other) const noexcept {
if (_size != other._size)
return false;
@@ -687,14 +667,14 @@ public:
class ForEachBitSet : public Support::BitVectorIterator<BitWord> {
public:
- ASMJIT_INLINE explicit ForEachBitSet(const ZoneBitVector& bitVector) noexcept
+ inline explicit ForEachBitSet(const ZoneBitVector& bitVector) noexcept
: Support::BitVectorIterator<BitWord>(bitVector.data(), bitVector.sizeInBitWords()) {}
};
template<class Operator>
class ForEachBitOp : public Support::BitVectorOpIterator<BitWord, Operator> {
public:
- ASMJIT_INLINE ForEachBitOp(const ZoneBitVector& a, const ZoneBitVector& b) noexcept
+ inline ForEachBitOp(const ZoneBitVector& a, const ZoneBitVector& b) noexcept
: Support::BitVectorOpIterator<BitWord, Operator>(a.data(), b.data(), a.sizeInBitWords()) {
ASMJIT_ASSERT(a.size() == b.size());
}
diff --git a/3rdparty/asmjit/src/asmjit/x86.h b/3rdparty/asmjit/src/asmjit/x86.h
index 3c2224c966a..84bc84bb2d9 100644
--- a/3rdparty/asmjit/src/asmjit/x86.h
+++ b/3rdparty/asmjit/src/asmjit/x86.h
@@ -1,25 +1,7 @@
-// AsmJit - Machine code generation for C++
+// This file is part of AsmJit project <https://asmjit.com>
//
-// * Official AsmJit Home Page: https://asmjit.com
-// * Official Github Repository: https://github.com/asmjit/asmjit
-//
-// Copyright (c) 2008-2020 The AsmJit Authors
-//
-// This software is provided 'as-is', without any express or implied
-// warranty. In no event will the authors be held liable for any damages
-// arising from the use of this software.
-//
-// Permission is granted to anyone to use this software for any purpose,
-// including commercial applications, and to alter it and redistribute it
-// freely, subject to the following restrictions:
-//
-// 1. The origin of this software must not be misrepresented; you must not
-// claim that you wrote the original software. If you use this software
-// in a product, an acknowledgment in the product documentation would be
-// appreciated but is not required.
-// 2. Altered source versions must be plainly marked as such, and must not be
-// misrepresented as being the original software.
-// 3. This notice may not be removed or altered from any source distribution.
+// See asmjit.h or LICENSE.md for license and copyright information
+// SPDX-License-Identifier: Zlib
#ifndef ASMJIT_X86_H_INCLUDED
#define ASMJIT_X86_H_INCLUDED
@@ -40,14 +22,14 @@
//! ### Supported Instructions
//!
//! - Emitters:
-//! - \ref x86::EmitterExplicitT - Provides all instructions that use
-//! explicit operands, provides also utility functions. The member
-//! functions provided are part of all X86 emitters.
-//! - \ref x86::EmitterImplicitT - Provides all instructions that use
-//! implicit operands, these cannot be used with \ref x86::Compiler.
+//! - \ref x86::EmitterExplicitT - Provides all instructions that use explicit operands, provides also utility
+//! functions. The member functions provided are part of all X86 emitters.
+//! - \ref x86::EmitterImplicitT - Provides all instructions that use implicit operands, these cannot be used
+//! with \ref x86::Compiler.
+//!
//! - Instruction representation:
-//! - \ref x86::Inst::Id - instruction identifiers.
-//! - \ref x86::Inst::Options - instruction options.
+//! - \ref x86::Inst::Id - Provides instruction identifiers for both X86/X86_64 architectures.
+//! - \ref InstOptions - Provides generic and X86/X86_64 specific options.
//!
//! ### Register Operands
//!
@@ -73,44 +55,39 @@
//!
//! ### Memory Operands
//!
-//! - \ref x86::Mem - X86/X64 memory operand that provides support for all
-//! X86 and X64 addressing features, including absolute addresses, index
-//! scales, and segment override prefixes.
-//!
-//! ### Other
-//!
-//! - \ref x86::Features - X86/X64 CPU features on top of \ref BaseFeatures.
+//! - \ref x86::Mem - X86/X64 memory operand that provides support for all X86 and X64 addressing features
+//! including absolute addresses, index scales, and segment override prefixes.
//!
//! ### Status and Control Words
//!
-//! - \ref asmjit::x86::FpuWord::Status - FPU status word.
-//! - \ref asmjit::x86::FpuWord::Control - FPU control word.
-//!
-//! ### Predicates
-//!
-//! - \ref x86::Predicate - namespace that provides X86/X64 predicates.
-//! - \ref x86::Predicate::Cmp - `CMP[PD|PS|SD|SS]` predicate (SSE+).
-//! - \ref x86::Predicate::PCmpStr - `[V]PCMP[I|E]STR[I|M]` predicate (SSE4.1+).
-//! - \ref x86::Predicate::Round - `ROUND[PD|PS|SD|SS]` predicate (SSE+).
-//! - \ref x86::Predicate::VCmp - `VCMP[PD|PS|SD|SS]` predicate (AVX+).
-//! - \ref x86::Predicate::VFixupImm - `VFIXUPIMM[PD|PS|SD|SS]` predicate (AVX512+).
-//! - \ref x86::Predicate::VFPClass - `VFPCLASS[PD|PS|SD|SS]` predicate (AVX512+).
-//! - \ref x86::Predicate::VGetMant - `VGETMANT[PD|PS|SD|SS]` predicate (AVX512+).
-//! - \ref x86::Predicate::VPCmp - `VPCMP[U][B|W|D|Q]` predicate (AVX512+).
-//! - \ref x86::Predicate::VPCom - `VPCOM[U][B|W|D|Q]` predicate (XOP).
-//! - \ref x86::Predicate::VRange - `VRANGE[PD|PS|SD|SS]` predicate (AVX512+).
-//! - \ref x86::Predicate::VReduce - `REDUCE[PD|PS|SD|SS]` predicate (AVX512+).
-//! - \ref x86::TLog - namespace that provides `VPTERNLOG[D|Q]` predicate / operations.
+//! - \ref x86::FpuStatusWord - FPU status word bits / decomposition.
+//! - \ref x86::FpuControlWord - FPU control word bits / decomposition.
+//!
+//! ### Predicates (immediate values)
+//!
+//! - \ref x86::CmpImm - `CMP[PD|PS|SD|SS]` predicate (SSE+).
+//! - \ref x86::PCmpStrImm - `[V]PCMP[I|E]STR[I|M]` predicate (SSE4.1+, AVX+).
+//! - \ref x86::RoundImm - `[V]ROUND[PD|PS|SD|SS]` predicate (SSE+, AVX+).
+//! - \ref x86::VCmpImm - `VCMP[PD|PS|SD|SS]` predicate (AVX+).
+//! - \ref x86::VFixupImm - `VFIXUPIMM[PD|PS|SD|SS]` predicate (AVX512+).
+//! - \ref x86::VFPClassImm - `VFPCLASS[PD|PS|SD|SS]` predicate (AVX512+).
+//! - \ref x86::VGetMantImm - `VGETMANT[PD|PS|SD|SS]` predicate (AVX512+).
+//! - \ref x86::VPCmpImm - `VPCMP[U][B|W|D|Q]` predicate (AVX512+).
+//! - \ref x86::VPComImm - `VPCOM[U][B|W|D|Q]` predicate (XOP).
+//! - \ref x86::VRangeImm - `VRANGE[PD|PS|SD|SS]` predicate (AVX512+).
+//! - \ref x86::VReduceImm - `REDUCE[PD|PS|SD|SS]` predicate (AVX512+).
+//! - \ref x86::TLogImm - `VPTERNLOG[D|Q]` predicate and operations (AVX512+).
-#include "./core.h"
+#include "core.h"
-#include "./x86/x86assembler.h"
-#include "./x86/x86builder.h"
-#include "./x86/x86compiler.h"
-#include "./x86/x86emitter.h"
-#include "./x86/x86features.h"
-#include "./x86/x86globals.h"
-#include "./x86/x86instdb.h"
-#include "./x86/x86operand.h"
+#include "asmjit-scope-begin.h"
+#include "x86/x86assembler.h"
+#include "x86/x86builder.h"
+#include "x86/x86compiler.h"
+#include "x86/x86emitter.h"
+#include "x86/x86globals.h"
+#include "x86/x86instdb.h"
+#include "x86/x86operand.h"
+#include "asmjit-scope-end.h"
#endif // ASMJIT_X86_H_INCLUDED
diff --git a/3rdparty/asmjit/src/asmjit/x86/x86archdata.cpp b/3rdparty/asmjit/src/asmjit/x86/x86archdata.cpp
deleted file mode 100644
index cd928b2534b..00000000000
--- a/3rdparty/asmjit/src/asmjit/x86/x86archdata.cpp
+++ /dev/null
@@ -1,137 +0,0 @@
-// AsmJit - Machine code generation for C++
-//
-// * Official AsmJit Home Page: https://asmjit.com
-// * Official Github Repository: https://github.com/asmjit/asmjit
-//
-// Copyright (c) 2008-2020 The AsmJit Authors
-//
-// This software is provided 'as-is', without any express or implied
-// warranty. In no event will the authors be held liable for any damages
-// arising from the use of this software.
-//
-// Permission is granted to anyone to use this software for any purpose,
-// including commercial applications, and to alter it and redistribute it
-// freely, subject to the following restrictions:
-//
-// 1. The origin of this software must not be misrepresented; you must not
-// claim that you wrote the original software. If you use this software
-// in a product, an acknowledgment in the product documentation would be
-// appreciated but is not required.
-// 2. Altered source versions must be plainly marked as such, and must not be
-// misrepresented as being the original software.
-// 3. This notice may not be removed or altered from any source distribution.
-
-#include "../core/api-build_p.h"
-#ifdef ASMJIT_BUILD_X86
-
-#include "../core/support.h"
-#include "../core/type.h"
-#include "../x86/x86archdata_p.h"
-#include "../x86/x86operand.h"
-
-ASMJIT_BEGIN_SUB_NAMESPACE(x86)
-
-// ============================================================================
-// [asmjit::x86::ArchInternal]
-// ============================================================================
-
-namespace ArchInternal {
-
-Error typeIdToRegInfo(uint32_t arch, uint32_t typeId, uint32_t* typeIdOut, RegInfo* regInfoOut) noexcept {
- // Passed RegType instead of TypeId?
- if (typeId <= BaseReg::kTypeMax)
- typeId = opData.archRegs.regTypeToTypeId[typeId];
-
- if (ASMJIT_UNLIKELY(!Type::isValid(typeId)))
- return DebugUtils::errored(kErrorInvalidTypeId);
-
- // First normalize architecture dependent types.
- if (Type::isAbstract(typeId)) {
- bool is32Bit = arch == Environment::kArchX86;
- if (typeId == Type::kIdIntPtr)
- typeId = is32Bit ? Type::kIdI32 : Type::kIdI64;
- else
- typeId = is32Bit ? Type::kIdU32 : Type::kIdU64;
- }
-
- // Type size helps to construct all groups of registers.
- // TypeId is invalid if the size is zero.
- uint32_t size = Type::sizeOf(typeId);
- if (ASMJIT_UNLIKELY(!size))
- return DebugUtils::errored(kErrorInvalidTypeId);
-
- if (ASMJIT_UNLIKELY(typeId == Type::kIdF80))
- return DebugUtils::errored(kErrorInvalidUseOfF80);
-
- uint32_t regType = 0;
-
- switch (typeId) {
- case Type::kIdI8:
- case Type::kIdU8:
- regType = Reg::kTypeGpbLo;
- break;
-
- case Type::kIdI16:
- case Type::kIdU16:
- regType = Reg::kTypeGpw;
- break;
-
- case Type::kIdI32:
- case Type::kIdU32:
- regType = Reg::kTypeGpd;
- break;
-
- case Type::kIdI64:
- case Type::kIdU64:
- if (arch == Environment::kArchX86)
- return DebugUtils::errored(kErrorInvalidUseOfGpq);
-
- regType = Reg::kTypeGpq;
- break;
-
- // F32 and F64 are always promoted to use vector registers.
- case Type::kIdF32:
- typeId = Type::kIdF32x1;
- regType = Reg::kTypeXmm;
- break;
-
- case Type::kIdF64:
- typeId = Type::kIdF64x1;
- regType = Reg::kTypeXmm;
- break;
-
- // Mask registers {k}.
- case Type::kIdMask8:
- case Type::kIdMask16:
- case Type::kIdMask32:
- case Type::kIdMask64:
- regType = Reg::kTypeKReg;
- break;
-
- // MMX registers.
- case Type::kIdMmx32:
- case Type::kIdMmx64:
- regType = Reg::kTypeMm;
- break;
-
- // XMM|YMM|ZMM registers.
- default:
- if (size <= 16)
- regType = Reg::kTypeXmm;
- else if (size == 32)
- regType = Reg::kTypeYmm;
- else
- regType = Reg::kTypeZmm;
- break;
- }
-
- *typeIdOut = typeId;
- regInfoOut->reset(opData.archRegs.regInfo[regType].signature());
- return kErrorOk;
-}
-
-} // {ArchInternal}
-
-ASMJIT_END_SUB_NAMESPACE
-
-#endif // ASMJIT_BUILD_X86
diff --git a/3rdparty/asmjit/src/asmjit/x86/x86archdata_p.h b/3rdparty/asmjit/src/asmjit/x86/x86archdata_p.h
deleted file mode 100644
index e765cb9b02a..00000000000
--- a/3rdparty/asmjit/src/asmjit/x86/x86archdata_p.h
+++ /dev/null
@@ -1,51 +0,0 @@
-// AsmJit - Machine code generation for C++
-//
-// * Official AsmJit Home Page: https://asmjit.com
-// * Official Github Repository: https://github.com/asmjit/asmjit
-//
-// Copyright (c) 2008-2020 The AsmJit Authors
-//
-// This software is provided 'as-is', without any express or implied
-// warranty. In no event will the authors be held liable for any damages
-// arising from the use of this software.
-//
-// Permission is granted to anyone to use this software for any purpose,
-// including commercial applications, and to alter it and redistribute it
-// freely, subject to the following restrictions:
-//
-// 1. The origin of this software must not be misrepresented; you must not
-// claim that you wrote the original software. If you use this software
-// in a product, an acknowledgment in the product documentation would be
-// appreciated but is not required.
-// 2. Altered source versions must be plainly marked as such, and must not be
-// misrepresented as being the original software.
-// 3. This notice may not be removed or altered from any source distribution.
-
-#ifndef ASMJIT_X86_X86ARCHDATA_P_H_INCLUDED
-#define ASMJIT_X86_X86ARCHDATA_P_H_INCLUDED
-
-#include "../core/arch.h"
-
-ASMJIT_BEGIN_SUB_NAMESPACE(x86)
-
-//! \cond INTERNAL
-//! \addtogroup asmjit_x86
-//! \{
-
-// ============================================================================
-// [asmjit::x86::ArchInternal]
-// ============================================================================
-
-//! X86-specific function API (calling conventions and other utilities).
-namespace ArchInternal {
-
-Error typeIdToRegInfo(uint32_t arch, uint32_t typeId, uint32_t* typeIdOut, RegInfo* regInfoOut) noexcept;
-
-} // {ArchInternal}
-
-//! \}
-//! \endcond
-
-ASMJIT_END_SUB_NAMESPACE
-
-#endif // ASMJIT_X86_X86ARCHDATA_P_H_INCLUDED
diff --git a/3rdparty/asmjit/src/asmjit/x86/x86archtraits_p.h b/3rdparty/asmjit/src/asmjit/x86/x86archtraits_p.h
new file mode 100644
index 00000000000..90ae5d54f2b
--- /dev/null
+++ b/3rdparty/asmjit/src/asmjit/x86/x86archtraits_p.h
@@ -0,0 +1,148 @@
+// This file is part of AsmJit project <https://asmjit.com>
+//
+// See asmjit.h or LICENSE.md for license and copyright information
+// SPDX-License-Identifier: Zlib
+
+#ifndef ASMJIT_X86_X86ARCHTRAITS_P_H_INCLUDED
+#define ASMJIT_X86_X86ARCHTRAITS_P_H_INCLUDED
+
+#include "../core/archtraits.h"
+#include "../core/misc_p.h"
+#include "../x86/x86operand.h"
+
+ASMJIT_BEGIN_SUB_NAMESPACE(x86)
+
+//! \cond INTERNAL
+//! \addtogroup asmjit_x86
+//! \{
+
+//! X86 architecture traits (internal).
+static const constexpr ArchTraits x86ArchTraits = {
+ // SP/FP/LR/PC.
+ Gp::kIdSp, Gp::kIdBp, 0xFF, 0xFF,
+
+ // Reserved.
+ { 0, 0, 0 },
+
+ // HW stack alignment.
+ 1,
+
+ // Min/Max stack offset
+ 0x7FFFFFFFu, 0x7FFFFFFFu,
+
+ // ISA features [Gp, Vec, Other0, Other1].
+ {{
+ InstHints::kRegSwap | InstHints::kPushPop,
+ InstHints::kNoHints,
+ InstHints::kNoHints,
+ InstHints::kNoHints
+ }},
+
+ // Register signatures.
+ #define V(index) OperandSignature{x86::RegTraits<RegType(index)>::kSignature}
+ {{ ASMJIT_LOOKUP_TABLE_32(V, 0) }},
+ #undef V
+
+ // RegTypeToTypeId.
+ #define V(index) TypeId(x86::RegTraits<RegType(index)>::kTypeId)
+ {{ ASMJIT_LOOKUP_TABLE_32(V, 0) }},
+ #undef V
+
+ // TypeIdToRegType.
+ #define V(index) (index + uint32_t(TypeId::_kBaseStart) == uint32_t(TypeId::kInt8) ? RegType::kX86_GpbLo : \
+ index + uint32_t(TypeId::_kBaseStart) == uint32_t(TypeId::kUInt8) ? RegType::kX86_GpbLo : \
+ index + uint32_t(TypeId::_kBaseStart) == uint32_t(TypeId::kInt16) ? RegType::kX86_Gpw : \
+ index + uint32_t(TypeId::_kBaseStart) == uint32_t(TypeId::kUInt16) ? RegType::kX86_Gpw : \
+ index + uint32_t(TypeId::_kBaseStart) == uint32_t(TypeId::kInt32) ? RegType::kX86_Gpd : \
+ index + uint32_t(TypeId::_kBaseStart) == uint32_t(TypeId::kUInt32) ? RegType::kX86_Gpd : \
+ index + uint32_t(TypeId::_kBaseStart) == uint32_t(TypeId::kIntPtr) ? RegType::kX86_Gpd : \
+ index + uint32_t(TypeId::_kBaseStart) == uint32_t(TypeId::kUIntPtr) ? RegType::kX86_Gpd : \
+ index + uint32_t(TypeId::_kBaseStart) == uint32_t(TypeId::kFloat32) ? RegType::kX86_Xmm : \
+ index + uint32_t(TypeId::_kBaseStart) == uint32_t(TypeId::kFloat64) ? RegType::kX86_Xmm : \
+ index + uint32_t(TypeId::_kBaseStart) == uint32_t(TypeId::kMask8) ? RegType::kX86_KReg : \
+ index + uint32_t(TypeId::_kBaseStart) == uint32_t(TypeId::kMask16) ? RegType::kX86_KReg : \
+ index + uint32_t(TypeId::_kBaseStart) == uint32_t(TypeId::kMask32) ? RegType::kX86_KReg : \
+ index + uint32_t(TypeId::_kBaseStart) == uint32_t(TypeId::kMask64) ? RegType::kX86_KReg : \
+ index + uint32_t(TypeId::_kBaseStart) == uint32_t(TypeId::kMmx32) ? RegType::kX86_Mm : \
+ index + uint32_t(TypeId::_kBaseStart) == uint32_t(TypeId::kMmx64) ? RegType::kX86_Mm : RegType::kNone)
+ {{ ASMJIT_LOOKUP_TABLE_32(V, 0) }},
+ #undef V
+
+ // Word names of 8-bit, 16-bit, 32-bit, and 64-bit quantities.
+ {
+ ArchTypeNameId::kDB,
+ ArchTypeNameId::kDW,
+ ArchTypeNameId::kDD,
+ ArchTypeNameId::kDQ
+ }
+};
+
+//! X64 architecture traits (internal).
+static const constexpr ArchTraits x64ArchTraits = {
+ // SP/FP/LR/PC.
+ Gp::kIdSp, Gp::kIdBp, 0xFF, 0xFF,
+
+ // Reserved.
+ { 0, 0, 0 },
+
+ // HW stack alignment.
+ 1,
+
+ // Min/Max stack offset
+ 0x7FFFFFFFu, 0x7FFFFFFFu,
+
+ // ISA features [Gp, Vec, Other0, Other1].
+ {{
+ InstHints::kRegSwap | InstHints::kPushPop,
+ InstHints::kNoHints,
+ InstHints::kNoHints,
+ InstHints::kNoHints
+ }},
+
+ // Register signatures.
+ #define V(index) OperandSignature{x86::RegTraits<RegType(index)>::kSignature}
+ {{ ASMJIT_LOOKUP_TABLE_32(V, 0) }},
+ #undef V
+
+ // RegTypeToTypeId.
+ #define V(index) TypeId(x86::RegTraits<RegType(index)>::kTypeId)
+ {{ ASMJIT_LOOKUP_TABLE_32(V, 0) }},
+ #undef V
+
+ // TypeIdToRegType.
+ #define V(index) (index + uint32_t(TypeId::_kBaseStart) == uint32_t(TypeId::kInt8) ? RegType::kX86_GpbLo : \
+ index + uint32_t(TypeId::_kBaseStart) == uint32_t(TypeId::kUInt8) ? RegType::kX86_GpbLo : \
+ index + uint32_t(TypeId::_kBaseStart) == uint32_t(TypeId::kInt16) ? RegType::kX86_Gpw : \
+ index + uint32_t(TypeId::_kBaseStart) == uint32_t(TypeId::kUInt16) ? RegType::kX86_Gpw : \
+ index + uint32_t(TypeId::_kBaseStart) == uint32_t(TypeId::kInt32) ? RegType::kX86_Gpd : \
+ index + uint32_t(TypeId::_kBaseStart) == uint32_t(TypeId::kUInt32) ? RegType::kX86_Gpd : \
+ index + uint32_t(TypeId::_kBaseStart) == uint32_t(TypeId::kInt64) ? RegType::kX86_Gpq : \
+ index + uint32_t(TypeId::_kBaseStart) == uint32_t(TypeId::kUInt64) ? RegType::kX86_Gpq : \
+ index + uint32_t(TypeId::_kBaseStart) == uint32_t(TypeId::kIntPtr) ? RegType::kX86_Gpd : \
+ index + uint32_t(TypeId::_kBaseStart) == uint32_t(TypeId::kUIntPtr) ? RegType::kX86_Gpd : \
+ index + uint32_t(TypeId::_kBaseStart) == uint32_t(TypeId::kFloat32) ? RegType::kX86_Xmm : \
+ index + uint32_t(TypeId::_kBaseStart) == uint32_t(TypeId::kFloat64) ? RegType::kX86_Xmm : \
+ index + uint32_t(TypeId::_kBaseStart) == uint32_t(TypeId::kMask8) ? RegType::kX86_KReg : \
+ index + uint32_t(TypeId::_kBaseStart) == uint32_t(TypeId::kMask16) ? RegType::kX86_KReg : \
+ index + uint32_t(TypeId::_kBaseStart) == uint32_t(TypeId::kMask32) ? RegType::kX86_KReg : \
+ index + uint32_t(TypeId::_kBaseStart) == uint32_t(TypeId::kMask64) ? RegType::kX86_KReg : \
+ index + uint32_t(TypeId::_kBaseStart) == uint32_t(TypeId::kMmx32) ? RegType::kX86_Mm : \
+ index + uint32_t(TypeId::_kBaseStart) == uint32_t(TypeId::kMmx64) ? RegType::kX86_Mm : RegType::kNone)
+ {{ ASMJIT_LOOKUP_TABLE_32(V, 0) }},
+ #undef V
+
+ // Word names of 8-bit, 16-bit, 32-bit, and 64-bit quantities.
+ {
+ ArchTypeNameId::kDB,
+ ArchTypeNameId::kDW,
+ ArchTypeNameId::kDD,
+ ArchTypeNameId::kDQ
+ }
+};
+
+//! \}
+//! \endcond
+
+ASMJIT_END_SUB_NAMESPACE
+
+#endif // ASMJIT_X86_X86ARCHTRAITS_P_H_INCLUDED
diff --git a/3rdparty/asmjit/src/asmjit/x86/x86assembler.cpp b/3rdparty/asmjit/src/asmjit/x86/x86assembler.cpp
index 879fb2f0151..f11fea00238 100644
--- a/3rdparty/asmjit/src/asmjit/x86/x86assembler.cpp
+++ b/3rdparty/asmjit/src/asmjit/x86/x86assembler.cpp
@@ -1,31 +1,13 @@
-// AsmJit - Machine code generation for C++
+// This file is part of AsmJit project <https://asmjit.com>
//
-// * Official AsmJit Home Page: https://asmjit.com
-// * Official Github Repository: https://github.com/asmjit/asmjit
-//
-// Copyright (c) 2008-2020 The AsmJit Authors
-//
-// This software is provided 'as-is', without any express or implied
-// warranty. In no event will the authors be held liable for any damages
-// arising from the use of this software.
-//
-// Permission is granted to anyone to use this software for any purpose,
-// including commercial applications, and to alter it and redistribute it
-// freely, subject to the following restrictions:
-//
-// 1. The origin of this software must not be misrepresented; you must not
-// claim that you wrote the original software. If you use this software
-// in a product, an acknowledgment in the product documentation would be
-// appreciated but is not required.
-// 2. Altered source versions must be plainly marked as such, and must not be
-// misrepresented as being the original software.
-// 3. This notice may not be removed or altered from any source distribution.
+// See asmjit.h or LICENSE.md for license and copyright information
+// SPDX-License-Identifier: Zlib
#include "../core/api-build_p.h"
-#ifdef ASMJIT_BUILD_X86
+#if !defined(ASMJIT_NO_X86)
#include "../core/assembler.h"
-#include "../core/codebufferwriter_p.h"
+#include "../core/codewriter_p.h"
#include "../core/cpuinfo.h"
#include "../core/emitterutils_p.h"
#include "../core/formatter.h"
@@ -33,21 +15,18 @@
#include "../core/misc_p.h"
#include "../core/support.h"
#include "../x86/x86assembler.h"
+#include "../x86/x86emithelper_p.h"
+#include "../x86/x86instapi_p.h"
#include "../x86/x86instdb_p.h"
#include "../x86/x86formatter_p.h"
#include "../x86/x86opcode_p.h"
ASMJIT_BEGIN_SUB_NAMESPACE(x86)
-// ============================================================================
-// [TypeDefs]
-// ============================================================================
-
typedef Support::FastUInt8 FastUInt8;
-// ============================================================================
-// [Constants]
-// ============================================================================
+// x86::Assembler - Constants
+// ==========================
//! X86 bytes used to encode important prefixes.
enum X86Byte : uint32_t {
@@ -78,13 +57,13 @@ enum X86Byte : uint32_t {
//! 4-byte EVEX prefix:
//! - `[0]` - `0x62`.
- //! - `[1]` - Payload0 or `P[ 7: 0]` - `[R X B R' 0 0 m m]`.
+ //! - `[1]` - Payload0 or `P[ 7: 0]` - `[R X B R' 0 m m m]`.
//! - `[2]` - Payload1 or `P[15: 8]` - `[W v v v v 1 p p]`.
//! - `[3]` - Payload2 or `P[23:16]` - `[z L' L b V' a a a]`.
//!
//! Payload:
- //! - `P[ 1: 0]` - OPCODE: EVEX.mmmmm, only lowest 2 bits [1:0] used.
- //! - `P[ 3: 2]` - ______: Must be 0.
+ //! - `P[ 2: 0]` - OPCODE: EVEX.mmmmm, only lowest 3 bits [2:0] used.
+ //! - `P[ 3]` - ______: Must be 0.
//! - `P[ 4]` - REG-ID: EVEX.R' - 5th bit of 'RRRRR'.
//! - `P[ 5]` - REG-ID: EVEX.B - 4th bit of 'BBBBB'.
//! - `P[ 6]` - REG-ID: EVEX.X - 5th bit of 'BBBBB' or 4th bit of 'XXXX' (with SIB).
@@ -166,15 +145,13 @@ static const uint32_t x86OpcodePopSReg[8] = {
Opcode::k000F00 | 0xA9 // Pop GS.
};
-// ============================================================================
-// [asmjit::X86MemInfo | X86VEXPrefix | X86LLByRegType | X86CDisp8Table]
+// x86::Assembler - X86MemInfo | X86VEXPrefix | X86LLByRegType | X86CDisp8Table
// ============================================================================
//! Memory operand's info bits.
//!
-//! A lookup table that contains various information based on the BASE and INDEX
-//! information of a memory operand. This is much better and safer than playing
-//! with IFs in the code and can check for errors must faster and better.
+//! A lookup table that contains various information based on the BASE and INDEX information of a memory operand. This
+//! is much better and safer than playing with IFs in the code and can check for errors must faster and better.
enum X86MemInfo_Enum {
kX86MemInfo_0 = 0x00,
@@ -191,79 +168,72 @@ enum X86MemInfo_Enum {
template<uint32_t X>
struct X86MemInfo_T {
- enum {
+ enum : uint32_t {
B = (X ) & 0x1F,
I = (X >> 5) & 0x1F,
- kBase = (B >= Reg::kTypeGpw && B <= Reg::kTypeGpq ) ? kX86MemInfo_BaseGp :
- (B == Reg::kTypeRip ) ? kX86MemInfo_BaseRip :
- (B == Label::kLabelTag ) ? kX86MemInfo_BaseLabel : 0,
-
- kIndex = (I >= Reg::kTypeGpw && I <= Reg::kTypeGpq ) ? kX86MemInfo_Index :
- (I >= Reg::kTypeXmm && I <= Reg::kTypeZmm ) ? kX86MemInfo_Index : 0,
-
- k67H = (B == Reg::kTypeGpw && I == Reg::kTypeNone) ? kX86MemInfo_67H_X86 :
- (B == Reg::kTypeGpd && I == Reg::kTypeNone) ? kX86MemInfo_67H_X64 :
- (B == Reg::kTypeNone && I == Reg::kTypeGpw ) ? kX86MemInfo_67H_X86 :
- (B == Reg::kTypeNone && I == Reg::kTypeGpd ) ? kX86MemInfo_67H_X64 :
- (B == Reg::kTypeGpw && I == Reg::kTypeGpw ) ? kX86MemInfo_67H_X86 :
- (B == Reg::kTypeGpd && I == Reg::kTypeGpd ) ? kX86MemInfo_67H_X64 :
- (B == Reg::kTypeGpw && I == Reg::kTypeXmm ) ? kX86MemInfo_67H_X86 :
- (B == Reg::kTypeGpd && I == Reg::kTypeXmm ) ? kX86MemInfo_67H_X64 :
- (B == Reg::kTypeGpw && I == Reg::kTypeYmm ) ? kX86MemInfo_67H_X86 :
- (B == Reg::kTypeGpd && I == Reg::kTypeYmm ) ? kX86MemInfo_67H_X64 :
- (B == Reg::kTypeGpw && I == Reg::kTypeZmm ) ? kX86MemInfo_67H_X86 :
- (B == Reg::kTypeGpd && I == Reg::kTypeZmm ) ? kX86MemInfo_67H_X64 :
- (B == Label::kLabelTag && I == Reg::kTypeGpw ) ? kX86MemInfo_67H_X86 :
- (B == Label::kLabelTag && I == Reg::kTypeGpd ) ? kX86MemInfo_67H_X64 : 0,
+ kBase = (B >= uint32_t(RegType::kX86_Gpw) && B <= uint32_t(RegType::kX86_Gpq)) ? kX86MemInfo_BaseGp :
+ (B == uint32_t(RegType::kX86_Rip) ) ? kX86MemInfo_BaseRip :
+ (B == uint32_t(RegType::kLabelTag) ) ? kX86MemInfo_BaseLabel : 0,
+
+ kIndex = (I >= uint32_t(RegType::kX86_Gpw) && I <= uint32_t(RegType::kX86_Gpq)) ? kX86MemInfo_Index :
+ (I >= uint32_t(RegType::kX86_Xmm) && I <= uint32_t(RegType::kX86_Zmm)) ? kX86MemInfo_Index : 0,
+
+ k67H = (B == uint32_t(RegType::kX86_Gpw) && I == uint32_t(RegType::kNone) ) ? kX86MemInfo_67H_X86 :
+ (B == uint32_t(RegType::kX86_Gpd) && I == uint32_t(RegType::kNone) ) ? kX86MemInfo_67H_X64 :
+ (B == uint32_t(RegType::kNone) && I == uint32_t(RegType::kX86_Gpw)) ? kX86MemInfo_67H_X86 :
+ (B == uint32_t(RegType::kNone) && I == uint32_t(RegType::kX86_Gpd)) ? kX86MemInfo_67H_X64 :
+ (B == uint32_t(RegType::kX86_Gpw) && I == uint32_t(RegType::kX86_Gpw)) ? kX86MemInfo_67H_X86 :
+ (B == uint32_t(RegType::kX86_Gpd) && I == uint32_t(RegType::kX86_Gpd)) ? kX86MemInfo_67H_X64 :
+ (B == uint32_t(RegType::kX86_Gpw) && I == uint32_t(RegType::kX86_Xmm)) ? kX86MemInfo_67H_X86 :
+ (B == uint32_t(RegType::kX86_Gpd) && I == uint32_t(RegType::kX86_Xmm)) ? kX86MemInfo_67H_X64 :
+ (B == uint32_t(RegType::kX86_Gpw) && I == uint32_t(RegType::kX86_Ymm)) ? kX86MemInfo_67H_X86 :
+ (B == uint32_t(RegType::kX86_Gpd) && I == uint32_t(RegType::kX86_Ymm)) ? kX86MemInfo_67H_X64 :
+ (B == uint32_t(RegType::kX86_Gpw) && I == uint32_t(RegType::kX86_Zmm)) ? kX86MemInfo_67H_X86 :
+ (B == uint32_t(RegType::kX86_Gpd) && I == uint32_t(RegType::kX86_Zmm)) ? kX86MemInfo_67H_X64 :
+ (B == uint32_t(RegType::kLabelTag) && I == uint32_t(RegType::kX86_Gpw)) ? kX86MemInfo_67H_X86 :
+ (B == uint32_t(RegType::kLabelTag) && I == uint32_t(RegType::kX86_Gpd)) ? kX86MemInfo_67H_X64 : 0,
kValue = kBase | kIndex | k67H | 0x04 | 0x08
};
};
// The result stored in the LUT is a combination of
-// - 67H - Address override prefix - depends on BASE+INDEX register types and
-// the target architecture.
-// - REX - A possible combination of REX.[B|X|R|W] bits in REX prefix where
-// REX.B and REX.X are possibly masked out, but REX.R and REX.W are
-// kept as is.
-#define VALUE(X) X86MemInfo_T<X>::kValue
+// - 67H - Address override prefix - depends on BASE+INDEX register types and the target architecture.
+// - REX - A possible combination of REX.[B|X|R|W] bits in REX prefix where REX.B and REX.X are possibly
+// masked out, but REX.R and REX.W are kept as is.
+#define VALUE(x) X86MemInfo_T<x>::kValue
static const uint8_t x86MemInfo[] = { ASMJIT_LOOKUP_TABLE_1024(VALUE, 0) };
#undef VALUE
-// VEX3 or XOP xor bits applied to the opcode before emitted. The index to this
-// table is 'mmmmm' value, which contains all we need. This is only used by a
-// 3 BYTE VEX and XOP prefixes, 2 BYTE VEX prefix is handled differently. The
-// idea is to minimize the difference between VEX3 vs XOP when encoding VEX
-// or XOP instruction. This should minimize the code required to emit such
-// instructions and should also make it faster as we don't need any branch to
+// VEX3 or XOP xor bits applied to the opcode before emitted. The index to this table is 'mmmmm' value, which
+// contains all we need. This is only used by a 3 BYTE VEX and XOP prefixes, 2 BYTE VEX prefix is handled differently.
+// The idea is to minimize the difference between VEX3 vs XOP when encoding VEX or XOP instruction. This should
+// minimize the code required to emit such instructions and should also make it faster as we don't need any branch to
// decide between VEX3 vs XOP.
// ____ ___
// [_OPCODE_|WvvvvLpp|RXBmmmmm|VEX3_XOP]
-#define VALUE(X) ((X & 0x08) ? kX86ByteXop3 : kX86ByteVex3) | (0xF << 19) | (0x7 << 13)
+#define VALUE(x) ((x & 0x08) ? kX86ByteXop3 : kX86ByteVex3) | (0xF << 19) | (0x7 << 13)
static const uint32_t x86VEXPrefix[] = { ASMJIT_LOOKUP_TABLE_16(VALUE, 0) };
#undef VALUE
-// Table that contains LL opcode field addressed by a register size / 16. It's
-// used to propagate L.256 or L.512 when YMM or ZMM registers are used,
-// respectively.
-#define VALUE(X) (X & (64 >> 4)) ? Opcode::kLL_2 : \
- (X & (32 >> 4)) ? Opcode::kLL_1 : Opcode::kLL_0
+// Table that contains LL opcode field addressed by a register size / 16. It's used to propagate L.256 or L.512 when
+// YMM or ZMM registers are used, respectively.
+#define VALUE(x) (x & (64 >> 4)) ? Opcode::kLL_2 : \
+ (x & (32 >> 4)) ? Opcode::kLL_1 : Opcode::kLL_0
static const uint32_t x86LLBySizeDiv16[] = { ASMJIT_LOOKUP_TABLE_16(VALUE, 0) };
#undef VALUE
-// Table that contains LL opcode field addressed by a register size / 16. It's
-// used to propagate L.256 or L.512 when YMM or ZMM registers are used,
-// respectively.
-#define VALUE(X) X == Reg::kTypeZmm ? Opcode::kLL_2 : \
- X == Reg::kTypeYmm ? Opcode::kLL_1 : Opcode::kLL_0
+// Table that contains LL opcode field addressed by a register size / 16. It's used to propagate L.256 or L.512 when
+// YMM or ZMM registers are used, respectively.
+#define VALUE(x) x == uint32_t(RegType::kX86_Zmm) ? Opcode::kLL_2 : \
+ x == uint32_t(RegType::kX86_Ymm) ? Opcode::kLL_1 : Opcode::kLL_0
static const uint32_t x86LLByRegType[] = { ASMJIT_LOOKUP_TABLE_16(VALUE, 0) };
#undef VALUE
-// Table that contains a scale (shift left) based on 'TTWLL' field and
-// the instruction's tuple-type (TT) field. The scale is then applied to
-// the BASE-N stored in each opcode to calculate the final compressed
-// displacement used by all EVEX encoded instructions.
+// Table that contains a scale (shift left) based on 'TTWLL' field and the instruction's tuple-type (TT) field. The
+// scale is then applied to the BASE-N stored in each opcode to calculate the final compressed displacement used by
+// all EVEX encoded instructions.
template<uint32_t X>
struct X86CDisp8SHL_T {
enum {
@@ -278,7 +248,7 @@ struct X86CDisp8SHL_T {
};
};
-#define VALUE(X) X86CDisp8SHL_T<X>::kValue
+#define VALUE(x) X86CDisp8SHL_T<x>::kValue
static const uint32_t x86CDisp8SHL[] = { ASMJIT_LOOKUP_TABLE_32(VALUE, 0) };
#undef VALUE
@@ -310,37 +280,36 @@ struct X86Mod16BaseIndexTable_T {
};
};
-#define VALUE(X) X86Mod16BaseIndexTable_T<X>::kValue
+#define VALUE(x) X86Mod16BaseIndexTable_T<x>::kValue
static const uint8_t x86Mod16BaseIndexTable[] = { ASMJIT_LOOKUP_TABLE_64(VALUE, 0) };
#undef VALUE
-// ============================================================================
-// [asmjit::x86::Assembler - Helpers]
-// ============================================================================
+// x86::Assembler - Helpers
+// ========================
-static ASMJIT_INLINE bool x86IsJmpOrCall(uint32_t instId) noexcept {
+static ASMJIT_FORCE_INLINE bool x86IsJmpOrCall(InstId instId) noexcept {
return instId == Inst::kIdJmp || instId == Inst::kIdCall;
}
-static ASMJIT_INLINE bool x86IsImplicitMem(const Operand_& op, uint32_t base) noexcept {
+static ASMJIT_FORCE_INLINE bool x86IsImplicitMem(const Operand_& op, uint32_t base) noexcept {
return op.isMem() && op.as<Mem>().baseId() == base && !op.as<Mem>().hasOffset();
}
//! Combine `regId` and `vvvvvId` into a single value (used by AVX and AVX-512).
-static ASMJIT_INLINE uint32_t x86PackRegAndVvvvv(uint32_t regId, uint32_t vvvvvId) noexcept {
+static ASMJIT_FORCE_INLINE uint32_t x86PackRegAndVvvvv(uint32_t regId, uint32_t vvvvvId) noexcept {
return regId + (vvvvvId << kVexVVVVVShift);
}
-static ASMJIT_INLINE uint32_t x86OpcodeLByVMem(const Operand_& op) noexcept {
- return x86LLByRegType[op.as<Mem>().indexType()];
+static ASMJIT_FORCE_INLINE uint32_t x86OpcodeLByVMem(const Operand_& op) noexcept {
+ return x86LLByRegType[size_t(op.as<Mem>().indexType())];
}
-static ASMJIT_INLINE uint32_t x86OpcodeLBySize(uint32_t size) noexcept {
+static ASMJIT_FORCE_INLINE uint32_t x86OpcodeLBySize(uint32_t size) noexcept {
return x86LLBySizeDiv16[size / 16];
}
//! Encode MOD byte.
-static ASMJIT_INLINE uint32_t x86EncodeMod(uint32_t m, uint32_t o, uint32_t rm) noexcept {
+static ASMJIT_FORCE_INLINE uint32_t x86EncodeMod(uint32_t m, uint32_t o, uint32_t rm) noexcept {
ASMJIT_ASSERT(m <= 3);
ASMJIT_ASSERT(o <= 7);
ASMJIT_ASSERT(rm <= 7);
@@ -348,14 +317,14 @@ static ASMJIT_INLINE uint32_t x86EncodeMod(uint32_t m, uint32_t o, uint32_t rm)
}
//! Encode SIB byte.
-static ASMJIT_INLINE uint32_t x86EncodeSib(uint32_t s, uint32_t i, uint32_t b) noexcept {
+static ASMJIT_FORCE_INLINE uint32_t x86EncodeSib(uint32_t s, uint32_t i, uint32_t b) noexcept {
ASMJIT_ASSERT(s <= 3);
ASMJIT_ASSERT(i <= 7);
ASMJIT_ASSERT(b <= 7);
return (s << 6) + (i << 3) + b;
}
-static ASMJIT_INLINE bool x86IsRexInvalid(uint32_t rex) noexcept {
+static ASMJIT_FORCE_INLINE bool x86IsRexInvalid(uint32_t rex) noexcept {
// Validates the following possibilities:
// REX == 0x00 -> OKAY (X86_32 / X86_64).
// REX == 0x40-0x4F -> OKAY (X86_64).
@@ -364,29 +333,33 @@ static ASMJIT_INLINE bool x86IsRexInvalid(uint32_t rex) noexcept {
return rex > kX86ByteInvalidRex;
}
+static ASMJIT_FORCE_INLINE uint32_t x86GetForceEvex3MaskInLastBit(InstOptions options) noexcept {
+ constexpr uint32_t kVex3Bit = Support::ConstCTZ<uint32_t(InstOptions::kX86_Vex3)>::value;
+ return uint32_t(options & InstOptions::kX86_Vex3) << (31 - kVex3Bit);
+}
+
template<typename T>
-static constexpr T x86SignExtendI32(T imm) noexcept { return T(int64_t(int32_t(imm & T(0xFFFFFFFF)))); }
+static ASMJIT_FORCE_INLINE constexpr T x86SignExtendI32(T imm) noexcept { return T(int64_t(int32_t(imm & T(0xFFFFFFFF)))); }
-static ASMJIT_INLINE uint32_t x86AltOpcodeOf(const InstDB::InstInfo* info) noexcept {
+static ASMJIT_FORCE_INLINE uint32_t x86AltOpcodeOf(const InstDB::InstInfo* info) noexcept {
return InstDB::_altOpcodeTable[info->_altOpcodeIndex];
}
-// ============================================================================
-// [asmjit::X86BufferWriter]
-// ============================================================================
+// x86::Assembler - X86BufferWriter
+// ================================
-class X86BufferWriter : public CodeBufferWriter {
+class X86BufferWriter : public CodeWriter {
public:
- ASMJIT_INLINE explicit X86BufferWriter(Assembler* a) noexcept
- : CodeBufferWriter(a) {}
+ ASMJIT_FORCE_INLINE explicit X86BufferWriter(Assembler* a) noexcept
+ : CodeWriter(a) {}
- ASMJIT_INLINE void emitPP(uint32_t opcode) noexcept {
+ ASMJIT_FORCE_INLINE void emitPP(uint32_t opcode) noexcept {
uint32_t ppIndex = (opcode >> Opcode::kPP_Shift) &
(Opcode::kPP_FPUMask >> Opcode::kPP_Shift) ;
emit8If(x86OpcodePP[ppIndex], ppIndex != 0);
}
- ASMJIT_INLINE void emitMMAndOpcode(uint32_t opcode) noexcept {
+ ASMJIT_FORCE_INLINE void emitMMAndOpcode(uint32_t opcode) noexcept {
uint32_t mmIndex = (opcode & Opcode::kMM_Mask) >> Opcode::kMM_Shift;
const X86OpcodeMM& mmCode = x86OpcodeMM[mmIndex];
@@ -395,7 +368,7 @@ public:
emit8(opcode);
}
- ASMJIT_INLINE void emitSegmentOverride(uint32_t segmentId) noexcept {
+ ASMJIT_FORCE_INLINE void emitSegmentOverride(uint32_t segmentId) noexcept {
ASMJIT_ASSERT(segmentId < ASMJIT_ARRAY_SIZE(x86SegmentPrefix));
FastUInt8 prefix = x86SegmentPrefix[segmentId];
@@ -403,11 +376,11 @@ public:
}
template<typename CondT>
- ASMJIT_INLINE void emitAddressOverride(CondT condition) noexcept {
+ ASMJIT_FORCE_INLINE void emitAddressOverride(CondT condition) noexcept {
emit8If(0x67, condition);
}
- ASMJIT_INLINE void emitImmByteOrDWord(uint64_t immValue, FastUInt8 immSize) noexcept {
+ ASMJIT_FORCE_INLINE void emitImmByteOrDWord(uint64_t immValue, FastUInt8 immSize) noexcept {
if (!immSize)
return;
@@ -431,41 +404,41 @@ public:
emit8(imm & 0xFFu);
}
- ASMJIT_INLINE void emitImmediate(uint64_t immValue, FastUInt8 immSize) noexcept {
- if (!immSize)
- return;
-
+ ASMJIT_FORCE_INLINE void emitImmediate(uint64_t immValue, FastUInt8 immSize) noexcept {
#if ASMJIT_ARCH_BITS >= 64
- uint64_t imm = uint64_t(immValue);
+ uint64_t imm = immValue;
+ if (immSize >= 4) {
+ emit32uLE(imm & 0xFFFFFFFFu);
+ imm >>= 32;
+ immSize = FastUInt8(immSize - 4u);
+ }
#else
uint32_t imm = uint32_t(immValue & 0xFFFFFFFFu);
+ if (immSize >= 4) {
+ emit32uLE(imm);
+ imm = uint32_t(immValue >> 32);
+ immSize = FastUInt8(immSize - 4u);
+ }
#endif
- // Many instructions just use a single byte immediate, so make it fast.
+ if (!immSize)
+ return;
emit8(imm & 0xFFu);
- if (--immSize == 0) return;
-
imm >>= 8;
- emit8(imm & 0xFFu);
- if (--immSize == 0) return;
- imm >>= 8;
+ if (--immSize == 0)
+ return;
emit8(imm & 0xFFu);
- if (--immSize == 0) return;
-
imm >>= 8;
- emit8(imm & 0xFFu);
- if (--immSize == 0) return;
-
- // Can be 1, 2, 4 or 8 bytes, this handles the remaining high DWORD of an 8-byte immediate.
- ASMJIT_ASSERT(immSize == 4);
-#if ASMJIT_ARCH_BITS >= 64
+ if (--immSize == 0)
+ return;
+ emit8(imm & 0xFFu);
imm >>= 8;
- emit32uLE(uint32_t(imm));
-#else
- emit32uLE(uint32_t((uint64_t(immValue) >> 32) & 0xFFFFFFFFu));
-#endif
+
+ if (--immSize == 0)
+ return;
+ emit8(imm & 0xFFu);
}
};
@@ -474,97 +447,115 @@ public:
// If the operand is AH|BH|CH|DH
// - patch its index from 0..3 to 4..7 as encoded by X86.
// - Disallow REX prefix.
-#define FIXUP_GPB(REG_OP, REG_ID) \
- do { \
- if (!static_cast<const Gp&>(REG_OP).isGpbHi()) { \
- options |= (REG_ID >= 4) ? uint32_t(Inst::kOptionRex) \
- : uint32_t(0); \
- } \
- else { \
- options |= Inst::_kOptionInvalidRex; \
- REG_ID += 4; \
- } \
+#define FIXUP_GPB(REG_OP, REG_ID) \
+ do { \
+ if (!static_cast<const Gp&>(REG_OP).isGpbHi()) { \
+ options |= (REG_ID) >= 4 ? InstOptions::kX86_Rex \
+ : InstOptions::kNone; \
+ } \
+ else { \
+ options |= InstOptions::kX86_InvalidRex; \
+ REG_ID += 4; \
+ } \
} while (0)
-#define ENC_OPS1(OP0) ((Operand::kOp##OP0))
-#define ENC_OPS2(OP0, OP1) ((Operand::kOp##OP0) + ((Operand::kOp##OP1) << 3))
-#define ENC_OPS3(OP0, OP1, OP2) ((Operand::kOp##OP0) + ((Operand::kOp##OP1) << 3) + ((Operand::kOp##OP2) << 6))
-#define ENC_OPS4(OP0, OP1, OP2, OP3) ((Operand::kOp##OP0) + ((Operand::kOp##OP1) << 3) + ((Operand::kOp##OP2) << 6) + ((Operand::kOp##OP3) << 9))
+#define ENC_OPS1(OP0) \
+ (uint32_t(OperandType::k##OP0))
-// ============================================================================
-// [asmjit::x86::Assembler - Movabs Heuristics]
-// ============================================================================
+#define ENC_OPS2(OP0, OP1) \
+ (uint32_t(OperandType::k##OP0) + \
+ (uint32_t(OperandType::k##OP1) << 3))
+
+#define ENC_OPS3(OP0, OP1, OP2) \
+ (uint32_t(OperandType::k##OP0) + \
+ (uint32_t(OperandType::k##OP1) << 3) + \
+ (uint32_t(OperandType::k##OP2) << 6))
-static ASMJIT_INLINE bool x86GetMovAbsInstSize64Bit(uint32_t regSize, uint32_t options, const Mem& rmRel) noexcept {
+#define ENC_OPS4(OP0, OP1, OP2, OP3) \
+ (uint32_t(OperandType::k##OP0) + \
+ (uint32_t(OperandType::k##OP1) << 3) + \
+ (uint32_t(OperandType::k##OP2) << 6) + \
+ (uint32_t(OperandType::k##OP3) << 9))
+
+// x86::Assembler - Movabs Heuristics
+// ==================================
+
+static ASMJIT_FORCE_INLINE uint32_t x86GetMovAbsInstSize64Bit(uint32_t regSize, InstOptions options, const Mem& rmRel) noexcept {
uint32_t segmentPrefixSize = rmRel.segmentId() != 0;
uint32_t _66hPrefixSize = regSize == 2;
- uint32_t rexPrefixSize = (regSize == 8) || ((options & Inst::kOptionRex) != 0);
+ uint32_t rexPrefixSize = regSize == 8 || Support::test(options, InstOptions::kX86_Rex);
uint32_t opCodeByteSize = 1;
uint32_t immediateSize = 8;
return segmentPrefixSize + _66hPrefixSize + rexPrefixSize + opCodeByteSize + immediateSize;
}
-static ASMJIT_INLINE uint32_t x86GetMovAbsAddrType(Assembler* self, X86BufferWriter& writer, uint32_t regSize, uint32_t options, const Mem& rmRel) noexcept {
- uint32_t addrType = rmRel.addrType();
- int64_t addrValue = rmRel.offset();
-
- if (addrType == BaseMem::kAddrTypeDefault && !(options & Inst::kOptionModMR)) {
- if (self->is64Bit()) {
- uint64_t baseAddress = self->code()->baseAddress();
- if (baseAddress != Globals::kNoBaseAddress && !rmRel.hasSegment()) {
- uint32_t instructionSize = x86GetMovAbsInstSize64Bit(regSize, options, rmRel);
- uint64_t virtualOffset = uint64_t(writer.offsetFrom(self->_bufferData));
- uint64_t rip64 = baseAddress + self->_section->offset() + virtualOffset + instructionSize;
- uint64_t rel64 = uint64_t(addrValue) - rip64;
-
- if (!Support::isInt32(int64_t(rel64)))
- addrType = BaseMem::kAddrTypeAbs;
- }
- else {
- if (!Support::isInt32(addrValue))
- addrType = BaseMem::kAddrTypeAbs;
- }
+static ASMJIT_FORCE_INLINE bool x86ShouldUseMovabs(Assembler* self, X86BufferWriter& writer, uint32_t regSize, InstOptions options, const Mem& rmRel) noexcept {
+ if (self->is32Bit()) {
+ // There is no relative addressing, just decide whether to use MOV encoded with MOD R/M or absolute.
+ return !Support::test(options, InstOptions::kX86_ModMR | InstOptions::kX86_ModMR);
+ }
+ else {
+ // If the addressing type is REL or MOD R/M was specified then absolute mov won't be used.
+ if (rmRel.addrType() == Mem::AddrType::kRel || Support::test(options, InstOptions::kX86_ModMR))
+ return false;
+
+ int64_t addrValue = rmRel.offset();
+ uint64_t baseAddress = self->code()->baseAddress();
+
+ // If the address type is default, it means to basically check whether relative addressing is possible. However,
+ // this is only possible when the base address is known - relative encoding uses RIP+N it has to be calculated.
+ if (rmRel.addrType() == Mem::AddrType::kDefault && baseAddress != Globals::kNoBaseAddress && !rmRel.hasSegment()) {
+ uint32_t instructionSize = x86GetMovAbsInstSize64Bit(regSize, options, rmRel);
+ uint64_t virtualOffset = uint64_t(writer.offsetFrom(self->_bufferData));
+ uint64_t rip64 = baseAddress + self->_section->offset() + virtualOffset + instructionSize;
+ uint64_t rel64 = uint64_t(addrValue) - rip64;
+
+ if (Support::isInt32(int64_t(rel64)))
+ return false;
}
else {
- addrType = BaseMem::kAddrTypeAbs;
+ if (Support::isInt32(addrValue))
+ return false;
}
- }
- return addrType;
+ return uint64_t(addrValue) > 0xFFFFFFFFu;
+ }
}
-// ============================================================================
-// [asmjit::x86::Assembler - Construction / Destruction]
-// ============================================================================
+// x86::Assembler - Construction & Destruction
+// ===========================================
Assembler::Assembler(CodeHolder* code) noexcept : BaseAssembler() {
+ _archMask = (uint64_t(1) << uint32_t(Arch::kX86)) |
+ (uint64_t(1) << uint32_t(Arch::kX64)) ;
+ assignEmitterFuncs(this);
+
if (code)
code->attach(this);
}
Assembler::~Assembler() noexcept {}
-// ============================================================================
-// [asmjit::x86::Assembler - Emit (Low-Level)]
-// ============================================================================
+// x86::Assembler - Emit (Low-Level)
+// =================================
-ASMJIT_FAVOR_SPEED Error Assembler::_emit(uint32_t instId, const Operand_& o0, const Operand_& o1, const Operand_& o2, const Operand_* opExt) {
+ASMJIT_FAVOR_SPEED Error Assembler::_emit(InstId instId, const Operand_& o0, const Operand_& o1, const Operand_& o2, const Operand_* opExt) {
constexpr uint32_t kVSHR_W = Opcode::kW_Shift - 23;
constexpr uint32_t kVSHR_PP = Opcode::kPP_Shift - 16;
constexpr uint32_t kVSHR_PP_EW = Opcode::kPP_Shift - 16;
- constexpr uint32_t kRequiresSpecialHandling =
- uint32_t(Inst::kOptionReserved) | // Logging/Validation/Error.
- uint32_t(Inst::kOptionRep ) | // REP/REPE prefix.
- uint32_t(Inst::kOptionRepne ) | // REPNE prefix.
- uint32_t(Inst::kOptionLock ) | // LOCK prefix.
- uint32_t(Inst::kOptionXAcquire) | // XACQUIRE prefix.
- uint32_t(Inst::kOptionXRelease) ; // XRELEASE prefix.
+ constexpr InstOptions kRequiresSpecialHandling =
+ InstOptions::kReserved | // Logging/Validation/Error.
+ InstOptions::kX86_Rep | // REP/REPE prefix.
+ InstOptions::kX86_Repne | // REPNE prefix.
+ InstOptions::kX86_Lock | // LOCK prefix.
+ InstOptions::kX86_XAcquire | // XACQUIRE prefix.
+ InstOptions::kX86_XRelease ; // XRELEASE prefix.
Error err;
Opcode opcode; // Instruction opcode.
- uint32_t options; // Instruction options.
+ InstOptions options; // Instruction options.
uint32_t isign3; // A combined signature of first 3 operands.
const Operand_* rmRel; // Memory operand or operand that holds Label|Imm.
@@ -591,17 +582,16 @@ ASMJIT_FAVOR_SPEED Error Assembler::_emit(uint32_t instId, const Operand_& o0, c
const InstDB::CommonInfo* commonInfo = &instInfo->commonInfo();
// Signature of the first 3 operands.
- isign3 = o0.opType() + (o1.opType() << 3) + (o2.opType() << 6);
+ isign3 = (uint32_t(o0.opType()) ) +
+ (uint32_t(o1.opType()) << 3) +
+ (uint32_t(o2.opType()) << 6);
- // Combine all instruction options and also check whether the instruction
- // is valid. All options that require special handling (including invalid
- // instruction) are handled by the next branch.
- options = uint32_t(instId == 0);
- options |= uint32_t((size_t)(_bufferEnd - writer.cursor()) < 16);
- options |= uint32_t(instOptions() | forcedInstOptions());
+ // Combine all instruction options and also check whether the instruction is valid. All options
+ // that require special handling (including invalid instruction) are handled by the next branch.
+ options = InstOptions((instId == 0) | ((size_t)(_bufferEnd - writer.cursor()) < 16)) | instOptions() | forcedInstOptions();
// Handle failure and rare cases first.
- if (ASMJIT_UNLIKELY(options & kRequiresSpecialHandling)) {
+ if (ASMJIT_UNLIKELY(Support::test(options, kRequiresSpecialHandling))) {
if (ASMJIT_UNLIKELY(!_code))
return reportError(DebugUtils::errored(kErrorNotInitialized));
@@ -616,87 +606,93 @@ ASMJIT_FAVOR_SPEED Error Assembler::_emit(uint32_t instId, const Operand_& o0, c
#ifndef ASMJIT_NO_VALIDATION
// Strict validation.
- if (hasValidationOption(kValidationOptionAssembler)) {
+ if (hasDiagnosticOption(DiagnosticOptions::kValidateAssembler)) {
Operand_ opArray[Globals::kMaxOpCount];
EmitterUtils::opArrayFromEmitArgs(opArray, o0, o1, o2, opExt);
- err = InstAPI::validate(arch(), BaseInst(instId, options, _extraReg), opArray, Globals::kMaxOpCount);
+ err = _funcs.validate(arch(), BaseInst(instId, options, _extraReg), opArray, Globals::kMaxOpCount, ValidationFlags::kNone);
if (ASMJIT_UNLIKELY(err))
goto Failed;
}
#endif
- uint32_t iFlags = instInfo->flags();
+ InstDB::InstFlags iFlags = instInfo->flags();
// LOCK, XACQUIRE, and XRELEASE prefixes.
- if (options & Inst::kOptionLock) {
- bool xAcqRel = (options & (Inst::kOptionXAcquire | Inst::kOptionXRelease)) != 0;
+ if (Support::test(options, InstOptions::kX86_Lock)) {
+ bool xAcqRel = Support::test(options, InstOptions::kX86_XAcquire | InstOptions::kX86_XRelease);
- if (ASMJIT_UNLIKELY(!(iFlags & (InstDB::kFlagLock)) && !xAcqRel))
+ if (ASMJIT_UNLIKELY(!Support::test(iFlags, InstDB::InstFlags::kLock) && !xAcqRel))
goto InvalidLockPrefix;
if (xAcqRel) {
- if (ASMJIT_UNLIKELY((options & Inst::kOptionXAcquire) && !(iFlags & InstDB::kFlagXAcquire)))
+ if (ASMJIT_UNLIKELY(Support::test(options, InstOptions::kX86_XAcquire) && !Support::test(iFlags, InstDB::InstFlags::kXAcquire)))
goto InvalidXAcquirePrefix;
- if (ASMJIT_UNLIKELY((options & Inst::kOptionXRelease) && !(iFlags & InstDB::kFlagXRelease)))
+ if (ASMJIT_UNLIKELY(Support::test(options, InstOptions::kX86_XRelease) && !Support::test(iFlags, InstDB::InstFlags::kXRelease)))
goto InvalidXReleasePrefix;
- writer.emit8((options & Inst::kOptionXAcquire) ? 0xF2 : 0xF3);
+ writer.emit8(Support::test(options, InstOptions::kX86_XAcquire) ? 0xF2 : 0xF3);
}
writer.emit8(0xF0);
}
// REP and REPNE prefixes.
- if (options & (Inst::kOptionRep | Inst::kOptionRepne)) {
- if (ASMJIT_UNLIKELY(!(iFlags & InstDB::kFlagRep)))
+ if (Support::test(options, InstOptions::kX86_Rep | InstOptions::kX86_Repne)) {
+ if (ASMJIT_UNLIKELY(!Support::test(iFlags, InstDB::InstFlags::kRep)))
goto InvalidRepPrefix;
- if (_extraReg.isReg() && ASMJIT_UNLIKELY(_extraReg.group() != Reg::kGroupGp || _extraReg.id() != Gp::kIdCx))
+ if (ASMJIT_UNLIKELY(_extraReg.isReg() && (_extraReg.group() != RegGroup::kGp || _extraReg.id() != Gp::kIdCx)))
goto InvalidRepPrefix;
- writer.emit8((options & Inst::kOptionRepne) ? 0xF2 : 0xF3);
+ writer.emit8(Support::test(options, InstOptions::kX86_Repne) ? 0xF2 : 0xF3);
}
}
// This sequence seems to be the fastest.
opcode = InstDB::_mainOpcodeTable[instInfo->_mainOpcodeIndex];
- opReg = opcode.extractO();
+ opReg = opcode.extractModO();
+ rbReg = 0;
opcode |= instInfo->_mainOpcodeValue;
- // --------------------------------------------------------------------------
- // [Encoding Scope]
- // --------------------------------------------------------------------------
+ // Encoding Scope
+ // --------------
+
+ // How it works? Each case here represents a unique encoding of a group of instructions, which is handled
+ // separately. The handlers check instruction signature, possibly register types, etc, and process this
+ // information by writing some bits to opcode, opReg/rbReg, immValue/immSize, etc, and then at the end of
+ // the sequence it uses goto to jump into a lower level handler, that actually encodes the instruction.
switch (instInfo->_encoding) {
case InstDB::kEncodingNone:
goto EmitDone;
- // ------------------------------------------------------------------------
- // [X86]
- // ------------------------------------------------------------------------
+ // Base Instructions
+ // -----------------
case InstDB::kEncodingX86Op:
goto EmitX86Op;
- case InstDB::kEncodingX86Op_O_I8:
- if (ASMJIT_UNLIKELY(isign3 != ENC_OPS1(Imm)))
+ case InstDB::kEncodingX86Op_Mod11RM:
+ rbReg = opcode.extractModRM();
+ goto EmitX86R;
+
+ case InstDB::kEncodingX86Op_Mod11RM_I8:
+ // The first operand must be immediate, we don't care of other operands as they could be implicit.
+ if (!o0.isImm())
goto InvalidInstruction;
+ rbReg = opcode.extractModRM();
immValue = o0.as<Imm>().valueAs<uint8_t>();
immSize = 1;
- ASMJIT_FALLTHROUGH;
-
- case InstDB::kEncodingX86Op_O:
- rbReg = 0;
goto EmitX86R;
case InstDB::kEncodingX86Op_xAddr:
if (ASMJIT_UNLIKELY(!o0.isReg()))
goto InvalidInstruction;
- rmInfo = x86MemInfo[o0.as<Reg>().type()];
+ rmInfo = x86MemInfo[size_t(o0.as<Reg>().type())];
writer.emitAddressOverride((rmInfo & _addressOverrideMask()) != 0);
goto EmitX86Op;
@@ -742,11 +738,17 @@ ASMJIT_FAVOR_SPEED Error Assembler::_emit(uint32_t instId, const Operand_& o0, c
}
break;
+ case InstDB::kEncodingX86M_NoMemSize:
+ if (o0.isReg())
+ opcode.addPrefixBySize(o0.size());
+ goto CaseX86M_NoSize;
+
case InstDB::kEncodingX86M:
opcode.addPrefixBySize(o0.size());
ASMJIT_FALLTHROUGH;
case InstDB::kEncodingX86M_NoSize:
+CaseX86M_NoSize:
rbReg = o0.id();
if (isign3 == ENC_OPS1(Reg))
goto EmitX86R;
@@ -826,6 +828,13 @@ CaseX86M_GPB_MulDiv:
}
break;
+ case InstDB::kEncodingX86M_Only_EDX_EAX:
+ if (isign3 == ENC_OPS3(Mem, Reg, Reg) && Reg::isGpd(o1, Gp::kIdDx) && Reg::isGpd(o2, Gp::kIdAx)) {
+ rmRel = &o0;
+ goto EmitX86M;
+ }
+ ASMJIT_FALLTHROUGH;
+
case InstDB::kEncodingX86M_Only:
if (isign3 == ENC_OPS1(Mem)) {
rmRel = &o0;
@@ -837,21 +846,61 @@ CaseX86M_GPB_MulDiv:
if (isign3 == ENC_OPS1(None))
goto EmitX86Op;
- // Multi-byte NOP instruction "0F 1F /0".
+ // Single operand NOP instruction "0F 1F /0".
opcode = Opcode::k000F00 | 0x1F;
opReg = 0;
if (isign3 == ENC_OPS1(Reg)) {
- opcode.add66hBySize(o0.size());
+ opcode.addPrefixBySize(o0.size());
rbReg = o0.id();
goto EmitX86R;
}
if (isign3 == ENC_OPS1(Mem)) {
- opcode.add66hBySize(o0.size());
+ opcode.addPrefixBySize(o0.size());
rmRel = &o0;
goto EmitX86M;
}
+
+ // Two operand NOP instruction "0F 1F /r".
+ opReg = o1.id();
+ opcode.addPrefixBySize(o1.size());
+
+ if (isign3 == ENC_OPS2(Reg, Reg)) {
+ rbReg = o0.id();
+ goto EmitX86R;
+ }
+
+ if (isign3 == ENC_OPS2(Mem, Reg)) {
+ rmRel = &o0;
+ goto EmitX86M;
+ }
+ break;
+
+ case InstDB::kEncodingX86R_FromM:
+ if (isign3 == ENC_OPS1(Mem)) {
+ rmRel = &o0;
+ rbReg = o0.id();
+ goto EmitX86RFromM;
+ }
+ break;
+
+ case InstDB::kEncodingX86R32_EDX_EAX:
+ // Explicit form: R32, EDX, EAX.
+ if (isign3 == ENC_OPS3(Reg, Reg, Reg)) {
+ if (!Reg::isGpd(o1, Gp::kIdDx) || !Reg::isGpd(o2, Gp::kIdAx))
+ goto InvalidInstruction;
+ rbReg = o0.id();
+ goto EmitX86R;
+ }
+
+ // Implicit form: R32.
+ if (isign3 == ENC_OPS1(Reg)) {
+ if (!Reg::isGpd(o0))
+ goto InvalidInstruction;
+ rbReg = o0.id();
+ goto EmitX86R;
+ }
break;
case InstDB::kEncodingX86R_Native:
@@ -924,34 +973,27 @@ CaseX86M_GPB_MulDiv:
case InstDB::kEncodingX86Arith:
if (isign3 == ENC_OPS2(Reg, Reg)) {
- opcode += 2;
opcode.addArithBySize(o0.size());
if (o0.size() != o1.size())
goto OperandSizeMismatch;
- opReg = o0.id();
- rbReg = o1.id();
+ rbReg = o0.id();
+ opReg = o1.id();
if (o0.size() == 1) {
- FIXUP_GPB(o0, opReg);
- FIXUP_GPB(o1, rbReg);
-
- if (!(options & Inst::kOptionModMR))
- goto EmitX86R;
-
- opcode -= 2;
- std::swap(opReg, rbReg);
- goto EmitX86R;
+ FIXUP_GPB(o0, rbReg);
+ FIXUP_GPB(o1, opReg);
}
- else {
- if (!(options & Inst::kOptionModMR))
- goto EmitX86R;
- opcode -= 2;
- std::swap(opReg, rbReg);
+ // MOD/MR: The default encoding used if not instructed otherwise..
+ if (!Support::test(options, InstOptions::kX86_ModRM))
goto EmitX86R;
- }
+
+ // MOD/RM: Alternative encoding selected via instruction options.
+ opcode += 2;
+ std::swap(opReg, rbReg);
+ goto EmitX86R;
}
if (isign3 == ENC_OPS2(Reg, Mem)) {
@@ -1013,7 +1055,7 @@ CaseX86M_GPB_MulDiv:
else
goto InvalidImmediate;
}
- else if (canTransformTo32Bit && hasEncodingOption(kEncodingOptionOptimizeForSize)) {
+ else if (canTransformTo32Bit && hasEncodingOption(EncodingOptions::kOptimizeForSize)) {
size = 4;
}
@@ -1021,12 +1063,12 @@ CaseX86M_GPB_MulDiv:
}
immSize = FastUInt8(Support::min<uint32_t>(size, 4));
- if (Support::isInt8(immValue) && !(options & Inst::kOptionLongForm))
+ if (Support::isInt8(immValue) && !Support::test(options, InstOptions::kLongForm))
immSize = 1;
}
// Short form - AL, AX, EAX, RAX.
- if (rbReg == 0 && (size == 1 || immSize != 1) && !(options & Inst::kOptionLongForm)) {
+ if (rbReg == 0 && (size == 1 || immSize != 1) && !Support::test(options, InstOptions::kLongForm)) {
opcode &= Opcode::kPP_66 | Opcode::kW;
opcode |= ((opReg << 3) | (0x04 + (size != 1)));
immSize = FastUInt8(Support::min<uint32_t>(size, 4));
@@ -1050,7 +1092,7 @@ CaseX86M_GPB_MulDiv:
if (memSize == 4)
immValue = x86SignExtendI32<int64_t>(immValue);
- if (Support::isInt8(immValue) && !(options & Inst::kOptionLongForm))
+ if (Support::isInt8(immValue) && !Support::test(options, InstOptions::kLongForm))
immSize = 1;
opcode += memSize != 1 ? (immSize != 1 ? 1 : 3) : 0;
@@ -1093,7 +1135,7 @@ CaseX86M_GPB_MulDiv:
opcode = x86AltOpcodeOf(instInfo);
opcode.addPrefixBySize(o0.size());
- opReg = opcode.extractO();
+ opReg = opcode.extractModO();
if (isign3 == ENC_OPS2(Reg, Imm)) {
rbReg = o0.id();
@@ -1119,9 +1161,8 @@ CaseX86M_GPB_MulDiv:
if (isign3 == ENC_OPS1(Mem))
goto EmitX86M;
- // Call with 32-bit displacement use 0xE8 opcode. Call with 8-bit
- // displacement is not encodable so the alternative opcode field
- // in X86DB must be zero.
+ // Call with 32-bit displacement use 0xE8 opcode. Call with 8-bit displacement is not encodable so the
+ // alternative opcode field in X86DB must be zero.
opcode = 0xE8;
opReg = 0;
goto EmitJmpCall;
@@ -1158,7 +1199,7 @@ CaseX86M_GPB_MulDiv:
if (o1.size() != 1)
goto EmitX86M;
- FIXUP_GPB(o0, opReg);
+ FIXUP_GPB(o1, opReg);
goto EmitX86M;
}
break;
@@ -1235,7 +1276,7 @@ CaseX86M_GPB_MulDiv:
immValue = o2.as<Imm>().value();
immSize = 1;
- if (!Support::isInt8(immValue) || (options & Inst::kOptionLongForm)) {
+ if (!Support::isInt8(immValue) || Support::test(options, InstOptions::kLongForm)) {
opcode -= 2;
immSize = o0.size() == 2 ? 2 : 4;
}
@@ -1257,7 +1298,7 @@ CaseX86M_GPB_MulDiv:
if (o0.size() == 4)
immValue = x86SignExtendI32<int64_t>(immValue);
- if (!Support::isInt8(immValue) || (options & Inst::kOptionLongForm)) {
+ if (!Support::isInt8(immValue) || Support::test(options, InstOptions::kLongForm)) {
opcode -= 2;
immSize = o0.size() == 2 ? 2 : 4;
}
@@ -1309,7 +1350,7 @@ CaseX86M_GPB_MulDiv:
if (o0.size() == 4)
immValue = x86SignExtendI32<int64_t>(immValue);
- if (!Support::isInt8(immValue) || (options & Inst::kOptionLongForm)) {
+ if (!Support::isInt8(immValue) || Support::test(options, InstOptions::kLongForm)) {
opcode -= 2;
immSize = o0.size() == 2 ? 2 : 4;
}
@@ -1383,6 +1424,8 @@ CaseX86M_GPB_MulDiv:
}
if (isign3 == ENC_OPS1(Mem)) {
+ if (!o0.size())
+ goto AmbiguousOperandSize;
opcode.addArithBySize(o0.size());
rmRel = &o0;
goto EmitX86M;
@@ -1398,8 +1441,8 @@ CaseX86M_GPB_MulDiv:
break;
case InstDB::kEncodingX86Jcc:
- if ((options & (Inst::kOptionTaken | Inst::kOptionNotTaken)) && hasEncodingOption(kEncodingOptionPredictedJumps)) {
- uint8_t prefix = (options & Inst::kOptionTaken) ? uint8_t(0x3E) : uint8_t(0x2E);
+ if (Support::test(options, InstOptions::kTaken | InstOptions::kNotTaken) && hasEncodingOption(EncodingOptions::kPredictedJumps)) {
+ uint8_t prefix = Support::test(options, InstOptions::kTaken) ? uint8_t(0x3E) : uint8_t(0x2E);
writer.emit8(prefix);
}
@@ -1431,8 +1474,8 @@ CaseX86M_GPB_MulDiv:
if (isign3 == ENC_OPS1(Mem))
goto EmitX86M;
- // Jump encoded with 32-bit displacement use 0xE9 opcode. Jump encoded
- // with 8-bit displacement's opcode is stored as an alternative opcode.
+ // Jump encoded with 32-bit displacement use 0xE9 opcode. Jump encoded with 8-bit displacement's opcode is
+ // stored as an alternative opcode.
opcode = 0xE9;
opReg = 0;
goto EmitJmpCall;
@@ -1441,6 +1484,39 @@ CaseX86M_GPB_MulDiv:
rmRel = &o0;
goto EmitJmpCall;
+ case InstDB::kEncodingX86LcallLjmp:
+ if (isign3 == ENC_OPS1(Mem)) {
+ rmRel = &o0;
+ uint32_t mSize = rmRel->size();
+ if (mSize == 0) {
+ mSize = registerSize();
+ }
+ else {
+ mSize -= 2;
+ if (mSize != 2 && mSize != 4 && mSize != registerSize())
+ goto InvalidAddress;
+ }
+ opcode.addPrefixBySize(mSize);
+ goto EmitX86M;
+ }
+
+ if (isign3 == ENC_OPS2(Imm, Imm)) {
+ if (!is32Bit())
+ goto InvalidInstruction;
+
+ const Imm& imm0 = o0.as<Imm>();
+ const Imm& imm1 = o1.as<Imm>();
+
+ if (imm0.value() > 0xFFFFu || imm1.value() > 0xFFFFFFFFu)
+ goto InvalidImmediate;
+
+ opcode = x86AltOpcodeOf(instInfo);
+ immValue = imm1.value() | (imm0.value() << 32);
+ immSize = 6;
+ goto EmitX86Op;
+ }
+ break;
+
case InstDB::kEncodingX86Lea:
if (isign3 == ENC_OPS2(Reg, Mem)) {
opcode.addPrefixBySize(o0.size());
@@ -1453,58 +1529,46 @@ CaseX86M_GPB_MulDiv:
case InstDB::kEncodingX86Mov:
// Reg <- Reg
if (isign3 == ENC_OPS2(Reg, Reg)) {
- opReg = o0.id();
- rbReg = o1.id();
-
- // Asmjit uses segment registers indexed from 1 to 6, leaving zero as
- // "no segment register used". We have to fix this (decrement the index
- // of the register) when emitting MOV instructions which move to/from
- // a segment register. The segment register is always `opReg`, because
- // the MOV instruction uses either RM or MR encoding.
+ // Asmjit uses segment registers indexed from 1 to 6, leaving zero as "no segment register used". We have to
+ // fix this (decrement the index of the register) when emitting MOV instructions which move to/from a segment
+ // register. The segment register is always `opReg`, because the MOV instruction uses either RM or MR encoding.
// GP <- ??
if (Reg::isGp(o0)) {
+ rbReg = o0.id();
+ opReg = o1.id();
+
// GP <- GP
if (Reg::isGp(o1)) {
- uint32_t size0 = o0.size();
- uint32_t size1 = o1.size();
+ uint32_t opSize = o0.size();
+ if (opSize != o1.size())
+ goto InvalidInstruction;
- if (size0 != size1) {
- // We allow 'mov r64, r32' as it's basically zero-extend.
- if (size0 == 8 && size1 == 4)
- size0 = 4; // Zero extend, don't promote to 64-bit.
- else
- goto InvalidInstruction;
- }
+ if (opSize == 1) {
+ FIXUP_GPB(o0, rbReg);
+ FIXUP_GPB(o1, opReg);
+ opcode = 0x88;
- if (size0 == 1) {
- FIXUP_GPB(o0, opReg);
- FIXUP_GPB(o1, rbReg);
- opcode = 0x8A;
-
- if (!(options & Inst::kOptionModMR))
+ if (!Support::test(options, InstOptions::kX86_ModRM))
goto EmitX86R;
- opcode -= 2;
+ opcode += 2;
std::swap(opReg, rbReg);
goto EmitX86R;
}
else {
- opcode = 0x8B;
- opcode.addPrefixBySize(size0);
+ opcode = 0x89;
+ opcode.addPrefixBySize(opSize);
- if (!(options & Inst::kOptionModMR))
+ if (!Support::test(options, InstOptions::kX86_ModRM))
goto EmitX86R;
- opcode -= 2;
+ opcode += 2;
std::swap(opReg, rbReg);
goto EmitX86R;
}
}
- opReg = rbReg;
- rbReg = o0.id();
-
// GP <- SReg
if (Reg::isSReg(o1)) {
opcode = 0x8C;
@@ -1532,6 +1596,9 @@ CaseX86M_GPB_MulDiv:
}
}
else {
+ opReg = o0.id();
+ rbReg = o1.id();
+
// ?? <- GP
if (!Reg::isGp(o1))
goto InvalidInstruction;
@@ -1582,18 +1649,18 @@ CaseX86M_GPB_MulDiv:
opcode = 0;
opcode.addArithBySize(o0.size());
- if (o0.size() == 1)
- FIXUP_GPB(o0, opReg);
-
// Handle a special form of `mov al|ax|eax|rax, [ptr64]` that doesn't use MOD.
if (opReg == Gp::kIdAx && !rmRel->as<Mem>().hasBaseOrIndex()) {
- immValue = rmRel->as<Mem>().offset();
- if (x86GetMovAbsAddrType(this, writer, o0.size(), options, rmRel->as<Mem>()) == BaseMem::kAddrTypeAbs) {
+ if (x86ShouldUseMovabs(this, writer, o0.size(), options, rmRel->as<Mem>())) {
opcode += 0xA0;
+ immValue = rmRel->as<Mem>().offset();
goto EmitX86OpMovAbs;
}
}
+ if (o0.size() == 1)
+ FIXUP_GPB(o0, opReg);
+
opcode += 0x8A;
goto EmitX86M;
}
@@ -1615,18 +1682,18 @@ CaseX86M_GPB_MulDiv:
opcode = 0;
opcode.addArithBySize(o1.size());
- if (o1.size() == 1)
- FIXUP_GPB(o1, opReg);
-
// Handle a special form of `mov [ptr64], al|ax|eax|rax` that doesn't use MOD.
if (opReg == Gp::kIdAx && !rmRel->as<Mem>().hasBaseOrIndex()) {
- immValue = rmRel->as<Mem>().offset();
- if (x86GetMovAbsAddrType(this, writer, o1.size(), options, rmRel->as<Mem>()) == BaseMem::kAddrTypeAbs) {
+ if (x86ShouldUseMovabs(this, writer, o1.size(), options, rmRel->as<Mem>())) {
opcode += 0xA2;
+ immValue = rmRel->as<Mem>().offset();
goto EmitX86OpMovAbs;
}
}
+ if (o1.size() == 1)
+ FIXUP_GPB(o1, opReg);
+
opcode += 0x88;
goto EmitX86M;
}
@@ -1648,8 +1715,8 @@ CaseX86M_GPB_MulDiv:
immValue = o1.as<Imm>().value();
// Optimize the instruction size by using a 32-bit immediate if possible.
- if (immSize == 8 && !(options & Inst::kOptionLongForm)) {
- if (Support::isUInt32(immValue) && hasEncodingOption(kEncodingOptionOptimizeForSize)) {
+ if (immSize == 8 && !Support::test(options, InstOptions::kLongForm)) {
+ if (Support::isUInt32(immValue) && hasEncodingOption(EncodingOptions::kOptimizeForSize)) {
// Zero-extend by using a 32-bit GPD destination instead of a 64-bit GPQ.
immSize = 4;
}
@@ -1687,6 +1754,62 @@ CaseX86M_GPB_MulDiv:
}
break;
+ case InstDB::kEncodingX86Movabs:
+ // Reg <- Mem
+ if (isign3 == ENC_OPS2(Reg, Mem)) {
+ opReg = o0.id();
+ rmRel = &o1;
+
+ opcode = 0xA0;
+ opcode.addArithBySize(o0.size());
+
+ if (ASMJIT_UNLIKELY(!o0.as<Reg>().isGp()) || opReg != Gp::kIdAx)
+ goto InvalidInstruction;
+
+ if (ASMJIT_UNLIKELY(rmRel->as<Mem>().hasBaseOrIndex()))
+ goto InvalidAddress;
+
+ if (ASMJIT_UNLIKELY(rmRel->as<Mem>().addrType() == Mem::AddrType::kRel))
+ goto InvalidAddress;
+
+ immValue = rmRel->as<Mem>().offset();
+ goto EmitX86OpMovAbs;
+ }
+
+ // Mem <- Reg
+ if (isign3 == ENC_OPS2(Mem, Reg)) {
+ opReg = o1.id();
+ rmRel = &o0;
+
+ opcode = 0xA2;
+ opcode.addArithBySize(o1.size());
+
+ if (ASMJIT_UNLIKELY(!o1.as<Reg>().isGp()) || opReg != Gp::kIdAx)
+ goto InvalidInstruction;
+
+ if (ASMJIT_UNLIKELY(rmRel->as<Mem>().hasBaseOrIndex()))
+ goto InvalidAddress;
+
+ immValue = rmRel->as<Mem>().offset();
+ goto EmitX86OpMovAbs;
+ }
+
+ // Reg <- Imm.
+ if (isign3 == ENC_OPS2(Reg, Imm)) {
+ if (ASMJIT_UNLIKELY(!o0.as<Reg>().isGpq()))
+ goto InvalidInstruction;
+
+ opReg = o0.id();
+ opcode = 0xB8;
+
+ immSize = 8;
+ immValue = o1.as<Imm>().value();
+
+ opcode.addPrefixBySize(8);
+ goto EmitX86OpReg;
+ }
+ break;
+
case InstDB::kEncodingX86MovsxMovzx:
opcode.add(o1.size() != 1);
opcode.addPrefixBySize(o0.size());
@@ -1794,7 +1917,7 @@ CaseX86M_GPB_MulDiv:
immValue = o0.as<Imm>().value();
immSize = 4;
- if (Support::isInt8(immValue) && !(options & Inst::kOptionLongForm))
+ if (Support::isInt8(immValue) && !Support::test(options, InstOptions::kLongForm))
immSize = 1;
opcode = immSize == 1 ? 0x6A : 0x68;
@@ -1810,13 +1933,12 @@ CaseX86M_GPB_MulDiv:
goto InvalidSegment;
opcode = x86OpcodePopSReg[segment];
- goto EmitDone;
+ goto EmitX86Op;
}
else {
CaseX86PushPop_Gp:
- // We allow 2 byte, 4 byte, and 8 byte register sizes, although PUSH
- // and POP only allow 2 bytes or native size. On 64-bit we simply
- // PUSH/POP 64-bit register even if 32-bit register was given.
+ // We allow 2 byte, 4 byte, and 8 byte register sizes, although PUSH and POP only allow 2 bytes or
+ // native size. On 64-bit we simply PUSH/POP 64-bit register even if 32-bit register was given.
if (ASMJIT_UNLIKELY(o0.size() < 2))
goto InvalidInstruction;
@@ -1849,7 +1971,7 @@ CaseX86PushPop_Gp:
if (isign3 == ENC_OPS1(Imm)) {
immValue = o0.as<Imm>().value();
- if (immValue == 0 && !(options & Inst::kOptionLongForm)) {
+ if (immValue == 0 && !Support::test(options, InstOptions::kLongForm)) {
// 'ret' without immediate, change C2 to C3.
opcode.add(1);
goto EmitX86Op;
@@ -1881,7 +2003,7 @@ CaseX86PushPop_Gp:
immValue = o1.as<Imm>().value() & 0xFF;
immSize = 0;
- if (immValue == 1 && !(options & Inst::kOptionLongForm))
+ if (immValue == 1 && !Support::test(options, InstOptions::kLongForm))
goto EmitX86R;
opcode -= 0x10;
@@ -1890,6 +2012,8 @@ CaseX86PushPop_Gp:
}
}
else {
+ if (ASMJIT_UNLIKELY(o0.size() == 0))
+ goto AmbiguousOperandSize;
opcode.addArithBySize(o0.size());
if (isign3 == ENC_OPS2(Mem, Reg)) {
@@ -1902,14 +2026,11 @@ CaseX86PushPop_Gp:
}
if (isign3 == ENC_OPS2(Mem, Imm)) {
- if (ASMJIT_UNLIKELY(o0.size() == 0))
- goto AmbiguousOperandSize;
-
rmRel = &o0;
immValue = o1.as<Imm>().value() & 0xFF;
immSize = 0;
- if (immValue == 1 && !(options & Inst::kOptionLongForm))
+ if (immValue == 1 && !Support::test(options, InstOptions::kLongForm))
goto EmitX86M;
opcode -= 0x10;
@@ -2060,7 +2181,7 @@ CaseX86PushPop_Gp:
// The following instructions use the secondary opcode.
opcode = x86AltOpcodeOf(instInfo);
- opReg = opcode.extractO();
+ opReg = opcode.extractModO();
if (isign3 == ENC_OPS2(Reg, Imm)) {
opcode.addArithBySize(o0.size());
@@ -2077,7 +2198,7 @@ CaseX86PushPop_Gp:
}
// Short form - AL, AX, EAX, RAX.
- if (rbReg == 0 && !(options & Inst::kOptionLongForm)) {
+ if (rbReg == 0 && !Support::test(options, InstOptions::kLongForm)) {
opcode &= Opcode::kPP_66 | Opcode::kW;
opcode |= 0xA8 + (o0.size() != 1);
goto EmitX86Op;
@@ -2115,30 +2236,45 @@ CaseX86PushPop_Gp:
case InstDB::kEncodingX86Xadd:
if (isign3 == ENC_OPS2(Reg, Reg)) {
- opcode.addArithBySize(o0.size());
rbReg = o0.id();
opReg = o1.id();
- if (o0.size() != o1.size())
+ uint32_t opSize = o0.size();
+ if (opSize != o1.size())
goto OperandSizeMismatch;
- if (o0.size() == 1) {
+ if (opSize == 1) {
FIXUP_GPB(o0, rbReg);
FIXUP_GPB(o1, opReg);
goto EmitX86R;
}
- // Special opcode for 'xchg ?ax, reg'.
+ // Special cases for 'xchg ?ax, reg'.
if (instId == Inst::kIdXchg && (opReg == 0 || rbReg == 0)) {
- opcode &= Opcode::kPP_66 | Opcode::kW;
- opcode |= 0x90;
- // One of `xchg a, b` or `xchg b, a` is AX/EAX/RAX.
- opReg += rbReg;
- goto EmitX86OpReg;
- }
- else {
- goto EmitX86R;
+ if (is64Bit() && opReg == rbReg && opSize >= 4) {
+ if (opSize == 8) {
+ // Encode 'xchg rax, rax' as '90' (REX and other prefixes are optional).
+ opcode &= Opcode::kW;
+ opcode |= 0x90;
+ goto EmitX86OpReg;
+ }
+ else {
+ // Encode 'xchg eax, eax' by by using a generic path.
+ }
+ }
+ else if (!Support::test(options, InstOptions::kLongForm)) {
+ // The special encoding encodes only one register, which is non-zero.
+ opReg += rbReg;
+
+ opcode.addArithBySize(opSize);
+ opcode &= Opcode::kW | Opcode::kPP_66;
+ opcode |= 0x90;
+ goto EmitX86OpReg;
+ }
}
+
+ opcode.addArithBySize(opSize);
+ goto EmitX86R;
}
if (isign3 == ENC_OPS2(Mem, Reg)) {
@@ -2164,7 +2300,7 @@ CaseX86PushPop_Gp:
rbReg = o1.id();
// ModRM encoding:
- if (!(options & Inst::kOptionModMR))
+ if (!Support::test(options, InstOptions::kX86_ModMR))
goto EmitX86R;
// ModMR encoding:
@@ -2188,9 +2324,8 @@ CaseX86PushPop_Gp:
}
break;
- // ------------------------------------------------------------------------
- // [FPU]
- // ------------------------------------------------------------------------
+ // FPU Instructions
+ // ----------------
case InstDB::kEncodingFpuOp:
goto EmitFpuOp;
@@ -2250,18 +2385,18 @@ CaseFpuArith_Mem:
if (isign3 == ENC_OPS1(Mem)) {
rmRel = &o0;
- if (o0.size() == 4 && commonInfo->hasFlag(InstDB::kFlagFpuM32)) {
+ if (o0.size() == 4 && commonInfo->hasFlag(InstDB::InstFlags::kFpuM32)) {
goto EmitX86M;
}
- if (o0.size() == 8 && commonInfo->hasFlag(InstDB::kFlagFpuM64)) {
+ if (o0.size() == 8 && commonInfo->hasFlag(InstDB::InstFlags::kFpuM64)) {
opcode += 4;
goto EmitX86M;
}
- if (o0.size() == 10 && commonInfo->hasFlag(InstDB::kFlagFpuM80)) {
+ if (o0.size() == 10 && commonInfo->hasFlag(InstDB::InstFlags::kFpuM80)) {
opcode = x86AltOpcodeOf(instInfo);
- opReg = opcode.extractO();
+ opReg = opcode.extractModO();
goto EmitX86M;
}
}
@@ -2279,18 +2414,18 @@ CaseFpuArith_Mem:
opcode &= ~uint32_t(Opcode::kCDSHL_Mask);
rmRel = &o0;
- if (o0.size() == 2 && commonInfo->hasFlag(InstDB::kFlagFpuM16)) {
+ if (o0.size() == 2 && commonInfo->hasFlag(InstDB::InstFlags::kFpuM16)) {
opcode += 4;
goto EmitX86M;
}
- if (o0.size() == 4 && commonInfo->hasFlag(InstDB::kFlagFpuM32)) {
+ if (o0.size() == 4 && commonInfo->hasFlag(InstDB::InstFlags::kFpuM32)) {
goto EmitX86M;
}
- if (o0.size() == 8 && commonInfo->hasFlag(InstDB::kFlagFpuM64)) {
+ if (o0.size() == 8 && commonInfo->hasFlag(InstDB::InstFlags::kFpuM64)) {
opcode = x86AltOpcodeOf(instInfo) & ~uint32_t(Opcode::kCDSHL_Mask);
- opReg = opcode.extractO();
+ opReg = opcode.extractModO();
goto EmitX86M;
}
}
@@ -2328,9 +2463,8 @@ CaseFpuArith_Mem:
}
break;
- // ------------------------------------------------------------------------
- // [Ext]
- // ------------------------------------------------------------------------
+ // Ext Instructions (Legacy Extensions)
+ // ------------------------------------
case InstDB::kEncodingExtPextrw:
if (isign3 == ENC_OPS3(Reg, Reg, Imm)) {
@@ -2388,7 +2522,7 @@ CaseFpuArith_Mem:
opReg = o0.id();
rbReg = o1.id();
- if (!(options & Inst::kOptionModMR) || !instInfo->_altOpcodeIndex)
+ if (!Support::test(options, InstOptions::kX86_ModMR) || !instInfo->_altOpcodeIndex)
goto EmitX86R;
opcode = x86AltOpcodeOf(instInfo);
@@ -2484,7 +2618,7 @@ CaseExtMovd:
if (Reg::isMm(o0) && Reg::isMm(o1)) {
opcode = Opcode::k000F00 | 0x6F;
- if (!(options & Inst::kOptionModMR))
+ if (!Support::test(options, InstOptions::kX86_ModMR))
goto EmitX86R;
opcode += 0x10;
@@ -2496,7 +2630,7 @@ CaseExtMovd:
if (Reg::isXmm(o0) && Reg::isXmm(o1)) {
opcode = Opcode::kF30F00 | 0x7E;
- if (!(options & Inst::kOptionModMR))
+ if (!Support::test(options, InstOptions::kX86_ModMR))
goto EmitX86R;
opcode = Opcode::k660F00 | 0xD6;
@@ -2558,7 +2692,11 @@ CaseExtMovd:
goto CaseExtRm;
case InstDB::kEncodingExtRm_Wx:
- opcode.addWIf(Reg::isGpq(o0) || o1.size() == 8);
+ opcode.addWIf(o1.size() == 8);
+ ASMJIT_FALLTHROUGH;
+
+ case InstDB::kEncodingExtRm_Wx_GpqOnly:
+ opcode.addWIf(Reg::isGpq(o0));
ASMJIT_FALLTHROUGH;
case InstDB::kEncodingExtRm:
@@ -2609,7 +2747,7 @@ CaseExtRm:
// The following instruction uses the secondary opcode.
opcode = x86AltOpcodeOf(instInfo);
- opReg = opcode.extractO();
+ opReg = opcode.extractModO();
if (isign3 == ENC_OPS2(Reg, Imm)) {
immValue = o1.as<Imm>().value();
@@ -2639,7 +2777,7 @@ CaseExtRm:
// The following instruction uses the secondary opcode.
opcode = x86AltOpcodeOf(instInfo);
- opReg = opcode.extractO();
+ opReg = opcode.extractModO();
if (isign3 == ENC_OPS2(Reg, Imm)) {
opcode.add66hIf(Reg::isXmm(o0));
@@ -2690,9 +2828,8 @@ CaseExtRm:
}
break;
- // ------------------------------------------------------------------------
- // [Extrq / Insertq (SSE4A)]
- // ------------------------------------------------------------------------
+ // Extrq & Insertq (SSE4A)
+ // -----------------------
case InstDB::kEncodingExtExtrq:
opReg = o0.id();
@@ -2701,22 +2838,22 @@ CaseExtRm:
if (isign3 == ENC_OPS2(Reg, Reg))
goto EmitX86R;
- // The following instruction uses the secondary opcode.
- opcode = x86AltOpcodeOf(instInfo);
-
if (isign3 == ENC_OPS3(Reg, Imm, Imm)) {
+ // This variant of the instruction uses the secondary opcode.
+ opcode = x86AltOpcodeOf(instInfo);
+ rbReg = opReg;
+ opReg = opcode.extractModO();
+
immValue = (uint32_t(o1.as<Imm>().valueAs<uint8_t>()) ) +
(uint32_t(o2.as<Imm>().valueAs<uint8_t>()) << 8) ;
immSize = 2;
-
- rbReg = opcode.extractO();
goto EmitX86R;
}
break;
case InstDB::kEncodingExtInsertq: {
const Operand_& o3 = opExt[EmitterUtils::kOp3];
- const uint32_t isign4 = isign3 + (o3.opType() << 9);
+ const uint32_t isign4 = isign3 + (uint32_t(o3.opType()) << 9);
opReg = o0.id();
rbReg = o1.id();
@@ -2724,10 +2861,10 @@ CaseExtRm:
if (isign4 == ENC_OPS2(Reg, Reg))
goto EmitX86R;
- // The following instruction uses the secondary opcode.
- opcode = x86AltOpcodeOf(instInfo);
-
if (isign4 == ENC_OPS4(Reg, Reg, Imm, Imm)) {
+ // This variant of the instruction uses the secondary opcode.
+ opcode = x86AltOpcodeOf(instInfo);
+
immValue = (uint32_t(o2.as<Imm>().valueAs<uint8_t>()) ) +
(uint32_t(o3.as<Imm>().valueAs<uint8_t>()) << 8) ;
immSize = 2;
@@ -2736,9 +2873,8 @@ CaseExtRm:
break;
}
- // ------------------------------------------------------------------------
- // [3dNow]
- // ------------------------------------------------------------------------
+ // 3DNOW Instructions
+ // ------------------
case InstDB::kEncodingExt3dNow:
// Every 3dNow instruction starts with 0x0F0F and the actual opcode is
@@ -2760,12 +2896,15 @@ CaseExtRm:
}
break;
- // ------------------------------------------------------------------------
- // [VEX/EVEX]
- // ------------------------------------------------------------------------
+ // VEX/EVEX Instructions
+ // ---------------------
case InstDB::kEncodingVexOp:
- goto EmitVexEvexOp;
+ goto EmitVexOp;
+
+ case InstDB::kEncodingVexOpMod:
+ rbReg = 0;
+ goto EmitVexEvexR;
case InstDB::kEncodingVexKmov:
if (isign3 == ENC_OPS2(Reg, Reg)) {
@@ -2785,7 +2924,7 @@ CaseExtRm:
}
// Form 'k, k'.
- if (!(options & Inst::kOptionModMR))
+ if (!Support::test(options, InstOptions::kX86_ModMR))
goto EmitVexEvexR;
opcode.add(1);
@@ -2825,7 +2964,6 @@ CaseExtRm:
case InstDB::kEncodingVexM_VM:
if (isign3 == ENC_OPS1(Mem)) {
- opcode |= x86OpcodeLByVMem(o0);
rmRel = &o0;
goto EmitVexEvexM;
}
@@ -2857,11 +2995,27 @@ CaseExtRm:
}
break;
+ case InstDB::kEncodingVexMri_Vpextrw:
+ // Use 'vpextrw reg, xmm1, i8' when possible.
+ if (isign3 == ENC_OPS3(Reg, Reg, Imm)) {
+ opcode = Opcode::k660F00 | 0xC5;
+
+ opReg = o0.id();
+ rbReg = o1.id();
+
+ immValue = o2.as<Imm>().value();
+ immSize = 1;
+ goto EmitVexEvexR;
+ }
+
+ goto CaseVexMri;
+
case InstDB::kEncodingVexMri_Lx:
opcode |= x86OpcodeLBySize(o0.size() | o1.size());
ASMJIT_FALLTHROUGH;
case InstDB::kEncodingVexMri:
+CaseVexMri:
immValue = o2.as<Imm>().value();
immSize = 1;
@@ -2889,6 +3043,13 @@ CaseExtRm:
opcode.addWIf(Reg::isGpq(o0) | Reg::isGpq(o1));
goto CaseVexRm;
+ case InstDB::kEncodingVexRm_Lx_Narrow:
+ if (o1.size())
+ opcode |= x86OpcodeLBySize(o1.size());
+ else if (o0.size() == 32)
+ opcode |= Opcode::kLL_2;
+ goto CaseVexRm;
+
case InstDB::kEncodingVexRm_Lx_Bcst:
if (isign3 == ENC_OPS2(Reg, Reg) && Reg::isGp(o1.as<Reg>())) {
opcode = x86AltOpcodeOf(instInfo) | x86OpcodeLBySize(o0.size() | o1.size());
@@ -2931,7 +3092,7 @@ CaseVexRm:
const Operand_& o4 = opExt[EmitterUtils::kOp4];
const Operand_& o5 = opExt[EmitterUtils::kOp5];
- if (Reg::isZmm(o0) && Reg::isZmm(o1) && Reg::isZmm(o2) && Reg::isZmm(o3) && Reg::isZmm(o4) && o5.isMem()) {
+ if (Reg::isVec(o0) && Reg::isVec(o1) && Reg::isVec(o2) && Reg::isVec(o3) && Reg::isVec(o4) && o5.isMem()) {
// Registers [o1, o2, o3, o4] must start aligned and must be consecutive.
uint32_t i1 = o1.id();
uint32_t i2 = o2.id();
@@ -2941,7 +3102,7 @@ CaseVexRm:
if (ASMJIT_UNLIKELY((i1 & 0x3) != 0 || i2 != i1 + 1 || i3 != i1 + 2 || i4 != i1 + 3))
goto NotConsecutiveRegs;
- opReg = o0.id();
+ opReg = x86PackRegAndVvvvv(o0.id(), i1);
rmRel = &o5;
goto EmitVexEvexM;
}
@@ -3002,11 +3163,42 @@ CaseVexRvm_R:
goto CaseVexRvm;
}
+ case InstDB::kEncodingVexRvm_Lx_KEvex: {
+ opcode.forceEvexIf(Reg::isKReg(o0));
+ ASMJIT_FALLTHROUGH;
+ }
+
case InstDB::kEncodingVexRvm_Lx: {
opcode |= x86OpcodeLBySize(o0.size() | o1.size());
goto CaseVexRvm;
}
+ case InstDB::kEncodingVexRvm_Lx_2xK: {
+ if (isign3 == ENC_OPS3(Reg, Reg, Reg)) {
+ // Two registers are encoded as a single register.
+ // - First K register must be even.
+ // - Second K register must be first+1.
+ if ((o0.id() & 1) != 0 || o0.id() + 1 != o1.id())
+ goto InvalidPhysId;
+
+ const Operand_& o3 = opExt[EmitterUtils::kOp3];
+
+ opcode |= x86OpcodeLBySize(o2.size());
+ opReg = x86PackRegAndVvvvv(o0.id(), o2.id());
+
+ if (o3.isReg()) {
+ rbReg = o3.id();
+ goto EmitVexEvexR;
+ }
+
+ if (o3.isMem()) {
+ rmRel = &o3;
+ goto EmitVexEvexM;
+ }
+ }
+ break;
+ }
+
case InstDB::kEncodingVexRvmr_Lx: {
opcode |= x86OpcodeLBySize(o0.size() | o1.size());
ASMJIT_FALLTHROUGH;
@@ -3014,7 +3206,7 @@ CaseVexRvm_R:
case InstDB::kEncodingVexRvmr: {
const Operand_& o3 = opExt[EmitterUtils::kOp3];
- const uint32_t isign4 = isign3 + (o3.opType() << 9);
+ const uint32_t isign4 = isign3 + (uint32_t(o3.opType()) << 9);
immValue = o3.id() << 4;
immSize = 1;
@@ -3033,13 +3225,23 @@ CaseVexRvm_R:
break;
}
+ case InstDB::kEncodingVexRvmi_KEvex:
+ opcode.forceEvexIf(Reg::isKReg(o0));
+ goto VexRvmi;
+
+ case InstDB::kEncodingVexRvmi_Lx_KEvex:
+ opcode.forceEvexIf(Reg::isKReg(o0));
+ ASMJIT_FALLTHROUGH;
+
case InstDB::kEncodingVexRvmi_Lx:
opcode |= x86OpcodeLBySize(o0.size() | o1.size());
ASMJIT_FALLTHROUGH;
- case InstDB::kEncodingVexRvmi: {
+ case InstDB::kEncodingVexRvmi:
+VexRvmi:
+ {
const Operand_& o3 = opExt[EmitterUtils::kOp3];
- const uint32_t isign4 = isign3 + (o3.opType() << 9);
+ const uint32_t isign4 = isign3 + (uint32_t(o3.opType()) << 9);
immValue = o3.as<Imm>().value();
immSize = 1;
@@ -3085,7 +3287,6 @@ CaseVexRvm_R:
rmRel = &o1;
goto EmitVexEvexM;
}
-
ASMJIT_FALLTHROUGH;
case InstDB::kEncodingVexRmv_VM:
@@ -3101,7 +3302,7 @@ CaseVexRvm_R:
case InstDB::kEncodingVexRmvi: {
const Operand_& o3 = opExt[EmitterUtils::kOp3];
- const uint32_t isign4 = isign3 + (o3.opType() << 9);
+ const uint32_t isign4 = isign3 + (uint32_t(o3.opType()) << 9);
immValue = o3.as<Imm>().value();
immSize = 1;
@@ -3207,7 +3408,7 @@ CaseVexRvm_R:
opReg = x86PackRegAndVvvvv(o0.id(), o2.id());
rbReg = o1.id();
- if (!(options & Inst::kOptionModMR))
+ if (!Support::test(options, InstOptions::kX86_ModMR))
goto EmitVexEvexR;
opcode.addW();
@@ -3272,7 +3473,7 @@ CaseVexRvm_R:
opReg = x86PackRegAndVvvvv(o0.id(), o2.id());
rbReg = o1.id();
- if (!(options & Inst::kOptionModMR))
+ if (!Support::test(options, InstOptions::kX86_ModMR))
goto EmitVexEvexR;
opcode.addW();
@@ -3370,6 +3571,10 @@ CaseVexRvm_R:
}
break;
+ case InstDB::kEncodingVexRvmVmi_Lx_MEvex:
+ opcode.forceEvexIf(o1.isMem());
+ ASMJIT_FALLTHROUGH;
+
case InstDB::kEncodingVexRvmVmi_Lx:
opcode |= x86OpcodeLBySize(o0.size() | o1.size());
ASMJIT_FALLTHROUGH;
@@ -3388,9 +3593,9 @@ CaseVexRvm_R:
}
// The following instruction uses the secondary opcode.
- opcode &= Opcode::kLL_Mask;
+ opcode &= Opcode::kLL_Mask | Opcode::kMM_ForceEvex;
opcode |= x86AltOpcodeOf(instInfo);
- opReg = opcode.extractO();
+ opReg = opcode.extractModO();
immValue = o2.as<Imm>().value();
immSize = 1;
@@ -3426,9 +3631,9 @@ CaseVexRvm_R:
}
break;
- case InstDB::kEncodingVexEvexVmi_Lx:
+ case InstDB::kEncodingVexVmi_Lx_MEvex:
if (isign3 == ENC_OPS3(Reg, Mem, Imm))
- opcode |= Opcode::kMM_ForceEvex;
+ opcode.forceEvex();
ASMJIT_FALLTHROUGH;
case InstDB::kEncodingVexVmi_Lx:
@@ -3465,7 +3670,7 @@ CaseVexVmi_AfterImm:
case InstDB::kEncodingVexRvrmRvmr: {
const Operand_& o3 = opExt[EmitterUtils::kOp3];
- const uint32_t isign4 = isign3 + (o3.opType() << 9);
+ const uint32_t isign4 = isign3 + (uint32_t(o3.opType()) << 9);
if (isign4 == ENC_OPS4(Reg, Reg, Reg, Reg)) {
opReg = x86PackRegAndVvvvv(o0.id(), o1.id());
@@ -3504,7 +3709,7 @@ CaseVexVmi_AfterImm:
if (ASMJIT_UNLIKELY(!o4.isImm()))
goto InvalidInstruction;
- const uint32_t isign4 = isign3 + (o3.opType() << 9);
+ const uint32_t isign4 = isign3 + (uint32_t(o3.opType()) << 9);
opcode |= x86OpcodeLBySize(o0.size() | o1.size() | o2.size() | o3.size());
immValue = o4.as<Imm>().valueAs<uint8_t>() & 0x0F;
@@ -3556,9 +3761,8 @@ CaseVexVmi_AfterImm:
}
break;
- // ------------------------------------------------------------------------
- // [FMA4]
- // ------------------------------------------------------------------------
+ // FMA4 Instructions
+ // -----------------
case InstDB::kEncodingFma4_Lx:
// It's fine to just check the first operand, second is just for sanity.
@@ -3567,15 +3771,28 @@ CaseVexVmi_AfterImm:
case InstDB::kEncodingFma4: {
const Operand_& o3 = opExt[EmitterUtils::kOp3];
- const uint32_t isign4 = isign3 + (o3.opType() << 9);
+ const uint32_t isign4 = isign3 + (uint32_t(o3.opType()) << 9);
if (isign4 == ENC_OPS4(Reg, Reg, Reg, Reg)) {
opReg = x86PackRegAndVvvvv(o0.id(), o1.id());
- rbReg = o2.id();
- immValue = o3.id() << 4;
- immSize = 1;
- goto EmitVexEvexR;
+ if (!Support::test(options, InstOptions::kX86_ModMR)) {
+ // MOD/RM - Encoding preferred by LLVM.
+ opcode.addW();
+ rbReg = o3.id();
+
+ immValue = o2.id() << 4;
+ immSize = 1;
+ goto EmitVexEvexR;
+ }
+ else {
+ // MOD/MR - Alternative encoding.
+ rbReg = o2.id();
+
+ immValue = o3.id() << 4;
+ immSize = 1;
+ goto EmitVexEvexR;
+ }
}
if (isign4 == ENC_OPS4(Reg, Reg, Reg, Mem)) {
@@ -3598,13 +3815,54 @@ CaseVexVmi_AfterImm:
}
break;
}
+
+ // AMX Instructions
+ // ----------------
+
+ case InstDB::kEncodingAmxCfg:
+ if (isign3 == ENC_OPS1(Mem)) {
+ rmRel = &o0;
+ goto EmitVexEvexM;
+ }
+ break;
+
+ case InstDB::kEncodingAmxR:
+ if (isign3 == ENC_OPS1(Reg)) {
+ opReg = o0.id();
+ rbReg = 0;
+ goto EmitVexEvexR;
+ }
+ break;
+
+ case InstDB::kEncodingAmxRm:
+ if (isign3 == ENC_OPS2(Reg, Mem)) {
+ opReg = o0.id();
+ rmRel = &o1;
+ goto EmitVexEvexM;
+ }
+ break;
+
+ case InstDB::kEncodingAmxMr:
+ if (isign3 == ENC_OPS2(Mem, Reg)) {
+ opReg = o1.id();
+ rmRel = &o0;
+ goto EmitVexEvexM;
+ }
+ break;
+
+ case InstDB::kEncodingAmxRmv:
+ if (isign3 == ENC_OPS3(Reg, Reg, Reg)) {
+ opReg = x86PackRegAndVvvvv(o0.id(), o2.id());
+ rbReg = o1.id();
+ goto EmitVexEvexR;
+ }
+ break;
}
goto InvalidInstruction;
- // --------------------------------------------------------------------------
- // [Emit - X86]
- // --------------------------------------------------------------------------
+ // Emit - X86 Opcode
+ // -----------------
EmitX86OpMovAbs:
immSize = FastUInt8(registerSize());
@@ -3628,6 +3886,9 @@ EmitX86Op:
writer.emitImmediate(uint64_t(immValue), immSize);
goto EmitDone;
+ // Emit - X86 - Opcode + Reg
+ // -------------------------
+
EmitX86OpReg:
// Emit mandatory instruction prefix.
writer.emitPP(opcode.v);
@@ -3649,8 +3910,10 @@ EmitX86OpReg:
writer.emitImmediate(uint64_t(immValue), immSize);
goto EmitDone;
+ // Emit - X86 - Opcode with Implicit <mem> Operand
+ // -----------------------------------------------
+
EmitX86OpImplicitMem:
- // NOTE: Don't change the emit order here, it's compatible with KeyStone/LLVM.
rmInfo = x86MemInfo[rmRel->as<Mem>().baseAndIndexTypes()];
if (ASMJIT_UNLIKELY(rmRel->as<Mem>().hasOffset() || (rmInfo & kX86MemInfo_Index)))
goto InvalidInstruction;
@@ -3667,19 +3930,61 @@ EmitX86OpImplicitMem:
writer.emit8If(rex | kX86ByteRex, rex != 0);
}
+ // Emit override prefixes.
writer.emitSegmentOverride(rmRel->as<Mem>().segmentId());
writer.emitAddressOverride((rmInfo & _addressOverrideMask()) != 0);
// Emit instruction opcodes.
writer.emitMMAndOpcode(opcode.v);
+
+ // Emit immediate value.
writer.emitImmediate(uint64_t(immValue), immSize);
goto EmitDone;
+ // Emit - X86 - Opcode /r - Register
+ // ---------------------------------
+
EmitX86R:
// Mandatory instruction prefix.
writer.emitPP(opcode.v);
- // Rex prefix (64-bit only).
+ // Emit REX prefix (64-bit only).
+ {
+ uint32_t rex = opcode.extractRex(options) |
+ ((opReg & 0x08) >> 1) | // REX.R (0x04).
+ ((rbReg & 0x08) >> 3) ; // REX.B (0x01).
+
+ if (ASMJIT_UNLIKELY(x86IsRexInvalid(rex)))
+ goto InvalidRexPrefix;
+ rex &= ~kX86ByteInvalidRex & 0xFF;
+ writer.emit8If(rex | kX86ByteRex, rex != 0);
+
+ opReg &= 0x07;
+ rbReg &= 0x07;
+ }
+
+ // Emit instruction opcodes.
+ writer.emitMMAndOpcode(opcode.v);
+
+ // Emit ModR.
+ writer.emit8(x86EncodeMod(3, opReg, rbReg));
+
+ // Emit immediate value.
+ writer.emitImmediate(uint64_t(immValue), immSize);
+ goto EmitDone;
+
+ // Emit - X86 - Opcode /r - Memory Base
+ // ------------------------------------
+
+EmitX86RFromM:
+ rmInfo = x86MemInfo[rmRel->as<Mem>().baseAndIndexTypes()];
+ if (ASMJIT_UNLIKELY(rmRel->as<Mem>().hasOffset() || (rmInfo & kX86MemInfo_Index)))
+ goto InvalidInstruction;
+
+ // Emit mandatory instruction prefix.
+ writer.emitPP(opcode.v);
+
+ // Emit REX prefix (64-bit only).
{
uint32_t rex = opcode.extractRex(options) |
((opReg & 0x08) >> 1) | // REX.R (0x04).
@@ -3694,32 +3999,42 @@ EmitX86R:
rbReg &= 0x07;
}
- // Instruction opcodes.
+ // Emit override prefixes.
+ writer.emitSegmentOverride(rmRel->as<Mem>().segmentId());
+ writer.emitAddressOverride((rmInfo & _addressOverrideMask()) != 0);
+
+ // Emit instruction opcodes.
writer.emitMMAndOpcode(opcode.v);
- // ModR.
+
+ // Emit ModR/M.
writer.emit8(x86EncodeMod(3, opReg, rbReg));
+
+ // Emit immediate value.
writer.emitImmediate(uint64_t(immValue), immSize);
goto EmitDone;
+ // Emit - X86 - Opcode /r - memory Operand
+ // ---------------------------------------
+
EmitX86M:
// `rmRel` operand must be memory.
ASMJIT_ASSERT(rmRel != nullptr);
- ASMJIT_ASSERT(rmRel->opType() == Operand::kOpMem);
+ ASMJIT_ASSERT(rmRel->opType() == OperandType::kMem);
ASMJIT_ASSERT((opcode & Opcode::kCDSHL_Mask) == 0);
+ // Emit override prefixes.
rmInfo = x86MemInfo[rmRel->as<Mem>().baseAndIndexTypes()];
writer.emitSegmentOverride(rmRel->as<Mem>().segmentId());
memOpAOMark = writer.cursor();
writer.emitAddressOverride((rmInfo & _addressOverrideMask()) != 0);
- // Mandatory instruction prefix.
+ // Emit mandatory instruction prefix.
writer.emitPP(opcode.v);
+ // Emit REX prefix (64-bit only).
rbReg = rmRel->as<Mem>().baseId();
rxReg = rmRel->as<Mem>().indexId();
-
- // REX prefix (64-bit only).
{
uint32_t rex;
@@ -3738,13 +4053,13 @@ EmitX86M:
opReg &= 0x07;
}
- // Instruction opcodes.
+ // Emit instruction opcodes.
writer.emitMMAndOpcode(opcode.v);
+
// ... Fall through ...
- // --------------------------------------------------------------------------
- // [Emit - MOD/SIB]
- // --------------------------------------------------------------------------
+ // Emit - MOD/SIB
+ // --------------
EmitModSib:
if (!(rmInfo & (kX86MemInfo_Index | kX86MemInfo_67H_X86))) {
@@ -3754,25 +4069,28 @@ EmitModSib:
relOffset = rmRel->as<Mem>().offsetLo32();
uint32_t mod = x86EncodeMod(0, opReg, rbReg);
- if (rbReg == Gp::kIdSp) {
- // [XSP|R12].
- if (relOffset == 0) {
+ bool forceSIB = commonInfo->isTsibOp();
+
+ if (rbReg == Gp::kIdSp || forceSIB) {
+ // TSIB or [XSP|R12].
+ mod = (mod & 0xF8u) | 0x04u;
+ if (rbReg != Gp::kIdBp && relOffset == 0) {
writer.emit8(mod);
- writer.emit8(x86EncodeSib(0, 4, 4));
+ writer.emit8(x86EncodeSib(0, 4, rbReg));
}
- // [XSP|R12 + DISP8|DISP32].
+ // TSIB or [XSP|R12 + DISP8|DISP32].
else {
uint32_t cdShift = (opcode & Opcode::kCDSHL_Mask) >> Opcode::kCDSHL_Shift;
int32_t cdOffset = relOffset >> cdShift;
if (Support::isInt8(cdOffset) && relOffset == int32_t(uint32_t(cdOffset) << cdShift)) {
writer.emit8(mod + 0x40); // <- MOD(1, opReg, rbReg).
- writer.emit8(x86EncodeSib(0, 4, 4));
+ writer.emit8(x86EncodeSib(0, 4, rbReg));
writer.emit8(cdOffset & 0xFF);
}
else {
writer.emit8(mod + 0x80); // <- MOD(2, opReg, rbReg).
- writer.emit8(x86EncodeSib(0, 4, 4));
+ writer.emit8(x86EncodeSib(0, 4, rbReg));
writer.emit32uLE(uint32_t(relOffset));
}
}
@@ -3798,12 +4116,12 @@ EmitModSib:
}
// ==========|> [ABSOLUTE | DISP32].
else if (!(rmInfo & (kX86MemInfo_BaseLabel | kX86MemInfo_BaseRip))) {
- uint32_t addrType = rmRel->as<Mem>().addrType();
+ Mem::AddrType addrType = rmRel->as<Mem>().addrType();
relOffset = rmRel->as<Mem>().offsetLo32();
if (is32Bit()) {
// Explicit relative addressing doesn't work in 32-bit mode.
- if (ASMJIT_UNLIKELY(addrType == BaseMem::kAddrTypeRel))
+ if (ASMJIT_UNLIKELY(addrType == Mem::AddrType::kRel))
goto InvalidAddress;
writer.emit8(x86EncodeMod(0, opReg, 5));
@@ -3814,14 +4132,13 @@ EmitModSib:
bool isOffsetU32 = rmRel->as<Mem>().offsetHi32() == 0;
uint64_t baseAddress = code()->baseAddress();
- // If relative addressing was not explicitly set then we can try to guess.
- // By guessing we check some properties of the memory operand and try to
- // base the decision on the segment prefix and the address type.
- if (addrType == BaseMem::kAddrTypeDefault) {
+ // If relative addressing was not explicitly set then we can try to guess. By guessing we check some
+ // properties of the memory operand and try to base the decision on the segment prefix and the address type.
+ if (addrType == Mem::AddrType::kDefault) {
if (baseAddress == Globals::kNoBaseAddress) {
// Prefer absolute addressing mode if the offset is 32-bit.
- addrType = isOffsetI32 || isOffsetU32 ? BaseMem::kAddrTypeAbs
- : BaseMem::kAddrTypeRel;
+ addrType = isOffsetI32 || isOffsetU32 ? Mem::AddrType::kAbs
+ : Mem::AddrType::kRel;
}
else {
// Prefer absolute addressing mode if FS|GS segment override is present.
@@ -3829,30 +4146,30 @@ EmitModSib:
// Prefer absolute addressing mode if this is LEA with 32-bit immediate.
bool isLea32 = (instId == Inst::kIdLea) && (isOffsetI32 || isOffsetU32);
- addrType = hasFsGs || isLea32 ? BaseMem::kAddrTypeAbs
- : BaseMem::kAddrTypeRel;
+ addrType = hasFsGs || isLea32 ? Mem::AddrType::kAbs
+ : Mem::AddrType::kRel;
}
}
- if (addrType == BaseMem::kAddrTypeRel) {
+ if (addrType == Mem::AddrType::kRel) {
uint32_t kModRel32Size = 5;
uint64_t virtualOffset = uint64_t(writer.offsetFrom(_bufferData)) + immSize + kModRel32Size;
- if (baseAddress == Globals::kNoBaseAddress) {
+ if (baseAddress == Globals::kNoBaseAddress || _section->id() != 0) {
// Create a new RelocEntry as we cannot calculate the offset right now.
- err = _code->newRelocEntry(&re, RelocEntry::kTypeAbsToRel, 4);
+ err = _code->newRelocEntry(&re, RelocType::kAbsToRel);
if (ASMJIT_UNLIKELY(err))
goto Failed;
writer.emit8(x86EncodeMod(0, opReg, 5));
- writer.emit32uLE(0);
re->_sourceSectionId = _section->id();
re->_sourceOffset = offset();
- re->_leadingSize = uint8_t(writer.offsetFrom(_bufferPtr) - 4);
- re->_trailingSize = uint8_t(immSize);
+ re->_format.resetToSimpleValue(OffsetType::kSignedOffset, 4);
+ re->_format.setLeadingAndTrailingSize(writer.offsetFrom(_bufferPtr), immSize);
re->_payload = uint64_t(rmRel->as<Mem>().offset());
+ writer.emit32uLE(0);
writer.emitImmediate(uint64_t(immValue), immSize);
goto EmitDone;
}
@@ -3875,22 +4192,19 @@ EmitModSib:
}
}
- // Handle unsigned 32-bit address that doesn't work with sign extension.
- // Consider the following instructions:
+ // Handle unsigned 32-bit address that doesn't work with sign extension. Consider the following instructions:
//
// 1. lea rax, [-1] - Sign extended to 0xFFFFFFFFFFFFFFFF
// 2. lea rax, [0xFFFFFFFF] - Zero extended to 0x00000000FFFFFFFF
// 3. add rax, [-1] - Sign extended to 0xFFFFFFFFFFFFFFFF
// 4. add rax, [0xFFFFFFFF] - Zero extended to 0x00000000FFFFFFFF
//
- // Sign extension is naturally performed by the CPU so we don't have to
- // bother, however, zero extension requires address-size override prefix,
- // which we probably don't have at this moment. So to make the address
+ // Sign extension is naturally performed by the CPU so we don't have to bother, however, zero extension
+ // requires address-size override prefix, which we probably don't have at this moment. So to make the address
// valid we need to insert it at `memOpAOMark` if it's not already there.
//
- // If this is 'lea' instruction then it's possible to remove REX.W part
- // from REX prefix (if it's there), which would be one-byte shorter than
- // inserting address-size override.
+ // If this is 'lea' instruction then it's possible to remove REX.W part from REX prefix (if it's there), which
+ // would be one-byte shorter than inserting address-size override.
//
// NOTE: If we don't do this then these instructions are unencodable.
if (!isOffsetI32) {
@@ -3901,16 +4215,15 @@ EmitModSib:
// We only patch the existing code if we don't have address-size override.
if (*memOpAOMark != 0x67) {
if (instId == Inst::kIdLea) {
- // LEA: Remove REX.W, if present. This is easy as we know that 'lea'
- // doesn't use any PP prefix so if REX prefix was emitted it would be
- // at `memOpAOMark`.
+ // LEA: Remove REX.W, if present. This is easy as we know that 'lea' doesn't use any PP prefix so if REX
+ // prefix was emitted it would be at `memOpAOMark`.
uint32_t rex = *memOpAOMark;
if (rex & kX86ByteRex) {
rex &= (~kX86ByteRexW) & 0xFF;
*memOpAOMark = uint8_t(rex);
// We can remove the REX prefix completely if it was not forced.
- if (rex == kX86ByteRex && !(options & Inst::kOptionRex))
+ if (rex == kX86ByteRex && !Support::test(options, InstOptions::kX86_Rex))
writer.remove8(memOpAOMark);
}
}
@@ -3943,14 +4256,14 @@ EmitModSib_LabelRip_X86:
if (ASMJIT_UNLIKELY(!label))
goto InvalidLabel;
- err = _code->newRelocEntry(&re, RelocEntry::kTypeRelToAbs, 4);
+ err = _code->newRelocEntry(&re, RelocType::kRelToAbs);
if (ASMJIT_UNLIKELY(err))
goto Failed;
re->_sourceSectionId = _section->id();
re->_sourceOffset = offset();
- re->_leadingSize = uint8_t(writer.offsetFrom(_bufferPtr));
- re->_trailingSize = uint8_t(immSize);
+ re->_format.resetToSimpleValue(OffsetType::kUnsignedOffset, 4);
+ re->_format.setLeadingAndTrailingSize(writer.offsetFrom(_bufferPtr), immSize);
re->_payload = uint64_t(int64_t(relOffset));
if (label->isBound()) {
@@ -3968,16 +4281,16 @@ EmitModSib_LabelRip_X86:
}
else {
// [RIP->ABS].
- err = _code->newRelocEntry(&re, RelocEntry::kTypeRelToAbs, 4);
+ err = _code->newRelocEntry(&re, RelocType::kRelToAbs);
if (ASMJIT_UNLIKELY(err))
goto Failed;
re->_sourceSectionId = _section->id();
re->_targetSectionId = _section->id();
+ re->_format.resetToSimpleValue(OffsetType::kUnsignedOffset, 4);
+ re->_format.setLeadingAndTrailingSize(writer.offsetFrom(_bufferPtr), immSize);
re->_sourceOffset = offset();
- re->_leadingSize = uint8_t(writer.offsetFrom(_bufferPtr));
- re->_trailingSize = uint8_t(immSize);
- re->_payload = re->_sourceOffset + re->_leadingSize + 4 + re->_trailingSize + uint64_t(int64_t(relOffset));
+ re->_payload = re->_sourceOffset + re->_format.regionSize() + uint64_t(int64_t(relOffset));
writer.emit32uLE(0);
}
@@ -4010,8 +4323,8 @@ EmitModSib_LabelRip_X86:
}
}
else if (!(rmInfo & kX86MemInfo_67H_X86)) {
- // ESP|RSP can't be used as INDEX in pure SIB mode, however, VSIB mode
- // allows XMM4|YMM4|ZMM4 (that's why the check is before the label).
+ // ESP|RSP can't be used as INDEX in pure SIB mode, however, VSIB mode allows XMM4|YMM4|ZMM4 (that's why the
+ // check is before the label).
if (ASMJIT_UNLIKELY(rxReg == Gp::kIdSp))
goto InvalidAddressIndex;
@@ -4075,10 +4388,9 @@ EmitModVSib:
// 16-bit address mode (32-bit mode with 67 override prefix).
relOffset = (int32_t(rmRel->as<Mem>().offsetLo32()) << 16) >> 16;
- // NOTE: 16-bit addresses don't use SIB byte and their encoding differs. We
- // use a table-based approach to calculate the proper MOD byte as it's easier.
- // Also, not all BASE [+ INDEX] combinations are supported in 16-bit mode, so
- // this may fail.
+ // NOTE: 16-bit addresses don't use SIB byte and their encoding differs. We use a table-based approach to
+ // calculate the proper MOD byte as it's easier. Also, not all BASE [+ INDEX] combinations are supported
+ // in 16-bit mode, so this may fail.
const uint32_t kBaseGpIdx = (kX86MemInfo_BaseGp | kX86MemInfo_Index);
if (rmInfo & kBaseGpIdx) {
@@ -4130,9 +4442,8 @@ EmitModVSib:
writer.emitImmediate(uint64_t(immValue), immSize);
goto EmitDone;
- // --------------------------------------------------------------------------
- // [Emit - FPU]
- // --------------------------------------------------------------------------
+ // Emit - FPU
+ // ----------
EmitFpuOp:
// Mandatory instruction prefix.
@@ -4143,31 +4454,29 @@ EmitFpuOp:
writer.emit8(opcode.v);
goto EmitDone;
- // --------------------------------------------------------------------------
- // [Emit - VEX / EVEX]
- // --------------------------------------------------------------------------
+ // Emit - VEX Opcode
+ // -----------------
-EmitVexEvexOp:
+EmitVexOp:
{
// These don't use immediate.
ASMJIT_ASSERT(immSize == 0);
- // Only 'vzeroall' and 'vzeroupper' instructions use this encoding, they
- // don't define 'W' to be '1' so we can just check the 'mmmmm' field. Both
- // functions can encode by using VEX2 prefix so VEX3 is basically only used
+ // Only 'vzeroall' and 'vzeroupper' instructions use this encoding, they don't define 'W' to be '1' so we can
+ // just check the 'mmmmm' field. Both functions can encode by using VEX2 prefix so VEX3 is basically only used
// when specified as instruction option.
ASMJIT_ASSERT((opcode & Opcode::kW) == 0);
- uint32_t x = ((opcode & Opcode::kMM_Mask ) >> (Opcode::kMM_Shift )) |
- ((opcode & Opcode::kLL_Mask ) >> (Opcode::kLL_Shift - 10)) |
- ((opcode & Opcode::kPP_VEXMask ) >> (Opcode::kPP_Shift - 8)) |
- ((options & Inst::kOptionVex3 ) >> (Opcode::kMM_Shift )) ;
- if (x & 0x04u) {
- x = (x & (0x4 ^ 0xFFFF)) << 8; // [00000000|00000Lpp|0000m0mm|00000000].
- x ^= (kX86ByteVex3) | // [........|00000Lpp|0000m0mm|__VEX3__].
- (0x07u << 13) | // [........|00000Lpp|1110m0mm|__VEX3__].
- (0x0Fu << 19) | // [........|01111Lpp|1110m0mm|__VEX3__].
- (opcode << 24) ; // [_OPCODE_|01111Lpp|1110m0mm|__VEX3__].
+ uint32_t x = (uint32_t(opcode & Opcode::kMM_Mask ) >> (Opcode::kMM_Shift )) |
+ (uint32_t(opcode & Opcode::kLL_Mask ) >> (Opcode::kLL_Shift - 10)) |
+ (uint32_t(opcode & Opcode::kPP_VEXMask ) >> (Opcode::kPP_Shift - 8)) ;
+
+ if (Support::test(options, InstOptions::kX86_Vex3)) {
+ x = (x & 0xFFFF) << 8; // [00000000|00000Lpp|000mmmmm|00000000].
+ x ^= (kX86ByteVex3) | // [........|00000Lpp|000mmmmm|__VEX3__].
+ (0x07u << 13) | // [........|00000Lpp|111mmmmm|__VEX3__].
+ (0x0Fu << 19) | // [........|01111Lpp|111mmmmm|__VEX3__].
+ (opcode << 24) ; // [_OPCODE_|01111Lpp|111mmmmm|__VEX3__].
writer.emit32uLE(x);
goto EmitDone;
@@ -4181,67 +4490,83 @@ EmitVexEvexOp:
}
}
+ // Emit - VEX|EVEX - /r - Register
+ // -------------------------------
+
EmitVexEvexR:
{
// Construct `x` - a complete EVEX|VEX prefix.
- uint32_t x = ((opReg << 4) & 0xF980u) | // [........|........|Vvvvv..R|R.......].
- ((rbReg << 2) & 0x0060u) | // [........|........|........|.BB.....].
- (opcode.extractLLMM(options)) | // [........|.LL.....|Vvvvv..R|RBBmmmmm].
- (_extraReg.id() << 16); // [........|.LL..aaa|Vvvvv..R|RBBmmmmm].
+ uint32_t x = ((opReg << 4) & 0xF980u) | // [........|........|Vvvvv..R|R.......].
+ ((rbReg << 2) & 0x0060u) | // [........|........|........|.BB.....].
+ (opcode.extractLLMMMMM(options)) | // [........|.LL.....|Vvvvv..R|RBBmmmmm].
+ (_extraReg.id() << 16); // [........|.LL..aaa|Vvvvv..R|RBBmmmmm].
opReg &= 0x7;
// Handle AVX512 options by a single branch.
- const uint32_t kAvx512Options = Inst::kOptionZMask | Inst::kOptionER | Inst::kOptionSAE;
- if (options & kAvx512Options) {
- uint32_t kBcstMask = 0x1 << 20;
- uint32_t kLLMask10 = 0x2 << 21;
- uint32_t kLLMask11 = 0x3 << 21;
+ const InstOptions kAvx512Options = InstOptions::kX86_ZMask | InstOptions::kX86_ER | InstOptions::kX86_SAE;
+ if (Support::test(options, kAvx512Options)) {
+ static constexpr uint32_t kBcstMask = 0x1 << 20;
+ static constexpr uint32_t kLLMask10 = 0x2 << 21;
+ static constexpr uint32_t kLLMask11 = 0x3 << 21;
- // Designed to be easily encodable so the position must be exact.
- // The {rz-sae} is encoded as {11}, so it should match the mask.
- ASMJIT_ASSERT(Inst::kOptionRZ_SAE == kLLMask11);
+ // Designed to be easily encodable so the position must be exact. The {rz-sae} is encoded as {11},
+ // so it should match the mask.
+ static_assert(uint32_t(InstOptions::kX86_RZ_SAE) == kLLMask11,
+ "This code requires InstOptions::X86_RZ_SAE to match kLLMask11 to work properly");
- x |= options & Inst::kOptionZMask; // [........|zLLb.aaa|Vvvvv..R|RBBmmmmm].
+ x |= uint32_t(options & InstOptions::kX86_ZMask); // [........|zLLb.aaa|Vvvvv..R|RBBmmmmm].
// Support embedded-rounding {er} and suppress-all-exceptions {sae}.
- if (options & (Inst::kOptionER | Inst::kOptionSAE)) {
- // Embedded rounding is only encodable if the instruction is either
- // scalar or it's a 512-bit operation as the {er} rounding predicate
- // collides with LL part of the instruction.
+ if (Support::test(options, InstOptions::kX86_ER | InstOptions::kX86_SAE)) {
+ // Embedded rounding is only encodable if the instruction is either scalar or it's a 512-bit
+ // operation as the {er} rounding predicate collides with LL part of the instruction.
if ((x & kLLMask11) != kLLMask10) {
- // Ok, so LL is not 10, thus the instruction must be scalar.
- // Scalar instructions don't support broadcast so if this
- // instruction supports it {er} nor {sae} would be encodable.
+ // Ok, so LL is not 10, thus the instruction must be scalar. Scalar instructions don't
+ // support broadcast so if this instruction supports it {er} nor {sae} would be encodable.
if (ASMJIT_UNLIKELY(commonInfo->hasAvx512B()))
goto InvalidEROrSAE;
}
- if (options & Inst::kOptionER) {
+ if (Support::test(options, InstOptions::kX86_ER)) {
if (ASMJIT_UNLIKELY(!commonInfo->hasAvx512ER()))
goto InvalidEROrSAE;
- x &=~kLLMask11; // [........|.00..aaa|Vvvvv..R|RBBmmmmm].
- x |= kBcstMask | (options & kLLMask11); // [........|.LLb.aaa|Vvvvv..R|RBBmmmmm].
+ x &=~kLLMask11; // [........|.00..aaa|Vvvvv..R|RBBmmmmm].
+ x |= kBcstMask | (uint32_t(options) & kLLMask11); // [........|.LLb.aaa|Vvvvv..R|RBBmmmmm].
}
else {
if (ASMJIT_UNLIKELY(!commonInfo->hasAvx512SAE()))
goto InvalidEROrSAE;
- x |= kBcstMask; // [........|.LLb.aaa|Vvvvv..R|RBBmmmmm].
+ x &=~kLLMask11; // [........|.00..aaa|Vvvvv..R|RBBmmmmm].
+ x |= kBcstMask; // [........|.00b.aaa|Vvvvv..R|RBBmmmmm].
}
}
}
- // Check if EVEX is required by checking bits in `x` : [........|xx.x.xxx|x......x|.x.x....].
- if (x & 0x00D78150u) {
- uint32_t y = ((x << 4) & 0x00080000u) | // [........|...bV...|........|........].
- ((x >> 4) & 0x00000010u) ; // [........|...bV...|........|...R....].
- x = (x & 0x00FF78E3u) | y; // [........|zLLbVaaa|0vvvv000|RBBR00mm].
- x = x << 8; // [zLLbVaaa|0vvvv000|RBBR00mm|00000000].
- x |= (opcode >> kVSHR_W ) & 0x00800000u; // [zLLbVaaa|Wvvvv000|RBBR00mm|00000000].
- x |= (opcode >> kVSHR_PP_EW) & 0x00830000u; // [zLLbVaaa|Wvvvv0pp|RBBR00mm|00000000] (added PP and EVEX.W).
- // _ ____ ____
- x ^= 0x087CF000u | kX86ByteEvex; // [zLLbVaaa|Wvvvv1pp|RBBR00mm|01100010].
+ // These bits would force EVEX prefix.
+ constexpr uint32_t kEvexForce = 0x00000010u; // [........|........|........|...x....].
+ constexpr uint32_t kEvexBits = 0x00D78150u; // [........|xx.x.xxx|x......x|.x.x....].
+
+ // Force EVEX prefix even in case the instruction has VEX encoding, because EVEX encoding is preferred. At the
+ // moment this is only required by AVX_VNNI instructions, which were added after AVX512_VNNI instructions. If
+ // such instruction doesn't specify prefix, EVEX (AVX512_VNNI) is selected by default.
+ if (commonInfo->preferEvex()) {
+ if ((x & kEvexBits) == 0 && !Support::test(options, InstOptions::kX86_Vex | InstOptions::kX86_Vex3)) {
+ x |= kEvexForce;
+ }
+ }
+
+ // Check if EVEX is required by checking bits in `x` : [........|xx.x.xxx|x......x|.x.x....].
+ if (x & kEvexBits) {
+ uint32_t y = ((x << 4) & 0x00080000u) | // [........|...bV...|........|........].
+ ((x >> 4) & 0x00000010u) ; // [........|...bV...|........|...R....].
+ x = (x & 0x00FF78EFu) | y; // [........|zLLbVaaa|0vvvv000|RBBRmmmm].
+ x = x << 8; // [zLLbVaaa|0vvvv000|RBBRmmmm|00000000].
+ x |= (opcode >> kVSHR_W ) & 0x00800000u; // [zLLbVaaa|Wvvvv000|RBBRmmmm|00000000].
+ x |= (opcode >> kVSHR_PP_EW) & 0x00830000u; // [zLLbVaaa|Wvvvv0pp|RBBRmmmm|00000000] (added PP and EVEX.W).
+ // _ ____ ____
+ x ^= 0x087CF000u | kX86ByteEvex; // [zLLbVaaa|Wvvvv1pp|RBBRmmmm|01100010].
writer.emit32uLE(x);
writer.emit8(opcode.v);
@@ -4252,19 +4577,20 @@ EmitVexEvexR:
goto EmitDone;
}
- // Not EVEX, prepare `x` for VEX2 or VEX3: x = [........|00L00000|0vvvv000|R0B0mmmm].
- x |= ((opcode >> (kVSHR_W + 8)) & 0x8000u) | // [00000000|00L00000|Wvvvv000|R0B0mmmm].
- ((opcode >> (kVSHR_PP + 8)) & 0x0300u) | // [00000000|00L00000|0vvvv0pp|R0B0mmmm].
- ((x >> 11 ) & 0x0400u) ; // [00000000|00L00000|WvvvvLpp|R0B0mmmm].
+ // Not EVEX, prepare `x` for VEX2 or VEX3: x = [........|00L00000|0vvvv000|R0Bmmmmm].
+ x |= ((opcode >> (kVSHR_W + 8)) & 0x8000u) | // [00000000|00L00000|Wvvvv000|R0Bmmmmm].
+ ((opcode >> (kVSHR_PP + 8)) & 0x0300u) | // [00000000|00L00000|0vvvv0pp|R0Bmmmmm].
+ ((x >> 11 ) & 0x0400u) ; // [00000000|00L00000|WvvvvLpp|R0Bmmmmm].
+ x |= x86GetForceEvex3MaskInLastBit(options); // [x0000000|00L00000|WvvvvLpp|R0Bmmmmm].
- // Check if VEX3 is required / forced: [........|........|x.......|..x..x..].
- if (x & 0x0008024u) {
+ // Check if VEX3 is required / forced: [x.......|........|x.......|..xxxxx.].
+ if (x & 0x8000803Eu) {
uint32_t xorMsk = x86VEXPrefix[x & 0xF] | (opcode << 24);
- // Clear 'FORCE-VEX3' bit and all high bits.
- x = (x & (0x4 ^ 0xFFFF)) << 8; // [00000000|WvvvvLpp|R0B0m0mm|00000000].
- // ____ _ _
- x ^= xorMsk; // [_OPCODE_|WvvvvLpp|R1Bmmmmm|VEX3|XOP].
+ // Clear all high bits.
+ x = (x & 0xFFFF) << 8; // [00000000|WvvvvLpp|R0Bmmmmm|00000000].
+ // ____ _ _
+ x ^= xorMsk; // [_OPCODE_|WvvvvLpp|R1Bmmmmm|VEX3|XOP].
writer.emit32uLE(x);
rbReg &= 0x7;
@@ -4288,9 +4614,12 @@ EmitVexEvexR:
}
}
+ // Emit - VEX|EVEX - /r - Memory
+ // -----------------------------
+
EmitVexEvexM:
ASMJIT_ASSERT(rmRel != nullptr);
- ASMJIT_ASSERT(rmRel->opType() == Operand::kOpMem);
+ ASMJIT_ASSERT(rmRel->opType() == OperandType::kMem);
rmInfo = x86MemInfo[rmRel->as<Mem>().baseAndIndexTypes()];
writer.emitSegmentOverride(rmRel->as<Mem>().segmentId());
@@ -4305,49 +4634,83 @@ EmitVexEvexM:
uint32_t broadcastBit = uint32_t(rmRel->as<Mem>().hasBroadcast());
// Construct `x` - a complete EVEX|VEX prefix.
- uint32_t x = ((opReg << 4) & 0x0000F980u) | // [........|........|Vvvvv..R|R.......].
- ((rxReg << 3) & 0x00000040u) | // [........|........|........|.X......].
- ((rxReg << 15) & 0x00080000u) | // [........|....X...|........|........].
- ((rbReg << 2) & 0x00000020u) | // [........|........|........|..B.....].
- opcode.extractLLMM(options) | // [........|.LL.X...|Vvvvv..R|RXBmmmmm].
- (_extraReg.id() << 16) | // [........|.LL.Xaaa|Vvvvv..R|RXBmmmmm].
- (broadcastBit << 20) ; // [........|.LLbXaaa|Vvvvv..R|RXBmmmmm].
+ uint32_t x = ((opReg << 4) & 0x0000F980u) | // [........|........|Vvvvv..R|R.......].
+ ((rxReg << 3) & 0x00000040u) | // [........|........|........|.X......].
+ ((rxReg << 15) & 0x00080000u) | // [........|....X...|........|........].
+ ((rbReg << 2) & 0x00000020u) | // [........|........|........|..B.....].
+ opcode.extractLLMMMMM(options) | // [........|.LL.X...|Vvvvv..R|RXBmmmmm].
+ (_extraReg.id() << 16) | // [........|.LL.Xaaa|Vvvvv..R|RXBmmmmm].
+ (broadcastBit << 20) ; // [........|.LLbXaaa|Vvvvv..R|RXBmmmmm].
opReg &= 0x07u;
- // Mark invalid VEX (force EVEX) case: // [@.......|.LLbXaaa|Vvvvv..R|RXBmmmmm].
- x |= (~commonInfo->flags() & InstDB::kFlagVex) << (31 - Support::constCtz(InstDB::kFlagVex));
+ // Mark invalid VEX (force EVEX) case: // [@.......|.LLbXaaa|Vvvvv..R|RXBmmmmm].
+ x |= uint32_t(~commonInfo->flags() & InstDB::InstFlags::kVex) << (31 - Support::ConstCTZ<uint32_t(InstDB::InstFlags::kVex)>::value);
// Handle AVX512 options by a single branch.
- const uint32_t kAvx512Options = Inst::kOptionZMask |
- Inst::kOptionER |
- Inst::kOptionSAE ;
- if (options & kAvx512Options) {
+ const InstOptions kAvx512Options = InstOptions::kX86_ZMask |
+ InstOptions::kX86_ER |
+ InstOptions::kX86_SAE ;
+ if (Support::test(options, kAvx512Options)) {
// {er} and {sae} are both invalid if memory operand is used.
- if (ASMJIT_UNLIKELY(options & (Inst::kOptionER | Inst::kOptionSAE)))
+ if (ASMJIT_UNLIKELY(Support::test(options, InstOptions::kX86_ER | InstOptions::kX86_SAE)))
goto InvalidEROrSAE;
- x |= options & (Inst::kOptionZMask); // [@.......|zLLbXaaa|Vvvvv..R|RXBmmmmm].
+ x |= uint32_t(options & InstOptions::kX86_ZMask); // [@.......|zLLbXaaa|Vvvvv..R|RXBmmmmm].
}
- // Check if EVEX is required by checking bits in `x` : [@.......|xx.xxxxx|x......x|...x....].
- if (x & 0x80DF8110u) {
- uint32_t y = ((x << 4) & 0x00080000u) | // [@.......|....V...|........|........].
- ((x >> 4) & 0x00000010u) ; // [@.......|....V...|........|...R....].
- x = (x & 0x00FF78E3u) | y; // [........|zLLbVaaa|0vvvv000|RXBR00mm].
- x = x << 8; // [zLLbVaaa|0vvvv000|RBBR00mm|00000000].
- x |= (opcode >> kVSHR_W ) & 0x00800000u; // [zLLbVaaa|Wvvvv000|RBBR00mm|00000000].
- x |= (opcode >> kVSHR_PP_EW) & 0x00830000u; // [zLLbVaaa|Wvvvv0pp|RBBR00mm|00000000] (added PP and EVEX.W).
- // _ ____ ____
- x ^= 0x087CF000u | kX86ByteEvex; // [zLLbVaaa|Wvvvv1pp|RBBR00mm|01100010].
+ // If these bits are used then EVEX prefix is required.
+ constexpr uint32_t kEvexForce = 0x00000010u; // [........|........|........|...x....].
+ constexpr uint32_t kEvexBits = 0x80DF8110u; // [@.......|xx.xxxxx|x......x|...x....].
- writer.emit32uLE(x);
- writer.emit8(opcode.v);
+ // Force EVEX prefix even in case the instruction has VEX encoding, because EVEX encoding is preferred. At the
+ // moment this is only required for AVX_VNNI instructions, which were added after AVX512_VNNI instructions. If
+ // such instruction doesn't specify prefix, EVEX (AVX512_VNNI) would be used by default,
+ if (commonInfo->preferEvex()) {
+ if ((x & kEvexBits) == 0 && !Support::test(options, InstOptions::kX86_Vex | InstOptions::kX86_Vex3)) {
+ x |= kEvexForce;
+ }
+ }
+
+ // Check if EVEX is required by checking bits in `x` : [@.......|xx.xxxxx|x......x|...x....].
+ if (x & kEvexBits) {
+ uint32_t y = ((x << 4) & 0x00080000u) | // [@.......|....V...|........|........].
+ ((x >> 4) & 0x00000010u) ; // [@.......|....V...|........|...R....].
+ x = (x & 0x00FF78EFu) | y; // [........|zLLbVaaa|0vvvv000|RXBRmmmm].
+ x = x << 8; // [zLLbVaaa|0vvvv000|RBBRmmmm|00000000].
+ x |= (opcode >> kVSHR_W ) & 0x00800000u; // [zLLbVaaa|Wvvvv000|RBBRmmmm|00000000].
+ x |= (opcode >> kVSHR_PP_EW) & 0x00830000u; // [zLLbVaaa|Wvvvv0pp|RBBRmmmm|00000000] (added PP and EVEX.W).
+ // _ ____ ____
+ x ^= 0x087CF000u | kX86ByteEvex; // [zLLbVaaa|Wvvvv1pp|RBBRmmmm|01100010].
if (x & 0x10000000u) {
- // Broadcast, change the compressed displacement scale to either x4 (SHL 2) or x8 (SHL 3)
- // depending on instruction's W. If 'W' is 1 'SHL' must be 3, otherwise it must be 2.
+ // Broadcast support.
+ //
+ // 1. Verify our LL field is correct as broadcast changes the "size" of the source operand. For example if
+ // a broadcasted operand is qword_ptr[X] {1to8} the source size becomes 64 and not 8 as the memory operand
+ // would report.
+ //
+ // 2. Change the compressed displacement scale to either x2 (SHL1), x4 (SHL 2), or x8 (SHL 3) depending on
+ // the broadcast unit/element size.
+ uint32_t broadcastUnitSize = commonInfo->broadcastSize();
+ uint32_t broadcastVectorSize = broadcastUnitSize << uint32_t(rmRel->as<Mem>().getBroadcast());
+
+ if (ASMJIT_UNLIKELY(broadcastUnitSize == 0))
+ goto InvalidBroadcast;
+
+ // LL was already shifted 8 bits right.
+ constexpr uint32_t kLLShift = 21 + 8;
+
+ uint32_t currentLL = x & (0x3u << kLLShift);
+ uint32_t broadcastLL = (Support::max<uint32_t>(Support::ctz(broadcastVectorSize), 4) - 4) << kLLShift;
+
+ if (broadcastLL > (2u << kLLShift))
+ goto InvalidBroadcast;
+
+ uint32_t newLL = Support::max(currentLL, broadcastLL);
+ x = (x & ~(uint32_t(0x3) << kLLShift)) | newLL;
+
opcode &=~uint32_t(Opcode::kCDSHL_Mask);
- opcode |= ((x & 0x00800000u) ? 3u : 2u) << Opcode::kCDSHL_Shift;
+ opcode |= Support::ctz(broadcastUnitSize) << Opcode::kCDSHL_Shift;
}
else {
// Add the compressed displacement 'SHF' to the opcode based on 'TTWLL'.
@@ -4357,24 +4720,28 @@ EmitVexEvexM:
((x >> 29) & 0x3);
opcode += x86CDisp8SHL[TTWLL];
}
+
+ writer.emit32uLE(x);
+ writer.emit8(opcode.v);
}
else {
- // Not EVEX, prepare `x` for VEX2 or VEX3: x = [........|00L00000|0vvvv000|RXB0mmmm].
- x |= ((opcode >> (kVSHR_W + 8)) & 0x8000u) | // [00000000|00L00000|Wvvvv000|RXB0mmmm].
- ((opcode >> (kVSHR_PP + 8)) & 0x0300u) | // [00000000|00L00000|Wvvvv0pp|RXB0mmmm].
- ((x >> 11 ) & 0x0400u) ; // [00000000|00L00000|WvvvvLpp|RXB0mmmm].
+ // Not EVEX, prepare `x` for VEX2 or VEX3: x = [........|00L00000|0vvvv000|RXBmmmmm].
+ x |= ((opcode >> (kVSHR_W + 8)) & 0x8000u) | // [00000000|00L00000|Wvvvv000|RXBmmmmm].
+ ((opcode >> (kVSHR_PP + 8)) & 0x0300u) | // [00000000|00L00000|Wvvvv0pp|RXBmmmmm].
+ ((x >> 11 ) & 0x0400u) ; // [00000000|00L00000|WvvvvLpp|RXBmmmmm].
+ x |= x86GetForceEvex3MaskInLastBit(options); // [x0000000|00L00000|WvvvvLpp|RXBmmmmm].
// Clear a possible CDisp specified by EVEX.
opcode &= ~Opcode::kCDSHL_Mask;
- // Check if VEX3 is required / forced: [........|........|x.......|.xx..x..].
- if (x & 0x0008064u) {
+ // Check if VEX3 is required / forced: [x.......|........|x.......|.xxxxxx.].
+ if (x & 0x8000807Eu) {
uint32_t xorMsk = x86VEXPrefix[x & 0xF] | (opcode << 24);
- // Clear 'FORCE-VEX3' bit and all high bits.
- x = (x & (0x4 ^ 0xFFFF)) << 8; // [00000000|WvvvvLpp|RXB0m0mm|00000000].
- // ____ ___
- x ^= xorMsk; // [_OPCODE_|WvvvvLpp|RXBmmmmm|VEX3_XOP].
+ // Clear all high bits.
+ x = (x & 0xFFFF) << 8; // [00000000|WvvvvLpp|RXBmmmmm|00000000].
+ // ____ ___
+ x ^= xorMsk; // [_OPCODE_|WvvvvLpp|RXBmmmmm|VEX3_XOP].
writer.emit32uLE(x);
}
else {
@@ -4390,7 +4757,7 @@ EmitVexEvexM:
}
// MOD|SIB address.
- if (!commonInfo->hasFlag(InstDB::kFlagVsib))
+ if (!commonInfo->hasFlag(InstDB::InstFlags::kVsib))
goto EmitModSib;
// MOD|VSIB address without INDEX is invalid.
@@ -4398,9 +4765,8 @@ EmitVexEvexM:
goto EmitModVSib;
goto InvalidInstruction;
- // --------------------------------------------------------------------------
- // [Emit - Jmp/Jcc/Call]
- // --------------------------------------------------------------------------
+ // Emit - Jmp/Jcc/Call
+ // -------------------
EmitJmpCall:
{
@@ -4440,7 +4806,7 @@ EmitJmpCall:
}
else {
// Non-bound label or label bound to a different section.
- if (opCode8 && (!opcode.v || (options & Inst::kOptionShortForm))) {
+ if (opCode8 && (!opcode.v || Support::test(options, InstOptions::kShortForm))) {
writer.emit8(opCode8);
// Record DISP8 (non-bound label).
@@ -4450,7 +4816,7 @@ EmitJmpCall:
}
else {
// Refuse also 'short' prefix, if specified.
- if (ASMJIT_UNLIKELY(!opcode.v || (options & Inst::kOptionShortForm) != 0))
+ if (ASMJIT_UNLIKELY(!opcode.v || Support::test(options, InstOptions::kShortForm)))
goto InvalidDisplacement;
writer.emit8If(0x0F, (opcode & Opcode::kMM_Mask) != 0);// Emit 0F prefix.
@@ -4469,9 +4835,8 @@ EmitJmpCall:
uint64_t baseAddress = code()->baseAddress();
uint64_t jumpAddress = rmRel->as<Imm>().valueAs<uint64_t>();
- // If the base-address is known calculate a relative displacement and
- // check if it fits in 32 bits (which is always true in 32-bit mode).
- // Emit relative displacement as it was a bound label if all checks are ok.
+ // If the base-address is known calculate a relative displacement and check if it fits in 32 bits (which is
+ // always true in 32-bit mode). Emit relative displacement as it was a bound label if all checks are ok.
if (baseAddress != Globals::kNoBaseAddress) {
uint64_t rel64 = jumpAddress - (ip + baseAddress) - inst32Size;
if (Environment::is32Bit(arch()) || Support::isInt32(int64_t(rel64))) {
@@ -4479,14 +4844,14 @@ EmitJmpCall:
goto EmitJmpCallRel;
}
else {
- // Relative displacement exceeds 32-bits - relocator can only
- // insert trampoline for jmp/call, but not for jcc/jecxz.
+ // Relative displacement exceeds 32-bits - relocator can only insert trampoline for jmp/call, but not
+ // for jcc/jecxz.
if (ASMJIT_UNLIKELY(!x86IsJmpOrCall(instId)))
goto InvalidDisplacement;
}
}
- err = _code->newRelocEntry(&re, RelocEntry::kTypeAbsToRel, 0);
+ err = _code->newRelocEntry(&re, RelocType::kAbsToRel);
if (ASMJIT_UNLIKELY(err))
goto Failed;
@@ -4495,10 +4860,9 @@ EmitJmpCall:
re->_payload = jumpAddress;
if (ASMJIT_LIKELY(opcode.v)) {
- // 64-bit: Emit REX prefix so the instruction can be patched later.
- // REX prefix does nothing if not patched, but allows to patch the
- // instruction to use MOD/M and to point to a memory where the final
- // 64-bit address is stored.
+ // 64-bit: Emit REX prefix so the instruction can be patched later. REX prefix does nothing if not patched,
+ // but allows to patch the instruction to use MOD/M and to point to a memory where the final 64-bit address
+ // is stored.
if (Environment::is64Bit(arch()) && x86IsJmpOrCall(instId)) {
if (!rex)
writer.emit8(kX86ByteRex);
@@ -4507,25 +4871,21 @@ EmitJmpCall:
if (ASMJIT_UNLIKELY(err))
goto Failed;
- re->_relocType = RelocEntry::kTypeX64AddressEntry;
+ re->_relocType = RelocType::kX64AddressEntry;
}
writer.emit8If(0x0F, (opcode & Opcode::kMM_Mask) != 0); // Emit 0F prefix.
writer.emit8(opcode.v); // Emit opcode.
writer.emit8If(x86EncodeMod(3, opReg, 0), opReg != 0); // Emit MOD.
+ re->_format.resetToSimpleValue(OffsetType::kSignedOffset, 4);
+ re->_format.setLeadingAndTrailingSize(writer.offsetFrom(_bufferPtr), immSize);
writer.emit32uLE(0); // Emit DISP32.
-
- re->_valueSize = 4;
- re->_leadingSize = uint8_t(writer.offsetFrom(_bufferPtr) - 4);
- re->_trailingSize = uint8_t(immSize);
}
else {
writer.emit8(opCode8); // Emit opcode.
+ re->_format.resetToSimpleValue(OffsetType::kSignedOffset, 1);
+ re->_format.setLeadingAndTrailingSize(writer.offsetFrom(_bufferPtr), immSize);
writer.emit8(0); // Emit DISP8 (zero).
-
- re->_valueSize = 1;
- re->_leadingSize = uint8_t(writer.offsetFrom(_bufferPtr) - 1);
- re->_trailingSize = uint8_t(immSize);
}
goto EmitDone;
}
@@ -4533,21 +4893,20 @@ EmitJmpCall:
// Not Label|Imm -> Invalid.
goto InvalidInstruction;
- // Emit jmp/call with relative displacement known at assembly-time. Decide
- // between 8-bit and 32-bit displacement encoding. Some instructions only
- // allow either 8-bit or 32-bit encoding, others allow both encodings.
+ // Emit jmp/call with relative displacement known at assembly-time. Decide between 8-bit and 32-bit displacement
+ // encoding. Some instructions only allow either 8-bit or 32-bit encoding, others allow both encodings.
EmitJmpCallRel:
- if (Support::isInt8(int32_t(rel32 + inst32Size - inst8Size)) && opCode8 && !(options & Inst::kOptionLongForm)) {
- options |= Inst::kOptionShortForm;
+ if (Support::isInt8(int32_t(rel32 + inst32Size - inst8Size)) && opCode8 && !Support::test(options, InstOptions::kLongForm)) {
+ options |= InstOptions::kShortForm;
writer.emit8(opCode8); // Emit opcode
writer.emit8(rel32 + inst32Size - inst8Size); // Emit DISP8.
goto EmitDone;
}
else {
- if (ASMJIT_UNLIKELY(!opcode.v || (options & Inst::kOptionShortForm) != 0))
+ if (ASMJIT_UNLIKELY(!opcode.v || Support::test(options, InstOptions::kShortForm)))
goto InvalidDisplacement;
- options &= ~Inst::kOptionShortForm;
+ options &= ~InstOptions::kShortForm;
writer.emit8If(0x0F, (opcode & Opcode::kMM_Mask) != 0); // Emit 0x0F prefix.
writer.emit8(opcode.v); // Emit Opcode.
writer.emit8If(x86EncodeMod(3, opReg, 0), opReg != 0); // Emit MOD.
@@ -4556,9 +4915,8 @@ EmitJmpCallRel:
}
}
- // --------------------------------------------------------------------------
- // [Emit - Relative]
- // --------------------------------------------------------------------------
+ // Emit - Relative
+ // ---------------
EmitRel:
{
@@ -4566,28 +4924,26 @@ EmitRel:
// Chain with label.
size_t offset = size_t(writer.offsetFrom(_bufferData));
- LabelLink* link = _code->newLabelLink(label, _section->id(), offset, relOffset);
+ OffsetFormat of;
+ of.resetToSimpleValue(OffsetType::kSignedOffset, relSize);
+ LabelLink* link = _code->newLabelLink(label, _section->id(), offset, relOffset, of);
if (ASMJIT_UNLIKELY(!link))
goto OutOfMemory;
if (re)
link->relocId = re->id();
- // Emit label size as dummy data.
- if (relSize == 1)
- writer.emit8(0x01);
- else // if (relSize == 4)
- writer.emit32uLE(0x04040404);
+ // Emit dummy zeros, must be patched later when the reference becomes known.
+ writer.emitZeros(relSize);
}
writer.emitImmediate(uint64_t(immValue), immSize);
- // --------------------------------------------------------------------------
- // [Done]
- // --------------------------------------------------------------------------
+ // Emit - Done
+ // -----------
EmitDone:
- if (ASMJIT_UNLIKELY(options & Inst::kOptionReserved)) {
+ if (Support::test(options, InstOptions::kReserved)) {
#ifndef ASMJIT_NO_LOGGING
if (_logger)
EmitterUtils::logInstructionEmitted(this, instId, options, o0, o1, o2, opExt, relSize, immSize, writer.cursor());
@@ -4601,15 +4957,10 @@ EmitDone:
writer.done(this);
return kErrorOk;
- // --------------------------------------------------------------------------
- // [Error Cases]
- // --------------------------------------------------------------------------
-
- #define ERROR_HANDLER(ERROR) \
- ERROR: \
- err = DebugUtils::errored(kError##ERROR); \
- goto Failed;
+ // Error Handler
+ // -------------
+#define ERROR_HANDLER(ERR) ERR: err = DebugUtils::errored(kError##ERR); goto Failed;
ERROR_HANDLER(OutOfMemory)
ERROR_HANDLER(InvalidLabel)
ERROR_HANDLER(InvalidInstruction)
@@ -4623,13 +4974,14 @@ EmitDone:
ERROR_HANDLER(InvalidAddressIndex)
ERROR_HANDLER(InvalidAddress64Bit)
ERROR_HANDLER(InvalidDisplacement)
+ ERROR_HANDLER(InvalidPhysId)
ERROR_HANDLER(InvalidSegment)
ERROR_HANDLER(InvalidImmediate)
+ ERROR_HANDLER(InvalidBroadcast)
ERROR_HANDLER(OperandSizeMismatch)
ERROR_HANDLER(AmbiguousOperandSize)
ERROR_HANDLER(NotConsecutiveRegs)
-
- #undef ERROR_HANDLER
+#undef ERROR_HANDLER
Failed:
#ifndef ASMJIT_NO_LOGGING
@@ -4642,15 +4994,14 @@ Failed:
#endif
}
-// ============================================================================
-// [asmjit::x86::Assembler - Align]
-// ============================================================================
+//x86::Assembler - Align
+// =====================
-Error Assembler::align(uint32_t alignMode, uint32_t alignment) {
+Error Assembler::align(AlignMode alignMode, uint32_t alignment) {
if (ASMJIT_UNLIKELY(!_code))
return reportError(DebugUtils::errored(kErrorNotInitialized));
- if (ASMJIT_UNLIKELY(alignMode >= kAlignCount))
+ if (ASMJIT_UNLIKELY(uint32_t(alignMode) > uint32_t(AlignMode::kMaxValue)))
return reportError(DebugUtils::errored(kErrorInvalidArgument));
if (alignment <= 1)
@@ -4661,13 +5012,13 @@ Error Assembler::align(uint32_t alignMode, uint32_t alignment) {
uint32_t i = uint32_t(Support::alignUpDiff<size_t>(offset(), alignment));
if (i > 0) {
- CodeBufferWriter writer(this);
+ CodeWriter writer(this);
ASMJIT_PROPAGATE(writer.ensureSpace(this, i));
uint8_t pattern = 0x00;
switch (alignMode) {
- case kAlignCode: {
- if (hasEncodingOption(kEncodingOptionOptimizedAlign)) {
+ case AlignMode::kCode: {
+ if (hasEncodingOption(EncodingOptions::kOptimizedAlign)) {
// Intel 64 and IA-32 Architectures Software Developer's Manual - Volume 2B (NOP).
enum { kMaxNopSize = 9 };
@@ -4698,11 +5049,11 @@ Error Assembler::align(uint32_t alignMode, uint32_t alignment) {
break;
}
- case kAlignData:
+ case AlignMode::kData:
pattern = 0xCC;
break;
- case kAlignZero:
+ case AlignMode::kZero:
// Pattern already set to zero.
break;
}
@@ -4718,7 +5069,7 @@ Error Assembler::align(uint32_t alignMode, uint32_t alignment) {
#ifndef ASMJIT_NO_LOGGING
if (_logger) {
StringTmp<128> sb;
- sb.appendChars(' ', _logger->indentation(FormatOptions::kIndentationCode));
+ sb.appendChars(' ', _logger->indentation(FormatIndentationGroup::kCode));
sb.appendFormat("align %u\n", alignment);
_logger->log(sb);
}
@@ -4727,27 +5078,21 @@ Error Assembler::align(uint32_t alignMode, uint32_t alignment) {
return kErrorOk;
}
-// ============================================================================
-// [asmjit::x86::Assembler - Events]
-// ============================================================================
+// x86::Assembler - Events
+// =======================
Error Assembler::onAttach(CodeHolder* code) noexcept {
- uint32_t arch = code->arch();
- if (!Environment::isFamilyX86(arch))
- return DebugUtils::errored(kErrorInvalidArch);
-
+ Arch arch = code->arch();
ASMJIT_PROPAGATE(Base::onAttach(code));
if (Environment::is32Bit(arch)) {
// 32 bit architecture - X86.
- _gpRegInfo.setSignature(Gpd::kSignature);
- _forcedInstOptions |= Inst::_kOptionInvalidRex;
+ _forcedInstOptions |= InstOptions::kX86_InvalidRex;
_setAddressOverrideMask(kX86MemInfo_67H_X86);
}
else {
// 64 bit architecture - X64.
- _gpRegInfo.setSignature(Gpq::kSignature);
- _forcedInstOptions &= ~Inst::_kOptionInvalidRex;
+ _forcedInstOptions &= ~InstOptions::kX86_InvalidRex;
_setAddressOverrideMask(kX86MemInfo_67H_X64);
}
@@ -4755,12 +5100,11 @@ Error Assembler::onAttach(CodeHolder* code) noexcept {
}
Error Assembler::onDetach(CodeHolder* code) noexcept {
- _forcedInstOptions &= ~Inst::_kOptionInvalidRex;
+ _forcedInstOptions &= ~InstOptions::kX86_InvalidRex;
_setAddressOverrideMask(0);
-
return Base::onDetach(code);
}
ASMJIT_END_SUB_NAMESPACE
-#endif // ASMJIT_BUILD_X86
+#endif // !ASMJIT_NO_X86
diff --git a/3rdparty/asmjit/src/asmjit/x86/x86assembler.h b/3rdparty/asmjit/src/asmjit/x86/x86assembler.h
index 8cd10143b0e..dbffae62895 100644
--- a/3rdparty/asmjit/src/asmjit/x86/x86assembler.h
+++ b/3rdparty/asmjit/src/asmjit/x86/x86assembler.h
@@ -1,25 +1,7 @@
-// AsmJit - Machine code generation for C++
+// This file is part of AsmJit project <https://asmjit.com>
//
-// * Official AsmJit Home Page: https://asmjit.com
-// * Official Github Repository: https://github.com/asmjit/asmjit
-//
-// Copyright (c) 2008-2020 The AsmJit Authors
-//
-// This software is provided 'as-is', without any express or implied
-// warranty. In no event will the authors be held liable for any damages
-// arising from the use of this software.
-//
-// Permission is granted to anyone to use this software for any purpose,
-// including commercial applications, and to alter it and redistribute it
-// freely, subject to the following restrictions:
-//
-// 1. The origin of this software must not be misrepresented; you must not
-// claim that you wrote the original software. If you use this software
-// in a product, an acknowledgment in the product documentation would be
-// appreciated but is not required.
-// 2. Altered source versions must be plainly marked as such, and must not be
-// misrepresented as being the original software.
-// 3. This notice may not be removed or altered from any source distribution.
+// See asmjit.h or LICENSE.md for license and copyright information
+// SPDX-License-Identifier: Zlib
#ifndef ASMJIT_X86_X86ASSEMBLER_H_INCLUDED
#define ASMJIT_X86_X86ASSEMBLER_H_INCLUDED
@@ -33,21 +15,15 @@ ASMJIT_BEGIN_SUB_NAMESPACE(x86)
//! \addtogroup asmjit_x86
//! \{
-// ============================================================================
-// [asmjit::Assembler]
-// ============================================================================
-
//! X86/X64 assembler implementation.
//!
-//! x86::Assembler is a code emitter that emits machine code directly into the
-//! \ref CodeBuffer. The assembler is capable of targeting both 32-bit and 64-bit
-//! instruction sets, the instruction set can be configured through \ref CodeHolder.
+//! x86::Assembler is a code emitter that emits machine code directly into the \ref CodeBuffer. The assembler is capable
+//! of targeting both 32-bit and 64-bit instruction sets, the instruction set can be configured through \ref CodeHolder.
//!
//! ### Basics
//!
-//! The following example shows a basic use of `x86::Assembler`, how to generate
-//! a function that works in both 32-bit and 64-bit modes, and how to connect
-//! \ref JitRuntime, \ref CodeHolder, and `x86::Assembler`.
+//! The following example shows a basic use of `x86::Assembler`, how to generate a function that works in both 32-bit
+//! and 64-bit modes, and how to connect \ref JitRuntime, \ref CodeHolder, and `x86::Assembler`.
//!
//! ```
//! #include <asmjit/x86.h>
@@ -122,32 +98,26 @@ ASMJIT_BEGIN_SUB_NAMESPACE(x86)
//! }
//! ```
//!
-//! The example should be self-explanatory. It shows how to work with labels,
-//! how to use operands, and how to emit instructions that can use different
-//! registers based on runtime selection. It implements 32-bit CDECL, WIN64,
+//! The example should be self-explanatory. It shows how to work with labels, how to use operands, and how to emit
+//! instructions that can use different registers based on runtime selection. It implements 32-bit CDECL, WIN64,
//! and SysV64 caling conventions and will work on most X86/X64 environments.
//!
-//! Although functions prologs / epilogs can be implemented manually, AsmJit
-//! provides utilities that can be used to create function prologs and epilogs
-//! automatically, see \ref asmjit_function for more details.
+//! Although functions prologs / epilogs can be implemented manually, AsmJit provides utilities that can be used
+//! to create function prologs and epilogs automatically, see \ref asmjit_function for more details.
//!
//! ### Instruction Validation
//!
-//! Assembler prefers speed over strictness by default. The implementation checks
-//! the type of operands and fails if the signature of types is invalid, however,
-//! it does only basic checks regarding registers and their groups used in
-//! instructions. It's possible to pass operands that don't form any valid
-//! signature to the implementation and succeed. This is usually not a problem
-//! as Assembler provides typed API so operand types are normally checked by C++
-//! compiler at compile time, however, Assembler is fully dynamic and its \ref
-//! emit() function can be called with any instruction id, options, and operands.
-//! Moreover, it's also possible to form instructions that will be accepted by
-//! the typed API, for example by calling `mov(x86::eax, x86::al)` - the C++
-//! compiler won't see a problem as both EAX and AL are \ref Gp registers.
-//!
-//! To help with common mistakes AsmJit allows to activate instruction validation.
-//! This feature instruments the Assembler to call \ref InstAPI::validate() before
-//! it attempts to encode any instruction.
+//! Assembler prefers speed over strictness by default. The implementation checks the type of operands and fails
+//! if the signature of types is invalid, however, it does only basic checks regarding registers and their groups
+//! used in instructions. It's possible to pass operands that don't form any valid signature to the implementation
+//! and succeed. This is usually not a problem as Assembler provides typed API so operand types are normally checked
+//! by C++ compiler at compile time, however, Assembler is fully dynamic and its \ref emit() function can be called
+//! with any instruction id, options, and operands. Moreover, it's also possible to form instructions that will be
+//! accepted by the typed API, for example by calling `mov(x86::eax, x86::al)` - the C++ compiler won't see a problem
+//! as both EAX and AL are \ref Gp registers.
+//!
+//! To help with common mistakes AsmJit allows to activate instruction validation. This feature instruments
+//! the Assembler to call \ref InstAPI::validate() before it attempts to encode any instruction.
//!
//! The example below illustrates how validation can be turned on:
//!
@@ -165,7 +135,7 @@ ASMJIT_BEGIN_SUB_NAMESPACE(x86)
//! x86::Assembler a(&code); // Create and attach x86::Assembler to code.
//!
//! // Enable strict validation.
-//! a.addValidationOptions(BaseEmitter::kValidationOptionAssembler);
+//! a.addDiagnosticOptions(DiagnosticOptions::kValidateAssembler);
//!
//! // Try to encode invalid or ill-formed instructions.
//! Error err;
@@ -188,11 +158,10 @@ ASMJIT_BEGIN_SUB_NAMESPACE(x86)
//!
//! ### Native Registers
//!
-//! All emitters provide functions to construct machine-size registers depending
-//! on the target. This feature is for users that want to write code targeting
-//! both 32-bit and 64-bit architectures at the same time. In AsmJit terminology
-//! such registers have prefix `z`, so for example on X86 architecture the
-//! following native registers are provided:
+//! All emitters provide functions to construct machine-size registers depending on the target. This feature is
+//! for users that want to write code targeting both 32-bit and 64-bit architectures at the same time. In AsmJit
+//! terminology such registers have prefix `z`, so for example on X86 architecture the following native registers
+//! are provided:
//!
//! - `zax` - mapped to either `eax` or `rax`
//! - `zbx` - mapped to either `ebx` or `rbx`
@@ -203,8 +172,8 @@ ASMJIT_BEGIN_SUB_NAMESPACE(x86)
//! - `zsi` - mapped to either `esi` or `rsi`
//! - `zdi` - mapped to either `edi` or `rdi`
//!
-//! They are accessible through \ref x86::Assembler, \ref x86::Builder, and
-//! \ref x86::Compiler. The example below illustrates how to use this feature:
+//! They are accessible through \ref x86::Assembler, \ref x86::Builder, and \ref x86::Compiler. The example below
+//! illustrates how to use this feature:
//!
//! ```
//! #include <asmjit/x86.h>
@@ -253,11 +222,9 @@ ASMJIT_BEGIN_SUB_NAMESPACE(x86)
//! }
//! ```
//!
-//! The example just returns `0`, but the function generated contains a standard
-//! prolog and epilog sequence and the function itself reserves 32 bytes of local
-//! stack. The advantage is clear - a single code-base can handle multiple targets
-//! easily. If you want to create a register of native size dynamically by
-//! specifying its id it's also possible:
+//! The example just returns `0`, but the function generated contains a standard prolog and epilog sequence and the
+//! function itself reserves 32 bytes of local stack. The advantage is clear - a single code-base can handle multiple
+//! targets easily. If you want to create a register of native size dynamically by specifying its id it's also possible:
//!
//! ```
//! void example(x86::Assembler& a) {
@@ -274,14 +241,8 @@ ASMJIT_BEGIN_SUB_NAMESPACE(x86)
//!
//! ### Data Embedding
//!
-//! x86::Assembler extends the standard \ref BaseAssembler with X86/X64 specific
-//! conventions that are often used by assemblers to embed data next to the code.
-//! The following functions can be used to embed data:
-//!
-//! - \ref x86::Assembler::db() - embeds byte (8 bits) (x86 naming).
-//! - \ref x86::Assembler::dw() - embeds word (16 bits) (x86 naming).
-//! - \ref x86::Assembler::dd() - embeds dword (32 bits) (x86 naming).
-//! - \ref x86::Assembler::dq() - embeds qword (64 bits) (x86 naming).
+//! x86::Assembler extends the standard \ref BaseAssembler with X86/X64 specific conventions that are often used by
+//! assemblers to embed data next to the code. The following functions can be used to embed data:
//!
//! - \ref BaseAssembler::embedInt8() - embeds int8_t (portable naming).
//! - \ref BaseAssembler::embedUInt8() - embeds uint8_t (portable naming).
@@ -294,6 +255,11 @@ ASMJIT_BEGIN_SUB_NAMESPACE(x86)
//! - \ref BaseAssembler::embedFloat() - embeds float (portable naming).
//! - \ref BaseAssembler::embedDouble() - embeds double (portable naming).
//!
+//! - \ref x86::Assembler::db() - embeds byte (8 bits) (x86 naming).
+//! - \ref x86::Assembler::dw() - embeds word (16 bits) (x86 naming).
+//! - \ref x86::Assembler::dd() - embeds dword (32 bits) (x86 naming).
+//! - \ref x86::Assembler::dq() - embeds qword (64 bits) (x86 naming).
+//!
//! The following example illustrates how embed works:
//!
//! ```
@@ -308,8 +274,8 @@ ASMJIT_BEGIN_SUB_NAMESPACE(x86)
//! }
//! ```
//!
-//! Sometimes it's required to read the data that is embedded after code, for
-//! example. This can be done through \ref Label as shown below:
+//! Sometimes it's required to read the data that is embedded after code, for example. This can be done through
+//! \ref Label as shown below:
//!
//! ```
//! #include <asmjit/x86.h>
@@ -335,17 +301,14 @@ ASMJIT_BEGIN_SUB_NAMESPACE(x86)
//!
//! ### Label Embedding
//!
-//! It's also possible to embed labels. In general AsmJit provides the following
-//! options:
+//! It's also possible to embed labels. In general AsmJit provides the following options:
//!
-//! - \ref BaseEmitter::embedLabel() - Embeds absolute address of a label.
-//! This is target dependent and would embed either 32-bit or 64-bit data
-//! that embeds absolute label address. This kind of embedding cannot be
+//! - \ref BaseEmitter::embedLabel() - Embeds absolute address of a label. This is target dependent and would
+//! embed either 32-bit or 64-bit data that embeds absolute label address. This kind of embedding cannot be
//! used in a position independent code.
//!
-//! - \ref BaseEmitter::embedLabelDelta() - Embeds a difference between two
-//! labels. The size of the difference can be specified so it's possible to
-//! embed 8-bit, 16-bit, 32-bit, and 64-bit difference, which is sufficient
+//! - \ref BaseEmitter::embedLabelDelta() - Embeds a difference between two labels. The size of the difference
+//! can be specified so it's possible to embed 8-bit, 16-bit, 32-bit, and 64-bit difference, which is sufficient
//! for most purposes.
//!
//! The following example demonstrates how to embed labels and their differences:
@@ -368,9 +331,8 @@ ASMJIT_BEGIN_SUB_NAMESPACE(x86)
//!
//! ### Using FuncFrame and FuncDetail with x86::Assembler
//!
-//! The example below demonstrates how \ref FuncFrame and \ref FuncDetail can be
-//! used together with \ref x86::Assembler to generate a function that will use
-//! platform dependent calling conventions automatically depending on the target:
+//! The example below demonstrates how \ref FuncFrame and \ref FuncDetail can be used together with \ref x86::Assembler
+//! to generate a function that will use platform dependent calling conventions automatically depending on the target:
//!
//! ```
//! #include <asmjit/x86.h>
@@ -399,13 +361,13 @@ ASMJIT_BEGIN_SUB_NAMESPACE(x86)
//!
//! // Create/initialize FuncDetail and FuncFrame.
//! FuncDetail func;
-//! func.init(FuncSignatureT<void, int*, const int*, const int*>(CallConv::kIdHost));
+//! func.init(FuncSignatureT<void, int*, const int*, const int*>(CallConvId::kHost));
//!
//! FuncFrame frame;
//! frame.init(func);
//!
-//! // Make XMM0 and XMM1 dirty - kGroupVec describes XMM|YMM|ZMM registers.
-//! frame.setDirtyRegs(x86::Reg::kGroupVec, IntUtils::mask(0, 1));
+//! // Make XMM0 and XMM1 dirty - RegGroup::kVec describes XMM|YMM|ZMM registers.
+//! frame.setDirtyRegs(RegGroup::kVec, IntUtils::mask(0, 1));
//!
//! // Alternatively, if you don't want to use register masks you can pass BaseReg
//! // to addDirtyRegs(). The following code would add both xmm0 and xmm1.
@@ -444,50 +406,40 @@ ASMJIT_BEGIN_SUB_NAMESPACE(x86)
//!
//! ### Using x86::Assembler as Code-Patcher
//!
-//! This is an advanced topic that is sometimes unavoidable. AsmJit by default
-//! appends machine code it generates into a \ref CodeBuffer, however, it also
-//! allows to set the offset in \ref CodeBuffer explicitly and to overwrite its
-//! content. This technique is extremely dangerous as X86 instructions have
-//! variable length (see below), so you should in general only patch code to
-//! change instruction's immediate values or some other details not known the
-//! at a time the instruction was emitted. A typical scenario that requires
-//! code-patching is when you start emitting function and you don't know how
-//! much stack you want to reserve for it.
-//!
-//! Before we go further it's important to introduce instruction options, because
-//! they can help with code-patching (and not only patching, but that will be
-//! explained in AVX-512 section):
-//!
-//! - Many general-purpose instructions (especially arithmetic ones) on X86
-//! have multiple encodings - in AsmJit this is usually called 'short form'
-//! and 'long form'.
-//! - AsmJit always tries to use 'short form' as it makes the resulting
-//! machine-code smaller, which is always good - this decision is used
-//! by majority of assemblers out there.
-//! - AsmJit allows to override the default decision by using `short_()`
-//! and `long_()` instruction options to force short or long form,
-//! respectively. The most useful is `long_()` as it basically forces
-//! AsmJit to always emit the longest form. The `short_()` is not that
-//! useful as it's automatic (except jumps to non-bound labels). Note that
-//! the underscore after each function name avoids collision with built-in
-//! C++ types.
-//!
-//! To illustrate what short form and long form means in binary let's assume
-//! we want to emit "add esp, 16" instruction, which has two possible binary
-//! encodings:
-//!
-//! - `83C410` - This is a short form aka `short add esp, 16` - You can see
-//! opcode byte (0x8C), MOD/RM byte (0xC4) and an 8-bit immediate value
-//! representing `16`.
-//! - `81C410000000` - This is a long form aka `long add esp, 16` - You can
-//! see a different opcode byte (0x81), the same Mod/RM byte (0xC4) and a
-//! 32-bit immediate in little-endian representing `16`.
-//!
-//! It should be obvious that patching an existing instruction into an instruction
-//! having a different size may create various problems. So it's recommended to be
-//! careful and to only patch instructions into instructions having the same size.
-//! The example below demonstrates how instruction options can be used to guarantee
-//! the size of an instruction by forcing the assembler to use long-form encoding:
+//! This is an advanced topic that is sometimes unavoidable. AsmJit by default appends machine code it generates
+//! into a \ref CodeBuffer, however, it also allows to set the offset in \ref CodeBuffer explicitly and to overwrite
+//! its content. This technique is extremely dangerous as X86 instructions have variable length (see below), so you
+//! should in general only patch code to change instruction's immediate values or some other details not known the
+//! at a time the instruction was emitted. A typical scenario that requires code-patching is when you start emitting
+//! function and you don't know how much stack you want to reserve for it.
+//!
+//! Before we go further it's important to introduce instruction options, because they can help with code-patching
+//! (and not only patching, but that will be explained in AVX-512 section):
+//!
+//! - Many general-purpose instructions (especially arithmetic ones) on X86 have multiple encodings - in AsmJit
+//! this is usually called 'short form' and 'long form'.
+//!
+//! - AsmJit always tries to use 'short form' as it makes the resulting machine-code smaller, which is always
+//! good - this decision is used by majority of assemblers out there.
+//!
+//! - AsmJit allows to override the default decision by using `short_()` and `long_()` instruction options to force
+//! short or long form, respectively. The most useful is `long_()` as it basically forces AsmJit to always emit
+//! the longest form. The `short_()` is not that useful as it's automatic (except jumps to non-bound labels). Note
+//! that the underscore after each function name avoids collision with built-in C++ types.
+//!
+//! To illustrate what short form and long form means in binary let's assume we want to emit "add esp, 16" instruction,
+//! which has two possible binary encodings:
+//!
+//! - `83C410` - This is a short form aka `short add esp, 16` - You can see opcode byte (0x8C), MOD/RM byte (0xC4)
+//! and an 8-bit immediate value representing `16`.
+//!
+//! - `81C410000000` - This is a long form aka `long add esp, 16` - You can see a different opcode byte (0x81), the
+//! same Mod/RM byte (0xC4) and a 32-bit immediate in little-endian representing `16`.
+//!
+//! It should be obvious that patching an existing instruction into an instruction having a different size may create
+//! various problems. So it's recommended to be careful and to only patch instructions into instructions having the
+//! same size. The example below demonstrates how instruction options can be used to guarantee the size of an
+//! instruction by forcing the assembler to use long-form encoding:
//!
//! ```
//! #include <asmjit/x86.h>
@@ -546,27 +498,21 @@ ASMJIT_BEGIN_SUB_NAMESPACE(x86)
//! }
//! ```
//!
-//! If you run the example it will just work, because both instructions have
-//! the same size. As an experiment you can try removing `long_()` form to
-//! see what happens when wrong code is generated.
+//! If you run the example it will just work, because both instructions have the same size. As an experiment you can
+//! try removing `long_()` form to see what happens when wrong code is generated.
//!
//! ### Code Patching and REX Prefix
//!
-//! In 64-bit mode there is one more thing to worry about when patching code:
-//! REX prefix. It's a single byte prefix designed to address registers with
-//! ids from 9 to 15 and to override the default width of operation from 32
-//! to 64 bits. AsmJit, like other assemblers, only emits REX prefix when it's
-//! necessary. If the patched code only changes the immediate value as shown
-//! in the previous example then there is nothing to worry about as it doesn't
-//! change the logic behind emitting REX prefix, however, if the patched code
-//! changes register id or overrides the operation width then it's important
-//! to take care of REX prefix as well.
-//!
-//! AsmJit contains another instruction option that controls (forces) REX
-//! prefix - `rex()`. If you use it the instruction emitted will always use
-//! REX prefix even when it's encodable without it. The following list contains
-//! some instructions and their binary representations to illustrate when it's
-//! emitted:
+//! In 64-bit mode there is one more thing to worry about when patching code: REX prefix. It's a single byte prefix
+//! designed to address registers with ids from 9 to 15 and to override the default width of operation from 32 to 64
+//! bits. AsmJit, like other assemblers, only emits REX prefix when it's necessary. If the patched code only changes
+//! the immediate value as shown in the previous example then there is nothing to worry about as it doesn't change
+//! the logic behind emitting REX prefix, however, if the patched code changes register id or overrides the operation
+//! width then it's important to take care of REX prefix as well.
+//!
+//! AsmJit contains another instruction option that controls (forces) REX prefix - `rex()`. If you use it the
+//! instruction emitted will always use REX prefix even when it's encodable without it. The following list contains
+//! some instructions and their binary representations to illustrate when it's emitted:
//!
//! - `__83C410` - `add esp, 16` - 32-bit operation in 64-bit mode doesn't require REX prefix.
//! - `4083C410` - `rex add esp, 16` - 32-bit operation in 64-bit mode with forced REX prefix (0x40).
@@ -619,18 +565,15 @@ ASMJIT_BEGIN_SUB_NAMESPACE(x86)
//! }
//! ```
//!
-//! It's important to understand that prefixes are part of instruction options.
-//! When a member function that involves adding a prefix is called the prefix
-//! is combined with existing instruction options, which will affect the next
+//! It's important to understand that prefixes are part of instruction options. When a member function that involves
+//! adding a prefix is called the prefix is combined with existing instruction options, which will affect the next
//! instruction generated.
//!
//! ### Generating AVX512 code.
//!
-//! x86::Assembler can generate AVX512+ code including the use of opmask
-//! registers. Opmask can be specified through \ref x86::Assembler::k()
-//! function, which stores it as an extra register, which will be used
-//! by the next instruction. AsmJit uses such concept for manipulating
-//! instruction options as well.
+//! x86::Assembler can generate AVX512+ code including the use of opmask registers. Opmask can be specified through
+//! \ref x86::Assembler::k() function, which stores it as an extra register, which will be used by the next
+//! instruction. AsmJit uses such concept for manipulating instruction options as well.
//!
//! The following AVX512 features are supported:
//!
@@ -702,9 +645,8 @@ public:
//! \name Internal
//! \{
- // NOTE: x86::Assembler uses _privateData to store 'address-override' bit that
- // is used to decide whether to emit address-override (67H) prefix based on
- // the memory BASE+INDEX registers. It's either `kX86MemInfo_67H_X86` or
+ // NOTE: x86::Assembler uses _privateData to store 'address-override' bit that is used to decide whether to emit
+ // address-override (67H) prefix based on the memory BASE+INDEX registers. It's either `kX86MemInfo_67H_X86` or
// `kX86MemInfo_67H_X64`.
inline uint32_t _addressOverrideMask() const noexcept { return _privateData; }
inline void _setAddressOverrideMask(uint32_t m) noexcept { _privateData = m; }
@@ -715,7 +657,7 @@ public:
//! \name Emit
//! \{
- ASMJIT_API Error _emit(uint32_t instId, const Operand_& o0, const Operand_& o1, const Operand_& o2, const Operand_* opExt) override;
+ ASMJIT_API Error _emit(InstId instId, const Operand_& o0, const Operand_& o1, const Operand_& o2, const Operand_* opExt) override;
//! \}
//! \endcond
@@ -723,7 +665,7 @@ public:
//! \name Align
//! \{
- ASMJIT_API Error align(uint32_t alignMode, uint32_t alignment) override;
+ ASMJIT_API Error align(AlignMode alignMode, uint32_t alignment) override;
//! \}
diff --git a/3rdparty/asmjit/src/asmjit/x86/x86builder.cpp b/3rdparty/asmjit/src/asmjit/x86/x86builder.cpp
index b3c0b261a0b..a27948b65d4 100644
--- a/3rdparty/asmjit/src/asmjit/x86/x86builder.cpp
+++ b/3rdparty/asmjit/src/asmjit/x86/x86builder.cpp
@@ -1,71 +1,52 @@
-// AsmJit - Machine code generation for C++
+// This file is part of AsmJit project <https://asmjit.com>
//
-// * Official AsmJit Home Page: https://asmjit.com
-// * Official Github Repository: https://github.com/asmjit/asmjit
-//
-// Copyright (c) 2008-2020 The AsmJit Authors
-//
-// This software is provided 'as-is', without any express or implied
-// warranty. In no event will the authors be held liable for any damages
-// arising from the use of this software.
-//
-// Permission is granted to anyone to use this software for any purpose,
-// including commercial applications, and to alter it and redistribute it
-// freely, subject to the following restrictions:
-//
-// 1. The origin of this software must not be misrepresented; you must not
-// claim that you wrote the original software. If you use this software
-// in a product, an acknowledgment in the product documentation would be
-// appreciated but is not required.
-// 2. Altered source versions must be plainly marked as such, and must not be
-// misrepresented as being the original software.
-// 3. This notice may not be removed or altered from any source distribution.
+// See asmjit.h or LICENSE.md for license and copyright information
+// SPDX-License-Identifier: Zlib
#include "../core/api-build_p.h"
-#if defined(ASMJIT_BUILD_X86) && !defined(ASMJIT_NO_BUILDER)
+#if !defined(ASMJIT_NO_X86) && !defined(ASMJIT_NO_BUILDER)
#include "../x86/x86assembler.h"
#include "../x86/x86builder.h"
+#include "../x86/x86emithelper_p.h"
ASMJIT_BEGIN_SUB_NAMESPACE(x86)
-// ============================================================================
-// [asmjit::x86::Builder - Construction / Destruction]
-// ============================================================================
+// x86::Builder - Construction & Destruction
+// =========================================
Builder::Builder(CodeHolder* code) noexcept : BaseBuilder() {
+ _archMask = (uint64_t(1) << uint32_t(Arch::kX86)) |
+ (uint64_t(1) << uint32_t(Arch::kX64)) ;
+ assignEmitterFuncs(this);
+
if (code)
code->attach(this);
}
Builder::~Builder() noexcept {}
-// ============================================================================
-// [asmjit::x86::Builder - Finalize]
-// ============================================================================
+// x86::Builder - Events
+// =====================
-Error Builder::finalize() {
- ASMJIT_PROPAGATE(runPasses());
- Assembler a(_code);
- a.addEncodingOptions(encodingOptions());
- a.addValidationOptions(validationOptions());
- return serialize(&a);
+Error Builder::onAttach(CodeHolder* code) noexcept {
+ return Base::onAttach(code);
}
-// ============================================================================
-// [asmjit::x86::Builder - Events]
-// ============================================================================
-
-Error Builder::onAttach(CodeHolder* code) noexcept {
- uint32_t arch = code->arch();
- if (!Environment::isFamilyX86(arch))
- return DebugUtils::errored(kErrorInvalidArch);
+Error Builder::onDetach(CodeHolder* code) noexcept {
+ return Base::onDetach(code);
+}
- ASMJIT_PROPAGATE(Base::onAttach(code));
+// x86::Builder - Finalize
+// =======================
- _gpRegInfo.setSignature(Environment::is32Bit(arch) ? uint32_t(Gpd::kSignature) : uint32_t(Gpq::kSignature));
- return kErrorOk;
+Error Builder::finalize() {
+ ASMJIT_PROPAGATE(runPasses());
+ Assembler a(_code);
+ a.addEncodingOptions(encodingOptions());
+ a.addDiagnosticOptions(diagnosticOptions());
+ return serializeTo(&a);
}
ASMJIT_END_SUB_NAMESPACE
-#endif // ASMJIT_BUILD_X86 && !ASMJIT_NO_BUILDER
+#endif // !ASMJIT_NO_X86 && !ASMJIT_NO_BUILDER
diff --git a/3rdparty/asmjit/src/asmjit/x86/x86builder.h b/3rdparty/asmjit/src/asmjit/x86/x86builder.h
index 256bc9ecbec..f3bb11a0ca2 100644
--- a/3rdparty/asmjit/src/asmjit/x86/x86builder.h
+++ b/3rdparty/asmjit/src/asmjit/x86/x86builder.h
@@ -1,25 +1,7 @@
-// AsmJit - Machine code generation for C++
+// This file is part of AsmJit project <https://asmjit.com>
//
-// * Official AsmJit Home Page: https://asmjit.com
-// * Official Github Repository: https://github.com/asmjit/asmjit
-//
-// Copyright (c) 2008-2020 The AsmJit Authors
-//
-// This software is provided 'as-is', without any express or implied
-// warranty. In no event will the authors be held liable for any damages
-// arising from the use of this software.
-//
-// Permission is granted to anyone to use this software for any purpose,
-// including commercial applications, and to alter it and redistribute it
-// freely, subject to the following restrictions:
-//
-// 1. The origin of this software must not be misrepresented; you must not
-// claim that you wrote the original software. If you use this software
-// in a product, an acknowledgment in the product documentation would be
-// appreciated but is not required.
-// 2. Altered source versions must be plainly marked as such, and must not be
-// misrepresented as being the original software.
-// 3. This notice may not be removed or altered from any source distribution.
+// See asmjit.h or LICENSE.md for license and copyright information
+// SPDX-License-Identifier: Zlib
#ifndef ASMJIT_X86_X86BUILDER_H_INCLUDED
#define ASMJIT_X86_X86BUILDER_H_INCLUDED
@@ -28,7 +10,6 @@
#ifndef ASMJIT_NO_BUILDER
#include "../core/builder.h"
-#include "../core/datatypes.h"
#include "../x86/x86emitter.h"
ASMJIT_BEGIN_SUB_NAMESPACE(x86)
@@ -36,19 +17,13 @@ ASMJIT_BEGIN_SUB_NAMESPACE(x86)
//! \addtogroup asmjit_x86
//! \{
-// ============================================================================
-// [asmjit::x86::Builder]
-// ============================================================================
-
//! X86/X64 builder implementation.
//!
-//! The code representation used by \ref BaseBuilder is compatible with everything
-//! AsmJit provides. Each instruction is stored as \ref InstNode, which contains
-//! instruction id, options, and operands. Each instruction emitted will create
-//! a new \ref InstNode instance and add it to the current cursor in the double-linked
-//! list of nodes. Since the instruction stream used by \ref BaseBuilder can be
-//! manipulated, we can rewrite the SumInts example from \ref asmjit_assembler
-//! into the following:
+//! The code representation used by \ref BaseBuilder is compatible with everything AsmJit provides. Each instruction
+//! is stored as \ref InstNode, which contains instruction id, options, and operands. Each instruction emitted will
+//! create a new \ref InstNode instance and add it to the current cursor in the double-linked list of nodes. Since
+//! the instruction stream used by \ref BaseBuilder can be manipulated, we can rewrite the SumInts example from
+//! \ref asmjit_assembler into the following:
//!
//! ```
//! #include <asmjit/x86.h>
@@ -72,9 +47,8 @@ ASMJIT_BEGIN_SUB_NAMESPACE(x86)
//! code.init(rt.environment()); // Initialize code to match the JIT environment.
//! x86::Builder cb(&code); // Create and attach x86::Builder to `code`.
//!
-//! // Decide which registers will be mapped to function arguments. Try changing
-//! // registers of `dst`, `srcA`, and `srcB` and see what happens in function's
-//! // prolog and epilog.
+//! // Decide which registers will be mapped to function arguments. Try changing registers
+//! // of `dst`, `srcA`, and `srcB` and see what happens in function's prolog and epilog.
//! x86::Gp dst = cb.zax();
//! x86::Gp srcA = cb.zcx();
//! x86::Gp srcB = cb.zdx();
@@ -84,7 +58,7 @@ ASMJIT_BEGIN_SUB_NAMESPACE(x86)
//!
//! // Create and initialize `FuncDetail`.
//! FuncDetail func;
-//! func.init(FuncSignatureT<void, int*, const int*, const int*>(CallConv::kIdHost));
+//! func.init(FuncSignatureT<void, int*, const int*, const int*>(CallConvId::kHost));
//!
//! // Remember prolog insertion point.
//! BaseNode* prologInsertionPoint = cb.cursor();
@@ -106,8 +80,8 @@ ASMJIT_BEGIN_SUB_NAMESPACE(x86)
//! FuncFrame frame;
//! frame.init(func);
//!
-//! // Make XMM0 and XMM1 dirty; `kGroupVec` describes XMM|YMM|ZMM registers.
-//! frame.setDirtyRegs(x86::Reg::kGroupVec, IntUtils::mask(0, 1));
+//! // Make XMM0 and XMM1 dirty; RegGroup::kVec describes XMM|YMM|ZMM registers.
+//! frame.setDirtyRegs(RegGroup::kVec, IntUtils::mask(0, 1));
//!
//! FuncArgsAssignment args(&func); // Create arguments assignment context.
//! args.assignAll(dst, srcA, srcB); // Assign our registers to arguments.
@@ -148,8 +122,7 @@ ASMJIT_BEGIN_SUB_NAMESPACE(x86)
//! }
//! ```
//!
-//! When the example is executed it should output the following (this one using
-//! AMD64-SystemV ABI):
+//! When the example is executed it should output the following (this one using AMD64-SystemV ABI):
//!
//! ```
//! Raw Function:
@@ -170,23 +143,21 @@ ASMJIT_BEGIN_SUB_NAMESPACE(x86)
//! {5 8 4 9}
//! ```
//!
-//! The number of use-cases of \ref BaseBuilder is not limited and highly depends
-//! on your creativity and experience. The previous example can be easily improved
-//! to collect all dirty registers inside the function programmatically and to pass
-//! them to \ref FuncFrame::setDirtyRegs().
+//! The number of use-cases of \ref BaseBuilder is not limited and highly depends on your creativity and experience.
+//! The previous example can be easily improved to collect all dirty registers inside the function programmatically
+//! and to pass them to \ref FuncFrame::setDirtyRegs().
//!
//! ```
//! #include <asmjit/x86.h>
//!
//! using namespace asmjit;
//!
-//! // NOTE: This function doesn't cover all possible constructs. It ignores
-//! // instructions that write to implicit registers that are not part of the
-//! // operand list. It also counts read-only registers. Real implementation
-//! // would be a bit more complicated, but still relatively easy to implement.
+//! // NOTE: This function doesn't cover all possible constructs. It ignores instructions that write
+//! // to implicit registers that are not part of the operand list. It also counts read-only registers.
+//! // Real implementation would be a bit more complicated, but still relatively easy to implement.
//! static void collectDirtyRegs(const BaseNode* first,
//! const BaseNode* last,
-//! uint32_t regMask[BaseReg::kGroupVirt]) {
+//! Support::Array<RegMask, Globals::kNumVirtGroups>& regMask) {
//! const BaseNode* node = first;
//! while (node) {
//! if (node->actsAsInst()) {
@@ -197,7 +168,7 @@ ASMJIT_BEGIN_SUB_NAMESPACE(x86)
//! const Operand& op = opArray[i];
//! if (op.isReg()) {
//! const x86::Reg& reg = op.as<x86::Reg>();
-//! if (reg.group() < BaseReg::kGroupVirt) {
+//! if (reg.group() <= RegGroup::kMaxVirt) {
//! regMask[reg.group()] |= 1u << reg.id();
//! }
//! }
@@ -211,23 +182,21 @@ ASMJIT_BEGIN_SUB_NAMESPACE(x86)
//! }
//!
//! static void setDirtyRegsOfFuncFrame(const x86::Builder& builder, FuncFrame& frame) {
-//! uint32_t regMask[BaseReg::kGroupVirt] {};
+//! Support::Array<RegMask, Globals::kNumVirtGroups> regMask {};
//! collectDirtyRegs(builder.firstNode(), builder.lastNode(), regMask);
//!
//! // X86/X64 ABIs only require to save GP/XMM registers:
-//! frame.setDirtyRegs(x86::Reg::kGroupGp , regMask[x86::Reg::kGroupGp ]);
-//! frame.setDirtyRegs(x86::Reg::kGroupVec, regMask[x86::Reg::kGroupVec]);
+//! frame.setDirtyRegs(RegGroup::kGp, regMask[RegGroup::kGp]);
+//! frame.setDirtyRegs(RegGroup::kVec, regMask[RegGroup::kVec]);
//! }
//! ```
//!
//! ### Casting Between Various Emitters
//!
-//! Even when \ref BaseAssembler and \ref BaseBuilder provide the same interface
-//! as defined by \ref BaseEmitter their platform dependent variants like \ref
-//! x86::Assembler and \ref x86::Builder cannot be interchanged or casted
-//! to each other by using a C++ `static_cast<>`. The main reason is the
-//! inheritance graph of these classes is different and cast-incompatible, as
-//! illustrated below:
+//! Even when \ref BaseAssembler and \ref BaseBuilder provide the same interface as defined by \ref BaseEmitter their
+//! platform dependent variants like \ref x86::Assembler and \ref x86::Builder cannot be interchanged or casted to each
+//! other by using a C++ `static_cast<>`. The main reason is the inheritance graph of these classes is different and
+//! cast-incompatible, as illustrated below:
//!
//! ```
//! +--------------+ +=========================+
@@ -250,15 +219,12 @@ ASMJIT_BEGIN_SUB_NAMESPACE(x86)
//! (abstract) (final) (mixin)
//! ```
//!
-//! The graph basically shows that it's not possible to cast between \ref
-//! x86::Assembler and \ref x86::Builder. However, since both share the
-//! base interface (\ref BaseEmitter) it's possible to cast them to a class
-//! that cannot be instantiated, but defines the same interface - the class
-//! is called \ref x86::Emitter and was introduced to make it possible to
-//! write a function that can emit to both \ref x86::Assembler and \ref
-//! x86::Builder. Note that \ref x86::Emitter cannot be created, it's abstract
-//! and has private constructors and destructors; it was only designed to be
-//! casted to and used as an interface.
+//! The graph basically shows that it's not possible to cast between \ref x86::Assembler and \ref x86::Builder.
+//! However, since both share the base interface (\ref BaseEmitter) it's possible to cast them to a class that
+//! cannot be instantiated, but defines the same interface - the class is called \ref x86::Emitter and was
+//! introduced to make it possible to write a function that can emit to both \ref x86::Assembler and \ref
+//! x86::Builder. Note that \ref x86::Emitter cannot be created, it's abstract and has private constructors and
+//! destructors; it was only designed to be casted to and used as an interface.
//!
//! Each architecture-specific emitter implements a member function called
//! `as<arch::Emitter>()`, which casts the instance to the architecture
@@ -289,19 +255,16 @@ ASMJIT_BEGIN_SUB_NAMESPACE(x86)
//! }
//! ```
//!
-//! The example above shows how to create a function that can emit code to
-//! either \ref x86::Assembler or \ref x86::Builder through \ref x86::Emitter,
-//! which provides emitter-neutral functionality. \ref x86::Emitter, however,
-//! doesn't provide any emitter-specific functionality like `setCursor()`.
+//! The example above shows how to create a function that can emit code to either \ref x86::Assembler or \ref
+//! x86::Builder through \ref x86::Emitter, which provides emitter-neutral functionality. \ref x86::Emitter,
+//! however, doesn't provide any emitter-specific functionality like `setCursor()`.
//!
//! ### Code Injection and Manipulation
//!
-//! \ref BaseBuilder emitter stores its nodes in a double-linked list, which
-//! makes it easy to manipulate that list during the code generation or
-//! afterwards. Each node is always emitted next to the current cursor and the
-//! cursor is advanced to that newly emitted node. The cursor can be retrieved
-//! and changed by \ref BaseBuilder::cursor() and \ref BaseBuilder::setCursor(),
-//! respectively.
+//! \ref BaseBuilder emitter stores its nodes in a double-linked list, which makes it easy to manipulate that
+//! list during the code generation or afterwards. Each node is always emitted next to the current cursor and
+//! the cursor is advanced to that newly emitted node. The cursor can be retrieved and changed by \ref
+//! BaseBuilder::cursor() and \ref BaseBuilder::setCursor(), respectively.
//!
//! The example below demonstrates how to remember a node and inject something
//! next to it.
@@ -364,17 +327,18 @@ public:
//! \}
- //! \name Finalize
+ //! \name Events
//! \{
- ASMJIT_API Error finalize() override;
+ ASMJIT_API Error onAttach(CodeHolder* code) noexcept override;
+ ASMJIT_API Error onDetach(CodeHolder* code) noexcept override;
//! \}
- //! \name Events
+ //! \name Finalize
//! \{
- ASMJIT_API Error onAttach(CodeHolder* code) noexcept override;
+ ASMJIT_API Error finalize() override;
//! \}
};
diff --git a/3rdparty/asmjit/src/asmjit/x86/x86callconv.cpp b/3rdparty/asmjit/src/asmjit/x86/x86callconv.cpp
deleted file mode 100644
index e0a3f213dfe..00000000000
--- a/3rdparty/asmjit/src/asmjit/x86/x86callconv.cpp
+++ /dev/null
@@ -1,238 +0,0 @@
-// AsmJit - Machine code generation for C++
-//
-// * Official AsmJit Home Page: https://asmjit.com
-// * Official Github Repository: https://github.com/asmjit/asmjit
-//
-// Copyright (c) 2008-2020 The AsmJit Authors
-//
-// This software is provided 'as-is', without any express or implied
-// warranty. In no event will the authors be held liable for any damages
-// arising from the use of this software.
-//
-// Permission is granted to anyone to use this software for any purpose,
-// including commercial applications, and to alter it and redistribute it
-// freely, subject to the following restrictions:
-//
-// 1. The origin of this software must not be misrepresented; you must not
-// claim that you wrote the original software. If you use this software
-// in a product, an acknowledgment in the product documentation would be
-// appreciated but is not required.
-// 2. Altered source versions must be plainly marked as such, and must not be
-// misrepresented as being the original software.
-// 3. This notice may not be removed or altered from any source distribution.
-
-#include "../core/api-build_p.h"
-#ifdef ASMJIT_BUILD_X86
-
-#include "../x86/x86callconv_p.h"
-#include "../x86/x86operand.h"
-
-ASMJIT_BEGIN_SUB_NAMESPACE(x86)
-
-// ============================================================================
-// [asmjit::x86::CallConvInternal - Init]
-// ============================================================================
-
-namespace CallConvInternal {
-
-static inline bool shouldThreatAsCDeclIn64BitMode(uint32_t ccId) noexcept {
- return ccId == CallConv::kIdCDecl ||
- ccId == CallConv::kIdStdCall ||
- ccId == CallConv::kIdThisCall ||
- ccId == CallConv::kIdFastCall ||
- ccId == CallConv::kIdRegParm1 ||
- ccId == CallConv::kIdRegParm2 ||
- ccId == CallConv::kIdRegParm3;
-}
-
-ASMJIT_FAVOR_SIZE Error init(CallConv& cc, uint32_t ccId, const Environment& environment) noexcept {
- constexpr uint32_t kGroupGp = Reg::kGroupGp;
- constexpr uint32_t kGroupVec = Reg::kGroupVec;
- constexpr uint32_t kGroupMm = Reg::kGroupMm;
- constexpr uint32_t kGroupKReg = Reg::kGroupKReg;
-
- constexpr uint32_t kZax = Gp::kIdAx;
- constexpr uint32_t kZbx = Gp::kIdBx;
- constexpr uint32_t kZcx = Gp::kIdCx;
- constexpr uint32_t kZdx = Gp::kIdDx;
- constexpr uint32_t kZsp = Gp::kIdSp;
- constexpr uint32_t kZbp = Gp::kIdBp;
- constexpr uint32_t kZsi = Gp::kIdSi;
- constexpr uint32_t kZdi = Gp::kIdDi;
-
- bool winABI = environment.isPlatformWindows() || environment.isAbiMSVC();
-
- cc.setArch(environment.arch());
-
- if (environment.is32Bit()) {
- bool isStandardCallConv = true;
-
- cc.setPreservedRegs(Reg::kGroupGp, Support::bitMask(Gp::kIdBx, Gp::kIdSp, Gp::kIdBp, Gp::kIdSi, Gp::kIdDi));
- cc.setNaturalStackAlignment(4);
-
- switch (ccId) {
- case CallConv::kIdCDecl:
- break;
-
- case CallConv::kIdStdCall:
- cc.setFlags(CallConv::kFlagCalleePopsStack);
- break;
-
- case CallConv::kIdFastCall:
- cc.setFlags(CallConv::kFlagCalleePopsStack);
- cc.setPassedOrder(kGroupGp, kZcx, kZdx);
- break;
-
- case CallConv::kIdVectorCall:
- cc.setFlags(CallConv::kFlagCalleePopsStack);
- cc.setPassedOrder(kGroupGp, kZcx, kZdx);
- cc.setPassedOrder(kGroupVec, 0, 1, 2, 3, 4, 5);
- break;
-
- case CallConv::kIdThisCall:
- // NOTE: Even MINGW (starting with GCC 4.7.0) now uses __thiscall on MS Windows,
- // so we won't bail to any other calling convention if __thiscall was specified.
- if (winABI) {
- cc.setFlags(CallConv::kFlagCalleePopsStack);
- cc.setPassedOrder(kGroupGp, kZcx);
- }
- else {
- ccId = CallConv::kIdCDecl;
- }
- break;
-
- case CallConv::kIdRegParm1:
- cc.setPassedOrder(kGroupGp, kZax);
- break;
-
- case CallConv::kIdRegParm2:
- cc.setPassedOrder(kGroupGp, kZax, kZdx);
- break;
-
- case CallConv::kIdRegParm3:
- cc.setPassedOrder(kGroupGp, kZax, kZdx, kZcx);
- break;
-
- case CallConv::kIdLightCall2:
- case CallConv::kIdLightCall3:
- case CallConv::kIdLightCall4: {
- uint32_t n = (ccId - CallConv::kIdLightCall2) + 2;
-
- cc.setFlags(CallConv::kFlagPassFloatsByVec);
- cc.setPassedOrder(kGroupGp, kZax, kZdx, kZcx, kZsi, kZdi);
- cc.setPassedOrder(kGroupMm, 0, 1, 2, 3, 4, 5, 6, 7);
- cc.setPassedOrder(kGroupVec, 0, 1, 2, 3, 4, 5, 6, 7);
- cc.setPassedOrder(kGroupKReg, 0, 1, 2, 3, 4, 5, 6, 7);
- cc.setPreservedRegs(kGroupGp, Support::lsbMask<uint32_t>(8));
- cc.setPreservedRegs(kGroupVec, Support::lsbMask<uint32_t>(8) & ~Support::lsbMask<uint32_t>(n));
-
- cc.setNaturalStackAlignment(16);
- isStandardCallConv = false;
- break;
- }
-
- default:
- return DebugUtils::errored(kErrorInvalidArgument);
- }
-
- if (isStandardCallConv) {
- // MMX arguments is something where compiler vendors disagree. For example
- // GCC and MSVC would pass first three via registers and the rest via stack,
- // however Clang passes all via stack. Returning MMX registers is even more
- // fun, where GCC uses MM0, but Clang uses EAX:EDX pair. I'm not sure it's
- // something we should be worried about as MMX is deprecated anyway.
- cc.setPassedOrder(kGroupMm, 0, 1, 2);
-
- // Vector arguments (XMM|YMM|ZMM) are passed via registers. However, if the
- // function is variadic then they have to be passed via stack.
- cc.setPassedOrder(kGroupVec, 0, 1, 2);
-
- // Functions with variable arguments always use stack for MM and vector
- // arguments.
- cc.addFlags(CallConv::kFlagPassVecByStackIfVA);
- }
-
- if (ccId == CallConv::kIdCDecl) {
- cc.addFlags(CallConv::kFlagVarArgCompatible);
- }
- }
- else {
- // Preprocess the calling convention into a common id as many conventions
- // are normally ignored even by C/C++ compilers and treated as `__cdecl`.
- if (shouldThreatAsCDeclIn64BitMode(ccId))
- ccId = winABI ? CallConv::kIdX64Windows : CallConv::kIdX64SystemV;
-
- switch (ccId) {
- case CallConv::kIdX64SystemV: {
- cc.setFlags(CallConv::kFlagPassFloatsByVec |
- CallConv::kFlagPassMmxByXmm |
- CallConv::kFlagVarArgCompatible);
- cc.setNaturalStackAlignment(16);
- cc.setRedZoneSize(128);
- cc.setPassedOrder(kGroupGp, kZdi, kZsi, kZdx, kZcx, 8, 9);
- cc.setPassedOrder(kGroupVec, 0, 1, 2, 3, 4, 5, 6, 7);
- cc.setPreservedRegs(kGroupGp, Support::bitMask(kZbx, kZsp, kZbp, 12, 13, 14, 15));
- break;
- }
-
- case CallConv::kIdX64Windows: {
- cc.setStrategy(CallConv::kStrategyX64Windows);
- cc.setFlags(CallConv::kFlagPassFloatsByVec |
- CallConv::kFlagIndirectVecArgs |
- CallConv::kFlagPassMmxByGp |
- CallConv::kFlagVarArgCompatible);
- cc.setNaturalStackAlignment(16);
- // Maximum 4 arguments in registers, each adds 8 bytes to the spill zone.
- cc.setSpillZoneSize(4 * 8);
- cc.setPassedOrder(kGroupGp, kZcx, kZdx, 8, 9);
- cc.setPassedOrder(kGroupVec, 0, 1, 2, 3);
- cc.setPreservedRegs(kGroupGp, Support::bitMask(kZbx, kZsp, kZbp, kZsi, kZdi, 12, 13, 14, 15));
- cc.setPreservedRegs(kGroupVec, Support::bitMask(6, 7, 8, 9, 10, 11, 12, 13, 14, 15));
- break;
- }
-
- case CallConv::kIdVectorCall: {
- cc.setStrategy(CallConv::kStrategyX64VectorCall);
- cc.setFlags(CallConv::kFlagPassFloatsByVec |
- CallConv::kFlagPassMmxByGp );
- cc.setNaturalStackAlignment(16);
- // Maximum 6 arguments in registers, each adds 8 bytes to the spill zone.
- cc.setSpillZoneSize(6 * 8);
- cc.setPassedOrder(kGroupGp, kZcx, kZdx, 8, 9);
- cc.setPassedOrder(kGroupVec, 0, 1, 2, 3, 4, 5);
- cc.setPreservedRegs(kGroupGp, Support::bitMask(kZbx, kZsp, kZbp, kZsi, kZdi, 12, 13, 14, 15));
- cc.setPreservedRegs(kGroupVec, Support::bitMask(6, 7, 8, 9, 10, 11, 12, 13, 14, 15));
- break;
- }
-
- case CallConv::kIdLightCall2:
- case CallConv::kIdLightCall3:
- case CallConv::kIdLightCall4: {
- uint32_t n = (ccId - CallConv::kIdLightCall2) + 2;
-
- cc.setFlags(CallConv::kFlagPassFloatsByVec);
- cc.setNaturalStackAlignment(16);
- cc.setPassedOrder(kGroupGp, kZax, kZdx, kZcx, kZsi, kZdi);
- cc.setPassedOrder(kGroupMm, 0, 1, 2, 3, 4, 5, 6, 7);
- cc.setPassedOrder(kGroupVec, 0, 1, 2, 3, 4, 5, 6, 7);
- cc.setPassedOrder(kGroupKReg, 0, 1, 2, 3, 4, 5, 6, 7);
-
- cc.setPreservedRegs(kGroupGp, Support::lsbMask<uint32_t>(16));
- cc.setPreservedRegs(kGroupVec, ~Support::lsbMask<uint32_t>(n));
- break;
- }
-
- default:
- return DebugUtils::errored(kErrorInvalidArgument);
- }
- }
-
- cc.setId(ccId);
- return kErrorOk;
-}
-
-} // {CallConvInternal}
-
-ASMJIT_END_SUB_NAMESPACE
-
-#endif // ASMJIT_BUILD_X86
diff --git a/3rdparty/asmjit/src/asmjit/x86/x86callconv_p.h b/3rdparty/asmjit/src/asmjit/x86/x86callconv_p.h
deleted file mode 100644
index 1607ea2e385..00000000000
--- a/3rdparty/asmjit/src/asmjit/x86/x86callconv_p.h
+++ /dev/null
@@ -1,52 +0,0 @@
-// AsmJit - Machine code generation for C++
-//
-// * Official AsmJit Home Page: https://asmjit.com
-// * Official Github Repository: https://github.com/asmjit/asmjit
-//
-// Copyright (c) 2008-2020 The AsmJit Authors
-//
-// This software is provided 'as-is', without any express or implied
-// warranty. In no event will the authors be held liable for any damages
-// arising from the use of this software.
-//
-// Permission is granted to anyone to use this software for any purpose,
-// including commercial applications, and to alter it and redistribute it
-// freely, subject to the following restrictions:
-//
-// 1. The origin of this software must not be misrepresented; you must not
-// claim that you wrote the original software. If you use this software
-// in a product, an acknowledgment in the product documentation would be
-// appreciated but is not required.
-// 2. Altered source versions must be plainly marked as such, and must not be
-// misrepresented as being the original software.
-// 3. This notice may not be removed or altered from any source distribution.
-
-#ifndef ASMJIT_X86_X86CALLCONV_P_H_INCLUDED
-#define ASMJIT_X86_X86CALLCONV_P_H_INCLUDED
-
-#include "../core/callconv.h"
-
-ASMJIT_BEGIN_SUB_NAMESPACE(x86)
-
-//! \cond INTERNAL
-//! \addtogroup asmjit_x86
-//! \{
-
-// ============================================================================
-// [asmjit::x86::CallConvInternal]
-// ============================================================================
-
-//! X86-specific function API (calling conventions and other utilities).
-namespace CallConvInternal {
-
-//! Initialize `CallConv` structure (X86 specific).
-Error init(CallConv& cc, uint32_t ccId, const Environment& environment) noexcept;
-
-} // {CallConvInternal}
-
-//! \}
-//! \endcond
-
-ASMJIT_END_SUB_NAMESPACE
-
-#endif // ASMJIT_X86_X86CALLCONV_P_H_INCLUDED
diff --git a/3rdparty/asmjit/src/asmjit/x86/x86compiler.cpp b/3rdparty/asmjit/src/asmjit/x86/x86compiler.cpp
index 33377e9f98b..04d09807076 100644
--- a/3rdparty/asmjit/src/asmjit/x86/x86compiler.cpp
+++ b/3rdparty/asmjit/src/asmjit/x86/x86compiler.cpp
@@ -1,72 +1,38 @@
-// AsmJit - Machine code generation for C++
+// This file is part of AsmJit project <https://asmjit.com>
//
-// * Official AsmJit Home Page: https://asmjit.com
-// * Official Github Repository: https://github.com/asmjit/asmjit
-//
-// Copyright (c) 2008-2020 The AsmJit Authors
-//
-// This software is provided 'as-is', without any express or implied
-// warranty. In no event will the authors be held liable for any damages
-// arising from the use of this software.
-//
-// Permission is granted to anyone to use this software for any purpose,
-// including commercial applications, and to alter it and redistribute it
-// freely, subject to the following restrictions:
-//
-// 1. The origin of this software must not be misrepresented; you must not
-// claim that you wrote the original software. If you use this software
-// in a product, an acknowledgment in the product documentation would be
-// appreciated but is not required.
-// 2. Altered source versions must be plainly marked as such, and must not be
-// misrepresented as being the original software.
-// 3. This notice may not be removed or altered from any source distribution.
+// See asmjit.h or LICENSE.md for license and copyright information
+// SPDX-License-Identifier: Zlib
#include "../core/api-build_p.h"
-#if defined(ASMJIT_BUILD_X86) && !defined(ASMJIT_NO_COMPILER)
+#if !defined(ASMJIT_NO_X86) && !defined(ASMJIT_NO_COMPILER)
#include "../x86/x86assembler.h"
#include "../x86/x86compiler.h"
+#include "../x86/x86instapi_p.h"
#include "../x86/x86rapass_p.h"
ASMJIT_BEGIN_SUB_NAMESPACE(x86)
-// ============================================================================
-// [asmjit::x86::Compiler - Construction / Destruction]
-// ============================================================================
+// x86::Compiler - Construction & Destruction
+// ==========================================
Compiler::Compiler(CodeHolder* code) noexcept : BaseCompiler() {
+ _archMask = (uint64_t(1) << uint32_t(Arch::kX86)) |
+ (uint64_t(1) << uint32_t(Arch::kX64)) ;
+ assignEmitterFuncs(this);
+
if (code)
code->attach(this);
}
Compiler::~Compiler() noexcept {}
-// ============================================================================
-// [asmjit::x86::Compiler - Finalize]
-// ============================================================================
-
-Error Compiler::finalize() {
- ASMJIT_PROPAGATE(runPasses());
- Assembler a(_code);
- a.addEncodingOptions(encodingOptions());
- a.addValidationOptions(validationOptions());
- return serialize(&a);
-}
-// ============================================================================
-// [asmjit::x86::Compiler - Events]
-// ============================================================================
+// x86::Compiler - Events
+// ======================
Error Compiler::onAttach(CodeHolder* code) noexcept {
- uint32_t arch = code->arch();
- if (!Environment::isFamilyX86(arch))
- return DebugUtils::errored(kErrorInvalidArch);
-
ASMJIT_PROPAGATE(Base::onAttach(code));
-
- bool is32Bit = Environment::is32Bit(arch);
- _gpRegInfo.setSignature(is32Bit ? uint32_t(Gpd::kSignature)
- : uint32_t(Gpq::kSignature));
-
Error err = addPassT<X86RAPass>();
+
if (ASMJIT_UNLIKELY(err)) {
onDetach(code);
return err;
@@ -75,6 +41,21 @@ Error Compiler::onAttach(CodeHolder* code) noexcept {
return kErrorOk;
}
+Error Compiler::onDetach(CodeHolder* code) noexcept {
+ return Base::onDetach(code);
+}
+
+// x86::Compiler - Finalize
+// ========================
+
+Error Compiler::finalize() {
+ ASMJIT_PROPAGATE(runPasses());
+ Assembler a(_code);
+ a.addEncodingOptions(encodingOptions());
+ a.addDiagnosticOptions(diagnosticOptions());
+ return serializeTo(&a);
+}
+
ASMJIT_END_SUB_NAMESPACE
-#endif // ASMJIT_BUILD_X86 && !ASMJIT_NO_COMPILER
+#endif // !ASMJIT_NO_X86 && !ASMJIT_NO_COMPILER
diff --git a/3rdparty/asmjit/src/asmjit/x86/x86compiler.h b/3rdparty/asmjit/src/asmjit/x86/x86compiler.h
index 4c64b3b6e40..d89aea02519 100644
--- a/3rdparty/asmjit/src/asmjit/x86/x86compiler.h
+++ b/3rdparty/asmjit/src/asmjit/x86/x86compiler.h
@@ -1,25 +1,7 @@
-// AsmJit - Machine code generation for C++
+// This file is part of AsmJit project <https://asmjit.com>
//
-// * Official AsmJit Home Page: https://asmjit.com
-// * Official Github Repository: https://github.com/asmjit/asmjit
-//
-// Copyright (c) 2008-2020 The AsmJit Authors
-//
-// This software is provided 'as-is', without any express or implied
-// warranty. In no event will the authors be held liable for any damages
-// arising from the use of this software.
-//
-// Permission is granted to anyone to use this software for any purpose,
-// including commercial applications, and to alter it and redistribute it
-// freely, subject to the following restrictions:
-//
-// 1. The origin of this software must not be misrepresented; you must not
-// claim that you wrote the original software. If you use this software
-// in a product, an acknowledgment in the product documentation would be
-// appreciated but is not required.
-// 2. Altered source versions must be plainly marked as such, and must not be
-// misrepresented as being the original software.
-// 3. This notice may not be removed or altered from any source distribution.
+// See asmjit.h or LICENSE.md for license and copyright information
+// SPDX-License-Identifier: Zlib
#ifndef ASMJIT_X86_X86COMPILER_H_INCLUDED
#define ASMJIT_X86_X86COMPILER_H_INCLUDED
@@ -28,7 +10,6 @@
#ifndef ASMJIT_NO_COMPILER
#include "../core/compiler.h"
-#include "../core/datatypes.h"
#include "../core/type.h"
#include "../x86/x86emitter.h"
@@ -37,16 +18,12 @@ ASMJIT_BEGIN_SUB_NAMESPACE(x86)
//! \addtogroup asmjit_x86
//! \{
-// ============================================================================
-// [asmjit::x86::Compiler]
-// ============================================================================
-
//! X86/X64 compiler implementation.
//!
//! ### Compiler Basics
//!
-//! The first \ref x86::Compiler example shows how to generate a function that
-//! simply returns an integer value. It's an analogy to the first Assembler example:
+//! The first \ref x86::Compiler example shows how to generate a function that simply returns an integer value. It's
+//! an analogy to the first Assembler example:
//!
//! ```
//! #include <asmjit/x86.h>
@@ -87,12 +64,10 @@ ASMJIT_BEGIN_SUB_NAMESPACE(x86)
//! }
//! ```
//!
-//! The \ref BaseCompiler::addFunc() and \ref BaseCompiler::endFunc() functions
-//! are used to define the function and its end. Both must be called per function,
-//! but the body doesn't have to be generated in sequence. An example of generating
-//! two functions will be shown later. The next example shows more complicated code
-//! that contain a loop and generates a simple memory copy function that uses
-//! `uint32_t` items:
+//! The \ref BaseCompiler::addFunc() and \ref BaseCompiler::endFunc() functions are used to define the function and
+//! its end. Both must be called per function, but the body doesn't have to be generated in sequence. An example of
+//! generating two functions will be shown later. The next example shows more complicated code that contain a loop
+//! and generates a simple memory copy function that uses `uint32_t` items:
//!
//! ```
//! #include <asmjit/x86.h>
@@ -110,7 +85,7 @@ ASMJIT_BEGIN_SUB_NAMESPACE(x86)
//! code.init(rt.environment()); // Initialize code to match the JIT environment.
//! x86::Compiler cc(&code); // Create and attach x86::Compiler to code.
//!
-//! cc.addFunc( // Begin the function of the following signature:
+//! FuncNode* funcNode = cc.addFunc( // Begin the function of the following signature:
//! FuncSignatureT<void, // Return value - void (no return value).
//! uint32_t*, // 1st argument - uint32_t* (machine reg-size).
//! const uint32_t*, // 2nd argument - uint32_t* (machine reg-size).
@@ -123,9 +98,9 @@ ASMJIT_BEGIN_SUB_NAMESPACE(x86)
//! x86::Gp src = cc.newIntPtr("src");// Create `src` register (source pointer).
//! x86::Gp i = cc.newUIntPtr("i"); // Create `i` register (loop counter).
//!
-//! cc.setArg(0, dst); // Assign `dst` argument.
-//! cc.setArg(1, src); // Assign `src` argument.
-//! cc.setArg(2, i); // Assign `i` argument.
+//! funcNode->setArg(0, dst); // Assign `dst` argument.
+//! funcNode->setArg(1, src); // Assign `src` argument.
+//! funcNode->setArg(2, i); // Assign `i` argument.
//!
//! cc.test(i, i); // Early exit if length is zero.
//! cc.jz(L_Exit);
@@ -170,11 +145,67 @@ ASMJIT_BEGIN_SUB_NAMESPACE(x86)
//! }
//! ```
//!
+//! ### AVX and AVX-512
+//!
+//! AVX and AVX-512 code generation must be explicitly enabled via \ref FuncFrame to work properly. If it's not setup
+//! correctly then Prolog & Epilog would use SSE instead of AVX instructions to work with SIMD registers. In addition,
+//! Compiler requires explicitly enable AVX-512 via \ref FuncFrame in order to use all 32 SIMD registers.
+//!
+//! ```
+//! #include <asmjit/x86.h>
+//! #include <stdio.h>
+//!
+//! using namespace asmjit;
+//!
+//! // Signature of the generated function.
+//! typedef void (*Func)(void*);
+//!
+//! int main() {
+//! JitRuntime rt; // Runtime specialized for JIT code execution.
+//! CodeHolder code; // Holds code and relocation information.
+//!
+//! code.init(rt.environment()); // Initialize code to match the JIT environment.
+//! x86::Compiler cc(&code); // Create and attach x86::Compiler to code.
+//!
+//! FuncNode* funcNode = cc.addFunc(FuncSignatureT<void, void*>());
+//!
+//! // Use the following to enable AVX and/or AVX-512.
+//! funcNode->frame().setAvxEnabled();
+//! funcNode->frame().setAvx512Enabled();
+//!
+//! // Do something with the input pointer.
+//! x86::Gp addr = cc.newIntPtr("addr");
+//! x86::Zmm vreg = cc.newZmm("vreg");
+//!
+//! funcNode->setArg(0, addr);
+//!
+//! cc.vmovdqu32(vreg, x86::ptr(addr));
+//! cc.vpaddq(vreg, vreg, vreg);
+//! cc.vmovdqu32(x86::ptr(addr), vreg);
+//!
+//! cc.endFunc(); // End of the function body.
+//! cc.finalize(); // Translate and assemble the whole 'cc' content.
+//! // ----> x86::Compiler is no longer needed from here and can be destroyed <----
+//!
+//! Func fn;
+//! Error err = rt.add(&fn, &code); // Add the generated code to the runtime.
+//! if (err) return 1; // Handle a possible error returned by AsmJit.
+//! // ----> CodeHolder is no longer needed from here and can be destroyed <----
+//!
+//! // Execute the generated code and print some output.
+//! uint64_t data[] = { 1, 2, 3, 4, 5, 6, 7, 8 };
+//! fn(data);
+//! printf("%llu\n", (unsigned long long)data[0]);
+//!
+//! rt.release(fn); // Explicitly remove the function from the runtime.
+//! return 0;
+//! }
+//! ```
+//!
//! ### Recursive Functions
//!
-//! It's possible to create more functions by using the same \ref x86::Compiler
-//! instance and make links between them. In such case it's important to keep
-//! the pointer to \ref FuncNode.
+//! It's possible to create more functions by using the same \ref x86::Compiler instance and make links between them.
+//! In such case it's important to keep the pointer to \ref FuncNode.
//!
//! The example below creates a simple Fibonacci function that calls itself recursively:
//!
@@ -194,14 +225,14 @@ ASMJIT_BEGIN_SUB_NAMESPACE(x86)
//! code.init(rt.environment()); // Initialize code to match the JIT environment.
//! x86::Compiler cc(&code); // Create and attach x86::Compiler to code.
//!
-//! FuncNode* func = cc.addFunc( // Begin of the Fibonacci function, addFunc()
+//! FuncNode* funcNode = cc.addFunc( // Begin of the Fibonacci function, addFunc()
//! FuncSignatureT<int, int>()); // Returns a pointer to the FuncNode node.
//!
//! Label L_Exit = cc.newLabel() // Exit label.
-//! x86::Gp x = cc.newU32(); // Function x argument.
-//! x86::Gp y = cc.newU32(); // Temporary.
+//! x86::Gp x = cc.newUInt32(); // Function x argument.
+//! x86::Gp y = cc.newUInt32(); // Temporary.
//!
-//! cc.setArg(0, x);
+//! funcNode->setArg(0, x);
//!
//! cc.cmp(x, 3); // Return x if less than 3.
//! cc.jb(L_Exit);
@@ -211,7 +242,7 @@ ASMJIT_BEGIN_SUB_NAMESPACE(x86)
//!
//! InvokeNode* invokeNode; // Function invocation:
//! cc.invoke(&invokeNode, // - InvokeNode (output).
-//! func->label(), // - Function address or Label.
+//! funcNode->label(), // - Function address or Label.
//! FuncSignatureT<int, int>()); // - Function signature.
//!
//! invokeNode->setArg(0, x); // Assign x as the first argument.
@@ -241,7 +272,10 @@ ASMJIT_BEGIN_SUB_NAMESPACE(x86)
//!
//! ### Stack Management
//!
-//! Function's stack-frame is managed automatically, which is used by the register allocator to spill virtual registers. It also provides an interface to allocate user-defined block of the stack, which can be used as a temporary storage by the generated function. In the following example a stack of 256 bytes size is allocated, filled by bytes starting from 0 to 255 and then iterated again to sum all the values.
+//! Function's stack-frame is managed automatically, which is used by the register allocator to spill virtual
+//! registers. It also provides an interface to allocate user-defined block of the stack, which can be used as
+//! a temporary storage by the generated function. In the following example a stack of 256 bytes size is allocated,
+//! filled by bytes starting from 0 to 255 and then iterated again to sum all the values.
//!
//! ```
//! #include <asmjit/x86.h>
@@ -290,8 +324,8 @@ ASMJIT_BEGIN_SUB_NAMESPACE(x86)
//! cc.jb(L1); // goto L1;
//!
//! // Second loop, sum all bytes stored in `stack`.
-//! x86::Gp sum = cc.newI32("sum");
-//! x86::Gp val = cc.newI32("val");
+//! x86::Gp sum = cc.newInt32("sum");
+//! x86::Gp val = cc.newInt32("val");
//!
//! cc.xor_(i, i);
//! cc.xor_(sum, sum);
@@ -327,12 +361,11 @@ ASMJIT_BEGIN_SUB_NAMESPACE(x86)
//!
//! Compiler provides two constant pools for a general purpose code generation:
//!
-//! - Local constant pool - Part of \ref FuncNode, can be only used by a
-//! single function and added after the function epilog sequence (after
-//! `ret` instruction).
+//! - Local constant pool - Part of \ref FuncNode, can be only used by a single function and added after the
+//! function epilog sequence (after `ret` instruction).
//!
-//! - Global constant pool - Part of \ref BaseCompiler, flushed at the end
-//! of the generated code by \ref BaseEmitter::finalize().
+//! - Global constant pool - Part of \ref BaseCompiler, flushed at the end of the generated code by \ref
+//! BaseEmitter::finalize().
//!
//! The example below illustrates how a built-in constant pool can be used:
//!
@@ -347,8 +380,8 @@ ASMJIT_BEGIN_SUB_NAMESPACE(x86)
//! x86::Gp v0 = cc.newGpd("v0");
//! x86::Gp v1 = cc.newGpd("v1");
//!
-//! x86::Mem c0 = cc.newInt32Const(ConstPool::kScopeLocal, 200);
-//! x86::Mem c1 = cc.newInt32Const(ConstPool::kScopeLocal, 33);
+//! x86::Mem c0 = cc.newInt32Const(ConstPoolScope::kLocal, 200);
+//! x86::Mem c1 = cc.newInt32Const(ConstPoolScope::kLocal, 33);
//!
//! cc.mov(v0, c0);
//! cc.mov(v1, c1);
@@ -361,16 +394,14 @@ ASMJIT_BEGIN_SUB_NAMESPACE(x86)
//!
//! ### Jump Tables
//!
-//! x86::Compiler supports `jmp` instruction with reg/mem operand, which is a
-//! commonly used pattern to implement indirect jumps within a function, for
-//! example to implement `switch()` statement in a programming languages. By
-//! default AsmJit assumes that every basic block can be a possible jump
-//! target as it's unable to deduce targets from instruction's operands. This
-//! is a very pessimistic default that should be avoided if possible as it's
-//! costly and very unfriendly to liveness analysis and register allocation.
+//! x86::Compiler supports `jmp` instruction with reg/mem operand, which is a commonly used pattern to implement
+//! indirect jumps within a function, for example to implement `switch()` statement in a programming languages.
+//! By default AsmJit assumes that every basic block can be a possible jump target as it's unable to deduce targets
+//! from instruction's operands. This is a very pessimistic default that should be avoided if possible as it's costly
+//! and very unfriendly to liveness analysis and register allocation.
//!
-//! Instead of relying on such pessimistic default behavior, let's use \ref
-//! JumpAnnotation to annotate a jump where all targets are known:
+//! Instead of relying on such pessimistic default behavior, let's use \ref JumpAnnotation to annotate a jump where
+//! all targets are known:
//!
//! ```
//! #include <asmjit/x86.h>
@@ -378,7 +409,7 @@ ASMJIT_BEGIN_SUB_NAMESPACE(x86)
//! using namespace asmjit;
//!
//! static void exampleUseOfIndirectJump(x86::Compiler& cc) {
-//! cc.addFunc(FuncSignatureT<float, float, float, uint32_t>(CallConv::kIdHost));
+//! FuncNode* funcNode = cc.addFunc(FuncSignatureT<float, float, float, uint32_t>(CallConvId::kHost));
//!
//! // Function arguments
//! x86::Xmm a = cc.newXmmSs("a");
@@ -395,13 +426,12 @@ ASMJIT_BEGIN_SUB_NAMESPACE(x86)
//! Label L_Div = cc.newLabel();
//! Label L_End = cc.newLabel();
//!
-//! cc.setArg(0, a);
-//! cc.setArg(1, b);
-//! cc.setArg(2, op);
+//! funcNode->setArg(0, a);
+//! funcNode->setArg(1, b);
+//! funcNode->setArg(2, op);
//!
-//! // Jump annotation is a building block that allows to annotate all
-//! // possible targets where `jmp()` can jump. It then drives the CFG
-//! // contruction and liveness analysis, which impacts register allocation.
+//! // Jump annotation is a building block that allows to annotate all possible targets where `jmp()` can
+//! // jump. It then drives the CFG construction and liveness analysis, which impacts register allocation.
//! JumpAnnotation* annotation = cc.newJumpAnnotation();
//! annotation->addLabel(L_Add);
//! annotation->addLabel(L_Sub);
@@ -477,14 +507,14 @@ public:
#endif
#define ASMJIT_NEW_REG_CUSTOM(FUNC, REG) \
- inline REG FUNC(uint32_t typeId) { \
+ inline REG FUNC(TypeId typeId) { \
REG reg(Globals::NoInit); \
_newReg(&reg, typeId); \
return reg; \
} \
\
template<typename... Args> \
- inline REG FUNC(uint32_t typeId, const char* fmt, Args&&... args) { \
+ inline REG FUNC(TypeId typeId, const char* fmt, Args&&... args) { \
REG reg(Globals::NoInit); \
ASMJIT_NEW_REG_FMT(reg, typeId, fmt, std::forward<Args>(args)...); \
return reg; \
@@ -523,46 +553,38 @@ public:
ASMJIT_NEW_REG_CUSTOM(newVec , Vec )
ASMJIT_NEW_REG_CUSTOM(newK , KReg)
- ASMJIT_NEW_REG_TYPED(newI8 , Gp , Type::kIdI8 )
- ASMJIT_NEW_REG_TYPED(newU8 , Gp , Type::kIdU8 )
- ASMJIT_NEW_REG_TYPED(newI16 , Gp , Type::kIdI16 )
- ASMJIT_NEW_REG_TYPED(newU16 , Gp , Type::kIdU16 )
- ASMJIT_NEW_REG_TYPED(newI32 , Gp , Type::kIdI32 )
- ASMJIT_NEW_REG_TYPED(newU32 , Gp , Type::kIdU32 )
- ASMJIT_NEW_REG_TYPED(newI64 , Gp , Type::kIdI64 )
- ASMJIT_NEW_REG_TYPED(newU64 , Gp , Type::kIdU64 )
- ASMJIT_NEW_REG_TYPED(newInt8 , Gp , Type::kIdI8 )
- ASMJIT_NEW_REG_TYPED(newUInt8 , Gp , Type::kIdU8 )
- ASMJIT_NEW_REG_TYPED(newInt16 , Gp , Type::kIdI16 )
- ASMJIT_NEW_REG_TYPED(newUInt16 , Gp , Type::kIdU16 )
- ASMJIT_NEW_REG_TYPED(newInt32 , Gp , Type::kIdI32 )
- ASMJIT_NEW_REG_TYPED(newUInt32 , Gp , Type::kIdU32 )
- ASMJIT_NEW_REG_TYPED(newInt64 , Gp , Type::kIdI64 )
- ASMJIT_NEW_REG_TYPED(newUInt64 , Gp , Type::kIdU64 )
- ASMJIT_NEW_REG_TYPED(newIntPtr , Gp , Type::kIdIntPtr )
- ASMJIT_NEW_REG_TYPED(newUIntPtr, Gp , Type::kIdUIntPtr)
-
- ASMJIT_NEW_REG_TYPED(newGpb , Gp , Type::kIdU8 )
- ASMJIT_NEW_REG_TYPED(newGpw , Gp , Type::kIdU16 )
- ASMJIT_NEW_REG_TYPED(newGpd , Gp , Type::kIdU32 )
- ASMJIT_NEW_REG_TYPED(newGpq , Gp , Type::kIdU64 )
- ASMJIT_NEW_REG_TYPED(newGpz , Gp , Type::kIdUIntPtr)
- ASMJIT_NEW_REG_TYPED(newXmm , Xmm , Type::kIdI32x4 )
- ASMJIT_NEW_REG_TYPED(newXmmSs , Xmm , Type::kIdF32x1 )
- ASMJIT_NEW_REG_TYPED(newXmmSd , Xmm , Type::kIdF64x1 )
- ASMJIT_NEW_REG_TYPED(newXmmPs , Xmm , Type::kIdF32x4 )
- ASMJIT_NEW_REG_TYPED(newXmmPd , Xmm , Type::kIdF64x2 )
- ASMJIT_NEW_REG_TYPED(newYmm , Ymm , Type::kIdI32x8 )
- ASMJIT_NEW_REG_TYPED(newYmmPs , Ymm , Type::kIdF32x8 )
- ASMJIT_NEW_REG_TYPED(newYmmPd , Ymm , Type::kIdF64x4 )
- ASMJIT_NEW_REG_TYPED(newZmm , Zmm , Type::kIdI32x16 )
- ASMJIT_NEW_REG_TYPED(newZmmPs , Zmm , Type::kIdF32x16 )
- ASMJIT_NEW_REG_TYPED(newZmmPd , Zmm , Type::kIdF64x8 )
- ASMJIT_NEW_REG_TYPED(newMm , Mm , Type::kIdMmx64 )
- ASMJIT_NEW_REG_TYPED(newKb , KReg, Type::kIdMask8 )
- ASMJIT_NEW_REG_TYPED(newKw , KReg, Type::kIdMask16 )
- ASMJIT_NEW_REG_TYPED(newKd , KReg, Type::kIdMask32 )
- ASMJIT_NEW_REG_TYPED(newKq , KReg, Type::kIdMask64 )
+ ASMJIT_NEW_REG_TYPED(newInt8 , Gp , TypeId::kInt8)
+ ASMJIT_NEW_REG_TYPED(newUInt8 , Gp , TypeId::kUInt8)
+ ASMJIT_NEW_REG_TYPED(newInt16 , Gp , TypeId::kInt16)
+ ASMJIT_NEW_REG_TYPED(newUInt16 , Gp , TypeId::kUInt16)
+ ASMJIT_NEW_REG_TYPED(newInt32 , Gp , TypeId::kInt32)
+ ASMJIT_NEW_REG_TYPED(newUInt32 , Gp , TypeId::kUInt32)
+ ASMJIT_NEW_REG_TYPED(newInt64 , Gp , TypeId::kInt64)
+ ASMJIT_NEW_REG_TYPED(newUInt64 , Gp , TypeId::kUInt64)
+ ASMJIT_NEW_REG_TYPED(newIntPtr , Gp , TypeId::kIntPtr)
+ ASMJIT_NEW_REG_TYPED(newUIntPtr, Gp , TypeId::kUIntPtr)
+
+ ASMJIT_NEW_REG_TYPED(newGpb , Gp , TypeId::kUInt8)
+ ASMJIT_NEW_REG_TYPED(newGpw , Gp , TypeId::kUInt16)
+ ASMJIT_NEW_REG_TYPED(newGpd , Gp , TypeId::kUInt32)
+ ASMJIT_NEW_REG_TYPED(newGpq , Gp , TypeId::kUInt64)
+ ASMJIT_NEW_REG_TYPED(newGpz , Gp , TypeId::kUIntPtr)
+ ASMJIT_NEW_REG_TYPED(newXmm , Xmm , TypeId::kInt32x4)
+ ASMJIT_NEW_REG_TYPED(newXmmSs , Xmm , TypeId::kFloat32x1)
+ ASMJIT_NEW_REG_TYPED(newXmmSd , Xmm , TypeId::kFloat64x1)
+ ASMJIT_NEW_REG_TYPED(newXmmPs , Xmm , TypeId::kFloat32x4)
+ ASMJIT_NEW_REG_TYPED(newXmmPd , Xmm , TypeId::kFloat64x2)
+ ASMJIT_NEW_REG_TYPED(newYmm , Ymm , TypeId::kInt32x8)
+ ASMJIT_NEW_REG_TYPED(newYmmPs , Ymm , TypeId::kFloat32x8)
+ ASMJIT_NEW_REG_TYPED(newYmmPd , Ymm , TypeId::kFloat64x4)
+ ASMJIT_NEW_REG_TYPED(newZmm , Zmm , TypeId::kInt32x16)
+ ASMJIT_NEW_REG_TYPED(newZmmPs , Zmm , TypeId::kFloat32x16)
+ ASMJIT_NEW_REG_TYPED(newZmmPd , Zmm , TypeId::kFloat64x8)
+ ASMJIT_NEW_REG_TYPED(newMm , Mm , TypeId::kMmx64)
+ ASMJIT_NEW_REG_TYPED(newKb , KReg, TypeId::kMask8)
+ ASMJIT_NEW_REG_TYPED(newKw , KReg, TypeId::kMask16)
+ ASMJIT_NEW_REG_TYPED(newKd , KReg, TypeId::kMask32)
+ ASMJIT_NEW_REG_TYPED(newKq , KReg, TypeId::kMask64)
#undef ASMJIT_NEW_REG_TYPED
#undef ASMJIT_NEW_REG_CUSTOM
@@ -586,49 +608,38 @@ public:
//! \{
//! Put data to a constant-pool and get a memory reference to it.
- inline Mem newConst(uint32_t scope, const void* data, size_t size) {
+ inline Mem newConst(ConstPoolScope scope, const void* data, size_t size) {
Mem m(Globals::NoInit);
_newConst(&m, scope, data, size);
return m;
}
//! Put a BYTE `val` to a constant-pool.
- inline Mem newByteConst(uint32_t scope, uint8_t val) noexcept { return newConst(scope, &val, 1); }
+ inline Mem newByteConst(ConstPoolScope scope, uint8_t val) noexcept { return newConst(scope, &val, 1); }
//! Put a WORD `val` to a constant-pool.
- inline Mem newWordConst(uint32_t scope, uint16_t val) noexcept { return newConst(scope, &val, 2); }
+ inline Mem newWordConst(ConstPoolScope scope, uint16_t val) noexcept { return newConst(scope, &val, 2); }
//! Put a DWORD `val` to a constant-pool.
- inline Mem newDWordConst(uint32_t scope, uint32_t val) noexcept { return newConst(scope, &val, 4); }
+ inline Mem newDWordConst(ConstPoolScope scope, uint32_t val) noexcept { return newConst(scope, &val, 4); }
//! Put a QWORD `val` to a constant-pool.
- inline Mem newQWordConst(uint32_t scope, uint64_t val) noexcept { return newConst(scope, &val, 8); }
+ inline Mem newQWordConst(ConstPoolScope scope, uint64_t val) noexcept { return newConst(scope, &val, 8); }
//! Put a WORD `val` to a constant-pool.
- inline Mem newInt16Const(uint32_t scope, int16_t val) noexcept { return newConst(scope, &val, 2); }
+ inline Mem newInt16Const(ConstPoolScope scope, int16_t val) noexcept { return newConst(scope, &val, 2); }
//! Put a WORD `val` to a constant-pool.
- inline Mem newUInt16Const(uint32_t scope, uint16_t val) noexcept { return newConst(scope, &val, 2); }
+ inline Mem newUInt16Const(ConstPoolScope scope, uint16_t val) noexcept { return newConst(scope, &val, 2); }
//! Put a DWORD `val` to a constant-pool.
- inline Mem newInt32Const(uint32_t scope, int32_t val) noexcept { return newConst(scope, &val, 4); }
+ inline Mem newInt32Const(ConstPoolScope scope, int32_t val) noexcept { return newConst(scope, &val, 4); }
//! Put a DWORD `val` to a constant-pool.
- inline Mem newUInt32Const(uint32_t scope, uint32_t val) noexcept { return newConst(scope, &val, 4); }
+ inline Mem newUInt32Const(ConstPoolScope scope, uint32_t val) noexcept { return newConst(scope, &val, 4); }
//! Put a QWORD `val` to a constant-pool.
- inline Mem newInt64Const(uint32_t scope, int64_t val) noexcept { return newConst(scope, &val, 8); }
+ inline Mem newInt64Const(ConstPoolScope scope, int64_t val) noexcept { return newConst(scope, &val, 8); }
//! Put a QWORD `val` to a constant-pool.
- inline Mem newUInt64Const(uint32_t scope, uint64_t val) noexcept { return newConst(scope, &val, 8); }
+ inline Mem newUInt64Const(ConstPoolScope scope, uint64_t val) noexcept { return newConst(scope, &val, 8); }
//! Put a SP-FP `val` to a constant-pool.
- inline Mem newFloatConst(uint32_t scope, float val) noexcept { return newConst(scope, &val, 4); }
+ inline Mem newFloatConst(ConstPoolScope scope, float val) noexcept { return newConst(scope, &val, 4); }
//! Put a DP-FP `val` to a constant-pool.
- inline Mem newDoubleConst(uint32_t scope, double val) noexcept { return newConst(scope, &val, 8); }
-
-#ifndef ASMJIT_NO_DEPRECATED
- ASMJIT_DEPRECATED("newMmConst() uses a deprecated Data64, use newConst() with your own data instead")
- inline Mem newMmConst(uint32_t scope, const Data64& val) noexcept { return newConst(scope, &val, 8); }
-
- ASMJIT_DEPRECATED("newXmmConst() uses a deprecated Data128, use newConst() with your own data instead")
- inline Mem newXmmConst(uint32_t scope, const Data128& val) noexcept { return newConst(scope, &val, 16); }
-
- ASMJIT_DEPRECATED("newYmmConst() uses a deprecated Data256, use newConst() with your own data instead")
- inline Mem newYmmConst(uint32_t scope, const Data256& val) noexcept { return newConst(scope, &val, 32); }
-#endif // !ASMJIT_NO_DEPRECATED
+ inline Mem newDoubleConst(ConstPoolScope scope, double val) noexcept { return newConst(scope, &val, 8); }
//! \}
@@ -636,9 +647,9 @@ public:
//! \{
//! Force the compiler to not follow the conditional or unconditional jump.
- inline Compiler& unfollow() noexcept { _instOptions |= Inst::kOptionUnfollow; return *this; }
+ inline Compiler& unfollow() noexcept { addInstOptions(InstOptions::kUnfollow); return *this; }
//! Tell the compiler that the destination variable will be overwritten.
- inline Compiler& overwrite() noexcept { _instOptions |= Inst::kOptionOverwrite; return *this; }
+ inline Compiler& overwrite() noexcept { addInstOptions(InstOptions::kOverwrite); return *this; }
//! \}
@@ -647,15 +658,13 @@ public:
//! Invoke a function call without `target` type enforcement.
inline Error invoke_(InvokeNode** out, const Operand_& target, const FuncSignature& signature) {
- return _addInvokeNode(out, Inst::kIdCall, target, signature);
+ return addInvokeNode(out, Inst::kIdCall, target, signature);
}
- //! Invoke a function call of the given `target` and `signature` and store
- //! the added node to `out`.
+ //! Invoke a function call of the given `target` and `signature` and store the added node to `out`.
//!
- //! Creates a new \ref InvokeNode, initializes all the necessary members to
- //! match the given function `signature`, adds the node to the compiler, and
- //! stores its pointer to `out`. The operation is atomic, if anything fails
+ //! Creates a new \ref InvokeNode, initializes all the necessary members to match the given function `signature`,
+ //! adds the node to the compiler, and stores its pointer to `out`. The operation is atomic, if anything fails
//! nullptr is stored in `out` and error code is returned.
inline Error invoke(InvokeNode** out, const Gp& target, const FuncSignature& signature) { return invoke_(out, target, signature); }
//! \overload
@@ -667,22 +676,12 @@ public:
//! \overload
inline Error invoke(InvokeNode** out, uint64_t target, const FuncSignature& signature) { return invoke_(out, Imm(int64_t(target)), signature); }
-#ifndef _DOXYGEN
- template<typename Target>
- ASMJIT_DEPRECATED("Use invoke() instead of call()")
- inline InvokeNode* call(const Target& target, const FuncSignature& signature) {
- InvokeNode* invokeNode;
- invoke(&invokeNode, target, signature);
- return invokeNode;
- }
-#endif
-
- //! Return.
- inline FuncRetNode* ret() { return addRet(Operand(), Operand()); }
+ //! Return from function.
+ inline Error ret() { return addRet(Operand(), Operand()); }
//! \overload
- inline FuncRetNode* ret(const BaseReg& o0) { return addRet(o0, Operand()); }
+ inline Error ret(const BaseReg& o0) { return addRet(o0, Operand()); }
//! \overload
- inline FuncRetNode* ret(const BaseReg& o0, const BaseReg& o1) { return addRet(o0, o1); }
+ inline Error ret(const BaseReg& o0, const BaseReg& o1) { return addRet(o0, o1); }
//! \}
@@ -698,17 +697,18 @@ public:
//! \}
- //! \name Finalize
+ //! \name Events
//! \{
- ASMJIT_API Error finalize() override;
+ ASMJIT_API Error onAttach(CodeHolder* code) noexcept override;
+ ASMJIT_API Error onDetach(CodeHolder* code) noexcept override;
//! \}
- //! \name Events
+ //! \name Finalize
//! \{
- ASMJIT_API Error onAttach(CodeHolder* code) noexcept override;
+ ASMJIT_API Error finalize() override;
//! \}
};
diff --git a/3rdparty/asmjit/src/asmjit/x86/x86emithelper.cpp b/3rdparty/asmjit/src/asmjit/x86/x86emithelper.cpp
new file mode 100644
index 00000000000..cc558e07c53
--- /dev/null
+++ b/3rdparty/asmjit/src/asmjit/x86/x86emithelper.cpp
@@ -0,0 +1,619 @@
+// This file is part of AsmJit project <https://asmjit.com>
+//
+// See asmjit.h or LICENSE.md for license and copyright information
+// SPDX-License-Identifier: Zlib
+
+#include "../core/api-build_p.h"
+#if !defined(ASMJIT_NO_X86)
+
+#include "../core/formatter.h"
+#include "../core/funcargscontext_p.h"
+#include "../core/string.h"
+#include "../core/support.h"
+#include "../core/type.h"
+#include "../core/radefs_p.h"
+#include "../x86/x86emithelper_p.h"
+#include "../x86/x86emitter.h"
+#include "../x86/x86formatter_p.h"
+#include "../x86/x86instapi_p.h"
+
+ASMJIT_BEGIN_SUB_NAMESPACE(x86)
+
+// x86::EmitHelper - Utilities
+// ===========================
+
+static inline uint32_t getXmmMovInst(const FuncFrame& frame) {
+ bool avx = frame.isAvxEnabled();
+ bool aligned = frame.hasAlignedVecSR();
+
+ return aligned ? (avx ? Inst::kIdVmovaps : Inst::kIdMovaps)
+ : (avx ? Inst::kIdVmovups : Inst::kIdMovups);
+}
+
+//! Converts `size` to a 'kmov?' instructio.
+static inline uint32_t kmovInstFromSize(uint32_t size) noexcept {
+ switch (size) {
+ case 1: return Inst::kIdKmovb;
+ case 2: return Inst::kIdKmovw;
+ case 4: return Inst::kIdKmovd;
+ case 8: return Inst::kIdKmovq;
+ default: return Inst::kIdNone;
+ }
+}
+
+static inline uint32_t makeCastOp(TypeId dst, TypeId src) noexcept {
+ return (uint32_t(dst) << 8) | uint32_t(src);
+}
+
+// x86::EmitHelper - Emit Reg Move
+// ===============================
+
+ASMJIT_FAVOR_SIZE Error EmitHelper::emitRegMove(
+ const Operand_& dst_,
+ const Operand_& src_, TypeId typeId, const char* comment) {
+
+ // Invalid or abstract TypeIds are not allowed.
+ ASMJIT_ASSERT(TypeUtils::isValid(typeId) && !TypeUtils::isAbstract(typeId));
+
+ Operand dst(dst_);
+ Operand src(src_);
+
+ InstId instId = Inst::kIdNone;
+ uint32_t memFlags = 0;
+ uint32_t overrideMemSize = 0;
+
+ enum MemFlags : uint32_t {
+ kDstMem = 0x1,
+ kSrcMem = 0x2
+ };
+
+ // Detect memory operands and patch them to have the same size as the register. BaseCompiler always sets memory size
+ // of allocs and spills, so it shouldn't be really necessary, however, after this function was separated from Compiler
+ // it's better to make sure that the size is always specified, as we can use 'movzx' and 'movsx' that rely on it.
+ if (dst.isMem()) { memFlags |= kDstMem; dst.as<Mem>().setSize(src.size()); }
+ if (src.isMem()) { memFlags |= kSrcMem; src.as<Mem>().setSize(dst.size()); }
+
+ switch (typeId) {
+ case TypeId::kInt8:
+ case TypeId::kUInt8:
+ case TypeId::kInt16:
+ case TypeId::kUInt16:
+ // Special case - 'movzx' load.
+ if (memFlags & kSrcMem) {
+ instId = Inst::kIdMovzx;
+ dst.setSignature(Reg::signatureOfT<RegType::kX86_Gpd>());
+ break;
+ }
+
+ if (!memFlags) {
+ // Change both destination and source registers to GPD (safer, no dependencies).
+ dst.setSignature(Reg::signatureOfT<RegType::kX86_Gpd>());
+ src.setSignature(Reg::signatureOfT<RegType::kX86_Gpd>());
+ }
+ ASMJIT_FALLTHROUGH;
+
+ case TypeId::kInt32:
+ case TypeId::kUInt32:
+ case TypeId::kInt64:
+ case TypeId::kUInt64:
+ instId = Inst::kIdMov;
+ break;
+
+ case TypeId::kMmx32:
+ instId = Inst::kIdMovd;
+ if (memFlags) break;
+ ASMJIT_FALLTHROUGH;
+
+ case TypeId::kMmx64 : instId = Inst::kIdMovq ; break;
+ case TypeId::kMask8 : instId = Inst::kIdKmovb; break;
+ case TypeId::kMask16: instId = Inst::kIdKmovw; break;
+ case TypeId::kMask32: instId = Inst::kIdKmovd; break;
+ case TypeId::kMask64: instId = Inst::kIdKmovq; break;
+
+ default: {
+ TypeId scalarTypeId = TypeUtils::scalarOf(typeId);
+ if (TypeUtils::isVec32(typeId) && memFlags) {
+ overrideMemSize = 4;
+ if (scalarTypeId == TypeId::kFloat32)
+ instId = _avxEnabled ? Inst::kIdVmovss : Inst::kIdMovss;
+ else
+ instId = _avxEnabled ? Inst::kIdVmovd : Inst::kIdMovd;
+ break;
+ }
+
+ if (TypeUtils::isVec64(typeId) && memFlags) {
+ overrideMemSize = 8;
+ if (scalarTypeId == TypeId::kFloat64)
+ instId = _avxEnabled ? Inst::kIdVmovsd : Inst::kIdMovsd;
+ else
+ instId = _avxEnabled ? Inst::kIdVmovq : Inst::kIdMovq;
+ break;
+ }
+
+ if (scalarTypeId == TypeId::kFloat32)
+ instId = _avxEnabled ? Inst::kIdVmovaps : Inst::kIdMovaps;
+ else if (scalarTypeId == TypeId::kFloat64)
+ instId = _avxEnabled ? Inst::kIdVmovapd : Inst::kIdMovapd;
+ else if (!_avx512Enabled)
+ instId = _avxEnabled ? Inst::kIdVmovdqa : Inst::kIdMovdqa;
+ else
+ instId = Inst::kIdVmovdqa32;
+ break;
+ }
+ }
+
+ if (!instId)
+ return DebugUtils::errored(kErrorInvalidState);
+
+ if (overrideMemSize) {
+ if (dst.isMem()) dst.as<Mem>().setSize(overrideMemSize);
+ if (src.isMem()) src.as<Mem>().setSize(overrideMemSize);
+ }
+
+ _emitter->setInlineComment(comment);
+ return _emitter->emit(instId, dst, src);
+}
+
+// x86::EmitHelper - Emit Arg Move
+// ===============================
+
+ASMJIT_FAVOR_SIZE Error EmitHelper::emitArgMove(
+ const BaseReg& dst_, TypeId dstTypeId,
+ const Operand_& src_, TypeId srcTypeId, const char* comment) {
+
+ // Deduce optional `dstTypeId`, which may be `TypeId::kVoid` in some cases.
+ if (dstTypeId == TypeId::kVoid) {
+ const ArchTraits& archTraits = ArchTraits::byArch(_emitter->arch());
+ dstTypeId = archTraits.regTypeToTypeId(dst_.type());
+ }
+
+ // Invalid or abstract TypeIds are not allowed.
+ ASMJIT_ASSERT(TypeUtils::isValid(dstTypeId) && !TypeUtils::isAbstract(dstTypeId));
+ ASMJIT_ASSERT(TypeUtils::isValid(srcTypeId) && !TypeUtils::isAbstract(srcTypeId));
+
+ Reg dst(dst_.as<Reg>());
+ Operand src(src_);
+
+ uint32_t dstSize = TypeUtils::sizeOf(dstTypeId);
+ uint32_t srcSize = TypeUtils::sizeOf(srcTypeId);
+
+ InstId instId = Inst::kIdNone;
+
+ // Not a real loop, just 'break' is nicer than 'goto'.
+ for (;;) {
+ if (TypeUtils::isInt(dstTypeId)) {
+ if (TypeUtils::isInt(srcTypeId)) {
+ instId = Inst::kIdMovsx;
+ uint32_t castOp = makeCastOp(dstTypeId, srcTypeId);
+
+ // Sign extend by using 'movsx'.
+ if (castOp == makeCastOp(TypeId::kInt16, TypeId::kInt8 ) ||
+ castOp == makeCastOp(TypeId::kInt32, TypeId::kInt8 ) ||
+ castOp == makeCastOp(TypeId::kInt32, TypeId::kInt16) ||
+ castOp == makeCastOp(TypeId::kInt64, TypeId::kInt8 ) ||
+ castOp == makeCastOp(TypeId::kInt64, TypeId::kInt16))
+ break;
+
+ // Sign extend by using 'movsxd'.
+ instId = Inst::kIdMovsxd;
+ if (castOp == makeCastOp(TypeId::kInt64, TypeId::kInt32))
+ break;
+ }
+
+ if (TypeUtils::isInt(srcTypeId) || src_.isMem()) {
+ // Zero extend by using 'movzx' or 'mov'.
+ if (dstSize <= 4 && srcSize < 4) {
+ instId = Inst::kIdMovzx;
+ dst.setSignature(Reg::signatureOfT<RegType::kX86_Gpd>());
+ }
+ else {
+ // We should have caught all possibilities where `srcSize` is less than 4, so we don't have to worry
+ // about 'movzx' anymore. Minimum size is enough to determine if we want 32-bit or 64-bit move.
+ instId = Inst::kIdMov;
+ srcSize = Support::min(srcSize, dstSize);
+
+ dst.setSignature(srcSize == 4 ? Reg::signatureOfT<RegType::kX86_Gpd>()
+ : Reg::signatureOfT<RegType::kX86_Gpq>());
+ if (src.isReg())
+ src.setSignature(dst.signature());
+ }
+ break;
+ }
+
+ // NOTE: The previous branch caught all memory sources, from here it's always register to register conversion,
+ // so catch the remaining cases.
+ srcSize = Support::min(srcSize, dstSize);
+
+ if (TypeUtils::isMmx(srcTypeId)) {
+ // 64-bit move.
+ instId = Inst::kIdMovq;
+ if (srcSize == 8)
+ break;
+
+ // 32-bit move.
+ instId = Inst::kIdMovd;
+ dst.setSignature(Reg::signatureOfT<RegType::kX86_Gpd>());
+ break;
+ }
+
+ if (TypeUtils::isMask(srcTypeId)) {
+ instId = kmovInstFromSize(srcSize);
+ dst.setSignature(srcSize <= 4 ? Reg::signatureOfT<RegType::kX86_Gpd>()
+ : Reg::signatureOfT<RegType::kX86_Gpq>());
+ break;
+ }
+
+ if (TypeUtils::isVec(srcTypeId)) {
+ // 64-bit move.
+ instId = _avxEnabled ? Inst::kIdVmovq : Inst::kIdMovq;
+ if (srcSize == 8)
+ break;
+
+ // 32-bit move.
+ instId = _avxEnabled ? Inst::kIdVmovd : Inst::kIdMovd;
+ dst.setSignature(Reg::signatureOfT<RegType::kX86_Gpd>());
+ break;
+ }
+ }
+
+ if (TypeUtils::isMmx(dstTypeId)) {
+ instId = Inst::kIdMovq;
+ srcSize = Support::min(srcSize, dstSize);
+
+ if (TypeUtils::isInt(srcTypeId) || src.isMem()) {
+ // 64-bit move.
+ if (srcSize == 8)
+ break;
+
+ // 32-bit move.
+ instId = Inst::kIdMovd;
+ if (src.isReg())
+ src.setSignature(Reg::signatureOfT<RegType::kX86_Gpd>());
+ break;
+ }
+
+ if (TypeUtils::isMmx(srcTypeId))
+ break;
+
+ // This will hurt if AVX is enabled.
+ instId = Inst::kIdMovdq2q;
+ if (TypeUtils::isVec(srcTypeId))
+ break;
+ }
+
+ if (TypeUtils::isMask(dstTypeId)) {
+ srcSize = Support::min(srcSize, dstSize);
+
+ if (TypeUtils::isInt(srcTypeId) || TypeUtils::isMask(srcTypeId) || src.isMem()) {
+ instId = kmovInstFromSize(srcSize);
+ if (Reg::isGp(src) && srcSize <= 4)
+ src.setSignature(Reg::signatureOfT<RegType::kX86_Gpd>());
+ break;
+ }
+ }
+
+ if (TypeUtils::isVec(dstTypeId)) {
+ // By default set destination to XMM, will be set to YMM|ZMM if needed.
+ dst.setSignature(Reg::signatureOfT<RegType::kX86_Xmm>());
+
+ // This will hurt if AVX is enabled.
+ if (Reg::isMm(src)) {
+ // 64-bit move.
+ instId = Inst::kIdMovq2dq;
+ break;
+ }
+
+ // Argument conversion.
+ TypeId dstScalarId = TypeUtils::scalarOf(dstTypeId);
+ TypeId srcScalarId = TypeUtils::scalarOf(srcTypeId);
+
+ if (dstScalarId == TypeId::kFloat32 && srcScalarId == TypeId::kFloat64) {
+ srcSize = Support::min(dstSize * 2, srcSize);
+ dstSize = srcSize / 2;
+
+ if (srcSize <= 8)
+ instId = _avxEnabled ? Inst::kIdVcvtss2sd : Inst::kIdCvtss2sd;
+ else
+ instId = _avxEnabled ? Inst::kIdVcvtps2pd : Inst::kIdCvtps2pd;
+
+ if (dstSize == 32)
+ dst.setSignature(Reg::signatureOfT<RegType::kX86_Ymm>());
+ if (src.isReg())
+ src.setSignature(Reg::signatureOfVecBySize(srcSize));
+ break;
+ }
+
+ if (dstScalarId == TypeId::kFloat64 && srcScalarId == TypeId::kFloat32) {
+ srcSize = Support::min(dstSize, srcSize * 2) / 2;
+ dstSize = srcSize * 2;
+
+ if (srcSize <= 4)
+ instId = _avxEnabled ? Inst::kIdVcvtsd2ss : Inst::kIdCvtsd2ss;
+ else
+ instId = _avxEnabled ? Inst::kIdVcvtpd2ps : Inst::kIdCvtpd2ps;
+
+ dst.setSignature(Reg::signatureOfVecBySize(dstSize));
+ if (src.isReg() && srcSize >= 32)
+ src.setSignature(Reg::signatureOfT<RegType::kX86_Ymm>());
+ break;
+ }
+
+ srcSize = Support::min(srcSize, dstSize);
+ if (Reg::isGp(src) || src.isMem()) {
+ // 32-bit move.
+ if (srcSize <= 4) {
+ instId = _avxEnabled ? Inst::kIdVmovd : Inst::kIdMovd;
+ if (src.isReg())
+ src.setSignature(Reg::signatureOfT<RegType::kX86_Gpd>());
+ break;
+ }
+
+ // 64-bit move.
+ if (srcSize == 8) {
+ instId = _avxEnabled ? Inst::kIdVmovq : Inst::kIdMovq;
+ break;
+ }
+ }
+
+ if (Reg::isVec(src) || src.isMem()) {
+ instId = _avxEnabled ? Inst::kIdVmovaps : Inst::kIdMovaps;
+
+ if (src.isMem() && srcSize < _emitter->environment().stackAlignment())
+ instId = _avxEnabled ? Inst::kIdVmovups : Inst::kIdMovups;
+
+ OperandSignature signature = Reg::signatureOfVecBySize(srcSize);
+ dst.setSignature(signature);
+ if (src.isReg())
+ src.setSignature(signature);
+ break;
+ }
+ }
+
+ return DebugUtils::errored(kErrorInvalidState);
+ }
+
+ if (src.isMem())
+ src.as<Mem>().setSize(srcSize);
+
+ _emitter->setInlineComment(comment);
+ return _emitter->emit(instId, dst, src);
+}
+
+Error EmitHelper::emitRegSwap(
+ const BaseReg& a,
+ const BaseReg& b, const char* comment) {
+
+ if (a.isGp() && b.isGp()) {
+ _emitter->setInlineComment(comment);
+ return _emitter->emit(Inst::kIdXchg, a, b);
+ }
+ else
+ return DebugUtils::errored(kErrorInvalidState);
+}
+
+// x86::EmitHelper - Emit Prolog & Epilog
+// ======================================
+
+static inline void X86Internal_setupSaveRestoreInfo(RegGroup group, const FuncFrame& frame, Reg& xReg, uint32_t& xInst, uint32_t& xSize) noexcept {
+ switch (group) {
+ case RegGroup::kVec:
+ xReg = xmm(0);
+ xInst = getXmmMovInst(frame);
+ xSize = xReg.size();
+ break;
+ case RegGroup::kX86_K:
+ xReg = k(0);
+ xInst = Inst::kIdKmovq;
+ xSize = xReg.size();
+ break;
+ case RegGroup::kX86_MM:
+ xReg = mm(0);
+ xInst = Inst::kIdMovq;
+ xSize = xReg.size();
+ break;
+ default:
+ break;
+ }
+}
+
+ASMJIT_FAVOR_SIZE Error EmitHelper::emitProlog(const FuncFrame& frame) {
+ Emitter* emitter = _emitter->as<Emitter>();
+ uint32_t gpSaved = frame.savedRegs(RegGroup::kGp);
+
+ Gp zsp = emitter->zsp(); // ESP|RSP register.
+ Gp zbp = emitter->zbp(); // EBP|RBP register.
+ Gp gpReg = zsp; // General purpose register (temporary).
+ Gp saReg = zsp; // Stack-arguments base pointer.
+
+ // Emit: 'push zbp'
+ // 'mov zbp, zsp'.
+ if (frame.hasPreservedFP()) {
+ gpSaved &= ~Support::bitMask(Gp::kIdBp);
+ ASMJIT_PROPAGATE(emitter->push(zbp));
+ ASMJIT_PROPAGATE(emitter->mov(zbp, zsp));
+ }
+
+ // Emit: 'push gp' sequence.
+ {
+ Support::BitWordIterator<RegMask> it(gpSaved);
+ while (it.hasNext()) {
+ gpReg.setId(it.next());
+ ASMJIT_PROPAGATE(emitter->push(gpReg));
+ }
+ }
+
+ // Emit: 'mov saReg, zsp'.
+ uint32_t saRegId = frame.saRegId();
+ if (saRegId != BaseReg::kIdBad && saRegId != Gp::kIdSp) {
+ saReg.setId(saRegId);
+ if (frame.hasPreservedFP()) {
+ if (saRegId != Gp::kIdBp)
+ ASMJIT_PROPAGATE(emitter->mov(saReg, zbp));
+ }
+ else {
+ ASMJIT_PROPAGATE(emitter->mov(saReg, zsp));
+ }
+ }
+
+ // Emit: 'and zsp, StackAlignment'.
+ if (frame.hasDynamicAlignment()) {
+ ASMJIT_PROPAGATE(emitter->and_(zsp, -int32_t(frame.finalStackAlignment())));
+ }
+
+ // Emit: 'sub zsp, StackAdjustment'.
+ if (frame.hasStackAdjustment()) {
+ ASMJIT_PROPAGATE(emitter->sub(zsp, frame.stackAdjustment()));
+ }
+
+ // Emit: 'mov [zsp + DAOffset], saReg'.
+ if (frame.hasDynamicAlignment() && frame.hasDAOffset()) {
+ Mem saMem = ptr(zsp, int32_t(frame.daOffset()));
+ ASMJIT_PROPAGATE(emitter->mov(saMem, saReg));
+ }
+
+ // Emit 'movxxx [zsp + X], {[x|y|z]mm, k}'.
+ {
+ Reg xReg;
+ Mem xBase = ptr(zsp, int32_t(frame.extraRegSaveOffset()));
+
+ uint32_t xInst;
+ uint32_t xSize;
+
+ for (RegGroup group : Support::EnumValues<RegGroup, RegGroup(1), RegGroup::kMaxVirt>{}) {
+ Support::BitWordIterator<RegMask> it(frame.savedRegs(group));
+ if (it.hasNext()) {
+ X86Internal_setupSaveRestoreInfo(group, frame, xReg, xInst, xSize);
+ do {
+ xReg.setId(it.next());
+ ASMJIT_PROPAGATE(emitter->emit(xInst, xBase, xReg));
+ xBase.addOffsetLo32(int32_t(xSize));
+ } while (it.hasNext());
+ }
+ }
+ }
+
+ return kErrorOk;
+}
+
+ASMJIT_FAVOR_SIZE Error EmitHelper::emitEpilog(const FuncFrame& frame) {
+ Emitter* emitter = _emitter->as<Emitter>();
+
+ uint32_t i;
+ uint32_t regId;
+
+ uint32_t registerSize = emitter->registerSize();
+ uint32_t gpSaved = frame.savedRegs(RegGroup::kGp);
+
+ Gp zsp = emitter->zsp(); // ESP|RSP register.
+ Gp zbp = emitter->zbp(); // EBP|RBP register.
+ Gp gpReg = emitter->zsp(); // General purpose register (temporary).
+
+ // Don't emit 'pop zbp' in the pop sequence, this case is handled separately.
+ if (frame.hasPreservedFP())
+ gpSaved &= ~Support::bitMask(Gp::kIdBp);
+
+ // Emit 'movxxx {[x|y|z]mm, k}, [zsp + X]'.
+ {
+ Reg xReg;
+ Mem xBase = ptr(zsp, int32_t(frame.extraRegSaveOffset()));
+
+ uint32_t xInst;
+ uint32_t xSize;
+
+ for (RegGroup group : Support::EnumValues<RegGroup, RegGroup(1), RegGroup::kMaxVirt>{}) {
+ Support::BitWordIterator<RegMask> it(frame.savedRegs(group));
+ if (it.hasNext()) {
+ X86Internal_setupSaveRestoreInfo(group, frame, xReg, xInst, xSize);
+ do {
+ xReg.setId(it.next());
+ ASMJIT_PROPAGATE(emitter->emit(xInst, xReg, xBase));
+ xBase.addOffsetLo32(int32_t(xSize));
+ } while (it.hasNext());
+ }
+ }
+ }
+
+ // Emit 'emms' and/or 'vzeroupper'.
+ if (frame.hasMmxCleanup()) ASMJIT_PROPAGATE(emitter->emms());
+ if (frame.hasAvxCleanup()) ASMJIT_PROPAGATE(emitter->vzeroupper());
+
+ if (frame.hasPreservedFP()) {
+ // Emit 'mov zsp, zbp' or 'lea zsp, [zbp - x]'
+ int32_t count = int32_t(frame.pushPopSaveSize() - registerSize);
+ if (!count)
+ ASMJIT_PROPAGATE(emitter->mov(zsp, zbp));
+ else
+ ASMJIT_PROPAGATE(emitter->lea(zsp, ptr(zbp, -count)));
+ }
+ else {
+ if (frame.hasDynamicAlignment() && frame.hasDAOffset()) {
+ // Emit 'mov zsp, [zsp + DsaSlot]'.
+ Mem saMem = ptr(zsp, int32_t(frame.daOffset()));
+ ASMJIT_PROPAGATE(emitter->mov(zsp, saMem));
+ }
+ else if (frame.hasStackAdjustment()) {
+ // Emit 'add zsp, StackAdjustment'.
+ ASMJIT_PROPAGATE(emitter->add(zsp, int32_t(frame.stackAdjustment())));
+ }
+ }
+
+ // Emit 'pop gp' sequence.
+ if (gpSaved) {
+ i = gpSaved;
+ regId = 16;
+
+ do {
+ regId--;
+ if (i & 0x8000) {
+ gpReg.setId(regId);
+ ASMJIT_PROPAGATE(emitter->pop(gpReg));
+ }
+ i <<= 1;
+ } while (regId != 0);
+ }
+
+ // Emit 'pop zbp'.
+ if (frame.hasPreservedFP())
+ ASMJIT_PROPAGATE(emitter->pop(zbp));
+
+ // Emit 'ret' or 'ret x'.
+ if (frame.hasCalleeStackCleanup())
+ ASMJIT_PROPAGATE(emitter->emit(Inst::kIdRet, int(frame.calleeStackCleanup())));
+ else
+ ASMJIT_PROPAGATE(emitter->emit(Inst::kIdRet));
+
+ return kErrorOk;
+}
+
+static Error ASMJIT_CDECL Emitter_emitProlog(BaseEmitter* emitter, const FuncFrame& frame) {
+ EmitHelper emitHelper(emitter, frame.isAvxEnabled(), frame.isAvx512Enabled());
+ return emitHelper.emitProlog(frame);
+}
+
+static Error ASMJIT_CDECL Emitter_emitEpilog(BaseEmitter* emitter, const FuncFrame& frame) {
+ EmitHelper emitHelper(emitter, frame.isAvxEnabled(), frame.isAvx512Enabled());
+ return emitHelper.emitEpilog(frame);
+}
+
+static Error ASMJIT_CDECL Emitter_emitArgsAssignment(BaseEmitter* emitter, const FuncFrame& frame, const FuncArgsAssignment& args) {
+ EmitHelper emitHelper(emitter, frame.isAvxEnabled(), frame.isAvx512Enabled());
+ return emitHelper.emitArgsAssignment(frame, args);
+}
+
+void assignEmitterFuncs(BaseEmitter* emitter) {
+ emitter->_funcs.emitProlog = Emitter_emitProlog;
+ emitter->_funcs.emitEpilog = Emitter_emitEpilog;
+ emitter->_funcs.emitArgsAssignment = Emitter_emitArgsAssignment;
+
+#ifndef ASMJIT_NO_LOGGING
+ emitter->_funcs.formatInstruction = FormatterInternal::formatInstruction;
+#endif
+
+#ifndef ASMJIT_NO_VALIDATION
+ emitter->_funcs.validate = InstInternal::validate;
+#endif
+}
+
+ASMJIT_END_SUB_NAMESPACE
+
+#endif // !ASMJIT_NO_X86
diff --git a/3rdparty/asmjit/src/asmjit/x86/x86emithelper_p.h b/3rdparty/asmjit/src/asmjit/x86/x86emithelper_p.h
new file mode 100644
index 00000000000..e71d9afe7db
--- /dev/null
+++ b/3rdparty/asmjit/src/asmjit/x86/x86emithelper_p.h
@@ -0,0 +1,60 @@
+// This file is part of AsmJit project <https://asmjit.com>
+//
+// See asmjit.h or LICENSE.md for license and copyright information
+// SPDX-License-Identifier: Zlib
+
+#ifndef ASMJIT_X86_X86EMITHELPER_P_H_INCLUDED
+#define ASMJIT_X86_X86EMITHELPER_P_H_INCLUDED
+
+#include "../core/api-config.h"
+
+#include "../core/emithelper_p.h"
+#include "../core/func.h"
+#include "../x86/x86emitter.h"
+#include "../x86/x86operand.h"
+
+ASMJIT_BEGIN_SUB_NAMESPACE(x86)
+
+//! \cond INTERNAL
+//! \addtogroup asmjit_x86
+//! \{
+
+static inline RegType vecTypeIdToRegType(TypeId typeId) noexcept {
+ return uint32_t(typeId) <= uint32_t(TypeId::_kVec128End) ? RegType::kX86_Xmm :
+ uint32_t(typeId) <= uint32_t(TypeId::_kVec256End) ? RegType::kX86_Ymm : RegType::kX86_Zmm;
+}
+
+class EmitHelper : public BaseEmitHelper {
+public:
+ bool _avxEnabled;
+ bool _avx512Enabled;
+
+ inline explicit EmitHelper(BaseEmitter* emitter = nullptr, bool avxEnabled = false, bool avx512Enabled = false) noexcept
+ : BaseEmitHelper(emitter),
+ _avxEnabled(avxEnabled || avx512Enabled),
+ _avx512Enabled(avx512Enabled) {}
+
+ Error emitRegMove(
+ const Operand_& dst_,
+ const Operand_& src_, TypeId typeId, const char* comment = nullptr) override;
+
+ Error emitArgMove(
+ const BaseReg& dst_, TypeId dstTypeId,
+ const Operand_& src_, TypeId srcTypeId, const char* comment = nullptr) override;
+
+ Error emitRegSwap(
+ const BaseReg& a,
+ const BaseReg& b, const char* comment = nullptr) override;
+
+ Error emitProlog(const FuncFrame& frame);
+ Error emitEpilog(const FuncFrame& frame);
+};
+
+void assignEmitterFuncs(BaseEmitter* emitter);
+
+//! \}
+//! \endcond
+
+ASMJIT_END_SUB_NAMESPACE
+
+#endif // ASMJIT_X86_X86EMITHELPER_P_H_INCLUDED
diff --git a/3rdparty/asmjit/src/asmjit/x86/x86emitter.h b/3rdparty/asmjit/src/asmjit/x86/x86emitter.h
index 561acdd6000..1f85dec4fd9 100644
--- a/3rdparty/asmjit/src/asmjit/x86/x86emitter.h
+++ b/3rdparty/asmjit/src/asmjit/x86/x86emitter.h
@@ -1,25 +1,7 @@
-// AsmJit - Machine code generation for C++
+// This file is part of AsmJit project <https://asmjit.com>
//
-// * Official AsmJit Home Page: https://asmjit.com
-// * Official Github Repository: https://github.com/asmjit/asmjit
-//
-// Copyright (c) 2008-2020 The AsmJit Authors
-//
-// This software is provided 'as-is', without any express or implied
-// warranty. In no event will the authors be held liable for any damages
-// arising from the use of this software.
-//
-// Permission is granted to anyone to use this software for any purpose,
-// including commercial applications, and to alter it and redistribute it
-// freely, subject to the following restrictions:
-//
-// 1. The origin of this software must not be misrepresented; you must not
-// claim that you wrote the original software. If you use this software
-// in a product, an acknowledgment in the product documentation would be
-// appreciated but is not required.
-// 2. Altered source versions must be plainly marked as such, and must not be
-// misrepresented as being the original software.
-// 3. This notice may not be removed or altered from any source distribution.
+// See asmjit.h or LICENSE.md for license and copyright information
+// SPDX-License-Identifier: Zlib
#ifndef ASMJIT_X86_X86EMITTER_H_INCLUDED
#define ASMJIT_X86_X86EMITTER_H_INCLUDED
@@ -32,176 +14,121 @@
ASMJIT_BEGIN_SUB_NAMESPACE(x86)
#define ASMJIT_INST_0x(NAME, ID) \
- inline Error NAME() { return _emitter()->emit(Inst::kId##ID); }
+ inline Error NAME() { return _emitter()->_emitI(Inst::kId##ID); }
#define ASMJIT_INST_1x(NAME, ID, T0) \
- inline Error NAME(const T0& o0) { return _emitter()->emit(Inst::kId##ID, o0); }
-
-#define ASMJIT_INST_1i(NAME, ID, T0) \
- inline Error NAME(const T0& o0) { return _emitter()->emit(Inst::kId##ID, o0); } \
- /** \cond */ \
- inline Error NAME(int o0) { return _emitter()->emit(Inst::kId##ID, Support::asInt(o0)); } \
- inline Error NAME(unsigned int o0) { return _emitter()->emit(Inst::kId##ID, Support::asInt(o0)); } \
- inline Error NAME(int64_t o0) { return _emitter()->emit(Inst::kId##ID, Support::asInt(o0)); } \
- inline Error NAME(uint64_t o0) { return _emitter()->emit(Inst::kId##ID, Support::asInt(o0)); } \
- /** \endcond */
+ inline Error NAME(const T0& o0) { return _emitter()->_emitI(Inst::kId##ID, o0); }
#define ASMJIT_INST_1c(NAME, ID, CONV, T0) \
- inline Error NAME(uint32_t cc, const T0& o0) { return _emitter()->emit(CONV(cc), o0); } \
- inline Error NAME##a(const T0& o0) { return _emitter()->emit(Inst::kId##ID##a, o0); } \
- inline Error NAME##ae(const T0& o0) { return _emitter()->emit(Inst::kId##ID##ae, o0); } \
- inline Error NAME##b(const T0& o0) { return _emitter()->emit(Inst::kId##ID##b, o0); } \
- inline Error NAME##be(const T0& o0) { return _emitter()->emit(Inst::kId##ID##be, o0); } \
- inline Error NAME##c(const T0& o0) { return _emitter()->emit(Inst::kId##ID##c, o0); } \
- inline Error NAME##e(const T0& o0) { return _emitter()->emit(Inst::kId##ID##e, o0); } \
- inline Error NAME##g(const T0& o0) { return _emitter()->emit(Inst::kId##ID##g, o0); } \
- inline Error NAME##ge(const T0& o0) { return _emitter()->emit(Inst::kId##ID##ge, o0); } \
- inline Error NAME##l(const T0& o0) { return _emitter()->emit(Inst::kId##ID##l, o0); } \
- inline Error NAME##le(const T0& o0) { return _emitter()->emit(Inst::kId##ID##le, o0); } \
- inline Error NAME##na(const T0& o0) { return _emitter()->emit(Inst::kId##ID##na, o0); } \
- inline Error NAME##nae(const T0& o0) { return _emitter()->emit(Inst::kId##ID##nae, o0); } \
- inline Error NAME##nb(const T0& o0) { return _emitter()->emit(Inst::kId##ID##nb, o0); } \
- inline Error NAME##nbe(const T0& o0) { return _emitter()->emit(Inst::kId##ID##nbe, o0); } \
- inline Error NAME##nc(const T0& o0) { return _emitter()->emit(Inst::kId##ID##nc, o0); } \
- inline Error NAME##ne(const T0& o0) { return _emitter()->emit(Inst::kId##ID##ne, o0); } \
- inline Error NAME##ng(const T0& o0) { return _emitter()->emit(Inst::kId##ID##ng, o0); } \
- inline Error NAME##nge(const T0& o0) { return _emitter()->emit(Inst::kId##ID##nge, o0); } \
- inline Error NAME##nl(const T0& o0) { return _emitter()->emit(Inst::kId##ID##nl, o0); } \
- inline Error NAME##nle(const T0& o0) { return _emitter()->emit(Inst::kId##ID##nle, o0); } \
- inline Error NAME##no(const T0& o0) { return _emitter()->emit(Inst::kId##ID##no, o0); } \
- inline Error NAME##np(const T0& o0) { return _emitter()->emit(Inst::kId##ID##np, o0); } \
- inline Error NAME##ns(const T0& o0) { return _emitter()->emit(Inst::kId##ID##ns, o0); } \
- inline Error NAME##nz(const T0& o0) { return _emitter()->emit(Inst::kId##ID##nz, o0); } \
- inline Error NAME##o(const T0& o0) { return _emitter()->emit(Inst::kId##ID##o, o0); } \
- inline Error NAME##p(const T0& o0) { return _emitter()->emit(Inst::kId##ID##p, o0); } \
- inline Error NAME##pe(const T0& o0) { return _emitter()->emit(Inst::kId##ID##pe, o0); } \
- inline Error NAME##po(const T0& o0) { return _emitter()->emit(Inst::kId##ID##po, o0); } \
- inline Error NAME##s(const T0& o0) { return _emitter()->emit(Inst::kId##ID##s, o0); } \
- inline Error NAME##z(const T0& o0) { return _emitter()->emit(Inst::kId##ID##z, o0); }
+ inline Error NAME(CondCode cc, const T0& o0) { return _emitter()->_emitI(CONV(cc), o0); } \
+ inline Error NAME##a(const T0& o0) { return _emitter()->_emitI(Inst::kId##ID##a, o0); } \
+ inline Error NAME##ae(const T0& o0) { return _emitter()->_emitI(Inst::kId##ID##ae, o0); } \
+ inline Error NAME##b(const T0& o0) { return _emitter()->_emitI(Inst::kId##ID##b, o0); } \
+ inline Error NAME##be(const T0& o0) { return _emitter()->_emitI(Inst::kId##ID##be, o0); } \
+ inline Error NAME##c(const T0& o0) { return _emitter()->_emitI(Inst::kId##ID##c, o0); } \
+ inline Error NAME##e(const T0& o0) { return _emitter()->_emitI(Inst::kId##ID##e, o0); } \
+ inline Error NAME##g(const T0& o0) { return _emitter()->_emitI(Inst::kId##ID##g, o0); } \
+ inline Error NAME##ge(const T0& o0) { return _emitter()->_emitI(Inst::kId##ID##ge, o0); } \
+ inline Error NAME##l(const T0& o0) { return _emitter()->_emitI(Inst::kId##ID##l, o0); } \
+ inline Error NAME##le(const T0& o0) { return _emitter()->_emitI(Inst::kId##ID##le, o0); } \
+ inline Error NAME##na(const T0& o0) { return _emitter()->_emitI(Inst::kId##ID##na, o0); } \
+ inline Error NAME##nae(const T0& o0) { return _emitter()->_emitI(Inst::kId##ID##nae, o0); } \
+ inline Error NAME##nb(const T0& o0) { return _emitter()->_emitI(Inst::kId##ID##nb, o0); } \
+ inline Error NAME##nbe(const T0& o0) { return _emitter()->_emitI(Inst::kId##ID##nbe, o0); } \
+ inline Error NAME##nc(const T0& o0) { return _emitter()->_emitI(Inst::kId##ID##nc, o0); } \
+ inline Error NAME##ne(const T0& o0) { return _emitter()->_emitI(Inst::kId##ID##ne, o0); } \
+ inline Error NAME##ng(const T0& o0) { return _emitter()->_emitI(Inst::kId##ID##ng, o0); } \
+ inline Error NAME##nge(const T0& o0) { return _emitter()->_emitI(Inst::kId##ID##nge, o0); } \
+ inline Error NAME##nl(const T0& o0) { return _emitter()->_emitI(Inst::kId##ID##nl, o0); } \
+ inline Error NAME##nle(const T0& o0) { return _emitter()->_emitI(Inst::kId##ID##nle, o0); } \
+ inline Error NAME##no(const T0& o0) { return _emitter()->_emitI(Inst::kId##ID##no, o0); } \
+ inline Error NAME##np(const T0& o0) { return _emitter()->_emitI(Inst::kId##ID##np, o0); } \
+ inline Error NAME##ns(const T0& o0) { return _emitter()->_emitI(Inst::kId##ID##ns, o0); } \
+ inline Error NAME##nz(const T0& o0) { return _emitter()->_emitI(Inst::kId##ID##nz, o0); } \
+ inline Error NAME##o(const T0& o0) { return _emitter()->_emitI(Inst::kId##ID##o, o0); } \
+ inline Error NAME##p(const T0& o0) { return _emitter()->_emitI(Inst::kId##ID##p, o0); } \
+ inline Error NAME##pe(const T0& o0) { return _emitter()->_emitI(Inst::kId##ID##pe, o0); } \
+ inline Error NAME##po(const T0& o0) { return _emitter()->_emitI(Inst::kId##ID##po, o0); } \
+ inline Error NAME##s(const T0& o0) { return _emitter()->_emitI(Inst::kId##ID##s, o0); } \
+ inline Error NAME##z(const T0& o0) { return _emitter()->_emitI(Inst::kId##ID##z, o0); }
#define ASMJIT_INST_2x(NAME, ID, T0, T1) \
- inline Error NAME(const T0& o0, const T1& o1) { return _emitter()->emit(Inst::kId##ID, o0, o1); }
-
-#define ASMJIT_INST_2i(NAME, ID, T0, T1) \
- inline Error NAME(const T0& o0, const T1& o1) { return _emitter()->emit(Inst::kId##ID, o0, o1); } \
- /** \cond */ \
- inline Error NAME(const T0& o0, int o1) { return _emitter()->emit(Inst::kId##ID, o0, Support::asInt(o1)); } \
- inline Error NAME(const T0& o0, unsigned int o1) { return _emitter()->emit(Inst::kId##ID, o0, Support::asInt(o1)); } \
- inline Error NAME(const T0& o0, int64_t o1) { return _emitter()->emit(Inst::kId##ID, o0, Support::asInt(o1)); } \
- inline Error NAME(const T0& o0, uint64_t o1) { return _emitter()->emit(Inst::kId##ID, o0, Support::asInt(o1)); } \
- /** \endcond */
+ inline Error NAME(const T0& o0, const T1& o1) { return _emitter()->_emitI(Inst::kId##ID, o0, o1); }
#define ASMJIT_INST_2c(NAME, ID, CONV, T0, T1) \
- inline Error NAME(uint32_t cc, const T0& o0, const T1& o1) { return _emitter()->emit(CONV(cc), o0, o1); } \
- inline Error NAME##a(const T0& o0, const T1& o1) { return _emitter()->emit(Inst::kId##ID##a, o0, o1); } \
- inline Error NAME##ae(const T0& o0, const T1& o1) { return _emitter()->emit(Inst::kId##ID##ae, o0, o1); } \
- inline Error NAME##b(const T0& o0, const T1& o1) { return _emitter()->emit(Inst::kId##ID##b, o0, o1); } \
- inline Error NAME##be(const T0& o0, const T1& o1) { return _emitter()->emit(Inst::kId##ID##be, o0, o1); } \
- inline Error NAME##c(const T0& o0, const T1& o1) { return _emitter()->emit(Inst::kId##ID##c, o0, o1); } \
- inline Error NAME##e(const T0& o0, const T1& o1) { return _emitter()->emit(Inst::kId##ID##e, o0, o1); } \
- inline Error NAME##g(const T0& o0, const T1& o1) { return _emitter()->emit(Inst::kId##ID##g, o0, o1); } \
- inline Error NAME##ge(const T0& o0, const T1& o1) { return _emitter()->emit(Inst::kId##ID##ge, o0, o1); } \
- inline Error NAME##l(const T0& o0, const T1& o1) { return _emitter()->emit(Inst::kId##ID##l, o0, o1); } \
- inline Error NAME##le(const T0& o0, const T1& o1) { return _emitter()->emit(Inst::kId##ID##le, o0, o1); } \
- inline Error NAME##na(const T0& o0, const T1& o1) { return _emitter()->emit(Inst::kId##ID##na, o0, o1); } \
- inline Error NAME##nae(const T0& o0, const T1& o1) { return _emitter()->emit(Inst::kId##ID##nae, o0, o1); } \
- inline Error NAME##nb(const T0& o0, const T1& o1) { return _emitter()->emit(Inst::kId##ID##nb, o0, o1); } \
- inline Error NAME##nbe(const T0& o0, const T1& o1) { return _emitter()->emit(Inst::kId##ID##nbe, o0, o1); } \
- inline Error NAME##nc(const T0& o0, const T1& o1) { return _emitter()->emit(Inst::kId##ID##nc, o0, o1); } \
- inline Error NAME##ne(const T0& o0, const T1& o1) { return _emitter()->emit(Inst::kId##ID##ne, o0, o1); } \
- inline Error NAME##ng(const T0& o0, const T1& o1) { return _emitter()->emit(Inst::kId##ID##ng, o0, o1); } \
- inline Error NAME##nge(const T0& o0, const T1& o1) { return _emitter()->emit(Inst::kId##ID##nge, o0, o1); } \
- inline Error NAME##nl(const T0& o0, const T1& o1) { return _emitter()->emit(Inst::kId##ID##nl, o0, o1); } \
- inline Error NAME##nle(const T0& o0, const T1& o1) { return _emitter()->emit(Inst::kId##ID##nle, o0, o1); } \
- inline Error NAME##no(const T0& o0, const T1& o1) { return _emitter()->emit(Inst::kId##ID##no, o0, o1); } \
- inline Error NAME##np(const T0& o0, const T1& o1) { return _emitter()->emit(Inst::kId##ID##np, o0, o1); } \
- inline Error NAME##ns(const T0& o0, const T1& o1) { return _emitter()->emit(Inst::kId##ID##ns, o0, o1); } \
- inline Error NAME##nz(const T0& o0, const T1& o1) { return _emitter()->emit(Inst::kId##ID##nz, o0, o1); } \
- inline Error NAME##o(const T0& o0, const T1& o1) { return _emitter()->emit(Inst::kId##ID##o, o0, o1); } \
- inline Error NAME##p(const T0& o0, const T1& o1) { return _emitter()->emit(Inst::kId##ID##p, o0, o1); } \
- inline Error NAME##pe(const T0& o0, const T1& o1) { return _emitter()->emit(Inst::kId##ID##pe, o0, o1); } \
- inline Error NAME##po(const T0& o0, const T1& o1) { return _emitter()->emit(Inst::kId##ID##po, o0, o1); } \
- inline Error NAME##s(const T0& o0, const T1& o1) { return _emitter()->emit(Inst::kId##ID##s, o0, o1); } \
- inline Error NAME##z(const T0& o0, const T1& o1) { return _emitter()->emit(Inst::kId##ID##z, o0, o1); }
+ inline Error NAME(CondCode cc, const T0& o0, const T1& o1) { return _emitter()->_emitI(CONV(cc), o0, o1); } \
+ inline Error NAME##a(const T0& o0, const T1& o1) { return _emitter()->_emitI(Inst::kId##ID##a, o0, o1); } \
+ inline Error NAME##ae(const T0& o0, const T1& o1) { return _emitter()->_emitI(Inst::kId##ID##ae, o0, o1); } \
+ inline Error NAME##b(const T0& o0, const T1& o1) { return _emitter()->_emitI(Inst::kId##ID##b, o0, o1); } \
+ inline Error NAME##be(const T0& o0, const T1& o1) { return _emitter()->_emitI(Inst::kId##ID##be, o0, o1); } \
+ inline Error NAME##c(const T0& o0, const T1& o1) { return _emitter()->_emitI(Inst::kId##ID##c, o0, o1); } \
+ inline Error NAME##e(const T0& o0, const T1& o1) { return _emitter()->_emitI(Inst::kId##ID##e, o0, o1); } \
+ inline Error NAME##g(const T0& o0, const T1& o1) { return _emitter()->_emitI(Inst::kId##ID##g, o0, o1); } \
+ inline Error NAME##ge(const T0& o0, const T1& o1) { return _emitter()->_emitI(Inst::kId##ID##ge, o0, o1); } \
+ inline Error NAME##l(const T0& o0, const T1& o1) { return _emitter()->_emitI(Inst::kId##ID##l, o0, o1); } \
+ inline Error NAME##le(const T0& o0, const T1& o1) { return _emitter()->_emitI(Inst::kId##ID##le, o0, o1); } \
+ inline Error NAME##na(const T0& o0, const T1& o1) { return _emitter()->_emitI(Inst::kId##ID##na, o0, o1); } \
+ inline Error NAME##nae(const T0& o0, const T1& o1) { return _emitter()->_emitI(Inst::kId##ID##nae, o0, o1); } \
+ inline Error NAME##nb(const T0& o0, const T1& o1) { return _emitter()->_emitI(Inst::kId##ID##nb, o0, o1); } \
+ inline Error NAME##nbe(const T0& o0, const T1& o1) { return _emitter()->_emitI(Inst::kId##ID##nbe, o0, o1); } \
+ inline Error NAME##nc(const T0& o0, const T1& o1) { return _emitter()->_emitI(Inst::kId##ID##nc, o0, o1); } \
+ inline Error NAME##ne(const T0& o0, const T1& o1) { return _emitter()->_emitI(Inst::kId##ID##ne, o0, o1); } \
+ inline Error NAME##ng(const T0& o0, const T1& o1) { return _emitter()->_emitI(Inst::kId##ID##ng, o0, o1); } \
+ inline Error NAME##nge(const T0& o0, const T1& o1) { return _emitter()->_emitI(Inst::kId##ID##nge, o0, o1); } \
+ inline Error NAME##nl(const T0& o0, const T1& o1) { return _emitter()->_emitI(Inst::kId##ID##nl, o0, o1); } \
+ inline Error NAME##nle(const T0& o0, const T1& o1) { return _emitter()->_emitI(Inst::kId##ID##nle, o0, o1); } \
+ inline Error NAME##no(const T0& o0, const T1& o1) { return _emitter()->_emitI(Inst::kId##ID##no, o0, o1); } \
+ inline Error NAME##np(const T0& o0, const T1& o1) { return _emitter()->_emitI(Inst::kId##ID##np, o0, o1); } \
+ inline Error NAME##ns(const T0& o0, const T1& o1) { return _emitter()->_emitI(Inst::kId##ID##ns, o0, o1); } \
+ inline Error NAME##nz(const T0& o0, const T1& o1) { return _emitter()->_emitI(Inst::kId##ID##nz, o0, o1); } \
+ inline Error NAME##o(const T0& o0, const T1& o1) { return _emitter()->_emitI(Inst::kId##ID##o, o0, o1); } \
+ inline Error NAME##p(const T0& o0, const T1& o1) { return _emitter()->_emitI(Inst::kId##ID##p, o0, o1); } \
+ inline Error NAME##pe(const T0& o0, const T1& o1) { return _emitter()->_emitI(Inst::kId##ID##pe, o0, o1); } \
+ inline Error NAME##po(const T0& o0, const T1& o1) { return _emitter()->_emitI(Inst::kId##ID##po, o0, o1); } \
+ inline Error NAME##s(const T0& o0, const T1& o1) { return _emitter()->_emitI(Inst::kId##ID##s, o0, o1); } \
+ inline Error NAME##z(const T0& o0, const T1& o1) { return _emitter()->_emitI(Inst::kId##ID##z, o0, o1); }
#define ASMJIT_INST_3x(NAME, ID, T0, T1, T2) \
- inline Error NAME(const T0& o0, const T1& o1, const T2& o2) { return _emitter()->emit(Inst::kId##ID, o0, o1, o2); }
-
-#define ASMJIT_INST_3i(NAME, ID, T0, T1, T2) \
- inline Error NAME(const T0& o0, const T1& o1, const T2& o2) { return _emitter()->emit(Inst::kId##ID, o0, o1, o2); } \
- /** \cond */ \
- inline Error NAME(const T0& o0, const T1& o1, int o2) { return _emitter()->emit(Inst::kId##ID, o0, o1, Support::asInt(o2)); } \
- inline Error NAME(const T0& o0, const T1& o1, unsigned int o2) { return _emitter()->emit(Inst::kId##ID, o0, o1, Support::asInt(o2)); } \
- inline Error NAME(const T0& o0, const T1& o1, int64_t o2) { return _emitter()->emit(Inst::kId##ID, o0, o1, Support::asInt(o2)); } \
- inline Error NAME(const T0& o0, const T1& o1, uint64_t o2) { return _emitter()->emit(Inst::kId##ID, o0, o1, Support::asInt(o2)); } \
- /** \endcond */
-
-#define ASMJIT_INST_3ii(NAME, ID, T0, T1, T2) \
- inline Error NAME(const T0& o0, const T1& o1, const T2& o2) { return _emitter()->emit(Inst::kId##ID, o0, o1, o2); } \
- inline Error NAME(const T0& o0, int o1, int o2) { return _emitter()->emit(Inst::kId##ID, o0, Imm(o1), Support::asInt(o2)); }
+ inline Error NAME(const T0& o0, const T1& o1, const T2& o2) { return _emitter()->_emitI(Inst::kId##ID, o0, o1, o2); }
#define ASMJIT_INST_4x(NAME, ID, T0, T1, T2, T3) \
- inline Error NAME(const T0& o0, const T1& o1, const T2& o2, const T3& o3) { return _emitter()->emit(Inst::kId##ID, o0, o1, o2, o3); }
-
-#define ASMJIT_INST_4i(NAME, ID, T0, T1, T2, T3) \
- inline Error NAME(const T0& o0, const T1& o1, const T2& o2, const T3& o3) { return _emitter()->emit(Inst::kId##ID, o0, o1, o2, o3); } \
- /** \cond */ \
- inline Error NAME(const T0& o0, const T1& o1, const T2& o2, int o3) { return _emitter()->emit(Inst::kId##ID, o0, o1, o2, Support::asInt(o3)); } \
- inline Error NAME(const T0& o0, const T1& o1, const T2& o2, unsigned int o3) { return _emitter()->emit(Inst::kId##ID, o0, o1, o2, Support::asInt(o3)); } \
- inline Error NAME(const T0& o0, const T1& o1, const T2& o2, int64_t o3) { return _emitter()->emit(Inst::kId##ID, o0, o1, o2, Support::asInt(o3)); } \
- inline Error NAME(const T0& o0, const T1& o1, const T2& o2, uint64_t o3) { return _emitter()->emit(Inst::kId##ID, o0, o1, o2, Support::asInt(o3)); } \
- /** \endcond */
-
-#define ASMJIT_INST_4ii(NAME, ID, T0, T1, T2, T3) \
- inline Error NAME(const T0& o0, const T1& o1, const T2& o2, const T3& o3) { return _emitter()->emit(Inst::kId##ID, o0, o1, o2, o3); } \
- inline Error NAME(const T0& o0, const T1& o1, int o2, int o3) { return _emitter()->emit(Inst::kId##ID, o0, o1, Imm(o2), Support::asInt(o3)); }
+ inline Error NAME(const T0& o0, const T1& o1, const T2& o2, const T3& o3) { return _emitter()->_emitI(Inst::kId##ID, o0, o1, o2, o3); }
#define ASMJIT_INST_5x(NAME, ID, T0, T1, T2, T3, T4) \
- inline Error NAME(const T0& o0, const T1& o1, const T2& o2, const T3& o3, const T4& o4) { return _emitter()->emit(Inst::kId##ID, o0, o1, o2, o3, o4); }
-
-#define ASMJIT_INST_5i(NAME, ID, T0, T1, T2, T3, T4) \
- inline Error NAME(const T0& o0, const T1& o1, const T2& o2, const T3& o3, const T4& o4) { return _emitter()->emit(Inst::kId##ID, o0, o1, o2, o3, o4); } \
- /** \cond */ \
- inline Error NAME(const T0& o0, const T1& o1, const T2& o2, const T3& o3, int o4) { return _emitter()->emit(Inst::kId##ID, o0, o1, o2, o3, Support::asInt(o4)); } \
- inline Error NAME(const T0& o0, const T1& o1, const T2& o2, const T3& o3, unsigned int o4) { return _emitter()->emit(Inst::kId##ID, o0, o1, o2, o3, Support::asInt(o4)); } \
- inline Error NAME(const T0& o0, const T1& o1, const T2& o2, const T3& o3, int64_t o4) { return _emitter()->emit(Inst::kId##ID, o0, o1, o2, o3, Support::asInt(o4)); } \
- inline Error NAME(const T0& o0, const T1& o1, const T2& o2, const T3& o3, uint64_t o4) { return _emitter()->emit(Inst::kId##ID, o0, o1, o2, o3, Support::asInt(o4)); } \
- /** \endcond */
+ inline Error NAME(const T0& o0, const T1& o1, const T2& o2, const T3& o3, const T4& o4) { return _emitter()->_emitI(Inst::kId##ID, o0, o1, o2, o3, o4); }
#define ASMJIT_INST_6x(NAME, ID, T0, T1, T2, T3, T4, T5) \
- inline Error NAME(const T0& o0, const T1& o1, const T2& o2, const T3& o3, const T4& o4, const T5& o5) { return _emitter()->emit(Inst::kId##ID, o0, o1, o2, o3, o4, o5); }
+ inline Error NAME(const T0& o0, const T1& o1, const T2& o2, const T3& o3, const T4& o4, const T5& o5) { return _emitter()->_emitI(Inst::kId##ID, o0, o1, o2, o3, o4, o5); }
//! \addtogroup asmjit_x86
//! \{
-// ============================================================================
-// [asmjit::x86::EmitterExplicitT]
-// ============================================================================
-
+//! Emitter (X86 - explicit).
template<typename This>
struct EmitterExplicitT {
//! \cond
+
// These typedefs are used to describe implicit operands passed explicitly.
- typedef Gp AL;
- typedef Gp AH;
- typedef Gp CL;
- typedef Gp AX;
- typedef Gp DX;
-
- typedef Gp EAX;
- typedef Gp EBX;
- typedef Gp ECX;
- typedef Gp EDX;
-
- typedef Gp RAX;
- typedef Gp RBX;
- typedef Gp RCX;
- typedef Gp RDX;
-
- typedef Gp ZAX;
- typedef Gp ZBX;
- typedef Gp ZCX;
- typedef Gp ZDX;
+ typedef Gp Gp_AL;
+ typedef Gp Gp_AH;
+ typedef Gp Gp_CL;
+ typedef Gp Gp_AX;
+ typedef Gp Gp_DX;
+
+ typedef Gp Gp_EAX;
+ typedef Gp Gp_EBX;
+ typedef Gp Gp_ECX;
+ typedef Gp Gp_EDX;
+
+ typedef Gp Gp_RAX;
+ typedef Gp Gp_RBX;
+ typedef Gp Gp_RCX;
+ typedef Gp Gp_RDX;
+
+ typedef Gp Gp_ZAX;
+ typedef Gp Gp_ZBX;
+ typedef Gp Gp_ZCX;
+ typedef Gp Gp_ZDX;
typedef Mem DS_ZAX; // ds:[zax]
typedef Mem DS_ZDI; // ds:[zdi]
@@ -210,9 +137,8 @@ struct EmitterExplicitT {
typedef Xmm XMM0;
- // These two are unfortunately reported by the sanitizer. We know what we do,
- // however, the sanitizer doesn't. I have tried to use reinterpret_cast instead,
- // but that would generate bad code when compiled by MSC.
+ // These two are unfortunately reported by the sanitizer. We know what we do, however, the sanitizer doesn't.
+ // I have tried to use reinterpret_cast instead, but that would generate bad code when compiled by MSC.
ASMJIT_ATTRIBUTE_NO_SANITIZE_UNDEF inline This* _emitter() noexcept { return static_cast<This*>(this); }
ASMJIT_ATTRIBUTE_NO_SANITIZE_UNDEF inline const This* _emitter() const noexcept { return static_cast<const This*>(this); }
@@ -222,16 +148,16 @@ struct EmitterExplicitT {
//! \{
//! Returns either GPD or GPQ register of the given `id` depending on the emitter's architecture.
- inline Gp gpz(uint32_t id) const noexcept { return Gp(_emitter()->_gpRegInfo.signature(), id); }
+ inline Gp gpz(uint32_t id) const noexcept { return Gp(_emitter()->_gpSignature, id); }
- inline Gp zax() const noexcept { return Gp(_emitter()->_gpRegInfo.signature(), Gp::kIdAx); }
- inline Gp zcx() const noexcept { return Gp(_emitter()->_gpRegInfo.signature(), Gp::kIdCx); }
- inline Gp zdx() const noexcept { return Gp(_emitter()->_gpRegInfo.signature(), Gp::kIdDx); }
- inline Gp zbx() const noexcept { return Gp(_emitter()->_gpRegInfo.signature(), Gp::kIdBx); }
- inline Gp zsp() const noexcept { return Gp(_emitter()->_gpRegInfo.signature(), Gp::kIdSp); }
- inline Gp zbp() const noexcept { return Gp(_emitter()->_gpRegInfo.signature(), Gp::kIdBp); }
- inline Gp zsi() const noexcept { return Gp(_emitter()->_gpRegInfo.signature(), Gp::kIdSi); }
- inline Gp zdi() const noexcept { return Gp(_emitter()->_gpRegInfo.signature(), Gp::kIdDi); }
+ inline Gp zax() const noexcept { return Gp(_emitter()->_gpSignature, Gp::kIdAx); }
+ inline Gp zcx() const noexcept { return Gp(_emitter()->_gpSignature, Gp::kIdCx); }
+ inline Gp zdx() const noexcept { return Gp(_emitter()->_gpSignature, Gp::kIdDx); }
+ inline Gp zbx() const noexcept { return Gp(_emitter()->_gpSignature, Gp::kIdBx); }
+ inline Gp zsp() const noexcept { return Gp(_emitter()->_gpSignature, Gp::kIdSp); }
+ inline Gp zbp() const noexcept { return Gp(_emitter()->_gpSignature, Gp::kIdBp); }
+ inline Gp zsi() const noexcept { return Gp(_emitter()->_gpSignature, Gp::kIdSi); }
+ inline Gp zdi() const noexcept { return Gp(_emitter()->_gpSignature, Gp::kIdDi); }
//! \}
@@ -240,7 +166,10 @@ struct EmitterExplicitT {
//! Creates a target dependent pointer of which base register's id is `baseId`.
inline Mem ptr_base(uint32_t baseId, int32_t off = 0, uint32_t size = 0) const noexcept {
- return Mem(Mem::Decomposed { _emitter()->_gpRegInfo.type(), baseId, 0, 0, off, size, 0 });
+ return Mem(OperandSignature::fromOpType(OperandType::kMem) |
+ OperandSignature::fromMemBaseType(_emitter()->_gpSignature.regType()) |
+ OperandSignature::fromSize(size),
+ baseId, 0, off);
}
inline Mem ptr_zax(int32_t off = 0, uint32_t size = 0) const noexcept { return ptr_base(Gp::kIdAx, off, size); }
@@ -300,12 +229,12 @@ struct EmitterExplicitT {
//! \overload
inline Mem intptr_ptr_abs(uint64_t base) const noexcept {
uint32_t nativeGpSize = _emitter()->registerSize();
- return Mem(base, nativeGpSize, BaseMem::kSignatureMemAbs);
+ return Mem(base, nativeGpSize, OperandSignature::fromValue<Mem::kSignatureMemAddrTypeMask>(Mem::AddrType::kAbs));
}
//! \overload
inline Mem intptr_ptr_abs(uint64_t base, const Gp& index, uint32_t shift = 0) const noexcept {
uint32_t nativeGpSize = _emitter()->registerSize();
- return Mem(base, index, shift, nativeGpSize, BaseMem::kSignatureMemAbs);
+ return Mem(base, index, shift, nativeGpSize, OperandSignature::fromValue<Mem::kSignatureMemAddrTypeMask>(Mem::AddrType::kRel));
}
//! \}
@@ -322,47 +251,6 @@ struct EmitterExplicitT {
//! Embeds 64-bit integer data.
inline Error dq(uint64_t x, size_t repeatCount = 1) { return _emitter()->embedUInt64(x, repeatCount); }
-#ifndef ASMJIT_NO_DEPRECATED
- ASMJIT_DEPRECATED("Use embedInt8() instead of dint8()")
- inline Error dint8(int8_t x) { return _emitter()->embed(&x, sizeof(int8_t)); }
-
- ASMJIT_DEPRECATED("Use embedUInt8() instead of duint8()")
- inline Error duint8(uint8_t x) { return _emitter()->embed(&x, sizeof(uint8_t)); }
-
- ASMJIT_DEPRECATED("Use embedInt16() instead of dint16()")
- inline Error dint16(int16_t x) { return _emitter()->embed(&x, sizeof(int16_t)); }
-
- ASMJIT_DEPRECATED("Use embedUInt16() instead of duint16()")
- inline Error duint16(uint16_t x) { return _emitter()->embed(&x, sizeof(uint16_t)); }
-
- ASMJIT_DEPRECATED("Use embedInt32() instead of dint32()")
- inline Error dint32(int32_t x) { return _emitter()->embed(&x, sizeof(int32_t)); }
-
- ASMJIT_DEPRECATED("Use embedUInt32() instead of duint32()")
- inline Error duint32(uint32_t x) { return _emitter()->embed(&x, sizeof(uint32_t)); }
-
- ASMJIT_DEPRECATED("Use embedInt64() instead of dint64()")
- inline Error dint64(int64_t x) { return _emitter()->embed(&x, sizeof(int64_t)); }
-
- ASMJIT_DEPRECATED("Use embedUInt64() instead of duint64()")
- inline Error duint64(uint64_t x) { return _emitter()->embed(&x, sizeof(uint64_t)); }
-
- ASMJIT_DEPRECATED("Use embedFloat() instead of float()")
- inline Error dfloat(float x) { return _emitter()->embed(&x, sizeof(float)); }
-
- ASMJIT_DEPRECATED("Use embedDouble() instead of ddouble()")
- inline Error ddouble(double x) { return _emitter()->embed(&x, sizeof(double)); }
-
- ASMJIT_DEPRECATED("Use embed[U]IntN() or embed[Float|Double]() instead of dmm()")
- inline Error dmm(const Data64& x) { return _emitter()->embed(&x, 8); }
-
- ASMJIT_DEPRECATED("Use embed[U]IntN() or embed[Float|Double]() instead of dxmm()")
- inline Error dxmm(const Data128& x) { return _emitter()->embed(&x, 16); }
-
- ASMJIT_DEPRECATED("Use embed[U]IntN() or embed[Float|Double]() instead of dymm()")
- inline Error dymm(const Data256& x) { return _emitter()->embed(&x, 32); }
-#endif // !ASMJIT_NO_DEPRECATED
-
//! Adds data in a given structure instance to the CodeBuffer.
template<typename T>
inline Error dstruct(const T& x) { return _emitter()->embed(&x, uint32_t(sizeof(T))); }
@@ -371,7 +259,7 @@ struct EmitterExplicitT {
protected:
//! \cond
- inline This& _addInstOptions(uint32_t options) noexcept {
+ inline This& _addInstOptions(InstOptions options) noexcept {
_emitter()->addInstOptions(options);
return *_emitter();
}
@@ -382,19 +270,20 @@ public:
//! \{
//! Force short form of jmp/jcc instruction.
- inline This& short_() noexcept { return _addInstOptions(Inst::kOptionShortForm); }
+ inline This& short_() noexcept { return _addInstOptions(InstOptions::kShortForm); }
//! Force long form of jmp/jcc instruction.
- inline This& long_() noexcept { return _addInstOptions(Inst::kOptionLongForm); }
+ inline This& long_() noexcept { return _addInstOptions(InstOptions::kLongForm); }
//! \}
//! \name Encoding Options
//! \{
- //! Prefer MOD_MR encoding over MOD_RM (the default) when encoding instruction
- //! that allows both. This option is only applicable to instructions where both
- //! operands are registers.
- inline This& mod_mr() noexcept { return _addInstOptions(Inst::kOptionModMR); }
+ //! Prefer MOD/RM encoding when both MOD/RM and MOD/MR forms are applicable.
+ inline This& mod_rm() noexcept { return _addInstOptions(InstOptions::kX86_ModRM); }
+
+ //! Prefer MOD/MR encoding when both MOD/RM and MOD/MR forms are applicable.
+ inline This& mod_mr() noexcept { return _addInstOptions(InstOptions::kX86_ModMR); }
//! \}
@@ -402,28 +291,28 @@ public:
//! \{
//! Condition is likely to be taken (has only benefit on P4).
- inline This& taken() noexcept { return _addInstOptions(Inst::kOptionTaken); }
+ inline This& taken() noexcept { return _addInstOptions(InstOptions::kTaken); }
//! Condition is unlikely to be taken (has only benefit on P4).
- inline This& notTaken() noexcept { return _addInstOptions(Inst::kOptionNotTaken); }
+ inline This& notTaken() noexcept { return _addInstOptions(InstOptions::kNotTaken); }
//! Use LOCK prefix.
- inline This& lock() noexcept { return _addInstOptions(Inst::kOptionLock); }
+ inline This& lock() noexcept { return _addInstOptions(InstOptions::kX86_Lock); }
//! Use XACQUIRE prefix.
- inline This& xacquire() noexcept { return _addInstOptions(Inst::kOptionXAcquire); }
+ inline This& xacquire() noexcept { return _addInstOptions(InstOptions::kX86_XAcquire); }
//! Use XRELEASE prefix.
- inline This& xrelease() noexcept { return _addInstOptions(Inst::kOptionXRelease); }
+ inline This& xrelease() noexcept { return _addInstOptions(InstOptions::kX86_XRelease); }
//! Use BND/REPNE prefix.
//!
//! \note This is the same as using `repne()` or `repnz()` prefix.
- inline This& bnd() noexcept { return _addInstOptions(Inst::kOptionRepne); }
+ inline This& bnd() noexcept { return _addInstOptions(InstOptions::kX86_Repne); }
//! Use REP/REPZ prefix.
//!
//! \note This is the same as using `repe()` or `repz()` prefix.
inline This& rep(const Gp& zcx) noexcept {
_emitter()->_extraReg.init(zcx);
- return _addInstOptions(Inst::kOptionRep);
+ return _addInstOptions(InstOptions::kX86_Rep);
}
//! Use REP/REPE prefix.
@@ -441,7 +330,7 @@ public:
//! \note This is the same as using `bnd()` or `repnz()` prefix.
inline This& repne(const Gp& zcx) noexcept {
_emitter()->_extraReg.init(zcx);
- return _addInstOptions(Inst::kOptionRepne);
+ return _addInstOptions(InstOptions::kX86_Repne);
}
//! Use REPNE prefix.
@@ -456,28 +345,30 @@ public:
//! Force REX prefix to be emitted even when it's not needed (X86_64).
//!
- //! \note Don't use when using high 8-bit registers as REX prefix makes them
- //! inaccessible and `x86::Assembler` would fail to encode such instruction.
- inline This& rex() noexcept { return _addInstOptions(Inst::kOptionRex); }
+ //! \note Don't use when using high 8-bit registers as REX prefix makes them inaccessible and `x86::Assembler`
+ //! would fail to encode such instruction.
+ inline This& rex() noexcept { return _addInstOptions(InstOptions::kX86_Rex); }
//! Force REX.B prefix (X64) [It exists for special purposes only].
- inline This& rex_b() noexcept { return _addInstOptions(Inst::kOptionOpCodeB); }
+ inline This& rex_b() noexcept { return _addInstOptions(InstOptions::kX86_OpCodeB); }
//! Force REX.X prefix (X64) [It exists for special purposes only].
- inline This& rex_x() noexcept { return _addInstOptions(Inst::kOptionOpCodeX); }
+ inline This& rex_x() noexcept { return _addInstOptions(InstOptions::kX86_OpCodeX); }
//! Force REX.R prefix (X64) [It exists for special purposes only].
- inline This& rex_r() noexcept { return _addInstOptions(Inst::kOptionOpCodeR); }
+ inline This& rex_r() noexcept { return _addInstOptions(InstOptions::kX86_OpCodeR); }
//! Force REX.W prefix (X64) [It exists for special purposes only].
- inline This& rex_w() noexcept { return _addInstOptions(Inst::kOptionOpCodeW); }
+ inline This& rex_w() noexcept { return _addInstOptions(InstOptions::kX86_OpCodeW); }
//! \}
//! \name VEX and EVEX Options
//! \{
+ //! Use VEX prefix instead of EVEX prefix (useful to select AVX_VNNI instruction instead of AVX512_VNNI).
+ inline This& vex() noexcept { return _addInstOptions(InstOptions::kX86_Vex); }
//! Force 3-byte VEX prefix (AVX+).
- inline This& vex3() noexcept { return _addInstOptions(Inst::kOptionVex3); }
+ inline This& vex3() noexcept { return _addInstOptions(InstOptions::kX86_Vex3); }
//! Force 4-byte EVEX prefix (AVX512+).
- inline This& evex() noexcept { return _addInstOptions(Inst::kOptionEvex); }
+ inline This& evex() noexcept { return _addInstOptions(InstOptions::kX86_Evex); }
//! \}
@@ -491,41 +382,39 @@ public:
}
//! Use zeroing instead of merging (AVX512+).
- inline This& z() noexcept { return _addInstOptions(Inst::kOptionZMask); }
+ inline This& z() noexcept { return _addInstOptions(InstOptions::kX86_ZMask); }
//! Suppress all exceptions (AVX512+).
- inline This& sae() noexcept { return _addInstOptions(Inst::kOptionSAE); }
+ inline This& sae() noexcept { return _addInstOptions(InstOptions::kX86_SAE); }
//! Static rounding mode {rn} (round-to-nearest even) and {sae} (AVX512+).
- inline This& rn_sae() noexcept { return _addInstOptions(Inst::kOptionER | Inst::kOptionRN_SAE); }
+ inline This& rn_sae() noexcept { return _addInstOptions(InstOptions::kX86_ER | InstOptions::kX86_RN_SAE); }
//! Static rounding mode {rd} (round-down, toward -inf) and {sae} (AVX512+).
- inline This& rd_sae() noexcept { return _addInstOptions(Inst::kOptionER | Inst::kOptionRD_SAE); }
+ inline This& rd_sae() noexcept { return _addInstOptions(InstOptions::kX86_ER | InstOptions::kX86_RD_SAE); }
//! Static rounding mode {ru} (round-up, toward +inf) and {sae} (AVX512+).
- inline This& ru_sae() noexcept { return _addInstOptions(Inst::kOptionER | Inst::kOptionRU_SAE); }
+ inline This& ru_sae() noexcept { return _addInstOptions(InstOptions::kX86_ER | InstOptions::kX86_RU_SAE); }
//! Static rounding mode {rz} (round-toward-zero, truncate) and {sae} (AVX512+).
- inline This& rz_sae() noexcept { return _addInstOptions(Inst::kOptionER | Inst::kOptionRZ_SAE); }
+ inline This& rz_sae() noexcept { return _addInstOptions(InstOptions::kX86_ER | InstOptions::kX86_RZ_SAE); }
//! \}
- //! \name Base Instructions & GP Extensions
+ //! \name Core Instructions
//! \{
ASMJIT_INST_2x(adc, Adc, Gp, Gp) // ANY
ASMJIT_INST_2x(adc, Adc, Gp, Mem) // ANY
- ASMJIT_INST_2i(adc, Adc, Gp, Imm) // ANY
+ ASMJIT_INST_2x(adc, Adc, Gp, Imm) // ANY
ASMJIT_INST_2x(adc, Adc, Mem, Gp) // ANY
- ASMJIT_INST_2i(adc, Adc, Mem, Imm) // ANY
+ ASMJIT_INST_2x(adc, Adc, Mem, Imm) // ANY
ASMJIT_INST_2x(add, Add, Gp, Gp) // ANY
ASMJIT_INST_2x(add, Add, Gp, Mem) // ANY
- ASMJIT_INST_2i(add, Add, Gp, Imm) // ANY
+ ASMJIT_INST_2x(add, Add, Gp, Imm) // ANY
ASMJIT_INST_2x(add, Add, Mem, Gp) // ANY
- ASMJIT_INST_2i(add, Add, Mem, Imm) // ANY
+ ASMJIT_INST_2x(add, Add, Mem, Imm) // ANY
ASMJIT_INST_2x(and_, And, Gp, Gp) // ANY
ASMJIT_INST_2x(and_, And, Gp, Mem) // ANY
- ASMJIT_INST_2i(and_, And, Gp, Imm) // ANY
+ ASMJIT_INST_2x(and_, And, Gp, Imm) // ANY
ASMJIT_INST_2x(and_, And, Mem, Gp) // ANY
- ASMJIT_INST_2i(and_, And, Mem, Imm) // ANY
- ASMJIT_INST_2x(arpl, Arpl, Gp, Gp) // X86
- ASMJIT_INST_2x(arpl, Arpl, Mem, Gp) // X86
+ ASMJIT_INST_2x(and_, And, Mem, Imm) // ANY
ASMJIT_INST_2x(bound, Bound, Gp, Mem) // X86
ASMJIT_INST_2x(bsf, Bsf, Gp, Gp) // ANY
ASMJIT_INST_2x(bsf, Bsf, Gp, Mem) // ANY
@@ -533,131 +422,87 @@ public:
ASMJIT_INST_2x(bsr, Bsr, Gp, Mem) // ANY
ASMJIT_INST_1x(bswap, Bswap, Gp) // ANY
ASMJIT_INST_2x(bt, Bt, Gp, Gp) // ANY
- ASMJIT_INST_2i(bt, Bt, Gp, Imm) // ANY
+ ASMJIT_INST_2x(bt, Bt, Gp, Imm) // ANY
ASMJIT_INST_2x(bt, Bt, Mem, Gp) // ANY
- ASMJIT_INST_2i(bt, Bt, Mem, Imm) // ANY
+ ASMJIT_INST_2x(bt, Bt, Mem, Imm) // ANY
ASMJIT_INST_2x(btc, Btc, Gp, Gp) // ANY
- ASMJIT_INST_2i(btc, Btc, Gp, Imm) // ANY
+ ASMJIT_INST_2x(btc, Btc, Gp, Imm) // ANY
ASMJIT_INST_2x(btc, Btc, Mem, Gp) // ANY
- ASMJIT_INST_2i(btc, Btc, Mem, Imm) // ANY
+ ASMJIT_INST_2x(btc, Btc, Mem, Imm) // ANY
ASMJIT_INST_2x(btr, Btr, Gp, Gp) // ANY
- ASMJIT_INST_2i(btr, Btr, Gp, Imm) // ANY
+ ASMJIT_INST_2x(btr, Btr, Gp, Imm) // ANY
ASMJIT_INST_2x(btr, Btr, Mem, Gp) // ANY
- ASMJIT_INST_2i(btr, Btr, Mem, Imm) // ANY
+ ASMJIT_INST_2x(btr, Btr, Mem, Imm) // ANY
ASMJIT_INST_2x(bts, Bts, Gp, Gp) // ANY
- ASMJIT_INST_2i(bts, Bts, Gp, Imm) // ANY
+ ASMJIT_INST_2x(bts, Bts, Gp, Imm) // ANY
ASMJIT_INST_2x(bts, Bts, Mem, Gp) // ANY
- ASMJIT_INST_2i(bts, Bts, Mem, Imm) // ANY
- ASMJIT_INST_1x(cbw, Cbw, AX) // ANY [EXPLICIT] AX <- Sign Extend AL
- ASMJIT_INST_2x(cdq, Cdq, EDX, EAX) // ANY [EXPLICIT] EDX:EAX <- Sign Extend EAX
- ASMJIT_INST_1x(cdqe, Cdqe, EAX) // X64 [EXPLICIT] RAX <- Sign Extend EAX
- ASMJIT_INST_2x(cqo, Cqo, RDX, RAX) // X64 [EXPLICIT] RDX:RAX <- Sign Extend RAX
- ASMJIT_INST_2x(cwd, Cwd, DX, AX) // ANY [EXPLICIT] DX:AX <- Sign Extend AX
- ASMJIT_INST_1x(cwde, Cwde, EAX) // ANY [EXPLICIT] EAX <- Sign Extend AX
+ ASMJIT_INST_2x(bts, Bts, Mem, Imm) // ANY
+ ASMJIT_INST_1x(cbw, Cbw, Gp_AX) // ANY [EXPLICIT] AX <- Sign Extend AL
+ ASMJIT_INST_2x(cdq, Cdq, Gp_EDX, Gp_EAX) // ANY [EXPLICIT] EDX:EAX <- Sign Extend EAX
+ ASMJIT_INST_1x(cdqe, Cdqe, Gp_EAX) // X64 [EXPLICIT] RAX <- Sign Extend EAX
+ ASMJIT_INST_2x(cqo, Cqo, Gp_RDX, Gp_RAX) // X64 [EXPLICIT] RDX:RAX <- Sign Extend RAX
+ ASMJIT_INST_2x(cwd, Cwd, Gp_DX, Gp_AX) // ANY [EXPLICIT] DX:AX <- Sign Extend AX
+ ASMJIT_INST_1x(cwde, Cwde, Gp_EAX) // ANY [EXPLICIT] EAX <- Sign Extend AX
ASMJIT_INST_1x(call, Call, Gp) // ANY
ASMJIT_INST_1x(call, Call, Mem) // ANY
ASMJIT_INST_1x(call, Call, Label) // ANY
- ASMJIT_INST_1i(call, Call, Imm) // ANY
- ASMJIT_INST_0x(clc, Clc) // ANY
- ASMJIT_INST_0x(cld, Cld) // ANY
- ASMJIT_INST_0x(cli, Cli) // ANY
- ASMJIT_INST_0x(clts, Clts) // ANY
- ASMJIT_INST_0x(cmc, Cmc) // ANY
- ASMJIT_INST_2c(cmov, Cmov, Condition::toCmovcc, Gp, Gp) // CMOV
- ASMJIT_INST_2c(cmov, Cmov, Condition::toCmovcc, Gp, Mem) // CMOV
+ ASMJIT_INST_1x(call, Call, Imm) // ANY
+ ASMJIT_INST_2c(cmov, Cmov, Inst::cmovccFromCond, Gp, Gp) // CMOV
+ ASMJIT_INST_2c(cmov, Cmov, Inst::cmovccFromCond, Gp, Mem) // CMOV
ASMJIT_INST_2x(cmp, Cmp, Gp, Gp) // ANY
ASMJIT_INST_2x(cmp, Cmp, Gp, Mem) // ANY
- ASMJIT_INST_2i(cmp, Cmp, Gp, Imm) // ANY
+ ASMJIT_INST_2x(cmp, Cmp, Gp, Imm) // ANY
ASMJIT_INST_2x(cmp, Cmp, Mem, Gp) // ANY
- ASMJIT_INST_2i(cmp, Cmp, Mem, Imm) // ANY
- ASMJIT_INST_2x(cmps, Cmps, DS_ZSI, ES_ZDI) // ANY [EXPLICIT]
- ASMJIT_INST_3x(cmpxchg, Cmpxchg, Gp, Gp, ZAX) // I486 [EXPLICIT]
- ASMJIT_INST_3x(cmpxchg, Cmpxchg, Mem, Gp, ZAX) // I486 [EXPLICIT]
- ASMJIT_INST_5x(cmpxchg16b, Cmpxchg16b, Mem, RDX, RAX, RCX, RBX); // CMPXCHG16B[EXPLICIT] m == EDX:EAX ? m <- ECX:EBX
- ASMJIT_INST_5x(cmpxchg8b, Cmpxchg8b, Mem, EDX, EAX, ECX, EBX); // CMPXCHG8B [EXPLICIT] m == RDX:RAX ? m <- RCX:RBX
- ASMJIT_INST_4x(cpuid, Cpuid, EAX, EBX, ECX, EDX) // I486 [EXPLICIT] EAX:EBX:ECX:EDX <- CPUID[EAX:ECX]
- ASMJIT_INST_1x(daa, Daa, Gp) // X86 [EXPLICIT]
- ASMJIT_INST_1x(das, Das, Gp) // X86 [EXPLICIT]
+ ASMJIT_INST_2x(cmp, Cmp, Mem, Imm) // ANY
+ ASMJIT_INST_2x(cmps, Cmps, DS_ZSI, ES_ZDI) // ANY [EXPLICIT]
+ ASMJIT_INST_3x(cmpxchg, Cmpxchg, Gp, Gp, Gp_ZAX) // I486 [EXPLICIT]
+ ASMJIT_INST_3x(cmpxchg, Cmpxchg, Mem, Gp, Gp_ZAX) // I486 [EXPLICIT]
+ ASMJIT_INST_5x(cmpxchg16b, Cmpxchg16b, Mem, Gp_RDX, Gp_RAX, Gp_RCX, Gp_RBX); // CMPXCHG16B [EXPLICIT] m == EDX:EAX ? m <- ECX:EBX
+ ASMJIT_INST_5x(cmpxchg8b, Cmpxchg8b, Mem, Gp_EDX, Gp_EAX, Gp_ECX, Gp_EBX); // CMPXCHG8B [EXPLICIT] m == RDX:RAX ? m <- RCX:RBX
ASMJIT_INST_1x(dec, Dec, Gp) // ANY
ASMJIT_INST_1x(dec, Dec, Mem) // ANY
- ASMJIT_INST_2x(div, Div, Gp, Gp) // ANY [EXPLICIT] AH[Rem]: AL[Quot] <- AX / r8
- ASMJIT_INST_2x(div, Div, Gp, Mem) // ANY [EXPLICIT] AH[Rem]: AL[Quot] <- AX / m8
- ASMJIT_INST_3x(div, Div, Gp, Gp, Gp) // ANY [EXPLICIT] xDX[Rem]:xAX[Quot] <- xDX:xAX / r16|r32|r64
- ASMJIT_INST_3x(div, Div, Gp, Gp, Mem) // ANY [EXPLICIT] xDX[Rem]:xAX[Quot] <- xDX:xAX / m16|m32|m64
- ASMJIT_INST_0x(emms, Emms) // MMX
- ASMJIT_INST_2x(enter, Enter, Imm, Imm) // ANY
- ASMJIT_INST_0x(hlt, Hlt) // ANY
- ASMJIT_INST_2x(idiv, Idiv, Gp, Gp) // ANY [EXPLICIT] AH[Rem]: AL[Quot] <- AX / r8
- ASMJIT_INST_2x(idiv, Idiv, Gp, Mem) // ANY [EXPLICIT] AH[Rem]: AL[Quot] <- AX / m8
- ASMJIT_INST_3x(idiv, Idiv, Gp, Gp, Gp) // ANY [EXPLICIT] xDX[Rem]:xAX[Quot] <- xDX:xAX / r16|r32|r64
- ASMJIT_INST_3x(idiv, Idiv, Gp, Gp, Mem) // ANY [EXPLICIT] xDX[Rem]:xAX[Quot] <- xDX:xAX / m16|m32|m64
- ASMJIT_INST_2x(imul, Imul, Gp, Gp) // ANY [EXPLICIT] AX <- AL * r8 | ra <- ra * rb
- ASMJIT_INST_2x(imul, Imul, Gp, Mem) // ANY [EXPLICIT] AX <- AL * m8 | ra <- ra * m16|m32|m64
- ASMJIT_INST_2i(imul, Imul, Gp, Imm) // ANY
- ASMJIT_INST_3i(imul, Imul, Gp, Gp, Imm) // ANY
- ASMJIT_INST_3i(imul, Imul, Gp, Mem, Imm) // ANY
- ASMJIT_INST_3x(imul, Imul, Gp, Gp, Gp) // ANY [EXPLICIT] xDX:xAX <- xAX * r16|r32|r64
- ASMJIT_INST_3x(imul, Imul, Gp, Gp, Mem) // ANY [EXPLICIT] xDX:xAX <- xAX * m16|m32|m64
- ASMJIT_INST_2i(in, In, ZAX, Imm) // ANY
- ASMJIT_INST_2x(in, In, ZAX, DX) // ANY
+ ASMJIT_INST_2x(div, Div, Gp, Gp) // ANY [EXPLICIT] AH[Rem]: AL[Quot] <- AX / r8
+ ASMJIT_INST_2x(div, Div, Gp, Mem) // ANY [EXPLICIT] AH[Rem]: AL[Quot] <- AX / m8
+ ASMJIT_INST_3x(div, Div, Gp, Gp, Gp) // ANY [EXPLICIT] xDX[Rem]:xAX[Quot] <- xDX:xAX / r16|r32|r64
+ ASMJIT_INST_3x(div, Div, Gp, Gp, Mem) // ANY [EXPLICIT] xDX[Rem]:xAX[Quot] <- xDX:xAX / m16|m32|m64
+ ASMJIT_INST_2x(idiv, Idiv, Gp, Gp) // ANY [EXPLICIT] AH[Rem]: AL[Quot] <- AX / r8
+ ASMJIT_INST_2x(idiv, Idiv, Gp, Mem) // ANY [EXPLICIT] AH[Rem]: AL[Quot] <- AX / m8
+ ASMJIT_INST_3x(idiv, Idiv, Gp, Gp, Gp) // ANY [EXPLICIT] xDX[Rem]:xAX[Quot] <- xDX:xAX / r16|r32|r64
+ ASMJIT_INST_3x(idiv, Idiv, Gp, Gp, Mem) // ANY [EXPLICIT] xDX[Rem]:xAX[Quot] <- xDX:xAX / m16|m32|m64
+ ASMJIT_INST_2x(imul, Imul, Gp, Gp) // ANY [EXPLICIT] AX <- AL * r8 | ra <- ra * rb
+ ASMJIT_INST_2x(imul, Imul, Gp, Mem) // ANY [EXPLICIT] AX <- AL * m8 | ra <- ra * m16|m32|m64
+ ASMJIT_INST_2x(imul, Imul, Gp, Imm) // ANY
+ ASMJIT_INST_3x(imul, Imul, Gp, Gp, Imm) // ANY
+ ASMJIT_INST_3x(imul, Imul, Gp, Mem, Imm) // ANY
+ ASMJIT_INST_3x(imul, Imul, Gp, Gp, Gp) // ANY [EXPLICIT] xDX:xAX <- xAX * r16|r32|r64
+ ASMJIT_INST_3x(imul, Imul, Gp, Gp, Mem) // ANY [EXPLICIT] xDX:xAX <- xAX * m16|m32|m64
ASMJIT_INST_1x(inc, Inc, Gp) // ANY
ASMJIT_INST_1x(inc, Inc, Mem) // ANY
- ASMJIT_INST_2x(ins, Ins, ES_ZDI, DX) // ANY
- ASMJIT_INST_1i(int_, Int, Imm) // ANY
- ASMJIT_INST_0x(int3, Int3) // ANY
- ASMJIT_INST_0x(into, Into) // ANY
- ASMJIT_INST_0x(invd, Invd) // ANY
- ASMJIT_INST_1x(invlpg, Invlpg, Mem) // ANY
- ASMJIT_INST_2x(invpcid, Invpcid, Gp, Mem) // ANY
- ASMJIT_INST_1c(j, J, Condition::toJcc, Label) // ANY
- ASMJIT_INST_1c(j, J, Condition::toJcc, Imm) // ANY
- ASMJIT_INST_1c(j, J, Condition::toJcc, uint64_t) // ANY
- ASMJIT_INST_2x(jecxz, Jecxz, Gp, Label) // ANY [EXPLICIT] Short jump if CX/ECX/RCX is zero.
- ASMJIT_INST_2x(jecxz, Jecxz, Gp, Imm) // ANY [EXPLICIT] Short jump if CX/ECX/RCX is zero.
- ASMJIT_INST_2x(jecxz, Jecxz, Gp, uint64_t) // ANY [EXPLICIT] Short jump if CX/ECX/RCX is zero.
+ ASMJIT_INST_1c(j, J, Inst::jccFromCond, Label) // ANY
+ ASMJIT_INST_1c(j, J, Inst::jccFromCond, Imm) // ANY
+ ASMJIT_INST_2x(jecxz, Jecxz, Gp, Label) // ANY [EXPLICIT] Short jump if CX/ECX/RCX is zero.
+ ASMJIT_INST_2x(jecxz, Jecxz, Gp, Imm) // ANY [EXPLICIT] Short jump if CX/ECX/RCX is zero.
ASMJIT_INST_1x(jmp, Jmp, Gp) // ANY
ASMJIT_INST_1x(jmp, Jmp, Mem) // ANY
ASMJIT_INST_1x(jmp, Jmp, Label) // ANY
ASMJIT_INST_1x(jmp, Jmp, Imm) // ANY
- ASMJIT_INST_1x(jmp, Jmp, uint64_t) // ANY
- ASMJIT_INST_1x(lahf, Lahf, AH) // LAHFSAHF [EXPLICIT] AH <- EFL
- ASMJIT_INST_2x(lar, Lar, Gp, Gp) // ANY
- ASMJIT_INST_2x(lar, Lar, Gp, Mem) // ANY
- ASMJIT_INST_1x(ldmxcsr, Ldmxcsr, Mem) // SSE
- ASMJIT_INST_2x(lds, Lds, Gp, Mem) // X86
+ ASMJIT_INST_2x(lcall, Lcall, Imm, Imm) // ANY
+ ASMJIT_INST_1x(lcall, Lcall, Mem) // ANY
ASMJIT_INST_2x(lea, Lea, Gp, Mem) // ANY
- ASMJIT_INST_0x(leave, Leave) // ANY
- ASMJIT_INST_2x(les, Les, Gp, Mem) // X86
- ASMJIT_INST_0x(lfence, Lfence) // SSE2
- ASMJIT_INST_2x(lfs, Lfs, Gp, Mem) // ANY
- ASMJIT_INST_1x(lgdt, Lgdt, Mem) // ANY
- ASMJIT_INST_2x(lgs, Lgs, Gp, Mem) // ANY
- ASMJIT_INST_1x(lidt, Lidt, Mem) // ANY
- ASMJIT_INST_1x(lldt, Lldt, Gp) // ANY
- ASMJIT_INST_1x(lldt, Lldt, Mem) // ANY
- ASMJIT_INST_1x(lmsw, Lmsw, Gp) // ANY
- ASMJIT_INST_1x(lmsw, Lmsw, Mem) // ANY
- ASMJIT_INST_2x(lods, Lods, ZAX, DS_ZSI) // ANY [EXPLICIT]
- ASMJIT_INST_2x(loop, Loop, ZCX, Label) // ANY [EXPLICIT] Decrement xCX; short jump if xCX != 0.
- ASMJIT_INST_2x(loop, Loop, ZCX, Imm) // ANY [EXPLICIT] Decrement xCX; short jump if xCX != 0.
- ASMJIT_INST_2x(loop, Loop, ZCX, uint64_t) // ANY [EXPLICIT] Decrement xCX; short jump if xCX != 0.
- ASMJIT_INST_2x(loope, Loope, ZCX, Label) // ANY [EXPLICIT] Decrement xCX; short jump if xCX != 0 && ZF == 1.
- ASMJIT_INST_2x(loope, Loope, ZCX, Imm) // ANY [EXPLICIT] Decrement xCX; short jump if xCX != 0 && ZF == 1.
- ASMJIT_INST_2x(loope, Loope, ZCX, uint64_t) // ANY [EXPLICIT] Decrement xCX; short jump if xCX != 0 && ZF == 1.
- ASMJIT_INST_2x(loopne, Loopne, ZCX, Label) // ANY [EXPLICIT] Decrement xCX; short jump if xCX != 0 && ZF == 0.
- ASMJIT_INST_2x(loopne, Loopne, ZCX, Imm) // ANY [EXPLICIT] Decrement xCX; short jump if xCX != 0 && ZF == 0.
- ASMJIT_INST_2x(loopne, Loopne, ZCX, uint64_t) // ANY [EXPLICIT] Decrement xCX; short jump if xCX != 0 && ZF == 0.
- ASMJIT_INST_2x(lsl, Lsl, Gp, Gp) // ANY
- ASMJIT_INST_2x(lsl, Lsl, Gp, Mem) // ANY
- ASMJIT_INST_2x(lss, Lss, Gp, Mem) // ANY
- ASMJIT_INST_1x(ltr, Ltr, Gp) // ANY
- ASMJIT_INST_1x(ltr, Ltr, Mem) // ANY
- ASMJIT_INST_0x(mfence, Mfence) // SSE2
+ ASMJIT_INST_2x(ljmp, Ljmp, Imm, Imm) // ANY
+ ASMJIT_INST_1x(ljmp, Ljmp, Mem) // ANY
+ ASMJIT_INST_2x(lods, Lods, Gp_ZAX, DS_ZSI) // ANY [EXPLICIT]
+ ASMJIT_INST_2x(loop, Loop, Gp_ZCX, Label) // ANY [EXPLICIT] Decrement xCX; short jump if xCX != 0.
+ ASMJIT_INST_2x(loop, Loop, Gp_ZCX, Imm) // ANY [EXPLICIT] Decrement xCX; short jump if xCX != 0.
+ ASMJIT_INST_2x(loope, Loope, Gp_ZCX, Label) // ANY [EXPLICIT] Decrement xCX; short jump if xCX != 0 && ZF == 1.
+ ASMJIT_INST_2x(loope, Loope, Gp_ZCX, Imm) // ANY [EXPLICIT] Decrement xCX; short jump if xCX != 0 && ZF == 1.
+ ASMJIT_INST_2x(loopne, Loopne, Gp_ZCX, Label) // ANY [EXPLICIT] Decrement xCX; short jump if xCX != 0 && ZF == 0.
+ ASMJIT_INST_2x(loopne, Loopne, Gp_ZCX, Imm) // ANY [EXPLICIT] Decrement xCX; short jump if xCX != 0 && ZF == 0.
ASMJIT_INST_2x(mov, Mov, Gp, Gp) // ANY
ASMJIT_INST_2x(mov, Mov, Gp, Mem) // ANY
- ASMJIT_INST_2i(mov, Mov, Gp, Imm) // ANY
+ ASMJIT_INST_2x(mov, Mov, Gp, Imm) // ANY
ASMJIT_INST_2x(mov, Mov, Mem, Gp) // ANY
- ASMJIT_INST_2i(mov, Mov, Mem, Imm) // ANY
+ ASMJIT_INST_2x(mov, Mov, Mem, Imm) // ANY
ASMJIT_INST_2x(mov, Mov, Gp, CReg) // ANY
ASMJIT_INST_2x(mov, Mov, CReg, Gp) // ANY
ASMJIT_INST_2x(mov, Mov, Gp, DReg) // ANY
@@ -666,34 +511,35 @@ public:
ASMJIT_INST_2x(mov, Mov, Mem, SReg) // ANY
ASMJIT_INST_2x(mov, Mov, SReg, Gp) // ANY
ASMJIT_INST_2x(mov, Mov, SReg, Mem) // ANY
+ ASMJIT_INST_2x(movabs, Movabs, Gp, Mem) // X64
+ ASMJIT_INST_2x(movabs, Movabs, Gp, Imm) // X64
+ ASMJIT_INST_2x(movabs, Movabs, Mem, Gp) // X64
ASMJIT_INST_2x(movnti, Movnti, Mem, Gp) // SSE2
- ASMJIT_INST_2x(movs, Movs, ES_ZDI, DS_ZSI) // ANY [EXPLICIT]
+ ASMJIT_INST_2x(movs, Movs, ES_ZDI, DS_ZSI) // ANY [EXPLICIT]
ASMJIT_INST_2x(movsx, Movsx, Gp, Gp) // ANY
ASMJIT_INST_2x(movsx, Movsx, Gp, Mem) // ANY
ASMJIT_INST_2x(movsxd, Movsxd, Gp, Gp) // X64
ASMJIT_INST_2x(movsxd, Movsxd, Gp, Mem) // X64
ASMJIT_INST_2x(movzx, Movzx, Gp, Gp) // ANY
ASMJIT_INST_2x(movzx, Movzx, Gp, Mem) // ANY
- ASMJIT_INST_2x(mul, Mul, AX, Gp) // ANY [EXPLICIT] AX <- AL * r8
- ASMJIT_INST_2x(mul, Mul, AX, Mem) // ANY [EXPLICIT] AX <- AL * m8
- ASMJIT_INST_3x(mul, Mul, ZDX, ZAX, Gp) // ANY [EXPLICIT] xDX:xAX <- xAX * r16|r32|r64
- ASMJIT_INST_3x(mul, Mul, ZDX, ZAX, Mem) // ANY [EXPLICIT] xDX:xAX <- xAX * m16|m32|m64
+ ASMJIT_INST_2x(mul, Mul, Gp_AX, Gp) // ANY [EXPLICIT] AX <- AL * r8
+ ASMJIT_INST_2x(mul, Mul, Gp_AX, Mem) // ANY [EXPLICIT] AX <- AL * m8
+ ASMJIT_INST_3x(mul, Mul, Gp_ZDX, Gp_ZAX, Gp) // ANY [EXPLICIT] xDX:xAX <- xAX * r16|r32|r64
+ ASMJIT_INST_3x(mul, Mul, Gp_ZDX, Gp_ZAX, Mem) // ANY [EXPLICIT] xDX:xAX <- xAX * m16|m32|m64
ASMJIT_INST_1x(neg, Neg, Gp) // ANY
ASMJIT_INST_1x(neg, Neg, Mem) // ANY
ASMJIT_INST_0x(nop, Nop) // ANY
ASMJIT_INST_1x(nop, Nop, Gp) // ANY
ASMJIT_INST_1x(nop, Nop, Mem) // ANY
+ ASMJIT_INST_2x(nop, Nop, Gp, Gp) // ANY
+ ASMJIT_INST_2x(nop, Nop, Mem, Gp) // ANY
ASMJIT_INST_1x(not_, Not, Gp) // ANY
ASMJIT_INST_1x(not_, Not, Mem) // ANY
ASMJIT_INST_2x(or_, Or, Gp, Gp) // ANY
ASMJIT_INST_2x(or_, Or, Gp, Mem) // ANY
- ASMJIT_INST_2i(or_, Or, Gp, Imm) // ANY
+ ASMJIT_INST_2x(or_, Or, Gp, Imm) // ANY
ASMJIT_INST_2x(or_, Or, Mem, Gp) // ANY
- ASMJIT_INST_2i(or_, Or, Mem, Imm) // ANY
- ASMJIT_INST_2x(out, Out, Imm, ZAX) // ANY
- ASMJIT_INST_2i(out, Out, DX, ZAX) // ANY
- ASMJIT_INST_2i(outs, Outs, DX, DS_ZSI) // ANY
- ASMJIT_INST_0x(pause, Pause) // SSE2
+ ASMJIT_INST_2x(or_, Or, Mem, Imm) // ANY
ASMJIT_INST_1x(pop, Pop, Gp) // ANY
ASMJIT_INST_1x(pop, Pop, Mem) // ANY
ASMJIT_INST_1x(pop, Pop, SReg); // ANY
@@ -702,106 +548,78 @@ public:
ASMJIT_INST_0x(popf, Popf) // ANY
ASMJIT_INST_0x(popfd, Popfd) // X86
ASMJIT_INST_0x(popfq, Popfq) // X64
- ASMJIT_INST_1x(prefetch, Prefetch, Mem) // 3DNOW
- ASMJIT_INST_1x(prefetchnta, Prefetchnta, Mem) // SSE
- ASMJIT_INST_1x(prefetcht0, Prefetcht0, Mem) // SSE
- ASMJIT_INST_1x(prefetcht1, Prefetcht1, Mem) // SSE
- ASMJIT_INST_1x(prefetcht2, Prefetcht2, Mem) // SSE
- ASMJIT_INST_1x(prefetchw, Prefetchw, Mem) // PREFETCHW
- ASMJIT_INST_1x(prefetchwt1, Prefetchwt1, Mem) // PREFETCHW1
ASMJIT_INST_1x(push, Push, Gp) // ANY
ASMJIT_INST_1x(push, Push, Mem) // ANY
ASMJIT_INST_1x(push, Push, SReg) // ANY
- ASMJIT_INST_1i(push, Push, Imm) // ANY
+ ASMJIT_INST_1x(push, Push, Imm) // ANY
ASMJIT_INST_0x(pusha, Pusha) // X86
ASMJIT_INST_0x(pushad, Pushad) // X86
ASMJIT_INST_0x(pushf, Pushf) // ANY
ASMJIT_INST_0x(pushfd, Pushfd) // X86
ASMJIT_INST_0x(pushfq, Pushfq) // X64
- ASMJIT_INST_2x(rcl, Rcl, Gp, CL) // ANY
- ASMJIT_INST_2x(rcl, Rcl, Mem, CL) // ANY
- ASMJIT_INST_2i(rcl, Rcl, Gp, Imm) // ANY
- ASMJIT_INST_2i(rcl, Rcl, Mem, Imm) // ANY
- ASMJIT_INST_2x(rcr, Rcr, Gp, CL) // ANY
- ASMJIT_INST_2x(rcr, Rcr, Mem, CL) // ANY
- ASMJIT_INST_2i(rcr, Rcr, Gp, Imm) // ANY
- ASMJIT_INST_2i(rcr, Rcr, Mem, Imm) // ANY
- ASMJIT_INST_3x(rdmsr, Rdmsr, EDX, EAX, ECX) // MSR [EXPLICIT] RDX:EAX <- MSR[ECX]
- ASMJIT_INST_3x(rdpmc, Rdpmc, EDX, EAX, ECX) // ANY [EXPLICIT] RDX:EAX <- PMC[ECX]
- ASMJIT_INST_2x(rdtsc, Rdtsc, EDX, EAX) // RDTSC [EXPLICIT] EDX:EAX <- Counter
- ASMJIT_INST_3x(rdtscp, Rdtscp, EDX, EAX, ECX) // RDTSCP [EXPLICIT] EDX:EAX:EXC <- Counter
- ASMJIT_INST_2x(rol, Rol, Gp, CL) // ANY
- ASMJIT_INST_2x(rol, Rol, Mem, CL) // ANY
- ASMJIT_INST_2i(rol, Rol, Gp, Imm) // ANY
- ASMJIT_INST_2i(rol, Rol, Mem, Imm) // ANY
- ASMJIT_INST_2x(ror, Ror, Gp, CL) // ANY
- ASMJIT_INST_2x(ror, Ror, Mem, CL) // ANY
- ASMJIT_INST_2i(ror, Ror, Gp, Imm) // ANY
- ASMJIT_INST_2i(ror, Ror, Mem, Imm) // ANY
- ASMJIT_INST_0x(rsm, Rsm) // X86
+ ASMJIT_INST_2x(rcl, Rcl, Gp, Gp_CL) // ANY
+ ASMJIT_INST_2x(rcl, Rcl, Mem, Gp_CL) // ANY
+ ASMJIT_INST_2x(rcl, Rcl, Gp, Imm) // ANY
+ ASMJIT_INST_2x(rcl, Rcl, Mem, Imm) // ANY
+ ASMJIT_INST_2x(rcr, Rcr, Gp, Gp_CL) // ANY
+ ASMJIT_INST_2x(rcr, Rcr, Mem, Gp_CL) // ANY
+ ASMJIT_INST_2x(rcr, Rcr, Gp, Imm) // ANY
+ ASMJIT_INST_2x(rcr, Rcr, Mem, Imm) // ANY
+ ASMJIT_INST_2x(rol, Rol, Gp, Gp_CL) // ANY
+ ASMJIT_INST_2x(rol, Rol, Mem, Gp_CL) // ANY
+ ASMJIT_INST_2x(rol, Rol, Gp, Imm) // ANY
+ ASMJIT_INST_2x(rol, Rol, Mem, Imm) // ANY
+ ASMJIT_INST_2x(ror, Ror, Gp, Gp_CL) // ANY
+ ASMJIT_INST_2x(ror, Ror, Mem, Gp_CL) // ANY
+ ASMJIT_INST_2x(ror, Ror, Gp, Imm) // ANY
+ ASMJIT_INST_2x(ror, Ror, Mem, Imm) // ANY
ASMJIT_INST_2x(sbb, Sbb, Gp, Gp) // ANY
ASMJIT_INST_2x(sbb, Sbb, Gp, Mem) // ANY
- ASMJIT_INST_2i(sbb, Sbb, Gp, Imm) // ANY
+ ASMJIT_INST_2x(sbb, Sbb, Gp, Imm) // ANY
ASMJIT_INST_2x(sbb, Sbb, Mem, Gp) // ANY
- ASMJIT_INST_2i(sbb, Sbb, Mem, Imm) // ANY
- ASMJIT_INST_1x(sahf, Sahf, AH) // LAHFSAHF [EXPLICIT] EFL <- AH
- ASMJIT_INST_2x(sal, Sal, Gp, CL) // ANY
- ASMJIT_INST_2x(sal, Sal, Mem, CL) // ANY
- ASMJIT_INST_2i(sal, Sal, Gp, Imm) // ANY
- ASMJIT_INST_2i(sal, Sal, Mem, Imm) // ANY
- ASMJIT_INST_2x(sar, Sar, Gp, CL) // ANY
- ASMJIT_INST_2x(sar, Sar, Mem, CL) // ANY
- ASMJIT_INST_2i(sar, Sar, Gp, Imm) // ANY
- ASMJIT_INST_2i(sar, Sar, Mem, Imm) // ANY
- ASMJIT_INST_2x(scas, Scas, ZAX, ES_ZDI) // ANY [EXPLICIT]
- ASMJIT_INST_1c(set, Set, Condition::toSetcc, Gp) // ANY
- ASMJIT_INST_1c(set, Set, Condition::toSetcc, Mem) // ANY
- ASMJIT_INST_0x(sfence, Sfence) // SSE
- ASMJIT_INST_1x(sgdt, Sgdt, Mem) // ANY
- ASMJIT_INST_2x(shl, Shl, Gp, CL) // ANY
- ASMJIT_INST_2x(shl, Shl, Mem, CL) // ANY
- ASMJIT_INST_2i(shl, Shl, Gp, Imm) // ANY
- ASMJIT_INST_2i(shl, Shl, Mem, Imm) // ANY
- ASMJIT_INST_2x(shr, Shr, Gp, CL) // ANY
- ASMJIT_INST_2x(shr, Shr, Mem, CL) // ANY
- ASMJIT_INST_2i(shr, Shr, Gp, Imm) // ANY
- ASMJIT_INST_2i(shr, Shr, Mem, Imm) // ANY
- ASMJIT_INST_3x(shld, Shld, Gp, Gp, CL) // ANY
- ASMJIT_INST_3x(shld, Shld, Mem, Gp, CL) // ANY
- ASMJIT_INST_3i(shld, Shld, Gp, Gp, Imm) // ANY
- ASMJIT_INST_3i(shld, Shld, Mem, Gp, Imm) // ANY
- ASMJIT_INST_3x(shrd, Shrd, Gp, Gp, CL) // ANY
- ASMJIT_INST_3x(shrd, Shrd, Mem, Gp, CL) // ANY
- ASMJIT_INST_3i(shrd, Shrd, Gp, Gp, Imm) // ANY
- ASMJIT_INST_3i(shrd, Shrd, Mem, Gp, Imm) // ANY
- ASMJIT_INST_1x(sidt, Sidt, Mem) // ANY
- ASMJIT_INST_1x(sldt, Sldt, Gp) // ANY
- ASMJIT_INST_1x(sldt, Sldt, Mem) // ANY
- ASMJIT_INST_1x(smsw, Smsw, Gp) // ANY
- ASMJIT_INST_1x(smsw, Smsw, Mem) // ANY
- ASMJIT_INST_0x(stc, Stc) // ANY
- ASMJIT_INST_0x(std, Std) // ANY
- ASMJIT_INST_0x(sti, Sti) // ANY
- ASMJIT_INST_1x(stmxcsr, Stmxcsr, Mem) // SSE
- ASMJIT_INST_2x(stos, Stos, ES_ZDI, ZAX) // ANY [EXPLICIT]
- ASMJIT_INST_1x(str, Str, Gp) // ANY
- ASMJIT_INST_1x(str, Str, Mem) // ANY
+ ASMJIT_INST_2x(sbb, Sbb, Mem, Imm) // ANY
+ ASMJIT_INST_2x(sal, Sal, Gp, Gp_CL) // ANY
+ ASMJIT_INST_2x(sal, Sal, Mem, Gp_CL) // ANY
+ ASMJIT_INST_2x(sal, Sal, Gp, Imm) // ANY
+ ASMJIT_INST_2x(sal, Sal, Mem, Imm) // ANY
+ ASMJIT_INST_2x(sar, Sar, Gp, Gp_CL) // ANY
+ ASMJIT_INST_2x(sar, Sar, Mem, Gp_CL) // ANY
+ ASMJIT_INST_2x(sar, Sar, Gp, Imm) // ANY
+ ASMJIT_INST_2x(sar, Sar, Mem, Imm) // ANY
+ ASMJIT_INST_2x(scas, Scas, Gp_ZAX, ES_ZDI) // ANY [EXPLICIT]
+ ASMJIT_INST_1c(set, Set, Inst::setccFromCond, Gp) // ANY
+ ASMJIT_INST_1c(set, Set, Inst::setccFromCond, Mem) // ANY
+ ASMJIT_INST_2x(shl, Shl, Gp, Gp_CL) // ANY
+ ASMJIT_INST_2x(shl, Shl, Mem, Gp_CL) // ANY
+ ASMJIT_INST_2x(shl, Shl, Gp, Imm) // ANY
+ ASMJIT_INST_2x(shl, Shl, Mem, Imm) // ANY
+ ASMJIT_INST_2x(shr, Shr, Gp, Gp_CL) // ANY
+ ASMJIT_INST_2x(shr, Shr, Mem, Gp_CL) // ANY
+ ASMJIT_INST_2x(shr, Shr, Gp, Imm) // ANY
+ ASMJIT_INST_2x(shr, Shr, Mem, Imm) // ANY
+ ASMJIT_INST_3x(shld, Shld, Gp, Gp, Gp_CL) // ANY
+ ASMJIT_INST_3x(shld, Shld, Mem, Gp, Gp_CL) // ANY
+ ASMJIT_INST_3x(shld, Shld, Gp, Gp, Imm) // ANY
+ ASMJIT_INST_3x(shld, Shld, Mem, Gp, Imm) // ANY
+ ASMJIT_INST_3x(shrd, Shrd, Gp, Gp, Gp_CL) // ANY
+ ASMJIT_INST_3x(shrd, Shrd, Mem, Gp, Gp_CL) // ANY
+ ASMJIT_INST_3x(shrd, Shrd, Gp, Gp, Imm) // ANY
+ ASMJIT_INST_3x(shrd, Shrd, Mem, Gp, Imm) // ANY
+ ASMJIT_INST_2x(stos, Stos, ES_ZDI, Gp_ZAX) // ANY [EXPLICIT]
ASMJIT_INST_2x(sub, Sub, Gp, Gp) // ANY
ASMJIT_INST_2x(sub, Sub, Gp, Mem) // ANY
- ASMJIT_INST_2i(sub, Sub, Gp, Imm) // ANY
+ ASMJIT_INST_2x(sub, Sub, Gp, Imm) // ANY
ASMJIT_INST_2x(sub, Sub, Mem, Gp) // ANY
- ASMJIT_INST_2i(sub, Sub, Mem, Imm) // ANY
- ASMJIT_INST_0x(swapgs, Swapgs) // X64
+ ASMJIT_INST_2x(sub, Sub, Mem, Imm) // ANY
ASMJIT_INST_2x(test, Test, Gp, Gp) // ANY
- ASMJIT_INST_2i(test, Test, Gp, Imm) // ANY
+ ASMJIT_INST_2x(test, Test, Gp, Imm) // ANY
ASMJIT_INST_2x(test, Test, Mem, Gp) // ANY
- ASMJIT_INST_2i(test, Test, Mem, Imm) // ANY
+ ASMJIT_INST_2x(test, Test, Mem, Imm) // ANY
+ ASMJIT_INST_2x(ud0, Ud0, Gp, Gp) // ANY
+ ASMJIT_INST_2x(ud0, Ud0, Gp, Mem) // ANY
+ ASMJIT_INST_2x(ud1, Ud1, Gp, Gp) // ANY
+ ASMJIT_INST_2x(ud1, Ud1, Gp, Mem) // ANY
ASMJIT_INST_0x(ud2, Ud2) // ANY
- ASMJIT_INST_1x(verr, Verr, Gp) // ANY
- ASMJIT_INST_1x(verr, Verr, Mem) // ANY
- ASMJIT_INST_1x(verw, Verw, Gp) // ANY
- ASMJIT_INST_1x(verw, Verw, Mem) // ANY
- ASMJIT_INST_3x(wrmsr, Wrmsr, EDX, EAX, ECX) // MSR [EXPLICIT] RDX:EAX -> MSR[ECX]
ASMJIT_INST_2x(xadd, Xadd, Gp, Gp) // ANY
ASMJIT_INST_2x(xadd, Xadd, Mem, Gp) // ANY
ASMJIT_INST_2x(xchg, Xchg, Gp, Gp) // ANY
@@ -809,9 +627,63 @@ public:
ASMJIT_INST_2x(xchg, Xchg, Gp, Mem) // ANY
ASMJIT_INST_2x(xor_, Xor, Gp, Gp) // ANY
ASMJIT_INST_2x(xor_, Xor, Gp, Mem) // ANY
- ASMJIT_INST_2i(xor_, Xor, Gp, Imm) // ANY
+ ASMJIT_INST_2x(xor_, Xor, Gp, Imm) // ANY
ASMJIT_INST_2x(xor_, Xor, Mem, Gp) // ANY
- ASMJIT_INST_2i(xor_, Xor, Mem, Imm) // ANY
+ ASMJIT_INST_2x(xor_, Xor, Mem, Imm) // ANY
+
+ //! \}
+
+ //! \name Deprecated 32-bit Instructions
+ //! \{
+
+ ASMJIT_INST_1x(aaa, Aaa, Gp) // X86 [EXPLICIT]
+ ASMJIT_INST_2x(aad, Aad, Gp, Imm) // X86 [EXPLICIT]
+ ASMJIT_INST_2x(aam, Aam, Gp, Imm) // X86 [EXPLICIT]
+ ASMJIT_INST_1x(aas, Aas, Gp) // X86 [EXPLICIT]
+ ASMJIT_INST_1x(daa, Daa, Gp) // X86 [EXPLICIT]
+ ASMJIT_INST_1x(das, Das, Gp) // X86 [EXPLICIT]
+
+ //! \}
+
+ //! \name ENTER/LEAVE Instructions
+ //! \{
+
+ ASMJIT_INST_2x(enter, Enter, Imm, Imm) // ANY
+ ASMJIT_INST_0x(leave, Leave) // ANY
+
+ //! \}
+
+ //! \name IN/OUT Instructions
+ //! \{
+
+ // NOTE: For some reason Doxygen is messed up here and thinks we are in cond.
+ //! \endcond
+
+ ASMJIT_INST_2x(in, In, Gp_ZAX, Imm) // ANY
+ ASMJIT_INST_2x(in, In, Gp_ZAX, Gp_DX) // ANY
+ ASMJIT_INST_2x(ins, Ins, ES_ZDI, Gp_DX) // ANY
+ ASMJIT_INST_2x(out, Out, Imm, Gp_ZAX) // ANY
+ ASMJIT_INST_2x(out, Out, Gp_DX, Gp_ZAX) // ANY
+ ASMJIT_INST_2x(outs, Outs, Gp_DX, DS_ZSI) // ANY
+
+ //! \}
+
+ //! \name Clear/Set CF/DF Instructions
+ //! \{
+
+ ASMJIT_INST_0x(clc, Clc) // ANY
+ ASMJIT_INST_0x(cld, Cld) // ANY
+ ASMJIT_INST_0x(cmc, Cmc) // ANY
+ ASMJIT_INST_0x(stc, Stc) // ANY
+ ASMJIT_INST_0x(std, Std) // ANY
+
+ //! \}
+
+ //! \name LAHF/SAHF Instructions
+ //! \{
+
+ ASMJIT_INST_1x(lahf, Lahf, Gp_AH) // LAHFSAHF [EXPLICIT] AH <- EFL
+ ASMJIT_INST_1x(sahf, Sahf, Gp_AH) // LAHFSAHF [EXPLICIT] EFL <- AH
//! \}
@@ -825,6 +697,16 @@ public:
//! \}
+ //! \name LZCNT/POPCNT Instructions
+ //! \{
+
+ ASMJIT_INST_2x(lzcnt, Lzcnt, Gp, Gp) // LZCNT
+ ASMJIT_INST_2x(lzcnt, Lzcnt, Gp, Mem) // LZCNT
+ ASMJIT_INST_2x(popcnt, Popcnt, Gp, Gp) // POPCNT
+ ASMJIT_INST_2x(popcnt, Popcnt, Gp, Mem) // POPCNT
+
+ //! \}
+
//! \name BMI Instructions
//! \{
@@ -848,14 +730,14 @@ public:
ASMJIT_INST_3x(bzhi, Bzhi, Gp, Gp, Gp) // BMI2
ASMJIT_INST_3x(bzhi, Bzhi, Gp, Mem, Gp) // BMI2
- ASMJIT_INST_4x(mulx, Mulx, Gp, Gp, Gp, ZDX) // BMI2 [EXPLICIT]
- ASMJIT_INST_4x(mulx, Mulx, Gp, Gp, Mem, ZDX) // BMI2 [EXPLICIT]
+ ASMJIT_INST_4x(mulx, Mulx, Gp, Gp, Gp, Gp_ZDX) // BMI2 [EXPLICIT]
+ ASMJIT_INST_4x(mulx, Mulx, Gp, Gp, Mem, Gp_ZDX) // BMI2 [EXPLICIT]
ASMJIT_INST_3x(pdep, Pdep, Gp, Gp, Gp) // BMI2
ASMJIT_INST_3x(pdep, Pdep, Gp, Gp, Mem) // BMI2
ASMJIT_INST_3x(pext, Pext, Gp, Gp, Gp) // BMI2
ASMJIT_INST_3x(pext, Pext, Gp, Gp, Mem) // BMI2
- ASMJIT_INST_3i(rorx, Rorx, Gp, Gp, Imm) // BMI2
- ASMJIT_INST_3i(rorx, Rorx, Gp, Mem, Imm) // BMI2
+ ASMJIT_INST_3x(rorx, Rorx, Gp, Gp, Imm) // BMI2
+ ASMJIT_INST_3x(rorx, Rorx, Gp, Mem, Imm) // BMI2
ASMJIT_INST_3x(sarx, Sarx, Gp, Gp, Gp) // BMI2
ASMJIT_INST_3x(sarx, Sarx, Gp, Mem, Gp) // BMI2
ASMJIT_INST_3x(shlx, Shlx, Gp, Gp, Gp) // BMI2
@@ -865,89 +747,205 @@ public:
//! \}
- //! \name CL Instructions
+ //! \name TBM Instructions
+ //! \{
+
+ ASMJIT_INST_2x(blcfill, Blcfill, Gp, Gp) // TBM
+ ASMJIT_INST_2x(blcfill, Blcfill, Gp, Mem) // TBM
+ ASMJIT_INST_2x(blci, Blci, Gp, Gp) // TBM
+ ASMJIT_INST_2x(blci, Blci, Gp, Mem) // TBM
+ ASMJIT_INST_2x(blcic, Blcic, Gp, Gp) // TBM
+ ASMJIT_INST_2x(blcic, Blcic, Gp, Mem) // TBM
+ ASMJIT_INST_2x(blcmsk, Blcmsk, Gp, Gp) // TBM
+ ASMJIT_INST_2x(blcmsk, Blcmsk, Gp, Mem) // TBM
+ ASMJIT_INST_2x(blcs, Blcs, Gp, Gp) // TBM
+ ASMJIT_INST_2x(blcs, Blcs, Gp, Mem) // TBM
+ ASMJIT_INST_2x(blsfill, Blsfill, Gp, Gp) // TBM
+ ASMJIT_INST_2x(blsfill, Blsfill, Gp, Mem) // TBM
+ ASMJIT_INST_2x(blsic, Blsic, Gp, Gp) // TBM
+ ASMJIT_INST_2x(blsic, Blsic, Gp, Mem) // TBM
+ ASMJIT_INST_2x(t1mskc, T1mskc, Gp, Gp) // TBM
+ ASMJIT_INST_2x(t1mskc, T1mskc, Gp, Mem) // TBM
+ ASMJIT_INST_2x(tzmsk, Tzmsk, Gp, Gp) // TBM
+ ASMJIT_INST_2x(tzmsk, Tzmsk, Gp, Mem) // TBM
+
+ //! \}
+
+ //! \name CRC32 Instructions (SSE4.2)
+ //! \{
+
+ ASMJIT_INST_2x(crc32, Crc32, Gp, Gp) // SSE4_2
+ ASMJIT_INST_2x(crc32, Crc32, Gp, Mem) // SSE4_2
+
+ //! \}
+
+ //! \name MOVBE Instructions
+ //! \{
+
+ ASMJIT_INST_2x(movbe, Movbe, Gp, Mem) // MOVBE
+ ASMJIT_INST_2x(movbe, Movbe, Mem, Gp) // MOVBE
+
+ //! \}
+
+ //! \name MOVDIRI & MOVDIR64B Instructions
+ //! \{
+
+ ASMJIT_INST_2x(movdiri, Movdiri, Mem, Gp) // MOVDIRI
+ ASMJIT_INST_2x(movdir64b, Movdir64b, Mem, Mem) // MOVDIR64B
+
+ //! \}
+
+ //! \name MXCSR Instructions (SSE)
+ //! \{
+
+ ASMJIT_INST_1x(ldmxcsr, Ldmxcsr, Mem) // SSE
+ ASMJIT_INST_1x(stmxcsr, Stmxcsr, Mem) // SSE
+
+ //! \}
+
+ //! \name FENCE Instructions (SSE and SSE2)
+ //! \{
+
+ ASMJIT_INST_0x(lfence, Lfence) // SSE2
+ ASMJIT_INST_0x(mfence, Mfence) // SSE2
+ ASMJIT_INST_0x(sfence, Sfence) // SSE
+
+ //! \}
+
+ //! \name PREFETCH Instructions
+ //! \{
+
+ ASMJIT_INST_1x(prefetch, Prefetch, Mem) // 3DNOW
+ ASMJIT_INST_1x(prefetchnta, Prefetchnta, Mem) // SSE
+ ASMJIT_INST_1x(prefetcht0, Prefetcht0, Mem) // SSE
+ ASMJIT_INST_1x(prefetcht1, Prefetcht1, Mem) // SSE
+ ASMJIT_INST_1x(prefetcht2, Prefetcht2, Mem) // SSE
+ ASMJIT_INST_1x(prefetchw, Prefetchw, Mem) // PREFETCHW
+ ASMJIT_INST_1x(prefetchwt1, Prefetchwt1, Mem) // PREFETCHW1
+
+ //! \}
+
+ //! \name CPUID Instruction
+ //! \{
+
+ ASMJIT_INST_4x(cpuid, Cpuid, Gp_EAX, Gp_EBX, Gp_ECX, Gp_EDX) // I486 [EXPLICIT] EAX:EBX:ECX:EDX <- CPUID[EAX:ECX]
+
+ //! \}
+
+ //! \name CacheLine Instructions
//! \{
ASMJIT_INST_1x(cldemote, Cldemote, Mem) // CLDEMOTE
ASMJIT_INST_1x(clflush, Clflush, Mem) // CLFLUSH
ASMJIT_INST_1x(clflushopt, Clflushopt, Mem) // CLFLUSH_OPT
ASMJIT_INST_1x(clwb, Clwb, Mem) // CLWB
- ASMJIT_INST_1x(clzero, Clzero, DS_ZAX) // CLZERO [EXPLICIT]
- ASMJIT_INST_0x(wbnoinvd, Wbnoinvd) // WBNOINVD
+ ASMJIT_INST_1x(clzero, Clzero, DS_ZAX) // CLZERO [EXPLICIT]
//! \}
- //! \name CRC32 Instructions
+ //! \name SERIALIZE Instruction
//! \{
- ASMJIT_INST_2x(crc32, Crc32, Gp, Gp) // SSE4_2
- ASMJIT_INST_2x(crc32, Crc32, Gp, Mem) // SSE4_2
+ ASMJIT_INST_0x(serialize, Serialize) // SERIALIZE
//! \}
- //! \name ENQCMD Instructions
+ //! \name RDPID Instruction
//! \{
- ASMJIT_INST_2x(enqcmd, Enqcmd, Mem, Mem) // ENQCMD
- ASMJIT_INST_2x(enqcmds, Enqcmds, Mem, Mem) // ENQCMD
+ ASMJIT_INST_1x(rdpid, Rdpid, Gp) // RDPID
//! \}
- //! \name FSGSBASE Instructions
+ //! \name RDPRU/RDPKRU Instructions
//! \{
- ASMJIT_INST_1x(rdfsbase, Rdfsbase, Gp) // FSGSBASE
- ASMJIT_INST_1x(rdgsbase, Rdgsbase, Gp) // FSGSBASE
- ASMJIT_INST_1x(wrfsbase, Wrfsbase, Gp) // FSGSBASE
- ASMJIT_INST_1x(wrgsbase, Wrgsbase, Gp) // FSGSBASE
+ ASMJIT_INST_3x(rdpru, Rdpru, Gp_EDX, Gp_EAX, Gp_ECX) // RDPRU [EXPLICIT] EDX:EAX <- PRU[ECX]
+ ASMJIT_INST_3x(rdpkru, Rdpkru, Gp_EDX, Gp_EAX, Gp_ECX) // RDPKRU [EXPLICIT] EDX:EAX <- PKRU[ECX]
//! \}
- //! \name FXSR & XSAVE Instructions
+ //! \name RDTSC/RDTSCP Instructions
//! \{
- ASMJIT_INST_1x(fxrstor, Fxrstor, Mem) // FXSR
- ASMJIT_INST_1x(fxrstor64, Fxrstor64, Mem) // FXSR
- ASMJIT_INST_1x(fxsave, Fxsave, Mem) // FXSR
- ASMJIT_INST_1x(fxsave64, Fxsave64, Mem) // FXSR
- ASMJIT_INST_3x(xgetbv, Xgetbv, EDX, EAX, ECX) // XSAVE [EXPLICIT] EDX:EAX <- XCR[ECX]
- ASMJIT_INST_3x(xsetbv, Xsetbv, EDX, EAX, ECX) // XSAVE [EXPLICIT] XCR[ECX] <- EDX:EAX
+ ASMJIT_INST_2x(rdtsc, Rdtsc, Gp_EDX, Gp_EAX) // RDTSC [EXPLICIT] EDX:EAX <- Counter
+ ASMJIT_INST_3x(rdtscp, Rdtscp, Gp_EDX, Gp_EAX, Gp_ECX) // RDTSCP [EXPLICIT] EDX:EAX:EXC <- Counter
//! \}
- //! \name LWP Instructions
+ //! \name Other User-Mode Instructions
//! \{
- ASMJIT_INST_1x(llwpcb, Llwpcb, Gp) // LWP
- ASMJIT_INST_3i(lwpins, Lwpins, Gp, Gp, Imm) // LWP
- ASMJIT_INST_3i(lwpins, Lwpins, Gp, Mem, Imm) // LWP
- ASMJIT_INST_3i(lwpval, Lwpval, Gp, Gp, Imm) // LWP
- ASMJIT_INST_3i(lwpval, Lwpval, Gp, Mem, Imm) // LWP
- ASMJIT_INST_1x(slwpcb, Slwpcb, Gp) // LWP
+ ASMJIT_INST_2x(arpl, Arpl, Gp, Gp) // X86
+ ASMJIT_INST_2x(arpl, Arpl, Mem, Gp) // X86
+ ASMJIT_INST_0x(cli, Cli) // ANY
+ ASMJIT_INST_0x(getsec, Getsec) // SMX
+ ASMJIT_INST_1x(int_, Int, Imm) // ANY
+ ASMJIT_INST_0x(int3, Int3) // ANY
+ ASMJIT_INST_0x(into, Into) // ANY
+ ASMJIT_INST_2x(lar, Lar, Gp, Gp) // ANY
+ ASMJIT_INST_2x(lar, Lar, Gp, Mem) // ANY
+ ASMJIT_INST_2x(lds, Lds, Gp, Mem) // X86
+ ASMJIT_INST_2x(les, Les, Gp, Mem) // X86
+ ASMJIT_INST_2x(lfs, Lfs, Gp, Mem) // ANY
+ ASMJIT_INST_2x(lgs, Lgs, Gp, Mem) // ANY
+ ASMJIT_INST_2x(lsl, Lsl, Gp, Gp) // ANY
+ ASMJIT_INST_2x(lsl, Lsl, Gp, Mem) // ANY
+ ASMJIT_INST_2x(lss, Lss, Gp, Mem) // ANY
+ ASMJIT_INST_0x(pause, Pause) // SSE2
+ ASMJIT_INST_0x(rsm, Rsm) // X86
+ ASMJIT_INST_1x(sgdt, Sgdt, Mem) // ANY
+ ASMJIT_INST_1x(sidt, Sidt, Mem) // ANY
+ ASMJIT_INST_1x(sldt, Sldt, Gp) // ANY
+ ASMJIT_INST_1x(sldt, Sldt, Mem) // ANY
+ ASMJIT_INST_1x(smsw, Smsw, Gp) // ANY
+ ASMJIT_INST_1x(smsw, Smsw, Mem) // ANY
+ ASMJIT_INST_0x(sti, Sti) // ANY
+ ASMJIT_INST_1x(str, Str, Gp) // ANY
+ ASMJIT_INST_1x(str, Str, Mem) // ANY
+ ASMJIT_INST_1x(verr, Verr, Gp) // ANY
+ ASMJIT_INST_1x(verr, Verr, Mem) // ANY
+ ASMJIT_INST_1x(verw, Verw, Gp) // ANY
+ ASMJIT_INST_1x(verw, Verw, Mem) // ANY
//! \}
- //! \name LZCNT Instructions
+ //! \name FSGSBASE Instructions
//! \{
- ASMJIT_INST_2x(lzcnt, Lzcnt, Gp, Gp) // LZCNT
- ASMJIT_INST_2x(lzcnt, Lzcnt, Gp, Mem) // LZCNT
+ ASMJIT_INST_1x(rdfsbase, Rdfsbase, Gp) // FSGSBASE
+ ASMJIT_INST_1x(rdgsbase, Rdgsbase, Gp) // FSGSBASE
+ ASMJIT_INST_1x(wrfsbase, Wrfsbase, Gp) // FSGSBASE
+ ASMJIT_INST_1x(wrgsbase, Wrgsbase, Gp) // FSGSBASE
//! \}
- //! \name MOVBE Instructions
+ //! \name FXSR Instructions
//! \{
- ASMJIT_INST_2x(movbe, Movbe, Gp, Mem) // MOVBE
- ASMJIT_INST_2x(movbe, Movbe, Mem, Gp) // MOVBE
+ ASMJIT_INST_1x(fxrstor, Fxrstor, Mem) // FXSR
+ ASMJIT_INST_1x(fxrstor64, Fxrstor64, Mem) // FXSR
+ ASMJIT_INST_1x(fxsave, Fxsave, Mem) // FXSR
+ ASMJIT_INST_1x(fxsave64, Fxsave64, Mem) // FXSR
//! \}
- //! \name MOVDIRI & MOVDIR64B Instructions
+ //! \name XSAVE Instructions
//! \{
- ASMJIT_INST_2x(movdiri, Movdiri, Mem, Gp) // MOVDIRI
- ASMJIT_INST_2x(movdir64b, Movdir64b, Mem, Mem) // MOVDIR64B
+ ASMJIT_INST_3x(xgetbv, Xgetbv, Gp_EDX, Gp_EAX, Gp_ECX) // XSAVE [EXPLICIT] EDX:EAX <- XCR[ECX]
+ ASMJIT_INST_3x(xrstor, Xrstor, Mem, Gp_EDX, Gp_EAX) // XSAVE [EXPLICIT]
+ ASMJIT_INST_3x(xrstor64, Xrstor64, Mem, Gp_EDX, Gp_EAX) // XSAVE+X64 [EXPLICIT]
+ ASMJIT_INST_3x(xrstors, Xrstors, Mem, Gp_EDX, Gp_EAX) // XSAVE [EXPLICIT]
+ ASMJIT_INST_3x(xrstors64, Xrstors64, Mem, Gp_EDX, Gp_EAX) // XSAVE+X64 [EXPLICIT]
+ ASMJIT_INST_3x(xsave, Xsave, Mem, Gp_EDX, Gp_EAX) // XSAVE [EXPLICIT]
+ ASMJIT_INST_3x(xsave64, Xsave64, Mem, Gp_EDX, Gp_EAX) // XSAVE+X64 [EXPLICIT]
+ ASMJIT_INST_3x(xsavec, Xsavec, Mem, Gp_EDX, Gp_EAX) // XSAVE [EXPLICIT]
+ ASMJIT_INST_3x(xsavec64, Xsavec64, Mem, Gp_EDX, Gp_EAX) // XSAVE+X64 [EXPLICIT]
+ ASMJIT_INST_3x(xsaveopt, Xsaveopt, Mem, Gp_EDX, Gp_EAX) // XSAVE [EXPLICIT]
+ ASMJIT_INST_3x(xsaveopt64, Xsaveopt64, Mem, Gp_EDX, Gp_EAX) // XSAVE+X64 [EXPLICIT]
+ ASMJIT_INST_3x(xsaves, Xsaves, Mem, Gp_EDX, Gp_EAX) // XSAVE [EXPLICIT]
+ ASMJIT_INST_3x(xsaves64, Xsaves64, Mem, Gp_EDX, Gp_EAX) // XSAVE+X64 [EXPLICIT]
//! \}
@@ -969,11 +967,43 @@ public:
//! \}
- //! \name POPCNT Instructions
+ //! \name MONITORX Instructions
//! \{
- ASMJIT_INST_2x(popcnt, Popcnt, Gp, Gp) // POPCNT
- ASMJIT_INST_2x(popcnt, Popcnt, Gp, Mem) // POPCNT
+ ASMJIT_INST_3x(monitorx, Monitorx, Mem, Gp, Gp) // MONITORX
+ ASMJIT_INST_3x(mwaitx, Mwaitx, Gp, Gp, Gp) // MONITORX
+
+ //! \}
+
+ //! \name MCOMMIT Instruction
+ //! \{
+
+ ASMJIT_INST_0x(mcommit, Mcommit) // MCOMMIT
+
+ //! \}
+
+ //! \name PTWRITE Instruction
+ //! \{
+
+ ASMJIT_INST_1x(ptwrite, Ptwrite, Gp) // PTWRITE
+ ASMJIT_INST_1x(ptwrite, Ptwrite, Mem) // PTWRITE
+
+ //! \}
+
+ //! \name ENQCMD Instructions
+ //! \{
+
+ ASMJIT_INST_2x(enqcmd, Enqcmd, Mem, Mem) // ENQCMD
+ ASMJIT_INST_2x(enqcmds, Enqcmds, Mem, Mem) // ENQCMD
+
+ //! \}
+
+ //! \name WAITPKG Instructions
+ //! \{
+
+ ASMJIT_INST_3x(tpause, Tpause, Gp, Gp, Gp) // WAITPKG
+ ASMJIT_INST_1x(umonitor, Umonitor, Mem) // WAITPKG
+ ASMJIT_INST_3x(umwait, Umwait, Gp, Gp, Gp) // WAITPKG
//! \}
@@ -985,19 +1015,122 @@ public:
//! \}
+ //! \name LWP Instructions
+ //! \{
+
+ ASMJIT_INST_1x(llwpcb, Llwpcb, Gp) // LWP
+ ASMJIT_INST_3x(lwpins, Lwpins, Gp, Gp, Imm) // LWP
+ ASMJIT_INST_3x(lwpins, Lwpins, Gp, Mem, Imm) // LWP
+ ASMJIT_INST_3x(lwpval, Lwpval, Gp, Gp, Imm) // LWP
+ ASMJIT_INST_3x(lwpval, Lwpval, Gp, Mem, Imm) // LWP
+ ASMJIT_INST_1x(slwpcb, Slwpcb, Gp) // LWP
+
+ //! \}
+
//! \name RTM & TSX Instructions
//! \{
- ASMJIT_INST_0x(xabort, Xabort) // RTM
+ ASMJIT_INST_1x(xabort, Xabort, Imm) // RTM
ASMJIT_INST_1x(xbegin, Xbegin, Label) // RTM
ASMJIT_INST_1x(xbegin, Xbegin, Imm) // RTM
- ASMJIT_INST_1x(xbegin, Xbegin, uint64_t) // RTM
ASMJIT_INST_0x(xend, Xend) // RTM
ASMJIT_INST_0x(xtest, Xtest) // TSX
//! \}
- //! \name SMAP Instructions
+ //! \name TSXLDTRK Instructions
+ //! \{
+
+ ASMJIT_INST_0x(xresldtrk, Xresldtrk) // TSXLDTRK
+ ASMJIT_INST_0x(xsusldtrk, Xsusldtrk) // TSXLDTRK
+
+ //! \}
+
+ //! \name CET-IBT Instructions
+ //! \{
+
+ ASMJIT_INST_0x(endbr32, Endbr32) // CET_IBT
+ ASMJIT_INST_0x(endbr64, Endbr64) // CET_IBT
+
+ //! \}
+
+ //! \name CET-SS Instructions
+ //! \{
+
+ ASMJIT_INST_1x(clrssbsy, Clrssbsy, Mem) // CET_SS
+ ASMJIT_INST_0x(setssbsy, Setssbsy) // CET_SS
+
+ ASMJIT_INST_1x(rstorssp, Rstorssp, Mem) // CET_SS
+ ASMJIT_INST_0x(saveprevssp, Saveprevssp) // CET_SS
+
+ ASMJIT_INST_1x(incsspd, Incsspd, Gp) // CET_SS
+ ASMJIT_INST_1x(incsspq, Incsspq, Gp) // CET_SS
+ ASMJIT_INST_1x(rdsspd, Rdsspd, Gp) // CET_SS
+ ASMJIT_INST_1x(rdsspq, Rdsspq, Gp) // CET_SS
+ ASMJIT_INST_2x(wrssd, Wrssd, Gp, Gp) // CET_SS
+ ASMJIT_INST_2x(wrssd, Wrssd, Mem, Gp) // CET_SS
+ ASMJIT_INST_2x(wrssq, Wrssq, Gp, Gp) // CET_SS
+ ASMJIT_INST_2x(wrssq, Wrssq, Mem, Gp) // CET_SS
+ ASMJIT_INST_2x(wrussd, Wrussd, Gp, Gp) // CET_SS
+ ASMJIT_INST_2x(wrussd, Wrussd, Mem, Gp) // CET_SS
+ ASMJIT_INST_2x(wrussq, Wrussq, Gp, Gp) // CET_SS
+ ASMJIT_INST_2x(wrussq, Wrussq, Mem, Gp) // CET_SS
+
+ //! \}
+
+ //! \name HRESET Instructions
+ //! \{
+
+ ASMJIT_INST_2x(hreset, Hreset, Imm, Gp) // HRESET
+
+ //! \}
+
+ //! \name UINTR Instructions
+ //! \{
+
+ ASMJIT_INST_0x(clui, Clui) // UINTR
+ ASMJIT_INST_1x(senduipi, Senduipi, Gp) // UINTR
+ ASMJIT_INST_0x(testui, Testui) // UINTR
+ ASMJIT_INST_0x(stui, Stui) // UINTR
+ ASMJIT_INST_0x(uiret, Uiret) // UINTR
+
+ //! \}
+
+ //! \name Core Privileged Instructions
+ //! \{
+
+ ASMJIT_INST_0x(clts, Clts) // ANY
+ ASMJIT_INST_0x(hlt, Hlt) // ANY
+ ASMJIT_INST_0x(invd, Invd) // ANY
+ ASMJIT_INST_1x(invlpg, Invlpg, Mem) // ANY
+ ASMJIT_INST_2x(invpcid, Invpcid, Gp, Mem) // ANY
+ ASMJIT_INST_1x(lgdt, Lgdt, Mem) // ANY
+ ASMJIT_INST_1x(lidt, Lidt, Mem) // ANY
+ ASMJIT_INST_1x(lldt, Lldt, Gp) // ANY
+ ASMJIT_INST_1x(lldt, Lldt, Mem) // ANY
+ ASMJIT_INST_1x(lmsw, Lmsw, Gp) // ANY
+ ASMJIT_INST_1x(lmsw, Lmsw, Mem) // ANY
+ ASMJIT_INST_1x(ltr, Ltr, Gp) // ANY
+ ASMJIT_INST_1x(ltr, Ltr, Mem) // ANY
+ ASMJIT_INST_3x(rdmsr, Rdmsr, Gp_EDX, Gp_EAX, Gp_ECX) // MSR [EXPLICIT] RDX:EAX <- MSR[ECX]
+ ASMJIT_INST_3x(rdpmc, Rdpmc, Gp_EDX, Gp_EAX, Gp_ECX) // ANY [EXPLICIT] RDX:EAX <- PMC[ECX]
+ ASMJIT_INST_0x(swapgs, Swapgs) // X64
+ ASMJIT_INST_0x(wbinvd, Wbinvd) // ANY
+ ASMJIT_INST_0x(wbnoinvd, Wbnoinvd) // WBNOINVD
+ ASMJIT_INST_3x(wrmsr, Wrmsr, Gp_EDX, Gp_EAX, Gp_ECX) // MSR [EXPLICIT] RDX:EAX -> MSR[ECX]
+ ASMJIT_INST_3x(xsetbv, Xsetbv, Gp_EDX, Gp_EAX, Gp_ECX) // XSAVE [EXPLICIT] XCR[ECX] <- EDX:EAX
+
+ //! \}
+
+ //! \name MONITOR Instructions (Privileged)
+ //! \{
+
+ ASMJIT_INST_3x(monitor, Monitor, Mem, Gp, Gp) // MONITOR
+ ASMJIT_INST_2x(mwait, Mwait, Gp, Gp) // MONITOR
+
+ //! \}
+
+ //! \name SMAP Instructions (Privileged)
//! \{
ASMJIT_INST_0x(clac, Clac) // SMAP
@@ -1005,45 +1138,25 @@ public:
//! \}
- //! \name SVM Instructions
+ //! \name SKINIT Instructions (Privileged)
//! \{
- ASMJIT_INST_0x(clgi, Clgi) // SVM
- ASMJIT_INST_2x(invlpga, Invlpga, Gp, Gp) // SVM [EXPLICIT] <eax|rax, ecx>
ASMJIT_INST_1x(skinit, Skinit, Gp) // SKINIT [EXPLICIT] <eax>
ASMJIT_INST_0x(stgi, Stgi) // SKINIT
- ASMJIT_INST_1x(vmload, Vmload, Gp) // SVM [EXPLICIT] <zax>
- ASMJIT_INST_0x(vmmcall, Vmmcall) // SVM
- ASMJIT_INST_1x(vmrun, Vmrun, Gp) // SVM [EXPLICIT] <zax>
- ASMJIT_INST_1x(vmsave, Vmsave, Gp) // SVM [EXPLICIT] <zax>
//! \}
- //! \name TBM Instructions
+ //! \name SNP Instructions (Privileged)
//! \{
- ASMJIT_INST_2x(blcfill, Blcfill, Gp, Gp) // TBM
- ASMJIT_INST_2x(blcfill, Blcfill, Gp, Mem) // TBM
- ASMJIT_INST_2x(blci, Blci, Gp, Gp) // TBM
- ASMJIT_INST_2x(blci, Blci, Gp, Mem) // TBM
- ASMJIT_INST_2x(blcic, Blcic, Gp, Gp) // TBM
- ASMJIT_INST_2x(blcic, Blcic, Gp, Mem) // TBM
- ASMJIT_INST_2x(blcmsk, Blcmsk, Gp, Gp) // TBM
- ASMJIT_INST_2x(blcmsk, Blcmsk, Gp, Mem) // TBM
- ASMJIT_INST_2x(blcs, Blcs, Gp, Gp) // TBM
- ASMJIT_INST_2x(blcs, Blcs, Gp, Mem) // TBM
- ASMJIT_INST_2x(blsfill, Blsfill, Gp, Gp) // TBM
- ASMJIT_INST_2x(blsfill, Blsfill, Gp, Mem) // TBM
- ASMJIT_INST_2x(blsic, Blsic, Gp, Gp) // TBM
- ASMJIT_INST_2x(blsic, Blsic, Gp, Mem) // TBM
- ASMJIT_INST_2x(t1mskc, T1mskc, Gp, Gp) // TBM
- ASMJIT_INST_2x(t1mskc, T1mskc, Gp, Mem) // TBM
- ASMJIT_INST_2x(tzmsk, Tzmsk, Gp, Gp) // TBM
- ASMJIT_INST_2x(tzmsk, Tzmsk, Gp, Mem) // TBM
+ ASMJIT_INST_0x(psmash, Psmash) // SNP
+ ASMJIT_INST_0x(pvalidate, Pvalidate) // SNP
+ ASMJIT_INST_0x(rmpadjust, Rmpadjust) // SNP
+ ASMJIT_INST_0x(rmpupdate, Rmpupdate) // SNP
//! \}
- //! \name VMX Instructions
+ //! \name VMX Instructions (All privileged except vmfunc)
//! \{
ASMJIT_INST_2x(invept, Invept, Gp, Mem) // VMX
@@ -1054,19 +1167,24 @@ public:
ASMJIT_INST_0x(vmlaunch, Vmlaunch) // VMX
ASMJIT_INST_1x(vmptrld, Vmptrld, Mem) // VMX
ASMJIT_INST_1x(vmptrst, Vmptrst, Mem) // VMX
+ ASMJIT_INST_2x(vmread, Vmread, Gp, Gp) // VMX
ASMJIT_INST_2x(vmread, Vmread, Mem, Gp) // VMX
ASMJIT_INST_0x(vmresume, Vmresume) // VMX
ASMJIT_INST_2x(vmwrite, Vmwrite, Gp, Mem) // VMX
+ ASMJIT_INST_2x(vmwrite, Vmwrite, Gp, Gp) // VMX
ASMJIT_INST_1x(vmxon, Vmxon, Mem) // VMX
//! \}
- //! \name Other GP Instructions
+ //! \name SVM Instructions (All privileged except vmmcall)
//! \{
- ASMJIT_INST_0x(getsec, Getsec) // SMX
- ASMJIT_INST_0x(pcommit, Pcommit) // PCOMMIT
- ASMJIT_INST_1x(rdpid, Rdpid, Gp) // RDPID
+ ASMJIT_INST_0x(clgi, Clgi) // SVM
+ ASMJIT_INST_2x(invlpga, Invlpga, Gp, Gp) // SVM [EXPLICIT] <eax|rax, ecx>
+ ASMJIT_INST_1x(vmload, Vmload, Gp) // SVM [EXPLICIT] <zax>
+ ASMJIT_INST_0x(vmmcall, Vmmcall) // SVM
+ ASMJIT_INST_1x(vmrun, Vmrun, Gp) // SVM [EXPLICIT] <zax>
+ ASMJIT_INST_1x(vmsave, Vmsave, Gp) // SVM [EXPLICIT] <zax>
//! \}
@@ -1215,22 +1333,22 @@ public:
ASMJIT_INST_2x(andpd, Andpd, Xmm, Mem) // SSE2
ASMJIT_INST_2x(andps, Andps, Xmm, Xmm) // SSE
ASMJIT_INST_2x(andps, Andps, Xmm, Mem) // SSE
- ASMJIT_INST_3i(blendpd, Blendpd, Xmm, Xmm, Imm) // SSE4_1
- ASMJIT_INST_3i(blendpd, Blendpd, Xmm, Mem, Imm) // SSE4_1
- ASMJIT_INST_3i(blendps, Blendps, Xmm, Xmm, Imm) // SSE4_1
- ASMJIT_INST_3i(blendps, Blendps, Xmm, Mem, Imm) // SSE4_1
+ ASMJIT_INST_3x(blendpd, Blendpd, Xmm, Xmm, Imm) // SSE4_1
+ ASMJIT_INST_3x(blendpd, Blendpd, Xmm, Mem, Imm) // SSE4_1
+ ASMJIT_INST_3x(blendps, Blendps, Xmm, Xmm, Imm) // SSE4_1
+ ASMJIT_INST_3x(blendps, Blendps, Xmm, Mem, Imm) // SSE4_1
ASMJIT_INST_3x(blendvpd, Blendvpd, Xmm, Xmm, XMM0) // SSE4_1 [EXPLICIT]
ASMJIT_INST_3x(blendvpd, Blendvpd, Xmm, Mem, XMM0) // SSE4_1 [EXPLICIT]
ASMJIT_INST_3x(blendvps, Blendvps, Xmm, Xmm, XMM0) // SSE4_1 [EXPLICIT]
ASMJIT_INST_3x(blendvps, Blendvps, Xmm, Mem, XMM0) // SSE4_1 [EXPLICIT]
- ASMJIT_INST_3i(cmppd, Cmppd, Xmm, Xmm, Imm) // SSE2
- ASMJIT_INST_3i(cmppd, Cmppd, Xmm, Mem, Imm) // SSE2
- ASMJIT_INST_3i(cmpps, Cmpps, Xmm, Xmm, Imm) // SSE
- ASMJIT_INST_3i(cmpps, Cmpps, Xmm, Mem, Imm) // SSE
- ASMJIT_INST_3i(cmpsd, Cmpsd, Xmm, Xmm, Imm) // SSE2
- ASMJIT_INST_3i(cmpsd, Cmpsd, Xmm, Mem, Imm) // SSE2
- ASMJIT_INST_3i(cmpss, Cmpss, Xmm, Xmm, Imm) // SSE
- ASMJIT_INST_3i(cmpss, Cmpss, Xmm, Mem, Imm) // SSE
+ ASMJIT_INST_3x(cmppd, Cmppd, Xmm, Xmm, Imm) // SSE2
+ ASMJIT_INST_3x(cmppd, Cmppd, Xmm, Mem, Imm) // SSE2
+ ASMJIT_INST_3x(cmpps, Cmpps, Xmm, Xmm, Imm) // SSE
+ ASMJIT_INST_3x(cmpps, Cmpps, Xmm, Mem, Imm) // SSE
+ ASMJIT_INST_3x(cmpsd, Cmpsd, Xmm, Xmm, Imm) // SSE2
+ ASMJIT_INST_3x(cmpsd, Cmpsd, Xmm, Mem, Imm) // SSE2
+ ASMJIT_INST_3x(cmpss, Cmpss, Xmm, Xmm, Imm) // SSE
+ ASMJIT_INST_3x(cmpss, Cmpss, Xmm, Mem, Imm) // SSE
ASMJIT_INST_2x(comisd, Comisd, Xmm, Xmm) // SSE2
ASMJIT_INST_2x(comisd, Comisd, Xmm, Mem) // SSE2
ASMJIT_INST_2x(comiss, Comiss, Xmm, Xmm) // SSE
@@ -1287,20 +1405,14 @@ public:
ASMJIT_INST_2x(divsd, Divsd, Xmm, Mem) // SSE2
ASMJIT_INST_2x(divss, Divss, Xmm, Xmm) // SSE
ASMJIT_INST_2x(divss, Divss, Xmm, Mem) // SSE
- ASMJIT_INST_3i(dppd, Dppd, Xmm, Xmm, Imm) // SSE4_1
- ASMJIT_INST_3i(dppd, Dppd, Xmm, Mem, Imm) // SSE4_1
- ASMJIT_INST_3i(dpps, Dpps, Xmm, Xmm, Imm) // SSE4_1
- ASMJIT_INST_3i(dpps, Dpps, Xmm, Mem, Imm) // SSE4_1
- ASMJIT_INST_3i(extractps, Extractps, Gp, Xmm, Imm) // SSE4_1
- ASMJIT_INST_3i(extractps, Extractps, Mem, Xmm, Imm) // SSE4_1
+ ASMJIT_INST_3x(dppd, Dppd, Xmm, Xmm, Imm) // SSE4_1
+ ASMJIT_INST_3x(dppd, Dppd, Xmm, Mem, Imm) // SSE4_1
+ ASMJIT_INST_3x(dpps, Dpps, Xmm, Xmm, Imm) // SSE4_1
+ ASMJIT_INST_3x(dpps, Dpps, Xmm, Mem, Imm) // SSE4_1
+ ASMJIT_INST_3x(extractps, Extractps, Gp, Xmm, Imm) // SSE4_1
+ ASMJIT_INST_3x(extractps, Extractps, Mem, Xmm, Imm) // SSE4_1
ASMJIT_INST_2x(extrq, Extrq, Xmm, Xmm) // SSE4A
- ASMJIT_INST_3ii(extrq, Extrq, Xmm, Imm, Imm) // SSE4A
- ASMJIT_INST_3i(gf2p8affineinvqb, Gf2p8affineinvqb, Xmm, Xmm, Imm) // GFNI
- ASMJIT_INST_3i(gf2p8affineinvqb, Gf2p8affineinvqb, Xmm, Mem, Imm) // GFNI
- ASMJIT_INST_3i(gf2p8affineqb, Gf2p8affineqb, Xmm, Xmm, Imm) // GFNI
- ASMJIT_INST_3i(gf2p8affineqb, Gf2p8affineqb, Xmm, Mem, Imm) // GFNI
- ASMJIT_INST_2x(gf2p8mulb, Gf2p8mulb, Xmm, Xmm) // GFNI
- ASMJIT_INST_2x(gf2p8mulb, Gf2p8mulb, Xmm, Mem) // GFNI
+ ASMJIT_INST_3x(extrq, Extrq, Xmm, Imm, Imm) // SSE4A
ASMJIT_INST_2x(haddpd, Haddpd, Xmm, Xmm) // SSE3
ASMJIT_INST_2x(haddpd, Haddpd, Xmm, Mem) // SSE3
ASMJIT_INST_2x(haddps, Haddps, Xmm, Xmm) // SSE3
@@ -1309,10 +1421,10 @@ public:
ASMJIT_INST_2x(hsubpd, Hsubpd, Xmm, Mem) // SSE3
ASMJIT_INST_2x(hsubps, Hsubps, Xmm, Xmm) // SSE3
ASMJIT_INST_2x(hsubps, Hsubps, Xmm, Mem) // SSE3
- ASMJIT_INST_3i(insertps, Insertps, Xmm, Xmm, Imm) // SSE4_1
- ASMJIT_INST_3i(insertps, Insertps, Xmm, Mem, Imm) // SSE4_1
+ ASMJIT_INST_3x(insertps, Insertps, Xmm, Xmm, Imm) // SSE4_1
+ ASMJIT_INST_3x(insertps, Insertps, Xmm, Mem, Imm) // SSE4_1
ASMJIT_INST_2x(insertq, Insertq, Xmm, Xmm) // SSE4A
- ASMJIT_INST_4ii(insertq, Insertq, Xmm, Xmm, Imm, Imm) // SSE4A
+ ASMJIT_INST_4x(insertq, Insertq, Xmm, Xmm, Imm, Imm) // SSE4A
ASMJIT_INST_2x(lddqu, Lddqu, Xmm, Mem) // SSE3
ASMJIT_INST_3x(maskmovq, Maskmovq, Mm, Mm, DS_ZDI) // SSE [EXPLICIT]
ASMJIT_INST_3x(maskmovdqu, Maskmovdqu, Xmm, Xmm, DS_ZDI) // SSE2 [EXPLICIT]
@@ -1401,8 +1513,8 @@ public:
ASMJIT_INST_2x(movups, Movups, Xmm, Xmm) // SSE
ASMJIT_INST_2x(movups, Movups, Xmm, Mem) // SSE
ASMJIT_INST_2x(movups, Movups, Mem, Xmm) // SSE
- ASMJIT_INST_3i(mpsadbw, Mpsadbw, Xmm, Xmm, Imm) // SSE4_1
- ASMJIT_INST_3i(mpsadbw, Mpsadbw, Xmm, Mem, Imm) // SSE4_1
+ ASMJIT_INST_3x(mpsadbw, Mpsadbw, Xmm, Xmm, Imm) // SSE4_1
+ ASMJIT_INST_3x(mpsadbw, Mpsadbw, Xmm, Mem, Imm) // SSE4_1
ASMJIT_INST_2x(mulpd, Mulpd, Xmm, Xmm) // SSE2
ASMJIT_INST_2x(mulpd, Mulpd, Xmm, Mem) // SSE2
ASMJIT_INST_2x(mulps, Mulps, Xmm, Xmm) // SSE
@@ -1473,10 +1585,10 @@ public:
ASMJIT_INST_2x(paddw, Paddw, Mm, Mem) // MMX
ASMJIT_INST_2x(paddw, Paddw, Xmm, Xmm) // SSE2
ASMJIT_INST_2x(paddw, Paddw, Xmm, Mem) // SSE2
- ASMJIT_INST_3i(palignr, Palignr, Mm, Mm, Imm) // SSSE3
- ASMJIT_INST_3i(palignr, Palignr, Mm, Mem, Imm) // SSSE3
- ASMJIT_INST_3i(palignr, Palignr, Xmm, Xmm, Imm) // SSSE3
- ASMJIT_INST_3i(palignr, Palignr, Xmm, Mem, Imm) // SSSE3
+ ASMJIT_INST_3x(palignr, Palignr, Mm, Mm, Imm) // SSSE3
+ ASMJIT_INST_3x(palignr, Palignr, Mm, Mem, Imm) // SSSE3
+ ASMJIT_INST_3x(palignr, Palignr, Xmm, Xmm, Imm) // SSSE3
+ ASMJIT_INST_3x(palignr, Palignr, Xmm, Mem, Imm) // SSSE3
ASMJIT_INST_2x(pand, Pand, Mm, Mm) // MMX
ASMJIT_INST_2x(pand, Pand, Mm, Mem) // MMX
ASMJIT_INST_2x(pand, Pand, Xmm, Xmm) // SSE2
@@ -1495,14 +1607,14 @@ public:
ASMJIT_INST_2x(pavgw, Pavgw, Xmm, Mem) // SSE2
ASMJIT_INST_3x(pblendvb, Pblendvb, Xmm, Xmm, XMM0) // SSE4_1 [EXPLICIT]
ASMJIT_INST_3x(pblendvb, Pblendvb, Xmm, Mem, XMM0) // SSE4_1 [EXPLICIT]
- ASMJIT_INST_3i(pblendw, Pblendw, Xmm, Xmm, Imm) // SSE4_1
- ASMJIT_INST_3i(pblendw, Pblendw, Xmm, Mem, Imm) // SSE4_1
- ASMJIT_INST_3i(pclmulqdq, Pclmulqdq, Xmm, Xmm, Imm) // PCLMULQDQ.
- ASMJIT_INST_3i(pclmulqdq, Pclmulqdq, Xmm, Mem, Imm) // PCLMULQDQ.
- ASMJIT_INST_6x(pcmpestri, Pcmpestri, Xmm, Xmm, Imm, ECX, EAX, EDX) // SSE4_2 [EXPLICIT]
- ASMJIT_INST_6x(pcmpestri, Pcmpestri, Xmm, Mem, Imm, ECX, EAX, EDX) // SSE4_2 [EXPLICIT]
- ASMJIT_INST_6x(pcmpestrm, Pcmpestrm, Xmm, Xmm, Imm, XMM0, EAX, EDX) // SSE4_2 [EXPLICIT]
- ASMJIT_INST_6x(pcmpestrm, Pcmpestrm, Xmm, Mem, Imm, XMM0, EAX, EDX) // SSE4_2 [EXPLICIT]
+ ASMJIT_INST_3x(pblendw, Pblendw, Xmm, Xmm, Imm) // SSE4_1
+ ASMJIT_INST_3x(pblendw, Pblendw, Xmm, Mem, Imm) // SSE4_1
+ ASMJIT_INST_3x(pclmulqdq, Pclmulqdq, Xmm, Xmm, Imm) // PCLMULQDQ.
+ ASMJIT_INST_3x(pclmulqdq, Pclmulqdq, Xmm, Mem, Imm) // PCLMULQDQ.
+ ASMJIT_INST_6x(pcmpestri, Pcmpestri, Xmm, Xmm, Imm, Gp_ECX, Gp_EAX, Gp_EDX) // SSE4_2 [EXPLICIT]
+ ASMJIT_INST_6x(pcmpestri, Pcmpestri, Xmm, Mem, Imm, Gp_ECX, Gp_EAX, Gp_EDX) // SSE4_2 [EXPLICIT]
+ ASMJIT_INST_6x(pcmpestrm, Pcmpestrm, Xmm, Xmm, Imm, XMM0, Gp_EAX, Gp_EDX) // SSE4_2 [EXPLICIT]
+ ASMJIT_INST_6x(pcmpestrm, Pcmpestrm, Xmm, Mem, Imm, XMM0, Gp_EAX, Gp_EDX) // SSE4_2 [EXPLICIT]
ASMJIT_INST_2x(pcmpeqb, Pcmpeqb, Mm, Mm) // MMX
ASMJIT_INST_2x(pcmpeqb, Pcmpeqb, Mm, Mem) // MMX
ASMJIT_INST_2x(pcmpeqb, Pcmpeqb, Xmm, Xmm) // SSE2
@@ -1531,19 +1643,19 @@ public:
ASMJIT_INST_2x(pcmpgtw, Pcmpgtw, Mm, Mem) // MMX
ASMJIT_INST_2x(pcmpgtw, Pcmpgtw, Xmm, Xmm) // SSE2
ASMJIT_INST_2x(pcmpgtw, Pcmpgtw, Xmm, Mem) // SSE2
- ASMJIT_INST_4x(pcmpistri, Pcmpistri, Xmm, Xmm, Imm, ECX) // SSE4_2 [EXPLICIT]
- ASMJIT_INST_4x(pcmpistri, Pcmpistri, Xmm, Mem, Imm, ECX) // SSE4_2 [EXPLICIT]
+ ASMJIT_INST_4x(pcmpistri, Pcmpistri, Xmm, Xmm, Imm, Gp_ECX) // SSE4_2 [EXPLICIT]
+ ASMJIT_INST_4x(pcmpistri, Pcmpistri, Xmm, Mem, Imm, Gp_ECX) // SSE4_2 [EXPLICIT]
ASMJIT_INST_4x(pcmpistrm, Pcmpistrm, Xmm, Xmm, Imm, XMM0) // SSE4_2 [EXPLICIT]
ASMJIT_INST_4x(pcmpistrm, Pcmpistrm, Xmm, Mem, Imm, XMM0) // SSE4_2 [EXPLICIT]
- ASMJIT_INST_3i(pextrb, Pextrb, Gp, Xmm, Imm) // SSE4_1
- ASMJIT_INST_3i(pextrb, Pextrb, Mem, Xmm, Imm) // SSE4_1
- ASMJIT_INST_3i(pextrd, Pextrd, Gp, Xmm, Imm) // SSE4_1
- ASMJIT_INST_3i(pextrd, Pextrd, Mem, Xmm, Imm) // SSE4_1
- ASMJIT_INST_3i(pextrq, Pextrq, Gp, Xmm, Imm) // SSE4_1
- ASMJIT_INST_3i(pextrq, Pextrq, Mem, Xmm, Imm) // SSE4_1
- ASMJIT_INST_3i(pextrw, Pextrw, Gp, Mm, Imm) // SSE
- ASMJIT_INST_3i(pextrw, Pextrw, Gp, Xmm, Imm) // SSE2
- ASMJIT_INST_3i(pextrw, Pextrw, Mem, Xmm, Imm) // SSE4_1
+ ASMJIT_INST_3x(pextrb, Pextrb, Gp, Xmm, Imm) // SSE4_1
+ ASMJIT_INST_3x(pextrb, Pextrb, Mem, Xmm, Imm) // SSE4_1
+ ASMJIT_INST_3x(pextrd, Pextrd, Gp, Xmm, Imm) // SSE4_1
+ ASMJIT_INST_3x(pextrd, Pextrd, Mem, Xmm, Imm) // SSE4_1
+ ASMJIT_INST_3x(pextrq, Pextrq, Gp, Xmm, Imm) // SSE4_1
+ ASMJIT_INST_3x(pextrq, Pextrq, Mem, Xmm, Imm) // SSE4_1
+ ASMJIT_INST_3x(pextrw, Pextrw, Gp, Mm, Imm) // SSE
+ ASMJIT_INST_3x(pextrw, Pextrw, Gp, Xmm, Imm) // SSE2
+ ASMJIT_INST_3x(pextrw, Pextrw, Mem, Xmm, Imm) // SSE4_1
ASMJIT_INST_2x(phaddd, Phaddd, Mm, Mm) // SSSE3
ASMJIT_INST_2x(phaddd, Phaddd, Mm, Mem) // SSSE3
ASMJIT_INST_2x(phaddd, Phaddd, Xmm, Xmm) // SSSE3
@@ -1570,16 +1682,16 @@ public:
ASMJIT_INST_2x(phsubw, Phsubw, Mm, Mem) // SSSE3
ASMJIT_INST_2x(phsubw, Phsubw, Xmm, Xmm) // SSSE3
ASMJIT_INST_2x(phsubw, Phsubw, Xmm, Mem) // SSSE3
- ASMJIT_INST_3i(pinsrb, Pinsrb, Xmm, Gp, Imm) // SSE4_1
- ASMJIT_INST_3i(pinsrb, Pinsrb, Xmm, Mem, Imm) // SSE4_1
- ASMJIT_INST_3i(pinsrd, Pinsrd, Xmm, Gp, Imm) // SSE4_1
- ASMJIT_INST_3i(pinsrd, Pinsrd, Xmm, Mem, Imm) // SSE4_1
- ASMJIT_INST_3i(pinsrq, Pinsrq, Xmm, Gp, Imm) // SSE4_1
- ASMJIT_INST_3i(pinsrq, Pinsrq, Xmm, Mem, Imm) // SSE4_1
- ASMJIT_INST_3i(pinsrw, Pinsrw, Mm, Gp, Imm) // SSE
- ASMJIT_INST_3i(pinsrw, Pinsrw, Mm, Mem, Imm) // SSE
- ASMJIT_INST_3i(pinsrw, Pinsrw, Xmm, Gp, Imm) // SSE2
- ASMJIT_INST_3i(pinsrw, Pinsrw, Xmm, Mem, Imm) // SSE2
+ ASMJIT_INST_3x(pinsrb, Pinsrb, Xmm, Gp, Imm) // SSE4_1
+ ASMJIT_INST_3x(pinsrb, Pinsrb, Xmm, Mem, Imm) // SSE4_1
+ ASMJIT_INST_3x(pinsrd, Pinsrd, Xmm, Gp, Imm) // SSE4_1
+ ASMJIT_INST_3x(pinsrd, Pinsrd, Xmm, Mem, Imm) // SSE4_1
+ ASMJIT_INST_3x(pinsrq, Pinsrq, Xmm, Gp, Imm) // SSE4_1
+ ASMJIT_INST_3x(pinsrq, Pinsrq, Xmm, Mem, Imm) // SSE4_1
+ ASMJIT_INST_3x(pinsrw, Pinsrw, Mm, Gp, Imm) // SSE
+ ASMJIT_INST_3x(pinsrw, Pinsrw, Mm, Mem, Imm) // SSE
+ ASMJIT_INST_3x(pinsrw, Pinsrw, Xmm, Gp, Imm) // SSE2
+ ASMJIT_INST_3x(pinsrw, Pinsrw, Xmm, Mem, Imm) // SSE2
ASMJIT_INST_2x(pmaddubsw, Pmaddubsw, Mm, Mm) // SSSE3
ASMJIT_INST_2x(pmaddubsw, Pmaddubsw, Mm, Mem) // SSSE3
ASMJIT_INST_2x(pmaddubsw, Pmaddubsw, Xmm, Xmm) // SSSE3
@@ -1680,47 +1792,47 @@ public:
ASMJIT_INST_2x(psadbw, Psadbw, Xmm, Mem) // SSE
ASMJIT_INST_2x(pslld, Pslld, Mm, Mm) // MMX
ASMJIT_INST_2x(pslld, Pslld, Mm, Mem) // MMX
- ASMJIT_INST_2i(pslld, Pslld, Mm, Imm) // MMX
+ ASMJIT_INST_2x(pslld, Pslld, Mm, Imm) // MMX
ASMJIT_INST_2x(pslld, Pslld, Xmm, Xmm) // SSE2
ASMJIT_INST_2x(pslld, Pslld, Xmm, Mem) // SSE2
- ASMJIT_INST_2i(pslld, Pslld, Xmm, Imm) // SSE2
- ASMJIT_INST_2i(pslldq, Pslldq, Xmm, Imm) // SSE2
+ ASMJIT_INST_2x(pslld, Pslld, Xmm, Imm) // SSE2
+ ASMJIT_INST_2x(pslldq, Pslldq, Xmm, Imm) // SSE2
ASMJIT_INST_2x(psllq, Psllq, Mm, Mm) // MMX
ASMJIT_INST_2x(psllq, Psllq, Mm, Mem) // MMX
- ASMJIT_INST_2i(psllq, Psllq, Mm, Imm) // MMX
+ ASMJIT_INST_2x(psllq, Psllq, Mm, Imm) // MMX
ASMJIT_INST_2x(psllq, Psllq, Xmm, Xmm) // SSE2
ASMJIT_INST_2x(psllq, Psllq, Xmm, Mem) // SSE2
- ASMJIT_INST_2i(psllq, Psllq, Xmm, Imm) // SSE2
+ ASMJIT_INST_2x(psllq, Psllq, Xmm, Imm) // SSE2
ASMJIT_INST_2x(psllw, Psllw, Mm, Mm) // MMX
ASMJIT_INST_2x(psllw, Psllw, Mm, Mem) // MMX
- ASMJIT_INST_2i(psllw, Psllw, Mm, Imm) // MMX
+ ASMJIT_INST_2x(psllw, Psllw, Mm, Imm) // MMX
ASMJIT_INST_2x(psllw, Psllw, Xmm, Xmm) // SSE2
ASMJIT_INST_2x(psllw, Psllw, Xmm, Mem) // SSE2
- ASMJIT_INST_2i(psllw, Psllw, Xmm, Imm) // SSE2
+ ASMJIT_INST_2x(psllw, Psllw, Xmm, Imm) // SSE2
ASMJIT_INST_2x(psrad, Psrad, Mm, Mm) // MMX
ASMJIT_INST_2x(psrad, Psrad, Mm, Mem) // MMX
- ASMJIT_INST_2i(psrad, Psrad, Mm, Imm) // MMX
+ ASMJIT_INST_2x(psrad, Psrad, Mm, Imm) // MMX
ASMJIT_INST_2x(psrad, Psrad, Xmm, Xmm) // SSE2
ASMJIT_INST_2x(psrad, Psrad, Xmm, Mem) // SSE2
- ASMJIT_INST_2i(psrad, Psrad, Xmm, Imm) // SSE2
+ ASMJIT_INST_2x(psrad, Psrad, Xmm, Imm) // SSE2
ASMJIT_INST_2x(psraw, Psraw, Mm, Mm) // MMX
ASMJIT_INST_2x(psraw, Psraw, Mm, Mem) // MMX
- ASMJIT_INST_2i(psraw, Psraw, Mm, Imm) // MMX
+ ASMJIT_INST_2x(psraw, Psraw, Mm, Imm) // MMX
ASMJIT_INST_2x(psraw, Psraw, Xmm, Xmm) // SSE2
ASMJIT_INST_2x(psraw, Psraw, Xmm, Mem) // SSE2
- ASMJIT_INST_2i(psraw, Psraw, Xmm, Imm) // SSE2
+ ASMJIT_INST_2x(psraw, Psraw, Xmm, Imm) // SSE2
ASMJIT_INST_2x(pshufb, Pshufb, Mm, Mm) // SSSE3
ASMJIT_INST_2x(pshufb, Pshufb, Mm, Mem) // SSSE3
ASMJIT_INST_2x(pshufb, Pshufb, Xmm, Xmm) // SSSE3
ASMJIT_INST_2x(pshufb, Pshufb, Xmm, Mem) // SSSE3
- ASMJIT_INST_3i(pshufd, Pshufd, Xmm, Xmm, Imm) // SSE2
- ASMJIT_INST_3i(pshufd, Pshufd, Xmm, Mem, Imm) // SSE2
- ASMJIT_INST_3i(pshufhw, Pshufhw, Xmm, Xmm, Imm) // SSE2
- ASMJIT_INST_3i(pshufhw, Pshufhw, Xmm, Mem, Imm) // SSE2
- ASMJIT_INST_3i(pshuflw, Pshuflw, Xmm, Xmm, Imm) // SSE2
- ASMJIT_INST_3i(pshuflw, Pshuflw, Xmm, Mem, Imm) // SSE2
- ASMJIT_INST_3i(pshufw, Pshufw, Mm, Mm, Imm) // SSE
- ASMJIT_INST_3i(pshufw, Pshufw, Mm, Mem, Imm) // SSE
+ ASMJIT_INST_3x(pshufd, Pshufd, Xmm, Xmm, Imm) // SSE2
+ ASMJIT_INST_3x(pshufd, Pshufd, Xmm, Mem, Imm) // SSE2
+ ASMJIT_INST_3x(pshufhw, Pshufhw, Xmm, Xmm, Imm) // SSE2
+ ASMJIT_INST_3x(pshufhw, Pshufhw, Xmm, Mem, Imm) // SSE2
+ ASMJIT_INST_3x(pshuflw, Pshuflw, Xmm, Xmm, Imm) // SSE2
+ ASMJIT_INST_3x(pshuflw, Pshuflw, Xmm, Mem, Imm) // SSE2
+ ASMJIT_INST_3x(pshufw, Pshufw, Mm, Mm, Imm) // SSE
+ ASMJIT_INST_3x(pshufw, Pshufw, Mm, Mem, Imm) // SSE
ASMJIT_INST_2x(psignb, Psignb, Mm, Mm) // SSSE3
ASMJIT_INST_2x(psignb, Psignb, Mm, Mem) // SSSE3
ASMJIT_INST_2x(psignb, Psignb, Xmm, Xmm) // SSSE3
@@ -1735,23 +1847,23 @@ public:
ASMJIT_INST_2x(psignw, Psignw, Xmm, Mem) // SSSE3
ASMJIT_INST_2x(psrld, Psrld, Mm, Mm) // MMX
ASMJIT_INST_2x(psrld, Psrld, Mm, Mem) // MMX
- ASMJIT_INST_2i(psrld, Psrld, Mm, Imm) // MMX
+ ASMJIT_INST_2x(psrld, Psrld, Mm, Imm) // MMX
ASMJIT_INST_2x(psrld, Psrld, Xmm, Xmm) // SSE2
ASMJIT_INST_2x(psrld, Psrld, Xmm, Mem) // SSE2
- ASMJIT_INST_2i(psrld, Psrld, Xmm, Imm) // SSE2
- ASMJIT_INST_2i(psrldq, Psrldq, Xmm, Imm) // SSE2
+ ASMJIT_INST_2x(psrld, Psrld, Xmm, Imm) // SSE2
+ ASMJIT_INST_2x(psrldq, Psrldq, Xmm, Imm) // SSE2
ASMJIT_INST_2x(psrlq, Psrlq, Mm, Mm) // MMX
ASMJIT_INST_2x(psrlq, Psrlq, Mm, Mem) // MMX
- ASMJIT_INST_2i(psrlq, Psrlq, Mm, Imm) // MMX
+ ASMJIT_INST_2x(psrlq, Psrlq, Mm, Imm) // MMX
ASMJIT_INST_2x(psrlq, Psrlq, Xmm, Xmm) // SSE2
ASMJIT_INST_2x(psrlq, Psrlq, Xmm, Mem) // SSE2
- ASMJIT_INST_2i(psrlq, Psrlq, Xmm, Imm) // SSE2
+ ASMJIT_INST_2x(psrlq, Psrlq, Xmm, Imm) // SSE2
ASMJIT_INST_2x(psrlw, Psrlw, Mm, Mm) // MMX
ASMJIT_INST_2x(psrlw, Psrlw, Mm, Mem) // MMX
- ASMJIT_INST_2i(psrlw, Psrlw, Mm, Imm) // MMX
+ ASMJIT_INST_2x(psrlw, Psrlw, Mm, Imm) // MMX
ASMJIT_INST_2x(psrlw, Psrlw, Xmm, Xmm) // SSE2
ASMJIT_INST_2x(psrlw, Psrlw, Xmm, Mem) // SSE2
- ASMJIT_INST_2i(psrlw, Psrlw, Xmm, Imm) // SSE2
+ ASMJIT_INST_2x(psrlw, Psrlw, Xmm, Imm) // SSE2
ASMJIT_INST_2x(psubb, Psubb, Mm, Mm) // MMX
ASMJIT_INST_2x(psubb, Psubb, Mm, Mem) // MMX
ASMJIT_INST_2x(psubb, Psubb, Xmm, Xmm) // SSE2
@@ -1822,22 +1934,22 @@ public:
ASMJIT_INST_2x(rcpps, Rcpps, Xmm, Mem) // SSE
ASMJIT_INST_2x(rcpss, Rcpss, Xmm, Xmm) // SSE
ASMJIT_INST_2x(rcpss, Rcpss, Xmm, Mem) // SSE
- ASMJIT_INST_3i(roundpd, Roundpd, Xmm, Xmm, Imm) // SSE4_1
- ASMJIT_INST_3i(roundpd, Roundpd, Xmm, Mem, Imm) // SSE4_1
- ASMJIT_INST_3i(roundps, Roundps, Xmm, Xmm, Imm) // SSE4_1
- ASMJIT_INST_3i(roundps, Roundps, Xmm, Mem, Imm) // SSE4_1
- ASMJIT_INST_3i(roundsd, Roundsd, Xmm, Xmm, Imm) // SSE4_1
- ASMJIT_INST_3i(roundsd, Roundsd, Xmm, Mem, Imm) // SSE4_1
- ASMJIT_INST_3i(roundss, Roundss, Xmm, Xmm, Imm) // SSE4_1
- ASMJIT_INST_3i(roundss, Roundss, Xmm, Mem, Imm) // SSE4_1
+ ASMJIT_INST_3x(roundpd, Roundpd, Xmm, Xmm, Imm) // SSE4_1
+ ASMJIT_INST_3x(roundpd, Roundpd, Xmm, Mem, Imm) // SSE4_1
+ ASMJIT_INST_3x(roundps, Roundps, Xmm, Xmm, Imm) // SSE4_1
+ ASMJIT_INST_3x(roundps, Roundps, Xmm, Mem, Imm) // SSE4_1
+ ASMJIT_INST_3x(roundsd, Roundsd, Xmm, Xmm, Imm) // SSE4_1
+ ASMJIT_INST_3x(roundsd, Roundsd, Xmm, Mem, Imm) // SSE4_1
+ ASMJIT_INST_3x(roundss, Roundss, Xmm, Xmm, Imm) // SSE4_1
+ ASMJIT_INST_3x(roundss, Roundss, Xmm, Mem, Imm) // SSE4_1
ASMJIT_INST_2x(rsqrtps, Rsqrtps, Xmm, Xmm) // SSE
ASMJIT_INST_2x(rsqrtps, Rsqrtps, Xmm, Mem) // SSE
ASMJIT_INST_2x(rsqrtss, Rsqrtss, Xmm, Xmm) // SSE
ASMJIT_INST_2x(rsqrtss, Rsqrtss, Xmm, Mem) // SSE
- ASMJIT_INST_3i(shufpd, Shufpd, Xmm, Xmm, Imm) // SSE2
- ASMJIT_INST_3i(shufpd, Shufpd, Xmm, Mem, Imm) // SSE2
- ASMJIT_INST_3i(shufps, Shufps, Xmm, Xmm, Imm) // SSE
- ASMJIT_INST_3i(shufps, Shufps, Xmm, Mem, Imm) // SSE
+ ASMJIT_INST_3x(shufpd, Shufpd, Xmm, Xmm, Imm) // SSE2
+ ASMJIT_INST_3x(shufpd, Shufpd, Xmm, Mem, Imm) // SSE2
+ ASMJIT_INST_3x(shufps, Shufps, Xmm, Xmm, Imm) // SSE
+ ASMJIT_INST_3x(shufps, Shufps, Xmm, Mem, Imm) // SSE
ASMJIT_INST_2x(sqrtpd, Sqrtpd, Xmm, Xmm) // SSE2
ASMJIT_INST_2x(sqrtpd, Sqrtpd, Xmm, Mem) // SSE2
ASMJIT_INST_2x(sqrtps, Sqrtps, Xmm, Xmm) // SSE
@@ -1928,6 +2040,13 @@ public:
ASMJIT_INST_2x(pmulhrw, Pmulhrw, Mm, Mem) // 3DNOW
ASMJIT_INST_2x(pswapd, Pswapd, Mm, Mm) // 3DNOW
ASMJIT_INST_2x(pswapd, Pswapd, Mm, Mem) // 3DNOW
+
+ //! \}
+
+ //! \name EMMS/FEMMS Instructions
+ //! \{
+
+ ASMJIT_INST_0x(emms, Emms) // MMX
ASMJIT_INST_0x(femms, Femms) // 3DNOW
//! \}
@@ -1945,8 +2064,8 @@ public:
ASMJIT_INST_2x(aesenclast, Aesenclast, Xmm, Mem) // AESNI
ASMJIT_INST_2x(aesimc, Aesimc, Xmm, Xmm) // AESNI
ASMJIT_INST_2x(aesimc, Aesimc, Xmm, Mem) // AESNI
- ASMJIT_INST_3i(aeskeygenassist, Aeskeygenassist, Xmm, Xmm, Imm) // AESNI
- ASMJIT_INST_3i(aeskeygenassist, Aeskeygenassist, Xmm, Mem, Imm) // AESNI
+ ASMJIT_INST_3x(aeskeygenassist, Aeskeygenassist, Xmm, Xmm, Imm) // AESNI
+ ASMJIT_INST_3x(aeskeygenassist, Aeskeygenassist, Xmm, Mem, Imm) // AESNI
//! \}
@@ -1959,8 +2078,8 @@ public:
ASMJIT_INST_2x(sha1msg2, Sha1msg2, Xmm, Mem) // SHA
ASMJIT_INST_2x(sha1nexte, Sha1nexte, Xmm, Xmm) // SHA
ASMJIT_INST_2x(sha1nexte, Sha1nexte, Xmm, Mem) // SHA
- ASMJIT_INST_3i(sha1rnds4, Sha1rnds4, Xmm, Xmm, Imm) // SHA
- ASMJIT_INST_3i(sha1rnds4, Sha1rnds4, Xmm, Mem, Imm) // SHA
+ ASMJIT_INST_3x(sha1rnds4, Sha1rnds4, Xmm, Xmm, Imm) // SHA
+ ASMJIT_INST_3x(sha1rnds4, Sha1rnds4, Xmm, Mem, Imm) // SHA
ASMJIT_INST_2x(sha256msg1, Sha256msg1, Xmm, Xmm) // SHA
ASMJIT_INST_2x(sha256msg1, Sha256msg1, Xmm, Mem) // SHA
ASMJIT_INST_2x(sha256msg2, Sha256msg2, Xmm, Xmm) // SHA
@@ -1970,6 +2089,21 @@ public:
//! \}
+ //! \name GFNI Instructions
+ //! \{
+
+ // NOTE: For some reason Doxygen is messed up here and thinks we are in cond.
+ //! \endcond
+
+ ASMJIT_INST_3x(gf2p8affineinvqb, Gf2p8affineinvqb, Xmm, Xmm, Imm) // GFNI
+ ASMJIT_INST_3x(gf2p8affineinvqb, Gf2p8affineinvqb, Xmm, Mem, Imm) // GFNI
+ ASMJIT_INST_3x(gf2p8affineqb, Gf2p8affineqb, Xmm, Xmm, Imm) // GFNI
+ ASMJIT_INST_3x(gf2p8affineqb, Gf2p8affineqb, Xmm, Mem, Imm) // GFNI
+ ASMJIT_INST_2x(gf2p8mulb, Gf2p8mulb, Xmm, Xmm) // GFNI
+ ASMJIT_INST_2x(gf2p8mulb, Gf2p8mulb, Xmm, Mem) // GFNI
+
+ //! \}
+
//! \name AVX, FMA, and AVX512 Instructions
//! \{
@@ -2017,14 +2151,14 @@ public:
ASMJIT_INST_2x(kortestq, Kortestq, KReg, KReg) // AVX512_BW
ASMJIT_INST_2x(kortestw, Kortestw, KReg, KReg) // AVX512_F
ASMJIT_INST_3x(korw, Korw, KReg, KReg, KReg) // AVX512_F
- ASMJIT_INST_3i(kshiftlb, Kshiftlb, KReg, KReg, Imm) // AVX512_DQ
- ASMJIT_INST_3i(kshiftld, Kshiftld, KReg, KReg, Imm) // AVX512_BW
- ASMJIT_INST_3i(kshiftlq, Kshiftlq, KReg, KReg, Imm) // AVX512_BW
- ASMJIT_INST_3i(kshiftlw, Kshiftlw, KReg, KReg, Imm) // AVX512_F
- ASMJIT_INST_3i(kshiftrb, Kshiftrb, KReg, KReg, Imm) // AVX512_DQ
- ASMJIT_INST_3i(kshiftrd, Kshiftrd, KReg, KReg, Imm) // AVX512_BW
- ASMJIT_INST_3i(kshiftrq, Kshiftrq, KReg, KReg, Imm) // AVX512_BW
- ASMJIT_INST_3i(kshiftrw, Kshiftrw, KReg, KReg, Imm) // AVX512_F
+ ASMJIT_INST_3x(kshiftlb, Kshiftlb, KReg, KReg, Imm) // AVX512_DQ
+ ASMJIT_INST_3x(kshiftld, Kshiftld, KReg, KReg, Imm) // AVX512_BW
+ ASMJIT_INST_3x(kshiftlq, Kshiftlq, KReg, KReg, Imm) // AVX512_BW
+ ASMJIT_INST_3x(kshiftlw, Kshiftlw, KReg, KReg, Imm) // AVX512_F
+ ASMJIT_INST_3x(kshiftrb, Kshiftrb, KReg, KReg, Imm) // AVX512_DQ
+ ASMJIT_INST_3x(kshiftrd, Kshiftrd, KReg, KReg, Imm) // AVX512_BW
+ ASMJIT_INST_3x(kshiftrq, Kshiftrq, KReg, KReg, Imm) // AVX512_BW
+ ASMJIT_INST_3x(kshiftrw, Kshiftrw, KReg, KReg, Imm) // AVX512_F
ASMJIT_INST_2x(ktestb, Ktestb, KReg, KReg) // AVX512_DQ
ASMJIT_INST_2x(ktestd, Ktestd, KReg, KReg) // AVX512_BW
ASMJIT_INST_2x(ktestq, Ktestq, KReg, KReg) // AVX512_BW
@@ -2066,12 +2200,12 @@ public:
ASMJIT_INST_3x(vaesenclast, Vaesenclast, Vec, Vec, Mem) // AVX+AESNI VAES
ASMJIT_INST_2x(vaesimc, Vaesimc, Xmm, Xmm) // AVX+AESNI
ASMJIT_INST_2x(vaesimc, Vaesimc, Xmm, Mem) // AVX+AESNI
- ASMJIT_INST_3i(vaeskeygenassist, Vaeskeygenassist, Xmm, Xmm, Imm) // AVX+AESNI
- ASMJIT_INST_3i(vaeskeygenassist, Vaeskeygenassist, Xmm, Mem, Imm) // AVX+AESNI
- ASMJIT_INST_4i(valignd, Valignd, Vec, Vec, Vec, Imm) // AVX512_F{kz|b32}
- ASMJIT_INST_4i(valignd, Valignd, Vec, Vec, Mem, Imm) // AVX512_F{kz|b32}
- ASMJIT_INST_4i(valignq, Valignq, Vec, Vec, Vec, Imm) // AVX512_F{kz|b64}
- ASMJIT_INST_4i(valignq, Valignq, Vec, Vec, Mem, Imm) // AVX512_F{kz|b64}
+ ASMJIT_INST_3x(vaeskeygenassist, Vaeskeygenassist, Xmm, Xmm, Imm) // AVX+AESNI
+ ASMJIT_INST_3x(vaeskeygenassist, Vaeskeygenassist, Xmm, Mem, Imm) // AVX+AESNI
+ ASMJIT_INST_4x(valignd, Valignd, Vec, Vec, Vec, Imm) // AVX512_F{kz|b32}
+ ASMJIT_INST_4x(valignd, Valignd, Vec, Vec, Mem, Imm) // AVX512_F{kz|b32}
+ ASMJIT_INST_4x(valignq, Valignq, Vec, Vec, Vec, Imm) // AVX512_F{kz|b64}
+ ASMJIT_INST_4x(valignq, Valignq, Vec, Vec, Mem, Imm) // AVX512_F{kz|b64}
ASMJIT_INST_3x(vandnpd, Vandnpd, Vec, Vec, Vec) // AVX AVX512_DQ{kz|b64}
ASMJIT_INST_3x(vandnpd, Vandnpd, Vec, Vec, Mem) // AVX AVX512_DQ{kz|b64}
ASMJIT_INST_3x(vandnps, Vandnps, Vec, Vec, Vec) // AVX AVX512_DQ{kz|b32}
@@ -2080,22 +2214,14 @@ public:
ASMJIT_INST_3x(vandpd, Vandpd, Vec, Vec, Mem) // AVX AVX512_DQ{kz|b64}
ASMJIT_INST_3x(vandps, Vandps, Vec, Vec, Vec) // AVX AVX512_DQ{kz|b32}
ASMJIT_INST_3x(vandps, Vandps, Vec, Vec, Mem) // AVX AVX512_DQ{kz|b32}
- ASMJIT_INST_3x(vblendmb, Vblendmb, Vec, Vec, Vec) // AVX512_BW{kz}
- ASMJIT_INST_3x(vblendmb, Vblendmb, Vec, Vec, Mem) // AVX512_BW{kz}
- ASMJIT_INST_3x(vblendmd, Vblendmd, Vec, Vec, Vec) // AVX512_F{kz|b32}
- ASMJIT_INST_3x(vblendmd, Vblendmd, Vec, Vec, Mem) // AVX512_F{kz|b32}
ASMJIT_INST_3x(vblendmpd, Vblendmpd, Vec, Vec, Vec) // AVX512_F{kz|b64}
ASMJIT_INST_3x(vblendmpd, Vblendmpd, Vec, Vec, Mem) // AVX512_F{kz|b64}
ASMJIT_INST_3x(vblendmps, Vblendmps, Vec, Vec, Vec) // AVX512_F{kz|b32}
ASMJIT_INST_3x(vblendmps, Vblendmps, Vec, Vec, Mem) // AVX512_F{kz|b32}
- ASMJIT_INST_3x(vblendmq, Vblendmq, Vec, Vec, Vec) // AVX512_F{kz|b64}
- ASMJIT_INST_3x(vblendmq, Vblendmq, Vec, Vec, Mem) // AVX512_F{kz|b64}
- ASMJIT_INST_3x(vblendmw, Vblendmw, Vec, Vec, Vec) // AVX512_BW{kz}
- ASMJIT_INST_3x(vblendmw, Vblendmw, Vec, Vec, Mem) // AVX512_BW{kz}
- ASMJIT_INST_4i(vblendpd, Vblendpd, Vec, Vec, Vec, Imm) // AVX
- ASMJIT_INST_4i(vblendpd, Vblendpd, Vec, Vec, Mem, Imm) // AVX
- ASMJIT_INST_4i(vblendps, Vblendps, Vec, Vec, Vec, Imm) // AVX
- ASMJIT_INST_4i(vblendps, Vblendps, Vec, Vec, Mem, Imm) // AVX
+ ASMJIT_INST_4x(vblendpd, Vblendpd, Vec, Vec, Vec, Imm) // AVX
+ ASMJIT_INST_4x(vblendpd, Vblendpd, Vec, Vec, Mem, Imm) // AVX
+ ASMJIT_INST_4x(vblendps, Vblendps, Vec, Vec, Vec, Imm) // AVX
+ ASMJIT_INST_4x(vblendps, Vblendps, Vec, Vec, Mem, Imm) // AVX
ASMJIT_INST_4x(vblendvpd, Vblendvpd, Vec, Vec, Vec, Vec) // AVX
ASMJIT_INST_4x(vblendvpd, Vblendvpd, Vec, Vec, Mem, Vec) // AVX
ASMJIT_INST_4x(vblendvps, Vblendvps, Vec, Vec, Vec, Vec) // AVX
@@ -2120,22 +2246,22 @@ public:
ASMJIT_INST_2x(vbroadcastsd, Vbroadcastsd, Vec, Xmm) // AVX2 AVX512_F{kz}
ASMJIT_INST_2x(vbroadcastss, Vbroadcastss, Vec, Mem) // AVX AVX512_F{kz}
ASMJIT_INST_2x(vbroadcastss, Vbroadcastss, Vec, Xmm) // AVX2 AVX512_F{kz}
- ASMJIT_INST_4i(vcmppd, Vcmppd, Vec, Vec, Vec, Imm) // AVX
- ASMJIT_INST_4i(vcmppd, Vcmppd, Vec, Vec, Mem, Imm) // AVX
- ASMJIT_INST_4i(vcmppd, Vcmppd, KReg, Vec, Vec, Imm) // AVX512_F{kz|b64}
- ASMJIT_INST_4i(vcmppd, Vcmppd, KReg, Vec, Mem, Imm) // AVX512_F{kz|b64}
- ASMJIT_INST_4i(vcmpps, Vcmpps, Vec, Vec, Vec, Imm) // AVX
- ASMJIT_INST_4i(vcmpps, Vcmpps, Vec, Vec, Mem, Imm) // AVX
- ASMJIT_INST_4i(vcmpps, Vcmpps, KReg, Vec, Vec, Imm) // AVX512_F{kz|b32}
- ASMJIT_INST_4i(vcmpps, Vcmpps, KReg, Vec, Mem, Imm) // AVX512_F{kz|b32}
- ASMJIT_INST_4i(vcmpsd, Vcmpsd, Xmm, Xmm, Xmm, Imm) // AVX
- ASMJIT_INST_4i(vcmpsd, Vcmpsd, Xmm, Xmm, Mem, Imm) // AVX
- ASMJIT_INST_4i(vcmpsd, Vcmpsd, KReg, Xmm, Xmm, Imm) // AVX512_F{kz|sae}
- ASMJIT_INST_4i(vcmpsd, Vcmpsd, KReg, Xmm, Mem, Imm) // AVX512_F{kz|sae}
- ASMJIT_INST_4i(vcmpss, Vcmpss, Xmm, Xmm, Xmm, Imm) // AVX
- ASMJIT_INST_4i(vcmpss, Vcmpss, Xmm, Xmm, Mem, Imm) // AVX
- ASMJIT_INST_4i(vcmpss, Vcmpss, KReg, Xmm, Xmm, Imm) // AVX512_F{kz|sae}
- ASMJIT_INST_4i(vcmpss, Vcmpss, KReg, Xmm, Mem, Imm) // AVX512_F{kz|sae}
+ ASMJIT_INST_4x(vcmppd, Vcmppd, Vec, Vec, Vec, Imm) // AVX
+ ASMJIT_INST_4x(vcmppd, Vcmppd, Vec, Vec, Mem, Imm) // AVX
+ ASMJIT_INST_4x(vcmppd, Vcmppd, KReg, Vec, Vec, Imm) // AVX512_F{kz|b64}
+ ASMJIT_INST_4x(vcmppd, Vcmppd, KReg, Vec, Mem, Imm) // AVX512_F{kz|b64}
+ ASMJIT_INST_4x(vcmpps, Vcmpps, Vec, Vec, Vec, Imm) // AVX
+ ASMJIT_INST_4x(vcmpps, Vcmpps, Vec, Vec, Mem, Imm) // AVX
+ ASMJIT_INST_4x(vcmpps, Vcmpps, KReg, Vec, Vec, Imm) // AVX512_F{kz|b32}
+ ASMJIT_INST_4x(vcmpps, Vcmpps, KReg, Vec, Mem, Imm) // AVX512_F{kz|b32}
+ ASMJIT_INST_4x(vcmpsd, Vcmpsd, Xmm, Xmm, Xmm, Imm) // AVX
+ ASMJIT_INST_4x(vcmpsd, Vcmpsd, Xmm, Xmm, Mem, Imm) // AVX
+ ASMJIT_INST_4x(vcmpsd, Vcmpsd, KReg, Xmm, Xmm, Imm) // AVX512_F{kz|sae}
+ ASMJIT_INST_4x(vcmpsd, Vcmpsd, KReg, Xmm, Mem, Imm) // AVX512_F{kz|sae}
+ ASMJIT_INST_4x(vcmpss, Vcmpss, Xmm, Xmm, Xmm, Imm) // AVX
+ ASMJIT_INST_4x(vcmpss, Vcmpss, Xmm, Xmm, Mem, Imm) // AVX
+ ASMJIT_INST_4x(vcmpss, Vcmpss, KReg, Xmm, Xmm, Imm) // AVX512_F{kz|sae}
+ ASMJIT_INST_4x(vcmpss, Vcmpss, KReg, Xmm, Mem, Imm) // AVX512_F{kz|sae}
ASMJIT_INST_2x(vcomisd, Vcomisd, Xmm, Xmm) // AVX AVX512_F{sae}
ASMJIT_INST_2x(vcomisd, Vcomisd, Xmm, Mem) // AVX AVX512_F{sae}
ASMJIT_INST_2x(vcomiss, Vcomiss, Xmm, Xmm) // AVX AVX512_F{sae}
@@ -2168,8 +2294,8 @@ public:
ASMJIT_INST_2x(vcvtps2dq, Vcvtps2dq, Vec, Mem) // AVX AVX512_F{kz|b32}
ASMJIT_INST_2x(vcvtps2pd, Vcvtps2pd, Vec, Vec) // AVX AVX512_F{kz|b32}
ASMJIT_INST_2x(vcvtps2pd, Vcvtps2pd, Vec, Mem) // AVX AVX512_F{kz|b32}
- ASMJIT_INST_3i(vcvtps2ph, Vcvtps2ph, Vec, Vec, Imm) // F16C AVX512_F{kz}
- ASMJIT_INST_3i(vcvtps2ph, Vcvtps2ph, Mem, Vec, Imm) // F16C AVX512_F{kz}
+ ASMJIT_INST_3x(vcvtps2ph, Vcvtps2ph, Vec, Vec, Imm) // F16C AVX512_F{kz}
+ ASMJIT_INST_3x(vcvtps2ph, Vcvtps2ph, Mem, Vec, Imm) // F16C AVX512_F{kz}
ASMJIT_INST_2x(vcvtps2qq, Vcvtps2qq, Vec, Vec) // AVX512_DQ{kz|b32}
ASMJIT_INST_2x(vcvtps2qq, Vcvtps2qq, Vec, Mem) // AVX512_DQ{kz|b32}
ASMJIT_INST_2x(vcvtps2udq, Vcvtps2udq, Vec, Vec) // AVX512_F{kz|b32}
@@ -2232,8 +2358,8 @@ public:
ASMJIT_INST_3x(vcvtusi2sd, Vcvtusi2sd, Xmm, Xmm, Mem) // AVX512_F{er}
ASMJIT_INST_3x(vcvtusi2ss, Vcvtusi2ss, Xmm, Xmm, Gp) // AVX512_F{er}
ASMJIT_INST_3x(vcvtusi2ss, Vcvtusi2ss, Xmm, Xmm, Mem) // AVX512_F{er}
- ASMJIT_INST_4i(vdbpsadbw, Vdbpsadbw, Vec, Vec, Vec, Imm) // AVX512_BW{kz}
- ASMJIT_INST_4i(vdbpsadbw, Vdbpsadbw, Vec, Vec, Mem, Imm) // AVX512_BW{kz}
+ ASMJIT_INST_4x(vdbpsadbw, Vdbpsadbw, Vec, Vec, Vec, Imm) // AVX512_BW{kz}
+ ASMJIT_INST_4x(vdbpsadbw, Vdbpsadbw, Vec, Vec, Mem, Imm) // AVX512_BW{kz}
ASMJIT_INST_3x(vdivpd, Vdivpd, Vec, Vec, Vec) // AVX AVX512_F{kz|b64}
ASMJIT_INST_3x(vdivpd, Vdivpd, Vec, Vec, Mem) // AVX AVX512_F{kz|b64}
ASMJIT_INST_3x(vdivps, Vdivps, Vec, Vec, Vec) // AVX AVX512_F{kz|b32}
@@ -2244,10 +2370,10 @@ public:
ASMJIT_INST_3x(vdivss, Vdivss, Xmm, Xmm, Mem) // AVX AVX512_F{kz|er}
ASMJIT_INST_3x(vdpbf16ps, Vdpbf16ps, Vec, Vec, Vec) // AVX512_BF16{kz|b32}
ASMJIT_INST_3x(vdpbf16ps, Vdpbf16ps, Vec, Vec, Mem) // AVX512_BF16{kz|b32}
- ASMJIT_INST_4i(vdppd, Vdppd, Vec, Vec, Vec, Imm) // AVX
- ASMJIT_INST_4i(vdppd, Vdppd, Vec, Vec, Mem, Imm) // AVX
- ASMJIT_INST_4i(vdpps, Vdpps, Vec, Vec, Vec, Imm) // AVX
- ASMJIT_INST_4i(vdpps, Vdpps, Vec, Vec, Mem, Imm) // AVX
+ ASMJIT_INST_4x(vdppd, Vdppd, Vec, Vec, Vec, Imm) // AVX
+ ASMJIT_INST_4x(vdppd, Vdppd, Vec, Vec, Mem, Imm) // AVX
+ ASMJIT_INST_4x(vdpps, Vdpps, Vec, Vec, Vec, Imm) // AVX
+ ASMJIT_INST_4x(vdpps, Vdpps, Vec, Vec, Mem, Imm) // AVX
ASMJIT_INST_2x(vexp2pd, Vexp2pd, Vec, Vec) // AVX512_ER{kz|sae|b64}
ASMJIT_INST_2x(vexp2pd, Vexp2pd, Vec, Mem) // AVX512_ER{kz|sae|b64}
ASMJIT_INST_2x(vexp2ps, Vexp2ps, Vec, Vec) // AVX512_ER{kz|sae|b32}
@@ -2256,36 +2382,36 @@ public:
ASMJIT_INST_2x(vexpandpd, Vexpandpd, Vec, Mem) // AVX512_F{kz}
ASMJIT_INST_2x(vexpandps, Vexpandps, Vec, Vec) // AVX512_F{kz}
ASMJIT_INST_2x(vexpandps, Vexpandps, Vec, Mem) // AVX512_F{kz}
- ASMJIT_INST_3i(vextractf128, Vextractf128, Vec, Vec, Imm) // AVX
- ASMJIT_INST_3i(vextractf128, Vextractf128, Mem, Vec, Imm) // AVX
- ASMJIT_INST_3i(vextractf32x4, Vextractf32x4, Vec, Vec, Imm) // AVX512_F{kz}
- ASMJIT_INST_3i(vextractf32x4, Vextractf32x4, Mem, Vec, Imm) // AVX512_F{kz}
- ASMJIT_INST_3i(vextractf32x8, Vextractf32x8, Vec, Vec, Imm) // AVX512_DQ{kz}
- ASMJIT_INST_3i(vextractf32x8, Vextractf32x8, Mem, Vec, Imm) // AVX512_DQ{kz}
- ASMJIT_INST_3i(vextractf64x2, Vextractf64x2, Vec, Vec, Imm) // AVX512_DQ{kz}
- ASMJIT_INST_3i(vextractf64x2, Vextractf64x2, Mem, Vec, Imm) // AVX512_DQ{kz}
- ASMJIT_INST_3i(vextractf64x4, Vextractf64x4, Vec, Vec, Imm) // AVX512_F{kz}
- ASMJIT_INST_3i(vextractf64x4, Vextractf64x4, Mem, Vec, Imm) // AVX512_F{kz}
- ASMJIT_INST_3i(vextracti128, Vextracti128, Vec, Vec, Imm) // AVX2
- ASMJIT_INST_3i(vextracti128, Vextracti128, Mem, Vec, Imm) // AVX2
- ASMJIT_INST_3i(vextracti32x4, Vextracti32x4, Vec, Vec, Imm) // AVX512_F{kz}
- ASMJIT_INST_3i(vextracti32x4, Vextracti32x4, Mem, Vec, Imm) // AVX512_F{kz}
- ASMJIT_INST_3i(vextracti32x8, Vextracti32x8, Vec, Vec, Imm) // AVX512_DQ{kz}
- ASMJIT_INST_3i(vextracti32x8, Vextracti32x8, Mem, Vec, Imm) // AVX512_DQ{kz}
- ASMJIT_INST_3i(vextracti64x2, Vextracti64x2, Vec, Vec, Imm) // AVX512_DQ{kz}
- ASMJIT_INST_3i(vextracti64x2, Vextracti64x2, Mem, Vec, Imm) // AVX512_DQ{kz}
- ASMJIT_INST_3i(vextracti64x4, Vextracti64x4, Vec, Vec, Imm) // AVX512_F{kz}
- ASMJIT_INST_3i(vextracti64x4, Vextracti64x4, Mem, Vec, Imm) // AVX512_F{kz}
- ASMJIT_INST_3i(vextractps, Vextractps, Gp, Xmm, Imm) // AVX AVX512_F
- ASMJIT_INST_3i(vextractps, Vextractps, Mem, Xmm, Imm) // AVX AVX512_F
- ASMJIT_INST_4i(vfixupimmpd, Vfixupimmpd, Vec, Vec, Vec, Imm) // AVX512_F{kz|b64}
- ASMJIT_INST_4i(vfixupimmpd, Vfixupimmpd, Vec, Vec, Mem, Imm) // AVX512_F{kz|b64}
- ASMJIT_INST_4i(vfixupimmps, Vfixupimmps, Vec, Vec, Vec, Imm) // AVX512_F{kz|b32}
- ASMJIT_INST_4i(vfixupimmps, Vfixupimmps, Vec, Vec, Mem, Imm) // AVX512_F{kz|b32}
- ASMJIT_INST_4i(vfixupimmsd, Vfixupimmsd, Xmm, Xmm, Xmm, Imm) // AVX512_F{kz|sae}
- ASMJIT_INST_4i(vfixupimmsd, Vfixupimmsd, Xmm, Xmm, Mem, Imm) // AVX512_F{kz|sae}
- ASMJIT_INST_4i(vfixupimmss, Vfixupimmss, Xmm, Xmm, Xmm, Imm) // AVX512_F{kz|sae}
- ASMJIT_INST_4i(vfixupimmss, Vfixupimmss, Xmm, Xmm, Mem, Imm) // AVX512_F{kz|sae}
+ ASMJIT_INST_3x(vextractf128, Vextractf128, Vec, Vec, Imm) // AVX
+ ASMJIT_INST_3x(vextractf128, Vextractf128, Mem, Vec, Imm) // AVX
+ ASMJIT_INST_3x(vextractf32x4, Vextractf32x4, Vec, Vec, Imm) // AVX512_F{kz}
+ ASMJIT_INST_3x(vextractf32x4, Vextractf32x4, Mem, Vec, Imm) // AVX512_F{kz}
+ ASMJIT_INST_3x(vextractf32x8, Vextractf32x8, Vec, Vec, Imm) // AVX512_DQ{kz}
+ ASMJIT_INST_3x(vextractf32x8, Vextractf32x8, Mem, Vec, Imm) // AVX512_DQ{kz}
+ ASMJIT_INST_3x(vextractf64x2, Vextractf64x2, Vec, Vec, Imm) // AVX512_DQ{kz}
+ ASMJIT_INST_3x(vextractf64x2, Vextractf64x2, Mem, Vec, Imm) // AVX512_DQ{kz}
+ ASMJIT_INST_3x(vextractf64x4, Vextractf64x4, Vec, Vec, Imm) // AVX512_F{kz}
+ ASMJIT_INST_3x(vextractf64x4, Vextractf64x4, Mem, Vec, Imm) // AVX512_F{kz}
+ ASMJIT_INST_3x(vextracti128, Vextracti128, Vec, Vec, Imm) // AVX2
+ ASMJIT_INST_3x(vextracti128, Vextracti128, Mem, Vec, Imm) // AVX2
+ ASMJIT_INST_3x(vextracti32x4, Vextracti32x4, Vec, Vec, Imm) // AVX512_F{kz}
+ ASMJIT_INST_3x(vextracti32x4, Vextracti32x4, Mem, Vec, Imm) // AVX512_F{kz}
+ ASMJIT_INST_3x(vextracti32x8, Vextracti32x8, Vec, Vec, Imm) // AVX512_DQ{kz}
+ ASMJIT_INST_3x(vextracti32x8, Vextracti32x8, Mem, Vec, Imm) // AVX512_DQ{kz}
+ ASMJIT_INST_3x(vextracti64x2, Vextracti64x2, Vec, Vec, Imm) // AVX512_DQ{kz}
+ ASMJIT_INST_3x(vextracti64x2, Vextracti64x2, Mem, Vec, Imm) // AVX512_DQ{kz}
+ ASMJIT_INST_3x(vextracti64x4, Vextracti64x4, Vec, Vec, Imm) // AVX512_F{kz}
+ ASMJIT_INST_3x(vextracti64x4, Vextracti64x4, Mem, Vec, Imm) // AVX512_F{kz}
+ ASMJIT_INST_3x(vextractps, Vextractps, Gp, Xmm, Imm) // AVX AVX512_F
+ ASMJIT_INST_3x(vextractps, Vextractps, Mem, Xmm, Imm) // AVX AVX512_F
+ ASMJIT_INST_4x(vfixupimmpd, Vfixupimmpd, Vec, Vec, Vec, Imm) // AVX512_F{kz|b64}
+ ASMJIT_INST_4x(vfixupimmpd, Vfixupimmpd, Vec, Vec, Mem, Imm) // AVX512_F{kz|b64}
+ ASMJIT_INST_4x(vfixupimmps, Vfixupimmps, Vec, Vec, Vec, Imm) // AVX512_F{kz|b32}
+ ASMJIT_INST_4x(vfixupimmps, Vfixupimmps, Vec, Vec, Mem, Imm) // AVX512_F{kz|b32}
+ ASMJIT_INST_4x(vfixupimmsd, Vfixupimmsd, Xmm, Xmm, Xmm, Imm) // AVX512_F{kz|sae}
+ ASMJIT_INST_4x(vfixupimmsd, Vfixupimmsd, Xmm, Xmm, Mem, Imm) // AVX512_F{kz|sae}
+ ASMJIT_INST_4x(vfixupimmss, Vfixupimmss, Xmm, Xmm, Xmm, Imm) // AVX512_F{kz|sae}
+ ASMJIT_INST_4x(vfixupimmss, Vfixupimmss, Xmm, Xmm, Mem, Imm) // AVX512_F{kz|sae}
ASMJIT_INST_3x(vfmadd132pd, Vfmadd132pd, Vec, Vec, Vec) // FMA AVX512_F{kz|b64}
ASMJIT_INST_3x(vfmadd132pd, Vfmadd132pd, Vec, Vec, Mem) // FMA AVX512_F{kz|b64}
ASMJIT_INST_3x(vfmadd132ps, Vfmadd132ps, Vec, Vec, Vec) // FMA AVX512_F{kz|b32}
@@ -2406,14 +2532,14 @@ public:
ASMJIT_INST_3x(vfnmsub231sd, Vfnmsub231sd, Xmm, Xmm, Mem) // FMA AVX512_F{kz|er}
ASMJIT_INST_3x(vfnmsub231ss, Vfnmsub231ss, Xmm, Xmm, Xmm) // FMA AVX512_F{kz|er}
ASMJIT_INST_3x(vfnmsub231ss, Vfnmsub231ss, Xmm, Xmm, Mem) // FMA AVX512_F{kz|er}
- ASMJIT_INST_3i(vfpclasspd, Vfpclasspd, KReg, Vec, Imm) // AVX512_DQ{k|b64}
- ASMJIT_INST_3i(vfpclasspd, Vfpclasspd, KReg, Mem, Imm) // AVX512_DQ{k|b64}
- ASMJIT_INST_3i(vfpclassps, Vfpclassps, KReg, Vec, Imm) // AVX512_DQ{k|b32}
- ASMJIT_INST_3i(vfpclassps, Vfpclassps, KReg, Mem, Imm) // AVX512_DQ{k|b32}
- ASMJIT_INST_3i(vfpclasssd, Vfpclasssd, KReg, Xmm, Imm) // AVX512_DQ{k}
- ASMJIT_INST_3i(vfpclasssd, Vfpclasssd, KReg, Mem, Imm) // AVX512_DQ{k}
- ASMJIT_INST_3i(vfpclassss, Vfpclassss, KReg, Xmm, Imm) // AVX512_DQ{k}
- ASMJIT_INST_3i(vfpclassss, Vfpclassss, KReg, Mem, Imm) // AVX512_DQ{k}
+ ASMJIT_INST_3x(vfpclasspd, Vfpclasspd, KReg, Vec, Imm) // AVX512_DQ{k|b64}
+ ASMJIT_INST_3x(vfpclasspd, Vfpclasspd, KReg, Mem, Imm) // AVX512_DQ{k|b64}
+ ASMJIT_INST_3x(vfpclassps, Vfpclassps, KReg, Vec, Imm) // AVX512_DQ{k|b32}
+ ASMJIT_INST_3x(vfpclassps, Vfpclassps, KReg, Mem, Imm) // AVX512_DQ{k|b32}
+ ASMJIT_INST_3x(vfpclasssd, Vfpclasssd, KReg, Xmm, Imm) // AVX512_DQ{k}
+ ASMJIT_INST_3x(vfpclasssd, Vfpclasssd, KReg, Mem, Imm) // AVX512_DQ{k}
+ ASMJIT_INST_3x(vfpclassss, Vfpclassss, KReg, Xmm, Imm) // AVX512_DQ{k}
+ ASMJIT_INST_3x(vfpclassss, Vfpclassss, KReg, Mem, Imm) // AVX512_DQ{k}
ASMJIT_INST_2x(vgatherdpd, Vgatherdpd, Vec, Mem) // AVX512_F{k}
ASMJIT_INST_3x(vgatherdpd, Vgatherdpd, Vec, Mem, Vec) // AVX2
ASMJIT_INST_2x(vgatherdps, Vgatherdps, Vec, Mem) // AVX512_F{k}
@@ -2438,18 +2564,18 @@ public:
ASMJIT_INST_3x(vgetexpsd, Vgetexpsd, Xmm, Xmm, Mem) // AVX512_F{kz|sae}
ASMJIT_INST_3x(vgetexpss, Vgetexpss, Xmm, Xmm, Xmm) // AVX512_F{kz|sae}
ASMJIT_INST_3x(vgetexpss, Vgetexpss, Xmm, Xmm, Mem) // AVX512_F{kz|sae}
- ASMJIT_INST_3i(vgetmantpd, Vgetmantpd, Vec, Vec, Imm) // AVX512_F{kz|b64}
- ASMJIT_INST_3i(vgetmantpd, Vgetmantpd, Vec, Mem, Imm) // AVX512_F{kz|b64}
- ASMJIT_INST_3i(vgetmantps, Vgetmantps, Vec, Vec, Imm) // AVX512_F{kz|b32}
- ASMJIT_INST_3i(vgetmantps, Vgetmantps, Vec, Mem, Imm) // AVX512_F{kz|b32}
- ASMJIT_INST_4i(vgetmantsd, Vgetmantsd, Xmm, Xmm, Xmm, Imm) // AVX512_F{kz|sae}
- ASMJIT_INST_4i(vgetmantsd, Vgetmantsd, Xmm, Xmm, Mem, Imm) // AVX512_F{kz|sae}
- ASMJIT_INST_4i(vgetmantss, Vgetmantss, Xmm, Xmm, Xmm, Imm) // AVX512_F{kz|sae}
- ASMJIT_INST_4i(vgetmantss, Vgetmantss, Xmm, Xmm, Mem, Imm) // AVX512_F{kz|sae}
- ASMJIT_INST_4i(vgf2p8affineinvqb, Vgf2p8affineinvqb,Vec,Vec,Vec,Imm) // AVX AVX512_VL{kz} GFNI
- ASMJIT_INST_4i(vgf2p8affineinvqb, Vgf2p8affineinvqb,Vec,Vec,Mem,Imm) // AVX AVX512_VL{kz} GFNI
- ASMJIT_INST_4i(vgf2p8affineqb, Vgf2p8affineqb, Vec, Vec, Vec, Imm) // AVX AVX512_VL{kz} GFNI
- ASMJIT_INST_4i(vgf2p8affineqb, Vgf2p8affineqb, Vec, Vec, Mem, Imm) // AVX AVX512_VL{kz} GFNI
+ ASMJIT_INST_3x(vgetmantpd, Vgetmantpd, Vec, Vec, Imm) // AVX512_F{kz|b64}
+ ASMJIT_INST_3x(vgetmantpd, Vgetmantpd, Vec, Mem, Imm) // AVX512_F{kz|b64}
+ ASMJIT_INST_3x(vgetmantps, Vgetmantps, Vec, Vec, Imm) // AVX512_F{kz|b32}
+ ASMJIT_INST_3x(vgetmantps, Vgetmantps, Vec, Mem, Imm) // AVX512_F{kz|b32}
+ ASMJIT_INST_4x(vgetmantsd, Vgetmantsd, Xmm, Xmm, Xmm, Imm) // AVX512_F{kz|sae}
+ ASMJIT_INST_4x(vgetmantsd, Vgetmantsd, Xmm, Xmm, Mem, Imm) // AVX512_F{kz|sae}
+ ASMJIT_INST_4x(vgetmantss, Vgetmantss, Xmm, Xmm, Xmm, Imm) // AVX512_F{kz|sae}
+ ASMJIT_INST_4x(vgetmantss, Vgetmantss, Xmm, Xmm, Mem, Imm) // AVX512_F{kz|sae}
+ ASMJIT_INST_4x(vgf2p8affineinvqb, Vgf2p8affineinvqb,Vec,Vec,Vec,Imm) // AVX AVX512_VL{kz} GFNI
+ ASMJIT_INST_4x(vgf2p8affineinvqb, Vgf2p8affineinvqb,Vec,Vec,Mem,Imm) // AVX AVX512_VL{kz} GFNI
+ ASMJIT_INST_4x(vgf2p8affineqb, Vgf2p8affineqb, Vec, Vec, Vec, Imm) // AVX AVX512_VL{kz} GFNI
+ ASMJIT_INST_4x(vgf2p8affineqb, Vgf2p8affineqb, Vec, Vec, Mem, Imm) // AVX AVX512_VL{kz} GFNI
ASMJIT_INST_3x(vgf2p8mulb, Vgf2p8mulb, Vec, Vec, Vec) // AVX AVX512_VL{kz} GFNI
ASMJIT_INST_3x(vgf2p8mulb, Vgf2p8mulb, Vec, Vec, Mem) // AVX AVX512_VL{kz} GFNI
ASMJIT_INST_3x(vhaddpd, Vhaddpd, Vec, Vec, Vec) // AVX
@@ -2460,28 +2586,28 @@ public:
ASMJIT_INST_3x(vhsubpd, Vhsubpd, Vec, Vec, Mem) // AVX
ASMJIT_INST_3x(vhsubps, Vhsubps, Vec, Vec, Vec) // AVX
ASMJIT_INST_3x(vhsubps, Vhsubps, Vec, Vec, Mem) // AVX
- ASMJIT_INST_4i(vinsertf128, Vinsertf128, Vec, Vec, Vec, Imm) // AVX
- ASMJIT_INST_4i(vinsertf128, Vinsertf128, Vec, Vec, Mem, Imm) // AVX
- ASMJIT_INST_4i(vinsertf32x4, Vinsertf32x4, Vec, Vec, Vec, Imm) // AVX512_F{kz}
- ASMJIT_INST_4i(vinsertf32x4, Vinsertf32x4, Vec, Vec, Mem, Imm) // AVX512_F{kz}
- ASMJIT_INST_4i(vinsertf32x8, Vinsertf32x8, Vec, Vec, Vec, Imm) // AVX512_DQ{kz}
- ASMJIT_INST_4i(vinsertf32x8, Vinsertf32x8, Vec, Vec, Mem, Imm) // AVX512_DQ{kz}
- ASMJIT_INST_4i(vinsertf64x2, Vinsertf64x2, Vec, Vec, Vec, Imm) // AVX512_DQ{kz}
- ASMJIT_INST_4i(vinsertf64x2, Vinsertf64x2, Vec, Vec, Mem, Imm) // AVX512_DQ{kz}
- ASMJIT_INST_4i(vinsertf64x4, Vinsertf64x4, Vec, Vec, Vec, Imm) // AVX512_F{kz}
- ASMJIT_INST_4i(vinsertf64x4, Vinsertf64x4, Vec, Vec, Mem, Imm) // AVX512_F{kz}
- ASMJIT_INST_4i(vinserti128, Vinserti128, Vec, Vec, Vec, Imm) // AVX2
- ASMJIT_INST_4i(vinserti128, Vinserti128, Vec, Vec, Mem, Imm) // AVX2
- ASMJIT_INST_4i(vinserti32x4, Vinserti32x4, Vec, Vec, Vec, Imm) // AVX512_F{kz}
- ASMJIT_INST_4i(vinserti32x4, Vinserti32x4, Vec, Vec, Mem, Imm) // AVX512_F{kz}
- ASMJIT_INST_4i(vinserti32x8, Vinserti32x8, Vec, Vec, Vec, Imm) // AVX512_DQ{kz}
- ASMJIT_INST_4i(vinserti32x8, Vinserti32x8, Vec, Vec, Mem, Imm) // AVX512_DQ{kz}
- ASMJIT_INST_4i(vinserti64x2, Vinserti64x2, Vec, Vec, Vec, Imm) // AVX512_DQ{kz}
- ASMJIT_INST_4i(vinserti64x2, Vinserti64x2, Vec, Vec, Mem, Imm) // AVX512_DQ{kz}
- ASMJIT_INST_4i(vinserti64x4, Vinserti64x4, Vec, Vec, Vec, Imm) // AVX512_F{kz}
- ASMJIT_INST_4i(vinserti64x4, Vinserti64x4, Vec, Vec, Mem, Imm) // AVX512_F{kz}
- ASMJIT_INST_4i(vinsertps, Vinsertps, Xmm, Xmm, Xmm, Imm) // AVX AVX512_F
- ASMJIT_INST_4i(vinsertps, Vinsertps, Xmm, Xmm, Mem, Imm) // AVX AVX512_F
+ ASMJIT_INST_4x(vinsertf128, Vinsertf128, Vec, Vec, Vec, Imm) // AVX
+ ASMJIT_INST_4x(vinsertf128, Vinsertf128, Vec, Vec, Mem, Imm) // AVX
+ ASMJIT_INST_4x(vinsertf32x4, Vinsertf32x4, Vec, Vec, Vec, Imm) // AVX512_F{kz}
+ ASMJIT_INST_4x(vinsertf32x4, Vinsertf32x4, Vec, Vec, Mem, Imm) // AVX512_F{kz}
+ ASMJIT_INST_4x(vinsertf32x8, Vinsertf32x8, Vec, Vec, Vec, Imm) // AVX512_DQ{kz}
+ ASMJIT_INST_4x(vinsertf32x8, Vinsertf32x8, Vec, Vec, Mem, Imm) // AVX512_DQ{kz}
+ ASMJIT_INST_4x(vinsertf64x2, Vinsertf64x2, Vec, Vec, Vec, Imm) // AVX512_DQ{kz}
+ ASMJIT_INST_4x(vinsertf64x2, Vinsertf64x2, Vec, Vec, Mem, Imm) // AVX512_DQ{kz}
+ ASMJIT_INST_4x(vinsertf64x4, Vinsertf64x4, Vec, Vec, Vec, Imm) // AVX512_F{kz}
+ ASMJIT_INST_4x(vinsertf64x4, Vinsertf64x4, Vec, Vec, Mem, Imm) // AVX512_F{kz}
+ ASMJIT_INST_4x(vinserti128, Vinserti128, Vec, Vec, Vec, Imm) // AVX2
+ ASMJIT_INST_4x(vinserti128, Vinserti128, Vec, Vec, Mem, Imm) // AVX2
+ ASMJIT_INST_4x(vinserti32x4, Vinserti32x4, Vec, Vec, Vec, Imm) // AVX512_F{kz}
+ ASMJIT_INST_4x(vinserti32x4, Vinserti32x4, Vec, Vec, Mem, Imm) // AVX512_F{kz}
+ ASMJIT_INST_4x(vinserti32x8, Vinserti32x8, Vec, Vec, Vec, Imm) // AVX512_DQ{kz}
+ ASMJIT_INST_4x(vinserti32x8, Vinserti32x8, Vec, Vec, Mem, Imm) // AVX512_DQ{kz}
+ ASMJIT_INST_4x(vinserti64x2, Vinserti64x2, Vec, Vec, Vec, Imm) // AVX512_DQ{kz}
+ ASMJIT_INST_4x(vinserti64x2, Vinserti64x2, Vec, Vec, Mem, Imm) // AVX512_DQ{kz}
+ ASMJIT_INST_4x(vinserti64x4, Vinserti64x4, Vec, Vec, Vec, Imm) // AVX512_F{kz}
+ ASMJIT_INST_4x(vinserti64x4, Vinserti64x4, Vec, Vec, Mem, Imm) // AVX512_F{kz}
+ ASMJIT_INST_4x(vinsertps, Vinsertps, Xmm, Xmm, Xmm, Imm) // AVX AVX512_F
+ ASMJIT_INST_4x(vinsertps, Vinsertps, Xmm, Xmm, Mem, Imm) // AVX AVX512_F
ASMJIT_INST_2x(vlddqu, Vlddqu, Vec, Mem) // AVX
ASMJIT_INST_1x(vldmxcsr, Vldmxcsr, Mem) // AVX
ASMJIT_INST_3x(vmaskmovdqu, Vmaskmovdqu, Vec, Vec, DS_ZDI) // AVX [EXPLICIT]
@@ -2578,8 +2704,8 @@ public:
ASMJIT_INST_2x(vmovups, Vmovups, Vec, Vec) // AVX AVX512_F{kz}
ASMJIT_INST_2x(vmovups, Vmovups, Vec, Mem) // AVX AVX512_F{kz}
ASMJIT_INST_2x(vmovups, Vmovups, Mem, Vec) // AVX AVX512_F{kz}
- ASMJIT_INST_4i(vmpsadbw, Vmpsadbw, Vec, Vec, Vec, Imm) // AVX+
- ASMJIT_INST_4i(vmpsadbw, Vmpsadbw, Vec, Vec, Mem, Imm) // AVX+
+ ASMJIT_INST_4x(vmpsadbw, Vmpsadbw, Vec, Vec, Vec, Imm) // AVX+
+ ASMJIT_INST_4x(vmpsadbw, Vmpsadbw, Vec, Vec, Mem, Imm) // AVX+
ASMJIT_INST_3x(vmulpd, Vmulpd, Vec, Vec, Vec) // AVX AVX512_F{kz|b64}
ASMJIT_INST_3x(vmulpd, Vmulpd, Vec, Vec, Mem) // AVX AVX512_F{kz|b64}
ASMJIT_INST_3x(vmulps, Vmulps, Vec, Vec, Vec) // AVX AVX512_F{kz|b32}
@@ -2592,8 +2718,12 @@ public:
ASMJIT_INST_3x(vorpd, Vorpd, Vec, Vec, Mem) // AVX AVX512_DQ{kz|b64}
ASMJIT_INST_3x(vorps, Vorps, Vec, Vec, Vec) // AVX AVX512_F{kz|b32}
ASMJIT_INST_3x(vorps, Vorps, Vec, Vec, Mem) // AVX AVX512_F{kz|b32}
- ASMJIT_INST_6x(vp4dpwssd, Vp4dpwssd, Zmm, Zmm, Zmm, Zmm, Zmm, Mem) // AVX512_4FMAPS{kz}
- ASMJIT_INST_6x(vp4dpwssds, Vp4dpwssds, Zmm, Zmm, Zmm, Zmm, Zmm, Mem) // AVX512_4FMAPS{kz}
+ ASMJIT_INST_4x(vp2intersectd, Vp2intersectd, KReg, KReg, Vec, Vec) // AVX512_VP2INTERSECT{kz}
+ ASMJIT_INST_4x(vp2intersectd, Vp2intersectd, KReg, KReg, Vec, Mem) // AVX512_VP2INTERSECT{kz}
+ ASMJIT_INST_4x(vp2intersectq, Vp2intersectq, KReg, KReg, Vec, Vec) // AVX512_VP2INTERSECT{kz}
+ ASMJIT_INST_4x(vp2intersectq, Vp2intersectq, KReg, KReg, Vec, Mem) // AVX512_VP2INTERSECT{kz}
+ ASMJIT_INST_6x(vp4dpwssd, Vp4dpwssd, Zmm, Zmm, Zmm, Zmm, Zmm, Mem) // AVX512_4FMAPS{kz}
+ ASMJIT_INST_6x(vp4dpwssds, Vp4dpwssds, Zmm, Zmm, Zmm, Zmm, Zmm, Mem) // AVX512_4FMAPS{kz}
ASMJIT_INST_2x(vpabsb, Vpabsb, Vec, Vec) // AVX+ AVX512_BW{kz}
ASMJIT_INST_2x(vpabsb, Vpabsb, Vec, Mem) // AVX+ AVX512_BW{kz}
ASMJIT_INST_2x(vpabsd, Vpabsd, Vec, Vec) // AVX+ AVX512_F{kz}
@@ -2626,8 +2756,8 @@ public:
ASMJIT_INST_3x(vpaddusw, Vpaddusw, Vec, Vec, Mem) // AVX+ AVX512_BW{kz}
ASMJIT_INST_3x(vpaddw, Vpaddw, Vec, Vec, Vec) // AVX+ AVX512_BW{kz}
ASMJIT_INST_3x(vpaddw, Vpaddw, Vec, Vec, Mem) // AVX+ AVX512_BW{kz}
- ASMJIT_INST_4i(vpalignr, Vpalignr, Vec, Vec, Vec, Imm) // AVX+ AVX512_BW{kz}
- ASMJIT_INST_4i(vpalignr, Vpalignr, Vec, Vec, Mem, Imm) // AVX+ AVX512_BW{kz}
+ ASMJIT_INST_4x(vpalignr, Vpalignr, Vec, Vec, Vec, Imm) // AVX+ AVX512_BW{kz}
+ ASMJIT_INST_4x(vpalignr, Vpalignr, Vec, Vec, Mem, Imm) // AVX+ AVX512_BW{kz}
ASMJIT_INST_3x(vpand, Vpand, Vec, Vec, Vec) // AVX+
ASMJIT_INST_3x(vpand, Vpand, Vec, Vec, Mem) // AVX+
ASMJIT_INST_3x(vpandd, Vpandd, Vec, Vec, Vec) // AVX512_F{kz|b32}
@@ -2644,32 +2774,40 @@ public:
ASMJIT_INST_3x(vpavgb, Vpavgb, Vec, Vec, Mem) // AVX+ AVX512_BW{kz}
ASMJIT_INST_3x(vpavgw, Vpavgw, Vec, Vec, Vec) // AVX+ AVX512_BW{kz}
ASMJIT_INST_3x(vpavgw, Vpavgw, Vec, Vec, Mem) // AVX+ AVX512_BW{kz}
- ASMJIT_INST_4i(vpblendd, Vpblendd, Vec, Vec, Vec, Imm) // AVX2
- ASMJIT_INST_4i(vpblendd, Vpblendd, Vec, Vec, Mem, Imm) // AVX2
+ ASMJIT_INST_4x(vpblendd, Vpblendd, Vec, Vec, Vec, Imm) // AVX2
+ ASMJIT_INST_4x(vpblendd, Vpblendd, Vec, Vec, Mem, Imm) // AVX2
+ ASMJIT_INST_3x(vpblendmb, Vpblendmb, Vec, Vec, Vec) // AVX512_BW{kz}
+ ASMJIT_INST_3x(vpblendmb, Vpblendmb, Vec, Vec, Mem) // AVX512_BW{kz}
+ ASMJIT_INST_3x(vpblendmd, Vpblendmd, Vec, Vec, Vec) // AVX512_F{kz|b32}
+ ASMJIT_INST_3x(vpblendmd, Vpblendmd, Vec, Vec, Mem) // AVX512_F{kz|b32}
+ ASMJIT_INST_3x(vpblendmq, Vpblendmq, Vec, Vec, Vec) // AVX512_F{kz|b64}
+ ASMJIT_INST_3x(vpblendmq, Vpblendmq, Vec, Vec, Mem) // AVX512_F{kz|b64}
+ ASMJIT_INST_3x(vpblendmw, Vpblendmw, Vec, Vec, Vec) // AVX512_BW{kz}
+ ASMJIT_INST_3x(vpblendmw, Vpblendmw, Vec, Vec, Mem) // AVX512_BW{kz}
ASMJIT_INST_4x(vpblendvb, Vpblendvb, Vec, Vec, Vec, Vec) // AVX+
ASMJIT_INST_4x(vpblendvb, Vpblendvb, Vec, Vec, Mem, Vec) // AVX+
- ASMJIT_INST_4i(vpblendw, Vpblendw, Vec, Vec, Vec, Imm) // AVX+
- ASMJIT_INST_4i(vpblendw, Vpblendw, Vec, Vec, Mem, Imm) // AVX+
+ ASMJIT_INST_4x(vpblendw, Vpblendw, Vec, Vec, Vec, Imm) // AVX+
+ ASMJIT_INST_4x(vpblendw, Vpblendw, Vec, Vec, Mem, Imm) // AVX+
ASMJIT_INST_2x(vpbroadcastb, Vpbroadcastb, Vec, Vec) // AVX2 AVX512_BW{kz}
ASMJIT_INST_2x(vpbroadcastb, Vpbroadcastb, Vec, Mem) // AVX2 AVX512_BW{kz}
ASMJIT_INST_2x(vpbroadcastb, Vpbroadcastb, Vec, Gp) // AVX512_BW{kz}
ASMJIT_INST_2x(vpbroadcastd, Vpbroadcastd, Vec, Vec) // AVX2 AVX512_F{kz}
ASMJIT_INST_2x(vpbroadcastd, Vpbroadcastd, Vec, Mem) // AVX2 AVX512_F{kz}
ASMJIT_INST_2x(vpbroadcastd, Vpbroadcastd, Vec, Gp) // AVX512_F{kz}
- ASMJIT_INST_2x(vpbroadcastmb2d, Vpbroadcastmb2d, Vec, KReg) // AVX512_CD
ASMJIT_INST_2x(vpbroadcastmb2q, Vpbroadcastmb2q, Vec, KReg) // AVX512_CD
+ ASMJIT_INST_2x(vpbroadcastmw2d, Vpbroadcastmw2d, Vec, KReg) // AVX512_CD
ASMJIT_INST_2x(vpbroadcastq, Vpbroadcastq, Vec, Vec) // AVX2 AVX512_F{kz}
ASMJIT_INST_2x(vpbroadcastq, Vpbroadcastq, Vec, Mem) // AVX2 AVX512_F{kz}
ASMJIT_INST_2x(vpbroadcastq, Vpbroadcastq, Vec, Gp) // AVX512_F{kz}
ASMJIT_INST_2x(vpbroadcastw, Vpbroadcastw, Vec, Vec) // AVX2 AVX512_BW{kz}
ASMJIT_INST_2x(vpbroadcastw, Vpbroadcastw, Vec, Mem) // AVX2 AVX512_BW{kz}
ASMJIT_INST_2x(vpbroadcastw, Vpbroadcastw, Vec, Gp) // AVX512_BW{kz}
- ASMJIT_INST_4i(vpclmulqdq, Vpclmulqdq, Vec, Vec, Vec, Imm) // AVX VPCLMULQDQ AVX512_F
- ASMJIT_INST_4i(vpclmulqdq, Vpclmulqdq, Vec, Vec, Mem, Imm) // AVX VPCLMULQDQ AVX512_F
- ASMJIT_INST_4i(vpcmpb, Vpcmpb, KReg, Vec, Vec, Imm) // AVX512_BW{k}
- ASMJIT_INST_4i(vpcmpb, Vpcmpb, KReg, Vec, Mem, Imm) // AVX512_BW{k}
- ASMJIT_INST_4i(vpcmpd, Vpcmpd, KReg, Vec, Vec, Imm) // AVX512_F{k|b32}
- ASMJIT_INST_4i(vpcmpd, Vpcmpd, KReg, Vec, Mem, Imm) // AVX512_F{k|b32}
+ ASMJIT_INST_4x(vpclmulqdq, Vpclmulqdq, Vec, Vec, Vec, Imm) // AVX VPCLMULQDQ AVX512_F
+ ASMJIT_INST_4x(vpclmulqdq, Vpclmulqdq, Vec, Vec, Mem, Imm) // AVX VPCLMULQDQ AVX512_F
+ ASMJIT_INST_4x(vpcmpb, Vpcmpb, KReg, Vec, Vec, Imm) // AVX512_BW{k}
+ ASMJIT_INST_4x(vpcmpb, Vpcmpb, KReg, Vec, Mem, Imm) // AVX512_BW{k}
+ ASMJIT_INST_4x(vpcmpd, Vpcmpd, KReg, Vec, Vec, Imm) // AVX512_F{k|b32}
+ ASMJIT_INST_4x(vpcmpd, Vpcmpd, KReg, Vec, Mem, Imm) // AVX512_F{k|b32}
ASMJIT_INST_3x(vpcmpeqb, Vpcmpeqb, Vec, Vec, Vec) // AVX+
ASMJIT_INST_3x(vpcmpeqb, Vpcmpeqb, Vec, Vec, Mem) // AVX+
ASMJIT_INST_3x(vpcmpeqb, Vpcmpeqb, KReg, Vec, Vec) // AVX512_BW{k}
@@ -2686,10 +2824,10 @@ public:
ASMJIT_INST_3x(vpcmpeqw, Vpcmpeqw, Vec, Vec, Mem) // AVX+
ASMJIT_INST_3x(vpcmpeqw, Vpcmpeqw, KReg, Vec, Vec) // AVX512_BW{k}
ASMJIT_INST_3x(vpcmpeqw, Vpcmpeqw, KReg, Vec, Mem) // AVX512_BW{k}
- ASMJIT_INST_6x(vpcmpestri, Vpcmpestri, Vec, Vec, Imm, ECX, EAX, EDX) // AVX [EXPLICIT]
- ASMJIT_INST_6x(vpcmpestri, Vpcmpestri, Vec, Mem, Imm, ECX, EAX, EDX) // AVX [EXPLICIT]
- ASMJIT_INST_6x(vpcmpestrm, Vpcmpestrm, Vec, Vec, Imm, XMM0, EAX, EDX)// AVX [EXPLICIT]
- ASMJIT_INST_6x(vpcmpestrm, Vpcmpestrm, Vec, Mem, Imm, XMM0, EAX, EDX)// AVX [EXPLICIT]
+ ASMJIT_INST_6x(vpcmpestri, Vpcmpestri, Vec, Vec, Imm, Gp_ECX, Gp_EAX, Gp_EDX) // AVX [EXPLICIT]
+ ASMJIT_INST_6x(vpcmpestri, Vpcmpestri, Vec, Mem, Imm, Gp_ECX, Gp_EAX, Gp_EDX) // AVX [EXPLICIT]
+ ASMJIT_INST_6x(vpcmpestrm, Vpcmpestrm, Vec, Vec, Imm, XMM0, Gp_EAX, Gp_EDX) // AVX [EXPLICIT]
+ ASMJIT_INST_6x(vpcmpestrm, Vpcmpestrm, Vec, Mem, Imm, XMM0, Gp_EAX, Gp_EDX) // AVX [EXPLICIT]
ASMJIT_INST_3x(vpcmpgtb, Vpcmpgtb, Vec, Vec, Vec) // AVX+
ASMJIT_INST_3x(vpcmpgtb, Vpcmpgtb, Vec, Vec, Mem) // AVX+
ASMJIT_INST_3x(vpcmpgtb, Vpcmpgtb, KReg, Vec, Vec) // AVX512_BW{k}
@@ -2706,22 +2844,22 @@ public:
ASMJIT_INST_3x(vpcmpgtw, Vpcmpgtw, Vec, Vec, Mem) // AVX+
ASMJIT_INST_3x(vpcmpgtw, Vpcmpgtw, KReg, Vec, Vec) // AVX512_BW{k}
ASMJIT_INST_3x(vpcmpgtw, Vpcmpgtw, KReg, Vec, Mem) // AVX512_BW{k}
- ASMJIT_INST_4x(vpcmpistri, Vpcmpistri, Vec, Vec, Imm, ECX) // AVX [EXPLICIT]
- ASMJIT_INST_4x(vpcmpistri, Vpcmpistri, Vec, Mem, Imm, ECX) // AVX [EXPLICIT]
+ ASMJIT_INST_4x(vpcmpistri, Vpcmpistri, Vec, Vec, Imm, Gp_ECX) // AVX [EXPLICIT]
+ ASMJIT_INST_4x(vpcmpistri, Vpcmpistri, Vec, Mem, Imm, Gp_ECX) // AVX [EXPLICIT]
ASMJIT_INST_4x(vpcmpistrm, Vpcmpistrm, Vec, Vec, Imm, XMM0) // AVX [EXPLICIT]
ASMJIT_INST_4x(vpcmpistrm, Vpcmpistrm, Vec, Mem, Imm, XMM0) // AVX [EXPLICIT]
- ASMJIT_INST_4i(vpcmpq, Vpcmpq, KReg, Vec, Vec, Imm) // AVX512_F{k|b64}
- ASMJIT_INST_4i(vpcmpq, Vpcmpq, KReg, Vec, Mem, Imm) // AVX512_F{k|b64}
- ASMJIT_INST_4i(vpcmpub, Vpcmpub, KReg, Vec, Vec, Imm) // AVX512_BW{k}
- ASMJIT_INST_4i(vpcmpub, Vpcmpub, KReg, Vec, Mem, Imm) // AVX512_BW{k}
- ASMJIT_INST_4i(vpcmpud, Vpcmpud, KReg, Vec, Vec, Imm) // AVX512_F{k|b32}
- ASMJIT_INST_4i(vpcmpud, Vpcmpud, KReg, Vec, Mem, Imm) // AVX512_F{k|b32}
- ASMJIT_INST_4i(vpcmpuq, Vpcmpuq, KReg, Vec, Vec, Imm) // AVX512_F{k|b64}
- ASMJIT_INST_4i(vpcmpuq, Vpcmpuq, KReg, Vec, Mem, Imm) // AVX512_F{k|b64}
- ASMJIT_INST_4i(vpcmpuw, Vpcmpuw, KReg, Vec, Vec, Imm) // AVX512_BW{k|b64}
- ASMJIT_INST_4i(vpcmpuw, Vpcmpuw, KReg, Vec, Mem, Imm) // AVX512_BW{k|b64}
- ASMJIT_INST_4i(vpcmpw, Vpcmpw, KReg, Vec, Vec, Imm) // AVX512_BW{k|b64}
- ASMJIT_INST_4i(vpcmpw, Vpcmpw, KReg, Vec, Mem, Imm) // AVX512_BW{k|b64}
+ ASMJIT_INST_4x(vpcmpq, Vpcmpq, KReg, Vec, Vec, Imm) // AVX512_F{k|b64}
+ ASMJIT_INST_4x(vpcmpq, Vpcmpq, KReg, Vec, Mem, Imm) // AVX512_F{k|b64}
+ ASMJIT_INST_4x(vpcmpub, Vpcmpub, KReg, Vec, Vec, Imm) // AVX512_BW{k}
+ ASMJIT_INST_4x(vpcmpub, Vpcmpub, KReg, Vec, Mem, Imm) // AVX512_BW{k}
+ ASMJIT_INST_4x(vpcmpud, Vpcmpud, KReg, Vec, Vec, Imm) // AVX512_F{k|b32}
+ ASMJIT_INST_4x(vpcmpud, Vpcmpud, KReg, Vec, Mem, Imm) // AVX512_F{k|b32}
+ ASMJIT_INST_4x(vpcmpuq, Vpcmpuq, KReg, Vec, Vec, Imm) // AVX512_F{k|b64}
+ ASMJIT_INST_4x(vpcmpuq, Vpcmpuq, KReg, Vec, Mem, Imm) // AVX512_F{k|b64}
+ ASMJIT_INST_4x(vpcmpuw, Vpcmpuw, KReg, Vec, Vec, Imm) // AVX512_BW{k|b64}
+ ASMJIT_INST_4x(vpcmpuw, Vpcmpuw, KReg, Vec, Mem, Imm) // AVX512_BW{k|b64}
+ ASMJIT_INST_4x(vpcmpw, Vpcmpw, KReg, Vec, Vec, Imm) // AVX512_BW{k|b64}
+ ASMJIT_INST_4x(vpcmpw, Vpcmpw, KReg, Vec, Mem, Imm) // AVX512_BW{k|b64}
ASMJIT_INST_2x(vpcompressb, Vpcompressb, Vec, Vec) // AVX512_VBMI2{kz}
ASMJIT_INST_2x(vpcompressb, Vpcompressb, Mem, Vec) // AVX512_VBMI2{kz}
ASMJIT_INST_2x(vpcompressd, Vpcompressd, Vec, Vec) // AVX512_F{kz}
@@ -2734,18 +2872,18 @@ public:
ASMJIT_INST_2x(vpconflictd, Vpconflictd, Vec, Mem) // AVX512_CD{kz|b32}
ASMJIT_INST_2x(vpconflictq, Vpconflictq, Vec, Vec) // AVX512_CD{kz|b32}
ASMJIT_INST_2x(vpconflictq, Vpconflictq, Vec, Mem) // AVX512_CD{kz|b32}
- ASMJIT_INST_3x(vpdpbusd, Vpdpbusd, Vec, Vec, Vec) // AVX512_VNNI{kz|b32}
- ASMJIT_INST_3x(vpdpbusd, Vpdpbusd, Vec, Vec, Mem) // AVX512_VNNI{kz|b32}
- ASMJIT_INST_3x(vpdpbusds, Vpdpbusds, Vec, Vec, Vec) // AVX512_VNNI{kz|b32}
- ASMJIT_INST_3x(vpdpbusds, Vpdpbusds, Vec, Vec, Mem) // AVX512_VNNI{kz|b32}
- ASMJIT_INST_3x(vpdpwssd, Vpdpwssd, Vec, Vec, Vec) // AVX512_VNNI{kz|b32}
- ASMJIT_INST_3x(vpdpwssd, Vpdpwssd, Vec, Vec, Mem) // AVX512_VNNI{kz|b32}
- ASMJIT_INST_3x(vpdpwssds, Vpdpwssds, Vec, Vec, Vec) // AVX512_VNNI{kz|b32}
- ASMJIT_INST_3x(vpdpwssds, Vpdpwssds, Vec, Vec, Mem) // AVX512_VNNI{kz|b32}
- ASMJIT_INST_4i(vperm2f128, Vperm2f128, Vec, Vec, Vec, Imm) // AVX
- ASMJIT_INST_4i(vperm2f128, Vperm2f128, Vec, Vec, Mem, Imm) // AVX
- ASMJIT_INST_4i(vperm2i128, Vperm2i128, Vec, Vec, Vec, Imm) // AVX2
- ASMJIT_INST_4i(vperm2i128, Vperm2i128, Vec, Vec, Mem, Imm) // AVX2
+ ASMJIT_INST_3x(vpdpbusd, Vpdpbusd, Vec, Vec, Vec) // AVX_VNNI AVX512_VNNI{kz|b32}
+ ASMJIT_INST_3x(vpdpbusd, Vpdpbusd, Vec, Vec, Mem) // AVX_VNNI AVX512_VNNI{kz|b32}
+ ASMJIT_INST_3x(vpdpbusds, Vpdpbusds, Vec, Vec, Vec) // AVX_VNNI AVX512_VNNI{kz|b32}
+ ASMJIT_INST_3x(vpdpbusds, Vpdpbusds, Vec, Vec, Mem) // AVX_VNNI AVX512_VNNI{kz|b32}
+ ASMJIT_INST_3x(vpdpwssd, Vpdpwssd, Vec, Vec, Vec) // AVX_VNNI AVX512_VNNI{kz|b32}
+ ASMJIT_INST_3x(vpdpwssd, Vpdpwssd, Vec, Vec, Mem) // AVX_VNNI AVX512_VNNI{kz|b32}
+ ASMJIT_INST_3x(vpdpwssds, Vpdpwssds, Vec, Vec, Vec) // AVX_VNNI AVX512_VNNI{kz|b32}
+ ASMJIT_INST_3x(vpdpwssds, Vpdpwssds, Vec, Vec, Mem) // AVX_VNNI AVX512_VNNI{kz|b32}
+ ASMJIT_INST_4x(vperm2f128, Vperm2f128, Vec, Vec, Vec, Imm) // AVX
+ ASMJIT_INST_4x(vperm2f128, Vperm2f128, Vec, Vec, Mem, Imm) // AVX
+ ASMJIT_INST_4x(vperm2i128, Vperm2i128, Vec, Vec, Vec, Imm) // AVX2
+ ASMJIT_INST_4x(vperm2i128, Vperm2i128, Vec, Vec, Mem, Imm) // AVX2
ASMJIT_INST_3x(vpermb, Vpermb, Vec, Vec, Vec) // AVX512_VBMI{kz}
ASMJIT_INST_3x(vpermb, Vpermb, Vec, Vec, Mem) // AVX512_VBMI{kz}
ASMJIT_INST_3x(vpermd, Vpermd, Vec, Vec, Vec) // AVX2 AVX512_F{kz|b32}
@@ -2764,18 +2902,20 @@ public:
ASMJIT_INST_3x(vpermi2w, Vpermi2w, Vec, Vec, Mem) // AVX512_BW{kz}
ASMJIT_INST_3x(vpermilpd, Vpermilpd, Vec, Vec, Vec) // AVX AVX512_F{kz|b64}
ASMJIT_INST_3x(vpermilpd, Vpermilpd, Vec, Vec, Mem) // AVX AVX512_F{kz|b64}
- ASMJIT_INST_3i(vpermilpd, Vpermilpd, Vec, Vec, Imm) // AVX AVX512_F{kz|b64}
- ASMJIT_INST_3i(vpermilpd, Vpermilpd, Vec, Mem, Imm) // AVX AVX512_F{kz|b64}
+ ASMJIT_INST_3x(vpermilpd, Vpermilpd, Vec, Vec, Imm) // AVX AVX512_F{kz|b64}
+ ASMJIT_INST_3x(vpermilpd, Vpermilpd, Vec, Mem, Imm) // AVX AVX512_F{kz|b64}
ASMJIT_INST_3x(vpermilps, Vpermilps, Vec, Vec, Vec) // AVX AVX512_F{kz|b64}
ASMJIT_INST_3x(vpermilps, Vpermilps, Vec, Vec, Mem) // AVX AVX512_F{kz|b64}
- ASMJIT_INST_3i(vpermilps, Vpermilps, Vec, Vec, Imm) // AVX AVX512_F{kz|b64}
- ASMJIT_INST_3i(vpermilps, Vpermilps, Vec, Mem, Imm) // AVX AVX512_F{kz|b64}
- ASMJIT_INST_3i(vpermpd, Vpermpd, Vec, Vec, Imm) // AVX2
- ASMJIT_INST_3i(vpermpd, Vpermpd, Vec, Mem, Imm) // AVX2
- ASMJIT_INST_3x(vpermps, Vpermps, Vec, Vec, Vec) // AVX2
- ASMJIT_INST_3x(vpermps, Vpermps, Vec, Vec, Mem) // AVX2
- ASMJIT_INST_3i(vpermq, Vpermq, Vec, Vec, Imm) // AVX2 AVX512_F{kz|b64}
- ASMJIT_INST_3i(vpermq, Vpermq, Vec, Mem, Imm) // AVX2 AVX512_F{kz|b64}
+ ASMJIT_INST_3x(vpermilps, Vpermilps, Vec, Vec, Imm) // AVX AVX512_F{kz|b64}
+ ASMJIT_INST_3x(vpermilps, Vpermilps, Vec, Mem, Imm) // AVX AVX512_F{kz|b64}
+ ASMJIT_INST_3x(vpermpd, Vpermpd, Vec, Vec, Imm) // AVX2
+ ASMJIT_INST_3x(vpermpd, Vpermpd, Vec, Mem, Imm) // AVX2
+ ASMJIT_INST_3x(vpermpd, Vpermpd, Vec, Vec, Vec) // AVX512_F{kz|b64}
+ ASMJIT_INST_3x(vpermpd, Vpermpd, Vec, Vec, Mem) // AVX512_F{kz|b64}
+ ASMJIT_INST_3x(vpermps, Vpermps, Vec, Vec, Vec) // AVX2 AVX512_F{kz|b32}
+ ASMJIT_INST_3x(vpermps, Vpermps, Vec, Vec, Mem) // AVX2 AVX512_F{kz|b32}
+ ASMJIT_INST_3x(vpermq, Vpermq, Vec, Vec, Imm) // AVX2 AVX512_F{kz|b64}
+ ASMJIT_INST_3x(vpermq, Vpermq, Vec, Mem, Imm) // AVX2 AVX512_F{kz|b64}
ASMJIT_INST_3x(vpermq, Vpermq, Vec, Vec, Vec) // AVX512_F{kz|b64}
ASMJIT_INST_3x(vpermq, Vpermq, Vec, Vec, Mem) // AVX512_F{kz|b64}
ASMJIT_INST_3x(vpermt2b, Vpermt2b, Vec, Vec, Vec) // AVX512_VBMI{kz}
@@ -2800,14 +2940,14 @@ public:
ASMJIT_INST_2x(vpexpandq, Vpexpandq, Vec, Mem) // AVX512_F{kz}
ASMJIT_INST_2x(vpexpandw, Vpexpandw, Vec, Vec) // AVX512_VBMI2{kz}
ASMJIT_INST_2x(vpexpandw, Vpexpandw, Vec, Mem) // AVX512_VBMI2{kz}
- ASMJIT_INST_3i(vpextrb, Vpextrb, Gp, Xmm, Imm) // AVX AVX512_BW
- ASMJIT_INST_3i(vpextrb, Vpextrb, Mem, Xmm, Imm) // AVX AVX512_BW
- ASMJIT_INST_3i(vpextrd, Vpextrd, Gp, Xmm, Imm) // AVX AVX512_DQ
- ASMJIT_INST_3i(vpextrd, Vpextrd, Mem, Xmm, Imm) // AVX AVX512_DQ
- ASMJIT_INST_3i(vpextrq, Vpextrq, Gp, Xmm, Imm) // AVX AVX512_DQ
- ASMJIT_INST_3i(vpextrq, Vpextrq, Mem, Xmm, Imm) // AVX AVX512_DQ
- ASMJIT_INST_3i(vpextrw, Vpextrw, Gp, Xmm, Imm) // AVX AVX512_BW
- ASMJIT_INST_3i(vpextrw, Vpextrw, Mem, Xmm, Imm) // AVX AVX512_BW
+ ASMJIT_INST_3x(vpextrb, Vpextrb, Gp, Xmm, Imm) // AVX AVX512_BW
+ ASMJIT_INST_3x(vpextrb, Vpextrb, Mem, Xmm, Imm) // AVX AVX512_BW
+ ASMJIT_INST_3x(vpextrd, Vpextrd, Gp, Xmm, Imm) // AVX AVX512_DQ
+ ASMJIT_INST_3x(vpextrd, Vpextrd, Mem, Xmm, Imm) // AVX AVX512_DQ
+ ASMJIT_INST_3x(vpextrq, Vpextrq, Gp, Xmm, Imm) // AVX AVX512_DQ
+ ASMJIT_INST_3x(vpextrq, Vpextrq, Mem, Xmm, Imm) // AVX AVX512_DQ
+ ASMJIT_INST_3x(vpextrw, Vpextrw, Gp, Xmm, Imm) // AVX AVX512_BW
+ ASMJIT_INST_3x(vpextrw, Vpextrw, Mem, Xmm, Imm) // AVX AVX512_BW
ASMJIT_INST_2x(vpgatherdd, Vpgatherdd, Vec, Mem) // AVX512_F{k}
ASMJIT_INST_3x(vpgatherdd, Vpgatherdd, Vec, Mem, Vec) // AVX2
ASMJIT_INST_2x(vpgatherdq, Vpgatherdq, Vec, Mem) // AVX512_F{k}
@@ -2830,14 +2970,14 @@ public:
ASMJIT_INST_3x(vphsubsw, Vphsubsw, Vec, Vec, Mem) // AVX+
ASMJIT_INST_3x(vphsubw, Vphsubw, Vec, Vec, Vec) // AVX+
ASMJIT_INST_3x(vphsubw, Vphsubw, Vec, Vec, Mem) // AVX+
- ASMJIT_INST_4i(vpinsrb, Vpinsrb, Xmm, Xmm, Gp, Imm) // AVX AVX512_BW{kz}
- ASMJIT_INST_4i(vpinsrb, Vpinsrb, Xmm, Xmm, Mem, Imm) // AVX AVX512_BW{kz}
- ASMJIT_INST_4i(vpinsrd, Vpinsrd, Xmm, Xmm, Gp, Imm) // AVX AVX512_DQ{kz}
- ASMJIT_INST_4i(vpinsrd, Vpinsrd, Xmm, Xmm, Mem, Imm) // AVX AVX512_DQ{kz}
- ASMJIT_INST_4i(vpinsrq, Vpinsrq, Xmm, Xmm, Gp, Imm) // AVX AVX512_DQ{kz}
- ASMJIT_INST_4i(vpinsrq, Vpinsrq, Xmm, Xmm, Mem, Imm) // AVX AVX512_DQ{kz}
- ASMJIT_INST_4i(vpinsrw, Vpinsrw, Xmm, Xmm, Gp, Imm) // AVX AVX512_BW{kz}
- ASMJIT_INST_4i(vpinsrw, Vpinsrw, Xmm, Xmm, Mem, Imm) // AVX AVX512_BW{kz}
+ ASMJIT_INST_4x(vpinsrb, Vpinsrb, Xmm, Xmm, Gp, Imm) // AVX AVX512_BW{kz}
+ ASMJIT_INST_4x(vpinsrb, Vpinsrb, Xmm, Xmm, Mem, Imm) // AVX AVX512_BW{kz}
+ ASMJIT_INST_4x(vpinsrd, Vpinsrd, Xmm, Xmm, Gp, Imm) // AVX AVX512_DQ{kz}
+ ASMJIT_INST_4x(vpinsrd, Vpinsrd, Xmm, Xmm, Mem, Imm) // AVX AVX512_DQ{kz}
+ ASMJIT_INST_4x(vpinsrq, Vpinsrq, Xmm, Xmm, Gp, Imm) // AVX AVX512_DQ{kz}
+ ASMJIT_INST_4x(vpinsrq, Vpinsrq, Xmm, Xmm, Mem, Imm) // AVX AVX512_DQ{kz}
+ ASMJIT_INST_4x(vpinsrw, Vpinsrw, Xmm, Xmm, Gp, Imm) // AVX AVX512_BW{kz}
+ ASMJIT_INST_4x(vpinsrw, Vpinsrw, Xmm, Xmm, Mem, Imm) // AVX AVX512_BW{kz}
ASMJIT_INST_2x(vplzcntd, Vplzcntd, Vec, Vec) // AVX512_CD{kz|b32}
ASMJIT_INST_2x(vplzcntd, Vplzcntd, Vec, Mem) // AVX512_CD{kz|b32}
ASMJIT_INST_2x(vplzcntq, Vplzcntq, Vec, Vec) // AVX512_CD{kz|b64}
@@ -2987,18 +3127,18 @@ public:
ASMJIT_INST_3x(vpord, Vpord, Vec, Vec, Mem) // AVX512_F{kz|b32}
ASMJIT_INST_3x(vporq, Vporq, Vec, Vec, Vec) // AVX512_F{kz|b64}
ASMJIT_INST_3x(vporq, Vporq, Vec, Vec, Mem) // AVX512_F{kz|b64}
- ASMJIT_INST_3i(vprold, Vprold, Vec, Vec, Imm) // AVX512_F{kz|b32}
- ASMJIT_INST_3i(vprold, Vprold, Vec, Mem, Imm) // AVX512_F{kz|b32}
- ASMJIT_INST_3i(vprolq, Vprolq, Vec, Vec, Imm) // AVX512_F{kz|b64}
- ASMJIT_INST_3i(vprolq, Vprolq, Vec, Mem, Imm) // AVX512_F{kz|b64}
+ ASMJIT_INST_3x(vprold, Vprold, Vec, Vec, Imm) // AVX512_F{kz|b32}
+ ASMJIT_INST_3x(vprold, Vprold, Vec, Mem, Imm) // AVX512_F{kz|b32}
+ ASMJIT_INST_3x(vprolq, Vprolq, Vec, Vec, Imm) // AVX512_F{kz|b64}
+ ASMJIT_INST_3x(vprolq, Vprolq, Vec, Mem, Imm) // AVX512_F{kz|b64}
ASMJIT_INST_3x(vprolvd, Vprolvd, Vec, Vec, Vec) // AVX512_F{kz|b32}
ASMJIT_INST_3x(vprolvd, Vprolvd, Vec, Vec, Mem) // AVX512_F{kz|b32}
ASMJIT_INST_3x(vprolvq, Vprolvq, Vec, Vec, Vec) // AVX512_F{kz|b64}
ASMJIT_INST_3x(vprolvq, Vprolvq, Vec, Vec, Mem) // AVX512_F{kz|b64}
- ASMJIT_INST_3i(vprord, Vprord, Vec, Vec, Imm) // AVX512_F{kz|b32}
- ASMJIT_INST_3i(vprord, Vprord, Vec, Mem, Imm) // AVX512_F{kz|b32}
- ASMJIT_INST_3i(vprorq, Vprorq, Vec, Vec, Imm) // AVX512_F{kz|b64}
- ASMJIT_INST_3i(vprorq, Vprorq, Vec, Mem, Imm) // AVX512_F{kz|b64}
+ ASMJIT_INST_3x(vprord, Vprord, Vec, Vec, Imm) // AVX512_F{kz|b32}
+ ASMJIT_INST_3x(vprord, Vprord, Vec, Mem, Imm) // AVX512_F{kz|b32}
+ ASMJIT_INST_3x(vprorq, Vprorq, Vec, Vec, Imm) // AVX512_F{kz|b64}
+ ASMJIT_INST_3x(vprorq, Vprorq, Vec, Mem, Imm) // AVX512_F{kz|b64}
ASMJIT_INST_3x(vprorvd, Vprorvd, Vec, Vec, Vec) // AVX512_F{kz|b32}
ASMJIT_INST_3x(vprorvd, Vprorvd, Vec, Vec, Mem) // AVX512_F{kz|b32}
ASMJIT_INST_3x(vprorvq, Vprorvq, Vec, Vec, Vec) // AVX512_F{kz|b64}
@@ -3009,98 +3149,104 @@ public:
ASMJIT_INST_2x(vpscatterdq, Vpscatterdq, Mem, Vec) // AVX512_F{k}
ASMJIT_INST_2x(vpscatterqd, Vpscatterqd, Mem, Vec) // AVX512_F{k}
ASMJIT_INST_2x(vpscatterqq, Vpscatterqq, Mem, Vec) // AVX512_F{k}
- ASMJIT_INST_4i(vpshldd, Vpshldd, Vec, Vec, Vec, Imm) // AVX512_VBMI2{kz}
- ASMJIT_INST_4i(vpshldd, Vpshldd, Vec, Vec, Mem, Imm) // AVX512_VBMI2{kz}
+ ASMJIT_INST_4x(vpshldd, Vpshldd, Vec, Vec, Vec, Imm) // AVX512_VBMI2{kz}
+ ASMJIT_INST_4x(vpshldd, Vpshldd, Vec, Vec, Mem, Imm) // AVX512_VBMI2{kz}
+ ASMJIT_INST_4x(vpshldq, Vpshldq, Vec, Vec, Vec, Imm) // AVX512_VBMI2{kz}
+ ASMJIT_INST_4x(vpshldq, Vpshldq, Vec, Vec, Mem, Imm) // AVX512_VBMI2{kz}
ASMJIT_INST_3x(vpshldvd, Vpshldvd, Vec, Vec, Vec) // AVX512_VBMI2{kz}
ASMJIT_INST_3x(vpshldvd, Vpshldvd, Vec, Vec, Mem) // AVX512_VBMI2{kz}
ASMJIT_INST_3x(vpshldvq, Vpshldvq, Vec, Vec, Vec) // AVX512_VBMI2{kz}
ASMJIT_INST_3x(vpshldvq, Vpshldvq, Vec, Vec, Mem) // AVX512_VBMI2{kz}
ASMJIT_INST_3x(vpshldvw, Vpshldvw, Vec, Vec, Vec) // AVX512_VBMI2{kz}
ASMJIT_INST_3x(vpshldvw, Vpshldvw, Vec, Vec, Mem) // AVX512_VBMI2{kz}
- ASMJIT_INST_4i(vpshrdd, Vpshrdd, Vec, Vec, Vec, Imm) // AVX512_VBMI2{kz}
- ASMJIT_INST_4i(vpshrdd, Vpshrdd, Vec, Vec, Mem, Imm) // AVX512_VBMI2{kz}
+ ASMJIT_INST_4x(vpshldw, Vpshldw, Vec, Vec, Vec, Imm) // AVX512_VBMI2{kz}
+ ASMJIT_INST_4x(vpshldw, Vpshldw, Vec, Vec, Mem, Imm) // AVX512_VBMI2{kz}
+ ASMJIT_INST_4x(vpshrdd, Vpshrdd, Vec, Vec, Vec, Imm) // AVX512_VBMI2{kz}
+ ASMJIT_INST_4x(vpshrdd, Vpshrdd, Vec, Vec, Mem, Imm) // AVX512_VBMI2{kz}
+ ASMJIT_INST_4x(vpshrdq, Vpshrdq, Vec, Vec, Vec, Imm) // AVX512_VBMI2{kz}
+ ASMJIT_INST_4x(vpshrdq, Vpshrdq, Vec, Vec, Mem, Imm) // AVX512_VBMI2{kz}
ASMJIT_INST_3x(vpshrdvd, Vpshrdvd, Vec, Vec, Vec) // AVX512_VBMI2{kz}
ASMJIT_INST_3x(vpshrdvd, Vpshrdvd, Vec, Vec, Mem) // AVX512_VBMI2{kz}
ASMJIT_INST_3x(vpshrdvq, Vpshrdvq, Vec, Vec, Vec) // AVX512_VBMI2{kz}
ASMJIT_INST_3x(vpshrdvq, Vpshrdvq, Vec, Vec, Mem) // AVX512_VBMI2{kz}
ASMJIT_INST_3x(vpshrdvw, Vpshrdvw, Vec, Vec, Vec) // AVX512_VBMI2{kz}
ASMJIT_INST_3x(vpshrdvw, Vpshrdvw, Vec, Vec, Mem) // AVX512_VBMI2{kz}
- ASMJIT_INST_4i(vpshrdw, Vpshrdw, Vec, Vec, Vec, Imm) // AVX512_VBMI2{kz}
- ASMJIT_INST_4i(vpshrdw, Vpshrdw, Vec, Vec, Mem, Imm) // AVX512_VBMI2{kz}
+ ASMJIT_INST_4x(vpshrdw, Vpshrdw, Vec, Vec, Vec, Imm) // AVX512_VBMI2{kz}
+ ASMJIT_INST_4x(vpshrdw, Vpshrdw, Vec, Vec, Mem, Imm) // AVX512_VBMI2{kz}
ASMJIT_INST_3x(vpshufb, Vpshufb, Vec, Vec, Vec) // AVX+ AVX512_BW{kz}
ASMJIT_INST_3x(vpshufb, Vpshufb, Vec, Vec, Mem) // AVX+ AVX512_BW{kz}
ASMJIT_INST_3x(vpshufbitqmb, Vpshufbitqmb, KReg, Vec, Vec) // AVX512_BITALG{k}
ASMJIT_INST_3x(vpshufbitqmb, Vpshufbitqmb, KReg, Vec, Mem) // AVX512_BITALG{k}
- ASMJIT_INST_3i(vpshufd, Vpshufd, Vec, Vec, Imm) // AVX+ AVX512_F{kz|b32}
- ASMJIT_INST_3i(vpshufd, Vpshufd, Vec, Mem, Imm) // AVX+ AVX512_F{kz|b32}
- ASMJIT_INST_3i(vpshufhw, Vpshufhw, Vec, Vec, Imm) // AVX+ AVX512_BW{kz}
- ASMJIT_INST_3i(vpshufhw, Vpshufhw, Vec, Mem, Imm) // AVX+ AVX512_BW{kz}
- ASMJIT_INST_3i(vpshuflw, Vpshuflw, Vec, Vec, Imm) // AVX+ AVX512_BW{kz}
- ASMJIT_INST_3i(vpshuflw, Vpshuflw, Vec, Mem, Imm) // AVX+ AVX512_BW{kz}
+ ASMJIT_INST_3x(vpshufd, Vpshufd, Vec, Vec, Imm) // AVX+ AVX512_F{kz|b32}
+ ASMJIT_INST_3x(vpshufd, Vpshufd, Vec, Mem, Imm) // AVX+ AVX512_F{kz|b32}
+ ASMJIT_INST_3x(vpshufhw, Vpshufhw, Vec, Vec, Imm) // AVX+ AVX512_BW{kz}
+ ASMJIT_INST_3x(vpshufhw, Vpshufhw, Vec, Mem, Imm) // AVX+ AVX512_BW{kz}
+ ASMJIT_INST_3x(vpshuflw, Vpshuflw, Vec, Vec, Imm) // AVX+ AVX512_BW{kz}
+ ASMJIT_INST_3x(vpshuflw, Vpshuflw, Vec, Mem, Imm) // AVX+ AVX512_BW{kz}
ASMJIT_INST_3x(vpsignb, Vpsignb, Vec, Vec, Vec) // AVX+
ASMJIT_INST_3x(vpsignb, Vpsignb, Vec, Vec, Mem) // AVX+
ASMJIT_INST_3x(vpsignd, Vpsignd, Vec, Vec, Vec) // AVX+
ASMJIT_INST_3x(vpsignd, Vpsignd, Vec, Vec, Mem) // AVX+
ASMJIT_INST_3x(vpsignw, Vpsignw, Vec, Vec, Vec) // AVX+
ASMJIT_INST_3x(vpsignw, Vpsignw, Vec, Vec, Mem) // AVX+
- ASMJIT_INST_3i(vpslld, Vpslld, Vec, Vec, Imm) // AVX+ AVX512_F{kz|b32}
+ ASMJIT_INST_3x(vpslld, Vpslld, Vec, Vec, Imm) // AVX+ AVX512_F{kz|b32}
ASMJIT_INST_3x(vpslld, Vpslld, Vec, Vec, Vec) // AVX+ AVX512_F{kz}
ASMJIT_INST_3x(vpslld, Vpslld, Vec, Vec, Mem) // AVX+ AVX512_F{kz}
- ASMJIT_INST_3i(vpslld, Vpslld, Vec, Mem, Imm) // AVX512_F{kz|b32}
- ASMJIT_INST_3i(vpslldq, Vpslldq, Vec, Vec, Imm) // AVX+ AVX512_BW
- ASMJIT_INST_3i(vpslldq, Vpslldq, Vec, Mem, Imm) // AVX512_BW
- ASMJIT_INST_3i(vpsllq, Vpsllq, Vec, Vec, Imm) // AVX+ AVX512_F{kz|b64}
+ ASMJIT_INST_3x(vpslld, Vpslld, Vec, Mem, Imm) // AVX512_F{kz|b32}
+ ASMJIT_INST_3x(vpslldq, Vpslldq, Vec, Vec, Imm) // AVX+ AVX512_BW
+ ASMJIT_INST_3x(vpslldq, Vpslldq, Vec, Mem, Imm) // AVX512_BW
+ ASMJIT_INST_3x(vpsllq, Vpsllq, Vec, Vec, Imm) // AVX+ AVX512_F{kz|b64}
ASMJIT_INST_3x(vpsllq, Vpsllq, Vec, Vec, Vec) // AVX+ AVX512_F{kz}
ASMJIT_INST_3x(vpsllq, Vpsllq, Vec, Vec, Mem) // AVX+ AVX512_F{kz}
- ASMJIT_INST_3i(vpsllq, Vpsllq, Vec, Mem, Imm) // AVX512_F{kz|b64}
+ ASMJIT_INST_3x(vpsllq, Vpsllq, Vec, Mem, Imm) // AVX512_F{kz|b64}
ASMJIT_INST_3x(vpsllvd, Vpsllvd, Vec, Vec, Vec) // AVX2 AVX512_F{kz|b32}
ASMJIT_INST_3x(vpsllvd, Vpsllvd, Vec, Vec, Mem) // AVX2 AVX512_F{kz|b32}
ASMJIT_INST_3x(vpsllvq, Vpsllvq, Vec, Vec, Vec) // AVX2 AVX512_F{kz|b64}
ASMJIT_INST_3x(vpsllvq, Vpsllvq, Vec, Vec, Mem) // AVX2 AVX512_F{kz|b64}
ASMJIT_INST_3x(vpsllvw, Vpsllvw, Vec, Vec, Vec) // AVX512_BW{kz}
ASMJIT_INST_3x(vpsllvw, Vpsllvw, Vec, Vec, Mem) // AVX512_BW{kz}
- ASMJIT_INST_3i(vpsllw, Vpsllw, Vec, Vec, Imm) // AVX+ AVX512_BW{kz}
+ ASMJIT_INST_3x(vpsllw, Vpsllw, Vec, Vec, Imm) // AVX+ AVX512_BW{kz}
ASMJIT_INST_3x(vpsllw, Vpsllw, Vec, Vec, Vec) // AVX+ AVX512_BW{kz}
ASMJIT_INST_3x(vpsllw, Vpsllw, Vec, Vec, Mem) // AVX+ AVX512_BW{kz}
- ASMJIT_INST_3i(vpsllw, Vpsllw, Vec, Mem, Imm) // AVX512_BW{kz}
- ASMJIT_INST_3i(vpsrad, Vpsrad, Vec, Vec, Imm) // AVX+ AVX512_F{kz|b32}
+ ASMJIT_INST_3x(vpsllw, Vpsllw, Vec, Mem, Imm) // AVX512_BW{kz}
+ ASMJIT_INST_3x(vpsrad, Vpsrad, Vec, Vec, Imm) // AVX+ AVX512_F{kz|b32}
ASMJIT_INST_3x(vpsrad, Vpsrad, Vec, Vec, Vec) // AVX+ AVX512_F{kz}
ASMJIT_INST_3x(vpsrad, Vpsrad, Vec, Vec, Mem) // AVX+ AVX512_F{kz}
- ASMJIT_INST_3i(vpsrad, Vpsrad, Vec, Mem, Imm) // AVX512_F{kz|b32}
+ ASMJIT_INST_3x(vpsrad, Vpsrad, Vec, Mem, Imm) // AVX512_F{kz|b32}
ASMJIT_INST_3x(vpsraq, Vpsraq, Vec, Vec, Vec) // AVX512_F{kz}
ASMJIT_INST_3x(vpsraq, Vpsraq, Vec, Vec, Mem) // AVX512_F{kz}
- ASMJIT_INST_3i(vpsraq, Vpsraq, Vec, Vec, Imm) // AVX512_F{kz|b64}
- ASMJIT_INST_3i(vpsraq, Vpsraq, Vec, Mem, Imm) // AVX512_F{kz|b64}
+ ASMJIT_INST_3x(vpsraq, Vpsraq, Vec, Vec, Imm) // AVX512_F{kz|b64}
+ ASMJIT_INST_3x(vpsraq, Vpsraq, Vec, Mem, Imm) // AVX512_F{kz|b64}
ASMJIT_INST_3x(vpsravd, Vpsravd, Vec, Vec, Vec) // AVX2 AVX512_F{kz|b32}
ASMJIT_INST_3x(vpsravd, Vpsravd, Vec, Vec, Mem) // AVX2 AVX512_F{kz|b32}
ASMJIT_INST_3x(vpsravq, Vpsravq, Vec, Vec, Vec) // AVX512_F{kz|b64}
ASMJIT_INST_3x(vpsravq, Vpsravq, Vec, Vec, Mem) // AVX512_F{kz|b64}
ASMJIT_INST_3x(vpsravw, Vpsravw, Vec, Vec, Vec) // AVX512_BW{kz}
ASMJIT_INST_3x(vpsravw, Vpsravw, Vec, Vec, Mem) // AVX512_BW{kz}
- ASMJIT_INST_3i(vpsraw, Vpsraw, Vec, Vec, Imm) // AVX+ AVX512_BW{kz}
+ ASMJIT_INST_3x(vpsraw, Vpsraw, Vec, Vec, Imm) // AVX+ AVX512_BW{kz}
ASMJIT_INST_3x(vpsraw, Vpsraw, Vec, Vec, Vec) // AVX+ AVX512_BW{kz}
ASMJIT_INST_3x(vpsraw, Vpsraw, Vec, Vec, Mem) // AVX+ AVX512_BW{kz}
- ASMJIT_INST_3i(vpsraw, Vpsraw, Vec, Mem, Imm) // AVX512_BW{kz}
- ASMJIT_INST_3i(vpsrld, Vpsrld, Vec, Vec, Imm) // AVX+ AVX512_F{kz|b32}
+ ASMJIT_INST_3x(vpsraw, Vpsraw, Vec, Mem, Imm) // AVX512_BW{kz}
+ ASMJIT_INST_3x(vpsrld, Vpsrld, Vec, Vec, Imm) // AVX+ AVX512_F{kz|b32}
ASMJIT_INST_3x(vpsrld, Vpsrld, Vec, Vec, Vec) // AVX+ AVX512_F{kz}
ASMJIT_INST_3x(vpsrld, Vpsrld, Vec, Vec, Mem) // AVX+ AVX512_F{kz}
- ASMJIT_INST_3i(vpsrld, Vpsrld, Vec, Mem, Imm) // AVX512_F{kz|b32}
- ASMJIT_INST_3i(vpsrldq, Vpsrldq, Vec, Vec, Imm) // AVX+ AVX512_BW
- ASMJIT_INST_3i(vpsrldq, Vpsrldq, Vec, Mem, Imm) // AVX512_BW
- ASMJIT_INST_3i(vpsrlq, Vpsrlq, Vec, Vec, Imm) // AVX AVX512_F{kz|b64}
+ ASMJIT_INST_3x(vpsrld, Vpsrld, Vec, Mem, Imm) // AVX512_F{kz|b32}
+ ASMJIT_INST_3x(vpsrldq, Vpsrldq, Vec, Vec, Imm) // AVX+ AVX512_BW
+ ASMJIT_INST_3x(vpsrldq, Vpsrldq, Vec, Mem, Imm) // AVX512_BW
+ ASMJIT_INST_3x(vpsrlq, Vpsrlq, Vec, Vec, Imm) // AVX AVX512_F{kz|b64}
ASMJIT_INST_3x(vpsrlq, Vpsrlq, Vec, Vec, Vec) // AVX AVX512_F{kz}
ASMJIT_INST_3x(vpsrlq, Vpsrlq, Vec, Vec, Mem) // AVX AVX512_F{kz}
- ASMJIT_INST_3i(vpsrlq, Vpsrlq, Vec, Mem, Imm) // AVX512_F{kz|b64}
+ ASMJIT_INST_3x(vpsrlq, Vpsrlq, Vec, Mem, Imm) // AVX512_F{kz|b64}
ASMJIT_INST_3x(vpsrlvd, Vpsrlvd, Vec, Vec, Vec) // AVX2 AVX512_F{kz|b32}
ASMJIT_INST_3x(vpsrlvd, Vpsrlvd, Vec, Vec, Mem) // AVX2 AVX512_F{kz|b32}
ASMJIT_INST_3x(vpsrlvq, Vpsrlvq, Vec, Vec, Vec) // AVX2 AVX512_F{kz|b64}
ASMJIT_INST_3x(vpsrlvq, Vpsrlvq, Vec, Vec, Mem) // AVX2 AVX512_F{kz|b64}
ASMJIT_INST_3x(vpsrlvw, Vpsrlvw, Vec, Vec, Vec) // AVX512_BW{kz}
ASMJIT_INST_3x(vpsrlvw, Vpsrlvw, Vec, Vec, Mem) // AVX512_BW{kz}
- ASMJIT_INST_3i(vpsrlw, Vpsrlw, Vec, Vec, Imm) // AVX+ AVX512_BW{kz}
+ ASMJIT_INST_3x(vpsrlw, Vpsrlw, Vec, Vec, Imm) // AVX+ AVX512_BW{kz}
ASMJIT_INST_3x(vpsrlw, Vpsrlw, Vec, Vec, Vec) // AVX+ AVX512_BW{kz}
ASMJIT_INST_3x(vpsrlw, Vpsrlw, Vec, Vec, Mem) // AVX+ AVX512_BW{kz}
- ASMJIT_INST_3i(vpsrlw, Vpsrlw, Vec, Mem, Imm) // AVX512_BW{kz}
+ ASMJIT_INST_3x(vpsrlw, Vpsrlw, Vec, Mem, Imm) // AVX512_BW{kz}
ASMJIT_INST_3x(vpsubb, Vpsubb, Vec, Vec, Vec) // AVX+ AVX512_BW{kz}
ASMJIT_INST_3x(vpsubb, Vpsubb, Vec, Vec, Mem) // AVX+ AVX512_BW{kz}
ASMJIT_INST_3x(vpsubd, Vpsubd, Vec, Vec, Vec) // AVX+ AVX512_F{kz|b32}
@@ -3117,10 +3263,10 @@ public:
ASMJIT_INST_3x(vpsubusw, Vpsubusw, Vec, Vec, Mem) // AVX+ AVX512_BW{kz}
ASMJIT_INST_3x(vpsubw, Vpsubw, Vec, Vec, Vec) // AVX AVX512_BW{kz}
ASMJIT_INST_3x(vpsubw, Vpsubw, Vec, Vec, Mem) // AVX AVX512_BW{kz}
- ASMJIT_INST_4i(vpternlogd, Vpternlogd, Vec, Vec, Vec, Imm) // AVX512_F{kz|b32}
- ASMJIT_INST_4i(vpternlogd, Vpternlogd, Vec, Vec, Mem, Imm) // AVX512_F{kz|b32}
- ASMJIT_INST_4i(vpternlogq, Vpternlogq, Vec, Vec, Vec, Imm) // AVX512_F{kz|b64}
- ASMJIT_INST_4i(vpternlogq, Vpternlogq, Vec, Vec, Mem, Imm) // AVX512_F{kz|b64}
+ ASMJIT_INST_4x(vpternlogd, Vpternlogd, Vec, Vec, Vec, Imm) // AVX512_F{kz|b32}
+ ASMJIT_INST_4x(vpternlogd, Vpternlogd, Vec, Vec, Mem, Imm) // AVX512_F{kz|b32}
+ ASMJIT_INST_4x(vpternlogq, Vpternlogq, Vec, Vec, Vec, Imm) // AVX512_F{kz|b64}
+ ASMJIT_INST_4x(vpternlogq, Vpternlogq, Vec, Vec, Mem, Imm) // AVX512_F{kz|b64}
ASMJIT_INST_2x(vptest, Vptest, Vec, Vec) // AVX
ASMJIT_INST_2x(vptest, Vptest, Vec, Mem) // AVX
ASMJIT_INST_3x(vptestmb, Vptestmb, KReg, Vec, Vec) // AVX512_BW{k}
@@ -3161,14 +3307,14 @@ public:
ASMJIT_INST_3x(vpxord, Vpxord, Vec, Vec, Mem) // AVX512_F{kz|b32}
ASMJIT_INST_3x(vpxorq, Vpxorq, Vec, Vec, Vec) // AVX512_F{kz|b64}
ASMJIT_INST_3x(vpxorq, Vpxorq, Vec, Vec, Mem) // AVX512_F{kz|b64}
- ASMJIT_INST_4i(vrangepd, Vrangepd, Vec, Vec, Vec, Imm) // AVX512_DQ{kz|b64}
- ASMJIT_INST_4i(vrangepd, Vrangepd, Vec, Vec, Mem, Imm) // AVX512_DQ{kz|b64}
- ASMJIT_INST_4i(vrangeps, Vrangeps, Vec, Vec, Vec, Imm) // AVX512_DQ{kz|b32}
- ASMJIT_INST_4i(vrangeps, Vrangeps, Vec, Vec, Mem, Imm) // AVX512_DQ{kz|b32}
- ASMJIT_INST_4i(vrangesd, Vrangesd, Xmm, Xmm, Xmm, Imm) // AVX512_DQ{kz|sae}
- ASMJIT_INST_4i(vrangesd, Vrangesd, Xmm, Xmm, Mem, Imm) // AVX512_DQ{kz|sae}
- ASMJIT_INST_4i(vrangess, Vrangess, Xmm, Xmm, Xmm, Imm) // AVX512_DQ{kz|sae}
- ASMJIT_INST_4i(vrangess, Vrangess, Xmm, Xmm, Mem, Imm) // AVX512_DQ{kz|sae}
+ ASMJIT_INST_4x(vrangepd, Vrangepd, Vec, Vec, Vec, Imm) // AVX512_DQ{kz|b64}
+ ASMJIT_INST_4x(vrangepd, Vrangepd, Vec, Vec, Mem, Imm) // AVX512_DQ{kz|b64}
+ ASMJIT_INST_4x(vrangeps, Vrangeps, Vec, Vec, Vec, Imm) // AVX512_DQ{kz|b32}
+ ASMJIT_INST_4x(vrangeps, Vrangeps, Vec, Vec, Mem, Imm) // AVX512_DQ{kz|b32}
+ ASMJIT_INST_4x(vrangesd, Vrangesd, Xmm, Xmm, Xmm, Imm) // AVX512_DQ{kz|sae}
+ ASMJIT_INST_4x(vrangesd, Vrangesd, Xmm, Xmm, Mem, Imm) // AVX512_DQ{kz|sae}
+ ASMJIT_INST_4x(vrangess, Vrangess, Xmm, Xmm, Xmm, Imm) // AVX512_DQ{kz|sae}
+ ASMJIT_INST_4x(vrangess, Vrangess, Xmm, Xmm, Mem, Imm) // AVX512_DQ{kz|sae}
ASMJIT_INST_2x(vrcp14pd, Vrcp14pd, Vec, Vec) // AVX512_F{kz|b64}
ASMJIT_INST_2x(vrcp14pd, Vrcp14pd, Vec, Mem) // AVX512_F{kz|b64}
ASMJIT_INST_2x(vrcp14ps, Vrcp14ps, Vec, Vec) // AVX512_F{kz|b32}
@@ -3189,30 +3335,30 @@ public:
ASMJIT_INST_2x(vrcpps, Vrcpps, Vec, Mem) // AVX
ASMJIT_INST_3x(vrcpss, Vrcpss, Xmm, Xmm, Xmm) // AVX
ASMJIT_INST_3x(vrcpss, Vrcpss, Xmm, Xmm, Mem) // AVX
- ASMJIT_INST_3i(vreducepd, Vreducepd, Vec, Vec, Imm) // AVX512_DQ{kz|b64}
- ASMJIT_INST_3i(vreducepd, Vreducepd, Vec, Mem, Imm) // AVX512_DQ{kz|b64}
- ASMJIT_INST_3i(vreduceps, Vreduceps, Vec, Vec, Imm) // AVX512_DQ{kz|b32}
- ASMJIT_INST_3i(vreduceps, Vreduceps, Vec, Mem, Imm) // AVX512_DQ{kz|b32}
- ASMJIT_INST_4i(vreducesd, Vreducesd, Xmm, Xmm, Xmm, Imm) // AVX512_DQ{kz}
- ASMJIT_INST_4i(vreducesd, Vreducesd, Xmm, Xmm, Mem, Imm) // AVX512_DQ{kz}
- ASMJIT_INST_4i(vreducess, Vreducess, Xmm, Xmm, Xmm, Imm) // AVX512_DQ{kz}
- ASMJIT_INST_4i(vreducess, Vreducess, Xmm, Xmm, Mem, Imm) // AVX512_DQ{kz}
- ASMJIT_INST_3i(vrndscalepd, Vrndscalepd, Vec, Vec, Imm) // AVX512_F{kz|b64}
- ASMJIT_INST_3i(vrndscalepd, Vrndscalepd, Vec, Mem, Imm) // AVX512_F{kz|b64}
- ASMJIT_INST_3i(vrndscaleps, Vrndscaleps, Vec, Vec, Imm) // AVX512_F{kz|b32}
- ASMJIT_INST_3i(vrndscaleps, Vrndscaleps, Vec, Mem, Imm) // AVX512_F{kz|b32}
- ASMJIT_INST_4i(vrndscalesd, Vrndscalesd, Xmm, Xmm, Xmm, Imm) // AVX512_F{kz|sae}
- ASMJIT_INST_4i(vrndscalesd, Vrndscalesd, Xmm, Xmm, Mem, Imm) // AVX512_F{kz|sae}
- ASMJIT_INST_4i(vrndscaless, Vrndscaless, Xmm, Xmm, Xmm, Imm) // AVX512_F{kz|sae}
- ASMJIT_INST_4i(vrndscaless, Vrndscaless, Xmm, Xmm, Mem, Imm) // AVX512_F{kz|sae}
- ASMJIT_INST_3i(vroundpd, Vroundpd, Vec, Vec, Imm) // AVX
- ASMJIT_INST_3i(vroundpd, Vroundpd, Vec, Mem, Imm) // AVX
- ASMJIT_INST_3i(vroundps, Vroundps, Vec, Vec, Imm) // AVX
- ASMJIT_INST_3i(vroundps, Vroundps, Vec, Mem, Imm) // AVX
- ASMJIT_INST_4i(vroundsd, Vroundsd, Xmm, Xmm, Xmm, Imm) // AVX
- ASMJIT_INST_4i(vroundsd, Vroundsd, Xmm, Xmm, Mem, Imm) // AVX
- ASMJIT_INST_4i(vroundss, Vroundss, Xmm, Xmm, Xmm, Imm) // AVX
- ASMJIT_INST_4i(vroundss, Vroundss, Xmm, Xmm, Mem, Imm) // AVX
+ ASMJIT_INST_3x(vreducepd, Vreducepd, Vec, Vec, Imm) // AVX512_DQ{kz|b64}
+ ASMJIT_INST_3x(vreducepd, Vreducepd, Vec, Mem, Imm) // AVX512_DQ{kz|b64}
+ ASMJIT_INST_3x(vreduceps, Vreduceps, Vec, Vec, Imm) // AVX512_DQ{kz|b32}
+ ASMJIT_INST_3x(vreduceps, Vreduceps, Vec, Mem, Imm) // AVX512_DQ{kz|b32}
+ ASMJIT_INST_4x(vreducesd, Vreducesd, Xmm, Xmm, Xmm, Imm) // AVX512_DQ{kz}
+ ASMJIT_INST_4x(vreducesd, Vreducesd, Xmm, Xmm, Mem, Imm) // AVX512_DQ{kz}
+ ASMJIT_INST_4x(vreducess, Vreducess, Xmm, Xmm, Xmm, Imm) // AVX512_DQ{kz}
+ ASMJIT_INST_4x(vreducess, Vreducess, Xmm, Xmm, Mem, Imm) // AVX512_DQ{kz}
+ ASMJIT_INST_3x(vrndscalepd, Vrndscalepd, Vec, Vec, Imm) // AVX512_F{kz|b64}
+ ASMJIT_INST_3x(vrndscalepd, Vrndscalepd, Vec, Mem, Imm) // AVX512_F{kz|b64}
+ ASMJIT_INST_3x(vrndscaleps, Vrndscaleps, Vec, Vec, Imm) // AVX512_F{kz|b32}
+ ASMJIT_INST_3x(vrndscaleps, Vrndscaleps, Vec, Mem, Imm) // AVX512_F{kz|b32}
+ ASMJIT_INST_4x(vrndscalesd, Vrndscalesd, Xmm, Xmm, Xmm, Imm) // AVX512_F{kz|sae}
+ ASMJIT_INST_4x(vrndscalesd, Vrndscalesd, Xmm, Xmm, Mem, Imm) // AVX512_F{kz|sae}
+ ASMJIT_INST_4x(vrndscaless, Vrndscaless, Xmm, Xmm, Xmm, Imm) // AVX512_F{kz|sae}
+ ASMJIT_INST_4x(vrndscaless, Vrndscaless, Xmm, Xmm, Mem, Imm) // AVX512_F{kz|sae}
+ ASMJIT_INST_3x(vroundpd, Vroundpd, Vec, Vec, Imm) // AVX
+ ASMJIT_INST_3x(vroundpd, Vroundpd, Vec, Mem, Imm) // AVX
+ ASMJIT_INST_3x(vroundps, Vroundps, Vec, Vec, Imm) // AVX
+ ASMJIT_INST_3x(vroundps, Vroundps, Vec, Mem, Imm) // AVX
+ ASMJIT_INST_4x(vroundsd, Vroundsd, Xmm, Xmm, Xmm, Imm) // AVX
+ ASMJIT_INST_4x(vroundsd, Vroundsd, Xmm, Xmm, Mem, Imm) // AVX
+ ASMJIT_INST_4x(vroundss, Vroundss, Xmm, Xmm, Xmm, Imm) // AVX
+ ASMJIT_INST_4x(vroundss, Vroundss, Xmm, Xmm, Mem, Imm) // AVX
ASMJIT_INST_2x(vrsqrt14pd, Vrsqrt14pd, Vec, Vec) // AVX512_F{kz|b64}
ASMJIT_INST_2x(vrsqrt14pd, Vrsqrt14pd, Vec, Mem) // AVX512_F{kz|b64}
ASMJIT_INST_2x(vrsqrt14ps, Vrsqrt14ps, Vec, Vec) // AVX512_F{kz|b32}
@@ -3253,18 +3399,18 @@ public:
ASMJIT_INST_1x(vscatterpf1qps, Vscatterpf1qps, Mem) // AVX512_PF{k}
ASMJIT_INST_2x(vscatterqpd, Vscatterqpd, Mem, Vec) // AVX512_F{k}
ASMJIT_INST_2x(vscatterqps, Vscatterqps, Mem, Vec) // AVX512_F{k}
- ASMJIT_INST_4i(vshuff32x4, Vshuff32x4, Vec, Vec, Vec, Imm) // AVX512_F{kz|b32}
- ASMJIT_INST_4i(vshuff32x4, Vshuff32x4, Vec, Vec, Mem, Imm) // AVX512_F{kz|b32}
- ASMJIT_INST_4i(vshuff64x2, Vshuff64x2, Vec, Vec, Vec, Imm) // AVX512_F{kz|b64}
- ASMJIT_INST_4i(vshuff64x2, Vshuff64x2, Vec, Vec, Mem, Imm) // AVX512_F{kz|b64}
- ASMJIT_INST_4i(vshufi32x4, Vshufi32x4, Vec, Vec, Vec, Imm) // AVX512_F{kz|b32}
- ASMJIT_INST_4i(vshufi32x4, Vshufi32x4, Vec, Vec, Mem, Imm) // AVX512_F{kz|b32}
- ASMJIT_INST_4i(vshufi64x2, Vshufi64x2, Vec, Vec, Vec, Imm) // AVX512_F{kz|b64}
- ASMJIT_INST_4i(vshufi64x2, Vshufi64x2, Vec, Vec, Mem, Imm) // AVX512_F{kz|b64}
- ASMJIT_INST_4i(vshufpd, Vshufpd, Vec, Vec, Vec, Imm) // AVX AVX512_F{kz|b32}
- ASMJIT_INST_4i(vshufpd, Vshufpd, Vec, Vec, Mem, Imm) // AVX AVX512_F{kz|b32}
- ASMJIT_INST_4i(vshufps, Vshufps, Vec, Vec, Vec, Imm) // AVX AVX512_F{kz|b64}
- ASMJIT_INST_4i(vshufps, Vshufps, Vec, Vec, Mem, Imm) // AVX AVX512_F{kz|b64}
+ ASMJIT_INST_4x(vshuff32x4, Vshuff32x4, Vec, Vec, Vec, Imm) // AVX512_F{kz|b32}
+ ASMJIT_INST_4x(vshuff32x4, Vshuff32x4, Vec, Vec, Mem, Imm) // AVX512_F{kz|b32}
+ ASMJIT_INST_4x(vshuff64x2, Vshuff64x2, Vec, Vec, Vec, Imm) // AVX512_F{kz|b64}
+ ASMJIT_INST_4x(vshuff64x2, Vshuff64x2, Vec, Vec, Mem, Imm) // AVX512_F{kz|b64}
+ ASMJIT_INST_4x(vshufi32x4, Vshufi32x4, Vec, Vec, Vec, Imm) // AVX512_F{kz|b32}
+ ASMJIT_INST_4x(vshufi32x4, Vshufi32x4, Vec, Vec, Mem, Imm) // AVX512_F{kz|b32}
+ ASMJIT_INST_4x(vshufi64x2, Vshufi64x2, Vec, Vec, Vec, Imm) // AVX512_F{kz|b64}
+ ASMJIT_INST_4x(vshufi64x2, Vshufi64x2, Vec, Vec, Mem, Imm) // AVX512_F{kz|b64}
+ ASMJIT_INST_4x(vshufpd, Vshufpd, Vec, Vec, Vec, Imm) // AVX AVX512_F{kz|b32}
+ ASMJIT_INST_4x(vshufpd, Vshufpd, Vec, Vec, Mem, Imm) // AVX AVX512_F{kz|b32}
+ ASMJIT_INST_4x(vshufps, Vshufps, Vec, Vec, Vec, Imm) // AVX AVX512_F{kz|b64}
+ ASMJIT_INST_4x(vshufps, Vshufps, Vec, Vec, Mem, Imm) // AVX AVX512_F{kz|b64}
ASMJIT_INST_2x(vsqrtpd, Vsqrtpd, Vec, Vec) // AVX AVX512_F{kz|b64}
ASMJIT_INST_2x(vsqrtpd, Vsqrtpd, Vec, Mem) // AVX AVX512_F{kz|b64}
ASMJIT_INST_2x(vsqrtps, Vsqrtps, Vec, Vec) // AVX AVX512_F{kz|b32}
@@ -3387,28 +3533,28 @@ public:
ASMJIT_INST_4x(vpcmov, Vpcmov, Vec, Vec, Vec, Vec) // XOP
ASMJIT_INST_4x(vpcmov, Vpcmov, Vec, Vec, Mem, Vec) // XOP
ASMJIT_INST_4x(vpcmov, Vpcmov, Vec, Vec, Vec, Mem) // XOP
- ASMJIT_INST_4i(vpcomb, Vpcomb, Xmm, Xmm, Xmm, Imm) // XOP
- ASMJIT_INST_4i(vpcomb, Vpcomb, Xmm, Xmm, Mem, Imm) // XOP
- ASMJIT_INST_4i(vpcomd, Vpcomd, Xmm, Xmm, Xmm, Imm) // XOP
- ASMJIT_INST_4i(vpcomd, Vpcomd, Xmm, Xmm, Mem, Imm) // XOP
- ASMJIT_INST_4i(vpcomq, Vpcomq, Xmm, Xmm, Xmm, Imm) // XOP
- ASMJIT_INST_4i(vpcomq, Vpcomq, Xmm, Xmm, Mem, Imm) // XOP
- ASMJIT_INST_4i(vpcomw, Vpcomw, Xmm, Xmm, Xmm, Imm) // XOP
- ASMJIT_INST_4i(vpcomw, Vpcomw, Xmm, Xmm, Mem, Imm) // XOP
- ASMJIT_INST_4i(vpcomub, Vpcomub, Xmm, Xmm, Xmm, Imm) // XOP
- ASMJIT_INST_4i(vpcomub, Vpcomub, Xmm, Xmm, Mem, Imm) // XOP
- ASMJIT_INST_4i(vpcomud, Vpcomud, Xmm, Xmm, Xmm, Imm) // XOP
- ASMJIT_INST_4i(vpcomud, Vpcomud, Xmm, Xmm, Mem, Imm) // XOP
- ASMJIT_INST_4i(vpcomuq, Vpcomuq, Xmm, Xmm, Xmm, Imm) // XOP
- ASMJIT_INST_4i(vpcomuq, Vpcomuq, Xmm, Xmm, Mem, Imm) // XOP
- ASMJIT_INST_4i(vpcomuw, Vpcomuw, Xmm, Xmm, Xmm, Imm) // XOP
- ASMJIT_INST_4i(vpcomuw, Vpcomuw, Xmm, Xmm, Mem, Imm) // XOP
- ASMJIT_INST_5i(vpermil2pd, Vpermil2pd, Vec, Vec, Vec, Vec, Imm) // XOP
- ASMJIT_INST_5i(vpermil2pd, Vpermil2pd, Vec, Vec, Mem, Vec, Imm) // XOP
- ASMJIT_INST_5i(vpermil2pd, Vpermil2pd, Vec, Vec, Vec, Mem, Imm) // XOP
- ASMJIT_INST_5i(vpermil2ps, Vpermil2ps, Vec, Vec, Vec, Vec, Imm) // XOP
- ASMJIT_INST_5i(vpermil2ps, Vpermil2ps, Vec, Vec, Mem, Vec, Imm) // XOP
- ASMJIT_INST_5i(vpermil2ps, Vpermil2ps, Vec, Vec, Vec, Mem, Imm) // XOP
+ ASMJIT_INST_4x(vpcomb, Vpcomb, Xmm, Xmm, Xmm, Imm) // XOP
+ ASMJIT_INST_4x(vpcomb, Vpcomb, Xmm, Xmm, Mem, Imm) // XOP
+ ASMJIT_INST_4x(vpcomd, Vpcomd, Xmm, Xmm, Xmm, Imm) // XOP
+ ASMJIT_INST_4x(vpcomd, Vpcomd, Xmm, Xmm, Mem, Imm) // XOP
+ ASMJIT_INST_4x(vpcomq, Vpcomq, Xmm, Xmm, Xmm, Imm) // XOP
+ ASMJIT_INST_4x(vpcomq, Vpcomq, Xmm, Xmm, Mem, Imm) // XOP
+ ASMJIT_INST_4x(vpcomw, Vpcomw, Xmm, Xmm, Xmm, Imm) // XOP
+ ASMJIT_INST_4x(vpcomw, Vpcomw, Xmm, Xmm, Mem, Imm) // XOP
+ ASMJIT_INST_4x(vpcomub, Vpcomub, Xmm, Xmm, Xmm, Imm) // XOP
+ ASMJIT_INST_4x(vpcomub, Vpcomub, Xmm, Xmm, Mem, Imm) // XOP
+ ASMJIT_INST_4x(vpcomud, Vpcomud, Xmm, Xmm, Xmm, Imm) // XOP
+ ASMJIT_INST_4x(vpcomud, Vpcomud, Xmm, Xmm, Mem, Imm) // XOP
+ ASMJIT_INST_4x(vpcomuq, Vpcomuq, Xmm, Xmm, Xmm, Imm) // XOP
+ ASMJIT_INST_4x(vpcomuq, Vpcomuq, Xmm, Xmm, Mem, Imm) // XOP
+ ASMJIT_INST_4x(vpcomuw, Vpcomuw, Xmm, Xmm, Xmm, Imm) // XOP
+ ASMJIT_INST_4x(vpcomuw, Vpcomuw, Xmm, Xmm, Mem, Imm) // XOP
+ ASMJIT_INST_5x(vpermil2pd, Vpermil2pd, Vec, Vec, Vec, Vec, Imm) // XOP
+ ASMJIT_INST_5x(vpermil2pd, Vpermil2pd, Vec, Vec, Mem, Vec, Imm) // XOP
+ ASMJIT_INST_5x(vpermil2pd, Vpermil2pd, Vec, Vec, Vec, Mem, Imm) // XOP
+ ASMJIT_INST_5x(vpermil2ps, Vpermil2ps, Vec, Vec, Vec, Vec, Imm) // XOP
+ ASMJIT_INST_5x(vpermil2ps, Vpermil2ps, Vec, Vec, Mem, Vec, Imm) // XOP
+ ASMJIT_INST_5x(vpermil2ps, Vpermil2ps, Vec, Vec, Vec, Mem, Imm) // XOP
ASMJIT_INST_2x(vphaddbd, Vphaddbd, Xmm, Xmm) // XOP
ASMJIT_INST_2x(vphaddbd, Vphaddbd, Xmm, Mem) // XOP
ASMJIT_INST_2x(vphaddbq, Vphaddbq, Xmm, Xmm) // XOP
@@ -3469,23 +3615,23 @@ public:
ASMJIT_INST_3x(vprotb, Vprotb, Xmm, Xmm, Xmm) // XOP
ASMJIT_INST_3x(vprotb, Vprotb, Xmm, Mem, Xmm) // XOP
ASMJIT_INST_3x(vprotb, Vprotb, Xmm, Xmm, Mem) // XOP
- ASMJIT_INST_3i(vprotb, Vprotb, Xmm, Xmm, Imm) // XOP
- ASMJIT_INST_3i(vprotb, Vprotb, Xmm, Mem, Imm) // XOP
+ ASMJIT_INST_3x(vprotb, Vprotb, Xmm, Xmm, Imm) // XOP
+ ASMJIT_INST_3x(vprotb, Vprotb, Xmm, Mem, Imm) // XOP
ASMJIT_INST_3x(vprotd, Vprotd, Xmm, Xmm, Xmm) // XOP
ASMJIT_INST_3x(vprotd, Vprotd, Xmm, Mem, Xmm) // XOP
ASMJIT_INST_3x(vprotd, Vprotd, Xmm, Xmm, Mem) // XOP
- ASMJIT_INST_3i(vprotd, Vprotd, Xmm, Xmm, Imm) // XOP
- ASMJIT_INST_3i(vprotd, Vprotd, Xmm, Mem, Imm) // XOP
+ ASMJIT_INST_3x(vprotd, Vprotd, Xmm, Xmm, Imm) // XOP
+ ASMJIT_INST_3x(vprotd, Vprotd, Xmm, Mem, Imm) // XOP
ASMJIT_INST_3x(vprotq, Vprotq, Xmm, Xmm, Xmm) // XOP
ASMJIT_INST_3x(vprotq, Vprotq, Xmm, Mem, Xmm) // XOP
ASMJIT_INST_3x(vprotq, Vprotq, Xmm, Xmm, Mem) // XOP
- ASMJIT_INST_3i(vprotq, Vprotq, Xmm, Xmm, Imm) // XOP
- ASMJIT_INST_3i(vprotq, Vprotq, Xmm, Mem, Imm) // XOP
+ ASMJIT_INST_3x(vprotq, Vprotq, Xmm, Xmm, Imm) // XOP
+ ASMJIT_INST_3x(vprotq, Vprotq, Xmm, Mem, Imm) // XOP
ASMJIT_INST_3x(vprotw, Vprotw, Xmm, Xmm, Xmm) // XOP
ASMJIT_INST_3x(vprotw, Vprotw, Xmm, Mem, Xmm) // XOP
ASMJIT_INST_3x(vprotw, Vprotw, Xmm, Xmm, Mem) // XOP
- ASMJIT_INST_3i(vprotw, Vprotw, Xmm, Xmm, Imm) // XOP
- ASMJIT_INST_3i(vprotw, Vprotw, Xmm, Mem, Imm) // XOP
+ ASMJIT_INST_3x(vprotw, Vprotw, Xmm, Xmm, Imm) // XOP
+ ASMJIT_INST_3x(vprotw, Vprotw, Xmm, Mem, Imm) // XOP
ASMJIT_INST_3x(vpshab, Vpshab, Xmm, Xmm, Xmm) // XOP
ASMJIT_INST_3x(vpshab, Vpshab, Xmm, Mem, Xmm) // XOP
ASMJIT_INST_3x(vpshab, Vpshab, Xmm, Xmm, Mem) // XOP
@@ -3512,42 +3658,279 @@ public:
ASMJIT_INST_3x(vpshlw, Vpshlw, Xmm, Xmm, Mem) // XOP
//! \}
-};
-// ============================================================================
-// [asmjit::x86::EmitterImplicitT]
-// ============================================================================
+ //! \name AVX512_FP16 Instructions
+ //! \{
+
+ ASMJIT_INST_3x(vaddph, Vaddph, Vec, Vec, Vec)
+ ASMJIT_INST_3x(vaddph, Vaddph, Vec, Vec, Mem)
+ ASMJIT_INST_3x(vaddsh, Vaddsh, Vec, Vec, Vec)
+ ASMJIT_INST_3x(vaddsh, Vaddsh, Vec, Vec, Mem)
+ ASMJIT_INST_4x(vcmpph, Vcmpph, KReg, Vec, Vec, Imm)
+ ASMJIT_INST_4x(vcmpph, Vcmpph, KReg, Vec, Mem, Imm)
+ ASMJIT_INST_4x(vcmpsh, Vcmpsh, KReg, Vec, Vec, Imm)
+ ASMJIT_INST_4x(vcmpsh, Vcmpsh, KReg, Vec, Mem, Imm)
+ ASMJIT_INST_2x(vcomish, Vcomish, Vec, Vec)
+ ASMJIT_INST_2x(vcomish, Vcomish, Vec, Mem)
+ ASMJIT_INST_2x(vcvtdq2ph, Vcvtdq2ph, Vec, Vec)
+ ASMJIT_INST_2x(vcvtdq2ph, Vcvtdq2ph, Vec, Mem)
+ ASMJIT_INST_2x(vcvtpd2ph, Vcvtpd2ph, Vec, Vec)
+ ASMJIT_INST_2x(vcvtpd2ph, Vcvtpd2ph, Vec, Mem)
+ ASMJIT_INST_2x(vcvtph2dq, Vcvtph2dq, Vec, Vec)
+ ASMJIT_INST_2x(vcvtph2dq, Vcvtph2dq, Vec, Mem)
+ ASMJIT_INST_2x(vcvtph2pd, Vcvtph2pd, Vec, Vec)
+ ASMJIT_INST_2x(vcvtph2pd, Vcvtph2pd, Vec, Mem)
+ ASMJIT_INST_2x(vcvtph2psx, Vcvtph2psx, Vec, Vec)
+ ASMJIT_INST_2x(vcvtph2psx, Vcvtph2psx, Vec, Mem)
+ ASMJIT_INST_2x(vcvtph2qq, Vcvtph2qq, Vec, Vec)
+ ASMJIT_INST_2x(vcvtph2qq, Vcvtph2qq, Vec, Mem)
+ ASMJIT_INST_2x(vcvtph2udq, Vcvtph2udq, Vec, Vec)
+ ASMJIT_INST_2x(vcvtph2udq, Vcvtph2udq, Vec, Mem)
+ ASMJIT_INST_2x(vcvtph2uqq, Vcvtph2uqq, Vec, Vec)
+ ASMJIT_INST_2x(vcvtph2uqq, Vcvtph2uqq, Vec, Mem)
+ ASMJIT_INST_2x(vcvtph2uw, Vcvtph2uw, Vec, Vec)
+ ASMJIT_INST_2x(vcvtph2uw, Vcvtph2uw, Vec, Mem)
+ ASMJIT_INST_2x(vcvtph2w, Vcvtph2w, Vec, Vec)
+ ASMJIT_INST_2x(vcvtph2w, Vcvtph2w, Vec, Mem)
+ ASMJIT_INST_2x(vcvtps2phx, Vcvtps2phx, Vec, Vec)
+ ASMJIT_INST_2x(vcvtps2phx, Vcvtps2phx, Vec, Mem)
+ ASMJIT_INST_2x(vcvtqq2ph, Vcvtqq2ph, Vec, Vec)
+ ASMJIT_INST_2x(vcvtqq2ph, Vcvtqq2ph, Vec, Mem)
+ ASMJIT_INST_3x(vcvtsd2sh, Vcvtsd2sh, Vec, Vec, Vec)
+ ASMJIT_INST_3x(vcvtsd2sh, Vcvtsd2sh, Vec, Vec, Mem)
+ ASMJIT_INST_3x(vcvtsh2sd, Vcvtsh2sd, Vec, Vec, Vec)
+ ASMJIT_INST_3x(vcvtsh2sd, Vcvtsh2sd, Vec, Vec, Mem)
+ ASMJIT_INST_2x(vcvtsh2si, Vcvtsh2si, Gp, Vec)
+ ASMJIT_INST_2x(vcvtsh2si, Vcvtsh2si, Gp, Mem)
+ ASMJIT_INST_3x(vcvtsh2ss, Vcvtsh2ss, Vec, Vec, Vec)
+ ASMJIT_INST_3x(vcvtsh2ss, Vcvtsh2ss, Vec, Vec, Mem)
+ ASMJIT_INST_2x(vcvtsh2usi, Vcvtsh2usi, Gp, Vec)
+ ASMJIT_INST_2x(vcvtsh2usi, Vcvtsh2usi, Gp, Mem)
+ ASMJIT_INST_3x(vcvtsi2sh, Vcvtsi2sh, Vec, Vec, Gp)
+ ASMJIT_INST_3x(vcvtsi2sh, Vcvtsi2sh, Vec, Vec, Mem)
+ ASMJIT_INST_3x(vcvtss2sh, Vcvtss2sh, Vec, Vec, Vec)
+ ASMJIT_INST_3x(vcvtss2sh, Vcvtss2sh, Vec, Vec, Mem)
+ ASMJIT_INST_2x(vcvttph2dq, Vcvttph2dq, Vec, Vec)
+ ASMJIT_INST_2x(vcvttph2dq, Vcvttph2dq, Vec, Mem)
+ ASMJIT_INST_2x(vcvttph2qq, Vcvttph2qq, Vec, Vec)
+ ASMJIT_INST_2x(vcvttph2qq, Vcvttph2qq, Vec, Mem)
+ ASMJIT_INST_2x(vcvttph2udq, Vcvttph2udq, Vec, Vec)
+ ASMJIT_INST_2x(vcvttph2udq, Vcvttph2udq, Vec, Mem)
+ ASMJIT_INST_2x(vcvttph2uqq, Vcvttph2uqq, Vec, Vec)
+ ASMJIT_INST_2x(vcvttph2uqq, Vcvttph2uqq, Vec, Mem)
+ ASMJIT_INST_2x(vcvttph2uw, Vcvttph2uw, Vec, Vec)
+ ASMJIT_INST_2x(vcvttph2uw, Vcvttph2uw, Vec, Mem)
+ ASMJIT_INST_2x(vcvttph2w, Vcvttph2w, Vec, Vec)
+ ASMJIT_INST_2x(vcvttph2w, Vcvttph2w, Vec, Mem)
+ ASMJIT_INST_2x(vcvttsh2si, Vcvttsh2si, Gp, Vec)
+ ASMJIT_INST_2x(vcvttsh2si, Vcvttsh2si, Gp, Mem)
+ ASMJIT_INST_2x(vcvttsh2usi, Vcvttsh2usi, Gp, Vec)
+ ASMJIT_INST_2x(vcvttsh2usi, Vcvttsh2usi, Gp, Mem)
+ ASMJIT_INST_2x(vcvtudq2ph, Vcvtudq2ph, Vec, Vec)
+ ASMJIT_INST_2x(vcvtudq2ph, Vcvtudq2ph, Vec, Mem)
+ ASMJIT_INST_2x(vcvtuqq2ph, Vcvtuqq2ph, Vec, Vec)
+ ASMJIT_INST_2x(vcvtuqq2ph, Vcvtuqq2ph, Vec, Mem)
+ ASMJIT_INST_3x(vcvtusi2sh, Vcvtusi2sh, Vec, Vec, Gp)
+ ASMJIT_INST_3x(vcvtusi2sh, Vcvtusi2sh, Vec, Vec, Mem)
+ ASMJIT_INST_2x(vcvtuw2ph, Vcvtuw2ph, Vec, Vec)
+ ASMJIT_INST_2x(vcvtuw2ph, Vcvtuw2ph, Vec, Mem)
+ ASMJIT_INST_2x(vcvtw2ph, Vcvtw2ph, Vec, Vec)
+ ASMJIT_INST_2x(vcvtw2ph, Vcvtw2ph, Vec, Mem)
+ ASMJIT_INST_3x(vdivph, Vdivph, Vec, Vec, Vec)
+ ASMJIT_INST_3x(vdivph, Vdivph, Vec, Vec, Mem)
+ ASMJIT_INST_3x(vdivsh, Vdivsh, Vec, Vec, Vec)
+ ASMJIT_INST_3x(vdivsh, Vdivsh, Vec, Vec, Mem)
+ ASMJIT_INST_3x(vfcmaddcph, Vfcmaddcph, Vec, Vec, Vec)
+ ASMJIT_INST_3x(vfcmaddcph, Vfcmaddcph, Vec, Vec, Mem)
+ ASMJIT_INST_3x(vfcmaddcsh, Vfcmaddcsh, Vec, Vec, Vec)
+ ASMJIT_INST_3x(vfcmaddcsh, Vfcmaddcsh, Vec, Vec, Mem)
+ ASMJIT_INST_3x(vfcmulcph, Vfcmulcph, Vec, Vec, Vec)
+ ASMJIT_INST_3x(vfcmulcph, Vfcmulcph, Vec, Vec, Mem)
+ ASMJIT_INST_3x(vfcmulcsh, Vfcmulcsh, Vec, Vec, Vec)
+ ASMJIT_INST_3x(vfcmulcsh, Vfcmulcsh, Vec, Vec, Mem)
+ ASMJIT_INST_3x(vfmadd132ph, Vfmadd132ph, Vec, Vec, Vec)
+ ASMJIT_INST_3x(vfmadd132ph, Vfmadd132ph, Vec, Vec, Mem)
+ ASMJIT_INST_3x(vfmadd132sh, Vfmadd132sh, Vec, Vec, Vec)
+ ASMJIT_INST_3x(vfmadd132sh, Vfmadd132sh, Vec, Vec, Mem)
+ ASMJIT_INST_3x(vfmadd213ph, Vfmadd213ph, Vec, Vec, Vec)
+ ASMJIT_INST_3x(vfmadd213ph, Vfmadd213ph, Vec, Vec, Mem)
+ ASMJIT_INST_3x(vfmadd213sh, Vfmadd213sh, Vec, Vec, Vec)
+ ASMJIT_INST_3x(vfmadd213sh, Vfmadd213sh, Vec, Vec, Mem)
+ ASMJIT_INST_3x(vfmadd231ph, Vfmadd231ph, Vec, Vec, Vec)
+ ASMJIT_INST_3x(vfmadd231ph, Vfmadd231ph, Vec, Vec, Mem)
+ ASMJIT_INST_3x(vfmadd231sh, Vfmadd231sh, Vec, Vec, Vec)
+ ASMJIT_INST_3x(vfmadd231sh, Vfmadd231sh, Vec, Vec, Mem)
+ ASMJIT_INST_3x(vfmaddcph, Vfmaddcph, Vec, Vec, Vec)
+ ASMJIT_INST_3x(vfmaddcph, Vfmaddcph, Vec, Vec, Mem)
+ ASMJIT_INST_3x(vfmaddcsh, Vfmaddcsh, Vec, Vec, Vec)
+ ASMJIT_INST_3x(vfmaddcsh, Vfmaddcsh, Vec, Vec, Mem)
+ ASMJIT_INST_3x(vfmaddsub132ph, Vfmaddsub132ph, Vec, Vec, Vec)
+ ASMJIT_INST_3x(vfmaddsub132ph, Vfmaddsub132ph, Vec, Vec, Mem)
+ ASMJIT_INST_3x(vfmaddsub213ph, Vfmaddsub213ph, Vec, Vec, Vec)
+ ASMJIT_INST_3x(vfmaddsub213ph, Vfmaddsub213ph, Vec, Vec, Mem)
+ ASMJIT_INST_3x(vfmaddsub231ph, Vfmaddsub231ph, Vec, Vec, Vec)
+ ASMJIT_INST_3x(vfmaddsub231ph, Vfmaddsub231ph, Vec, Vec, Mem)
+ ASMJIT_INST_3x(vfmsub132ph, Vfmsub132ph, Vec, Vec, Vec)
+ ASMJIT_INST_3x(vfmsub132ph, Vfmsub132ph, Vec, Vec, Mem)
+ ASMJIT_INST_3x(vfmsub132sh, Vfmsub132sh, Vec, Vec, Vec)
+ ASMJIT_INST_3x(vfmsub132sh, Vfmsub132sh, Vec, Vec, Mem)
+ ASMJIT_INST_3x(vfmsub213ph, Vfmsub213ph, Vec, Vec, Vec)
+ ASMJIT_INST_3x(vfmsub213ph, Vfmsub213ph, Vec, Vec, Mem)
+ ASMJIT_INST_3x(vfmsub213sh, Vfmsub213sh, Vec, Vec, Vec)
+ ASMJIT_INST_3x(vfmsub213sh, Vfmsub213sh, Vec, Vec, Mem)
+ ASMJIT_INST_3x(vfmsub231ph, Vfmsub231ph, Vec, Vec, Vec)
+ ASMJIT_INST_3x(vfmsub231ph, Vfmsub231ph, Vec, Vec, Mem)
+ ASMJIT_INST_3x(vfmsub231sh, Vfmsub231sh, Vec, Vec, Vec)
+ ASMJIT_INST_3x(vfmsub231sh, Vfmsub231sh, Vec, Vec, Mem)
+ ASMJIT_INST_3x(vfmsubadd132ph, Vfmsubadd132ph, Vec, Vec, Vec)
+ ASMJIT_INST_3x(vfmsubadd132ph, Vfmsubadd132ph, Vec, Vec, Mem)
+ ASMJIT_INST_3x(vfmsubadd213ph, Vfmsubadd213ph, Vec, Vec, Vec)
+ ASMJIT_INST_3x(vfmsubadd213ph, Vfmsubadd213ph, Vec, Vec, Mem)
+ ASMJIT_INST_3x(vfmsubadd231ph, Vfmsubadd231ph, Vec, Vec, Vec)
+ ASMJIT_INST_3x(vfmsubadd231ph, Vfmsubadd231ph, Vec, Vec, Mem)
+ ASMJIT_INST_3x(vfmulcph, Vfmulcph, Vec, Vec, Vec)
+ ASMJIT_INST_3x(vfmulcph, Vfmulcph, Vec, Vec, Mem)
+ ASMJIT_INST_3x(vfmulcsh, Vfmulcsh, Vec, Vec, Vec)
+ ASMJIT_INST_3x(vfmulcsh, Vfmulcsh, Vec, Vec, Mem)
+ ASMJIT_INST_3x(vfnmadd132ph, Vfnmadd132ph, Vec, Vec, Vec)
+ ASMJIT_INST_3x(vfnmadd132ph, Vfnmadd132ph, Vec, Vec, Mem)
+ ASMJIT_INST_3x(vfnmadd132sh, Vfnmadd132sh, Vec, Vec, Vec)
+ ASMJIT_INST_3x(vfnmadd132sh, Vfnmadd132sh, Vec, Vec, Mem)
+ ASMJIT_INST_3x(vfnmadd213ph, Vfnmadd213ph, Vec, Vec, Vec)
+ ASMJIT_INST_3x(vfnmadd213ph, Vfnmadd213ph, Vec, Vec, Mem)
+ ASMJIT_INST_3x(vfnmadd213sh, Vfnmadd213sh, Vec, Vec, Vec)
+ ASMJIT_INST_3x(vfnmadd213sh, Vfnmadd213sh, Vec, Vec, Mem)
+ ASMJIT_INST_3x(vfnmadd231ph, Vfnmadd231ph, Vec, Vec, Vec)
+ ASMJIT_INST_3x(vfnmadd231ph, Vfnmadd231ph, Vec, Vec, Mem)
+ ASMJIT_INST_3x(vfnmadd231sh, Vfnmadd231sh, Vec, Vec, Vec)
+ ASMJIT_INST_3x(vfnmadd231sh, Vfnmadd231sh, Vec, Vec, Mem)
+ ASMJIT_INST_3x(vfnmsub132ph, Vfnmsub132ph, Vec, Vec, Vec)
+ ASMJIT_INST_3x(vfnmsub132ph, Vfnmsub132ph, Vec, Vec, Mem)
+ ASMJIT_INST_3x(vfnmsub132sh, Vfnmsub132sh, Vec, Vec, Vec)
+ ASMJIT_INST_3x(vfnmsub132sh, Vfnmsub132sh, Vec, Vec, Mem)
+ ASMJIT_INST_3x(vfnmsub213ph, Vfnmsub213ph, Vec, Vec, Vec)
+ ASMJIT_INST_3x(vfnmsub213ph, Vfnmsub213ph, Vec, Vec, Mem)
+ ASMJIT_INST_3x(vfnmsub213sh, Vfnmsub213sh, Vec, Vec, Vec)
+ ASMJIT_INST_3x(vfnmsub213sh, Vfnmsub213sh, Vec, Vec, Mem)
+ ASMJIT_INST_3x(vfnmsub231ph, Vfnmsub231ph, Vec, Vec, Vec)
+ ASMJIT_INST_3x(vfnmsub231ph, Vfnmsub231ph, Vec, Vec, Mem)
+ ASMJIT_INST_3x(vfnmsub231sh, Vfnmsub231sh, Vec, Vec, Vec)
+ ASMJIT_INST_3x(vfnmsub231sh, Vfnmsub231sh, Vec, Vec, Mem)
+ ASMJIT_INST_3x(vfpclassph, Vfpclassph, KReg, Vec, Imm)
+ ASMJIT_INST_3x(vfpclassph, Vfpclassph, KReg, Mem, Imm)
+ ASMJIT_INST_3x(vfpclasssh, Vfpclasssh, KReg, Vec, Imm)
+ ASMJIT_INST_3x(vfpclasssh, Vfpclasssh, KReg, Mem, Imm)
+ ASMJIT_INST_2x(vgetexpph, Vgetexpph, Vec, Vec)
+ ASMJIT_INST_2x(vgetexpph, Vgetexpph, Vec, Mem)
+ ASMJIT_INST_3x(vgetexpsh, Vgetexpsh, Vec, Vec, Vec)
+ ASMJIT_INST_3x(vgetexpsh, Vgetexpsh, Vec, Vec, Mem)
+ ASMJIT_INST_3x(vgetmantph, Vgetmantph, Vec, Vec, Imm)
+ ASMJIT_INST_3x(vgetmantph, Vgetmantph, Vec, Mem, Imm)
+ ASMJIT_INST_4x(vgetmantsh, Vgetmantsh, Vec, Vec, Vec, Imm)
+ ASMJIT_INST_4x(vgetmantsh, Vgetmantsh, Vec, Vec, Mem, Imm)
+ ASMJIT_INST_3x(vmaxph, Vmaxph, Vec, Vec, Vec)
+ ASMJIT_INST_3x(vmaxph, Vmaxph, Vec, Vec, Mem)
+ ASMJIT_INST_3x(vmaxsh, Vmaxsh, Vec, Vec, Vec)
+ ASMJIT_INST_3x(vmaxsh, Vmaxsh, Vec, Vec, Mem)
+ ASMJIT_INST_3x(vminph, Vminph, Vec, Vec, Vec)
+ ASMJIT_INST_3x(vminph, Vminph, Vec, Vec, Mem)
+ ASMJIT_INST_3x(vminsh, Vminsh, Vec, Vec, Vec)
+ ASMJIT_INST_3x(vminsh, Vminsh, Vec, Vec, Mem)
+ ASMJIT_INST_2x(vmovsh, Vmovsh, Mem, Xmm)
+ ASMJIT_INST_2x(vmovsh, Vmovsh, Xmm, Mem)
+ ASMJIT_INST_3x(vmovsh, Vmovsh, Xmm, Xmm, Xmm)
+ ASMJIT_INST_2x(vmovw, Vmovw, Gp, Xmm)
+ ASMJIT_INST_2x(vmovw, Vmovw, Mem, Xmm)
+ ASMJIT_INST_2x(vmovw, Vmovw, Xmm, Gp)
+ ASMJIT_INST_2x(vmovw, Vmovw, Xmm, Mem)
+ ASMJIT_INST_3x(vmulph, Vmulph, Vec, Vec, Vec)
+ ASMJIT_INST_3x(vmulph, Vmulph, Vec, Vec, Mem)
+ ASMJIT_INST_3x(vmulsh, Vmulsh, Vec, Vec, Vec)
+ ASMJIT_INST_3x(vmulsh, Vmulsh, Vec, Vec, Mem)
+ ASMJIT_INST_2x(vrcpph, Vrcpph, Vec, Vec)
+ ASMJIT_INST_2x(vrcpph, Vrcpph, Vec, Mem)
+ ASMJIT_INST_3x(vrcpsh, Vrcpsh, Vec, Vec, Vec)
+ ASMJIT_INST_3x(vrcpsh, Vrcpsh, Vec, Vec, Mem)
+ ASMJIT_INST_3x(vreduceph, Vreduceph, Vec, Vec, Imm)
+ ASMJIT_INST_3x(vreduceph, Vreduceph, Vec, Mem, Imm)
+ ASMJIT_INST_4x(vreducesh, Vreducesh, Vec, Vec, Vec, Imm)
+ ASMJIT_INST_4x(vreducesh, Vreducesh, Vec, Vec, Mem, Imm)
+ ASMJIT_INST_3x(vrndscaleph, Vrndscaleph, Vec, Vec, Imm)
+ ASMJIT_INST_3x(vrndscaleph, Vrndscaleph, Vec, Mem, Imm)
+ ASMJIT_INST_4x(vrndscalesh, Vrndscalesh, Vec, Vec, Vec, Imm)
+ ASMJIT_INST_4x(vrndscalesh, Vrndscalesh, Vec, Vec, Mem, Imm)
+ ASMJIT_INST_2x(vrsqrtph, Vrsqrtph, Vec, Vec)
+ ASMJIT_INST_2x(vrsqrtph, Vrsqrtph, Vec, Mem)
+ ASMJIT_INST_3x(vrsqrtsh, Vrsqrtsh, Vec, Vec, Vec)
+ ASMJIT_INST_3x(vrsqrtsh, Vrsqrtsh, Vec, Vec, Mem)
+ ASMJIT_INST_3x(vscalefph, Vscalefph, Vec, Vec, Vec)
+ ASMJIT_INST_3x(vscalefph, Vscalefph, Vec, Vec, Mem)
+ ASMJIT_INST_3x(vscalefsh, Vscalefsh, Vec, Vec, Vec)
+ ASMJIT_INST_3x(vscalefsh, Vscalefsh, Vec, Vec, Mem)
+ ASMJIT_INST_2x(vsqrtph, Vsqrtph, Vec, Vec)
+ ASMJIT_INST_2x(vsqrtph, Vsqrtph, Vec, Mem)
+ ASMJIT_INST_3x(vsqrtsh, Vsqrtsh, Vec, Vec, Vec)
+ ASMJIT_INST_3x(vsqrtsh, Vsqrtsh, Vec, Vec, Mem)
+ ASMJIT_INST_3x(vsubph, Vsubph, Vec, Vec, Vec)
+ ASMJIT_INST_3x(vsubph, Vsubph, Vec, Vec, Mem)
+ ASMJIT_INST_3x(vsubsh, Vsubsh, Vec, Vec, Vec)
+ ASMJIT_INST_3x(vsubsh, Vsubsh, Vec, Vec, Mem)
+ ASMJIT_INST_2x(vucomish, Vucomish, Vec, Vec)
+ ASMJIT_INST_2x(vucomish, Vucomish, Vec, Mem)
+
+ //! \}
+
+ //! \name AMX Instructions
+ //! \{
+ ASMJIT_INST_1x(ldtilecfg, Ldtilecfg, Mem) // AMX_TILE
+ ASMJIT_INST_1x(sttilecfg, Sttilecfg, Mem) // AMX_TILE
+ ASMJIT_INST_2x(tileloadd, Tileloadd, Tmm, Mem) // AMX_TILE
+ ASMJIT_INST_2x(tileloaddt1, Tileloaddt1, Tmm, Mem) // AMX_TILE
+ ASMJIT_INST_0x(tilerelease, Tilerelease) // AMX_TILE
+ ASMJIT_INST_2x(tilestored, Tilestored, Mem, Tmm) // AMX_TILE
+ ASMJIT_INST_1x(tilezero, Tilezero, Tmm) // AMX_TILE
+
+ ASMJIT_INST_3x(tdpbf16ps, Tdpbf16ps, Tmm, Tmm, Tmm) // AMX_BF16
+ ASMJIT_INST_3x(tdpbssd, Tdpbssd, Tmm, Tmm, Tmm) // AMX_INT8
+ ASMJIT_INST_3x(tdpbsud, Tdpbsud, Tmm, Tmm, Tmm) // AMX_INT8
+ ASMJIT_INST_3x(tdpbusd, Tdpbusd, Tmm, Tmm, Tmm) // AMX_INT8
+ ASMJIT_INST_3x(tdpbuud, Tdpbuud, Tmm, Tmm, Tmm) // AMX_INT8
+
+ //! \}
+};
+
+//! Emitter (X86 - implicit).
template<typename This>
struct EmitterImplicitT : public EmitterExplicitT<This> {
+ //! \cond
+ using EmitterExplicitT<This>::_emitter;
+ //! \endcond
+
//! \name Prefix Options
//! \{
//! Use REP/REPE prefix.
- inline This& rep() noexcept { return EmitterExplicitT<This>::_addInstOptions(Inst::kOptionRep); }
+ inline This& rep() noexcept { return EmitterExplicitT<This>::_addInstOptions(InstOptions::kX86_Rep); }
//! Use REP/REPE prefix.
inline This& repe() noexcept { return rep(); }
//! Use REP/REPE prefix.
inline This& repz() noexcept { return rep(); }
//! Use REPNE prefix.
- inline This& repne() noexcept { return EmitterExplicitT<This>::_addInstOptions(Inst::kOptionRepne); }
+ inline This& repne() noexcept { return EmitterExplicitT<This>::_addInstOptions(InstOptions::kX86_Repne); }
//! Use REPNE prefix.
inline This& repnz() noexcept { return repne(); }
//! \}
- //! \name Base Instructions & GP Extensions
+ //! \name Core Instructions
//! \{
//! \cond
- using EmitterExplicitT<This>::_emitter;
-
- // TODO: xrstor and xsave don't have explicit variants yet.
using EmitterExplicitT<This>::cbw;
using EmitterExplicitT<This>::cdq;
using EmitterExplicitT<This>::cdqe;
- using EmitterExplicitT<This>::clzero;
using EmitterExplicitT<This>::cqo;
using EmitterExplicitT<This>::cwd;
using EmitterExplicitT<This>::cwde;
@@ -3555,23 +3938,14 @@ struct EmitterImplicitT : public EmitterExplicitT<This> {
using EmitterExplicitT<This>::cmpxchg;
using EmitterExplicitT<This>::cmpxchg8b;
using EmitterExplicitT<This>::cmpxchg16b;
- using EmitterExplicitT<This>::cpuid;
using EmitterExplicitT<This>::div;
using EmitterExplicitT<This>::idiv;
using EmitterExplicitT<This>::imul;
using EmitterExplicitT<This>::jecxz;
- using EmitterExplicitT<This>::lahf;
- using EmitterExplicitT<This>::mulx;
- using EmitterExplicitT<This>::movsd;
+ using EmitterExplicitT<This>::loop;
+ using EmitterExplicitT<This>::loope;
+ using EmitterExplicitT<This>::loopne;
using EmitterExplicitT<This>::mul;
- using EmitterExplicitT<This>::rdmsr;
- using EmitterExplicitT<This>::rdpmc;
- using EmitterExplicitT<This>::rdtsc;
- using EmitterExplicitT<This>::rdtscp;
- using EmitterExplicitT<This>::sahf;
- using EmitterExplicitT<This>::wrmsr;
- using EmitterExplicitT<This>::xgetbv;
- using EmitterExplicitT<This>::xsetbv;
//! \endcond
ASMJIT_INST_0x(cbw, Cbw) // ANY [IMPLICIT] AX <- Sign Extend AL
@@ -3581,12 +3955,9 @@ struct EmitterImplicitT : public EmitterExplicitT<This> {
ASMJIT_INST_2x(cmpxchg, Cmpxchg, Mem, Gp) // I486 [IMPLICIT]
ASMJIT_INST_1x(cmpxchg16b, Cmpxchg16b, Mem) // CMPXCHG8B [IMPLICIT] m == RDX:RAX ? m <- RCX:RBX
ASMJIT_INST_1x(cmpxchg8b, Cmpxchg8b, Mem) // CMPXCHG16B[IMPLICIT] m == EDX:EAX ? m <- ECX:EBX
- ASMJIT_INST_0x(cpuid, Cpuid) // I486 [IMPLICIT] EAX:EBX:ECX:EDX <- CPUID[EAX:ECX]
ASMJIT_INST_0x(cqo, Cqo) // X64 [IMPLICIT] RDX:RAX <- Sign Extend RAX
ASMJIT_INST_0x(cwd, Cwd) // ANY [IMPLICIT] DX:AX <- Sign Extend AX
ASMJIT_INST_0x(cwde, Cwde) // ANY [IMPLICIT] EAX <- Sign Extend AX
- ASMJIT_INST_0x(daa, Daa)
- ASMJIT_INST_0x(das, Das)
ASMJIT_INST_1x(div, Div, Gp) // ANY [IMPLICIT] {AH[Rem]: AL[Quot] <- AX / r8} {xDX[Rem]:xAX[Quot] <- DX:AX / r16|r32|r64}
ASMJIT_INST_1x(div, Div, Mem) // ANY [IMPLICIT] {AH[Rem]: AL[Quot] <- AX / m8} {xDX[Rem]:xAX[Quot] <- DX:AX / m16|m32|m64}
ASMJIT_INST_1x(idiv, Idiv, Gp) // ANY [IMPLICIT] {AH[Rem]: AL[Quot] <- AX / r8} {xDX[Rem]:xAX[Quot] <- DX:AX / r16|r32|r64}
@@ -3596,36 +3967,20 @@ struct EmitterImplicitT : public EmitterExplicitT<This> {
ASMJIT_INST_0x(iret, Iret) // ANY [IMPLICIT]
ASMJIT_INST_0x(iretd, Iretd) // ANY [IMPLICIT]
ASMJIT_INST_0x(iretq, Iretq) // X64 [IMPLICIT]
- ASMJIT_INST_0x(iretw, Iretw) // ANY [IMPLICIT]
ASMJIT_INST_1x(jecxz, Jecxz, Label) // ANY [IMPLICIT] Short jump if CX/ECX/RCX is zero.
ASMJIT_INST_1x(jecxz, Jecxz, Imm) // ANY [IMPLICIT] Short jump if CX/ECX/RCX is zero.
- ASMJIT_INST_1x(jecxz, Jecxz, uint64_t) // ANY [IMPLICIT] Short jump if CX/ECX/RCX is zero.
- ASMJIT_INST_0x(lahf, Lahf) // LAHFSAHF [IMPLICIT] AH <- EFL
ASMJIT_INST_1x(loop, Loop, Label) // ANY [IMPLICIT] Decrement xCX; short jump if xCX != 0.
ASMJIT_INST_1x(loop, Loop, Imm) // ANY [IMPLICIT] Decrement xCX; short jump if xCX != 0.
- ASMJIT_INST_1x(loop, Loop, uint64_t) // ANY [IMPLICIT] Decrement xCX; short jump if xCX != 0.
ASMJIT_INST_1x(loope, Loope, Label) // ANY [IMPLICIT] Decrement xCX; short jump if xCX != 0 && ZF == 1.
ASMJIT_INST_1x(loope, Loope, Imm) // ANY [IMPLICIT] Decrement xCX; short jump if xCX != 0 && ZF == 1.
- ASMJIT_INST_1x(loope, Loope, uint64_t) // ANY [IMPLICIT] Decrement xCX; short jump if xCX != 0 && ZF == 1.
ASMJIT_INST_1x(loopne, Loopne, Label) // ANY [IMPLICIT] Decrement xCX; short jump if xCX != 0 && ZF == 0.
ASMJIT_INST_1x(loopne, Loopne, Imm) // ANY [IMPLICIT] Decrement xCX; short jump if xCX != 0 && ZF == 0.
- ASMJIT_INST_1x(loopne, Loopne, uint64_t) // ANY [IMPLICIT] Decrement xCX; short jump if xCX != 0 && ZF == 0.
ASMJIT_INST_1x(mul, Mul, Gp) // ANY [IMPLICIT] {AX <- AL * r8} {xDX:xAX <- xAX * r16|r32|r64}
ASMJIT_INST_1x(mul, Mul, Mem) // ANY [IMPLICIT] {AX <- AL * m8} {xDX:xAX <- xAX * m16|m32|m64}
- ASMJIT_INST_0x(rdmsr, Rdmsr) // ANY [IMPLICIT]
- ASMJIT_INST_0x(rdpmc, Rdpmc) // ANY [IMPLICIT]
- ASMJIT_INST_0x(rdtsc, Rdtsc) // RDTSC [IMPLICIT] EDX:EAX <- CNT
- ASMJIT_INST_0x(rdtscp, Rdtscp) // RDTSCP [IMPLICIT] EDX:EAX:EXC <- CNT
ASMJIT_INST_0x(ret, Ret)
- ASMJIT_INST_1i(ret, Ret, Imm)
- ASMJIT_INST_0x(sahf, Sahf) // LAHFSAHF [IMPLICIT] EFL <- AH
- ASMJIT_INST_0x(syscall, Syscall) // X64 [IMPLICIT]
- ASMJIT_INST_0x(sysenter, Sysenter) // X64 [IMPLICIT]
- ASMJIT_INST_0x(sysexit, Sysexit) // X64 [IMPLICIT]
- ASMJIT_INST_0x(sysexit64, Sysexit64) // X64 [IMPLICIT]
- ASMJIT_INST_0x(sysret, Sysret) // X64 [IMPLICIT]
- ASMJIT_INST_0x(sysret64, Sysret64) // X64 [IMPLICIT]
- ASMJIT_INST_0x(wrmsr, Wrmsr) // ANY [IMPLICIT]
+ ASMJIT_INST_1x(ret, Ret, Imm)
+ ASMJIT_INST_0x(retf, Retf)
+ ASMJIT_INST_1x(retf, Retf, Imm)
ASMJIT_INST_0x(xlatb, Xlatb) // ANY [IMPLICIT]
//! \}
@@ -3633,15 +3988,19 @@ struct EmitterImplicitT : public EmitterExplicitT<This> {
//! \name String Instruction Aliases
//! \{
+ //! \cond
+ using EmitterExplicitT<This>::movsd;
+ //! \endcond
+
inline Error cmpsb() { return _emitter()->emit(Inst::kIdCmps, EmitterExplicitT<This>::ptr_zsi(0, 1), EmitterExplicitT<This>::ptr_zdi(0, 1)); }
inline Error cmpsd() { return _emitter()->emit(Inst::kIdCmps, EmitterExplicitT<This>::ptr_zsi(0, 4), EmitterExplicitT<This>::ptr_zdi(0, 4)); }
inline Error cmpsq() { return _emitter()->emit(Inst::kIdCmps, EmitterExplicitT<This>::ptr_zsi(0, 8), EmitterExplicitT<This>::ptr_zdi(0, 8)); }
inline Error cmpsw() { return _emitter()->emit(Inst::kIdCmps, EmitterExplicitT<This>::ptr_zsi(0, 2), EmitterExplicitT<This>::ptr_zdi(0, 2)); }
- inline Error lodsb() { return _emitter()->emit(Inst::kIdLods, al , EmitterExplicitT<This>::ptr_zdi(0, 1)); }
- inline Error lodsd() { return _emitter()->emit(Inst::kIdLods, eax, EmitterExplicitT<This>::ptr_zdi(0, 4)); }
- inline Error lodsq() { return _emitter()->emit(Inst::kIdLods, rax, EmitterExplicitT<This>::ptr_zdi(0, 8)); }
- inline Error lodsw() { return _emitter()->emit(Inst::kIdLods, ax , EmitterExplicitT<This>::ptr_zdi(0, 2)); }
+ inline Error lodsb() { return _emitter()->emit(Inst::kIdLods, al , EmitterExplicitT<This>::ptr_zsi(0, 1)); }
+ inline Error lodsd() { return _emitter()->emit(Inst::kIdLods, eax, EmitterExplicitT<This>::ptr_zsi(0, 4)); }
+ inline Error lodsq() { return _emitter()->emit(Inst::kIdLods, rax, EmitterExplicitT<This>::ptr_zsi(0, 8)); }
+ inline Error lodsw() { return _emitter()->emit(Inst::kIdLods, ax , EmitterExplicitT<This>::ptr_zsi(0, 2)); }
inline Error movsb() { return _emitter()->emit(Inst::kIdMovs, EmitterExplicitT<This>::ptr_zdi(0, 1), EmitterExplicitT<This>::ptr_zsi(0, 1)); }
inline Error movsd() { return _emitter()->emit(Inst::kIdMovs, EmitterExplicitT<This>::ptr_zdi(0, 4), EmitterExplicitT<This>::ptr_zsi(0, 4)); }
@@ -3660,24 +4019,119 @@ struct EmitterImplicitT : public EmitterExplicitT<This> {
//! \}
- //! \name CL Instructions
+ //! \name Deprecated 32-bit Instructions
//! \{
+ //! \cond
+ using EmitterExplicitT<This>::aaa;
+ using EmitterExplicitT<This>::aad;
+ using EmitterExplicitT<This>::aam;
+ using EmitterExplicitT<This>::aas;
+ using EmitterExplicitT<This>::daa;
+ using EmitterExplicitT<This>::das;
+ //! \endcond
+
+ ASMJIT_INST_0x(aaa, Aaa) // X86 [IMPLICIT]
+ ASMJIT_INST_1x(aad, Aad, Imm) // X86 [IMPLICIT]
+ ASMJIT_INST_1x(aam, Aam, Imm) // X86 [IMPLICIT]
+ ASMJIT_INST_0x(aas, Aas) // X86 [IMPLICIT]
+ ASMJIT_INST_0x(daa, Daa) // X86 [IMPLICIT]
+ ASMJIT_INST_0x(das, Das) // X86 [IMPLICIT]
+
+ //! \}
+
+ //! \name LAHF/SAHF Instructions
+ //! \{
+
+ //! \cond
+ using EmitterExplicitT<This>::lahf;
+ using EmitterExplicitT<This>::sahf;
+ //! \endcond
+
+ ASMJIT_INST_0x(lahf, Lahf) // LAHFSAHF [IMPLICIT] AH <- EFL
+ ASMJIT_INST_0x(sahf, Sahf) // LAHFSAHF [IMPLICIT] EFL <- AH
+
+ //! \}
+
+ //! \name CPUID Instruction
+ //! \{
+
+ //! \cond
+ using EmitterExplicitT<This>::cpuid;
+ //! \endcond
+
+ ASMJIT_INST_0x(cpuid, Cpuid) // I486 [IMPLICIT] EAX:EBX:ECX:EDX <- CPUID[EAX:ECX]
+
+ //! \}
+
+ //! \name CacheLine Instructions
+ //! \{
+
+ //! \cond
+ using EmitterExplicitT<This>::clzero;
+ //! \endcond
+
ASMJIT_INST_0x(clzero, Clzero) // CLZERO [IMPLICIT]
//! \}
+ //! \name RDPRU/RDPKRU Instructions
+ //! \{
+
+ //! \cond
+ using EmitterExplicitT<This>::rdpru;
+ using EmitterExplicitT<This>::rdpkru;
+ //! \endcond
+
+ ASMJIT_INST_0x(rdpru, Rdpru) // RDPRU [IMPLICIT] EDX:EAX <- PRU[ECX]
+ ASMJIT_INST_0x(rdpkru, Rdpkru) // RDPKRU [IMPLICIT] EDX:EAX <- PKRU[ECX]
+
+ //! \}
+
+ //! \name RDTSC/RDTSCP Instructions
+ //! \{
+
+ //! \cond
+ using EmitterExplicitT<This>::rdtsc;
+ using EmitterExplicitT<This>::rdtscp;
+ //! \endcond
+
+ ASMJIT_INST_0x(rdtsc, Rdtsc) // RDTSC [IMPLICIT] EDX:EAX <- CNT
+ ASMJIT_INST_0x(rdtscp, Rdtscp) // RDTSCP [IMPLICIT] EDX:EAX:EXC <- CNT
+
+ //! \}
+
//! \name BMI2 Instructions
//! \{
+ //! \cond
+ using EmitterExplicitT<This>::mulx;
+ //! \endcond
+
ASMJIT_INST_3x(mulx, Mulx, Gp, Gp, Gp) // BMI2 [IMPLICIT]
ASMJIT_INST_3x(mulx, Mulx, Gp, Gp, Mem) // BMI2 [IMPLICIT]
//! \}
- //! \name FXSR & XSAVE Instructions
+ //! \name XSAVE Instructions
//! \{
+ //! \cond
+ using EmitterExplicitT<This>::xgetbv;
+ using EmitterExplicitT<This>::xrstor;
+ using EmitterExplicitT<This>::xrstor64;
+ using EmitterExplicitT<This>::xrstors;
+ using EmitterExplicitT<This>::xrstors64;
+ using EmitterExplicitT<This>::xsave;
+ using EmitterExplicitT<This>::xsave64;
+ using EmitterExplicitT<This>::xsavec;
+ using EmitterExplicitT<This>::xsavec64;
+ using EmitterExplicitT<This>::xsaveopt;
+ using EmitterExplicitT<This>::xsaveopt64;
+ using EmitterExplicitT<This>::xsaves;
+ using EmitterExplicitT<This>::xsaves64;
+ //! \endcond
+
ASMJIT_INST_0x(xgetbv, Xgetbv) // XSAVE [IMPLICIT] EDX:EAX <- XCR[ECX]
ASMJIT_INST_1x(xrstor, Xrstor, Mem) // XSAVE [IMPLICIT]
ASMJIT_INST_1x(xrstor64, Xrstor64, Mem) // XSAVE+X64 [IMPLICIT]
@@ -3691,6 +4145,46 @@ struct EmitterImplicitT : public EmitterExplicitT<This> {
ASMJIT_INST_1x(xsaveopt64, Xsaveopt64, Mem) // XSAVE+X64 [IMPLICIT]
ASMJIT_INST_1x(xsaves, Xsaves, Mem) // XSAVE [IMPLICIT]
ASMJIT_INST_1x(xsaves64, Xsaves64, Mem) // XSAVE+X64 [IMPLICIT]
+
+ //! \}
+
+ //! \name SYSCALL/SYSENTER Instructions
+ //! \{
+
+ ASMJIT_INST_0x(syscall, Syscall) // X64 [IMPLICIT]
+ ASMJIT_INST_0x(sysenter, Sysenter) // X64 [IMPLICIT]
+
+ //! \}
+
+ //! \name HRESET Instructions
+ //! \{
+
+ //! \cond
+ using EmitterExplicitT<This>::hreset;
+ //! \endcond
+
+ ASMJIT_INST_1x(hreset, Hreset, Imm) // HRESET [IMPLICIT]
+
+ //! \}
+
+ //! \name Privileged Instructions
+ //! \{
+
+ //! \cond
+ using EmitterExplicitT<This>::rdmsr;
+ using EmitterExplicitT<This>::rdpmc;
+ using EmitterExplicitT<This>::wrmsr;
+ using EmitterExplicitT<This>::xsetbv;
+ //! \endcond
+
+ ASMJIT_INST_0x(pconfig, Pconfig) // PCONFIG [IMPLICIT]
+ ASMJIT_INST_0x(rdmsr, Rdmsr) // ANY [IMPLICIT]
+ ASMJIT_INST_0x(rdpmc, Rdpmc) // ANY [IMPLICIT]
+ ASMJIT_INST_0x(sysexit, Sysexit) // X64 [IMPLICIT]
+ ASMJIT_INST_0x(sysexitq, Sysexitq) // X64 [IMPLICIT]
+ ASMJIT_INST_0x(sysret, Sysret) // X64 [IMPLICIT]
+ ASMJIT_INST_0x(sysretq, Sysretq) // X64 [IMPLICIT]
+ ASMJIT_INST_0x(wrmsr, Wrmsr) // ANY [IMPLICIT]
ASMJIT_INST_0x(xsetbv, Xsetbv) // XSAVE [IMPLICIT] XCR[ECX] <- EDX:EAX
//! \}
@@ -3698,6 +4192,13 @@ struct EmitterImplicitT : public EmitterExplicitT<This> {
//! \name Monitor & MWait Instructions
//! \{
+ //! \cond
+ using EmitterExplicitT<This>::monitor;
+ using EmitterExplicitT<This>::monitorx;
+ using EmitterExplicitT<This>::mwait;
+ using EmitterExplicitT<This>::mwaitx;
+ //! \endcond
+
ASMJIT_INST_0x(monitor, Monitor)
ASMJIT_INST_0x(monitorx, Monitorx)
ASMJIT_INST_0x(mwait, Mwait)
@@ -3705,6 +4206,19 @@ struct EmitterImplicitT : public EmitterExplicitT<This> {
//! \}
+ //! \name WAITPKG Instructions
+ //! \{
+
+ //! \cond
+ using EmitterExplicitT<This>::tpause;
+ using EmitterExplicitT<This>::umwait;
+ //! \endcond
+
+ ASMJIT_INST_1x(tpause, Tpause, Gp)
+ ASMJIT_INST_1x(umwait, Umwait, Gp)
+
+ //! \}
+
//! \name MMX & SSE Instructions
//! \{
@@ -3728,21 +4242,23 @@ struct EmitterImplicitT : public EmitterExplicitT<This> {
ASMJIT_INST_2x(pblendvb, Pblendvb, Xmm, Mem) // SSE4_1 [IMPLICIT]
ASMJIT_INST_2x(maskmovq, Maskmovq, Mm, Mm) // SSE [IMPLICIT]
ASMJIT_INST_2x(maskmovdqu, Maskmovdqu, Xmm, Xmm) // SSE2 [IMPLICIT]
- ASMJIT_INST_3i(pcmpestri, Pcmpestri, Xmm, Xmm, Imm) // SSE4_1 [IMPLICIT]
- ASMJIT_INST_3i(pcmpestri, Pcmpestri, Xmm, Mem, Imm) // SSE4_1 [IMPLICIT]
- ASMJIT_INST_3i(pcmpestrm, Pcmpestrm, Xmm, Xmm, Imm) // SSE4_1 [IMPLICIT]
- ASMJIT_INST_3i(pcmpestrm, Pcmpestrm, Xmm, Mem, Imm) // SSE4_1 [IMPLICIT]
- ASMJIT_INST_3i(pcmpistri, Pcmpistri, Xmm, Xmm, Imm) // SSE4_1 [IMPLICIT]
- ASMJIT_INST_3i(pcmpistri, Pcmpistri, Xmm, Mem, Imm) // SSE4_1 [IMPLICIT]
- ASMJIT_INST_3i(pcmpistrm, Pcmpistrm, Xmm, Xmm, Imm) // SSE4_1 [IMPLICIT]
- ASMJIT_INST_3i(pcmpistrm, Pcmpistrm, Xmm, Mem, Imm) // SSE4_1 [IMPLICIT]
+ ASMJIT_INST_3x(pcmpestri, Pcmpestri, Xmm, Xmm, Imm) // SSE4_1 [IMPLICIT]
+ ASMJIT_INST_3x(pcmpestri, Pcmpestri, Xmm, Mem, Imm) // SSE4_1 [IMPLICIT]
+ ASMJIT_INST_3x(pcmpestrm, Pcmpestrm, Xmm, Xmm, Imm) // SSE4_1 [IMPLICIT]
+ ASMJIT_INST_3x(pcmpestrm, Pcmpestrm, Xmm, Mem, Imm) // SSE4_1 [IMPLICIT]
+ ASMJIT_INST_3x(pcmpistri, Pcmpistri, Xmm, Xmm, Imm) // SSE4_1 [IMPLICIT]
+ ASMJIT_INST_3x(pcmpistri, Pcmpistri, Xmm, Mem, Imm) // SSE4_1 [IMPLICIT]
+ ASMJIT_INST_3x(pcmpistrm, Pcmpistrm, Xmm, Xmm, Imm) // SSE4_1 [IMPLICIT]
+ ASMJIT_INST_3x(pcmpistrm, Pcmpistrm, Xmm, Mem, Imm) // SSE4_1 [IMPLICIT]
//! \}
//! \name SHA Instructions
//! \{
+ //! \cond
using EmitterExplicitT<This>::sha256rnds2;
+ //! \endcond
ASMJIT_INST_2x(sha256rnds2, Sha256rnds2, Xmm, Xmm) // SHA [IMPLICIT]
ASMJIT_INST_2x(sha256rnds2, Sha256rnds2, Xmm, Mem) // SHA [IMPLICIT]
@@ -3752,35 +4268,32 @@ struct EmitterImplicitT : public EmitterExplicitT<This> {
//! \name AVX, FMA, and AVX512 Instructions
//! \{
+ //! \cond
using EmitterExplicitT<This>::vmaskmovdqu;
using EmitterExplicitT<This>::vpcmpestri;
using EmitterExplicitT<This>::vpcmpestrm;
using EmitterExplicitT<This>::vpcmpistri;
using EmitterExplicitT<This>::vpcmpistrm;
+ //! \endcond
- ASMJIT_INST_2x(vmaskmovdqu, Vmaskmovdqu, Xmm, Xmm) // AVX [IMPLICIT]
- ASMJIT_INST_3i(vpcmpestri, Vpcmpestri, Xmm, Xmm, Imm) // AVX [IMPLICIT]
- ASMJIT_INST_3i(vpcmpestri, Vpcmpestri, Xmm, Mem, Imm) // AVX [IMPLICIT]
- ASMJIT_INST_3i(vpcmpestrm, Vpcmpestrm, Xmm, Xmm, Imm) // AVX [IMPLICIT]
- ASMJIT_INST_3i(vpcmpestrm, Vpcmpestrm, Xmm, Mem, Imm) // AVX [IMPLICIT]
- ASMJIT_INST_3i(vpcmpistri, Vpcmpistri, Xmm, Xmm, Imm) // AVX [IMPLICIT]
- ASMJIT_INST_3i(vpcmpistri, Vpcmpistri, Xmm, Mem, Imm) // AVX [IMPLICIT]
- ASMJIT_INST_3i(vpcmpistrm, Vpcmpistrm, Xmm, Xmm, Imm) // AVX [IMPLICIT]
- ASMJIT_INST_3i(vpcmpistrm, Vpcmpistrm, Xmm, Mem, Imm) // AVX [IMPLICIT]
+ ASMJIT_INST_2x(vmaskmovdqu, Vmaskmovdqu, Xmm, Xmm) // AVX [IMPLICIT]
+ ASMJIT_INST_3x(vpcmpestri, Vpcmpestri, Xmm, Xmm, Imm) // AVX [IMPLICIT]
+ ASMJIT_INST_3x(vpcmpestri, Vpcmpestri, Xmm, Mem, Imm) // AVX [IMPLICIT]
+ ASMJIT_INST_3x(vpcmpestrm, Vpcmpestrm, Xmm, Xmm, Imm) // AVX [IMPLICIT]
+ ASMJIT_INST_3x(vpcmpestrm, Vpcmpestrm, Xmm, Mem, Imm) // AVX [IMPLICIT]
+ ASMJIT_INST_3x(vpcmpistri, Vpcmpistri, Xmm, Xmm, Imm) // AVX [IMPLICIT]
+ ASMJIT_INST_3x(vpcmpistri, Vpcmpistri, Xmm, Mem, Imm) // AVX [IMPLICIT]
+ ASMJIT_INST_3x(vpcmpistrm, Vpcmpistrm, Xmm, Xmm, Imm) // AVX [IMPLICIT]
+ ASMJIT_INST_3x(vpcmpistrm, Vpcmpistrm, Xmm, Mem, Imm) // AVX [IMPLICIT]
//! \}
};
-// ============================================================================
-// [asmjit::x86::Emitter]
-// ============================================================================
-
//! Emitter (X86).
//!
-//! \note This class cannot be instantiated, you can only cast to it and use
-//! it as emitter that emits to either `x86::Assembler`, `x86::Builder`, or
-//! `x86::Compiler` (use with caution with `x86::Compiler` as it requires virtual
-//! registers).
+//! \note This class cannot be instantiated, you can only cast to it and use it as emitter that emits to either
+//! `x86::Assembler`, `x86::Builder`, or `x86::Compiler` (use with caution with `x86::Compiler` as it requires
+//! virtual registers).
class Emitter : public BaseEmitter, public EmitterImplicitT<Emitter> {
ASMJIT_NONCONSTRUCTIBLE(Emitter)
};
@@ -3789,19 +4302,12 @@ class Emitter : public BaseEmitter, public EmitterImplicitT<Emitter> {
#undef ASMJIT_INST_0x
#undef ASMJIT_INST_1x
-#undef ASMJIT_INST_1i
#undef ASMJIT_INST_1c
#undef ASMJIT_INST_2x
-#undef ASMJIT_INST_2i
#undef ASMJIT_INST_2c
#undef ASMJIT_INST_3x
-#undef ASMJIT_INST_3i
-#undef ASMJIT_INST_3ii
#undef ASMJIT_INST_4x
-#undef ASMJIT_INST_4i
-#undef ASMJIT_INST_4ii
#undef ASMJIT_INST_5x
-#undef ASMJIT_INST_5i
#undef ASMJIT_INST_6x
ASMJIT_END_SUB_NAMESPACE
diff --git a/3rdparty/asmjit/src/asmjit/x86/x86features.cpp b/3rdparty/asmjit/src/asmjit/x86/x86features.cpp
deleted file mode 100644
index 7c9505da197..00000000000
--- a/3rdparty/asmjit/src/asmjit/x86/x86features.cpp
+++ /dev/null
@@ -1,398 +0,0 @@
-// AsmJit - Machine code generation for C++
-//
-// * Official AsmJit Home Page: https://asmjit.com
-// * Official Github Repository: https://github.com/asmjit/asmjit
-//
-// Copyright (c) 2008-2020 The AsmJit Authors
-//
-// This software is provided 'as-is', without any express or implied
-// warranty. In no event will the authors be held liable for any damages
-// arising from the use of this software.
-//
-// Permission is granted to anyone to use this software for any purpose,
-// including commercial applications, and to alter it and redistribute it
-// freely, subject to the following restrictions:
-//
-// 1. The origin of this software must not be misrepresented; you must not
-// claim that you wrote the original software. If you use this software
-// in a product, an acknowledgment in the product documentation would be
-// appreciated but is not required.
-// 2. Altered source versions must be plainly marked as such, and must not be
-// misrepresented as being the original software.
-// 3. This notice may not be removed or altered from any source distribution.
-
-#include "../core/api-build_p.h"
-#if defined(ASMJIT_BUILD_X86) && ASMJIT_ARCH_X86
-
-#include "../core/cpuinfo.h"
-#include "../core/support.h"
-#include "../x86/x86features.h"
-
-// Required by `__cpuidex()` and `_xgetbv()`.
-#if defined(_MSC_VER)
- #include <intrin.h>
-#endif
-
-ASMJIT_BEGIN_SUB_NAMESPACE(x86)
-
-// ============================================================================
-// [asmjit::x86::Features - Detect]
-// ============================================================================
-
-struct cpuid_t { uint32_t eax, ebx, ecx, edx; };
-struct xgetbv_t { uint32_t eax, edx; };
-
-// Executes `cpuid` instruction.
-static inline void cpuidQuery(cpuid_t* out, uint32_t inEax, uint32_t inEcx = 0) noexcept {
-#if defined(_MSC_VER)
- __cpuidex(reinterpret_cast<int*>(out), inEax, inEcx);
-#elif defined(__GNUC__) && ASMJIT_ARCH_X86 == 32
- __asm__ __volatile__(
- "mov %%ebx, %%edi\n"
- "cpuid\n"
- "xchg %%edi, %%ebx\n" : "=a"(out->eax), "=D"(out->ebx), "=c"(out->ecx), "=d"(out->edx) : "a"(inEax), "c"(inEcx));
-#elif defined(__GNUC__) && ASMJIT_ARCH_X86 == 64
- __asm__ __volatile__(
- "mov %%rbx, %%rdi\n"
- "cpuid\n"
- "xchg %%rdi, %%rbx\n" : "=a"(out->eax), "=D"(out->ebx), "=c"(out->ecx), "=d"(out->edx) : "a"(inEax), "c"(inEcx));
-#else
- #error "[asmjit] x86::cpuidQuery() - Unsupported compiler."
-#endif
-}
-
-// Executes 'xgetbv' instruction.
-static inline void xgetbvQuery(xgetbv_t* out, uint32_t inEcx) noexcept {
-#if defined(_MSC_VER)
- uint64_t value = _xgetbv(inEcx);
- out->eax = uint32_t(value & 0xFFFFFFFFu);
- out->edx = uint32_t(value >> 32);
-#elif defined(__GNUC__)
- uint32_t outEax;
- uint32_t outEdx;
-
- // Replaced, because the world is not perfect:
- // __asm__ __volatile__("xgetbv" : "=a"(outEax), "=d"(outEdx) : "c"(inEcx));
- __asm__ __volatile__(".byte 0x0F, 0x01, 0xD0" : "=a"(outEax), "=d"(outEdx) : "c"(inEcx));
-
- out->eax = outEax;
- out->edx = outEdx;
-#else
- out->eax = 0;
- out->edx = 0;
-#endif
-}
-
-// Map a 12-byte vendor string returned by `cpuid` into a `CpuInfo::Vendor` ID.
-static inline void simplifyCpuVendor(CpuInfo& cpu, uint32_t d0, uint32_t d1, uint32_t d2) noexcept {
- struct Vendor {
- char normalized[8];
- union { char text[12]; uint32_t d[3]; };
- };
-
- static const Vendor table[] = {
- { { 'A', 'M', 'D' }, {{ 'A', 'u', 't', 'h', 'e', 'n', 't', 'i', 'c', 'A', 'M', 'D' }} },
- { { 'I', 'N', 'T', 'E', 'L' }, {{ 'G', 'e', 'n', 'u', 'i', 'n', 'e', 'I', 'n', 't', 'e', 'l' }} },
- { { 'V', 'I', 'A' }, {{ 'C', 'e', 'n', 't', 'a', 'u', 'r', 'H', 'a', 'u', 'l', 's' }} },
- { { 'V', 'I', 'A' }, {{ 'V', 'I', 'A', 0 , 'V', 'I', 'A', 0 , 'V', 'I', 'A', 0 }} },
- { { 'U', 'N', 'K', 'N', 'O', 'W', 'N' }, {{ 0 }} }
- };
-
- uint32_t i;
- for (i = 0; i < ASMJIT_ARRAY_SIZE(table) - 1; i++)
- if (table[i].d[0] == d0 && table[i].d[1] == d1 && table[i].d[2] == d2)
- break;
- memcpy(cpu._vendor.str, table[i].normalized, 8);
-}
-
-static inline void simplifyCpuBrand(char* s) noexcept {
- char* d = s;
-
- char c = s[0];
- char prev = 0;
-
- // Used to always clear the current character to ensure that the result
- // doesn't contain garbage after a new null terminator is placed at the end.
- s[0] = '\0';
-
- for (;;) {
- if (!c)
- break;
-
- if (!(c == ' ' && (prev == '@' || s[1] == ' ' || s[1] == '@'))) {
- *d++ = c;
- prev = c;
- }
-
- c = *++s;
- s[0] = '\0';
- }
-
- d[0] = '\0';
-}
-
-ASMJIT_FAVOR_SIZE void detectCpu(CpuInfo& cpu) noexcept {
- using Support::bitTest;
-
- cpuid_t regs;
- xgetbv_t xcr0 { 0, 0 };
- Features& features = cpu._features.as<Features>();
-
- cpu.reset();
- cpu._arch = Environment::kArchHost;
- cpu._subArch = Environment::kSubArchUnknown;
- cpu._reserved = 0;
- cpu._maxLogicalProcessors = 1;
- features.add(Features::kI486);
-
- // --------------------------------------------------------------------------
- // [CPUID EAX=0x0]
- // --------------------------------------------------------------------------
-
- // Get vendor string/id.
- cpuidQuery(&regs, 0x0);
-
- uint32_t maxId = regs.eax;
- simplifyCpuVendor(cpu, regs.ebx, regs.edx, regs.ecx);
-
- // --------------------------------------------------------------------------
- // [CPUID EAX=0x1]
- // --------------------------------------------------------------------------
-
- if (maxId >= 0x1) {
- // Get feature flags in ECX/EDX and family/model in EAX.
- cpuidQuery(&regs, 0x1);
-
- // Fill family and model fields.
- uint32_t modelId = (regs.eax >> 4) & 0x0F;
- uint32_t familyId = (regs.eax >> 8) & 0x0F;
-
- // Use extended family and model fields.
- if (familyId == 0x06u || familyId == 0x0Fu)
- modelId += (((regs.eax >> 16) & 0x0Fu) << 4);
-
- if (familyId == 0x0Fu)
- familyId += (((regs.eax >> 20) & 0xFFu) << 4);
-
- cpu._modelId = modelId;
- cpu._familyId = familyId;
- cpu._brandId = ((regs.ebx ) & 0xFF);
- cpu._processorType = ((regs.eax >> 12) & 0x03);
- cpu._maxLogicalProcessors = ((regs.ebx >> 16) & 0xFF);
- cpu._stepping = ((regs.eax ) & 0x0F);
- cpu._cacheLineSize = ((regs.ebx >> 8) & 0xFF) * 8;
-
- if (bitTest(regs.ecx, 0)) features.add(Features::kSSE3);
- if (bitTest(regs.ecx, 1)) features.add(Features::kPCLMULQDQ);
- if (bitTest(regs.ecx, 3)) features.add(Features::kMONITOR);
- if (bitTest(regs.ecx, 5)) features.add(Features::kVMX);
- if (bitTest(regs.ecx, 6)) features.add(Features::kSMX);
- if (bitTest(regs.ecx, 9)) features.add(Features::kSSSE3);
- if (bitTest(regs.ecx, 13)) features.add(Features::kCMPXCHG16B);
- if (bitTest(regs.ecx, 19)) features.add(Features::kSSE4_1);
- if (bitTest(regs.ecx, 20)) features.add(Features::kSSE4_2);
- if (bitTest(regs.ecx, 22)) features.add(Features::kMOVBE);
- if (bitTest(regs.ecx, 23)) features.add(Features::kPOPCNT);
- if (bitTest(regs.ecx, 25)) features.add(Features::kAESNI);
- if (bitTest(regs.ecx, 26)) features.add(Features::kXSAVE);
- if (bitTest(regs.ecx, 27)) features.add(Features::kOSXSAVE);
- if (bitTest(regs.ecx, 30)) features.add(Features::kRDRAND);
- if (bitTest(regs.edx, 0)) features.add(Features::kFPU);
- if (bitTest(regs.edx, 4)) features.add(Features::kRDTSC);
- if (bitTest(regs.edx, 5)) features.add(Features::kMSR);
- if (bitTest(regs.edx, 8)) features.add(Features::kCMPXCHG8B);
- if (bitTest(regs.edx, 15)) features.add(Features::kCMOV);
- if (bitTest(regs.edx, 19)) features.add(Features::kCLFLUSH);
- if (bitTest(regs.edx, 23)) features.add(Features::kMMX);
- if (bitTest(regs.edx, 24)) features.add(Features::kFXSR);
- if (bitTest(regs.edx, 25)) features.add(Features::kSSE, Features::kMMX2);
- if (bitTest(regs.edx, 26)) features.add(Features::kSSE, Features::kSSE2);
- if (bitTest(regs.edx, 28)) features.add(Features::kMT);
-
- // Get the content of XCR0 if supported by CPU and enabled by OS.
- if ((regs.ecx & 0x0C000000u) == 0x0C000000u) {
- xgetbvQuery(&xcr0, 0);
- }
-
- // Detect AVX+.
- if (bitTest(regs.ecx, 28)) {
- // - XCR0[2:1] == 11b
- // XMM & YMM states need to be enabled by OS.
- if ((xcr0.eax & 0x00000006u) == 0x00000006u) {
- features.add(Features::kAVX);
-
- if (bitTest(regs.ecx, 12)) features.add(Features::kFMA);
- if (bitTest(regs.ecx, 29)) features.add(Features::kF16C);
- }
- }
- }
-
- // --------------------------------------------------------------------------
- // [CPUID EAX=0x7]
- // --------------------------------------------------------------------------
-
- // Detect new features if the processor supports CPUID-07.
- bool maybeMPX = false;
-
- if (maxId >= 0x7) {
- cpuidQuery(&regs, 0x7);
- uint32_t maxSubLeafId = regs.eax;
-
- if (bitTest(regs.ebx, 0)) features.add(Features::kFSGSBASE);
- if (bitTest(regs.ebx, 3)) features.add(Features::kBMI);
- if (bitTest(regs.ebx, 4)) features.add(Features::kHLE);
- if (bitTest(regs.ebx, 7)) features.add(Features::kSMEP);
- if (bitTest(regs.ebx, 8)) features.add(Features::kBMI2);
- if (bitTest(regs.ebx, 9)) features.add(Features::kERMS);
- if (bitTest(regs.ebx, 11)) features.add(Features::kRTM);
- if (bitTest(regs.ebx, 14)) maybeMPX = true;
- if (bitTest(regs.ebx, 18)) features.add(Features::kRDSEED);
- if (bitTest(regs.ebx, 19)) features.add(Features::kADX);
- if (bitTest(regs.ebx, 20)) features.add(Features::kSMAP);
- if (bitTest(regs.ebx, 22)) features.add(Features::kPCOMMIT);
- if (bitTest(regs.ebx, 23)) features.add(Features::kCLFLUSHOPT);
- if (bitTest(regs.ebx, 24)) features.add(Features::kCLWB);
- if (bitTest(regs.ebx, 29)) features.add(Features::kSHA);
- if (bitTest(regs.ecx, 0)) features.add(Features::kPREFETCHWT1);
- if (bitTest(regs.ecx, 22)) features.add(Features::kRDPID);
- if (bitTest(regs.ecx, 25)) features.add(Features::kCLDEMOTE);
- if (bitTest(regs.ecx, 27)) features.add(Features::kMOVDIRI);
- if (bitTest(regs.ecx, 28)) features.add(Features::kMOVDIR64B);
- if (bitTest(regs.ecx, 29)) features.add(Features::kENQCMD);
- if (bitTest(regs.edx, 18)) features.add(Features::kPCONFIG);
-
- // Detect 'TSX' - Requires at least one of `HLE` and `RTM` features.
- if (features.hasHLE() || features.hasRTM())
- features.add(Features::kTSX);
-
- // Detect 'AVX2' - Requires AVX as well.
- if (bitTest(regs.ebx, 5) && features.hasAVX())
- features.add(Features::kAVX2);
-
- // Detect 'AVX_512'.
- if (bitTest(regs.ebx, 16)) {
- // - XCR0[2:1] == 11b - XMM/YMM states need to be enabled by OS.
- // - XCR0[7:5] == 111b - Upper 256-bit of ZMM0-XMM15 and ZMM16-ZMM31 need to be enabled by OS.
- if ((xcr0.eax & 0x000000E6u) == 0x000000E6u) {
- features.add(Features::kAVX512_F);
-
- if (bitTest(regs.ebx, 17)) features.add(Features::kAVX512_DQ);
- if (bitTest(regs.ebx, 21)) features.add(Features::kAVX512_IFMA);
- if (bitTest(regs.ebx, 26)) features.add(Features::kAVX512_PFI);
- if (bitTest(regs.ebx, 27)) features.add(Features::kAVX512_ERI);
- if (bitTest(regs.ebx, 28)) features.add(Features::kAVX512_CDI);
- if (bitTest(regs.ebx, 30)) features.add(Features::kAVX512_BW);
- if (bitTest(regs.ebx, 31)) features.add(Features::kAVX512_VL);
- if (bitTest(regs.ecx, 1)) features.add(Features::kAVX512_VBMI);
- if (bitTest(regs.ecx, 5)) features.add(Features::kWAITPKG);
- if (bitTest(regs.ecx, 6)) features.add(Features::kAVX512_VBMI2);
- if (bitTest(regs.ecx, 8)) features.add(Features::kGFNI);
- if (bitTest(regs.ecx, 9)) features.add(Features::kVAES);
- if (bitTest(regs.ecx, 10)) features.add(Features::kVPCLMULQDQ);
- if (bitTest(regs.ecx, 11)) features.add(Features::kAVX512_VNNI);
- if (bitTest(regs.ecx, 12)) features.add(Features::kAVX512_BITALG);
- if (bitTest(regs.ecx, 14)) features.add(Features::kAVX512_VPOPCNTDQ);
- if (bitTest(regs.edx, 2)) features.add(Features::kAVX512_4VNNIW);
- if (bitTest(regs.edx, 3)) features.add(Features::kAVX512_4FMAPS);
- if (bitTest(regs.edx, 8)) features.add(Features::kAVX512_VP2INTERSECT);
- }
- }
-
- if (maxSubLeafId >= 1 && features.hasAVX512_F()) {
- cpuidQuery(&regs, 0x7, 1);
-
- if (bitTest(regs.eax, 5)) features.add(Features::kAVX512_BF16);
- }
- }
-
- // --------------------------------------------------------------------------
- // [CPUID EAX=0xD]
- // --------------------------------------------------------------------------
-
- if (maxId >= 0xD) {
- cpuidQuery(&regs, 0xD, 0);
-
- // Both CPUID result and XCR0 has to be enabled to have support for MPX.
- if (((regs.eax & xcr0.eax) & 0x00000018u) == 0x00000018u && maybeMPX)
- features.add(Features::kMPX);
-
- cpuidQuery(&regs, 0xD, 1);
- if (bitTest(regs.eax, 0)) features.add(Features::kXSAVEOPT);
- if (bitTest(regs.eax, 1)) features.add(Features::kXSAVEC);
- if (bitTest(regs.eax, 3)) features.add(Features::kXSAVES);
- }
-
- // --------------------------------------------------------------------------
- // [CPUID EAX=0x80000000...maxId]
- // --------------------------------------------------------------------------
-
- maxId = 0x80000000u;
- uint32_t i = maxId;
-
- // The highest EAX that we understand.
- uint32_t kHighestProcessedEAX = 0x80000008u;
-
- // Several CPUID calls are required to get the whole branc string. It's easy
- // to copy one DWORD at a time instead of performing a byte copy.
- uint32_t* brand = cpu._brand.u32;
- do {
- cpuidQuery(&regs, i);
- switch (i) {
- case 0x80000000u:
- maxId = Support::min<uint32_t>(regs.eax, kHighestProcessedEAX);
- break;
-
- case 0x80000001u:
- if (bitTest(regs.ecx, 0)) features.add(Features::kLAHFSAHF);
- if (bitTest(regs.ecx, 2)) features.add(Features::kSVM);
- if (bitTest(regs.ecx, 5)) features.add(Features::kLZCNT);
- if (bitTest(regs.ecx, 6)) features.add(Features::kSSE4A);
- if (bitTest(regs.ecx, 7)) features.add(Features::kMSSE);
- if (bitTest(regs.ecx, 8)) features.add(Features::kPREFETCHW);
- if (bitTest(regs.ecx, 12)) features.add(Features::kSKINIT);
- if (bitTest(regs.ecx, 15)) features.add(Features::kLWP);
- if (bitTest(regs.ecx, 21)) features.add(Features::kTBM);
- if (bitTest(regs.ecx, 29)) features.add(Features::kMONITORX);
- if (bitTest(regs.edx, 20)) features.add(Features::kNX);
- if (bitTest(regs.edx, 21)) features.add(Features::kFXSROPT);
- if (bitTest(regs.edx, 22)) features.add(Features::kMMX2);
- if (bitTest(regs.edx, 27)) features.add(Features::kRDTSCP);
- if (bitTest(regs.edx, 30)) features.add(Features::k3DNOW2, Features::kMMX2);
- if (bitTest(regs.edx, 31)) features.add(Features::k3DNOW);
-
- if (cpu.hasFeature(Features::kAVX)) {
- if (bitTest(regs.ecx, 11)) features.add(Features::kXOP);
- if (bitTest(regs.ecx, 16)) features.add(Features::kFMA4);
- }
-
- // These seem to be only supported by AMD.
- if (cpu.isVendor("AMD")) {
- if (bitTest(regs.ecx, 4)) features.add(Features::kALTMOVCR8);
- }
- break;
-
- case 0x80000002u:
- case 0x80000003u:
- case 0x80000004u:
- *brand++ = regs.eax;
- *brand++ = regs.ebx;
- *brand++ = regs.ecx;
- *brand++ = regs.edx;
-
- // Go directly to the last one.
- if (i == 0x80000004u) i = 0x80000008u - 1;
- break;
-
- case 0x80000008u:
- if (bitTest(regs.ebx, 0)) features.add(Features::kCLZERO);
- break;
- }
- } while (++i <= maxId);
-
- // Simplify CPU brand string a bit by removing some unnecessary spaces.
- simplifyCpuBrand(cpu._brand.str);
-}
-
-ASMJIT_END_SUB_NAMESPACE
-
-#endif // ASMJIT_BUILD_X86 && ASMJIT_ARCH_X86
diff --git a/3rdparty/asmjit/src/asmjit/x86/x86features.h b/3rdparty/asmjit/src/asmjit/x86/x86features.h
deleted file mode 100644
index b26b52454b1..00000000000
--- a/3rdparty/asmjit/src/asmjit/x86/x86features.h
+++ /dev/null
@@ -1,290 +0,0 @@
-// AsmJit - Machine code generation for C++
-//
-// * Official AsmJit Home Page: https://asmjit.com
-// * Official Github Repository: https://github.com/asmjit/asmjit
-//
-// Copyright (c) 2008-2020 The AsmJit Authors
-//
-// This software is provided 'as-is', without any express or implied
-// warranty. In no event will the authors be held liable for any damages
-// arising from the use of this software.
-//
-// Permission is granted to anyone to use this software for any purpose,
-// including commercial applications, and to alter it and redistribute it
-// freely, subject to the following restrictions:
-//
-// 1. The origin of this software must not be misrepresented; you must not
-// claim that you wrote the original software. If you use this software
-// in a product, an acknowledgment in the product documentation would be
-// appreciated but is not required.
-// 2. Altered source versions must be plainly marked as such, and must not be
-// misrepresented as being the original software.
-// 3. This notice may not be removed or altered from any source distribution.
-
-#ifndef ASMJIT_X86_X86FEATURES_H_INCLUDED
-#define ASMJIT_X86_X86FEATURES_H_INCLUDED
-
-#include "../core/features.h"
-
-ASMJIT_BEGIN_SUB_NAMESPACE(x86)
-
-//! \addtogroup asmjit_x86
-//! \{
-
-// ============================================================================
-// [asmjit::x86::Features]
-// ============================================================================
-
-//! CPU features (X86).
-class Features : public BaseFeatures {
-public:
- //! CPU feature ID.
- enum Id : uint32_t {
- // @EnumValuesBegin{"enum": "x86::Features::Id"}@
-
- kNone = 0, //!< No feature (never set, used internally).
-
- kMT, //!< CPU has multi-threading capabilities.
- kNX, //!< CPU has Not-Execute-Bit aka DEP (data-execution prevention).
-
- k3DNOW, //!< CPU has 3DNOW (3DNOW base instructions) [AMD].
- k3DNOW2, //!< CPU has 3DNOW2 (enhanced 3DNOW) [AMD].
- kADX, //!< CPU has ADX (multi-precision add-carry instruction extensions).
- kAESNI, //!< CPU has AESNI (AES encode/decode instructions).
- kALTMOVCR8, //!< CPU has LOCK MOV R<->CR0 (supports `MOV R<->CR8` via `LOCK MOV R<->CR0` in 32-bit mode) [AMD].
- kAVX, //!< CPU has AVX (advanced vector extensions).
- kAVX2, //!< CPU has AVX2 (advanced vector extensions 2).
- kAVX512_4FMAPS, //!< CPU has AVX512_FMAPS (FMA packed single).
- kAVX512_4VNNIW, //!< CPU has AVX512_VNNIW (vector NN instructions word variable precision).
- kAVX512_BF16, //!< CPU has AVX512_BF16 (BFLOAT16 support instruction).
- kAVX512_BITALG, //!< CPU has AVX512_BITALG (VPOPCNT[B|W], VPSHUFBITQMB).
- kAVX512_BW, //!< CPU has AVX512_BW (packed BYTE|WORD).
- kAVX512_CDI, //!< CPU has AVX512_CDI (conflict detection).
- kAVX512_DQ, //!< CPU has AVX512_DQ (packed DWORD|QWORD).
- kAVX512_ERI, //!< CPU has AVX512_ERI (exponential and reciprocal).
- kAVX512_F, //!< CPU has AVX512_F (AVX512 foundation).
- kAVX512_IFMA, //!< CPU has AVX512_IFMA (integer fused-multiply-add using 52-bit precision).
- kAVX512_PFI, //!< CPU has AVX512_PFI (prefetch instructions).
- kAVX512_VBMI, //!< CPU has AVX512_VBMI (vector byte manipulation).
- kAVX512_VBMI2, //!< CPU has AVX512_VBMI2 (vector byte manipulation 2).
- kAVX512_VL, //!< CPU has AVX512_VL (vector length extensions).
- kAVX512_VNNI, //!< CPU has AVX512_VNNI (vector neural network instructions).
- kAVX512_VP2INTERSECT, //!< CPU has AVX512_VP2INTERSECT
- kAVX512_VPOPCNTDQ, //!< CPU has AVX512_VPOPCNTDQ (VPOPCNT[D|Q] instructions).
- kBMI, //!< CPU has BMI (bit manipulation instructions #1).
- kBMI2, //!< CPU has BMI2 (bit manipulation instructions #2).
- kCLDEMOTE, //!< CPU has CLDEMOTE (cache line demote).
- kCLFLUSH, //!< CPU has CLFUSH (Cache Line flush).
- kCLFLUSHOPT, //!< CPU has CLFUSHOPT (Cache Line flush - optimized).
- kCLWB, //!< CPU has CLWB.
- kCLZERO, //!< CPU has CLZERO.
- kCMOV, //!< CPU has CMOV (CMOV and FCMOV instructions).
- kCMPXCHG16B, //!< CPU has CMPXCHG16B (compare-exchange 16 bytes) [X86_64].
- kCMPXCHG8B, //!< CPU has CMPXCHG8B (compare-exchange 8 bytes).
- kENCLV, //!< CPU has ENCLV.
- kENQCMD, //!< CPU has ENQCMD (enqueue stores).
- kERMS, //!< CPU has ERMS (enhanced REP MOVSB/STOSB).
- kF16C, //!< CPU has F16C.
- kFMA, //!< CPU has FMA (fused-multiply-add 3 operand form).
- kFMA4, //!< CPU has FMA4 (fused-multiply-add 4 operand form).
- kFPU, //!< CPU has FPU (FPU support).
- kFSGSBASE, //!< CPU has FSGSBASE.
- kFXSR, //!< CPU has FXSR (FXSAVE/FXRSTOR instructions).
- kFXSROPT, //!< CPU has FXSROTP (FXSAVE/FXRSTOR is optimized).
- kGEODE, //!< CPU has GEODE extensions (3DNOW additions).
- kGFNI, //!< CPU has GFNI (Galois field instructions).
- kHLE, //!< CPU has HLE.
- kI486, //!< CPU has I486 features (I486+ support).
- kLAHFSAHF, //!< CPU has LAHF/SAHF (LAHF/SAHF in 64-bit mode) [X86_64].
- kLWP, //!< CPU has LWP (lightweight profiling) [AMD].
- kLZCNT, //!< CPU has LZCNT (LZCNT instruction).
- kMMX, //!< CPU has MMX (MMX base instructions).
- kMMX2, //!< CPU has MMX2 (MMX extensions or MMX2).
- kMONITOR, //!< CPU has MONITOR (MONITOR/MWAIT instructions).
- kMONITORX, //!< CPU has MONITORX (MONITORX/MWAITX instructions).
- kMOVBE, //!< CPU has MOVBE (move with byte-order swap).
- kMOVDIR64B, //!< CPU has MOVDIR64B (move 64 bytes as direct store).
- kMOVDIRI, //!< CPU has MOVDIRI (move dword/qword as direct store).
- kMPX, //!< CPU has MPX (memory protection extensions).
- kMSR, //!< CPU has MSR (RDMSR/WRMSR instructions).
- kMSSE, //!< CPU has MSSE (misaligned SSE support).
- kOSXSAVE, //!< CPU has OSXSAVE (XSAVE enabled by OS).
- kPCLMULQDQ, //!< CPU has PCLMULQDQ (packed carry-less multiplication).
- kPCOMMIT, //!< CPU has PCOMMIT (PCOMMIT instruction).
- kPCONFIG, //!< CPU has PCONFIG (PCONFIG instruction).
- kPOPCNT, //!< CPU has POPCNT (POPCNT instruction).
- kPREFETCHW, //!< CPU has PREFETCHW.
- kPREFETCHWT1, //!< CPU has PREFETCHWT1.
- kRDPID, //!< CPU has RDPID.
- kRDRAND, //!< CPU has RDRAND.
- kRDSEED, //!< CPU has RDSEED.
- kRDTSC, //!< CPU has RDTSC.
- kRDTSCP, //!< CPU has RDTSCP.
- kRTM, //!< CPU has RTM.
- kSHA, //!< CPU has SHA (SHA-1 and SHA-256 instructions).
- kSKINIT, //!< CPU has SKINIT (SKINIT/STGI instructions) [AMD].
- kSMAP, //!< CPU has SMAP (supervisor-mode access prevention).
- kSMEP, //!< CPU has SMEP (supervisor-mode execution prevention).
- kSMX, //!< CPU has SMX (safer mode extensions).
- kSSE, //!< CPU has SSE.
- kSSE2, //!< CPU has SSE2.
- kSSE3, //!< CPU has SSE3.
- kSSE4_1, //!< CPU has SSE4.1.
- kSSE4_2, //!< CPU has SSE4.2.
- kSSE4A, //!< CPU has SSE4A [AMD].
- kSSSE3, //!< CPU has SSSE3.
- kSVM, //!< CPU has SVM (virtualization) [AMD].
- kTBM, //!< CPU has TBM (trailing bit manipulation) [AMD].
- kTSX, //!< CPU has TSX.
- kVAES, //!< CPU has VAES (vector AES 256|512 bit support).
- kVMX, //!< CPU has VMX (virtualization) [INTEL].
- kVPCLMULQDQ, //!< CPU has VPCLMULQDQ (vector PCLMULQDQ 256|512-bit support).
- kWAITPKG, //!< CPU has WAITPKG (UMONITOR, UMWAIT, TPAUSE).
- kWBNOINVD, //!< CPU has WBNOINVD.
- kXOP, //!< CPU has XOP (XOP instructions) [AMD].
- kXSAVE, //!< CPU has XSAVE.
- kXSAVEC, //!< CPU has XSAVEC.
- kXSAVEOPT, //!< CPU has XSAVEOPT.
- kXSAVES, //!< CPU has XSAVES.
-
- // @EnumValuesEnd@
-
- kCount //!< Count of X86 CPU features.
- };
-
- //! \name Construction / Destruction
- //! \{
-
- inline Features() noexcept
- : BaseFeatures() {}
- inline Features(const Features& other) noexcept
- : BaseFeatures(other) {}
-
- //! \}
-
- //! \name Overloaded Operators
- //! \{
-
- inline Features& operator=(const Features& other) noexcept = default;
-
- //! \}
-
- //! \name Accessors
- //! \{
-
- #define ASMJIT_X86_FEATURE(FEATURE) \
- inline bool has##FEATURE() const noexcept { return has(k##FEATURE); }
-
- ASMJIT_X86_FEATURE(MT)
- ASMJIT_X86_FEATURE(NX)
-
- ASMJIT_X86_FEATURE(3DNOW)
- ASMJIT_X86_FEATURE(3DNOW2)
- ASMJIT_X86_FEATURE(ADX)
- ASMJIT_X86_FEATURE(AESNI)
- ASMJIT_X86_FEATURE(ALTMOVCR8)
- ASMJIT_X86_FEATURE(AVX)
- ASMJIT_X86_FEATURE(AVX2)
- ASMJIT_X86_FEATURE(AVX512_4FMAPS)
- ASMJIT_X86_FEATURE(AVX512_4VNNIW)
- ASMJIT_X86_FEATURE(AVX512_BF16)
- ASMJIT_X86_FEATURE(AVX512_BITALG)
- ASMJIT_X86_FEATURE(AVX512_BW)
- ASMJIT_X86_FEATURE(AVX512_CDI)
- ASMJIT_X86_FEATURE(AVX512_DQ)
- ASMJIT_X86_FEATURE(AVX512_ERI)
- ASMJIT_X86_FEATURE(AVX512_F)
- ASMJIT_X86_FEATURE(AVX512_IFMA)
- ASMJIT_X86_FEATURE(AVX512_PFI)
- ASMJIT_X86_FEATURE(AVX512_VBMI)
- ASMJIT_X86_FEATURE(AVX512_VBMI2)
- ASMJIT_X86_FEATURE(AVX512_VL)
- ASMJIT_X86_FEATURE(AVX512_VNNI)
- ASMJIT_X86_FEATURE(AVX512_VP2INTERSECT)
- ASMJIT_X86_FEATURE(AVX512_VPOPCNTDQ)
- ASMJIT_X86_FEATURE(BMI)
- ASMJIT_X86_FEATURE(BMI2)
- ASMJIT_X86_FEATURE(CLDEMOTE)
- ASMJIT_X86_FEATURE(CLFLUSH)
- ASMJIT_X86_FEATURE(CLFLUSHOPT)
- ASMJIT_X86_FEATURE(CLWB)
- ASMJIT_X86_FEATURE(CLZERO)
- ASMJIT_X86_FEATURE(CMOV)
- ASMJIT_X86_FEATURE(CMPXCHG16B)
- ASMJIT_X86_FEATURE(CMPXCHG8B)
- ASMJIT_X86_FEATURE(ENCLV)
- ASMJIT_X86_FEATURE(ENQCMD)
- ASMJIT_X86_FEATURE(ERMS)
- ASMJIT_X86_FEATURE(F16C)
- ASMJIT_X86_FEATURE(FMA)
- ASMJIT_X86_FEATURE(FMA4)
- ASMJIT_X86_FEATURE(FPU)
- ASMJIT_X86_FEATURE(FSGSBASE)
- ASMJIT_X86_FEATURE(FXSR)
- ASMJIT_X86_FEATURE(FXSROPT)
- ASMJIT_X86_FEATURE(GEODE)
- ASMJIT_X86_FEATURE(GFNI)
- ASMJIT_X86_FEATURE(HLE)
- ASMJIT_X86_FEATURE(I486)
- ASMJIT_X86_FEATURE(LAHFSAHF)
- ASMJIT_X86_FEATURE(LWP)
- ASMJIT_X86_FEATURE(LZCNT)
- ASMJIT_X86_FEATURE(MMX)
- ASMJIT_X86_FEATURE(MMX2)
- ASMJIT_X86_FEATURE(MONITOR)
- ASMJIT_X86_FEATURE(MONITORX)
- ASMJIT_X86_FEATURE(MOVBE)
- ASMJIT_X86_FEATURE(MOVDIR64B)
- ASMJIT_X86_FEATURE(MOVDIRI)
- ASMJIT_X86_FEATURE(MPX)
- ASMJIT_X86_FEATURE(MSR)
- ASMJIT_X86_FEATURE(MSSE)
- ASMJIT_X86_FEATURE(OSXSAVE)
- ASMJIT_X86_FEATURE(PCLMULQDQ)
- ASMJIT_X86_FEATURE(PCOMMIT)
- ASMJIT_X86_FEATURE(PCONFIG)
- ASMJIT_X86_FEATURE(POPCNT)
- ASMJIT_X86_FEATURE(PREFETCHW)
- ASMJIT_X86_FEATURE(PREFETCHWT1)
- ASMJIT_X86_FEATURE(RDPID)
- ASMJIT_X86_FEATURE(RDRAND)
- ASMJIT_X86_FEATURE(RDSEED)
- ASMJIT_X86_FEATURE(RDTSC)
- ASMJIT_X86_FEATURE(RDTSCP)
- ASMJIT_X86_FEATURE(RTM)
- ASMJIT_X86_FEATURE(SHA)
- ASMJIT_X86_FEATURE(SKINIT)
- ASMJIT_X86_FEATURE(SMAP)
- ASMJIT_X86_FEATURE(SMEP)
- ASMJIT_X86_FEATURE(SMX)
- ASMJIT_X86_FEATURE(SSE)
- ASMJIT_X86_FEATURE(SSE2)
- ASMJIT_X86_FEATURE(SSE3)
- ASMJIT_X86_FEATURE(SSSE3)
- ASMJIT_X86_FEATURE(SSE4A)
- ASMJIT_X86_FEATURE(SSE4_1)
- ASMJIT_X86_FEATURE(SSE4_2)
- ASMJIT_X86_FEATURE(SVM)
- ASMJIT_X86_FEATURE(TBM)
- ASMJIT_X86_FEATURE(TSX)
- ASMJIT_X86_FEATURE(XSAVE)
- ASMJIT_X86_FEATURE(XSAVEC)
- ASMJIT_X86_FEATURE(XSAVEOPT)
- ASMJIT_X86_FEATURE(XSAVES)
- ASMJIT_X86_FEATURE(VAES)
- ASMJIT_X86_FEATURE(VMX)
- ASMJIT_X86_FEATURE(VPCLMULQDQ)
- ASMJIT_X86_FEATURE(WAITPKG)
- ASMJIT_X86_FEATURE(WBNOINVD)
- ASMJIT_X86_FEATURE(XOP)
-
- #undef ASMJIT_X86_FEATURE
-
- //! \}
-};
-
-//! \}
-
-ASMJIT_END_SUB_NAMESPACE
-
-#endif // ASMJIT_X86_X86FEATURES_H_INCLUDED
diff --git a/3rdparty/asmjit/src/asmjit/x86/x86formatter.cpp b/3rdparty/asmjit/src/asmjit/x86/x86formatter.cpp
index 06553e401e0..d62dd18b638 100644
--- a/3rdparty/asmjit/src/asmjit/x86/x86formatter.cpp
+++ b/3rdparty/asmjit/src/asmjit/x86/x86formatter.cpp
@@ -1,33 +1,16 @@
-// AsmJit - Machine code generation for C++
+// This file is part of AsmJit project <https://asmjit.com>
//
-// * Official AsmJit Home Page: https://asmjit.com
-// * Official Github Repository: https://github.com/asmjit/asmjit
-//
-// Copyright (c) 2008-2020 The AsmJit Authors
-//
-// This software is provided 'as-is', without any express or implied
-// warranty. In no event will the authors be held liable for any damages
-// arising from the use of this software.
-//
-// Permission is granted to anyone to use this software for any purpose,
-// including commercial applications, and to alter it and redistribute it
-// freely, subject to the following restrictions:
-//
-// 1. The origin of this software must not be misrepresented; you must not
-// claim that you wrote the original software. If you use this software
-// in a product, an acknowledgment in the product documentation would be
-// appreciated but is not required.
-// 2. Altered source versions must be plainly marked as such, and must not be
-// misrepresented as being the original software.
-// 3. This notice may not be removed or altered from any source distribution.
+// See asmjit.h or LICENSE.md for license and copyright information
+// SPDX-License-Identifier: Zlib
#include "../core/api-build_p.h"
#ifndef ASMJIT_NO_LOGGING
+#include "../core/cpuinfo.h"
#include "../core/misc_p.h"
#include "../core/support.h"
-#include "../x86/x86features.h"
#include "../x86/x86formatter_p.h"
+#include "../x86/x86instapi_p.h"
#include "../x86/x86instdb_p.h"
#include "../x86/x86operand.h"
@@ -37,9 +20,8 @@
ASMJIT_BEGIN_SUB_NAMESPACE(x86)
-// ============================================================================
-// [asmjit::x86::FormatterInternal - Constants]
-// ============================================================================
+// x86::FormatterInternal - Constants
+// ==================================
struct RegFormatInfo {
struct TypeEntry {
@@ -53,65 +35,67 @@ struct RegFormatInfo {
uint8_t specialCount;
};
- TypeEntry typeEntries[BaseReg::kTypeMax + 1];
+ TypeEntry typeEntries[uint32_t(RegType::kMaxValue) + 1];
char typeStrings[128 - 32];
- NameEntry nameEntries[BaseReg::kTypeMax + 1];
+ NameEntry nameEntries[uint32_t(RegType::kMaxValue) + 1];
char nameStrings[280];
};
template<uint32_t X>
struct RegFormatInfo_T {
enum {
- kTypeIndex = X == Reg::kTypeGpbLo ? 1 :
- X == Reg::kTypeGpbHi ? 8 :
- X == Reg::kTypeGpw ? 15 :
- X == Reg::kTypeGpd ? 19 :
- X == Reg::kTypeGpq ? 23 :
- X == Reg::kTypeXmm ? 27 :
- X == Reg::kTypeYmm ? 31 :
- X == Reg::kTypeZmm ? 35 :
- X == Reg::kTypeMm ? 50 :
- X == Reg::kTypeKReg ? 53 :
- X == Reg::kTypeSReg ? 43 :
- X == Reg::kTypeCReg ? 59 :
- X == Reg::kTypeDReg ? 62 :
- X == Reg::kTypeSt ? 47 :
- X == Reg::kTypeBnd ? 55 :
- X == Reg::kTypeRip ? 39 : 0,
-
- kFormatIndex = X == Reg::kTypeGpbLo ? 1 :
- X == Reg::kTypeGpbHi ? 6 :
- X == Reg::kTypeGpw ? 11 :
- X == Reg::kTypeGpd ? 16 :
- X == Reg::kTypeGpq ? 21 :
- X == Reg::kTypeXmm ? 25 :
- X == Reg::kTypeYmm ? 31 :
- X == Reg::kTypeZmm ? 37 :
- X == Reg::kTypeMm ? 60 :
- X == Reg::kTypeKReg ? 65 :
- X == Reg::kTypeSReg ? 49 :
- X == Reg::kTypeCReg ? 75 :
- X == Reg::kTypeDReg ? 80 :
- X == Reg::kTypeSt ? 55 :
- X == Reg::kTypeBnd ? 69 :
- X == Reg::kTypeRip ? 43 : 0,
-
- kSpecialIndex = X == Reg::kTypeGpbLo ? 96 :
- X == Reg::kTypeGpbHi ? 128 :
- X == Reg::kTypeGpw ? 161 :
- X == Reg::kTypeGpd ? 160 :
- X == Reg::kTypeGpq ? 192 :
- X == Reg::kTypeSReg ? 224 :
- X == Reg::kTypeRip ? 85 : 0,
-
- kSpecialCount = X == Reg::kTypeGpbLo ? 8 :
- X == Reg::kTypeGpbHi ? 4 :
- X == Reg::kTypeGpw ? 8 :
- X == Reg::kTypeGpd ? 8 :
- X == Reg::kTypeGpq ? 8 :
- X == Reg::kTypeSReg ? 7 :
- X == Reg::kTypeRip ? 1 : 0
+ kTypeIndex = X == uint32_t(RegType::kX86_GpbLo) ? 1 :
+ X == uint32_t(RegType::kX86_GpbHi) ? 8 :
+ X == uint32_t(RegType::kX86_Gpw ) ? 15 :
+ X == uint32_t(RegType::kX86_Gpd ) ? 19 :
+ X == uint32_t(RegType::kX86_Gpq ) ? 23 :
+ X == uint32_t(RegType::kX86_Xmm ) ? 27 :
+ X == uint32_t(RegType::kX86_Ymm ) ? 31 :
+ X == uint32_t(RegType::kX86_Zmm ) ? 35 :
+ X == uint32_t(RegType::kX86_Mm ) ? 50 :
+ X == uint32_t(RegType::kX86_KReg ) ? 53 :
+ X == uint32_t(RegType::kX86_SReg ) ? 43 :
+ X == uint32_t(RegType::kX86_CReg ) ? 59 :
+ X == uint32_t(RegType::kX86_DReg ) ? 62 :
+ X == uint32_t(RegType::kX86_St ) ? 47 :
+ X == uint32_t(RegType::kX86_Bnd ) ? 55 :
+ X == uint32_t(RegType::kX86_Tmm ) ? 65 :
+ X == uint32_t(RegType::kX86_Rip ) ? 39 : 0,
+
+ kFormatIndex = X == uint32_t(RegType::kX86_GpbLo) ? 1 :
+ X == uint32_t(RegType::kX86_GpbHi) ? 6 :
+ X == uint32_t(RegType::kX86_Gpw ) ? 11 :
+ X == uint32_t(RegType::kX86_Gpd ) ? 16 :
+ X == uint32_t(RegType::kX86_Gpq ) ? 21 :
+ X == uint32_t(RegType::kX86_Xmm ) ? 25 :
+ X == uint32_t(RegType::kX86_Ymm ) ? 31 :
+ X == uint32_t(RegType::kX86_Zmm ) ? 37 :
+ X == uint32_t(RegType::kX86_Mm ) ? 60 :
+ X == uint32_t(RegType::kX86_KReg ) ? 65 :
+ X == uint32_t(RegType::kX86_SReg ) ? 49 :
+ X == uint32_t(RegType::kX86_CReg ) ? 75 :
+ X == uint32_t(RegType::kX86_DReg ) ? 80 :
+ X == uint32_t(RegType::kX86_St ) ? 55 :
+ X == uint32_t(RegType::kX86_Bnd ) ? 69 :
+ X == uint32_t(RegType::kX86_Tmm ) ? 89 :
+ X == uint32_t(RegType::kX86_Rip ) ? 43 : 0,
+
+ kSpecialIndex = X == uint32_t(RegType::kX86_GpbLo) ? 96 :
+ X == uint32_t(RegType::kX86_GpbHi) ? 128 :
+ X == uint32_t(RegType::kX86_Gpw ) ? 161 :
+ X == uint32_t(RegType::kX86_Gpd ) ? 160 :
+ X == uint32_t(RegType::kX86_Gpq ) ? 192 :
+ X == uint32_t(RegType::kX86_SReg ) ? 224 :
+ X == uint32_t(RegType::kX86_Rip ) ? 85 : 0,
+
+ kSpecialCount = X == uint32_t(RegType::kX86_GpbLo) ? 8 :
+ X == uint32_t(RegType::kX86_GpbHi) ? 4 :
+ X == uint32_t(RegType::kX86_Gpw ) ? 8 :
+ X == uint32_t(RegType::kX86_Gpd ) ? 8 :
+ X == uint32_t(RegType::kX86_Gpq ) ? 8 :
+ X == uint32_t(RegType::kX86_SReg ) ? 7 :
+ X == uint32_t(RegType::kX86_Rip ) ? 1 : 0
};
};
@@ -120,7 +104,7 @@ struct RegFormatInfo_T {
}
#define ASMJIT_REG_NAME_ENTRY(TYPE) { \
- RegTraits<TYPE>::kCount, \
+ RegTraits<RegType(TYPE)>::kCount, \
RegFormatInfo_T<TYPE>::kFormatIndex, \
RegFormatInfo_T<TYPE>::kSpecialIndex, \
RegFormatInfo_T<TYPE>::kSpecialCount \
@@ -146,7 +130,9 @@ static const RegFormatInfo x86RegFormatInfo = {
"k\0" // #53
"bnd\0" // #55
"cr\0" // #59
- "dr\0", // #62
+ "dr\0" // #62
+ "tmm\0" // #65
+ ,
// Register name entries and strings.
{ ASMJIT_LOOKUP_TABLE_32(ASMJIT_REG_NAME_ENTRY, 0) },
@@ -170,7 +156,8 @@ static const RegFormatInfo x86RegFormatInfo = {
"dr%u\0" // #80
"rip\0" // #85
- "\0\0\0\0\0\0\0" // #89
+ "tmm%u\0" // #89
+ "\0" // #95
"al\0\0" "cl\0\0" "dl\0\0" "bl\0\0" "spl\0" "bpl\0" "sil\0" "dil\0" // #96
"ah\0\0" "ch\0\0" "dh\0\0" "bh\0\0" "n/a\0" "n/a\0" "n/a\0" "n/a\0" // #128
@@ -183,25 +170,24 @@ static const RegFormatInfo x86RegFormatInfo = {
static const char* x86GetAddressSizeString(uint32_t size) noexcept {
switch (size) {
- case 1 : return "byte ";
- case 2 : return "word ";
- case 4 : return "dword ";
- case 6 : return "fword ";
- case 8 : return "qword ";
- case 10: return "tword ";
- case 16: return "oword ";
- case 32: return "yword ";
- case 64: return "zword ";
+ case 1 : return "byte ptr ";
+ case 2 : return "word ptr ";
+ case 4 : return "dword ptr ";
+ case 6 : return "fword ptr ";
+ case 8 : return "qword ptr ";
+ case 10: return "tbyte ptr ";
+ case 16: return "xmmword ptr ";
+ case 32: return "ymmword ptr ";
+ case 64: return "zmmword ptr ";
default: return "";
}
}
-// ============================================================================
-// [asmjit::x86::FormatterInternal - Format Feature]
-// ============================================================================
+// x86::FormatterInternal - Format FeatureId
+// =========================================
Error FormatterInternal::formatFeature(String& sb, uint32_t featureId) noexcept {
- // @EnumStringBegin{"enum": "x86::Features::Id", "output": "sFeature", "strip": "k"}@
+ // @EnumStringBegin{"enum": "CpuFeatures::X86", "output": "sFeature", "strip": "k"}@
static const char sFeatureString[] =
"None\0"
"MT\0"
@@ -211,6 +197,9 @@ Error FormatterInternal::formatFeature(String& sb, uint32_t featureId) noexcept
"ADX\0"
"AESNI\0"
"ALTMOVCR8\0"
+ "AMX_BF16\0"
+ "AMX_INT8\0"
+ "AMX_TILE\0"
"AVX\0"
"AVX2\0"
"AVX512_4FMAPS\0"
@@ -222,6 +211,7 @@ Error FormatterInternal::formatFeature(String& sb, uint32_t featureId) noexcept
"AVX512_DQ\0"
"AVX512_ERI\0"
"AVX512_F\0"
+ "AVX512_FP16\0"
"AVX512_IFMA\0"
"AVX512_PFI\0"
"AVX512_VBMI\0"
@@ -230,8 +220,11 @@ Error FormatterInternal::formatFeature(String& sb, uint32_t featureId) noexcept
"AVX512_VNNI\0"
"AVX512_VP2INTERSECT\0"
"AVX512_VPOPCNTDQ\0"
+ "AVX_VNNI\0"
"BMI\0"
"BMI2\0"
+ "CET_IBT\0"
+ "CET_SS\0"
"CLDEMOTE\0"
"CLFLUSH\0"
"CLFLUSHOPT\0"
@@ -253,10 +246,12 @@ Error FormatterInternal::formatFeature(String& sb, uint32_t featureId) noexcept
"GEODE\0"
"GFNI\0"
"HLE\0"
+ "HRESET\0"
"I486\0"
"LAHFSAHF\0"
"LWP\0"
"LZCNT\0"
+ "MCOMMIT\0"
"MMX\0"
"MMX2\0"
"MONITOR\0"
@@ -268,23 +263,27 @@ Error FormatterInternal::formatFeature(String& sb, uint32_t featureId) noexcept
"MSR\0"
"MSSE\0"
"OSXSAVE\0"
+ "OSPKE\0"
"PCLMULQDQ\0"
- "PCOMMIT\0"
"PCONFIG\0"
"POPCNT\0"
"PREFETCHW\0"
"PREFETCHWT1\0"
+ "PTWRITE\0"
"RDPID\0"
+ "RDPRU\0"
"RDRAND\0"
"RDSEED\0"
"RDTSC\0"
"RDTSCP\0"
"RTM\0"
+ "SERIALIZE\0"
"SHA\0"
"SKINIT\0"
"SMAP\0"
"SMEP\0"
"SMX\0"
+ "SNP\0"
"SSE\0"
"SSE2\0"
"SSE3\0"
@@ -295,6 +294,8 @@ Error FormatterInternal::formatFeature(String& sb, uint32_t featureId) noexcept
"SVM\0"
"TBM\0"
"TSX\0"
+ "TSXLDTRK\0"
+ "UINTR\0"
"VAES\0"
"VMX\0"
"VPCLMULQDQ\0"
@@ -308,32 +309,84 @@ Error FormatterInternal::formatFeature(String& sb, uint32_t featureId) noexcept
"<Unknown>\0";
static const uint16_t sFeatureIndex[] = {
- 0, 5, 8, 11, 17, 24, 28, 34, 44, 48, 53, 67, 81, 93, 107, 117, 128, 138,
- 149, 158, 170, 181, 193, 206, 216, 228, 248, 265, 269, 274, 283, 291, 302,
- 307, 314, 319, 330, 340, 346, 353, 358, 363, 367, 372, 376, 385, 390, 398,
- 404, 409, 413, 418, 427, 431, 437, 441, 446, 454, 463, 469, 479, 487, 491,
- 495, 500, 508, 518, 526, 534, 541, 551, 563, 569, 576, 583, 589, 596, 600,
- 604, 611, 616, 621, 625, 629, 634, 639, 646, 653, 659, 665, 669, 673, 677,
- 682, 686, 697, 705, 714, 718, 724, 731, 740, 747
+ 0, 5, 8, 11, 17, 24, 28, 34, 44, 53, 62, 71, 75, 80, 94, 108, 120, 134, 144,
+ 155, 165, 176, 185, 197, 209, 220, 232, 245, 255, 267, 287, 304, 313, 317,
+ 322, 330, 337, 346, 354, 365, 370, 377, 382, 393, 403, 409, 416, 421, 426,
+ 430, 435, 439, 448, 453, 461, 467, 472, 476, 483, 488, 497, 501, 507, 515,
+ 519, 524, 532, 541, 547, 557, 565, 569, 573, 578, 586, 592, 602, 610, 617,
+ 627, 639, 647, 653, 659, 666, 673, 679, 686, 690, 700, 704, 711, 716, 721,
+ 725, 729, 733, 738, 743, 750, 757, 763, 769, 773, 777, 781, 790, 796, 801,
+ 805, 816, 824, 833, 837, 843, 850, 859, 866
};
// @EnumStringEnd@
- return sb.append(sFeatureString + sFeatureIndex[Support::min<uint32_t>(featureId, x86::Features::kCount)]);
+ return sb.append(sFeatureString + sFeatureIndex[Support::min<uint32_t>(featureId, uint32_t(CpuFeatures::X86::kMaxValue) + 1)]);
+}
+
+// x86::FormatterInternal - Format Register
+// ========================================
+
+ASMJIT_FAVOR_SIZE Error FormatterInternal::formatRegister(String& sb, FormatFlags formatFlags, const BaseEmitter* emitter, Arch arch, RegType type, uint32_t id) noexcept {
+ DebugUtils::unused(arch);
+ const RegFormatInfo& info = x86RegFormatInfo;
+
+#ifndef ASMJIT_NO_COMPILER
+ if (Operand::isVirtId(id)) {
+ if (emitter && emitter->emitterType() == EmitterType::kCompiler) {
+ const BaseCompiler* cc = static_cast<const BaseCompiler*>(emitter);
+ if (cc->isVirtIdValid(id)) {
+ VirtReg* vReg = cc->virtRegById(id);
+ ASMJIT_ASSERT(vReg != nullptr);
+
+ const char* name = vReg->name();
+ if (name && name[0] != '\0')
+ ASMJIT_PROPAGATE(sb.append(name));
+ else
+ ASMJIT_PROPAGATE(sb.appendFormat("%%%u", unsigned(Operand::virtIdToIndex(id))));
+
+ if (vReg->type() != type && uint32_t(type) <= uint32_t(RegType::kMaxValue) && Support::test(formatFlags, FormatFlags::kRegCasts)) {
+ const RegFormatInfo::TypeEntry& typeEntry = info.typeEntries[size_t(type)];
+ if (typeEntry.index)
+ ASMJIT_PROPAGATE(sb.appendFormat("@%s", info.typeStrings + typeEntry.index));
+ }
+
+ return kErrorOk;
+ }
+ }
+ }
+#else
+ DebugUtils::unused(emitter, formatFlags);
+#endif
+
+ if (uint32_t(type) <= uint32_t(RegType::kMaxValue)) {
+ const RegFormatInfo::NameEntry& nameEntry = info.nameEntries[size_t(type)];
+
+ if (id < nameEntry.specialCount)
+ return sb.append(info.nameStrings + nameEntry.specialIndex + id * 4);
+
+ if (id < nameEntry.count)
+ return sb.appendFormat(info.nameStrings + nameEntry.formatIndex, unsigned(id));
+
+ const RegFormatInfo::TypeEntry& typeEntry = info.typeEntries[size_t(type)];
+ if (typeEntry.index)
+ return sb.appendFormat("%s@%u", info.typeStrings + typeEntry.index, id);
+ }
+
+ return sb.appendFormat("<Reg-%u>?%u", uint32_t(type), id);
}
-// ============================================================================
-// [asmjit::x86::FormatterInternal - Format Operand]
-// ============================================================================
+// x86::FormatterInternal - Format Operand
+// =======================================
ASMJIT_FAVOR_SIZE Error FormatterInternal::formatOperand(
String& sb,
- uint32_t flags,
+ FormatFlags formatFlags,
const BaseEmitter* emitter,
- uint32_t arch,
+ Arch arch,
const Operand_& op) noexcept {
if (op.isReg())
- return formatRegister(sb, flags, emitter, arch, op.as<BaseReg>().type(), op.as<BaseReg>().id());
+ return formatRegister(sb, formatFlags, emitter, arch, op.as<BaseReg>().type(), op.as<BaseReg>().id());
if (op.isMem()) {
const Mem& m = op.as<Mem>();
@@ -346,21 +399,27 @@ ASMJIT_FAVOR_SIZE Error FormatterInternal::formatOperand(
ASMJIT_PROPAGATE(sb.append('['));
switch (m.addrType()) {
- case BaseMem::kAddrTypeAbs: ASMJIT_PROPAGATE(sb.append("abs ")); break;
- case BaseMem::kAddrTypeRel: ASMJIT_PROPAGATE(sb.append("rel ")); break;
+ case Mem::AddrType::kDefault:
+ break;
+ case Mem::AddrType::kAbs:
+ ASMJIT_PROPAGATE(sb.append("abs "));
+ break;
+ case Mem::AddrType::kRel:
+ ASMJIT_PROPAGATE(sb.append("rel "));
+ break;
}
char opSign = '\0';
if (m.hasBase()) {
opSign = '+';
if (m.hasBaseLabel()) {
- ASMJIT_PROPAGATE(Formatter::formatLabel(sb, flags, emitter, m.baseId()));
+ ASMJIT_PROPAGATE(Formatter::formatLabel(sb, formatFlags, emitter, m.baseId()));
}
else {
- uint32_t modifiedFlags = flags;
+ FormatFlags modifiedFlags = formatFlags;
if (m.isRegHome()) {
ASMJIT_PROPAGATE(sb.append("&"));
- modifiedFlags &= ~FormatOptions::kFlagRegCasts;
+ modifiedFlags &= ~FormatFlags::kRegCasts;
}
ASMJIT_PROPAGATE(formatRegister(sb, modifiedFlags, emitter, arch, m.baseType(), m.baseId()));
}
@@ -371,7 +430,7 @@ ASMJIT_FAVOR_SIZE Error FormatterInternal::formatOperand(
ASMJIT_PROPAGATE(sb.append(opSign));
opSign = '+';
- ASMJIT_PROPAGATE(formatRegister(sb, flags, emitter, arch, m.indexType(), m.indexId()));
+ ASMJIT_PROPAGATE(formatRegister(sb, formatFlags, emitter, arch, m.indexType(), m.indexId()));
if (m.hasShift())
ASMJIT_PROPAGATE(sb.appendFormat("*%u", 1 << m.shift()));
}
@@ -387,7 +446,7 @@ ASMJIT_FAVOR_SIZE Error FormatterInternal::formatOperand(
ASMJIT_PROPAGATE(sb.append(opSign));
uint32_t base = 10;
- if ((flags & FormatOptions::kFlagHexOffsets) != 0 && off > 9) {
+ if (Support::test(formatFlags, FormatFlags::kHexOffsets) && off > 9) {
ASMJIT_PROPAGATE(sb.append("0x", 2));
base = 16;
}
@@ -402,7 +461,7 @@ ASMJIT_FAVOR_SIZE Error FormatterInternal::formatOperand(
const Imm& i = op.as<Imm>();
int64_t val = i.value();
- if ((flags & FormatOptions::kFlagHexImms) != 0 && uint64_t(val) > 9) {
+ if (Support::test(formatFlags, FormatFlags::kHexImms) && uint64_t(val) > 9) {
ASMJIT_PROPAGATE(sb.append("0x", 2));
return sb.appendUInt(uint64_t(val), 16);
}
@@ -412,15 +471,14 @@ ASMJIT_FAVOR_SIZE Error FormatterInternal::formatOperand(
}
if (op.isLabel()) {
- return Formatter::formatLabel(sb, flags, emitter, op.id());
+ return Formatter::formatLabel(sb, formatFlags, emitter, op.id());
}
return sb.append("<None>");
}
-// ============================================================================
-// [asmjit::x86::FormatterInternal - Format Immediate (Extension)]
-// ============================================================================
+// x86::FormatterInternal - Format Immediate (Extension)
+// =====================================================
static constexpr char kImmCharStart = '{';
static constexpr char kImmCharEnd = '}';
@@ -508,12 +566,12 @@ ASMJIT_FAVOR_SIZE static Error FormatterInternal_formatImmText(String& sb, uint3
ASMJIT_FAVOR_SIZE static Error FormatterInternal_explainConst(
String& sb,
- uint32_t flags,
- uint32_t instId,
+ FormatFlags formatFlags,
+ InstId instId,
uint32_t vecSize,
const Imm& imm) noexcept {
- DebugUtils::unused(flags);
+ DebugUtils::unused(formatFlags);
static const char vcmpx[] =
"EQ_OQ\0" "LT_OS\0" "LE_OS\0" "UNORD_Q\0" "NEQ_UQ\0" "NLT_US\0" "NLE_US\0" "ORD_Q\0"
@@ -746,106 +804,76 @@ ASMJIT_FAVOR_SIZE static Error FormatterInternal_explainConst(
}
}
-// ============================================================================
-// [asmjit::x86::FormatterInternal - Format Register]
-// ============================================================================
-
-ASMJIT_FAVOR_SIZE Error FormatterInternal::formatRegister(String& sb, uint32_t flags, const BaseEmitter* emitter, uint32_t arch, uint32_t rType, uint32_t rId) noexcept {
- DebugUtils::unused(arch);
- const RegFormatInfo& info = x86RegFormatInfo;
-
-#ifndef ASMJIT_NO_COMPILER
- if (Operand::isVirtId(rId)) {
- if (emitter && emitter->emitterType() == BaseEmitter::kTypeCompiler) {
- const BaseCompiler* cc = static_cast<const BaseCompiler*>(emitter);
- if (cc->isVirtIdValid(rId)) {
- VirtReg* vReg = cc->virtRegById(rId);
- ASMJIT_ASSERT(vReg != nullptr);
-
- const char* name = vReg->name();
- if (name && name[0] != '\0')
- ASMJIT_PROPAGATE(sb.append(name));
- else
- ASMJIT_PROPAGATE(sb.appendFormat("%%%u", unsigned(Operand::virtIdToIndex(rId))));
-
- if (vReg->type() != rType && rType <= BaseReg::kTypeMax && (flags & FormatOptions::kFlagRegCasts) != 0) {
- const RegFormatInfo::TypeEntry& typeEntry = info.typeEntries[rType];
- if (typeEntry.index)
- ASMJIT_PROPAGATE(sb.appendFormat("@%s", info.typeStrings + typeEntry.index));
- }
-
- return kErrorOk;
- }
- }
- }
-#else
- DebugUtils::unused(emitter, flags);
-#endif
-
- if (ASMJIT_LIKELY(rType <= BaseReg::kTypeMax)) {
- const RegFormatInfo::NameEntry& nameEntry = info.nameEntries[rType];
-
- if (rId < nameEntry.specialCount)
- return sb.append(info.nameStrings + nameEntry.specialIndex + rId * 4);
-
- if (rId < nameEntry.count)
- return sb.appendFormat(info.nameStrings + nameEntry.formatIndex, unsigned(rId));
-
- const RegFormatInfo::TypeEntry& typeEntry = info.typeEntries[rType];
- if (typeEntry.index)
- return sb.appendFormat("%s@%u", info.typeStrings + typeEntry.index, rId);
- }
-
- return sb.appendFormat("Reg?%u@%u", rType, rId);
-}
-
-// ============================================================================
-// [asmjit::x86::FormatterInternal - Format Instruction]
-// ============================================================================
+// x86::FormatterInternal - Format Instruction
+// ===========================================
ASMJIT_FAVOR_SIZE Error FormatterInternal::formatInstruction(
String& sb,
- uint32_t flags,
+ FormatFlags formatFlags,
const BaseEmitter* emitter,
- uint32_t arch,
+ Arch arch,
const BaseInst& inst, const Operand_* operands, size_t opCount) noexcept {
- uint32_t instId = inst.id();
- uint32_t options = inst.options();
+ InstId instId = inst.id();
+ InstOptions options = inst.options();
// Format instruction options and instruction mnemonic.
if (instId < Inst::_kIdCount) {
+ // VEX|EVEX options.
+ if (Support::test(options, InstOptions::kX86_Vex))
+ ASMJIT_PROPAGATE(sb.append("{vex} "));
+
+ if (Support::test(options, InstOptions::kX86_Vex3))
+ ASMJIT_PROPAGATE(sb.append("{vex3} "));
+
+ if (Support::test(options, InstOptions::kX86_Evex))
+ ASMJIT_PROPAGATE(sb.append("{evex} "));
+
+ // MOD/RM and MOD/MR options
+ if (Support::test(options, InstOptions::kX86_ModRM))
+ ASMJIT_PROPAGATE(sb.append("{modrm} "));
+ else if (Support::test(options, InstOptions::kX86_ModMR))
+ ASMJIT_PROPAGATE(sb.append("{modmr} "));
+
// SHORT|LONG options.
- if (options & Inst::kOptionShortForm) ASMJIT_PROPAGATE(sb.append("short "));
- if (options & Inst::kOptionLongForm) ASMJIT_PROPAGATE(sb.append("long "));
+ if (Support::test(options, InstOptions::kShortForm))
+ ASMJIT_PROPAGATE(sb.append("short "));
+
+ if (Support::test(options, InstOptions::kLongForm))
+ ASMJIT_PROPAGATE(sb.append("long "));
// LOCK|XACQUIRE|XRELEASE options.
- if (options & Inst::kOptionXAcquire) ASMJIT_PROPAGATE(sb.append("xacquire "));
- if (options & Inst::kOptionXRelease) ASMJIT_PROPAGATE(sb.append("xrelease "));
- if (options & Inst::kOptionLock) ASMJIT_PROPAGATE(sb.append("lock "));
+ if (Support::test(options, InstOptions::kX86_XAcquire))
+ ASMJIT_PROPAGATE(sb.append("xacquire "));
+
+ if (Support::test(options, InstOptions::kX86_XRelease))
+ ASMJIT_PROPAGATE(sb.append("xrelease "));
+
+ if (Support::test(options, InstOptions::kX86_Lock))
+ ASMJIT_PROPAGATE(sb.append("lock "));
// REP|REPNE options.
- if (options & (Inst::kOptionRep | Inst::kOptionRepne)) {
- sb.append((options & Inst::kOptionRep) ? "rep " : "repnz ");
+ if (Support::test(options, InstOptions::kX86_Rep | InstOptions::kX86_Repne)) {
+ sb.append(Support::test(options, InstOptions::kX86_Rep) ? "rep " : "repnz ");
if (inst.hasExtraReg()) {
ASMJIT_PROPAGATE(sb.append("{"));
- ASMJIT_PROPAGATE(formatOperand(sb, flags, emitter, arch, inst.extraReg().toReg<BaseReg>()));
+ ASMJIT_PROPAGATE(formatOperand(sb, formatFlags, emitter, arch, inst.extraReg().toReg<BaseReg>()));
ASMJIT_PROPAGATE(sb.append("} "));
}
}
// REX options.
- if (options & Inst::kOptionRex) {
- const uint32_t kRXBWMask = Inst::kOptionOpCodeR |
- Inst::kOptionOpCodeX |
- Inst::kOptionOpCodeB |
- Inst::kOptionOpCodeW ;
- if (options & kRXBWMask) {
- sb.append("rex.");
- if (options & Inst::kOptionOpCodeR) sb.append('r');
- if (options & Inst::kOptionOpCodeX) sb.append('x');
- if (options & Inst::kOptionOpCodeB) sb.append('b');
- if (options & Inst::kOptionOpCodeW) sb.append('w');
+ if (Support::test(options, InstOptions::kX86_Rex)) {
+ const InstOptions kRXBWMask = InstOptions::kX86_OpCodeR |
+ InstOptions::kX86_OpCodeX |
+ InstOptions::kX86_OpCodeB |
+ InstOptions::kX86_OpCodeW ;
+ if (Support::test(options, kRXBWMask)) {
+ ASMJIT_PROPAGATE(sb.append("rex."));
+ if (Support::test(options, InstOptions::kX86_OpCodeR)) sb.append('r');
+ if (Support::test(options, InstOptions::kX86_OpCodeX)) sb.append('x');
+ if (Support::test(options, InstOptions::kX86_OpCodeB)) sb.append('b');
+ if (Support::test(options, InstOptions::kX86_OpCodeW)) sb.append('w');
sb.append(' ');
}
else {
@@ -853,11 +881,7 @@ ASMJIT_FAVOR_SIZE Error FormatterInternal::formatInstruction(
}
}
- // VEX|EVEX options.
- if (options & Inst::kOptionVex3) ASMJIT_PROPAGATE(sb.append("vex3 "));
- if (options & Inst::kOptionEvex) ASMJIT_PROPAGATE(sb.append("evex "));
-
- ASMJIT_PROPAGATE(InstAPI::instIdToString(arch, instId, sb));
+ ASMJIT_PROPAGATE(InstInternal::instIdToString(arch, instId, sb));
}
else {
ASMJIT_PROPAGATE(sb.appendFormat("[InstId=#%u]", unsigned(instId)));
@@ -868,34 +892,47 @@ ASMJIT_FAVOR_SIZE Error FormatterInternal::formatInstruction(
if (op.isNone()) break;
ASMJIT_PROPAGATE(sb.append(i == 0 ? " " : ", "));
- ASMJIT_PROPAGATE(formatOperand(sb, flags, emitter, arch, op));
+ ASMJIT_PROPAGATE(formatOperand(sb, formatFlags, emitter, arch, op));
- if (op.isImm() && (flags & FormatOptions::kFlagExplainImms)) {
+ if (op.isImm() && uint32_t(formatFlags & FormatFlags::kExplainImms)) {
uint32_t vecSize = 16;
for (uint32_t j = 0; j < opCount; j++)
if (operands[j].isReg())
vecSize = Support::max<uint32_t>(vecSize, operands[j].size());
- ASMJIT_PROPAGATE(FormatterInternal_explainConst(sb, flags, instId, vecSize, op.as<Imm>()));
+ ASMJIT_PROPAGATE(FormatterInternal_explainConst(sb, formatFlags, instId, vecSize, op.as<Imm>()));
}
// Support AVX-512 masking - {k}{z}.
if (i == 0) {
- if (inst.extraReg().group() == Reg::kGroupKReg) {
+ if (inst.extraReg().group() == RegGroup::kX86_K) {
ASMJIT_PROPAGATE(sb.append(" {"));
- ASMJIT_PROPAGATE(formatRegister(sb, flags, emitter, arch, inst.extraReg().type(), inst.extraReg().id()));
+ ASMJIT_PROPAGATE(formatRegister(sb, formatFlags, emitter, arch, inst.extraReg().type(), inst.extraReg().id()));
ASMJIT_PROPAGATE(sb.append('}'));
- if (options & Inst::kOptionZMask)
+ if (Support::test(options, InstOptions::kX86_ZMask))
ASMJIT_PROPAGATE(sb.append("{z}"));
}
- else if (options & Inst::kOptionZMask) {
+ else if (Support::test(options, InstOptions::kX86_ZMask)) {
ASMJIT_PROPAGATE(sb.append(" {z}"));
}
}
// Support AVX-512 broadcast - {1tox}.
if (op.isMem() && op.as<Mem>().hasBroadcast()) {
- ASMJIT_PROPAGATE(sb.appendFormat(" {1to%u}", Support::bitMask(op.as<Mem>().getBroadcast())));
+ ASMJIT_PROPAGATE(sb.appendFormat(" {1to%u}", Support::bitMask(uint32_t(op.as<Mem>().getBroadcast()))));
+ }
+ }
+
+ // Support AVX-512 embedded rounding and suppress-all-exceptions {sae}.
+ if (inst.hasOption(InstOptions::kX86_ER | InstOptions::kX86_SAE)) {
+ if (inst.hasOption(InstOptions::kX86_ER)) {
+ uint32_t bits = uint32_t(inst.options() & InstOptions::kX86_ERMask) >> Support::ConstCTZ<uint32_t(InstOptions::kX86_ERMask)>::value;
+
+ const char roundingModes[] = "rn\0rd\0ru\0rz";
+ ASMJIT_PROPAGATE(sb.appendFormat(", {%s-sae}", roundingModes + bits * 3));
+ }
+ else {
+ ASMJIT_PROPAGATE(sb.append(", {sae}"));
}
}
diff --git a/3rdparty/asmjit/src/asmjit/x86/x86formatter_p.h b/3rdparty/asmjit/src/asmjit/x86/x86formatter_p.h
index d7d58e42d67..f37a8f6db14 100644
--- a/3rdparty/asmjit/src/asmjit/x86/x86formatter_p.h
+++ b/3rdparty/asmjit/src/asmjit/x86/x86formatter_p.h
@@ -1,25 +1,7 @@
-// AsmJit - Machine code generation for C++
+// This file is part of AsmJit project <https://asmjit.com>
//
-// * Official AsmJit Home Page: https://asmjit.com
-// * Official Github Repository: https://github.com/asmjit/asmjit
-//
-// Copyright (c) 2008-2020 The AsmJit Authors
-//
-// This software is provided 'as-is', without any express or implied
-// warranty. In no event will the authors be held liable for any damages
-// arising from the use of this software.
-//
-// Permission is granted to anyone to use this software for any purpose,
-// including commercial applications, and to alter it and redistribute it
-// freely, subject to the following restrictions:
-//
-// 1. The origin of this software must not be misrepresented; you must not
-// claim that you wrote the original software. If you use this software
-// in a product, an acknowledgment in the product documentation would be
-// appreciated but is not required.
-// 2. Altered source versions must be plainly marked as such, and must not be
-// misrepresented as being the original software.
-// 3. This notice may not be removed or altered from any source distribution.
+// See asmjit.h or LICENSE.md for license and copyright information
+// SPDX-License-Identifier: Zlib
#ifndef ASMJIT_X86_X86FORMATTER_P_H_INCLUDED
#define ASMJIT_X86_X86FORMATTER_P_H_INCLUDED
@@ -37,36 +19,32 @@ ASMJIT_BEGIN_SUB_NAMESPACE(x86)
//! \addtogroup asmjit_x86
//! \{
-// ============================================================================
-// [asmjit::x86::FormatterInternal]
-// ============================================================================
-
namespace FormatterInternal {
-Error formatFeature(
+Error ASMJIT_CDECL formatFeature(
String& sb,
uint32_t featureId) noexcept;
-Error formatRegister(
+Error ASMJIT_CDECL formatRegister(
String& sb,
- uint32_t flags,
+ FormatFlags flags,
const BaseEmitter* emitter,
- uint32_t arch,
- uint32_t regType,
+ Arch arch,
+ RegType regType,
uint32_t regId) noexcept;
-Error formatOperand(
+Error ASMJIT_CDECL formatOperand(
String& sb,
- uint32_t flags,
+ FormatFlags flags,
const BaseEmitter* emitter,
- uint32_t arch,
+ Arch arch,
const Operand_& op) noexcept;
-Error formatInstruction(
+Error ASMJIT_CDECL formatInstruction(
String& sb,
- uint32_t flags,
+ FormatFlags flags,
const BaseEmitter* emitter,
- uint32_t arch,
+ Arch arch,
const BaseInst& inst, const Operand_* operands, size_t opCount) noexcept;
} // {FormatterInternal}
diff --git a/3rdparty/asmjit/src/asmjit/x86/x86func.cpp b/3rdparty/asmjit/src/asmjit/x86/x86func.cpp
new file mode 100644
index 00000000000..bba9eef148c
--- /dev/null
+++ b/3rdparty/asmjit/src/asmjit/x86/x86func.cpp
@@ -0,0 +1,503 @@
+// This file is part of AsmJit project <https://asmjit.com>
+//
+// See asmjit.h or LICENSE.md for license and copyright information
+// SPDX-License-Identifier: Zlib
+
+#include "../core/api-build_p.h"
+#if !defined(ASMJIT_NO_X86)
+
+#include "../x86/x86func_p.h"
+#include "../x86/x86emithelper_p.h"
+#include "../x86/x86operand.h"
+
+ASMJIT_BEGIN_SUB_NAMESPACE(x86)
+
+namespace FuncInternal {
+
+static inline bool shouldThreatAsCDeclIn64BitMode(CallConvId ccId) noexcept {
+ return ccId == CallConvId::kCDecl ||
+ ccId == CallConvId::kStdCall ||
+ ccId == CallConvId::kThisCall ||
+ ccId == CallConvId::kFastCall ||
+ ccId == CallConvId::kRegParm1 ||
+ ccId == CallConvId::kRegParm2 ||
+ ccId == CallConvId::kRegParm3;
+}
+
+ASMJIT_FAVOR_SIZE Error initCallConv(CallConv& cc, CallConvId ccId, const Environment& environment) noexcept {
+ constexpr uint32_t kZax = Gp::kIdAx;
+ constexpr uint32_t kZbx = Gp::kIdBx;
+ constexpr uint32_t kZcx = Gp::kIdCx;
+ constexpr uint32_t kZdx = Gp::kIdDx;
+ constexpr uint32_t kZsp = Gp::kIdSp;
+ constexpr uint32_t kZbp = Gp::kIdBp;
+ constexpr uint32_t kZsi = Gp::kIdSi;
+ constexpr uint32_t kZdi = Gp::kIdDi;
+
+ bool winABI = environment.isPlatformWindows() || environment.isMSVC();
+
+ cc.setArch(environment.arch());
+ cc.setSaveRestoreRegSize(RegGroup::kVec, 16);
+ cc.setSaveRestoreRegSize(RegGroup::kX86_MM, 8);
+ cc.setSaveRestoreRegSize(RegGroup::kX86_K, 8);
+ cc.setSaveRestoreAlignment(RegGroup::kVec, 16);
+ cc.setSaveRestoreAlignment(RegGroup::kX86_MM, 8);
+ cc.setSaveRestoreAlignment(RegGroup::kX86_K, 8);
+
+ if (environment.is32Bit()) {
+ bool isStandardCallConv = true;
+
+ cc.setSaveRestoreRegSize(RegGroup::kGp, 4);
+ cc.setSaveRestoreAlignment(RegGroup::kGp, 4);
+
+ cc.setPreservedRegs(RegGroup::kGp, Support::bitMask(Gp::kIdBx, Gp::kIdSp, Gp::kIdBp, Gp::kIdSi, Gp::kIdDi));
+ cc.setNaturalStackAlignment(4);
+
+ switch (ccId) {
+ case CallConvId::kCDecl:
+ break;
+
+ case CallConvId::kStdCall:
+ cc.setFlags(CallConvFlags::kCalleePopsStack);
+ break;
+
+ case CallConvId::kFastCall:
+ cc.setFlags(CallConvFlags::kCalleePopsStack);
+ cc.setPassedOrder(RegGroup::kGp, kZcx, kZdx);
+ break;
+
+ case CallConvId::kVectorCall:
+ cc.setFlags(CallConvFlags::kCalleePopsStack);
+ cc.setPassedOrder(RegGroup::kGp, kZcx, kZdx);
+ cc.setPassedOrder(RegGroup::kVec, 0, 1, 2, 3, 4, 5);
+ break;
+
+ case CallConvId::kThisCall:
+ // NOTE: Even MINGW (starting with GCC 4.7.0) now uses __thiscall on MS Windows, so we won't bail to any
+ // other calling convention if __thiscall was specified.
+ if (winABI) {
+ cc.setFlags(CallConvFlags::kCalleePopsStack);
+ cc.setPassedOrder(RegGroup::kGp, kZcx);
+ }
+ else {
+ ccId = CallConvId::kCDecl;
+ }
+ break;
+
+ case CallConvId::kRegParm1:
+ cc.setPassedOrder(RegGroup::kGp, kZax);
+ break;
+
+ case CallConvId::kRegParm2:
+ cc.setPassedOrder(RegGroup::kGp, kZax, kZdx);
+ break;
+
+ case CallConvId::kRegParm3:
+ cc.setPassedOrder(RegGroup::kGp, kZax, kZdx, kZcx);
+ break;
+
+ case CallConvId::kLightCall2:
+ case CallConvId::kLightCall3:
+ case CallConvId::kLightCall4: {
+ uint32_t n = uint32_t(ccId) - uint32_t(CallConvId::kLightCall2) + 2;
+
+ cc.setFlags(CallConvFlags::kPassFloatsByVec);
+ cc.setPassedOrder(RegGroup::kGp, kZax, kZdx, kZcx, kZsi, kZdi);
+ cc.setPassedOrder(RegGroup::kVec, 0, 1, 2, 3, 4, 5, 6, 7);
+ cc.setPassedOrder(RegGroup::kX86_K, 0, 1, 2, 3, 4, 5, 6, 7);
+ cc.setPassedOrder(RegGroup::kX86_MM, 0, 1, 2, 3, 4, 5, 6, 7);
+ cc.setPreservedRegs(RegGroup::kGp, Support::lsbMask<uint32_t>(8));
+ cc.setPreservedRegs(RegGroup::kVec, Support::lsbMask<uint32_t>(8) & ~Support::lsbMask<uint32_t>(n));
+
+ cc.setNaturalStackAlignment(16);
+ isStandardCallConv = false;
+ break;
+ }
+
+ default:
+ return DebugUtils::errored(kErrorInvalidArgument);
+ }
+
+ if (isStandardCallConv) {
+ // MMX arguments is something where compiler vendors disagree. For example GCC and MSVC would pass first three
+ // via registers and the rest via stack, however Clang passes all via stack. Returning MMX registers is even
+ // more fun, where GCC uses MM0, but Clang uses EAX:EDX pair. I'm not sure it's something we should be worried
+ // about as MMX is deprecated anyway.
+ cc.setPassedOrder(RegGroup::kX86_MM, 0, 1, 2);
+
+ // Vector arguments (XMM|YMM|ZMM) are passed via registers. However, if the function is variadic then they have
+ // to be passed via stack.
+ cc.setPassedOrder(RegGroup::kVec, 0, 1, 2);
+
+ // Functions with variable arguments always use stack for MM and vector arguments.
+ cc.addFlags(CallConvFlags::kPassVecByStackIfVA);
+ }
+
+ if (ccId == CallConvId::kCDecl) {
+ cc.addFlags(CallConvFlags::kVarArgCompatible);
+ }
+ }
+ else {
+ cc.setSaveRestoreRegSize(RegGroup::kGp, 8);
+ cc.setSaveRestoreAlignment(RegGroup::kGp, 8);
+
+ // Preprocess the calling convention into a common id as many conventions are normally ignored even by C/C++
+ // compilers and treated as `__cdecl`.
+ if (shouldThreatAsCDeclIn64BitMode(ccId))
+ ccId = winABI ? CallConvId::kX64Windows : CallConvId::kX64SystemV;
+
+ switch (ccId) {
+ case CallConvId::kX64SystemV: {
+ cc.setFlags(CallConvFlags::kPassFloatsByVec |
+ CallConvFlags::kPassMmxByXmm |
+ CallConvFlags::kVarArgCompatible);
+ cc.setNaturalStackAlignment(16);
+ cc.setRedZoneSize(128);
+ cc.setPassedOrder(RegGroup::kGp, kZdi, kZsi, kZdx, kZcx, 8, 9);
+ cc.setPassedOrder(RegGroup::kVec, 0, 1, 2, 3, 4, 5, 6, 7);
+ cc.setPreservedRegs(RegGroup::kGp, Support::bitMask(kZbx, kZsp, kZbp, 12, 13, 14, 15));
+ break;
+ }
+
+ case CallConvId::kX64Windows: {
+ cc.setStrategy(CallConvStrategy::kX64Windows);
+ cc.setFlags(CallConvFlags::kPassFloatsByVec |
+ CallConvFlags::kIndirectVecArgs |
+ CallConvFlags::kPassMmxByGp |
+ CallConvFlags::kVarArgCompatible);
+ cc.setNaturalStackAlignment(16);
+ // Maximum 4 arguments in registers, each adds 8 bytes to the spill zone.
+ cc.setSpillZoneSize(4 * 8);
+ cc.setPassedOrder(RegGroup::kGp, kZcx, kZdx, 8, 9);
+ cc.setPassedOrder(RegGroup::kVec, 0, 1, 2, 3);
+ cc.setPreservedRegs(RegGroup::kGp, Support::bitMask(kZbx, kZsp, kZbp, kZsi, kZdi, 12, 13, 14, 15));
+ cc.setPreservedRegs(RegGroup::kVec, Support::bitMask(6, 7, 8, 9, 10, 11, 12, 13, 14, 15));
+ break;
+ }
+
+ case CallConvId::kVectorCall: {
+ cc.setStrategy(CallConvStrategy::kX64VectorCall);
+ cc.setFlags(CallConvFlags::kPassFloatsByVec |
+ CallConvFlags::kPassMmxByGp );
+ cc.setNaturalStackAlignment(16);
+ // Maximum 6 arguments in registers, each adds 8 bytes to the spill zone.
+ cc.setSpillZoneSize(6 * 8);
+ cc.setPassedOrder(RegGroup::kGp, kZcx, kZdx, 8, 9);
+ cc.setPassedOrder(RegGroup::kVec, 0, 1, 2, 3, 4, 5);
+ cc.setPreservedRegs(RegGroup::kGp, Support::bitMask(kZbx, kZsp, kZbp, kZsi, kZdi, 12, 13, 14, 15));
+ cc.setPreservedRegs(RegGroup::kVec, Support::bitMask(6, 7, 8, 9, 10, 11, 12, 13, 14, 15));
+ break;
+ }
+
+ case CallConvId::kLightCall2:
+ case CallConvId::kLightCall3:
+ case CallConvId::kLightCall4: {
+ uint32_t n = uint32_t(ccId) - uint32_t(CallConvId::kLightCall2) + 2;
+
+ cc.setFlags(CallConvFlags::kPassFloatsByVec);
+ cc.setNaturalStackAlignment(16);
+ cc.setPassedOrder(RegGroup::kGp, kZax, kZdx, kZcx, kZsi, kZdi);
+ cc.setPassedOrder(RegGroup::kVec, 0, 1, 2, 3, 4, 5, 6, 7);
+ cc.setPassedOrder(RegGroup::kX86_K, 0, 1, 2, 3, 4, 5, 6, 7);
+ cc.setPassedOrder(RegGroup::kX86_MM, 0, 1, 2, 3, 4, 5, 6, 7);
+
+ cc.setPreservedRegs(RegGroup::kGp, Support::lsbMask<uint32_t>(16));
+ cc.setPreservedRegs(RegGroup::kVec, ~Support::lsbMask<uint32_t>(n));
+ break;
+ }
+
+ default:
+ return DebugUtils::errored(kErrorInvalidArgument);
+ }
+ }
+
+ cc.setId(ccId);
+ return kErrorOk;
+}
+
+ASMJIT_FAVOR_SIZE void unpackValues(FuncDetail& func, FuncValuePack& pack) noexcept {
+ TypeId typeId = pack[0].typeId();
+ switch (typeId) {
+ case TypeId::kInt64:
+ case TypeId::kUInt64: {
+ if (Environment::is32Bit(func.callConv().arch())) {
+ // Convert a 64-bit return value to two 32-bit return values.
+ pack[0].initTypeId(TypeId::kUInt32);
+ pack[1].initTypeId(TypeId(uint32_t(typeId) - 2));
+ break;
+ }
+ break;
+ }
+
+ default: {
+ break;
+ }
+ }
+}
+
+ASMJIT_FAVOR_SIZE Error initFuncDetail(FuncDetail& func, const FuncSignature& signature, uint32_t registerSize) noexcept {
+ const CallConv& cc = func.callConv();
+ Arch arch = cc.arch();
+ uint32_t stackOffset = cc._spillZoneSize;
+ uint32_t argCount = func.argCount();
+
+ // Up to two return values can be returned in GP registers.
+ static const uint8_t gpReturnIndexes[4] = {
+ uint8_t(Gp::kIdAx),
+ uint8_t(Gp::kIdDx),
+ uint8_t(BaseReg::kIdBad),
+ uint8_t(BaseReg::kIdBad)
+ };
+
+ if (func.hasRet()) {
+ unpackValues(func, func._rets);
+ for (uint32_t valueIndex = 0; valueIndex < Globals::kMaxValuePack; valueIndex++) {
+ TypeId typeId = func._rets[valueIndex].typeId();
+
+ // Terminate at the first void type (end of the pack).
+ if (typeId == TypeId::kVoid)
+ break;
+
+ switch (typeId) {
+ case TypeId::kInt64:
+ case TypeId::kUInt64: {
+ if (gpReturnIndexes[valueIndex] != BaseReg::kIdBad)
+ func._rets[valueIndex].initReg(RegType::kX86_Gpq, gpReturnIndexes[valueIndex], typeId);
+ else
+ return DebugUtils::errored(kErrorInvalidState);
+ break;
+ }
+
+ case TypeId::kInt8:
+ case TypeId::kInt16:
+ case TypeId::kInt32: {
+ if (gpReturnIndexes[valueIndex] != BaseReg::kIdBad)
+ func._rets[valueIndex].initReg(RegType::kX86_Gpd, gpReturnIndexes[valueIndex], TypeId::kInt32);
+ else
+ return DebugUtils::errored(kErrorInvalidState);
+ break;
+ }
+
+ case TypeId::kUInt8:
+ case TypeId::kUInt16:
+ case TypeId::kUInt32: {
+ if (gpReturnIndexes[valueIndex] != BaseReg::kIdBad)
+ func._rets[valueIndex].initReg(RegType::kX86_Gpd, gpReturnIndexes[valueIndex], TypeId::kUInt32);
+ else
+ return DebugUtils::errored(kErrorInvalidState);
+ break;
+ }
+
+ case TypeId::kFloat32:
+ case TypeId::kFloat64: {
+ RegType regType = Environment::is32Bit(arch) ? RegType::kX86_St : RegType::kX86_Xmm;
+ func._rets[valueIndex].initReg(regType, valueIndex, typeId);
+ break;
+ }
+
+ case TypeId::kFloat80: {
+ // 80-bit floats are always returned by FP0.
+ func._rets[valueIndex].initReg(RegType::kX86_St, valueIndex, typeId);
+ break;
+ }
+
+ case TypeId::kMmx32:
+ case TypeId::kMmx64: {
+ // MM registers are returned through XMM (SystemV) or GPQ (Win64).
+ RegType regType = RegType::kX86_Mm;
+ uint32_t regIndex = valueIndex;
+ if (Environment::is64Bit(arch)) {
+ regType = cc.strategy() == CallConvStrategy::kDefault ? RegType::kX86_Xmm : RegType::kX86_Gpq;
+ regIndex = cc.strategy() == CallConvStrategy::kDefault ? valueIndex : gpReturnIndexes[valueIndex];
+
+ if (regIndex == BaseReg::kIdBad)
+ return DebugUtils::errored(kErrorInvalidState);
+ }
+
+ func._rets[valueIndex].initReg(regType, regIndex, typeId);
+ break;
+ }
+
+ default: {
+ func._rets[valueIndex].initReg(vecTypeIdToRegType(typeId), valueIndex, typeId);
+ break;
+ }
+ }
+ }
+ }
+
+ switch (cc.strategy()) {
+ case CallConvStrategy::kDefault: {
+ uint32_t gpzPos = 0;
+ uint32_t vecPos = 0;
+
+ for (uint32_t argIndex = 0; argIndex < argCount; argIndex++) {
+ unpackValues(func, func._args[argIndex]);
+
+ for (uint32_t valueIndex = 0; valueIndex < Globals::kMaxValuePack; valueIndex++) {
+ FuncValue& arg = func._args[argIndex][valueIndex];
+
+ // Terminate if there are no more arguments in the pack.
+ if (!arg)
+ break;
+
+ TypeId typeId = arg.typeId();
+
+ if (TypeUtils::isInt(typeId)) {
+ uint32_t regId = BaseReg::kIdBad;
+
+ if (gpzPos < CallConv::kMaxRegArgsPerGroup)
+ regId = cc._passedOrder[RegGroup::kGp].id[gpzPos];
+
+ if (regId != BaseReg::kIdBad) {
+ RegType regType = typeId <= TypeId::kUInt32 ? RegType::kX86_Gpd : RegType::kX86_Gpq;
+ arg.assignRegData(regType, regId);
+ func.addUsedRegs(RegGroup::kGp, Support::bitMask(regId));
+ gpzPos++;
+ }
+ else {
+ uint32_t size = Support::max<uint32_t>(TypeUtils::sizeOf(typeId), registerSize);
+ arg.assignStackOffset(int32_t(stackOffset));
+ stackOffset += size;
+ }
+ continue;
+ }
+
+ if (TypeUtils::isFloat(typeId) || TypeUtils::isVec(typeId)) {
+ uint32_t regId = BaseReg::kIdBad;
+
+ if (vecPos < CallConv::kMaxRegArgsPerGroup)
+ regId = cc._passedOrder[RegGroup::kVec].id[vecPos];
+
+ if (TypeUtils::isFloat(typeId)) {
+ // If this is a float, but `kFlagPassFloatsByVec` is false, we have to use stack instead. This should
+ // be only used by 32-bit calling conventions.
+ if (!cc.hasFlag(CallConvFlags::kPassFloatsByVec))
+ regId = BaseReg::kIdBad;
+ }
+ else {
+ // Pass vector registers via stack if this is a variable arguments function. This should be only used
+ // by 32-bit calling conventions.
+ if (signature.hasVarArgs() && cc.hasFlag(CallConvFlags::kPassVecByStackIfVA))
+ regId = BaseReg::kIdBad;
+ }
+
+ if (regId != BaseReg::kIdBad) {
+ arg.initTypeId(typeId);
+ arg.assignRegData(vecTypeIdToRegType(typeId), regId);
+ func.addUsedRegs(RegGroup::kVec, Support::bitMask(regId));
+ vecPos++;
+ }
+ else {
+ uint32_t size = TypeUtils::sizeOf(typeId);
+ arg.assignStackOffset(int32_t(stackOffset));
+ stackOffset += size;
+ }
+ continue;
+ }
+ }
+ }
+ break;
+ }
+
+ case CallConvStrategy::kX64Windows:
+ case CallConvStrategy::kX64VectorCall: {
+ // Both X64 and VectorCall behave similarly - arguments are indexed from left to right. The position of the
+ // argument determines in which register the argument is allocated, so it's either GP or one of XMM/YMM/ZMM
+ // registers.
+ //
+ // [ X64 ] [VecCall]
+ // Index: #0 #1 #2 #3 #4 #5
+ //
+ // GP : RCX RDX R8 R9
+ // VEC : XMM0 XMM1 XMM2 XMM3 XMM4 XMM5
+ //
+ // For example function `f(int a, double b, int c, double d)` will be:
+ //
+ // (a) (b) (c) (d)
+ // RCX XMM1 R8 XMM3
+ //
+ // Unused vector registers are used by HVA.
+ bool isVectorCall = (cc.strategy() == CallConvStrategy::kX64VectorCall);
+
+ for (uint32_t argIndex = 0; argIndex < argCount; argIndex++) {
+ unpackValues(func, func._args[argIndex]);
+
+ for (uint32_t valueIndex = 0; valueIndex < Globals::kMaxValuePack; valueIndex++) {
+ FuncValue& arg = func._args[argIndex][valueIndex];
+
+ // Terminate if there are no more arguments in the pack.
+ if (!arg)
+ break;
+
+ TypeId typeId = arg.typeId();
+ uint32_t size = TypeUtils::sizeOf(typeId);
+
+ if (TypeUtils::isInt(typeId) || TypeUtils::isMmx(typeId)) {
+ uint32_t regId = BaseReg::kIdBad;
+
+ if (argIndex < CallConv::kMaxRegArgsPerGroup)
+ regId = cc._passedOrder[RegGroup::kGp].id[argIndex];
+
+ if (regId != BaseReg::kIdBad) {
+ RegType regType = size <= 4 && !TypeUtils::isMmx(typeId) ? RegType::kX86_Gpd : RegType::kX86_Gpq;
+ arg.assignRegData(regType, regId);
+ func.addUsedRegs(RegGroup::kGp, Support::bitMask(regId));
+ }
+ else {
+ arg.assignStackOffset(int32_t(stackOffset));
+ stackOffset += 8;
+ }
+ continue;
+ }
+
+ if (TypeUtils::isFloat(typeId) || TypeUtils::isVec(typeId)) {
+ uint32_t regId = BaseReg::kIdBad;
+
+ if (argIndex < CallConv::kMaxRegArgsPerGroup)
+ regId = cc._passedOrder[RegGroup::kVec].id[argIndex];
+
+ if (regId != BaseReg::kIdBad) {
+ // X64-ABI doesn't allow vector types (XMM|YMM|ZMM) to be passed via registers, however, VectorCall
+ // was designed for that purpose.
+ if (TypeUtils::isFloat(typeId) || isVectorCall) {
+ RegType regType = vecTypeIdToRegType(typeId);
+ arg.assignRegData(regType, regId);
+ func.addUsedRegs(RegGroup::kVec, Support::bitMask(regId));
+ continue;
+ }
+ }
+
+ // Passed via stack if the argument is float/double or indirectly. The trap is - if the argument is
+ // passed indirectly, the address can be passed via register, if the argument's index has GP one.
+ if (TypeUtils::isFloat(typeId)) {
+ arg.assignStackOffset(int32_t(stackOffset));
+ }
+ else {
+ uint32_t gpRegId = cc._passedOrder[RegGroup::kGp].id[argIndex];
+ if (gpRegId != BaseReg::kIdBad)
+ arg.assignRegData(RegType::kX86_Gpq, gpRegId);
+ else
+ arg.assignStackOffset(int32_t(stackOffset));
+ arg.addFlags(FuncValue::kFlagIsIndirect);
+ }
+
+ // Always 8 bytes (float/double/pointer).
+ stackOffset += 8;
+ continue;
+ }
+ }
+ }
+ break;
+ }
+ }
+
+ func._argStackSize = stackOffset;
+ return kErrorOk;
+}
+
+} // {FuncInternal}
+
+ASMJIT_END_SUB_NAMESPACE
+
+#endif // !ASMJIT_NO_X86
diff --git a/3rdparty/asmjit/src/asmjit/x86/x86func_p.h b/3rdparty/asmjit/src/asmjit/x86/x86func_p.h
new file mode 100644
index 00000000000..0fe1da14d98
--- /dev/null
+++ b/3rdparty/asmjit/src/asmjit/x86/x86func_p.h
@@ -0,0 +1,33 @@
+// This file is part of AsmJit project <https://asmjit.com>
+//
+// See asmjit.h or LICENSE.md for license and copyright information
+// SPDX-License-Identifier: Zlib
+
+#ifndef ASMJIT_X86_X86FUNC_P_H_INCLUDED
+#define ASMJIT_X86_X86FUNC_P_H_INCLUDED
+
+#include "../core/func.h"
+
+ASMJIT_BEGIN_SUB_NAMESPACE(x86)
+
+//! \cond INTERNAL
+//! \addtogroup asmjit_x86
+//! \{
+
+//! X86-specific function API (calling conventions and other utilities).
+namespace FuncInternal {
+
+//! Initialize `CallConv` structure (X86 specific).
+Error initCallConv(CallConv& cc, CallConvId ccId, const Environment& environment) noexcept;
+
+//! Initialize `FuncDetail` (X86 specific).
+Error initFuncDetail(FuncDetail& func, const FuncSignature& signature, uint32_t registerSize) noexcept;
+
+} // {FuncInternal}
+
+//! \}
+//! \endcond
+
+ASMJIT_END_SUB_NAMESPACE
+
+#endif // ASMJIT_X86_X86FUNC_P_H_INCLUDED
diff --git a/3rdparty/asmjit/src/asmjit/x86/x86globals.h b/3rdparty/asmjit/src/asmjit/x86/x86globals.h
index f7d258f3b62..803c813ac53 100644
--- a/3rdparty/asmjit/src/asmjit/x86/x86globals.h
+++ b/3rdparty/asmjit/src/asmjit/x86/x86globals.h
@@ -1,50 +1,118 @@
-// AsmJit - Machine code generation for C++
+// This file is part of AsmJit project <https://asmjit.com>
//
-// * Official AsmJit Home Page: https://asmjit.com
-// * Official Github Repository: https://github.com/asmjit/asmjit
-//
-// Copyright (c) 2008-2020 The AsmJit Authors
-//
-// This software is provided 'as-is', without any express or implied
-// warranty. In no event will the authors be held liable for any damages
-// arising from the use of this software.
-//
-// Permission is granted to anyone to use this software for any purpose,
-// including commercial applications, and to alter it and redistribute it
-// freely, subject to the following restrictions:
-//
-// 1. The origin of this software must not be misrepresented; you must not
-// claim that you wrote the original software. If you use this software
-// in a product, an acknowledgment in the product documentation would be
-// appreciated but is not required.
-// 2. Altered source versions must be plainly marked as such, and must not be
-// misrepresented as being the original software.
-// 3. This notice may not be removed or altered from any source distribution.
+// See asmjit.h or LICENSE.md for license and copyright information
+// SPDX-License-Identifier: Zlib
#ifndef ASMJIT_X86_X86GLOBALS_H_INCLUDED
#define ASMJIT_X86_X86GLOBALS_H_INCLUDED
-#include "../core/arch.h"
+#include "../core/archtraits.h"
#include "../core/inst.h"
-ASMJIT_BEGIN_SUB_NAMESPACE(x86)
-
//! \namespace asmjit::x86
//! \ingroup asmjit_x86
//!
//! X86/X64 API.
+ASMJIT_BEGIN_SUB_NAMESPACE(x86)
+
//! \addtogroup asmjit_x86
//! \{
-// ============================================================================
-// [asmjit::x86::Inst]
-// ============================================================================
+//! Condition code.
+enum class CondCode : uint8_t {
+ kO = 0x00u, //!< OF==1
+ kNO = 0x01u, //!< OF==0
+ kC = 0x02u, //!< CF==1
+ kB = 0x02u, //!< CF==1 (unsigned < )
+ kNAE = 0x02u, //!< CF==1 (unsigned < )
+ kNC = 0x03u, //!< CF==0
+ kAE = 0x03u, //!< CF==0 (unsigned >=)
+ kNB = 0x03u, //!< CF==0 (unsigned >=)
+ kE = 0x04u, //!< ZF==1 (any_sign ==)
+ kZ = 0x04u, //!< ZF==1 (any_sign ==)
+ kNE = 0x05u, //!< ZF==0 (any_sign !=)
+ kNZ = 0x05u, //!< ZF==0 (any_sign !=)
+ kBE = 0x06u, //!< CF==1 | ZF==1 (unsigned <=)
+ kNA = 0x06u, //!< CF==1 | ZF==1 (unsigned <=)
+ kA = 0x07u, //!< CF==0 & ZF==0 (unsigned > )
+ kNBE = 0x07u, //!< CF==0 & ZF==0 (unsigned > )
+ kS = 0x08u, //!< SF==1 (is negative)
+ kNS = 0x09u, //!< SF==0 (is positive or zero)
+ kP = 0x0Au, //!< PF==1
+ kPE = 0x0Au, //!< PF==1
+ kPO = 0x0Bu, //!< PF==0
+ kNP = 0x0Bu, //!< PF==0
+ kL = 0x0Cu, //!< SF!=OF (signed < )
+ kNGE = 0x0Cu, //!< SF!=OF (signed < )
+ kGE = 0x0Du, //!< SF==OF (signed >=)
+ kNL = 0x0Du, //!< SF==OF (signed >=)
+ kLE = 0x0Eu, //!< ZF==1 | SF!=OF (signed <=)
+ kNG = 0x0Eu, //!< ZF==1 | SF!=OF (signed <=)
+ kG = 0x0Fu, //!< ZF==0 & SF==OF (signed > )
+ kNLE = 0x0Fu, //!< ZF==0 & SF==OF (signed > )
+
+ kZero = kZ, //!< Zero flag.
+ kNotZero = kNZ, //!< Non-zero flag.
+
+ kSign = kS, //!< Sign flag.
+ kNotSign = kNS, //!< No sign flag.
+
+ kNegative = kS, //!< Sign flag.
+ kPositive = kNS, //!< No sign flag.
+
+ kOverflow = kO, //!< Overflow (signed).
+ kNotOverflow = kNO, //!< Not overflow (signed).
+
+ kEqual = kE, //!< `a == b` (equal).
+ kNotEqual = kNE, //!< `a != b` (not equal).
+
+ kSignedLT = kL, //!< `a < b` (signed).
+ kSignedLE = kLE, //!< `a <= b` (signed).
+ kSignedGT = kG, //!< `a > b` (signed).
+ kSignedGE = kGE, //!< `a >= b` (signed).
+
+ kUnsignedLT = kB, //!< `a < b` (unsigned).
+ kUnsignedLE = kBE, //!< `a <= b` (unsigned).
+ kUnsignedGT = kA, //!< `a > b` (unsigned).
+ kUnsignedGE = kAE, //!< `a >= b` (unsigned).
+
+ kParityEven = kP, //!< Even parity flag.
+ kParityOdd = kPO, //!< Odd parity flag.
+
+ kMaxValue = 0x0Fu
+};
+
+//! \cond
+static constexpr CondCode _reverseCondTable[] = {
+ CondCode::kO, // O <- O
+ CondCode::kNO, // NO <- NO
+ CondCode::kA , // A <- B
+ CondCode::kBE, // BE <- AE
+ CondCode::kE, // E <- E
+ CondCode::kNE, // NE <- NE
+ CondCode::kAE, // AE <- BE
+ CondCode::kB , // B <- A
+ CondCode::kS, // S <- S
+ CondCode::kNS, // NS <- NS
+ CondCode::kPE, // PE <- PE
+ CondCode::kPO, // PO <- PO
+ CondCode::kG, // G <- L
+ CondCode::kLE, // LE <- GE
+ CondCode::kGE, // GE <- LE
+ CondCode::kL // L <- G
+};
+//! \endcond
+
+//! Reverses a condition code (reverses the corresponding operands of a comparison).
+static inline constexpr CondCode reverseCond(CondCode cond) noexcept { return _reverseCondTable[uint8_t(cond)]; }
+//! Negates a condition code.
+static inline constexpr CondCode negateCond(CondCode cond) noexcept { return CondCode(uint8_t(cond) ^ 1u); }
//! Instruction.
//!
-//! \note Only used to hold x86-specific enumerations and static functions.
-struct Inst : public BaseInst {
+//! \note Only used to hold x86-specific instruction identifiers and some additional helper functions.
+namespace Inst {
//! Instruction id.
enum Id : uint32_t {
// ${InstId:Begin}
@@ -119,7 +187,9 @@ struct Inst : public BaseInst {
kIdClflushopt, //!< Instruction 'clflushopt' {CLFLUSHOPT}.
kIdClgi, //!< Instruction 'clgi' {SVM}.
kIdCli, //!< Instruction 'cli'.
+ kIdClrssbsy, //!< Instruction 'clrssbsy' {CET_SS}.
kIdClts, //!< Instruction 'clts'.
+ kIdClui, //!< Instruction 'clui' {UINTR} (X64).
kIdClwb, //!< Instruction 'clwb' {CLWB}.
kIdClzero, //!< Instruction 'clzero' {CLZERO}.
kIdCmc, //!< Instruction 'cmc'.
@@ -202,6 +272,8 @@ struct Inst : public BaseInst {
kIdDppd, //!< Instruction 'dppd' {SSE4_1}.
kIdDpps, //!< Instruction 'dpps' {SSE4_1}.
kIdEmms, //!< Instruction 'emms' {MMX}.
+ kIdEndbr32, //!< Instruction 'endbr32' {CET_IBT}.
+ kIdEndbr64, //!< Instruction 'endbr64' {CET_IBT}.
kIdEnqcmd, //!< Instruction 'enqcmd' {ENQCMD}.
kIdEnqcmds, //!< Instruction 'enqcmds' {ENQCMD}.
kIdEnter, //!< Instruction 'enter'.
@@ -312,12 +384,15 @@ struct Inst : public BaseInst {
kIdHaddpd, //!< Instruction 'haddpd' {SSE3}.
kIdHaddps, //!< Instruction 'haddps' {SSE3}.
kIdHlt, //!< Instruction 'hlt'.
+ kIdHreset, //!< Instruction 'hreset' {HRESET}.
kIdHsubpd, //!< Instruction 'hsubpd' {SSE3}.
kIdHsubps, //!< Instruction 'hsubps' {SSE3}.
kIdIdiv, //!< Instruction 'idiv'.
kIdImul, //!< Instruction 'imul'.
kIdIn, //!< Instruction 'in'.
kIdInc, //!< Instruction 'inc'.
+ kIdIncsspd, //!< Instruction 'incsspd' {CET_SS}.
+ kIdIncsspq, //!< Instruction 'incsspq' {CET_SS} (X64).
kIdIns, //!< Instruction 'ins'.
kIdInsertps, //!< Instruction 'insertps' {SSE4_1}.
kIdInsertq, //!< Instruction 'insertq' {SSE4A}.
@@ -333,7 +408,6 @@ struct Inst : public BaseInst {
kIdIret, //!< Instruction 'iret'.
kIdIretd, //!< Instruction 'iretd'.
kIdIretq, //!< Instruction 'iretq' (X64).
- kIdIretw, //!< Instruction 'iretw'.
kIdJa, //!< Instruction 'ja'.
kIdJae, //!< Instruction 'jae'.
kIdJb, //!< Instruction 'jb'.
@@ -419,9 +493,11 @@ struct Inst : public BaseInst {
kIdKxorw, //!< Instruction 'kxorw' {AVX512_F}.
kIdLahf, //!< Instruction 'lahf' {LAHFSAHF}.
kIdLar, //!< Instruction 'lar'.
+ kIdLcall, //!< Instruction 'lcall'.
kIdLddqu, //!< Instruction 'lddqu' {SSE3}.
kIdLdmxcsr, //!< Instruction 'ldmxcsr' {SSE}.
kIdLds, //!< Instruction 'lds' (X86).
+ kIdLdtilecfg, //!< Instruction 'ldtilecfg' {AMX_TILE} (X64).
kIdLea, //!< Instruction 'lea'.
kIdLeave, //!< Instruction 'leave'.
kIdLes, //!< Instruction 'les' (X86).
@@ -430,6 +506,7 @@ struct Inst : public BaseInst {
kIdLgdt, //!< Instruction 'lgdt'.
kIdLgs, //!< Instruction 'lgs'.
kIdLidt, //!< Instruction 'lidt'.
+ kIdLjmp, //!< Instruction 'ljmp'.
kIdLldt, //!< Instruction 'lldt'.
kIdLlwpcb, //!< Instruction 'llwpcb' {LWP}.
kIdLmsw, //!< Instruction 'lmsw'.
@@ -449,6 +526,7 @@ struct Inst : public BaseInst {
kIdMaxps, //!< Instruction 'maxps' {SSE}.
kIdMaxsd, //!< Instruction 'maxsd' {SSE2}.
kIdMaxss, //!< Instruction 'maxss' {SSE}.
+ kIdMcommit, //!< Instruction 'mcommit' {MCOMMIT}.
kIdMfence, //!< Instruction 'mfence' {SSE2}.
kIdMinpd, //!< Instruction 'minpd' {SSE2}.
kIdMinps, //!< Instruction 'minps' {SSE}.
@@ -457,6 +535,7 @@ struct Inst : public BaseInst {
kIdMonitor, //!< Instruction 'monitor' {MONITOR}.
kIdMonitorx, //!< Instruction 'monitorx' {MONITORX}.
kIdMov, //!< Instruction 'mov'.
+ kIdMovabs, //!< Instruction 'movabs' (X64).
kIdMovapd, //!< Instruction 'movapd' {SSE2}.
kIdMovaps, //!< Instruction 'movaps' {SSE}.
kIdMovbe, //!< Instruction 'movbe' {MOVBE}.
@@ -549,7 +628,7 @@ struct Inst : public BaseInst {
kIdPcmpgtw, //!< Instruction 'pcmpgtw' {MMX|SSE2}.
kIdPcmpistri, //!< Instruction 'pcmpistri' {SSE4_2}.
kIdPcmpistrm, //!< Instruction 'pcmpistrm' {SSE4_2}.
- kIdPcommit, //!< Instruction 'pcommit' {PCOMMIT}.
+ kIdPconfig, //!< Instruction 'pconfig' {PCONFIG}.
kIdPdep, //!< Instruction 'pdep' {BMI2}.
kIdPext, //!< Instruction 'pext' {BMI2}.
kIdPextrb, //!< Instruction 'pextrb' {SSE4_1}.
@@ -653,6 +732,7 @@ struct Inst : public BaseInst {
kIdPslldq, //!< Instruction 'pslldq' {SSE2}.
kIdPsllq, //!< Instruction 'psllq' {MMX|SSE2}.
kIdPsllw, //!< Instruction 'psllw' {MMX|SSE2}.
+ kIdPsmash, //!< Instruction 'psmash' {SNP} (X64).
kIdPsrad, //!< Instruction 'psrad' {MMX|SSE2}.
kIdPsraw, //!< Instruction 'psraw' {MMX|SSE2}.
kIdPsrld, //!< Instruction 'psrld' {MMX|SSE2}.
@@ -669,6 +749,7 @@ struct Inst : public BaseInst {
kIdPsubw, //!< Instruction 'psubw' {MMX|SSE2}.
kIdPswapd, //!< Instruction 'pswapd' {3DNOW2}.
kIdPtest, //!< Instruction 'ptest' {SSE4_1}.
+ kIdPtwrite, //!< Instruction 'ptwrite' {PTWRITE}.
kIdPunpckhbw, //!< Instruction 'punpckhbw' {MMX|SSE2}.
kIdPunpckhdq, //!< Instruction 'punpckhdq' {MMX|SSE2}.
kIdPunpckhqdq, //!< Instruction 'punpckhqdq' {SSE2}.
@@ -683,6 +764,7 @@ struct Inst : public BaseInst {
kIdPushf, //!< Instruction 'pushf'.
kIdPushfd, //!< Instruction 'pushfd' (X86).
kIdPushfq, //!< Instruction 'pushfq' (X64).
+ kIdPvalidate, //!< Instruction 'pvalidate' {SNP}.
kIdPxor, //!< Instruction 'pxor' {MMX|SSE2}.
kIdRcl, //!< Instruction 'rcl'.
kIdRcpps, //!< Instruction 'rcpps' {SSE}.
@@ -692,12 +774,19 @@ struct Inst : public BaseInst {
kIdRdgsbase, //!< Instruction 'rdgsbase' {FSGSBASE} (X64).
kIdRdmsr, //!< Instruction 'rdmsr' {MSR}.
kIdRdpid, //!< Instruction 'rdpid' {RDPID}.
+ kIdRdpkru, //!< Instruction 'rdpkru' {OSPKE}.
kIdRdpmc, //!< Instruction 'rdpmc'.
+ kIdRdpru, //!< Instruction 'rdpru' {RDPRU}.
kIdRdrand, //!< Instruction 'rdrand' {RDRAND}.
kIdRdseed, //!< Instruction 'rdseed' {RDSEED}.
+ kIdRdsspd, //!< Instruction 'rdsspd' {CET_SS}.
+ kIdRdsspq, //!< Instruction 'rdsspq' {CET_SS} (X64).
kIdRdtsc, //!< Instruction 'rdtsc' {RDTSC}.
kIdRdtscp, //!< Instruction 'rdtscp' {RDTSCP}.
kIdRet, //!< Instruction 'ret'.
+ kIdRetf, //!< Instruction 'retf'.
+ kIdRmpadjust, //!< Instruction 'rmpadjust' {SNP} (X64).
+ kIdRmpupdate, //!< Instruction 'rmpupdate' {SNP} (X64).
kIdRol, //!< Instruction 'rol'.
kIdRor, //!< Instruction 'ror'.
kIdRorx, //!< Instruction 'rorx' {BMI2}.
@@ -708,12 +797,16 @@ struct Inst : public BaseInst {
kIdRsm, //!< Instruction 'rsm' (X86).
kIdRsqrtps, //!< Instruction 'rsqrtps' {SSE}.
kIdRsqrtss, //!< Instruction 'rsqrtss' {SSE}.
+ kIdRstorssp, //!< Instruction 'rstorssp' {CET_SS}.
kIdSahf, //!< Instruction 'sahf' {LAHFSAHF}.
kIdSal, //!< Instruction 'sal'.
kIdSar, //!< Instruction 'sar'.
kIdSarx, //!< Instruction 'sarx' {BMI2}.
+ kIdSaveprevssp, //!< Instruction 'saveprevssp' {CET_SS}.
kIdSbb, //!< Instruction 'sbb'.
kIdScas, //!< Instruction 'scas'.
+ kIdSenduipi, //!< Instruction 'senduipi' {UINTR} (X64).
+ kIdSerialize, //!< Instruction 'serialize' {SERIALIZE}.
kIdSeta, //!< Instruction 'seta'.
kIdSetae, //!< Instruction 'setae'.
kIdSetb, //!< Instruction 'setb'.
@@ -743,6 +836,7 @@ struct Inst : public BaseInst {
kIdSetpe, //!< Instruction 'setpe'.
kIdSetpo, //!< Instruction 'setpo'.
kIdSets, //!< Instruction 'sets'.
+ kIdSetssbsy, //!< Instruction 'setssbsy' {CET_SS}.
kIdSetz, //!< Instruction 'setz'.
kIdSfence, //!< Instruction 'sfence' {MMX2}.
kIdSgdt, //!< Instruction 'sgdt'.
@@ -778,6 +872,8 @@ struct Inst : public BaseInst {
kIdStmxcsr, //!< Instruction 'stmxcsr' {SSE}.
kIdStos, //!< Instruction 'stos'.
kIdStr, //!< Instruction 'str'.
+ kIdSttilecfg, //!< Instruction 'sttilecfg' {AMX_TILE} (X64).
+ kIdStui, //!< Instruction 'stui' {UINTR} (X64).
kIdSub, //!< Instruction 'sub'.
kIdSubpd, //!< Instruction 'subpd' {SSE2}.
kIdSubps, //!< Instruction 'subps' {SSE}.
@@ -787,16 +883,33 @@ struct Inst : public BaseInst {
kIdSyscall, //!< Instruction 'syscall' (X64).
kIdSysenter, //!< Instruction 'sysenter'.
kIdSysexit, //!< Instruction 'sysexit'.
- kIdSysexit64, //!< Instruction 'sysexit64'.
+ kIdSysexitq, //!< Instruction 'sysexitq'.
kIdSysret, //!< Instruction 'sysret' (X64).
- kIdSysret64, //!< Instruction 'sysret64' (X64).
+ kIdSysretq, //!< Instruction 'sysretq' (X64).
kIdT1mskc, //!< Instruction 't1mskc' {TBM}.
+ kIdTdpbf16ps, //!< Instruction 'tdpbf16ps' {AMX_BF16} (X64).
+ kIdTdpbssd, //!< Instruction 'tdpbssd' {AMX_INT8} (X64).
+ kIdTdpbsud, //!< Instruction 'tdpbsud' {AMX_INT8} (X64).
+ kIdTdpbusd, //!< Instruction 'tdpbusd' {AMX_INT8} (X64).
+ kIdTdpbuud, //!< Instruction 'tdpbuud' {AMX_INT8} (X64).
kIdTest, //!< Instruction 'test'.
+ kIdTestui, //!< Instruction 'testui' {UINTR} (X64).
+ kIdTileloadd, //!< Instruction 'tileloadd' {AMX_TILE} (X64).
+ kIdTileloaddt1, //!< Instruction 'tileloaddt1' {AMX_TILE} (X64).
+ kIdTilerelease, //!< Instruction 'tilerelease' {AMX_TILE} (X64).
+ kIdTilestored, //!< Instruction 'tilestored' {AMX_TILE} (X64).
+ kIdTilezero, //!< Instruction 'tilezero' {AMX_TILE} (X64).
+ kIdTpause, //!< Instruction 'tpause' {WAITPKG}.
kIdTzcnt, //!< Instruction 'tzcnt' {BMI}.
kIdTzmsk, //!< Instruction 'tzmsk' {TBM}.
kIdUcomisd, //!< Instruction 'ucomisd' {SSE2}.
kIdUcomiss, //!< Instruction 'ucomiss' {SSE}.
+ kIdUd0, //!< Instruction 'ud0'.
+ kIdUd1, //!< Instruction 'ud1'.
kIdUd2, //!< Instruction 'ud2'.
+ kIdUiret, //!< Instruction 'uiret' {UINTR} (X64).
+ kIdUmonitor, //!< Instruction 'umonitor' {WAITPKG}.
+ kIdUmwait, //!< Instruction 'umwait' {WAITPKG}.
kIdUnpckhpd, //!< Instruction 'unpckhpd' {SSE2}.
kIdUnpckhps, //!< Instruction 'unpckhps' {SSE}.
kIdUnpcklpd, //!< Instruction 'unpcklpd' {SSE2}.
@@ -806,8 +919,10 @@ struct Inst : public BaseInst {
kIdV4fnmaddps, //!< Instruction 'v4fnmaddps' {AVX512_4FMAPS}.
kIdV4fnmaddss, //!< Instruction 'v4fnmaddss' {AVX512_4FMAPS}.
kIdVaddpd, //!< Instruction 'vaddpd' {AVX|AVX512_F+VL}.
+ kIdVaddph, //!< Instruction 'vaddph' {AVX512_FP16+VL}.
kIdVaddps, //!< Instruction 'vaddps' {AVX|AVX512_F+VL}.
kIdVaddsd, //!< Instruction 'vaddsd' {AVX|AVX512_F}.
+ kIdVaddsh, //!< Instruction 'vaddsh' {AVX512_FP16}.
kIdVaddss, //!< Instruction 'vaddss' {AVX|AVX512_F}.
kIdVaddsubpd, //!< Instruction 'vaddsubpd' {AVX}.
kIdVaddsubps, //!< Instruction 'vaddsubps' {AVX}.
@@ -823,12 +938,8 @@ struct Inst : public BaseInst {
kIdVandnps, //!< Instruction 'vandnps' {AVX|AVX512_DQ+VL}.
kIdVandpd, //!< Instruction 'vandpd' {AVX|AVX512_DQ+VL}.
kIdVandps, //!< Instruction 'vandps' {AVX|AVX512_DQ+VL}.
- kIdVblendmb, //!< Instruction 'vblendmb' {AVX512_BW+VL}.
- kIdVblendmd, //!< Instruction 'vblendmd' {AVX512_F+VL}.
kIdVblendmpd, //!< Instruction 'vblendmpd' {AVX512_F+VL}.
kIdVblendmps, //!< Instruction 'vblendmps' {AVX512_F+VL}.
- kIdVblendmq, //!< Instruction 'vblendmq' {AVX512_F+VL}.
- kIdVblendmw, //!< Instruction 'vblendmw' {AVX512_BW+VL}.
kIdVblendpd, //!< Instruction 'vblendpd' {AVX}.
kIdVblendps, //!< Instruction 'vblendps' {AVX}.
kIdVblendvpd, //!< Instruction 'vblendvpd' {AVX}.
@@ -848,61 +959,98 @@ struct Inst : public BaseInst {
kIdVbroadcastsd, //!< Instruction 'vbroadcastsd' {AVX|AVX2|AVX512_F+VL}.
kIdVbroadcastss, //!< Instruction 'vbroadcastss' {AVX|AVX2|AVX512_F+VL}.
kIdVcmppd, //!< Instruction 'vcmppd' {AVX|AVX512_F+VL}.
+ kIdVcmpph, //!< Instruction 'vcmpph' {AVX512_FP16+VL}.
kIdVcmpps, //!< Instruction 'vcmpps' {AVX|AVX512_F+VL}.
kIdVcmpsd, //!< Instruction 'vcmpsd' {AVX|AVX512_F}.
+ kIdVcmpsh, //!< Instruction 'vcmpsh' {AVX512_FP16}.
kIdVcmpss, //!< Instruction 'vcmpss' {AVX|AVX512_F}.
kIdVcomisd, //!< Instruction 'vcomisd' {AVX|AVX512_F}.
+ kIdVcomish, //!< Instruction 'vcomish' {AVX512_FP16}.
kIdVcomiss, //!< Instruction 'vcomiss' {AVX|AVX512_F}.
kIdVcompresspd, //!< Instruction 'vcompresspd' {AVX512_F+VL}.
kIdVcompressps, //!< Instruction 'vcompressps' {AVX512_F+VL}.
kIdVcvtdq2pd, //!< Instruction 'vcvtdq2pd' {AVX|AVX512_F+VL}.
+ kIdVcvtdq2ph, //!< Instruction 'vcvtdq2ph' {AVX512_FP16+VL}.
kIdVcvtdq2ps, //!< Instruction 'vcvtdq2ps' {AVX|AVX512_F+VL}.
kIdVcvtne2ps2bf16, //!< Instruction 'vcvtne2ps2bf16' {AVX512_BF16+VL}.
kIdVcvtneps2bf16, //!< Instruction 'vcvtneps2bf16' {AVX512_BF16+VL}.
kIdVcvtpd2dq, //!< Instruction 'vcvtpd2dq' {AVX|AVX512_F+VL}.
+ kIdVcvtpd2ph, //!< Instruction 'vcvtpd2ph' {AVX512_FP16+VL}.
kIdVcvtpd2ps, //!< Instruction 'vcvtpd2ps' {AVX|AVX512_F+VL}.
kIdVcvtpd2qq, //!< Instruction 'vcvtpd2qq' {AVX512_DQ+VL}.
kIdVcvtpd2udq, //!< Instruction 'vcvtpd2udq' {AVX512_F+VL}.
kIdVcvtpd2uqq, //!< Instruction 'vcvtpd2uqq' {AVX512_DQ+VL}.
+ kIdVcvtph2dq, //!< Instruction 'vcvtph2dq' {AVX512_FP16+VL}.
+ kIdVcvtph2pd, //!< Instruction 'vcvtph2pd' {AVX512_FP16+VL}.
kIdVcvtph2ps, //!< Instruction 'vcvtph2ps' {AVX512_F+VL & F16C}.
+ kIdVcvtph2psx, //!< Instruction 'vcvtph2psx' {AVX512_FP16+VL}.
+ kIdVcvtph2qq, //!< Instruction 'vcvtph2qq' {AVX512_FP16+VL}.
+ kIdVcvtph2udq, //!< Instruction 'vcvtph2udq' {AVX512_FP16+VL}.
+ kIdVcvtph2uqq, //!< Instruction 'vcvtph2uqq' {AVX512_FP16+VL}.
+ kIdVcvtph2uw, //!< Instruction 'vcvtph2uw' {AVX512_FP16+VL}.
+ kIdVcvtph2w, //!< Instruction 'vcvtph2w' {AVX512_FP16+VL}.
kIdVcvtps2dq, //!< Instruction 'vcvtps2dq' {AVX|AVX512_F+VL}.
kIdVcvtps2pd, //!< Instruction 'vcvtps2pd' {AVX|AVX512_F+VL}.
kIdVcvtps2ph, //!< Instruction 'vcvtps2ph' {AVX512_F+VL & F16C}.
+ kIdVcvtps2phx, //!< Instruction 'vcvtps2phx' {AVX512_FP16+VL}.
kIdVcvtps2qq, //!< Instruction 'vcvtps2qq' {AVX512_DQ+VL}.
kIdVcvtps2udq, //!< Instruction 'vcvtps2udq' {AVX512_F+VL}.
kIdVcvtps2uqq, //!< Instruction 'vcvtps2uqq' {AVX512_DQ+VL}.
kIdVcvtqq2pd, //!< Instruction 'vcvtqq2pd' {AVX512_DQ+VL}.
+ kIdVcvtqq2ph, //!< Instruction 'vcvtqq2ph' {AVX512_FP16+VL}.
kIdVcvtqq2ps, //!< Instruction 'vcvtqq2ps' {AVX512_DQ+VL}.
+ kIdVcvtsd2sh, //!< Instruction 'vcvtsd2sh' {AVX512_FP16}.
kIdVcvtsd2si, //!< Instruction 'vcvtsd2si' {AVX|AVX512_F}.
kIdVcvtsd2ss, //!< Instruction 'vcvtsd2ss' {AVX|AVX512_F}.
kIdVcvtsd2usi, //!< Instruction 'vcvtsd2usi' {AVX512_F}.
+ kIdVcvtsh2sd, //!< Instruction 'vcvtsh2sd' {AVX512_FP16}.
+ kIdVcvtsh2si, //!< Instruction 'vcvtsh2si' {AVX512_FP16}.
+ kIdVcvtsh2ss, //!< Instruction 'vcvtsh2ss' {AVX512_FP16}.
+ kIdVcvtsh2usi, //!< Instruction 'vcvtsh2usi' {AVX512_FP16}.
kIdVcvtsi2sd, //!< Instruction 'vcvtsi2sd' {AVX|AVX512_F}.
+ kIdVcvtsi2sh, //!< Instruction 'vcvtsi2sh' {AVX512_FP16}.
kIdVcvtsi2ss, //!< Instruction 'vcvtsi2ss' {AVX|AVX512_F}.
kIdVcvtss2sd, //!< Instruction 'vcvtss2sd' {AVX|AVX512_F}.
+ kIdVcvtss2sh, //!< Instruction 'vcvtss2sh' {AVX512_FP16}.
kIdVcvtss2si, //!< Instruction 'vcvtss2si' {AVX|AVX512_F}.
kIdVcvtss2usi, //!< Instruction 'vcvtss2usi' {AVX512_F}.
kIdVcvttpd2dq, //!< Instruction 'vcvttpd2dq' {AVX|AVX512_F+VL}.
kIdVcvttpd2qq, //!< Instruction 'vcvttpd2qq' {AVX512_F+VL}.
kIdVcvttpd2udq, //!< Instruction 'vcvttpd2udq' {AVX512_F+VL}.
kIdVcvttpd2uqq, //!< Instruction 'vcvttpd2uqq' {AVX512_DQ+VL}.
+ kIdVcvttph2dq, //!< Instruction 'vcvttph2dq' {AVX512_FP16+VL}.
+ kIdVcvttph2qq, //!< Instruction 'vcvttph2qq' {AVX512_FP16+VL}.
+ kIdVcvttph2udq, //!< Instruction 'vcvttph2udq' {AVX512_FP16+VL}.
+ kIdVcvttph2uqq, //!< Instruction 'vcvttph2uqq' {AVX512_FP16+VL}.
+ kIdVcvttph2uw, //!< Instruction 'vcvttph2uw' {AVX512_FP16+VL}.
+ kIdVcvttph2w, //!< Instruction 'vcvttph2w' {AVX512_FP16+VL}.
kIdVcvttps2dq, //!< Instruction 'vcvttps2dq' {AVX|AVX512_F+VL}.
kIdVcvttps2qq, //!< Instruction 'vcvttps2qq' {AVX512_DQ+VL}.
kIdVcvttps2udq, //!< Instruction 'vcvttps2udq' {AVX512_F+VL}.
kIdVcvttps2uqq, //!< Instruction 'vcvttps2uqq' {AVX512_DQ+VL}.
kIdVcvttsd2si, //!< Instruction 'vcvttsd2si' {AVX|AVX512_F}.
kIdVcvttsd2usi, //!< Instruction 'vcvttsd2usi' {AVX512_F}.
+ kIdVcvttsh2si, //!< Instruction 'vcvttsh2si' {AVX512_FP16}.
+ kIdVcvttsh2usi, //!< Instruction 'vcvttsh2usi' {AVX512_FP16}.
kIdVcvttss2si, //!< Instruction 'vcvttss2si' {AVX|AVX512_F}.
kIdVcvttss2usi, //!< Instruction 'vcvttss2usi' {AVX512_F}.
kIdVcvtudq2pd, //!< Instruction 'vcvtudq2pd' {AVX512_F+VL}.
+ kIdVcvtudq2ph, //!< Instruction 'vcvtudq2ph' {AVX512_FP16+VL}.
kIdVcvtudq2ps, //!< Instruction 'vcvtudq2ps' {AVX512_F+VL}.
kIdVcvtuqq2pd, //!< Instruction 'vcvtuqq2pd' {AVX512_DQ+VL}.
+ kIdVcvtuqq2ph, //!< Instruction 'vcvtuqq2ph' {AVX512_FP16+VL}.
kIdVcvtuqq2ps, //!< Instruction 'vcvtuqq2ps' {AVX512_DQ+VL}.
kIdVcvtusi2sd, //!< Instruction 'vcvtusi2sd' {AVX512_F}.
+ kIdVcvtusi2sh, //!< Instruction 'vcvtusi2sh' {AVX512_FP16}.
kIdVcvtusi2ss, //!< Instruction 'vcvtusi2ss' {AVX512_F}.
+ kIdVcvtuw2ph, //!< Instruction 'vcvtuw2ph' {AVX512_FP16+VL}.
+ kIdVcvtw2ph, //!< Instruction 'vcvtw2ph' {AVX512_FP16+VL}.
kIdVdbpsadbw, //!< Instruction 'vdbpsadbw' {AVX512_BW+VL}.
kIdVdivpd, //!< Instruction 'vdivpd' {AVX|AVX512_F+VL}.
+ kIdVdivph, //!< Instruction 'vdivph' {AVX512_FP16+VL}.
kIdVdivps, //!< Instruction 'vdivps' {AVX|AVX512_F+VL}.
kIdVdivsd, //!< Instruction 'vdivsd' {AVX|AVX512_F}.
+ kIdVdivsh, //!< Instruction 'vdivsh' {AVX512_FP16}.
kIdVdivss, //!< Instruction 'vdivss' {AVX|AVX512_F}.
kIdVdpbf16ps, //!< Instruction 'vdpbf16ps' {AVX512_BF16+VL}.
kIdVdppd, //!< Instruction 'vdppd' {AVX}.
@@ -924,51 +1072,75 @@ struct Inst : public BaseInst {
kIdVextracti64x2, //!< Instruction 'vextracti64x2' {AVX512_DQ+VL}.
kIdVextracti64x4, //!< Instruction 'vextracti64x4' {AVX512_F}.
kIdVextractps, //!< Instruction 'vextractps' {AVX|AVX512_F}.
+ kIdVfcmaddcph, //!< Instruction 'vfcmaddcph' {AVX512_FP16+VL}.
+ kIdVfcmaddcsh, //!< Instruction 'vfcmaddcsh' {AVX512_FP16+VL}.
+ kIdVfcmulcph, //!< Instruction 'vfcmulcph' {AVX512_FP16+VL}.
+ kIdVfcmulcsh, //!< Instruction 'vfcmulcsh' {AVX512_FP16+VL}.
kIdVfixupimmpd, //!< Instruction 'vfixupimmpd' {AVX512_F+VL}.
kIdVfixupimmps, //!< Instruction 'vfixupimmps' {AVX512_F+VL}.
kIdVfixupimmsd, //!< Instruction 'vfixupimmsd' {AVX512_F}.
kIdVfixupimmss, //!< Instruction 'vfixupimmss' {AVX512_F}.
kIdVfmadd132pd, //!< Instruction 'vfmadd132pd' {FMA|AVX512_F+VL}.
+ kIdVfmadd132ph, //!< Instruction 'vfmadd132ph' {AVX512_FP16+VL}.
kIdVfmadd132ps, //!< Instruction 'vfmadd132ps' {FMA|AVX512_F+VL}.
kIdVfmadd132sd, //!< Instruction 'vfmadd132sd' {FMA|AVX512_F}.
+ kIdVfmadd132sh, //!< Instruction 'vfmadd132sh' {AVX512_FP16}.
kIdVfmadd132ss, //!< Instruction 'vfmadd132ss' {FMA|AVX512_F}.
kIdVfmadd213pd, //!< Instruction 'vfmadd213pd' {FMA|AVX512_F+VL}.
+ kIdVfmadd213ph, //!< Instruction 'vfmadd213ph' {AVX512_FP16+VL}.
kIdVfmadd213ps, //!< Instruction 'vfmadd213ps' {FMA|AVX512_F+VL}.
kIdVfmadd213sd, //!< Instruction 'vfmadd213sd' {FMA|AVX512_F}.
+ kIdVfmadd213sh, //!< Instruction 'vfmadd213sh' {AVX512_FP16}.
kIdVfmadd213ss, //!< Instruction 'vfmadd213ss' {FMA|AVX512_F}.
kIdVfmadd231pd, //!< Instruction 'vfmadd231pd' {FMA|AVX512_F+VL}.
+ kIdVfmadd231ph, //!< Instruction 'vfmadd231ph' {AVX512_FP16+VL}.
kIdVfmadd231ps, //!< Instruction 'vfmadd231ps' {FMA|AVX512_F+VL}.
kIdVfmadd231sd, //!< Instruction 'vfmadd231sd' {FMA|AVX512_F}.
+ kIdVfmadd231sh, //!< Instruction 'vfmadd231sh' {AVX512_FP16}.
kIdVfmadd231ss, //!< Instruction 'vfmadd231ss' {FMA|AVX512_F}.
+ kIdVfmaddcph, //!< Instruction 'vfmaddcph' {AVX512_FP16+VL}.
+ kIdVfmaddcsh, //!< Instruction 'vfmaddcsh' {AVX512_FP16+VL}.
kIdVfmaddpd, //!< Instruction 'vfmaddpd' {FMA4}.
kIdVfmaddps, //!< Instruction 'vfmaddps' {FMA4}.
kIdVfmaddsd, //!< Instruction 'vfmaddsd' {FMA4}.
kIdVfmaddss, //!< Instruction 'vfmaddss' {FMA4}.
kIdVfmaddsub132pd, //!< Instruction 'vfmaddsub132pd' {FMA|AVX512_F+VL}.
+ kIdVfmaddsub132ph, //!< Instruction 'vfmaddsub132ph' {AVX512_FP16+VL}.
kIdVfmaddsub132ps, //!< Instruction 'vfmaddsub132ps' {FMA|AVX512_F+VL}.
kIdVfmaddsub213pd, //!< Instruction 'vfmaddsub213pd' {FMA|AVX512_F+VL}.
+ kIdVfmaddsub213ph, //!< Instruction 'vfmaddsub213ph' {AVX512_FP16+VL}.
kIdVfmaddsub213ps, //!< Instruction 'vfmaddsub213ps' {FMA|AVX512_F+VL}.
kIdVfmaddsub231pd, //!< Instruction 'vfmaddsub231pd' {FMA|AVX512_F+VL}.
+ kIdVfmaddsub231ph, //!< Instruction 'vfmaddsub231ph' {AVX512_FP16+VL}.
kIdVfmaddsub231ps, //!< Instruction 'vfmaddsub231ps' {FMA|AVX512_F+VL}.
kIdVfmaddsubpd, //!< Instruction 'vfmaddsubpd' {FMA4}.
kIdVfmaddsubps, //!< Instruction 'vfmaddsubps' {FMA4}.
kIdVfmsub132pd, //!< Instruction 'vfmsub132pd' {FMA|AVX512_F+VL}.
+ kIdVfmsub132ph, //!< Instruction 'vfmsub132ph' {AVX512_FP16+VL}.
kIdVfmsub132ps, //!< Instruction 'vfmsub132ps' {FMA|AVX512_F+VL}.
kIdVfmsub132sd, //!< Instruction 'vfmsub132sd' {FMA|AVX512_F}.
+ kIdVfmsub132sh, //!< Instruction 'vfmsub132sh' {AVX512_FP16}.
kIdVfmsub132ss, //!< Instruction 'vfmsub132ss' {FMA|AVX512_F}.
kIdVfmsub213pd, //!< Instruction 'vfmsub213pd' {FMA|AVX512_F+VL}.
+ kIdVfmsub213ph, //!< Instruction 'vfmsub213ph' {AVX512_FP16+VL}.
kIdVfmsub213ps, //!< Instruction 'vfmsub213ps' {FMA|AVX512_F+VL}.
kIdVfmsub213sd, //!< Instruction 'vfmsub213sd' {FMA|AVX512_F}.
+ kIdVfmsub213sh, //!< Instruction 'vfmsub213sh' {AVX512_FP16}.
kIdVfmsub213ss, //!< Instruction 'vfmsub213ss' {FMA|AVX512_F}.
kIdVfmsub231pd, //!< Instruction 'vfmsub231pd' {FMA|AVX512_F+VL}.
+ kIdVfmsub231ph, //!< Instruction 'vfmsub231ph' {AVX512_FP16+VL}.
kIdVfmsub231ps, //!< Instruction 'vfmsub231ps' {FMA|AVX512_F+VL}.
kIdVfmsub231sd, //!< Instruction 'vfmsub231sd' {FMA|AVX512_F}.
+ kIdVfmsub231sh, //!< Instruction 'vfmsub231sh' {AVX512_FP16}.
kIdVfmsub231ss, //!< Instruction 'vfmsub231ss' {FMA|AVX512_F}.
kIdVfmsubadd132pd, //!< Instruction 'vfmsubadd132pd' {FMA|AVX512_F+VL}.
+ kIdVfmsubadd132ph, //!< Instruction 'vfmsubadd132ph' {AVX512_FP16+VL}.
kIdVfmsubadd132ps, //!< Instruction 'vfmsubadd132ps' {FMA|AVX512_F+VL}.
kIdVfmsubadd213pd, //!< Instruction 'vfmsubadd213pd' {FMA|AVX512_F+VL}.
+ kIdVfmsubadd213ph, //!< Instruction 'vfmsubadd213ph' {AVX512_FP16+VL}.
kIdVfmsubadd213ps, //!< Instruction 'vfmsubadd213ps' {FMA|AVX512_F+VL}.
kIdVfmsubadd231pd, //!< Instruction 'vfmsubadd231pd' {FMA|AVX512_F+VL}.
+ kIdVfmsubadd231ph, //!< Instruction 'vfmsubadd231ph' {AVX512_FP16+VL}.
kIdVfmsubadd231ps, //!< Instruction 'vfmsubadd231ps' {FMA|AVX512_F+VL}.
kIdVfmsubaddpd, //!< Instruction 'vfmsubaddpd' {FMA4}.
kIdVfmsubaddps, //!< Instruction 'vfmsubaddps' {FMA4}.
@@ -976,41 +1148,57 @@ struct Inst : public BaseInst {
kIdVfmsubps, //!< Instruction 'vfmsubps' {FMA4}.
kIdVfmsubsd, //!< Instruction 'vfmsubsd' {FMA4}.
kIdVfmsubss, //!< Instruction 'vfmsubss' {FMA4}.
+ kIdVfmulcph, //!< Instruction 'vfmulcph' {AVX512_FP16+VL}.
+ kIdVfmulcsh, //!< Instruction 'vfmulcsh' {AVX512_FP16+VL}.
kIdVfnmadd132pd, //!< Instruction 'vfnmadd132pd' {FMA|AVX512_F+VL}.
+ kIdVfnmadd132ph, //!< Instruction 'vfnmadd132ph' {AVX512_FP16+VL}.
kIdVfnmadd132ps, //!< Instruction 'vfnmadd132ps' {FMA|AVX512_F+VL}.
kIdVfnmadd132sd, //!< Instruction 'vfnmadd132sd' {FMA|AVX512_F}.
+ kIdVfnmadd132sh, //!< Instruction 'vfnmadd132sh' {AVX512_FP16}.
kIdVfnmadd132ss, //!< Instruction 'vfnmadd132ss' {FMA|AVX512_F}.
kIdVfnmadd213pd, //!< Instruction 'vfnmadd213pd' {FMA|AVX512_F+VL}.
+ kIdVfnmadd213ph, //!< Instruction 'vfnmadd213ph' {AVX512_FP16+VL}.
kIdVfnmadd213ps, //!< Instruction 'vfnmadd213ps' {FMA|AVX512_F+VL}.
kIdVfnmadd213sd, //!< Instruction 'vfnmadd213sd' {FMA|AVX512_F}.
+ kIdVfnmadd213sh, //!< Instruction 'vfnmadd213sh' {AVX512_FP16}.
kIdVfnmadd213ss, //!< Instruction 'vfnmadd213ss' {FMA|AVX512_F}.
kIdVfnmadd231pd, //!< Instruction 'vfnmadd231pd' {FMA|AVX512_F+VL}.
+ kIdVfnmadd231ph, //!< Instruction 'vfnmadd231ph' {AVX512_FP16+VL}.
kIdVfnmadd231ps, //!< Instruction 'vfnmadd231ps' {FMA|AVX512_F+VL}.
kIdVfnmadd231sd, //!< Instruction 'vfnmadd231sd' {FMA|AVX512_F}.
+ kIdVfnmadd231sh, //!< Instruction 'vfnmadd231sh' {AVX512_FP16}.
kIdVfnmadd231ss, //!< Instruction 'vfnmadd231ss' {FMA|AVX512_F}.
kIdVfnmaddpd, //!< Instruction 'vfnmaddpd' {FMA4}.
kIdVfnmaddps, //!< Instruction 'vfnmaddps' {FMA4}.
kIdVfnmaddsd, //!< Instruction 'vfnmaddsd' {FMA4}.
kIdVfnmaddss, //!< Instruction 'vfnmaddss' {FMA4}.
kIdVfnmsub132pd, //!< Instruction 'vfnmsub132pd' {FMA|AVX512_F+VL}.
+ kIdVfnmsub132ph, //!< Instruction 'vfnmsub132ph' {AVX512_FP16+VL}.
kIdVfnmsub132ps, //!< Instruction 'vfnmsub132ps' {FMA|AVX512_F+VL}.
kIdVfnmsub132sd, //!< Instruction 'vfnmsub132sd' {FMA|AVX512_F}.
+ kIdVfnmsub132sh, //!< Instruction 'vfnmsub132sh' {AVX512_FP16}.
kIdVfnmsub132ss, //!< Instruction 'vfnmsub132ss' {FMA|AVX512_F}.
kIdVfnmsub213pd, //!< Instruction 'vfnmsub213pd' {FMA|AVX512_F+VL}.
+ kIdVfnmsub213ph, //!< Instruction 'vfnmsub213ph' {AVX512_FP16+VL}.
kIdVfnmsub213ps, //!< Instruction 'vfnmsub213ps' {FMA|AVX512_F+VL}.
kIdVfnmsub213sd, //!< Instruction 'vfnmsub213sd' {FMA|AVX512_F}.
+ kIdVfnmsub213sh, //!< Instruction 'vfnmsub213sh' {AVX512_FP16}.
kIdVfnmsub213ss, //!< Instruction 'vfnmsub213ss' {FMA|AVX512_F}.
kIdVfnmsub231pd, //!< Instruction 'vfnmsub231pd' {FMA|AVX512_F+VL}.
+ kIdVfnmsub231ph, //!< Instruction 'vfnmsub231ph' {AVX512_FP16+VL}.
kIdVfnmsub231ps, //!< Instruction 'vfnmsub231ps' {FMA|AVX512_F+VL}.
kIdVfnmsub231sd, //!< Instruction 'vfnmsub231sd' {FMA|AVX512_F}.
+ kIdVfnmsub231sh, //!< Instruction 'vfnmsub231sh' {AVX512_FP16}.
kIdVfnmsub231ss, //!< Instruction 'vfnmsub231ss' {FMA|AVX512_F}.
kIdVfnmsubpd, //!< Instruction 'vfnmsubpd' {FMA4}.
kIdVfnmsubps, //!< Instruction 'vfnmsubps' {FMA4}.
kIdVfnmsubsd, //!< Instruction 'vfnmsubsd' {FMA4}.
kIdVfnmsubss, //!< Instruction 'vfnmsubss' {FMA4}.
kIdVfpclasspd, //!< Instruction 'vfpclasspd' {AVX512_DQ+VL}.
+ kIdVfpclassph, //!< Instruction 'vfpclassph' {AVX512_FP16+VL}.
kIdVfpclassps, //!< Instruction 'vfpclassps' {AVX512_DQ+VL}.
kIdVfpclasssd, //!< Instruction 'vfpclasssd' {AVX512_DQ}.
+ kIdVfpclasssh, //!< Instruction 'vfpclasssh' {AVX512_FP16}.
kIdVfpclassss, //!< Instruction 'vfpclassss' {AVX512_DQ}.
kIdVfrczpd, //!< Instruction 'vfrczpd' {XOP}.
kIdVfrczps, //!< Instruction 'vfrczps' {XOP}.
@@ -1029,12 +1217,16 @@ struct Inst : public BaseInst {
kIdVgatherqpd, //!< Instruction 'vgatherqpd' {AVX2|AVX512_F+VL}.
kIdVgatherqps, //!< Instruction 'vgatherqps' {AVX2|AVX512_F+VL}.
kIdVgetexppd, //!< Instruction 'vgetexppd' {AVX512_F+VL}.
+ kIdVgetexpph, //!< Instruction 'vgetexpph' {AVX512_FP16+VL}.
kIdVgetexpps, //!< Instruction 'vgetexpps' {AVX512_F+VL}.
kIdVgetexpsd, //!< Instruction 'vgetexpsd' {AVX512_F}.
+ kIdVgetexpsh, //!< Instruction 'vgetexpsh' {AVX512_FP16}.
kIdVgetexpss, //!< Instruction 'vgetexpss' {AVX512_F}.
kIdVgetmantpd, //!< Instruction 'vgetmantpd' {AVX512_F+VL}.
+ kIdVgetmantph, //!< Instruction 'vgetmantph' {AVX512_FP16+VL}.
kIdVgetmantps, //!< Instruction 'vgetmantps' {AVX512_F+VL}.
kIdVgetmantsd, //!< Instruction 'vgetmantsd' {AVX512_F}.
+ kIdVgetmantsh, //!< Instruction 'vgetmantsh' {AVX512_FP16}.
kIdVgetmantss, //!< Instruction 'vgetmantss' {AVX512_F}.
kIdVgf2p8affineinvqb, //!< Instruction 'vgf2p8affineinvqb' {AVX|AVX512_F+VL & GFNI}.
kIdVgf2p8affineqb, //!< Instruction 'vgf2p8affineqb' {AVX|AVX512_F+VL & GFNI}.
@@ -1060,15 +1252,19 @@ struct Inst : public BaseInst {
kIdVmaskmovpd, //!< Instruction 'vmaskmovpd' {AVX}.
kIdVmaskmovps, //!< Instruction 'vmaskmovps' {AVX}.
kIdVmaxpd, //!< Instruction 'vmaxpd' {AVX|AVX512_F+VL}.
+ kIdVmaxph, //!< Instruction 'vmaxph' {AVX512_FP16+VL}.
kIdVmaxps, //!< Instruction 'vmaxps' {AVX|AVX512_F+VL}.
kIdVmaxsd, //!< Instruction 'vmaxsd' {AVX|AVX512_F+VL}.
+ kIdVmaxsh, //!< Instruction 'vmaxsh' {AVX512_FP16}.
kIdVmaxss, //!< Instruction 'vmaxss' {AVX|AVX512_F+VL}.
kIdVmcall, //!< Instruction 'vmcall' {VMX}.
kIdVmclear, //!< Instruction 'vmclear' {VMX}.
kIdVmfunc, //!< Instruction 'vmfunc' {VMX}.
kIdVminpd, //!< Instruction 'vminpd' {AVX|AVX512_F+VL}.
+ kIdVminph, //!< Instruction 'vminph' {AVX512_FP16+VL}.
kIdVminps, //!< Instruction 'vminps' {AVX|AVX512_F+VL}.
kIdVminsd, //!< Instruction 'vminsd' {AVX|AVX512_F+VL}.
+ kIdVminsh, //!< Instruction 'vminsh' {AVX512_FP16}.
kIdVminss, //!< Instruction 'vminss' {AVX|AVX512_F+VL}.
kIdVmlaunch, //!< Instruction 'vmlaunch' {VMX}.
kIdVmload, //!< Instruction 'vmload' {SVM}.
@@ -1099,11 +1295,13 @@ struct Inst : public BaseInst {
kIdVmovntps, //!< Instruction 'vmovntps' {AVX|AVX512_F+VL}.
kIdVmovq, //!< Instruction 'vmovq' {AVX|AVX512_F}.
kIdVmovsd, //!< Instruction 'vmovsd' {AVX|AVX512_F}.
+ kIdVmovsh, //!< Instruction 'vmovsh' {AVX512_FP16}.
kIdVmovshdup, //!< Instruction 'vmovshdup' {AVX|AVX512_F+VL}.
kIdVmovsldup, //!< Instruction 'vmovsldup' {AVX|AVX512_F+VL}.
kIdVmovss, //!< Instruction 'vmovss' {AVX|AVX512_F}.
kIdVmovupd, //!< Instruction 'vmovupd' {AVX|AVX512_F+VL}.
kIdVmovups, //!< Instruction 'vmovups' {AVX|AVX512_F+VL}.
+ kIdVmovw, //!< Instruction 'vmovw' {AVX512_FP16}.
kIdVmpsadbw, //!< Instruction 'vmpsadbw' {AVX|AVX2}.
kIdVmptrld, //!< Instruction 'vmptrld' {VMX}.
kIdVmptrst, //!< Instruction 'vmptrst' {VMX}.
@@ -1112,13 +1310,17 @@ struct Inst : public BaseInst {
kIdVmrun, //!< Instruction 'vmrun' {SVM}.
kIdVmsave, //!< Instruction 'vmsave' {SVM}.
kIdVmulpd, //!< Instruction 'vmulpd' {AVX|AVX512_F+VL}.
+ kIdVmulph, //!< Instruction 'vmulph' {AVX512_FP16+VL}.
kIdVmulps, //!< Instruction 'vmulps' {AVX|AVX512_F+VL}.
kIdVmulsd, //!< Instruction 'vmulsd' {AVX|AVX512_F}.
+ kIdVmulsh, //!< Instruction 'vmulsh' {AVX512_FP16}.
kIdVmulss, //!< Instruction 'vmulss' {AVX|AVX512_F}.
kIdVmwrite, //!< Instruction 'vmwrite' {VMX}.
kIdVmxon, //!< Instruction 'vmxon' {VMX}.
kIdVorpd, //!< Instruction 'vorpd' {AVX|AVX512_DQ+VL}.
kIdVorps, //!< Instruction 'vorps' {AVX|AVX512_DQ+VL}.
+ kIdVp2intersectd, //!< Instruction 'vp2intersectd' {AVX512_VP2INTERSECT}.
+ kIdVp2intersectq, //!< Instruction 'vp2intersectq' {AVX512_VP2INTERSECT}.
kIdVp4dpwssd, //!< Instruction 'vp4dpwssd' {AVX512_4VNNIW}.
kIdVp4dpwssds, //!< Instruction 'vp4dpwssds' {AVX512_4VNNIW}.
kIdVpabsb, //!< Instruction 'vpabsb' {AVX|AVX2|AVX512_BW+VL}.
@@ -1147,12 +1349,16 @@ struct Inst : public BaseInst {
kIdVpavgb, //!< Instruction 'vpavgb' {AVX|AVX2|AVX512_BW+VL}.
kIdVpavgw, //!< Instruction 'vpavgw' {AVX|AVX2|AVX512_BW+VL}.
kIdVpblendd, //!< Instruction 'vpblendd' {AVX2}.
+ kIdVpblendmb, //!< Instruction 'vpblendmb' {AVX512_BW+VL}.
+ kIdVpblendmd, //!< Instruction 'vpblendmd' {AVX512_F+VL}.
+ kIdVpblendmq, //!< Instruction 'vpblendmq' {AVX512_F+VL}.
+ kIdVpblendmw, //!< Instruction 'vpblendmw' {AVX512_BW+VL}.
kIdVpblendvb, //!< Instruction 'vpblendvb' {AVX|AVX2}.
kIdVpblendw, //!< Instruction 'vpblendw' {AVX|AVX2}.
kIdVpbroadcastb, //!< Instruction 'vpbroadcastb' {AVX2|AVX512_BW+VL}.
kIdVpbroadcastd, //!< Instruction 'vpbroadcastd' {AVX2|AVX512_F+VL}.
- kIdVpbroadcastmb2d, //!< Instruction 'vpbroadcastmb2d' {AVX512_CDI+VL}.
kIdVpbroadcastmb2q, //!< Instruction 'vpbroadcastmb2q' {AVX512_CDI+VL}.
+ kIdVpbroadcastmw2d, //!< Instruction 'vpbroadcastmw2d' {AVX512_CDI+VL}.
kIdVpbroadcastq, //!< Instruction 'vpbroadcastq' {AVX2|AVX512_F+VL}.
kIdVpbroadcastw, //!< Instruction 'vpbroadcastw' {AVX2|AVX512_BW+VL}.
kIdVpclmulqdq, //!< Instruction 'vpclmulqdq' {AVX|AVX512_F+VL & PCLMULQDQ|VPCLMULQDQ}.
@@ -1191,10 +1397,10 @@ struct Inst : public BaseInst {
kIdVpcomw, //!< Instruction 'vpcomw' {XOP}.
kIdVpconflictd, //!< Instruction 'vpconflictd' {AVX512_CDI+VL}.
kIdVpconflictq, //!< Instruction 'vpconflictq' {AVX512_CDI+VL}.
- kIdVpdpbusd, //!< Instruction 'vpdpbusd' {AVX512_VNNI+VL}.
- kIdVpdpbusds, //!< Instruction 'vpdpbusds' {AVX512_VNNI+VL}.
- kIdVpdpwssd, //!< Instruction 'vpdpwssd' {AVX512_VNNI+VL}.
- kIdVpdpwssds, //!< Instruction 'vpdpwssds' {AVX512_VNNI+VL}.
+ kIdVpdpbusd, //!< Instruction 'vpdpbusd' {AVX_VNNI|AVX512_VNNI+VL}.
+ kIdVpdpbusds, //!< Instruction 'vpdpbusds' {AVX_VNNI|AVX512_VNNI+VL}.
+ kIdVpdpwssd, //!< Instruction 'vpdpwssd' {AVX_VNNI|AVX512_VNNI+VL}.
+ kIdVpdpwssds, //!< Instruction 'vpdpwssds' {AVX_VNNI|AVX512_VNNI+VL}.
kIdVperm2f128, //!< Instruction 'vperm2f128' {AVX}.
kIdVperm2i128, //!< Instruction 'vperm2i128' {AVX2}.
kIdVpermb, //!< Instruction 'vpermb' {AVX512_VBMI+VL}.
@@ -1456,15 +1662,21 @@ struct Inst : public BaseInst {
kIdVrcp28ps, //!< Instruction 'vrcp28ps' {AVX512_ERI}.
kIdVrcp28sd, //!< Instruction 'vrcp28sd' {AVX512_ERI}.
kIdVrcp28ss, //!< Instruction 'vrcp28ss' {AVX512_ERI}.
+ kIdVrcpph, //!< Instruction 'vrcpph' {AVX512_FP16}.
kIdVrcpps, //!< Instruction 'vrcpps' {AVX}.
+ kIdVrcpsh, //!< Instruction 'vrcpsh' {AVX512_FP16}.
kIdVrcpss, //!< Instruction 'vrcpss' {AVX}.
kIdVreducepd, //!< Instruction 'vreducepd' {AVX512_DQ+VL}.
+ kIdVreduceph, //!< Instruction 'vreduceph' {AVX512_FP16+VL}.
kIdVreduceps, //!< Instruction 'vreduceps' {AVX512_DQ+VL}.
kIdVreducesd, //!< Instruction 'vreducesd' {AVX512_DQ}.
+ kIdVreducesh, //!< Instruction 'vreducesh' {AVX512_FP16}.
kIdVreducess, //!< Instruction 'vreducess' {AVX512_DQ}.
kIdVrndscalepd, //!< Instruction 'vrndscalepd' {AVX512_F+VL}.
+ kIdVrndscaleph, //!< Instruction 'vrndscaleph' {AVX512_FP16+VL}.
kIdVrndscaleps, //!< Instruction 'vrndscaleps' {AVX512_F+VL}.
kIdVrndscalesd, //!< Instruction 'vrndscalesd' {AVX512_F}.
+ kIdVrndscalesh, //!< Instruction 'vrndscalesh' {AVX512_FP16}.
kIdVrndscaless, //!< Instruction 'vrndscaless' {AVX512_F}.
kIdVroundpd, //!< Instruction 'vroundpd' {AVX}.
kIdVroundps, //!< Instruction 'vroundps' {AVX}.
@@ -1478,11 +1690,15 @@ struct Inst : public BaseInst {
kIdVrsqrt28ps, //!< Instruction 'vrsqrt28ps' {AVX512_ERI}.
kIdVrsqrt28sd, //!< Instruction 'vrsqrt28sd' {AVX512_ERI}.
kIdVrsqrt28ss, //!< Instruction 'vrsqrt28ss' {AVX512_ERI}.
+ kIdVrsqrtph, //!< Instruction 'vrsqrtph' {AVX512_FP16+VL}.
kIdVrsqrtps, //!< Instruction 'vrsqrtps' {AVX}.
+ kIdVrsqrtsh, //!< Instruction 'vrsqrtsh' {AVX512_FP16}.
kIdVrsqrtss, //!< Instruction 'vrsqrtss' {AVX}.
kIdVscalefpd, //!< Instruction 'vscalefpd' {AVX512_F+VL}.
+ kIdVscalefph, //!< Instruction 'vscalefph' {AVX512_FP16+VL}.
kIdVscalefps, //!< Instruction 'vscalefps' {AVX512_F+VL}.
kIdVscalefsd, //!< Instruction 'vscalefsd' {AVX512_F}.
+ kIdVscalefsh, //!< Instruction 'vscalefsh' {AVX512_FP16}.
kIdVscalefss, //!< Instruction 'vscalefss' {AVX512_F}.
kIdVscatterdpd, //!< Instruction 'vscatterdpd' {AVX512_F+VL}.
kIdVscatterdps, //!< Instruction 'vscatterdps' {AVX512_F+VL}.
@@ -1503,17 +1719,22 @@ struct Inst : public BaseInst {
kIdVshufpd, //!< Instruction 'vshufpd' {AVX|AVX512_F+VL}.
kIdVshufps, //!< Instruction 'vshufps' {AVX|AVX512_F+VL}.
kIdVsqrtpd, //!< Instruction 'vsqrtpd' {AVX|AVX512_F+VL}.
+ kIdVsqrtph, //!< Instruction 'vsqrtph' {AVX512_FP16+VL}.
kIdVsqrtps, //!< Instruction 'vsqrtps' {AVX|AVX512_F+VL}.
kIdVsqrtsd, //!< Instruction 'vsqrtsd' {AVX|AVX512_F}.
+ kIdVsqrtsh, //!< Instruction 'vsqrtsh' {AVX512_FP16}.
kIdVsqrtss, //!< Instruction 'vsqrtss' {AVX|AVX512_F}.
kIdVstmxcsr, //!< Instruction 'vstmxcsr' {AVX}.
kIdVsubpd, //!< Instruction 'vsubpd' {AVX|AVX512_F+VL}.
+ kIdVsubph, //!< Instruction 'vsubph' {AVX512_FP16+VL}.
kIdVsubps, //!< Instruction 'vsubps' {AVX|AVX512_F+VL}.
kIdVsubsd, //!< Instruction 'vsubsd' {AVX|AVX512_F}.
+ kIdVsubsh, //!< Instruction 'vsubsh' {AVX512_FP16}.
kIdVsubss, //!< Instruction 'vsubss' {AVX|AVX512_F}.
kIdVtestpd, //!< Instruction 'vtestpd' {AVX}.
kIdVtestps, //!< Instruction 'vtestps' {AVX}.
kIdVucomisd, //!< Instruction 'vucomisd' {AVX|AVX512_F}.
+ kIdVucomish, //!< Instruction 'vucomish' {AVX512_FP16}.
kIdVucomiss, //!< Instruction 'vucomiss' {AVX|AVX512_F}.
kIdVunpckhpd, //!< Instruction 'vunpckhpd' {AVX|AVX512_F+VL}.
kIdVunpckhps, //!< Instruction 'vunpckhps' {AVX|AVX512_F+VL}.
@@ -1528,6 +1749,10 @@ struct Inst : public BaseInst {
kIdWrfsbase, //!< Instruction 'wrfsbase' {FSGSBASE} (X64).
kIdWrgsbase, //!< Instruction 'wrgsbase' {FSGSBASE} (X64).
kIdWrmsr, //!< Instruction 'wrmsr' {MSR}.
+ kIdWrssd, //!< Instruction 'wrssd' {CET_SS}.
+ kIdWrssq, //!< Instruction 'wrssq' {CET_SS} (X64).
+ kIdWrussd, //!< Instruction 'wrussd' {CET_SS}.
+ kIdWrussq, //!< Instruction 'wrussq' {CET_SS} (X64).
kIdXabort, //!< Instruction 'xabort' {RTM}.
kIdXadd, //!< Instruction 'xadd' {I486}.
kIdXbegin, //!< Instruction 'xbegin' {RTM}.
@@ -1538,6 +1763,7 @@ struct Inst : public BaseInst {
kIdXor, //!< Instruction 'xor'.
kIdXorpd, //!< Instruction 'xorpd' {SSE2}.
kIdXorps, //!< Instruction 'xorps' {SSE}.
+ kIdXresldtrk, //!< Instruction 'xresldtrk' {TSXLDTRK}.
kIdXrstor, //!< Instruction 'xrstor' {XSAVE}.
kIdXrstor64, //!< Instruction 'xrstor64' {XSAVE} (X64).
kIdXrstors, //!< Instruction 'xrstors' {XSAVES}.
@@ -1551,563 +1777,389 @@ struct Inst : public BaseInst {
kIdXsaves, //!< Instruction 'xsaves' {XSAVES}.
kIdXsaves64, //!< Instruction 'xsaves64' {XSAVES} (X64).
kIdXsetbv, //!< Instruction 'xsetbv' {XSAVE}.
+ kIdXsusldtrk, //!< Instruction 'xsusldtrk' {TSXLDTRK}.
kIdXtest, //!< Instruction 'xtest' {TSX}.
_kIdCount
// ${InstId:End}
};
- //! Instruction options.
- enum Options : uint32_t {
- kOptionVex3 = 0x00000400u, //!< Use 3-byte VEX prefix if possible (AVX) (must be 0x00000400).
- kOptionModMR = 0x00000800u, //!< Use ModMR instead of ModRM when it's available.
- kOptionEvex = 0x00001000u, //!< Use 4-byte EVEX prefix if possible (AVX-512) (must be 0x00001000).
-
- kOptionLock = 0x00002000u, //!< LOCK prefix (lock-enabled instructions only).
- kOptionRep = 0x00004000u, //!< REP prefix (string instructions only).
- kOptionRepne = 0x00008000u, //!< REPNE prefix (string instructions only).
-
- kOptionXAcquire = 0x00010000u, //!< XACQUIRE prefix (only allowed instructions).
- kOptionXRelease = 0x00020000u, //!< XRELEASE prefix (only allowed instructions).
-
- kOptionER = 0x00040000u, //!< AVX-512: embedded-rounding {er} and implicit {sae}.
- kOptionSAE = 0x00080000u, //!< AVX-512: suppress-all-exceptions {sae}.
- kOptionRN_SAE = 0x00000000u, //!< AVX-512: round-to-nearest (even) {rn-sae} (bits 00).
- kOptionRD_SAE = 0x00200000u, //!< AVX-512: round-down (toward -inf) {rd-sae} (bits 01).
- kOptionRU_SAE = 0x00400000u, //!< AVX-512: round-up (toward +inf) {ru-sae} (bits 10).
- kOptionRZ_SAE = 0x00600000u, //!< AVX-512: round-toward-zero (truncate) {rz-sae} (bits 11).
- kOptionZMask = 0x00800000u, //!< AVX-512: Use zeroing {k}{z} instead of merging {k}.
- _kOptionAvx512Mask = 0x00FC0000u, //!< AVX-512: Mask of all possible AVX-512 options except EVEX prefix flag.
-
- kOptionOpCodeB = 0x01000000u, //!< REX.B and/or VEX.B field (X64).
- kOptionOpCodeX = 0x02000000u, //!< REX.X and/or VEX.X field (X64).
- kOptionOpCodeR = 0x04000000u, //!< REX.R and/or VEX.R field (X64).
- kOptionOpCodeW = 0x08000000u, //!< REX.W and/or VEX.W field (X64).
- kOptionRex = 0x40000000u, //!< Force REX prefix (X64).
- _kOptionInvalidRex = 0x80000000u //!< Invalid REX prefix (set by X86 or when AH|BH|CH|DH regs are used on X64).
- };
-
- // --------------------------------------------------------------------------
- // [Statics]
- // --------------------------------------------------------------------------
-
- //! Tests whether the `instId` is defined (counts also Inst::kIdNone, which must be zero).
- static inline bool isDefinedId(uint32_t instId) noexcept { return instId < _kIdCount; }
-};
-
-// ============================================================================
-// [asmjit::x86::Condition]
-// ============================================================================
-
-namespace Condition {
- //! Condition code.
- enum Code : uint32_t {
- kO = 0x00u, //!< OF==1
- kNO = 0x01u, //!< OF==0
- kB = 0x02u, //!< CF==1 (unsigned < )
- kC = 0x02u, //!< CF==1
- kNAE = 0x02u, //!< CF==1 (unsigned < )
- kAE = 0x03u, //!< CF==0 (unsigned >=)
- kNB = 0x03u, //!< CF==0 (unsigned >=)
- kNC = 0x03u, //!< CF==0
- kE = 0x04u, //!< ZF==1 (any_sign ==)
- kZ = 0x04u, //!< ZF==1 (any_sign ==)
- kNE = 0x05u, //!< ZF==0 (any_sign !=)
- kNZ = 0x05u, //!< ZF==0 (any_sign !=)
- kBE = 0x06u, //!< CF==1 | ZF==1 (unsigned <=)
- kNA = 0x06u, //!< CF==1 | ZF==1 (unsigned <=)
- kA = 0x07u, //!< CF==0 & ZF==0 (unsigned > )
- kNBE = 0x07u, //!< CF==0 & ZF==0 (unsigned > )
- kS = 0x08u, //!< SF==1 (is negative)
- kNS = 0x09u, //!< SF==0 (is positive or zero)
- kP = 0x0Au, //!< PF==1
- kPE = 0x0Au, //!< PF==1
- kPO = 0x0Bu, //!< PF==0
- kNP = 0x0Bu, //!< PF==0
- kL = 0x0Cu, //!< SF!=OF (signed < )
- kNGE = 0x0Cu, //!< SF!=OF (signed < )
- kGE = 0x0Du, //!< SF==OF (signed >=)
- kNL = 0x0Du, //!< SF==OF (signed >=)
- kLE = 0x0Eu, //!< ZF==1 | SF!=OF (signed <=)
- kNG = 0x0Eu, //!< ZF==1 | SF!=OF (signed <=)
- kG = 0x0Fu, //!< ZF==0 & SF==OF (signed > )
- kNLE = 0x0Fu, //!< ZF==0 & SF==OF (signed > )
- kCount = 0x10u,
-
- kSign = kS, //!< Sign.
- kNotSign = kNS, //!< Not Sign.
-
- kOverflow = kO, //!< Signed overflow.
- kNotOverflow = kNO, //!< Not signed overflow.
-
- kEqual = kE, //!< Equal `a == b`.
- kNotEqual = kNE, //!< Not Equal `a != b`.
-
- kSignedLT = kL, //!< Signed `a < b`.
- kSignedLE = kLE, //!< Signed `a <= b`.
- kSignedGT = kG, //!< Signed `a > b`.
- kSignedGE = kGE, //!< Signed `a >= b`.
-
- kUnsignedLT = kB, //!< Unsigned `a < b`.
- kUnsignedLE = kBE, //!< Unsigned `a <= b`.
- kUnsignedGT = kA, //!< Unsigned `a > b`.
- kUnsignedGE = kAE, //!< Unsigned `a >= b`.
-
- kZero = kZ, //!< Zero flag.
- kNotZero = kNZ, //!< Non-zero flag.
-
- kNegative = kS, //!< Sign flag.
- kPositive = kNS, //!< No sign flag.
-
- kParityEven = kP, //!< Even parity flag.
- kParityOdd = kPO //!< Odd parity flag.
- };
-
- static constexpr uint8_t reverseTable[kCount] = {
- kO, kNO, kA , kBE, // O|NO|B |AE
- kE, kNE, kAE, kB , // E|NE|BE|A
- kS, kNS, kPE, kPO, // S|NS|PE|PO
- kG, kLE, kGE, kL // L|GE|LE|G
- };
+ //! Tests whether the `instId` is defined.
+ static inline constexpr bool isDefinedId(InstId instId) noexcept { return instId < _kIdCount; }
+ //! \cond
#define ASMJIT_INST_FROM_COND(ID) \
ID##o, ID##no, ID##b , ID##ae, \
ID##e, ID##ne, ID##be, ID##a , \
ID##s, ID##ns, ID##pe, ID##po, \
ID##l, ID##ge, ID##le, ID##g
- static constexpr uint16_t jccTable[] = { ASMJIT_INST_FROM_COND(Inst::kIdJ) };
- static constexpr uint16_t setccTable[] = { ASMJIT_INST_FROM_COND(Inst::kIdSet) };
- static constexpr uint16_t cmovccTable[] = { ASMJIT_INST_FROM_COND(Inst::kIdCmov) };
+
+ static constexpr uint16_t _jccTable[] = { ASMJIT_INST_FROM_COND(Inst::kIdJ) };
+ static constexpr uint16_t _setccTable[] = { ASMJIT_INST_FROM_COND(Inst::kIdSet) };
+ static constexpr uint16_t _cmovccTable[] = { ASMJIT_INST_FROM_COND(Inst::kIdCmov) };
+
#undef ASMJIT_INST_FROM_COND
+ //! \endcond
+
+ //! Translates a condition code `cond` to a `jcc` instruction id.
+ static constexpr InstId jccFromCond(CondCode cond) noexcept { return _jccTable[uint8_t(cond)]; }
+ //! Translates a condition code `cond` to a `setcc` instruction id.
+ static constexpr InstId setccFromCond(CondCode cond) noexcept { return _setccTable[uint8_t(cond)]; }
+ //! Translates a condition code `cond` to a `cmovcc` instruction id.
+ static constexpr InstId cmovccFromCond(CondCode cond) noexcept { return _cmovccTable[uint8_t(cond)]; }
+} // {Inst}
+
+//! FPU status word bits.
+enum class FpuStatusWord : uint16_t {
+ kNone = 0x0000u, //!< No bits set.
+
+ kInvalid = 0x0001u, //!< Invalid operation.
+ kDenormalized = 0x0002u, //!< Denormalized operand.
+ kDivByZero = 0x0004u, //!< Division by zero.
+ kOverflow = 0x0008u, //!< Overflown.
+ kUnderflow = 0x0010u, //!< Underflown.
+ kPrecision = 0x0020u, //!< Precision lost.
+ kStackFault = 0x0040u, //!< Stack fault.
+ kInterrupt = 0x0080u, //!< Interrupt.
+ kC0 = 0x0100u, //!< C0 flag.
+ kC1 = 0x0200u, //!< C1 flag.
+ kC2 = 0x0400u, //!< C2 flag.
+ kTopMask = 0x3800u, //!< Top of the stack (mask).
+ kC3 = 0x4000u, //!< C3 flag.
+ kBusy = 0x8000u //!< FPU is busy.
+};
+ASMJIT_DEFINE_ENUM_FLAGS(FpuStatusWord)
+
+//! FPU control word bits.
+enum class FpuControlWord : uint16_t {
+ kNone = 0x0000u, //!< No bits set.
+
+ // Bits 0-5
+ // --------
+
+ kEM_Mask = 0x003Fu, //!< Exception mask (0x3F).
+ kEM_Invalid = 0x0001u, //!< Invalid operation exception.
+ kEM_Denormal = 0x0002u, //!< Denormalized operand exception.
+ kEM_DivByZero = 0x0004u, //!< Division by zero exception.
+ kEM_Overflow = 0x0008u, //!< Overflow exception.
+ kEM_Underflow = 0x0010u, //!< Underflow exception.
+ kEM_Inexact = 0x0020u, //!< Inexact operation exception.
+
+ // Bits 8-9
+ // --------
+
+ kPC_Mask = 0x0300u, //!< Precision control mask.
+ kPC_Float = 0x0000u, //!< Single precision (24 bits).
+ kPC_Reserved = 0x0100u, //!< Reserved.
+ kPC_Double = 0x0200u, //!< Double precision (53 bits).
+ kPC_Extended = 0x0300u, //!< Extended precision (64 bits).
+
+ // Bits 10-11
+ // ----------
+
+ kRC_Mask = 0x0C00u, //!< Rounding control mask.
+ kRC_Nearest = 0x0000u, //!< Round to nearest even.
+ kRC_Down = 0x0400u, //!< Round down (floor).
+ kRC_Up = 0x0800u, //!< Round up (ceil).
+ kRC_Truncate = 0x0C00u, //!< Round towards zero (truncate).
+
+ // Bit 12
+ // ------
+
+ kIC_Mask = 0x1000u, //!< Infinity control.
+ kIC_Projective = 0x0000u, //!< Projective (not supported on X64).
+ kIC_Affine = 0x1000u //!< Affine (default).
+};
+ASMJIT_DEFINE_ENUM_FLAGS(FpuControlWord)
+
+//! An immediate value that can be used with CMP[PD|PS|SD|SS] instructions.
+enum class CmpImm : uint8_t {
+ kEQ = 0x00u, //!< Equal (Quiet), same as \ref VCmpImm::kEQ_OQ.
+ kLT = 0x01u, //!< Less (Signaling), same as \ref VCmpImm::kLT_OS.
+ kLE = 0x02u, //!< Less/Equal (Signaling), same as \ref VCmpImm::kLE_OS.
+ kUNORD = 0x03u, //!< Unordered (Quiet), same as \ref VCmpImm::kUNORD_Q.
+ kNEQ = 0x04u, //!< Not Equal (Quiet), same as \ref VCmpImm::kNEQ_UQ.
+ kNLT = 0x05u, //!< Not Less (Signaling), same as \ref VCmpImm::kNLT_US.
+ kNLE = 0x06u, //!< Not Less/Equal (Signaling), same as \ref VCmpImm::kNLE_US.
+ kORD = 0x07u //!< Ordered (Quiet), same as \ref VCmpImm::kORD_Q.
+};
- //! Reverse a condition code (reverses the corresponding operands of a comparison).
- static constexpr uint32_t reverse(uint32_t cond) noexcept { return reverseTable[cond]; }
- //! Negate a condition code.
- static constexpr uint32_t negate(uint32_t cond) noexcept { return cond ^ 1u; }
-
- //! Translate a condition code `cond` to a `jcc` instruction id.
- static constexpr uint32_t toJcc(uint32_t cond) noexcept { return jccTable[cond]; }
- //! Translate a condition code `cond` to a `setcc` instruction id.
- static constexpr uint32_t toSetcc(uint32_t cond) noexcept { return setccTable[cond]; }
- //! Translate a condition code `cond` to a `cmovcc` instruction id.
- static constexpr uint32_t toCmovcc(uint32_t cond) noexcept { return cmovccTable[cond]; }
-}
+//! An immediate value that can be used with [V]PCMP[I|E]STR[I|M] instructions.
+enum class PCmpStrImm : uint8_t {
+ // Source Data Format
+ // ------------------
-// ============================================================================
-// [asmjit::x86::FpuWord]
-// ============================================================================
-
-//! FPU control and status words.
-namespace FpuWord {
- //! FPU status word.
- enum Status : uint32_t {
- //! Invalid operation.
- kStatusInvalid = 0x0001u,
- //! Denormalized operand.
- kStatusDenormalized = 0x0002u,
- //! Division by zero.
- kStatusDivByZero = 0x0004u,
- //! Overflown.
- kStatusOverflow = 0x0008u,
- //! Underflown.
- kStatusUnderflow = 0x0010u,
- //! Precision lost.
- kStatusPrecision = 0x0020u,
- //! Stack fault.
- kStatusStackFault = 0x0040u,
- //! Interrupt.
- kStatusInterrupt = 0x0080u,
- //! C0 flag.
- kStatusC0 = 0x0100u,
- //! C1 flag.
- kStatusC1 = 0x0200u,
- //! C2 flag.
- kStatusC2 = 0x0400u,
- //! Top of the stack.
- kStatusTop = 0x3800u,
- //! C3 flag.
- kStatusC3 = 0x4000u,
- //! FPU is busy.
- kStatusBusy = 0x8000u
- };
+ kUB = 0x00u << 0, //!< The source data format is unsigned bytes.
+ kUW = 0x01u << 0, //!< The source data format is unsigned words.
+ kSB = 0x02u << 0, //!< The source data format is signed bytes.
+ kSW = 0x03u << 0, //!< The source data format is signed words.
- //! FPU control word.
- enum Control : uint32_t {
- // [Bits 0-5]
-
- //! Exception mask (0x3F).
- kControlEM_Mask = 0x003Fu,
- //! Invalid operation exception.
- kControlEM_Invalid = 0x0001u,
- //! Denormalized operand exception.
- kControlEM_Denormal = 0x0002u,
- //! Division by zero exception.
- kControlEM_DivByZero = 0x0004u,
- //! Overflow exception.
- kControlEM_Overflow = 0x0008u,
- //! Underflow exception.
- kControlEM_Underflow = 0x0010u,
- //! Inexact operation exception.
- kControlEM_Inexact = 0x0020u,
-
- // [Bits 8-9]
-
- //! Precision control mask.
- kControlPC_Mask = 0x0300u,
- //! Single precision (24 bits).
- kControlPC_Float = 0x0000u,
- //! Reserved.
- kControlPC_Reserved = 0x0100u,
- //! Double precision (53 bits).
- kControlPC_Double = 0x0200u,
- //! Extended precision (64 bits).
- kControlPC_Extended = 0x0300u,
-
- // [Bits 10-11]
-
- //! Rounding control mask.
- kControlRC_Mask = 0x0C00u,
- //! Round to nearest even.
- kControlRC_Nearest = 0x0000u,
- //! Round down (floor).
- kControlRC_Down = 0x0400u,
- //! Round up (ceil).
- kControlRC_Up = 0x0800u,
- //! Round towards zero (truncate).
- kControlRC_Truncate = 0x0C00u,
-
- // [Bit 12]
-
- //! Infinity control.
- kControlIC_Mask = 0x1000u,
- //! Projective (not supported on X64).
- kControlIC_Projective = 0x0000u,
- //! Affine (default).
- kControlIC_Affine = 0x1000u
- };
-}
+ // Aggregation Operation
+ // ---------------------
-// ============================================================================
-// [asmjit::x86::Status]
-// ============================================================================
-
-//! CPU and FPU status flags.
-namespace Status {
- //! CPU and FPU status flags used by `InstRWInfo`
- enum Flags : uint32_t {
- // ------------------------------------------------------------------------
- // [Architecture Neutral Flags - 0x000000FF]
- // ------------------------------------------------------------------------
-
- //! Carry flag.
- kCF = 0x00000001u,
- //! Signed overflow flag.
- kOF = 0x00000002u,
- //! Sign flag (negative/sign, if set).
- kSF = 0x00000004u,
- //! Zero and/or equality flag (1 if zero/equal).
- kZF = 0x00000008u,
-
- // ------------------------------------------------------------------------
- // [Architecture Specific Flags - 0xFFFFFF00]
- // ------------------------------------------------------------------------
-
- //! Adjust flag.
- kAF = 0x00000100u,
- //! Parity flag.
- kPF = 0x00000200u,
- //! Direction flag.
- kDF = 0x00000400u,
- //! Interrupt enable flag.
- kIF = 0x00000800u,
-
- //! Alignment check.
- kAC = 0x00001000u,
-
- //! FPU C0 status flag.
- kC0 = 0x00010000u,
- //! FPU C1 status flag.
- kC1 = 0x00020000u,
- //! FPU C2 status flag.
- kC2 = 0x00040000u,
- //! FPU C3 status flag.
- kC3 = 0x00080000u
- };
-}
+ kEqualAny = 0x00u << 2, //!< The arithmetic comparison is "equal".
+ kRanges = 0x01u << 2, //!< The arithmetic comparison is "greater than or equal" between even indexed
+ //!< elements and "less than or equal" between odd indexed elements.
+ kEqualEach = 0x02u << 2, //!< The arithmetic comparison is "equal".
+ kEqualOrdered = 0x03u << 2, //!< The arithmetic comparison is "equal".
-// ============================================================================
-// [asmjit::x86::Predicate]
-// ============================================================================
-
-//! Contains predicates used by SIMD instructions.
-namespace Predicate {
- //! A predicate used by CMP[PD|PS|SD|SS] instructions.
- enum Cmp : uint32_t {
- kCmpEQ = 0x00u, //!< Equal (Quiet).
- kCmpLT = 0x01u, //!< Less (Signaling).
- kCmpLE = 0x02u, //!< Less/Equal (Signaling).
- kCmpUNORD = 0x03u, //!< Unordered (Quiet).
- kCmpNEQ = 0x04u, //!< Not Equal (Quiet).
- kCmpNLT = 0x05u, //!< Not Less (Signaling).
- kCmpNLE = 0x06u, //!< Not Less/Equal (Signaling).
- kCmpORD = 0x07u //!< Ordered (Quiet).
- };
+ // Polarity
+ // --------
- //! A predicate used by [V]PCMP[I|E]STR[I|M] instructions.
- enum PCmpStr : uint32_t {
- // Source data format:
- kPCmpStrUB = 0x00u << 0, //!< The source data format is unsigned bytes.
- kPCmpStrUW = 0x01u << 0, //!< The source data format is unsigned words.
- kPCmpStrSB = 0x02u << 0, //!< The source data format is signed bytes.
- kPCmpStrSW = 0x03u << 0, //!< The source data format is signed words.
-
- // Aggregation operation:
- kPCmpStrEqualAny = 0x00u << 2, //!< The arithmetic comparison is "equal".
- kPCmpStrRanges = 0x01u << 2, //!< The arithmetic comparison is "greater than or equal"
- //!< between even indexed elements and "less than or equal"
- //!< between odd indexed elements.
- kPCmpStrEqualEach = 0x02u << 2, //!< The arithmetic comparison is "equal".
- kPCmpStrEqualOrdered = 0x03u << 2, //!< The arithmetic comparison is "equal".
-
- // Polarity:
- kPCmpStrPosPolarity = 0x00u << 4, //!< IntRes2 = IntRes1.
- kPCmpStrNegPolarity = 0x01u << 4, //!< IntRes2 = -1 XOR IntRes1.
- kPCmpStrPosMasked = 0x02u << 4, //!< IntRes2 = IntRes1.
- kPCmpStrNegMasked = 0x03u << 4, //!< IntRes2[i] = second[i] == invalid ? IntRes1[i] : ~IntRes1[i].
-
- // Output selection (pcmpstri):
- kPCmpStrOutputLSI = 0x00u << 6, //!< The index returned to ECX is of the least significant set bit in IntRes2.
- kPCmpStrOutputMSI = 0x01u << 6, //!< The index returned to ECX is of the most significant set bit in IntRes2.
-
- // Output selection (pcmpstrm):
- kPCmpStrBitMask = 0x00u << 6, //!< IntRes2 is returned as the mask to the least significant bits of XMM0.
- kPCmpStrIndexMask = 0x01u << 6 //!< IntRes2 is expanded into a byte/word mask and placed in XMM0.
- };
+ kPosPolarity = 0x00u << 4, //!< IntRes2 = IntRes1.
+ kNegPolarity = 0x01u << 4, //!< IntRes2 = -1 XOR IntRes1.
+ kPosMasked = 0x02u << 4, //!< IntRes2 = IntRes1.
+ kNegMasked = 0x03u << 4, //!< IntRes2[i] = second[i] == invalid ? IntRes1[i] : ~IntRes1[i].
- //! A predicate used by ROUND[PD|PS|SD|SS] instructions.
- enum Round : uint32_t {
- //! Round to nearest (even).
- kRoundNearest = 0x00u,
- //! Round to down toward -INF (floor),
- kRoundDown = 0x01u,
- //! Round to up toward +INF (ceil).
- kRoundUp = 0x02u,
- //! Round toward zero (truncate).
- kRoundTrunc = 0x03u,
- //! Round to the current rounding mode set (ignores other RC bits).
- kRoundCurrent = 0x04u,
- //! Avoids inexact exception, if set.
- kRoundInexact = 0x08u
- };
+ // Output Selection (pcmpstri)
+ // ---------------------------
- //! A predicate used by VCMP[PD|PS|SD|SS] instructions.
- //!
- //! The first 8 values are compatible with `Cmp`.
- enum VCmp : uint32_t {
- kVCmpEQ_OQ = kCmpEQ, //!< Equal (Quiet , Ordered).
- kVCmpLT_OS = kCmpLT, //!< Less (Signaling, Ordered).
- kVCmpLE_OS = kCmpLE, //!< Less/Equal (Signaling, Ordered).
- kVCmpUNORD_Q = kCmpUNORD, //!< Unordered (Quiet).
- kVCmpNEQ_UQ = kCmpNEQ, //!< Not Equal (Quiet , Unordered).
- kVCmpNLT_US = kCmpNLT, //!< Not Less (Signaling, Unordered).
- kVCmpNLE_US = kCmpNLE, //!< Not Less/Equal (Signaling, Unordered).
- kVCmpORD_Q = kCmpORD, //!< Ordered (Quiet).
- kVCmpEQ_UQ = 0x08u, //!< Equal (Quiet , Unordered).
- kVCmpNGE_US = 0x09u, //!< Not Greater/Equal (Signaling, Unordered).
- kVCmpNGT_US = 0x0Au, //!< Not Greater (Signaling, Unordered).
- kVCmpFALSE_OQ = 0x0Bu, //!< False (Quiet , Ordered).
- kVCmpNEQ_OQ = 0x0Cu, //!< Not Equal (Quiet , Ordered).
- kVCmpGE_OS = 0x0Du, //!< Greater/Equal (Signaling, Ordered).
- kVCmpGT_OS = 0x0Eu, //!< Greater (Signaling, Ordered).
- kVCmpTRUE_UQ = 0x0Fu, //!< True (Quiet , Unordered).
- kVCmpEQ_OS = 0x10u, //!< Equal (Signaling, Ordered).
- kVCmpLT_OQ = 0x11u, //!< Less (Quiet , Ordered).
- kVCmpLE_OQ = 0x12u, //!< Less/Equal (Quiet , Ordered).
- kVCmpUNORD_S = 0x13u, //!< Unordered (Signaling).
- kVCmpNEQ_US = 0x14u, //!< Not Equal (Signaling, Unordered).
- kVCmpNLT_UQ = 0x15u, //!< Not Less (Quiet , Unordered).
- kVCmpNLE_UQ = 0x16u, //!< Not Less/Equal (Quiet , Unordered).
- kVCmpORD_S = 0x17u, //!< Ordered (Signaling).
- kVCmpEQ_US = 0x18u, //!< Equal (Signaling, Unordered).
- kVCmpNGE_UQ = 0x19u, //!< Not Greater/Equal (Quiet , Unordered).
- kVCmpNGT_UQ = 0x1Au, //!< Not Greater (Quiet , Unordered).
- kVCmpFALSE_OS = 0x1Bu, //!< False (Signaling, Ordered).
- kVCmpNEQ_OS = 0x1Cu, //!< Not Equal (Signaling, Ordered).
- kVCmpGE_OQ = 0x1Du, //!< Greater/Equal (Quiet , Ordered).
- kVCmpGT_OQ = 0x1Eu, //!< Greater (Quiet , Ordered).
- kVCmpTRUE_US = 0x1Fu //!< True (Signaling, Unordered).
- };
+ kOutputLSI = 0x00u << 6, //!< The index returned to ECX is of the least significant set bit in IntRes2.
+ kOutputMSI = 0x01u << 6, //!< The index returned to ECX is of the most significant set bit in IntRes2.
- //! A predicate used by VFIXUPIMM[PD|PS|SD|SS] instructions (AVX-512).
- enum VFixupImm : uint32_t {
- kVFixupImmZEOnZero = 0x01u,
- kVFixupImmIEOnZero = 0x02u,
- kVFixupImmZEOnOne = 0x04u,
- kVFixupImmIEOnOne = 0x08u,
- kVFixupImmIEOnSNaN = 0x10u,
- kVFixupImmIEOnNInf = 0x20u,
- kVFixupImmIEOnNegative= 0x40u,
- kVFixupImmIEOnPInf = 0x80u
- };
+ // Output Selection (pcmpstrm)
+ // ---------------------------
- //! A predicate used by VFPCLASS[PD|PS|SD|SS] instructions (AVX-512).
- //!
- //! \note Values can be combined together to form the final 8-bit mask.
- enum VFPClass : uint32_t {
- kVFPClassQNaN = 0x01u, //!< Checks for QNaN.
- kVFPClassPZero = 0x02u, //!< Checks for +0.
- kVFPClassNZero = 0x04u, //!< Checks for -0.
- kVFPClassPInf = 0x08u, //!< Checks for +Inf.
- kVFPClassNInf = 0x10u, //!< Checks for -Inf.
- kVFPClassDenormal = 0x20u, //!< Checks for denormal.
- kVFPClassNegative = 0x40u, //!< Checks for negative finite value.
- kVFPClassSNaN = 0x80u //!< Checks for SNaN.
- };
+ kBitMask = 0x00u << 6, //!< IntRes2 is returned as the mask to the least significant bits of XMM0.
+ kIndexMask = 0x01u << 6 //!< IntRes2 is expanded into a byte/word mask and placed in XMM0.
+};
+ASMJIT_DEFINE_ENUM_FLAGS(PCmpStrImm)
- //! A predicate used by VGETMANT[PD|PS|SD|SS] instructions (AVX-512).
- enum VGetMant : uint32_t {
- kVGetMant1To2 = 0x00u,
- kVGetMant1Div2To2 = 0x01u,
- kVGetMant1Div2To1 = 0x02u,
- kVGetMant3Div4To3Div2 = 0x03u,
- kVGetMantNoSign = 0x04u,
- kVGetMantQNaNIfSign = 0x08u
- };
+//! An immediate value that can be used with ROUND[PD|PS|SD|SS] instructions.
+//!
+//! \note `kSuppress` is a mask that can be used with any other value.
+enum class RoundImm : uint8_t {
+ kNearest = 0x00u, //!< Round to nearest (even).
+ kDown = 0x01u, //!< Round to down toward -INF (floor),
+ kUp = 0x02u, //!< Round to up toward +INF (ceil).
+ kTrunc = 0x03u, //!< Round toward zero (truncate).
+ kCurrent = 0x04u, //!< Round to the current rounding mode set (ignores other RC bits).
+ kSuppress = 0x08u //!< Supress exceptions (avoids inexact exception, if set).
+};
+ASMJIT_DEFINE_ENUM_FLAGS(RoundImm)
- //! A predicate used by VPCMP[U][B|W|D|Q] instructions (AVX-512).
- enum VPCmp : uint32_t {
- kVPCmpEQ = 0x00u, //!< Equal.
- kVPCmpLT = 0x01u, //!< Less.
- kVPCmpLE = 0x02u, //!< Less/Equal.
- kVPCmpFALSE = 0x03u, //!< False.
- kVPCmpNE = 0x04u, //!< Not Equal.
- kVPCmpGE = 0x05u, //!< Greater/Equal.
- kVPCmpGT = 0x06u, //!< Greater.
- kVPCmpTRUE = 0x07u //!< True.
- };
+//! An immediate value that can be used with VCMP[PD|PS|SD|SS] instructions (AVX).
+//!
+//! The first 8 values are compatible with \ref CmpImm.
+enum class VCmpImm : uint8_t {
+ kEQ_OQ = 0x00u, //!< Equal (Quiet , Ordered) , same as \ref CmpImm::kEQ.
+ kLT_OS = 0x01u, //!< Less (Signaling, Ordered) , same as \ref CmpImm::kLT.
+ kLE_OS = 0x02u, //!< Less/Equal (Signaling, Ordered) , same as \ref CmpImm::kLE.
+ kUNORD_Q = 0x03u, //!< Unordered (Quiet) , same as \ref CmpImm::kUNORD.
+ kNEQ_UQ = 0x04u, //!< Not Equal (Quiet , Unordered), same as \ref CmpImm::kNEQ.
+ kNLT_US = 0x05u, //!< Not Less (Signaling, Unordered), same as \ref CmpImm::kNLT.
+ kNLE_US = 0x06u, //!< Not Less/Equal (Signaling, Unordered), same as \ref CmpImm::kNLE.
+ kORD_Q = 0x07u, //!< Ordered (Quiet) , same as \ref CmpImm::kORD.
+ kEQ_UQ = 0x08u, //!< Equal (Quiet , Unordered).
+ kNGE_US = 0x09u, //!< Not Greater/Equal (Signaling, Unordered).
+ kNGT_US = 0x0Au, //!< Not Greater (Signaling, Unordered).
+ kFALSE_OQ = 0x0Bu, //!< False (Quiet , Ordered).
+ kNEQ_OQ = 0x0Cu, //!< Not Equal (Quiet , Ordered).
+ kGE_OS = 0x0Du, //!< Greater/Equal (Signaling, Ordered).
+ kGT_OS = 0x0Eu, //!< Greater (Signaling, Ordered).
+ kTRUE_UQ = 0x0Fu, //!< True (Quiet , Unordered).
+ kEQ_OS = 0x10u, //!< Equal (Signaling, Ordered).
+ kLT_OQ = 0x11u, //!< Less (Quiet , Ordered).
+ kLE_OQ = 0x12u, //!< Less/Equal (Quiet , Ordered).
+ kUNORD_S = 0x13u, //!< Unordered (Signaling).
+ kNEQ_US = 0x14u, //!< Not Equal (Signaling, Unordered).
+ kNLT_UQ = 0x15u, //!< Not Less (Quiet , Unordered).
+ kNLE_UQ = 0x16u, //!< Not Less/Equal (Quiet , Unordered).
+ kORD_S = 0x17u, //!< Ordered (Signaling).
+ kEQ_US = 0x18u, //!< Equal (Signaling, Unordered).
+ kNGE_UQ = 0x19u, //!< Not Greater/Equal (Quiet , Unordered).
+ kNGT_UQ = 0x1Au, //!< Not Greater (Quiet , Unordered).
+ kFALSE_OS = 0x1Bu, //!< False (Signaling, Ordered).
+ kNEQ_OS = 0x1Cu, //!< Not Equal (Signaling, Ordered).
+ kGE_OQ = 0x1Du, //!< Greater/Equal (Quiet , Ordered).
+ kGT_OQ = 0x1Eu, //!< Greater (Quiet , Ordered).
+ kTRUE_US = 0x1Fu //!< True (Signaling, Unordered).
+};
- //! A predicate used by VPCOM[U][B|W|D|Q] instructions (XOP).
- enum VPCom : uint32_t {
- kVPComLT = 0x00u, //!< Less.
- kVPComLE = 0x01u, //!< Less/Equal
- kVPComGT = 0x02u, //!< Greater.
- kVPComGE = 0x03u, //!< Greater/Equal.
- kVPComEQ = 0x04u, //!< Equal.
- kVPComNE = 0x05u, //!< Not Equal.
- kVPComFALSE = 0x06u, //!< False.
- kVPComTRUE = 0x07u //!< True.
- };
+//! An immediate value that can be used with VFIXUPIMM[PD|PS|SD|SS] instructions (AVX-512).
+//!
+//! The final immediate is a combination of all possible control bits.
+enum class VFixupImm : uint8_t {
+ kNone = 0x00u,
+ kZEOnZero = 0x01u,
+ kIEOnZero = 0x02u,
+ kZEOnOne = 0x04u,
+ kIEOnOne = 0x08u,
+ kIEOnSNaN = 0x10u,
+ kIEOnNInf = 0x20u,
+ kIEOnNegative = 0x40u,
+ kIEOnPInf = 0x80u
+};
+ASMJIT_DEFINE_ENUM_FLAGS(VFixupImm)
- //! A predicate used by VRANGE[PD|PS|SD|SS] instructions (AVX-512).
- enum VRange : uint32_t {
- kVRangeSelectMin = 0x00u, //!< Select minimum value.
- kVRangeSelectMax = 0x01u, //!< Select maximum value.
- kVRangeSelectAbsMin = 0x02u, //!< Select minimum absolute value.
- kVRangeSelectAbsMax = 0x03u, //!< Select maximum absolute value.
- kVRangeSignSrc1 = 0x00u, //!< Select sign of SRC1.
- kVRangeSignSrc2 = 0x04u, //!< Select sign of SRC2.
- kVRangeSign0 = 0x08u, //!< Set sign to 0.
- kVRangeSign1 = 0x0Cu //!< Set sign to 1.
- };
+//! An immediate value that can be used with VFPCLASS[PD|PS|SD|SS] instructions (AVX-512).
+//!
+//! The values can be combined together to form the final 8-bit mask.
+enum class VFPClassImm : uint8_t {
+ kNone = 0x00u,
+ kQNaN = 0x01u, //!< Checks for QNaN.
+ kPZero = 0x02u, //!< Checks for +0.
+ kNZero = 0x04u, //!< Checks for -0.
+ kPInf = 0x08u, //!< Checks for +Inf.
+ kNInf = 0x10u, //!< Checks for -Inf.
+ kDenormal = 0x20u, //!< Checks for denormal.
+ kNegative = 0x40u, //!< Checks for negative finite value.
+ kSNaN = 0x80u //!< Checks for SNaN.
+};
+ASMJIT_DEFINE_ENUM_FLAGS(VFPClassImm)
- //! A predicate used by VREDUCE[PD|PS|SD|SS] instructions (AVX-512).
- enum VReduce : uint32_t {
- kVReduceRoundCurrent = 0x00u, //!< Round to the current mode set.
- kVReduceRoundEven = 0x04u, //!< Round to nearest even.
- kVReduceRoundDown = 0x05u, //!< Round down.
- kVReduceRoundUp = 0x06u, //!< Round up.
- kVReduceRoundTrunc = 0x07u, //!< Truncate.
- kVReduceSuppress = 0x08u //!< Suppress exceptions.
- };
+//! An immediate value that can be used with VGETMANT[PD|PS|SD|SS] instructions (AVX-512).
+//!
+//! The value is a combination of a normalization interval and a sign control.
+enum class VGetMantImm : uint8_t {
+ // Normalization Interval
+ // ----------------------
+
+ k1To2 = 0x00u, //!< Normalization interval is [1, 2)
+ k1Div2To2 = 0x01u, //!< Normalization interval is [0.5, 2)
+ k1Div2To1 = 0x02u, //!< Normalization interval is [0.5, 1)
+ k3Div4To3Div2 = 0x03u, //!< Normalization interval is [3/4, 3/2)
+
+ // Sign Control
+ // ------------
+
+ kSrcSign = 0x00u, //!< Source sign.
+ kNoSign = 0x04u, //!< Zero sign
+ kQNaNIfSign = 0x08u //!< QNAN_Indefinite if sign(src) != 0, regardless of `kSignSrc` or `kNoSign`.
+};
+ASMJIT_DEFINE_ENUM_FLAGS(VGetMantImm)
+
+//! A predicate used by VPCMP[U][B|W|D|Q] instructions (AVX-512).
+enum class VPCmpImm : uint8_t {
+ kEQ = 0x00u, //!< Equal.
+ kLT = 0x01u, //!< Less.
+ kLE = 0x02u, //!< Less/Equal.
+ kFALSE = 0x03u, //!< False.
+ kNE = 0x04u, //!< Not Equal.
+ kGE = 0x05u, //!< Greater/Equal.
+ kGT = 0x06u, //!< Greater.
+ kTRUE = 0x07u //!< True.
+};
+
+//! A predicate used by VPCOM[U][B|W|D|Q] instructions (XOP).
+enum class VPComImm : uint8_t {
+ kLT = 0x00u, //!< Less.
+ kLE = 0x01u, //!< Less/Equal
+ kGT = 0x02u, //!< Greater.
+ kGE = 0x03u, //!< Greater/Equal.
+ kEQ = 0x04u, //!< Equal.
+ kNE = 0x05u, //!< Not Equal.
+ kFALSE = 0x06u, //!< False.
+ kTRUE = 0x07u //!< True.
+};
- //! Pack a shuffle constant to be used by SSE/AVX/AVX-512 instructions (2 values).
- //!
- //! \param a Position of the first component [0, 1].
- //! \param b Position of the second component [0, 1].
- //!
- //! Shuffle constants can be used to encode an immediate for these instructions:
- //! - `shufpd|vshufpd`
- static constexpr uint32_t shuf(uint32_t a, uint32_t b) noexcept {
- return (a << 1) | b;
- }
-
- //! Pack a shuffle constant to be used by SSE/AVX/AVX-512 instructions (4 values).
- //!
- //! \param a Position of the first component [0, 3].
- //! \param b Position of the second component [0, 3].
- //! \param c Position of the third component [0, 3].
- //! \param d Position of the fourth component [0, 3].
- //!
- //! Shuffle constants can be used to encode an immediate for these instructions:
- //! - `pshufw`
- //! - `pshuflw|vpshuflw`
- //! - `pshufhw|vpshufhw`
- //! - `pshufd|vpshufd`
- //! - `shufps|vshufps`
- static constexpr uint32_t shuf(uint32_t a, uint32_t b, uint32_t c, uint32_t d) noexcept {
- return (a << 6) | (b << 4) | (c << 2) | d;
- }
+//! A predicate used by VRANGE[PD|PS|SD|SS] instructions (AVX-512).
+enum class VRangeImm : uint8_t {
+ // Selector
+ // --------
+
+ kSelectMin = 0x00u, //!< Select minimum value.
+ kSelectMax = 0x01u, //!< Select maximum value.
+ kSelectAbsMin = 0x02u, //!< Select minimum absolute value.
+ kSelectAbsMax = 0x03u, //!< Select maximum absolute value.
+
+ // Sign
+ // ----
+
+ kSignSrc1 = 0x00u, //!< Select sign of SRC1.
+ kSignSrc2 = 0x04u, //!< Select sign of SRC2.
+ kSign0 = 0x08u, //!< Set sign to 0.
+ kSign1 = 0x0Cu //!< Set sign to 1.
+};
+ASMJIT_DEFINE_ENUM_FLAGS(VRangeImm)
+
+//! A predicate used by VREDUCE[PD|PS|SD|SS] instructions (AVX-512).
+enum class VReduceImm : uint8_t {
+ kRoundEven = 0x00u, //!< Round to nearest even.
+ kRoundDown = 0x01u, //!< Round down.
+ kRoundUp = 0x02u, //!< Round up.
+ kRoundTrunc = 0x03u, //!< Truncate.
+ kRoundCurrent = 0x04u, //!< Round to the current mode set.
+ kSuppress = 0x08u, //!< Suppress exceptions.
+ kFixedImmMask = 0xF0u //!< Fixed length value mask.
+};
+ASMJIT_DEFINE_ENUM_FLAGS(VReduceImm)
+
+//! Creates a \ref VReduceImm from a combination of `flags` and `fixedPointLength`.
+static inline constexpr VReduceImm vReduceImm(VReduceImm flags, uint32_t fixedPointLength) noexcept {
+ return flags | VReduceImm(fixedPointLength << 4);
}
-// ============================================================================
-// [asmjit::x86::TLog]
-// ============================================================================
-
-//! Bitwise ternary logic between 3 operands introduced by AVX-512.
-namespace TLog {
- //! A predicate that can be used to create a common predicate for VPTERNLOG[D|Q].
- //!
- //! There are 3 inputs to the instruction (\ref kA, \ref kB, \ref kC), and
- //! ternary logic can define any combination that would be performed on these
- //! 3 inputs to get the desired output - any combination of AND, OR, XOR, NOT.
- enum Operator : uint32_t {
- //! 0 value.
- k0 = 0x00u,
- //! 1 value.
- k1 = 0xFFu,
- //! A value.
- kA = 0xF0u,
- //! B value.
- kB = 0xCCu,
- //! C value.
- kC = 0xAAu,
-
- //! `!A` expression.
- kNotA = kA ^ k1,
- //! `!B` expression.
- kNotB = kB ^ k1,
- //! `!C` expression.
- kNotC = kC ^ k1,
-
- //! `A & B` expression.
- kAB = kA & kB,
- //! `A & C` expression.
- kAC = kA & kC,
- //! `B & C` expression.
- kBC = kB & kC,
- //! `!(A & B)` expression.
- kNotAB = kAB ^ k1,
- //! `!(A & C)` expression.
- kNotAC = kAC ^ k1,
- //! `!(B & C)` expression.
- kNotBC = kBC ^ k1,
-
- //! `A & B & C` expression.
- kABC = kAB & kC,
- //! `!(A & B & C)` expression.
- kNotABC = kABC ^ k1
- };
+//! A predicate that can be used as an immediate value with VPTERNLOG[D|Q] instruction.
+//!
+//! There are 3 inputs to the instruction (\ref kA, \ref kB, \ref kC). Ternary logic can define any combination
+//! that would be performed on these 3 inputs to get the desired output - any combination of AND, OR, XOR, NOT
+//! is possible.
+//!
+//! \sa \ref tLogFromBits and \ref fLogIfElse
+enum class TLogImm : uint8_t {
+ k0 = 0x00u, //!< 0 value.
+ k1 = 0xFFu, //!< 1 value.
+ kA = 0xF0u, //!< A value.
+ kB = 0xCCu, //!< B value.
+ kC = 0xAAu, //!< C value.
+
+ kNotA = kA ^ k1, //!< `!A` expression.
+ kNotB = kB ^ k1, //!< `!B` expression.
+ kNotC = kC ^ k1, //!< `!C` expression.
+
+ kAB = kA & kB, //!< `A & B` expression.
+ kAC = kA & kC, //!< `A & C` expression.
+ kBC = kB & kC, //!< `B & C` expression.
+ kNotAB = kAB ^ k1, //!< `!(A & B)` expression.
+ kNotAC = kAC ^ k1, //!< `!(A & C)` expression.
+ kNotBC = kBC ^ k1, //!< `!(B & C)` expression.
+
+ kABC = kAB & kC, //!< `A & B & C` expression.
+ kNotABC = kABC ^ k1 //!< `!(A & B & C)` expression.
+};
+ASMJIT_DEFINE_ENUM_FLAGS(TLogImm)
+
+//! Creates an immediate that can be used by VPTERNLOG[D|Q] instructions.
+static inline constexpr TLogImm tLogFromBits(uint8_t b000, uint8_t b001, uint8_t b010, uint8_t b011, uint8_t b100, uint8_t b101, uint8_t b110, uint8_t b111) noexcept {
+ return TLogImm(uint8_t(b000 << 0) |
+ uint8_t(b001 << 1) |
+ uint8_t(b010 << 2) |
+ uint8_t(b011 << 3) |
+ uint8_t(b100 << 4) |
+ uint8_t(b101 << 5) |
+ uint8_t(b110 << 6) |
+ uint8_t(b111 << 7));
+}
+
+//! Creates an if/else logic that can be used by VPTERNLOG[D|Q] instructions.
+static inline constexpr TLogImm fLogIfElse(TLogImm condition, TLogImm a, TLogImm b) noexcept { return (condition & a) | (~condition & b); }
- //! Creates an immediate that can be used by VPTERNLOG[D|Q] instructions.
- static constexpr uint32_t make(uint32_t b000, uint32_t b001, uint32_t b010, uint32_t b011, uint32_t b100, uint32_t b101, uint32_t b110, uint32_t b111) noexcept {
- return (b000 << 0) | (b001 << 1) | (b010 << 2) | (b011 << 3) | (b100 << 4) | (b101 << 5) | (b110 << 6) | (b111 << 7);
- }
-
- //! Creates an immediate that can be used by VPTERNLOG[D|Q] instructions.
- static constexpr uint32_t value(uint32_t x) noexcept { return x & 0xFF; }
- //! Negate an immediate that can be used by VPTERNLOG[D|Q] instructions.
- static constexpr uint32_t negate(uint32_t x) noexcept { return x ^ 0xFF; }
- //! Creates an if/else logic that can be used by VPTERNLOG[D|Q] instructions.
- static constexpr uint32_t ifElse(uint32_t condition, uint32_t a, uint32_t b) noexcept { return (condition & a) | (negate(condition) & b); }
+//! Creates a shuffle immediate value that be used with SSE/AVX/AVX-512 instructions to shuffle 2 elements in a vector.
+//!
+//! \param a Position of the first component [0, 1].
+//! \param b Position of the second component [0, 1].
+//!
+//! Shuffle constants can be used to encode an immediate for these instructions:
+//! - `shufpd|vshufpd`
+static inline constexpr uint32_t shuffleImm(uint32_t a, uint32_t b) noexcept {
+ return (a << 1) | b;
+}
+
+//! Creates a shuffle immediate value that be used with SSE/AVX/AVX-512 instructions to shuffle 4 elements in a vector.
+//!
+//! \param a Position of the first component [0, 3].
+//! \param b Position of the second component [0, 3].
+//! \param c Position of the third component [0, 3].
+//! \param d Position of the fourth component [0, 3].
+//!
+//! Shuffle constants can be used to encode an immediate for these instructions:
+//! - `pshufw`
+//! - `pshuflw|vpshuflw`
+//! - `pshufhw|vpshufhw`
+//! - `pshufd|vpshufd`
+//! - `shufps|vshufps`
+static inline constexpr uint32_t shuffleImm(uint32_t a, uint32_t b, uint32_t c, uint32_t d) noexcept {
+ return (a << 6) | (b << 4) | (c << 2) | d;
}
//! \}
diff --git a/3rdparty/asmjit/src/asmjit/x86/x86instapi.cpp b/3rdparty/asmjit/src/asmjit/x86/x86instapi.cpp
index 2dfd25fc4a6..3580fe6f771 100644
--- a/3rdparty/asmjit/src/asmjit/x86/x86instapi.cpp
+++ b/3rdparty/asmjit/src/asmjit/x86/x86instapi.cpp
@@ -1,25 +1,7 @@
-// AsmJit - Machine code generation for C++
+// This file is part of AsmJit project <https://asmjit.com>
//
-// * Official AsmJit Home Page: https://asmjit.com
-// * Official Github Repository: https://github.com/asmjit/asmjit
-//
-// Copyright (c) 2008-2020 The AsmJit Authors
-//
-// This software is provided 'as-is', without any express or implied
-// warranty. In no event will the authors be held liable for any damages
-// arising from the use of this software.
-//
-// Permission is granted to anyone to use this software for any purpose,
-// including commercial applications, and to alter it and redistribute it
-// freely, subject to the following restrictions:
-//
-// 1. The origin of this software must not be misrepresented; you must not
-// claim that you wrote the original software. If you use this software
-// in a product, an acknowledgment in the product documentation would be
-// appreciated but is not required.
-// 2. Altered source versions must be plainly marked as such, and must not be
-// misrepresented as being the original software.
-// 3. This notice may not be removed or altered from any source distribution.
+// See asmjit.h or LICENSE.md for license and copyright information
+// SPDX-License-Identifier: Zlib
// ----------------------------------------------------------------------------
// IMPORTANT: AsmJit now uses an external instruction database to populate
@@ -40,12 +22,11 @@
// ----------------------------------------------------------------------------
#include "../core/api-build_p.h"
-#ifdef ASMJIT_BUILD_X86
+#if !defined(ASMJIT_NO_X86)
#include "../core/cpuinfo.h"
#include "../core/misc_p.h"
#include "../core/support.h"
-#include "../x86/x86features.h"
#include "../x86/x86instapi_p.h"
#include "../x86/x86instdb_p.h"
#include "../x86/x86opcode_p.h"
@@ -53,12 +34,11 @@
ASMJIT_BEGIN_SUB_NAMESPACE(x86)
-// ============================================================================
-// [asmjit::x86::InstInternal - Text]
-// ============================================================================
+// x86::InstInternal - Text
+// ========================
#ifndef ASMJIT_NO_TEXT
-Error InstInternal::instIdToString(uint32_t arch, uint32_t instId, String& output) noexcept {
+Error InstInternal::instIdToString(Arch arch, InstId instId, String& output) noexcept {
DebugUtils::unused(arch);
if (ASMJIT_UNLIKELY(!Inst::isDefinedId(instId)))
@@ -68,7 +48,7 @@ Error InstInternal::instIdToString(uint32_t arch, uint32_t instId, String& outpu
return output.append(InstDB::_nameData + info._nameDataIndex);
}
-uint32_t InstInternal::stringToInstId(uint32_t arch, const char* s, size_t len) noexcept {
+InstId InstInternal::stringToInstId(Arch arch, const char* s, size_t len) noexcept {
DebugUtils::unused(arch);
if (ASMJIT_UNLIKELY(!s))
@@ -107,106 +87,113 @@ uint32_t InstInternal::stringToInstId(uint32_t arch, const char* s, size_t len)
if (result > 0)
continue;
- return uint32_t((size_t)(cur - table));
+ return InstId((size_t)(cur - table));
}
return Inst::kIdNone;
}
#endif // !ASMJIT_NO_TEXT
-// ============================================================================
-// [asmjit::x86::InstInternal - Validate]
-// ============================================================================
+// x86::InstInternal - Validate
+// ============================
#ifndef ASMJIT_NO_VALIDATION
struct X86ValidationData {
- //! Allowed registers by reg-type (x86::Reg::kType...).
- uint32_t allowedRegMask[Reg::kTypeMax + 1];
+ //! Allowed registers by \ref RegType.
+ RegMask allowedRegMask[uint32_t(RegType::kMaxValue) + 1];
uint32_t allowedMemBaseRegs;
uint32_t allowedMemIndexRegs;
};
-#define VALUE(X) \
- (X == Reg::kTypeGpbLo) ? InstDB::kOpGpbLo : \
- (X == Reg::kTypeGpbHi) ? InstDB::kOpGpbHi : \
- (X == Reg::kTypeGpw ) ? InstDB::kOpGpw : \
- (X == Reg::kTypeGpd ) ? InstDB::kOpGpd : \
- (X == Reg::kTypeGpq ) ? InstDB::kOpGpq : \
- (X == Reg::kTypeXmm ) ? InstDB::kOpXmm : \
- (X == Reg::kTypeYmm ) ? InstDB::kOpYmm : \
- (X == Reg::kTypeZmm ) ? InstDB::kOpZmm : \
- (X == Reg::kTypeMm ) ? InstDB::kOpMm : \
- (X == Reg::kTypeKReg ) ? InstDB::kOpKReg : \
- (X == Reg::kTypeSReg ) ? InstDB::kOpSReg : \
- (X == Reg::kTypeCReg ) ? InstDB::kOpCReg : \
- (X == Reg::kTypeDReg ) ? InstDB::kOpDReg : \
- (X == Reg::kTypeSt ) ? InstDB::kOpSt : \
- (X == Reg::kTypeBnd ) ? InstDB::kOpBnd : \
- (X == Reg::kTypeRip ) ? InstDB::kOpNone : InstDB::kOpNone
-static const uint32_t _x86OpFlagFromRegType[Reg::kTypeMax + 1] = { ASMJIT_LOOKUP_TABLE_32(VALUE, 0) };
+#define VALUE(x) \
+ (x == uint32_t(RegType::kX86_GpbLo)) ? InstDB::OpFlags::kRegGpbLo : \
+ (x == uint32_t(RegType::kX86_GpbHi)) ? InstDB::OpFlags::kRegGpbHi : \
+ (x == uint32_t(RegType::kX86_Gpw )) ? InstDB::OpFlags::kRegGpw : \
+ (x == uint32_t(RegType::kX86_Gpd )) ? InstDB::OpFlags::kRegGpd : \
+ (x == uint32_t(RegType::kX86_Gpq )) ? InstDB::OpFlags::kRegGpq : \
+ (x == uint32_t(RegType::kX86_Xmm )) ? InstDB::OpFlags::kRegXmm : \
+ (x == uint32_t(RegType::kX86_Ymm )) ? InstDB::OpFlags::kRegYmm : \
+ (x == uint32_t(RegType::kX86_Zmm )) ? InstDB::OpFlags::kRegZmm : \
+ (x == uint32_t(RegType::kX86_Mm )) ? InstDB::OpFlags::kRegMm : \
+ (x == uint32_t(RegType::kX86_KReg )) ? InstDB::OpFlags::kRegKReg : \
+ (x == uint32_t(RegType::kX86_SReg )) ? InstDB::OpFlags::kRegSReg : \
+ (x == uint32_t(RegType::kX86_CReg )) ? InstDB::OpFlags::kRegCReg : \
+ (x == uint32_t(RegType::kX86_DReg )) ? InstDB::OpFlags::kRegDReg : \
+ (x == uint32_t(RegType::kX86_St )) ? InstDB::OpFlags::kRegSt : \
+ (x == uint32_t(RegType::kX86_Bnd )) ? InstDB::OpFlags::kRegBnd : \
+ (x == uint32_t(RegType::kX86_Tmm )) ? InstDB::OpFlags::kRegTmm : \
+ (x == uint32_t(RegType::kX86_Rip )) ? InstDB::OpFlags::kNone : InstDB::OpFlags::kNone
+static const InstDB::OpFlags _x86OpFlagFromRegType[uint32_t(RegType::kMaxValue) + 1] = { ASMJIT_LOOKUP_TABLE_32(VALUE, 0) };
#undef VALUE
-#define REG_MASK_FROM_REG_TYPE_X86(X) \
- (X == Reg::kTypeGpbLo) ? 0x0000000Fu : \
- (X == Reg::kTypeGpbHi) ? 0x0000000Fu : \
- (X == Reg::kTypeGpw ) ? 0x000000FFu : \
- (X == Reg::kTypeGpd ) ? 0x000000FFu : \
- (X == Reg::kTypeGpq ) ? 0x000000FFu : \
- (X == Reg::kTypeXmm ) ? 0x000000FFu : \
- (X == Reg::kTypeYmm ) ? 0x000000FFu : \
- (X == Reg::kTypeZmm ) ? 0x000000FFu : \
- (X == Reg::kTypeMm ) ? 0x000000FFu : \
- (X == Reg::kTypeKReg ) ? 0x000000FFu : \
- (X == Reg::kTypeSReg ) ? 0x0000007Eu : \
- (X == Reg::kTypeCReg ) ? 0x0000FFFFu : \
- (X == Reg::kTypeDReg ) ? 0x000000FFu : \
- (X == Reg::kTypeSt ) ? 0x000000FFu : \
- (X == Reg::kTypeBnd ) ? 0x0000000Fu : \
- (X == Reg::kTypeRip ) ? 0x00000001u : 0u
-
-#define REG_MASK_FROM_REG_TYPE_X64(X) \
- (X == Reg::kTypeGpbLo) ? 0x0000FFFFu : \
- (X == Reg::kTypeGpbHi) ? 0x0000000Fu : \
- (X == Reg::kTypeGpw ) ? 0x0000FFFFu : \
- (X == Reg::kTypeGpd ) ? 0x0000FFFFu : \
- (X == Reg::kTypeGpq ) ? 0x0000FFFFu : \
- (X == Reg::kTypeXmm ) ? 0xFFFFFFFFu : \
- (X == Reg::kTypeYmm ) ? 0xFFFFFFFFu : \
- (X == Reg::kTypeZmm ) ? 0xFFFFFFFFu : \
- (X == Reg::kTypeMm ) ? 0x000000FFu : \
- (X == Reg::kTypeKReg ) ? 0x000000FFu : \
- (X == Reg::kTypeSReg ) ? 0x0000007Eu : \
- (X == Reg::kTypeCReg ) ? 0x0000FFFFu : \
- (X == Reg::kTypeDReg ) ? 0x0000FFFFu : \
- (X == Reg::kTypeSt ) ? 0x000000FFu : \
- (X == Reg::kTypeBnd ) ? 0x0000000Fu : \
- (X == Reg::kTypeRip ) ? 0x00000001u : 0u
+#define REG_MASK_FROM_REG_TYPE_X86(x) \
+ (x == uint32_t(RegType::kX86_GpbLo)) ? 0x0000000Fu : \
+ (x == uint32_t(RegType::kX86_GpbHi)) ? 0x0000000Fu : \
+ (x == uint32_t(RegType::kX86_Gpw )) ? 0x000000FFu : \
+ (x == uint32_t(RegType::kX86_Gpd )) ? 0x000000FFu : \
+ (x == uint32_t(RegType::kX86_Gpq )) ? 0x000000FFu : \
+ (x == uint32_t(RegType::kX86_Xmm )) ? 0x000000FFu : \
+ (x == uint32_t(RegType::kX86_Ymm )) ? 0x000000FFu : \
+ (x == uint32_t(RegType::kX86_Zmm )) ? 0x000000FFu : \
+ (x == uint32_t(RegType::kX86_Mm )) ? 0x000000FFu : \
+ (x == uint32_t(RegType::kX86_KReg )) ? 0x000000FFu : \
+ (x == uint32_t(RegType::kX86_SReg )) ? 0x0000007Eu : \
+ (x == uint32_t(RegType::kX86_CReg )) ? 0x0000FFFFu : \
+ (x == uint32_t(RegType::kX86_DReg )) ? 0x000000FFu : \
+ (x == uint32_t(RegType::kX86_St )) ? 0x000000FFu : \
+ (x == uint32_t(RegType::kX86_Bnd )) ? 0x0000000Fu : \
+ (x == uint32_t(RegType::kX86_Tmm )) ? 0x000000FFu : \
+ (x == uint32_t(RegType::kX86_Rip )) ? 0x00000001u : 0u
+
+#define REG_MASK_FROM_REG_TYPE_X64(x) \
+ (x == uint32_t(RegType::kX86_GpbLo)) ? 0x0000FFFFu : \
+ (x == uint32_t(RegType::kX86_GpbHi)) ? 0x0000000Fu : \
+ (x == uint32_t(RegType::kX86_Gpw )) ? 0x0000FFFFu : \
+ (x == uint32_t(RegType::kX86_Gpd )) ? 0x0000FFFFu : \
+ (x == uint32_t(RegType::kX86_Gpq )) ? 0x0000FFFFu : \
+ (x == uint32_t(RegType::kX86_Xmm )) ? 0xFFFFFFFFu : \
+ (x == uint32_t(RegType::kX86_Ymm )) ? 0xFFFFFFFFu : \
+ (x == uint32_t(RegType::kX86_Zmm )) ? 0xFFFFFFFFu : \
+ (x == uint32_t(RegType::kX86_Mm )) ? 0x000000FFu : \
+ (x == uint32_t(RegType::kX86_KReg )) ? 0x000000FFu : \
+ (x == uint32_t(RegType::kX86_SReg )) ? 0x0000007Eu : \
+ (x == uint32_t(RegType::kX86_CReg )) ? 0x0000FFFFu : \
+ (x == uint32_t(RegType::kX86_DReg )) ? 0x0000FFFFu : \
+ (x == uint32_t(RegType::kX86_St )) ? 0x000000FFu : \
+ (x == uint32_t(RegType::kX86_Bnd )) ? 0x0000000Fu : \
+ (x == uint32_t(RegType::kX86_Tmm )) ? 0x000000FFu : \
+ (x == uint32_t(RegType::kX86_Rip )) ? 0x00000001u : 0u
+
+#define B(RegType) (uint32_t(1) << uint32_t(RegType))
static const X86ValidationData _x86ValidationData = {
{ ASMJIT_LOOKUP_TABLE_32(REG_MASK_FROM_REG_TYPE_X86, 0) },
- (1u << Reg::kTypeGpw) | (1u << Reg::kTypeGpd) | (1u << Reg::kTypeRip) | (1u << Label::kLabelTag),
- (1u << Reg::kTypeGpw) | (1u << Reg::kTypeGpd) | (1u << Reg::kTypeXmm) | (1u << Reg::kTypeYmm) | (1u << Reg::kTypeZmm)
+ B(RegType::kX86_Gpw) | B(RegType::kX86_Gpd) | B(RegType::kX86_Rip) | B(RegType::kLabelTag),
+ B(RegType::kX86_Gpw) | B(RegType::kX86_Gpd) | B(RegType::kX86_Xmm) | B(RegType::kX86_Ymm) | B(RegType::kX86_Zmm)
};
static const X86ValidationData _x64ValidationData = {
{ ASMJIT_LOOKUP_TABLE_32(REG_MASK_FROM_REG_TYPE_X64, 0) },
- (1u << Reg::kTypeGpd) | (1u << Reg::kTypeGpq) | (1u << Reg::kTypeRip) | (1u << Label::kLabelTag),
- (1u << Reg::kTypeGpd) | (1u << Reg::kTypeGpq) | (1u << Reg::kTypeXmm) | (1u << Reg::kTypeYmm) | (1u << Reg::kTypeZmm)
+ B(RegType::kX86_Gpd) | B(RegType::kX86_Gpq) | B(RegType::kX86_Rip) | B(RegType::kLabelTag),
+ B(RegType::kX86_Gpd) | B(RegType::kX86_Gpq) | B(RegType::kX86_Xmm) | B(RegType::kX86_Ymm) | B(RegType::kX86_Zmm)
};
+#undef B
+
#undef REG_MASK_FROM_REG_TYPE_X64
#undef REG_MASK_FROM_REG_TYPE_X86
-static ASMJIT_INLINE bool x86IsZmmOrM512(const Operand_& op) noexcept {
+static ASMJIT_FORCE_INLINE bool x86IsZmmOrM512(const Operand_& op) noexcept {
return Reg::isZmm(op) || (op.isMem() && op.size() == 64);
}
-static ASMJIT_INLINE bool x86CheckOSig(const InstDB::OpSignature& op, const InstDB::OpSignature& ref, bool& immOutOfRange) noexcept {
+static ASMJIT_FORCE_INLINE bool x86CheckOSig(const InstDB::OpSignature& op, const InstDB::OpSignature& ref, bool& immOutOfRange) noexcept {
// Fail if operand types are incompatible.
- uint32_t opFlags = op.opFlags;
- if ((opFlags & ref.opFlags) == 0) {
+ InstDB::OpFlags commonFlags = op.flags() & ref.flags();
+
+ if (!Support::test(commonFlags, InstDB::OpFlags::kOpMask)) {
// Mark temporarily `immOutOfRange` so we can return a more descriptive error later.
- if ((opFlags & InstDB::kOpAllImm) && (ref.opFlags & InstDB::kOpAllImm)) {
+ if (op.hasImm() && ref.hasImm()) {
immOutOfRange = true;
return true;
}
@@ -214,43 +201,37 @@ static ASMJIT_INLINE bool x86CheckOSig(const InstDB::OpSignature& op, const Inst
return false;
}
- // Fail if memory specific flags and sizes do not match the signature.
- uint32_t opMemFlags = op.memFlags;
- if (opMemFlags != 0) {
- uint32_t refMemFlags = ref.memFlags;
- if ((refMemFlags & opMemFlags) == 0)
- return false;
-
- if ((refMemFlags & InstDB::kMemOpBaseOnly) && !(opMemFlags & InstDB::kMemOpBaseOnly))
+ // Fail if some memory specific flags do not match.
+ if (Support::test(commonFlags, InstDB::OpFlags::kMemMask)) {
+ if (ref.hasFlag(InstDB::OpFlags::kFlagMemBase) && !op.hasFlag(InstDB::OpFlags::kFlagMemBase))
return false;
}
- // Specific register index.
- if (opFlags & InstDB::kOpAllRegs) {
- uint32_t refRegMask = ref.regMask;
- if (refRegMask && !(op.regMask & refRegMask))
+ // Fail if register indexes do not match.
+ if (Support::test(commonFlags, InstDB::OpFlags::kRegMask)) {
+ if (ref.regMask() && !Support::test(op.regMask(), ref.regMask()))
return false;
}
return true;
}
-ASMJIT_FAVOR_SIZE Error InstInternal::validate(uint32_t arch, const BaseInst& inst, const Operand_* operands, size_t opCount, uint32_t validationFlags) noexcept {
+ASMJIT_FAVOR_SIZE Error InstInternal::validate(Arch arch, const BaseInst& inst, const Operand_* operands, size_t opCount, ValidationFlags validationFlags) noexcept {
// Only called when `arch` matches X86 family.
ASMJIT_ASSERT(Environment::isFamilyX86(arch));
const X86ValidationData* vd;
- if (arch == Environment::kArchX86)
+ if (arch == Arch::kX86)
vd = &_x86ValidationData;
else
vd = &_x64ValidationData;
uint32_t i;
- uint32_t mode = InstDB::modeFromArch(arch);
+ InstDB::Mode mode = InstDB::modeFromArch(arch);
// Get the instruction data.
- uint32_t instId = inst.id();
- uint32_t options = inst.options();
+ InstId instId = inst.id();
+ InstOptions options = inst.options();
if (ASMJIT_UNLIKELY(!Inst::isDefinedId(instId)))
return DebugUtils::errored(kErrorInvalidInstruction);
@@ -258,89 +239,87 @@ ASMJIT_FAVOR_SIZE Error InstInternal::validate(uint32_t arch, const BaseInst& in
const InstDB::InstInfo& instInfo = InstDB::infoById(instId);
const InstDB::CommonInfo& commonInfo = instInfo.commonInfo();
- uint32_t iFlags = instInfo.flags();
+ InstDB::InstFlags iFlags = instInfo.flags();
+
+ constexpr InstOptions kRepAny = InstOptions::kX86_Rep | InstOptions::kX86_Repne;
+ constexpr InstOptions kXAcqXRel = InstOptions::kX86_XAcquire | InstOptions::kX86_XRelease;
+ constexpr InstOptions kAvx512Options = InstOptions::kX86_ZMask | InstOptions::kX86_ER | InstOptions::kX86_SAE;
- // --------------------------------------------------------------------------
- // [Validate LOCK|XACQUIRE|XRELEASE]
- // --------------------------------------------------------------------------
+ // Validate LOCK|XACQUIRE|XRELEASE Prefixes
+ // ----------------------------------------
- const uint32_t kLockXAcqRel = Inst::kOptionXAcquire | Inst::kOptionXRelease;
- if (options & (Inst::kOptionLock | kLockXAcqRel)) {
- if (options & Inst::kOptionLock) {
- if (ASMJIT_UNLIKELY(!(iFlags & InstDB::kFlagLock) && !(options & kLockXAcqRel)))
+ if (Support::test(options, InstOptions::kX86_Lock | kXAcqXRel)) {
+ if (Support::test(options, InstOptions::kX86_Lock)) {
+ if (ASMJIT_UNLIKELY(!Support::test(iFlags, InstDB::InstFlags::kLock) && !Support::test(options, kXAcqXRel)))
return DebugUtils::errored(kErrorInvalidLockPrefix);
if (ASMJIT_UNLIKELY(opCount < 1 || !operands[0].isMem()))
return DebugUtils::errored(kErrorInvalidLockPrefix);
}
- if (options & kLockXAcqRel) {
- if (ASMJIT_UNLIKELY(!(options & Inst::kOptionLock) || (options & kLockXAcqRel) == kLockXAcqRel))
+ if (Support::test(options, kXAcqXRel)) {
+ if (ASMJIT_UNLIKELY(!Support::test(options, InstOptions::kX86_Lock) || (options & kXAcqXRel) == kXAcqXRel))
return DebugUtils::errored(kErrorInvalidPrefixCombination);
- if (ASMJIT_UNLIKELY((options & Inst::kOptionXAcquire) && !(iFlags & InstDB::kFlagXAcquire)))
+ if (ASMJIT_UNLIKELY(Support::test(options, InstOptions::kX86_XAcquire) && !Support::test(iFlags, InstDB::InstFlags::kXAcquire)))
return DebugUtils::errored(kErrorInvalidXAcquirePrefix);
- if (ASMJIT_UNLIKELY((options & Inst::kOptionXRelease) && !(iFlags & InstDB::kFlagXRelease)))
+ if (ASMJIT_UNLIKELY(Support::test(options, InstOptions::kX86_XRelease) && !Support::test(iFlags, InstDB::InstFlags::kXRelease)))
return DebugUtils::errored(kErrorInvalidXReleasePrefix);
}
}
- // Validate REP and REPNE prefixes.
- const uint32_t kRepAny = Inst::kOptionRep | Inst::kOptionRepne;
- if (options & kRepAny) {
+ // Validate REP and REPNE Prefixes
+ // -------------------------------
+
+ if (Support::test(options, kRepAny)) {
if (ASMJIT_UNLIKELY((options & kRepAny) == kRepAny))
return DebugUtils::errored(kErrorInvalidPrefixCombination);
- if (ASMJIT_UNLIKELY(!(iFlags & InstDB::kFlagRep)))
+ if (ASMJIT_UNLIKELY(!Support::test(iFlags, InstDB::InstFlags::kRep)))
return DebugUtils::errored(kErrorInvalidRepPrefix);
}
- // --------------------------------------------------------------------------
- // [Translate Each Operand to the Corresponding OpSignature]
- // --------------------------------------------------------------------------
+ // Translate Each Operand to the Corresponding OpSignature
+ // -------------------------------------------------------
InstDB::OpSignature oSigTranslated[Globals::kMaxOpCount];
- uint32_t combinedOpFlags = 0;
+ InstDB::OpFlags combinedOpFlags = InstDB::OpFlags::kNone;
uint32_t combinedRegMask = 0;
const Mem* memOp = nullptr;
for (i = 0; i < opCount; i++) {
const Operand_& op = operands[i];
- if (op.opType() == Operand::kOpNone)
+ if (op.opType() == OperandType::kNone)
break;
- uint32_t opFlags = 0;
- uint32_t memFlags = 0;
- uint32_t regMask = 0;
+ InstDB::OpFlags opFlags = InstDB::OpFlags::kNone;
+ RegMask regMask = 0;
switch (op.opType()) {
- case Operand::kOpReg: {
- uint32_t regType = op.as<BaseReg>().type();
- if (ASMJIT_UNLIKELY(regType >= Reg::kTypeCount))
- return DebugUtils::errored(kErrorInvalidRegType);
+ case OperandType::kReg: {
+ RegType regType = op.as<BaseReg>().type();
+ opFlags = _x86OpFlagFromRegType[size_t(regType)];
- opFlags = _x86OpFlagFromRegType[regType];
- if (ASMJIT_UNLIKELY(opFlags == 0))
+ if (ASMJIT_UNLIKELY(opFlags == InstDB::OpFlags::kNone))
return DebugUtils::errored(kErrorInvalidRegType);
- // If `regId` is equal or greater than Operand::kVirtIdMin it means
- // that the register is virtual and its index will be assigned later
- // by the register allocator. We must pass unless asked to disallow
- // virtual registers.
+ // If `regId` is equal or greater than Operand::kVirtIdMin it means that the register is virtual and its
+ // index will be assigned later by the register allocator. We must pass unless asked to disallow virtual
+ // registers.
uint32_t regId = op.id();
if (regId < Operand::kVirtIdMin) {
if (ASMJIT_UNLIKELY(regId >= 32))
return DebugUtils::errored(kErrorInvalidPhysId);
- if (ASMJIT_UNLIKELY(Support::bitTest(vd->allowedRegMask[regType], regId) == 0))
+ if (ASMJIT_UNLIKELY(Support::bitTest(vd->allowedRegMask[size_t(regType)], regId) == 0))
return DebugUtils::errored(kErrorInvalidPhysId);
regMask = Support::bitMask(regId);
combinedRegMask |= regMask;
}
else {
- if (!(validationFlags & InstAPI::kValidationFlagVirtRegs))
+ if (uint32_t(validationFlags & ValidationFlags::kEnableVirtRegs) == 0)
return DebugUtils::errored(kErrorIllegalVirtReg);
regMask = 0xFFFFFFFFu;
}
@@ -348,13 +327,13 @@ ASMJIT_FAVOR_SIZE Error InstInternal::validate(uint32_t arch, const BaseInst& in
}
// TODO: Validate base and index and combine these with `combinedRegMask`.
- case Operand::kOpMem: {
+ case OperandType::kMem: {
const Mem& m = op.as<Mem>();
memOp = &m;
uint32_t memSize = m.size();
- uint32_t baseType = m.baseType();
- uint32_t indexType = m.indexType();
+ RegType baseType = m.baseType();
+ RegType indexType = m.indexType();
if (m.segmentId() > 6)
return DebugUtils::errored(kErrorInvalidSegment);
@@ -371,28 +350,28 @@ ASMJIT_FAVOR_SIZE Error InstInternal::validate(uint32_t arch, const BaseInst& in
}
else {
// If there is no size we implicitly calculate it so we can validate N in {1toN} properly.
- memSize = commonInfo.hasAvx512B32() ? 4 : 8;
+ memSize = commonInfo.hasAvx512B64() ? 8 :
+ commonInfo.hasAvx512B32() ? 4 : 2;
}
- memSize <<= m.getBroadcast();
+ memSize <<= uint32_t(m.getBroadcast());
}
- if (baseType != 0 && baseType > Label::kLabelTag) {
+ if (baseType != RegType::kNone && baseType > RegType::kLabelTag) {
uint32_t baseId = m.baseId();
if (m.isRegHome()) {
- // Home address of a virtual register. In such case we don't want to
- // validate the type of the base register as it will always be patched
- // to ESP|RSP.
+ // Home address of a virtual register. In such case we don't want to validate the type of the
+ // base register as it will always be patched to ESP|RSP.
}
else {
- if (ASMJIT_UNLIKELY((vd->allowedMemBaseRegs & (1u << baseType)) == 0))
+ if (ASMJIT_UNLIKELY(!Support::bitTest(vd->allowedMemBaseRegs, baseType)))
return DebugUtils::errored(kErrorInvalidAddress);
}
- // Create information that will be validated only if this is an implicit
- // memory operand. Basically only usable for string instructions and other
- // instructions where memory operand is implicit and has 'seg:[reg]' form.
+ // Create information that will be validated only if this is an implicit memory operand. Basically
+ // only usable for string instructions and other instructions where memory operand is implicit and
+ // has 'seg:[reg]' form.
if (baseId < Operand::kVirtIdMin) {
if (ASMJIT_UNLIKELY(baseId >= 32))
return DebugUtils::errored(kErrorInvalidPhysId);
@@ -402,71 +381,66 @@ ASMJIT_FAVOR_SIZE Error InstInternal::validate(uint32_t arch, const BaseInst& in
combinedRegMask |= regMask;
}
else {
- // Virtual base id - fill the whole mask for implicit mem validation.
- // The register is not assigned yet, so we cannot predict the phys id.
- if (!(validationFlags & InstAPI::kValidationFlagVirtRegs))
+ // Virtual base id - fill the whole mask for implicit mem validation. The register is not assigned
+ // yet, so we cannot predict the phys id.
+ if (uint32_t(validationFlags & ValidationFlags::kEnableVirtRegs) == 0)
return DebugUtils::errored(kErrorIllegalVirtReg);
regMask = 0xFFFFFFFFu;
}
- if (!indexType && !m.offsetLo32())
- memFlags |= InstDB::kMemOpBaseOnly;
+ if (indexType == RegType::kNone && !m.offsetLo32())
+ opFlags |= InstDB::OpFlags::kFlagMemBase;
}
- else if (baseType == Label::kLabelTag) {
+ else if (baseType == RegType::kLabelTag) {
// [Label] - there is no need to validate the base as it's label.
}
else {
// Base is a 64-bit address.
int64_t offset = m.offset();
if (!Support::isInt32(offset)) {
- if (mode == InstDB::kModeX86) {
+ if (mode == InstDB::Mode::kX86) {
// 32-bit mode: Make sure that the address is either `int32_t` or `uint32_t`.
if (!Support::isUInt32(offset))
return DebugUtils::errored(kErrorInvalidAddress64Bit);
}
else {
- // 64-bit mode: Zero extension is allowed if the address has 32-bit index
- // register or the address has no index register (it's still encodable).
- if (indexType) {
+ // 64-bit mode: Zero extension is allowed if the address has 32-bit index register or the address
+ // has no index register (it's still encodable).
+ if (indexType != RegType::kNone) {
if (!Support::isUInt32(offset))
return DebugUtils::errored(kErrorInvalidAddress64Bit);
- if (indexType != Reg::kTypeGpd)
+ if (indexType != RegType::kX86_Gpd)
return DebugUtils::errored(kErrorInvalidAddress64BitZeroExtension);
}
else {
- // We don't validate absolute 64-bit addresses without an index register
- // as this also depends on the target's base address. We don't have the
- // information to do it at this moment.
+ // We don't validate absolute 64-bit addresses without an index register as this also depends
+ // on the target's base address. We don't have the information to do it at this moment.
}
}
}
}
- if (indexType) {
- if (ASMJIT_UNLIKELY((vd->allowedMemIndexRegs & (1u << indexType)) == 0))
+ if (indexType != RegType::kNone) {
+ if (ASMJIT_UNLIKELY(!Support::bitTest(vd->allowedMemIndexRegs, indexType)))
return DebugUtils::errored(kErrorInvalidAddress);
- if (indexType == Reg::kTypeXmm) {
- opFlags |= InstDB::kOpVm;
- memFlags |= InstDB::kMemOpVm32x | InstDB::kMemOpVm64x;
+ if (indexType == RegType::kX86_Xmm) {
+ opFlags |= InstDB::OpFlags::kVm32x | InstDB::OpFlags::kVm64x;
}
- else if (indexType == Reg::kTypeYmm) {
- opFlags |= InstDB::kOpVm;
- memFlags |= InstDB::kMemOpVm32y | InstDB::kMemOpVm64y;
+ else if (indexType == RegType::kX86_Ymm) {
+ opFlags |= InstDB::OpFlags::kVm32y | InstDB::OpFlags::kVm64y;
}
- else if (indexType == Reg::kTypeZmm) {
- opFlags |= InstDB::kOpVm;
- memFlags |= InstDB::kMemOpVm32z | InstDB::kMemOpVm64z;
+ else if (indexType == RegType::kX86_Zmm) {
+ opFlags |= InstDB::OpFlags::kVm32z | InstDB::OpFlags::kVm64z;
}
else {
- opFlags |= InstDB::kOpMem;
- if (baseType)
- memFlags |= InstDB::kMemOpMib;
+ if (baseType != RegType::kNone)
+ opFlags |= InstDB::OpFlags::kFlagMib;
}
// [RIP + {XMM|YMM|ZMM}] is not allowed.
- if (baseType == Reg::kTypeRip && (opFlags & InstDB::kOpVm))
+ if (baseType == RegType::kX86_Rip && Support::test(opFlags, InstDB::OpFlags::kVmMask))
return DebugUtils::errored(kErrorInvalidAddress);
uint32_t indexId = m.indexId();
@@ -477,28 +451,26 @@ ASMJIT_FAVOR_SIZE Error InstInternal::validate(uint32_t arch, const BaseInst& in
combinedRegMask |= Support::bitMask(indexId);
}
else {
- if (!(validationFlags & InstAPI::kValidationFlagVirtRegs))
+ if (uint32_t(validationFlags & ValidationFlags::kEnableVirtRegs) == 0)
return DebugUtils::errored(kErrorIllegalVirtReg);
}
// Only used for implicit memory operands having 'seg:[reg]' form, so clear it.
regMask = 0;
}
- else {
- opFlags |= InstDB::kOpMem;
- }
switch (memSize) {
- case 0: memFlags |= InstDB::kMemOpAny ; break;
- case 1: memFlags |= InstDB::kMemOpM8 ; break;
- case 2: memFlags |= InstDB::kMemOpM16 ; break;
- case 4: memFlags |= InstDB::kMemOpM32 ; break;
- case 6: memFlags |= InstDB::kMemOpM48 ; break;
- case 8: memFlags |= InstDB::kMemOpM64 ; break;
- case 10: memFlags |= InstDB::kMemOpM80 ; break;
- case 16: memFlags |= InstDB::kMemOpM128; break;
- case 32: memFlags |= InstDB::kMemOpM256; break;
- case 64: memFlags |= InstDB::kMemOpM512; break;
+ case 0: opFlags |= InstDB::OpFlags::kMemUnspecified; break;
+ case 1: opFlags |= InstDB::OpFlags::kMem8; break;
+ case 2: opFlags |= InstDB::OpFlags::kMem16; break;
+ case 4: opFlags |= InstDB::OpFlags::kMem32; break;
+ case 6: opFlags |= InstDB::OpFlags::kMem48; break;
+ case 8: opFlags |= InstDB::OpFlags::kMem64; break;
+ case 10: opFlags |= InstDB::OpFlags::kMem80; break;
+ case 16: opFlags |= InstDB::OpFlags::kMem128; break;
+ case 32: opFlags |= InstDB::OpFlags::kMem256; break;
+ case 64: opFlags |= InstDB::OpFlags::kMem512; break;
+
default:
return DebugUtils::errored(kErrorInvalidOperandSize);
}
@@ -506,59 +478,57 @@ ASMJIT_FAVOR_SIZE Error InstInternal::validate(uint32_t arch, const BaseInst& in
break;
}
- case Operand::kOpImm: {
+ case OperandType::kImm: {
uint64_t immValue = op.as<Imm>().valueAs<uint64_t>();
- uint32_t immFlags = 0;
if (int64_t(immValue) >= 0) {
if (immValue <= 0x7u)
- immFlags = InstDB::kOpI64 | InstDB::kOpU64 | InstDB::kOpI32 | InstDB::kOpU32 |
- InstDB::kOpI16 | InstDB::kOpU16 | InstDB::kOpI8 | InstDB::kOpU8 |
- InstDB::kOpI4 | InstDB::kOpU4 ;
+ opFlags = InstDB::OpFlags::kImmI64 | InstDB::OpFlags::kImmU64 | InstDB::OpFlags::kImmI32 | InstDB::OpFlags::kImmU32 |
+ InstDB::OpFlags::kImmI16 | InstDB::OpFlags::kImmU16 | InstDB::OpFlags::kImmI8 | InstDB::OpFlags::kImmU8 |
+ InstDB::OpFlags::kImmI4 | InstDB::OpFlags::kImmU4 ;
else if (immValue <= 0xFu)
- immFlags = InstDB::kOpI64 | InstDB::kOpU64 | InstDB::kOpI32 | InstDB::kOpU32 |
- InstDB::kOpI16 | InstDB::kOpU16 | InstDB::kOpI8 | InstDB::kOpU8 |
- InstDB::kOpU4 ;
+ opFlags = InstDB::OpFlags::kImmI64 | InstDB::OpFlags::kImmU64 | InstDB::OpFlags::kImmI32 | InstDB::OpFlags::kImmU32 |
+ InstDB::OpFlags::kImmI16 | InstDB::OpFlags::kImmU16 | InstDB::OpFlags::kImmI8 | InstDB::OpFlags::kImmU8 |
+ InstDB::OpFlags::kImmU4 ;
else if (immValue <= 0x7Fu)
- immFlags = InstDB::kOpI64 | InstDB::kOpU64 | InstDB::kOpI32 | InstDB::kOpU32 |
- InstDB::kOpI16 | InstDB::kOpU16 | InstDB::kOpI8 | InstDB::kOpU8 ;
+ opFlags = InstDB::OpFlags::kImmI64 | InstDB::OpFlags::kImmU64 | InstDB::OpFlags::kImmI32 | InstDB::OpFlags::kImmU32 |
+ InstDB::OpFlags::kImmI16 | InstDB::OpFlags::kImmU16 | InstDB::OpFlags::kImmI8 | InstDB::OpFlags::kImmU8 ;
else if (immValue <= 0xFFu)
- immFlags = InstDB::kOpI64 | InstDB::kOpU64 | InstDB::kOpI32 | InstDB::kOpU32 |
- InstDB::kOpI16 | InstDB::kOpU16 | InstDB::kOpU8 ;
+ opFlags = InstDB::OpFlags::kImmI64 | InstDB::OpFlags::kImmU64 | InstDB::OpFlags::kImmI32 | InstDB::OpFlags::kImmU32 |
+ InstDB::OpFlags::kImmI16 | InstDB::OpFlags::kImmU16 | InstDB::OpFlags::kImmU8 ;
else if (immValue <= 0x7FFFu)
- immFlags = InstDB::kOpI64 | InstDB::kOpU64 | InstDB::kOpI32 | InstDB::kOpU32 |
- InstDB::kOpI16 | InstDB::kOpU16 ;
+ opFlags = InstDB::OpFlags::kImmI64 | InstDB::OpFlags::kImmU64 | InstDB::OpFlags::kImmI32 | InstDB::OpFlags::kImmU32 |
+ InstDB::OpFlags::kImmI16 | InstDB::OpFlags::kImmU16 ;
else if (immValue <= 0xFFFFu)
- immFlags = InstDB::kOpI64 | InstDB::kOpU64 | InstDB::kOpI32 | InstDB::kOpU32 |
- InstDB::kOpU16 ;
+ opFlags = InstDB::OpFlags::kImmI64 | InstDB::OpFlags::kImmU64 | InstDB::OpFlags::kImmI32 | InstDB::OpFlags::kImmU32 |
+ InstDB::OpFlags::kImmU16 ;
else if (immValue <= 0x7FFFFFFFu)
- immFlags = InstDB::kOpI64 | InstDB::kOpU64 | InstDB::kOpI32 | InstDB::kOpU32;
+ opFlags = InstDB::OpFlags::kImmI64 | InstDB::OpFlags::kImmU64 | InstDB::OpFlags::kImmI32 | InstDB::OpFlags::kImmU32;
else if (immValue <= 0xFFFFFFFFu)
- immFlags = InstDB::kOpI64 | InstDB::kOpU64 | InstDB::kOpU32;
+ opFlags = InstDB::OpFlags::kImmI64 | InstDB::OpFlags::kImmU64 | InstDB::OpFlags::kImmU32;
else if (immValue <= 0x7FFFFFFFFFFFFFFFu)
- immFlags = InstDB::kOpI64 | InstDB::kOpU64;
+ opFlags = InstDB::OpFlags::kImmI64 | InstDB::OpFlags::kImmU64;
else
- immFlags = InstDB::kOpU64;
+ opFlags = InstDB::OpFlags::kImmU64;
}
else {
immValue = Support::neg(immValue);
if (immValue <= 0x8u)
- immFlags = InstDB::kOpI64 | InstDB::kOpI32 | InstDB::kOpI16 | InstDB::kOpI8 | InstDB::kOpI4;
+ opFlags = InstDB::OpFlags::kImmI64 | InstDB::OpFlags::kImmI32 | InstDB::OpFlags::kImmI16 | InstDB::OpFlags::kImmI8 | InstDB::OpFlags::kImmI4;
else if (immValue <= 0x80u)
- immFlags = InstDB::kOpI64 | InstDB::kOpI32 | InstDB::kOpI16 | InstDB::kOpI8;
+ opFlags = InstDB::OpFlags::kImmI64 | InstDB::OpFlags::kImmI32 | InstDB::OpFlags::kImmI16 | InstDB::OpFlags::kImmI8;
else if (immValue <= 0x8000u)
- immFlags = InstDB::kOpI64 | InstDB::kOpI32 | InstDB::kOpI16;
+ opFlags = InstDB::OpFlags::kImmI64 | InstDB::OpFlags::kImmI32 | InstDB::OpFlags::kImmI16;
else if (immValue <= 0x80000000u)
- immFlags = InstDB::kOpI64 | InstDB::kOpI32;
+ opFlags = InstDB::OpFlags::kImmI64 | InstDB::OpFlags::kImmI32;
else
- immFlags = InstDB::kOpI64;
+ opFlags = InstDB::OpFlags::kImmI64;
}
- opFlags |= immFlags;
break;
}
- case Operand::kOpLabel: {
- opFlags |= InstDB::kOpRel8 | InstDB::kOpRel32;
+ case OperandType::kLabel: {
+ opFlags |= InstDB::OpFlags::kRel8 | InstDB::OpFlags::kRel32;
break;
}
@@ -567,16 +537,14 @@ ASMJIT_FAVOR_SIZE Error InstInternal::validate(uint32_t arch, const BaseInst& in
}
InstDB::OpSignature& oSigDst = oSigTranslated[i];
- oSigDst.opFlags = opFlags;
- oSigDst.memFlags = uint16_t(memFlags);
- oSigDst.regMask = uint8_t(regMask & 0xFFu);
+ oSigDst._flags = uint64_t(opFlags) & 0x00FFFFFFFFFFFFFFu;
+ oSigDst._regMask = uint8_t(regMask & 0xFFu);
combinedOpFlags |= opFlags;
}
- // Decrease the number of operands of those that are none. This is important
- // as Assembler and Compiler may just pass more operands padded with none
- // (which means that no operand is given at that index). However, validate
- // that there are no gaps (like [reg, none, reg] or [none, reg]).
+ // Decrease the number of operands of those that are none. This is important as Assembler and Compiler may just pass
+ // more operands padded with none (which means that no operand is given at that index). However, validate that there
+ // are no gaps (like [reg, none, reg] or [none, reg]).
if (i < opCount) {
while (--opCount > i)
if (ASMJIT_UNLIKELY(!operands[opCount].isNone()))
@@ -584,22 +552,20 @@ ASMJIT_FAVOR_SIZE Error InstInternal::validate(uint32_t arch, const BaseInst& in
}
// Validate X86 and X64 specific cases.
- if (mode == InstDB::kModeX86) {
+ if (mode == InstDB::Mode::kX86) {
// Illegal use of 64-bit register in 32-bit mode.
- if (ASMJIT_UNLIKELY((combinedOpFlags & InstDB::kOpGpq) != 0))
+ if (ASMJIT_UNLIKELY(Support::test(combinedOpFlags, InstDB::OpFlags::kRegGpq)))
return DebugUtils::errored(kErrorInvalidUseOfGpq);
}
else {
// Illegal use of a high 8-bit register with REX prefix.
- bool hasREX = inst.hasOption(Inst::kOptionRex) ||
- ((combinedRegMask & 0xFFFFFF00u) != 0);
- if (ASMJIT_UNLIKELY(hasREX && (combinedOpFlags & InstDB::kOpGpbHi) != 0))
+ bool hasREX = inst.hasOption(InstOptions::kX86_Rex) || (combinedRegMask & 0xFFFFFF00u) != 0;
+ if (ASMJIT_UNLIKELY(hasREX && Support::test(combinedOpFlags, InstDB::OpFlags::kRegGpbHi)))
return DebugUtils::errored(kErrorInvalidUseOfGpbHi);
}
- // --------------------------------------------------------------------------
- // [Validate Instruction Signature by Comparing Against All `iSig` Rows]
- // --------------------------------------------------------------------------
+ // Validate Instruction Signature by Comparing Against All `iSig` Rows
+ // -------------------------------------------------------------------
const InstDB::InstSignature* iSig = InstDB::_instSignatureTable + commonInfo._iSignatureIndex;
const InstDB::InstSignature* iEnd = iSig + commonInfo._iSignatureCount;
@@ -613,28 +579,28 @@ ASMJIT_FAVOR_SIZE Error InstInternal::validate(uint32_t arch, const BaseInst& in
do {
// Check if the architecture is compatible.
- if ((iSig->modes & mode) == 0)
+ if (!iSig->supportsMode(mode))
continue;
// Compare the operands table with reference operands.
uint32_t j = 0;
- uint32_t iSigCount = iSig->opCount;
+ uint32_t iSigCount = iSig->opCount();
bool localImmOutOfRange = false;
if (iSigCount == opCount) {
for (j = 0; j < opCount; j++)
- if (!x86CheckOSig(oSigTranslated[j], opSignatureTable[iSig->operands[j]], localImmOutOfRange))
+ if (!x86CheckOSig(oSigTranslated[j], iSig->opSignature(j), localImmOutOfRange))
break;
}
- else if (iSigCount - iSig->implicit == opCount) {
+ else if (iSigCount - iSig->implicitOpCount() == opCount) {
uint32_t r = 0;
for (j = 0; j < opCount && r < iSigCount; j++, r++) {
const InstDB::OpSignature* oChk = oSigTranslated + j;
const InstDB::OpSignature* oRef;
Next:
- oRef = opSignatureTable + iSig->operands[r];
- // Skip implicit.
- if ((oRef->opFlags & InstDB::kOpImplicit) != 0) {
+ oRef = opSignatureTable + iSig->opSignatureIndex(r);
+ // Skip implicit operands.
+ if (oRef->isImplicit()) {
if (++r >= iSigCount)
break;
else
@@ -664,31 +630,27 @@ Next:
}
}
- // --------------------------------------------------------------------------
- // [Validate AVX512 Options]
- // --------------------------------------------------------------------------
+ // Validate AVX512 Options
+ // -----------------------
const RegOnly& extraReg = inst.extraReg();
- const uint32_t kAvx512Options = Inst::kOptionZMask |
- Inst::kOptionER |
- Inst::kOptionSAE ;
- if (options & kAvx512Options) {
- if (commonInfo.hasFlag(InstDB::kFlagEvex)) {
+ if (Support::test(options, kAvx512Options)) {
+ if (commonInfo.hasFlag(InstDB::InstFlags::kEvex)) {
// Validate AVX-512 {z}.
- if ((options & Inst::kOptionZMask)) {
- if (ASMJIT_UNLIKELY((options & Inst::kOptionZMask) != 0 && !commonInfo.hasAvx512Z()))
+ if (Support::test(options, InstOptions::kX86_ZMask)) {
+ if (ASMJIT_UNLIKELY(Support::test(options, InstOptions::kX86_ZMask) && !commonInfo.hasAvx512Z()))
return DebugUtils::errored(kErrorInvalidKZeroUse);
}
// Validate AVX-512 {sae} and {er}.
- if (options & (Inst::kOptionSAE | Inst::kOptionER)) {
+ if (Support::test(options, InstOptions::kX86_SAE | InstOptions::kX86_ER)) {
// Rounding control is impossible if the instruction is not reg-to-reg.
if (ASMJIT_UNLIKELY(memOp))
return DebugUtils::errored(kErrorInvalidEROrSAE);
// Check if {sae} or {er} is supported by the instruction.
- if (options & Inst::kOptionER) {
+ if (Support::test(options, InstOptions::kX86_ER)) {
// NOTE: if both {sae} and {er} are set, we don't care, as {sae} is implied.
if (ASMJIT_UNLIKELY(!commonInfo.hasAvx512ER()))
return DebugUtils::errored(kErrorInvalidEROrSAE);
@@ -698,16 +660,13 @@ Next:
return DebugUtils::errored(kErrorInvalidEROrSAE);
}
- // {sae} and {er} are defined for either scalar ops or vector ops that
- // require LL to be 10 (512-bit vector operations). We don't need any
- // more bits in the instruction database to be able to validate this, as
- // each AVX512 instruction that has broadcast is vector instruction (in
- // this case we require zmm registers), otherwise it's a scalar instruction,
- // which is valid.
+ // {sae} and {er} are defined for either scalar ops or vector ops that require LL to be 10 (512-bit vector
+ // operations). We don't need any more bits in the instruction database to be able to validate this, as
+ // each AVX512 instruction that has broadcast is vector instruction (in this case we require zmm registers),
+ // otherwise it's a scalar instruction, which is valid.
if (commonInfo.hasAvx512B()) {
- // Supports broadcast, thus we require LL to be '10', which means there
- // have to be ZMM registers used. We don't calculate LL here, but we know
- // that it would be '10' if there is at least one ZMM register used.
+ // Supports broadcast, thus we require LL to be '10', which means there have to be ZMM registers used. We
+ // don't calculate LL here, but we know that it would be '10' if there is at least one ZMM register used.
// There is no {er}/{sae}-enabled instruction with less than two operands.
ASMJIT_ASSERT(opCount >= 2);
@@ -717,21 +676,19 @@ Next:
}
}
else {
- // Not AVX512 instruction - maybe OpExtra is xCX register used by REP/REPNE
- // prefix. Otherwise the instruction is invalid.
- if ((options & kAvx512Options) || (options & kRepAny) == 0)
+ // Not an AVX512 instruction - maybe OpExtra is xCX register used by REP/REPNE prefix.
+ if (Support::test(options, kAvx512Options) || !Support::test(options, kRepAny))
return DebugUtils::errored(kErrorInvalidInstruction);
}
}
- // --------------------------------------------------------------------------
- // [Validate {Extra} Register]
- // --------------------------------------------------------------------------
+ // Validate {Extra} Register
+ // -------------------------
if (extraReg.isReg()) {
- if (options & kRepAny) {
+ if (Support::test(options, kRepAny)) {
// Validate REP|REPNE {cx|ecx|rcx}.
- if (ASMJIT_UNLIKELY(iFlags & InstDB::kFlagRepIgnored))
+ if (ASMJIT_UNLIKELY(Support::test(iFlags, InstDB::InstFlags::kRepIgnored)))
return DebugUtils::errored(kErrorInvalidExtraReg);
if (extraReg.isPhysReg()) {
@@ -745,9 +702,9 @@ Next:
if (ASMJIT_UNLIKELY(!memOp || extraReg.type() != memOp->baseType()))
return DebugUtils::errored(kErrorInvalidExtraReg);
}
- else if (commonInfo.hasFlag(InstDB::kFlagEvex)) {
+ else if (commonInfo.hasFlag(InstDB::InstFlags::kEvex)) {
// Validate AVX-512 {k}.
- if (ASMJIT_UNLIKELY(extraReg.type() != Reg::kTypeKReg))
+ if (ASMJIT_UNLIKELY(extraReg.type() != RegType::kX86_KReg))
return DebugUtils::errored(kErrorInvalidExtraReg);
if (ASMJIT_UNLIKELY(extraReg.id() == 0 || !commonInfo.hasAvx512K()))
@@ -762,12 +719,11 @@ Next:
}
#endif // !ASMJIT_NO_VALIDATION
-// ============================================================================
-// [asmjit::x86::InstInternal - QueryRWInfo]
-// ============================================================================
+// x86::InstInternal - QueryRWInfo
+// ===============================
#ifndef ASMJIT_NO_INTROSPECTION
-static const uint64_t rwRegGroupByteMask[Reg::kGroupCount] = {
+static const Support::Array<uint64_t, uint32_t(RegGroup::kMaxValue) + 1> rwRegGroupByteMask = {{
0x00000000000000FFu, // GP.
0xFFFFFFFFFFFFFFFFu, // XMM|YMM|ZMM.
0x00000000000000FFu, // MM.
@@ -778,75 +734,90 @@ static const uint64_t rwRegGroupByteMask[Reg::kGroupCount] = {
0x00000000000003FFu, // St().
0x000000000000FFFFu, // BND.
0x00000000000000FFu // RIP.
-};
+}};
-static ASMJIT_INLINE void rwZeroExtendGp(OpRWInfo& opRwInfo, const Gp& reg, uint32_t nativeGpSize) noexcept {
+static ASMJIT_FORCE_INLINE void rwZeroExtendGp(OpRWInfo& opRwInfo, const Gp& reg, uint32_t nativeGpSize) noexcept {
ASMJIT_ASSERT(BaseReg::isGp(reg.as<Operand>()));
if (reg.size() + 4 == nativeGpSize) {
- opRwInfo.addOpFlags(OpRWInfo::kZExt);
+ opRwInfo.addOpFlags(OpRWFlags::kZExt);
opRwInfo.setExtendByteMask(~opRwInfo.writeByteMask() & 0xFFu);
}
}
-static ASMJIT_INLINE void rwZeroExtendAvxVec(OpRWInfo& opRwInfo, const Vec& reg) noexcept {
+static ASMJIT_FORCE_INLINE void rwZeroExtendAvxVec(OpRWInfo& opRwInfo, const Vec& reg) noexcept {
DebugUtils::unused(reg);
uint64_t msk = ~Support::fillTrailingBits(opRwInfo.writeByteMask());
if (msk) {
- opRwInfo.addOpFlags(OpRWInfo::kZExt);
+ opRwInfo.addOpFlags(OpRWFlags::kZExt);
opRwInfo.setExtendByteMask(msk);
}
}
-static ASMJIT_INLINE void rwZeroExtendNonVec(OpRWInfo& opRwInfo, const Reg& reg) noexcept {
+static ASMJIT_FORCE_INLINE void rwZeroExtendNonVec(OpRWInfo& opRwInfo, const Reg& reg) noexcept {
uint64_t msk = ~Support::fillTrailingBits(opRwInfo.writeByteMask()) & rwRegGroupByteMask[reg.group()];
if (msk) {
- opRwInfo.addOpFlags(OpRWInfo::kZExt);
+ opRwInfo.addOpFlags(OpRWFlags::kZExt);
opRwInfo.setExtendByteMask(msk);
}
}
-Error InstInternal::queryRWInfo(uint32_t arch, const BaseInst& inst, const Operand_* operands, size_t opCount, InstRWInfo* out) noexcept {
- using namespace Status;
+static ASMJIT_FORCE_INLINE Error rwHandleAVX512(const BaseInst& inst, const InstDB::CommonInfo& commonInfo, InstRWInfo* out) noexcept {
+ if (inst.hasExtraReg() && inst.extraReg().type() == RegType::kX86_KReg && out->opCount() > 0) {
+ // AVX-512 instruction that uses a destination with {k} register (zeroing vs masking).
+ out->_extraReg.addOpFlags(OpRWFlags::kRead);
+ out->_extraReg.setReadByteMask(0xFF);
+ if (!inst.hasOption(InstOptions::kX86_ZMask) && !commonInfo.hasAvx512Flag(InstDB::Avx512Flags::kImplicitZ)) {
+ out->_operands[0].addOpFlags(OpRWFlags::kRead);
+ out->_operands[0]._readByteMask |= out->_operands[0]._writeByteMask;
+ }
+ }
+
+ return kErrorOk;
+}
+Error InstInternal::queryRWInfo(Arch arch, const BaseInst& inst, const Operand_* operands, size_t opCount, InstRWInfo* out) noexcept {
// Only called when `arch` matches X86 family.
ASMJIT_ASSERT(Environment::isFamilyX86(arch));
// Get the instruction data.
- uint32_t instId = inst.id();
+ InstId instId = inst.id();
if (ASMJIT_UNLIKELY(!Inst::isDefinedId(instId)))
return DebugUtils::errored(kErrorInvalidInstruction);
// Read/Write flags.
- const InstDB::CommonInfoTableB& tabB = InstDB::_commonInfoTableB[InstDB::_instInfoTable[instId]._commonInfoIndexB];
- const InstDB::RWFlagsInfoTable& rwFlags = InstDB::_rwFlagsInfoTable[tabB._rwFlagsIndex];
-
- // Each RWInfo contains two indexes
- // [0] - OpCount == 2
- // [1] - OpCount != 2
- // They are used this way as there are instructions that have 2 and 3
- // operand overloads that use different semantics. So instead of adding
- // more special cases we just separated their data tables.
- const InstDB::RWInfo& instRwInfo = InstDB::rwInfo[InstDB::rwInfoIndex[instId * 2u + uint32_t(opCount != 2)]];
+ const InstDB::InstInfo& instInfo = InstDB::_instInfoTable[instId];
+ const InstDB::CommonInfo& commonInfo = InstDB::_commonInfoTable[instInfo._commonInfoIndex];
+ const InstDB::AdditionalInfo& additionalInfo = InstDB::_additionalInfoTable[instInfo._additionalInfoIndex];
+ const InstDB::RWFlagsInfoTable& rwFlags = InstDB::_rwFlagsInfoTable[additionalInfo._rwFlagsIndex];
+
+ // There are two data tables, one for `opCount == 2` and the second for
+ // `opCount != 2`. There are two reasons for that:
+ // - There are instructions that share the same name that have both 2 or 3 operands, which have different
+ // RW information / semantics.
+ // - There must be 2 tables otherwise the lookup index won't fit into 8 bits (there is more than 256 records
+ // of combined rwInfo A and B).
+ const InstDB::RWInfo& instRwInfo = opCount == 2 ? InstDB::rwInfoA[InstDB::rwInfoIndexA[instId]]
+ : InstDB::rwInfoB[InstDB::rwInfoIndexB[instId]];
const InstDB::RWInfoRm& instRmInfo = InstDB::rwInfoRm[instRwInfo.rmInfo];
out->_instFlags = 0;
out->_opCount = uint8_t(opCount);
out->_rmFeature = instRmInfo.rmFeature;
out->_extraReg.reset();
- out->_readFlags = rwFlags.readFlags;
- out->_writeFlags = rwFlags.writeFlags;
+ out->_readFlags = CpuRWFlags(rwFlags.readFlags);
+ out->_writeFlags = CpuRWFlags(rwFlags.writeFlags);
uint32_t nativeGpSize = Environment::registerSizeFromArch(arch);
- constexpr uint32_t R = OpRWInfo::kRead;
- constexpr uint32_t W = OpRWInfo::kWrite;
- constexpr uint32_t X = OpRWInfo::kRW;
- constexpr uint32_t RegM = OpRWInfo::kRegMem;
- constexpr uint32_t RegPhys = OpRWInfo::kRegPhysId;
- constexpr uint32_t MibRead = OpRWInfo::kMemBaseRead | OpRWInfo::kMemIndexRead;
+ constexpr OpRWFlags R = OpRWFlags::kRead;
+ constexpr OpRWFlags W = OpRWFlags::kWrite;
+ constexpr OpRWFlags X = OpRWFlags::kRW;
+ constexpr OpRWFlags RegM = OpRWFlags::kRegMem;
+ constexpr OpRWFlags RegPhys = OpRWFlags::kRegPhysId;
+ constexpr OpRWFlags MibRead = OpRWFlags::kMemBaseRead | OpRWFlags::kMemIndexRead;
- if (ASMJIT_LIKELY(instRwInfo.category == InstDB::RWInfo::kCategoryGeneric)) {
+ if (instRwInfo.category == InstDB::RWInfo::kCategoryGeneric) {
uint32_t i;
uint32_t rmOpsMask = 0;
uint32_t rmMaxSize = 0;
@@ -861,7 +832,7 @@ Error InstInternal::queryRWInfo(uint32_t arch, const BaseInst& inst, const Opera
continue;
}
- op._opFlags = rwOpData.flags & ~(OpRWInfo::kZExt);
+ op._opFlags = rwOpData.flags & ~OpRWFlags::kZExt;
op._physId = rwOpData.physId;
op._rmSize = 0;
op._resetReserved();
@@ -875,6 +846,7 @@ Error InstInternal::queryRWInfo(uint32_t arch, const BaseInst& inst, const Opera
op._readByteMask = rByteMask;
op._writeByteMask = wByteMask;
op._extendByteMask = 0;
+ op._consecutiveLeadCount = rwOpData.consecutiveLeadCount;
if (srcOp.isReg()) {
// Zero extension.
@@ -885,7 +857,7 @@ Error InstInternal::queryRWInfo(uint32_t arch, const BaseInst& inst, const Opera
// - 32-bit writes ARE zero extended.
rwZeroExtendGp(op, srcOp.as<Gp>(), nativeGpSize);
}
- else if (rwOpData.flags & OpRWInfo::kZExt) {
+ else if (Support::test(rwOpData.flags, OpRWFlags::kZExt)) {
// Otherwise follow ZExt.
rwZeroExtendNonVec(op, srcOp.as<Gp>());
}
@@ -896,7 +868,13 @@ Error InstInternal::queryRWInfo(uint32_t arch, const BaseInst& inst, const Opera
rmOpsMask |= Support::bitMask<uint32_t>(i);
}
else {
- op.addOpFlags(MibRead);
+ const x86::Mem& memOp = srcOp.as<x86::Mem>();
+ // The RW flags of BASE+INDEX are either provided by the data, which means
+ // that the instruction is border-case, or they are deduced from the operand.
+ if (memOp.hasBaseReg() && !op.hasOpFlag(OpRWFlags::kMemBaseRW))
+ op.addOpFlags(OpRWFlags::kMemBaseRead);
+ if (memOp.hasIndexReg() && !op.hasOpFlag(OpRWFlags::kMemIndexRW))
+ op.addOpFlags(OpRWFlags::kMemIndexRead);
}
}
@@ -929,15 +907,14 @@ Error InstInternal::queryRWInfo(uint32_t arch, const BaseInst& inst, const Opera
} while (it.hasNext());
}
- return kErrorOk;
+ return rwHandleAVX512(inst, commonInfo, out);
}
switch (instRwInfo.category) {
case InstDB::RWInfo::kCategoryMov: {
- // Special case for 'movhpd' instruction. Here there are some variants that
- // we have to handle as mov can be used to move between GP, segment, control
- // and debug registers. Moving between GP registers also allow to use memory
- // operand.
+ // Special case for 'mov' instruction. Here there are some variants that we have to handle as 'mov' can be
+ // used to move between GP, segment, control and debug registers. Moving between GP registers also allow to
+ // use memory operand.
if (opCount == 2) {
if (operands[0].isReg() && operands[1].isReg()) {
@@ -969,14 +946,24 @@ Error InstInternal::queryRWInfo(uint32_t arch, const BaseInst& inst, const Opera
if (o0.isGp() && (o1.isCReg() || o1.isDReg())) {
out->_operands[0].reset(W, nativeGpSize);
out->_operands[1].reset(R, nativeGpSize);
- out->_writeFlags = kOF | kSF | kZF | kAF | kPF | kCF;
+ out->_writeFlags = CpuRWFlags::kX86_OF |
+ CpuRWFlags::kX86_SF |
+ CpuRWFlags::kX86_ZF |
+ CpuRWFlags::kX86_AF |
+ CpuRWFlags::kX86_PF |
+ CpuRWFlags::kX86_CF;
return kErrorOk;
}
if ((o0.isCReg() || o0.isDReg()) && o1.isGp()) {
out->_operands[0].reset(W, nativeGpSize);
out->_operands[1].reset(R, nativeGpSize);
- out->_writeFlags = kOF | kSF | kZF | kAF | kPF | kCF;
+ out->_writeFlags = CpuRWFlags::kX86_OF |
+ CpuRWFlags::kX86_SF |
+ CpuRWFlags::kX86_ZF |
+ CpuRWFlags::kX86_AF |
+ CpuRWFlags::kX86_PF |
+ CpuRWFlags::kX86_CF;
return kErrorOk;
}
}
@@ -1042,6 +1029,35 @@ Error InstInternal::queryRWInfo(uint32_t arch, const BaseInst& inst, const Opera
break;
}
+ case InstDB::RWInfo::kCategoryMovabs: {
+ if (opCount == 2) {
+ if (Reg::isGp(operands[0]) && operands[1].isMem()) {
+ const Reg& o0 = operands[0].as<Reg>();
+ out->_operands[0].reset(W | RegPhys, o0.size(), Gp::kIdAx);
+ out->_operands[1].reset(R | MibRead, o0.size());
+ rwZeroExtendGp(out->_operands[0], operands[0].as<Gp>(), nativeGpSize);
+ return kErrorOk;
+ }
+
+ if (operands[0].isMem() && Reg::isGp(operands[1])) {
+ const Reg& o1 = operands[1].as<Reg>();
+ out->_operands[0].reset(W | MibRead, o1.size());
+ out->_operands[1].reset(R | RegPhys, o1.size(), Gp::kIdAx);
+ return kErrorOk;
+ }
+
+ if (Reg::isGp(operands[0]) && operands[1].isImm()) {
+ const Reg& o0 = operands[0].as<Reg>();
+ out->_operands[0].reset(W, o0.size());
+ out->_operands[1].reset();
+
+ rwZeroExtendGp(out->_operands[0], operands[0].as<Gp>(), nativeGpSize);
+ return kErrorOk;
+ }
+ }
+ break;
+ }
+
case InstDB::RWInfo::kCategoryImul: {
// Special case for 'imul' instruction.
//
@@ -1105,9 +1121,8 @@ Error InstInternal::queryRWInfo(uint32_t arch, const BaseInst& inst, const Opera
}
case InstDB::RWInfo::kCategoryMovh64: {
- // Special case for 'movhpd|movhps' instructions. Note that this is only
- // required for legacy (non-AVX) variants as AVX instructions use either
- // 2 or 3 operands that are use `kCategoryGeneric`.
+ // Special case for 'movhpd|movhps' instructions. Note that this is only required for legacy (non-AVX)
+ // variants as AVX instructions use either 2 or 3 operands that are in `kCategoryGeneric` category.
if (opCount == 2) {
if (BaseReg::isVec(operands[0]) && operands[1].isMem()) {
out->_operands[0].reset(W, 8);
@@ -1126,6 +1141,46 @@ Error InstInternal::queryRWInfo(uint32_t arch, const BaseInst& inst, const Opera
break;
}
+ case InstDB::RWInfo::kCategoryPunpcklxx: {
+ // Special case for 'punpcklbw|punpckldq|punpcklwd' instructions.
+ if (opCount == 2) {
+ if (Reg::isXmm(operands[0])) {
+ out->_operands[0].reset(X, 16);
+ out->_operands[0].setReadByteMask(0x0F0Fu);
+ out->_operands[0].setWriteByteMask(0xFFFFu);
+ out->_operands[1].reset(R, 16);
+ out->_operands[1].setWriteByteMask(0x0F0Fu);
+
+ if (Reg::isXmm(operands[1])) {
+ return kErrorOk;
+ }
+
+ if (operands[1].isMem()) {
+ out->_operands[1].addOpFlags(MibRead);
+ return kErrorOk;
+ }
+ }
+
+ if (Reg::isMm(operands[0])) {
+ out->_operands[0].reset(X, 8);
+ out->_operands[0].setReadByteMask(0x0Fu);
+ out->_operands[0].setWriteByteMask(0xFFu);
+ out->_operands[1].reset(R, 4);
+ out->_operands[1].setReadByteMask(0x0Fu);
+
+ if (Reg::isMm(operands[1])) {
+ return kErrorOk;
+ }
+
+ if (operands[1].isMem()) {
+ out->_operands[1].addOpFlags(MibRead);
+ return kErrorOk;
+ }
+ }
+ }
+ break;
+ }
+
case InstDB::RWInfo::kCategoryVmaskmov: {
// Special case for 'vmaskmovpd|vmaskmovps|vpmaskmovd|vpmaskmovq' instructions.
if (opCount == 3) {
@@ -1149,9 +1204,8 @@ Error InstInternal::queryRWInfo(uint32_t arch, const BaseInst& inst, const Opera
}
case InstDB::RWInfo::kCategoryVmovddup: {
- // Special case for 'vmovddup' instruction. This instruction has an
- // interesting semantic as 128-bit XMM version only uses 64-bit memory
- // operand (m64), however, 256/512-bit versions use 256/512-bit memory
+ // Special case for 'vmovddup' instruction. This instruction has an interesting semantic as 128-bit XMM
+ // version only uses 64-bit memory operand (m64), however, 256/512-bit versions use 256/512-bit memory
// operand, respectively.
if (opCount == 2) {
if (BaseReg::isVec(operands[0]) && BaseReg::isVec(operands[1])) {
@@ -1163,7 +1217,7 @@ Error InstInternal::queryRWInfo(uint32_t arch, const BaseInst& inst, const Opera
out->_operands[1]._readByteMask &= 0x00FF00FF00FF00FFu;
rwZeroExtendAvxVec(out->_operands[0], operands[0].as<Vec>());
- return kErrorOk;
+ return rwHandleAVX512(inst, commonInfo, out);
}
if (BaseReg::isVec(operands[0]) && operands[1].isMem()) {
@@ -1174,7 +1228,7 @@ Error InstInternal::queryRWInfo(uint32_t arch, const BaseInst& inst, const Opera
out->_operands[1].reset(R | MibRead, o1Size);
rwZeroExtendAvxVec(out->_operands[0], operands[0].as<Vec>());
- return kErrorOk;
+ return rwHandleAVX512(inst, commonInfo, out);
}
}
break;
@@ -1248,7 +1302,7 @@ Error InstInternal::queryRWInfo(uint32_t arch, const BaseInst& inst, const Opera
if (BaseReg::isVec(operands[0]))
rwZeroExtendAvxVec(out->_operands[0], operands[0].as<Vec>());
- return kErrorOk;
+ return rwHandleAVX512(inst, commonInfo, out);
}
if (operands[0].isReg() && operands[1].isMem()) {
@@ -1266,7 +1320,8 @@ Error InstInternal::queryRWInfo(uint32_t arch, const BaseInst& inst, const Opera
out->_operands[0].reset(W | MibRead, size0);
out->_operands[1].reset(R, size1);
- return kErrorOk;
+
+ return rwHandleAVX512(inst, commonInfo, out);
}
}
break;
@@ -1317,12 +1372,14 @@ Error InstInternal::queryRWInfo(uint32_t arch, const BaseInst& inst, const Opera
out->_operands[1].addOpFlags(RegM);
out->_operands[1].setRmSize(size1);
}
- return kErrorOk;
+
+ return rwHandleAVX512(inst, commonInfo, out);
}
if (operands[0].isReg() && operands[1].isMem()) {
out->_operands[1].addOpFlags(MibRead);
- return kErrorOk;
+
+ return rwHandleAVX512(inst, commonInfo, out);
}
}
break;
@@ -1333,16 +1390,15 @@ Error InstInternal::queryRWInfo(uint32_t arch, const BaseInst& inst, const Opera
}
#endif // !ASMJIT_NO_INTROSPECTION
-// ============================================================================
-// [asmjit::x86::InstInternal - QueryFeatures]
-// ============================================================================
+// x86::InstInternal - QueryFeatures
+// =================================
#ifndef ASMJIT_NO_INTROSPECTION
struct RegAnalysis {
uint32_t regTypeMask;
uint32_t highVecUsed;
- inline bool hasRegType(uint32_t regType) const noexcept {
+ inline bool hasRegType(RegType regType) const noexcept {
return Support::bitTest(regTypeMask, regType);
}
};
@@ -1372,23 +1428,31 @@ static RegAnalysis InstInternal_regAnalysis(const Operand_* operands, size_t opC
return RegAnalysis { mask, highVecUsed };
}
-Error InstInternal::queryFeatures(uint32_t arch, const BaseInst& inst, const Operand_* operands, size_t opCount, BaseFeatures* out) noexcept {
+static inline uint32_t InstInternal_usesAvx512(InstOptions instOptions, const RegOnly& extraReg, const RegAnalysis& regAnalysis) noexcept {
+ uint32_t hasEvex = uint32_t(instOptions & (InstOptions::kX86_Evex | InstOptions::kX86_AVX512Mask));
+ uint32_t hasKMask = extraReg.type() == RegType::kX86_KReg;
+ uint32_t hasKOrZmm = regAnalysis.regTypeMask & Support::bitMask(RegType::kX86_Zmm, RegType::kX86_KReg);
+
+ return hasEvex | hasKMask | hasKOrZmm;
+}
+
+Error InstInternal::queryFeatures(Arch arch, const BaseInst& inst, const Operand_* operands, size_t opCount, CpuFeatures* out) noexcept {
// Only called when `arch` matches X86 family.
DebugUtils::unused(arch);
ASMJIT_ASSERT(Environment::isFamilyX86(arch));
// Get the instruction data.
- uint32_t instId = inst.id();
- uint32_t options = inst.options();
+ InstId instId = inst.id();
+ InstOptions options = inst.options();
if (ASMJIT_UNLIKELY(!Inst::isDefinedId(instId)))
return DebugUtils::errored(kErrorInvalidInstruction);
const InstDB::InstInfo& instInfo = InstDB::infoById(instId);
- const InstDB::CommonInfoTableB& tableB = InstDB::_commonInfoTableB[instInfo._commonInfoIndexB];
+ const InstDB::AdditionalInfo& additionalInfo = InstDB::_additionalInfoTable[instInfo._additionalInfoIndex];
- const uint8_t* fData = tableB.featuresBegin();
- const uint8_t* fEnd = tableB.featuresEnd();
+ const uint8_t* fData = additionalInfo.featuresBegin();
+ const uint8_t* fEnd = additionalInfo.featuresEnd();
// Copy all features to `out`.
out->reset();
@@ -1401,97 +1465,87 @@ Error InstInternal::queryFeatures(uint32_t arch, const BaseInst& inst, const Ope
// Since AsmJit aggregates instructions that share the same name we have to
// deal with some special cases and also with MMX/SSE and AVX/AVX2 overlaps.
- if (fData != tableB.featuresBegin()) {
+ if (fData != additionalInfo.featuresBegin()) {
RegAnalysis regAnalysis = InstInternal_regAnalysis(operands, opCount);
// Handle MMX vs SSE overlap.
- if (out->has(Features::kMMX) || out->has(Features::kMMX2)) {
- // Only instructions defined by SSE and SSE2 overlap. Instructions
- // introduced by newer instruction sets like SSE3+ don't state MMX as
- // they require SSE3+.
- if (out->has(Features::kSSE) || out->has(Features::kSSE2)) {
- if (!regAnalysis.hasRegType(Reg::kTypeXmm)) {
+ if (out->has(CpuFeatures::X86::kMMX) || out->has(CpuFeatures::X86::kMMX2)) {
+ // Only instructions defined by SSE and SSE2 overlap. Instructions introduced by newer instruction sets like
+ // SSE3+ don't state MMX as they require SSE3+.
+ if (out->has(CpuFeatures::X86::kSSE) || out->has(CpuFeatures::X86::kSSE2)) {
+ if (!regAnalysis.hasRegType(RegType::kX86_Xmm)) {
// The instruction doesn't use XMM register(s), thus it's MMX/MMX2 only.
- out->remove(Features::kSSE);
- out->remove(Features::kSSE2);
+ out->remove(CpuFeatures::X86::kSSE);
+ out->remove(CpuFeatures::X86::kSSE2);
+ out->remove(CpuFeatures::X86::kSSE4_1);
}
else {
- out->remove(Features::kMMX);
- out->remove(Features::kMMX2);
+ out->remove(CpuFeatures::X86::kMMX);
+ out->remove(CpuFeatures::X86::kMMX2);
}
- // Special case: PEXTRW instruction is MMX/SSE2 instruction. However,
- // MMX/SSE version cannot access memory (only register to register
- // extract) so when SSE4.1 introduced the whole family of PEXTR/PINSR
- // instructions they also introduced PEXTRW with a new opcode 0x15 that
- // can extract directly to memory. This instruction is, of course, not
- // compatible with MMX/SSE2 and would #UD if SSE4.1 is not supported.
+ // Special case: PEXTRW instruction is MMX/SSE2 instruction. However, MMX/SSE version cannot access memory
+ // (only register to register extract) so when SSE4.1 introduced the whole family of PEXTR/PINSR instructions
+ // they also introduced PEXTRW with a new opcode 0x15 that can extract directly to memory. This instruction
+ // is, of course, not compatible with MMX/SSE2 and would #UD if SSE4.1 is not supported.
if (instId == Inst::kIdPextrw) {
- ASMJIT_ASSERT(out->has(Features::kSSE2));
- ASMJIT_ASSERT(out->has(Features::kSSE4_1));
-
if (opCount >= 1 && operands[0].isMem())
- out->remove(Features::kSSE2);
+ out->remove(CpuFeatures::X86::kSSE2);
else
- out->remove(Features::kSSE4_1);
+ out->remove(CpuFeatures::X86::kSSE4_1);
}
}
}
// Handle PCLMULQDQ vs VPCLMULQDQ.
- if (out->has(Features::kVPCLMULQDQ)) {
- if (regAnalysis.hasRegType(Reg::kTypeZmm) || Support::bitTest(options, Inst::kOptionEvex)) {
+ if (out->has(CpuFeatures::X86::kVPCLMULQDQ)) {
+ if (regAnalysis.hasRegType(RegType::kX86_Zmm) || Support::test(options, InstOptions::kX86_Evex)) {
// AVX512_F & VPCLMULQDQ.
- out->remove(Features::kAVX, Features::kPCLMULQDQ);
+ out->remove(CpuFeatures::X86::kAVX, CpuFeatures::X86::kPCLMULQDQ);
}
- else if (regAnalysis.hasRegType(Reg::kTypeYmm)) {
- out->remove(Features::kAVX512_F, Features::kAVX512_VL);
+ else if (regAnalysis.hasRegType(RegType::kX86_Ymm)) {
+ out->remove(CpuFeatures::X86::kAVX512_F, CpuFeatures::X86::kAVX512_VL);
}
else {
// AVX & PCLMULQDQ.
- out->remove(Features::kAVX512_F, Features::kAVX512_VL, Features::kVPCLMULQDQ);
+ out->remove(CpuFeatures::X86::kAVX512_F, CpuFeatures::X86::kAVX512_VL, CpuFeatures::X86::kVPCLMULQDQ);
}
}
// Handle AVX vs AVX2 overlap.
- if (out->has(Features::kAVX) && out->has(Features::kAVX2)) {
+ if (out->has(CpuFeatures::X86::kAVX) && out->has(CpuFeatures::X86::kAVX2)) {
bool isAVX2 = true;
- // Special case: VBROADCASTSS and VBROADCASTSD were introduced in AVX, but
- // only version that uses memory as a source operand. AVX2 then added support
- // for register source operand.
+ // Special case: VBROADCASTSS and VBROADCASTSD were introduced in AVX, but only version that uses memory as a
+ // source operand. AVX2 then added support for register source operand.
if (instId == Inst::kIdVbroadcastss || instId == Inst::kIdVbroadcastsd) {
if (opCount > 1 && operands[1].isMem())
isAVX2 = false;
}
else {
- // AVX instruction set doesn't support integer operations on YMM registers
- // as these were later introcuced by AVX2. In our case we have to check if
- // YMM register(s) are in use and if that is the case this is an AVX2 instruction.
- if (!(regAnalysis.regTypeMask & Support::bitMask(Reg::kTypeYmm, Reg::kTypeZmm)))
+ // AVX instruction set doesn't support integer operations on YMM registers as these were later introcuced by
+ // AVX2. In our case we have to check if YMM register(s) are in use and if that is the case this is an AVX2
+ // instruction.
+ if (!(regAnalysis.regTypeMask & Support::bitMask(RegType::kX86_Ymm, RegType::kX86_Zmm)))
isAVX2 = false;
}
if (isAVX2)
- out->remove(Features::kAVX);
+ out->remove(CpuFeatures::X86::kAVX);
else
- out->remove(Features::kAVX2);
+ out->remove(CpuFeatures::X86::kAVX2);
}
// Handle AVX|AVX2|FMA|F16C vs AVX512 overlap.
- if (out->has(Features::kAVX) || out->has(Features::kAVX2) || out->has(Features::kFMA) || out->has(Features::kF16C)) {
+ if (out->has(CpuFeatures::X86::kAVX) || out->has(CpuFeatures::X86::kAVX2) || out->has(CpuFeatures::X86::kFMA) || out->has(CpuFeatures::X86::kF16C)) {
// Only AVX512-F|BW|DQ allow to encode AVX/AVX2/FMA/F16C instructions
- if (out->has(Features::kAVX512_F) || out->has(Features::kAVX512_BW) || out->has(Features::kAVX512_DQ)) {
- uint32_t hasEvex = options & (Inst::kOptionEvex | Inst::_kOptionAvx512Mask);
- uint32_t hasKMask = inst.extraReg().type() == Reg::kTypeKReg;
- uint32_t hasKOrZmm = regAnalysis.regTypeMask & Support::bitMask(Reg::kTypeZmm, Reg::kTypeKReg);
-
+ if (out->has(CpuFeatures::X86::kAVX512_F) || out->has(CpuFeatures::X86::kAVX512_BW) || out->has(CpuFeatures::X86::kAVX512_DQ)) {
+ uint32_t usesAvx512 = InstInternal_usesAvx512(options, inst.extraReg(), regAnalysis);
uint32_t mustUseEvex = 0;
switch (instId) {
- // Special case: VPSLLDQ and VPSRLDQ instructions only allow `reg, reg. imm`
- // combination in AVX|AVX2 mode, then AVX-512 introduced `reg, reg/mem, imm`
- // combination that uses EVEX prefix. This means that if the second operand
- // is memory then this is AVX-512_BW instruction and not AVX/AVX2 instruction.
+ // Special case: VPSLLDQ and VPSRLDQ instructions only allow `reg, reg. imm` combination in AVX|AVX2 mode,
+ // then AVX-512 introduced `reg, reg/mem, imm` combination that uses EVEX prefix. This means that if the
+ // second operand is memory then this is AVX-512_BW instruction and not AVX/AVX2 instruction.
case Inst::kIdVpslldq:
case Inst::kIdVpsrldq:
mustUseEvex = opCount >= 2 && operands[1].isMem();
@@ -1505,32 +1559,47 @@ Error InstInternal::queryFeatures(uint32_t arch, const BaseInst& inst, const Ope
mustUseEvex = opCount >= 2 && x86::Reg::isGp(operands[1]);
break;
- // Special case: VPERMPD only supports YMM predicate in AVX mode, immediate
- // precicate is only supported by AVX512-F and newer.
+ // Special case: VPERMPD - AVX2 vs AVX512-F case.
case Inst::kIdVpermpd:
mustUseEvex = opCount >= 3 && !operands[2].isImm();
break;
+
+ // Special case: VPERMQ - AVX2 vs AVX512-F case.
+ case Inst::kIdVpermq:
+ mustUseEvex = opCount >= 3 && (operands[1].isMem() || !operands[2].isImm());
+ break;
}
- if (!(hasEvex | mustUseEvex | hasKMask | hasKOrZmm | regAnalysis.highVecUsed))
- out->remove(Features::kAVX512_F, Features::kAVX512_BW, Features::kAVX512_DQ, Features::kAVX512_VL);
+ if (!(usesAvx512 | mustUseEvex | regAnalysis.highVecUsed))
+ out->remove(CpuFeatures::X86::kAVX512_F, CpuFeatures::X86::kAVX512_BW, CpuFeatures::X86::kAVX512_DQ, CpuFeatures::X86::kAVX512_VL);
else
- out->remove(Features::kAVX, Features::kAVX2, Features::kFMA, Features::kF16C);
+ out->remove(CpuFeatures::X86::kAVX, CpuFeatures::X86::kAVX2, CpuFeatures::X86::kFMA, CpuFeatures::X86::kF16C);
}
}
+ // Handle AVX_VNNI vs AVX512_VNNI overlap.
+ if (out->has(CpuFeatures::X86::kAVX512_VNNI)) {
+ // By default the AVX512_VNNI instruction should be used, because it was introduced first. However, VEX|VEX3
+ // prefix can be used to force AVX_VNNI instead.
+ uint32_t usesAvx512 = InstInternal_usesAvx512(options, inst.extraReg(), regAnalysis);
+
+ if (!usesAvx512 && Support::test(options, InstOptions::kX86_Vex | InstOptions::kX86_Vex3))
+ out->remove(CpuFeatures::X86::kAVX512_VNNI, CpuFeatures::X86::kAVX512_VL);
+ else
+ out->remove(CpuFeatures::X86::kAVX_VNNI);
+ }
+
// Clear AVX512_VL if ZMM register is used.
- if (regAnalysis.hasRegType(Reg::kTypeZmm))
- out->remove(Features::kAVX512_VL);
+ if (regAnalysis.hasRegType(RegType::kX86_Zmm))
+ out->remove(CpuFeatures::X86::kAVX512_VL);
}
return kErrorOk;
}
#endif // !ASMJIT_NO_INTROSPECTION
-// ============================================================================
-// [asmjit::x86::InstInternal - Unit]
-// ============================================================================
+// x86::InstInternal - Tests
+// =========================
#if defined(ASMJIT_TEST)
UNIT(x86_inst_api_text) {
@@ -1538,12 +1607,12 @@ UNIT(x86_inst_api_text) {
INFO("Matching all X86 instructions");
for (uint32_t a = 1; a < Inst::_kIdCount; a++) {
StringTmp<128> aName;
- EXPECT(InstInternal::instIdToString(0, a, aName) == kErrorOk,
+ EXPECT(InstInternal::instIdToString(Arch::kX86, a, aName) == kErrorOk,
"Failed to get the name of instruction #%u", a);
- uint32_t b = InstInternal::stringToInstId(0, aName.data(), aName.size());
+ uint32_t b = InstInternal::stringToInstId(Arch::kX86, aName.data(), aName.size());
StringTmp<128> bName;
- InstInternal::instIdToString(0, b, bName);
+ InstInternal::instIdToString(Arch::kX86, b, bName);
EXPECT(a == b,
"Instructions do not match \"%s\" (#%u) != \"%s\" (#%u)", aName.data(), a, bName.data(), b);
@@ -1553,4 +1622,4 @@ UNIT(x86_inst_api_text) {
ASMJIT_END_SUB_NAMESPACE
-#endif // ASMJIT_BUILD_X86
+#endif // !ASMJIT_NO_X86
diff --git a/3rdparty/asmjit/src/asmjit/x86/x86instapi_p.h b/3rdparty/asmjit/src/asmjit/x86/x86instapi_p.h
index 83b3f77cf6d..56f7fb928f2 100644
--- a/3rdparty/asmjit/src/asmjit/x86/x86instapi_p.h
+++ b/3rdparty/asmjit/src/asmjit/x86/x86instapi_p.h
@@ -1,25 +1,7 @@
-// AsmJit - Machine code generation for C++
+// This file is part of AsmJit project <https://asmjit.com>
//
-// * Official AsmJit Home Page: https://asmjit.com
-// * Official Github Repository: https://github.com/asmjit/asmjit
-//
-// Copyright (c) 2008-2020 The AsmJit Authors
-//
-// This software is provided 'as-is', without any express or implied
-// warranty. In no event will the authors be held liable for any damages
-// arising from the use of this software.
-//
-// Permission is granted to anyone to use this software for any purpose,
-// including commercial applications, and to alter it and redistribute it
-// freely, subject to the following restrictions:
-//
-// 1. The origin of this software must not be misrepresented; you must not
-// claim that you wrote the original software. If you use this software
-// in a product, an acknowledgment in the product documentation would be
-// appreciated but is not required.
-// 2. Altered source versions must be plainly marked as such, and must not be
-// misrepresented as being the original software.
-// 3. This notice may not be removed or altered from any source distribution.
+// See asmjit.h or LICENSE.md for license and copyright information
+// SPDX-License-Identifier: Zlib
#ifndef ASMJIT_X86_X86INSTAPI_P_H_INCLUDED
#define ASMJIT_X86_X86INSTAPI_P_H_INCLUDED
@@ -36,17 +18,17 @@ ASMJIT_BEGIN_SUB_NAMESPACE(x86)
namespace InstInternal {
#ifndef ASMJIT_NO_TEXT
-Error instIdToString(uint32_t arch, uint32_t instId, String& output) noexcept;
-uint32_t stringToInstId(uint32_t arch, const char* s, size_t len) noexcept;
+Error ASMJIT_CDECL instIdToString(Arch arch, InstId instId, String& output) noexcept;
+InstId ASMJIT_CDECL stringToInstId(Arch arch, const char* s, size_t len) noexcept;
#endif // !ASMJIT_NO_TEXT
#ifndef ASMJIT_NO_VALIDATION
-Error validate(uint32_t arch, const BaseInst& inst, const Operand_* operands, size_t opCount, uint32_t validationFlags) noexcept;
+Error ASMJIT_CDECL validate(Arch arch, const BaseInst& inst, const Operand_* operands, size_t opCount, ValidationFlags validationFlags) noexcept;
#endif // !ASMJIT_NO_VALIDATION
#ifndef ASMJIT_NO_INTROSPECTION
-Error queryRWInfo(uint32_t arch, const BaseInst& inst, const Operand_* operands, size_t opCount, InstRWInfo* out) noexcept;
-Error queryFeatures(uint32_t arch, const BaseInst& inst, const Operand_* operands, size_t opCount, BaseFeatures* out) noexcept;
+Error ASMJIT_CDECL queryRWInfo(Arch arch, const BaseInst& inst, const Operand_* operands, size_t opCount, InstRWInfo* out) noexcept;
+Error ASMJIT_CDECL queryFeatures(Arch arch, const BaseInst& inst, const Operand_* operands, size_t opCount, CpuFeatures* out) noexcept;
#endif // !ASMJIT_NO_INTROSPECTION
} // {InstInternal}
diff --git a/3rdparty/asmjit/src/asmjit/x86/x86instdb.cpp b/3rdparty/asmjit/src/asmjit/x86/x86instdb.cpp
index 72ad0989c26..3bf5d23ffd0 100644
--- a/3rdparty/asmjit/src/asmjit/x86/x86instdb.cpp
+++ b/3rdparty/asmjit/src/asmjit/x86/x86instdb.cpp
@@ -1,25 +1,7 @@
-// AsmJit - Machine code generation for C++
+// This file is part of AsmJit project <https://asmjit.com>
//
-// * Official AsmJit Home Page: https://asmjit.com
-// * Official Github Repository: https://github.com/asmjit/asmjit
-//
-// Copyright (c) 2008-2020 The AsmJit Authors
-//
-// This software is provided 'as-is', without any express or implied
-// warranty. In no event will the authors be held liable for any damages
-// arising from the use of this software.
-//
-// Permission is granted to anyone to use this software for any purpose,
-// including commercial applications, and to alter it and redistribute it
-// freely, subject to the following restrictions:
-//
-// 1. The origin of this software must not be misrepresented; you must not
-// claim that you wrote the original software. If you use this software
-// in a product, an acknowledgment in the product documentation would be
-// appreciated but is not required.
-// 2. Altered source versions must be plainly marked as such, and must not be
-// misrepresented as being the original software.
-// 3. This notice may not be removed or altered from any source distribution.
+// See asmjit.h or LICENSE.md for license and copyright information
+// SPDX-License-Identifier: Zlib
// ----------------------------------------------------------------------------
// IMPORTANT: AsmJit now uses an external instruction database to populate
@@ -40,48 +22,44 @@
// ----------------------------------------------------------------------------
#include "../core/api-build_p.h"
-#ifdef ASMJIT_BUILD_X86
+#if !defined(ASMJIT_NO_X86)
#include "../core/cpuinfo.h"
#include "../core/misc_p.h"
#include "../core/support.h"
-#include "../x86/x86features.h"
#include "../x86/x86instdb_p.h"
#include "../x86/x86opcode_p.h"
#include "../x86/x86operand.h"
ASMJIT_BEGIN_SUB_NAMESPACE(x86)
-// ============================================================================
-// [asmjit::x86::InstDB - InstInfo]
-// ============================================================================
+// x86::InstDB - InstInfo
+// ======================
// Instruction opcode definitions:
// - `O` encodes X86|MMX|SSE instructions.
// - `V` encodes VEX|XOP|EVEX instructions.
// - `E` encodes EVEX instructions only.
-#define O_ENCODE(VEX, PREFIX, OPCODE, O, L, W, EvexW, N, TT) \
- ((PREFIX) | (OPCODE) | (O) | (L) | (W) | (EvexW) | (N) | (TT) | \
- (VEX && ((PREFIX) & Opcode::kMM_Mask) != Opcode::kMM_0F ? int(Opcode::kMM_ForceVex3) : 0))
+#define O_ENCODE(PREFIX, OPCODE, O, L, W, EvexW, N, TT) ((PREFIX) | (OPCODE) | (O) | (L) | (W) | (EvexW) | (N) | (TT))
-#define O(PREFIX, OPCODE, O, LL, W, EvexW, N, TT) (O_ENCODE(0, Opcode::k##PREFIX, 0x##OPCODE, Opcode::kO_##O, Opcode::kLL_##LL, Opcode::kW_##W, Opcode::kEvex_W_##EvexW, Opcode::kCDSHL_##N, Opcode::kCDTT_##TT))
-#define V(PREFIX, OPCODE, O, LL, W, EvexW, N, TT) (O_ENCODE(1, Opcode::k##PREFIX, 0x##OPCODE, Opcode::kO_##O, Opcode::kLL_##LL, Opcode::kW_##W, Opcode::kEvex_W_##EvexW, Opcode::kCDSHL_##N, Opcode::kCDTT_##TT))
-#define E(PREFIX, OPCODE, O, LL, W, EvexW, N, TT) (O_ENCODE(1, Opcode::k##PREFIX, 0x##OPCODE, Opcode::kO_##O, Opcode::kLL_##LL, Opcode::kW_##W, Opcode::kEvex_W_##EvexW, Opcode::kCDSHL_##N, Opcode::kCDTT_##TT) | Opcode::kMM_ForceEvex)
-#define O_FPU(PREFIX, OPCODE, O) (Opcode::kFPU_##PREFIX | (0x##OPCODE & 0xFFu) | ((0x##OPCODE >> 8) << Opcode::kFPU_2B_Shift) | Opcode::kO_##O)
+#define O(PREFIX, OPCODE, ModO, LL, W, EvexW, N, ModRM) (O_ENCODE(Opcode::k##PREFIX, 0x##OPCODE, Opcode::kModO_##ModO, Opcode::kLL_##LL, Opcode::kW_##W, Opcode::kEvex_W_##EvexW, Opcode::kCDSHL_##N, Opcode::kModRM_##ModRM))
+#define V(PREFIX, OPCODE, ModO, LL, W, EvexW, N, TT) (O_ENCODE(Opcode::k##PREFIX, 0x##OPCODE, Opcode::kModO_##ModO, Opcode::kLL_##LL, Opcode::kW_##W, Opcode::kEvex_W_##EvexW, Opcode::kCDSHL_##N, Opcode::kCDTT_##TT))
+#define E(PREFIX, OPCODE, ModO, LL, W, EvexW, N, TT) (O_ENCODE(Opcode::k##PREFIX, 0x##OPCODE, Opcode::kModO_##ModO, Opcode::kLL_##LL, Opcode::kW_##W, Opcode::kEvex_W_##EvexW, Opcode::kCDSHL_##N, Opcode::kCDTT_##TT) | Opcode::kMM_ForceEvex)
+#define O_FPU(PREFIX, OPCODE, ModO) (Opcode::kFPU_##PREFIX | (0x##OPCODE & 0xFFu) | ((0x##OPCODE >> 8) << Opcode::kFPU_2B_Shift) | Opcode::kModO_##ModO)
// Don't store `_nameDataIndex` if instruction names are disabled. Since some
// APIs can use `_nameDataIndex` it's much safer if it's zero if it's not defined.
#ifndef ASMJIT_NO_TEXT
- #define NAME_DATA_INDEX(X) X
+ #define NAME_DATA_INDEX(Index) Index
#else
- #define NAME_DATA_INDEX(X) 0
+ #define NAME_DATA_INDEX(Index) 0
#endif
// Defines an X86 instruction.
-#define INST(id, encoding, opcode0, opcode1, mainOpcodeIndex, altOpcodeIndex, nameDataIndex, commomInfoIndexA, commomInfoIndexB) { \
+#define INST(id, encoding, opcode0, opcode1, mainOpcodeIndex, altOpcodeIndex, nameDataIndex, commomInfoIndex, additionalInfoIndex) { \
uint32_t(NAME_DATA_INDEX(nameDataIndex)), \
- uint32_t(commomInfoIndexA), \
- uint32_t(commomInfoIndexB), \
+ uint32_t(commomInfoIndex), \
+ uint32_t(additionalInfoIndex), \
uint8_t(InstDB::kEncoding##encoding), \
uint8_t((opcode0) & 0xFFu), \
uint8_t(mainOpcodeIndex), \
@@ -101,26 +79,26 @@ const InstDB::InstInfo InstDB::_instInfoTable[] = {
INST(Aas , X86Op_xAX , O(000000,3F,_,_,_,_,_,_ ), 0 , 0 , 0 , 13 , 1 , 1 ), // #4
INST(Adc , X86Arith , O(000000,10,2,_,x,_,_,_ ), 0 , 1 , 0 , 17 , 3 , 2 ), // #5
INST(Adcx , X86Rm , O(660F38,F6,_,_,x,_,_,_ ), 0 , 2 , 0 , 21 , 4 , 3 ), // #6
- INST(Add , X86Arith , O(000000,00,0,_,x,_,_,_ ), 0 , 0 , 0 , 761 , 3 , 1 ), // #7
- INST(Addpd , ExtRm , O(660F00,58,_,_,_,_,_,_ ), 0 , 3 , 0 , 4814 , 5 , 4 ), // #8
- INST(Addps , ExtRm , O(000F00,58,_,_,_,_,_,_ ), 0 , 4 , 0 , 4826 , 5 , 5 ), // #9
- INST(Addsd , ExtRm , O(F20F00,58,_,_,_,_,_,_ ), 0 , 5 , 0 , 5048 , 6 , 4 ), // #10
- INST(Addss , ExtRm , O(F30F00,58,_,_,_,_,_,_ ), 0 , 6 , 0 , 2955 , 7 , 5 ), // #11
- INST(Addsubpd , ExtRm , O(660F00,D0,_,_,_,_,_,_ ), 0 , 3 , 0 , 4553 , 5 , 6 ), // #12
- INST(Addsubps , ExtRm , O(F20F00,D0,_,_,_,_,_,_ ), 0 , 5 , 0 , 4565 , 5 , 6 ), // #13
+ INST(Add , X86Arith , O(000000,00,0,_,x,_,_,_ ), 0 , 0 , 0 , 3146 , 3 , 1 ), // #7
+ INST(Addpd , ExtRm , O(660F00,58,_,_,_,_,_,_ ), 0 , 3 , 0 , 5788 , 5 , 4 ), // #8
+ INST(Addps , ExtRm , O(000F00,58,_,_,_,_,_,_ ), 0 , 4 , 0 , 5800 , 5 , 5 ), // #9
+ INST(Addsd , ExtRm , O(F20F00,58,_,_,_,_,_,_ ), 0 , 5 , 0 , 6118 , 6 , 4 ), // #10
+ INST(Addss , ExtRm , O(F30F00,58,_,_,_,_,_,_ ), 0 , 6 , 0 , 3283 , 7 , 5 ), // #11
+ INST(Addsubpd , ExtRm , O(660F00,D0,_,_,_,_,_,_ ), 0 , 3 , 0 , 5410 , 5 , 6 ), // #12
+ INST(Addsubps , ExtRm , O(F20F00,D0,_,_,_,_,_,_ ), 0 , 5 , 0 , 5422 , 5 , 6 ), // #13
INST(Adox , X86Rm , O(F30F38,F6,_,_,x,_,_,_ ), 0 , 7 , 0 , 26 , 4 , 7 ), // #14
- INST(Aesdec , ExtRm , O(660F38,DE,_,_,_,_,_,_ ), 0 , 2 , 0 , 3010 , 5 , 8 ), // #15
- INST(Aesdeclast , ExtRm , O(660F38,DF,_,_,_,_,_,_ ), 0 , 2 , 0 , 3018 , 5 , 8 ), // #16
- INST(Aesenc , ExtRm , O(660F38,DC,_,_,_,_,_,_ ), 0 , 2 , 0 , 3030 , 5 , 8 ), // #17
- INST(Aesenclast , ExtRm , O(660F38,DD,_,_,_,_,_,_ ), 0 , 2 , 0 , 3038 , 5 , 8 ), // #18
- INST(Aesimc , ExtRm , O(660F38,DB,_,_,_,_,_,_ ), 0 , 2 , 0 , 3050 , 5 , 8 ), // #19
- INST(Aeskeygenassist , ExtRmi , O(660F3A,DF,_,_,_,_,_,_ ), 0 , 8 , 0 , 3058 , 8 , 8 ), // #20
- INST(And , X86Arith , O(000000,20,4,_,x,_,_,_ ), 0 , 9 , 0 , 2433 , 9 , 1 ), // #21
- INST(Andn , VexRvm_Wx , V(000F38,F2,_,0,x,_,_,_ ), 0 , 10 , 0 , 6494 , 10 , 9 ), // #22
- INST(Andnpd , ExtRm , O(660F00,55,_,_,_,_,_,_ ), 0 , 3 , 0 , 3091 , 5 , 4 ), // #23
- INST(Andnps , ExtRm , O(000F00,55,_,_,_,_,_,_ ), 0 , 4 , 0 , 3099 , 5 , 5 ), // #24
- INST(Andpd , ExtRm , O(660F00,54,_,_,_,_,_,_ ), 0 , 3 , 0 , 4067 , 11 , 4 ), // #25
- INST(Andps , ExtRm , O(000F00,54,_,_,_,_,_,_ ), 0 , 4 , 0 , 4077 , 11 , 5 ), // #26
+ INST(Aesdec , ExtRm , O(660F38,DE,_,_,_,_,_,_ ), 0 , 2 , 0 , 3352 , 5 , 8 ), // #15
+ INST(Aesdeclast , ExtRm , O(660F38,DF,_,_,_,_,_,_ ), 0 , 2 , 0 , 3360 , 5 , 8 ), // #16
+ INST(Aesenc , ExtRm , O(660F38,DC,_,_,_,_,_,_ ), 0 , 2 , 0 , 3372 , 5 , 8 ), // #17
+ INST(Aesenclast , ExtRm , O(660F38,DD,_,_,_,_,_,_ ), 0 , 2 , 0 , 3380 , 5 , 8 ), // #18
+ INST(Aesimc , ExtRm , O(660F38,DB,_,_,_,_,_,_ ), 0 , 2 , 0 , 3392 , 5 , 8 ), // #19
+ INST(Aeskeygenassist , ExtRmi , O(660F3A,DF,_,_,_,_,_,_ ), 0 , 8 , 0 , 3400 , 8 , 8 ), // #20
+ INST(And , X86Arith , O(000000,20,4,_,x,_,_,_ ), 0 , 9 , 0 , 2525 , 9 , 1 ), // #21
+ INST(Andn , VexRvm_Wx , V(000F38,F2,_,0,x,_,_,_ ), 0 , 10 , 0 , 7789 , 10 , 9 ), // #22
+ INST(Andnpd , ExtRm , O(660F00,55,_,_,_,_,_,_ ), 0 , 3 , 0 , 3433 , 5 , 4 ), // #23
+ INST(Andnps , ExtRm , O(000F00,55,_,_,_,_,_,_ ), 0 , 4 , 0 , 3441 , 5 , 5 ), // #24
+ INST(Andpd , ExtRm , O(660F00,54,_,_,_,_,_,_ ), 0 , 3 , 0 , 4745 , 11 , 4 ), // #25
+ INST(Andps , ExtRm , O(000F00,54,_,_,_,_,_,_ ), 0 , 4 , 0 , 4755 , 11 , 5 ), // #26
INST(Arpl , X86Mr_NoSize , O(000000,63,_,_,_,_,_,_ ), 0 , 0 , 0 , 31 , 12 , 10 ), // #27
INST(Bextr , VexRmv_Wx , V(000F38,F7,_,0,x,_,_,_ ), 0 , 10 , 0 , 36 , 13 , 9 ), // #28
INST(Blcfill , VexVm_Wx , V(XOP_M9,01,1,0,x,_,_,_ ), 0 , 11 , 0 , 42 , 14 , 11 ), // #29
@@ -128,10 +106,10 @@ const InstDB::InstInfo InstDB::_instInfoTable[] = {
INST(Blcic , VexVm_Wx , V(XOP_M9,01,5,0,x,_,_,_ ), 0 , 13 , 0 , 55 , 14 , 11 ), // #31
INST(Blcmsk , VexVm_Wx , V(XOP_M9,02,1,0,x,_,_,_ ), 0 , 11 , 0 , 61 , 14 , 11 ), // #32
INST(Blcs , VexVm_Wx , V(XOP_M9,01,3,0,x,_,_,_ ), 0 , 14 , 0 , 68 , 14 , 11 ), // #33
- INST(Blendpd , ExtRmi , O(660F3A,0D,_,_,_,_,_,_ ), 0 , 8 , 0 , 3177 , 8 , 12 ), // #34
- INST(Blendps , ExtRmi , O(660F3A,0C,_,_,_,_,_,_ ), 0 , 8 , 0 , 3186 , 8 , 12 ), // #35
- INST(Blendvpd , ExtRm_XMM0 , O(660F38,15,_,_,_,_,_,_ ), 0 , 2 , 0 , 3195 , 15 , 12 ), // #36
- INST(Blendvps , ExtRm_XMM0 , O(660F38,14,_,_,_,_,_,_ ), 0 , 2 , 0 , 3205 , 15 , 12 ), // #37
+ INST(Blendpd , ExtRmi , O(660F3A,0D,_,_,_,_,_,_ ), 0 , 8 , 0 , 3483 , 8 , 12 ), // #34
+ INST(Blendps , ExtRmi , O(660F3A,0C,_,_,_,_,_,_ ), 0 , 8 , 0 , 3492 , 8 , 12 ), // #35
+ INST(Blendvpd , ExtRm_XMM0 , O(660F38,15,_,_,_,_,_,_ ), 0 , 2 , 0 , 3501 , 15 , 12 ), // #36
+ INST(Blendvps , ExtRm_XMM0 , O(660F38,14,_,_,_,_,_,_ ), 0 , 2 , 0 , 3511 , 15 , 12 ), // #37
INST(Blsfill , VexVm_Wx , V(XOP_M9,01,2,0,x,_,_,_ ), 0 , 15 , 0 , 73 , 14 , 11 ), // #38
INST(Blsi , VexVm_Wx , V(000F38,F3,3,0,x,_,_,_ ), 0 , 16 , 0 , 81 , 14 , 9 ), // #39
INST(Blsic , VexVm_Wx , V(XOP_M9,01,6,0,x,_,_,_ ), 0 , 12 , 0 , 86 , 14 , 11 ), // #40
@@ -153,7 +131,7 @@ const InstDB::InstInfo InstDB::_instInfoTable[] = {
INST(Btr , X86Bt , O(000F00,B3,_,_,x,_,_,_ ), O(000F00,BA,6,_,x,_,_,_ ), 4 , 4 , 176 , 25 , 14 ), // #56
INST(Bts , X86Bt , O(000F00,AB,_,_,x,_,_,_ ), O(000F00,BA,5,_,x,_,_,_ ), 4 , 5 , 180 , 25 , 14 ), // #57
INST(Bzhi , VexRmv_Wx , V(000F38,F5,_,0,x,_,_,_ ), 0 , 10 , 0 , 184 , 13 , 15 ), // #58
- INST(Call , X86Call , O(000000,FF,2,_,_,_,_,_ ), 0 , 1 , 0 , 2848 , 26 , 1 ), // #59
+ INST(Call , X86Call , O(000000,FF,2,_,_,_,_,_ ), 0 , 1 , 0 , 3038 , 26 , 1 ), // #59
INST(Cbw , X86Op_xAX , O(660000,98,_,_,_,_,_,_ ), 0 , 19 , 0 , 189 , 27 , 0 ), // #60
INST(Cdq , X86Op_xDX_xAX , O(000000,99,_,_,_,_,_,_ ), 0 , 0 , 0 , 193 , 28 , 0 ), // #61
INST(Cdqe , X86Op_xAX , O(000000,98,_,_,1,_,_,_ ), 0 , 20 , 0 , 197 , 29 , 0 ), // #62
@@ -165,1673 +143,1852 @@ const InstDB::InstInfo InstDB::_instInfoTable[] = {
INST(Clflushopt , X86M_Only , O(660F00,AE,7,_,_,_,_,_ ), 0 , 23 , 0 , 232 , 31 , 21 ), // #68
INST(Clgi , X86Op , O(000F01,DD,_,_,_,_,_,_ ), 0 , 21 , 0 , 243 , 30 , 22 ), // #69
INST(Cli , X86Op , O(000000,FA,_,_,_,_,_,_ ), 0 , 0 , 0 , 248 , 30 , 23 ), // #70
- INST(Clts , X86Op , O(000F00,06,_,_,_,_,_,_ ), 0 , 4 , 0 , 252 , 30 , 0 ), // #71
- INST(Clwb , X86M_Only , O(660F00,AE,6,_,_,_,_,_ ), 0 , 24 , 0 , 257 , 31 , 24 ), // #72
- INST(Clzero , X86Op_MemZAX , O(000F01,FC,_,_,_,_,_,_ ), 0 , 21 , 0 , 262 , 32 , 25 ), // #73
- INST(Cmc , X86Op , O(000000,F5,_,_,_,_,_,_ ), 0 , 0 , 0 , 269 , 30 , 26 ), // #74
- INST(Cmova , X86Rm , O(000F00,47,_,_,x,_,_,_ ), 0 , 4 , 0 , 273 , 22 , 27 ), // #75
- INST(Cmovae , X86Rm , O(000F00,43,_,_,x,_,_,_ ), 0 , 4 , 0 , 279 , 22 , 28 ), // #76
- INST(Cmovb , X86Rm , O(000F00,42,_,_,x,_,_,_ ), 0 , 4 , 0 , 618 , 22 , 28 ), // #77
- INST(Cmovbe , X86Rm , O(000F00,46,_,_,x,_,_,_ ), 0 , 4 , 0 , 625 , 22 , 27 ), // #78
- INST(Cmovc , X86Rm , O(000F00,42,_,_,x,_,_,_ ), 0 , 4 , 0 , 286 , 22 , 28 ), // #79
- INST(Cmove , X86Rm , O(000F00,44,_,_,x,_,_,_ ), 0 , 4 , 0 , 633 , 22 , 29 ), // #80
- INST(Cmovg , X86Rm , O(000F00,4F,_,_,x,_,_,_ ), 0 , 4 , 0 , 292 , 22 , 30 ), // #81
- INST(Cmovge , X86Rm , O(000F00,4D,_,_,x,_,_,_ ), 0 , 4 , 0 , 298 , 22 , 31 ), // #82
- INST(Cmovl , X86Rm , O(000F00,4C,_,_,x,_,_,_ ), 0 , 4 , 0 , 305 , 22 , 31 ), // #83
- INST(Cmovle , X86Rm , O(000F00,4E,_,_,x,_,_,_ ), 0 , 4 , 0 , 311 , 22 , 30 ), // #84
- INST(Cmovna , X86Rm , O(000F00,46,_,_,x,_,_,_ ), 0 , 4 , 0 , 318 , 22 , 27 ), // #85
- INST(Cmovnae , X86Rm , O(000F00,42,_,_,x,_,_,_ ), 0 , 4 , 0 , 325 , 22 , 28 ), // #86
- INST(Cmovnb , X86Rm , O(000F00,43,_,_,x,_,_,_ ), 0 , 4 , 0 , 640 , 22 , 28 ), // #87
- INST(Cmovnbe , X86Rm , O(000F00,47,_,_,x,_,_,_ ), 0 , 4 , 0 , 648 , 22 , 27 ), // #88
- INST(Cmovnc , X86Rm , O(000F00,43,_,_,x,_,_,_ ), 0 , 4 , 0 , 333 , 22 , 28 ), // #89
- INST(Cmovne , X86Rm , O(000F00,45,_,_,x,_,_,_ ), 0 , 4 , 0 , 657 , 22 , 29 ), // #90
- INST(Cmovng , X86Rm , O(000F00,4E,_,_,x,_,_,_ ), 0 , 4 , 0 , 340 , 22 , 30 ), // #91
- INST(Cmovnge , X86Rm , O(000F00,4C,_,_,x,_,_,_ ), 0 , 4 , 0 , 347 , 22 , 31 ), // #92
- INST(Cmovnl , X86Rm , O(000F00,4D,_,_,x,_,_,_ ), 0 , 4 , 0 , 355 , 22 , 31 ), // #93
- INST(Cmovnle , X86Rm , O(000F00,4F,_,_,x,_,_,_ ), 0 , 4 , 0 , 362 , 22 , 30 ), // #94
- INST(Cmovno , X86Rm , O(000F00,41,_,_,x,_,_,_ ), 0 , 4 , 0 , 370 , 22 , 32 ), // #95
- INST(Cmovnp , X86Rm , O(000F00,4B,_,_,x,_,_,_ ), 0 , 4 , 0 , 377 , 22 , 33 ), // #96
- INST(Cmovns , X86Rm , O(000F00,49,_,_,x,_,_,_ ), 0 , 4 , 0 , 384 , 22 , 34 ), // #97
- INST(Cmovnz , X86Rm , O(000F00,45,_,_,x,_,_,_ ), 0 , 4 , 0 , 391 , 22 , 29 ), // #98
- INST(Cmovo , X86Rm , O(000F00,40,_,_,x,_,_,_ ), 0 , 4 , 0 , 398 , 22 , 32 ), // #99
- INST(Cmovp , X86Rm , O(000F00,4A,_,_,x,_,_,_ ), 0 , 4 , 0 , 404 , 22 , 33 ), // #100
- INST(Cmovpe , X86Rm , O(000F00,4A,_,_,x,_,_,_ ), 0 , 4 , 0 , 410 , 22 , 33 ), // #101
- INST(Cmovpo , X86Rm , O(000F00,4B,_,_,x,_,_,_ ), 0 , 4 , 0 , 417 , 22 , 33 ), // #102
- INST(Cmovs , X86Rm , O(000F00,48,_,_,x,_,_,_ ), 0 , 4 , 0 , 424 , 22 , 34 ), // #103
- INST(Cmovz , X86Rm , O(000F00,44,_,_,x,_,_,_ ), 0 , 4 , 0 , 430 , 22 , 29 ), // #104
- INST(Cmp , X86Arith , O(000000,38,7,_,x,_,_,_ ), 0 , 25 , 0 , 436 , 33 , 1 ), // #105
- INST(Cmppd , ExtRmi , O(660F00,C2,_,_,_,_,_,_ ), 0 , 3 , 0 , 3431 , 8 , 4 ), // #106
- INST(Cmpps , ExtRmi , O(000F00,C2,_,_,_,_,_,_ ), 0 , 4 , 0 , 3438 , 8 , 5 ), // #107
- INST(Cmps , X86StrMm , O(000000,A6,_,_,_,_,_,_ ), 0 , 0 , 0 , 440 , 34 , 35 ), // #108
- INST(Cmpsd , ExtRmi , O(F20F00,C2,_,_,_,_,_,_ ), 0 , 5 , 0 , 3445 , 35 , 4 ), // #109
- INST(Cmpss , ExtRmi , O(F30F00,C2,_,_,_,_,_,_ ), 0 , 6 , 0 , 3452 , 36 , 5 ), // #110
- INST(Cmpxchg , X86Cmpxchg , O(000F00,B0,_,_,x,_,_,_ ), 0 , 4 , 0 , 445 , 37 , 36 ), // #111
- INST(Cmpxchg16b , X86Cmpxchg8b_16b , O(000F00,C7,1,_,1,_,_,_ ), 0 , 26 , 0 , 453 , 38 , 37 ), // #112
- INST(Cmpxchg8b , X86Cmpxchg8b_16b , O(000F00,C7,1,_,_,_,_,_ ), 0 , 27 , 0 , 464 , 39 , 38 ), // #113
- INST(Comisd , ExtRm , O(660F00,2F,_,_,_,_,_,_ ), 0 , 3 , 0 , 9930 , 6 , 39 ), // #114
- INST(Comiss , ExtRm , O(000F00,2F,_,_,_,_,_,_ ), 0 , 4 , 0 , 9939 , 7 , 40 ), // #115
- INST(Cpuid , X86Op , O(000F00,A2,_,_,_,_,_,_ ), 0 , 4 , 0 , 474 , 40 , 41 ), // #116
- INST(Cqo , X86Op_xDX_xAX , O(000000,99,_,_,1,_,_,_ ), 0 , 20 , 0 , 480 , 41 , 0 ), // #117
- INST(Crc32 , X86Crc , O(F20F38,F0,_,_,x,_,_,_ ), 0 , 28 , 0 , 484 , 42 , 42 ), // #118
- INST(Cvtdq2pd , ExtRm , O(F30F00,E6,_,_,_,_,_,_ ), 0 , 6 , 0 , 3499 , 6 , 4 ), // #119
- INST(Cvtdq2ps , ExtRm , O(000F00,5B,_,_,_,_,_,_ ), 0 , 4 , 0 , 3509 , 5 , 4 ), // #120
- INST(Cvtpd2dq , ExtRm , O(F20F00,E6,_,_,_,_,_,_ ), 0 , 5 , 0 , 3548 , 5 , 4 ), // #121
- INST(Cvtpd2pi , ExtRm , O(660F00,2D,_,_,_,_,_,_ ), 0 , 3 , 0 , 490 , 43 , 4 ), // #122
- INST(Cvtpd2ps , ExtRm , O(660F00,5A,_,_,_,_,_,_ ), 0 , 3 , 0 , 3558 , 5 , 4 ), // #123
- INST(Cvtpi2pd , ExtRm , O(660F00,2A,_,_,_,_,_,_ ), 0 , 3 , 0 , 499 , 44 , 4 ), // #124
- INST(Cvtpi2ps , ExtRm , O(000F00,2A,_,_,_,_,_,_ ), 0 , 4 , 0 , 508 , 44 , 5 ), // #125
- INST(Cvtps2dq , ExtRm , O(660F00,5B,_,_,_,_,_,_ ), 0 , 3 , 0 , 3610 , 5 , 4 ), // #126
- INST(Cvtps2pd , ExtRm , O(000F00,5A,_,_,_,_,_,_ ), 0 , 4 , 0 , 3620 , 6 , 4 ), // #127
- INST(Cvtps2pi , ExtRm , O(000F00,2D,_,_,_,_,_,_ ), 0 , 4 , 0 , 517 , 45 , 5 ), // #128
- INST(Cvtsd2si , ExtRm_Wx , O(F20F00,2D,_,_,x,_,_,_ ), 0 , 5 , 0 , 3692 , 46 , 4 ), // #129
- INST(Cvtsd2ss , ExtRm , O(F20F00,5A,_,_,_,_,_,_ ), 0 , 5 , 0 , 3702 , 6 , 4 ), // #130
- INST(Cvtsi2sd , ExtRm_Wx , O(F20F00,2A,_,_,x,_,_,_ ), 0 , 5 , 0 , 3723 , 47 , 4 ), // #131
- INST(Cvtsi2ss , ExtRm_Wx , O(F30F00,2A,_,_,x,_,_,_ ), 0 , 6 , 0 , 3733 , 47 , 5 ), // #132
- INST(Cvtss2sd , ExtRm , O(F30F00,5A,_,_,_,_,_,_ ), 0 , 6 , 0 , 3743 , 7 , 4 ), // #133
- INST(Cvtss2si , ExtRm_Wx , O(F30F00,2D,_,_,x,_,_,_ ), 0 , 6 , 0 , 3753 , 48 , 5 ), // #134
- INST(Cvttpd2dq , ExtRm , O(660F00,E6,_,_,_,_,_,_ ), 0 , 3 , 0 , 3774 , 5 , 4 ), // #135
- INST(Cvttpd2pi , ExtRm , O(660F00,2C,_,_,_,_,_,_ ), 0 , 3 , 0 , 526 , 43 , 4 ), // #136
- INST(Cvttps2dq , ExtRm , O(F30F00,5B,_,_,_,_,_,_ ), 0 , 6 , 0 , 3820 , 5 , 4 ), // #137
- INST(Cvttps2pi , ExtRm , O(000F00,2C,_,_,_,_,_,_ ), 0 , 4 , 0 , 536 , 45 , 5 ), // #138
- INST(Cvttsd2si , ExtRm_Wx , O(F20F00,2C,_,_,x,_,_,_ ), 0 , 5 , 0 , 3866 , 46 , 4 ), // #139
- INST(Cvttss2si , ExtRm_Wx , O(F30F00,2C,_,_,x,_,_,_ ), 0 , 6 , 0 , 3889 , 48 , 5 ), // #140
- INST(Cwd , X86Op_xDX_xAX , O(660000,99,_,_,_,_,_,_ ), 0 , 19 , 0 , 546 , 49 , 0 ), // #141
- INST(Cwde , X86Op_xAX , O(000000,98,_,_,_,_,_,_ ), 0 , 0 , 0 , 550 , 50 , 0 ), // #142
- INST(Daa , X86Op , O(000000,27,_,_,_,_,_,_ ), 0 , 0 , 0 , 555 , 1 , 1 ), // #143
- INST(Das , X86Op , O(000000,2F,_,_,_,_,_,_ ), 0 , 0 , 0 , 559 , 1 , 1 ), // #144
- INST(Dec , X86IncDec , O(000000,FE,1,_,x,_,_,_ ), O(000000,48,_,_,x,_,_,_ ), 29 , 6 , 3013 , 51 , 43 ), // #145
- INST(Div , X86M_GPB_MulDiv , O(000000,F6,6,_,x,_,_,_ ), 0 , 30 , 0 , 780 , 52 , 1 ), // #146
- INST(Divpd , ExtRm , O(660F00,5E,_,_,_,_,_,_ ), 0 , 3 , 0 , 3988 , 5 , 4 ), // #147
- INST(Divps , ExtRm , O(000F00,5E,_,_,_,_,_,_ ), 0 , 4 , 0 , 3995 , 5 , 5 ), // #148
- INST(Divsd , ExtRm , O(F20F00,5E,_,_,_,_,_,_ ), 0 , 5 , 0 , 4002 , 6 , 4 ), // #149
- INST(Divss , ExtRm , O(F30F00,5E,_,_,_,_,_,_ ), 0 , 6 , 0 , 4009 , 7 , 5 ), // #150
- INST(Dppd , ExtRmi , O(660F3A,41,_,_,_,_,_,_ ), 0 , 8 , 0 , 4026 , 8 , 12 ), // #151
- INST(Dpps , ExtRmi , O(660F3A,40,_,_,_,_,_,_ ), 0 , 8 , 0 , 4032 , 8 , 12 ), // #152
- INST(Emms , X86Op , O(000F00,77,_,_,_,_,_,_ ), 0 , 4 , 0 , 748 , 53 , 44 ), // #153
- INST(Enqcmd , X86EnqcmdMovdir64b , O(F20F38,F8,_,_,_,_,_,_ ), 0 , 28 , 0 , 563 , 54 , 45 ), // #154
- INST(Enqcmds , X86EnqcmdMovdir64b , O(F30F38,F8,_,_,_,_,_,_ ), 0 , 7 , 0 , 570 , 54 , 45 ), // #155
- INST(Enter , X86Enter , O(000000,C8,_,_,_,_,_,_ ), 0 , 0 , 0 , 2856 , 55 , 0 ), // #156
- INST(Extractps , ExtExtract , O(660F3A,17,_,_,_,_,_,_ ), 0 , 8 , 0 , 4222 , 56 , 12 ), // #157
- INST(Extrq , ExtExtrq , O(660F00,79,_,_,_,_,_,_ ), O(660F00,78,0,_,_,_,_,_ ), 3 , 7 , 7290 , 57 , 46 ), // #158
- INST(F2xm1 , FpuOp , O_FPU(00,D9F0,_) , 0 , 31 , 0 , 578 , 30 , 0 ), // #159
- INST(Fabs , FpuOp , O_FPU(00,D9E1,_) , 0 , 31 , 0 , 584 , 30 , 0 ), // #160
- INST(Fadd , FpuArith , O_FPU(00,C0C0,0) , 0 , 32 , 0 , 2067 , 58 , 0 ), // #161
- INST(Faddp , FpuRDef , O_FPU(00,DEC0,_) , 0 , 33 , 0 , 589 , 59 , 0 ), // #162
- INST(Fbld , X86M_Only , O_FPU(00,00DF,4) , 0 , 34 , 0 , 595 , 60 , 0 ), // #163
- INST(Fbstp , X86M_Only , O_FPU(00,00DF,6) , 0 , 35 , 0 , 600 , 60 , 0 ), // #164
- INST(Fchs , FpuOp , O_FPU(00,D9E0,_) , 0 , 31 , 0 , 606 , 30 , 0 ), // #165
- INST(Fclex , FpuOp , O_FPU(9B,DBE2,_) , 0 , 36 , 0 , 611 , 30 , 0 ), // #166
- INST(Fcmovb , FpuR , O_FPU(00,DAC0,_) , 0 , 37 , 0 , 617 , 61 , 28 ), // #167
- INST(Fcmovbe , FpuR , O_FPU(00,DAD0,_) , 0 , 37 , 0 , 624 , 61 , 27 ), // #168
- INST(Fcmove , FpuR , O_FPU(00,DAC8,_) , 0 , 37 , 0 , 632 , 61 , 29 ), // #169
- INST(Fcmovnb , FpuR , O_FPU(00,DBC0,_) , 0 , 38 , 0 , 639 , 61 , 28 ), // #170
- INST(Fcmovnbe , FpuR , O_FPU(00,DBD0,_) , 0 , 38 , 0 , 647 , 61 , 27 ), // #171
- INST(Fcmovne , FpuR , O_FPU(00,DBC8,_) , 0 , 38 , 0 , 656 , 61 , 29 ), // #172
- INST(Fcmovnu , FpuR , O_FPU(00,DBD8,_) , 0 , 38 , 0 , 664 , 61 , 33 ), // #173
- INST(Fcmovu , FpuR , O_FPU(00,DAD8,_) , 0 , 37 , 0 , 672 , 61 , 33 ), // #174
- INST(Fcom , FpuCom , O_FPU(00,D0D0,2) , 0 , 39 , 0 , 679 , 62 , 0 ), // #175
- INST(Fcomi , FpuR , O_FPU(00,DBF0,_) , 0 , 38 , 0 , 684 , 61 , 47 ), // #176
- INST(Fcomip , FpuR , O_FPU(00,DFF0,_) , 0 , 40 , 0 , 690 , 61 , 47 ), // #177
- INST(Fcomp , FpuCom , O_FPU(00,D8D8,3) , 0 , 41 , 0 , 697 , 62 , 0 ), // #178
- INST(Fcompp , FpuOp , O_FPU(00,DED9,_) , 0 , 33 , 0 , 703 , 30 , 0 ), // #179
- INST(Fcos , FpuOp , O_FPU(00,D9FF,_) , 0 , 31 , 0 , 710 , 30 , 0 ), // #180
- INST(Fdecstp , FpuOp , O_FPU(00,D9F6,_) , 0 , 31 , 0 , 715 , 30 , 0 ), // #181
- INST(Fdiv , FpuArith , O_FPU(00,F0F8,6) , 0 , 42 , 0 , 723 , 58 , 0 ), // #182
- INST(Fdivp , FpuRDef , O_FPU(00,DEF8,_) , 0 , 33 , 0 , 728 , 59 , 0 ), // #183
- INST(Fdivr , FpuArith , O_FPU(00,F8F0,7) , 0 , 43 , 0 , 734 , 58 , 0 ), // #184
- INST(Fdivrp , FpuRDef , O_FPU(00,DEF0,_) , 0 , 33 , 0 , 740 , 59 , 0 ), // #185
- INST(Femms , X86Op , O(000F00,0E,_,_,_,_,_,_ ), 0 , 4 , 0 , 747 , 30 , 48 ), // #186
- INST(Ffree , FpuR , O_FPU(00,DDC0,_) , 0 , 44 , 0 , 753 , 61 , 0 ), // #187
- INST(Fiadd , FpuM , O_FPU(00,00DA,0) , 0 , 45 , 0 , 759 , 63 , 0 ), // #188
- INST(Ficom , FpuM , O_FPU(00,00DA,2) , 0 , 46 , 0 , 765 , 63 , 0 ), // #189
- INST(Ficomp , FpuM , O_FPU(00,00DA,3) , 0 , 47 , 0 , 771 , 63 , 0 ), // #190
- INST(Fidiv , FpuM , O_FPU(00,00DA,6) , 0 , 35 , 0 , 778 , 63 , 0 ), // #191
- INST(Fidivr , FpuM , O_FPU(00,00DA,7) , 0 , 48 , 0 , 784 , 63 , 0 ), // #192
- INST(Fild , FpuM , O_FPU(00,00DB,0) , O_FPU(00,00DF,5) , 45 , 8 , 791 , 64 , 0 ), // #193
- INST(Fimul , FpuM , O_FPU(00,00DA,1) , 0 , 49 , 0 , 796 , 63 , 0 ), // #194
- INST(Fincstp , FpuOp , O_FPU(00,D9F7,_) , 0 , 31 , 0 , 802 , 30 , 0 ), // #195
- INST(Finit , FpuOp , O_FPU(9B,DBE3,_) , 0 , 36 , 0 , 810 , 30 , 0 ), // #196
- INST(Fist , FpuM , O_FPU(00,00DB,2) , 0 , 46 , 0 , 816 , 63 , 0 ), // #197
- INST(Fistp , FpuM , O_FPU(00,00DB,3) , O_FPU(00,00DF,7) , 47 , 9 , 821 , 64 , 0 ), // #198
- INST(Fisttp , FpuM , O_FPU(00,00DB,1) , O_FPU(00,00DD,1) , 49 , 10 , 827 , 64 , 6 ), // #199
- INST(Fisub , FpuM , O_FPU(00,00DA,4) , 0 , 34 , 0 , 834 , 63 , 0 ), // #200
- INST(Fisubr , FpuM , O_FPU(00,00DA,5) , 0 , 50 , 0 , 840 , 63 , 0 ), // #201
- INST(Fld , FpuFldFst , O_FPU(00,00D9,0) , O_FPU(00,00DB,5) , 45 , 11 , 847 , 65 , 0 ), // #202
- INST(Fld1 , FpuOp , O_FPU(00,D9E8,_) , 0 , 31 , 0 , 851 , 30 , 0 ), // #203
- INST(Fldcw , X86M_Only , O_FPU(00,00D9,5) , 0 , 50 , 0 , 856 , 66 , 0 ), // #204
- INST(Fldenv , X86M_Only , O_FPU(00,00D9,4) , 0 , 34 , 0 , 862 , 31 , 0 ), // #205
- INST(Fldl2e , FpuOp , O_FPU(00,D9EA,_) , 0 , 31 , 0 , 869 , 30 , 0 ), // #206
- INST(Fldl2t , FpuOp , O_FPU(00,D9E9,_) , 0 , 31 , 0 , 876 , 30 , 0 ), // #207
- INST(Fldlg2 , FpuOp , O_FPU(00,D9EC,_) , 0 , 31 , 0 , 883 , 30 , 0 ), // #208
- INST(Fldln2 , FpuOp , O_FPU(00,D9ED,_) , 0 , 31 , 0 , 890 , 30 , 0 ), // #209
- INST(Fldpi , FpuOp , O_FPU(00,D9EB,_) , 0 , 31 , 0 , 897 , 30 , 0 ), // #210
- INST(Fldz , FpuOp , O_FPU(00,D9EE,_) , 0 , 31 , 0 , 903 , 30 , 0 ), // #211
- INST(Fmul , FpuArith , O_FPU(00,C8C8,1) , 0 , 51 , 0 , 2109 , 58 , 0 ), // #212
- INST(Fmulp , FpuRDef , O_FPU(00,DEC8,_) , 0 , 33 , 0 , 908 , 59 , 0 ), // #213
- INST(Fnclex , FpuOp , O_FPU(00,DBE2,_) , 0 , 38 , 0 , 914 , 30 , 0 ), // #214
- INST(Fninit , FpuOp , O_FPU(00,DBE3,_) , 0 , 38 , 0 , 921 , 30 , 0 ), // #215
- INST(Fnop , FpuOp , O_FPU(00,D9D0,_) , 0 , 31 , 0 , 928 , 30 , 0 ), // #216
- INST(Fnsave , X86M_Only , O_FPU(00,00DD,6) , 0 , 35 , 0 , 933 , 31 , 0 ), // #217
- INST(Fnstcw , X86M_Only , O_FPU(00,00D9,7) , 0 , 48 , 0 , 940 , 66 , 0 ), // #218
- INST(Fnstenv , X86M_Only , O_FPU(00,00D9,6) , 0 , 35 , 0 , 947 , 31 , 0 ), // #219
- INST(Fnstsw , FpuStsw , O_FPU(00,00DD,7) , O_FPU(00,DFE0,_) , 48 , 12 , 955 , 67 , 0 ), // #220
- INST(Fpatan , FpuOp , O_FPU(00,D9F3,_) , 0 , 31 , 0 , 962 , 30 , 0 ), // #221
- INST(Fprem , FpuOp , O_FPU(00,D9F8,_) , 0 , 31 , 0 , 969 , 30 , 0 ), // #222
- INST(Fprem1 , FpuOp , O_FPU(00,D9F5,_) , 0 , 31 , 0 , 975 , 30 , 0 ), // #223
- INST(Fptan , FpuOp , O_FPU(00,D9F2,_) , 0 , 31 , 0 , 982 , 30 , 0 ), // #224
- INST(Frndint , FpuOp , O_FPU(00,D9FC,_) , 0 , 31 , 0 , 988 , 30 , 0 ), // #225
- INST(Frstor , X86M_Only , O_FPU(00,00DD,4) , 0 , 34 , 0 , 996 , 31 , 0 ), // #226
- INST(Fsave , X86M_Only , O_FPU(9B,00DD,6) , 0 , 52 , 0 , 1003 , 31 , 0 ), // #227
- INST(Fscale , FpuOp , O_FPU(00,D9FD,_) , 0 , 31 , 0 , 1009 , 30 , 0 ), // #228
- INST(Fsin , FpuOp , O_FPU(00,D9FE,_) , 0 , 31 , 0 , 1016 , 30 , 0 ), // #229
- INST(Fsincos , FpuOp , O_FPU(00,D9FB,_) , 0 , 31 , 0 , 1021 , 30 , 0 ), // #230
- INST(Fsqrt , FpuOp , O_FPU(00,D9FA,_) , 0 , 31 , 0 , 1029 , 30 , 0 ), // #231
- INST(Fst , FpuFldFst , O_FPU(00,00D9,2) , 0 , 46 , 0 , 1035 , 68 , 0 ), // #232
- INST(Fstcw , X86M_Only , O_FPU(9B,00D9,7) , 0 , 53 , 0 , 1039 , 66 , 0 ), // #233
- INST(Fstenv , X86M_Only , O_FPU(9B,00D9,6) , 0 , 52 , 0 , 1045 , 31 , 0 ), // #234
- INST(Fstp , FpuFldFst , O_FPU(00,00D9,3) , O(000000,DB,7,_,_,_,_,_ ), 47 , 13 , 1052 , 65 , 0 ), // #235
- INST(Fstsw , FpuStsw , O_FPU(9B,00DD,7) , O_FPU(9B,DFE0,_) , 53 , 14 , 1057 , 67 , 0 ), // #236
- INST(Fsub , FpuArith , O_FPU(00,E0E8,4) , 0 , 54 , 0 , 2187 , 58 , 0 ), // #237
- INST(Fsubp , FpuRDef , O_FPU(00,DEE8,_) , 0 , 33 , 0 , 1063 , 59 , 0 ), // #238
- INST(Fsubr , FpuArith , O_FPU(00,E8E0,5) , 0 , 55 , 0 , 2193 , 58 , 0 ), // #239
- INST(Fsubrp , FpuRDef , O_FPU(00,DEE0,_) , 0 , 33 , 0 , 1069 , 59 , 0 ), // #240
- INST(Ftst , FpuOp , O_FPU(00,D9E4,_) , 0 , 31 , 0 , 1076 , 30 , 0 ), // #241
- INST(Fucom , FpuRDef , O_FPU(00,DDE0,_) , 0 , 44 , 0 , 1081 , 59 , 0 ), // #242
- INST(Fucomi , FpuR , O_FPU(00,DBE8,_) , 0 , 38 , 0 , 1087 , 61 , 47 ), // #243
- INST(Fucomip , FpuR , O_FPU(00,DFE8,_) , 0 , 40 , 0 , 1094 , 61 , 47 ), // #244
- INST(Fucomp , FpuRDef , O_FPU(00,DDE8,_) , 0 , 44 , 0 , 1102 , 59 , 0 ), // #245
- INST(Fucompp , FpuOp , O_FPU(00,DAE9,_) , 0 , 37 , 0 , 1109 , 30 , 0 ), // #246
- INST(Fwait , X86Op , O_FPU(00,009B,_) , 0 , 56 , 0 , 1117 , 30 , 0 ), // #247
- INST(Fxam , FpuOp , O_FPU(00,D9E5,_) , 0 , 31 , 0 , 1123 , 30 , 0 ), // #248
- INST(Fxch , FpuR , O_FPU(00,D9C8,_) , 0 , 31 , 0 , 1128 , 59 , 0 ), // #249
- INST(Fxrstor , X86M_Only , O(000F00,AE,1,_,_,_,_,_ ), 0 , 27 , 0 , 1133 , 31 , 49 ), // #250
- INST(Fxrstor64 , X86M_Only , O(000F00,AE,1,_,1,_,_,_ ), 0 , 26 , 0 , 1141 , 69 , 49 ), // #251
- INST(Fxsave , X86M_Only , O(000F00,AE,0,_,_,_,_,_ ), 0 , 4 , 0 , 1151 , 31 , 49 ), // #252
- INST(Fxsave64 , X86M_Only , O(000F00,AE,0,_,1,_,_,_ ), 0 , 57 , 0 , 1158 , 69 , 49 ), // #253
- INST(Fxtract , FpuOp , O_FPU(00,D9F4,_) , 0 , 31 , 0 , 1167 , 30 , 0 ), // #254
- INST(Fyl2x , FpuOp , O_FPU(00,D9F1,_) , 0 , 31 , 0 , 1175 , 30 , 0 ), // #255
- INST(Fyl2xp1 , FpuOp , O_FPU(00,D9F9,_) , 0 , 31 , 0 , 1181 , 30 , 0 ), // #256
- INST(Getsec , X86Op , O(000F00,37,_,_,_,_,_,_ ), 0 , 4 , 0 , 1189 , 30 , 50 ), // #257
- INST(Gf2p8affineinvqb , ExtRmi , O(660F3A,CF,_,_,_,_,_,_ ), 0 , 8 , 0 , 5577 , 8 , 51 ), // #258
- INST(Gf2p8affineqb , ExtRmi , O(660F3A,CE,_,_,_,_,_,_ ), 0 , 8 , 0 , 5595 , 8 , 51 ), // #259
- INST(Gf2p8mulb , ExtRm , O(660F38,CF,_,_,_,_,_,_ ), 0 , 2 , 0 , 5610 , 5 , 51 ), // #260
- INST(Haddpd , ExtRm , O(660F00,7C,_,_,_,_,_,_ ), 0 , 3 , 0 , 5621 , 5 , 6 ), // #261
- INST(Haddps , ExtRm , O(F20F00,7C,_,_,_,_,_,_ ), 0 , 5 , 0 , 5629 , 5 , 6 ), // #262
- INST(Hlt , X86Op , O(000000,F4,_,_,_,_,_,_ ), 0 , 0 , 0 , 1196 , 30 , 0 ), // #263
- INST(Hsubpd , ExtRm , O(660F00,7D,_,_,_,_,_,_ ), 0 , 3 , 0 , 5637 , 5 , 6 ), // #264
- INST(Hsubps , ExtRm , O(F20F00,7D,_,_,_,_,_,_ ), 0 , 5 , 0 , 5645 , 5 , 6 ), // #265
- INST(Idiv , X86M_GPB_MulDiv , O(000000,F6,7,_,x,_,_,_ ), 0 , 25 , 0 , 779 , 52 , 1 ), // #266
- INST(Imul , X86Imul , O(000000,F6,5,_,x,_,_,_ ), 0 , 58 , 0 , 797 , 70 , 1 ), // #267
- INST(In , X86In , O(000000,EC,_,_,_,_,_,_ ), O(000000,E4,_,_,_,_,_,_ ), 0 , 15 , 10076, 71 , 0 ), // #268
- INST(Inc , X86IncDec , O(000000,FE,0,_,x,_,_,_ ), O(000000,40,_,_,x,_,_,_ ), 0 , 16 , 1200 , 51 , 43 ), // #269
- INST(Ins , X86Ins , O(000000,6C,_,_,_,_,_,_ ), 0 , 0 , 0 , 1857 , 72 , 0 ), // #270
- INST(Insertps , ExtRmi , O(660F3A,21,_,_,_,_,_,_ ), 0 , 8 , 0 , 5781 , 36 , 12 ), // #271
- INST(Insertq , ExtInsertq , O(F20F00,79,_,_,_,_,_,_ ), O(F20F00,78,_,_,_,_,_,_ ), 5 , 17 , 1204 , 73 , 46 ), // #272
- INST(Int , X86Int , O(000000,CD,_,_,_,_,_,_ ), 0 , 0 , 0 , 992 , 74 , 0 ), // #273
- INST(Int3 , X86Op , O(000000,CC,_,_,_,_,_,_ ), 0 , 0 , 0 , 1212 , 30 , 0 ), // #274
- INST(Into , X86Op , O(000000,CE,_,_,_,_,_,_ ), 0 , 0 , 0 , 1217 , 75 , 52 ), // #275
- INST(Invd , X86Op , O(000F00,08,_,_,_,_,_,_ ), 0 , 4 , 0 , 10031, 30 , 41 ), // #276
- INST(Invept , X86Rm_NoSize , O(660F38,80,_,_,_,_,_,_ ), 0 , 2 , 0 , 1222 , 76 , 53 ), // #277
- INST(Invlpg , X86M_Only , O(000F00,01,7,_,_,_,_,_ ), 0 , 22 , 0 , 1229 , 31 , 41 ), // #278
- INST(Invlpga , X86Op_xAddr , O(000F01,DF,_,_,_,_,_,_ ), 0 , 21 , 0 , 1236 , 77 , 22 ), // #279
- INST(Invpcid , X86Rm_NoSize , O(660F38,82,_,_,_,_,_,_ ), 0 , 2 , 0 , 1244 , 76 , 41 ), // #280
- INST(Invvpid , X86Rm_NoSize , O(660F38,81,_,_,_,_,_,_ ), 0 , 2 , 0 , 1252 , 76 , 53 ), // #281
- INST(Iret , X86Op , O(000000,CF,_,_,_,_,_,_ ), 0 , 0 , 0 , 1260 , 78 , 1 ), // #282
- INST(Iretd , X86Op , O(000000,CF,_,_,_,_,_,_ ), 0 , 0 , 0 , 1265 , 78 , 1 ), // #283
- INST(Iretq , X86Op , O(000000,CF,_,_,1,_,_,_ ), 0 , 20 , 0 , 1271 , 79 , 1 ), // #284
- INST(Iretw , X86Op , O(660000,CF,_,_,_,_,_,_ ), 0 , 19 , 0 , 1277 , 78 , 1 ), // #285
- INST(Ja , X86Jcc , O(000F00,87,_,_,_,_,_,_ ), O(000000,77,_,_,_,_,_,_ ), 4 , 18 , 1283 , 80 , 54 ), // #286
- INST(Jae , X86Jcc , O(000F00,83,_,_,_,_,_,_ ), O(000000,73,_,_,_,_,_,_ ), 4 , 19 , 1286 , 80 , 55 ), // #287
- INST(Jb , X86Jcc , O(000F00,82,_,_,_,_,_,_ ), O(000000,72,_,_,_,_,_,_ ), 4 , 20 , 1290 , 80 , 55 ), // #288
- INST(Jbe , X86Jcc , O(000F00,86,_,_,_,_,_,_ ), O(000000,76,_,_,_,_,_,_ ), 4 , 21 , 1293 , 80 , 54 ), // #289
- INST(Jc , X86Jcc , O(000F00,82,_,_,_,_,_,_ ), O(000000,72,_,_,_,_,_,_ ), 4 , 20 , 1297 , 80 , 55 ), // #290
- INST(Je , X86Jcc , O(000F00,84,_,_,_,_,_,_ ), O(000000,74,_,_,_,_,_,_ ), 4 , 22 , 1300 , 80 , 56 ), // #291
- INST(Jecxz , X86JecxzLoop , 0 , O(000000,E3,_,_,_,_,_,_ ), 0 , 23 , 1303 , 81 , 0 ), // #292
- INST(Jg , X86Jcc , O(000F00,8F,_,_,_,_,_,_ ), O(000000,7F,_,_,_,_,_,_ ), 4 , 24 , 1309 , 80 , 57 ), // #293
- INST(Jge , X86Jcc , O(000F00,8D,_,_,_,_,_,_ ), O(000000,7D,_,_,_,_,_,_ ), 4 , 25 , 1312 , 80 , 58 ), // #294
- INST(Jl , X86Jcc , O(000F00,8C,_,_,_,_,_,_ ), O(000000,7C,_,_,_,_,_,_ ), 4 , 26 , 1316 , 80 , 58 ), // #295
- INST(Jle , X86Jcc , O(000F00,8E,_,_,_,_,_,_ ), O(000000,7E,_,_,_,_,_,_ ), 4 , 27 , 1319 , 80 , 57 ), // #296
- INST(Jmp , X86Jmp , O(000000,FF,4,_,_,_,_,_ ), O(000000,EB,_,_,_,_,_,_ ), 9 , 28 , 1323 , 82 , 0 ), // #297
- INST(Jna , X86Jcc , O(000F00,86,_,_,_,_,_,_ ), O(000000,76,_,_,_,_,_,_ ), 4 , 21 , 1327 , 80 , 54 ), // #298
- INST(Jnae , X86Jcc , O(000F00,82,_,_,_,_,_,_ ), O(000000,72,_,_,_,_,_,_ ), 4 , 20 , 1331 , 80 , 55 ), // #299
- INST(Jnb , X86Jcc , O(000F00,83,_,_,_,_,_,_ ), O(000000,73,_,_,_,_,_,_ ), 4 , 19 , 1336 , 80 , 55 ), // #300
- INST(Jnbe , X86Jcc , O(000F00,87,_,_,_,_,_,_ ), O(000000,77,_,_,_,_,_,_ ), 4 , 18 , 1340 , 80 , 54 ), // #301
- INST(Jnc , X86Jcc , O(000F00,83,_,_,_,_,_,_ ), O(000000,73,_,_,_,_,_,_ ), 4 , 19 , 1345 , 80 , 55 ), // #302
- INST(Jne , X86Jcc , O(000F00,85,_,_,_,_,_,_ ), O(000000,75,_,_,_,_,_,_ ), 4 , 29 , 1349 , 80 , 56 ), // #303
- INST(Jng , X86Jcc , O(000F00,8E,_,_,_,_,_,_ ), O(000000,7E,_,_,_,_,_,_ ), 4 , 27 , 1353 , 80 , 57 ), // #304
- INST(Jnge , X86Jcc , O(000F00,8C,_,_,_,_,_,_ ), O(000000,7C,_,_,_,_,_,_ ), 4 , 26 , 1357 , 80 , 58 ), // #305
- INST(Jnl , X86Jcc , O(000F00,8D,_,_,_,_,_,_ ), O(000000,7D,_,_,_,_,_,_ ), 4 , 25 , 1362 , 80 , 58 ), // #306
- INST(Jnle , X86Jcc , O(000F00,8F,_,_,_,_,_,_ ), O(000000,7F,_,_,_,_,_,_ ), 4 , 24 , 1366 , 80 , 57 ), // #307
- INST(Jno , X86Jcc , O(000F00,81,_,_,_,_,_,_ ), O(000000,71,_,_,_,_,_,_ ), 4 , 30 , 1371 , 80 , 52 ), // #308
- INST(Jnp , X86Jcc , O(000F00,8B,_,_,_,_,_,_ ), O(000000,7B,_,_,_,_,_,_ ), 4 , 31 , 1375 , 80 , 59 ), // #309
- INST(Jns , X86Jcc , O(000F00,89,_,_,_,_,_,_ ), O(000000,79,_,_,_,_,_,_ ), 4 , 32 , 1379 , 80 , 60 ), // #310
- INST(Jnz , X86Jcc , O(000F00,85,_,_,_,_,_,_ ), O(000000,75,_,_,_,_,_,_ ), 4 , 29 , 1383 , 80 , 56 ), // #311
- INST(Jo , X86Jcc , O(000F00,80,_,_,_,_,_,_ ), O(000000,70,_,_,_,_,_,_ ), 4 , 33 , 1387 , 80 , 52 ), // #312
- INST(Jp , X86Jcc , O(000F00,8A,_,_,_,_,_,_ ), O(000000,7A,_,_,_,_,_,_ ), 4 , 34 , 1390 , 80 , 59 ), // #313
- INST(Jpe , X86Jcc , O(000F00,8A,_,_,_,_,_,_ ), O(000000,7A,_,_,_,_,_,_ ), 4 , 34 , 1393 , 80 , 59 ), // #314
- INST(Jpo , X86Jcc , O(000F00,8B,_,_,_,_,_,_ ), O(000000,7B,_,_,_,_,_,_ ), 4 , 31 , 1397 , 80 , 59 ), // #315
- INST(Js , X86Jcc , O(000F00,88,_,_,_,_,_,_ ), O(000000,78,_,_,_,_,_,_ ), 4 , 35 , 1401 , 80 , 60 ), // #316
- INST(Jz , X86Jcc , O(000F00,84,_,_,_,_,_,_ ), O(000000,74,_,_,_,_,_,_ ), 4 , 22 , 1404 , 80 , 56 ), // #317
- INST(Kaddb , VexRvm , V(660F00,4A,_,1,0,_,_,_ ), 0 , 59 , 0 , 1407 , 83 , 61 ), // #318
- INST(Kaddd , VexRvm , V(660F00,4A,_,1,1,_,_,_ ), 0 , 60 , 0 , 1413 , 83 , 62 ), // #319
- INST(Kaddq , VexRvm , V(000F00,4A,_,1,1,_,_,_ ), 0 , 61 , 0 , 1419 , 83 , 62 ), // #320
- INST(Kaddw , VexRvm , V(000F00,4A,_,1,0,_,_,_ ), 0 , 62 , 0 , 1425 , 83 , 61 ), // #321
- INST(Kandb , VexRvm , V(660F00,41,_,1,0,_,_,_ ), 0 , 59 , 0 , 1431 , 83 , 61 ), // #322
- INST(Kandd , VexRvm , V(660F00,41,_,1,1,_,_,_ ), 0 , 60 , 0 , 1437 , 83 , 62 ), // #323
- INST(Kandnb , VexRvm , V(660F00,42,_,1,0,_,_,_ ), 0 , 59 , 0 , 1443 , 83 , 61 ), // #324
- INST(Kandnd , VexRvm , V(660F00,42,_,1,1,_,_,_ ), 0 , 60 , 0 , 1450 , 83 , 62 ), // #325
- INST(Kandnq , VexRvm , V(000F00,42,_,1,1,_,_,_ ), 0 , 61 , 0 , 1457 , 83 , 62 ), // #326
- INST(Kandnw , VexRvm , V(000F00,42,_,1,0,_,_,_ ), 0 , 62 , 0 , 1464 , 83 , 63 ), // #327
- INST(Kandq , VexRvm , V(000F00,41,_,1,1,_,_,_ ), 0 , 61 , 0 , 1471 , 83 , 62 ), // #328
- INST(Kandw , VexRvm , V(000F00,41,_,1,0,_,_,_ ), 0 , 62 , 0 , 1477 , 83 , 63 ), // #329
- INST(Kmovb , VexKmov , V(660F00,90,_,0,0,_,_,_ ), V(660F00,92,_,0,0,_,_,_ ), 63 , 36 , 1483 , 84 , 61 ), // #330
- INST(Kmovd , VexKmov , V(660F00,90,_,0,1,_,_,_ ), V(F20F00,92,_,0,0,_,_,_ ), 64 , 37 , 7770 , 85 , 62 ), // #331
- INST(Kmovq , VexKmov , V(000F00,90,_,0,1,_,_,_ ), V(F20F00,92,_,0,1,_,_,_ ), 65 , 38 , 7781 , 86 , 62 ), // #332
- INST(Kmovw , VexKmov , V(000F00,90,_,0,0,_,_,_ ), V(000F00,92,_,0,0,_,_,_ ), 66 , 39 , 1489 , 87 , 63 ), // #333
- INST(Knotb , VexRm , V(660F00,44,_,0,0,_,_,_ ), 0 , 63 , 0 , 1495 , 88 , 61 ), // #334
- INST(Knotd , VexRm , V(660F00,44,_,0,1,_,_,_ ), 0 , 64 , 0 , 1501 , 88 , 62 ), // #335
- INST(Knotq , VexRm , V(000F00,44,_,0,1,_,_,_ ), 0 , 65 , 0 , 1507 , 88 , 62 ), // #336
- INST(Knotw , VexRm , V(000F00,44,_,0,0,_,_,_ ), 0 , 66 , 0 , 1513 , 88 , 63 ), // #337
- INST(Korb , VexRvm , V(660F00,45,_,1,0,_,_,_ ), 0 , 59 , 0 , 1519 , 83 , 61 ), // #338
- INST(Kord , VexRvm , V(660F00,45,_,1,1,_,_,_ ), 0 , 60 , 0 , 1524 , 83 , 62 ), // #339
- INST(Korq , VexRvm , V(000F00,45,_,1,1,_,_,_ ), 0 , 61 , 0 , 1529 , 83 , 62 ), // #340
- INST(Kortestb , VexRm , V(660F00,98,_,0,0,_,_,_ ), 0 , 63 , 0 , 1534 , 88 , 64 ), // #341
- INST(Kortestd , VexRm , V(660F00,98,_,0,1,_,_,_ ), 0 , 64 , 0 , 1543 , 88 , 65 ), // #342
- INST(Kortestq , VexRm , V(000F00,98,_,0,1,_,_,_ ), 0 , 65 , 0 , 1552 , 88 , 65 ), // #343
- INST(Kortestw , VexRm , V(000F00,98,_,0,0,_,_,_ ), 0 , 66 , 0 , 1561 , 88 , 66 ), // #344
- INST(Korw , VexRvm , V(000F00,45,_,1,0,_,_,_ ), 0 , 62 , 0 , 1570 , 83 , 63 ), // #345
- INST(Kshiftlb , VexRmi , V(660F3A,32,_,0,0,_,_,_ ), 0 , 67 , 0 , 1575 , 89 , 61 ), // #346
- INST(Kshiftld , VexRmi , V(660F3A,33,_,0,0,_,_,_ ), 0 , 67 , 0 , 1584 , 89 , 62 ), // #347
- INST(Kshiftlq , VexRmi , V(660F3A,33,_,0,1,_,_,_ ), 0 , 68 , 0 , 1593 , 89 , 62 ), // #348
- INST(Kshiftlw , VexRmi , V(660F3A,32,_,0,1,_,_,_ ), 0 , 68 , 0 , 1602 , 89 , 63 ), // #349
- INST(Kshiftrb , VexRmi , V(660F3A,30,_,0,0,_,_,_ ), 0 , 67 , 0 , 1611 , 89 , 61 ), // #350
- INST(Kshiftrd , VexRmi , V(660F3A,31,_,0,0,_,_,_ ), 0 , 67 , 0 , 1620 , 89 , 62 ), // #351
- INST(Kshiftrq , VexRmi , V(660F3A,31,_,0,1,_,_,_ ), 0 , 68 , 0 , 1629 , 89 , 62 ), // #352
- INST(Kshiftrw , VexRmi , V(660F3A,30,_,0,1,_,_,_ ), 0 , 68 , 0 , 1638 , 89 , 63 ), // #353
- INST(Ktestb , VexRm , V(660F00,99,_,0,0,_,_,_ ), 0 , 63 , 0 , 1647 , 88 , 64 ), // #354
- INST(Ktestd , VexRm , V(660F00,99,_,0,1,_,_,_ ), 0 , 64 , 0 , 1654 , 88 , 65 ), // #355
- INST(Ktestq , VexRm , V(000F00,99,_,0,1,_,_,_ ), 0 , 65 , 0 , 1661 , 88 , 65 ), // #356
- INST(Ktestw , VexRm , V(000F00,99,_,0,0,_,_,_ ), 0 , 66 , 0 , 1668 , 88 , 64 ), // #357
- INST(Kunpckbw , VexRvm , V(660F00,4B,_,1,0,_,_,_ ), 0 , 59 , 0 , 1675 , 83 , 63 ), // #358
- INST(Kunpckdq , VexRvm , V(000F00,4B,_,1,1,_,_,_ ), 0 , 61 , 0 , 1684 , 83 , 62 ), // #359
- INST(Kunpckwd , VexRvm , V(000F00,4B,_,1,0,_,_,_ ), 0 , 62 , 0 , 1693 , 83 , 62 ), // #360
- INST(Kxnorb , VexRvm , V(660F00,46,_,1,0,_,_,_ ), 0 , 59 , 0 , 1702 , 83 , 61 ), // #361
- INST(Kxnord , VexRvm , V(660F00,46,_,1,1,_,_,_ ), 0 , 60 , 0 , 1709 , 83 , 62 ), // #362
- INST(Kxnorq , VexRvm , V(000F00,46,_,1,1,_,_,_ ), 0 , 61 , 0 , 1716 , 83 , 62 ), // #363
- INST(Kxnorw , VexRvm , V(000F00,46,_,1,0,_,_,_ ), 0 , 62 , 0 , 1723 , 83 , 63 ), // #364
- INST(Kxorb , VexRvm , V(660F00,47,_,1,0,_,_,_ ), 0 , 59 , 0 , 1730 , 83 , 61 ), // #365
- INST(Kxord , VexRvm , V(660F00,47,_,1,1,_,_,_ ), 0 , 60 , 0 , 1736 , 83 , 62 ), // #366
- INST(Kxorq , VexRvm , V(000F00,47,_,1,1,_,_,_ ), 0 , 61 , 0 , 1742 , 83 , 62 ), // #367
- INST(Kxorw , VexRvm , V(000F00,47,_,1,0,_,_,_ ), 0 , 62 , 0 , 1748 , 83 , 63 ), // #368
- INST(Lahf , X86Op , O(000000,9F,_,_,_,_,_,_ ), 0 , 0 , 0 , 1754 , 90 , 67 ), // #369
- INST(Lar , X86Rm , O(000F00,02,_,_,_,_,_,_ ), 0 , 4 , 0 , 1759 , 91 , 10 ), // #370
- INST(Lddqu , ExtRm , O(F20F00,F0,_,_,_,_,_,_ ), 0 , 5 , 0 , 5791 , 92 , 6 ), // #371
- INST(Ldmxcsr , X86M_Only , O(000F00,AE,2,_,_,_,_,_ ), 0 , 69 , 0 , 5798 , 93 , 5 ), // #372
- INST(Lds , X86Rm , O(000000,C5,_,_,_,_,_,_ ), 0 , 0 , 0 , 1763 , 94 , 0 ), // #373
- INST(Lea , X86Lea , O(000000,8D,_,_,x,_,_,_ ), 0 , 0 , 0 , 1767 , 95 , 0 ), // #374
- INST(Leave , X86Op , O(000000,C9,_,_,_,_,_,_ ), 0 , 0 , 0 , 1771 , 30 , 0 ), // #375
- INST(Les , X86Rm , O(000000,C4,_,_,_,_,_,_ ), 0 , 0 , 0 , 1777 , 94 , 0 ), // #376
- INST(Lfence , X86Fence , O(000F00,AE,5,_,_,_,_,_ ), 0 , 70 , 0 , 1781 , 30 , 4 ), // #377
- INST(Lfs , X86Rm , O(000F00,B4,_,_,_,_,_,_ ), 0 , 4 , 0 , 1788 , 96 , 0 ), // #378
- INST(Lgdt , X86M_Only , O(000F00,01,2,_,_,_,_,_ ), 0 , 69 , 0 , 1792 , 31 , 0 ), // #379
- INST(Lgs , X86Rm , O(000F00,B5,_,_,_,_,_,_ ), 0 , 4 , 0 , 1797 , 96 , 0 ), // #380
- INST(Lidt , X86M_Only , O(000F00,01,3,_,_,_,_,_ ), 0 , 71 , 0 , 1801 , 31 , 0 ), // #381
- INST(Lldt , X86M_NoSize , O(000F00,00,2,_,_,_,_,_ ), 0 , 69 , 0 , 1806 , 97 , 0 ), // #382
- INST(Llwpcb , VexR_Wx , V(XOP_M9,12,0,0,x,_,_,_ ), 0 , 72 , 0 , 1811 , 98 , 68 ), // #383
- INST(Lmsw , X86M_NoSize , O(000F00,01,6,_,_,_,_,_ ), 0 , 73 , 0 , 1818 , 97 , 0 ), // #384
- INST(Lods , X86StrRm , O(000000,AC,_,_,_,_,_,_ ), 0 , 0 , 0 , 1823 , 99 , 69 ), // #385
- INST(Loop , X86JecxzLoop , 0 , O(000000,E2,_,_,_,_,_,_ ), 0 , 40 , 1828 , 100, 0 ), // #386
- INST(Loope , X86JecxzLoop , 0 , O(000000,E1,_,_,_,_,_,_ ), 0 , 41 , 1833 , 100, 56 ), // #387
- INST(Loopne , X86JecxzLoop , 0 , O(000000,E0,_,_,_,_,_,_ ), 0 , 42 , 1839 , 100, 56 ), // #388
- INST(Lsl , X86Rm , O(000F00,03,_,_,_,_,_,_ ), 0 , 4 , 0 , 1846 , 101, 10 ), // #389
- INST(Lss , X86Rm , O(000F00,B2,_,_,_,_,_,_ ), 0 , 4 , 0 , 6289 , 96 , 0 ), // #390
- INST(Ltr , X86M_NoSize , O(000F00,00,3,_,_,_,_,_ ), 0 , 71 , 0 , 1850 , 97 , 0 ), // #391
- INST(Lwpins , VexVmi4_Wx , V(XOP_MA,12,0,0,x,_,_,_ ), 0 , 74 , 0 , 1854 , 102, 68 ), // #392
- INST(Lwpval , VexVmi4_Wx , V(XOP_MA,12,1,0,x,_,_,_ ), 0 , 75 , 0 , 1861 , 102, 68 ), // #393
- INST(Lzcnt , X86Rm_Raw66H , O(F30F00,BD,_,_,x,_,_,_ ), 0 , 6 , 0 , 1868 , 22 , 70 ), // #394
- INST(Maskmovdqu , ExtRm_ZDI , O(660F00,57,_,_,_,_,_,_ ), 0 , 3 , 0 , 5807 , 103, 4 ), // #395
- INST(Maskmovq , ExtRm_ZDI , O(000F00,F7,_,_,_,_,_,_ ), 0 , 4 , 0 , 7778 , 104, 71 ), // #396
- INST(Maxpd , ExtRm , O(660F00,5F,_,_,_,_,_,_ ), 0 , 3 , 0 , 5841 , 5 , 4 ), // #397
- INST(Maxps , ExtRm , O(000F00,5F,_,_,_,_,_,_ ), 0 , 4 , 0 , 5848 , 5 , 5 ), // #398
- INST(Maxsd , ExtRm , O(F20F00,5F,_,_,_,_,_,_ ), 0 , 5 , 0 , 7797 , 6 , 4 ), // #399
- INST(Maxss , ExtRm , O(F30F00,5F,_,_,_,_,_,_ ), 0 , 6 , 0 , 5862 , 7 , 5 ), // #400
- INST(Mfence , X86Fence , O(000F00,AE,6,_,_,_,_,_ ), 0 , 73 , 0 , 1874 , 30 , 4 ), // #401
- INST(Minpd , ExtRm , O(660F00,5D,_,_,_,_,_,_ ), 0 , 3 , 0 , 5891 , 5 , 4 ), // #402
- INST(Minps , ExtRm , O(000F00,5D,_,_,_,_,_,_ ), 0 , 4 , 0 , 5898 , 5 , 5 ), // #403
- INST(Minsd , ExtRm , O(F20F00,5D,_,_,_,_,_,_ ), 0 , 5 , 0 , 7861 , 6 , 4 ), // #404
- INST(Minss , ExtRm , O(F30F00,5D,_,_,_,_,_,_ ), 0 , 6 , 0 , 5912 , 7 , 5 ), // #405
- INST(Monitor , X86Op , O(000F01,C8,_,_,_,_,_,_ ), 0 , 21 , 0 , 1881 , 105, 72 ), // #406
- INST(Monitorx , X86Op , O(000F01,FA,_,_,_,_,_,_ ), 0 , 21 , 0 , 1889 , 105, 73 ), // #407
- INST(Mov , X86Mov , 0 , 0 , 0 , 0 , 138 , 106, 0 ), // #408
- INST(Movapd , ExtMov , O(660F00,28,_,_,_,_,_,_ ), O(660F00,29,_,_,_,_,_,_ ), 3 , 43 , 5943 , 107, 4 ), // #409
- INST(Movaps , ExtMov , O(000F00,28,_,_,_,_,_,_ ), O(000F00,29,_,_,_,_,_,_ ), 4 , 44 , 5951 , 107, 5 ), // #410
- INST(Movbe , ExtMovbe , O(000F38,F0,_,_,x,_,_,_ ), O(000F38,F1,_,_,x,_,_,_ ), 76 , 45 , 626 , 108, 74 ), // #411
- INST(Movd , ExtMovd , O(000F00,6E,_,_,_,_,_,_ ), O(000F00,7E,_,_,_,_,_,_ ), 4 , 46 , 7771 , 109, 75 ), // #412
- INST(Movddup , ExtMov , O(F20F00,12,_,_,_,_,_,_ ), 0 , 5 , 0 , 5965 , 6 , 6 ), // #413
- INST(Movdir64b , X86EnqcmdMovdir64b , O(660F38,F8,_,_,_,_,_,_ ), 0 , 2 , 0 , 1898 , 110, 76 ), // #414
- INST(Movdiri , X86MovntiMovdiri , O(000F38,F9,_,_,_,_,_,_ ), 0 , 76 , 0 , 1908 , 111, 77 ), // #415
- INST(Movdq2q , ExtMov , O(F20F00,D6,_,_,_,_,_,_ ), 0 , 5 , 0 , 1916 , 112, 4 ), // #416
- INST(Movdqa , ExtMov , O(660F00,6F,_,_,_,_,_,_ ), O(660F00,7F,_,_,_,_,_,_ ), 3 , 47 , 5974 , 107, 4 ), // #417
- INST(Movdqu , ExtMov , O(F30F00,6F,_,_,_,_,_,_ ), O(F30F00,7F,_,_,_,_,_,_ ), 6 , 48 , 5811 , 107, 4 ), // #418
- INST(Movhlps , ExtMov , O(000F00,12,_,_,_,_,_,_ ), 0 , 4 , 0 , 6049 , 113, 5 ), // #419
- INST(Movhpd , ExtMov , O(660F00,16,_,_,_,_,_,_ ), O(660F00,17,_,_,_,_,_,_ ), 3 , 49 , 6058 , 114, 4 ), // #420
- INST(Movhps , ExtMov , O(000F00,16,_,_,_,_,_,_ ), O(000F00,17,_,_,_,_,_,_ ), 4 , 50 , 6066 , 114, 5 ), // #421
- INST(Movlhps , ExtMov , O(000F00,16,_,_,_,_,_,_ ), 0 , 4 , 0 , 6074 , 113, 5 ), // #422
- INST(Movlpd , ExtMov , O(660F00,12,_,_,_,_,_,_ ), O(660F00,13,_,_,_,_,_,_ ), 3 , 51 , 6083 , 114, 4 ), // #423
- INST(Movlps , ExtMov , O(000F00,12,_,_,_,_,_,_ ), O(000F00,13,_,_,_,_,_,_ ), 4 , 52 , 6091 , 114, 5 ), // #424
- INST(Movmskpd , ExtMov , O(660F00,50,_,_,_,_,_,_ ), 0 , 3 , 0 , 6099 , 115, 4 ), // #425
- INST(Movmskps , ExtMov , O(000F00,50,_,_,_,_,_,_ ), 0 , 4 , 0 , 6109 , 115, 5 ), // #426
- INST(Movntdq , ExtMov , 0 , O(660F00,E7,_,_,_,_,_,_ ), 0 , 53 , 6119 , 116, 4 ), // #427
- INST(Movntdqa , ExtMov , O(660F38,2A,_,_,_,_,_,_ ), 0 , 2 , 0 , 6128 , 92 , 12 ), // #428
- INST(Movnti , X86MovntiMovdiri , O(000F00,C3,_,_,x,_,_,_ ), 0 , 4 , 0 , 1924 , 111, 4 ), // #429
- INST(Movntpd , ExtMov , 0 , O(660F00,2B,_,_,_,_,_,_ ), 0 , 54 , 6138 , 116, 4 ), // #430
- INST(Movntps , ExtMov , 0 , O(000F00,2B,_,_,_,_,_,_ ), 0 , 55 , 6147 , 116, 5 ), // #431
- INST(Movntq , ExtMov , 0 , O(000F00,E7,_,_,_,_,_,_ ), 0 , 56 , 1931 , 117, 71 ), // #432
- INST(Movntsd , ExtMov , 0 , O(F20F00,2B,_,_,_,_,_,_ ), 0 , 57 , 1938 , 118, 46 ), // #433
- INST(Movntss , ExtMov , 0 , O(F30F00,2B,_,_,_,_,_,_ ), 0 , 58 , 1946 , 119, 46 ), // #434
- INST(Movq , ExtMovq , O(000F00,6E,_,_,x,_,_,_ ), O(000F00,7E,_,_,x,_,_,_ ), 4 , 59 , 7782 , 120, 75 ), // #435
- INST(Movq2dq , ExtRm , O(F30F00,D6,_,_,_,_,_,_ ), 0 , 6 , 0 , 1954 , 121, 4 ), // #436
- INST(Movs , X86StrMm , O(000000,A4,_,_,_,_,_,_ ), 0 , 0 , 0 , 425 , 122, 69 ), // #437
- INST(Movsd , ExtMov , O(F20F00,10,_,_,_,_,_,_ ), O(F20F00,11,_,_,_,_,_,_ ), 5 , 60 , 6162 , 123, 4 ), // #438
- INST(Movshdup , ExtRm , O(F30F00,16,_,_,_,_,_,_ ), 0 , 6 , 0 , 6169 , 5 , 6 ), // #439
- INST(Movsldup , ExtRm , O(F30F00,12,_,_,_,_,_,_ ), 0 , 6 , 0 , 6179 , 5 , 6 ), // #440
- INST(Movss , ExtMov , O(F30F00,10,_,_,_,_,_,_ ), O(F30F00,11,_,_,_,_,_,_ ), 6 , 61 , 6189 , 124, 5 ), // #441
- INST(Movsx , X86MovsxMovzx , O(000F00,BE,_,_,x,_,_,_ ), 0 , 4 , 0 , 1962 , 125, 0 ), // #442
- INST(Movsxd , X86Rm , O(000000,63,_,_,x,_,_,_ ), 0 , 0 , 0 , 1968 , 126, 0 ), // #443
- INST(Movupd , ExtMov , O(660F00,10,_,_,_,_,_,_ ), O(660F00,11,_,_,_,_,_,_ ), 3 , 62 , 6196 , 107, 4 ), // #444
- INST(Movups , ExtMov , O(000F00,10,_,_,_,_,_,_ ), O(000F00,11,_,_,_,_,_,_ ), 4 , 63 , 6204 , 107, 5 ), // #445
- INST(Movzx , X86MovsxMovzx , O(000F00,B6,_,_,x,_,_,_ ), 0 , 4 , 0 , 1975 , 125, 0 ), // #446
- INST(Mpsadbw , ExtRmi , O(660F3A,42,_,_,_,_,_,_ ), 0 , 8 , 0 , 6212 , 8 , 12 ), // #447
- INST(Mul , X86M_GPB_MulDiv , O(000000,F6,4,_,x,_,_,_ ), 0 , 9 , 0 , 798 , 52 , 1 ), // #448
- INST(Mulpd , ExtRm , O(660F00,59,_,_,_,_,_,_ ), 0 , 3 , 0 , 6266 , 5 , 4 ), // #449
- INST(Mulps , ExtRm , O(000F00,59,_,_,_,_,_,_ ), 0 , 4 , 0 , 6273 , 5 , 5 ), // #450
- INST(Mulsd , ExtRm , O(F20F00,59,_,_,_,_,_,_ ), 0 , 5 , 0 , 6280 , 6 , 4 ), // #451
- INST(Mulss , ExtRm , O(F30F00,59,_,_,_,_,_,_ ), 0 , 6 , 0 , 6287 , 7 , 5 ), // #452
- INST(Mulx , VexRvm_ZDX_Wx , V(F20F38,F6,_,0,x,_,_,_ ), 0 , 77 , 0 , 1981 , 127, 78 ), // #453
- INST(Mwait , X86Op , O(000F01,C9,_,_,_,_,_,_ ), 0 , 21 , 0 , 1986 , 128, 72 ), // #454
- INST(Mwaitx , X86Op , O(000F01,FB,_,_,_,_,_,_ ), 0 , 21 , 0 , 1992 , 129, 73 ), // #455
- INST(Neg , X86M_GPB , O(000000,F6,3,_,x,_,_,_ ), 0 , 78 , 0 , 1999 , 130, 1 ), // #456
- INST(Nop , X86M_Nop , O(000000,90,_,_,_,_,_,_ ), 0 , 0 , 0 , 929 , 131, 0 ), // #457
- INST(Not , X86M_GPB , O(000000,F6,2,_,x,_,_,_ ), 0 , 1 , 0 , 2003 , 130, 0 ), // #458
- INST(Or , X86Arith , O(000000,08,1,_,x,_,_,_ ), 0 , 29 , 0 , 1138 , 132, 1 ), // #459
- INST(Orpd , ExtRm , O(660F00,56,_,_,_,_,_,_ ), 0 , 3 , 0 , 9988 , 11 , 4 ), // #460
- INST(Orps , ExtRm , O(000F00,56,_,_,_,_,_,_ ), 0 , 4 , 0 , 9995 , 11 , 5 ), // #461
- INST(Out , X86Out , O(000000,EE,_,_,_,_,_,_ ), O(000000,E6,_,_,_,_,_,_ ), 0 , 64 , 2007 , 133, 0 ), // #462
- INST(Outs , X86Outs , O(000000,6E,_,_,_,_,_,_ ), 0 , 0 , 0 , 2011 , 134, 0 ), // #463
- INST(Pabsb , ExtRm_P , O(000F38,1C,_,_,_,_,_,_ ), 0 , 76 , 0 , 6341 , 135, 79 ), // #464
- INST(Pabsd , ExtRm_P , O(000F38,1E,_,_,_,_,_,_ ), 0 , 76 , 0 , 6348 , 135, 79 ), // #465
- INST(Pabsw , ExtRm_P , O(000F38,1D,_,_,_,_,_,_ ), 0 , 76 , 0 , 6362 , 135, 79 ), // #466
- INST(Packssdw , ExtRm_P , O(000F00,6B,_,_,_,_,_,_ ), 0 , 4 , 0 , 6369 , 135, 75 ), // #467
- INST(Packsswb , ExtRm_P , O(000F00,63,_,_,_,_,_,_ ), 0 , 4 , 0 , 6379 , 135, 75 ), // #468
- INST(Packusdw , ExtRm , O(660F38,2B,_,_,_,_,_,_ ), 0 , 2 , 0 , 6389 , 5 , 12 ), // #469
- INST(Packuswb , ExtRm_P , O(000F00,67,_,_,_,_,_,_ ), 0 , 4 , 0 , 6399 , 135, 75 ), // #470
- INST(Paddb , ExtRm_P , O(000F00,FC,_,_,_,_,_,_ ), 0 , 4 , 0 , 6409 , 135, 75 ), // #471
- INST(Paddd , ExtRm_P , O(000F00,FE,_,_,_,_,_,_ ), 0 , 4 , 0 , 6416 , 135, 75 ), // #472
- INST(Paddq , ExtRm_P , O(000F00,D4,_,_,_,_,_,_ ), 0 , 4 , 0 , 6423 , 135, 4 ), // #473
- INST(Paddsb , ExtRm_P , O(000F00,EC,_,_,_,_,_,_ ), 0 , 4 , 0 , 6430 , 135, 75 ), // #474
- INST(Paddsw , ExtRm_P , O(000F00,ED,_,_,_,_,_,_ ), 0 , 4 , 0 , 6438 , 135, 75 ), // #475
- INST(Paddusb , ExtRm_P , O(000F00,DC,_,_,_,_,_,_ ), 0 , 4 , 0 , 6446 , 135, 75 ), // #476
- INST(Paddusw , ExtRm_P , O(000F00,DD,_,_,_,_,_,_ ), 0 , 4 , 0 , 6455 , 135, 75 ), // #477
- INST(Paddw , ExtRm_P , O(000F00,FD,_,_,_,_,_,_ ), 0 , 4 , 0 , 6464 , 135, 75 ), // #478
- INST(Palignr , ExtRmi_P , O(000F3A,0F,_,_,_,_,_,_ ), 0 , 79 , 0 , 6471 , 136, 6 ), // #479
- INST(Pand , ExtRm_P , O(000F00,DB,_,_,_,_,_,_ ), 0 , 4 , 0 , 6480 , 137, 75 ), // #480
- INST(Pandn , ExtRm_P , O(000F00,DF,_,_,_,_,_,_ ), 0 , 4 , 0 , 6493 , 138, 75 ), // #481
- INST(Pause , X86Op , O(F30000,90,_,_,_,_,_,_ ), 0 , 80 , 0 , 2016 , 30 , 0 ), // #482
- INST(Pavgb , ExtRm_P , O(000F00,E0,_,_,_,_,_,_ ), 0 , 4 , 0 , 6523 , 135, 80 ), // #483
- INST(Pavgusb , Ext3dNow , O(000F0F,BF,_,_,_,_,_,_ ), 0 , 81 , 0 , 2022 , 139, 48 ), // #484
- INST(Pavgw , ExtRm_P , O(000F00,E3,_,_,_,_,_,_ ), 0 , 4 , 0 , 6530 , 135, 80 ), // #485
- INST(Pblendvb , ExtRm_XMM0 , O(660F38,10,_,_,_,_,_,_ ), 0 , 2 , 0 , 6546 , 15 , 12 ), // #486
- INST(Pblendw , ExtRmi , O(660F3A,0E,_,_,_,_,_,_ ), 0 , 8 , 0 , 6556 , 8 , 12 ), // #487
- INST(Pclmulqdq , ExtRmi , O(660F3A,44,_,_,_,_,_,_ ), 0 , 8 , 0 , 6649 , 8 , 81 ), // #488
- INST(Pcmpeqb , ExtRm_P , O(000F00,74,_,_,_,_,_,_ ), 0 , 4 , 0 , 6681 , 138, 75 ), // #489
- INST(Pcmpeqd , ExtRm_P , O(000F00,76,_,_,_,_,_,_ ), 0 , 4 , 0 , 6690 , 138, 75 ), // #490
- INST(Pcmpeqq , ExtRm , O(660F38,29,_,_,_,_,_,_ ), 0 , 2 , 0 , 6699 , 140, 12 ), // #491
- INST(Pcmpeqw , ExtRm_P , O(000F00,75,_,_,_,_,_,_ ), 0 , 4 , 0 , 6708 , 138, 75 ), // #492
- INST(Pcmpestri , ExtRmi , O(660F3A,61,_,_,_,_,_,_ ), 0 , 8 , 0 , 6717 , 141, 82 ), // #493
- INST(Pcmpestrm , ExtRmi , O(660F3A,60,_,_,_,_,_,_ ), 0 , 8 , 0 , 6728 , 142, 82 ), // #494
- INST(Pcmpgtb , ExtRm_P , O(000F00,64,_,_,_,_,_,_ ), 0 , 4 , 0 , 6739 , 138, 75 ), // #495
- INST(Pcmpgtd , ExtRm_P , O(000F00,66,_,_,_,_,_,_ ), 0 , 4 , 0 , 6748 , 138, 75 ), // #496
- INST(Pcmpgtq , ExtRm , O(660F38,37,_,_,_,_,_,_ ), 0 , 2 , 0 , 6757 , 140, 42 ), // #497
- INST(Pcmpgtw , ExtRm_P , O(000F00,65,_,_,_,_,_,_ ), 0 , 4 , 0 , 6766 , 138, 75 ), // #498
- INST(Pcmpistri , ExtRmi , O(660F3A,63,_,_,_,_,_,_ ), 0 , 8 , 0 , 6775 , 143, 82 ), // #499
- INST(Pcmpistrm , ExtRmi , O(660F3A,62,_,_,_,_,_,_ ), 0 , 8 , 0 , 6786 , 144, 82 ), // #500
- INST(Pcommit , X86Op_O , O(660F00,AE,7,_,_,_,_,_ ), 0 , 23 , 0 , 2030 , 30 , 83 ), // #501
- INST(Pdep , VexRvm_Wx , V(F20F38,F5,_,0,x,_,_,_ ), 0 , 77 , 0 , 2038 , 10 , 78 ), // #502
- INST(Pext , VexRvm_Wx , V(F30F38,F5,_,0,x,_,_,_ ), 0 , 82 , 0 , 2043 , 10 , 78 ), // #503
- INST(Pextrb , ExtExtract , O(000F3A,14,_,_,_,_,_,_ ), 0 , 79 , 0 , 7273 , 145, 12 ), // #504
- INST(Pextrd , ExtExtract , O(000F3A,16,_,_,_,_,_,_ ), 0 , 79 , 0 , 7281 , 56 , 12 ), // #505
- INST(Pextrq , ExtExtract , O(000F3A,16,_,_,1,_,_,_ ), 0 , 83 , 0 , 7289 , 146, 12 ), // #506
- INST(Pextrw , ExtPextrw , O(000F00,C5,_,_,_,_,_,_ ), O(000F3A,15,_,_,_,_,_,_ ), 4 , 65 , 7297 , 147, 84 ), // #507
- INST(Pf2id , Ext3dNow , O(000F0F,1D,_,_,_,_,_,_ ), 0 , 81 , 0 , 2048 , 139, 48 ), // #508
- INST(Pf2iw , Ext3dNow , O(000F0F,1C,_,_,_,_,_,_ ), 0 , 81 , 0 , 2054 , 139, 85 ), // #509
- INST(Pfacc , Ext3dNow , O(000F0F,AE,_,_,_,_,_,_ ), 0 , 81 , 0 , 2060 , 139, 48 ), // #510
- INST(Pfadd , Ext3dNow , O(000F0F,9E,_,_,_,_,_,_ ), 0 , 81 , 0 , 2066 , 139, 48 ), // #511
- INST(Pfcmpeq , Ext3dNow , O(000F0F,B0,_,_,_,_,_,_ ), 0 , 81 , 0 , 2072 , 139, 48 ), // #512
- INST(Pfcmpge , Ext3dNow , O(000F0F,90,_,_,_,_,_,_ ), 0 , 81 , 0 , 2080 , 139, 48 ), // #513
- INST(Pfcmpgt , Ext3dNow , O(000F0F,A0,_,_,_,_,_,_ ), 0 , 81 , 0 , 2088 , 139, 48 ), // #514
- INST(Pfmax , Ext3dNow , O(000F0F,A4,_,_,_,_,_,_ ), 0 , 81 , 0 , 2096 , 139, 48 ), // #515
- INST(Pfmin , Ext3dNow , O(000F0F,94,_,_,_,_,_,_ ), 0 , 81 , 0 , 2102 , 139, 48 ), // #516
- INST(Pfmul , Ext3dNow , O(000F0F,B4,_,_,_,_,_,_ ), 0 , 81 , 0 , 2108 , 139, 48 ), // #517
- INST(Pfnacc , Ext3dNow , O(000F0F,8A,_,_,_,_,_,_ ), 0 , 81 , 0 , 2114 , 139, 85 ), // #518
- INST(Pfpnacc , Ext3dNow , O(000F0F,8E,_,_,_,_,_,_ ), 0 , 81 , 0 , 2121 , 139, 85 ), // #519
- INST(Pfrcp , Ext3dNow , O(000F0F,96,_,_,_,_,_,_ ), 0 , 81 , 0 , 2129 , 139, 48 ), // #520
- INST(Pfrcpit1 , Ext3dNow , O(000F0F,A6,_,_,_,_,_,_ ), 0 , 81 , 0 , 2135 , 139, 48 ), // #521
- INST(Pfrcpit2 , Ext3dNow , O(000F0F,B6,_,_,_,_,_,_ ), 0 , 81 , 0 , 2144 , 139, 48 ), // #522
- INST(Pfrcpv , Ext3dNow , O(000F0F,86,_,_,_,_,_,_ ), 0 , 81 , 0 , 2153 , 139, 86 ), // #523
- INST(Pfrsqit1 , Ext3dNow , O(000F0F,A7,_,_,_,_,_,_ ), 0 , 81 , 0 , 2160 , 139, 48 ), // #524
- INST(Pfrsqrt , Ext3dNow , O(000F0F,97,_,_,_,_,_,_ ), 0 , 81 , 0 , 2169 , 139, 48 ), // #525
- INST(Pfrsqrtv , Ext3dNow , O(000F0F,87,_,_,_,_,_,_ ), 0 , 81 , 0 , 2177 , 139, 86 ), // #526
- INST(Pfsub , Ext3dNow , O(000F0F,9A,_,_,_,_,_,_ ), 0 , 81 , 0 , 2186 , 139, 48 ), // #527
- INST(Pfsubr , Ext3dNow , O(000F0F,AA,_,_,_,_,_,_ ), 0 , 81 , 0 , 2192 , 139, 48 ), // #528
- INST(Phaddd , ExtRm_P , O(000F38,02,_,_,_,_,_,_ ), 0 , 76 , 0 , 7376 , 135, 79 ), // #529
- INST(Phaddsw , ExtRm_P , O(000F38,03,_,_,_,_,_,_ ), 0 , 76 , 0 , 7393 , 135, 79 ), // #530
- INST(Phaddw , ExtRm_P , O(000F38,01,_,_,_,_,_,_ ), 0 , 76 , 0 , 7462 , 135, 79 ), // #531
- INST(Phminposuw , ExtRm , O(660F38,41,_,_,_,_,_,_ ), 0 , 2 , 0 , 7488 , 5 , 12 ), // #532
- INST(Phsubd , ExtRm_P , O(000F38,06,_,_,_,_,_,_ ), 0 , 76 , 0 , 7509 , 135, 79 ), // #533
- INST(Phsubsw , ExtRm_P , O(000F38,07,_,_,_,_,_,_ ), 0 , 76 , 0 , 7526 , 135, 79 ), // #534
- INST(Phsubw , ExtRm_P , O(000F38,05,_,_,_,_,_,_ ), 0 , 76 , 0 , 7535 , 135, 79 ), // #535
- INST(Pi2fd , Ext3dNow , O(000F0F,0D,_,_,_,_,_,_ ), 0 , 81 , 0 , 2199 , 139, 48 ), // #536
- INST(Pi2fw , Ext3dNow , O(000F0F,0C,_,_,_,_,_,_ ), 0 , 81 , 0 , 2205 , 139, 85 ), // #537
- INST(Pinsrb , ExtRmi , O(660F3A,20,_,_,_,_,_,_ ), 0 , 8 , 0 , 7552 , 148, 12 ), // #538
- INST(Pinsrd , ExtRmi , O(660F3A,22,_,_,_,_,_,_ ), 0 , 8 , 0 , 7560 , 149, 12 ), // #539
- INST(Pinsrq , ExtRmi , O(660F3A,22,_,_,1,_,_,_ ), 0 , 84 , 0 , 7568 , 150, 12 ), // #540
- INST(Pinsrw , ExtRmi_P , O(000F00,C4,_,_,_,_,_,_ ), 0 , 4 , 0 , 7576 , 151, 80 ), // #541
- INST(Pmaddubsw , ExtRm_P , O(000F38,04,_,_,_,_,_,_ ), 0 , 76 , 0 , 7746 , 135, 79 ), // #542
- INST(Pmaddwd , ExtRm_P , O(000F00,F5,_,_,_,_,_,_ ), 0 , 4 , 0 , 7757 , 135, 75 ), // #543
- INST(Pmaxsb , ExtRm , O(660F38,3C,_,_,_,_,_,_ ), 0 , 2 , 0 , 7788 , 11 , 12 ), // #544
- INST(Pmaxsd , ExtRm , O(660F38,3D,_,_,_,_,_,_ ), 0 , 2 , 0 , 7796 , 11 , 12 ), // #545
- INST(Pmaxsw , ExtRm_P , O(000F00,EE,_,_,_,_,_,_ ), 0 , 4 , 0 , 7812 , 137, 80 ), // #546
- INST(Pmaxub , ExtRm_P , O(000F00,DE,_,_,_,_,_,_ ), 0 , 4 , 0 , 7820 , 137, 80 ), // #547
- INST(Pmaxud , ExtRm , O(660F38,3F,_,_,_,_,_,_ ), 0 , 2 , 0 , 7828 , 11 , 12 ), // #548
- INST(Pmaxuw , ExtRm , O(660F38,3E,_,_,_,_,_,_ ), 0 , 2 , 0 , 7844 , 11 , 12 ), // #549
- INST(Pminsb , ExtRm , O(660F38,38,_,_,_,_,_,_ ), 0 , 2 , 0 , 7852 , 11 , 12 ), // #550
- INST(Pminsd , ExtRm , O(660F38,39,_,_,_,_,_,_ ), 0 , 2 , 0 , 7860 , 11 , 12 ), // #551
- INST(Pminsw , ExtRm_P , O(000F00,EA,_,_,_,_,_,_ ), 0 , 4 , 0 , 7876 , 137, 80 ), // #552
- INST(Pminub , ExtRm_P , O(000F00,DA,_,_,_,_,_,_ ), 0 , 4 , 0 , 7884 , 137, 80 ), // #553
- INST(Pminud , ExtRm , O(660F38,3B,_,_,_,_,_,_ ), 0 , 2 , 0 , 7892 , 11 , 12 ), // #554
- INST(Pminuw , ExtRm , O(660F38,3A,_,_,_,_,_,_ ), 0 , 2 , 0 , 7908 , 11 , 12 ), // #555
- INST(Pmovmskb , ExtRm_P , O(000F00,D7,_,_,_,_,_,_ ), 0 , 4 , 0 , 7986 , 152, 80 ), // #556
- INST(Pmovsxbd , ExtRm , O(660F38,21,_,_,_,_,_,_ ), 0 , 2 , 0 , 8083 , 7 , 12 ), // #557
- INST(Pmovsxbq , ExtRm , O(660F38,22,_,_,_,_,_,_ ), 0 , 2 , 0 , 8093 , 153, 12 ), // #558
- INST(Pmovsxbw , ExtRm , O(660F38,20,_,_,_,_,_,_ ), 0 , 2 , 0 , 8103 , 6 , 12 ), // #559
- INST(Pmovsxdq , ExtRm , O(660F38,25,_,_,_,_,_,_ ), 0 , 2 , 0 , 8113 , 6 , 12 ), // #560
- INST(Pmovsxwd , ExtRm , O(660F38,23,_,_,_,_,_,_ ), 0 , 2 , 0 , 8123 , 6 , 12 ), // #561
- INST(Pmovsxwq , ExtRm , O(660F38,24,_,_,_,_,_,_ ), 0 , 2 , 0 , 8133 , 7 , 12 ), // #562
- INST(Pmovzxbd , ExtRm , O(660F38,31,_,_,_,_,_,_ ), 0 , 2 , 0 , 8220 , 7 , 12 ), // #563
- INST(Pmovzxbq , ExtRm , O(660F38,32,_,_,_,_,_,_ ), 0 , 2 , 0 , 8230 , 153, 12 ), // #564
- INST(Pmovzxbw , ExtRm , O(660F38,30,_,_,_,_,_,_ ), 0 , 2 , 0 , 8240 , 6 , 12 ), // #565
- INST(Pmovzxdq , ExtRm , O(660F38,35,_,_,_,_,_,_ ), 0 , 2 , 0 , 8250 , 6 , 12 ), // #566
- INST(Pmovzxwd , ExtRm , O(660F38,33,_,_,_,_,_,_ ), 0 , 2 , 0 , 8260 , 6 , 12 ), // #567
- INST(Pmovzxwq , ExtRm , O(660F38,34,_,_,_,_,_,_ ), 0 , 2 , 0 , 8270 , 7 , 12 ), // #568
- INST(Pmuldq , ExtRm , O(660F38,28,_,_,_,_,_,_ ), 0 , 2 , 0 , 8280 , 5 , 12 ), // #569
- INST(Pmulhrsw , ExtRm_P , O(000F38,0B,_,_,_,_,_,_ ), 0 , 76 , 0 , 8288 , 135, 79 ), // #570
- INST(Pmulhrw , Ext3dNow , O(000F0F,B7,_,_,_,_,_,_ ), 0 , 81 , 0 , 2211 , 139, 48 ), // #571
- INST(Pmulhuw , ExtRm_P , O(000F00,E4,_,_,_,_,_,_ ), 0 , 4 , 0 , 8298 , 135, 80 ), // #572
- INST(Pmulhw , ExtRm_P , O(000F00,E5,_,_,_,_,_,_ ), 0 , 4 , 0 , 8307 , 135, 75 ), // #573
- INST(Pmulld , ExtRm , O(660F38,40,_,_,_,_,_,_ ), 0 , 2 , 0 , 8315 , 5 , 12 ), // #574
- INST(Pmullw , ExtRm_P , O(000F00,D5,_,_,_,_,_,_ ), 0 , 4 , 0 , 8331 , 135, 75 ), // #575
- INST(Pmuludq , ExtRm_P , O(000F00,F4,_,_,_,_,_,_ ), 0 , 4 , 0 , 8354 , 135, 4 ), // #576
- INST(Pop , X86Pop , O(000000,8F,0,_,_,_,_,_ ), O(000000,58,_,_,_,_,_,_ ), 0 , 66 , 2219 , 154, 0 ), // #577
- INST(Popa , X86Op , O(660000,61,_,_,_,_,_,_ ), 0 , 19 , 0 , 2223 , 75 , 0 ), // #578
- INST(Popad , X86Op , O(000000,61,_,_,_,_,_,_ ), 0 , 0 , 0 , 2228 , 75 , 0 ), // #579
- INST(Popcnt , X86Rm_Raw66H , O(F30F00,B8,_,_,x,_,_,_ ), 0 , 6 , 0 , 2234 , 22 , 87 ), // #580
- INST(Popf , X86Op , O(660000,9D,_,_,_,_,_,_ ), 0 , 19 , 0 , 2241 , 30 , 88 ), // #581
- INST(Popfd , X86Op , O(000000,9D,_,_,_,_,_,_ ), 0 , 0 , 0 , 2246 , 75 , 88 ), // #582
- INST(Popfq , X86Op , O(000000,9D,_,_,_,_,_,_ ), 0 , 0 , 0 , 2252 , 155, 88 ), // #583
- INST(Por , ExtRm_P , O(000F00,EB,_,_,_,_,_,_ ), 0 , 4 , 0 , 8399 , 137, 75 ), // #584
- INST(Prefetch , X86M_Only , O(000F00,0D,0,_,_,_,_,_ ), 0 , 4 , 0 , 2258 , 31 , 48 ), // #585
- INST(Prefetchnta , X86M_Only , O(000F00,18,0,_,_,_,_,_ ), 0 , 4 , 0 , 2267 , 31 , 71 ), // #586
- INST(Prefetcht0 , X86M_Only , O(000F00,18,1,_,_,_,_,_ ), 0 , 27 , 0 , 2279 , 31 , 71 ), // #587
- INST(Prefetcht1 , X86M_Only , O(000F00,18,2,_,_,_,_,_ ), 0 , 69 , 0 , 2290 , 31 , 71 ), // #588
- INST(Prefetcht2 , X86M_Only , O(000F00,18,3,_,_,_,_,_ ), 0 , 71 , 0 , 2301 , 31 , 71 ), // #589
- INST(Prefetchw , X86M_Only , O(000F00,0D,1,_,_,_,_,_ ), 0 , 27 , 0 , 2312 , 31 , 89 ), // #590
- INST(Prefetchwt1 , X86M_Only , O(000F00,0D,2,_,_,_,_,_ ), 0 , 69 , 0 , 2322 , 31 , 90 ), // #591
- INST(Psadbw , ExtRm_P , O(000F00,F6,_,_,_,_,_,_ ), 0 , 4 , 0 , 3980 , 135, 80 ), // #592
- INST(Pshufb , ExtRm_P , O(000F38,00,_,_,_,_,_,_ ), 0 , 76 , 0 , 8725 , 135, 79 ), // #593
- INST(Pshufd , ExtRmi , O(660F00,70,_,_,_,_,_,_ ), 0 , 3 , 0 , 8746 , 8 , 4 ), // #594
- INST(Pshufhw , ExtRmi , O(F30F00,70,_,_,_,_,_,_ ), 0 , 6 , 0 , 8754 , 8 , 4 ), // #595
- INST(Pshuflw , ExtRmi , O(F20F00,70,_,_,_,_,_,_ ), 0 , 5 , 0 , 8763 , 8 , 4 ), // #596
- INST(Pshufw , ExtRmi_P , O(000F00,70,_,_,_,_,_,_ ), 0 , 4 , 0 , 2334 , 156, 71 ), // #597
- INST(Psignb , ExtRm_P , O(000F38,08,_,_,_,_,_,_ ), 0 , 76 , 0 , 8772 , 135, 79 ), // #598
- INST(Psignd , ExtRm_P , O(000F38,0A,_,_,_,_,_,_ ), 0 , 76 , 0 , 8780 , 135, 79 ), // #599
- INST(Psignw , ExtRm_P , O(000F38,09,_,_,_,_,_,_ ), 0 , 76 , 0 , 8788 , 135, 79 ), // #600
- INST(Pslld , ExtRmRi_P , O(000F00,F2,_,_,_,_,_,_ ), O(000F00,72,6,_,_,_,_,_ ), 4 , 67 , 8796 , 157, 75 ), // #601
- INST(Pslldq , ExtRmRi , 0 , O(660F00,73,7,_,_,_,_,_ ), 0 , 68 , 8803 , 158, 4 ), // #602
- INST(Psllq , ExtRmRi_P , O(000F00,F3,_,_,_,_,_,_ ), O(000F00,73,6,_,_,_,_,_ ), 4 , 69 , 8811 , 157, 75 ), // #603
- INST(Psllw , ExtRmRi_P , O(000F00,F1,_,_,_,_,_,_ ), O(000F00,71,6,_,_,_,_,_ ), 4 , 70 , 8842 , 157, 75 ), // #604
- INST(Psrad , ExtRmRi_P , O(000F00,E2,_,_,_,_,_,_ ), O(000F00,72,4,_,_,_,_,_ ), 4 , 71 , 8849 , 157, 75 ), // #605
- INST(Psraw , ExtRmRi_P , O(000F00,E1,_,_,_,_,_,_ ), O(000F00,71,4,_,_,_,_,_ ), 4 , 72 , 8887 , 157, 75 ), // #606
- INST(Psrld , ExtRmRi_P , O(000F00,D2,_,_,_,_,_,_ ), O(000F00,72,2,_,_,_,_,_ ), 4 , 73 , 8894 , 157, 75 ), // #607
- INST(Psrldq , ExtRmRi , 0 , O(660F00,73,3,_,_,_,_,_ ), 0 , 74 , 8901 , 158, 4 ), // #608
- INST(Psrlq , ExtRmRi_P , O(000F00,D3,_,_,_,_,_,_ ), O(000F00,73,2,_,_,_,_,_ ), 4 , 75 , 8909 , 157, 75 ), // #609
- INST(Psrlw , ExtRmRi_P , O(000F00,D1,_,_,_,_,_,_ ), O(000F00,71,2,_,_,_,_,_ ), 4 , 76 , 8940 , 157, 75 ), // #610
- INST(Psubb , ExtRm_P , O(000F00,F8,_,_,_,_,_,_ ), 0 , 4 , 0 , 8947 , 138, 75 ), // #611
- INST(Psubd , ExtRm_P , O(000F00,FA,_,_,_,_,_,_ ), 0 , 4 , 0 , 8954 , 138, 75 ), // #612
- INST(Psubq , ExtRm_P , O(000F00,FB,_,_,_,_,_,_ ), 0 , 4 , 0 , 8961 , 138, 4 ), // #613
- INST(Psubsb , ExtRm_P , O(000F00,E8,_,_,_,_,_,_ ), 0 , 4 , 0 , 8968 , 138, 75 ), // #614
- INST(Psubsw , ExtRm_P , O(000F00,E9,_,_,_,_,_,_ ), 0 , 4 , 0 , 8976 , 138, 75 ), // #615
- INST(Psubusb , ExtRm_P , O(000F00,D8,_,_,_,_,_,_ ), 0 , 4 , 0 , 8984 , 138, 75 ), // #616
- INST(Psubusw , ExtRm_P , O(000F00,D9,_,_,_,_,_,_ ), 0 , 4 , 0 , 8993 , 138, 75 ), // #617
- INST(Psubw , ExtRm_P , O(000F00,F9,_,_,_,_,_,_ ), 0 , 4 , 0 , 9002 , 138, 75 ), // #618
- INST(Pswapd , Ext3dNow , O(000F0F,BB,_,_,_,_,_,_ ), 0 , 81 , 0 , 2341 , 139, 85 ), // #619
- INST(Ptest , ExtRm , O(660F38,17,_,_,_,_,_,_ ), 0 , 2 , 0 , 9031 , 5 , 91 ), // #620
- INST(Punpckhbw , ExtRm_P , O(000F00,68,_,_,_,_,_,_ ), 0 , 4 , 0 , 9114 , 135, 75 ), // #621
- INST(Punpckhdq , ExtRm_P , O(000F00,6A,_,_,_,_,_,_ ), 0 , 4 , 0 , 9125 , 135, 75 ), // #622
- INST(Punpckhqdq , ExtRm , O(660F00,6D,_,_,_,_,_,_ ), 0 , 3 , 0 , 9136 , 5 , 4 ), // #623
- INST(Punpckhwd , ExtRm_P , O(000F00,69,_,_,_,_,_,_ ), 0 , 4 , 0 , 9148 , 135, 75 ), // #624
- INST(Punpcklbw , ExtRm_P , O(000F00,60,_,_,_,_,_,_ ), 0 , 4 , 0 , 9159 , 135, 75 ), // #625
- INST(Punpckldq , ExtRm_P , O(000F00,62,_,_,_,_,_,_ ), 0 , 4 , 0 , 9170 , 135, 75 ), // #626
- INST(Punpcklqdq , ExtRm , O(660F00,6C,_,_,_,_,_,_ ), 0 , 3 , 0 , 9181 , 5 , 4 ), // #627
- INST(Punpcklwd , ExtRm_P , O(000F00,61,_,_,_,_,_,_ ), 0 , 4 , 0 , 9193 , 135, 75 ), // #628
- INST(Push , X86Push , O(000000,FF,6,_,_,_,_,_ ), O(000000,50,_,_,_,_,_,_ ), 30 , 77 , 2348 , 159, 0 ), // #629
- INST(Pusha , X86Op , O(660000,60,_,_,_,_,_,_ ), 0 , 19 , 0 , 2353 , 75 , 0 ), // #630
- INST(Pushad , X86Op , O(000000,60,_,_,_,_,_,_ ), 0 , 0 , 0 , 2359 , 75 , 0 ), // #631
- INST(Pushf , X86Op , O(660000,9C,_,_,_,_,_,_ ), 0 , 19 , 0 , 2366 , 30 , 92 ), // #632
- INST(Pushfd , X86Op , O(000000,9C,_,_,_,_,_,_ ), 0 , 0 , 0 , 2372 , 75 , 92 ), // #633
- INST(Pushfq , X86Op , O(000000,9C,_,_,_,_,_,_ ), 0 , 0 , 0 , 2379 , 155, 92 ), // #634
- INST(Pxor , ExtRm_P , O(000F00,EF,_,_,_,_,_,_ ), 0 , 4 , 0 , 9204 , 138, 75 ), // #635
- INST(Rcl , X86Rot , O(000000,D0,2,_,x,_,_,_ ), 0 , 1 , 0 , 2386 , 160, 93 ), // #636
- INST(Rcpps , ExtRm , O(000F00,53,_,_,_,_,_,_ ), 0 , 4 , 0 , 9332 , 5 , 5 ), // #637
- INST(Rcpss , ExtRm , O(F30F00,53,_,_,_,_,_,_ ), 0 , 6 , 0 , 9339 , 7 , 5 ), // #638
- INST(Rcr , X86Rot , O(000000,D0,3,_,x,_,_,_ ), 0 , 78 , 0 , 2390 , 160, 93 ), // #639
- INST(Rdfsbase , X86M , O(F30F00,AE,0,_,x,_,_,_ ), 0 , 6 , 0 , 2394 , 161, 94 ), // #640
- INST(Rdgsbase , X86M , O(F30F00,AE,1,_,x,_,_,_ ), 0 , 85 , 0 , 2403 , 161, 94 ), // #641
- INST(Rdmsr , X86Op , O(000F00,32,_,_,_,_,_,_ ), 0 , 4 , 0 , 2412 , 162, 95 ), // #642
- INST(Rdpid , X86R_Native , O(F30F00,C7,7,_,_,_,_,_ ), 0 , 86 , 0 , 2418 , 163, 96 ), // #643
- INST(Rdpmc , X86Op , O(000F00,33,_,_,_,_,_,_ ), 0 , 4 , 0 , 2424 , 162, 0 ), // #644
- INST(Rdrand , X86M , O(000F00,C7,6,_,x,_,_,_ ), 0 , 73 , 0 , 2430 , 23 , 97 ), // #645
- INST(Rdseed , X86M , O(000F00,C7,7,_,x,_,_,_ ), 0 , 22 , 0 , 2437 , 23 , 98 ), // #646
- INST(Rdtsc , X86Op , O(000F00,31,_,_,_,_,_,_ ), 0 , 4 , 0 , 2444 , 28 , 99 ), // #647
- INST(Rdtscp , X86Op , O(000F01,F9,_,_,_,_,_,_ ), 0 , 21 , 0 , 2450 , 162, 100), // #648
- INST(Ret , X86Ret , O(000000,C2,_,_,_,_,_,_ ), 0 , 0 , 0 , 2883 , 164, 0 ), // #649
- INST(Rol , X86Rot , O(000000,D0,0,_,x,_,_,_ ), 0 , 0 , 0 , 2457 , 160, 101), // #650
- INST(Ror , X86Rot , O(000000,D0,1,_,x,_,_,_ ), 0 , 29 , 0 , 2461 , 160, 101), // #651
- INST(Rorx , VexRmi_Wx , V(F20F3A,F0,_,0,x,_,_,_ ), 0 , 87 , 0 , 2465 , 165, 78 ), // #652
- INST(Roundpd , ExtRmi , O(660F3A,09,_,_,_,_,_,_ ), 0 , 8 , 0 , 9434 , 8 , 12 ), // #653
- INST(Roundps , ExtRmi , O(660F3A,08,_,_,_,_,_,_ ), 0 , 8 , 0 , 9443 , 8 , 12 ), // #654
- INST(Roundsd , ExtRmi , O(660F3A,0B,_,_,_,_,_,_ ), 0 , 8 , 0 , 9452 , 35 , 12 ), // #655
- INST(Roundss , ExtRmi , O(660F3A,0A,_,_,_,_,_,_ ), 0 , 8 , 0 , 9461 , 36 , 12 ), // #656
- INST(Rsm , X86Op , O(000F00,AA,_,_,_,_,_,_ ), 0 , 4 , 0 , 2470 , 75 , 1 ), // #657
- INST(Rsqrtps , ExtRm , O(000F00,52,_,_,_,_,_,_ ), 0 , 4 , 0 , 9558 , 5 , 5 ), // #658
- INST(Rsqrtss , ExtRm , O(F30F00,52,_,_,_,_,_,_ ), 0 , 6 , 0 , 9567 , 7 , 5 ), // #659
- INST(Sahf , X86Op , O(000000,9E,_,_,_,_,_,_ ), 0 , 0 , 0 , 2474 , 90 , 102), // #660
- INST(Sal , X86Rot , O(000000,D0,4,_,x,_,_,_ ), 0 , 9 , 0 , 2479 , 160, 1 ), // #661
- INST(Sar , X86Rot , O(000000,D0,7,_,x,_,_,_ ), 0 , 25 , 0 , 2483 , 160, 1 ), // #662
- INST(Sarx , VexRmv_Wx , V(F30F38,F7,_,0,x,_,_,_ ), 0 , 82 , 0 , 2487 , 13 , 78 ), // #663
- INST(Sbb , X86Arith , O(000000,18,3,_,x,_,_,_ ), 0 , 78 , 0 , 2492 , 166, 2 ), // #664
- INST(Scas , X86StrRm , O(000000,AE,_,_,_,_,_,_ ), 0 , 0 , 0 , 2496 , 167, 35 ), // #665
- INST(Seta , X86Set , O(000F00,97,_,_,_,_,_,_ ), 0 , 4 , 0 , 2501 , 168, 54 ), // #666
- INST(Setae , X86Set , O(000F00,93,_,_,_,_,_,_ ), 0 , 4 , 0 , 2506 , 168, 55 ), // #667
- INST(Setb , X86Set , O(000F00,92,_,_,_,_,_,_ ), 0 , 4 , 0 , 2512 , 168, 55 ), // #668
- INST(Setbe , X86Set , O(000F00,96,_,_,_,_,_,_ ), 0 , 4 , 0 , 2517 , 168, 54 ), // #669
- INST(Setc , X86Set , O(000F00,92,_,_,_,_,_,_ ), 0 , 4 , 0 , 2523 , 168, 55 ), // #670
- INST(Sete , X86Set , O(000F00,94,_,_,_,_,_,_ ), 0 , 4 , 0 , 2528 , 168, 56 ), // #671
- INST(Setg , X86Set , O(000F00,9F,_,_,_,_,_,_ ), 0 , 4 , 0 , 2533 , 168, 57 ), // #672
- INST(Setge , X86Set , O(000F00,9D,_,_,_,_,_,_ ), 0 , 4 , 0 , 2538 , 168, 58 ), // #673
- INST(Setl , X86Set , O(000F00,9C,_,_,_,_,_,_ ), 0 , 4 , 0 , 2544 , 168, 58 ), // #674
- INST(Setle , X86Set , O(000F00,9E,_,_,_,_,_,_ ), 0 , 4 , 0 , 2549 , 168, 57 ), // #675
- INST(Setna , X86Set , O(000F00,96,_,_,_,_,_,_ ), 0 , 4 , 0 , 2555 , 168, 54 ), // #676
- INST(Setnae , X86Set , O(000F00,92,_,_,_,_,_,_ ), 0 , 4 , 0 , 2561 , 168, 55 ), // #677
- INST(Setnb , X86Set , O(000F00,93,_,_,_,_,_,_ ), 0 , 4 , 0 , 2568 , 168, 55 ), // #678
- INST(Setnbe , X86Set , O(000F00,97,_,_,_,_,_,_ ), 0 , 4 , 0 , 2574 , 168, 54 ), // #679
- INST(Setnc , X86Set , O(000F00,93,_,_,_,_,_,_ ), 0 , 4 , 0 , 2581 , 168, 55 ), // #680
- INST(Setne , X86Set , O(000F00,95,_,_,_,_,_,_ ), 0 , 4 , 0 , 2587 , 168, 56 ), // #681
- INST(Setng , X86Set , O(000F00,9E,_,_,_,_,_,_ ), 0 , 4 , 0 , 2593 , 168, 57 ), // #682
- INST(Setnge , X86Set , O(000F00,9C,_,_,_,_,_,_ ), 0 , 4 , 0 , 2599 , 168, 58 ), // #683
- INST(Setnl , X86Set , O(000F00,9D,_,_,_,_,_,_ ), 0 , 4 , 0 , 2606 , 168, 58 ), // #684
- INST(Setnle , X86Set , O(000F00,9F,_,_,_,_,_,_ ), 0 , 4 , 0 , 2612 , 168, 57 ), // #685
- INST(Setno , X86Set , O(000F00,91,_,_,_,_,_,_ ), 0 , 4 , 0 , 2619 , 168, 52 ), // #686
- INST(Setnp , X86Set , O(000F00,9B,_,_,_,_,_,_ ), 0 , 4 , 0 , 2625 , 168, 59 ), // #687
- INST(Setns , X86Set , O(000F00,99,_,_,_,_,_,_ ), 0 , 4 , 0 , 2631 , 168, 60 ), // #688
- INST(Setnz , X86Set , O(000F00,95,_,_,_,_,_,_ ), 0 , 4 , 0 , 2637 , 168, 56 ), // #689
- INST(Seto , X86Set , O(000F00,90,_,_,_,_,_,_ ), 0 , 4 , 0 , 2643 , 168, 52 ), // #690
- INST(Setp , X86Set , O(000F00,9A,_,_,_,_,_,_ ), 0 , 4 , 0 , 2648 , 168, 59 ), // #691
- INST(Setpe , X86Set , O(000F00,9A,_,_,_,_,_,_ ), 0 , 4 , 0 , 2653 , 168, 59 ), // #692
- INST(Setpo , X86Set , O(000F00,9B,_,_,_,_,_,_ ), 0 , 4 , 0 , 2659 , 168, 59 ), // #693
- INST(Sets , X86Set , O(000F00,98,_,_,_,_,_,_ ), 0 , 4 , 0 , 2665 , 168, 60 ), // #694
- INST(Setz , X86Set , O(000F00,94,_,_,_,_,_,_ ), 0 , 4 , 0 , 2670 , 168, 56 ), // #695
- INST(Sfence , X86Fence , O(000F00,AE,7,_,_,_,_,_ ), 0 , 22 , 0 , 2675 , 30 , 71 ), // #696
- INST(Sgdt , X86M_Only , O(000F00,01,0,_,_,_,_,_ ), 0 , 4 , 0 , 2682 , 31 , 0 ), // #697
- INST(Sha1msg1 , ExtRm , O(000F38,C9,_,_,_,_,_,_ ), 0 , 76 , 0 , 2687 , 5 , 103), // #698
- INST(Sha1msg2 , ExtRm , O(000F38,CA,_,_,_,_,_,_ ), 0 , 76 , 0 , 2696 , 5 , 103), // #699
- INST(Sha1nexte , ExtRm , O(000F38,C8,_,_,_,_,_,_ ), 0 , 76 , 0 , 2705 , 5 , 103), // #700
- INST(Sha1rnds4 , ExtRmi , O(000F3A,CC,_,_,_,_,_,_ ), 0 , 79 , 0 , 2715 , 8 , 103), // #701
- INST(Sha256msg1 , ExtRm , O(000F38,CC,_,_,_,_,_,_ ), 0 , 76 , 0 , 2725 , 5 , 103), // #702
- INST(Sha256msg2 , ExtRm , O(000F38,CD,_,_,_,_,_,_ ), 0 , 76 , 0 , 2736 , 5 , 103), // #703
- INST(Sha256rnds2 , ExtRm_XMM0 , O(000F38,CB,_,_,_,_,_,_ ), 0 , 76 , 0 , 2747 , 15 , 103), // #704
- INST(Shl , X86Rot , O(000000,D0,4,_,x,_,_,_ ), 0 , 9 , 0 , 2759 , 160, 1 ), // #705
- INST(Shld , X86ShldShrd , O(000F00,A4,_,_,x,_,_,_ ), 0 , 4 , 0 , 8603 , 169, 1 ), // #706
- INST(Shlx , VexRmv_Wx , V(660F38,F7,_,0,x,_,_,_ ), 0 , 88 , 0 , 2763 , 13 , 78 ), // #707
- INST(Shr , X86Rot , O(000000,D0,5,_,x,_,_,_ ), 0 , 58 , 0 , 2768 , 160, 1 ), // #708
- INST(Shrd , X86ShldShrd , O(000F00,AC,_,_,x,_,_,_ ), 0 , 4 , 0 , 2772 , 169, 1 ), // #709
- INST(Shrx , VexRmv_Wx , V(F20F38,F7,_,0,x,_,_,_ ), 0 , 77 , 0 , 2777 , 13 , 78 ), // #710
- INST(Shufpd , ExtRmi , O(660F00,C6,_,_,_,_,_,_ ), 0 , 3 , 0 , 9828 , 8 , 4 ), // #711
- INST(Shufps , ExtRmi , O(000F00,C6,_,_,_,_,_,_ ), 0 , 4 , 0 , 9836 , 8 , 5 ), // #712
- INST(Sidt , X86M_Only , O(000F00,01,1,_,_,_,_,_ ), 0 , 27 , 0 , 2782 , 31 , 0 ), // #713
- INST(Skinit , X86Op_xAX , O(000F01,DE,_,_,_,_,_,_ ), 0 , 21 , 0 , 2787 , 50 , 104), // #714
- INST(Sldt , X86M , O(000F00,00,0,_,_,_,_,_ ), 0 , 4 , 0 , 2794 , 170, 0 ), // #715
- INST(Slwpcb , VexR_Wx , V(XOP_M9,12,1,0,x,_,_,_ ), 0 , 11 , 0 , 2799 , 98 , 68 ), // #716
- INST(Smsw , X86M , O(000F00,01,4,_,_,_,_,_ ), 0 , 89 , 0 , 2806 , 170, 0 ), // #717
- INST(Sqrtpd , ExtRm , O(660F00,51,_,_,_,_,_,_ ), 0 , 3 , 0 , 9844 , 5 , 4 ), // #718
- INST(Sqrtps , ExtRm , O(000F00,51,_,_,_,_,_,_ ), 0 , 4 , 0 , 9559 , 5 , 5 ), // #719
- INST(Sqrtsd , ExtRm , O(F20F00,51,_,_,_,_,_,_ ), 0 , 5 , 0 , 9860 , 6 , 4 ), // #720
- INST(Sqrtss , ExtRm , O(F30F00,51,_,_,_,_,_,_ ), 0 , 6 , 0 , 9568 , 7 , 5 ), // #721
- INST(Stac , X86Op , O(000F01,CB,_,_,_,_,_,_ ), 0 , 21 , 0 , 2811 , 30 , 16 ), // #722
- INST(Stc , X86Op , O(000000,F9,_,_,_,_,_,_ ), 0 , 0 , 0 , 2816 , 30 , 17 ), // #723
- INST(Std , X86Op , O(000000,FD,_,_,_,_,_,_ ), 0 , 0 , 0 , 6586 , 30 , 18 ), // #724
- INST(Stgi , X86Op , O(000F01,DC,_,_,_,_,_,_ ), 0 , 21 , 0 , 2820 , 30 , 104), // #725
- INST(Sti , X86Op , O(000000,FB,_,_,_,_,_,_ ), 0 , 0 , 0 , 2825 , 30 , 23 ), // #726
- INST(Stmxcsr , X86M_Only , O(000F00,AE,3,_,_,_,_,_ ), 0 , 71 , 0 , 9876 , 93 , 5 ), // #727
- INST(Stos , X86StrMr , O(000000,AA,_,_,_,_,_,_ ), 0 , 0 , 0 , 2829 , 171, 69 ), // #728
- INST(Str , X86M , O(000F00,00,1,_,_,_,_,_ ), 0 , 27 , 0 , 2834 , 170, 0 ), // #729
- INST(Sub , X86Arith , O(000000,28,5,_,x,_,_,_ ), 0 , 58 , 0 , 836 , 166, 1 ), // #730
- INST(Subpd , ExtRm , O(660F00,5C,_,_,_,_,_,_ ), 0 , 3 , 0 , 4556 , 5 , 4 ), // #731
- INST(Subps , ExtRm , O(000F00,5C,_,_,_,_,_,_ ), 0 , 4 , 0 , 4568 , 5 , 5 ), // #732
- INST(Subsd , ExtRm , O(F20F00,5C,_,_,_,_,_,_ ), 0 , 5 , 0 , 5244 , 6 , 4 ), // #733
- INST(Subss , ExtRm , O(F30F00,5C,_,_,_,_,_,_ ), 0 , 6 , 0 , 5254 , 7 , 5 ), // #734
- INST(Swapgs , X86Op , O(000F01,F8,_,_,_,_,_,_ ), 0 , 21 , 0 , 2838 , 155, 0 ), // #735
- INST(Syscall , X86Op , O(000F00,05,_,_,_,_,_,_ ), 0 , 4 , 0 , 2845 , 155, 0 ), // #736
- INST(Sysenter , X86Op , O(000F00,34,_,_,_,_,_,_ ), 0 , 4 , 0 , 2853 , 30 , 0 ), // #737
- INST(Sysexit , X86Op , O(000F00,35,_,_,_,_,_,_ ), 0 , 4 , 0 , 2862 , 30 , 0 ), // #738
- INST(Sysexit64 , X86Op , O(000F00,35,_,_,_,_,_,_ ), 0 , 4 , 0 , 2870 , 30 , 0 ), // #739
- INST(Sysret , X86Op , O(000F00,07,_,_,_,_,_,_ ), 0 , 4 , 0 , 2880 , 155, 0 ), // #740
- INST(Sysret64 , X86Op , O(000F00,07,_,_,_,_,_,_ ), 0 , 4 , 0 , 2887 , 155, 0 ), // #741
- INST(T1mskc , VexVm_Wx , V(XOP_M9,01,7,0,x,_,_,_ ), 0 , 90 , 0 , 2896 , 14 , 11 ), // #742
- INST(Test , X86Test , O(000000,84,_,_,x,_,_,_ ), O(000000,F6,_,_,x,_,_,_ ), 0 , 78 , 9032 , 172, 1 ), // #743
- INST(Tzcnt , X86Rm_Raw66H , O(F30F00,BC,_,_,x,_,_,_ ), 0 , 6 , 0 , 2903 , 22 , 9 ), // #744
- INST(Tzmsk , VexVm_Wx , V(XOP_M9,01,4,0,x,_,_,_ ), 0 , 91 , 0 , 2909 , 14 , 11 ), // #745
- INST(Ucomisd , ExtRm , O(660F00,2E,_,_,_,_,_,_ ), 0 , 3 , 0 , 9929 , 6 , 39 ), // #746
- INST(Ucomiss , ExtRm , O(000F00,2E,_,_,_,_,_,_ ), 0 , 4 , 0 , 9938 , 7 , 40 ), // #747
- INST(Ud2 , X86Op , O(000F00,0B,_,_,_,_,_,_ ), 0 , 4 , 0 , 2915 , 30 , 0 ), // #748
- INST(Unpckhpd , ExtRm , O(660F00,15,_,_,_,_,_,_ ), 0 , 3 , 0 , 9947 , 5 , 4 ), // #749
- INST(Unpckhps , ExtRm , O(000F00,15,_,_,_,_,_,_ ), 0 , 4 , 0 , 9957 , 5 , 5 ), // #750
- INST(Unpcklpd , ExtRm , O(660F00,14,_,_,_,_,_,_ ), 0 , 3 , 0 , 9967 , 5 , 4 ), // #751
- INST(Unpcklps , ExtRm , O(000F00,14,_,_,_,_,_,_ ), 0 , 4 , 0 , 9977 , 5 , 5 ), // #752
- INST(V4fmaddps , VexRm_T1_4X , E(F20F38,9A,_,2,_,0,2,T4X), 0 , 92 , 0 , 2919 , 173, 105), // #753
- INST(V4fmaddss , VexRm_T1_4X , E(F20F38,9B,_,2,_,0,2,T4X), 0 , 92 , 0 , 2929 , 174, 105), // #754
- INST(V4fnmaddps , VexRm_T1_4X , E(F20F38,AA,_,2,_,0,2,T4X), 0 , 92 , 0 , 2939 , 173, 105), // #755
- INST(V4fnmaddss , VexRm_T1_4X , E(F20F38,AB,_,2,_,0,2,T4X), 0 , 92 , 0 , 2950 , 174, 105), // #756
- INST(Vaddpd , VexRvm_Lx , V(660F00,58,_,x,I,1,4,FV ), 0 , 93 , 0 , 2961 , 175, 106), // #757
- INST(Vaddps , VexRvm_Lx , V(000F00,58,_,x,I,0,4,FV ), 0 , 94 , 0 , 2968 , 176, 106), // #758
- INST(Vaddsd , VexRvm , V(F20F00,58,_,I,I,1,3,T1S), 0 , 95 , 0 , 2975 , 177, 107), // #759
- INST(Vaddss , VexRvm , V(F30F00,58,_,I,I,0,2,T1S), 0 , 96 , 0 , 2982 , 178, 107), // #760
- INST(Vaddsubpd , VexRvm_Lx , V(660F00,D0,_,x,I,_,_,_ ), 0 , 63 , 0 , 2989 , 179, 108), // #761
- INST(Vaddsubps , VexRvm_Lx , V(F20F00,D0,_,x,I,_,_,_ ), 0 , 97 , 0 , 2999 , 179, 108), // #762
- INST(Vaesdec , VexRvm_Lx , V(660F38,DE,_,x,I,_,4,FVM), 0 , 98 , 0 , 3009 , 180, 109), // #763
- INST(Vaesdeclast , VexRvm_Lx , V(660F38,DF,_,x,I,_,4,FVM), 0 , 98 , 0 , 3017 , 180, 109), // #764
- INST(Vaesenc , VexRvm_Lx , V(660F38,DC,_,x,I,_,4,FVM), 0 , 98 , 0 , 3029 , 180, 109), // #765
- INST(Vaesenclast , VexRvm_Lx , V(660F38,DD,_,x,I,_,4,FVM), 0 , 98 , 0 , 3037 , 180, 109), // #766
- INST(Vaesimc , VexRm , V(660F38,DB,_,0,I,_,_,_ ), 0 , 88 , 0 , 3049 , 181, 110), // #767
- INST(Vaeskeygenassist , VexRmi , V(660F3A,DF,_,0,I,_,_,_ ), 0 , 67 , 0 , 3057 , 182, 110), // #768
- INST(Valignd , VexRvmi_Lx , E(660F3A,03,_,x,_,0,4,FV ), 0 , 99 , 0 , 3074 , 183, 111), // #769
- INST(Valignq , VexRvmi_Lx , E(660F3A,03,_,x,_,1,4,FV ), 0 , 100, 0 , 3082 , 184, 111), // #770
- INST(Vandnpd , VexRvm_Lx , V(660F00,55,_,x,I,1,4,FV ), 0 , 93 , 0 , 3090 , 185, 112), // #771
- INST(Vandnps , VexRvm_Lx , V(000F00,55,_,x,I,0,4,FV ), 0 , 94 , 0 , 3098 , 186, 112), // #772
- INST(Vandpd , VexRvm_Lx , V(660F00,54,_,x,I,1,4,FV ), 0 , 93 , 0 , 3106 , 187, 112), // #773
- INST(Vandps , VexRvm_Lx , V(000F00,54,_,x,I,0,4,FV ), 0 , 94 , 0 , 3113 , 188, 112), // #774
- INST(Vblendmb , VexRvm_Lx , E(660F38,66,_,x,_,0,4,FVM), 0 , 101, 0 , 3120 , 189, 113), // #775
- INST(Vblendmd , VexRvm_Lx , E(660F38,64,_,x,_,0,4,FV ), 0 , 102, 0 , 3129 , 190, 111), // #776
- INST(Vblendmpd , VexRvm_Lx , E(660F38,65,_,x,_,1,4,FV ), 0 , 103, 0 , 3138 , 191, 111), // #777
- INST(Vblendmps , VexRvm_Lx , E(660F38,65,_,x,_,0,4,FV ), 0 , 102, 0 , 3148 , 190, 111), // #778
- INST(Vblendmq , VexRvm_Lx , E(660F38,64,_,x,_,1,4,FV ), 0 , 103, 0 , 3158 , 191, 111), // #779
- INST(Vblendmw , VexRvm_Lx , E(660F38,66,_,x,_,1,4,FVM), 0 , 104, 0 , 3167 , 189, 113), // #780
- INST(Vblendpd , VexRvmi_Lx , V(660F3A,0D,_,x,I,_,_,_ ), 0 , 67 , 0 , 3176 , 192, 108), // #781
- INST(Vblendps , VexRvmi_Lx , V(660F3A,0C,_,x,I,_,_,_ ), 0 , 67 , 0 , 3185 , 192, 108), // #782
- INST(Vblendvpd , VexRvmr_Lx , V(660F3A,4B,_,x,0,_,_,_ ), 0 , 67 , 0 , 3194 , 193, 108), // #783
- INST(Vblendvps , VexRvmr_Lx , V(660F3A,4A,_,x,0,_,_,_ ), 0 , 67 , 0 , 3204 , 193, 108), // #784
- INST(Vbroadcastf128 , VexRm , V(660F38,1A,_,1,0,_,_,_ ), 0 , 105, 0 , 3214 , 194, 108), // #785
- INST(Vbroadcastf32x2 , VexRm_Lx , E(660F38,19,_,x,_,0,3,T2 ), 0 , 106, 0 , 3229 , 195, 114), // #786
- INST(Vbroadcastf32x4 , VexRm_Lx , E(660F38,1A,_,x,_,0,4,T4 ), 0 , 107, 0 , 3245 , 196, 63 ), // #787
- INST(Vbroadcastf32x8 , VexRm , E(660F38,1B,_,2,_,0,5,T8 ), 0 , 108, 0 , 3261 , 197, 61 ), // #788
- INST(Vbroadcastf64x2 , VexRm_Lx , E(660F38,1A,_,x,_,1,4,T2 ), 0 , 109, 0 , 3277 , 196, 114), // #789
- INST(Vbroadcastf64x4 , VexRm , E(660F38,1B,_,2,_,1,5,T4 ), 0 , 110, 0 , 3293 , 197, 63 ), // #790
- INST(Vbroadcasti128 , VexRm , V(660F38,5A,_,1,0,_,_,_ ), 0 , 105, 0 , 3309 , 194, 115), // #791
- INST(Vbroadcasti32x2 , VexRm_Lx , E(660F38,59,_,x,_,0,3,T2 ), 0 , 106, 0 , 3324 , 198, 114), // #792
- INST(Vbroadcasti32x4 , VexRm_Lx , E(660F38,5A,_,x,_,0,4,T4 ), 0 , 107, 0 , 3340 , 196, 111), // #793
- INST(Vbroadcasti32x8 , VexRm , E(660F38,5B,_,2,_,0,5,T8 ), 0 , 108, 0 , 3356 , 197, 61 ), // #794
- INST(Vbroadcasti64x2 , VexRm_Lx , E(660F38,5A,_,x,_,1,4,T2 ), 0 , 109, 0 , 3372 , 196, 114), // #795
- INST(Vbroadcasti64x4 , VexRm , E(660F38,5B,_,2,_,1,5,T4 ), 0 , 110, 0 , 3388 , 197, 63 ), // #796
- INST(Vbroadcastsd , VexRm_Lx , V(660F38,19,_,x,0,1,3,T1S), 0 , 111, 0 , 3404 , 199, 116), // #797
- INST(Vbroadcastss , VexRm_Lx , V(660F38,18,_,x,0,0,2,T1S), 0 , 112, 0 , 3417 , 200, 116), // #798
- INST(Vcmppd , VexRvmi_Lx , V(660F00,C2,_,x,I,1,4,FV ), 0 , 93 , 0 , 3430 , 201, 106), // #799
- INST(Vcmpps , VexRvmi_Lx , V(000F00,C2,_,x,I,0,4,FV ), 0 , 94 , 0 , 3437 , 202, 106), // #800
- INST(Vcmpsd , VexRvmi , V(F20F00,C2,_,I,I,1,3,T1S), 0 , 95 , 0 , 3444 , 203, 107), // #801
- INST(Vcmpss , VexRvmi , V(F30F00,C2,_,I,I,0,2,T1S), 0 , 96 , 0 , 3451 , 204, 107), // #802
- INST(Vcomisd , VexRm , V(660F00,2F,_,I,I,1,3,T1S), 0 , 113, 0 , 3458 , 205, 117), // #803
- INST(Vcomiss , VexRm , V(000F00,2F,_,I,I,0,2,T1S), 0 , 114, 0 , 3466 , 206, 117), // #804
- INST(Vcompresspd , VexMr_Lx , E(660F38,8A,_,x,_,1,3,T1S), 0 , 115, 0 , 3474 , 207, 111), // #805
- INST(Vcompressps , VexMr_Lx , E(660F38,8A,_,x,_,0,2,T1S), 0 , 116, 0 , 3486 , 207, 111), // #806
- INST(Vcvtdq2pd , VexRm_Lx , V(F30F00,E6,_,x,I,0,3,HV ), 0 , 117, 0 , 3498 , 208, 106), // #807
- INST(Vcvtdq2ps , VexRm_Lx , V(000F00,5B,_,x,I,0,4,FV ), 0 , 94 , 0 , 3508 , 209, 106), // #808
- INST(Vcvtne2ps2bf16 , VexRvm , E(F20F38,72,_,_,_,0,_,_ ), 0 , 118, 0 , 3518 , 190, 118), // #809
- INST(Vcvtneps2bf16 , VexRm , E(F30F38,72,_,_,_,0,_,_ ), 0 , 119, 0 , 3533 , 210, 118), // #810
- INST(Vcvtpd2dq , VexRm_Lx , V(F20F00,E6,_,x,I,1,4,FV ), 0 , 120, 0 , 3547 , 211, 106), // #811
- INST(Vcvtpd2ps , VexRm_Lx , V(660F00,5A,_,x,I,1,4,FV ), 0 , 93 , 0 , 3557 , 211, 106), // #812
- INST(Vcvtpd2qq , VexRm_Lx , E(660F00,7B,_,x,_,1,4,FV ), 0 , 121, 0 , 3567 , 212, 114), // #813
- INST(Vcvtpd2udq , VexRm_Lx , E(000F00,79,_,x,_,1,4,FV ), 0 , 122, 0 , 3577 , 213, 111), // #814
- INST(Vcvtpd2uqq , VexRm_Lx , E(660F00,79,_,x,_,1,4,FV ), 0 , 121, 0 , 3588 , 212, 114), // #815
- INST(Vcvtph2ps , VexRm_Lx , V(660F38,13,_,x,0,0,3,HVM), 0 , 123, 0 , 3599 , 214, 119), // #816
- INST(Vcvtps2dq , VexRm_Lx , V(660F00,5B,_,x,I,0,4,FV ), 0 , 124, 0 , 3609 , 209, 106), // #817
- INST(Vcvtps2pd , VexRm_Lx , V(000F00,5A,_,x,I,0,4,HV ), 0 , 125, 0 , 3619 , 215, 106), // #818
- INST(Vcvtps2ph , VexMri_Lx , V(660F3A,1D,_,x,0,0,3,HVM), 0 , 126, 0 , 3629 , 216, 119), // #819
- INST(Vcvtps2qq , VexRm_Lx , E(660F00,7B,_,x,_,0,3,HV ), 0 , 127, 0 , 3639 , 217, 114), // #820
- INST(Vcvtps2udq , VexRm_Lx , E(000F00,79,_,x,_,0,4,FV ), 0 , 128, 0 , 3649 , 218, 111), // #821
- INST(Vcvtps2uqq , VexRm_Lx , E(660F00,79,_,x,_,0,3,HV ), 0 , 127, 0 , 3660 , 217, 114), // #822
- INST(Vcvtqq2pd , VexRm_Lx , E(F30F00,E6,_,x,_,1,4,FV ), 0 , 129, 0 , 3671 , 212, 114), // #823
- INST(Vcvtqq2ps , VexRm_Lx , E(000F00,5B,_,x,_,1,4,FV ), 0 , 122, 0 , 3681 , 213, 114), // #824
- INST(Vcvtsd2si , VexRm_Wx , V(F20F00,2D,_,I,x,x,3,T1F), 0 , 130, 0 , 3691 , 219, 107), // #825
- INST(Vcvtsd2ss , VexRvm , V(F20F00,5A,_,I,I,1,3,T1S), 0 , 95 , 0 , 3701 , 177, 107), // #826
- INST(Vcvtsd2usi , VexRm_Wx , E(F20F00,79,_,I,_,x,3,T1F), 0 , 131, 0 , 3711 , 220, 63 ), // #827
- INST(Vcvtsi2sd , VexRvm_Wx , V(F20F00,2A,_,I,x,x,2,T1W), 0 , 132, 0 , 3722 , 221, 107), // #828
- INST(Vcvtsi2ss , VexRvm_Wx , V(F30F00,2A,_,I,x,x,2,T1W), 0 , 133, 0 , 3732 , 221, 107), // #829
- INST(Vcvtss2sd , VexRvm , V(F30F00,5A,_,I,I,0,2,T1S), 0 , 96 , 0 , 3742 , 222, 107), // #830
- INST(Vcvtss2si , VexRm_Wx , V(F30F00,2D,_,I,x,x,2,T1F), 0 , 134, 0 , 3752 , 223, 107), // #831
- INST(Vcvtss2usi , VexRm_Wx , E(F30F00,79,_,I,_,x,2,T1F), 0 , 135, 0 , 3762 , 224, 63 ), // #832
- INST(Vcvttpd2dq , VexRm_Lx , V(660F00,E6,_,x,I,1,4,FV ), 0 , 93 , 0 , 3773 , 225, 106), // #833
- INST(Vcvttpd2qq , VexRm_Lx , E(660F00,7A,_,x,_,1,4,FV ), 0 , 121, 0 , 3784 , 226, 111), // #834
- INST(Vcvttpd2udq , VexRm_Lx , E(000F00,78,_,x,_,1,4,FV ), 0 , 122, 0 , 3795 , 227, 111), // #835
- INST(Vcvttpd2uqq , VexRm_Lx , E(660F00,78,_,x,_,1,4,FV ), 0 , 121, 0 , 3807 , 226, 114), // #836
- INST(Vcvttps2dq , VexRm_Lx , V(F30F00,5B,_,x,I,0,4,FV ), 0 , 136, 0 , 3819 , 228, 106), // #837
- INST(Vcvttps2qq , VexRm_Lx , E(660F00,7A,_,x,_,0,3,HV ), 0 , 127, 0 , 3830 , 229, 114), // #838
- INST(Vcvttps2udq , VexRm_Lx , E(000F00,78,_,x,_,0,4,FV ), 0 , 128, 0 , 3841 , 230, 111), // #839
- INST(Vcvttps2uqq , VexRm_Lx , E(660F00,78,_,x,_,0,3,HV ), 0 , 127, 0 , 3853 , 229, 114), // #840
- INST(Vcvttsd2si , VexRm_Wx , V(F20F00,2C,_,I,x,x,3,T1F), 0 , 130, 0 , 3865 , 231, 107), // #841
- INST(Vcvttsd2usi , VexRm_Wx , E(F20F00,78,_,I,_,x,3,T1F), 0 , 131, 0 , 3876 , 232, 63 ), // #842
- INST(Vcvttss2si , VexRm_Wx , V(F30F00,2C,_,I,x,x,2,T1F), 0 , 134, 0 , 3888 , 233, 107), // #843
- INST(Vcvttss2usi , VexRm_Wx , E(F30F00,78,_,I,_,x,2,T1F), 0 , 135, 0 , 3899 , 234, 63 ), // #844
- INST(Vcvtudq2pd , VexRm_Lx , E(F30F00,7A,_,x,_,0,3,HV ), 0 , 137, 0 , 3911 , 235, 111), // #845
- INST(Vcvtudq2ps , VexRm_Lx , E(F20F00,7A,_,x,_,0,4,FV ), 0 , 138, 0 , 3922 , 218, 111), // #846
- INST(Vcvtuqq2pd , VexRm_Lx , E(F30F00,7A,_,x,_,1,4,FV ), 0 , 129, 0 , 3933 , 212, 114), // #847
- INST(Vcvtuqq2ps , VexRm_Lx , E(F20F00,7A,_,x,_,1,4,FV ), 0 , 139, 0 , 3944 , 213, 114), // #848
- INST(Vcvtusi2sd , VexRvm_Wx , E(F20F00,7B,_,I,_,x,2,T1W), 0 , 140, 0 , 3955 , 236, 63 ), // #849
- INST(Vcvtusi2ss , VexRvm_Wx , E(F30F00,7B,_,I,_,x,2,T1W), 0 , 141, 0 , 3966 , 236, 63 ), // #850
- INST(Vdbpsadbw , VexRvmi_Lx , E(660F3A,42,_,x,_,0,4,FVM), 0 , 142, 0 , 3977 , 237, 113), // #851
- INST(Vdivpd , VexRvm_Lx , V(660F00,5E,_,x,I,1,4,FV ), 0 , 93 , 0 , 3987 , 175, 106), // #852
- INST(Vdivps , VexRvm_Lx , V(000F00,5E,_,x,I,0,4,FV ), 0 , 94 , 0 , 3994 , 176, 106), // #853
- INST(Vdivsd , VexRvm , V(F20F00,5E,_,I,I,1,3,T1S), 0 , 95 , 0 , 4001 , 177, 107), // #854
- INST(Vdivss , VexRvm , V(F30F00,5E,_,I,I,0,2,T1S), 0 , 96 , 0 , 4008 , 178, 107), // #855
- INST(Vdpbf16ps , VexRvm , E(F30F38,52,_,_,_,0,_,_ ), 0 , 119, 0 , 4015 , 190, 118), // #856
- INST(Vdppd , VexRvmi_Lx , V(660F3A,41,_,x,I,_,_,_ ), 0 , 67 , 0 , 4025 , 238, 108), // #857
- INST(Vdpps , VexRvmi_Lx , V(660F3A,40,_,x,I,_,_,_ ), 0 , 67 , 0 , 4031 , 192, 108), // #858
- INST(Verr , X86M_NoSize , O(000F00,00,4,_,_,_,_,_ ), 0 , 89 , 0 , 4037 , 97 , 10 ), // #859
- INST(Verw , X86M_NoSize , O(000F00,00,5,_,_,_,_,_ ), 0 , 70 , 0 , 4042 , 97 , 10 ), // #860
- INST(Vexp2pd , VexRm , E(660F38,C8,_,2,_,1,4,FV ), 0 , 143, 0 , 4047 , 239, 120), // #861
- INST(Vexp2ps , VexRm , E(660F38,C8,_,2,_,0,4,FV ), 0 , 144, 0 , 4055 , 240, 120), // #862
- INST(Vexpandpd , VexRm_Lx , E(660F38,88,_,x,_,1,3,T1S), 0 , 115, 0 , 4063 , 241, 111), // #863
- INST(Vexpandps , VexRm_Lx , E(660F38,88,_,x,_,0,2,T1S), 0 , 116, 0 , 4073 , 241, 111), // #864
- INST(Vextractf128 , VexMri , V(660F3A,19,_,1,0,_,_,_ ), 0 , 145, 0 , 4083 , 242, 108), // #865
- INST(Vextractf32x4 , VexMri_Lx , E(660F3A,19,_,x,_,0,4,T4 ), 0 , 146, 0 , 4096 , 243, 111), // #866
- INST(Vextractf32x8 , VexMri , E(660F3A,1B,_,2,_,0,5,T8 ), 0 , 147, 0 , 4110 , 244, 61 ), // #867
- INST(Vextractf64x2 , VexMri_Lx , E(660F3A,19,_,x,_,1,4,T2 ), 0 , 148, 0 , 4124 , 243, 114), // #868
- INST(Vextractf64x4 , VexMri , E(660F3A,1B,_,2,_,1,5,T4 ), 0 , 149, 0 , 4138 , 244, 63 ), // #869
- INST(Vextracti128 , VexMri , V(660F3A,39,_,1,0,_,_,_ ), 0 , 145, 0 , 4152 , 242, 115), // #870
- INST(Vextracti32x4 , VexMri_Lx , E(660F3A,39,_,x,_,0,4,T4 ), 0 , 146, 0 , 4165 , 243, 111), // #871
- INST(Vextracti32x8 , VexMri , E(660F3A,3B,_,2,_,0,5,T8 ), 0 , 147, 0 , 4179 , 244, 61 ), // #872
- INST(Vextracti64x2 , VexMri_Lx , E(660F3A,39,_,x,_,1,4,T2 ), 0 , 148, 0 , 4193 , 243, 114), // #873
- INST(Vextracti64x4 , VexMri , E(660F3A,3B,_,2,_,1,5,T4 ), 0 , 149, 0 , 4207 , 244, 63 ), // #874
- INST(Vextractps , VexMri , V(660F3A,17,_,0,I,I,2,T1S), 0 , 150, 0 , 4221 , 245, 107), // #875
- INST(Vfixupimmpd , VexRvmi_Lx , E(660F3A,54,_,x,_,1,4,FV ), 0 , 100, 0 , 4232 , 246, 111), // #876
- INST(Vfixupimmps , VexRvmi_Lx , E(660F3A,54,_,x,_,0,4,FV ), 0 , 99 , 0 , 4244 , 247, 111), // #877
- INST(Vfixupimmsd , VexRvmi , E(660F3A,55,_,I,_,1,3,T1S), 0 , 151, 0 , 4256 , 248, 63 ), // #878
- INST(Vfixupimmss , VexRvmi , E(660F3A,55,_,I,_,0,2,T1S), 0 , 152, 0 , 4268 , 249, 63 ), // #879
- INST(Vfmadd132pd , VexRvm_Lx , V(660F38,98,_,x,1,1,4,FV ), 0 , 153, 0 , 4280 , 175, 121), // #880
- INST(Vfmadd132ps , VexRvm_Lx , V(660F38,98,_,x,0,0,4,FV ), 0 , 154, 0 , 4292 , 176, 121), // #881
- INST(Vfmadd132sd , VexRvm , V(660F38,99,_,I,1,1,3,T1S), 0 , 155, 0 , 4304 , 177, 122), // #882
- INST(Vfmadd132ss , VexRvm , V(660F38,99,_,I,0,0,2,T1S), 0 , 112, 0 , 4316 , 178, 122), // #883
- INST(Vfmadd213pd , VexRvm_Lx , V(660F38,A8,_,x,1,1,4,FV ), 0 , 153, 0 , 4328 , 175, 121), // #884
- INST(Vfmadd213ps , VexRvm_Lx , V(660F38,A8,_,x,0,0,4,FV ), 0 , 154, 0 , 4340 , 176, 121), // #885
- INST(Vfmadd213sd , VexRvm , V(660F38,A9,_,I,1,1,3,T1S), 0 , 155, 0 , 4352 , 177, 122), // #886
- INST(Vfmadd213ss , VexRvm , V(660F38,A9,_,I,0,0,2,T1S), 0 , 112, 0 , 4364 , 178, 122), // #887
- INST(Vfmadd231pd , VexRvm_Lx , V(660F38,B8,_,x,1,1,4,FV ), 0 , 153, 0 , 4376 , 175, 121), // #888
- INST(Vfmadd231ps , VexRvm_Lx , V(660F38,B8,_,x,0,0,4,FV ), 0 , 154, 0 , 4388 , 176, 121), // #889
- INST(Vfmadd231sd , VexRvm , V(660F38,B9,_,I,1,1,3,T1S), 0 , 155, 0 , 4400 , 177, 122), // #890
- INST(Vfmadd231ss , VexRvm , V(660F38,B9,_,I,0,0,2,T1S), 0 , 112, 0 , 4412 , 178, 122), // #891
- INST(Vfmaddpd , Fma4_Lx , V(660F3A,69,_,x,x,_,_,_ ), 0 , 67 , 0 , 4424 , 250, 123), // #892
- INST(Vfmaddps , Fma4_Lx , V(660F3A,68,_,x,x,_,_,_ ), 0 , 67 , 0 , 4433 , 250, 123), // #893
- INST(Vfmaddsd , Fma4 , V(660F3A,6B,_,0,x,_,_,_ ), 0 , 67 , 0 , 4442 , 251, 123), // #894
- INST(Vfmaddss , Fma4 , V(660F3A,6A,_,0,x,_,_,_ ), 0 , 67 , 0 , 4451 , 252, 123), // #895
- INST(Vfmaddsub132pd , VexRvm_Lx , V(660F38,96,_,x,1,1,4,FV ), 0 , 153, 0 , 4460 , 175, 121), // #896
- INST(Vfmaddsub132ps , VexRvm_Lx , V(660F38,96,_,x,0,0,4,FV ), 0 , 154, 0 , 4475 , 176, 121), // #897
- INST(Vfmaddsub213pd , VexRvm_Lx , V(660F38,A6,_,x,1,1,4,FV ), 0 , 153, 0 , 4490 , 175, 121), // #898
- INST(Vfmaddsub213ps , VexRvm_Lx , V(660F38,A6,_,x,0,0,4,FV ), 0 , 154, 0 , 4505 , 176, 121), // #899
- INST(Vfmaddsub231pd , VexRvm_Lx , V(660F38,B6,_,x,1,1,4,FV ), 0 , 153, 0 , 4520 , 175, 121), // #900
- INST(Vfmaddsub231ps , VexRvm_Lx , V(660F38,B6,_,x,0,0,4,FV ), 0 , 154, 0 , 4535 , 176, 121), // #901
- INST(Vfmaddsubpd , Fma4_Lx , V(660F3A,5D,_,x,x,_,_,_ ), 0 , 67 , 0 , 4550 , 250, 123), // #902
- INST(Vfmaddsubps , Fma4_Lx , V(660F3A,5C,_,x,x,_,_,_ ), 0 , 67 , 0 , 4562 , 250, 123), // #903
- INST(Vfmsub132pd , VexRvm_Lx , V(660F38,9A,_,x,1,1,4,FV ), 0 , 153, 0 , 4574 , 175, 121), // #904
- INST(Vfmsub132ps , VexRvm_Lx , V(660F38,9A,_,x,0,0,4,FV ), 0 , 154, 0 , 4586 , 176, 121), // #905
- INST(Vfmsub132sd , VexRvm , V(660F38,9B,_,I,1,1,3,T1S), 0 , 155, 0 , 4598 , 177, 122), // #906
- INST(Vfmsub132ss , VexRvm , V(660F38,9B,_,I,0,0,2,T1S), 0 , 112, 0 , 4610 , 178, 122), // #907
- INST(Vfmsub213pd , VexRvm_Lx , V(660F38,AA,_,x,1,1,4,FV ), 0 , 153, 0 , 4622 , 175, 121), // #908
- INST(Vfmsub213ps , VexRvm_Lx , V(660F38,AA,_,x,0,0,4,FV ), 0 , 154, 0 , 4634 , 176, 121), // #909
- INST(Vfmsub213sd , VexRvm , V(660F38,AB,_,I,1,1,3,T1S), 0 , 155, 0 , 4646 , 177, 122), // #910
- INST(Vfmsub213ss , VexRvm , V(660F38,AB,_,I,0,0,2,T1S), 0 , 112, 0 , 4658 , 178, 122), // #911
- INST(Vfmsub231pd , VexRvm_Lx , V(660F38,BA,_,x,1,1,4,FV ), 0 , 153, 0 , 4670 , 175, 121), // #912
- INST(Vfmsub231ps , VexRvm_Lx , V(660F38,BA,_,x,0,0,4,FV ), 0 , 154, 0 , 4682 , 176, 121), // #913
- INST(Vfmsub231sd , VexRvm , V(660F38,BB,_,I,1,1,3,T1S), 0 , 155, 0 , 4694 , 177, 122), // #914
- INST(Vfmsub231ss , VexRvm , V(660F38,BB,_,I,0,0,2,T1S), 0 , 112, 0 , 4706 , 178, 122), // #915
- INST(Vfmsubadd132pd , VexRvm_Lx , V(660F38,97,_,x,1,1,4,FV ), 0 , 153, 0 , 4718 , 175, 121), // #916
- INST(Vfmsubadd132ps , VexRvm_Lx , V(660F38,97,_,x,0,0,4,FV ), 0 , 154, 0 , 4733 , 176, 121), // #917
- INST(Vfmsubadd213pd , VexRvm_Lx , V(660F38,A7,_,x,1,1,4,FV ), 0 , 153, 0 , 4748 , 175, 121), // #918
- INST(Vfmsubadd213ps , VexRvm_Lx , V(660F38,A7,_,x,0,0,4,FV ), 0 , 154, 0 , 4763 , 176, 121), // #919
- INST(Vfmsubadd231pd , VexRvm_Lx , V(660F38,B7,_,x,1,1,4,FV ), 0 , 153, 0 , 4778 , 175, 121), // #920
- INST(Vfmsubadd231ps , VexRvm_Lx , V(660F38,B7,_,x,0,0,4,FV ), 0 , 154, 0 , 4793 , 176, 121), // #921
- INST(Vfmsubaddpd , Fma4_Lx , V(660F3A,5F,_,x,x,_,_,_ ), 0 , 67 , 0 , 4808 , 250, 123), // #922
- INST(Vfmsubaddps , Fma4_Lx , V(660F3A,5E,_,x,x,_,_,_ ), 0 , 67 , 0 , 4820 , 250, 123), // #923
- INST(Vfmsubpd , Fma4_Lx , V(660F3A,6D,_,x,x,_,_,_ ), 0 , 67 , 0 , 4832 , 250, 123), // #924
- INST(Vfmsubps , Fma4_Lx , V(660F3A,6C,_,x,x,_,_,_ ), 0 , 67 , 0 , 4841 , 250, 123), // #925
- INST(Vfmsubsd , Fma4 , V(660F3A,6F,_,0,x,_,_,_ ), 0 , 67 , 0 , 4850 , 251, 123), // #926
- INST(Vfmsubss , Fma4 , V(660F3A,6E,_,0,x,_,_,_ ), 0 , 67 , 0 , 4859 , 252, 123), // #927
- INST(Vfnmadd132pd , VexRvm_Lx , V(660F38,9C,_,x,1,1,4,FV ), 0 , 153, 0 , 4868 , 175, 121), // #928
- INST(Vfnmadd132ps , VexRvm_Lx , V(660F38,9C,_,x,0,0,4,FV ), 0 , 154, 0 , 4881 , 176, 121), // #929
- INST(Vfnmadd132sd , VexRvm , V(660F38,9D,_,I,1,1,3,T1S), 0 , 155, 0 , 4894 , 177, 122), // #930
- INST(Vfnmadd132ss , VexRvm , V(660F38,9D,_,I,0,0,2,T1S), 0 , 112, 0 , 4907 , 178, 122), // #931
- INST(Vfnmadd213pd , VexRvm_Lx , V(660F38,AC,_,x,1,1,4,FV ), 0 , 153, 0 , 4920 , 175, 121), // #932
- INST(Vfnmadd213ps , VexRvm_Lx , V(660F38,AC,_,x,0,0,4,FV ), 0 , 154, 0 , 4933 , 176, 121), // #933
- INST(Vfnmadd213sd , VexRvm , V(660F38,AD,_,I,1,1,3,T1S), 0 , 155, 0 , 4946 , 177, 122), // #934
- INST(Vfnmadd213ss , VexRvm , V(660F38,AD,_,I,0,0,2,T1S), 0 , 112, 0 , 4959 , 178, 122), // #935
- INST(Vfnmadd231pd , VexRvm_Lx , V(660F38,BC,_,x,1,1,4,FV ), 0 , 153, 0 , 4972 , 175, 121), // #936
- INST(Vfnmadd231ps , VexRvm_Lx , V(660F38,BC,_,x,0,0,4,FV ), 0 , 154, 0 , 4985 , 176, 121), // #937
- INST(Vfnmadd231sd , VexRvm , V(660F38,BC,_,I,1,1,3,T1S), 0 , 155, 0 , 4998 , 177, 122), // #938
- INST(Vfnmadd231ss , VexRvm , V(660F38,BC,_,I,0,0,2,T1S), 0 , 112, 0 , 5011 , 178, 122), // #939
- INST(Vfnmaddpd , Fma4_Lx , V(660F3A,79,_,x,x,_,_,_ ), 0 , 67 , 0 , 5024 , 250, 123), // #940
- INST(Vfnmaddps , Fma4_Lx , V(660F3A,78,_,x,x,_,_,_ ), 0 , 67 , 0 , 5034 , 250, 123), // #941
- INST(Vfnmaddsd , Fma4 , V(660F3A,7B,_,0,x,_,_,_ ), 0 , 67 , 0 , 5044 , 251, 123), // #942
- INST(Vfnmaddss , Fma4 , V(660F3A,7A,_,0,x,_,_,_ ), 0 , 67 , 0 , 5054 , 252, 123), // #943
- INST(Vfnmsub132pd , VexRvm_Lx , V(660F38,9E,_,x,1,1,4,FV ), 0 , 153, 0 , 5064 , 175, 121), // #944
- INST(Vfnmsub132ps , VexRvm_Lx , V(660F38,9E,_,x,0,0,4,FV ), 0 , 154, 0 , 5077 , 176, 121), // #945
- INST(Vfnmsub132sd , VexRvm , V(660F38,9F,_,I,1,1,3,T1S), 0 , 155, 0 , 5090 , 177, 122), // #946
- INST(Vfnmsub132ss , VexRvm , V(660F38,9F,_,I,0,0,2,T1S), 0 , 112, 0 , 5103 , 178, 122), // #947
- INST(Vfnmsub213pd , VexRvm_Lx , V(660F38,AE,_,x,1,1,4,FV ), 0 , 153, 0 , 5116 , 175, 121), // #948
- INST(Vfnmsub213ps , VexRvm_Lx , V(660F38,AE,_,x,0,0,4,FV ), 0 , 154, 0 , 5129 , 176, 121), // #949
- INST(Vfnmsub213sd , VexRvm , V(660F38,AF,_,I,1,1,3,T1S), 0 , 155, 0 , 5142 , 177, 122), // #950
- INST(Vfnmsub213ss , VexRvm , V(660F38,AF,_,I,0,0,2,T1S), 0 , 112, 0 , 5155 , 178, 122), // #951
- INST(Vfnmsub231pd , VexRvm_Lx , V(660F38,BE,_,x,1,1,4,FV ), 0 , 153, 0 , 5168 , 175, 121), // #952
- INST(Vfnmsub231ps , VexRvm_Lx , V(660F38,BE,_,x,0,0,4,FV ), 0 , 154, 0 , 5181 , 176, 121), // #953
- INST(Vfnmsub231sd , VexRvm , V(660F38,BF,_,I,1,1,3,T1S), 0 , 155, 0 , 5194 , 177, 122), // #954
- INST(Vfnmsub231ss , VexRvm , V(660F38,BF,_,I,0,0,2,T1S), 0 , 112, 0 , 5207 , 178, 122), // #955
- INST(Vfnmsubpd , Fma4_Lx , V(660F3A,7D,_,x,x,_,_,_ ), 0 , 67 , 0 , 5220 , 250, 123), // #956
- INST(Vfnmsubps , Fma4_Lx , V(660F3A,7C,_,x,x,_,_,_ ), 0 , 67 , 0 , 5230 , 250, 123), // #957
- INST(Vfnmsubsd , Fma4 , V(660F3A,7F,_,0,x,_,_,_ ), 0 , 67 , 0 , 5240 , 251, 123), // #958
- INST(Vfnmsubss , Fma4 , V(660F3A,7E,_,0,x,_,_,_ ), 0 , 67 , 0 , 5250 , 252, 123), // #959
- INST(Vfpclasspd , VexRmi_Lx , E(660F3A,66,_,x,_,1,4,FV ), 0 , 100, 0 , 5260 , 253, 114), // #960
- INST(Vfpclassps , VexRmi_Lx , E(660F3A,66,_,x,_,0,4,FV ), 0 , 99 , 0 , 5271 , 254, 114), // #961
- INST(Vfpclasssd , VexRmi_Lx , E(660F3A,67,_,I,_,1,3,T1S), 0 , 151, 0 , 5282 , 255, 61 ), // #962
- INST(Vfpclassss , VexRmi_Lx , E(660F3A,67,_,I,_,0,2,T1S), 0 , 152, 0 , 5293 , 256, 61 ), // #963
- INST(Vfrczpd , VexRm_Lx , V(XOP_M9,81,_,x,0,_,_,_ ), 0 , 72 , 0 , 5304 , 257, 124), // #964
- INST(Vfrczps , VexRm_Lx , V(XOP_M9,80,_,x,0,_,_,_ ), 0 , 72 , 0 , 5312 , 257, 124), // #965
- INST(Vfrczsd , VexRm , V(XOP_M9,83,_,0,0,_,_,_ ), 0 , 72 , 0 , 5320 , 258, 124), // #966
- INST(Vfrczss , VexRm , V(XOP_M9,82,_,0,0,_,_,_ ), 0 , 72 , 0 , 5328 , 259, 124), // #967
- INST(Vgatherdpd , VexRmvRm_VM , V(660F38,92,_,x,1,_,_,_ ), V(660F38,92,_,x,_,1,3,T1S), 156, 79 , 5336 , 260, 125), // #968
- INST(Vgatherdps , VexRmvRm_VM , V(660F38,92,_,x,0,_,_,_ ), V(660F38,92,_,x,_,0,2,T1S), 88 , 80 , 5347 , 261, 125), // #969
- INST(Vgatherpf0dpd , VexM_VM , E(660F38,C6,1,2,_,1,3,T1S), 0 , 157, 0 , 5358 , 262, 126), // #970
- INST(Vgatherpf0dps , VexM_VM , E(660F38,C6,1,2,_,0,2,T1S), 0 , 158, 0 , 5372 , 263, 126), // #971
- INST(Vgatherpf0qpd , VexM_VM , E(660F38,C7,1,2,_,1,3,T1S), 0 , 157, 0 , 5386 , 264, 126), // #972
- INST(Vgatherpf0qps , VexM_VM , E(660F38,C7,1,2,_,0,2,T1S), 0 , 158, 0 , 5400 , 264, 126), // #973
- INST(Vgatherpf1dpd , VexM_VM , E(660F38,C6,2,2,_,1,3,T1S), 0 , 159, 0 , 5414 , 262, 126), // #974
- INST(Vgatherpf1dps , VexM_VM , E(660F38,C6,2,2,_,0,2,T1S), 0 , 160, 0 , 5428 , 263, 126), // #975
- INST(Vgatherpf1qpd , VexM_VM , E(660F38,C7,2,2,_,1,3,T1S), 0 , 159, 0 , 5442 , 264, 126), // #976
- INST(Vgatherpf1qps , VexM_VM , E(660F38,C7,2,2,_,0,2,T1S), 0 , 160, 0 , 5456 , 264, 126), // #977
- INST(Vgatherqpd , VexRmvRm_VM , V(660F38,93,_,x,1,_,_,_ ), V(660F38,93,_,x,_,1,3,T1S), 156, 81 , 5470 , 265, 125), // #978
- INST(Vgatherqps , VexRmvRm_VM , V(660F38,93,_,x,0,_,_,_ ), V(660F38,93,_,x,_,0,2,T1S), 88 , 82 , 5481 , 266, 125), // #979
- INST(Vgetexppd , VexRm_Lx , E(660F38,42,_,x,_,1,4,FV ), 0 , 103, 0 , 5492 , 226, 111), // #980
- INST(Vgetexpps , VexRm_Lx , E(660F38,42,_,x,_,0,4,FV ), 0 , 102, 0 , 5502 , 230, 111), // #981
- INST(Vgetexpsd , VexRvm , E(660F38,43,_,I,_,1,3,T1S), 0 , 115, 0 , 5512 , 267, 63 ), // #982
- INST(Vgetexpss , VexRvm , E(660F38,43,_,I,_,0,2,T1S), 0 , 116, 0 , 5522 , 268, 63 ), // #983
- INST(Vgetmantpd , VexRmi_Lx , E(660F3A,26,_,x,_,1,4,FV ), 0 , 100, 0 , 5532 , 269, 111), // #984
- INST(Vgetmantps , VexRmi_Lx , E(660F3A,26,_,x,_,0,4,FV ), 0 , 99 , 0 , 5543 , 270, 111), // #985
- INST(Vgetmantsd , VexRvmi , E(660F3A,27,_,I,_,1,3,T1S), 0 , 151, 0 , 5554 , 248, 63 ), // #986
- INST(Vgetmantss , VexRvmi , E(660F3A,27,_,I,_,0,2,T1S), 0 , 152, 0 , 5565 , 249, 63 ), // #987
- INST(Vgf2p8affineinvqb, VexRvmi_Lx , V(660F3A,CF,_,x,1,1,4,FV ), 0 , 161, 0 , 5576 , 271, 127), // #988
- INST(Vgf2p8affineqb , VexRvmi_Lx , V(660F3A,CE,_,x,1,1,4,FV ), 0 , 161, 0 , 5594 , 271, 127), // #989
- INST(Vgf2p8mulb , VexRvm_Lx , V(660F38,CF,_,x,0,0,4,FV ), 0 , 154, 0 , 5609 , 272, 127), // #990
- INST(Vhaddpd , VexRvm_Lx , V(660F00,7C,_,x,I,_,_,_ ), 0 , 63 , 0 , 5620 , 179, 108), // #991
- INST(Vhaddps , VexRvm_Lx , V(F20F00,7C,_,x,I,_,_,_ ), 0 , 97 , 0 , 5628 , 179, 108), // #992
- INST(Vhsubpd , VexRvm_Lx , V(660F00,7D,_,x,I,_,_,_ ), 0 , 63 , 0 , 5636 , 179, 108), // #993
- INST(Vhsubps , VexRvm_Lx , V(F20F00,7D,_,x,I,_,_,_ ), 0 , 97 , 0 , 5644 , 179, 108), // #994
- INST(Vinsertf128 , VexRvmi , V(660F3A,18,_,1,0,_,_,_ ), 0 , 145, 0 , 5652 , 273, 108), // #995
- INST(Vinsertf32x4 , VexRvmi_Lx , E(660F3A,18,_,x,_,0,4,T4 ), 0 , 146, 0 , 5664 , 274, 111), // #996
- INST(Vinsertf32x8 , VexRvmi , E(660F3A,1A,_,2,_,0,5,T8 ), 0 , 147, 0 , 5677 , 275, 61 ), // #997
- INST(Vinsertf64x2 , VexRvmi_Lx , E(660F3A,18,_,x,_,1,4,T2 ), 0 , 148, 0 , 5690 , 274, 114), // #998
- INST(Vinsertf64x4 , VexRvmi , E(660F3A,1A,_,2,_,1,5,T4 ), 0 , 149, 0 , 5703 , 275, 63 ), // #999
- INST(Vinserti128 , VexRvmi , V(660F3A,38,_,1,0,_,_,_ ), 0 , 145, 0 , 5716 , 273, 115), // #1000
- INST(Vinserti32x4 , VexRvmi_Lx , E(660F3A,38,_,x,_,0,4,T4 ), 0 , 146, 0 , 5728 , 274, 111), // #1001
- INST(Vinserti32x8 , VexRvmi , E(660F3A,3A,_,2,_,0,5,T8 ), 0 , 147, 0 , 5741 , 275, 61 ), // #1002
- INST(Vinserti64x2 , VexRvmi_Lx , E(660F3A,38,_,x,_,1,4,T2 ), 0 , 148, 0 , 5754 , 274, 114), // #1003
- INST(Vinserti64x4 , VexRvmi , E(660F3A,3A,_,2,_,1,5,T4 ), 0 , 149, 0 , 5767 , 275, 63 ), // #1004
- INST(Vinsertps , VexRvmi , V(660F3A,21,_,0,I,0,2,T1S), 0 , 150, 0 , 5780 , 276, 107), // #1005
- INST(Vlddqu , VexRm_Lx , V(F20F00,F0,_,x,I,_,_,_ ), 0 , 97 , 0 , 5790 , 277, 108), // #1006
- INST(Vldmxcsr , VexM , V(000F00,AE,2,0,I,_,_,_ ), 0 , 162, 0 , 5797 , 278, 108), // #1007
- INST(Vmaskmovdqu , VexRm_ZDI , V(660F00,F7,_,0,I,_,_,_ ), 0 , 63 , 0 , 5806 , 279, 108), // #1008
- INST(Vmaskmovpd , VexRvmMvr_Lx , V(660F38,2D,_,x,0,_,_,_ ), V(660F38,2F,_,x,0,_,_,_ ), 88 , 83 , 5818 , 280, 108), // #1009
- INST(Vmaskmovps , VexRvmMvr_Lx , V(660F38,2C,_,x,0,_,_,_ ), V(660F38,2E,_,x,0,_,_,_ ), 88 , 84 , 5829 , 280, 108), // #1010
- INST(Vmaxpd , VexRvm_Lx , V(660F00,5F,_,x,I,1,4,FV ), 0 , 93 , 0 , 5840 , 281, 106), // #1011
- INST(Vmaxps , VexRvm_Lx , V(000F00,5F,_,x,I,0,4,FV ), 0 , 94 , 0 , 5847 , 282, 106), // #1012
- INST(Vmaxsd , VexRvm , V(F20F00,5F,_,I,I,1,3,T1S), 0 , 95 , 0 , 5854 , 283, 106), // #1013
- INST(Vmaxss , VexRvm , V(F30F00,5F,_,I,I,0,2,T1S), 0 , 96 , 0 , 5861 , 222, 106), // #1014
- INST(Vmcall , X86Op , O(000F01,C1,_,_,_,_,_,_ ), 0 , 21 , 0 , 5868 , 30 , 53 ), // #1015
- INST(Vmclear , X86M_Only , O(660F00,C7,6,_,_,_,_,_ ), 0 , 24 , 0 , 5875 , 284, 53 ), // #1016
- INST(Vmfunc , X86Op , O(000F01,D4,_,_,_,_,_,_ ), 0 , 21 , 0 , 5883 , 30 , 53 ), // #1017
- INST(Vminpd , VexRvm_Lx , V(660F00,5D,_,x,I,1,4,FV ), 0 , 93 , 0 , 5890 , 281, 106), // #1018
- INST(Vminps , VexRvm_Lx , V(000F00,5D,_,x,I,0,4,FV ), 0 , 94 , 0 , 5897 , 282, 106), // #1019
- INST(Vminsd , VexRvm , V(F20F00,5D,_,I,I,1,3,T1S), 0 , 95 , 0 , 5904 , 283, 106), // #1020
- INST(Vminss , VexRvm , V(F30F00,5D,_,I,I,0,2,T1S), 0 , 96 , 0 , 5911 , 222, 106), // #1021
- INST(Vmlaunch , X86Op , O(000F01,C2,_,_,_,_,_,_ ), 0 , 21 , 0 , 5918 , 30 , 53 ), // #1022
- INST(Vmload , X86Op_xAX , O(000F01,DA,_,_,_,_,_,_ ), 0 , 21 , 0 , 5927 , 285, 22 ), // #1023
- INST(Vmmcall , X86Op , O(000F01,D9,_,_,_,_,_,_ ), 0 , 21 , 0 , 5934 , 30 , 22 ), // #1024
- INST(Vmovapd , VexRmMr_Lx , V(660F00,28,_,x,I,1,4,FVM), V(660F00,29,_,x,I,1,4,FVM), 163, 85 , 5942 , 286, 106), // #1025
- INST(Vmovaps , VexRmMr_Lx , V(000F00,28,_,x,I,0,4,FVM), V(000F00,29,_,x,I,0,4,FVM), 164, 86 , 5950 , 286, 106), // #1026
- INST(Vmovd , VexMovdMovq , V(660F00,6E,_,0,0,0,2,T1S), V(660F00,7E,_,0,0,0,2,T1S), 165, 87 , 5958 , 287, 107), // #1027
- INST(Vmovddup , VexRm_Lx , V(F20F00,12,_,x,I,1,3,DUP), 0 , 166, 0 , 5964 , 288, 106), // #1028
- INST(Vmovdqa , VexRmMr_Lx , V(660F00,6F,_,x,I,_,_,_ ), V(660F00,7F,_,x,I,_,_,_ ), 63 , 88 , 5973 , 289, 108), // #1029
- INST(Vmovdqa32 , VexRmMr_Lx , E(660F00,6F,_,x,_,0,4,FVM), E(660F00,7F,_,x,_,0,4,FVM), 167, 89 , 5981 , 290, 111), // #1030
- INST(Vmovdqa64 , VexRmMr_Lx , E(660F00,6F,_,x,_,1,4,FVM), E(660F00,7F,_,x,_,1,4,FVM), 168, 90 , 5991 , 290, 111), // #1031
- INST(Vmovdqu , VexRmMr_Lx , V(F30F00,6F,_,x,I,_,_,_ ), V(F30F00,7F,_,x,I,_,_,_ ), 169, 91 , 6001 , 289, 108), // #1032
- INST(Vmovdqu16 , VexRmMr_Lx , E(F20F00,6F,_,x,_,1,4,FVM), E(F20F00,7F,_,x,_,1,4,FVM), 170, 92 , 6009 , 290, 113), // #1033
- INST(Vmovdqu32 , VexRmMr_Lx , E(F30F00,6F,_,x,_,0,4,FVM), E(F30F00,7F,_,x,_,0,4,FVM), 171, 93 , 6019 , 290, 111), // #1034
- INST(Vmovdqu64 , VexRmMr_Lx , E(F30F00,6F,_,x,_,1,4,FVM), E(F30F00,7F,_,x,_,1,4,FVM), 172, 94 , 6029 , 290, 111), // #1035
- INST(Vmovdqu8 , VexRmMr_Lx , E(F20F00,6F,_,x,_,0,4,FVM), E(F20F00,7F,_,x,_,0,4,FVM), 173, 95 , 6039 , 290, 113), // #1036
- INST(Vmovhlps , VexRvm , V(000F00,12,_,0,I,0,_,_ ), 0 , 66 , 0 , 6048 , 291, 107), // #1037
- INST(Vmovhpd , VexRvmMr , V(660F00,16,_,0,I,1,3,T1S), V(660F00,17,_,0,I,1,3,T1S), 113, 96 , 6057 , 292, 107), // #1038
- INST(Vmovhps , VexRvmMr , V(000F00,16,_,0,I,0,3,T2 ), V(000F00,17,_,0,I,0,3,T2 ), 174, 97 , 6065 , 292, 107), // #1039
- INST(Vmovlhps , VexRvm , V(000F00,16,_,0,I,0,_,_ ), 0 , 66 , 0 , 6073 , 291, 107), // #1040
- INST(Vmovlpd , VexRvmMr , V(660F00,12,_,0,I,1,3,T1S), V(660F00,13,_,0,I,1,3,T1S), 113, 98 , 6082 , 292, 107), // #1041
- INST(Vmovlps , VexRvmMr , V(000F00,12,_,0,I,0,3,T2 ), V(000F00,13,_,0,I,0,3,T2 ), 174, 99 , 6090 , 292, 107), // #1042
- INST(Vmovmskpd , VexRm_Lx , V(660F00,50,_,x,I,_,_,_ ), 0 , 63 , 0 , 6098 , 293, 108), // #1043
- INST(Vmovmskps , VexRm_Lx , V(000F00,50,_,x,I,_,_,_ ), 0 , 66 , 0 , 6108 , 293, 108), // #1044
- INST(Vmovntdq , VexMr_Lx , V(660F00,E7,_,x,I,0,4,FVM), 0 , 175, 0 , 6118 , 294, 106), // #1045
- INST(Vmovntdqa , VexRm_Lx , V(660F38,2A,_,x,I,0,4,FVM), 0 , 98 , 0 , 6127 , 295, 116), // #1046
- INST(Vmovntpd , VexMr_Lx , V(660F00,2B,_,x,I,1,4,FVM), 0 , 163, 0 , 6137 , 294, 106), // #1047
- INST(Vmovntps , VexMr_Lx , V(000F00,2B,_,x,I,0,4,FVM), 0 , 164, 0 , 6146 , 294, 106), // #1048
- INST(Vmovq , VexMovdMovq , V(660F00,6E,_,0,I,1,3,T1S), V(660F00,7E,_,0,I,1,3,T1S), 113, 100, 6155 , 296, 107), // #1049
- INST(Vmovsd , VexMovssMovsd , V(F20F00,10,_,I,I,1,3,T1S), V(F20F00,11,_,I,I,1,3,T1S), 95 , 101, 6161 , 297, 107), // #1050
- INST(Vmovshdup , VexRm_Lx , V(F30F00,16,_,x,I,0,4,FVM), 0 , 176, 0 , 6168 , 298, 106), // #1051
- INST(Vmovsldup , VexRm_Lx , V(F30F00,12,_,x,I,0,4,FVM), 0 , 176, 0 , 6178 , 298, 106), // #1052
- INST(Vmovss , VexMovssMovsd , V(F30F00,10,_,I,I,0,2,T1S), V(F30F00,11,_,I,I,0,2,T1S), 96 , 102, 6188 , 299, 107), // #1053
- INST(Vmovupd , VexRmMr_Lx , V(660F00,10,_,x,I,1,4,FVM), V(660F00,11,_,x,I,1,4,FVM), 163, 103, 6195 , 286, 106), // #1054
- INST(Vmovups , VexRmMr_Lx , V(000F00,10,_,x,I,0,4,FVM), V(000F00,11,_,x,I,0,4,FVM), 164, 104, 6203 , 286, 106), // #1055
- INST(Vmpsadbw , VexRvmi_Lx , V(660F3A,42,_,x,I,_,_,_ ), 0 , 67 , 0 , 6211 , 192, 128), // #1056
- INST(Vmptrld , X86M_Only , O(000F00,C7,6,_,_,_,_,_ ), 0 , 73 , 0 , 6220 , 284, 53 ), // #1057
- INST(Vmptrst , X86M_Only , O(000F00,C7,7,_,_,_,_,_ ), 0 , 22 , 0 , 6228 , 284, 53 ), // #1058
- INST(Vmread , X86Mr_NoSize , O(000F00,78,_,_,_,_,_,_ ), 0 , 4 , 0 , 6236 , 300, 53 ), // #1059
- INST(Vmresume , X86Op , O(000F01,C3,_,_,_,_,_,_ ), 0 , 21 , 0 , 6243 , 30 , 53 ), // #1060
- INST(Vmrun , X86Op_xAX , O(000F01,D8,_,_,_,_,_,_ ), 0 , 21 , 0 , 6252 , 285, 22 ), // #1061
- INST(Vmsave , X86Op_xAX , O(000F01,DB,_,_,_,_,_,_ ), 0 , 21 , 0 , 6258 , 285, 22 ), // #1062
- INST(Vmulpd , VexRvm_Lx , V(660F00,59,_,x,I,1,4,FV ), 0 , 93 , 0 , 6265 , 175, 106), // #1063
- INST(Vmulps , VexRvm_Lx , V(000F00,59,_,x,I,0,4,FV ), 0 , 94 , 0 , 6272 , 176, 106), // #1064
- INST(Vmulsd , VexRvm_Lx , V(F20F00,59,_,I,I,1,3,T1S), 0 , 95 , 0 , 6279 , 177, 107), // #1065
- INST(Vmulss , VexRvm_Lx , V(F30F00,59,_,I,I,0,2,T1S), 0 , 96 , 0 , 6286 , 178, 107), // #1066
- INST(Vmwrite , X86Rm_NoSize , O(000F00,79,_,_,_,_,_,_ ), 0 , 4 , 0 , 6293 , 301, 53 ), // #1067
- INST(Vmxon , X86M_Only , O(F30F00,C7,6,_,_,_,_,_ ), 0 , 177, 0 , 6301 , 284, 53 ), // #1068
- INST(Vorpd , VexRvm_Lx , V(660F00,56,_,x,I,1,4,FV ), 0 , 93 , 0 , 6307 , 187, 112), // #1069
- INST(Vorps , VexRvm_Lx , V(000F00,56,_,x,I,0,4,FV ), 0 , 94 , 0 , 6313 , 188, 112), // #1070
- INST(Vp4dpwssd , VexRm_T1_4X , E(F20F38,52,_,2,_,0,2,T4X), 0 , 92 , 0 , 6319 , 173, 129), // #1071
- INST(Vp4dpwssds , VexRm_T1_4X , E(F20F38,53,_,2,_,0,2,T4X), 0 , 92 , 0 , 6329 , 173, 129), // #1072
- INST(Vpabsb , VexRm_Lx , V(660F38,1C,_,x,I,_,4,FVM), 0 , 98 , 0 , 6340 , 298, 130), // #1073
- INST(Vpabsd , VexRm_Lx , V(660F38,1E,_,x,I,0,4,FV ), 0 , 154, 0 , 6347 , 298, 116), // #1074
- INST(Vpabsq , VexRm_Lx , E(660F38,1F,_,x,_,1,4,FV ), 0 , 103, 0 , 6354 , 241, 111), // #1075
- INST(Vpabsw , VexRm_Lx , V(660F38,1D,_,x,I,_,4,FVM), 0 , 98 , 0 , 6361 , 298, 130), // #1076
- INST(Vpackssdw , VexRvm_Lx , V(660F00,6B,_,x,I,0,4,FV ), 0 , 124, 0 , 6368 , 186, 130), // #1077
- INST(Vpacksswb , VexRvm_Lx , V(660F00,63,_,x,I,I,4,FVM), 0 , 175, 0 , 6378 , 272, 130), // #1078
- INST(Vpackusdw , VexRvm_Lx , V(660F38,2B,_,x,I,0,4,FV ), 0 , 154, 0 , 6388 , 186, 130), // #1079
- INST(Vpackuswb , VexRvm_Lx , V(660F00,67,_,x,I,I,4,FVM), 0 , 175, 0 , 6398 , 272, 130), // #1080
- INST(Vpaddb , VexRvm_Lx , V(660F00,FC,_,x,I,I,4,FVM), 0 , 175, 0 , 6408 , 272, 130), // #1081
- INST(Vpaddd , VexRvm_Lx , V(660F00,FE,_,x,I,0,4,FV ), 0 , 124, 0 , 6415 , 186, 116), // #1082
- INST(Vpaddq , VexRvm_Lx , V(660F00,D4,_,x,I,1,4,FV ), 0 , 93 , 0 , 6422 , 185, 116), // #1083
- INST(Vpaddsb , VexRvm_Lx , V(660F00,EC,_,x,I,I,4,FVM), 0 , 175, 0 , 6429 , 272, 130), // #1084
- INST(Vpaddsw , VexRvm_Lx , V(660F00,ED,_,x,I,I,4,FVM), 0 , 175, 0 , 6437 , 272, 130), // #1085
- INST(Vpaddusb , VexRvm_Lx , V(660F00,DC,_,x,I,I,4,FVM), 0 , 175, 0 , 6445 , 272, 130), // #1086
- INST(Vpaddusw , VexRvm_Lx , V(660F00,DD,_,x,I,I,4,FVM), 0 , 175, 0 , 6454 , 272, 130), // #1087
- INST(Vpaddw , VexRvm_Lx , V(660F00,FD,_,x,I,I,4,FVM), 0 , 175, 0 , 6463 , 272, 130), // #1088
- INST(Vpalignr , VexRvmi_Lx , V(660F3A,0F,_,x,I,I,4,FVM), 0 , 178, 0 , 6470 , 271, 130), // #1089
- INST(Vpand , VexRvm_Lx , V(660F00,DB,_,x,I,_,_,_ ), 0 , 63 , 0 , 6479 , 302, 128), // #1090
- INST(Vpandd , VexRvm_Lx , E(660F00,DB,_,x,_,0,4,FV ), 0 , 179, 0 , 6485 , 303, 111), // #1091
- INST(Vpandn , VexRvm_Lx , V(660F00,DF,_,x,I,_,_,_ ), 0 , 63 , 0 , 6492 , 304, 128), // #1092
- INST(Vpandnd , VexRvm_Lx , E(660F00,DF,_,x,_,0,4,FV ), 0 , 179, 0 , 6499 , 305, 111), // #1093
- INST(Vpandnq , VexRvm_Lx , E(660F00,DF,_,x,_,1,4,FV ), 0 , 121, 0 , 6507 , 306, 111), // #1094
- INST(Vpandq , VexRvm_Lx , E(660F00,DB,_,x,_,1,4,FV ), 0 , 121, 0 , 6515 , 307, 111), // #1095
- INST(Vpavgb , VexRvm_Lx , V(660F00,E0,_,x,I,I,4,FVM), 0 , 175, 0 , 6522 , 272, 130), // #1096
- INST(Vpavgw , VexRvm_Lx , V(660F00,E3,_,x,I,I,4,FVM), 0 , 175, 0 , 6529 , 272, 130), // #1097
- INST(Vpblendd , VexRvmi_Lx , V(660F3A,02,_,x,0,_,_,_ ), 0 , 67 , 0 , 6536 , 192, 115), // #1098
- INST(Vpblendvb , VexRvmr , V(660F3A,4C,_,x,0,_,_,_ ), 0 , 67 , 0 , 6545 , 193, 128), // #1099
- INST(Vpblendw , VexRvmi_Lx , V(660F3A,0E,_,x,I,_,_,_ ), 0 , 67 , 0 , 6555 , 192, 128), // #1100
- INST(Vpbroadcastb , VexRm_Lx_Bcst , V(660F38,78,_,x,0,0,0,T1S), E(660F38,7A,_,x,0,0,0,T1S), 180, 105, 6564 , 308, 131), // #1101
- INST(Vpbroadcastd , VexRm_Lx_Bcst , V(660F38,58,_,x,0,0,2,T1S), E(660F38,7C,_,x,0,0,0,T1S), 112, 106, 6577 , 309, 125), // #1102
- INST(Vpbroadcastmb2d , VexRm_Lx , E(F30F38,3A,_,x,_,0,_,_ ), 0 , 119, 0 , 6590 , 310, 132), // #1103
- INST(Vpbroadcastmb2q , VexRm_Lx , E(F30F38,2A,_,x,_,1,_,_ ), 0 , 181, 0 , 6606 , 310, 132), // #1104
- INST(Vpbroadcastq , VexRm_Lx_Bcst , V(660F38,59,_,x,0,1,3,T1S), E(660F38,7C,_,x,0,1,0,T1S), 111, 107, 6622 , 311, 125), // #1105
- INST(Vpbroadcastw , VexRm_Lx_Bcst , V(660F38,79,_,x,0,0,1,T1S), E(660F38,7B,_,x,0,0,0,T1S), 182, 108, 6635 , 312, 131), // #1106
- INST(Vpclmulqdq , VexRvmi_Lx , V(660F3A,44,_,x,I,_,4,FVM), 0 , 178, 0 , 6648 , 313, 133), // #1107
- INST(Vpcmov , VexRvrmRvmr_Lx , V(XOP_M8,A2,_,x,x,_,_,_ ), 0 , 183, 0 , 6659 , 250, 124), // #1108
- INST(Vpcmpb , VexRvmi_Lx , E(660F3A,3F,_,x,_,0,4,FVM), 0 , 142, 0 , 6666 , 314, 113), // #1109
- INST(Vpcmpd , VexRvmi_Lx , E(660F3A,1F,_,x,_,0,4,FV ), 0 , 99 , 0 , 6673 , 315, 111), // #1110
- INST(Vpcmpeqb , VexRvm_Lx , V(660F00,74,_,x,I,I,4,FV ), 0 , 124, 0 , 6680 , 316, 130), // #1111
- INST(Vpcmpeqd , VexRvm_Lx , V(660F00,76,_,x,I,0,4,FVM), 0 , 175, 0 , 6689 , 317, 116), // #1112
- INST(Vpcmpeqq , VexRvm_Lx , V(660F38,29,_,x,I,1,4,FVM), 0 , 184, 0 , 6698 , 318, 116), // #1113
- INST(Vpcmpeqw , VexRvm_Lx , V(660F00,75,_,x,I,I,4,FV ), 0 , 124, 0 , 6707 , 316, 130), // #1114
- INST(Vpcmpestri , VexRmi , V(660F3A,61,_,0,I,_,_,_ ), 0 , 67 , 0 , 6716 , 319, 134), // #1115
- INST(Vpcmpestrm , VexRmi , V(660F3A,60,_,0,I,_,_,_ ), 0 , 67 , 0 , 6727 , 320, 134), // #1116
- INST(Vpcmpgtb , VexRvm_Lx , V(660F00,64,_,x,I,I,4,FV ), 0 , 124, 0 , 6738 , 316, 130), // #1117
- INST(Vpcmpgtd , VexRvm_Lx , V(660F00,66,_,x,I,0,4,FVM), 0 , 175, 0 , 6747 , 317, 116), // #1118
- INST(Vpcmpgtq , VexRvm_Lx , V(660F38,37,_,x,I,1,4,FVM), 0 , 184, 0 , 6756 , 318, 116), // #1119
- INST(Vpcmpgtw , VexRvm_Lx , V(660F00,65,_,x,I,I,4,FV ), 0 , 124, 0 , 6765 , 316, 130), // #1120
- INST(Vpcmpistri , VexRmi , V(660F3A,63,_,0,I,_,_,_ ), 0 , 67 , 0 , 6774 , 321, 134), // #1121
- INST(Vpcmpistrm , VexRmi , V(660F3A,62,_,0,I,_,_,_ ), 0 , 67 , 0 , 6785 , 322, 134), // #1122
- INST(Vpcmpq , VexRvmi_Lx , E(660F3A,1F,_,x,_,1,4,FV ), 0 , 100, 0 , 6796 , 323, 111), // #1123
- INST(Vpcmpub , VexRvmi_Lx , E(660F3A,3E,_,x,_,0,4,FVM), 0 , 142, 0 , 6803 , 314, 113), // #1124
- INST(Vpcmpud , VexRvmi_Lx , E(660F3A,1E,_,x,_,0,4,FV ), 0 , 99 , 0 , 6811 , 315, 111), // #1125
- INST(Vpcmpuq , VexRvmi_Lx , E(660F3A,1E,_,x,_,1,4,FV ), 0 , 100, 0 , 6819 , 323, 111), // #1126
- INST(Vpcmpuw , VexRvmi_Lx , E(660F3A,3E,_,x,_,1,4,FVM), 0 , 185, 0 , 6827 , 323, 113), // #1127
- INST(Vpcmpw , VexRvmi_Lx , E(660F3A,3F,_,x,_,1,4,FVM), 0 , 185, 0 , 6835 , 323, 113), // #1128
- INST(Vpcomb , VexRvmi , V(XOP_M8,CC,_,0,0,_,_,_ ), 0 , 183, 0 , 6842 , 238, 124), // #1129
- INST(Vpcomd , VexRvmi , V(XOP_M8,CE,_,0,0,_,_,_ ), 0 , 183, 0 , 6849 , 238, 124), // #1130
- INST(Vpcompressb , VexMr_Lx , E(660F38,63,_,x,_,0,0,T1S), 0 , 186, 0 , 6856 , 207, 135), // #1131
- INST(Vpcompressd , VexMr_Lx , E(660F38,8B,_,x,_,0,2,T1S), 0 , 116, 0 , 6868 , 207, 111), // #1132
- INST(Vpcompressq , VexMr_Lx , E(660F38,8B,_,x,_,1,3,T1S), 0 , 115, 0 , 6880 , 207, 111), // #1133
- INST(Vpcompressw , VexMr_Lx , E(660F38,63,_,x,_,1,1,T1S), 0 , 187, 0 , 6892 , 207, 135), // #1134
- INST(Vpcomq , VexRvmi , V(XOP_M8,CF,_,0,0,_,_,_ ), 0 , 183, 0 , 6904 , 238, 124), // #1135
- INST(Vpcomub , VexRvmi , V(XOP_M8,EC,_,0,0,_,_,_ ), 0 , 183, 0 , 6911 , 238, 124), // #1136
- INST(Vpcomud , VexRvmi , V(XOP_M8,EE,_,0,0,_,_,_ ), 0 , 183, 0 , 6919 , 238, 124), // #1137
- INST(Vpcomuq , VexRvmi , V(XOP_M8,EF,_,0,0,_,_,_ ), 0 , 183, 0 , 6927 , 238, 124), // #1138
- INST(Vpcomuw , VexRvmi , V(XOP_M8,ED,_,0,0,_,_,_ ), 0 , 183, 0 , 6935 , 238, 124), // #1139
- INST(Vpcomw , VexRvmi , V(XOP_M8,CD,_,0,0,_,_,_ ), 0 , 183, 0 , 6943 , 238, 124), // #1140
- INST(Vpconflictd , VexRm_Lx , E(660F38,C4,_,x,_,0,4,FV ), 0 , 102, 0 , 6950 , 324, 132), // #1141
- INST(Vpconflictq , VexRm_Lx , E(660F38,C4,_,x,_,1,4,FV ), 0 , 103, 0 , 6962 , 324, 132), // #1142
- INST(Vpdpbusd , VexRvm_Lx , E(660F38,50,_,x,_,0,4,FV ), 0 , 102, 0 , 6974 , 190, 136), // #1143
- INST(Vpdpbusds , VexRvm_Lx , E(660F38,51,_,x,_,0,4,FV ), 0 , 102, 0 , 6983 , 190, 136), // #1144
- INST(Vpdpwssd , VexRvm_Lx , E(660F38,52,_,x,_,0,4,FV ), 0 , 102, 0 , 6993 , 190, 136), // #1145
- INST(Vpdpwssds , VexRvm_Lx , E(660F38,53,_,x,_,0,4,FV ), 0 , 102, 0 , 7002 , 190, 136), // #1146
- INST(Vperm2f128 , VexRvmi , V(660F3A,06,_,1,0,_,_,_ ), 0 , 145, 0 , 7012 , 325, 108), // #1147
- INST(Vperm2i128 , VexRvmi , V(660F3A,46,_,1,0,_,_,_ ), 0 , 145, 0 , 7023 , 325, 115), // #1148
- INST(Vpermb , VexRvm_Lx , E(660F38,8D,_,x,_,0,4,FVM), 0 , 101, 0 , 7034 , 189, 137), // #1149
- INST(Vpermd , VexRvm_Lx , V(660F38,36,_,x,0,0,4,FV ), 0 , 154, 0 , 7041 , 326, 125), // #1150
- INST(Vpermi2b , VexRvm_Lx , E(660F38,75,_,x,_,0,4,FVM), 0 , 101, 0 , 7048 , 189, 137), // #1151
- INST(Vpermi2d , VexRvm_Lx , E(660F38,76,_,x,_,0,4,FV ), 0 , 102, 0 , 7057 , 190, 111), // #1152
- INST(Vpermi2pd , VexRvm_Lx , E(660F38,77,_,x,_,1,4,FV ), 0 , 103, 0 , 7066 , 191, 111), // #1153
- INST(Vpermi2ps , VexRvm_Lx , E(660F38,77,_,x,_,0,4,FV ), 0 , 102, 0 , 7076 , 190, 111), // #1154
- INST(Vpermi2q , VexRvm_Lx , E(660F38,76,_,x,_,1,4,FV ), 0 , 103, 0 , 7086 , 191, 111), // #1155
- INST(Vpermi2w , VexRvm_Lx , E(660F38,75,_,x,_,1,4,FVM), 0 , 104, 0 , 7095 , 189, 113), // #1156
- INST(Vpermil2pd , VexRvrmiRvmri_Lx , V(660F3A,49,_,x,x,_,_,_ ), 0 , 67 , 0 , 7104 , 327, 124), // #1157
- INST(Vpermil2ps , VexRvrmiRvmri_Lx , V(660F3A,48,_,x,x,_,_,_ ), 0 , 67 , 0 , 7115 , 327, 124), // #1158
- INST(Vpermilpd , VexRvmRmi_Lx , V(660F38,0D,_,x,0,1,4,FV ), V(660F3A,05,_,x,0,1,4,FV ), 188, 109, 7126 , 328, 106), // #1159
- INST(Vpermilps , VexRvmRmi_Lx , V(660F38,0C,_,x,0,0,4,FV ), V(660F3A,04,_,x,0,0,4,FV ), 154, 110, 7136 , 328, 106), // #1160
- INST(Vpermpd , VexRvmRmi_Lx , E(660F38,16,_,x,1,1,4,FV ), V(660F3A,01,_,x,1,1,4,FV ), 189, 111, 7146 , 329, 125), // #1161
- INST(Vpermps , VexRvm_Lx , V(660F38,16,_,x,0,0,4,FV ), 0 , 154, 0 , 7154 , 326, 125), // #1162
- INST(Vpermq , VexRvmRmi_Lx , V(660F38,36,_,x,_,1,4,FV ), V(660F3A,00,_,x,1,1,4,FV ), 188, 112, 7162 , 329, 125), // #1163
- INST(Vpermt2b , VexRvm_Lx , E(660F38,7D,_,x,_,0,4,FVM), 0 , 101, 0 , 7169 , 189, 137), // #1164
- INST(Vpermt2d , VexRvm_Lx , E(660F38,7E,_,x,_,0,4,FV ), 0 , 102, 0 , 7178 , 190, 111), // #1165
- INST(Vpermt2pd , VexRvm_Lx , E(660F38,7F,_,x,_,1,4,FV ), 0 , 103, 0 , 7187 , 191, 111), // #1166
- INST(Vpermt2ps , VexRvm_Lx , E(660F38,7F,_,x,_,0,4,FV ), 0 , 102, 0 , 7197 , 190, 111), // #1167
- INST(Vpermt2q , VexRvm_Lx , E(660F38,7E,_,x,_,1,4,FV ), 0 , 103, 0 , 7207 , 191, 111), // #1168
- INST(Vpermt2w , VexRvm_Lx , E(660F38,7D,_,x,_,1,4,FVM), 0 , 104, 0 , 7216 , 189, 113), // #1169
- INST(Vpermw , VexRvm_Lx , E(660F38,8D,_,x,_,1,4,FVM), 0 , 104, 0 , 7225 , 189, 113), // #1170
- INST(Vpexpandb , VexRm_Lx , E(660F38,62,_,x,_,0,0,T1S), 0 , 186, 0 , 7232 , 241, 135), // #1171
- INST(Vpexpandd , VexRm_Lx , E(660F38,89,_,x,_,0,2,T1S), 0 , 116, 0 , 7242 , 241, 111), // #1172
- INST(Vpexpandq , VexRm_Lx , E(660F38,89,_,x,_,1,3,T1S), 0 , 115, 0 , 7252 , 241, 111), // #1173
- INST(Vpexpandw , VexRm_Lx , E(660F38,62,_,x,_,1,1,T1S), 0 , 187, 0 , 7262 , 241, 135), // #1174
- INST(Vpextrb , VexMri , V(660F3A,14,_,0,0,I,0,T1S), 0 , 190, 0 , 7272 , 330, 138), // #1175
- INST(Vpextrd , VexMri , V(660F3A,16,_,0,0,0,2,T1S), 0 , 150, 0 , 7280 , 245, 139), // #1176
- INST(Vpextrq , VexMri , V(660F3A,16,_,0,1,1,3,T1S), 0 , 191, 0 , 7288 , 331, 139), // #1177
- INST(Vpextrw , VexMri , V(660F3A,15,_,0,0,I,1,T1S), 0 , 192, 0 , 7296 , 332, 138), // #1178
- INST(Vpgatherdd , VexRmvRm_VM , V(660F38,90,_,x,0,_,_,_ ), V(660F38,90,_,x,_,0,2,T1S), 88 , 113, 7304 , 261, 125), // #1179
- INST(Vpgatherdq , VexRmvRm_VM , V(660F38,90,_,x,1,_,_,_ ), V(660F38,90,_,x,_,1,3,T1S), 156, 114, 7315 , 260, 125), // #1180
- INST(Vpgatherqd , VexRmvRm_VM , V(660F38,91,_,x,0,_,_,_ ), V(660F38,91,_,x,_,0,2,T1S), 88 , 115, 7326 , 266, 125), // #1181
- INST(Vpgatherqq , VexRmvRm_VM , V(660F38,91,_,x,1,_,_,_ ), V(660F38,91,_,x,_,1,3,T1S), 156, 116, 7337 , 265, 125), // #1182
- INST(Vphaddbd , VexRm , V(XOP_M9,C2,_,0,0,_,_,_ ), 0 , 72 , 0 , 7348 , 181, 124), // #1183
- INST(Vphaddbq , VexRm , V(XOP_M9,C3,_,0,0,_,_,_ ), 0 , 72 , 0 , 7357 , 181, 124), // #1184
- INST(Vphaddbw , VexRm , V(XOP_M9,C1,_,0,0,_,_,_ ), 0 , 72 , 0 , 7366 , 181, 124), // #1185
- INST(Vphaddd , VexRvm_Lx , V(660F38,02,_,x,I,_,_,_ ), 0 , 88 , 0 , 7375 , 179, 128), // #1186
- INST(Vphadddq , VexRm , V(XOP_M9,CB,_,0,0,_,_,_ ), 0 , 72 , 0 , 7383 , 181, 124), // #1187
- INST(Vphaddsw , VexRvm_Lx , V(660F38,03,_,x,I,_,_,_ ), 0 , 88 , 0 , 7392 , 179, 128), // #1188
- INST(Vphaddubd , VexRm , V(XOP_M9,D2,_,0,0,_,_,_ ), 0 , 72 , 0 , 7401 , 181, 124), // #1189
- INST(Vphaddubq , VexRm , V(XOP_M9,D3,_,0,0,_,_,_ ), 0 , 72 , 0 , 7411 , 181, 124), // #1190
- INST(Vphaddubw , VexRm , V(XOP_M9,D1,_,0,0,_,_,_ ), 0 , 72 , 0 , 7421 , 181, 124), // #1191
- INST(Vphaddudq , VexRm , V(XOP_M9,DB,_,0,0,_,_,_ ), 0 , 72 , 0 , 7431 , 181, 124), // #1192
- INST(Vphadduwd , VexRm , V(XOP_M9,D6,_,0,0,_,_,_ ), 0 , 72 , 0 , 7441 , 181, 124), // #1193
- INST(Vphadduwq , VexRm , V(XOP_M9,D7,_,0,0,_,_,_ ), 0 , 72 , 0 , 7451 , 181, 124), // #1194
- INST(Vphaddw , VexRvm_Lx , V(660F38,01,_,x,I,_,_,_ ), 0 , 88 , 0 , 7461 , 179, 128), // #1195
- INST(Vphaddwd , VexRm , V(XOP_M9,C6,_,0,0,_,_,_ ), 0 , 72 , 0 , 7469 , 181, 124), // #1196
- INST(Vphaddwq , VexRm , V(XOP_M9,C7,_,0,0,_,_,_ ), 0 , 72 , 0 , 7478 , 181, 124), // #1197
- INST(Vphminposuw , VexRm , V(660F38,41,_,0,I,_,_,_ ), 0 , 88 , 0 , 7487 , 181, 108), // #1198
- INST(Vphsubbw , VexRm , V(XOP_M9,E1,_,0,0,_,_,_ ), 0 , 72 , 0 , 7499 , 181, 124), // #1199
- INST(Vphsubd , VexRvm_Lx , V(660F38,06,_,x,I,_,_,_ ), 0 , 88 , 0 , 7508 , 179, 128), // #1200
- INST(Vphsubdq , VexRm , V(XOP_M9,E3,_,0,0,_,_,_ ), 0 , 72 , 0 , 7516 , 181, 124), // #1201
- INST(Vphsubsw , VexRvm_Lx , V(660F38,07,_,x,I,_,_,_ ), 0 , 88 , 0 , 7525 , 179, 128), // #1202
- INST(Vphsubw , VexRvm_Lx , V(660F38,05,_,x,I,_,_,_ ), 0 , 88 , 0 , 7534 , 179, 128), // #1203
- INST(Vphsubwd , VexRm , V(XOP_M9,E2,_,0,0,_,_,_ ), 0 , 72 , 0 , 7542 , 181, 124), // #1204
- INST(Vpinsrb , VexRvmi , V(660F3A,20,_,0,0,I,0,T1S), 0 , 190, 0 , 7551 , 333, 138), // #1205
- INST(Vpinsrd , VexRvmi , V(660F3A,22,_,0,0,0,2,T1S), 0 , 150, 0 , 7559 , 334, 139), // #1206
- INST(Vpinsrq , VexRvmi , V(660F3A,22,_,0,1,1,3,T1S), 0 , 191, 0 , 7567 , 335, 139), // #1207
- INST(Vpinsrw , VexRvmi , V(660F00,C4,_,0,0,I,1,T1S), 0 , 193, 0 , 7575 , 336, 138), // #1208
- INST(Vplzcntd , VexRm_Lx , E(660F38,44,_,x,_,0,4,FV ), 0 , 102, 0 , 7583 , 324, 132), // #1209
- INST(Vplzcntq , VexRm_Lx , E(660F38,44,_,x,_,1,4,FV ), 0 , 103, 0 , 7592 , 337, 132), // #1210
- INST(Vpmacsdd , VexRvmr , V(XOP_M8,9E,_,0,0,_,_,_ ), 0 , 183, 0 , 7601 , 338, 124), // #1211
- INST(Vpmacsdqh , VexRvmr , V(XOP_M8,9F,_,0,0,_,_,_ ), 0 , 183, 0 , 7610 , 338, 124), // #1212
- INST(Vpmacsdql , VexRvmr , V(XOP_M8,97,_,0,0,_,_,_ ), 0 , 183, 0 , 7620 , 338, 124), // #1213
- INST(Vpmacssdd , VexRvmr , V(XOP_M8,8E,_,0,0,_,_,_ ), 0 , 183, 0 , 7630 , 338, 124), // #1214
- INST(Vpmacssdqh , VexRvmr , V(XOP_M8,8F,_,0,0,_,_,_ ), 0 , 183, 0 , 7640 , 338, 124), // #1215
- INST(Vpmacssdql , VexRvmr , V(XOP_M8,87,_,0,0,_,_,_ ), 0 , 183, 0 , 7651 , 338, 124), // #1216
- INST(Vpmacsswd , VexRvmr , V(XOP_M8,86,_,0,0,_,_,_ ), 0 , 183, 0 , 7662 , 338, 124), // #1217
- INST(Vpmacssww , VexRvmr , V(XOP_M8,85,_,0,0,_,_,_ ), 0 , 183, 0 , 7672 , 338, 124), // #1218
- INST(Vpmacswd , VexRvmr , V(XOP_M8,96,_,0,0,_,_,_ ), 0 , 183, 0 , 7682 , 338, 124), // #1219
- INST(Vpmacsww , VexRvmr , V(XOP_M8,95,_,0,0,_,_,_ ), 0 , 183, 0 , 7691 , 338, 124), // #1220
- INST(Vpmadcsswd , VexRvmr , V(XOP_M8,A6,_,0,0,_,_,_ ), 0 , 183, 0 , 7700 , 338, 124), // #1221
- INST(Vpmadcswd , VexRvmr , V(XOP_M8,B6,_,0,0,_,_,_ ), 0 , 183, 0 , 7711 , 338, 124), // #1222
- INST(Vpmadd52huq , VexRvm_Lx , E(660F38,B5,_,x,_,1,4,FV ), 0 , 103, 0 , 7721 , 191, 140), // #1223
- INST(Vpmadd52luq , VexRvm_Lx , E(660F38,B4,_,x,_,1,4,FV ), 0 , 103, 0 , 7733 , 191, 140), // #1224
- INST(Vpmaddubsw , VexRvm_Lx , V(660F38,04,_,x,I,I,4,FVM), 0 , 98 , 0 , 7745 , 272, 130), // #1225
- INST(Vpmaddwd , VexRvm_Lx , V(660F00,F5,_,x,I,I,4,FVM), 0 , 175, 0 , 7756 , 272, 130), // #1226
- INST(Vpmaskmovd , VexRvmMvr_Lx , V(660F38,8C,_,x,0,_,_,_ ), V(660F38,8E,_,x,0,_,_,_ ), 88 , 117, 7765 , 280, 115), // #1227
- INST(Vpmaskmovq , VexRvmMvr_Lx , V(660F38,8C,_,x,1,_,_,_ ), V(660F38,8E,_,x,1,_,_,_ ), 156, 118, 7776 , 280, 115), // #1228
- INST(Vpmaxsb , VexRvm_Lx , V(660F38,3C,_,x,I,I,4,FVM), 0 , 98 , 0 , 7787 , 339, 130), // #1229
- INST(Vpmaxsd , VexRvm_Lx , V(660F38,3D,_,x,I,0,4,FV ), 0 , 154, 0 , 7795 , 188, 116), // #1230
- INST(Vpmaxsq , VexRvm_Lx , E(660F38,3D,_,x,_,1,4,FV ), 0 , 103, 0 , 7803 , 191, 111), // #1231
- INST(Vpmaxsw , VexRvm_Lx , V(660F00,EE,_,x,I,I,4,FVM), 0 , 175, 0 , 7811 , 339, 130), // #1232
- INST(Vpmaxub , VexRvm_Lx , V(660F00,DE,_,x,I,I,4,FVM), 0 , 175, 0 , 7819 , 339, 130), // #1233
- INST(Vpmaxud , VexRvm_Lx , V(660F38,3F,_,x,I,0,4,FV ), 0 , 154, 0 , 7827 , 188, 116), // #1234
- INST(Vpmaxuq , VexRvm_Lx , E(660F38,3F,_,x,_,1,4,FV ), 0 , 103, 0 , 7835 , 191, 111), // #1235
- INST(Vpmaxuw , VexRvm_Lx , V(660F38,3E,_,x,I,I,4,FVM), 0 , 98 , 0 , 7843 , 339, 130), // #1236
- INST(Vpminsb , VexRvm_Lx , V(660F38,38,_,x,I,I,4,FVM), 0 , 98 , 0 , 7851 , 339, 130), // #1237
- INST(Vpminsd , VexRvm_Lx , V(660F38,39,_,x,I,0,4,FV ), 0 , 154, 0 , 7859 , 188, 116), // #1238
- INST(Vpminsq , VexRvm_Lx , E(660F38,39,_,x,_,1,4,FV ), 0 , 103, 0 , 7867 , 191, 111), // #1239
- INST(Vpminsw , VexRvm_Lx , V(660F00,EA,_,x,I,I,4,FVM), 0 , 175, 0 , 7875 , 339, 130), // #1240
- INST(Vpminub , VexRvm_Lx , V(660F00,DA,_,x,I,_,4,FVM), 0 , 175, 0 , 7883 , 339, 130), // #1241
- INST(Vpminud , VexRvm_Lx , V(660F38,3B,_,x,I,0,4,FV ), 0 , 154, 0 , 7891 , 188, 116), // #1242
- INST(Vpminuq , VexRvm_Lx , E(660F38,3B,_,x,_,1,4,FV ), 0 , 103, 0 , 7899 , 191, 111), // #1243
- INST(Vpminuw , VexRvm_Lx , V(660F38,3A,_,x,I,_,4,FVM), 0 , 98 , 0 , 7907 , 339, 130), // #1244
- INST(Vpmovb2m , VexRm_Lx , E(F30F38,29,_,x,_,0,_,_ ), 0 , 119, 0 , 7915 , 340, 113), // #1245
- INST(Vpmovd2m , VexRm_Lx , E(F30F38,39,_,x,_,0,_,_ ), 0 , 119, 0 , 7924 , 340, 114), // #1246
- INST(Vpmovdb , VexMr_Lx , E(F30F38,31,_,x,_,0,2,QVM), 0 , 194, 0 , 7933 , 341, 111), // #1247
- INST(Vpmovdw , VexMr_Lx , E(F30F38,33,_,x,_,0,3,HVM), 0 , 195, 0 , 7941 , 342, 111), // #1248
- INST(Vpmovm2b , VexRm_Lx , E(F30F38,28,_,x,_,0,_,_ ), 0 , 119, 0 , 7949 , 310, 113), // #1249
- INST(Vpmovm2d , VexRm_Lx , E(F30F38,38,_,x,_,0,_,_ ), 0 , 119, 0 , 7958 , 310, 114), // #1250
- INST(Vpmovm2q , VexRm_Lx , E(F30F38,38,_,x,_,1,_,_ ), 0 , 181, 0 , 7967 , 310, 114), // #1251
- INST(Vpmovm2w , VexRm_Lx , E(F30F38,28,_,x,_,1,_,_ ), 0 , 181, 0 , 7976 , 310, 113), // #1252
- INST(Vpmovmskb , VexRm_Lx , V(660F00,D7,_,x,I,_,_,_ ), 0 , 63 , 0 , 7985 , 293, 128), // #1253
- INST(Vpmovq2m , VexRm_Lx , E(F30F38,39,_,x,_,1,_,_ ), 0 , 181, 0 , 7995 , 340, 114), // #1254
- INST(Vpmovqb , VexMr_Lx , E(F30F38,32,_,x,_,0,1,OVM), 0 , 196, 0 , 8004 , 343, 111), // #1255
- INST(Vpmovqd , VexMr_Lx , E(F30F38,35,_,x,_,0,3,HVM), 0 , 195, 0 , 8012 , 342, 111), // #1256
- INST(Vpmovqw , VexMr_Lx , E(F30F38,34,_,x,_,0,2,QVM), 0 , 194, 0 , 8020 , 341, 111), // #1257
- INST(Vpmovsdb , VexMr_Lx , E(F30F38,21,_,x,_,0,2,QVM), 0 , 194, 0 , 8028 , 341, 111), // #1258
- INST(Vpmovsdw , VexMr_Lx , E(F30F38,23,_,x,_,0,3,HVM), 0 , 195, 0 , 8037 , 342, 111), // #1259
- INST(Vpmovsqb , VexMr_Lx , E(F30F38,22,_,x,_,0,1,OVM), 0 , 196, 0 , 8046 , 343, 111), // #1260
- INST(Vpmovsqd , VexMr_Lx , E(F30F38,25,_,x,_,0,3,HVM), 0 , 195, 0 , 8055 , 342, 111), // #1261
- INST(Vpmovsqw , VexMr_Lx , E(F30F38,24,_,x,_,0,2,QVM), 0 , 194, 0 , 8064 , 341, 111), // #1262
- INST(Vpmovswb , VexMr_Lx , E(F30F38,20,_,x,_,0,3,HVM), 0 , 195, 0 , 8073 , 342, 113), // #1263
- INST(Vpmovsxbd , VexRm_Lx , V(660F38,21,_,x,I,I,2,QVM), 0 , 197, 0 , 8082 , 344, 116), // #1264
- INST(Vpmovsxbq , VexRm_Lx , V(660F38,22,_,x,I,I,1,OVM), 0 , 198, 0 , 8092 , 345, 116), // #1265
- INST(Vpmovsxbw , VexRm_Lx , V(660F38,20,_,x,I,I,3,HVM), 0 , 123, 0 , 8102 , 346, 130), // #1266
- INST(Vpmovsxdq , VexRm_Lx , V(660F38,25,_,x,I,0,3,HVM), 0 , 123, 0 , 8112 , 346, 116), // #1267
- INST(Vpmovsxwd , VexRm_Lx , V(660F38,23,_,x,I,I,3,HVM), 0 , 123, 0 , 8122 , 346, 116), // #1268
- INST(Vpmovsxwq , VexRm_Lx , V(660F38,24,_,x,I,I,2,QVM), 0 , 197, 0 , 8132 , 344, 116), // #1269
- INST(Vpmovusdb , VexMr_Lx , E(F30F38,11,_,x,_,0,2,QVM), 0 , 194, 0 , 8142 , 341, 111), // #1270
- INST(Vpmovusdw , VexMr_Lx , E(F30F38,13,_,x,_,0,3,HVM), 0 , 195, 0 , 8152 , 342, 111), // #1271
- INST(Vpmovusqb , VexMr_Lx , E(F30F38,12,_,x,_,0,1,OVM), 0 , 196, 0 , 8162 , 343, 111), // #1272
- INST(Vpmovusqd , VexMr_Lx , E(F30F38,15,_,x,_,0,3,HVM), 0 , 195, 0 , 8172 , 342, 111), // #1273
- INST(Vpmovusqw , VexMr_Lx , E(F30F38,14,_,x,_,0,2,QVM), 0 , 194, 0 , 8182 , 341, 111), // #1274
- INST(Vpmovuswb , VexMr_Lx , E(F30F38,10,_,x,_,0,3,HVM), 0 , 195, 0 , 8192 , 342, 113), // #1275
- INST(Vpmovw2m , VexRm_Lx , E(F30F38,29,_,x,_,1,_,_ ), 0 , 181, 0 , 8202 , 340, 113), // #1276
- INST(Vpmovwb , VexMr_Lx , E(F30F38,30,_,x,_,0,3,HVM), 0 , 195, 0 , 8211 , 342, 113), // #1277
- INST(Vpmovzxbd , VexRm_Lx , V(660F38,31,_,x,I,I,2,QVM), 0 , 197, 0 , 8219 , 344, 116), // #1278
- INST(Vpmovzxbq , VexRm_Lx , V(660F38,32,_,x,I,I,1,OVM), 0 , 198, 0 , 8229 , 345, 116), // #1279
- INST(Vpmovzxbw , VexRm_Lx , V(660F38,30,_,x,I,I,3,HVM), 0 , 123, 0 , 8239 , 346, 130), // #1280
- INST(Vpmovzxdq , VexRm_Lx , V(660F38,35,_,x,I,0,3,HVM), 0 , 123, 0 , 8249 , 346, 116), // #1281
- INST(Vpmovzxwd , VexRm_Lx , V(660F38,33,_,x,I,I,3,HVM), 0 , 123, 0 , 8259 , 346, 116), // #1282
- INST(Vpmovzxwq , VexRm_Lx , V(660F38,34,_,x,I,I,2,QVM), 0 , 197, 0 , 8269 , 344, 116), // #1283
- INST(Vpmuldq , VexRvm_Lx , V(660F38,28,_,x,I,1,4,FV ), 0 , 188, 0 , 8279 , 185, 116), // #1284
- INST(Vpmulhrsw , VexRvm_Lx , V(660F38,0B,_,x,I,I,4,FVM), 0 , 98 , 0 , 8287 , 272, 130), // #1285
- INST(Vpmulhuw , VexRvm_Lx , V(660F00,E4,_,x,I,I,4,FVM), 0 , 175, 0 , 8297 , 272, 130), // #1286
- INST(Vpmulhw , VexRvm_Lx , V(660F00,E5,_,x,I,I,4,FVM), 0 , 175, 0 , 8306 , 272, 130), // #1287
- INST(Vpmulld , VexRvm_Lx , V(660F38,40,_,x,I,0,4,FV ), 0 , 154, 0 , 8314 , 186, 116), // #1288
- INST(Vpmullq , VexRvm_Lx , E(660F38,40,_,x,_,1,4,FV ), 0 , 103, 0 , 8322 , 191, 114), // #1289
- INST(Vpmullw , VexRvm_Lx , V(660F00,D5,_,x,I,I,4,FVM), 0 , 175, 0 , 8330 , 272, 130), // #1290
- INST(Vpmultishiftqb , VexRvm_Lx , E(660F38,83,_,x,_,1,4,FV ), 0 , 103, 0 , 8338 , 191, 137), // #1291
- INST(Vpmuludq , VexRvm_Lx , V(660F00,F4,_,x,I,1,4,FV ), 0 , 93 , 0 , 8353 , 185, 116), // #1292
- INST(Vpopcntb , VexRm_Lx , E(660F38,54,_,x,_,0,4,FV ), 0 , 102, 0 , 8362 , 241, 141), // #1293
- INST(Vpopcntd , VexRm_Lx , E(660F38,55,_,x,_,0,4,FVM), 0 , 101, 0 , 8371 , 324, 142), // #1294
- INST(Vpopcntq , VexRm_Lx , E(660F38,55,_,x,_,1,4,FVM), 0 , 104, 0 , 8380 , 337, 142), // #1295
- INST(Vpopcntw , VexRm_Lx , E(660F38,54,_,x,_,1,4,FV ), 0 , 103, 0 , 8389 , 241, 141), // #1296
- INST(Vpor , VexRvm_Lx , V(660F00,EB,_,x,I,_,_,_ ), 0 , 63 , 0 , 8398 , 302, 128), // #1297
- INST(Vpord , VexRvm_Lx , E(660F00,EB,_,x,_,0,4,FV ), 0 , 179, 0 , 8403 , 303, 111), // #1298
- INST(Vporq , VexRvm_Lx , E(660F00,EB,_,x,_,1,4,FV ), 0 , 121, 0 , 8409 , 307, 111), // #1299
- INST(Vpperm , VexRvrmRvmr , V(XOP_M8,A3,_,0,x,_,_,_ ), 0 , 183, 0 , 8415 , 347, 124), // #1300
- INST(Vprold , VexVmi_Lx , E(660F00,72,1,x,_,0,4,FV ), 0 , 199, 0 , 8422 , 348, 111), // #1301
- INST(Vprolq , VexVmi_Lx , E(660F00,72,1,x,_,1,4,FV ), 0 , 200, 0 , 8429 , 349, 111), // #1302
- INST(Vprolvd , VexRvm_Lx , E(660F38,15,_,x,_,0,4,FV ), 0 , 102, 0 , 8436 , 190, 111), // #1303
- INST(Vprolvq , VexRvm_Lx , E(660F38,15,_,x,_,1,4,FV ), 0 , 103, 0 , 8444 , 191, 111), // #1304
- INST(Vprord , VexVmi_Lx , E(660F00,72,0,x,_,0,4,FV ), 0 , 179, 0 , 8452 , 348, 111), // #1305
- INST(Vprorq , VexVmi_Lx , E(660F00,72,0,x,_,1,4,FV ), 0 , 121, 0 , 8459 , 349, 111), // #1306
- INST(Vprorvd , VexRvm_Lx , E(660F38,14,_,x,_,0,4,FV ), 0 , 102, 0 , 8466 , 190, 111), // #1307
- INST(Vprorvq , VexRvm_Lx , E(660F38,14,_,x,_,1,4,FV ), 0 , 103, 0 , 8474 , 191, 111), // #1308
- INST(Vprotb , VexRvmRmvRmi , V(XOP_M9,90,_,0,x,_,_,_ ), V(XOP_M8,C0,_,0,x,_,_,_ ), 72 , 119, 8482 , 350, 124), // #1309
- INST(Vprotd , VexRvmRmvRmi , V(XOP_M9,92,_,0,x,_,_,_ ), V(XOP_M8,C2,_,0,x,_,_,_ ), 72 , 120, 8489 , 350, 124), // #1310
- INST(Vprotq , VexRvmRmvRmi , V(XOP_M9,93,_,0,x,_,_,_ ), V(XOP_M8,C3,_,0,x,_,_,_ ), 72 , 121, 8496 , 350, 124), // #1311
- INST(Vprotw , VexRvmRmvRmi , V(XOP_M9,91,_,0,x,_,_,_ ), V(XOP_M8,C1,_,0,x,_,_,_ ), 72 , 122, 8503 , 350, 124), // #1312
- INST(Vpsadbw , VexRvm_Lx , V(660F00,F6,_,x,I,I,4,FVM), 0 , 175, 0 , 8510 , 180, 130), // #1313
- INST(Vpscatterdd , VexMr_VM , E(660F38,A0,_,x,_,0,2,T1S), 0 , 116, 0 , 8518 , 351, 111), // #1314
- INST(Vpscatterdq , VexMr_VM , E(660F38,A0,_,x,_,1,3,T1S), 0 , 115, 0 , 8530 , 351, 111), // #1315
- INST(Vpscatterqd , VexMr_VM , E(660F38,A1,_,x,_,0,2,T1S), 0 , 116, 0 , 8542 , 352, 111), // #1316
- INST(Vpscatterqq , VexMr_VM , E(660F38,A1,_,x,_,1,3,T1S), 0 , 115, 0 , 8554 , 353, 111), // #1317
- INST(Vpshab , VexRvmRmv , V(XOP_M9,98,_,0,x,_,_,_ ), 0 , 72 , 0 , 8566 , 354, 124), // #1318
- INST(Vpshad , VexRvmRmv , V(XOP_M9,9A,_,0,x,_,_,_ ), 0 , 72 , 0 , 8573 , 354, 124), // #1319
- INST(Vpshaq , VexRvmRmv , V(XOP_M9,9B,_,0,x,_,_,_ ), 0 , 72 , 0 , 8580 , 354, 124), // #1320
- INST(Vpshaw , VexRvmRmv , V(XOP_M9,99,_,0,x,_,_,_ ), 0 , 72 , 0 , 8587 , 354, 124), // #1321
- INST(Vpshlb , VexRvmRmv , V(XOP_M9,94,_,0,x,_,_,_ ), 0 , 72 , 0 , 8594 , 354, 124), // #1322
- INST(Vpshld , VexRvmRmv , V(XOP_M9,96,_,0,x,_,_,_ ), 0 , 72 , 0 , 8601 , 354, 124), // #1323
- INST(Vpshldd , VexRvmi_Lx , E(660F3A,71,_,x,_,0,4,FV ), 0 , 99 , 0 , 8608 , 183, 135), // #1324
- INST(Vpshldq , VexRvmi_Lx , E(660F3A,71,_,x,_,1,4,FV ), 0 , 100, 0 , 8616 , 184, 135), // #1325
- INST(Vpshldvd , VexRvm_Lx , E(660F38,71,_,x,_,0,4,FV ), 0 , 102, 0 , 8624 , 190, 135), // #1326
- INST(Vpshldvq , VexRvm_Lx , E(660F38,71,_,x,_,1,4,FV ), 0 , 103, 0 , 8633 , 191, 135), // #1327
- INST(Vpshldvw , VexRvm_Lx , E(660F38,70,_,x,_,0,4,FVM), 0 , 101, 0 , 8642 , 189, 135), // #1328
- INST(Vpshldw , VexRvmi_Lx , E(660F3A,70,_,x,_,0,4,FVM), 0 , 142, 0 , 8651 , 237, 135), // #1329
- INST(Vpshlq , VexRvmRmv , V(XOP_M9,97,_,0,x,_,_,_ ), 0 , 72 , 0 , 8659 , 354, 124), // #1330
- INST(Vpshlw , VexRvmRmv , V(XOP_M9,95,_,0,x,_,_,_ ), 0 , 72 , 0 , 8666 , 354, 124), // #1331
- INST(Vpshrdd , VexRvmi_Lx , E(660F3A,73,_,x,_,0,4,FV ), 0 , 99 , 0 , 8673 , 183, 135), // #1332
- INST(Vpshrdq , VexRvmi_Lx , E(660F3A,73,_,x,_,1,4,FV ), 0 , 100, 0 , 8681 , 184, 135), // #1333
- INST(Vpshrdvd , VexRvm_Lx , E(660F38,73,_,x,_,0,4,FV ), 0 , 102, 0 , 8689 , 190, 135), // #1334
- INST(Vpshrdvq , VexRvm_Lx , E(660F38,73,_,x,_,1,4,FV ), 0 , 103, 0 , 8698 , 191, 135), // #1335
- INST(Vpshrdvw , VexRvm_Lx , E(660F38,72,_,x,_,0,4,FVM), 0 , 101, 0 , 8707 , 189, 135), // #1336
- INST(Vpshrdw , VexRvmi_Lx , E(660F3A,72,_,x,_,0,4,FVM), 0 , 142, 0 , 8716 , 237, 135), // #1337
- INST(Vpshufb , VexRvm_Lx , V(660F38,00,_,x,I,I,4,FVM), 0 , 98 , 0 , 8724 , 272, 130), // #1338
- INST(Vpshufbitqmb , VexRvm_Lx , E(660F38,8F,_,x,0,0,4,FVM), 0 , 101, 0 , 8732 , 355, 141), // #1339
- INST(Vpshufd , VexRmi_Lx , V(660F00,70,_,x,I,0,4,FV ), 0 , 124, 0 , 8745 , 356, 116), // #1340
- INST(Vpshufhw , VexRmi_Lx , V(F30F00,70,_,x,I,I,4,FVM), 0 , 176, 0 , 8753 , 357, 130), // #1341
- INST(Vpshuflw , VexRmi_Lx , V(F20F00,70,_,x,I,I,4,FVM), 0 , 201, 0 , 8762 , 357, 130), // #1342
- INST(Vpsignb , VexRvm_Lx , V(660F38,08,_,x,I,_,_,_ ), 0 , 88 , 0 , 8771 , 179, 128), // #1343
- INST(Vpsignd , VexRvm_Lx , V(660F38,0A,_,x,I,_,_,_ ), 0 , 88 , 0 , 8779 , 179, 128), // #1344
- INST(Vpsignw , VexRvm_Lx , V(660F38,09,_,x,I,_,_,_ ), 0 , 88 , 0 , 8787 , 179, 128), // #1345
- INST(Vpslld , VexRvmVmi_Lx , V(660F00,F2,_,x,I,0,4,128), V(660F00,72,6,x,I,0,4,FV ), 202, 123, 8795 , 358, 116), // #1346
- INST(Vpslldq , VexEvexVmi_Lx , V(660F00,73,7,x,I,I,4,FVM), 0 , 203, 0 , 8802 , 359, 130), // #1347
- INST(Vpsllq , VexRvmVmi_Lx , V(660F00,F3,_,x,I,1,4,128), V(660F00,73,6,x,I,1,4,FV ), 204, 124, 8810 , 360, 116), // #1348
- INST(Vpsllvd , VexRvm_Lx , V(660F38,47,_,x,0,0,4,FV ), 0 , 154, 0 , 8817 , 186, 125), // #1349
- INST(Vpsllvq , VexRvm_Lx , V(660F38,47,_,x,1,1,4,FV ), 0 , 153, 0 , 8825 , 185, 125), // #1350
- INST(Vpsllvw , VexRvm_Lx , E(660F38,12,_,x,_,1,4,FVM), 0 , 104, 0 , 8833 , 189, 113), // #1351
- INST(Vpsllw , VexRvmVmi_Lx , V(660F00,F1,_,x,I,I,4,FVM), V(660F00,71,6,x,I,I,4,FVM), 175, 125, 8841 , 361, 130), // #1352
- INST(Vpsrad , VexRvmVmi_Lx , V(660F00,E2,_,x,I,0,4,128), V(660F00,72,4,x,I,0,4,FV ), 202, 126, 8848 , 358, 116), // #1353
- INST(Vpsraq , VexRvmVmi_Lx , E(660F00,E2,_,x,_,1,4,128), E(660F00,72,4,x,_,1,4,FV ), 205, 127, 8855 , 362, 111), // #1354
- INST(Vpsravd , VexRvm_Lx , V(660F38,46,_,x,0,0,4,FV ), 0 , 154, 0 , 8862 , 186, 125), // #1355
- INST(Vpsravq , VexRvm_Lx , E(660F38,46,_,x,_,1,4,FV ), 0 , 103, 0 , 8870 , 191, 111), // #1356
- INST(Vpsravw , VexRvm_Lx , E(660F38,11,_,x,_,1,4,FVM), 0 , 104, 0 , 8878 , 189, 113), // #1357
- INST(Vpsraw , VexRvmVmi_Lx , V(660F00,E1,_,x,I,I,4,128), V(660F00,71,4,x,I,I,4,FVM), 202, 128, 8886 , 361, 130), // #1358
- INST(Vpsrld , VexRvmVmi_Lx , V(660F00,D2,_,x,I,0,4,128), V(660F00,72,2,x,I,0,4,FV ), 202, 129, 8893 , 358, 116), // #1359
- INST(Vpsrldq , VexEvexVmi_Lx , V(660F00,73,3,x,I,I,4,FVM), 0 , 206, 0 , 8900 , 359, 130), // #1360
- INST(Vpsrlq , VexRvmVmi_Lx , V(660F00,D3,_,x,I,1,4,128), V(660F00,73,2,x,I,1,4,FV ), 204, 130, 8908 , 360, 116), // #1361
- INST(Vpsrlvd , VexRvm_Lx , V(660F38,45,_,x,0,0,4,FV ), 0 , 154, 0 , 8915 , 186, 125), // #1362
- INST(Vpsrlvq , VexRvm_Lx , V(660F38,45,_,x,1,1,4,FV ), 0 , 153, 0 , 8923 , 185, 125), // #1363
- INST(Vpsrlvw , VexRvm_Lx , E(660F38,10,_,x,_,1,4,FVM), 0 , 104, 0 , 8931 , 189, 113), // #1364
- INST(Vpsrlw , VexRvmVmi_Lx , V(660F00,D1,_,x,I,I,4,128), V(660F00,71,2,x,I,I,4,FVM), 202, 131, 8939 , 361, 130), // #1365
- INST(Vpsubb , VexRvm_Lx , V(660F00,F8,_,x,I,I,4,FVM), 0 , 175, 0 , 8946 , 363, 130), // #1366
- INST(Vpsubd , VexRvm_Lx , V(660F00,FA,_,x,I,0,4,FV ), 0 , 124, 0 , 8953 , 364, 116), // #1367
- INST(Vpsubq , VexRvm_Lx , V(660F00,FB,_,x,I,1,4,FV ), 0 , 93 , 0 , 8960 , 365, 116), // #1368
- INST(Vpsubsb , VexRvm_Lx , V(660F00,E8,_,x,I,I,4,FVM), 0 , 175, 0 , 8967 , 363, 130), // #1369
- INST(Vpsubsw , VexRvm_Lx , V(660F00,E9,_,x,I,I,4,FVM), 0 , 175, 0 , 8975 , 363, 130), // #1370
- INST(Vpsubusb , VexRvm_Lx , V(660F00,D8,_,x,I,I,4,FVM), 0 , 175, 0 , 8983 , 363, 130), // #1371
- INST(Vpsubusw , VexRvm_Lx , V(660F00,D9,_,x,I,I,4,FVM), 0 , 175, 0 , 8992 , 363, 130), // #1372
- INST(Vpsubw , VexRvm_Lx , V(660F00,F9,_,x,I,I,4,FVM), 0 , 175, 0 , 9001 , 363, 130), // #1373
- INST(Vpternlogd , VexRvmi_Lx , E(660F3A,25,_,x,_,0,4,FV ), 0 , 99 , 0 , 9008 , 183, 111), // #1374
- INST(Vpternlogq , VexRvmi_Lx , E(660F3A,25,_,x,_,1,4,FV ), 0 , 100, 0 , 9019 , 184, 111), // #1375
- INST(Vptest , VexRm_Lx , V(660F38,17,_,x,I,_,_,_ ), 0 , 88 , 0 , 9030 , 257, 134), // #1376
- INST(Vptestmb , VexRvm_Lx , E(660F38,26,_,x,_,0,4,FVM), 0 , 101, 0 , 9037 , 355, 113), // #1377
- INST(Vptestmd , VexRvm_Lx , E(660F38,27,_,x,_,0,4,FV ), 0 , 102, 0 , 9046 , 366, 111), // #1378
- INST(Vptestmq , VexRvm_Lx , E(660F38,27,_,x,_,1,4,FV ), 0 , 103, 0 , 9055 , 367, 111), // #1379
- INST(Vptestmw , VexRvm_Lx , E(660F38,26,_,x,_,1,4,FVM), 0 , 104, 0 , 9064 , 355, 113), // #1380
- INST(Vptestnmb , VexRvm_Lx , E(F30F38,26,_,x,_,0,4,FVM), 0 , 207, 0 , 9073 , 355, 113), // #1381
- INST(Vptestnmd , VexRvm_Lx , E(F30F38,27,_,x,_,0,4,FV ), 0 , 208, 0 , 9083 , 366, 111), // #1382
- INST(Vptestnmq , VexRvm_Lx , E(F30F38,27,_,x,_,1,4,FV ), 0 , 209, 0 , 9093 , 367, 111), // #1383
- INST(Vptestnmw , VexRvm_Lx , E(F30F38,26,_,x,_,1,4,FVM), 0 , 210, 0 , 9103 , 355, 113), // #1384
- INST(Vpunpckhbw , VexRvm_Lx , V(660F00,68,_,x,I,I,4,FVM), 0 , 175, 0 , 9113 , 272, 130), // #1385
- INST(Vpunpckhdq , VexRvm_Lx , V(660F00,6A,_,x,I,0,4,FV ), 0 , 124, 0 , 9124 , 186, 116), // #1386
- INST(Vpunpckhqdq , VexRvm_Lx , V(660F00,6D,_,x,I,1,4,FV ), 0 , 93 , 0 , 9135 , 185, 116), // #1387
- INST(Vpunpckhwd , VexRvm_Lx , V(660F00,69,_,x,I,I,4,FVM), 0 , 175, 0 , 9147 , 272, 130), // #1388
- INST(Vpunpcklbw , VexRvm_Lx , V(660F00,60,_,x,I,I,4,FVM), 0 , 175, 0 , 9158 , 272, 130), // #1389
- INST(Vpunpckldq , VexRvm_Lx , V(660F00,62,_,x,I,0,4,FV ), 0 , 124, 0 , 9169 , 186, 116), // #1390
- INST(Vpunpcklqdq , VexRvm_Lx , V(660F00,6C,_,x,I,1,4,FV ), 0 , 93 , 0 , 9180 , 185, 116), // #1391
- INST(Vpunpcklwd , VexRvm_Lx , V(660F00,61,_,x,I,I,4,FVM), 0 , 175, 0 , 9192 , 272, 130), // #1392
- INST(Vpxor , VexRvm_Lx , V(660F00,EF,_,x,I,_,_,_ ), 0 , 63 , 0 , 9203 , 304, 128), // #1393
- INST(Vpxord , VexRvm_Lx , E(660F00,EF,_,x,_,0,4,FV ), 0 , 179, 0 , 9209 , 305, 111), // #1394
- INST(Vpxorq , VexRvm_Lx , E(660F00,EF,_,x,_,1,4,FV ), 0 , 121, 0 , 9216 , 306, 111), // #1395
- INST(Vrangepd , VexRvmi_Lx , E(660F3A,50,_,x,_,1,4,FV ), 0 , 100, 0 , 9223 , 246, 114), // #1396
- INST(Vrangeps , VexRvmi_Lx , E(660F3A,50,_,x,_,0,4,FV ), 0 , 99 , 0 , 9232 , 247, 114), // #1397
- INST(Vrangesd , VexRvmi , E(660F3A,51,_,I,_,1,3,T1S), 0 , 151, 0 , 9241 , 248, 61 ), // #1398
- INST(Vrangess , VexRvmi , E(660F3A,51,_,I,_,0,2,T1S), 0 , 152, 0 , 9250 , 249, 61 ), // #1399
- INST(Vrcp14pd , VexRm_Lx , E(660F38,4C,_,x,_,1,4,FV ), 0 , 103, 0 , 9259 , 337, 111), // #1400
- INST(Vrcp14ps , VexRm_Lx , E(660F38,4C,_,x,_,0,4,FV ), 0 , 102, 0 , 9268 , 324, 111), // #1401
- INST(Vrcp14sd , VexRvm , E(660F38,4D,_,I,_,1,3,T1S), 0 , 115, 0 , 9277 , 368, 63 ), // #1402
- INST(Vrcp14ss , VexRvm , E(660F38,4D,_,I,_,0,2,T1S), 0 , 116, 0 , 9286 , 369, 63 ), // #1403
- INST(Vrcp28pd , VexRm , E(660F38,CA,_,2,_,1,4,FV ), 0 , 143, 0 , 9295 , 239, 120), // #1404
- INST(Vrcp28ps , VexRm , E(660F38,CA,_,2,_,0,4,FV ), 0 , 144, 0 , 9304 , 240, 120), // #1405
- INST(Vrcp28sd , VexRvm , E(660F38,CB,_,I,_,1,3,T1S), 0 , 115, 0 , 9313 , 267, 120), // #1406
- INST(Vrcp28ss , VexRvm , E(660F38,CB,_,I,_,0,2,T1S), 0 , 116, 0 , 9322 , 268, 120), // #1407
- INST(Vrcpps , VexRm_Lx , V(000F00,53,_,x,I,_,_,_ ), 0 , 66 , 0 , 9331 , 257, 108), // #1408
- INST(Vrcpss , VexRvm , V(F30F00,53,_,I,I,_,_,_ ), 0 , 169, 0 , 9338 , 370, 108), // #1409
- INST(Vreducepd , VexRmi_Lx , E(660F3A,56,_,x,_,1,4,FV ), 0 , 100, 0 , 9345 , 349, 114), // #1410
- INST(Vreduceps , VexRmi_Lx , E(660F3A,56,_,x,_,0,4,FV ), 0 , 99 , 0 , 9355 , 348, 114), // #1411
- INST(Vreducesd , VexRvmi , E(660F3A,57,_,I,_,1,3,T1S), 0 , 151, 0 , 9365 , 371, 61 ), // #1412
- INST(Vreducess , VexRvmi , E(660F3A,57,_,I,_,0,2,T1S), 0 , 152, 0 , 9375 , 372, 61 ), // #1413
- INST(Vrndscalepd , VexRmi_Lx , E(660F3A,09,_,x,_,1,4,FV ), 0 , 100, 0 , 9385 , 269, 111), // #1414
- INST(Vrndscaleps , VexRmi_Lx , E(660F3A,08,_,x,_,0,4,FV ), 0 , 99 , 0 , 9397 , 270, 111), // #1415
- INST(Vrndscalesd , VexRvmi , E(660F3A,0B,_,I,_,1,3,T1S), 0 , 151, 0 , 9409 , 248, 63 ), // #1416
- INST(Vrndscaless , VexRvmi , E(660F3A,0A,_,I,_,0,2,T1S), 0 , 152, 0 , 9421 , 249, 63 ), // #1417
- INST(Vroundpd , VexRmi_Lx , V(660F3A,09,_,x,I,_,_,_ ), 0 , 67 , 0 , 9433 , 373, 108), // #1418
- INST(Vroundps , VexRmi_Lx , V(660F3A,08,_,x,I,_,_,_ ), 0 , 67 , 0 , 9442 , 373, 108), // #1419
- INST(Vroundsd , VexRvmi , V(660F3A,0B,_,I,I,_,_,_ ), 0 , 67 , 0 , 9451 , 374, 108), // #1420
- INST(Vroundss , VexRvmi , V(660F3A,0A,_,I,I,_,_,_ ), 0 , 67 , 0 , 9460 , 375, 108), // #1421
- INST(Vrsqrt14pd , VexRm_Lx , E(660F38,4E,_,x,_,1,4,FV ), 0 , 103, 0 , 9469 , 337, 111), // #1422
- INST(Vrsqrt14ps , VexRm_Lx , E(660F38,4E,_,x,_,0,4,FV ), 0 , 102, 0 , 9480 , 324, 111), // #1423
- INST(Vrsqrt14sd , VexRvm , E(660F38,4F,_,I,_,1,3,T1S), 0 , 115, 0 , 9491 , 368, 63 ), // #1424
- INST(Vrsqrt14ss , VexRvm , E(660F38,4F,_,I,_,0,2,T1S), 0 , 116, 0 , 9502 , 369, 63 ), // #1425
- INST(Vrsqrt28pd , VexRm , E(660F38,CC,_,2,_,1,4,FV ), 0 , 143, 0 , 9513 , 239, 120), // #1426
- INST(Vrsqrt28ps , VexRm , E(660F38,CC,_,2,_,0,4,FV ), 0 , 144, 0 , 9524 , 240, 120), // #1427
- INST(Vrsqrt28sd , VexRvm , E(660F38,CD,_,I,_,1,3,T1S), 0 , 115, 0 , 9535 , 267, 120), // #1428
- INST(Vrsqrt28ss , VexRvm , E(660F38,CD,_,I,_,0,2,T1S), 0 , 116, 0 , 9546 , 268, 120), // #1429
- INST(Vrsqrtps , VexRm_Lx , V(000F00,52,_,x,I,_,_,_ ), 0 , 66 , 0 , 9557 , 257, 108), // #1430
- INST(Vrsqrtss , VexRvm , V(F30F00,52,_,I,I,_,_,_ ), 0 , 169, 0 , 9566 , 370, 108), // #1431
- INST(Vscalefpd , VexRvm_Lx , E(660F38,2C,_,x,_,1,4,FV ), 0 , 103, 0 , 9575 , 376, 111), // #1432
- INST(Vscalefps , VexRvm_Lx , E(660F38,2C,_,x,_,0,4,FV ), 0 , 102, 0 , 9585 , 377, 111), // #1433
- INST(Vscalefsd , VexRvm , E(660F38,2D,_,I,_,1,3,T1S), 0 , 115, 0 , 9595 , 378, 63 ), // #1434
- INST(Vscalefss , VexRvm , E(660F38,2D,_,I,_,0,2,T1S), 0 , 116, 0 , 9605 , 379, 63 ), // #1435
- INST(Vscatterdpd , VexMr_Lx , E(660F38,A2,_,x,_,1,3,T1S), 0 , 115, 0 , 9615 , 380, 111), // #1436
- INST(Vscatterdps , VexMr_Lx , E(660F38,A2,_,x,_,0,2,T1S), 0 , 116, 0 , 9627 , 351, 111), // #1437
- INST(Vscatterpf0dpd , VexM_VM , E(660F38,C6,5,2,_,1,3,T1S), 0 , 211, 0 , 9639 , 262, 126), // #1438
- INST(Vscatterpf0dps , VexM_VM , E(660F38,C6,5,2,_,0,2,T1S), 0 , 212, 0 , 9654 , 263, 126), // #1439
- INST(Vscatterpf0qpd , VexM_VM , E(660F38,C7,5,2,_,1,3,T1S), 0 , 211, 0 , 9669 , 264, 126), // #1440
- INST(Vscatterpf0qps , VexM_VM , E(660F38,C7,5,2,_,0,2,T1S), 0 , 212, 0 , 9684 , 264, 126), // #1441
- INST(Vscatterpf1dpd , VexM_VM , E(660F38,C6,6,2,_,1,3,T1S), 0 , 213, 0 , 9699 , 262, 126), // #1442
- INST(Vscatterpf1dps , VexM_VM , E(660F38,C6,6,2,_,0,2,T1S), 0 , 214, 0 , 9714 , 263, 126), // #1443
- INST(Vscatterpf1qpd , VexM_VM , E(660F38,C7,6,2,_,1,3,T1S), 0 , 213, 0 , 9729 , 264, 126), // #1444
- INST(Vscatterpf1qps , VexM_VM , E(660F38,C7,6,2,_,0,2,T1S), 0 , 214, 0 , 9744 , 264, 126), // #1445
- INST(Vscatterqpd , VexMr_Lx , E(660F38,A3,_,x,_,1,3,T1S), 0 , 115, 0 , 9759 , 353, 111), // #1446
- INST(Vscatterqps , VexMr_Lx , E(660F38,A3,_,x,_,0,2,T1S), 0 , 116, 0 , 9771 , 352, 111), // #1447
- INST(Vshuff32x4 , VexRvmi_Lx , E(660F3A,23,_,x,_,0,4,FV ), 0 , 99 , 0 , 9783 , 381, 111), // #1448
- INST(Vshuff64x2 , VexRvmi_Lx , E(660F3A,23,_,x,_,1,4,FV ), 0 , 100, 0 , 9794 , 382, 111), // #1449
- INST(Vshufi32x4 , VexRvmi_Lx , E(660F3A,43,_,x,_,0,4,FV ), 0 , 99 , 0 , 9805 , 381, 111), // #1450
- INST(Vshufi64x2 , VexRvmi_Lx , E(660F3A,43,_,x,_,1,4,FV ), 0 , 100, 0 , 9816 , 382, 111), // #1451
- INST(Vshufpd , VexRvmi_Lx , V(660F00,C6,_,x,I,1,4,FV ), 0 , 93 , 0 , 9827 , 383, 106), // #1452
- INST(Vshufps , VexRvmi_Lx , V(000F00,C6,_,x,I,0,4,FV ), 0 , 94 , 0 , 9835 , 384, 106), // #1453
- INST(Vsqrtpd , VexRm_Lx , V(660F00,51,_,x,I,1,4,FV ), 0 , 93 , 0 , 9843 , 385, 106), // #1454
- INST(Vsqrtps , VexRm_Lx , V(000F00,51,_,x,I,0,4,FV ), 0 , 94 , 0 , 9851 , 209, 106), // #1455
- INST(Vsqrtsd , VexRvm , V(F20F00,51,_,I,I,1,3,T1S), 0 , 95 , 0 , 9859 , 177, 107), // #1456
- INST(Vsqrtss , VexRvm , V(F30F00,51,_,I,I,0,2,T1S), 0 , 96 , 0 , 9867 , 178, 107), // #1457
- INST(Vstmxcsr , VexM , V(000F00,AE,3,0,I,_,_,_ ), 0 , 215, 0 , 9875 , 278, 108), // #1458
- INST(Vsubpd , VexRvm_Lx , V(660F00,5C,_,x,I,1,4,FV ), 0 , 93 , 0 , 9884 , 175, 106), // #1459
- INST(Vsubps , VexRvm_Lx , V(000F00,5C,_,x,I,0,4,FV ), 0 , 94 , 0 , 9891 , 176, 106), // #1460
- INST(Vsubsd , VexRvm , V(F20F00,5C,_,I,I,1,3,T1S), 0 , 95 , 0 , 9898 , 177, 107), // #1461
- INST(Vsubss , VexRvm , V(F30F00,5C,_,I,I,0,2,T1S), 0 , 96 , 0 , 9905 , 178, 107), // #1462
- INST(Vtestpd , VexRm_Lx , V(660F38,0F,_,x,0,_,_,_ ), 0 , 88 , 0 , 9912 , 257, 134), // #1463
- INST(Vtestps , VexRm_Lx , V(660F38,0E,_,x,0,_,_,_ ), 0 , 88 , 0 , 9920 , 257, 134), // #1464
- INST(Vucomisd , VexRm , V(660F00,2E,_,I,I,1,3,T1S), 0 , 113, 0 , 9928 , 205, 117), // #1465
- INST(Vucomiss , VexRm , V(000F00,2E,_,I,I,0,2,T1S), 0 , 114, 0 , 9937 , 206, 117), // #1466
- INST(Vunpckhpd , VexRvm_Lx , V(660F00,15,_,x,I,1,4,FV ), 0 , 93 , 0 , 9946 , 185, 106), // #1467
- INST(Vunpckhps , VexRvm_Lx , V(000F00,15,_,x,I,0,4,FV ), 0 , 94 , 0 , 9956 , 186, 106), // #1468
- INST(Vunpcklpd , VexRvm_Lx , V(660F00,14,_,x,I,1,4,FV ), 0 , 93 , 0 , 9966 , 185, 106), // #1469
- INST(Vunpcklps , VexRvm_Lx , V(000F00,14,_,x,I,0,4,FV ), 0 , 94 , 0 , 9976 , 186, 106), // #1470
- INST(Vxorpd , VexRvm_Lx , V(660F00,57,_,x,I,1,4,FV ), 0 , 93 , 0 , 9986 , 365, 112), // #1471
- INST(Vxorps , VexRvm_Lx , V(000F00,57,_,x,I,0,4,FV ), 0 , 94 , 0 , 9993 , 364, 112), // #1472
- INST(Vzeroall , VexOp , V(000F00,77,_,1,I,_,_,_ ), 0 , 62 , 0 , 10000, 386, 108), // #1473
- INST(Vzeroupper , VexOp , V(000F00,77,_,0,I,_,_,_ ), 0 , 66 , 0 , 10009, 386, 108), // #1474
- INST(Wbinvd , X86Op , O(000F00,09,_,_,_,_,_,_ ), 0 , 4 , 0 , 10020, 30 , 0 ), // #1475
- INST(Wbnoinvd , X86Op , O(F30F00,09,_,_,_,_,_,_ ), 0 , 6 , 0 , 10027, 30 , 143), // #1476
- INST(Wrfsbase , X86M , O(F30F00,AE,2,_,x,_,_,_ ), 0 , 216, 0 , 10036, 161, 94 ), // #1477
- INST(Wrgsbase , X86M , O(F30F00,AE,3,_,x,_,_,_ ), 0 , 217, 0 , 10045, 161, 94 ), // #1478
- INST(Wrmsr , X86Op , O(000F00,30,_,_,_,_,_,_ ), 0 , 4 , 0 , 10054, 162, 95 ), // #1479
- INST(Xabort , X86Op_O_I8 , O(000000,C6,7,_,_,_,_,_ ), 0 , 25 , 0 , 10060, 74 , 144), // #1480
- INST(Xadd , X86Xadd , O(000F00,C0,_,_,x,_,_,_ ), 0 , 4 , 0 , 10067, 387, 36 ), // #1481
- INST(Xbegin , X86JmpRel , O(000000,C7,7,_,_,_,_,_ ), 0 , 25 , 0 , 10072, 388, 144), // #1482
- INST(Xchg , X86Xchg , O(000000,86,_,_,x,_,_,_ ), 0 , 0 , 0 , 448 , 389, 0 ), // #1483
- INST(Xend , X86Op , O(000F01,D5,_,_,_,_,_,_ ), 0 , 21 , 0 , 10079, 30 , 144), // #1484
- INST(Xgetbv , X86Op , O(000F01,D0,_,_,_,_,_,_ ), 0 , 21 , 0 , 10084, 162, 145), // #1485
- INST(Xlatb , X86Op , O(000000,D7,_,_,_,_,_,_ ), 0 , 0 , 0 , 10091, 30 , 0 ), // #1486
- INST(Xor , X86Arith , O(000000,30,6,_,x,_,_,_ ), 0 , 30 , 0 , 9205 , 166, 1 ), // #1487
- INST(Xorpd , ExtRm , O(660F00,57,_,_,_,_,_,_ ), 0 , 3 , 0 , 9987 , 140, 4 ), // #1488
- INST(Xorps , ExtRm , O(000F00,57,_,_,_,_,_,_ ), 0 , 4 , 0 , 9994 , 140, 5 ), // #1489
- INST(Xrstor , X86M_Only , O(000F00,AE,5,_,_,_,_,_ ), 0 , 70 , 0 , 1134 , 390, 145), // #1490
- INST(Xrstor64 , X86M_Only , O(000F00,AE,5,_,1,_,_,_ ), 0 , 218, 0 , 1142 , 391, 145), // #1491
- INST(Xrstors , X86M_Only , O(000F00,C7,3,_,_,_,_,_ ), 0 , 71 , 0 , 10097, 390, 146), // #1492
- INST(Xrstors64 , X86M_Only , O(000F00,C7,3,_,1,_,_,_ ), 0 , 219, 0 , 10105, 391, 146), // #1493
- INST(Xsave , X86M_Only , O(000F00,AE,4,_,_,_,_,_ ), 0 , 89 , 0 , 1152 , 390, 145), // #1494
- INST(Xsave64 , X86M_Only , O(000F00,AE,4,_,1,_,_,_ ), 0 , 220, 0 , 1159 , 391, 145), // #1495
- INST(Xsavec , X86M_Only , O(000F00,C7,4,_,_,_,_,_ ), 0 , 89 , 0 , 10115, 390, 147), // #1496
- INST(Xsavec64 , X86M_Only , O(000F00,C7,4,_,1,_,_,_ ), 0 , 220, 0 , 10122, 391, 147), // #1497
- INST(Xsaveopt , X86M_Only , O(000F00,AE,6,_,_,_,_,_ ), 0 , 73 , 0 , 10131, 390, 148), // #1498
- INST(Xsaveopt64 , X86M_Only , O(000F00,AE,6,_,1,_,_,_ ), 0 , 221, 0 , 10140, 391, 148), // #1499
- INST(Xsaves , X86M_Only , O(000F00,C7,5,_,_,_,_,_ ), 0 , 70 , 0 , 10151, 390, 146), // #1500
- INST(Xsaves64 , X86M_Only , O(000F00,C7,5,_,1,_,_,_ ), 0 , 218, 0 , 10158, 391, 146), // #1501
- INST(Xsetbv , X86Op , O(000F01,D1,_,_,_,_,_,_ ), 0 , 21 , 0 , 10167, 162, 145), // #1502
- INST(Xtest , X86Op , O(000F01,D6,_,_,_,_,_,_ ), 0 , 21 , 0 , 10174, 30 , 149) // #1503
+ INST(Clrssbsy , X86M_Only , O(F30F00,AE,6,_,_,_,_,_ ), 0 , 24 , 0 , 252 , 32 , 24 ), // #71
+ INST(Clts , X86Op , O(000F00,06,_,_,_,_,_,_ ), 0 , 4 , 0 , 261 , 30 , 0 ), // #72
+ INST(Clui , X86Op , O(F30F01,EE,_,_,_,_,_,_ ), 0 , 25 , 0 , 266 , 33 , 25 ), // #73
+ INST(Clwb , X86M_Only , O(660F00,AE,6,_,_,_,_,_ ), 0 , 26 , 0 , 271 , 31 , 26 ), // #74
+ INST(Clzero , X86Op_MemZAX , O(000F01,FC,_,_,_,_,_,_ ), 0 , 21 , 0 , 276 , 34 , 27 ), // #75
+ INST(Cmc , X86Op , O(000000,F5,_,_,_,_,_,_ ), 0 , 0 , 0 , 283 , 30 , 28 ), // #76
+ INST(Cmova , X86Rm , O(000F00,47,_,_,x,_,_,_ ), 0 , 4 , 0 , 287 , 22 , 29 ), // #77
+ INST(Cmovae , X86Rm , O(000F00,43,_,_,x,_,_,_ ), 0 , 4 , 0 , 293 , 22 , 30 ), // #78
+ INST(Cmovb , X86Rm , O(000F00,42,_,_,x,_,_,_ ), 0 , 4 , 0 , 648 , 22 , 30 ), // #79
+ INST(Cmovbe , X86Rm , O(000F00,46,_,_,x,_,_,_ ), 0 , 4 , 0 , 655 , 22 , 29 ), // #80
+ INST(Cmovc , X86Rm , O(000F00,42,_,_,x,_,_,_ ), 0 , 4 , 0 , 300 , 22 , 30 ), // #81
+ INST(Cmove , X86Rm , O(000F00,44,_,_,x,_,_,_ ), 0 , 4 , 0 , 663 , 22 , 31 ), // #82
+ INST(Cmovg , X86Rm , O(000F00,4F,_,_,x,_,_,_ ), 0 , 4 , 0 , 306 , 22 , 32 ), // #83
+ INST(Cmovge , X86Rm , O(000F00,4D,_,_,x,_,_,_ ), 0 , 4 , 0 , 312 , 22 , 33 ), // #84
+ INST(Cmovl , X86Rm , O(000F00,4C,_,_,x,_,_,_ ), 0 , 4 , 0 , 319 , 22 , 33 ), // #85
+ INST(Cmovle , X86Rm , O(000F00,4E,_,_,x,_,_,_ ), 0 , 4 , 0 , 325 , 22 , 32 ), // #86
+ INST(Cmovna , X86Rm , O(000F00,46,_,_,x,_,_,_ ), 0 , 4 , 0 , 332 , 22 , 29 ), // #87
+ INST(Cmovnae , X86Rm , O(000F00,42,_,_,x,_,_,_ ), 0 , 4 , 0 , 339 , 22 , 30 ), // #88
+ INST(Cmovnb , X86Rm , O(000F00,43,_,_,x,_,_,_ ), 0 , 4 , 0 , 670 , 22 , 30 ), // #89
+ INST(Cmovnbe , X86Rm , O(000F00,47,_,_,x,_,_,_ ), 0 , 4 , 0 , 678 , 22 , 29 ), // #90
+ INST(Cmovnc , X86Rm , O(000F00,43,_,_,x,_,_,_ ), 0 , 4 , 0 , 347 , 22 , 30 ), // #91
+ INST(Cmovne , X86Rm , O(000F00,45,_,_,x,_,_,_ ), 0 , 4 , 0 , 687 , 22 , 31 ), // #92
+ INST(Cmovng , X86Rm , O(000F00,4E,_,_,x,_,_,_ ), 0 , 4 , 0 , 354 , 22 , 32 ), // #93
+ INST(Cmovnge , X86Rm , O(000F00,4C,_,_,x,_,_,_ ), 0 , 4 , 0 , 361 , 22 , 33 ), // #94
+ INST(Cmovnl , X86Rm , O(000F00,4D,_,_,x,_,_,_ ), 0 , 4 , 0 , 369 , 22 , 33 ), // #95
+ INST(Cmovnle , X86Rm , O(000F00,4F,_,_,x,_,_,_ ), 0 , 4 , 0 , 376 , 22 , 32 ), // #96
+ INST(Cmovno , X86Rm , O(000F00,41,_,_,x,_,_,_ ), 0 , 4 , 0 , 384 , 22 , 34 ), // #97
+ INST(Cmovnp , X86Rm , O(000F00,4B,_,_,x,_,_,_ ), 0 , 4 , 0 , 391 , 22 , 35 ), // #98
+ INST(Cmovns , X86Rm , O(000F00,49,_,_,x,_,_,_ ), 0 , 4 , 0 , 398 , 22 , 36 ), // #99
+ INST(Cmovnz , X86Rm , O(000F00,45,_,_,x,_,_,_ ), 0 , 4 , 0 , 405 , 22 , 31 ), // #100
+ INST(Cmovo , X86Rm , O(000F00,40,_,_,x,_,_,_ ), 0 , 4 , 0 , 412 , 22 , 34 ), // #101
+ INST(Cmovp , X86Rm , O(000F00,4A,_,_,x,_,_,_ ), 0 , 4 , 0 , 418 , 22 , 35 ), // #102
+ INST(Cmovpe , X86Rm , O(000F00,4A,_,_,x,_,_,_ ), 0 , 4 , 0 , 424 , 22 , 35 ), // #103
+ INST(Cmovpo , X86Rm , O(000F00,4B,_,_,x,_,_,_ ), 0 , 4 , 0 , 431 , 22 , 35 ), // #104
+ INST(Cmovs , X86Rm , O(000F00,48,_,_,x,_,_,_ ), 0 , 4 , 0 , 438 , 22 , 36 ), // #105
+ INST(Cmovz , X86Rm , O(000F00,44,_,_,x,_,_,_ ), 0 , 4 , 0 , 444 , 22 , 31 ), // #106
+ INST(Cmp , X86Arith , O(000000,38,7,_,x,_,_,_ ), 0 , 27 , 0 , 450 , 35 , 1 ), // #107
+ INST(Cmppd , ExtRmi , O(660F00,C2,_,_,_,_,_,_ ), 0 , 3 , 0 , 3737 , 8 , 4 ), // #108
+ INST(Cmpps , ExtRmi , O(000F00,C2,_,_,_,_,_,_ ), 0 , 4 , 0 , 3751 , 8 , 5 ), // #109
+ INST(Cmps , X86StrMm , O(000000,A6,_,_,_,_,_,_ ), 0 , 0 , 0 , 454 , 36 , 37 ), // #110
+ INST(Cmpsd , ExtRmi , O(F20F00,C2,_,_,_,_,_,_ ), 0 , 5 , 0 , 3758 , 37 , 4 ), // #111
+ INST(Cmpss , ExtRmi , O(F30F00,C2,_,_,_,_,_,_ ), 0 , 6 , 0 , 3772 , 38 , 5 ), // #112
+ INST(Cmpxchg , X86Cmpxchg , O(000F00,B0,_,_,x,_,_,_ ), 0 , 4 , 0 , 459 , 39 , 38 ), // #113
+ INST(Cmpxchg16b , X86Cmpxchg8b_16b , O(000F00,C7,1,_,1,_,_,_ ), 0 , 28 , 0 , 467 , 40 , 39 ), // #114
+ INST(Cmpxchg8b , X86Cmpxchg8b_16b , O(000F00,C7,1,_,_,_,_,_ ), 0 , 29 , 0 , 478 , 41 , 40 ), // #115
+ INST(Comisd , ExtRm , O(660F00,2F,_,_,_,_,_,_ ), 0 , 3 , 0 , 11391, 6 , 41 ), // #116
+ INST(Comiss , ExtRm , O(000F00,2F,_,_,_,_,_,_ ), 0 , 4 , 0 , 11409, 7 , 42 ), // #117
+ INST(Cpuid , X86Op , O(000F00,A2,_,_,_,_,_,_ ), 0 , 4 , 0 , 488 , 42 , 43 ), // #118
+ INST(Cqo , X86Op_xDX_xAX , O(000000,99,_,_,1,_,_,_ ), 0 , 20 , 0 , 494 , 43 , 0 ), // #119
+ INST(Crc32 , X86Crc , O(F20F38,F0,_,_,x,_,_,_ ), 0 , 30 , 0 , 498 , 44 , 44 ), // #120
+ INST(Cvtdq2pd , ExtRm , O(F30F00,E6,_,_,_,_,_,_ ), 0 , 6 , 0 , 3827 , 6 , 4 ), // #121
+ INST(Cvtdq2ps , ExtRm , O(000F00,5B,_,_,_,_,_,_ ), 0 , 4 , 0 , 3847 , 5 , 4 ), // #122
+ INST(Cvtpd2dq , ExtRm , O(F20F00,E6,_,_,_,_,_,_ ), 0 , 5 , 0 , 3886 , 5 , 4 ), // #123
+ INST(Cvtpd2pi , ExtRm , O(660F00,2D,_,_,_,_,_,_ ), 0 , 3 , 0 , 504 , 45 , 4 ), // #124
+ INST(Cvtpd2ps , ExtRm , O(660F00,5A,_,_,_,_,_,_ ), 0 , 3 , 0 , 3906 , 5 , 4 ), // #125
+ INST(Cvtpi2pd , ExtRm , O(660F00,2A,_,_,_,_,_,_ ), 0 , 3 , 0 , 513 , 46 , 4 ), // #126
+ INST(Cvtpi2ps , ExtRm , O(000F00,2A,_,_,_,_,_,_ ), 0 , 4 , 0 , 522 , 46 , 5 ), // #127
+ INST(Cvtps2dq , ExtRm , O(660F00,5B,_,_,_,_,_,_ ), 0 , 3 , 0 , 4040 , 5 , 4 ), // #128
+ INST(Cvtps2pd , ExtRm , O(000F00,5A,_,_,_,_,_,_ ), 0 , 4 , 0 , 4050 , 6 , 4 ), // #129
+ INST(Cvtps2pi , ExtRm , O(000F00,2D,_,_,_,_,_,_ ), 0 , 4 , 0 , 531 , 47 , 5 ), // #130
+ INST(Cvtsd2si , ExtRm_Wx_GpqOnly , O(F20F00,2D,_,_,x,_,_,_ ), 0 , 5 , 0 , 4153 , 48 , 4 ), // #131
+ INST(Cvtsd2ss , ExtRm , O(F20F00,5A,_,_,_,_,_,_ ), 0 , 5 , 0 , 4163 , 6 , 4 ), // #132
+ INST(Cvtsi2sd , ExtRm_Wx , O(F20F00,2A,_,_,x,_,_,_ ), 0 , 5 , 0 , 4225 , 49 , 4 ), // #133
+ INST(Cvtsi2ss , ExtRm_Wx , O(F30F00,2A,_,_,x,_,_,_ ), 0 , 6 , 0 , 4245 , 49 , 5 ), // #134
+ INST(Cvtss2sd , ExtRm , O(F30F00,5A,_,_,_,_,_,_ ), 0 , 6 , 0 , 4255 , 7 , 4 ), // #135
+ INST(Cvtss2si , ExtRm_Wx_GpqOnly , O(F30F00,2D,_,_,x,_,_,_ ), 0 , 6 , 0 , 4275 , 50 , 5 ), // #136
+ INST(Cvttpd2dq , ExtRm , O(660F00,E6,_,_,_,_,_,_ ), 0 , 3 , 0 , 4296 , 5 , 4 ), // #137
+ INST(Cvttpd2pi , ExtRm , O(660F00,2C,_,_,_,_,_,_ ), 0 , 3 , 0 , 540 , 45 , 4 ), // #138
+ INST(Cvttps2dq , ExtRm , O(F30F00,5B,_,_,_,_,_,_ ), 0 , 6 , 0 , 4409 , 5 , 4 ), // #139
+ INST(Cvttps2pi , ExtRm , O(000F00,2C,_,_,_,_,_,_ ), 0 , 4 , 0 , 550 , 47 , 5 ), // #140
+ INST(Cvttsd2si , ExtRm_Wx_GpqOnly , O(F20F00,2C,_,_,x,_,_,_ ), 0 , 5 , 0 , 4455 , 48 , 4 ), // #141
+ INST(Cvttss2si , ExtRm_Wx_GpqOnly , O(F30F00,2C,_,_,x,_,_,_ ), 0 , 6 , 0 , 4501 , 50 , 5 ), // #142
+ INST(Cwd , X86Op_xDX_xAX , O(660000,99,_,_,_,_,_,_ ), 0 , 19 , 0 , 560 , 51 , 0 ), // #143
+ INST(Cwde , X86Op_xAX , O(000000,98,_,_,_,_,_,_ ), 0 , 0 , 0 , 564 , 52 , 0 ), // #144
+ INST(Daa , X86Op , O(000000,27,_,_,_,_,_,_ ), 0 , 0 , 0 , 569 , 1 , 1 ), // #145
+ INST(Das , X86Op , O(000000,2F,_,_,_,_,_,_ ), 0 , 0 , 0 , 573 , 1 , 1 ), // #146
+ INST(Dec , X86IncDec , O(000000,FE,1,_,x,_,_,_ ), O(000000,48,_,_,x,_,_,_ ), 31 , 6 , 3355 , 53 , 45 ), // #147
+ INST(Div , X86M_GPB_MulDiv , O(000000,F6,6,_,x,_,_,_ ), 0 , 32 , 0 , 810 , 54 , 1 ), // #148
+ INST(Divpd , ExtRm , O(660F00,5E,_,_,_,_,_,_ ), 0 , 3 , 0 , 4652 , 5 , 4 ), // #149
+ INST(Divps , ExtRm , O(000F00,5E,_,_,_,_,_,_ ), 0 , 4 , 0 , 4666 , 5 , 5 ), // #150
+ INST(Divsd , ExtRm , O(F20F00,5E,_,_,_,_,_,_ ), 0 , 5 , 0 , 4673 , 6 , 4 ), // #151
+ INST(Divss , ExtRm , O(F30F00,5E,_,_,_,_,_,_ ), 0 , 6 , 0 , 4687 , 7 , 5 ), // #152
+ INST(Dppd , ExtRmi , O(660F3A,41,_,_,_,_,_,_ ), 0 , 8 , 0 , 4704 , 8 , 12 ), // #153
+ INST(Dpps , ExtRmi , O(660F3A,40,_,_,_,_,_,_ ), 0 , 8 , 0 , 4710 , 8 , 12 ), // #154
+ INST(Emms , X86Op , O(000F00,77,_,_,_,_,_,_ ), 0 , 4 , 0 , 778 , 55 , 46 ), // #155
+ INST(Endbr32 , X86Op_Mod11RM , O(F30F00,1E,7,_,_,_,_,3 ), 0 , 33 , 0 , 577 , 30 , 47 ), // #156
+ INST(Endbr64 , X86Op_Mod11RM , O(F30F00,1E,7,_,_,_,_,2 ), 0 , 34 , 0 , 585 , 30 , 47 ), // #157
+ INST(Enqcmd , X86EnqcmdMovdir64b , O(F20F38,F8,_,_,_,_,_,_ ), 0 , 30 , 0 , 593 , 56 , 48 ), // #158
+ INST(Enqcmds , X86EnqcmdMovdir64b , O(F30F38,F8,_,_,_,_,_,_ ), 0 , 7 , 0 , 600 , 56 , 48 ), // #159
+ INST(Enter , X86Enter , O(000000,C8,_,_,_,_,_,_ ), 0 , 0 , 0 , 3046 , 57 , 0 ), // #160
+ INST(Extractps , ExtExtract , O(660F3A,17,_,_,_,_,_,_ ), 0 , 8 , 0 , 4900 , 58 , 12 ), // #161
+ INST(Extrq , ExtExtrq , O(660F00,79,_,_,_,_,_,_ ), O(660F00,78,0,_,_,_,_,_ ), 3 , 7 , 8625 , 59 , 49 ), // #162
+ INST(F2xm1 , FpuOp , O_FPU(00,D9F0,_) , 0 , 35 , 0 , 608 , 30 , 0 ), // #163
+ INST(Fabs , FpuOp , O_FPU(00,D9E1,_) , 0 , 35 , 0 , 614 , 30 , 0 ), // #164
+ INST(Fadd , FpuArith , O_FPU(00,C0C0,0) , 0 , 36 , 0 , 2121 , 60 , 0 ), // #165
+ INST(Faddp , FpuRDef , O_FPU(00,DEC0,_) , 0 , 37 , 0 , 619 , 61 , 0 ), // #166
+ INST(Fbld , X86M_Only , O_FPU(00,00DF,4) , 0 , 38 , 0 , 625 , 62 , 0 ), // #167
+ INST(Fbstp , X86M_Only , O_FPU(00,00DF,6) , 0 , 39 , 0 , 630 , 62 , 0 ), // #168
+ INST(Fchs , FpuOp , O_FPU(00,D9E0,_) , 0 , 35 , 0 , 636 , 30 , 0 ), // #169
+ INST(Fclex , FpuOp , O_FPU(9B,DBE2,_) , 0 , 40 , 0 , 641 , 30 , 0 ), // #170
+ INST(Fcmovb , FpuR , O_FPU(00,DAC0,_) , 0 , 41 , 0 , 647 , 63 , 30 ), // #171
+ INST(Fcmovbe , FpuR , O_FPU(00,DAD0,_) , 0 , 41 , 0 , 654 , 63 , 29 ), // #172
+ INST(Fcmove , FpuR , O_FPU(00,DAC8,_) , 0 , 41 , 0 , 662 , 63 , 31 ), // #173
+ INST(Fcmovnb , FpuR , O_FPU(00,DBC0,_) , 0 , 42 , 0 , 669 , 63 , 30 ), // #174
+ INST(Fcmovnbe , FpuR , O_FPU(00,DBD0,_) , 0 , 42 , 0 , 677 , 63 , 29 ), // #175
+ INST(Fcmovne , FpuR , O_FPU(00,DBC8,_) , 0 , 42 , 0 , 686 , 63 , 31 ), // #176
+ INST(Fcmovnu , FpuR , O_FPU(00,DBD8,_) , 0 , 42 , 0 , 694 , 63 , 35 ), // #177
+ INST(Fcmovu , FpuR , O_FPU(00,DAD8,_) , 0 , 41 , 0 , 702 , 63 , 35 ), // #178
+ INST(Fcom , FpuCom , O_FPU(00,D0D0,2) , 0 , 43 , 0 , 709 , 64 , 0 ), // #179
+ INST(Fcomi , FpuR , O_FPU(00,DBF0,_) , 0 , 42 , 0 , 714 , 63 , 50 ), // #180
+ INST(Fcomip , FpuR , O_FPU(00,DFF0,_) , 0 , 44 , 0 , 720 , 63 , 50 ), // #181
+ INST(Fcomp , FpuCom , O_FPU(00,D8D8,3) , 0 , 45 , 0 , 727 , 64 , 0 ), // #182
+ INST(Fcompp , FpuOp , O_FPU(00,DED9,_) , 0 , 37 , 0 , 733 , 30 , 0 ), // #183
+ INST(Fcos , FpuOp , O_FPU(00,D9FF,_) , 0 , 35 , 0 , 740 , 30 , 0 ), // #184
+ INST(Fdecstp , FpuOp , O_FPU(00,D9F6,_) , 0 , 35 , 0 , 745 , 30 , 0 ), // #185
+ INST(Fdiv , FpuArith , O_FPU(00,F0F8,6) , 0 , 46 , 0 , 753 , 60 , 0 ), // #186
+ INST(Fdivp , FpuRDef , O_FPU(00,DEF8,_) , 0 , 37 , 0 , 758 , 61 , 0 ), // #187
+ INST(Fdivr , FpuArith , O_FPU(00,F8F0,7) , 0 , 47 , 0 , 764 , 60 , 0 ), // #188
+ INST(Fdivrp , FpuRDef , O_FPU(00,DEF0,_) , 0 , 37 , 0 , 770 , 61 , 0 ), // #189
+ INST(Femms , X86Op , O(000F00,0E,_,_,_,_,_,_ ), 0 , 4 , 0 , 777 , 30 , 51 ), // #190
+ INST(Ffree , FpuR , O_FPU(00,DDC0,_) , 0 , 48 , 0 , 783 , 63 , 0 ), // #191
+ INST(Fiadd , FpuM , O_FPU(00,00DA,0) , 0 , 49 , 0 , 789 , 65 , 0 ), // #192
+ INST(Ficom , FpuM , O_FPU(00,00DA,2) , 0 , 50 , 0 , 795 , 65 , 0 ), // #193
+ INST(Ficomp , FpuM , O_FPU(00,00DA,3) , 0 , 51 , 0 , 801 , 65 , 0 ), // #194
+ INST(Fidiv , FpuM , O_FPU(00,00DA,6) , 0 , 39 , 0 , 808 , 65 , 0 ), // #195
+ INST(Fidivr , FpuM , O_FPU(00,00DA,7) , 0 , 52 , 0 , 814 , 65 , 0 ), // #196
+ INST(Fild , FpuM , O_FPU(00,00DB,0) , O_FPU(00,00DF,5) , 49 , 8 , 821 , 66 , 0 ), // #197
+ INST(Fimul , FpuM , O_FPU(00,00DA,1) , 0 , 53 , 0 , 826 , 65 , 0 ), // #198
+ INST(Fincstp , FpuOp , O_FPU(00,D9F7,_) , 0 , 35 , 0 , 832 , 30 , 0 ), // #199
+ INST(Finit , FpuOp , O_FPU(9B,DBE3,_) , 0 , 40 , 0 , 840 , 30 , 0 ), // #200
+ INST(Fist , FpuM , O_FPU(00,00DB,2) , 0 , 50 , 0 , 846 , 65 , 0 ), // #201
+ INST(Fistp , FpuM , O_FPU(00,00DB,3) , O_FPU(00,00DF,7) , 51 , 9 , 851 , 66 , 0 ), // #202
+ INST(Fisttp , FpuM , O_FPU(00,00DB,1) , O_FPU(00,00DD,1) , 53 , 10 , 857 , 66 , 6 ), // #203
+ INST(Fisub , FpuM , O_FPU(00,00DA,4) , 0 , 38 , 0 , 864 , 65 , 0 ), // #204
+ INST(Fisubr , FpuM , O_FPU(00,00DA,5) , 0 , 54 , 0 , 870 , 65 , 0 ), // #205
+ INST(Fld , FpuFldFst , O_FPU(00,00D9,0) , O_FPU(00,00DB,5) , 49 , 11 , 877 , 67 , 0 ), // #206
+ INST(Fld1 , FpuOp , O_FPU(00,D9E8,_) , 0 , 35 , 0 , 881 , 30 , 0 ), // #207
+ INST(Fldcw , X86M_Only , O_FPU(00,00D9,5) , 0 , 54 , 0 , 886 , 68 , 0 ), // #208
+ INST(Fldenv , X86M_Only , O_FPU(00,00D9,4) , 0 , 38 , 0 , 892 , 69 , 0 ), // #209
+ INST(Fldl2e , FpuOp , O_FPU(00,D9EA,_) , 0 , 35 , 0 , 899 , 30 , 0 ), // #210
+ INST(Fldl2t , FpuOp , O_FPU(00,D9E9,_) , 0 , 35 , 0 , 906 , 30 , 0 ), // #211
+ INST(Fldlg2 , FpuOp , O_FPU(00,D9EC,_) , 0 , 35 , 0 , 913 , 30 , 0 ), // #212
+ INST(Fldln2 , FpuOp , O_FPU(00,D9ED,_) , 0 , 35 , 0 , 920 , 30 , 0 ), // #213
+ INST(Fldpi , FpuOp , O_FPU(00,D9EB,_) , 0 , 35 , 0 , 927 , 30 , 0 ), // #214
+ INST(Fldz , FpuOp , O_FPU(00,D9EE,_) , 0 , 35 , 0 , 933 , 30 , 0 ), // #215
+ INST(Fmul , FpuArith , O_FPU(00,C8C8,1) , 0 , 55 , 0 , 2163 , 60 , 0 ), // #216
+ INST(Fmulp , FpuRDef , O_FPU(00,DEC8,_) , 0 , 37 , 0 , 938 , 61 , 0 ), // #217
+ INST(Fnclex , FpuOp , O_FPU(00,DBE2,_) , 0 , 42 , 0 , 944 , 30 , 0 ), // #218
+ INST(Fninit , FpuOp , O_FPU(00,DBE3,_) , 0 , 42 , 0 , 951 , 30 , 0 ), // #219
+ INST(Fnop , FpuOp , O_FPU(00,D9D0,_) , 0 , 35 , 0 , 958 , 30 , 0 ), // #220
+ INST(Fnsave , X86M_Only , O_FPU(00,00DD,6) , 0 , 39 , 0 , 963 , 69 , 0 ), // #221
+ INST(Fnstcw , X86M_Only , O_FPU(00,00D9,7) , 0 , 52 , 0 , 970 , 68 , 0 ), // #222
+ INST(Fnstenv , X86M_Only , O_FPU(00,00D9,6) , 0 , 39 , 0 , 977 , 69 , 0 ), // #223
+ INST(Fnstsw , FpuStsw , O_FPU(00,00DD,7) , O_FPU(00,DFE0,_) , 52 , 12 , 985 , 70 , 0 ), // #224
+ INST(Fpatan , FpuOp , O_FPU(00,D9F3,_) , 0 , 35 , 0 , 992 , 30 , 0 ), // #225
+ INST(Fprem , FpuOp , O_FPU(00,D9F8,_) , 0 , 35 , 0 , 999 , 30 , 0 ), // #226
+ INST(Fprem1 , FpuOp , O_FPU(00,D9F5,_) , 0 , 35 , 0 , 1005 , 30 , 0 ), // #227
+ INST(Fptan , FpuOp , O_FPU(00,D9F2,_) , 0 , 35 , 0 , 1012 , 30 , 0 ), // #228
+ INST(Frndint , FpuOp , O_FPU(00,D9FC,_) , 0 , 35 , 0 , 1018 , 30 , 0 ), // #229
+ INST(Frstor , X86M_Only , O_FPU(00,00DD,4) , 0 , 38 , 0 , 1026 , 69 , 0 ), // #230
+ INST(Fsave , X86M_Only , O_FPU(9B,00DD,6) , 0 , 56 , 0 , 1033 , 69 , 0 ), // #231
+ INST(Fscale , FpuOp , O_FPU(00,D9FD,_) , 0 , 35 , 0 , 1039 , 30 , 0 ), // #232
+ INST(Fsin , FpuOp , O_FPU(00,D9FE,_) , 0 , 35 , 0 , 1046 , 30 , 0 ), // #233
+ INST(Fsincos , FpuOp , O_FPU(00,D9FB,_) , 0 , 35 , 0 , 1051 , 30 , 0 ), // #234
+ INST(Fsqrt , FpuOp , O_FPU(00,D9FA,_) , 0 , 35 , 0 , 1059 , 30 , 0 ), // #235
+ INST(Fst , FpuFldFst , O_FPU(00,00D9,2) , 0 , 50 , 0 , 1065 , 71 , 0 ), // #236
+ INST(Fstcw , X86M_Only , O_FPU(9B,00D9,7) , 0 , 57 , 0 , 1069 , 68 , 0 ), // #237
+ INST(Fstenv , X86M_Only , O_FPU(9B,00D9,6) , 0 , 56 , 0 , 1075 , 69 , 0 ), // #238
+ INST(Fstp , FpuFldFst , O_FPU(00,00D9,3) , O(000000,DB,7,_,_,_,_,_ ), 51 , 13 , 1082 , 67 , 0 ), // #239
+ INST(Fstsw , FpuStsw , O_FPU(9B,00DD,7) , O_FPU(9B,DFE0,_) , 57 , 14 , 1087 , 70 , 0 ), // #240
+ INST(Fsub , FpuArith , O_FPU(00,E0E8,4) , 0 , 58 , 0 , 2241 , 60 , 0 ), // #241
+ INST(Fsubp , FpuRDef , O_FPU(00,DEE8,_) , 0 , 37 , 0 , 1093 , 61 , 0 ), // #242
+ INST(Fsubr , FpuArith , O_FPU(00,E8E0,5) , 0 , 59 , 0 , 2247 , 60 , 0 ), // #243
+ INST(Fsubrp , FpuRDef , O_FPU(00,DEE0,_) , 0 , 37 , 0 , 1099 , 61 , 0 ), // #244
+ INST(Ftst , FpuOp , O_FPU(00,D9E4,_) , 0 , 35 , 0 , 1106 , 30 , 0 ), // #245
+ INST(Fucom , FpuRDef , O_FPU(00,DDE0,_) , 0 , 48 , 0 , 1111 , 61 , 0 ), // #246
+ INST(Fucomi , FpuR , O_FPU(00,DBE8,_) , 0 , 42 , 0 , 1117 , 63 , 50 ), // #247
+ INST(Fucomip , FpuR , O_FPU(00,DFE8,_) , 0 , 44 , 0 , 1124 , 63 , 50 ), // #248
+ INST(Fucomp , FpuRDef , O_FPU(00,DDE8,_) , 0 , 48 , 0 , 1132 , 61 , 0 ), // #249
+ INST(Fucompp , FpuOp , O_FPU(00,DAE9,_) , 0 , 41 , 0 , 1139 , 30 , 0 ), // #250
+ INST(Fwait , X86Op , O_FPU(00,009B,_) , 0 , 49 , 0 , 1147 , 30 , 0 ), // #251
+ INST(Fxam , FpuOp , O_FPU(00,D9E5,_) , 0 , 35 , 0 , 1153 , 30 , 0 ), // #252
+ INST(Fxch , FpuR , O_FPU(00,D9C8,_) , 0 , 35 , 0 , 1158 , 61 , 0 ), // #253
+ INST(Fxrstor , X86M_Only , O(000F00,AE,1,_,_,_,_,_ ), 0 , 29 , 0 , 1163 , 69 , 52 ), // #254
+ INST(Fxrstor64 , X86M_Only , O(000F00,AE,1,_,1,_,_,_ ), 0 , 28 , 0 , 1171 , 72 , 52 ), // #255
+ INST(Fxsave , X86M_Only , O(000F00,AE,0,_,_,_,_,_ ), 0 , 4 , 0 , 1181 , 69 , 52 ), // #256
+ INST(Fxsave64 , X86M_Only , O(000F00,AE,0,_,1,_,_,_ ), 0 , 60 , 0 , 1188 , 72 , 52 ), // #257
+ INST(Fxtract , FpuOp , O_FPU(00,D9F4,_) , 0 , 35 , 0 , 1197 , 30 , 0 ), // #258
+ INST(Fyl2x , FpuOp , O_FPU(00,D9F1,_) , 0 , 35 , 0 , 1205 , 30 , 0 ), // #259
+ INST(Fyl2xp1 , FpuOp , O_FPU(00,D9F9,_) , 0 , 35 , 0 , 1211 , 30 , 0 ), // #260
+ INST(Getsec , X86Op , O(000F00,37,_,_,_,_,_,_ ), 0 , 4 , 0 , 1219 , 30 , 53 ), // #261
+ INST(Gf2p8affineinvqb , ExtRmi , O(660F3A,CF,_,_,_,_,_,_ ), 0 , 8 , 0 , 6789 , 8 , 54 ), // #262
+ INST(Gf2p8affineqb , ExtRmi , O(660F3A,CE,_,_,_,_,_,_ ), 0 , 8 , 0 , 6807 , 8 , 54 ), // #263
+ INST(Gf2p8mulb , ExtRm , O(660F38,CF,_,_,_,_,_,_ ), 0 , 2 , 0 , 6822 , 5 , 54 ), // #264
+ INST(Haddpd , ExtRm , O(660F00,7C,_,_,_,_,_,_ ), 0 , 3 , 0 , 6833 , 5 , 6 ), // #265
+ INST(Haddps , ExtRm , O(F20F00,7C,_,_,_,_,_,_ ), 0 , 5 , 0 , 6841 , 5 , 6 ), // #266
+ INST(Hlt , X86Op , O(000000,F4,_,_,_,_,_,_ ), 0 , 0 , 0 , 1226 , 30 , 0 ), // #267
+ INST(Hreset , X86Op_Mod11RM_I8 , O(F30F3A,F0,0,_,_,_,_,_ ), 0 , 61 , 0 , 1230 , 73 , 55 ), // #268
+ INST(Hsubpd , ExtRm , O(660F00,7D,_,_,_,_,_,_ ), 0 , 3 , 0 , 6849 , 5 , 6 ), // #269
+ INST(Hsubps , ExtRm , O(F20F00,7D,_,_,_,_,_,_ ), 0 , 5 , 0 , 6857 , 5 , 6 ), // #270
+ INST(Idiv , X86M_GPB_MulDiv , O(000000,F6,7,_,x,_,_,_ ), 0 , 27 , 0 , 809 , 54 , 1 ), // #271
+ INST(Imul , X86Imul , O(000000,F6,5,_,x,_,_,_ ), 0 , 62 , 0 , 827 , 74 , 1 ), // #272
+ INST(In , X86In , O(000000,EC,_,_,_,_,_,_ ), O(000000,E4,_,_,_,_,_,_ ), 0 , 15 , 11572, 75 , 0 ), // #273
+ INST(Inc , X86IncDec , O(000000,FE,0,_,x,_,_,_ ), O(000000,40,_,_,x,_,_,_ ), 0 , 16 , 1237 , 53 , 45 ), // #274
+ INST(Incsspd , X86M , O(F30F00,AE,5,_,0,_,_,_ ), 0 , 63 , 0 , 1241 , 76 , 56 ), // #275
+ INST(Incsspq , X86M , O(F30F00,AE,5,_,1,_,_,_ ), 0 , 64 , 0 , 1249 , 77 , 56 ), // #276
+ INST(Ins , X86Ins , O(000000,6C,_,_,_,_,_,_ ), 0 , 0 , 0 , 1916 , 78 , 0 ), // #277
+ INST(Insertps , ExtRmi , O(660F3A,21,_,_,_,_,_,_ ), 0 , 8 , 0 , 6993 , 38 , 12 ), // #278
+ INST(Insertq , ExtInsertq , O(F20F00,79,_,_,_,_,_,_ ), O(F20F00,78,_,_,_,_,_,_ ), 5 , 17 , 1257 , 79 , 49 ), // #279
+ INST(Int , X86Int , O(000000,CD,_,_,_,_,_,_ ), 0 , 0 , 0 , 1022 , 80 , 0 ), // #280
+ INST(Int3 , X86Op , O(000000,CC,_,_,_,_,_,_ ), 0 , 0 , 0 , 1265 , 30 , 0 ), // #281
+ INST(Into , X86Op , O(000000,CE,_,_,_,_,_,_ ), 0 , 0 , 0 , 1270 , 81 , 57 ), // #282
+ INST(Invd , X86Op , O(000F00,08,_,_,_,_,_,_ ), 0 , 4 , 0 , 11501, 30 , 43 ), // #283
+ INST(Invept , X86Rm_NoSize , O(660F38,80,_,_,_,_,_,_ ), 0 , 2 , 0 , 1275 , 82 , 58 ), // #284
+ INST(Invlpg , X86M_Only , O(000F00,01,7,_,_,_,_,_ ), 0 , 22 , 0 , 1282 , 69 , 43 ), // #285
+ INST(Invlpga , X86Op_xAddr , O(000F01,DF,_,_,_,_,_,_ ), 0 , 21 , 0 , 1289 , 83 , 22 ), // #286
+ INST(Invpcid , X86Rm_NoSize , O(660F38,82,_,_,_,_,_,_ ), 0 , 2 , 0 , 1297 , 82 , 43 ), // #287
+ INST(Invvpid , X86Rm_NoSize , O(660F38,81,_,_,_,_,_,_ ), 0 , 2 , 0 , 1305 , 82 , 58 ), // #288
+ INST(Iret , X86Op , O(660000,CF,_,_,_,_,_,_ ), 0 , 19 , 0 , 3226 , 84 , 1 ), // #289
+ INST(Iretd , X86Op , O(000000,CF,_,_,_,_,_,_ ), 0 , 0 , 0 , 1313 , 84 , 1 ), // #290
+ INST(Iretq , X86Op , O(000000,CF,_,_,1,_,_,_ ), 0 , 20 , 0 , 1319 , 85 , 1 ), // #291
+ INST(Ja , X86Jcc , O(000F00,87,_,_,_,_,_,_ ), O(000000,77,_,_,_,_,_,_ ), 4 , 18 , 1325 , 86 , 59 ), // #292
+ INST(Jae , X86Jcc , O(000F00,83,_,_,_,_,_,_ ), O(000000,73,_,_,_,_,_,_ ), 4 , 19 , 1328 , 86 , 60 ), // #293
+ INST(Jb , X86Jcc , O(000F00,82,_,_,_,_,_,_ ), O(000000,72,_,_,_,_,_,_ ), 4 , 20 , 1332 , 86 , 60 ), // #294
+ INST(Jbe , X86Jcc , O(000F00,86,_,_,_,_,_,_ ), O(000000,76,_,_,_,_,_,_ ), 4 , 21 , 1335 , 86 , 59 ), // #295
+ INST(Jc , X86Jcc , O(000F00,82,_,_,_,_,_,_ ), O(000000,72,_,_,_,_,_,_ ), 4 , 20 , 1339 , 86 , 60 ), // #296
+ INST(Je , X86Jcc , O(000F00,84,_,_,_,_,_,_ ), O(000000,74,_,_,_,_,_,_ ), 4 , 22 , 1342 , 86 , 61 ), // #297
+ INST(Jecxz , X86JecxzLoop , 0 , O(000000,E3,_,_,_,_,_,_ ), 0 , 23 , 1345 , 87 , 0 ), // #298
+ INST(Jg , X86Jcc , O(000F00,8F,_,_,_,_,_,_ ), O(000000,7F,_,_,_,_,_,_ ), 4 , 24 , 1351 , 86 , 62 ), // #299
+ INST(Jge , X86Jcc , O(000F00,8D,_,_,_,_,_,_ ), O(000000,7D,_,_,_,_,_,_ ), 4 , 25 , 1354 , 86 , 63 ), // #300
+ INST(Jl , X86Jcc , O(000F00,8C,_,_,_,_,_,_ ), O(000000,7C,_,_,_,_,_,_ ), 4 , 26 , 1358 , 86 , 63 ), // #301
+ INST(Jle , X86Jcc , O(000F00,8E,_,_,_,_,_,_ ), O(000000,7E,_,_,_,_,_,_ ), 4 , 27 , 1361 , 86 , 62 ), // #302
+ INST(Jmp , X86Jmp , O(000000,FF,4,_,_,_,_,_ ), O(000000,EB,_,_,_,_,_,_ ), 9 , 28 , 1861 , 88 , 0 ), // #303
+ INST(Jna , X86Jcc , O(000F00,86,_,_,_,_,_,_ ), O(000000,76,_,_,_,_,_,_ ), 4 , 21 , 1365 , 86 , 59 ), // #304
+ INST(Jnae , X86Jcc , O(000F00,82,_,_,_,_,_,_ ), O(000000,72,_,_,_,_,_,_ ), 4 , 20 , 1369 , 86 , 60 ), // #305
+ INST(Jnb , X86Jcc , O(000F00,83,_,_,_,_,_,_ ), O(000000,73,_,_,_,_,_,_ ), 4 , 19 , 1374 , 86 , 60 ), // #306
+ INST(Jnbe , X86Jcc , O(000F00,87,_,_,_,_,_,_ ), O(000000,77,_,_,_,_,_,_ ), 4 , 18 , 1378 , 86 , 59 ), // #307
+ INST(Jnc , X86Jcc , O(000F00,83,_,_,_,_,_,_ ), O(000000,73,_,_,_,_,_,_ ), 4 , 19 , 1383 , 86 , 60 ), // #308
+ INST(Jne , X86Jcc , O(000F00,85,_,_,_,_,_,_ ), O(000000,75,_,_,_,_,_,_ ), 4 , 29 , 1387 , 86 , 61 ), // #309
+ INST(Jng , X86Jcc , O(000F00,8E,_,_,_,_,_,_ ), O(000000,7E,_,_,_,_,_,_ ), 4 , 27 , 1391 , 86 , 62 ), // #310
+ INST(Jnge , X86Jcc , O(000F00,8C,_,_,_,_,_,_ ), O(000000,7C,_,_,_,_,_,_ ), 4 , 26 , 1395 , 86 , 63 ), // #311
+ INST(Jnl , X86Jcc , O(000F00,8D,_,_,_,_,_,_ ), O(000000,7D,_,_,_,_,_,_ ), 4 , 25 , 1400 , 86 , 63 ), // #312
+ INST(Jnle , X86Jcc , O(000F00,8F,_,_,_,_,_,_ ), O(000000,7F,_,_,_,_,_,_ ), 4 , 24 , 1404 , 86 , 62 ), // #313
+ INST(Jno , X86Jcc , O(000F00,81,_,_,_,_,_,_ ), O(000000,71,_,_,_,_,_,_ ), 4 , 30 , 1409 , 86 , 57 ), // #314
+ INST(Jnp , X86Jcc , O(000F00,8B,_,_,_,_,_,_ ), O(000000,7B,_,_,_,_,_,_ ), 4 , 31 , 1413 , 86 , 64 ), // #315
+ INST(Jns , X86Jcc , O(000F00,89,_,_,_,_,_,_ ), O(000000,79,_,_,_,_,_,_ ), 4 , 32 , 1417 , 86 , 65 ), // #316
+ INST(Jnz , X86Jcc , O(000F00,85,_,_,_,_,_,_ ), O(000000,75,_,_,_,_,_,_ ), 4 , 29 , 1421 , 86 , 61 ), // #317
+ INST(Jo , X86Jcc , O(000F00,80,_,_,_,_,_,_ ), O(000000,70,_,_,_,_,_,_ ), 4 , 33 , 1425 , 86 , 57 ), // #318
+ INST(Jp , X86Jcc , O(000F00,8A,_,_,_,_,_,_ ), O(000000,7A,_,_,_,_,_,_ ), 4 , 34 , 1428 , 86 , 64 ), // #319
+ INST(Jpe , X86Jcc , O(000F00,8A,_,_,_,_,_,_ ), O(000000,7A,_,_,_,_,_,_ ), 4 , 34 , 1431 , 86 , 64 ), // #320
+ INST(Jpo , X86Jcc , O(000F00,8B,_,_,_,_,_,_ ), O(000000,7B,_,_,_,_,_,_ ), 4 , 31 , 1435 , 86 , 64 ), // #321
+ INST(Js , X86Jcc , O(000F00,88,_,_,_,_,_,_ ), O(000000,78,_,_,_,_,_,_ ), 4 , 35 , 1439 , 86 , 65 ), // #322
+ INST(Jz , X86Jcc , O(000F00,84,_,_,_,_,_,_ ), O(000000,74,_,_,_,_,_,_ ), 4 , 22 , 1442 , 86 , 61 ), // #323
+ INST(Kaddb , VexRvm , V(660F00,4A,_,1,0,_,_,_ ), 0 , 65 , 0 , 1445 , 89 , 66 ), // #324
+ INST(Kaddd , VexRvm , V(660F00,4A,_,1,1,_,_,_ ), 0 , 66 , 0 , 1451 , 89 , 67 ), // #325
+ INST(Kaddq , VexRvm , V(000F00,4A,_,1,1,_,_,_ ), 0 , 67 , 0 , 1457 , 89 , 67 ), // #326
+ INST(Kaddw , VexRvm , V(000F00,4A,_,1,0,_,_,_ ), 0 , 68 , 0 , 1463 , 89 , 66 ), // #327
+ INST(Kandb , VexRvm , V(660F00,41,_,1,0,_,_,_ ), 0 , 65 , 0 , 1469 , 89 , 66 ), // #328
+ INST(Kandd , VexRvm , V(660F00,41,_,1,1,_,_,_ ), 0 , 66 , 0 , 1475 , 89 , 67 ), // #329
+ INST(Kandnb , VexRvm , V(660F00,42,_,1,0,_,_,_ ), 0 , 65 , 0 , 1481 , 89 , 66 ), // #330
+ INST(Kandnd , VexRvm , V(660F00,42,_,1,1,_,_,_ ), 0 , 66 , 0 , 1488 , 89 , 67 ), // #331
+ INST(Kandnq , VexRvm , V(000F00,42,_,1,1,_,_,_ ), 0 , 67 , 0 , 1495 , 89 , 67 ), // #332
+ INST(Kandnw , VexRvm , V(000F00,42,_,1,0,_,_,_ ), 0 , 68 , 0 , 1502 , 89 , 68 ), // #333
+ INST(Kandq , VexRvm , V(000F00,41,_,1,1,_,_,_ ), 0 , 67 , 0 , 1509 , 89 , 67 ), // #334
+ INST(Kandw , VexRvm , V(000F00,41,_,1,0,_,_,_ ), 0 , 68 , 0 , 1515 , 89 , 68 ), // #335
+ INST(Kmovb , VexKmov , V(660F00,90,_,0,0,_,_,_ ), V(660F00,92,_,0,0,_,_,_ ), 69 , 36 , 1521 , 90 , 66 ), // #336
+ INST(Kmovd , VexKmov , V(660F00,90,_,0,1,_,_,_ ), V(F20F00,92,_,0,0,_,_,_ ), 70 , 37 , 9105 , 91 , 67 ), // #337
+ INST(Kmovq , VexKmov , V(000F00,90,_,0,1,_,_,_ ), V(F20F00,92,_,0,1,_,_,_ ), 71 , 38 , 9116 , 92 , 67 ), // #338
+ INST(Kmovw , VexKmov , V(000F00,90,_,0,0,_,_,_ ), V(000F00,92,_,0,0,_,_,_ ), 72 , 39 , 1527 , 93 , 68 ), // #339
+ INST(Knotb , VexRm , V(660F00,44,_,0,0,_,_,_ ), 0 , 69 , 0 , 1533 , 94 , 66 ), // #340
+ INST(Knotd , VexRm , V(660F00,44,_,0,1,_,_,_ ), 0 , 70 , 0 , 1539 , 94 , 67 ), // #341
+ INST(Knotq , VexRm , V(000F00,44,_,0,1,_,_,_ ), 0 , 71 , 0 , 1545 , 94 , 67 ), // #342
+ INST(Knotw , VexRm , V(000F00,44,_,0,0,_,_,_ ), 0 , 72 , 0 , 1551 , 94 , 68 ), // #343
+ INST(Korb , VexRvm , V(660F00,45,_,1,0,_,_,_ ), 0 , 65 , 0 , 1557 , 89 , 66 ), // #344
+ INST(Kord , VexRvm , V(660F00,45,_,1,1,_,_,_ ), 0 , 66 , 0 , 1562 , 89 , 67 ), // #345
+ INST(Korq , VexRvm , V(000F00,45,_,1,1,_,_,_ ), 0 , 67 , 0 , 1567 , 89 , 67 ), // #346
+ INST(Kortestb , VexRm , V(660F00,98,_,0,0,_,_,_ ), 0 , 69 , 0 , 1572 , 94 , 69 ), // #347
+ INST(Kortestd , VexRm , V(660F00,98,_,0,1,_,_,_ ), 0 , 70 , 0 , 1581 , 94 , 70 ), // #348
+ INST(Kortestq , VexRm , V(000F00,98,_,0,1,_,_,_ ), 0 , 71 , 0 , 1590 , 94 , 70 ), // #349
+ INST(Kortestw , VexRm , V(000F00,98,_,0,0,_,_,_ ), 0 , 72 , 0 , 1599 , 94 , 71 ), // #350
+ INST(Korw , VexRvm , V(000F00,45,_,1,0,_,_,_ ), 0 , 68 , 0 , 1608 , 89 , 68 ), // #351
+ INST(Kshiftlb , VexRmi , V(660F3A,32,_,0,0,_,_,_ ), 0 , 73 , 0 , 1613 , 95 , 66 ), // #352
+ INST(Kshiftld , VexRmi , V(660F3A,33,_,0,0,_,_,_ ), 0 , 73 , 0 , 1622 , 95 , 67 ), // #353
+ INST(Kshiftlq , VexRmi , V(660F3A,33,_,0,1,_,_,_ ), 0 , 74 , 0 , 1631 , 95 , 67 ), // #354
+ INST(Kshiftlw , VexRmi , V(660F3A,32,_,0,1,_,_,_ ), 0 , 74 , 0 , 1640 , 95 , 68 ), // #355
+ INST(Kshiftrb , VexRmi , V(660F3A,30,_,0,0,_,_,_ ), 0 , 73 , 0 , 1649 , 95 , 66 ), // #356
+ INST(Kshiftrd , VexRmi , V(660F3A,31,_,0,0,_,_,_ ), 0 , 73 , 0 , 1658 , 95 , 67 ), // #357
+ INST(Kshiftrq , VexRmi , V(660F3A,31,_,0,1,_,_,_ ), 0 , 74 , 0 , 1667 , 95 , 67 ), // #358
+ INST(Kshiftrw , VexRmi , V(660F3A,30,_,0,1,_,_,_ ), 0 , 74 , 0 , 1676 , 95 , 68 ), // #359
+ INST(Ktestb , VexRm , V(660F00,99,_,0,0,_,_,_ ), 0 , 69 , 0 , 1685 , 94 , 69 ), // #360
+ INST(Ktestd , VexRm , V(660F00,99,_,0,1,_,_,_ ), 0 , 70 , 0 , 1692 , 94 , 70 ), // #361
+ INST(Ktestq , VexRm , V(000F00,99,_,0,1,_,_,_ ), 0 , 71 , 0 , 1699 , 94 , 70 ), // #362
+ INST(Ktestw , VexRm , V(000F00,99,_,0,0,_,_,_ ), 0 , 72 , 0 , 1706 , 94 , 69 ), // #363
+ INST(Kunpckbw , VexRvm , V(660F00,4B,_,1,0,_,_,_ ), 0 , 65 , 0 , 1713 , 89 , 68 ), // #364
+ INST(Kunpckdq , VexRvm , V(000F00,4B,_,1,1,_,_,_ ), 0 , 67 , 0 , 1722 , 89 , 67 ), // #365
+ INST(Kunpckwd , VexRvm , V(000F00,4B,_,1,0,_,_,_ ), 0 , 68 , 0 , 1731 , 89 , 67 ), // #366
+ INST(Kxnorb , VexRvm , V(660F00,46,_,1,0,_,_,_ ), 0 , 65 , 0 , 1740 , 96 , 66 ), // #367
+ INST(Kxnord , VexRvm , V(660F00,46,_,1,1,_,_,_ ), 0 , 66 , 0 , 1747 , 96 , 67 ), // #368
+ INST(Kxnorq , VexRvm , V(000F00,46,_,1,1,_,_,_ ), 0 , 67 , 0 , 1754 , 96 , 67 ), // #369
+ INST(Kxnorw , VexRvm , V(000F00,46,_,1,0,_,_,_ ), 0 , 68 , 0 , 1761 , 96 , 68 ), // #370
+ INST(Kxorb , VexRvm , V(660F00,47,_,1,0,_,_,_ ), 0 , 65 , 0 , 1768 , 96 , 66 ), // #371
+ INST(Kxord , VexRvm , V(660F00,47,_,1,1,_,_,_ ), 0 , 66 , 0 , 1774 , 96 , 67 ), // #372
+ INST(Kxorq , VexRvm , V(000F00,47,_,1,1,_,_,_ ), 0 , 67 , 0 , 1780 , 96 , 67 ), // #373
+ INST(Kxorw , VexRvm , V(000F00,47,_,1,0,_,_,_ ), 0 , 68 , 0 , 1786 , 96 , 68 ), // #374
+ INST(Lahf , X86Op , O(000000,9F,_,_,_,_,_,_ ), 0 , 0 , 0 , 1792 , 97 , 72 ), // #375
+ INST(Lar , X86Rm , O(000F00,02,_,_,_,_,_,_ ), 0 , 4 , 0 , 1797 , 98 , 10 ), // #376
+ INST(Lcall , X86LcallLjmp , O(000000,FF,3,_,_,_,_,_ ), O(000000,9A,_,_,_,_,_,_ ), 75 , 40 , 1801 , 99 , 1 ), // #377
+ INST(Lddqu , ExtRm , O(F20F00,F0,_,_,_,_,_,_ ), 0 , 5 , 0 , 7003 , 100, 6 ), // #378
+ INST(Ldmxcsr , X86M_Only , O(000F00,AE,2,_,_,_,_,_ ), 0 , 76 , 0 , 7010 , 101, 5 ), // #379
+ INST(Lds , X86Rm , O(000000,C5,_,_,_,_,_,_ ), 0 , 0 , 0 , 1807 , 102, 0 ), // #380
+ INST(Ldtilecfg , AmxCfg , V(000F38,49,_,0,0,_,_,_ ), 0 , 10 , 0 , 1811 , 103, 73 ), // #381
+ INST(Lea , X86Lea , O(000000,8D,_,_,x,_,_,_ ), 0 , 0 , 0 , 1821 , 104, 0 ), // #382
+ INST(Leave , X86Op , O(000000,C9,_,_,_,_,_,_ ), 0 , 0 , 0 , 1825 , 30 , 0 ), // #383
+ INST(Les , X86Rm , O(000000,C4,_,_,_,_,_,_ ), 0 , 0 , 0 , 1831 , 102, 0 ), // #384
+ INST(Lfence , X86Fence , O(000F00,AE,5,_,_,_,_,_ ), 0 , 77 , 0 , 1835 , 30 , 4 ), // #385
+ INST(Lfs , X86Rm , O(000F00,B4,_,_,_,_,_,_ ), 0 , 4 , 0 , 1842 , 105, 0 ), // #386
+ INST(Lgdt , X86M_Only , O(000F00,01,2,_,_,_,_,_ ), 0 , 76 , 0 , 1846 , 69 , 0 ), // #387
+ INST(Lgs , X86Rm , O(000F00,B5,_,_,_,_,_,_ ), 0 , 4 , 0 , 1851 , 105, 0 ), // #388
+ INST(Lidt , X86M_Only , O(000F00,01,3,_,_,_,_,_ ), 0 , 78 , 0 , 1855 , 69 , 0 ), // #389
+ INST(Ljmp , X86LcallLjmp , O(000000,FF,5,_,_,_,_,_ ), O(000000,EA,_,_,_,_,_,_ ), 62 , 41 , 1860 , 106, 0 ), // #390
+ INST(Lldt , X86M_NoSize , O(000F00,00,2,_,_,_,_,_ ), 0 , 76 , 0 , 1865 , 107, 0 ), // #391
+ INST(Llwpcb , VexR_Wx , V(XOP_M9,12,0,0,x,_,_,_ ), 0 , 79 , 0 , 1870 , 108, 74 ), // #392
+ INST(Lmsw , X86M_NoSize , O(000F00,01,6,_,_,_,_,_ ), 0 , 80 , 0 , 1877 , 107, 0 ), // #393
+ INST(Lods , X86StrRm , O(000000,AC,_,_,_,_,_,_ ), 0 , 0 , 0 , 1882 , 109, 75 ), // #394
+ INST(Loop , X86JecxzLoop , 0 , O(000000,E2,_,_,_,_,_,_ ), 0 , 42 , 1887 , 110, 0 ), // #395
+ INST(Loope , X86JecxzLoop , 0 , O(000000,E1,_,_,_,_,_,_ ), 0 , 43 , 1892 , 110, 61 ), // #396
+ INST(Loopne , X86JecxzLoop , 0 , O(000000,E0,_,_,_,_,_,_ ), 0 , 44 , 1898 , 110, 61 ), // #397
+ INST(Lsl , X86Rm , O(000F00,03,_,_,_,_,_,_ ), 0 , 4 , 0 , 1905 , 111, 10 ), // #398
+ INST(Lss , X86Rm , O(000F00,B2,_,_,_,_,_,_ ), 0 , 4 , 0 , 7556 , 105, 0 ), // #399
+ INST(Ltr , X86M_NoSize , O(000F00,00,3,_,_,_,_,_ ), 0 , 78 , 0 , 1909 , 107, 0 ), // #400
+ INST(Lwpins , VexVmi4_Wx , V(XOP_MA,12,0,0,x,_,_,_ ), 0 , 81 , 0 , 1913 , 112, 74 ), // #401
+ INST(Lwpval , VexVmi4_Wx , V(XOP_MA,12,1,0,x,_,_,_ ), 0 , 82 , 0 , 1920 , 112, 74 ), // #402
+ INST(Lzcnt , X86Rm_Raw66H , O(F30F00,BD,_,_,x,_,_,_ ), 0 , 6 , 0 , 1927 , 22 , 76 ), // #403
+ INST(Maskmovdqu , ExtRm_ZDI , O(660F00,F7,_,_,_,_,_,_ ), 0 , 3 , 0 , 7019 , 113, 4 ), // #404
+ INST(Maskmovq , ExtRm_ZDI , O(000F00,F7,_,_,_,_,_,_ ), 0 , 4 , 0 , 9113 , 114, 77 ), // #405
+ INST(Maxpd , ExtRm , O(660F00,5F,_,_,_,_,_,_ ), 0 , 3 , 0 , 7053 , 5 , 4 ), // #406
+ INST(Maxps , ExtRm , O(000F00,5F,_,_,_,_,_,_ ), 0 , 4 , 0 , 7067 , 5 , 5 ), // #407
+ INST(Maxsd , ExtRm , O(F20F00,5F,_,_,_,_,_,_ ), 0 , 5 , 0 , 9132 , 6 , 4 ), // #408
+ INST(Maxss , ExtRm , O(F30F00,5F,_,_,_,_,_,_ ), 0 , 6 , 0 , 7088 , 7 , 5 ), // #409
+ INST(Mcommit , X86Op , O(F30F01,FA,_,_,_,_,_,_ ), 0 , 25 , 0 , 1933 , 30 , 78 ), // #410
+ INST(Mfence , X86Fence , O(000F00,AE,6,_,_,_,_,_ ), 0 , 80 , 0 , 1941 , 30 , 4 ), // #411
+ INST(Minpd , ExtRm , O(660F00,5D,_,_,_,_,_,_ ), 0 , 3 , 0 , 7117 , 5 , 4 ), // #412
+ INST(Minps , ExtRm , O(000F00,5D,_,_,_,_,_,_ ), 0 , 4 , 0 , 7131 , 5 , 5 ), // #413
+ INST(Minsd , ExtRm , O(F20F00,5D,_,_,_,_,_,_ ), 0 , 5 , 0 , 9196 , 6 , 4 ), // #414
+ INST(Minss , ExtRm , O(F30F00,5D,_,_,_,_,_,_ ), 0 , 6 , 0 , 7152 , 7 , 5 ), // #415
+ INST(Monitor , X86Op , O(000F01,C8,_,_,_,_,_,_ ), 0 , 21 , 0 , 3232 , 115, 79 ), // #416
+ INST(Monitorx , X86Op , O(000F01,FA,_,_,_,_,_,_ ), 0 , 21 , 0 , 1948 , 115, 80 ), // #417
+ INST(Mov , X86Mov , 0 , 0 , 0 , 0 , 138 , 116, 0 ), // #418
+ INST(Movabs , X86Movabs , 0 , 0 , 0 , 0 , 1957 , 117, 0 ), // #419
+ INST(Movapd , ExtMov , O(660F00,28,_,_,_,_,_,_ ), O(660F00,29,_,_,_,_,_,_ ), 3 , 45 , 7183 , 118, 4 ), // #420
+ INST(Movaps , ExtMov , O(000F00,28,_,_,_,_,_,_ ), O(000F00,29,_,_,_,_,_,_ ), 4 , 46 , 7191 , 118, 5 ), // #421
+ INST(Movbe , ExtMovbe , O(000F38,F0,_,_,x,_,_,_ ), O(000F38,F1,_,_,x,_,_,_ ), 83 , 47 , 656 , 119, 81 ), // #422
+ INST(Movd , ExtMovd , O(000F00,6E,_,_,_,_,_,_ ), O(000F00,7E,_,_,_,_,_,_ ), 4 , 48 , 9106 , 120, 82 ), // #423
+ INST(Movddup , ExtMov , O(F20F00,12,_,_,_,_,_,_ ), 0 , 5 , 0 , 7205 , 6 , 6 ), // #424
+ INST(Movdir64b , X86EnqcmdMovdir64b , O(660F38,F8,_,_,_,_,_,_ ), 0 , 2 , 0 , 1964 , 121, 83 ), // #425
+ INST(Movdiri , X86MovntiMovdiri , O(000F38,F9,_,_,_,_,_,_ ), 0 , 83 , 0 , 1974 , 122, 84 ), // #426
+ INST(Movdq2q , ExtMov , O(F20F00,D6,_,_,_,_,_,_ ), 0 , 5 , 0 , 1982 , 123, 4 ), // #427
+ INST(Movdqa , ExtMov , O(660F00,6F,_,_,_,_,_,_ ), O(660F00,7F,_,_,_,_,_,_ ), 3 , 49 , 7214 , 118, 4 ), // #428
+ INST(Movdqu , ExtMov , O(F30F00,6F,_,_,_,_,_,_ ), O(F30F00,7F,_,_,_,_,_,_ ), 6 , 50 , 7023 , 118, 4 ), // #429
+ INST(Movhlps , ExtMov , O(000F00,12,_,_,_,_,_,_ ), 0 , 4 , 0 , 7289 , 124, 5 ), // #430
+ INST(Movhpd , ExtMov , O(660F00,16,_,_,_,_,_,_ ), O(660F00,17,_,_,_,_,_,_ ), 3 , 51 , 7298 , 125, 4 ), // #431
+ INST(Movhps , ExtMov , O(000F00,16,_,_,_,_,_,_ ), O(000F00,17,_,_,_,_,_,_ ), 4 , 52 , 7306 , 125, 5 ), // #432
+ INST(Movlhps , ExtMov , O(000F00,16,_,_,_,_,_,_ ), 0 , 4 , 0 , 7314 , 124, 5 ), // #433
+ INST(Movlpd , ExtMov , O(660F00,12,_,_,_,_,_,_ ), O(660F00,13,_,_,_,_,_,_ ), 3 , 53 , 7323 , 125, 4 ), // #434
+ INST(Movlps , ExtMov , O(000F00,12,_,_,_,_,_,_ ), O(000F00,13,_,_,_,_,_,_ ), 4 , 54 , 7331 , 125, 5 ), // #435
+ INST(Movmskpd , ExtMov , O(660F00,50,_,_,_,_,_,_ ), 0 , 3 , 0 , 7339 , 126, 4 ), // #436
+ INST(Movmskps , ExtMov , O(000F00,50,_,_,_,_,_,_ ), 0 , 4 , 0 , 7349 , 126, 5 ), // #437
+ INST(Movntdq , ExtMov , 0 , O(660F00,E7,_,_,_,_,_,_ ), 0 , 55 , 7359 , 127, 4 ), // #438
+ INST(Movntdqa , ExtMov , O(660F38,2A,_,_,_,_,_,_ ), 0 , 2 , 0 , 7368 , 100, 12 ), // #439
+ INST(Movnti , X86MovntiMovdiri , O(000F00,C3,_,_,x,_,_,_ ), 0 , 4 , 0 , 1990 , 122, 4 ), // #440
+ INST(Movntpd , ExtMov , 0 , O(660F00,2B,_,_,_,_,_,_ ), 0 , 56 , 7378 , 127, 4 ), // #441
+ INST(Movntps , ExtMov , 0 , O(000F00,2B,_,_,_,_,_,_ ), 0 , 57 , 7387 , 127, 5 ), // #442
+ INST(Movntq , ExtMov , 0 , O(000F00,E7,_,_,_,_,_,_ ), 0 , 58 , 1997 , 128, 77 ), // #443
+ INST(Movntsd , ExtMov , 0 , O(F20F00,2B,_,_,_,_,_,_ ), 0 , 59 , 2004 , 129, 49 ), // #444
+ INST(Movntss , ExtMov , 0 , O(F30F00,2B,_,_,_,_,_,_ ), 0 , 60 , 2012 , 130, 49 ), // #445
+ INST(Movq , ExtMovq , O(000F00,6E,_,_,x,_,_,_ ), O(000F00,7E,_,_,x,_,_,_ ), 4 , 48 , 9117 , 131, 82 ), // #446
+ INST(Movq2dq , ExtRm , O(F30F00,D6,_,_,_,_,_,_ ), 0 , 6 , 0 , 2020 , 132, 4 ), // #447
+ INST(Movs , X86StrMm , O(000000,A4,_,_,_,_,_,_ ), 0 , 0 , 0 , 439 , 133, 75 ), // #448
+ INST(Movsd , ExtMov , O(F20F00,10,_,_,_,_,_,_ ), O(F20F00,11,_,_,_,_,_,_ ), 5 , 61 , 7402 , 134, 4 ), // #449
+ INST(Movshdup , ExtRm , O(F30F00,16,_,_,_,_,_,_ ), 0 , 6 , 0 , 7416 , 5 , 6 ), // #450
+ INST(Movsldup , ExtRm , O(F30F00,12,_,_,_,_,_,_ ), 0 , 6 , 0 , 7426 , 5 , 6 ), // #451
+ INST(Movss , ExtMov , O(F30F00,10,_,_,_,_,_,_ ), O(F30F00,11,_,_,_,_,_,_ ), 6 , 62 , 7436 , 135, 5 ), // #452
+ INST(Movsx , X86MovsxMovzx , O(000F00,BE,_,_,x,_,_,_ ), 0 , 4 , 0 , 2028 , 136, 0 ), // #453
+ INST(Movsxd , X86Rm , O(000000,63,_,_,x,_,_,_ ), 0 , 0 , 0 , 2034 , 137, 0 ), // #454
+ INST(Movupd , ExtMov , O(660F00,10,_,_,_,_,_,_ ), O(660F00,11,_,_,_,_,_,_ ), 3 , 63 , 7443 , 118, 4 ), // #455
+ INST(Movups , ExtMov , O(000F00,10,_,_,_,_,_,_ ), O(000F00,11,_,_,_,_,_,_ ), 4 , 64 , 7451 , 118, 5 ), // #456
+ INST(Movzx , X86MovsxMovzx , O(000F00,B6,_,_,x,_,_,_ ), 0 , 4 , 0 , 2041 , 136, 0 ), // #457
+ INST(Mpsadbw , ExtRmi , O(660F3A,42,_,_,_,_,_,_ ), 0 , 8 , 0 , 7465 , 8 , 12 ), // #458
+ INST(Mul , X86M_GPB_MulDiv , O(000000,F6,4,_,x,_,_,_ ), 0 , 9 , 0 , 828 , 54 , 1 ), // #459
+ INST(Mulpd , ExtRm , O(660F00,59,_,_,_,_,_,_ ), 0 , 3 , 0 , 7519 , 5 , 4 ), // #460
+ INST(Mulps , ExtRm , O(000F00,59,_,_,_,_,_,_ ), 0 , 4 , 0 , 7533 , 5 , 5 ), // #461
+ INST(Mulsd , ExtRm , O(F20F00,59,_,_,_,_,_,_ ), 0 , 5 , 0 , 7540 , 6 , 4 ), // #462
+ INST(Mulss , ExtRm , O(F30F00,59,_,_,_,_,_,_ ), 0 , 6 , 0 , 7554 , 7 , 5 ), // #463
+ INST(Mulx , VexRvm_ZDX_Wx , V(F20F38,F6,_,0,x,_,_,_ ), 0 , 84 , 0 , 2047 , 138, 85 ), // #464
+ INST(Mwait , X86Op , O(000F01,C9,_,_,_,_,_,_ ), 0 , 21 , 0 , 3241 , 139, 79 ), // #465
+ INST(Mwaitx , X86Op , O(000F01,FB,_,_,_,_,_,_ ), 0 , 21 , 0 , 2052 , 140, 80 ), // #466
+ INST(Neg , X86M_GPB , O(000000,F6,3,_,x,_,_,_ ), 0 , 75 , 0 , 2059 , 141, 1 ), // #467
+ INST(Nop , X86M_Nop , O(000000,90,_,_,_,_,_,_ ), 0 , 0 , 0 , 959 , 142, 0 ), // #468
+ INST(Not , X86M_GPB , O(000000,F6,2,_,x,_,_,_ ), 0 , 1 , 0 , 2063 , 141, 0 ), // #469
+ INST(Or , X86Arith , O(000000,08,1,_,x,_,_,_ ), 0 , 31 , 0 , 3237 , 143, 1 ), // #470
+ INST(Orpd , ExtRm , O(660F00,56,_,_,_,_,_,_ ), 0 , 3 , 0 , 11458, 11 , 4 ), // #471
+ INST(Orps , ExtRm , O(000F00,56,_,_,_,_,_,_ ), 0 , 4 , 0 , 11465, 11 , 5 ), // #472
+ INST(Out , X86Out , O(000000,EE,_,_,_,_,_,_ ), O(000000,E6,_,_,_,_,_,_ ), 0 , 65 , 2067 , 144, 0 ), // #473
+ INST(Outs , X86Outs , O(000000,6E,_,_,_,_,_,_ ), 0 , 0 , 0 , 2071 , 145, 0 ), // #474
+ INST(Pabsb , ExtRm_P , O(000F38,1C,_,_,_,_,_,_ ), 0 , 83 , 0 , 7636 , 146, 86 ), // #475
+ INST(Pabsd , ExtRm_P , O(000F38,1E,_,_,_,_,_,_ ), 0 , 83 , 0 , 7643 , 146, 86 ), // #476
+ INST(Pabsw , ExtRm_P , O(000F38,1D,_,_,_,_,_,_ ), 0 , 83 , 0 , 7657 , 146, 86 ), // #477
+ INST(Packssdw , ExtRm_P , O(000F00,6B,_,_,_,_,_,_ ), 0 , 4 , 0 , 7664 , 146, 82 ), // #478
+ INST(Packsswb , ExtRm_P , O(000F00,63,_,_,_,_,_,_ ), 0 , 4 , 0 , 7674 , 146, 82 ), // #479
+ INST(Packusdw , ExtRm , O(660F38,2B,_,_,_,_,_,_ ), 0 , 2 , 0 , 7684 , 5 , 12 ), // #480
+ INST(Packuswb , ExtRm_P , O(000F00,67,_,_,_,_,_,_ ), 0 , 4 , 0 , 7694 , 146, 82 ), // #481
+ INST(Paddb , ExtRm_P , O(000F00,FC,_,_,_,_,_,_ ), 0 , 4 , 0 , 7704 , 146, 82 ), // #482
+ INST(Paddd , ExtRm_P , O(000F00,FE,_,_,_,_,_,_ ), 0 , 4 , 0 , 7711 , 146, 82 ), // #483
+ INST(Paddq , ExtRm_P , O(000F00,D4,_,_,_,_,_,_ ), 0 , 4 , 0 , 7718 , 146, 4 ), // #484
+ INST(Paddsb , ExtRm_P , O(000F00,EC,_,_,_,_,_,_ ), 0 , 4 , 0 , 7725 , 146, 82 ), // #485
+ INST(Paddsw , ExtRm_P , O(000F00,ED,_,_,_,_,_,_ ), 0 , 4 , 0 , 7733 , 146, 82 ), // #486
+ INST(Paddusb , ExtRm_P , O(000F00,DC,_,_,_,_,_,_ ), 0 , 4 , 0 , 7741 , 146, 82 ), // #487
+ INST(Paddusw , ExtRm_P , O(000F00,DD,_,_,_,_,_,_ ), 0 , 4 , 0 , 7750 , 146, 82 ), // #488
+ INST(Paddw , ExtRm_P , O(000F00,FD,_,_,_,_,_,_ ), 0 , 4 , 0 , 7759 , 146, 82 ), // #489
+ INST(Palignr , ExtRmi_P , O(000F3A,0F,_,_,_,_,_,_ ), 0 , 85 , 0 , 7766 , 147, 6 ), // #490
+ INST(Pand , ExtRm_P , O(000F00,DB,_,_,_,_,_,_ ), 0 , 4 , 0 , 7775 , 148, 82 ), // #491
+ INST(Pandn , ExtRm_P , O(000F00,DF,_,_,_,_,_,_ ), 0 , 4 , 0 , 7788 , 149, 82 ), // #492
+ INST(Pause , X86Op , O(F30000,90,_,_,_,_,_,_ ), 0 , 86 , 0 , 3195 , 30 , 0 ), // #493
+ INST(Pavgb , ExtRm_P , O(000F00,E0,_,_,_,_,_,_ ), 0 , 4 , 0 , 7818 , 146, 87 ), // #494
+ INST(Pavgusb , Ext3dNow , O(000F0F,BF,_,_,_,_,_,_ ), 0 , 87 , 0 , 2076 , 150, 51 ), // #495
+ INST(Pavgw , ExtRm_P , O(000F00,E3,_,_,_,_,_,_ ), 0 , 4 , 0 , 7825 , 146, 87 ), // #496
+ INST(Pblendvb , ExtRm_XMM0 , O(660F38,10,_,_,_,_,_,_ ), 0 , 2 , 0 , 7881 , 15 , 12 ), // #497
+ INST(Pblendw , ExtRmi , O(660F3A,0E,_,_,_,_,_,_ ), 0 , 8 , 0 , 7891 , 8 , 12 ), // #498
+ INST(Pclmulqdq , ExtRmi , O(660F3A,44,_,_,_,_,_,_ ), 0 , 8 , 0 , 7984 , 8 , 88 ), // #499
+ INST(Pcmpeqb , ExtRm_P , O(000F00,74,_,_,_,_,_,_ ), 0 , 4 , 0 , 8016 , 149, 82 ), // #500
+ INST(Pcmpeqd , ExtRm_P , O(000F00,76,_,_,_,_,_,_ ), 0 , 4 , 0 , 8025 , 149, 82 ), // #501
+ INST(Pcmpeqq , ExtRm , O(660F38,29,_,_,_,_,_,_ ), 0 , 2 , 0 , 8034 , 151, 12 ), // #502
+ INST(Pcmpeqw , ExtRm_P , O(000F00,75,_,_,_,_,_,_ ), 0 , 4 , 0 , 8043 , 149, 82 ), // #503
+ INST(Pcmpestri , ExtRmi , O(660F3A,61,_,_,_,_,_,_ ), 0 , 8 , 0 , 8052 , 152, 89 ), // #504
+ INST(Pcmpestrm , ExtRmi , O(660F3A,60,_,_,_,_,_,_ ), 0 , 8 , 0 , 8063 , 153, 89 ), // #505
+ INST(Pcmpgtb , ExtRm_P , O(000F00,64,_,_,_,_,_,_ ), 0 , 4 , 0 , 8074 , 149, 82 ), // #506
+ INST(Pcmpgtd , ExtRm_P , O(000F00,66,_,_,_,_,_,_ ), 0 , 4 , 0 , 8083 , 149, 82 ), // #507
+ INST(Pcmpgtq , ExtRm , O(660F38,37,_,_,_,_,_,_ ), 0 , 2 , 0 , 8092 , 151, 44 ), // #508
+ INST(Pcmpgtw , ExtRm_P , O(000F00,65,_,_,_,_,_,_ ), 0 , 4 , 0 , 8101 , 149, 82 ), // #509
+ INST(Pcmpistri , ExtRmi , O(660F3A,63,_,_,_,_,_,_ ), 0 , 8 , 0 , 8110 , 154, 89 ), // #510
+ INST(Pcmpistrm , ExtRmi , O(660F3A,62,_,_,_,_,_,_ ), 0 , 8 , 0 , 8121 , 155, 89 ), // #511
+ INST(Pconfig , X86Op , O(000F01,C5,_,_,_,_,_,_ ), 0 , 21 , 0 , 2084 , 30 , 90 ), // #512
+ INST(Pdep , VexRvm_Wx , V(F20F38,F5,_,0,x,_,_,_ ), 0 , 84 , 0 , 2092 , 10 , 85 ), // #513
+ INST(Pext , VexRvm_Wx , V(F30F38,F5,_,0,x,_,_,_ ), 0 , 88 , 0 , 2097 , 10 , 85 ), // #514
+ INST(Pextrb , ExtExtract , O(000F3A,14,_,_,_,_,_,_ ), 0 , 85 , 0 , 8608 , 156, 12 ), // #515
+ INST(Pextrd , ExtExtract , O(000F3A,16,_,_,_,_,_,_ ), 0 , 85 , 0 , 8616 , 58 , 12 ), // #516
+ INST(Pextrq , ExtExtract , O(000F3A,16,_,_,1,_,_,_ ), 0 , 89 , 0 , 8624 , 157, 12 ), // #517
+ INST(Pextrw , ExtPextrw , O(000F00,C5,_,_,_,_,_,_ ), O(000F3A,15,_,_,_,_,_,_ ), 4 , 66 , 8632 , 158, 91 ), // #518
+ INST(Pf2id , Ext3dNow , O(000F0F,1D,_,_,_,_,_,_ ), 0 , 87 , 0 , 2102 , 150, 51 ), // #519
+ INST(Pf2iw , Ext3dNow , O(000F0F,1C,_,_,_,_,_,_ ), 0 , 87 , 0 , 2108 , 150, 92 ), // #520
+ INST(Pfacc , Ext3dNow , O(000F0F,AE,_,_,_,_,_,_ ), 0 , 87 , 0 , 2114 , 150, 51 ), // #521
+ INST(Pfadd , Ext3dNow , O(000F0F,9E,_,_,_,_,_,_ ), 0 , 87 , 0 , 2120 , 150, 51 ), // #522
+ INST(Pfcmpeq , Ext3dNow , O(000F0F,B0,_,_,_,_,_,_ ), 0 , 87 , 0 , 2126 , 150, 51 ), // #523
+ INST(Pfcmpge , Ext3dNow , O(000F0F,90,_,_,_,_,_,_ ), 0 , 87 , 0 , 2134 , 150, 51 ), // #524
+ INST(Pfcmpgt , Ext3dNow , O(000F0F,A0,_,_,_,_,_,_ ), 0 , 87 , 0 , 2142 , 150, 51 ), // #525
+ INST(Pfmax , Ext3dNow , O(000F0F,A4,_,_,_,_,_,_ ), 0 , 87 , 0 , 2150 , 150, 51 ), // #526
+ INST(Pfmin , Ext3dNow , O(000F0F,94,_,_,_,_,_,_ ), 0 , 87 , 0 , 2156 , 150, 51 ), // #527
+ INST(Pfmul , Ext3dNow , O(000F0F,B4,_,_,_,_,_,_ ), 0 , 87 , 0 , 2162 , 150, 51 ), // #528
+ INST(Pfnacc , Ext3dNow , O(000F0F,8A,_,_,_,_,_,_ ), 0 , 87 , 0 , 2168 , 150, 92 ), // #529
+ INST(Pfpnacc , Ext3dNow , O(000F0F,8E,_,_,_,_,_,_ ), 0 , 87 , 0 , 2175 , 150, 92 ), // #530
+ INST(Pfrcp , Ext3dNow , O(000F0F,96,_,_,_,_,_,_ ), 0 , 87 , 0 , 2183 , 150, 51 ), // #531
+ INST(Pfrcpit1 , Ext3dNow , O(000F0F,A6,_,_,_,_,_,_ ), 0 , 87 , 0 , 2189 , 150, 51 ), // #532
+ INST(Pfrcpit2 , Ext3dNow , O(000F0F,B6,_,_,_,_,_,_ ), 0 , 87 , 0 , 2198 , 150, 51 ), // #533
+ INST(Pfrcpv , Ext3dNow , O(000F0F,86,_,_,_,_,_,_ ), 0 , 87 , 0 , 2207 , 150, 93 ), // #534
+ INST(Pfrsqit1 , Ext3dNow , O(000F0F,A7,_,_,_,_,_,_ ), 0 , 87 , 0 , 2214 , 150, 51 ), // #535
+ INST(Pfrsqrt , Ext3dNow , O(000F0F,97,_,_,_,_,_,_ ), 0 , 87 , 0 , 2223 , 150, 51 ), // #536
+ INST(Pfrsqrtv , Ext3dNow , O(000F0F,87,_,_,_,_,_,_ ), 0 , 87 , 0 , 2231 , 150, 93 ), // #537
+ INST(Pfsub , Ext3dNow , O(000F0F,9A,_,_,_,_,_,_ ), 0 , 87 , 0 , 2240 , 150, 51 ), // #538
+ INST(Pfsubr , Ext3dNow , O(000F0F,AA,_,_,_,_,_,_ ), 0 , 87 , 0 , 2246 , 150, 51 ), // #539
+ INST(Phaddd , ExtRm_P , O(000F38,02,_,_,_,_,_,_ ), 0 , 83 , 0 , 8711 , 146, 86 ), // #540
+ INST(Phaddsw , ExtRm_P , O(000F38,03,_,_,_,_,_,_ ), 0 , 83 , 0 , 8728 , 146, 86 ), // #541
+ INST(Phaddw , ExtRm_P , O(000F38,01,_,_,_,_,_,_ ), 0 , 83 , 0 , 8797 , 146, 86 ), // #542
+ INST(Phminposuw , ExtRm , O(660F38,41,_,_,_,_,_,_ ), 0 , 2 , 0 , 8823 , 5 , 12 ), // #543
+ INST(Phsubd , ExtRm_P , O(000F38,06,_,_,_,_,_,_ ), 0 , 83 , 0 , 8844 , 146, 86 ), // #544
+ INST(Phsubsw , ExtRm_P , O(000F38,07,_,_,_,_,_,_ ), 0 , 83 , 0 , 8861 , 146, 86 ), // #545
+ INST(Phsubw , ExtRm_P , O(000F38,05,_,_,_,_,_,_ ), 0 , 83 , 0 , 8870 , 146, 86 ), // #546
+ INST(Pi2fd , Ext3dNow , O(000F0F,0D,_,_,_,_,_,_ ), 0 , 87 , 0 , 2253 , 150, 51 ), // #547
+ INST(Pi2fw , Ext3dNow , O(000F0F,0C,_,_,_,_,_,_ ), 0 , 87 , 0 , 2259 , 150, 92 ), // #548
+ INST(Pinsrb , ExtRmi , O(660F3A,20,_,_,_,_,_,_ ), 0 , 8 , 0 , 8887 , 159, 12 ), // #549
+ INST(Pinsrd , ExtRmi , O(660F3A,22,_,_,_,_,_,_ ), 0 , 8 , 0 , 8895 , 160, 12 ), // #550
+ INST(Pinsrq , ExtRmi , O(660F3A,22,_,_,1,_,_,_ ), 0 , 90 , 0 , 8903 , 161, 12 ), // #551
+ INST(Pinsrw , ExtRmi_P , O(000F00,C4,_,_,_,_,_,_ ), 0 , 4 , 0 , 8911 , 162, 87 ), // #552
+ INST(Pmaddubsw , ExtRm_P , O(000F38,04,_,_,_,_,_,_ ), 0 , 83 , 0 , 9081 , 146, 86 ), // #553
+ INST(Pmaddwd , ExtRm_P , O(000F00,F5,_,_,_,_,_,_ ), 0 , 4 , 0 , 9092 , 146, 82 ), // #554
+ INST(Pmaxsb , ExtRm , O(660F38,3C,_,_,_,_,_,_ ), 0 , 2 , 0 , 9123 , 11 , 12 ), // #555
+ INST(Pmaxsd , ExtRm , O(660F38,3D,_,_,_,_,_,_ ), 0 , 2 , 0 , 9131 , 11 , 12 ), // #556
+ INST(Pmaxsw , ExtRm_P , O(000F00,EE,_,_,_,_,_,_ ), 0 , 4 , 0 , 9147 , 148, 87 ), // #557
+ INST(Pmaxub , ExtRm_P , O(000F00,DE,_,_,_,_,_,_ ), 0 , 4 , 0 , 9155 , 148, 87 ), // #558
+ INST(Pmaxud , ExtRm , O(660F38,3F,_,_,_,_,_,_ ), 0 , 2 , 0 , 9163 , 11 , 12 ), // #559
+ INST(Pmaxuw , ExtRm , O(660F38,3E,_,_,_,_,_,_ ), 0 , 2 , 0 , 9179 , 11 , 12 ), // #560
+ INST(Pminsb , ExtRm , O(660F38,38,_,_,_,_,_,_ ), 0 , 2 , 0 , 9187 , 11 , 12 ), // #561
+ INST(Pminsd , ExtRm , O(660F38,39,_,_,_,_,_,_ ), 0 , 2 , 0 , 9195 , 11 , 12 ), // #562
+ INST(Pminsw , ExtRm_P , O(000F00,EA,_,_,_,_,_,_ ), 0 , 4 , 0 , 9211 , 148, 87 ), // #563
+ INST(Pminub , ExtRm_P , O(000F00,DA,_,_,_,_,_,_ ), 0 , 4 , 0 , 9219 , 148, 87 ), // #564
+ INST(Pminud , ExtRm , O(660F38,3B,_,_,_,_,_,_ ), 0 , 2 , 0 , 9227 , 11 , 12 ), // #565
+ INST(Pminuw , ExtRm , O(660F38,3A,_,_,_,_,_,_ ), 0 , 2 , 0 , 9243 , 11 , 12 ), // #566
+ INST(Pmovmskb , ExtRm_P , O(000F00,D7,_,_,_,_,_,_ ), 0 , 4 , 0 , 9321 , 163, 87 ), // #567
+ INST(Pmovsxbd , ExtRm , O(660F38,21,_,_,_,_,_,_ ), 0 , 2 , 0 , 9418 , 7 , 12 ), // #568
+ INST(Pmovsxbq , ExtRm , O(660F38,22,_,_,_,_,_,_ ), 0 , 2 , 0 , 9428 , 164, 12 ), // #569
+ INST(Pmovsxbw , ExtRm , O(660F38,20,_,_,_,_,_,_ ), 0 , 2 , 0 , 9438 , 6 , 12 ), // #570
+ INST(Pmovsxdq , ExtRm , O(660F38,25,_,_,_,_,_,_ ), 0 , 2 , 0 , 9448 , 6 , 12 ), // #571
+ INST(Pmovsxwd , ExtRm , O(660F38,23,_,_,_,_,_,_ ), 0 , 2 , 0 , 9458 , 6 , 12 ), // #572
+ INST(Pmovsxwq , ExtRm , O(660F38,24,_,_,_,_,_,_ ), 0 , 2 , 0 , 9468 , 7 , 12 ), // #573
+ INST(Pmovzxbd , ExtRm , O(660F38,31,_,_,_,_,_,_ ), 0 , 2 , 0 , 9555 , 7 , 12 ), // #574
+ INST(Pmovzxbq , ExtRm , O(660F38,32,_,_,_,_,_,_ ), 0 , 2 , 0 , 9565 , 164, 12 ), // #575
+ INST(Pmovzxbw , ExtRm , O(660F38,30,_,_,_,_,_,_ ), 0 , 2 , 0 , 9575 , 6 , 12 ), // #576
+ INST(Pmovzxdq , ExtRm , O(660F38,35,_,_,_,_,_,_ ), 0 , 2 , 0 , 9585 , 6 , 12 ), // #577
+ INST(Pmovzxwd , ExtRm , O(660F38,33,_,_,_,_,_,_ ), 0 , 2 , 0 , 9595 , 6 , 12 ), // #578
+ INST(Pmovzxwq , ExtRm , O(660F38,34,_,_,_,_,_,_ ), 0 , 2 , 0 , 9605 , 7 , 12 ), // #579
+ INST(Pmuldq , ExtRm , O(660F38,28,_,_,_,_,_,_ ), 0 , 2 , 0 , 9615 , 5 , 12 ), // #580
+ INST(Pmulhrsw , ExtRm_P , O(000F38,0B,_,_,_,_,_,_ ), 0 , 83 , 0 , 9623 , 146, 86 ), // #581
+ INST(Pmulhrw , Ext3dNow , O(000F0F,B7,_,_,_,_,_,_ ), 0 , 87 , 0 , 2265 , 150, 51 ), // #582
+ INST(Pmulhuw , ExtRm_P , O(000F00,E4,_,_,_,_,_,_ ), 0 , 4 , 0 , 9633 , 146, 87 ), // #583
+ INST(Pmulhw , ExtRm_P , O(000F00,E5,_,_,_,_,_,_ ), 0 , 4 , 0 , 9642 , 146, 82 ), // #584
+ INST(Pmulld , ExtRm , O(660F38,40,_,_,_,_,_,_ ), 0 , 2 , 0 , 9650 , 5 , 12 ), // #585
+ INST(Pmullw , ExtRm_P , O(000F00,D5,_,_,_,_,_,_ ), 0 , 4 , 0 , 9666 , 146, 82 ), // #586
+ INST(Pmuludq , ExtRm_P , O(000F00,F4,_,_,_,_,_,_ ), 0 , 4 , 0 , 9689 , 146, 4 ), // #587
+ INST(Pop , X86Pop , O(000000,8F,0,_,_,_,_,_ ), O(000000,58,_,_,_,_,_,_ ), 0 , 67 , 2273 , 165, 0 ), // #588
+ INST(Popa , X86Op , O(660000,61,_,_,_,_,_,_ ), 0 , 19 , 0 , 2277 , 81 , 0 ), // #589
+ INST(Popad , X86Op , O(000000,61,_,_,_,_,_,_ ), 0 , 0 , 0 , 2282 , 81 , 0 ), // #590
+ INST(Popcnt , X86Rm_Raw66H , O(F30F00,B8,_,_,x,_,_,_ ), 0 , 6 , 0 , 2288 , 22 , 94 ), // #591
+ INST(Popf , X86Op , O(660000,9D,_,_,_,_,_,_ ), 0 , 19 , 0 , 2295 , 30 , 95 ), // #592
+ INST(Popfd , X86Op , O(000000,9D,_,_,_,_,_,_ ), 0 , 0 , 0 , 2300 , 81 , 95 ), // #593
+ INST(Popfq , X86Op , O(000000,9D,_,_,_,_,_,_ ), 0 , 0 , 0 , 2306 , 33 , 95 ), // #594
+ INST(Por , ExtRm_P , O(000F00,EB,_,_,_,_,_,_ ), 0 , 4 , 0 , 9734 , 148, 82 ), // #595
+ INST(Prefetch , X86M_Only , O(000F00,0D,0,_,_,_,_,_ ), 0 , 4 , 0 , 2312 , 31 , 51 ), // #596
+ INST(Prefetchnta , X86M_Only , O(000F00,18,0,_,_,_,_,_ ), 0 , 4 , 0 , 2321 , 31 , 77 ), // #597
+ INST(Prefetcht0 , X86M_Only , O(000F00,18,1,_,_,_,_,_ ), 0 , 29 , 0 , 2333 , 31 , 77 ), // #598
+ INST(Prefetcht1 , X86M_Only , O(000F00,18,2,_,_,_,_,_ ), 0 , 76 , 0 , 2344 , 31 , 77 ), // #599
+ INST(Prefetcht2 , X86M_Only , O(000F00,18,3,_,_,_,_,_ ), 0 , 78 , 0 , 2355 , 31 , 77 ), // #600
+ INST(Prefetchw , X86M_Only , O(000F00,0D,1,_,_,_,_,_ ), 0 , 29 , 0 , 2366 , 31 , 96 ), // #601
+ INST(Prefetchwt1 , X86M_Only , O(000F00,0D,2,_,_,_,_,_ ), 0 , 76 , 0 , 2376 , 31 , 97 ), // #602
+ INST(Psadbw , ExtRm_P , O(000F00,F6,_,_,_,_,_,_ ), 0 , 4 , 0 , 4644 , 146, 87 ), // #603
+ INST(Pshufb , ExtRm_P , O(000F38,00,_,_,_,_,_,_ ), 0 , 83 , 0 , 10060, 146, 86 ), // #604
+ INST(Pshufd , ExtRmi , O(660F00,70,_,_,_,_,_,_ ), 0 , 3 , 0 , 10081, 8 , 4 ), // #605
+ INST(Pshufhw , ExtRmi , O(F30F00,70,_,_,_,_,_,_ ), 0 , 6 , 0 , 10089, 8 , 4 ), // #606
+ INST(Pshuflw , ExtRmi , O(F20F00,70,_,_,_,_,_,_ ), 0 , 5 , 0 , 10098, 8 , 4 ), // #607
+ INST(Pshufw , ExtRmi_P , O(000F00,70,_,_,_,_,_,_ ), 0 , 4 , 0 , 2388 , 166, 77 ), // #608
+ INST(Psignb , ExtRm_P , O(000F38,08,_,_,_,_,_,_ ), 0 , 83 , 0 , 10107, 146, 86 ), // #609
+ INST(Psignd , ExtRm_P , O(000F38,0A,_,_,_,_,_,_ ), 0 , 83 , 0 , 10115, 146, 86 ), // #610
+ INST(Psignw , ExtRm_P , O(000F38,09,_,_,_,_,_,_ ), 0 , 83 , 0 , 10123, 146, 86 ), // #611
+ INST(Pslld , ExtRmRi_P , O(000F00,F2,_,_,_,_,_,_ ), O(000F00,72,6,_,_,_,_,_ ), 4 , 68 , 10131, 167, 82 ), // #612
+ INST(Pslldq , ExtRmRi , 0 , O(660F00,73,7,_,_,_,_,_ ), 0 , 69 , 10138, 168, 4 ), // #613
+ INST(Psllq , ExtRmRi_P , O(000F00,F3,_,_,_,_,_,_ ), O(000F00,73,6,_,_,_,_,_ ), 4 , 70 , 10146, 167, 82 ), // #614
+ INST(Psllw , ExtRmRi_P , O(000F00,F1,_,_,_,_,_,_ ), O(000F00,71,6,_,_,_,_,_ ), 4 , 71 , 10177, 167, 82 ), // #615
+ INST(Psmash , X86Op , O(F30F01,FF,_,_,_,_,_,_ ), 0 , 25 , 0 , 2395 , 33 , 98 ), // #616
+ INST(Psrad , ExtRmRi_P , O(000F00,E2,_,_,_,_,_,_ ), O(000F00,72,4,_,_,_,_,_ ), 4 , 72 , 10184, 167, 82 ), // #617
+ INST(Psraw , ExtRmRi_P , O(000F00,E1,_,_,_,_,_,_ ), O(000F00,71,4,_,_,_,_,_ ), 4 , 73 , 10222, 167, 82 ), // #618
+ INST(Psrld , ExtRmRi_P , O(000F00,D2,_,_,_,_,_,_ ), O(000F00,72,2,_,_,_,_,_ ), 4 , 74 , 10229, 167, 82 ), // #619
+ INST(Psrldq , ExtRmRi , 0 , O(660F00,73,3,_,_,_,_,_ ), 0 , 75 , 10236, 168, 4 ), // #620
+ INST(Psrlq , ExtRmRi_P , O(000F00,D3,_,_,_,_,_,_ ), O(000F00,73,2,_,_,_,_,_ ), 4 , 76 , 10244, 167, 82 ), // #621
+ INST(Psrlw , ExtRmRi_P , O(000F00,D1,_,_,_,_,_,_ ), O(000F00,71,2,_,_,_,_,_ ), 4 , 77 , 10275, 167, 82 ), // #622
+ INST(Psubb , ExtRm_P , O(000F00,F8,_,_,_,_,_,_ ), 0 , 4 , 0 , 10282, 149, 82 ), // #623
+ INST(Psubd , ExtRm_P , O(000F00,FA,_,_,_,_,_,_ ), 0 , 4 , 0 , 10289, 149, 82 ), // #624
+ INST(Psubq , ExtRm_P , O(000F00,FB,_,_,_,_,_,_ ), 0 , 4 , 0 , 10296, 149, 4 ), // #625
+ INST(Psubsb , ExtRm_P , O(000F00,E8,_,_,_,_,_,_ ), 0 , 4 , 0 , 10303, 149, 82 ), // #626
+ INST(Psubsw , ExtRm_P , O(000F00,E9,_,_,_,_,_,_ ), 0 , 4 , 0 , 10311, 149, 82 ), // #627
+ INST(Psubusb , ExtRm_P , O(000F00,D8,_,_,_,_,_,_ ), 0 , 4 , 0 , 10319, 149, 82 ), // #628
+ INST(Psubusw , ExtRm_P , O(000F00,D9,_,_,_,_,_,_ ), 0 , 4 , 0 , 10328, 149, 82 ), // #629
+ INST(Psubw , ExtRm_P , O(000F00,F9,_,_,_,_,_,_ ), 0 , 4 , 0 , 10337, 149, 82 ), // #630
+ INST(Pswapd , Ext3dNow , O(000F0F,BB,_,_,_,_,_,_ ), 0 , 87 , 0 , 2402 , 150, 92 ), // #631
+ INST(Ptest , ExtRm , O(660F38,17,_,_,_,_,_,_ ), 0 , 2 , 0 , 10366, 5 , 99 ), // #632
+ INST(Ptwrite , X86M , O(F30F00,AE,4,_,_,_,_,_ ), 0 , 91 , 0 , 2409 , 169, 100), // #633
+ INST(Punpckhbw , ExtRm_P , O(000F00,68,_,_,_,_,_,_ ), 0 , 4 , 0 , 10449, 146, 82 ), // #634
+ INST(Punpckhdq , ExtRm_P , O(000F00,6A,_,_,_,_,_,_ ), 0 , 4 , 0 , 10460, 146, 82 ), // #635
+ INST(Punpckhqdq , ExtRm , O(660F00,6D,_,_,_,_,_,_ ), 0 , 3 , 0 , 10471, 5 , 4 ), // #636
+ INST(Punpckhwd , ExtRm_P , O(000F00,69,_,_,_,_,_,_ ), 0 , 4 , 0 , 10483, 146, 82 ), // #637
+ INST(Punpcklbw , ExtRm_P , O(000F00,60,_,_,_,_,_,_ ), 0 , 4 , 0 , 10494, 170, 82 ), // #638
+ INST(Punpckldq , ExtRm_P , O(000F00,62,_,_,_,_,_,_ ), 0 , 4 , 0 , 10505, 170, 82 ), // #639
+ INST(Punpcklqdq , ExtRm , O(660F00,6C,_,_,_,_,_,_ ), 0 , 3 , 0 , 10516, 5 , 4 ), // #640
+ INST(Punpcklwd , ExtRm_P , O(000F00,61,_,_,_,_,_,_ ), 0 , 4 , 0 , 10528, 170, 82 ), // #641
+ INST(Push , X86Push , O(000000,FF,6,_,_,_,_,_ ), O(000000,50,_,_,_,_,_,_ ), 32 , 78 , 2417 , 171, 0 ), // #642
+ INST(Pusha , X86Op , O(660000,60,_,_,_,_,_,_ ), 0 , 19 , 0 , 2422 , 81 , 0 ), // #643
+ INST(Pushad , X86Op , O(000000,60,_,_,_,_,_,_ ), 0 , 0 , 0 , 2428 , 81 , 0 ), // #644
+ INST(Pushf , X86Op , O(660000,9C,_,_,_,_,_,_ ), 0 , 19 , 0 , 2435 , 30 , 101), // #645
+ INST(Pushfd , X86Op , O(000000,9C,_,_,_,_,_,_ ), 0 , 0 , 0 , 2441 , 81 , 101), // #646
+ INST(Pushfq , X86Op , O(000000,9C,_,_,_,_,_,_ ), 0 , 0 , 0 , 2448 , 33 , 101), // #647
+ INST(Pvalidate , X86Op , O(F20F01,FF,_,_,_,_,_,_ ), 0 , 92 , 0 , 2455 , 30 , 102), // #648
+ INST(Pxor , ExtRm_P , O(000F00,EF,_,_,_,_,_,_ ), 0 , 4 , 0 , 10539, 149, 82 ), // #649
+ INST(Rcl , X86Rot , O(000000,D0,2,_,x,_,_,_ ), 0 , 1 , 0 , 2465 , 172, 103), // #650
+ INST(Rcpps , ExtRm , O(000F00,53,_,_,_,_,_,_ ), 0 , 4 , 0 , 10674, 5 , 5 ), // #651
+ INST(Rcpss , ExtRm , O(F30F00,53,_,_,_,_,_,_ ), 0 , 6 , 0 , 10688, 7 , 5 ), // #652
+ INST(Rcr , X86Rot , O(000000,D0,3,_,x,_,_,_ ), 0 , 75 , 0 , 2469 , 172, 103), // #653
+ INST(Rdfsbase , X86M , O(F30F00,AE,0,_,x,_,_,_ ), 0 , 6 , 0 , 2473 , 173, 104), // #654
+ INST(Rdgsbase , X86M , O(F30F00,AE,1,_,x,_,_,_ ), 0 , 93 , 0 , 2482 , 173, 104), // #655
+ INST(Rdmsr , X86Op , O(000F00,32,_,_,_,_,_,_ ), 0 , 4 , 0 , 2491 , 174, 105), // #656
+ INST(Rdpid , X86R_Native , O(F30F00,C7,7,_,_,_,_,_ ), 0 , 94 , 0 , 2497 , 175, 106), // #657
+ INST(Rdpkru , X86Op , O(000F01,EE,_,_,_,_,_,_ ), 0 , 21 , 0 , 2503 , 174, 107), // #658
+ INST(Rdpmc , X86Op , O(000F00,33,_,_,_,_,_,_ ), 0 , 4 , 0 , 2510 , 174, 0 ), // #659
+ INST(Rdpru , X86Op , O(000F01,FD,_,_,_,_,_,_ ), 0 , 21 , 0 , 2516 , 174, 108), // #660
+ INST(Rdrand , X86M , O(000F00,C7,6,_,x,_,_,_ ), 0 , 80 , 0 , 2522 , 23 , 109), // #661
+ INST(Rdseed , X86M , O(000F00,C7,7,_,x,_,_,_ ), 0 , 22 , 0 , 2529 , 23 , 110), // #662
+ INST(Rdsspd , X86M , O(F30F00,1E,1,_,_,_,_,_ ), 0 , 93 , 0 , 2536 , 76 , 56 ), // #663
+ INST(Rdsspq , X86M , O(F30F00,1E,1,_,_,_,_,_ ), 0 , 93 , 0 , 2543 , 77 , 56 ), // #664
+ INST(Rdtsc , X86Op , O(000F00,31,_,_,_,_,_,_ ), 0 , 4 , 0 , 2550 , 28 , 111), // #665
+ INST(Rdtscp , X86Op , O(000F01,F9,_,_,_,_,_,_ ), 0 , 21 , 0 , 2556 , 174, 112), // #666
+ INST(Ret , X86Ret , O(000000,C2,_,_,_,_,_,_ ), 0 , 0 , 0 , 3072 , 176, 0 ), // #667
+ INST(Retf , X86Ret , O(000000,CA,_,_,x,_,_,_ ), 0 , 0 , 0 , 2563 , 177, 0 ), // #668
+ INST(Rmpadjust , X86Op , O(F30F01,FE,_,_,_,_,_,_ ), 0 , 25 , 0 , 2568 , 33 , 98 ), // #669
+ INST(Rmpupdate , X86Op , O(F20F01,FE,_,_,_,_,_,_ ), 0 , 92 , 0 , 2578 , 33 , 98 ), // #670
+ INST(Rol , X86Rot , O(000000,D0,0,_,x,_,_,_ ), 0 , 0 , 0 , 2588 , 172, 113), // #671
+ INST(Ror , X86Rot , O(000000,D0,1,_,x,_,_,_ ), 0 , 31 , 0 , 2592 , 172, 113), // #672
+ INST(Rorx , VexRmi_Wx , V(F20F3A,F0,_,0,x,_,_,_ ), 0 , 95 , 0 , 2596 , 178, 85 ), // #673
+ INST(Roundpd , ExtRmi , O(660F3A,09,_,_,_,_,_,_ ), 0 , 8 , 0 , 10827, 8 , 12 ), // #674
+ INST(Roundps , ExtRmi , O(660F3A,08,_,_,_,_,_,_ ), 0 , 8 , 0 , 10836, 8 , 12 ), // #675
+ INST(Roundsd , ExtRmi , O(660F3A,0B,_,_,_,_,_,_ ), 0 , 8 , 0 , 10845, 37 , 12 ), // #676
+ INST(Roundss , ExtRmi , O(660F3A,0A,_,_,_,_,_,_ ), 0 , 8 , 0 , 10854, 38 , 12 ), // #677
+ INST(Rsm , X86Op , O(000F00,AA,_,_,_,_,_,_ ), 0 , 4 , 0 , 2601 , 81 , 1 ), // #678
+ INST(Rsqrtps , ExtRm , O(000F00,52,_,_,_,_,_,_ ), 0 , 4 , 0 , 10960, 5 , 5 ), // #679
+ INST(Rsqrtss , ExtRm , O(F30F00,52,_,_,_,_,_,_ ), 0 , 6 , 0 , 10978, 7 , 5 ), // #680
+ INST(Rstorssp , X86M_Only , O(F30F00,01,5,_,_,_,_,_ ), 0 , 63 , 0 , 2605 , 32 , 24 ), // #681
+ INST(Sahf , X86Op , O(000000,9E,_,_,_,_,_,_ ), 0 , 0 , 0 , 2614 , 97 , 114), // #682
+ INST(Sal , X86Rot , O(000000,D0,4,_,x,_,_,_ ), 0 , 9 , 0 , 2619 , 172, 1 ), // #683
+ INST(Sar , X86Rot , O(000000,D0,7,_,x,_,_,_ ), 0 , 27 , 0 , 2623 , 172, 1 ), // #684
+ INST(Sarx , VexRmv_Wx , V(F30F38,F7,_,0,x,_,_,_ ), 0 , 88 , 0 , 2627 , 13 , 85 ), // #685
+ INST(Saveprevssp , X86Op , O(F30F01,EA,_,_,_,_,_,_ ), 0 , 25 , 0 , 2632 , 30 , 24 ), // #686
+ INST(Sbb , X86Arith , O(000000,18,3,_,x,_,_,_ ), 0 , 75 , 0 , 2644 , 179, 2 ), // #687
+ INST(Scas , X86StrRm , O(000000,AE,_,_,_,_,_,_ ), 0 , 0 , 0 , 2648 , 180, 37 ), // #688
+ INST(Senduipi , X86M_NoSize , O(F30F00,C7,6,_,_,_,_,_ ), 0 , 24 , 0 , 2653 , 77 , 25 ), // #689
+ INST(Serialize , X86Op , O(000F01,E8,_,_,_,_,_,_ ), 0 , 21 , 0 , 2662 , 30 , 115), // #690
+ INST(Seta , X86Set , O(000F00,97,_,_,_,_,_,_ ), 0 , 4 , 0 , 2672 , 181, 59 ), // #691
+ INST(Setae , X86Set , O(000F00,93,_,_,_,_,_,_ ), 0 , 4 , 0 , 2677 , 181, 60 ), // #692
+ INST(Setb , X86Set , O(000F00,92,_,_,_,_,_,_ ), 0 , 4 , 0 , 2683 , 181, 60 ), // #693
+ INST(Setbe , X86Set , O(000F00,96,_,_,_,_,_,_ ), 0 , 4 , 0 , 2688 , 181, 59 ), // #694
+ INST(Setc , X86Set , O(000F00,92,_,_,_,_,_,_ ), 0 , 4 , 0 , 2694 , 181, 60 ), // #695
+ INST(Sete , X86Set , O(000F00,94,_,_,_,_,_,_ ), 0 , 4 , 0 , 2699 , 181, 61 ), // #696
+ INST(Setg , X86Set , O(000F00,9F,_,_,_,_,_,_ ), 0 , 4 , 0 , 2704 , 181, 62 ), // #697
+ INST(Setge , X86Set , O(000F00,9D,_,_,_,_,_,_ ), 0 , 4 , 0 , 2709 , 181, 63 ), // #698
+ INST(Setl , X86Set , O(000F00,9C,_,_,_,_,_,_ ), 0 , 4 , 0 , 2715 , 181, 63 ), // #699
+ INST(Setle , X86Set , O(000F00,9E,_,_,_,_,_,_ ), 0 , 4 , 0 , 2720 , 181, 62 ), // #700
+ INST(Setna , X86Set , O(000F00,96,_,_,_,_,_,_ ), 0 , 4 , 0 , 2726 , 181, 59 ), // #701
+ INST(Setnae , X86Set , O(000F00,92,_,_,_,_,_,_ ), 0 , 4 , 0 , 2732 , 181, 60 ), // #702
+ INST(Setnb , X86Set , O(000F00,93,_,_,_,_,_,_ ), 0 , 4 , 0 , 2739 , 181, 60 ), // #703
+ INST(Setnbe , X86Set , O(000F00,97,_,_,_,_,_,_ ), 0 , 4 , 0 , 2745 , 181, 59 ), // #704
+ INST(Setnc , X86Set , O(000F00,93,_,_,_,_,_,_ ), 0 , 4 , 0 , 2752 , 181, 60 ), // #705
+ INST(Setne , X86Set , O(000F00,95,_,_,_,_,_,_ ), 0 , 4 , 0 , 2758 , 181, 61 ), // #706
+ INST(Setng , X86Set , O(000F00,9E,_,_,_,_,_,_ ), 0 , 4 , 0 , 2764 , 181, 62 ), // #707
+ INST(Setnge , X86Set , O(000F00,9C,_,_,_,_,_,_ ), 0 , 4 , 0 , 2770 , 181, 63 ), // #708
+ INST(Setnl , X86Set , O(000F00,9D,_,_,_,_,_,_ ), 0 , 4 , 0 , 2777 , 181, 63 ), // #709
+ INST(Setnle , X86Set , O(000F00,9F,_,_,_,_,_,_ ), 0 , 4 , 0 , 2783 , 181, 62 ), // #710
+ INST(Setno , X86Set , O(000F00,91,_,_,_,_,_,_ ), 0 , 4 , 0 , 2790 , 181, 57 ), // #711
+ INST(Setnp , X86Set , O(000F00,9B,_,_,_,_,_,_ ), 0 , 4 , 0 , 2796 , 181, 64 ), // #712
+ INST(Setns , X86Set , O(000F00,99,_,_,_,_,_,_ ), 0 , 4 , 0 , 2802 , 181, 65 ), // #713
+ INST(Setnz , X86Set , O(000F00,95,_,_,_,_,_,_ ), 0 , 4 , 0 , 2808 , 181, 61 ), // #714
+ INST(Seto , X86Set , O(000F00,90,_,_,_,_,_,_ ), 0 , 4 , 0 , 2814 , 181, 57 ), // #715
+ INST(Setp , X86Set , O(000F00,9A,_,_,_,_,_,_ ), 0 , 4 , 0 , 2819 , 181, 64 ), // #716
+ INST(Setpe , X86Set , O(000F00,9A,_,_,_,_,_,_ ), 0 , 4 , 0 , 2824 , 181, 64 ), // #717
+ INST(Setpo , X86Set , O(000F00,9B,_,_,_,_,_,_ ), 0 , 4 , 0 , 2830 , 181, 64 ), // #718
+ INST(Sets , X86Set , O(000F00,98,_,_,_,_,_,_ ), 0 , 4 , 0 , 2836 , 181, 65 ), // #719
+ INST(Setssbsy , X86Op , O(F30F01,E8,_,_,_,_,_,_ ), 0 , 25 , 0 , 2841 , 30 , 56 ), // #720
+ INST(Setz , X86Set , O(000F00,94,_,_,_,_,_,_ ), 0 , 4 , 0 , 2850 , 181, 61 ), // #721
+ INST(Sfence , X86Fence , O(000F00,AE,7,_,_,_,_,_ ), 0 , 22 , 0 , 2855 , 30 , 77 ), // #722
+ INST(Sgdt , X86M_Only , O(000F00,01,0,_,_,_,_,_ ), 0 , 4 , 0 , 2862 , 69 , 0 ), // #723
+ INST(Sha1msg1 , ExtRm , O(000F38,C9,_,_,_,_,_,_ ), 0 , 83 , 0 , 2867 , 5 , 116), // #724
+ INST(Sha1msg2 , ExtRm , O(000F38,CA,_,_,_,_,_,_ ), 0 , 83 , 0 , 2876 , 5 , 116), // #725
+ INST(Sha1nexte , ExtRm , O(000F38,C8,_,_,_,_,_,_ ), 0 , 83 , 0 , 2885 , 5 , 116), // #726
+ INST(Sha1rnds4 , ExtRmi , O(000F3A,CC,_,_,_,_,_,_ ), 0 , 85 , 0 , 2895 , 8 , 116), // #727
+ INST(Sha256msg1 , ExtRm , O(000F38,CC,_,_,_,_,_,_ ), 0 , 83 , 0 , 2905 , 5 , 116), // #728
+ INST(Sha256msg2 , ExtRm , O(000F38,CD,_,_,_,_,_,_ ), 0 , 83 , 0 , 2916 , 5 , 116), // #729
+ INST(Sha256rnds2 , ExtRm_XMM0 , O(000F38,CB,_,_,_,_,_,_ ), 0 , 83 , 0 , 2927 , 15 , 116), // #730
+ INST(Shl , X86Rot , O(000000,D0,4,_,x,_,_,_ ), 0 , 9 , 0 , 2939 , 172, 1 ), // #731
+ INST(Shld , X86ShldShrd , O(000F00,A4,_,_,x,_,_,_ ), 0 , 4 , 0 , 9938 , 182, 1 ), // #732
+ INST(Shlx , VexRmv_Wx , V(660F38,F7,_,0,x,_,_,_ ), 0 , 96 , 0 , 2943 , 13 , 85 ), // #733
+ INST(Shr , X86Rot , O(000000,D0,5,_,x,_,_,_ ), 0 , 62 , 0 , 2948 , 172, 1 ), // #734
+ INST(Shrd , X86ShldShrd , O(000F00,AC,_,_,x,_,_,_ ), 0 , 4 , 0 , 2952 , 182, 1 ), // #735
+ INST(Shrx , VexRmv_Wx , V(F20F38,F7,_,0,x,_,_,_ ), 0 , 84 , 0 , 2957 , 13 , 85 ), // #736
+ INST(Shufpd , ExtRmi , O(660F00,C6,_,_,_,_,_,_ ), 0 , 3 , 0 , 11259, 8 , 4 ), // #737
+ INST(Shufps , ExtRmi , O(000F00,C6,_,_,_,_,_,_ ), 0 , 4 , 0 , 11267, 8 , 5 ), // #738
+ INST(Sidt , X86M_Only , O(000F00,01,1,_,_,_,_,_ ), 0 , 29 , 0 , 2962 , 69 , 0 ), // #739
+ INST(Skinit , X86Op_xAX , O(000F01,DE,_,_,_,_,_,_ ), 0 , 21 , 0 , 2967 , 52 , 117), // #740
+ INST(Sldt , X86M_NoMemSize , O(000F00,00,0,_,_,_,_,_ ), 0 , 4 , 0 , 2974 , 183, 0 ), // #741
+ INST(Slwpcb , VexR_Wx , V(XOP_M9,12,1,0,x,_,_,_ ), 0 , 11 , 0 , 2979 , 108, 74 ), // #742
+ INST(Smsw , X86M_NoMemSize , O(000F00,01,4,_,_,_,_,_ ), 0 , 97 , 0 , 2986 , 183, 0 ), // #743
+ INST(Sqrtpd , ExtRm , O(660F00,51,_,_,_,_,_,_ ), 0 , 3 , 0 , 11275, 5 , 4 ), // #744
+ INST(Sqrtps , ExtRm , O(000F00,51,_,_,_,_,_,_ ), 0 , 4 , 0 , 10961, 5 , 5 ), // #745
+ INST(Sqrtsd , ExtRm , O(F20F00,51,_,_,_,_,_,_ ), 0 , 5 , 0 , 11299, 6 , 4 ), // #746
+ INST(Sqrtss , ExtRm , O(F30F00,51,_,_,_,_,_,_ ), 0 , 6 , 0 , 10979, 7 , 5 ), // #747
+ INST(Stac , X86Op , O(000F01,CB,_,_,_,_,_,_ ), 0 , 21 , 0 , 2991 , 30 , 16 ), // #748
+ INST(Stc , X86Op , O(000000,F9,_,_,_,_,_,_ ), 0 , 0 , 0 , 2996 , 30 , 17 ), // #749
+ INST(Std , X86Op , O(000000,FD,_,_,_,_,_,_ ), 0 , 0 , 0 , 7921 , 30 , 18 ), // #750
+ INST(Stgi , X86Op , O(000F01,DC,_,_,_,_,_,_ ), 0 , 21 , 0 , 3000 , 30 , 117), // #751
+ INST(Sti , X86Op , O(000000,FB,_,_,_,_,_,_ ), 0 , 0 , 0 , 3005 , 30 , 23 ), // #752
+ INST(Stmxcsr , X86M_Only , O(000F00,AE,3,_,_,_,_,_ ), 0 , 78 , 0 , 11323, 101, 5 ), // #753
+ INST(Stos , X86StrMr , O(000000,AA,_,_,_,_,_,_ ), 0 , 0 , 0 , 3009 , 184, 75 ), // #754
+ INST(Str , X86M_NoMemSize , O(000F00,00,1,_,_,_,_,_ ), 0 , 29 , 0 , 3014 , 183, 0 ), // #755
+ INST(Sttilecfg , AmxCfg , V(660F38,49,_,0,0,_,_,_ ), 0 , 96 , 0 , 3018 , 103, 73 ), // #756
+ INST(Stui , X86Op , O(F30F01,EF,_,_,_,_,_,_ ), 0 , 25 , 0 , 3135 , 33 , 25 ), // #757
+ INST(Sub , X86Arith , O(000000,28,5,_,x,_,_,_ ), 0 , 62 , 0 , 866 , 179, 1 ), // #758
+ INST(Subpd , ExtRm , O(660F00,5C,_,_,_,_,_,_ ), 0 , 3 , 0 , 5413 , 5 , 4 ), // #759
+ INST(Subps , ExtRm , O(000F00,5C,_,_,_,_,_,_ ), 0 , 4 , 0 , 5425 , 5 , 5 ), // #760
+ INST(Subsd , ExtRm , O(F20F00,5C,_,_,_,_,_,_ ), 0 , 5 , 0 , 6392 , 6 , 4 ), // #761
+ INST(Subss , ExtRm , O(F30F00,5C,_,_,_,_,_,_ ), 0 , 6 , 0 , 6402 , 7 , 5 ), // #762
+ INST(Swapgs , X86Op , O(000F01,F8,_,_,_,_,_,_ ), 0 , 21 , 0 , 3028 , 33 , 0 ), // #763
+ INST(Syscall , X86Op , O(000F00,05,_,_,_,_,_,_ ), 0 , 4 , 0 , 3035 , 33 , 0 ), // #764
+ INST(Sysenter , X86Op , O(000F00,34,_,_,_,_,_,_ ), 0 , 4 , 0 , 3043 , 30 , 0 ), // #765
+ INST(Sysexit , X86Op , O(000F00,35,_,_,_,_,_,_ ), 0 , 4 , 0 , 3052 , 30 , 0 ), // #766
+ INST(Sysexitq , X86Op , O(000F00,35,_,_,1,_,_,_ ), 0 , 60 , 0 , 3060 , 30 , 0 ), // #767
+ INST(Sysret , X86Op , O(000F00,07,_,_,_,_,_,_ ), 0 , 4 , 0 , 3069 , 33 , 0 ), // #768
+ INST(Sysretq , X86Op , O(000F00,07,_,_,1,_,_,_ ), 0 , 60 , 0 , 3076 , 33 , 0 ), // #769
+ INST(T1mskc , VexVm_Wx , V(XOP_M9,01,7,0,x,_,_,_ ), 0 , 98 , 0 , 3084 , 14 , 11 ), // #770
+ INST(Tdpbf16ps , AmxRmv , V(F30F38,5C,_,0,0,_,_,_ ), 0 , 88 , 0 , 3091 , 185, 118), // #771
+ INST(Tdpbssd , AmxRmv , V(F20F38,5E,_,0,0,_,_,_ ), 0 , 84 , 0 , 3101 , 185, 119), // #772
+ INST(Tdpbsud , AmxRmv , V(F30F38,5E,_,0,0,_,_,_ ), 0 , 88 , 0 , 3109 , 185, 119), // #773
+ INST(Tdpbusd , AmxRmv , V(660F38,5E,_,0,0,_,_,_ ), 0 , 96 , 0 , 3117 , 185, 119), // #774
+ INST(Tdpbuud , AmxRmv , V(000F38,5E,_,0,0,_,_,_ ), 0 , 10 , 0 , 3125 , 185, 119), // #775
+ INST(Test , X86Test , O(000000,84,_,_,x,_,_,_ ), O(000000,F6,_,_,x,_,_,_ ), 0 , 79 , 10367, 186, 1 ), // #776
+ INST(Testui , X86Op , O(F30F01,ED,_,_,_,_,_,_ ), 0 , 25 , 0 , 3133 , 33 , 120), // #777
+ INST(Tileloadd , AmxRm , V(F20F38,4B,_,0,0,_,_,_ ), 0 , 84 , 0 , 3140 , 187, 73 ), // #778
+ INST(Tileloaddt1 , AmxRm , V(660F38,4B,_,0,0,_,_,_ ), 0 , 96 , 0 , 3150 , 187, 73 ), // #779
+ INST(Tilerelease , VexOpMod , V(000F38,49,0,0,0,_,_,_ ), 0 , 10 , 0 , 3162 , 188, 73 ), // #780
+ INST(Tilestored , AmxMr , V(F30F38,4B,_,0,0,_,_,_ ), 0 , 88 , 0 , 3174 , 189, 73 ), // #781
+ INST(Tilezero , AmxR , V(F20F38,49,_,0,0,_,_,_ ), 0 , 84 , 0 , 3185 , 190, 73 ), // #782
+ INST(Tpause , X86R32_EDX_EAX , O(660F00,AE,6,_,_,_,_,_ ), 0 , 26 , 0 , 3194 , 191, 121), // #783
+ INST(Tzcnt , X86Rm_Raw66H , O(F30F00,BC,_,_,x,_,_,_ ), 0 , 6 , 0 , 3201 , 22 , 9 ), // #784
+ INST(Tzmsk , VexVm_Wx , V(XOP_M9,01,4,0,x,_,_,_ ), 0 , 99 , 0 , 3207 , 14 , 11 ), // #785
+ INST(Ucomisd , ExtRm , O(660F00,2E,_,_,_,_,_,_ ), 0 , 3 , 0 , 11390, 6 , 41 ), // #786
+ INST(Ucomiss , ExtRm , O(000F00,2E,_,_,_,_,_,_ ), 0 , 4 , 0 , 11408, 7 , 42 ), // #787
+ INST(Ud0 , X86Rm , O(000F00,FF,_,_,_,_,_,_ ), 0 , 4 , 0 , 3213 , 192, 0 ), // #788
+ INST(Ud1 , X86Rm , O(000F00,B9,_,_,_,_,_,_ ), 0 , 4 , 0 , 3217 , 192, 0 ), // #789
+ INST(Ud2 , X86Op , O(000F00,0B,_,_,_,_,_,_ ), 0 , 4 , 0 , 3221 , 30 , 0 ), // #790
+ INST(Uiret , X86Op , O(F30F01,EC,_,_,_,_,_,_ ), 0 , 25 , 0 , 3225 , 33 , 25 ), // #791
+ INST(Umonitor , X86R_FromM , O(F30F00,AE,6,_,_,_,_,_ ), 0 , 24 , 0 , 3231 , 193, 122), // #792
+ INST(Umwait , X86R32_EDX_EAX , O(F20F00,AE,6,_,_,_,_,_ ), 0 , 100, 0 , 3240 , 191, 121), // #793
+ INST(Unpckhpd , ExtRm , O(660F00,15,_,_,_,_,_,_ ), 0 , 3 , 0 , 11417, 5 , 4 ), // #794
+ INST(Unpckhps , ExtRm , O(000F00,15,_,_,_,_,_,_ ), 0 , 4 , 0 , 11427, 5 , 5 ), // #795
+ INST(Unpcklpd , ExtRm , O(660F00,14,_,_,_,_,_,_ ), 0 , 3 , 0 , 11437, 5 , 4 ), // #796
+ INST(Unpcklps , ExtRm , O(000F00,14,_,_,_,_,_,_ ), 0 , 4 , 0 , 11447, 5 , 5 ), // #797
+ INST(V4fmaddps , VexRm_T1_4X , E(F20F38,9A,_,2,_,0,4,T4X), 0 , 101, 0 , 3247 , 194, 123), // #798
+ INST(V4fmaddss , VexRm_T1_4X , E(F20F38,9B,_,0,_,0,4,T4X), 0 , 102, 0 , 3257 , 195, 123), // #799
+ INST(V4fnmaddps , VexRm_T1_4X , E(F20F38,AA,_,2,_,0,4,T4X), 0 , 101, 0 , 3267 , 194, 123), // #800
+ INST(V4fnmaddss , VexRm_T1_4X , E(F20F38,AB,_,0,_,0,4,T4X), 0 , 102, 0 , 3278 , 195, 123), // #801
+ INST(Vaddpd , VexRvm_Lx , V(660F00,58,_,x,I,1,4,FV ), 0 , 103, 0 , 3289 , 196, 124), // #802
+ INST(Vaddph , VexRvm_Lx , E(00MAP5,58,_,_,_,0,4,FV ), 0 , 104, 0 , 3296 , 197, 125), // #803
+ INST(Vaddps , VexRvm_Lx , V(000F00,58,_,x,I,0,4,FV ), 0 , 105, 0 , 3303 , 198, 124), // #804
+ INST(Vaddsd , VexRvm , V(F20F00,58,_,I,I,1,3,T1S), 0 , 106, 0 , 3310 , 199, 126), // #805
+ INST(Vaddsh , VexRvm , E(F3MAP5,58,_,_,_,0,1,T1S), 0 , 107, 0 , 3317 , 200, 127), // #806
+ INST(Vaddss , VexRvm , V(F30F00,58,_,I,I,0,2,T1S), 0 , 108, 0 , 3324 , 201, 126), // #807
+ INST(Vaddsubpd , VexRvm_Lx , V(660F00,D0,_,x,I,_,_,_ ), 0 , 69 , 0 , 3331 , 202, 128), // #808
+ INST(Vaddsubps , VexRvm_Lx , V(F20F00,D0,_,x,I,_,_,_ ), 0 , 109, 0 , 3341 , 202, 128), // #809
+ INST(Vaesdec , VexRvm_Lx , V(660F38,DE,_,x,I,_,4,FVM), 0 , 110, 0 , 3351 , 203, 129), // #810
+ INST(Vaesdeclast , VexRvm_Lx , V(660F38,DF,_,x,I,_,4,FVM), 0 , 110, 0 , 3359 , 203, 129), // #811
+ INST(Vaesenc , VexRvm_Lx , V(660F38,DC,_,x,I,_,4,FVM), 0 , 110, 0 , 3371 , 203, 129), // #812
+ INST(Vaesenclast , VexRvm_Lx , V(660F38,DD,_,x,I,_,4,FVM), 0 , 110, 0 , 3379 , 203, 129), // #813
+ INST(Vaesimc , VexRm , V(660F38,DB,_,0,I,_,_,_ ), 0 , 96 , 0 , 3391 , 204, 130), // #814
+ INST(Vaeskeygenassist , VexRmi , V(660F3A,DF,_,0,I,_,_,_ ), 0 , 73 , 0 , 3399 , 205, 130), // #815
+ INST(Valignd , VexRvmi_Lx , E(660F3A,03,_,x,_,0,4,FV ), 0 , 111, 0 , 3416 , 206, 131), // #816
+ INST(Valignq , VexRvmi_Lx , E(660F3A,03,_,x,_,1,4,FV ), 0 , 112, 0 , 3424 , 207, 131), // #817
+ INST(Vandnpd , VexRvm_Lx , V(660F00,55,_,x,I,1,4,FV ), 0 , 103, 0 , 3432 , 208, 132), // #818
+ INST(Vandnps , VexRvm_Lx , V(000F00,55,_,x,I,0,4,FV ), 0 , 105, 0 , 3440 , 209, 132), // #819
+ INST(Vandpd , VexRvm_Lx , V(660F00,54,_,x,I,1,4,FV ), 0 , 103, 0 , 3448 , 210, 132), // #820
+ INST(Vandps , VexRvm_Lx , V(000F00,54,_,x,I,0,4,FV ), 0 , 105, 0 , 3455 , 211, 132), // #821
+ INST(Vblendmpd , VexRvm_Lx , E(660F38,65,_,x,_,1,4,FV ), 0 , 113, 0 , 3462 , 212, 131), // #822
+ INST(Vblendmps , VexRvm_Lx , E(660F38,65,_,x,_,0,4,FV ), 0 , 114, 0 , 3472 , 213, 131), // #823
+ INST(Vblendpd , VexRvmi_Lx , V(660F3A,0D,_,x,I,_,_,_ ), 0 , 73 , 0 , 3482 , 214, 128), // #824
+ INST(Vblendps , VexRvmi_Lx , V(660F3A,0C,_,x,I,_,_,_ ), 0 , 73 , 0 , 3491 , 214, 128), // #825
+ INST(Vblendvpd , VexRvmr_Lx , V(660F3A,4B,_,x,0,_,_,_ ), 0 , 73 , 0 , 3500 , 215, 128), // #826
+ INST(Vblendvps , VexRvmr_Lx , V(660F3A,4A,_,x,0,_,_,_ ), 0 , 73 , 0 , 3510 , 215, 128), // #827
+ INST(Vbroadcastf128 , VexRm , V(660F38,1A,_,1,0,_,_,_ ), 0 , 115, 0 , 3520 , 216, 128), // #828
+ INST(Vbroadcastf32x2 , VexRm_Lx , E(660F38,19,_,x,_,0,3,T2 ), 0 , 116, 0 , 3535 , 217, 133), // #829
+ INST(Vbroadcastf32x4 , VexRm_Lx , E(660F38,1A,_,x,_,0,4,T4 ), 0 , 117, 0 , 3551 , 218, 68 ), // #830
+ INST(Vbroadcastf32x8 , VexRm , E(660F38,1B,_,2,_,0,5,T8 ), 0 , 118, 0 , 3567 , 219, 66 ), // #831
+ INST(Vbroadcastf64x2 , VexRm_Lx , E(660F38,1A,_,x,_,1,4,T2 ), 0 , 119, 0 , 3583 , 218, 133), // #832
+ INST(Vbroadcastf64x4 , VexRm , E(660F38,1B,_,2,_,1,5,T4 ), 0 , 120, 0 , 3599 , 219, 68 ), // #833
+ INST(Vbroadcasti128 , VexRm , V(660F38,5A,_,1,0,_,_,_ ), 0 , 115, 0 , 3615 , 216, 134), // #834
+ INST(Vbroadcasti32x2 , VexRm_Lx , E(660F38,59,_,x,_,0,3,T2 ), 0 , 116, 0 , 3630 , 220, 133), // #835
+ INST(Vbroadcasti32x4 , VexRm_Lx , E(660F38,5A,_,x,_,0,4,T4 ), 0 , 117, 0 , 3646 , 218, 131), // #836
+ INST(Vbroadcasti32x8 , VexRm , E(660F38,5B,_,2,_,0,5,T8 ), 0 , 118, 0 , 3662 , 219, 66 ), // #837
+ INST(Vbroadcasti64x2 , VexRm_Lx , E(660F38,5A,_,x,_,1,4,T2 ), 0 , 119, 0 , 3678 , 218, 133), // #838
+ INST(Vbroadcasti64x4 , VexRm , E(660F38,5B,_,2,_,1,5,T4 ), 0 , 120, 0 , 3694 , 219, 68 ), // #839
+ INST(Vbroadcastsd , VexRm_Lx , V(660F38,19,_,x,0,1,3,T1S), 0 , 121, 0 , 3710 , 221, 135), // #840
+ INST(Vbroadcastss , VexRm_Lx , V(660F38,18,_,x,0,0,2,T1S), 0 , 122, 0 , 3723 , 222, 135), // #841
+ INST(Vcmppd , VexRvmi_Lx_KEvex , V(660F00,C2,_,x,I,1,4,FV ), 0 , 103, 0 , 3736 , 223, 124), // #842
+ INST(Vcmpph , VexRvmi_Lx_KEvex , E(000F3A,C2,_,_,_,0,4,FV ), 0 , 123, 0 , 3743 , 224, 125), // #843
+ INST(Vcmpps , VexRvmi_Lx_KEvex , V(000F00,C2,_,x,I,0,4,FV ), 0 , 105, 0 , 3750 , 225, 124), // #844
+ INST(Vcmpsd , VexRvmi_KEvex , V(F20F00,C2,_,I,I,1,3,T1S), 0 , 106, 0 , 3757 , 226, 126), // #845
+ INST(Vcmpsh , VexRvmi_KEvex , E(F30F3A,C2,_,_,_,0,1,T1S), 0 , 124, 0 , 3764 , 227, 127), // #846
+ INST(Vcmpss , VexRvmi_KEvex , V(F30F00,C2,_,I,I,0,2,T1S), 0 , 108, 0 , 3771 , 228, 126), // #847
+ INST(Vcomisd , VexRm , V(660F00,2F,_,I,I,1,3,T1S), 0 , 125, 0 , 3778 , 229, 136), // #848
+ INST(Vcomish , VexRm , E(00MAP5,2F,_,_,_,0,1,T1S), 0 , 126, 0 , 3786 , 230, 127), // #849
+ INST(Vcomiss , VexRm , V(000F00,2F,_,I,I,0,2,T1S), 0 , 127, 0 , 3794 , 231, 136), // #850
+ INST(Vcompresspd , VexMr_Lx , E(660F38,8A,_,x,_,1,3,T1S), 0 , 128, 0 , 3802 , 232, 131), // #851
+ INST(Vcompressps , VexMr_Lx , E(660F38,8A,_,x,_,0,2,T1S), 0 , 129, 0 , 3814 , 232, 131), // #852
+ INST(Vcvtdq2pd , VexRm_Lx , V(F30F00,E6,_,x,I,0,3,HV ), 0 , 130, 0 , 3826 , 233, 124), // #853
+ INST(Vcvtdq2ph , VexRm_Lx , E(00MAP5,5B,_,_,_,0,4,FV ), 0 , 104, 0 , 3836 , 234, 125), // #854
+ INST(Vcvtdq2ps , VexRm_Lx , V(000F00,5B,_,x,I,0,4,FV ), 0 , 105, 0 , 3846 , 235, 124), // #855
+ INST(Vcvtne2ps2bf16 , VexRvm_Lx , E(F20F38,72,_,_,_,0,4,FV ), 0 , 131, 0 , 3856 , 213, 137), // #856
+ INST(Vcvtneps2bf16 , VexRm_Lx_Narrow , E(F30F38,72,_,_,_,0,4,FV ), 0 , 132, 0 , 3871 , 236, 137), // #857
+ INST(Vcvtpd2dq , VexRm_Lx_Narrow , V(F20F00,E6,_,x,I,1,4,FV ), 0 , 133, 0 , 3885 , 237, 124), // #858
+ INST(Vcvtpd2ph , VexRm_Lx , E(66MAP5,5A,_,_,_,1,4,FV ), 0 , 134, 0 , 3895 , 238, 125), // #859
+ INST(Vcvtpd2ps , VexRm_Lx_Narrow , V(660F00,5A,_,x,I,1,4,FV ), 0 , 103, 0 , 3905 , 237, 124), // #860
+ INST(Vcvtpd2qq , VexRm_Lx , E(660F00,7B,_,x,_,1,4,FV ), 0 , 135, 0 , 3915 , 239, 133), // #861
+ INST(Vcvtpd2udq , VexRm_Lx_Narrow , E(000F00,79,_,x,_,1,4,FV ), 0 , 136, 0 , 3925 , 240, 131), // #862
+ INST(Vcvtpd2uqq , VexRm_Lx , E(660F00,79,_,x,_,1,4,FV ), 0 , 135, 0 , 3936 , 239, 133), // #863
+ INST(Vcvtph2dq , VexRm_Lx , E(66MAP5,5B,_,_,_,0,3,HV ), 0 , 137, 0 , 3947 , 241, 125), // #864
+ INST(Vcvtph2pd , VexRm_Lx , E(00MAP5,5A,_,_,_,0,2,QV ), 0 , 138, 0 , 3957 , 242, 125), // #865
+ INST(Vcvtph2ps , VexRm_Lx , V(660F38,13,_,x,0,0,3,HVM), 0 , 139, 0 , 3967 , 243, 138), // #866
+ INST(Vcvtph2psx , VexRm_Lx , E(66MAP6,13,_,_,_,0,3,HV ), 0 , 140, 0 , 3977 , 244, 125), // #867
+ INST(Vcvtph2qq , VexRm_Lx , E(66MAP5,7B,_,_,_,0,2,QV ), 0 , 141, 0 , 3988 , 245, 125), // #868
+ INST(Vcvtph2udq , VexRm_Lx , E(00MAP5,79,_,_,_,0,3,HV ), 0 , 142, 0 , 3998 , 241, 125), // #869
+ INST(Vcvtph2uqq , VexRm_Lx , E(66MAP5,79,_,_,_,0,2,QV ), 0 , 141, 0 , 4009 , 245, 125), // #870
+ INST(Vcvtph2uw , VexRm_Lx , E(00MAP5,7D,_,_,_,0,4,FV ), 0 , 104, 0 , 4020 , 246, 125), // #871
+ INST(Vcvtph2w , VexRm_Lx , E(66MAP5,7D,_,_,_,0,4,FV ), 0 , 143, 0 , 4030 , 246, 125), // #872
+ INST(Vcvtps2dq , VexRm_Lx , V(660F00,5B,_,x,I,0,4,FV ), 0 , 144, 0 , 4039 , 235, 124), // #873
+ INST(Vcvtps2pd , VexRm_Lx , V(000F00,5A,_,x,I,0,3,HV ), 0 , 145, 0 , 4049 , 247, 124), // #874
+ INST(Vcvtps2ph , VexMri_Lx , V(660F3A,1D,_,x,0,0,3,HVM), 0 , 146, 0 , 4059 , 248, 138), // #875
+ INST(Vcvtps2phx , VexRm_Lx , E(66MAP5,1D,_,_,_,0,4,FV ), 0 , 143, 0 , 4069 , 234, 125), // #876
+ INST(Vcvtps2qq , VexRm_Lx , E(660F00,7B,_,x,_,0,3,HV ), 0 , 147, 0 , 4080 , 249, 133), // #877
+ INST(Vcvtps2udq , VexRm_Lx , E(000F00,79,_,x,_,0,4,FV ), 0 , 148, 0 , 4090 , 250, 131), // #878
+ INST(Vcvtps2uqq , VexRm_Lx , E(660F00,79,_,x,_,0,3,HV ), 0 , 147, 0 , 4101 , 249, 133), // #879
+ INST(Vcvtqq2pd , VexRm_Lx , E(F30F00,E6,_,x,_,1,4,FV ), 0 , 149, 0 , 4112 , 239, 133), // #880
+ INST(Vcvtqq2ph , VexRm_Lx , E(00MAP5,5B,_,_,_,1,4,FV ), 0 , 150, 0 , 4122 , 238, 125), // #881
+ INST(Vcvtqq2ps , VexRm_Lx_Narrow , E(000F00,5B,_,x,_,1,4,FV ), 0 , 136, 0 , 4132 , 240, 133), // #882
+ INST(Vcvtsd2sh , VexRvm , E(F2MAP5,5A,_,_,_,1,3,T1S), 0 , 151, 0 , 4142 , 251, 127), // #883
+ INST(Vcvtsd2si , VexRm_Wx , V(F20F00,2D,_,I,x,x,3,T1F), 0 , 152, 0 , 4152 , 252, 126), // #884
+ INST(Vcvtsd2ss , VexRvm , V(F20F00,5A,_,I,I,1,3,T1S), 0 , 106, 0 , 4162 , 199, 126), // #885
+ INST(Vcvtsd2usi , VexRm_Wx , E(F20F00,79,_,I,_,x,3,T1F), 0 , 153, 0 , 4172 , 253, 68 ), // #886
+ INST(Vcvtsh2sd , VexRvm , E(F3MAP5,5A,_,_,_,0,1,T1S), 0 , 107, 0 , 4183 , 254, 127), // #887
+ INST(Vcvtsh2si , VexRm_Wx , E(F3MAP5,2D,_,_,_,x,1,T1S), 0 , 107, 0 , 4193 , 255, 127), // #888
+ INST(Vcvtsh2ss , VexRvm , E(00MAP6,13,_,_,_,0,1,T1S), 0 , 154, 0 , 4203 , 254, 127), // #889
+ INST(Vcvtsh2usi , VexRm_Wx , E(F3MAP5,79,_,_,_,x,1,T1S), 0 , 107, 0 , 4213 , 255, 127), // #890
+ INST(Vcvtsi2sd , VexRvm_Wx , V(F20F00,2A,_,I,x,x,2,T1W), 0 , 155, 0 , 4224 , 256, 126), // #891
+ INST(Vcvtsi2sh , VexRvm_Wx , E(F3MAP5,2A,_,_,_,x,2,T1W), 0 , 156, 0 , 4234 , 257, 127), // #892
+ INST(Vcvtsi2ss , VexRvm_Wx , V(F30F00,2A,_,I,x,x,2,T1W), 0 , 157, 0 , 4244 , 256, 126), // #893
+ INST(Vcvtss2sd , VexRvm , V(F30F00,5A,_,I,I,0,2,T1S), 0 , 108, 0 , 4254 , 258, 126), // #894
+ INST(Vcvtss2sh , VexRvm , E(00MAP5,1D,_,_,_,0,2,T1S), 0 , 158, 0 , 4264 , 259, 127), // #895
+ INST(Vcvtss2si , VexRm_Wx , V(F30F00,2D,_,I,x,x,2,T1F), 0 , 108, 0 , 4274 , 260, 126), // #896
+ INST(Vcvtss2usi , VexRm_Wx , E(F30F00,79,_,I,_,x,2,T1F), 0 , 159, 0 , 4284 , 261, 68 ), // #897
+ INST(Vcvttpd2dq , VexRm_Lx_Narrow , V(660F00,E6,_,x,I,1,4,FV ), 0 , 103, 0 , 4295 , 262, 124), // #898
+ INST(Vcvttpd2qq , VexRm_Lx , E(660F00,7A,_,x,_,1,4,FV ), 0 , 135, 0 , 4306 , 263, 131), // #899
+ INST(Vcvttpd2udq , VexRm_Lx_Narrow , E(000F00,78,_,x,_,1,4,FV ), 0 , 136, 0 , 4317 , 264, 131), // #900
+ INST(Vcvttpd2uqq , VexRm_Lx , E(660F00,78,_,x,_,1,4,FV ), 0 , 135, 0 , 4329 , 263, 133), // #901
+ INST(Vcvttph2dq , VexRm_Lx , E(F3MAP5,5B,_,_,_,0,3,HV ), 0 , 160, 0 , 4341 , 244, 125), // #902
+ INST(Vcvttph2qq , VexRm_Lx , E(66MAP5,7A,_,_,_,0,2,QV ), 0 , 141, 0 , 4352 , 242, 125), // #903
+ INST(Vcvttph2udq , VexRm_Lx , E(00MAP5,78,_,_,_,0,3,HV ), 0 , 142, 0 , 4363 , 244, 125), // #904
+ INST(Vcvttph2uqq , VexRm_Lx , E(66MAP5,78,_,_,_,0,2,QV ), 0 , 141, 0 , 4375 , 242, 125), // #905
+ INST(Vcvttph2uw , VexRm_Lx , E(00MAP5,7C,_,_,_,0,4,FV ), 0 , 104, 0 , 4387 , 265, 125), // #906
+ INST(Vcvttph2w , VexRm_Lx , E(66MAP5,7C,_,_,_,0,4,FV ), 0 , 143, 0 , 4398 , 265, 125), // #907
+ INST(Vcvttps2dq , VexRm_Lx , V(F30F00,5B,_,x,I,0,4,FV ), 0 , 161, 0 , 4408 , 266, 124), // #908
+ INST(Vcvttps2qq , VexRm_Lx , E(660F00,7A,_,x,_,0,3,HV ), 0 , 147, 0 , 4419 , 267, 133), // #909
+ INST(Vcvttps2udq , VexRm_Lx , E(000F00,78,_,x,_,0,4,FV ), 0 , 148, 0 , 4430 , 268, 131), // #910
+ INST(Vcvttps2uqq , VexRm_Lx , E(660F00,78,_,x,_,0,3,HV ), 0 , 147, 0 , 4442 , 267, 133), // #911
+ INST(Vcvttsd2si , VexRm_Wx , V(F20F00,2C,_,I,x,x,3,T1F), 0 , 152, 0 , 4454 , 269, 126), // #912
+ INST(Vcvttsd2usi , VexRm_Wx , E(F20F00,78,_,I,_,x,3,T1F), 0 , 153, 0 , 4465 , 270, 68 ), // #913
+ INST(Vcvttsh2si , VexRm_Wx , E(F3MAP5,2C,_,_,_,x,1,T1S), 0 , 107, 0 , 4477 , 271, 127), // #914
+ INST(Vcvttsh2usi , VexRm_Wx , E(F3MAP5,78,_,_,_,x,1,T1S), 0 , 107, 0 , 4488 , 271, 127), // #915
+ INST(Vcvttss2si , VexRm_Wx , V(F30F00,2C,_,I,x,x,2,T1F), 0 , 108, 0 , 4500 , 272, 126), // #916
+ INST(Vcvttss2usi , VexRm_Wx , E(F30F00,78,_,I,_,x,2,T1F), 0 , 159, 0 , 4511 , 273, 68 ), // #917
+ INST(Vcvtudq2pd , VexRm_Lx , E(F30F00,7A,_,x,_,0,3,HV ), 0 , 162, 0 , 4523 , 274, 131), // #918
+ INST(Vcvtudq2ph , VexRm_Lx , E(F2MAP5,7A,_,_,_,0,4,FV ), 0 , 163, 0 , 4534 , 234, 125), // #919
+ INST(Vcvtudq2ps , VexRm_Lx , E(F20F00,7A,_,x,_,0,4,FV ), 0 , 164, 0 , 4545 , 250, 131), // #920
+ INST(Vcvtuqq2pd , VexRm_Lx , E(F30F00,7A,_,x,_,1,4,FV ), 0 , 149, 0 , 4556 , 239, 133), // #921
+ INST(Vcvtuqq2ph , VexRm_Lx , E(F2MAP5,7A,_,_,_,1,4,FV ), 0 , 165, 0 , 4567 , 238, 125), // #922
+ INST(Vcvtuqq2ps , VexRm_Lx_Narrow , E(F20F00,7A,_,x,_,1,4,FV ), 0 , 166, 0 , 4578 , 240, 133), // #923
+ INST(Vcvtusi2sd , VexRvm_Wx , E(F20F00,7B,_,I,_,x,2,T1W), 0 , 167, 0 , 4589 , 257, 68 ), // #924
+ INST(Vcvtusi2sh , VexRvm_Wx , E(F3MAP5,7B,_,_,_,x,2,T1W), 0 , 156, 0 , 4600 , 257, 127), // #925
+ INST(Vcvtusi2ss , VexRvm_Wx , E(F30F00,7B,_,I,_,x,2,T1W), 0 , 168, 0 , 4611 , 257, 68 ), // #926
+ INST(Vcvtuw2ph , VexRm_Lx , E(F2MAP5,7D,_,_,_,0,4,FV ), 0 , 163, 0 , 4622 , 246, 125), // #927
+ INST(Vcvtw2ph , VexRm_Lx , E(F3MAP5,7D,_,_,_,0,4,FV ), 0 , 169, 0 , 4632 , 246, 125), // #928
+ INST(Vdbpsadbw , VexRvmi_Lx , E(660F3A,42,_,x,_,0,4,FVM), 0 , 111, 0 , 4641 , 275, 139), // #929
+ INST(Vdivpd , VexRvm_Lx , V(660F00,5E,_,x,I,1,4,FV ), 0 , 103, 0 , 4651 , 196, 124), // #930
+ INST(Vdivph , VexRvm_Lx , E(00MAP5,5E,_,_,_,0,4,FV ), 0 , 104, 0 , 4658 , 197, 125), // #931
+ INST(Vdivps , VexRvm_Lx , V(000F00,5E,_,x,I,0,4,FV ), 0 , 105, 0 , 4665 , 198, 124), // #932
+ INST(Vdivsd , VexRvm , V(F20F00,5E,_,I,I,1,3,T1S), 0 , 106, 0 , 4672 , 199, 126), // #933
+ INST(Vdivsh , VexRvm , E(F3MAP5,5E,_,_,_,0,1,T1S), 0 , 107, 0 , 4679 , 200, 127), // #934
+ INST(Vdivss , VexRvm , V(F30F00,5E,_,I,I,0,2,T1S), 0 , 108, 0 , 4686 , 201, 126), // #935
+ INST(Vdpbf16ps , VexRvm_Lx , E(F30F38,52,_,_,_,0,4,FV ), 0 , 132, 0 , 4693 , 213, 137), // #936
+ INST(Vdppd , VexRvmi_Lx , V(660F3A,41,_,x,I,_,_,_ ), 0 , 73 , 0 , 4703 , 276, 128), // #937
+ INST(Vdpps , VexRvmi_Lx , V(660F3A,40,_,x,I,_,_,_ ), 0 , 73 , 0 , 4709 , 214, 128), // #938
+ INST(Verr , X86M_NoSize , O(000F00,00,4,_,_,_,_,_ ), 0 , 97 , 0 , 4715 , 107, 10 ), // #939
+ INST(Verw , X86M_NoSize , O(000F00,00,5,_,_,_,_,_ ), 0 , 77 , 0 , 4720 , 107, 10 ), // #940
+ INST(Vexp2pd , VexRm , E(660F38,C8,_,2,_,1,4,FV ), 0 , 170, 0 , 4725 , 277, 140), // #941
+ INST(Vexp2ps , VexRm , E(660F38,C8,_,2,_,0,4,FV ), 0 , 171, 0 , 4733 , 278, 140), // #942
+ INST(Vexpandpd , VexRm_Lx , E(660F38,88,_,x,_,1,3,T1S), 0 , 128, 0 , 4741 , 279, 131), // #943
+ INST(Vexpandps , VexRm_Lx , E(660F38,88,_,x,_,0,2,T1S), 0 , 129, 0 , 4751 , 279, 131), // #944
+ INST(Vextractf128 , VexMri , V(660F3A,19,_,1,0,_,_,_ ), 0 , 172, 0 , 4761 , 280, 128), // #945
+ INST(Vextractf32x4 , VexMri_Lx , E(660F3A,19,_,x,_,0,4,T4 ), 0 , 173, 0 , 4774 , 281, 131), // #946
+ INST(Vextractf32x8 , VexMri , E(660F3A,1B,_,2,_,0,5,T8 ), 0 , 174, 0 , 4788 , 282, 66 ), // #947
+ INST(Vextractf64x2 , VexMri_Lx , E(660F3A,19,_,x,_,1,4,T2 ), 0 , 175, 0 , 4802 , 281, 133), // #948
+ INST(Vextractf64x4 , VexMri , E(660F3A,1B,_,2,_,1,5,T4 ), 0 , 176, 0 , 4816 , 282, 68 ), // #949
+ INST(Vextracti128 , VexMri , V(660F3A,39,_,1,0,_,_,_ ), 0 , 172, 0 , 4830 , 280, 134), // #950
+ INST(Vextracti32x4 , VexMri_Lx , E(660F3A,39,_,x,_,0,4,T4 ), 0 , 173, 0 , 4843 , 281, 131), // #951
+ INST(Vextracti32x8 , VexMri , E(660F3A,3B,_,2,_,0,5,T8 ), 0 , 174, 0 , 4857 , 282, 66 ), // #952
+ INST(Vextracti64x2 , VexMri_Lx , E(660F3A,39,_,x,_,1,4,T2 ), 0 , 175, 0 , 4871 , 281, 133), // #953
+ INST(Vextracti64x4 , VexMri , E(660F3A,3B,_,2,_,1,5,T4 ), 0 , 176, 0 , 4885 , 282, 68 ), // #954
+ INST(Vextractps , VexMri , V(660F3A,17,_,0,I,I,2,T1S), 0 , 177, 0 , 4899 , 283, 126), // #955
+ INST(Vfcmaddcph , VexRvm_Lx , E(F2MAP6,56,_,_,_,0,4,FV ), 0 , 178, 0 , 4910 , 284, 125), // #956
+ INST(Vfcmaddcsh , VexRvm , E(F2MAP6,57,_,_,_,0,2,T1S), 0 , 179, 0 , 4921 , 259, 125), // #957
+ INST(Vfcmulcph , VexRvm_Lx , E(F2MAP6,D6,_,_,_,0,4,FV ), 0 , 178, 0 , 4932 , 284, 125), // #958
+ INST(Vfcmulcsh , VexRvm , E(F2MAP6,D7,_,_,_,0,2,T1S), 0 , 179, 0 , 4942 , 259, 125), // #959
+ INST(Vfixupimmpd , VexRvmi_Lx , E(660F3A,54,_,x,_,1,4,FV ), 0 , 112, 0 , 4952 , 285, 131), // #960
+ INST(Vfixupimmps , VexRvmi_Lx , E(660F3A,54,_,x,_,0,4,FV ), 0 , 111, 0 , 4964 , 286, 131), // #961
+ INST(Vfixupimmsd , VexRvmi , E(660F3A,55,_,I,_,1,3,T1S), 0 , 180, 0 , 4976 , 287, 68 ), // #962
+ INST(Vfixupimmss , VexRvmi , E(660F3A,55,_,I,_,0,2,T1S), 0 , 181, 0 , 4988 , 288, 68 ), // #963
+ INST(Vfmadd132pd , VexRvm_Lx , V(660F38,98,_,x,1,1,4,FV ), 0 , 182, 0 , 5000 , 196, 141), // #964
+ INST(Vfmadd132ph , VexRvm_Lx , E(66MAP6,98,_,_,_,0,4,FV ), 0 , 183, 0 , 5012 , 197, 125), // #965
+ INST(Vfmadd132ps , VexRvm_Lx , V(660F38,98,_,x,0,0,4,FV ), 0 , 110, 0 , 5024 , 198, 141), // #966
+ INST(Vfmadd132sd , VexRvm , V(660F38,99,_,I,1,1,3,T1S), 0 , 184, 0 , 5036 , 199, 142), // #967
+ INST(Vfmadd132sh , VexRvm , E(66MAP6,99,_,_,_,0,1,T1S), 0 , 185, 0 , 5048 , 200, 127), // #968
+ INST(Vfmadd132ss , VexRvm , V(660F38,99,_,I,0,0,2,T1S), 0 , 122, 0 , 5060 , 201, 142), // #969
+ INST(Vfmadd213pd , VexRvm_Lx , V(660F38,A8,_,x,1,1,4,FV ), 0 , 182, 0 , 5072 , 196, 141), // #970
+ INST(Vfmadd213ph , VexRvm_Lx , E(66MAP6,A8,_,_,_,0,4,FV ), 0 , 183, 0 , 5084 , 197, 125), // #971
+ INST(Vfmadd213ps , VexRvm_Lx , V(660F38,A8,_,x,0,0,4,FV ), 0 , 110, 0 , 5096 , 198, 141), // #972
+ INST(Vfmadd213sd , VexRvm , V(660F38,A9,_,I,1,1,3,T1S), 0 , 184, 0 , 5108 , 199, 142), // #973
+ INST(Vfmadd213sh , VexRvm , E(66MAP6,A9,_,_,_,0,1,T1S), 0 , 185, 0 , 5120 , 200, 127), // #974
+ INST(Vfmadd213ss , VexRvm , V(660F38,A9,_,I,0,0,2,T1S), 0 , 122, 0 , 5132 , 201, 142), // #975
+ INST(Vfmadd231pd , VexRvm_Lx , V(660F38,B8,_,x,1,1,4,FV ), 0 , 182, 0 , 5144 , 196, 141), // #976
+ INST(Vfmadd231ph , VexRvm_Lx , E(66MAP6,B8,_,_,_,0,4,FV ), 0 , 183, 0 , 5156 , 197, 125), // #977
+ INST(Vfmadd231ps , VexRvm_Lx , V(660F38,B8,_,x,0,0,4,FV ), 0 , 110, 0 , 5168 , 198, 141), // #978
+ INST(Vfmadd231sd , VexRvm , V(660F38,B9,_,I,1,1,3,T1S), 0 , 184, 0 , 5180 , 199, 142), // #979
+ INST(Vfmadd231sh , VexRvm , E(66MAP6,B9,_,_,_,0,1,T1S), 0 , 185, 0 , 5192 , 200, 127), // #980
+ INST(Vfmadd231ss , VexRvm , V(660F38,B9,_,I,0,0,2,T1S), 0 , 122, 0 , 5204 , 201, 142), // #981
+ INST(Vfmaddcph , VexRvm_Lx , E(F3MAP6,56,_,_,_,0,4,FV ), 0 , 186, 0 , 5216 , 284, 125), // #982
+ INST(Vfmaddcsh , VexRvm , E(F3MAP6,57,_,_,_,0,2,T1S), 0 , 187, 0 , 5226 , 259, 125), // #983
+ INST(Vfmaddpd , Fma4_Lx , V(660F3A,69,_,x,x,_,_,_ ), 0 , 73 , 0 , 5236 , 289, 143), // #984
+ INST(Vfmaddps , Fma4_Lx , V(660F3A,68,_,x,x,_,_,_ ), 0 , 73 , 0 , 5245 , 289, 143), // #985
+ INST(Vfmaddsd , Fma4 , V(660F3A,6B,_,0,x,_,_,_ ), 0 , 73 , 0 , 5254 , 290, 143), // #986
+ INST(Vfmaddss , Fma4 , V(660F3A,6A,_,0,x,_,_,_ ), 0 , 73 , 0 , 5263 , 291, 143), // #987
+ INST(Vfmaddsub132pd , VexRvm_Lx , V(660F38,96,_,x,1,1,4,FV ), 0 , 182, 0 , 5272 , 196, 141), // #988
+ INST(Vfmaddsub132ph , VexRvm_Lx , E(66MAP6,96,_,_,_,0,4,FV ), 0 , 183, 0 , 5287 , 197, 125), // #989
+ INST(Vfmaddsub132ps , VexRvm_Lx , V(660F38,96,_,x,0,0,4,FV ), 0 , 110, 0 , 5302 , 198, 141), // #990
+ INST(Vfmaddsub213pd , VexRvm_Lx , V(660F38,A6,_,x,1,1,4,FV ), 0 , 182, 0 , 5317 , 196, 141), // #991
+ INST(Vfmaddsub213ph , VexRvm_Lx , E(66MAP6,A6,_,_,_,0,4,FV ), 0 , 183, 0 , 5332 , 197, 125), // #992
+ INST(Vfmaddsub213ps , VexRvm_Lx , V(660F38,A6,_,x,0,0,4,FV ), 0 , 110, 0 , 5347 , 198, 141), // #993
+ INST(Vfmaddsub231pd , VexRvm_Lx , V(660F38,B6,_,x,1,1,4,FV ), 0 , 182, 0 , 5362 , 196, 141), // #994
+ INST(Vfmaddsub231ph , VexRvm_Lx , E(66MAP6,B6,_,_,_,0,4,FV ), 0 , 183, 0 , 5377 , 197, 125), // #995
+ INST(Vfmaddsub231ps , VexRvm_Lx , V(660F38,B6,_,x,0,0,4,FV ), 0 , 110, 0 , 5392 , 198, 141), // #996
+ INST(Vfmaddsubpd , Fma4_Lx , V(660F3A,5D,_,x,x,_,_,_ ), 0 , 73 , 0 , 5407 , 289, 143), // #997
+ INST(Vfmaddsubps , Fma4_Lx , V(660F3A,5C,_,x,x,_,_,_ ), 0 , 73 , 0 , 5419 , 289, 143), // #998
+ INST(Vfmsub132pd , VexRvm_Lx , V(660F38,9A,_,x,1,1,4,FV ), 0 , 182, 0 , 5431 , 196, 141), // #999
+ INST(Vfmsub132ph , VexRvm_Lx , E(66MAP6,9A,_,_,_,0,4,FV ), 0 , 183, 0 , 5443 , 197, 125), // #1000
+ INST(Vfmsub132ps , VexRvm_Lx , V(660F38,9A,_,x,0,0,4,FV ), 0 , 110, 0 , 5455 , 198, 141), // #1001
+ INST(Vfmsub132sd , VexRvm , V(660F38,9B,_,I,1,1,3,T1S), 0 , 184, 0 , 5467 , 199, 142), // #1002
+ INST(Vfmsub132sh , VexRvm , E(66MAP6,9B,_,_,_,0,1,T1S), 0 , 185, 0 , 5479 , 200, 127), // #1003
+ INST(Vfmsub132ss , VexRvm , V(660F38,9B,_,I,0,0,2,T1S), 0 , 122, 0 , 5491 , 201, 142), // #1004
+ INST(Vfmsub213pd , VexRvm_Lx , V(660F38,AA,_,x,1,1,4,FV ), 0 , 182, 0 , 5503 , 196, 141), // #1005
+ INST(Vfmsub213ph , VexRvm_Lx , E(66MAP6,AA,_,_,_,0,4,FV ), 0 , 183, 0 , 5515 , 197, 125), // #1006
+ INST(Vfmsub213ps , VexRvm_Lx , V(660F38,AA,_,x,0,0,4,FV ), 0 , 110, 0 , 5527 , 198, 141), // #1007
+ INST(Vfmsub213sd , VexRvm , V(660F38,AB,_,I,1,1,3,T1S), 0 , 184, 0 , 5539 , 199, 142), // #1008
+ INST(Vfmsub213sh , VexRvm , E(66MAP6,AB,_,_,_,0,1,T1S), 0 , 185, 0 , 5551 , 200, 127), // #1009
+ INST(Vfmsub213ss , VexRvm , V(660F38,AB,_,I,0,0,2,T1S), 0 , 122, 0 , 5563 , 201, 142), // #1010
+ INST(Vfmsub231pd , VexRvm_Lx , V(660F38,BA,_,x,1,1,4,FV ), 0 , 182, 0 , 5575 , 196, 141), // #1011
+ INST(Vfmsub231ph , VexRvm_Lx , E(66MAP6,BA,_,_,_,0,4,FV ), 0 , 183, 0 , 5587 , 197, 125), // #1012
+ INST(Vfmsub231ps , VexRvm_Lx , V(660F38,BA,_,x,0,0,4,FV ), 0 , 110, 0 , 5599 , 198, 141), // #1013
+ INST(Vfmsub231sd , VexRvm , V(660F38,BB,_,I,1,1,3,T1S), 0 , 184, 0 , 5611 , 199, 142), // #1014
+ INST(Vfmsub231sh , VexRvm , E(66MAP6,BB,_,_,_,0,1,T1S), 0 , 185, 0 , 5623 , 200, 127), // #1015
+ INST(Vfmsub231ss , VexRvm , V(660F38,BB,_,I,0,0,2,T1S), 0 , 122, 0 , 5635 , 201, 142), // #1016
+ INST(Vfmsubadd132pd , VexRvm_Lx , V(660F38,97,_,x,1,1,4,FV ), 0 , 182, 0 , 5647 , 196, 141), // #1017
+ INST(Vfmsubadd132ph , VexRvm_Lx , E(66MAP6,97,_,_,_,0,4,FV ), 0 , 183, 0 , 5662 , 197, 125), // #1018
+ INST(Vfmsubadd132ps , VexRvm_Lx , V(660F38,97,_,x,0,0,4,FV ), 0 , 110, 0 , 5677 , 198, 141), // #1019
+ INST(Vfmsubadd213pd , VexRvm_Lx , V(660F38,A7,_,x,1,1,4,FV ), 0 , 182, 0 , 5692 , 196, 141), // #1020
+ INST(Vfmsubadd213ph , VexRvm_Lx , E(66MAP6,A7,_,_,_,0,4,FV ), 0 , 183, 0 , 5707 , 197, 125), // #1021
+ INST(Vfmsubadd213ps , VexRvm_Lx , V(660F38,A7,_,x,0,0,4,FV ), 0 , 110, 0 , 5722 , 198, 141), // #1022
+ INST(Vfmsubadd231pd , VexRvm_Lx , V(660F38,B7,_,x,1,1,4,FV ), 0 , 182, 0 , 5737 , 196, 141), // #1023
+ INST(Vfmsubadd231ph , VexRvm_Lx , E(66MAP6,B7,_,_,_,0,4,FV ), 0 , 183, 0 , 5752 , 197, 125), // #1024
+ INST(Vfmsubadd231ps , VexRvm_Lx , V(660F38,B7,_,x,0,0,4,FV ), 0 , 110, 0 , 5767 , 198, 141), // #1025
+ INST(Vfmsubaddpd , Fma4_Lx , V(660F3A,5F,_,x,x,_,_,_ ), 0 , 73 , 0 , 5782 , 289, 143), // #1026
+ INST(Vfmsubaddps , Fma4_Lx , V(660F3A,5E,_,x,x,_,_,_ ), 0 , 73 , 0 , 5794 , 289, 143), // #1027
+ INST(Vfmsubpd , Fma4_Lx , V(660F3A,6D,_,x,x,_,_,_ ), 0 , 73 , 0 , 5806 , 289, 143), // #1028
+ INST(Vfmsubps , Fma4_Lx , V(660F3A,6C,_,x,x,_,_,_ ), 0 , 73 , 0 , 5815 , 289, 143), // #1029
+ INST(Vfmsubsd , Fma4 , V(660F3A,6F,_,0,x,_,_,_ ), 0 , 73 , 0 , 5824 , 290, 143), // #1030
+ INST(Vfmsubss , Fma4 , V(660F3A,6E,_,0,x,_,_,_ ), 0 , 73 , 0 , 5833 , 291, 143), // #1031
+ INST(Vfmulcph , VexRvm_Lx , E(F3MAP6,D6,_,_,_,0,4,FV ), 0 , 186, 0 , 5842 , 284, 125), // #1032
+ INST(Vfmulcsh , VexRvm , E(F3MAP6,D7,_,_,_,0,2,T1S), 0 , 187, 0 , 5851 , 259, 125), // #1033
+ INST(Vfnmadd132pd , VexRvm_Lx , V(660F38,9C,_,x,1,1,4,FV ), 0 , 182, 0 , 5860 , 196, 141), // #1034
+ INST(Vfnmadd132ph , VexRvm_Lx , E(66MAP6,9C,_,_,_,0,4,FV ), 0 , 183, 0 , 5873 , 197, 125), // #1035
+ INST(Vfnmadd132ps , VexRvm_Lx , V(660F38,9C,_,x,0,0,4,FV ), 0 , 110, 0 , 5886 , 198, 141), // #1036
+ INST(Vfnmadd132sd , VexRvm , V(660F38,9D,_,I,1,1,3,T1S), 0 , 184, 0 , 5899 , 199, 142), // #1037
+ INST(Vfnmadd132sh , VexRvm , E(66MAP6,9D,_,_,_,0,1,T1S), 0 , 185, 0 , 5912 , 200, 127), // #1038
+ INST(Vfnmadd132ss , VexRvm , V(660F38,9D,_,I,0,0,2,T1S), 0 , 122, 0 , 5925 , 201, 142), // #1039
+ INST(Vfnmadd213pd , VexRvm_Lx , V(660F38,AC,_,x,1,1,4,FV ), 0 , 182, 0 , 5938 , 196, 141), // #1040
+ INST(Vfnmadd213ph , VexRvm_Lx , E(66MAP6,AC,_,_,_,0,4,FV ), 0 , 183, 0 , 5951 , 197, 125), // #1041
+ INST(Vfnmadd213ps , VexRvm_Lx , V(660F38,AC,_,x,0,0,4,FV ), 0 , 110, 0 , 5964 , 198, 141), // #1042
+ INST(Vfnmadd213sd , VexRvm , V(660F38,AD,_,I,1,1,3,T1S), 0 , 184, 0 , 5977 , 199, 142), // #1043
+ INST(Vfnmadd213sh , VexRvm , E(66MAP6,AD,_,_,_,0,1,T1S), 0 , 185, 0 , 5990 , 200, 127), // #1044
+ INST(Vfnmadd213ss , VexRvm , V(660F38,AD,_,I,0,0,2,T1S), 0 , 122, 0 , 6003 , 201, 142), // #1045
+ INST(Vfnmadd231pd , VexRvm_Lx , V(660F38,BC,_,x,1,1,4,FV ), 0 , 182, 0 , 6016 , 196, 141), // #1046
+ INST(Vfnmadd231ph , VexRvm_Lx , E(66MAP6,BC,_,_,_,0,4,FV ), 0 , 183, 0 , 6029 , 197, 125), // #1047
+ INST(Vfnmadd231ps , VexRvm_Lx , V(660F38,BC,_,x,0,0,4,FV ), 0 , 110, 0 , 6042 , 198, 141), // #1048
+ INST(Vfnmadd231sd , VexRvm , V(660F38,BD,_,I,1,1,3,T1S), 0 , 184, 0 , 6055 , 199, 142), // #1049
+ INST(Vfnmadd231sh , VexRvm , E(66MAP6,BD,_,_,_,0,1,T1S), 0 , 185, 0 , 6068 , 200, 127), // #1050
+ INST(Vfnmadd231ss , VexRvm , V(660F38,BD,_,I,0,0,2,T1S), 0 , 122, 0 , 6081 , 201, 142), // #1051
+ INST(Vfnmaddpd , Fma4_Lx , V(660F3A,79,_,x,x,_,_,_ ), 0 , 73 , 0 , 6094 , 289, 143), // #1052
+ INST(Vfnmaddps , Fma4_Lx , V(660F3A,78,_,x,x,_,_,_ ), 0 , 73 , 0 , 6104 , 289, 143), // #1053
+ INST(Vfnmaddsd , Fma4 , V(660F3A,7B,_,0,x,_,_,_ ), 0 , 73 , 0 , 6114 , 290, 143), // #1054
+ INST(Vfnmaddss , Fma4 , V(660F3A,7A,_,0,x,_,_,_ ), 0 , 73 , 0 , 6124 , 291, 143), // #1055
+ INST(Vfnmsub132pd , VexRvm_Lx , V(660F38,9E,_,x,1,1,4,FV ), 0 , 182, 0 , 6134 , 196, 141), // #1056
+ INST(Vfnmsub132ph , VexRvm_Lx , E(66MAP6,9E,_,_,_,0,4,FV ), 0 , 183, 0 , 6147 , 197, 125), // #1057
+ INST(Vfnmsub132ps , VexRvm_Lx , V(660F38,9E,_,x,0,0,4,FV ), 0 , 110, 0 , 6160 , 198, 141), // #1058
+ INST(Vfnmsub132sd , VexRvm , V(660F38,9F,_,I,1,1,3,T1S), 0 , 184, 0 , 6173 , 199, 142), // #1059
+ INST(Vfnmsub132sh , VexRvm , E(66MAP6,9F,_,_,_,0,1,T1S), 0 , 185, 0 , 6186 , 200, 127), // #1060
+ INST(Vfnmsub132ss , VexRvm , V(660F38,9F,_,I,0,0,2,T1S), 0 , 122, 0 , 6199 , 201, 142), // #1061
+ INST(Vfnmsub213pd , VexRvm_Lx , V(660F38,AE,_,x,1,1,4,FV ), 0 , 182, 0 , 6212 , 196, 141), // #1062
+ INST(Vfnmsub213ph , VexRvm_Lx , E(66MAP6,AE,_,_,_,0,4,FV ), 0 , 183, 0 , 6225 , 197, 125), // #1063
+ INST(Vfnmsub213ps , VexRvm_Lx , V(660F38,AE,_,x,0,0,4,FV ), 0 , 110, 0 , 6238 , 198, 141), // #1064
+ INST(Vfnmsub213sd , VexRvm , V(660F38,AF,_,I,1,1,3,T1S), 0 , 184, 0 , 6251 , 199, 142), // #1065
+ INST(Vfnmsub213sh , VexRvm , E(66MAP6,AF,_,_,_,0,1,T1S), 0 , 185, 0 , 6264 , 200, 127), // #1066
+ INST(Vfnmsub213ss , VexRvm , V(660F38,AF,_,I,0,0,2,T1S), 0 , 122, 0 , 6277 , 201, 142), // #1067
+ INST(Vfnmsub231pd , VexRvm_Lx , V(660F38,BE,_,x,1,1,4,FV ), 0 , 182, 0 , 6290 , 196, 141), // #1068
+ INST(Vfnmsub231ph , VexRvm_Lx , E(66MAP6,BE,_,_,_,0,4,FV ), 0 , 183, 0 , 6303 , 197, 125), // #1069
+ INST(Vfnmsub231ps , VexRvm_Lx , V(660F38,BE,_,x,0,0,4,FV ), 0 , 110, 0 , 6316 , 198, 141), // #1070
+ INST(Vfnmsub231sd , VexRvm , V(660F38,BF,_,I,1,1,3,T1S), 0 , 184, 0 , 6329 , 199, 142), // #1071
+ INST(Vfnmsub231sh , VexRvm , E(66MAP6,BF,_,_,_,0,1,T1S), 0 , 185, 0 , 6342 , 200, 127), // #1072
+ INST(Vfnmsub231ss , VexRvm , V(660F38,BF,_,I,0,0,2,T1S), 0 , 122, 0 , 6355 , 201, 142), // #1073
+ INST(Vfnmsubpd , Fma4_Lx , V(660F3A,7D,_,x,x,_,_,_ ), 0 , 73 , 0 , 6368 , 289, 143), // #1074
+ INST(Vfnmsubps , Fma4_Lx , V(660F3A,7C,_,x,x,_,_,_ ), 0 , 73 , 0 , 6378 , 289, 143), // #1075
+ INST(Vfnmsubsd , Fma4 , V(660F3A,7F,_,0,x,_,_,_ ), 0 , 73 , 0 , 6388 , 290, 143), // #1076
+ INST(Vfnmsubss , Fma4 , V(660F3A,7E,_,0,x,_,_,_ ), 0 , 73 , 0 , 6398 , 291, 143), // #1077
+ INST(Vfpclasspd , VexRmi_Lx , E(660F3A,66,_,x,_,1,4,FV ), 0 , 112, 0 , 6408 , 292, 133), // #1078
+ INST(Vfpclassph , VexRmi_Lx , E(000F3A,66,_,_,_,0,4,FV ), 0 , 123, 0 , 6419 , 293, 125), // #1079
+ INST(Vfpclassps , VexRmi_Lx , E(660F3A,66,_,x,_,0,4,FV ), 0 , 111, 0 , 6430 , 294, 133), // #1080
+ INST(Vfpclasssd , VexRmi , E(660F3A,67,_,I,_,1,3,T1S), 0 , 180, 0 , 6441 , 295, 66 ), // #1081
+ INST(Vfpclasssh , VexRmi , E(000F3A,67,_,_,_,0,1,T1S), 0 , 188, 0 , 6452 , 296, 127), // #1082
+ INST(Vfpclassss , VexRmi , E(660F3A,67,_,I,_,0,2,T1S), 0 , 181, 0 , 6463 , 297, 66 ), // #1083
+ INST(Vfrczpd , VexRm_Lx , V(XOP_M9,81,_,x,0,_,_,_ ), 0 , 79 , 0 , 6474 , 298, 144), // #1084
+ INST(Vfrczps , VexRm_Lx , V(XOP_M9,80,_,x,0,_,_,_ ), 0 , 79 , 0 , 6482 , 298, 144), // #1085
+ INST(Vfrczsd , VexRm , V(XOP_M9,83,_,0,0,_,_,_ ), 0 , 79 , 0 , 6490 , 299, 144), // #1086
+ INST(Vfrczss , VexRm , V(XOP_M9,82,_,0,0,_,_,_ ), 0 , 79 , 0 , 6498 , 300, 144), // #1087
+ INST(Vgatherdpd , VexRmvRm_VM , V(660F38,92,_,x,1,_,_,_ ), E(660F38,92,_,x,_,1,3,T1S), 189, 80 , 6506 , 301, 145), // #1088
+ INST(Vgatherdps , VexRmvRm_VM , V(660F38,92,_,x,0,_,_,_ ), E(660F38,92,_,x,_,0,2,T1S), 96 , 81 , 6517 , 302, 145), // #1089
+ INST(Vgatherpf0dpd , VexM_VM , E(660F38,C6,1,2,_,1,3,T1S), 0 , 190, 0 , 6528 , 303, 146), // #1090
+ INST(Vgatherpf0dps , VexM_VM , E(660F38,C6,1,2,_,0,2,T1S), 0 , 191, 0 , 6542 , 304, 146), // #1091
+ INST(Vgatherpf0qpd , VexM_VM , E(660F38,C7,1,2,_,1,3,T1S), 0 , 190, 0 , 6556 , 305, 146), // #1092
+ INST(Vgatherpf0qps , VexM_VM , E(660F38,C7,1,2,_,0,2,T1S), 0 , 191, 0 , 6570 , 305, 146), // #1093
+ INST(Vgatherpf1dpd , VexM_VM , E(660F38,C6,2,2,_,1,3,T1S), 0 , 192, 0 , 6584 , 303, 146), // #1094
+ INST(Vgatherpf1dps , VexM_VM , E(660F38,C6,2,2,_,0,2,T1S), 0 , 193, 0 , 6598 , 304, 146), // #1095
+ INST(Vgatherpf1qpd , VexM_VM , E(660F38,C7,2,2,_,1,3,T1S), 0 , 192, 0 , 6612 , 305, 146), // #1096
+ INST(Vgatherpf1qps , VexM_VM , E(660F38,C7,2,2,_,0,2,T1S), 0 , 193, 0 , 6626 , 305, 146), // #1097
+ INST(Vgatherqpd , VexRmvRm_VM , V(660F38,93,_,x,1,_,_,_ ), E(660F38,93,_,x,_,1,3,T1S), 189, 82 , 6640 , 306, 145), // #1098
+ INST(Vgatherqps , VexRmvRm_VM , V(660F38,93,_,x,0,_,_,_ ), E(660F38,93,_,x,_,0,2,T1S), 96 , 83 , 6651 , 307, 145), // #1099
+ INST(Vgetexppd , VexRm_Lx , E(660F38,42,_,x,_,1,4,FV ), 0 , 113, 0 , 6662 , 263, 131), // #1100
+ INST(Vgetexpph , VexRm_Lx , E(66MAP6,42,_,_,_,0,4,FV ), 0 , 183, 0 , 6672 , 265, 125), // #1101
+ INST(Vgetexpps , VexRm_Lx , E(660F38,42,_,x,_,0,4,FV ), 0 , 114, 0 , 6682 , 268, 131), // #1102
+ INST(Vgetexpsd , VexRvm , E(660F38,43,_,I,_,1,3,T1S), 0 , 128, 0 , 6692 , 308, 68 ), // #1103
+ INST(Vgetexpsh , VexRvm , E(66MAP6,43,_,_,_,0,1,T1S), 0 , 185, 0 , 6702 , 254, 127), // #1104
+ INST(Vgetexpss , VexRvm , E(660F38,43,_,I,_,0,2,T1S), 0 , 129, 0 , 6712 , 309, 68 ), // #1105
+ INST(Vgetmantpd , VexRmi_Lx , E(660F3A,26,_,x,_,1,4,FV ), 0 , 112, 0 , 6722 , 310, 131), // #1106
+ INST(Vgetmantph , VexRmi_Lx , E(000F3A,26,_,_,_,0,4,FV ), 0 , 123, 0 , 6733 , 311, 125), // #1107
+ INST(Vgetmantps , VexRmi_Lx , E(660F3A,26,_,x,_,0,4,FV ), 0 , 111, 0 , 6744 , 312, 131), // #1108
+ INST(Vgetmantsd , VexRvmi , E(660F3A,27,_,I,_,1,3,T1S), 0 , 180, 0 , 6755 , 287, 68 ), // #1109
+ INST(Vgetmantsh , VexRvmi , E(000F3A,27,_,_,_,0,1,T1S), 0 , 188, 0 , 6766 , 313, 127), // #1110
+ INST(Vgetmantss , VexRvmi , E(660F3A,27,_,I,_,0,2,T1S), 0 , 181, 0 , 6777 , 288, 68 ), // #1111
+ INST(Vgf2p8affineinvqb, VexRvmi_Lx , V(660F3A,CF,_,x,1,1,4,FV ), 0 , 194, 0 , 6788 , 314, 147), // #1112
+ INST(Vgf2p8affineqb , VexRvmi_Lx , V(660F3A,CE,_,x,1,1,4,FV ), 0 , 194, 0 , 6806 , 314, 147), // #1113
+ INST(Vgf2p8mulb , VexRvm_Lx , V(660F38,CF,_,x,0,0,4,FV ), 0 , 110, 0 , 6821 , 315, 147), // #1114
+ INST(Vhaddpd , VexRvm_Lx , V(660F00,7C,_,x,I,_,_,_ ), 0 , 69 , 0 , 6832 , 202, 128), // #1115
+ INST(Vhaddps , VexRvm_Lx , V(F20F00,7C,_,x,I,_,_,_ ), 0 , 109, 0 , 6840 , 202, 128), // #1116
+ INST(Vhsubpd , VexRvm_Lx , V(660F00,7D,_,x,I,_,_,_ ), 0 , 69 , 0 , 6848 , 202, 128), // #1117
+ INST(Vhsubps , VexRvm_Lx , V(F20F00,7D,_,x,I,_,_,_ ), 0 , 109, 0 , 6856 , 202, 128), // #1118
+ INST(Vinsertf128 , VexRvmi , V(660F3A,18,_,1,0,_,_,_ ), 0 , 172, 0 , 6864 , 316, 128), // #1119
+ INST(Vinsertf32x4 , VexRvmi_Lx , E(660F3A,18,_,x,_,0,4,T4 ), 0 , 173, 0 , 6876 , 317, 131), // #1120
+ INST(Vinsertf32x8 , VexRvmi , E(660F3A,1A,_,2,_,0,5,T8 ), 0 , 174, 0 , 6889 , 318, 66 ), // #1121
+ INST(Vinsertf64x2 , VexRvmi_Lx , E(660F3A,18,_,x,_,1,4,T2 ), 0 , 175, 0 , 6902 , 317, 133), // #1122
+ INST(Vinsertf64x4 , VexRvmi , E(660F3A,1A,_,2,_,1,5,T4 ), 0 , 176, 0 , 6915 , 318, 68 ), // #1123
+ INST(Vinserti128 , VexRvmi , V(660F3A,38,_,1,0,_,_,_ ), 0 , 172, 0 , 6928 , 316, 134), // #1124
+ INST(Vinserti32x4 , VexRvmi_Lx , E(660F3A,38,_,x,_,0,4,T4 ), 0 , 173, 0 , 6940 , 317, 131), // #1125
+ INST(Vinserti32x8 , VexRvmi , E(660F3A,3A,_,2,_,0,5,T8 ), 0 , 174, 0 , 6953 , 318, 66 ), // #1126
+ INST(Vinserti64x2 , VexRvmi_Lx , E(660F3A,38,_,x,_,1,4,T2 ), 0 , 175, 0 , 6966 , 317, 133), // #1127
+ INST(Vinserti64x4 , VexRvmi , E(660F3A,3A,_,2,_,1,5,T4 ), 0 , 176, 0 , 6979 , 318, 68 ), // #1128
+ INST(Vinsertps , VexRvmi , V(660F3A,21,_,0,I,0,2,T1S), 0 , 177, 0 , 6992 , 319, 126), // #1129
+ INST(Vlddqu , VexRm_Lx , V(F20F00,F0,_,x,I,_,_,_ ), 0 , 109, 0 , 7002 , 320, 128), // #1130
+ INST(Vldmxcsr , VexM , V(000F00,AE,2,0,I,_,_,_ ), 0 , 195, 0 , 7009 , 321, 128), // #1131
+ INST(Vmaskmovdqu , VexRm_ZDI , V(660F00,F7,_,0,I,_,_,_ ), 0 , 69 , 0 , 7018 , 322, 128), // #1132
+ INST(Vmaskmovpd , VexRvmMvr_Lx , V(660F38,2D,_,x,0,_,_,_ ), V(660F38,2F,_,x,0,_,_,_ ), 96 , 84 , 7030 , 323, 128), // #1133
+ INST(Vmaskmovps , VexRvmMvr_Lx , V(660F38,2C,_,x,0,_,_,_ ), V(660F38,2E,_,x,0,_,_,_ ), 96 , 85 , 7041 , 323, 128), // #1134
+ INST(Vmaxpd , VexRvm_Lx , V(660F00,5F,_,x,I,1,4,FV ), 0 , 103, 0 , 7052 , 324, 124), // #1135
+ INST(Vmaxph , VexRvm_Lx , E(00MAP5,5F,_,_,_,0,4,FV ), 0 , 104, 0 , 7059 , 325, 125), // #1136
+ INST(Vmaxps , VexRvm_Lx , V(000F00,5F,_,x,I,0,4,FV ), 0 , 105, 0 , 7066 , 326, 124), // #1137
+ INST(Vmaxsd , VexRvm , V(F20F00,5F,_,I,I,1,3,T1S), 0 , 106, 0 , 7073 , 327, 124), // #1138
+ INST(Vmaxsh , VexRvm , E(F3MAP5,5F,_,_,_,0,1,T1S), 0 , 107, 0 , 7080 , 254, 127), // #1139
+ INST(Vmaxss , VexRvm , V(F30F00,5F,_,I,I,0,2,T1S), 0 , 108, 0 , 7087 , 258, 124), // #1140
+ INST(Vmcall , X86Op , O(000F01,C1,_,_,_,_,_,_ ), 0 , 21 , 0 , 7094 , 30 , 58 ), // #1141
+ INST(Vmclear , X86M_Only , O(660F00,C7,6,_,_,_,_,_ ), 0 , 26 , 0 , 7101 , 32 , 58 ), // #1142
+ INST(Vmfunc , X86Op , O(000F01,D4,_,_,_,_,_,_ ), 0 , 21 , 0 , 7109 , 30 , 58 ), // #1143
+ INST(Vminpd , VexRvm_Lx , V(660F00,5D,_,x,I,1,4,FV ), 0 , 103, 0 , 7116 , 324, 124), // #1144
+ INST(Vminph , VexRvm_Lx , E(00MAP5,5D,_,_,_,0,4,FV ), 0 , 104, 0 , 7123 , 325, 125), // #1145
+ INST(Vminps , VexRvm_Lx , V(000F00,5D,_,x,I,0,4,FV ), 0 , 105, 0 , 7130 , 326, 124), // #1146
+ INST(Vminsd , VexRvm , V(F20F00,5D,_,I,I,1,3,T1S), 0 , 106, 0 , 7137 , 327, 124), // #1147
+ INST(Vminsh , VexRvm , E(F3MAP5,5D,_,_,_,0,1,T1S), 0 , 107, 0 , 7144 , 254, 127), // #1148
+ INST(Vminss , VexRvm , V(F30F00,5D,_,I,I,0,2,T1S), 0 , 108, 0 , 7151 , 258, 124), // #1149
+ INST(Vmlaunch , X86Op , O(000F01,C2,_,_,_,_,_,_ ), 0 , 21 , 0 , 7158 , 30 , 58 ), // #1150
+ INST(Vmload , X86Op_xAX , O(000F01,DA,_,_,_,_,_,_ ), 0 , 21 , 0 , 7167 , 328, 22 ), // #1151
+ INST(Vmmcall , X86Op , O(000F01,D9,_,_,_,_,_,_ ), 0 , 21 , 0 , 7174 , 30 , 22 ), // #1152
+ INST(Vmovapd , VexRmMr_Lx , V(660F00,28,_,x,I,1,4,FVM), V(660F00,29,_,x,I,1,4,FVM), 103, 86 , 7182 , 329, 124), // #1153
+ INST(Vmovaps , VexRmMr_Lx , V(000F00,28,_,x,I,0,4,FVM), V(000F00,29,_,x,I,0,4,FVM), 105, 87 , 7190 , 329, 124), // #1154
+ INST(Vmovd , VexMovdMovq , V(660F00,6E,_,0,0,0,2,T1S), V(660F00,7E,_,0,0,0,2,T1S), 196, 88 , 7198 , 330, 126), // #1155
+ INST(Vmovddup , VexRm_Lx , V(F20F00,12,_,x,I,1,3,DUP), 0 , 197, 0 , 7204 , 331, 124), // #1156
+ INST(Vmovdqa , VexRmMr_Lx , V(660F00,6F,_,x,I,_,_,_ ), V(660F00,7F,_,x,I,_,_,_ ), 69 , 89 , 7213 , 332, 128), // #1157
+ INST(Vmovdqa32 , VexRmMr_Lx , E(660F00,6F,_,x,_,0,4,FVM), E(660F00,7F,_,x,_,0,4,FVM), 198, 90 , 7221 , 333, 131), // #1158
+ INST(Vmovdqa64 , VexRmMr_Lx , E(660F00,6F,_,x,_,1,4,FVM), E(660F00,7F,_,x,_,1,4,FVM), 135, 91 , 7231 , 333, 131), // #1159
+ INST(Vmovdqu , VexRmMr_Lx , V(F30F00,6F,_,x,I,_,_,_ ), V(F30F00,7F,_,x,I,_,_,_ ), 199, 92 , 7241 , 332, 128), // #1160
+ INST(Vmovdqu16 , VexRmMr_Lx , E(F20F00,6F,_,x,_,1,4,FVM), E(F20F00,7F,_,x,_,1,4,FVM), 166, 93 , 7249 , 333, 139), // #1161
+ INST(Vmovdqu32 , VexRmMr_Lx , E(F30F00,6F,_,x,_,0,4,FVM), E(F30F00,7F,_,x,_,0,4,FVM), 200, 94 , 7259 , 333, 131), // #1162
+ INST(Vmovdqu64 , VexRmMr_Lx , E(F30F00,6F,_,x,_,1,4,FVM), E(F30F00,7F,_,x,_,1,4,FVM), 149, 95 , 7269 , 333, 131), // #1163
+ INST(Vmovdqu8 , VexRmMr_Lx , E(F20F00,6F,_,x,_,0,4,FVM), E(F20F00,7F,_,x,_,0,4,FVM), 164, 96 , 7279 , 333, 139), // #1164
+ INST(Vmovhlps , VexRvm , V(000F00,12,_,0,I,0,_,_ ), 0 , 72 , 0 , 7288 , 334, 126), // #1165
+ INST(Vmovhpd , VexRvmMr , V(660F00,16,_,0,I,1,3,T1S), V(660F00,17,_,0,I,1,3,T1S), 125, 97 , 7297 , 335, 126), // #1166
+ INST(Vmovhps , VexRvmMr , V(000F00,16,_,0,I,0,3,T2 ), V(000F00,17,_,0,I,0,3,T2 ), 201, 98 , 7305 , 335, 126), // #1167
+ INST(Vmovlhps , VexRvm , V(000F00,16,_,0,I,0,_,_ ), 0 , 72 , 0 , 7313 , 334, 126), // #1168
+ INST(Vmovlpd , VexRvmMr , V(660F00,12,_,0,I,1,3,T1S), V(660F00,13,_,0,I,1,3,T1S), 125, 99 , 7322 , 335, 126), // #1169
+ INST(Vmovlps , VexRvmMr , V(000F00,12,_,0,I,0,3,T2 ), V(000F00,13,_,0,I,0,3,T2 ), 201, 100, 7330 , 335, 126), // #1170
+ INST(Vmovmskpd , VexRm_Lx , V(660F00,50,_,x,I,_,_,_ ), 0 , 69 , 0 , 7338 , 336, 128), // #1171
+ INST(Vmovmskps , VexRm_Lx , V(000F00,50,_,x,I,_,_,_ ), 0 , 72 , 0 , 7348 , 336, 128), // #1172
+ INST(Vmovntdq , VexMr_Lx , V(660F00,E7,_,x,I,0,4,FVM), 0 , 144, 0 , 7358 , 337, 124), // #1173
+ INST(Vmovntdqa , VexRm_Lx , V(660F38,2A,_,x,I,0,4,FVM), 0 , 110, 0 , 7367 , 338, 135), // #1174
+ INST(Vmovntpd , VexMr_Lx , V(660F00,2B,_,x,I,1,4,FVM), 0 , 103, 0 , 7377 , 337, 124), // #1175
+ INST(Vmovntps , VexMr_Lx , V(000F00,2B,_,x,I,0,4,FVM), 0 , 105, 0 , 7386 , 337, 124), // #1176
+ INST(Vmovq , VexMovdMovq , V(660F00,6E,_,0,I,1,3,T1S), V(660F00,7E,_,0,I,1,3,T1S), 125, 101, 7395 , 339, 126), // #1177
+ INST(Vmovsd , VexMovssMovsd , V(F20F00,10,_,I,I,1,3,T1S), V(F20F00,11,_,I,I,1,3,T1S), 106, 102, 7401 , 340, 126), // #1178
+ INST(Vmovsh , VexMovssMovsd , E(F3MAP5,10,_,I,_,0,1,T1S), E(F3MAP5,11,_,I,_,0,1,T1S), 107, 103, 7408 , 341, 127), // #1179
+ INST(Vmovshdup , VexRm_Lx , V(F30F00,16,_,x,I,0,4,FVM), 0 , 161, 0 , 7415 , 342, 124), // #1180
+ INST(Vmovsldup , VexRm_Lx , V(F30F00,12,_,x,I,0,4,FVM), 0 , 161, 0 , 7425 , 342, 124), // #1181
+ INST(Vmovss , VexMovssMovsd , V(F30F00,10,_,I,I,0,2,T1S), V(F30F00,11,_,I,I,0,2,T1S), 108, 104, 7435 , 343, 126), // #1182
+ INST(Vmovupd , VexRmMr_Lx , V(660F00,10,_,x,I,1,4,FVM), V(660F00,11,_,x,I,1,4,FVM), 103, 105, 7442 , 329, 124), // #1183
+ INST(Vmovups , VexRmMr_Lx , V(000F00,10,_,x,I,0,4,FVM), V(000F00,11,_,x,I,0,4,FVM), 105, 106, 7450 , 329, 124), // #1184
+ INST(Vmovw , VexMovdMovq , E(66MAP5,6E,_,0,_,I,1,T1S), E(66MAP5,7E,_,0,_,I,1,T1S), 202, 107, 7458 , 344, 127), // #1185
+ INST(Vmpsadbw , VexRvmi_Lx , V(660F3A,42,_,x,I,_,_,_ ), 0 , 73 , 0 , 7464 , 214, 148), // #1186
+ INST(Vmptrld , X86M_Only , O(000F00,C7,6,_,_,_,_,_ ), 0 , 80 , 0 , 7473 , 32 , 58 ), // #1187
+ INST(Vmptrst , X86M_Only , O(000F00,C7,7,_,_,_,_,_ ), 0 , 22 , 0 , 7481 , 32 , 58 ), // #1188
+ INST(Vmread , X86Mr_NoSize , O(000F00,78,_,_,_,_,_,_ ), 0 , 4 , 0 , 7489 , 345, 58 ), // #1189
+ INST(Vmresume , X86Op , O(000F01,C3,_,_,_,_,_,_ ), 0 , 21 , 0 , 7496 , 30 , 58 ), // #1190
+ INST(Vmrun , X86Op_xAX , O(000F01,D8,_,_,_,_,_,_ ), 0 , 21 , 0 , 7505 , 328, 22 ), // #1191
+ INST(Vmsave , X86Op_xAX , O(000F01,DB,_,_,_,_,_,_ ), 0 , 21 , 0 , 7511 , 328, 22 ), // #1192
+ INST(Vmulpd , VexRvm_Lx , V(660F00,59,_,x,I,1,4,FV ), 0 , 103, 0 , 7518 , 196, 124), // #1193
+ INST(Vmulph , VexRvm_Lx , E(00MAP5,59,_,_,_,0,4,FV ), 0 , 104, 0 , 7525 , 197, 125), // #1194
+ INST(Vmulps , VexRvm_Lx , V(000F00,59,_,x,I,0,4,FV ), 0 , 105, 0 , 7532 , 198, 124), // #1195
+ INST(Vmulsd , VexRvm , V(F20F00,59,_,I,I,1,3,T1S), 0 , 106, 0 , 7539 , 199, 126), // #1196
+ INST(Vmulsh , VexRvm , E(F3MAP5,59,_,_,_,0,1,T1S), 0 , 107, 0 , 7546 , 200, 127), // #1197
+ INST(Vmulss , VexRvm , V(F30F00,59,_,I,I,0,2,T1S), 0 , 108, 0 , 7553 , 201, 126), // #1198
+ INST(Vmwrite , X86Rm_NoSize , O(000F00,79,_,_,_,_,_,_ ), 0 , 4 , 0 , 7560 , 346, 58 ), // #1199
+ INST(Vmxon , X86M_Only , O(F30F00,C7,6,_,_,_,_,_ ), 0 , 24 , 0 , 7568 , 32 , 58 ), // #1200
+ INST(Vorpd , VexRvm_Lx , V(660F00,56,_,x,I,1,4,FV ), 0 , 103, 0 , 7574 , 210, 132), // #1201
+ INST(Vorps , VexRvm_Lx , V(000F00,56,_,x,I,0,4,FV ), 0 , 105, 0 , 7580 , 211, 132), // #1202
+ INST(Vp2intersectd , VexRvm_Lx_2xK , E(F20F38,68,_,_,_,0,4,FV ), 0 , 131, 0 , 7586 , 347, 149), // #1203
+ INST(Vp2intersectq , VexRvm_Lx_2xK , E(F20F38,68,_,_,_,1,4,FV ), 0 , 203, 0 , 7600 , 348, 149), // #1204
+ INST(Vp4dpwssd , VexRm_T1_4X , E(F20F38,52,_,2,_,0,4,T4X), 0 , 101, 0 , 7614 , 194, 150), // #1205
+ INST(Vp4dpwssds , VexRm_T1_4X , E(F20F38,53,_,2,_,0,4,T4X), 0 , 101, 0 , 7624 , 194, 150), // #1206
+ INST(Vpabsb , VexRm_Lx , V(660F38,1C,_,x,I,_,4,FVM), 0 , 110, 0 , 7635 , 342, 151), // #1207
+ INST(Vpabsd , VexRm_Lx , V(660F38,1E,_,x,I,0,4,FV ), 0 , 110, 0 , 7642 , 349, 135), // #1208
+ INST(Vpabsq , VexRm_Lx , E(660F38,1F,_,x,_,1,4,FV ), 0 , 113, 0 , 7649 , 350, 131), // #1209
+ INST(Vpabsw , VexRm_Lx , V(660F38,1D,_,x,I,_,4,FVM), 0 , 110, 0 , 7656 , 342, 151), // #1210
+ INST(Vpackssdw , VexRvm_Lx , V(660F00,6B,_,x,I,0,4,FV ), 0 , 144, 0 , 7663 , 209, 151), // #1211
+ INST(Vpacksswb , VexRvm_Lx , V(660F00,63,_,x,I,I,4,FVM), 0 , 144, 0 , 7673 , 315, 151), // #1212
+ INST(Vpackusdw , VexRvm_Lx , V(660F38,2B,_,x,I,0,4,FV ), 0 , 110, 0 , 7683 , 209, 151), // #1213
+ INST(Vpackuswb , VexRvm_Lx , V(660F00,67,_,x,I,I,4,FVM), 0 , 144, 0 , 7693 , 315, 151), // #1214
+ INST(Vpaddb , VexRvm_Lx , V(660F00,FC,_,x,I,I,4,FVM), 0 , 144, 0 , 7703 , 315, 151), // #1215
+ INST(Vpaddd , VexRvm_Lx , V(660F00,FE,_,x,I,0,4,FV ), 0 , 144, 0 , 7710 , 209, 135), // #1216
+ INST(Vpaddq , VexRvm_Lx , V(660F00,D4,_,x,I,1,4,FV ), 0 , 103, 0 , 7717 , 208, 135), // #1217
+ INST(Vpaddsb , VexRvm_Lx , V(660F00,EC,_,x,I,I,4,FVM), 0 , 144, 0 , 7724 , 315, 151), // #1218
+ INST(Vpaddsw , VexRvm_Lx , V(660F00,ED,_,x,I,I,4,FVM), 0 , 144, 0 , 7732 , 315, 151), // #1219
+ INST(Vpaddusb , VexRvm_Lx , V(660F00,DC,_,x,I,I,4,FVM), 0 , 144, 0 , 7740 , 315, 151), // #1220
+ INST(Vpaddusw , VexRvm_Lx , V(660F00,DD,_,x,I,I,4,FVM), 0 , 144, 0 , 7749 , 315, 151), // #1221
+ INST(Vpaddw , VexRvm_Lx , V(660F00,FD,_,x,I,I,4,FVM), 0 , 144, 0 , 7758 , 315, 151), // #1222
+ INST(Vpalignr , VexRvmi_Lx , V(660F3A,0F,_,x,I,I,4,FVM), 0 , 204, 0 , 7765 , 314, 151), // #1223
+ INST(Vpand , VexRvm_Lx , V(660F00,DB,_,x,I,_,_,_ ), 0 , 69 , 0 , 7774 , 351, 148), // #1224
+ INST(Vpandd , VexRvm_Lx , E(660F00,DB,_,x,_,0,4,FV ), 0 , 198, 0 , 7780 , 352, 131), // #1225
+ INST(Vpandn , VexRvm_Lx , V(660F00,DF,_,x,I,_,_,_ ), 0 , 69 , 0 , 7787 , 353, 148), // #1226
+ INST(Vpandnd , VexRvm_Lx , E(660F00,DF,_,x,_,0,4,FV ), 0 , 198, 0 , 7794 , 354, 131), // #1227
+ INST(Vpandnq , VexRvm_Lx , E(660F00,DF,_,x,_,1,4,FV ), 0 , 135, 0 , 7802 , 355, 131), // #1228
+ INST(Vpandq , VexRvm_Lx , E(660F00,DB,_,x,_,1,4,FV ), 0 , 135, 0 , 7810 , 356, 131), // #1229
+ INST(Vpavgb , VexRvm_Lx , V(660F00,E0,_,x,I,I,4,FVM), 0 , 144, 0 , 7817 , 315, 151), // #1230
+ INST(Vpavgw , VexRvm_Lx , V(660F00,E3,_,x,I,I,4,FVM), 0 , 144, 0 , 7824 , 315, 151), // #1231
+ INST(Vpblendd , VexRvmi_Lx , V(660F3A,02,_,x,0,_,_,_ ), 0 , 73 , 0 , 7831 , 214, 134), // #1232
+ INST(Vpblendmb , VexRvm_Lx , E(660F38,66,_,x,_,0,4,FVM), 0 , 114, 0 , 7840 , 357, 139), // #1233
+ INST(Vpblendmd , VexRvm_Lx , E(660F38,64,_,x,_,0,4,FV ), 0 , 114, 0 , 7850 , 213, 131), // #1234
+ INST(Vpblendmq , VexRvm_Lx , E(660F38,64,_,x,_,1,4,FV ), 0 , 113, 0 , 7860 , 212, 131), // #1235
+ INST(Vpblendmw , VexRvm_Lx , E(660F38,66,_,x,_,1,4,FVM), 0 , 113, 0 , 7870 , 357, 139), // #1236
+ INST(Vpblendvb , VexRvmr_Lx , V(660F3A,4C,_,x,0,_,_,_ ), 0 , 73 , 0 , 7880 , 215, 148), // #1237
+ INST(Vpblendw , VexRvmi_Lx , V(660F3A,0E,_,x,I,_,_,_ ), 0 , 73 , 0 , 7890 , 214, 148), // #1238
+ INST(Vpbroadcastb , VexRm_Lx_Bcst , V(660F38,78,_,x,0,0,0,T1S), E(660F38,7A,_,x,0,0,0,T1S), 96 , 108, 7899 , 358, 152), // #1239
+ INST(Vpbroadcastd , VexRm_Lx_Bcst , V(660F38,58,_,x,0,0,2,T1S), E(660F38,7C,_,x,0,0,0,T1S), 122, 109, 7912 , 359, 145), // #1240
+ INST(Vpbroadcastmb2q , VexRm_Lx , E(F30F38,2A,_,x,_,1,_,_ ), 0 , 205, 0 , 7925 , 360, 153), // #1241
+ INST(Vpbroadcastmw2d , VexRm_Lx , E(F30F38,3A,_,x,_,0,_,_ ), 0 , 206, 0 , 7941 , 360, 153), // #1242
+ INST(Vpbroadcastq , VexRm_Lx_Bcst , V(660F38,59,_,x,0,1,3,T1S), E(660F38,7C,_,x,0,1,0,T1S), 121, 110, 7957 , 361, 145), // #1243
+ INST(Vpbroadcastw , VexRm_Lx_Bcst , V(660F38,79,_,x,0,0,1,T1S), E(660F38,7B,_,x,0,0,0,T1S), 207, 111, 7970 , 362, 152), // #1244
+ INST(Vpclmulqdq , VexRvmi_Lx , V(660F3A,44,_,x,I,_,4,FVM), 0 , 204, 0 , 7983 , 363, 154), // #1245
+ INST(Vpcmov , VexRvrmRvmr_Lx , V(XOP_M8,A2,_,x,x,_,_,_ ), 0 , 208, 0 , 7994 , 289, 144), // #1246
+ INST(Vpcmpb , VexRvmi_Lx , E(660F3A,3F,_,x,_,0,4,FVM), 0 , 111, 0 , 8001 , 364, 139), // #1247
+ INST(Vpcmpd , VexRvmi_Lx , E(660F3A,1F,_,x,_,0,4,FV ), 0 , 111, 0 , 8008 , 365, 131), // #1248
+ INST(Vpcmpeqb , VexRvm_Lx_KEvex , V(660F00,74,_,x,I,I,4,FV ), 0 , 144, 0 , 8015 , 366, 151), // #1249
+ INST(Vpcmpeqd , VexRvm_Lx_KEvex , V(660F00,76,_,x,I,0,4,FVM), 0 , 144, 0 , 8024 , 367, 135), // #1250
+ INST(Vpcmpeqq , VexRvm_Lx_KEvex , V(660F38,29,_,x,I,1,4,FVM), 0 , 209, 0 , 8033 , 368, 135), // #1251
+ INST(Vpcmpeqw , VexRvm_Lx_KEvex , V(660F00,75,_,x,I,I,4,FV ), 0 , 144, 0 , 8042 , 366, 151), // #1252
+ INST(Vpcmpestri , VexRmi , V(660F3A,61,_,0,I,_,_,_ ), 0 , 73 , 0 , 8051 , 369, 155), // #1253
+ INST(Vpcmpestrm , VexRmi , V(660F3A,60,_,0,I,_,_,_ ), 0 , 73 , 0 , 8062 , 370, 155), // #1254
+ INST(Vpcmpgtb , VexRvm_Lx_KEvex , V(660F00,64,_,x,I,I,4,FV ), 0 , 144, 0 , 8073 , 366, 151), // #1255
+ INST(Vpcmpgtd , VexRvm_Lx_KEvex , V(660F00,66,_,x,I,0,4,FVM), 0 , 144, 0 , 8082 , 367, 135), // #1256
+ INST(Vpcmpgtq , VexRvm_Lx_KEvex , V(660F38,37,_,x,I,1,4,FVM), 0 , 209, 0 , 8091 , 368, 135), // #1257
+ INST(Vpcmpgtw , VexRvm_Lx_KEvex , V(660F00,65,_,x,I,I,4,FV ), 0 , 144, 0 , 8100 , 366, 151), // #1258
+ INST(Vpcmpistri , VexRmi , V(660F3A,63,_,0,I,_,_,_ ), 0 , 73 , 0 , 8109 , 371, 155), // #1259
+ INST(Vpcmpistrm , VexRmi , V(660F3A,62,_,0,I,_,_,_ ), 0 , 73 , 0 , 8120 , 372, 155), // #1260
+ INST(Vpcmpq , VexRvmi_Lx , E(660F3A,1F,_,x,_,1,4,FV ), 0 , 112, 0 , 8131 , 373, 131), // #1261
+ INST(Vpcmpub , VexRvmi_Lx , E(660F3A,3E,_,x,_,0,4,FVM), 0 , 111, 0 , 8138 , 364, 139), // #1262
+ INST(Vpcmpud , VexRvmi_Lx , E(660F3A,1E,_,x,_,0,4,FV ), 0 , 111, 0 , 8146 , 365, 131), // #1263
+ INST(Vpcmpuq , VexRvmi_Lx , E(660F3A,1E,_,x,_,1,4,FV ), 0 , 112, 0 , 8154 , 373, 131), // #1264
+ INST(Vpcmpuw , VexRvmi_Lx , E(660F3A,3E,_,x,_,1,4,FVM), 0 , 112, 0 , 8162 , 373, 139), // #1265
+ INST(Vpcmpw , VexRvmi_Lx , E(660F3A,3F,_,x,_,1,4,FVM), 0 , 112, 0 , 8170 , 373, 139), // #1266
+ INST(Vpcomb , VexRvmi , V(XOP_M8,CC,_,0,0,_,_,_ ), 0 , 208, 0 , 8177 , 276, 144), // #1267
+ INST(Vpcomd , VexRvmi , V(XOP_M8,CE,_,0,0,_,_,_ ), 0 , 208, 0 , 8184 , 276, 144), // #1268
+ INST(Vpcompressb , VexMr_Lx , E(660F38,63,_,x,_,0,0,T1S), 0 , 210, 0 , 8191 , 232, 156), // #1269
+ INST(Vpcompressd , VexMr_Lx , E(660F38,8B,_,x,_,0,2,T1S), 0 , 129, 0 , 8203 , 232, 131), // #1270
+ INST(Vpcompressq , VexMr_Lx , E(660F38,8B,_,x,_,1,3,T1S), 0 , 128, 0 , 8215 , 232, 131), // #1271
+ INST(Vpcompressw , VexMr_Lx , E(660F38,63,_,x,_,1,1,T1S), 0 , 211, 0 , 8227 , 232, 156), // #1272
+ INST(Vpcomq , VexRvmi , V(XOP_M8,CF,_,0,0,_,_,_ ), 0 , 208, 0 , 8239 , 276, 144), // #1273
+ INST(Vpcomub , VexRvmi , V(XOP_M8,EC,_,0,0,_,_,_ ), 0 , 208, 0 , 8246 , 276, 144), // #1274
+ INST(Vpcomud , VexRvmi , V(XOP_M8,EE,_,0,0,_,_,_ ), 0 , 208, 0 , 8254 , 276, 144), // #1275
+ INST(Vpcomuq , VexRvmi , V(XOP_M8,EF,_,0,0,_,_,_ ), 0 , 208, 0 , 8262 , 276, 144), // #1276
+ INST(Vpcomuw , VexRvmi , V(XOP_M8,ED,_,0,0,_,_,_ ), 0 , 208, 0 , 8270 , 276, 144), // #1277
+ INST(Vpcomw , VexRvmi , V(XOP_M8,CD,_,0,0,_,_,_ ), 0 , 208, 0 , 8278 , 276, 144), // #1278
+ INST(Vpconflictd , VexRm_Lx , E(660F38,C4,_,x,_,0,4,FV ), 0 , 114, 0 , 8285 , 374, 153), // #1279
+ INST(Vpconflictq , VexRm_Lx , E(660F38,C4,_,x,_,1,4,FV ), 0 , 113, 0 , 8297 , 374, 153), // #1280
+ INST(Vpdpbusd , VexRvm_Lx , V(660F38,50,_,x,_,0,4,FV ), 0 , 110, 0 , 8309 , 375, 157), // #1281
+ INST(Vpdpbusds , VexRvm_Lx , V(660F38,51,_,x,_,0,4,FV ), 0 , 110, 0 , 8318 , 375, 157), // #1282
+ INST(Vpdpwssd , VexRvm_Lx , V(660F38,52,_,x,_,0,4,FV ), 0 , 110, 0 , 8328 , 375, 157), // #1283
+ INST(Vpdpwssds , VexRvm_Lx , V(660F38,53,_,x,_,0,4,FV ), 0 , 110, 0 , 8337 , 375, 157), // #1284
+ INST(Vperm2f128 , VexRvmi , V(660F3A,06,_,1,0,_,_,_ ), 0 , 172, 0 , 8347 , 376, 128), // #1285
+ INST(Vperm2i128 , VexRvmi , V(660F3A,46,_,1,0,_,_,_ ), 0 , 172, 0 , 8358 , 376, 134), // #1286
+ INST(Vpermb , VexRvm_Lx , E(660F38,8D,_,x,_,0,4,FVM), 0 , 114, 0 , 8369 , 357, 158), // #1287
+ INST(Vpermd , VexRvm_Lx , V(660F38,36,_,x,0,0,4,FV ), 0 , 110, 0 , 8376 , 377, 145), // #1288
+ INST(Vpermi2b , VexRvm_Lx , E(660F38,75,_,x,_,0,4,FVM), 0 , 114, 0 , 8383 , 357, 158), // #1289
+ INST(Vpermi2d , VexRvm_Lx , E(660F38,76,_,x,_,0,4,FV ), 0 , 114, 0 , 8392 , 213, 131), // #1290
+ INST(Vpermi2pd , VexRvm_Lx , E(660F38,77,_,x,_,1,4,FV ), 0 , 113, 0 , 8401 , 212, 131), // #1291
+ INST(Vpermi2ps , VexRvm_Lx , E(660F38,77,_,x,_,0,4,FV ), 0 , 114, 0 , 8411 , 213, 131), // #1292
+ INST(Vpermi2q , VexRvm_Lx , E(660F38,76,_,x,_,1,4,FV ), 0 , 113, 0 , 8421 , 212, 131), // #1293
+ INST(Vpermi2w , VexRvm_Lx , E(660F38,75,_,x,_,1,4,FVM), 0 , 113, 0 , 8430 , 357, 139), // #1294
+ INST(Vpermil2pd , VexRvrmiRvmri_Lx , V(660F3A,49,_,x,x,_,_,_ ), 0 , 73 , 0 , 8439 , 378, 144), // #1295
+ INST(Vpermil2ps , VexRvrmiRvmri_Lx , V(660F3A,48,_,x,x,_,_,_ ), 0 , 73 , 0 , 8450 , 378, 144), // #1296
+ INST(Vpermilpd , VexRvmRmi_Lx , V(660F38,0D,_,x,0,1,4,FV ), V(660F3A,05,_,x,0,1,4,FV ), 209, 112, 8461 , 379, 124), // #1297
+ INST(Vpermilps , VexRvmRmi_Lx , V(660F38,0C,_,x,0,0,4,FV ), V(660F3A,04,_,x,0,0,4,FV ), 110, 113, 8471 , 380, 124), // #1298
+ INST(Vpermpd , VexRvmRmi_Lx , E(660F38,16,_,x,1,1,4,FV ), V(660F3A,01,_,x,1,1,4,FV ), 212, 114, 8481 , 381, 145), // #1299
+ INST(Vpermps , VexRvm_Lx , V(660F38,16,_,x,0,0,4,FV ), 0 , 110, 0 , 8489 , 377, 145), // #1300
+ INST(Vpermq , VexRvmRmi_Lx , E(660F38,36,_,x,_,1,4,FV ), V(660F3A,00,_,x,1,1,4,FV ), 113, 115, 8497 , 381, 145), // #1301
+ INST(Vpermt2b , VexRvm_Lx , E(660F38,7D,_,x,_,0,4,FVM), 0 , 114, 0 , 8504 , 357, 158), // #1302
+ INST(Vpermt2d , VexRvm_Lx , E(660F38,7E,_,x,_,0,4,FV ), 0 , 114, 0 , 8513 , 213, 131), // #1303
+ INST(Vpermt2pd , VexRvm_Lx , E(660F38,7F,_,x,_,1,4,FV ), 0 , 113, 0 , 8522 , 212, 131), // #1304
+ INST(Vpermt2ps , VexRvm_Lx , E(660F38,7F,_,x,_,0,4,FV ), 0 , 114, 0 , 8532 , 213, 131), // #1305
+ INST(Vpermt2q , VexRvm_Lx , E(660F38,7E,_,x,_,1,4,FV ), 0 , 113, 0 , 8542 , 212, 131), // #1306
+ INST(Vpermt2w , VexRvm_Lx , E(660F38,7D,_,x,_,1,4,FVM), 0 , 113, 0 , 8551 , 357, 139), // #1307
+ INST(Vpermw , VexRvm_Lx , E(660F38,8D,_,x,_,1,4,FVM), 0 , 113, 0 , 8560 , 357, 139), // #1308
+ INST(Vpexpandb , VexRm_Lx , E(660F38,62,_,x,_,0,0,T1S), 0 , 210, 0 , 8567 , 279, 156), // #1309
+ INST(Vpexpandd , VexRm_Lx , E(660F38,89,_,x,_,0,2,T1S), 0 , 129, 0 , 8577 , 279, 131), // #1310
+ INST(Vpexpandq , VexRm_Lx , E(660F38,89,_,x,_,1,3,T1S), 0 , 128, 0 , 8587 , 279, 131), // #1311
+ INST(Vpexpandw , VexRm_Lx , E(660F38,62,_,x,_,1,1,T1S), 0 , 211, 0 , 8597 , 279, 156), // #1312
+ INST(Vpextrb , VexMri , V(660F3A,14,_,0,0,I,0,T1S), 0 , 73 , 0 , 8607 , 382, 159), // #1313
+ INST(Vpextrd , VexMri , V(660F3A,16,_,0,0,0,2,T1S), 0 , 177, 0 , 8615 , 283, 160), // #1314
+ INST(Vpextrq , VexMri , V(660F3A,16,_,0,1,1,3,T1S), 0 , 213, 0 , 8623 , 383, 160), // #1315
+ INST(Vpextrw , VexMri_Vpextrw , V(660F3A,15,_,0,0,I,1,T1S), 0 , 214, 0 , 8631 , 384, 159), // #1316
+ INST(Vpgatherdd , VexRmvRm_VM , V(660F38,90,_,x,0,_,_,_ ), E(660F38,90,_,x,_,0,2,T1S), 96 , 116, 8639 , 302, 145), // #1317
+ INST(Vpgatherdq , VexRmvRm_VM , V(660F38,90,_,x,1,_,_,_ ), E(660F38,90,_,x,_,1,3,T1S), 189, 117, 8650 , 301, 145), // #1318
+ INST(Vpgatherqd , VexRmvRm_VM , V(660F38,91,_,x,0,_,_,_ ), E(660F38,91,_,x,_,0,2,T1S), 96 , 118, 8661 , 307, 145), // #1319
+ INST(Vpgatherqq , VexRmvRm_VM , V(660F38,91,_,x,1,_,_,_ ), E(660F38,91,_,x,_,1,3,T1S), 189, 119, 8672 , 306, 145), // #1320
+ INST(Vphaddbd , VexRm , V(XOP_M9,C2,_,0,0,_,_,_ ), 0 , 79 , 0 , 8683 , 204, 144), // #1321
+ INST(Vphaddbq , VexRm , V(XOP_M9,C3,_,0,0,_,_,_ ), 0 , 79 , 0 , 8692 , 204, 144), // #1322
+ INST(Vphaddbw , VexRm , V(XOP_M9,C1,_,0,0,_,_,_ ), 0 , 79 , 0 , 8701 , 204, 144), // #1323
+ INST(Vphaddd , VexRvm_Lx , V(660F38,02,_,x,I,_,_,_ ), 0 , 96 , 0 , 8710 , 202, 148), // #1324
+ INST(Vphadddq , VexRm , V(XOP_M9,CB,_,0,0,_,_,_ ), 0 , 79 , 0 , 8718 , 204, 144), // #1325
+ INST(Vphaddsw , VexRvm_Lx , V(660F38,03,_,x,I,_,_,_ ), 0 , 96 , 0 , 8727 , 202, 148), // #1326
+ INST(Vphaddubd , VexRm , V(XOP_M9,D2,_,0,0,_,_,_ ), 0 , 79 , 0 , 8736 , 204, 144), // #1327
+ INST(Vphaddubq , VexRm , V(XOP_M9,D3,_,0,0,_,_,_ ), 0 , 79 , 0 , 8746 , 204, 144), // #1328
+ INST(Vphaddubw , VexRm , V(XOP_M9,D1,_,0,0,_,_,_ ), 0 , 79 , 0 , 8756 , 204, 144), // #1329
+ INST(Vphaddudq , VexRm , V(XOP_M9,DB,_,0,0,_,_,_ ), 0 , 79 , 0 , 8766 , 204, 144), // #1330
+ INST(Vphadduwd , VexRm , V(XOP_M9,D6,_,0,0,_,_,_ ), 0 , 79 , 0 , 8776 , 204, 144), // #1331
+ INST(Vphadduwq , VexRm , V(XOP_M9,D7,_,0,0,_,_,_ ), 0 , 79 , 0 , 8786 , 204, 144), // #1332
+ INST(Vphaddw , VexRvm_Lx , V(660F38,01,_,x,I,_,_,_ ), 0 , 96 , 0 , 8796 , 202, 148), // #1333
+ INST(Vphaddwd , VexRm , V(XOP_M9,C6,_,0,0,_,_,_ ), 0 , 79 , 0 , 8804 , 204, 144), // #1334
+ INST(Vphaddwq , VexRm , V(XOP_M9,C7,_,0,0,_,_,_ ), 0 , 79 , 0 , 8813 , 204, 144), // #1335
+ INST(Vphminposuw , VexRm , V(660F38,41,_,0,I,_,_,_ ), 0 , 96 , 0 , 8822 , 204, 128), // #1336
+ INST(Vphsubbw , VexRm , V(XOP_M9,E1,_,0,0,_,_,_ ), 0 , 79 , 0 , 8834 , 204, 144), // #1337
+ INST(Vphsubd , VexRvm_Lx , V(660F38,06,_,x,I,_,_,_ ), 0 , 96 , 0 , 8843 , 202, 148), // #1338
+ INST(Vphsubdq , VexRm , V(XOP_M9,E3,_,0,0,_,_,_ ), 0 , 79 , 0 , 8851 , 204, 144), // #1339
+ INST(Vphsubsw , VexRvm_Lx , V(660F38,07,_,x,I,_,_,_ ), 0 , 96 , 0 , 8860 , 202, 148), // #1340
+ INST(Vphsubw , VexRvm_Lx , V(660F38,05,_,x,I,_,_,_ ), 0 , 96 , 0 , 8869 , 202, 148), // #1341
+ INST(Vphsubwd , VexRm , V(XOP_M9,E2,_,0,0,_,_,_ ), 0 , 79 , 0 , 8877 , 204, 144), // #1342
+ INST(Vpinsrb , VexRvmi , V(660F3A,20,_,0,0,I,0,T1S), 0 , 73 , 0 , 8886 , 385, 159), // #1343
+ INST(Vpinsrd , VexRvmi , V(660F3A,22,_,0,0,0,2,T1S), 0 , 177, 0 , 8894 , 386, 160), // #1344
+ INST(Vpinsrq , VexRvmi , V(660F3A,22,_,0,1,1,3,T1S), 0 , 213, 0 , 8902 , 387, 160), // #1345
+ INST(Vpinsrw , VexRvmi , V(660F00,C4,_,0,0,I,1,T1S), 0 , 215, 0 , 8910 , 388, 159), // #1346
+ INST(Vplzcntd , VexRm_Lx , E(660F38,44,_,x,_,0,4,FV ), 0 , 114, 0 , 8918 , 374, 153), // #1347
+ INST(Vplzcntq , VexRm_Lx , E(660F38,44,_,x,_,1,4,FV ), 0 , 113, 0 , 8927 , 350, 153), // #1348
+ INST(Vpmacsdd , VexRvmr , V(XOP_M8,9E,_,0,0,_,_,_ ), 0 , 208, 0 , 8936 , 389, 144), // #1349
+ INST(Vpmacsdqh , VexRvmr , V(XOP_M8,9F,_,0,0,_,_,_ ), 0 , 208, 0 , 8945 , 389, 144), // #1350
+ INST(Vpmacsdql , VexRvmr , V(XOP_M8,97,_,0,0,_,_,_ ), 0 , 208, 0 , 8955 , 389, 144), // #1351
+ INST(Vpmacssdd , VexRvmr , V(XOP_M8,8E,_,0,0,_,_,_ ), 0 , 208, 0 , 8965 , 389, 144), // #1352
+ INST(Vpmacssdqh , VexRvmr , V(XOP_M8,8F,_,0,0,_,_,_ ), 0 , 208, 0 , 8975 , 389, 144), // #1353
+ INST(Vpmacssdql , VexRvmr , V(XOP_M8,87,_,0,0,_,_,_ ), 0 , 208, 0 , 8986 , 389, 144), // #1354
+ INST(Vpmacsswd , VexRvmr , V(XOP_M8,86,_,0,0,_,_,_ ), 0 , 208, 0 , 8997 , 389, 144), // #1355
+ INST(Vpmacssww , VexRvmr , V(XOP_M8,85,_,0,0,_,_,_ ), 0 , 208, 0 , 9007 , 389, 144), // #1356
+ INST(Vpmacswd , VexRvmr , V(XOP_M8,96,_,0,0,_,_,_ ), 0 , 208, 0 , 9017 , 389, 144), // #1357
+ INST(Vpmacsww , VexRvmr , V(XOP_M8,95,_,0,0,_,_,_ ), 0 , 208, 0 , 9026 , 389, 144), // #1358
+ INST(Vpmadcsswd , VexRvmr , V(XOP_M8,A6,_,0,0,_,_,_ ), 0 , 208, 0 , 9035 , 389, 144), // #1359
+ INST(Vpmadcswd , VexRvmr , V(XOP_M8,B6,_,0,0,_,_,_ ), 0 , 208, 0 , 9046 , 389, 144), // #1360
+ INST(Vpmadd52huq , VexRvm_Lx , E(660F38,B5,_,x,_,1,4,FV ), 0 , 113, 0 , 9056 , 212, 161), // #1361
+ INST(Vpmadd52luq , VexRvm_Lx , E(660F38,B4,_,x,_,1,4,FV ), 0 , 113, 0 , 9068 , 212, 161), // #1362
+ INST(Vpmaddubsw , VexRvm_Lx , V(660F38,04,_,x,I,I,4,FVM), 0 , 110, 0 , 9080 , 315, 151), // #1363
+ INST(Vpmaddwd , VexRvm_Lx , V(660F00,F5,_,x,I,I,4,FVM), 0 , 144, 0 , 9091 , 315, 151), // #1364
+ INST(Vpmaskmovd , VexRvmMvr_Lx , V(660F38,8C,_,x,0,_,_,_ ), V(660F38,8E,_,x,0,_,_,_ ), 96 , 120, 9100 , 323, 134), // #1365
+ INST(Vpmaskmovq , VexRvmMvr_Lx , V(660F38,8C,_,x,1,_,_,_ ), V(660F38,8E,_,x,1,_,_,_ ), 189, 121, 9111 , 323, 134), // #1366
+ INST(Vpmaxsb , VexRvm_Lx , V(660F38,3C,_,x,I,I,4,FVM), 0 , 110, 0 , 9122 , 390, 151), // #1367
+ INST(Vpmaxsd , VexRvm_Lx , V(660F38,3D,_,x,I,0,4,FV ), 0 , 110, 0 , 9130 , 211, 135), // #1368
+ INST(Vpmaxsq , VexRvm_Lx , E(660F38,3D,_,x,_,1,4,FV ), 0 , 113, 0 , 9138 , 212, 131), // #1369
+ INST(Vpmaxsw , VexRvm_Lx , V(660F00,EE,_,x,I,I,4,FVM), 0 , 144, 0 , 9146 , 390, 151), // #1370
+ INST(Vpmaxub , VexRvm_Lx , V(660F00,DE,_,x,I,I,4,FVM), 0 , 144, 0 , 9154 , 390, 151), // #1371
+ INST(Vpmaxud , VexRvm_Lx , V(660F38,3F,_,x,I,0,4,FV ), 0 , 110, 0 , 9162 , 211, 135), // #1372
+ INST(Vpmaxuq , VexRvm_Lx , E(660F38,3F,_,x,_,1,4,FV ), 0 , 113, 0 , 9170 , 212, 131), // #1373
+ INST(Vpmaxuw , VexRvm_Lx , V(660F38,3E,_,x,I,I,4,FVM), 0 , 110, 0 , 9178 , 390, 151), // #1374
+ INST(Vpminsb , VexRvm_Lx , V(660F38,38,_,x,I,I,4,FVM), 0 , 110, 0 , 9186 , 390, 151), // #1375
+ INST(Vpminsd , VexRvm_Lx , V(660F38,39,_,x,I,0,4,FV ), 0 , 110, 0 , 9194 , 211, 135), // #1376
+ INST(Vpminsq , VexRvm_Lx , E(660F38,39,_,x,_,1,4,FV ), 0 , 113, 0 , 9202 , 212, 131), // #1377
+ INST(Vpminsw , VexRvm_Lx , V(660F00,EA,_,x,I,I,4,FVM), 0 , 144, 0 , 9210 , 390, 151), // #1378
+ INST(Vpminub , VexRvm_Lx , V(660F00,DA,_,x,I,_,4,FVM), 0 , 144, 0 , 9218 , 390, 151), // #1379
+ INST(Vpminud , VexRvm_Lx , V(660F38,3B,_,x,I,0,4,FV ), 0 , 110, 0 , 9226 , 211, 135), // #1380
+ INST(Vpminuq , VexRvm_Lx , E(660F38,3B,_,x,_,1,4,FV ), 0 , 113, 0 , 9234 , 212, 131), // #1381
+ INST(Vpminuw , VexRvm_Lx , V(660F38,3A,_,x,I,_,4,FVM), 0 , 110, 0 , 9242 , 390, 151), // #1382
+ INST(Vpmovb2m , VexRm_Lx , E(F30F38,29,_,x,_,0,_,_ ), 0 , 206, 0 , 9250 , 391, 139), // #1383
+ INST(Vpmovd2m , VexRm_Lx , E(F30F38,39,_,x,_,0,_,_ ), 0 , 206, 0 , 9259 , 391, 133), // #1384
+ INST(Vpmovdb , VexMr_Lx , E(F30F38,31,_,x,_,0,2,QVM), 0 , 216, 0 , 9268 , 392, 131), // #1385
+ INST(Vpmovdw , VexMr_Lx , E(F30F38,33,_,x,_,0,3,HVM), 0 , 217, 0 , 9276 , 393, 131), // #1386
+ INST(Vpmovm2b , VexRm_Lx , E(F30F38,28,_,x,_,0,_,_ ), 0 , 206, 0 , 9284 , 360, 139), // #1387
+ INST(Vpmovm2d , VexRm_Lx , E(F30F38,38,_,x,_,0,_,_ ), 0 , 206, 0 , 9293 , 360, 133), // #1388
+ INST(Vpmovm2q , VexRm_Lx , E(F30F38,38,_,x,_,1,_,_ ), 0 , 205, 0 , 9302 , 360, 133), // #1389
+ INST(Vpmovm2w , VexRm_Lx , E(F30F38,28,_,x,_,1,_,_ ), 0 , 205, 0 , 9311 , 360, 139), // #1390
+ INST(Vpmovmskb , VexRm_Lx , V(660F00,D7,_,x,I,_,_,_ ), 0 , 69 , 0 , 9320 , 336, 148), // #1391
+ INST(Vpmovq2m , VexRm_Lx , E(F30F38,39,_,x,_,1,_,_ ), 0 , 205, 0 , 9330 , 391, 133), // #1392
+ INST(Vpmovqb , VexMr_Lx , E(F30F38,32,_,x,_,0,1,OVM), 0 , 218, 0 , 9339 , 394, 131), // #1393
+ INST(Vpmovqd , VexMr_Lx , E(F30F38,35,_,x,_,0,3,HVM), 0 , 217, 0 , 9347 , 393, 131), // #1394
+ INST(Vpmovqw , VexMr_Lx , E(F30F38,34,_,x,_,0,2,QVM), 0 , 216, 0 , 9355 , 392, 131), // #1395
+ INST(Vpmovsdb , VexMr_Lx , E(F30F38,21,_,x,_,0,2,QVM), 0 , 216, 0 , 9363 , 392, 131), // #1396
+ INST(Vpmovsdw , VexMr_Lx , E(F30F38,23,_,x,_,0,3,HVM), 0 , 217, 0 , 9372 , 393, 131), // #1397
+ INST(Vpmovsqb , VexMr_Lx , E(F30F38,22,_,x,_,0,1,OVM), 0 , 218, 0 , 9381 , 394, 131), // #1398
+ INST(Vpmovsqd , VexMr_Lx , E(F30F38,25,_,x,_,0,3,HVM), 0 , 217, 0 , 9390 , 393, 131), // #1399
+ INST(Vpmovsqw , VexMr_Lx , E(F30F38,24,_,x,_,0,2,QVM), 0 , 216, 0 , 9399 , 392, 131), // #1400
+ INST(Vpmovswb , VexMr_Lx , E(F30F38,20,_,x,_,0,3,HVM), 0 , 217, 0 , 9408 , 393, 139), // #1401
+ INST(Vpmovsxbd , VexRm_Lx , V(660F38,21,_,x,I,I,2,QVM), 0 , 219, 0 , 9417 , 395, 135), // #1402
+ INST(Vpmovsxbq , VexRm_Lx , V(660F38,22,_,x,I,I,1,OVM), 0 , 220, 0 , 9427 , 396, 135), // #1403
+ INST(Vpmovsxbw , VexRm_Lx , V(660F38,20,_,x,I,I,3,HVM), 0 , 139, 0 , 9437 , 397, 151), // #1404
+ INST(Vpmovsxdq , VexRm_Lx , V(660F38,25,_,x,I,0,3,HVM), 0 , 139, 0 , 9447 , 397, 135), // #1405
+ INST(Vpmovsxwd , VexRm_Lx , V(660F38,23,_,x,I,I,3,HVM), 0 , 139, 0 , 9457 , 397, 135), // #1406
+ INST(Vpmovsxwq , VexRm_Lx , V(660F38,24,_,x,I,I,2,QVM), 0 , 219, 0 , 9467 , 395, 135), // #1407
+ INST(Vpmovusdb , VexMr_Lx , E(F30F38,11,_,x,_,0,2,QVM), 0 , 216, 0 , 9477 , 392, 131), // #1408
+ INST(Vpmovusdw , VexMr_Lx , E(F30F38,13,_,x,_,0,3,HVM), 0 , 217, 0 , 9487 , 393, 131), // #1409
+ INST(Vpmovusqb , VexMr_Lx , E(F30F38,12,_,x,_,0,1,OVM), 0 , 218, 0 , 9497 , 394, 131), // #1410
+ INST(Vpmovusqd , VexMr_Lx , E(F30F38,15,_,x,_,0,3,HVM), 0 , 217, 0 , 9507 , 393, 131), // #1411
+ INST(Vpmovusqw , VexMr_Lx , E(F30F38,14,_,x,_,0,2,QVM), 0 , 216, 0 , 9517 , 392, 131), // #1412
+ INST(Vpmovuswb , VexMr_Lx , E(F30F38,10,_,x,_,0,3,HVM), 0 , 217, 0 , 9527 , 393, 139), // #1413
+ INST(Vpmovw2m , VexRm_Lx , E(F30F38,29,_,x,_,1,_,_ ), 0 , 205, 0 , 9537 , 391, 139), // #1414
+ INST(Vpmovwb , VexMr_Lx , E(F30F38,30,_,x,_,0,3,HVM), 0 , 217, 0 , 9546 , 393, 139), // #1415
+ INST(Vpmovzxbd , VexRm_Lx , V(660F38,31,_,x,I,I,2,QVM), 0 , 219, 0 , 9554 , 395, 135), // #1416
+ INST(Vpmovzxbq , VexRm_Lx , V(660F38,32,_,x,I,I,1,OVM), 0 , 220, 0 , 9564 , 396, 135), // #1417
+ INST(Vpmovzxbw , VexRm_Lx , V(660F38,30,_,x,I,I,3,HVM), 0 , 139, 0 , 9574 , 397, 151), // #1418
+ INST(Vpmovzxdq , VexRm_Lx , V(660F38,35,_,x,I,0,3,HVM), 0 , 139, 0 , 9584 , 397, 135), // #1419
+ INST(Vpmovzxwd , VexRm_Lx , V(660F38,33,_,x,I,I,3,HVM), 0 , 139, 0 , 9594 , 397, 135), // #1420
+ INST(Vpmovzxwq , VexRm_Lx , V(660F38,34,_,x,I,I,2,QVM), 0 , 219, 0 , 9604 , 395, 135), // #1421
+ INST(Vpmuldq , VexRvm_Lx , V(660F38,28,_,x,I,1,4,FV ), 0 , 209, 0 , 9614 , 208, 135), // #1422
+ INST(Vpmulhrsw , VexRvm_Lx , V(660F38,0B,_,x,I,I,4,FVM), 0 , 110, 0 , 9622 , 315, 151), // #1423
+ INST(Vpmulhuw , VexRvm_Lx , V(660F00,E4,_,x,I,I,4,FVM), 0 , 144, 0 , 9632 , 315, 151), // #1424
+ INST(Vpmulhw , VexRvm_Lx , V(660F00,E5,_,x,I,I,4,FVM), 0 , 144, 0 , 9641 , 315, 151), // #1425
+ INST(Vpmulld , VexRvm_Lx , V(660F38,40,_,x,I,0,4,FV ), 0 , 110, 0 , 9649 , 209, 135), // #1426
+ INST(Vpmullq , VexRvm_Lx , E(660F38,40,_,x,_,1,4,FV ), 0 , 113, 0 , 9657 , 212, 133), // #1427
+ INST(Vpmullw , VexRvm_Lx , V(660F00,D5,_,x,I,I,4,FVM), 0 , 144, 0 , 9665 , 315, 151), // #1428
+ INST(Vpmultishiftqb , VexRvm_Lx , E(660F38,83,_,x,_,1,4,FV ), 0 , 113, 0 , 9673 , 212, 158), // #1429
+ INST(Vpmuludq , VexRvm_Lx , V(660F00,F4,_,x,I,1,4,FV ), 0 , 103, 0 , 9688 , 208, 135), // #1430
+ INST(Vpopcntb , VexRm_Lx , E(660F38,54,_,x,_,0,4,FV ), 0 , 114, 0 , 9697 , 279, 162), // #1431
+ INST(Vpopcntd , VexRm_Lx , E(660F38,55,_,x,_,0,4,FVM), 0 , 114, 0 , 9706 , 374, 163), // #1432
+ INST(Vpopcntq , VexRm_Lx , E(660F38,55,_,x,_,1,4,FVM), 0 , 113, 0 , 9715 , 350, 163), // #1433
+ INST(Vpopcntw , VexRm_Lx , E(660F38,54,_,x,_,1,4,FV ), 0 , 113, 0 , 9724 , 279, 162), // #1434
+ INST(Vpor , VexRvm_Lx , V(660F00,EB,_,x,I,_,_,_ ), 0 , 69 , 0 , 9733 , 351, 148), // #1435
+ INST(Vpord , VexRvm_Lx , E(660F00,EB,_,x,_,0,4,FV ), 0 , 198, 0 , 9738 , 352, 131), // #1436
+ INST(Vporq , VexRvm_Lx , E(660F00,EB,_,x,_,1,4,FV ), 0 , 135, 0 , 9744 , 356, 131), // #1437
+ INST(Vpperm , VexRvrmRvmr , V(XOP_M8,A3,_,0,x,_,_,_ ), 0 , 208, 0 , 9750 , 398, 144), // #1438
+ INST(Vprold , VexVmi_Lx , E(660F00,72,1,x,_,0,4,FV ), 0 , 221, 0 , 9757 , 399, 131), // #1439
+ INST(Vprolq , VexVmi_Lx , E(660F00,72,1,x,_,1,4,FV ), 0 , 222, 0 , 9764 , 400, 131), // #1440
+ INST(Vprolvd , VexRvm_Lx , E(660F38,15,_,x,_,0,4,FV ), 0 , 114, 0 , 9771 , 213, 131), // #1441
+ INST(Vprolvq , VexRvm_Lx , E(660F38,15,_,x,_,1,4,FV ), 0 , 113, 0 , 9779 , 212, 131), // #1442
+ INST(Vprord , VexVmi_Lx , E(660F00,72,0,x,_,0,4,FV ), 0 , 198, 0 , 9787 , 399, 131), // #1443
+ INST(Vprorq , VexVmi_Lx , E(660F00,72,0,x,_,1,4,FV ), 0 , 135, 0 , 9794 , 400, 131), // #1444
+ INST(Vprorvd , VexRvm_Lx , E(660F38,14,_,x,_,0,4,FV ), 0 , 114, 0 , 9801 , 213, 131), // #1445
+ INST(Vprorvq , VexRvm_Lx , E(660F38,14,_,x,_,1,4,FV ), 0 , 113, 0 , 9809 , 212, 131), // #1446
+ INST(Vprotb , VexRvmRmvRmi , V(XOP_M9,90,_,0,x,_,_,_ ), V(XOP_M8,C0,_,0,x,_,_,_ ), 79 , 122, 9817 , 401, 144), // #1447
+ INST(Vprotd , VexRvmRmvRmi , V(XOP_M9,92,_,0,x,_,_,_ ), V(XOP_M8,C2,_,0,x,_,_,_ ), 79 , 123, 9824 , 401, 144), // #1448
+ INST(Vprotq , VexRvmRmvRmi , V(XOP_M9,93,_,0,x,_,_,_ ), V(XOP_M8,C3,_,0,x,_,_,_ ), 79 , 124, 9831 , 401, 144), // #1449
+ INST(Vprotw , VexRvmRmvRmi , V(XOP_M9,91,_,0,x,_,_,_ ), V(XOP_M8,C1,_,0,x,_,_,_ ), 79 , 125, 9838 , 401, 144), // #1450
+ INST(Vpsadbw , VexRvm_Lx , V(660F00,F6,_,x,I,I,4,FVM), 0 , 144, 0 , 9845 , 203, 151), // #1451
+ INST(Vpscatterdd , VexMr_VM , E(660F38,A0,_,x,_,0,2,T1S), 0 , 129, 0 , 9853 , 402, 131), // #1452
+ INST(Vpscatterdq , VexMr_VM , E(660F38,A0,_,x,_,1,3,T1S), 0 , 128, 0 , 9865 , 403, 131), // #1453
+ INST(Vpscatterqd , VexMr_VM , E(660F38,A1,_,x,_,0,2,T1S), 0 , 129, 0 , 9877 , 404, 131), // #1454
+ INST(Vpscatterqq , VexMr_VM , E(660F38,A1,_,x,_,1,3,T1S), 0 , 128, 0 , 9889 , 405, 131), // #1455
+ INST(Vpshab , VexRvmRmv , V(XOP_M9,98,_,0,x,_,_,_ ), 0 , 79 , 0 , 9901 , 406, 144), // #1456
+ INST(Vpshad , VexRvmRmv , V(XOP_M9,9A,_,0,x,_,_,_ ), 0 , 79 , 0 , 9908 , 406, 144), // #1457
+ INST(Vpshaq , VexRvmRmv , V(XOP_M9,9B,_,0,x,_,_,_ ), 0 , 79 , 0 , 9915 , 406, 144), // #1458
+ INST(Vpshaw , VexRvmRmv , V(XOP_M9,99,_,0,x,_,_,_ ), 0 , 79 , 0 , 9922 , 406, 144), // #1459
+ INST(Vpshlb , VexRvmRmv , V(XOP_M9,94,_,0,x,_,_,_ ), 0 , 79 , 0 , 9929 , 406, 144), // #1460
+ INST(Vpshld , VexRvmRmv , V(XOP_M9,96,_,0,x,_,_,_ ), 0 , 79 , 0 , 9936 , 406, 144), // #1461
+ INST(Vpshldd , VexRvmi_Lx , E(660F3A,71,_,x,_,0,4,FV ), 0 , 111, 0 , 9943 , 206, 156), // #1462
+ INST(Vpshldq , VexRvmi_Lx , E(660F3A,71,_,x,_,1,4,FV ), 0 , 112, 0 , 9951 , 207, 156), // #1463
+ INST(Vpshldvd , VexRvm_Lx , E(660F38,71,_,x,_,0,4,FV ), 0 , 114, 0 , 9959 , 213, 156), // #1464
+ INST(Vpshldvq , VexRvm_Lx , E(660F38,71,_,x,_,1,4,FV ), 0 , 113, 0 , 9968 , 212, 156), // #1465
+ INST(Vpshldvw , VexRvm_Lx , E(660F38,70,_,x,_,1,4,FVM), 0 , 113, 0 , 9977 , 357, 156), // #1466
+ INST(Vpshldw , VexRvmi_Lx , E(660F3A,70,_,x,_,1,4,FVM), 0 , 112, 0 , 9986 , 275, 156), // #1467
+ INST(Vpshlq , VexRvmRmv , V(XOP_M9,97,_,0,x,_,_,_ ), 0 , 79 , 0 , 9994 , 406, 144), // #1468
+ INST(Vpshlw , VexRvmRmv , V(XOP_M9,95,_,0,x,_,_,_ ), 0 , 79 , 0 , 10001, 406, 144), // #1469
+ INST(Vpshrdd , VexRvmi_Lx , E(660F3A,73,_,x,_,0,4,FV ), 0 , 111, 0 , 10008, 206, 156), // #1470
+ INST(Vpshrdq , VexRvmi_Lx , E(660F3A,73,_,x,_,1,4,FV ), 0 , 112, 0 , 10016, 207, 156), // #1471
+ INST(Vpshrdvd , VexRvm_Lx , E(660F38,73,_,x,_,0,4,FV ), 0 , 114, 0 , 10024, 213, 156), // #1472
+ INST(Vpshrdvq , VexRvm_Lx , E(660F38,73,_,x,_,1,4,FV ), 0 , 113, 0 , 10033, 212, 156), // #1473
+ INST(Vpshrdvw , VexRvm_Lx , E(660F38,72,_,x,_,1,4,FVM), 0 , 113, 0 , 10042, 357, 156), // #1474
+ INST(Vpshrdw , VexRvmi_Lx , E(660F3A,72,_,x,_,1,4,FVM), 0 , 112, 0 , 10051, 275, 156), // #1475
+ INST(Vpshufb , VexRvm_Lx , V(660F38,00,_,x,I,I,4,FVM), 0 , 110, 0 , 10059, 315, 151), // #1476
+ INST(Vpshufbitqmb , VexRvm_Lx , E(660F38,8F,_,x,0,0,4,FVM), 0 , 114, 0 , 10067, 407, 162), // #1477
+ INST(Vpshufd , VexRmi_Lx , V(660F00,70,_,x,I,0,4,FV ), 0 , 144, 0 , 10080, 408, 135), // #1478
+ INST(Vpshufhw , VexRmi_Lx , V(F30F00,70,_,x,I,I,4,FVM), 0 , 161, 0 , 10088, 409, 151), // #1479
+ INST(Vpshuflw , VexRmi_Lx , V(F20F00,70,_,x,I,I,4,FVM), 0 , 223, 0 , 10097, 409, 151), // #1480
+ INST(Vpsignb , VexRvm_Lx , V(660F38,08,_,x,I,_,_,_ ), 0 , 96 , 0 , 10106, 202, 148), // #1481
+ INST(Vpsignd , VexRvm_Lx , V(660F38,0A,_,x,I,_,_,_ ), 0 , 96 , 0 , 10114, 202, 148), // #1482
+ INST(Vpsignw , VexRvm_Lx , V(660F38,09,_,x,I,_,_,_ ), 0 , 96 , 0 , 10122, 202, 148), // #1483
+ INST(Vpslld , VexRvmVmi_Lx_MEvex , V(660F00,F2,_,x,I,0,4,128), V(660F00,72,6,x,I,0,4,FV ), 224, 126, 10130, 410, 135), // #1484
+ INST(Vpslldq , VexVmi_Lx_MEvex , V(660F00,73,7,x,I,I,4,FVM), 0 , 225, 0 , 10137, 411, 151), // #1485
+ INST(Vpsllq , VexRvmVmi_Lx_MEvex , V(660F00,F3,_,x,I,1,4,128), V(660F00,73,6,x,I,1,4,FV ), 226, 127, 10145, 412, 135), // #1486
+ INST(Vpsllvd , VexRvm_Lx , V(660F38,47,_,x,0,0,4,FV ), 0 , 110, 0 , 10152, 209, 145), // #1487
+ INST(Vpsllvq , VexRvm_Lx , V(660F38,47,_,x,1,1,4,FV ), 0 , 182, 0 , 10160, 208, 145), // #1488
+ INST(Vpsllvw , VexRvm_Lx , E(660F38,12,_,x,_,1,4,FVM), 0 , 113, 0 , 10168, 357, 139), // #1489
+ INST(Vpsllw , VexRvmVmi_Lx_MEvex , V(660F00,F1,_,x,I,I,4,128), V(660F00,71,6,x,I,I,4,FVM), 224, 128, 10176, 413, 151), // #1490
+ INST(Vpsrad , VexRvmVmi_Lx_MEvex , V(660F00,E2,_,x,I,0,4,128), V(660F00,72,4,x,I,0,4,FV ), 224, 129, 10183, 410, 135), // #1491
+ INST(Vpsraq , VexRvmVmi_Lx_MEvex , E(660F00,E2,_,x,_,1,4,128), E(660F00,72,4,x,_,1,4,FV ), 227, 130, 10190, 414, 131), // #1492
+ INST(Vpsravd , VexRvm_Lx , V(660F38,46,_,x,0,0,4,FV ), 0 , 110, 0 , 10197, 209, 145), // #1493
+ INST(Vpsravq , VexRvm_Lx , E(660F38,46,_,x,_,1,4,FV ), 0 , 113, 0 , 10205, 212, 131), // #1494
+ INST(Vpsravw , VexRvm_Lx , E(660F38,11,_,x,_,1,4,FVM), 0 , 113, 0 , 10213, 357, 139), // #1495
+ INST(Vpsraw , VexRvmVmi_Lx_MEvex , V(660F00,E1,_,x,I,I,4,128), V(660F00,71,4,x,I,I,4,FVM), 224, 131, 10221, 413, 151), // #1496
+ INST(Vpsrld , VexRvmVmi_Lx_MEvex , V(660F00,D2,_,x,I,0,4,128), V(660F00,72,2,x,I,0,4,FV ), 224, 132, 10228, 410, 135), // #1497
+ INST(Vpsrldq , VexVmi_Lx_MEvex , V(660F00,73,3,x,I,I,4,FVM), 0 , 228, 0 , 10235, 411, 151), // #1498
+ INST(Vpsrlq , VexRvmVmi_Lx_MEvex , V(660F00,D3,_,x,I,1,4,128), V(660F00,73,2,x,I,1,4,FV ), 226, 133, 10243, 412, 135), // #1499
+ INST(Vpsrlvd , VexRvm_Lx , V(660F38,45,_,x,0,0,4,FV ), 0 , 110, 0 , 10250, 209, 145), // #1500
+ INST(Vpsrlvq , VexRvm_Lx , V(660F38,45,_,x,1,1,4,FV ), 0 , 182, 0 , 10258, 208, 145), // #1501
+ INST(Vpsrlvw , VexRvm_Lx , E(660F38,10,_,x,_,1,4,FVM), 0 , 113, 0 , 10266, 357, 139), // #1502
+ INST(Vpsrlw , VexRvmVmi_Lx_MEvex , V(660F00,D1,_,x,I,I,4,128), V(660F00,71,2,x,I,I,4,FVM), 224, 134, 10274, 413, 151), // #1503
+ INST(Vpsubb , VexRvm_Lx , V(660F00,F8,_,x,I,I,4,FVM), 0 , 144, 0 , 10281, 415, 151), // #1504
+ INST(Vpsubd , VexRvm_Lx , V(660F00,FA,_,x,I,0,4,FV ), 0 , 144, 0 , 10288, 416, 135), // #1505
+ INST(Vpsubq , VexRvm_Lx , V(660F00,FB,_,x,I,1,4,FV ), 0 , 103, 0 , 10295, 417, 135), // #1506
+ INST(Vpsubsb , VexRvm_Lx , V(660F00,E8,_,x,I,I,4,FVM), 0 , 144, 0 , 10302, 415, 151), // #1507
+ INST(Vpsubsw , VexRvm_Lx , V(660F00,E9,_,x,I,I,4,FVM), 0 , 144, 0 , 10310, 415, 151), // #1508
+ INST(Vpsubusb , VexRvm_Lx , V(660F00,D8,_,x,I,I,4,FVM), 0 , 144, 0 , 10318, 415, 151), // #1509
+ INST(Vpsubusw , VexRvm_Lx , V(660F00,D9,_,x,I,I,4,FVM), 0 , 144, 0 , 10327, 415, 151), // #1510
+ INST(Vpsubw , VexRvm_Lx , V(660F00,F9,_,x,I,I,4,FVM), 0 , 144, 0 , 10336, 415, 151), // #1511
+ INST(Vpternlogd , VexRvmi_Lx , E(660F3A,25,_,x,_,0,4,FV ), 0 , 111, 0 , 10343, 206, 131), // #1512
+ INST(Vpternlogq , VexRvmi_Lx , E(660F3A,25,_,x,_,1,4,FV ), 0 , 112, 0 , 10354, 207, 131), // #1513
+ INST(Vptest , VexRm_Lx , V(660F38,17,_,x,I,_,_,_ ), 0 , 96 , 0 , 10365, 298, 155), // #1514
+ INST(Vptestmb , VexRvm_Lx , E(660F38,26,_,x,_,0,4,FVM), 0 , 114, 0 , 10372, 407, 139), // #1515
+ INST(Vptestmd , VexRvm_Lx , E(660F38,27,_,x,_,0,4,FV ), 0 , 114, 0 , 10381, 418, 131), // #1516
+ INST(Vptestmq , VexRvm_Lx , E(660F38,27,_,x,_,1,4,FV ), 0 , 113, 0 , 10390, 419, 131), // #1517
+ INST(Vptestmw , VexRvm_Lx , E(660F38,26,_,x,_,1,4,FVM), 0 , 113, 0 , 10399, 407, 139), // #1518
+ INST(Vptestnmb , VexRvm_Lx , E(F30F38,26,_,x,_,0,4,FVM), 0 , 132, 0 , 10408, 407, 139), // #1519
+ INST(Vptestnmd , VexRvm_Lx , E(F30F38,27,_,x,_,0,4,FV ), 0 , 132, 0 , 10418, 418, 131), // #1520
+ INST(Vptestnmq , VexRvm_Lx , E(F30F38,27,_,x,_,1,4,FV ), 0 , 229, 0 , 10428, 419, 131), // #1521
+ INST(Vptestnmw , VexRvm_Lx , E(F30F38,26,_,x,_,1,4,FVM), 0 , 229, 0 , 10438, 407, 139), // #1522
+ INST(Vpunpckhbw , VexRvm_Lx , V(660F00,68,_,x,I,I,4,FVM), 0 , 144, 0 , 10448, 315, 151), // #1523
+ INST(Vpunpckhdq , VexRvm_Lx , V(660F00,6A,_,x,I,0,4,FV ), 0 , 144, 0 , 10459, 209, 135), // #1524
+ INST(Vpunpckhqdq , VexRvm_Lx , V(660F00,6D,_,x,I,1,4,FV ), 0 , 103, 0 , 10470, 208, 135), // #1525
+ INST(Vpunpckhwd , VexRvm_Lx , V(660F00,69,_,x,I,I,4,FVM), 0 , 144, 0 , 10482, 315, 151), // #1526
+ INST(Vpunpcklbw , VexRvm_Lx , V(660F00,60,_,x,I,I,4,FVM), 0 , 144, 0 , 10493, 315, 151), // #1527
+ INST(Vpunpckldq , VexRvm_Lx , V(660F00,62,_,x,I,0,4,FV ), 0 , 144, 0 , 10504, 209, 135), // #1528
+ INST(Vpunpcklqdq , VexRvm_Lx , V(660F00,6C,_,x,I,1,4,FV ), 0 , 103, 0 , 10515, 208, 135), // #1529
+ INST(Vpunpcklwd , VexRvm_Lx , V(660F00,61,_,x,I,I,4,FVM), 0 , 144, 0 , 10527, 315, 151), // #1530
+ INST(Vpxor , VexRvm_Lx , V(660F00,EF,_,x,I,_,_,_ ), 0 , 69 , 0 , 10538, 353, 148), // #1531
+ INST(Vpxord , VexRvm_Lx , E(660F00,EF,_,x,_,0,4,FV ), 0 , 198, 0 , 10544, 354, 131), // #1532
+ INST(Vpxorq , VexRvm_Lx , E(660F00,EF,_,x,_,1,4,FV ), 0 , 135, 0 , 10551, 355, 131), // #1533
+ INST(Vrangepd , VexRvmi_Lx , E(660F3A,50,_,x,_,1,4,FV ), 0 , 112, 0 , 10558, 285, 133), // #1534
+ INST(Vrangeps , VexRvmi_Lx , E(660F3A,50,_,x,_,0,4,FV ), 0 , 111, 0 , 10567, 286, 133), // #1535
+ INST(Vrangesd , VexRvmi , E(660F3A,51,_,I,_,1,3,T1S), 0 , 180, 0 , 10576, 287, 66 ), // #1536
+ INST(Vrangess , VexRvmi , E(660F3A,51,_,I,_,0,2,T1S), 0 , 181, 0 , 10585, 288, 66 ), // #1537
+ INST(Vrcp14pd , VexRm_Lx , E(660F38,4C,_,x,_,1,4,FV ), 0 , 113, 0 , 10594, 350, 131), // #1538
+ INST(Vrcp14ps , VexRm_Lx , E(660F38,4C,_,x,_,0,4,FV ), 0 , 114, 0 , 10603, 374, 131), // #1539
+ INST(Vrcp14sd , VexRvm , E(660F38,4D,_,I,_,1,3,T1S), 0 , 128, 0 , 10612, 420, 68 ), // #1540
+ INST(Vrcp14ss , VexRvm , E(660F38,4D,_,I,_,0,2,T1S), 0 , 129, 0 , 10621, 421, 68 ), // #1541
+ INST(Vrcp28pd , VexRm , E(660F38,CA,_,2,_,1,4,FV ), 0 , 170, 0 , 10630, 277, 140), // #1542
+ INST(Vrcp28ps , VexRm , E(660F38,CA,_,2,_,0,4,FV ), 0 , 171, 0 , 10639, 278, 140), // #1543
+ INST(Vrcp28sd , VexRvm , E(660F38,CB,_,I,_,1,3,T1S), 0 , 128, 0 , 10648, 308, 140), // #1544
+ INST(Vrcp28ss , VexRvm , E(660F38,CB,_,I,_,0,2,T1S), 0 , 129, 0 , 10657, 309, 140), // #1545
+ INST(Vrcpph , VexRm_Lx , E(66MAP6,4C,_,_,_,0,4,FV ), 0 , 183, 0 , 10666, 422, 127), // #1546
+ INST(Vrcpps , VexRm_Lx , V(000F00,53,_,x,I,_,_,_ ), 0 , 72 , 0 , 10673, 298, 128), // #1547
+ INST(Vrcpsh , VexRvm , E(66MAP6,4D,_,_,_,0,1,T1S), 0 , 185, 0 , 10680, 423, 127), // #1548
+ INST(Vrcpss , VexRvm , V(F30F00,53,_,I,I,_,_,_ ), 0 , 199, 0 , 10687, 424, 128), // #1549
+ INST(Vreducepd , VexRmi_Lx , E(660F3A,56,_,x,_,1,4,FV ), 0 , 112, 0 , 10694, 400, 133), // #1550
+ INST(Vreduceph , VexRmi_Lx , E(000F3A,56,_,_,_,0,4,FV ), 0 , 123, 0 , 10704, 311, 125), // #1551
+ INST(Vreduceps , VexRmi_Lx , E(660F3A,56,_,x,_,0,4,FV ), 0 , 111, 0 , 10714, 399, 133), // #1552
+ INST(Vreducesd , VexRvmi , E(660F3A,57,_,I,_,1,3,T1S), 0 , 180, 0 , 10724, 425, 66 ), // #1553
+ INST(Vreducesh , VexRvmi , E(000F3A,57,_,_,_,0,1,T1S), 0 , 188, 0 , 10734, 313, 127), // #1554
+ INST(Vreducess , VexRvmi , E(660F3A,57,_,I,_,0,2,T1S), 0 , 181, 0 , 10744, 426, 66 ), // #1555
+ INST(Vrndscalepd , VexRmi_Lx , E(660F3A,09,_,x,_,1,4,FV ), 0 , 112, 0 , 10754, 310, 131), // #1556
+ INST(Vrndscaleph , VexRmi_Lx , E(000F3A,08,_,_,_,0,4,FV ), 0 , 123, 0 , 10766, 311, 125), // #1557
+ INST(Vrndscaleps , VexRmi_Lx , E(660F3A,08,_,x,_,0,4,FV ), 0 , 111, 0 , 10778, 312, 131), // #1558
+ INST(Vrndscalesd , VexRvmi , E(660F3A,0B,_,I,_,1,3,T1S), 0 , 180, 0 , 10790, 287, 68 ), // #1559
+ INST(Vrndscalesh , VexRvmi , E(000F3A,0A,_,_,_,0,1,T1S), 0 , 188, 0 , 10802, 313, 127), // #1560
+ INST(Vrndscaless , VexRvmi , E(660F3A,0A,_,I,_,0,2,T1S), 0 , 181, 0 , 10814, 288, 68 ), // #1561
+ INST(Vroundpd , VexRmi_Lx , V(660F3A,09,_,x,I,_,_,_ ), 0 , 73 , 0 , 10826, 427, 128), // #1562
+ INST(Vroundps , VexRmi_Lx , V(660F3A,08,_,x,I,_,_,_ ), 0 , 73 , 0 , 10835, 427, 128), // #1563
+ INST(Vroundsd , VexRvmi , V(660F3A,0B,_,I,I,_,_,_ ), 0 , 73 , 0 , 10844, 428, 128), // #1564
+ INST(Vroundss , VexRvmi , V(660F3A,0A,_,I,I,_,_,_ ), 0 , 73 , 0 , 10853, 429, 128), // #1565
+ INST(Vrsqrt14pd , VexRm_Lx , E(660F38,4E,_,x,_,1,4,FV ), 0 , 113, 0 , 10862, 350, 131), // #1566
+ INST(Vrsqrt14ps , VexRm_Lx , E(660F38,4E,_,x,_,0,4,FV ), 0 , 114, 0 , 10873, 374, 131), // #1567
+ INST(Vrsqrt14sd , VexRvm , E(660F38,4F,_,I,_,1,3,T1S), 0 , 128, 0 , 10884, 420, 68 ), // #1568
+ INST(Vrsqrt14ss , VexRvm , E(660F38,4F,_,I,_,0,2,T1S), 0 , 129, 0 , 10895, 421, 68 ), // #1569
+ INST(Vrsqrt28pd , VexRm , E(660F38,CC,_,2,_,1,4,FV ), 0 , 170, 0 , 10906, 277, 140), // #1570
+ INST(Vrsqrt28ps , VexRm , E(660F38,CC,_,2,_,0,4,FV ), 0 , 171, 0 , 10917, 278, 140), // #1571
+ INST(Vrsqrt28sd , VexRvm , E(660F38,CD,_,I,_,1,3,T1S), 0 , 128, 0 , 10928, 308, 140), // #1572
+ INST(Vrsqrt28ss , VexRvm , E(660F38,CD,_,I,_,0,2,T1S), 0 , 129, 0 , 10939, 309, 140), // #1573
+ INST(Vrsqrtph , VexRm_Lx , E(66MAP6,4E,_,_,_,0,4,FV ), 0 , 183, 0 , 10950, 422, 125), // #1574
+ INST(Vrsqrtps , VexRm_Lx , V(000F00,52,_,x,I,_,_,_ ), 0 , 72 , 0 , 10959, 298, 128), // #1575
+ INST(Vrsqrtsh , VexRvm , E(66MAP6,4F,_,_,_,0,1,T1S), 0 , 185, 0 , 10968, 423, 127), // #1576
+ INST(Vrsqrtss , VexRvm , V(F30F00,52,_,I,I,_,_,_ ), 0 , 199, 0 , 10977, 424, 128), // #1577
+ INST(Vscalefpd , VexRvm_Lx , E(660F38,2C,_,x,_,1,4,FV ), 0 , 113, 0 , 10986, 430, 131), // #1578
+ INST(Vscalefph , VexRvm_Lx , E(66MAP6,2C,_,_,_,0,4,FV ), 0 , 183, 0 , 10996, 197, 125), // #1579
+ INST(Vscalefps , VexRvm_Lx , E(660F38,2C,_,x,_,0,4,FV ), 0 , 114, 0 , 11006, 284, 131), // #1580
+ INST(Vscalefsd , VexRvm , E(660F38,2D,_,I,_,1,3,T1S), 0 , 128, 0 , 11016, 251, 68 ), // #1581
+ INST(Vscalefsh , VexRvm , E(66MAP6,2D,_,_,_,0,1,T1S), 0 , 185, 0 , 11026, 200, 127), // #1582
+ INST(Vscalefss , VexRvm , E(660F38,2D,_,I,_,0,2,T1S), 0 , 129, 0 , 11036, 259, 68 ), // #1583
+ INST(Vscatterdpd , VexMr_VM , E(660F38,A2,_,x,_,1,3,T1S), 0 , 128, 0 , 11046, 403, 131), // #1584
+ INST(Vscatterdps , VexMr_VM , E(660F38,A2,_,x,_,0,2,T1S), 0 , 129, 0 , 11058, 402, 131), // #1585
+ INST(Vscatterpf0dpd , VexM_VM , E(660F38,C6,5,2,_,1,3,T1S), 0 , 230, 0 , 11070, 303, 146), // #1586
+ INST(Vscatterpf0dps , VexM_VM , E(660F38,C6,5,2,_,0,2,T1S), 0 , 231, 0 , 11085, 304, 146), // #1587
+ INST(Vscatterpf0qpd , VexM_VM , E(660F38,C7,5,2,_,1,3,T1S), 0 , 230, 0 , 11100, 305, 146), // #1588
+ INST(Vscatterpf0qps , VexM_VM , E(660F38,C7,5,2,_,0,2,T1S), 0 , 231, 0 , 11115, 305, 146), // #1589
+ INST(Vscatterpf1dpd , VexM_VM , E(660F38,C6,6,2,_,1,3,T1S), 0 , 232, 0 , 11130, 303, 146), // #1590
+ INST(Vscatterpf1dps , VexM_VM , E(660F38,C6,6,2,_,0,2,T1S), 0 , 233, 0 , 11145, 304, 146), // #1591
+ INST(Vscatterpf1qpd , VexM_VM , E(660F38,C7,6,2,_,1,3,T1S), 0 , 232, 0 , 11160, 305, 146), // #1592
+ INST(Vscatterpf1qps , VexM_VM , E(660F38,C7,6,2,_,0,2,T1S), 0 , 233, 0 , 11175, 305, 146), // #1593
+ INST(Vscatterqpd , VexMr_VM , E(660F38,A3,_,x,_,1,3,T1S), 0 , 128, 0 , 11190, 405, 131), // #1594
+ INST(Vscatterqps , VexMr_VM , E(660F38,A3,_,x,_,0,2,T1S), 0 , 129, 0 , 11202, 404, 131), // #1595
+ INST(Vshuff32x4 , VexRvmi_Lx , E(660F3A,23,_,x,_,0,4,FV ), 0 , 111, 0 , 11214, 431, 131), // #1596
+ INST(Vshuff64x2 , VexRvmi_Lx , E(660F3A,23,_,x,_,1,4,FV ), 0 , 112, 0 , 11225, 432, 131), // #1597
+ INST(Vshufi32x4 , VexRvmi_Lx , E(660F3A,43,_,x,_,0,4,FV ), 0 , 111, 0 , 11236, 431, 131), // #1598
+ INST(Vshufi64x2 , VexRvmi_Lx , E(660F3A,43,_,x,_,1,4,FV ), 0 , 112, 0 , 11247, 432, 131), // #1599
+ INST(Vshufpd , VexRvmi_Lx , V(660F00,C6,_,x,I,1,4,FV ), 0 , 103, 0 , 11258, 433, 124), // #1600
+ INST(Vshufps , VexRvmi_Lx , V(000F00,C6,_,x,I,0,4,FV ), 0 , 105, 0 , 11266, 434, 124), // #1601
+ INST(Vsqrtpd , VexRm_Lx , V(660F00,51,_,x,I,1,4,FV ), 0 , 103, 0 , 11274, 435, 124), // #1602
+ INST(Vsqrtph , VexRm_Lx , E(00MAP5,51,_,_,_,0,4,FV ), 0 , 104, 0 , 11282, 246, 125), // #1603
+ INST(Vsqrtps , VexRm_Lx , V(000F00,51,_,x,I,0,4,FV ), 0 , 105, 0 , 11290, 235, 124), // #1604
+ INST(Vsqrtsd , VexRvm , V(F20F00,51,_,I,I,1,3,T1S), 0 , 106, 0 , 11298, 199, 126), // #1605
+ INST(Vsqrtsh , VexRvm , E(F3MAP5,51,_,_,_,0,1,T1S), 0 , 107, 0 , 11306, 200, 127), // #1606
+ INST(Vsqrtss , VexRvm , V(F30F00,51,_,I,I,0,2,T1S), 0 , 108, 0 , 11314, 201, 126), // #1607
+ INST(Vstmxcsr , VexM , V(000F00,AE,3,0,I,_,_,_ ), 0 , 234, 0 , 11322, 321, 128), // #1608
+ INST(Vsubpd , VexRvm_Lx , V(660F00,5C,_,x,I,1,4,FV ), 0 , 103, 0 , 11331, 196, 124), // #1609
+ INST(Vsubph , VexRvm_Lx , E(00MAP5,5C,_,_,_,0,4,FV ), 0 , 104, 0 , 11338, 197, 125), // #1610
+ INST(Vsubps , VexRvm_Lx , V(000F00,5C,_,x,I,0,4,FV ), 0 , 105, 0 , 11345, 198, 124), // #1611
+ INST(Vsubsd , VexRvm , V(F20F00,5C,_,I,I,1,3,T1S), 0 , 106, 0 , 11352, 199, 126), // #1612
+ INST(Vsubsh , VexRvm , E(F3MAP5,5C,_,_,_,0,1,T1S), 0 , 107, 0 , 11359, 200, 127), // #1613
+ INST(Vsubss , VexRvm , V(F30F00,5C,_,I,I,0,2,T1S), 0 , 108, 0 , 11366, 201, 126), // #1614
+ INST(Vtestpd , VexRm_Lx , V(660F38,0F,_,x,0,_,_,_ ), 0 , 96 , 0 , 11373, 298, 155), // #1615
+ INST(Vtestps , VexRm_Lx , V(660F38,0E,_,x,0,_,_,_ ), 0 , 96 , 0 , 11381, 298, 155), // #1616
+ INST(Vucomisd , VexRm , V(660F00,2E,_,I,I,1,3,T1S), 0 , 125, 0 , 11389, 229, 136), // #1617
+ INST(Vucomish , VexRm , E(00MAP5,2E,_,_,_,0,1,T1S), 0 , 126, 0 , 11398, 230, 127), // #1618
+ INST(Vucomiss , VexRm , V(000F00,2E,_,I,I,0,2,T1S), 0 , 127, 0 , 11407, 231, 136), // #1619
+ INST(Vunpckhpd , VexRvm_Lx , V(660F00,15,_,x,I,1,4,FV ), 0 , 103, 0 , 11416, 208, 124), // #1620
+ INST(Vunpckhps , VexRvm_Lx , V(000F00,15,_,x,I,0,4,FV ), 0 , 105, 0 , 11426, 209, 124), // #1621
+ INST(Vunpcklpd , VexRvm_Lx , V(660F00,14,_,x,I,1,4,FV ), 0 , 103, 0 , 11436, 208, 124), // #1622
+ INST(Vunpcklps , VexRvm_Lx , V(000F00,14,_,x,I,0,4,FV ), 0 , 105, 0 , 11446, 209, 124), // #1623
+ INST(Vxorpd , VexRvm_Lx , V(660F00,57,_,x,I,1,4,FV ), 0 , 103, 0 , 11456, 417, 132), // #1624
+ INST(Vxorps , VexRvm_Lx , V(000F00,57,_,x,I,0,4,FV ), 0 , 105, 0 , 11463, 416, 132), // #1625
+ INST(Vzeroall , VexOp , V(000F00,77,_,1,I,_,_,_ ), 0 , 68 , 0 , 11470, 436, 128), // #1626
+ INST(Vzeroupper , VexOp , V(000F00,77,_,0,I,_,_,_ ), 0 , 72 , 0 , 11479, 436, 128), // #1627
+ INST(Wbinvd , X86Op , O(000F00,09,_,_,_,_,_,_ ), 0 , 4 , 0 , 11490, 30 , 0 ), // #1628
+ INST(Wbnoinvd , X86Op , O(F30F00,09,_,_,_,_,_,_ ), 0 , 6 , 0 , 11497, 30 , 164), // #1629
+ INST(Wrfsbase , X86M , O(F30F00,AE,2,_,x,_,_,_ ), 0 , 235, 0 , 11506, 173, 104), // #1630
+ INST(Wrgsbase , X86M , O(F30F00,AE,3,_,x,_,_,_ ), 0 , 236, 0 , 11515, 173, 104), // #1631
+ INST(Wrmsr , X86Op , O(000F00,30,_,_,_,_,_,_ ), 0 , 4 , 0 , 11524, 174, 105), // #1632
+ INST(Wrssd , X86Mr , O(000F38,F6,_,_,_,_,_,_ ), 0 , 83 , 0 , 11530, 437, 56 ), // #1633
+ INST(Wrssq , X86Mr , O(000F38,F6,_,_,1,_,_,_ ), 0 , 237, 0 , 11536, 438, 56 ), // #1634
+ INST(Wrussd , X86Mr , O(660F38,F5,_,_,_,_,_,_ ), 0 , 2 , 0 , 11542, 437, 56 ), // #1635
+ INST(Wrussq , X86Mr , O(660F38,F5,_,_,1,_,_,_ ), 0 , 238, 0 , 11549, 438, 56 ), // #1636
+ INST(Xabort , X86Op_Mod11RM_I8 , O(000000,C6,7,_,_,_,_,_ ), 0 , 27 , 0 , 11556, 80 , 165), // #1637
+ INST(Xadd , X86Xadd , O(000F00,C0,_,_,x,_,_,_ ), 0 , 4 , 0 , 11563, 439, 38 ), // #1638
+ INST(Xbegin , X86JmpRel , O(000000,C7,7,_,_,_,_,_ ), 0 , 27 , 0 , 11568, 440, 165), // #1639
+ INST(Xchg , X86Xchg , O(000000,86,_,_,x,_,_,_ ), 0 , 0 , 0 , 462 , 441, 0 ), // #1640
+ INST(Xend , X86Op , O(000F01,D5,_,_,_,_,_,_ ), 0 , 21 , 0 , 11575, 30 , 165), // #1641
+ INST(Xgetbv , X86Op , O(000F01,D0,_,_,_,_,_,_ ), 0 , 21 , 0 , 11580, 174, 166), // #1642
+ INST(Xlatb , X86Op , O(000000,D7,_,_,_,_,_,_ ), 0 , 0 , 0 , 11587, 30 , 0 ), // #1643
+ INST(Xor , X86Arith , O(000000,30,6,_,x,_,_,_ ), 0 , 32 , 0 , 10540, 179, 1 ), // #1644
+ INST(Xorpd , ExtRm , O(660F00,57,_,_,_,_,_,_ ), 0 , 3 , 0 , 11457, 151, 4 ), // #1645
+ INST(Xorps , ExtRm , O(000F00,57,_,_,_,_,_,_ ), 0 , 4 , 0 , 11464, 151, 5 ), // #1646
+ INST(Xresldtrk , X86Op , O(F20F01,E9,_,_,_,_,_,_ ), 0 , 92 , 0 , 11593, 30 , 167), // #1647
+ INST(Xrstor , X86M_Only_EDX_EAX , O(000F00,AE,5,_,_,_,_,_ ), 0 , 77 , 0 , 1164 , 442, 166), // #1648
+ INST(Xrstor64 , X86M_Only_EDX_EAX , O(000F00,AE,5,_,1,_,_,_ ), 0 , 239, 0 , 1172 , 443, 166), // #1649
+ INST(Xrstors , X86M_Only_EDX_EAX , O(000F00,C7,3,_,_,_,_,_ ), 0 , 78 , 0 , 11603, 442, 168), // #1650
+ INST(Xrstors64 , X86M_Only_EDX_EAX , O(000F00,C7,3,_,1,_,_,_ ), 0 , 240, 0 , 11611, 443, 168), // #1651
+ INST(Xsave , X86M_Only_EDX_EAX , O(000F00,AE,4,_,_,_,_,_ ), 0 , 97 , 0 , 1182 , 442, 166), // #1652
+ INST(Xsave64 , X86M_Only_EDX_EAX , O(000F00,AE,4,_,1,_,_,_ ), 0 , 241, 0 , 1189 , 443, 166), // #1653
+ INST(Xsavec , X86M_Only_EDX_EAX , O(000F00,C7,4,_,_,_,_,_ ), 0 , 97 , 0 , 11621, 442, 169), // #1654
+ INST(Xsavec64 , X86M_Only_EDX_EAX , O(000F00,C7,4,_,1,_,_,_ ), 0 , 241, 0 , 11628, 443, 169), // #1655
+ INST(Xsaveopt , X86M_Only_EDX_EAX , O(000F00,AE,6,_,_,_,_,_ ), 0 , 80 , 0 , 11637, 442, 170), // #1656
+ INST(Xsaveopt64 , X86M_Only_EDX_EAX , O(000F00,AE,6,_,1,_,_,_ ), 0 , 242, 0 , 11646, 443, 170), // #1657
+ INST(Xsaves , X86M_Only_EDX_EAX , O(000F00,C7,5,_,_,_,_,_ ), 0 , 77 , 0 , 11657, 442, 168), // #1658
+ INST(Xsaves64 , X86M_Only_EDX_EAX , O(000F00,C7,5,_,1,_,_,_ ), 0 , 239, 0 , 11664, 443, 168), // #1659
+ INST(Xsetbv , X86Op , O(000F01,D1,_,_,_,_,_,_ ), 0 , 21 , 0 , 11673, 174, 166), // #1660
+ INST(Xsusldtrk , X86Op , O(F20F01,E8,_,_,_,_,_,_ ), 0 , 92 , 0 , 11680, 30 , 167), // #1661
+ INST(Xtest , X86Op , O(000F01,D6,_,_,_,_,_,_ ), 0 , 21 , 0 , 11690, 30 , 171) // #1662
// ${InstInfo:End}
};
#undef NAME_DATA_INDEX
#undef INST
-// ============================================================================
-// [asmjit::x86::InstDB - Opcode Tables]
-// ============================================================================
+// x86::InstDB - Opcode Tables
+// ===========================
// ${MainOpcodeTable:Begin}
// ------------------- Automatically generated, do not edit -------------------
const uint32_t InstDB::_mainOpcodeTable[] = {
- O(000000,00,0,0,0,0,0,_ ), // #0 [ref=56x]
- O(000000,00,2,0,0,0,0,_ ), // #1 [ref=4x]
- O(660F38,00,0,0,0,0,0,_ ), // #2 [ref=42x]
- O(660F00,00,0,0,0,0,0,_ ), // #3 [ref=38x]
- O(000F00,00,0,0,0,0,0,_ ), // #4 [ref=231x]
- O(F20F00,00,0,0,0,0,0,_ ), // #5 [ref=24x]
- O(F30F00,00,0,0,0,0,0,_ ), // #6 [ref=29x]
- O(F30F38,00,0,0,0,0,0,_ ), // #7 [ref=2x]
- O(660F3A,00,0,0,0,0,0,_ ), // #8 [ref=22x]
- O(000000,00,4,0,0,0,0,_ ), // #9 [ref=5x]
- V(000F38,00,0,0,0,0,0,_ ), // #10 [ref=3x]
- V(XOP_M9,00,1,0,0,0,0,_ ), // #11 [ref=3x]
- V(XOP_M9,00,6,0,0,0,0,_ ), // #12 [ref=2x]
- V(XOP_M9,00,5,0,0,0,0,_ ), // #13 [ref=1x]
- V(XOP_M9,00,3,0,0,0,0,_ ), // #14 [ref=1x]
- V(XOP_M9,00,2,0,0,0,0,_ ), // #15 [ref=1x]
- V(000F38,00,3,0,0,0,0,_ ), // #16 [ref=1x]
- V(000F38,00,2,0,0,0,0,_ ), // #17 [ref=1x]
- V(000F38,00,1,0,0,0,0,_ ), // #18 [ref=1x]
- O(660000,00,0,0,0,0,0,_ ), // #19 [ref=7x]
- O(000000,00,0,0,1,0,0,_ ), // #20 [ref=3x]
- O(000F01,00,0,0,0,0,0,_ ), // #21 [ref=25x]
- O(000F00,00,7,0,0,0,0,_ ), // #22 [ref=5x]
- O(660F00,00,7,0,0,0,0,_ ), // #23 [ref=2x]
- O(660F00,00,6,0,0,0,0,_ ), // #24 [ref=2x]
- O(000000,00,7,0,0,0,0,_ ), // #25 [ref=5x]
- O(000F00,00,1,0,1,0,0,_ ), // #26 [ref=2x]
- O(000F00,00,1,0,0,0,0,_ ), // #27 [ref=6x]
- O(F20F38,00,0,0,0,0,0,_ ), // #28 [ref=2x]
- O(000000,00,1,0,0,0,0,_ ), // #29 [ref=3x]
- O(000000,00,6,0,0,0,0,_ ), // #30 [ref=3x]
- O_FPU(00,D900,_) , // #31 [ref=29x]
- O_FPU(00,C000,0) , // #32 [ref=1x]
- O_FPU(00,DE00,_) , // #33 [ref=7x]
- O_FPU(00,0000,4) , // #34 [ref=4x]
- O_FPU(00,0000,6) , // #35 [ref=4x]
- O_FPU(9B,DB00,_) , // #36 [ref=2x]
- O_FPU(00,DA00,_) , // #37 [ref=5x]
- O_FPU(00,DB00,_) , // #38 [ref=8x]
- O_FPU(00,D000,2) , // #39 [ref=1x]
- O_FPU(00,DF00,_) , // #40 [ref=2x]
- O_FPU(00,D800,3) , // #41 [ref=1x]
- O_FPU(00,F000,6) , // #42 [ref=1x]
- O_FPU(00,F800,7) , // #43 [ref=1x]
- O_FPU(00,DD00,_) , // #44 [ref=3x]
- O_FPU(00,0000,0) , // #45 [ref=3x]
- O_FPU(00,0000,2) , // #46 [ref=3x]
- O_FPU(00,0000,3) , // #47 [ref=3x]
- O_FPU(00,0000,7) , // #48 [ref=3x]
- O_FPU(00,0000,1) , // #49 [ref=2x]
- O_FPU(00,0000,5) , // #50 [ref=2x]
- O_FPU(00,C800,1) , // #51 [ref=1x]
- O_FPU(9B,0000,6) , // #52 [ref=2x]
- O_FPU(9B,0000,7) , // #53 [ref=2x]
- O_FPU(00,E000,4) , // #54 [ref=1x]
- O_FPU(00,E800,5) , // #55 [ref=1x]
- O_FPU(00,0000,_) , // #56 [ref=1x]
- O(000F00,00,0,0,1,0,0,_ ), // #57 [ref=1x]
- O(000000,00,5,0,0,0,0,_ ), // #58 [ref=3x]
- V(660F00,00,0,1,0,0,0,_ ), // #59 [ref=7x]
- V(660F00,00,0,1,1,0,0,_ ), // #60 [ref=6x]
- V(000F00,00,0,1,1,0,0,_ ), // #61 [ref=7x]
- V(000F00,00,0,1,0,0,0,_ ), // #62 [ref=8x]
- V(660F00,00,0,0,0,0,0,_ ), // #63 [ref=15x]
- V(660F00,00,0,0,1,0,0,_ ), // #64 [ref=4x]
- V(000F00,00,0,0,1,0,0,_ ), // #65 [ref=4x]
- V(000F00,00,0,0,0,0,0,_ ), // #66 [ref=10x]
- V(660F3A,00,0,0,0,0,0,_ ), // #67 [ref=45x]
- V(660F3A,00,0,0,1,0,0,_ ), // #68 [ref=4x]
- O(000F00,00,2,0,0,0,0,_ ), // #69 [ref=5x]
- O(000F00,00,5,0,0,0,0,_ ), // #70 [ref=4x]
- O(000F00,00,3,0,0,0,0,_ ), // #71 [ref=5x]
- V(XOP_M9,00,0,0,0,0,0,_ ), // #72 [ref=32x]
- O(000F00,00,6,0,0,0,0,_ ), // #73 [ref=5x]
- V(XOP_MA,00,0,0,0,0,0,_ ), // #74 [ref=1x]
- V(XOP_MA,00,1,0,0,0,0,_ ), // #75 [ref=1x]
- O(000F38,00,0,0,0,0,0,_ ), // #76 [ref=23x]
- V(F20F38,00,0,0,0,0,0,_ ), // #77 [ref=3x]
- O(000000,00,3,0,0,0,0,_ ), // #78 [ref=3x]
- O(000F3A,00,0,0,0,0,0,_ ), // #79 [ref=4x]
- O(F30000,00,0,0,0,0,0,_ ), // #80 [ref=1x]
- O(000F0F,00,0,0,0,0,0,_ ), // #81 [ref=26x]
- V(F30F38,00,0,0,0,0,0,_ ), // #82 [ref=2x]
- O(000F3A,00,0,0,1,0,0,_ ), // #83 [ref=1x]
- O(660F3A,00,0,0,1,0,0,_ ), // #84 [ref=1x]
- O(F30F00,00,1,0,0,0,0,_ ), // #85 [ref=1x]
- O(F30F00,00,7,0,0,0,0,_ ), // #86 [ref=1x]
- V(F20F3A,00,0,0,0,0,0,_ ), // #87 [ref=1x]
- V(660F38,00,0,0,0,0,0,_ ), // #88 [ref=22x]
- O(000F00,00,4,0,0,0,0,_ ), // #89 [ref=4x]
- V(XOP_M9,00,7,0,0,0,0,_ ), // #90 [ref=1x]
- V(XOP_M9,00,4,0,0,0,0,_ ), // #91 [ref=1x]
- E(F20F38,00,0,2,0,0,2,T4X), // #92 [ref=6x]
- V(660F00,00,0,0,0,1,4,FV ), // #93 [ref=22x]
- V(000F00,00,0,0,0,0,4,FV ), // #94 [ref=16x]
- V(F20F00,00,0,0,0,1,3,T1S), // #95 [ref=10x]
- V(F30F00,00,0,0,0,0,2,T1S), // #96 [ref=10x]
- V(F20F00,00,0,0,0,0,0,_ ), // #97 [ref=4x]
- V(660F38,00,0,0,0,0,4,FVM), // #98 [ref=14x]
- E(660F3A,00,0,0,0,0,4,FV ), // #99 [ref=14x]
- E(660F3A,00,0,0,0,1,4,FV ), // #100 [ref=14x]
- E(660F38,00,0,0,0,0,4,FVM), // #101 [ref=9x]
- E(660F38,00,0,0,0,0,4,FV ), // #102 [ref=22x]
- E(660F38,00,0,0,0,1,4,FV ), // #103 [ref=28x]
- E(660F38,00,0,0,0,1,4,FVM), // #104 [ref=9x]
- V(660F38,00,0,1,0,0,0,_ ), // #105 [ref=2x]
- E(660F38,00,0,0,0,0,3,T2 ), // #106 [ref=2x]
- E(660F38,00,0,0,0,0,4,T4 ), // #107 [ref=2x]
- E(660F38,00,0,2,0,0,5,T8 ), // #108 [ref=2x]
- E(660F38,00,0,0,0,1,4,T2 ), // #109 [ref=2x]
- E(660F38,00,0,2,0,1,5,T4 ), // #110 [ref=2x]
- V(660F38,00,0,0,0,1,3,T1S), // #111 [ref=2x]
- V(660F38,00,0,0,0,0,2,T1S), // #112 [ref=14x]
- V(660F00,00,0,0,0,1,3,T1S), // #113 [ref=5x]
- V(000F00,00,0,0,0,0,2,T1S), // #114 [ref=2x]
- E(660F38,00,0,0,0,1,3,T1S), // #115 [ref=14x]
- E(660F38,00,0,0,0,0,2,T1S), // #116 [ref=14x]
- V(F30F00,00,0,0,0,0,3,HV ), // #117 [ref=1x]
- E(F20F38,00,0,0,0,0,0,_ ), // #118 [ref=1x]
- E(F30F38,00,0,0,0,0,0,_ ), // #119 [ref=7x]
- V(F20F00,00,0,0,0,1,4,FV ), // #120 [ref=1x]
- E(660F00,00,0,0,0,1,4,FV ), // #121 [ref=9x]
- E(000F00,00,0,0,0,1,4,FV ), // #122 [ref=3x]
- V(660F38,00,0,0,0,0,3,HVM), // #123 [ref=7x]
- V(660F00,00,0,0,0,0,4,FV ), // #124 [ref=11x]
- V(000F00,00,0,0,0,0,4,HV ), // #125 [ref=1x]
- V(660F3A,00,0,0,0,0,3,HVM), // #126 [ref=1x]
- E(660F00,00,0,0,0,0,3,HV ), // #127 [ref=4x]
- E(000F00,00,0,0,0,0,4,FV ), // #128 [ref=2x]
- E(F30F00,00,0,0,0,1,4,FV ), // #129 [ref=2x]
- V(F20F00,00,0,0,0,0,3,T1F), // #130 [ref=2x]
- E(F20F00,00,0,0,0,0,3,T1F), // #131 [ref=2x]
- V(F20F00,00,0,0,0,0,2,T1W), // #132 [ref=1x]
- V(F30F00,00,0,0,0,0,2,T1W), // #133 [ref=1x]
- V(F30F00,00,0,0,0,0,2,T1F), // #134 [ref=2x]
- E(F30F00,00,0,0,0,0,2,T1F), // #135 [ref=2x]
- V(F30F00,00,0,0,0,0,4,FV ), // #136 [ref=1x]
- E(F30F00,00,0,0,0,0,3,HV ), // #137 [ref=1x]
- E(F20F00,00,0,0,0,0,4,FV ), // #138 [ref=1x]
- E(F20F00,00,0,0,0,1,4,FV ), // #139 [ref=1x]
- E(F20F00,00,0,0,0,0,2,T1W), // #140 [ref=1x]
- E(F30F00,00,0,0,0,0,2,T1W), // #141 [ref=1x]
- E(660F3A,00,0,0,0,0,4,FVM), // #142 [ref=5x]
- E(660F38,00,0,2,0,1,4,FV ), // #143 [ref=3x]
- E(660F38,00,0,2,0,0,4,FV ), // #144 [ref=3x]
- V(660F3A,00,0,1,0,0,0,_ ), // #145 [ref=6x]
- E(660F3A,00,0,0,0,0,4,T4 ), // #146 [ref=4x]
- E(660F3A,00,0,2,0,0,5,T8 ), // #147 [ref=4x]
- E(660F3A,00,0,0,0,1,4,T2 ), // #148 [ref=4x]
- E(660F3A,00,0,2,0,1,5,T4 ), // #149 [ref=4x]
- V(660F3A,00,0,0,0,0,2,T1S), // #150 [ref=4x]
- E(660F3A,00,0,0,0,1,3,T1S), // #151 [ref=6x]
- E(660F3A,00,0,0,0,0,2,T1S), // #152 [ref=6x]
- V(660F38,00,0,0,1,1,4,FV ), // #153 [ref=20x]
- V(660F38,00,0,0,0,0,4,FV ), // #154 [ref=32x]
- V(660F38,00,0,0,1,1,3,T1S), // #155 [ref=12x]
- V(660F38,00,0,0,1,0,0,_ ), // #156 [ref=5x]
- E(660F38,00,1,2,0,1,3,T1S), // #157 [ref=2x]
- E(660F38,00,1,2,0,0,2,T1S), // #158 [ref=2x]
- E(660F38,00,2,2,0,1,3,T1S), // #159 [ref=2x]
- E(660F38,00,2,2,0,0,2,T1S), // #160 [ref=2x]
- V(660F3A,00,0,0,1,1,4,FV ), // #161 [ref=2x]
- V(000F00,00,2,0,0,0,0,_ ), // #162 [ref=1x]
- V(660F00,00,0,0,0,1,4,FVM), // #163 [ref=3x]
- V(000F00,00,0,0,0,0,4,FVM), // #164 [ref=3x]
- V(660F00,00,0,0,0,0,2,T1S), // #165 [ref=1x]
- V(F20F00,00,0,0,0,1,3,DUP), // #166 [ref=1x]
- E(660F00,00,0,0,0,0,4,FVM), // #167 [ref=1x]
- E(660F00,00,0,0,0,1,4,FVM), // #168 [ref=1x]
- V(F30F00,00,0,0,0,0,0,_ ), // #169 [ref=3x]
- E(F20F00,00,0,0,0,1,4,FVM), // #170 [ref=1x]
- E(F30F00,00,0,0,0,0,4,FVM), // #171 [ref=1x]
- E(F30F00,00,0,0,0,1,4,FVM), // #172 [ref=1x]
- E(F20F00,00,0,0,0,0,4,FVM), // #173 [ref=1x]
- V(000F00,00,0,0,0,0,3,T2 ), // #174 [ref=2x]
- V(660F00,00,0,0,0,0,4,FVM), // #175 [ref=33x]
- V(F30F00,00,0,0,0,0,4,FVM), // #176 [ref=3x]
- O(F30F00,00,6,0,0,0,0,_ ), // #177 [ref=1x]
- V(660F3A,00,0,0,0,0,4,FVM), // #178 [ref=2x]
- E(660F00,00,0,0,0,0,4,FV ), // #179 [ref=5x]
- V(660F38,00,0,0,0,0,0,T1S), // #180 [ref=1x]
- E(F30F38,00,0,0,0,1,0,_ ), // #181 [ref=5x]
- V(660F38,00,0,0,0,0,1,T1S), // #182 [ref=1x]
- V(XOP_M8,00,0,0,0,0,0,_ ), // #183 [ref=22x]
- V(660F38,00,0,0,0,1,4,FVM), // #184 [ref=2x]
- E(660F3A,00,0,0,0,1,4,FVM), // #185 [ref=2x]
- E(660F38,00,0,0,0,0,0,T1S), // #186 [ref=2x]
- E(660F38,00,0,0,0,1,1,T1S), // #187 [ref=2x]
- V(660F38,00,0,0,0,1,4,FV ), // #188 [ref=3x]
- E(660F38,00,0,0,1,1,4,FV ), // #189 [ref=1x]
- V(660F3A,00,0,0,0,0,0,T1S), // #190 [ref=2x]
- V(660F3A,00,0,0,1,1,3,T1S), // #191 [ref=2x]
- V(660F3A,00,0,0,0,0,1,T1S), // #192 [ref=1x]
- V(660F00,00,0,0,0,0,1,T1S), // #193 [ref=1x]
- E(F30F38,00,0,0,0,0,2,QVM), // #194 [ref=6x]
- E(F30F38,00,0,0,0,0,3,HVM), // #195 [ref=9x]
- E(F30F38,00,0,0,0,0,1,OVM), // #196 [ref=3x]
- V(660F38,00,0,0,0,0,2,QVM), // #197 [ref=4x]
- V(660F38,00,0,0,0,0,1,OVM), // #198 [ref=2x]
- E(660F00,00,1,0,0,0,4,FV ), // #199 [ref=1x]
- E(660F00,00,1,0,0,1,4,FV ), // #200 [ref=1x]
- V(F20F00,00,0,0,0,0,4,FVM), // #201 [ref=1x]
- V(660F00,00,0,0,0,0,4,128), // #202 [ref=5x]
- V(660F00,00,7,0,0,0,4,FVM), // #203 [ref=1x]
- V(660F00,00,0,0,0,1,4,128), // #204 [ref=2x]
- E(660F00,00,0,0,0,1,4,128), // #205 [ref=1x]
- V(660F00,00,3,0,0,0,4,FVM), // #206 [ref=1x]
- E(F30F38,00,0,0,0,0,4,FVM), // #207 [ref=1x]
- E(F30F38,00,0,0,0,0,4,FV ), // #208 [ref=1x]
- E(F30F38,00,0,0,0,1,4,FV ), // #209 [ref=1x]
- E(F30F38,00,0,0,0,1,4,FVM), // #210 [ref=1x]
- E(660F38,00,5,2,0,1,3,T1S), // #211 [ref=2x]
- E(660F38,00,5,2,0,0,2,T1S), // #212 [ref=2x]
- E(660F38,00,6,2,0,1,3,T1S), // #213 [ref=2x]
- E(660F38,00,6,2,0,0,2,T1S), // #214 [ref=2x]
- V(000F00,00,3,0,0,0,0,_ ), // #215 [ref=1x]
- O(F30F00,00,2,0,0,0,0,_ ), // #216 [ref=1x]
- O(F30F00,00,3,0,0,0,0,_ ), // #217 [ref=1x]
- O(000F00,00,5,0,1,0,0,_ ), // #218 [ref=2x]
- O(000F00,00,3,0,1,0,0,_ ), // #219 [ref=1x]
- O(000F00,00,4,0,1,0,0,_ ), // #220 [ref=2x]
- O(000F00,00,6,0,1,0,0,_ ) // #221 [ref=1x]
+ O(000000,00,0,0,0,0,0,0 ), // #0 [ref=56x]
+ O(000000,00,2,0,0,0,0,0 ), // #1 [ref=4x]
+ O(660F38,00,0,0,0,0,0,0 ), // #2 [ref=43x]
+ O(660F00,00,0,0,0,0,0,0 ), // #3 [ref=38x]
+ O(000F00,00,0,0,0,0,0,0 ), // #4 [ref=231x]
+ O(F20F00,00,0,0,0,0,0,0 ), // #5 [ref=24x]
+ O(F30F00,00,0,0,0,0,0,0 ), // #6 [ref=29x]
+ O(F30F38,00,0,0,0,0,0,0 ), // #7 [ref=2x]
+ O(660F3A,00,0,0,0,0,0,0 ), // #8 [ref=22x]
+ O(000000,00,4,0,0,0,0,0 ), // #9 [ref=5x]
+ V(000F38,00,0,0,0,0,0,None), // #10 [ref=6x]
+ V(XOP_M9,00,1,0,0,0,0,None), // #11 [ref=3x]
+ V(XOP_M9,00,6,0,0,0,0,None), // #12 [ref=2x]
+ V(XOP_M9,00,5,0,0,0,0,None), // #13 [ref=1x]
+ V(XOP_M9,00,3,0,0,0,0,None), // #14 [ref=1x]
+ V(XOP_M9,00,2,0,0,0,0,None), // #15 [ref=1x]
+ V(000F38,00,3,0,0,0,0,None), // #16 [ref=1x]
+ V(000F38,00,2,0,0,0,0,None), // #17 [ref=1x]
+ V(000F38,00,1,0,0,0,0,None), // #18 [ref=1x]
+ O(660000,00,0,0,0,0,0,0 ), // #19 [ref=7x]
+ O(000000,00,0,0,1,0,0,0 ), // #20 [ref=3x]
+ O(000F01,00,0,0,0,0,0,0 ), // #21 [ref=29x]
+ O(000F00,00,7,0,0,0,0,0 ), // #22 [ref=5x]
+ O(660F00,00,7,0,0,0,0,0 ), // #23 [ref=1x]
+ O(F30F00,00,6,0,0,0,0,0 ), // #24 [ref=4x]
+ O(F30F01,00,0,0,0,0,0,0 ), // #25 [ref=9x]
+ O(660F00,00,6,0,0,0,0,0 ), // #26 [ref=3x]
+ O(000000,00,7,0,0,0,0,0 ), // #27 [ref=5x]
+ O(000F00,00,1,0,1,0,0,0 ), // #28 [ref=2x]
+ O(000F00,00,1,0,0,0,0,0 ), // #29 [ref=6x]
+ O(F20F38,00,0,0,0,0,0,0 ), // #30 [ref=2x]
+ O(000000,00,1,0,0,0,0,0 ), // #31 [ref=3x]
+ O(000000,00,6,0,0,0,0,0 ), // #32 [ref=3x]
+ O(F30F00,00,7,0,0,0,0,3 ), // #33 [ref=1x]
+ O(F30F00,00,7,0,0,0,0,2 ), // #34 [ref=1x]
+ O_FPU(00,D900,0) , // #35 [ref=29x]
+ O_FPU(00,C000,0) , // #36 [ref=1x]
+ O_FPU(00,DE00,0) , // #37 [ref=7x]
+ O_FPU(00,0000,4) , // #38 [ref=4x]
+ O_FPU(00,0000,6) , // #39 [ref=4x]
+ O_FPU(9B,DB00,0) , // #40 [ref=2x]
+ O_FPU(00,DA00,0) , // #41 [ref=5x]
+ O_FPU(00,DB00,0) , // #42 [ref=8x]
+ O_FPU(00,D000,2) , // #43 [ref=1x]
+ O_FPU(00,DF00,0) , // #44 [ref=2x]
+ O_FPU(00,D800,3) , // #45 [ref=1x]
+ O_FPU(00,F000,6) , // #46 [ref=1x]
+ O_FPU(00,F800,7) , // #47 [ref=1x]
+ O_FPU(00,DD00,0) , // #48 [ref=3x]
+ O_FPU(00,0000,0) , // #49 [ref=4x]
+ O_FPU(00,0000,2) , // #50 [ref=3x]
+ O_FPU(00,0000,3) , // #51 [ref=3x]
+ O_FPU(00,0000,7) , // #52 [ref=3x]
+ O_FPU(00,0000,1) , // #53 [ref=2x]
+ O_FPU(00,0000,5) , // #54 [ref=2x]
+ O_FPU(00,C800,1) , // #55 [ref=1x]
+ O_FPU(9B,0000,6) , // #56 [ref=2x]
+ O_FPU(9B,0000,7) , // #57 [ref=2x]
+ O_FPU(00,E000,4) , // #58 [ref=1x]
+ O_FPU(00,E800,5) , // #59 [ref=1x]
+ O(000F00,00,0,0,1,0,0,0 ), // #60 [ref=3x]
+ O(F30F3A,00,0,0,0,0,0,0 ), // #61 [ref=1x]
+ O(000000,00,5,0,0,0,0,0 ), // #62 [ref=4x]
+ O(F30F00,00,5,0,0,0,0,0 ), // #63 [ref=2x]
+ O(F30F00,00,5,0,1,0,0,0 ), // #64 [ref=1x]
+ V(660F00,00,0,1,0,0,0,None), // #65 [ref=7x]
+ V(660F00,00,0,1,1,0,0,None), // #66 [ref=6x]
+ V(000F00,00,0,1,1,0,0,None), // #67 [ref=7x]
+ V(000F00,00,0,1,0,0,0,None), // #68 [ref=8x]
+ V(660F00,00,0,0,0,0,0,None), // #69 [ref=15x]
+ V(660F00,00,0,0,1,0,0,None), // #70 [ref=4x]
+ V(000F00,00,0,0,1,0,0,None), // #71 [ref=4x]
+ V(000F00,00,0,0,0,0,0,None), // #72 [ref=10x]
+ V(660F3A,00,0,0,0,0,0,None), // #73 [ref=47x]
+ V(660F3A,00,0,0,1,0,0,None), // #74 [ref=4x]
+ O(000000,00,3,0,0,0,0,0 ), // #75 [ref=4x]
+ O(000F00,00,2,0,0,0,0,0 ), // #76 [ref=5x]
+ O(000F00,00,5,0,0,0,0,0 ), // #77 [ref=4x]
+ O(000F00,00,3,0,0,0,0,0 ), // #78 [ref=5x]
+ V(XOP_M9,00,0,0,0,0,0,None), // #79 [ref=32x]
+ O(000F00,00,6,0,0,0,0,0 ), // #80 [ref=5x]
+ V(XOP_MA,00,0,0,0,0,0,None), // #81 [ref=1x]
+ V(XOP_MA,00,1,0,0,0,0,None), // #82 [ref=1x]
+ O(000F38,00,0,0,0,0,0,0 ), // #83 [ref=24x]
+ V(F20F38,00,0,0,0,0,0,None), // #84 [ref=6x]
+ O(000F3A,00,0,0,0,0,0,0 ), // #85 [ref=4x]
+ O(F30000,00,0,0,0,0,0,0 ), // #86 [ref=1x]
+ O(000F0F,00,0,0,0,0,0,0 ), // #87 [ref=26x]
+ V(F30F38,00,0,0,0,0,0,None), // #88 [ref=5x]
+ O(000F3A,00,0,0,1,0,0,0 ), // #89 [ref=1x]
+ O(660F3A,00,0,0,1,0,0,0 ), // #90 [ref=1x]
+ O(F30F00,00,4,0,0,0,0,0 ), // #91 [ref=1x]
+ O(F20F01,00,0,0,0,0,0,0 ), // #92 [ref=4x]
+ O(F30F00,00,1,0,0,0,0,0 ), // #93 [ref=3x]
+ O(F30F00,00,7,0,0,0,0,0 ), // #94 [ref=1x]
+ V(F20F3A,00,0,0,0,0,0,None), // #95 [ref=1x]
+ V(660F38,00,0,0,0,0,0,None), // #96 [ref=26x]
+ O(000F00,00,4,0,0,0,0,0 ), // #97 [ref=4x]
+ V(XOP_M9,00,7,0,0,0,0,None), // #98 [ref=1x]
+ V(XOP_M9,00,4,0,0,0,0,None), // #99 [ref=1x]
+ O(F20F00,00,6,0,0,0,0,0 ), // #100 [ref=1x]
+ E(F20F38,00,0,2,0,0,4,None), // #101 [ref=4x]
+ E(F20F38,00,0,0,0,0,4,None), // #102 [ref=2x]
+ V(660F00,00,0,0,0,1,4,ByLL), // #103 [ref=25x]
+ E(00MAP5,00,0,0,0,0,4,ByLL), // #104 [ref=10x]
+ V(000F00,00,0,0,0,0,4,ByLL), // #105 [ref=19x]
+ V(F20F00,00,0,0,0,1,3,None), // #106 [ref=10x]
+ E(F3MAP5,00,0,0,0,0,1,None), // #107 [ref=13x]
+ V(F30F00,00,0,0,0,0,2,None), // #108 [ref=12x]
+ V(F20F00,00,0,0,0,0,0,None), // #109 [ref=4x]
+ V(660F38,00,0,0,0,0,4,ByLL), // #110 [ref=50x]
+ E(660F3A,00,0,0,0,0,4,ByLL), // #111 [ref=17x]
+ E(660F3A,00,0,0,0,1,4,ByLL), // #112 [ref=18x]
+ E(660F38,00,0,0,0,1,4,ByLL), // #113 [ref=40x]
+ E(660F38,00,0,0,0,0,4,ByLL), // #114 [ref=25x]
+ V(660F38,00,0,1,0,0,0,None), // #115 [ref=2x]
+ E(660F38,00,0,0,0,0,3,None), // #116 [ref=2x]
+ E(660F38,00,0,0,0,0,4,None), // #117 [ref=2x]
+ E(660F38,00,0,2,0,0,5,None), // #118 [ref=2x]
+ E(660F38,00,0,0,0,1,4,None), // #119 [ref=2x]
+ E(660F38,00,0,2,0,1,5,None), // #120 [ref=2x]
+ V(660F38,00,0,0,0,1,3,None), // #121 [ref=2x]
+ V(660F38,00,0,0,0,0,2,None), // #122 [ref=14x]
+ E(000F3A,00,0,0,0,0,4,ByLL), // #123 [ref=5x]
+ E(F30F3A,00,0,0,0,0,1,None), // #124 [ref=1x]
+ V(660F00,00,0,0,0,1,3,None), // #125 [ref=5x]
+ E(00MAP5,00,0,0,0,0,1,None), // #126 [ref=2x]
+ V(000F00,00,0,0,0,0,2,None), // #127 [ref=2x]
+ E(660F38,00,0,0,0,1,3,None), // #128 [ref=14x]
+ E(660F38,00,0,0,0,0,2,None), // #129 [ref=14x]
+ V(F30F00,00,0,0,0,0,3,ByLL), // #130 [ref=1x]
+ E(F20F38,00,0,0,0,0,4,ByLL), // #131 [ref=2x]
+ E(F30F38,00,0,0,0,0,4,ByLL), // #132 [ref=4x]
+ V(F20F00,00,0,0,0,1,4,ByLL), // #133 [ref=1x]
+ E(66MAP5,00,0,0,0,1,4,ByLL), // #134 [ref=1x]
+ E(660F00,00,0,0,0,1,4,ByLL), // #135 [ref=10x]
+ E(000F00,00,0,0,0,1,4,ByLL), // #136 [ref=3x]
+ E(66MAP5,00,0,0,0,0,3,ByLL), // #137 [ref=1x]
+ E(00MAP5,00,0,0,0,0,2,ByLL), // #138 [ref=1x]
+ V(660F38,00,0,0,0,0,3,ByLL), // #139 [ref=7x]
+ E(66MAP6,00,0,0,0,0,3,ByLL), // #140 [ref=1x]
+ E(66MAP5,00,0,0,0,0,2,ByLL), // #141 [ref=4x]
+ E(00MAP5,00,0,0,0,0,3,ByLL), // #142 [ref=2x]
+ E(66MAP5,00,0,0,0,0,4,ByLL), // #143 [ref=3x]
+ V(660F00,00,0,0,0,0,4,ByLL), // #144 [ref=43x]
+ V(000F00,00,0,0,0,0,3,ByLL), // #145 [ref=1x]
+ V(660F3A,00,0,0,0,0,3,ByLL), // #146 [ref=1x]
+ E(660F00,00,0,0,0,0,3,ByLL), // #147 [ref=4x]
+ E(000F00,00,0,0,0,0,4,ByLL), // #148 [ref=2x]
+ E(F30F00,00,0,0,0,1,4,ByLL), // #149 [ref=3x]
+ E(00MAP5,00,0,0,0,1,4,ByLL), // #150 [ref=1x]
+ E(F2MAP5,00,0,0,0,1,3,None), // #151 [ref=1x]
+ V(F20F00,00,0,0,0,0,3,None), // #152 [ref=2x]
+ E(F20F00,00,0,0,0,0,3,None), // #153 [ref=2x]
+ E(00MAP6,00,0,0,0,0,1,None), // #154 [ref=1x]
+ V(F20F00,00,0,0,0,0,2,T1W ), // #155 [ref=1x]
+ E(F3MAP5,00,0,0,0,0,2,T1W ), // #156 [ref=2x]
+ V(F30F00,00,0,0,0,0,2,T1W ), // #157 [ref=1x]
+ E(00MAP5,00,0,0,0,0,2,None), // #158 [ref=1x]
+ E(F30F00,00,0,0,0,0,2,None), // #159 [ref=2x]
+ E(F3MAP5,00,0,0,0,0,3,ByLL), // #160 [ref=1x]
+ V(F30F00,00,0,0,0,0,4,ByLL), // #161 [ref=4x]
+ E(F30F00,00,0,0,0,0,3,ByLL), // #162 [ref=1x]
+ E(F2MAP5,00,0,0,0,0,4,ByLL), // #163 [ref=2x]
+ E(F20F00,00,0,0,0,0,4,ByLL), // #164 [ref=2x]
+ E(F2MAP5,00,0,0,0,1,4,ByLL), // #165 [ref=1x]
+ E(F20F00,00,0,0,0,1,4,ByLL), // #166 [ref=2x]
+ E(F20F00,00,0,0,0,0,2,T1W ), // #167 [ref=1x]
+ E(F30F00,00,0,0,0,0,2,T1W ), // #168 [ref=1x]
+ E(F3MAP5,00,0,0,0,0,4,ByLL), // #169 [ref=1x]
+ E(660F38,00,0,2,0,1,4,ByLL), // #170 [ref=3x]
+ E(660F38,00,0,2,0,0,4,ByLL), // #171 [ref=3x]
+ V(660F3A,00,0,1,0,0,0,None), // #172 [ref=6x]
+ E(660F3A,00,0,0,0,0,4,None), // #173 [ref=4x]
+ E(660F3A,00,0,2,0,0,5,None), // #174 [ref=4x]
+ E(660F3A,00,0,0,0,1,4,None), // #175 [ref=4x]
+ E(660F3A,00,0,2,0,1,5,None), // #176 [ref=4x]
+ V(660F3A,00,0,0,0,0,2,None), // #177 [ref=4x]
+ E(F2MAP6,00,0,0,0,0,4,ByLL), // #178 [ref=2x]
+ E(F2MAP6,00,0,0,0,0,2,None), // #179 [ref=2x]
+ E(660F3A,00,0,0,0,1,3,None), // #180 [ref=6x]
+ E(660F3A,00,0,0,0,0,2,None), // #181 [ref=6x]
+ V(660F38,00,0,0,1,1,4,ByLL), // #182 [ref=20x]
+ E(66MAP6,00,0,0,0,0,4,ByLL), // #183 [ref=22x]
+ V(660F38,00,0,0,1,1,3,None), // #184 [ref=12x]
+ E(66MAP6,00,0,0,0,0,1,None), // #185 [ref=16x]
+ E(F3MAP6,00,0,0,0,0,4,ByLL), // #186 [ref=2x]
+ E(F3MAP6,00,0,0,0,0,2,None), // #187 [ref=2x]
+ E(000F3A,00,0,0,0,0,1,None), // #188 [ref=4x]
+ V(660F38,00,0,0,1,0,0,None), // #189 [ref=5x]
+ E(660F38,00,1,2,0,1,3,None), // #190 [ref=2x]
+ E(660F38,00,1,2,0,0,2,None), // #191 [ref=2x]
+ E(660F38,00,2,2,0,1,3,None), // #192 [ref=2x]
+ E(660F38,00,2,2,0,0,2,None), // #193 [ref=2x]
+ V(660F3A,00,0,0,1,1,4,ByLL), // #194 [ref=2x]
+ V(000F00,00,2,0,0,0,0,None), // #195 [ref=1x]
+ V(660F00,00,0,0,0,0,2,None), // #196 [ref=1x]
+ V(F20F00,00,0,0,0,1,3,DUP ), // #197 [ref=1x]
+ E(660F00,00,0,0,0,0,4,ByLL), // #198 [ref=6x]
+ V(F30F00,00,0,0,0,0,0,None), // #199 [ref=3x]
+ E(F30F00,00,0,0,0,0,4,ByLL), // #200 [ref=1x]
+ V(000F00,00,0,0,0,0,3,None), // #201 [ref=2x]
+ E(66MAP5,00,0,0,0,0,1,None), // #202 [ref=1x]
+ E(F20F38,00,0,0,0,1,4,ByLL), // #203 [ref=1x]
+ V(660F3A,00,0,0,0,0,4,ByLL), // #204 [ref=2x]
+ E(F30F38,00,0,0,0,1,0,None), // #205 [ref=5x]
+ E(F30F38,00,0,0,0,0,0,None), // #206 [ref=5x]
+ V(660F38,00,0,0,0,0,1,None), // #207 [ref=1x]
+ V(XOP_M8,00,0,0,0,0,0,None), // #208 [ref=22x]
+ V(660F38,00,0,0,0,1,4,ByLL), // #209 [ref=4x]
+ E(660F38,00,0,0,0,0,0,None), // #210 [ref=2x]
+ E(660F38,00,0,0,0,1,1,None), // #211 [ref=2x]
+ E(660F38,00,0,0,1,1,4,ByLL), // #212 [ref=1x]
+ V(660F3A,00,0,0,1,1,3,None), // #213 [ref=2x]
+ V(660F3A,00,0,0,0,0,1,None), // #214 [ref=1x]
+ V(660F00,00,0,0,0,0,1,None), // #215 [ref=1x]
+ E(F30F38,00,0,0,0,0,2,ByLL), // #216 [ref=6x]
+ E(F30F38,00,0,0,0,0,3,ByLL), // #217 [ref=9x]
+ E(F30F38,00,0,0,0,0,1,ByLL), // #218 [ref=3x]
+ V(660F38,00,0,0,0,0,2,ByLL), // #219 [ref=4x]
+ V(660F38,00,0,0,0,0,1,ByLL), // #220 [ref=2x]
+ E(660F00,00,1,0,0,0,4,ByLL), // #221 [ref=1x]
+ E(660F00,00,1,0,0,1,4,ByLL), // #222 [ref=1x]
+ V(F20F00,00,0,0,0,0,4,ByLL), // #223 [ref=1x]
+ V(660F00,00,0,0,0,0,4,None), // #224 [ref=6x]
+ V(660F00,00,7,0,0,0,4,ByLL), // #225 [ref=1x]
+ V(660F00,00,0,0,0,1,4,None), // #226 [ref=2x]
+ E(660F00,00,0,0,0,1,4,None), // #227 [ref=1x]
+ V(660F00,00,3,0,0,0,4,ByLL), // #228 [ref=1x]
+ E(F30F38,00,0,0,0,1,4,ByLL), // #229 [ref=2x]
+ E(660F38,00,5,2,0,1,3,None), // #230 [ref=2x]
+ E(660F38,00,5,2,0,0,2,None), // #231 [ref=2x]
+ E(660F38,00,6,2,0,1,3,None), // #232 [ref=2x]
+ E(660F38,00,6,2,0,0,2,None), // #233 [ref=2x]
+ V(000F00,00,3,0,0,0,0,None), // #234 [ref=1x]
+ O(F30F00,00,2,0,0,0,0,0 ), // #235 [ref=1x]
+ O(F30F00,00,3,0,0,0,0,0 ), // #236 [ref=1x]
+ O(000F38,00,0,0,1,0,0,0 ), // #237 [ref=1x]
+ O(660F38,00,0,0,1,0,0,0 ), // #238 [ref=1x]
+ O(000F00,00,5,0,1,0,0,0 ), // #239 [ref=2x]
+ O(000F00,00,3,0,1,0,0,0 ), // #240 [ref=1x]
+ O(000F00,00,4,0,1,0,0,0 ), // #241 [ref=2x]
+ O(000F00,00,6,0,1,0,0,0 ) // #242 [ref=1x]
};
// ----------------------------------------------------------------------------
// ${MainOpcodeTable:End}
@@ -1839,565 +1996,620 @@ const uint32_t InstDB::_mainOpcodeTable[] = {
// ${AltOpcodeTable:Begin}
// ------------------- Automatically generated, do not edit -------------------
const uint32_t InstDB::_altOpcodeTable[] = {
- 0 , // #0 [ref=1359x]
- O(660F00,1B,_,_,_,_,_,_ ), // #1 [ref=1x]
- O(000F00,BA,4,_,x,_,_,_ ), // #2 [ref=1x]
- O(000F00,BA,7,_,x,_,_,_ ), // #3 [ref=1x]
- O(000F00,BA,6,_,x,_,_,_ ), // #4 [ref=1x]
- O(000F00,BA,5,_,x,_,_,_ ), // #5 [ref=1x]
- O(000000,48,_,_,x,_,_,_ ), // #6 [ref=1x]
- O(660F00,78,0,_,_,_,_,_ ), // #7 [ref=1x]
- O_FPU(00,00DF,5) , // #8 [ref=1x]
- O_FPU(00,00DF,7) , // #9 [ref=1x]
- O_FPU(00,00DD,1) , // #10 [ref=1x]
- O_FPU(00,00DB,5) , // #11 [ref=1x]
- O_FPU(00,DFE0,_) , // #12 [ref=1x]
- O(000000,DB,7,_,_,_,_,_ ), // #13 [ref=1x]
- O_FPU(9B,DFE0,_) , // #14 [ref=1x]
- O(000000,E4,_,_,_,_,_,_ ), // #15 [ref=1x]
- O(000000,40,_,_,x,_,_,_ ), // #16 [ref=1x]
- O(F20F00,78,_,_,_,_,_,_ ), // #17 [ref=1x]
- O(000000,77,_,_,_,_,_,_ ), // #18 [ref=2x]
- O(000000,73,_,_,_,_,_,_ ), // #19 [ref=3x]
- O(000000,72,_,_,_,_,_,_ ), // #20 [ref=3x]
- O(000000,76,_,_,_,_,_,_ ), // #21 [ref=2x]
- O(000000,74,_,_,_,_,_,_ ), // #22 [ref=2x]
- O(000000,E3,_,_,_,_,_,_ ), // #23 [ref=1x]
- O(000000,7F,_,_,_,_,_,_ ), // #24 [ref=2x]
- O(000000,7D,_,_,_,_,_,_ ), // #25 [ref=2x]
- O(000000,7C,_,_,_,_,_,_ ), // #26 [ref=2x]
- O(000000,7E,_,_,_,_,_,_ ), // #27 [ref=2x]
- O(000000,EB,_,_,_,_,_,_ ), // #28 [ref=1x]
- O(000000,75,_,_,_,_,_,_ ), // #29 [ref=2x]
- O(000000,71,_,_,_,_,_,_ ), // #30 [ref=1x]
- O(000000,7B,_,_,_,_,_,_ ), // #31 [ref=2x]
- O(000000,79,_,_,_,_,_,_ ), // #32 [ref=1x]
- O(000000,70,_,_,_,_,_,_ ), // #33 [ref=1x]
- O(000000,7A,_,_,_,_,_,_ ), // #34 [ref=2x]
- O(000000,78,_,_,_,_,_,_ ), // #35 [ref=1x]
- V(660F00,92,_,0,0,_,_,_ ), // #36 [ref=1x]
- V(F20F00,92,_,0,0,_,_,_ ), // #37 [ref=1x]
- V(F20F00,92,_,0,1,_,_,_ ), // #38 [ref=1x]
- V(000F00,92,_,0,0,_,_,_ ), // #39 [ref=1x]
- O(000000,E2,_,_,_,_,_,_ ), // #40 [ref=1x]
- O(000000,E1,_,_,_,_,_,_ ), // #41 [ref=1x]
- O(000000,E0,_,_,_,_,_,_ ), // #42 [ref=1x]
- O(660F00,29,_,_,_,_,_,_ ), // #43 [ref=1x]
- O(000F00,29,_,_,_,_,_,_ ), // #44 [ref=1x]
- O(000F38,F1,_,_,x,_,_,_ ), // #45 [ref=1x]
- O(000F00,7E,_,_,_,_,_,_ ), // #46 [ref=1x]
- O(660F00,7F,_,_,_,_,_,_ ), // #47 [ref=1x]
- O(F30F00,7F,_,_,_,_,_,_ ), // #48 [ref=1x]
- O(660F00,17,_,_,_,_,_,_ ), // #49 [ref=1x]
- O(000F00,17,_,_,_,_,_,_ ), // #50 [ref=1x]
- O(660F00,13,_,_,_,_,_,_ ), // #51 [ref=1x]
- O(000F00,13,_,_,_,_,_,_ ), // #52 [ref=1x]
- O(660F00,E7,_,_,_,_,_,_ ), // #53 [ref=1x]
- O(660F00,2B,_,_,_,_,_,_ ), // #54 [ref=1x]
- O(000F00,2B,_,_,_,_,_,_ ), // #55 [ref=1x]
- O(000F00,E7,_,_,_,_,_,_ ), // #56 [ref=1x]
- O(F20F00,2B,_,_,_,_,_,_ ), // #57 [ref=1x]
- O(F30F00,2B,_,_,_,_,_,_ ), // #58 [ref=1x]
- O(000F00,7E,_,_,x,_,_,_ ), // #59 [ref=1x]
- O(F20F00,11,_,_,_,_,_,_ ), // #60 [ref=1x]
- O(F30F00,11,_,_,_,_,_,_ ), // #61 [ref=1x]
- O(660F00,11,_,_,_,_,_,_ ), // #62 [ref=1x]
- O(000F00,11,_,_,_,_,_,_ ), // #63 [ref=1x]
- O(000000,E6,_,_,_,_,_,_ ), // #64 [ref=1x]
- O(000F3A,15,_,_,_,_,_,_ ), // #65 [ref=1x]
- O(000000,58,_,_,_,_,_,_ ), // #66 [ref=1x]
- O(000F00,72,6,_,_,_,_,_ ), // #67 [ref=1x]
- O(660F00,73,7,_,_,_,_,_ ), // #68 [ref=1x]
- O(000F00,73,6,_,_,_,_,_ ), // #69 [ref=1x]
- O(000F00,71,6,_,_,_,_,_ ), // #70 [ref=1x]
- O(000F00,72,4,_,_,_,_,_ ), // #71 [ref=1x]
- O(000F00,71,4,_,_,_,_,_ ), // #72 [ref=1x]
- O(000F00,72,2,_,_,_,_,_ ), // #73 [ref=1x]
- O(660F00,73,3,_,_,_,_,_ ), // #74 [ref=1x]
- O(000F00,73,2,_,_,_,_,_ ), // #75 [ref=1x]
- O(000F00,71,2,_,_,_,_,_ ), // #76 [ref=1x]
- O(000000,50,_,_,_,_,_,_ ), // #77 [ref=1x]
- O(000000,F6,_,_,x,_,_,_ ), // #78 [ref=1x]
- V(660F38,92,_,x,_,1,3,T1S), // #79 [ref=1x]
- V(660F38,92,_,x,_,0,2,T1S), // #80 [ref=1x]
- V(660F38,93,_,x,_,1,3,T1S), // #81 [ref=1x]
- V(660F38,93,_,x,_,0,2,T1S), // #82 [ref=1x]
- V(660F38,2F,_,x,0,_,_,_ ), // #83 [ref=1x]
- V(660F38,2E,_,x,0,_,_,_ ), // #84 [ref=1x]
- V(660F00,29,_,x,I,1,4,FVM), // #85 [ref=1x]
- V(000F00,29,_,x,I,0,4,FVM), // #86 [ref=1x]
- V(660F00,7E,_,0,0,0,2,T1S), // #87 [ref=1x]
- V(660F00,7F,_,x,I,_,_,_ ), // #88 [ref=1x]
- E(660F00,7F,_,x,_,0,4,FVM), // #89 [ref=1x]
- E(660F00,7F,_,x,_,1,4,FVM), // #90 [ref=1x]
- V(F30F00,7F,_,x,I,_,_,_ ), // #91 [ref=1x]
- E(F20F00,7F,_,x,_,1,4,FVM), // #92 [ref=1x]
- E(F30F00,7F,_,x,_,0,4,FVM), // #93 [ref=1x]
- E(F30F00,7F,_,x,_,1,4,FVM), // #94 [ref=1x]
- E(F20F00,7F,_,x,_,0,4,FVM), // #95 [ref=1x]
- V(660F00,17,_,0,I,1,3,T1S), // #96 [ref=1x]
- V(000F00,17,_,0,I,0,3,T2 ), // #97 [ref=1x]
- V(660F00,13,_,0,I,1,3,T1S), // #98 [ref=1x]
- V(000F00,13,_,0,I,0,3,T2 ), // #99 [ref=1x]
- V(660F00,7E,_,0,I,1,3,T1S), // #100 [ref=1x]
- V(F20F00,11,_,I,I,1,3,T1S), // #101 [ref=1x]
- V(F30F00,11,_,I,I,0,2,T1S), // #102 [ref=1x]
- V(660F00,11,_,x,I,1,4,FVM), // #103 [ref=1x]
- V(000F00,11,_,x,I,0,4,FVM), // #104 [ref=1x]
- E(660F38,7A,_,x,0,0,0,T1S), // #105 [ref=1x]
- E(660F38,7C,_,x,0,0,0,T1S), // #106 [ref=1x]
- E(660F38,7C,_,x,0,1,0,T1S), // #107 [ref=1x]
- E(660F38,7B,_,x,0,0,0,T1S), // #108 [ref=1x]
- V(660F3A,05,_,x,0,1,4,FV ), // #109 [ref=1x]
- V(660F3A,04,_,x,0,0,4,FV ), // #110 [ref=1x]
- V(660F3A,01,_,x,1,1,4,FV ), // #111 [ref=1x]
- V(660F3A,00,_,x,1,1,4,FV ), // #112 [ref=1x]
- V(660F38,90,_,x,_,0,2,T1S), // #113 [ref=1x]
- V(660F38,90,_,x,_,1,3,T1S), // #114 [ref=1x]
- V(660F38,91,_,x,_,0,2,T1S), // #115 [ref=1x]
- V(660F38,91,_,x,_,1,3,T1S), // #116 [ref=1x]
- V(660F38,8E,_,x,0,_,_,_ ), // #117 [ref=1x]
- V(660F38,8E,_,x,1,_,_,_ ), // #118 [ref=1x]
- V(XOP_M8,C0,_,0,x,_,_,_ ), // #119 [ref=1x]
- V(XOP_M8,C2,_,0,x,_,_,_ ), // #120 [ref=1x]
- V(XOP_M8,C3,_,0,x,_,_,_ ), // #121 [ref=1x]
- V(XOP_M8,C1,_,0,x,_,_,_ ), // #122 [ref=1x]
- V(660F00,72,6,x,I,0,4,FV ), // #123 [ref=1x]
- V(660F00,73,6,x,I,1,4,FV ), // #124 [ref=1x]
- V(660F00,71,6,x,I,I,4,FVM), // #125 [ref=1x]
- V(660F00,72,4,x,I,0,4,FV ), // #126 [ref=1x]
- E(660F00,72,4,x,_,1,4,FV ), // #127 [ref=1x]
- V(660F00,71,4,x,I,I,4,FVM), // #128 [ref=1x]
- V(660F00,72,2,x,I,0,4,FV ), // #129 [ref=1x]
- V(660F00,73,2,x,I,1,4,FV ), // #130 [ref=1x]
- V(660F00,71,2,x,I,I,4,FVM) // #131 [ref=1x]
+ O(000000,00,0,0,0,0,0,0 ), // #0 [ref=1514x]
+ O(660F00,1B,0,0,0,0,0,0 ), // #1 [ref=1x]
+ O(000F00,BA,4,0,0,0,0,0 ), // #2 [ref=1x]
+ O(000F00,BA,7,0,0,0,0,0 ), // #3 [ref=1x]
+ O(000F00,BA,6,0,0,0,0,0 ), // #4 [ref=1x]
+ O(000F00,BA,5,0,0,0,0,0 ), // #5 [ref=1x]
+ O(000000,48,0,0,0,0,0,0 ), // #6 [ref=1x]
+ O(660F00,78,0,0,0,0,0,0 ), // #7 [ref=1x]
+ O_FPU(00,00DF,5) , // #8 [ref=1x]
+ O_FPU(00,00DF,7) , // #9 [ref=1x]
+ O_FPU(00,00DD,1) , // #10 [ref=1x]
+ O_FPU(00,00DB,5) , // #11 [ref=1x]
+ O_FPU(00,DFE0,0) , // #12 [ref=1x]
+ O(000000,DB,7,0,0,0,0,0 ), // #13 [ref=1x]
+ O_FPU(9B,DFE0,0) , // #14 [ref=1x]
+ O(000000,E4,0,0,0,0,0,0 ), // #15 [ref=1x]
+ O(000000,40,0,0,0,0,0,0 ), // #16 [ref=1x]
+ O(F20F00,78,0,0,0,0,0,0 ), // #17 [ref=1x]
+ O(000000,77,0,0,0,0,0,0 ), // #18 [ref=2x]
+ O(000000,73,0,0,0,0,0,0 ), // #19 [ref=3x]
+ O(000000,72,0,0,0,0,0,0 ), // #20 [ref=3x]
+ O(000000,76,0,0,0,0,0,0 ), // #21 [ref=2x]
+ O(000000,74,0,0,0,0,0,0 ), // #22 [ref=2x]
+ O(000000,E3,0,0,0,0,0,0 ), // #23 [ref=1x]
+ O(000000,7F,0,0,0,0,0,0 ), // #24 [ref=2x]
+ O(000000,7D,0,0,0,0,0,0 ), // #25 [ref=2x]
+ O(000000,7C,0,0,0,0,0,0 ), // #26 [ref=2x]
+ O(000000,7E,0,0,0,0,0,0 ), // #27 [ref=2x]
+ O(000000,EB,0,0,0,0,0,0 ), // #28 [ref=1x]
+ O(000000,75,0,0,0,0,0,0 ), // #29 [ref=2x]
+ O(000000,71,0,0,0,0,0,0 ), // #30 [ref=1x]
+ O(000000,7B,0,0,0,0,0,0 ), // #31 [ref=2x]
+ O(000000,79,0,0,0,0,0,0 ), // #32 [ref=1x]
+ O(000000,70,0,0,0,0,0,0 ), // #33 [ref=1x]
+ O(000000,7A,0,0,0,0,0,0 ), // #34 [ref=2x]
+ O(000000,78,0,0,0,0,0,0 ), // #35 [ref=1x]
+ V(660F00,92,0,0,0,0,0,None), // #36 [ref=1x]
+ V(F20F00,92,0,0,0,0,0,None), // #37 [ref=1x]
+ V(F20F00,92,0,0,1,0,0,None), // #38 [ref=1x]
+ V(000F00,92,0,0,0,0,0,None), // #39 [ref=1x]
+ O(000000,9A,0,0,0,0,0,0 ), // #40 [ref=1x]
+ O(000000,EA,0,0,0,0,0,0 ), // #41 [ref=1x]
+ O(000000,E2,0,0,0,0,0,0 ), // #42 [ref=1x]
+ O(000000,E1,0,0,0,0,0,0 ), // #43 [ref=1x]
+ O(000000,E0,0,0,0,0,0,0 ), // #44 [ref=1x]
+ O(660F00,29,0,0,0,0,0,0 ), // #45 [ref=1x]
+ O(000F00,29,0,0,0,0,0,0 ), // #46 [ref=1x]
+ O(000F38,F1,0,0,0,0,0,0 ), // #47 [ref=1x]
+ O(000F00,7E,0,0,0,0,0,0 ), // #48 [ref=2x]
+ O(660F00,7F,0,0,0,0,0,0 ), // #49 [ref=1x]
+ O(F30F00,7F,0,0,0,0,0,0 ), // #50 [ref=1x]
+ O(660F00,17,0,0,0,0,0,0 ), // #51 [ref=1x]
+ O(000F00,17,0,0,0,0,0,0 ), // #52 [ref=1x]
+ O(660F00,13,0,0,0,0,0,0 ), // #53 [ref=1x]
+ O(000F00,13,0,0,0,0,0,0 ), // #54 [ref=1x]
+ O(660F00,E7,0,0,0,0,0,0 ), // #55 [ref=1x]
+ O(660F00,2B,0,0,0,0,0,0 ), // #56 [ref=1x]
+ O(000F00,2B,0,0,0,0,0,0 ), // #57 [ref=1x]
+ O(000F00,E7,0,0,0,0,0,0 ), // #58 [ref=1x]
+ O(F20F00,2B,0,0,0,0,0,0 ), // #59 [ref=1x]
+ O(F30F00,2B,0,0,0,0,0,0 ), // #60 [ref=1x]
+ O(F20F00,11,0,0,0,0,0,0 ), // #61 [ref=1x]
+ O(F30F00,11,0,0,0,0,0,0 ), // #62 [ref=1x]
+ O(660F00,11,0,0,0,0,0,0 ), // #63 [ref=1x]
+ O(000F00,11,0,0,0,0,0,0 ), // #64 [ref=1x]
+ O(000000,E6,0,0,0,0,0,0 ), // #65 [ref=1x]
+ O(000F3A,15,0,0,0,0,0,0 ), // #66 [ref=1x]
+ O(000000,58,0,0,0,0,0,0 ), // #67 [ref=1x]
+ O(000F00,72,6,0,0,0,0,0 ), // #68 [ref=1x]
+ O(660F00,73,7,0,0,0,0,0 ), // #69 [ref=1x]
+ O(000F00,73,6,0,0,0,0,0 ), // #70 [ref=1x]
+ O(000F00,71,6,0,0,0,0,0 ), // #71 [ref=1x]
+ O(000F00,72,4,0,0,0,0,0 ), // #72 [ref=1x]
+ O(000F00,71,4,0,0,0,0,0 ), // #73 [ref=1x]
+ O(000F00,72,2,0,0,0,0,0 ), // #74 [ref=1x]
+ O(660F00,73,3,0,0,0,0,0 ), // #75 [ref=1x]
+ O(000F00,73,2,0,0,0,0,0 ), // #76 [ref=1x]
+ O(000F00,71,2,0,0,0,0,0 ), // #77 [ref=1x]
+ O(000000,50,0,0,0,0,0,0 ), // #78 [ref=1x]
+ O(000000,F6,0,0,0,0,0,0 ), // #79 [ref=1x]
+ E(660F38,92,0,0,0,1,3,None), // #80 [ref=1x]
+ E(660F38,92,0,0,0,0,2,None), // #81 [ref=1x]
+ E(660F38,93,0,0,0,1,3,None), // #82 [ref=1x]
+ E(660F38,93,0,0,0,0,2,None), // #83 [ref=1x]
+ V(660F38,2F,0,0,0,0,0,None), // #84 [ref=1x]
+ V(660F38,2E,0,0,0,0,0,None), // #85 [ref=1x]
+ V(660F00,29,0,0,0,1,4,ByLL), // #86 [ref=1x]
+ V(000F00,29,0,0,0,0,4,ByLL), // #87 [ref=1x]
+ V(660F00,7E,0,0,0,0,2,None), // #88 [ref=1x]
+ V(660F00,7F,0,0,0,0,0,None), // #89 [ref=1x]
+ E(660F00,7F,0,0,0,0,4,ByLL), // #90 [ref=1x]
+ E(660F00,7F,0,0,0,1,4,ByLL), // #91 [ref=1x]
+ V(F30F00,7F,0,0,0,0,0,None), // #92 [ref=1x]
+ E(F20F00,7F,0,0,0,1,4,ByLL), // #93 [ref=1x]
+ E(F30F00,7F,0,0,0,0,4,ByLL), // #94 [ref=1x]
+ E(F30F00,7F,0,0,0,1,4,ByLL), // #95 [ref=1x]
+ E(F20F00,7F,0,0,0,0,4,ByLL), // #96 [ref=1x]
+ V(660F00,17,0,0,0,1,3,None), // #97 [ref=1x]
+ V(000F00,17,0,0,0,0,3,None), // #98 [ref=1x]
+ V(660F00,13,0,0,0,1,3,None), // #99 [ref=1x]
+ V(000F00,13,0,0,0,0,3,None), // #100 [ref=1x]
+ V(660F00,7E,0,0,0,1,3,None), // #101 [ref=1x]
+ V(F20F00,11,0,0,0,1,3,None), // #102 [ref=1x]
+ E(F3MAP5,11,0,0,0,0,1,None), // #103 [ref=1x]
+ V(F30F00,11,0,0,0,0,2,None), // #104 [ref=1x]
+ V(660F00,11,0,0,0,1,4,ByLL), // #105 [ref=1x]
+ V(000F00,11,0,0,0,0,4,ByLL), // #106 [ref=1x]
+ E(66MAP5,7E,0,0,0,0,1,None), // #107 [ref=1x]
+ E(660F38,7A,0,0,0,0,0,None), // #108 [ref=1x]
+ E(660F38,7C,0,0,0,0,0,None), // #109 [ref=1x]
+ E(660F38,7C,0,0,0,1,0,None), // #110 [ref=1x]
+ E(660F38,7B,0,0,0,0,0,None), // #111 [ref=1x]
+ V(660F3A,05,0,0,0,1,4,ByLL), // #112 [ref=1x]
+ V(660F3A,04,0,0,0,0,4,ByLL), // #113 [ref=1x]
+ V(660F3A,01,0,0,1,1,4,ByLL), // #114 [ref=1x]
+ V(660F3A,00,0,0,1,1,4,ByLL), // #115 [ref=1x]
+ E(660F38,90,0,0,0,0,2,None), // #116 [ref=1x]
+ E(660F38,90,0,0,0,1,3,None), // #117 [ref=1x]
+ E(660F38,91,0,0,0,0,2,None), // #118 [ref=1x]
+ E(660F38,91,0,0,0,1,3,None), // #119 [ref=1x]
+ V(660F38,8E,0,0,0,0,0,None), // #120 [ref=1x]
+ V(660F38,8E,0,0,1,0,0,None), // #121 [ref=1x]
+ V(XOP_M8,C0,0,0,0,0,0,None), // #122 [ref=1x]
+ V(XOP_M8,C2,0,0,0,0,0,None), // #123 [ref=1x]
+ V(XOP_M8,C3,0,0,0,0,0,None), // #124 [ref=1x]
+ V(XOP_M8,C1,0,0,0,0,0,None), // #125 [ref=1x]
+ V(660F00,72,6,0,0,0,4,ByLL), // #126 [ref=1x]
+ V(660F00,73,6,0,0,1,4,ByLL), // #127 [ref=1x]
+ V(660F00,71,6,0,0,0,4,ByLL), // #128 [ref=1x]
+ V(660F00,72,4,0,0,0,4,ByLL), // #129 [ref=1x]
+ E(660F00,72,4,0,0,1,4,ByLL), // #130 [ref=1x]
+ V(660F00,71,4,0,0,0,4,ByLL), // #131 [ref=1x]
+ V(660F00,72,2,0,0,0,4,ByLL), // #132 [ref=1x]
+ V(660F00,73,2,0,0,1,4,ByLL), // #133 [ref=1x]
+ V(660F00,71,2,0,0,0,4,ByLL) // #134 [ref=1x]
};
// ----------------------------------------------------------------------------
// ${AltOpcodeTable:End}
-#undef O_FPU
#undef O
#undef V
#undef E
+#undef O_FPU
-// ============================================================================
-// [asmjit::x86::InstDB - CommonInfoTableA]
-// ============================================================================
+// x86::InstDB - CommonInfoTable
+// =============================
// ${InstCommonTable:Begin}
// ------------------- Automatically generated, do not edit -------------------
-#define F(VAL) InstDB::kFlag##VAL
-#define CONTROL(VAL) Inst::kControl##VAL
-#define SINGLE_REG(VAL) InstDB::kSingleReg##VAL
+#define F(VAL) uint32_t(InstDB::InstFlags::k##VAL)
+#define X(VAL) uint32_t(InstDB::Avx512Flags::k##VAL)
+#define CONTROL_FLOW(VAL) uint8_t(InstControlFlow::k##VAL)
+#define SAME_REG_HINT(VAL) uint8_t(InstSameRegHint::k##VAL)
const InstDB::CommonInfo InstDB::_commonInfoTable[] = {
- { 0 , 0 , 0 , CONTROL(None) , SINGLE_REG(None), 0 }, // #0 [ref=1x]
- { 0 , 341, 1 , CONTROL(None) , SINGLE_REG(None), 0 }, // #1 [ref=4x]
- { 0 , 342, 1 , CONTROL(None) , SINGLE_REG(None), 0 }, // #2 [ref=2x]
- { F(Lock)|F(XAcquire)|F(XRelease) , 16 , 12, CONTROL(None) , SINGLE_REG(None), 0 }, // #3 [ref=2x]
- { 0 , 151, 2 , CONTROL(None) , SINGLE_REG(None), 0 }, // #4 [ref=2x]
- { F(Vec) , 70 , 1 , CONTROL(None) , SINGLE_REG(None), 0 }, // #5 [ref=54x]
- { F(Vec) , 97 , 1 , CONTROL(None) , SINGLE_REG(None), 0 }, // #6 [ref=19x]
- { F(Vec) , 222, 1 , CONTROL(None) , SINGLE_REG(None), 0 }, // #7 [ref=16x]
- { F(Vec) , 183, 1 , CONTROL(None) , SINGLE_REG(None), 0 }, // #8 [ref=20x]
- { F(Lock)|F(XAcquire)|F(XRelease) , 28 , 11, CONTROL(None) , SINGLE_REG(RO) , 0 }, // #9 [ref=1x]
- { F(Vex) , 237, 2 , CONTROL(None) , SINGLE_REG(None), 0 }, // #10 [ref=3x]
- { F(Vec) , 70 , 1 , CONTROL(None) , SINGLE_REG(RO) , 0 }, // #11 [ref=12x]
- { 0 , 343, 1 , CONTROL(None) , SINGLE_REG(None), 0 }, // #12 [ref=1x]
- { F(Vex) , 239, 2 , CONTROL(None) , SINGLE_REG(None), 0 }, // #13 [ref=5x]
- { F(Vex) , 151, 2 , CONTROL(None) , SINGLE_REG(None), 0 }, // #14 [ref=12x]
- { F(Vec) , 344, 1 , CONTROL(None) , SINGLE_REG(None), 0 }, // #15 [ref=4x]
- { 0 , 241, 2 , CONTROL(None) , SINGLE_REG(None), 0 }, // #16 [ref=3x]
- { F(Mib) , 345, 1 , CONTROL(None) , SINGLE_REG(None), 0 }, // #17 [ref=1x]
- { 0 , 346, 1 , CONTROL(None) , SINGLE_REG(None), 0 }, // #18 [ref=1x]
- { 0 , 243, 2 , CONTROL(None) , SINGLE_REG(None), 0 }, // #19 [ref=1x]
- { F(Mib) , 347, 1 , CONTROL(None) , SINGLE_REG(None), 0 }, // #20 [ref=1x]
- { 0 , 245, 2 , CONTROL(None) , SINGLE_REG(None), 0 }, // #21 [ref=1x]
- { 0 , 150, 3 , CONTROL(None) , SINGLE_REG(None), 0 }, // #22 [ref=35x]
- { 0 , 348, 1 , CONTROL(None) , SINGLE_REG(None), 0 }, // #23 [ref=3x]
- { 0 , 114, 4 , CONTROL(None) , SINGLE_REG(None), 0 }, // #24 [ref=1x]
- { F(Lock)|F(XAcquire)|F(XRelease) , 114, 4 , CONTROL(None) , SINGLE_REG(None), 0 }, // #25 [ref=3x]
- { F(Rep)|F(RepIgnored) , 247, 2 , CONTROL(Call) , SINGLE_REG(None), 0 }, // #26 [ref=1x]
- { 0 , 349, 1 , CONTROL(None) , SINGLE_REG(None), 0 }, // #27 [ref=1x]
- { 0 , 350, 1 , CONTROL(None) , SINGLE_REG(None), 0 }, // #28 [ref=2x]
- { 0 , 324, 1 , CONTROL(None) , SINGLE_REG(None), 0 }, // #29 [ref=1x]
- { 0 , 257, 1 , CONTROL(None) , SINGLE_REG(None), 0 }, // #30 [ref=74x]
- { 0 , 351, 1 , CONTROL(None) , SINGLE_REG(None), 0 }, // #31 [ref=24x]
- { 0 , 352, 1 , CONTROL(None) , SINGLE_REG(None), 0 }, // #32 [ref=1x]
- { 0 , 16 , 12, CONTROL(None) , SINGLE_REG(None), 0 }, // #33 [ref=1x]
- { F(Rep) , 353, 1 , CONTROL(None) , SINGLE_REG(None), 0 }, // #34 [ref=1x]
- { F(Vec) , 354, 1 , CONTROL(None) , SINGLE_REG(None), 0 }, // #35 [ref=2x]
- { F(Vec) , 355, 1 , CONTROL(None) , SINGLE_REG(None), 0 }, // #36 [ref=3x]
- { F(Lock)|F(XAcquire)|F(XRelease) , 118, 4 , CONTROL(None) , SINGLE_REG(None), 0 }, // #37 [ref=1x]
- { F(Lock)|F(XAcquire)|F(XRelease) , 356, 1 , CONTROL(None) , SINGLE_REG(None), 0 }, // #38 [ref=1x]
- { F(Lock)|F(XAcquire)|F(XRelease) , 357, 1 , CONTROL(None) , SINGLE_REG(None), 0 }, // #39 [ref=1x]
- { 0 , 358, 1 , CONTROL(None) , SINGLE_REG(None), 0 }, // #40 [ref=1x]
- { 0 , 359, 1 , CONTROL(None) , SINGLE_REG(None), 0 }, // #41 [ref=1x]
- { 0 , 249, 2 , CONTROL(None) , SINGLE_REG(None), 0 }, // #42 [ref=1x]
- { F(Mmx)|F(Vec) , 360, 1 , CONTROL(None) , SINGLE_REG(None), 0 }, // #43 [ref=2x]
- { F(Mmx)|F(Vec) , 361, 1 , CONTROL(None) , SINGLE_REG(None), 0 }, // #44 [ref=2x]
- { F(Mmx)|F(Vec) , 362, 1 , CONTROL(None) , SINGLE_REG(None), 0 }, // #45 [ref=2x]
- { F(Vec) , 363, 1 , CONTROL(None) , SINGLE_REG(None), 0 }, // #46 [ref=2x]
- { F(Vec) , 364, 1 , CONTROL(None) , SINGLE_REG(None), 0 }, // #47 [ref=2x]
- { F(Vec) , 365, 1 , CONTROL(None) , SINGLE_REG(None), 0 }, // #48 [ref=2x]
- { 0 , 366, 1 , CONTROL(None) , SINGLE_REG(None), 0 }, // #49 [ref=1x]
- { 0 , 367, 1 , CONTROL(None) , SINGLE_REG(None), 0 }, // #50 [ref=2x]
- { F(Lock)|F(XAcquire)|F(XRelease) , 251, 2 , CONTROL(None) , SINGLE_REG(None), 0 }, // #51 [ref=2x]
- { 0 , 39 , 4 , CONTROL(None) , SINGLE_REG(None), 0 }, // #52 [ref=3x]
- { F(Mmx) , 257, 1 , CONTROL(None) , SINGLE_REG(None), 0 }, // #53 [ref=1x]
- { 0 , 253, 2 , CONTROL(None) , SINGLE_REG(None), 0 }, // #54 [ref=2x]
- { 0 , 368, 1 , CONTROL(None) , SINGLE_REG(None), 0 }, // #55 [ref=1x]
- { F(Vec) , 369, 1 , CONTROL(None) , SINGLE_REG(None), 0 }, // #56 [ref=2x]
- { F(Vec) , 255, 2 , CONTROL(None) , SINGLE_REG(None), 0 }, // #57 [ref=1x]
- { F(FpuM32)|F(FpuM64) , 153, 3 , CONTROL(None) , SINGLE_REG(None), 0 }, // #58 [ref=6x]
- { 0 , 257, 2 , CONTROL(None) , SINGLE_REG(None), 0 }, // #59 [ref=9x]
- { F(FpuM80) , 370, 1 , CONTROL(None) , SINGLE_REG(None), 0 }, // #60 [ref=2x]
- { 0 , 258, 1 , CONTROL(None) , SINGLE_REG(None), 0 }, // #61 [ref=13x]
- { F(FpuM32)|F(FpuM64) , 259, 2 , CONTROL(None) , SINGLE_REG(None), 0 }, // #62 [ref=2x]
- { F(FpuM16)|F(FpuM32) , 371, 1 , CONTROL(None) , SINGLE_REG(None), 0 }, // #63 [ref=9x]
- { F(FpuM16)|F(FpuM32)|F(FpuM64) , 372, 1 , CONTROL(None) , SINGLE_REG(None), 0 }, // #64 [ref=3x]
- { F(FpuM32)|F(FpuM64)|F(FpuM80) , 373, 1 , CONTROL(None) , SINGLE_REG(None), 0 }, // #65 [ref=2x]
- { F(FpuM16) , 374, 1 , CONTROL(None) , SINGLE_REG(None), 0 }, // #66 [ref=3x]
- { F(FpuM16) , 375, 1 , CONTROL(None) , SINGLE_REG(None), 0 }, // #67 [ref=2x]
- { F(FpuM32)|F(FpuM64) , 260, 1 , CONTROL(None) , SINGLE_REG(None), 0 }, // #68 [ref=1x]
- { 0 , 376, 1 , CONTROL(None) , SINGLE_REG(None), 0 }, // #69 [ref=2x]
- { 0 , 39 , 10, CONTROL(None) , SINGLE_REG(None), 0 }, // #70 [ref=1x]
- { 0 , 377, 1 , CONTROL(None) , SINGLE_REG(None), 0 }, // #71 [ref=1x]
- { F(Rep) , 378, 1 , CONTROL(None) , SINGLE_REG(None), 0 }, // #72 [ref=1x]
- { F(Vec) , 261, 2 , CONTROL(None) , SINGLE_REG(None), 0 }, // #73 [ref=1x]
- { 0 , 379, 1 , CONTROL(None) , SINGLE_REG(None), 0 }, // #74 [ref=2x]
- { 0 , 380, 1 , CONTROL(None) , SINGLE_REG(None), 0 }, // #75 [ref=8x]
- { 0 , 263, 2 , CONTROL(None) , SINGLE_REG(None), 0 }, // #76 [ref=3x]
- { 0 , 265, 2 , CONTROL(None) , SINGLE_REG(None), 0 }, // #77 [ref=1x]
- { 0 , 257, 1 , CONTROL(Return) , SINGLE_REG(None), 0 }, // #78 [ref=3x]
- { 0 , 381, 1 , CONTROL(Return) , SINGLE_REG(None), 0 }, // #79 [ref=1x]
- { F(Rep)|F(RepIgnored) , 267, 2 , CONTROL(Branch) , SINGLE_REG(None), 0 }, // #80 [ref=30x]
- { F(Rep)|F(RepIgnored) , 269, 2 , CONTROL(Branch) , SINGLE_REG(None), 0 }, // #81 [ref=1x]
- { F(Rep)|F(RepIgnored) , 271, 2 , CONTROL(Jump) , SINGLE_REG(None), 0 }, // #82 [ref=1x]
- { F(Vec)|F(Vex) , 382, 1 , CONTROL(None) , SINGLE_REG(None), 0 }, // #83 [ref=27x]
- { F(Vec)|F(Vex) , 273, 2 , CONTROL(None) , SINGLE_REG(None), 0 }, // #84 [ref=1x]
- { F(Vec)|F(Vex) , 275, 2 , CONTROL(None) , SINGLE_REG(None), 0 }, // #85 [ref=1x]
- { F(Vec)|F(Vex) , 277, 2 , CONTROL(None) , SINGLE_REG(None), 0 }, // #86 [ref=1x]
- { F(Vec)|F(Vex) , 279, 2 , CONTROL(None) , SINGLE_REG(None), 0 }, // #87 [ref=1x]
- { F(Vec)|F(Vex) , 383, 1 , CONTROL(None) , SINGLE_REG(None), 0 }, // #88 [ref=12x]
- { F(Vec)|F(Vex) , 384, 1 , CONTROL(None) , SINGLE_REG(None), 0 }, // #89 [ref=8x]
- { 0 , 385, 1 , CONTROL(None) , SINGLE_REG(None), 0 }, // #90 [ref=2x]
- { 0 , 281, 2 , CONTROL(None) , SINGLE_REG(None), 0 }, // #91 [ref=1x]
- { F(Vec) , 192, 1 , CONTROL(None) , SINGLE_REG(None), 0 }, // #92 [ref=2x]
- { 0 , 386, 1 , CONTROL(None) , SINGLE_REG(None), 0 }, // #93 [ref=2x]
- { 0 , 283, 2 , CONTROL(None) , SINGLE_REG(None), 0 }, // #94 [ref=2x]
- { 0 , 387, 1 , CONTROL(None) , SINGLE_REG(None), 0 }, // #95 [ref=1x]
- { 0 , 156, 3 , CONTROL(None) , SINGLE_REG(None), 0 }, // #96 [ref=3x]
- { 0 , 388, 1 , CONTROL(None) , SINGLE_REG(None), 0 }, // #97 [ref=5x]
- { F(Vex) , 389, 1 , CONTROL(None) , SINGLE_REG(None), 0 }, // #98 [ref=2x]
- { F(Rep) , 390, 1 , CONTROL(None) , SINGLE_REG(None), 0 }, // #99 [ref=1x]
- { 0 , 269, 2 , CONTROL(Branch) , SINGLE_REG(None), 0 }, // #100 [ref=3x]
- { 0 , 285, 2 , CONTROL(None) , SINGLE_REG(None), 0 }, // #101 [ref=1x]
- { F(Vex) , 391, 1 , CONTROL(None) , SINGLE_REG(None), 0 }, // #102 [ref=2x]
- { F(Vec) , 392, 1 , CONTROL(None) , SINGLE_REG(None), 0 }, // #103 [ref=1x]
- { F(Mmx) , 393, 1 , CONTROL(None) , SINGLE_REG(None), 0 }, // #104 [ref=1x]
- { 0 , 394, 1 , CONTROL(None) , SINGLE_REG(None), 0 }, // #105 [ref=2x]
- { F(XRelease) , 0 , 16, CONTROL(None) , SINGLE_REG(None), 0 }, // #106 [ref=1x]
- { F(Vec) , 70 , 2 , CONTROL(None) , SINGLE_REG(None), 0 }, // #107 [ref=6x]
- { 0 , 64 , 6 , CONTROL(None) , SINGLE_REG(None), 0 }, // #108 [ref=1x]
- { F(Mmx)|F(Vec) , 287, 2 , CONTROL(None) , SINGLE_REG(None), 0 }, // #109 [ref=1x]
- { 0 , 395, 1 , CONTROL(None) , SINGLE_REG(None), 0 }, // #110 [ref=1x]
- { 0 , 68 , 2 , CONTROL(None) , SINGLE_REG(None), 0 }, // #111 [ref=2x]
- { F(Mmx)|F(Vec) , 396, 1 , CONTROL(None) , SINGLE_REG(None), 0 }, // #112 [ref=1x]
- { F(Vec) , 256, 1 , CONTROL(None) , SINGLE_REG(None), 0 }, // #113 [ref=2x]
- { F(Vec) , 198, 2 , CONTROL(None) , SINGLE_REG(None), 0 }, // #114 [ref=4x]
- { F(Vec) , 397, 1 , CONTROL(None) , SINGLE_REG(None), 0 }, // #115 [ref=2x]
- { F(Vec) , 71 , 1 , CONTROL(None) , SINGLE_REG(None), 0 }, // #116 [ref=3x]
- { F(Mmx) , 398, 1 , CONTROL(None) , SINGLE_REG(None), 0 }, // #117 [ref=1x]
- { F(Vec) , 98 , 1 , CONTROL(None) , SINGLE_REG(None), 0 }, // #118 [ref=1x]
- { F(Vec) , 201, 1 , CONTROL(None) , SINGLE_REG(None), 0 }, // #119 [ref=1x]
- { F(Mmx)|F(Vec) , 94 , 5 , CONTROL(None) , SINGLE_REG(None), 0 }, // #120 [ref=1x]
- { F(Mmx)|F(Vec) , 399, 1 , CONTROL(None) , SINGLE_REG(None), 0 }, // #121 [ref=1x]
- { F(Rep) , 400, 1 , CONTROL(None) , SINGLE_REG(None), 0 }, // #122 [ref=1x]
- { F(Vec) , 97 , 2 , CONTROL(None) , SINGLE_REG(None), 0 }, // #123 [ref=1x]
- { F(Vec) , 289, 2 , CONTROL(None) , SINGLE_REG(None), 0 }, // #124 [ref=1x]
- { 0 , 291, 2 , CONTROL(None) , SINGLE_REG(None), 0 }, // #125 [ref=2x]
- { 0 , 293, 2 , CONTROL(None) , SINGLE_REG(None), 0 }, // #126 [ref=1x]
- { F(Vex) , 295, 2 , CONTROL(None) , SINGLE_REG(None), 0 }, // #127 [ref=1x]
- { 0 , 401, 1 , CONTROL(None) , SINGLE_REG(None), 0 }, // #128 [ref=1x]
- { 0 , 402, 1 , CONTROL(None) , SINGLE_REG(None), 0 }, // #129 [ref=1x]
- { F(Lock)|F(XAcquire)|F(XRelease) , 252, 1 , CONTROL(None) , SINGLE_REG(None), 0 }, // #130 [ref=2x]
- { 0 , 297, 2 , CONTROL(None) , SINGLE_REG(None), 0 }, // #131 [ref=1x]
- { F(Lock)|F(XAcquire)|F(XRelease) , 16 , 12, CONTROL(None) , SINGLE_REG(RO) , 0 }, // #132 [ref=1x]
- { 0 , 403, 1 , CONTROL(None) , SINGLE_REG(None), 0 }, // #133 [ref=1x]
- { F(Rep) , 404, 1 , CONTROL(None) , SINGLE_REG(None), 0 }, // #134 [ref=1x]
- { F(Mmx)|F(Vec) , 299, 2 , CONTROL(None) , SINGLE_REG(None), 0 }, // #135 [ref=40x]
- { F(Mmx)|F(Vec) , 301, 2 , CONTROL(None) , SINGLE_REG(None), 0 }, // #136 [ref=1x]
- { F(Mmx)|F(Vec) , 299, 2 , CONTROL(None) , SINGLE_REG(RO) , 0 }, // #137 [ref=6x]
- { F(Mmx)|F(Vec) , 299, 2 , CONTROL(None) , SINGLE_REG(WO) , 0 }, // #138 [ref=16x]
- { F(Mmx) , 299, 1 , CONTROL(None) , SINGLE_REG(None), 0 }, // #139 [ref=26x]
- { F(Vec) , 70 , 1 , CONTROL(None) , SINGLE_REG(WO) , 0 }, // #140 [ref=4x]
- { F(Vec) , 405, 1 , CONTROL(None) , SINGLE_REG(None), 0 }, // #141 [ref=1x]
- { F(Vec) , 406, 1 , CONTROL(None) , SINGLE_REG(None), 0 }, // #142 [ref=1x]
- { F(Vec) , 407, 1 , CONTROL(None) , SINGLE_REG(None), 0 }, // #143 [ref=1x]
- { F(Vec) , 408, 1 , CONTROL(None) , SINGLE_REG(None), 0 }, // #144 [ref=1x]
- { F(Vec) , 409, 1 , CONTROL(None) , SINGLE_REG(None), 0 }, // #145 [ref=1x]
- { F(Vec) , 410, 1 , CONTROL(None) , SINGLE_REG(None), 0 }, // #146 [ref=1x]
- { F(Mmx)|F(Vec) , 303, 2 , CONTROL(None) , SINGLE_REG(None), 0 }, // #147 [ref=1x]
- { F(Vec) , 411, 1 , CONTROL(None) , SINGLE_REG(None), 0 }, // #148 [ref=1x]
- { F(Vec) , 412, 1 , CONTROL(None) , SINGLE_REG(None), 0 }, // #149 [ref=1x]
- { F(Vec) , 413, 1 , CONTROL(None) , SINGLE_REG(None), 0 }, // #150 [ref=1x]
- { F(Mmx)|F(Vec) , 414, 1 , CONTROL(None) , SINGLE_REG(None), 0 }, // #151 [ref=1x]
- { F(Mmx)|F(Vec) , 415, 1 , CONTROL(None) , SINGLE_REG(None), 0 }, // #152 [ref=1x]
- { F(Vec) , 225, 1 , CONTROL(None) , SINGLE_REG(None), 0 }, // #153 [ref=2x]
- { 0 , 122, 4 , CONTROL(None) , SINGLE_REG(None), 0 }, // #154 [ref=1x]
- { 0 , 381, 1 , CONTROL(None) , SINGLE_REG(None), 0 }, // #155 [ref=6x]
- { F(Mmx) , 301, 1 , CONTROL(None) , SINGLE_REG(None), 0 }, // #156 [ref=1x]
- { F(Mmx)|F(Vec) , 305, 2 , CONTROL(None) , SINGLE_REG(None), 0 }, // #157 [ref=8x]
- { F(Vec) , 416, 1 , CONTROL(None) , SINGLE_REG(None), 0 }, // #158 [ref=2x]
- { 0 , 126, 4 , CONTROL(None) , SINGLE_REG(None), 0 }, // #159 [ref=1x]
- { 0 , 417, 1 , CONTROL(None) , SINGLE_REG(None), 0 }, // #160 [ref=8x]
- { 0 , 418, 1 , CONTROL(None) , SINGLE_REG(None), 0 }, // #161 [ref=4x]
- { 0 , 419, 1 , CONTROL(None) , SINGLE_REG(None), 0 }, // #162 [ref=6x]
- { 0 , 307, 2 , CONTROL(None) , SINGLE_REG(None), 0 }, // #163 [ref=1x]
- { F(Rep)|F(RepIgnored) , 309, 2 , CONTROL(Return) , SINGLE_REG(None), 0 }, // #164 [ref=1x]
- { F(Vex) , 311, 2 , CONTROL(None) , SINGLE_REG(None), 0 }, // #165 [ref=1x]
- { F(Lock)|F(XAcquire)|F(XRelease) , 16 , 12, CONTROL(None) , SINGLE_REG(WO) , 0 }, // #166 [ref=3x]
- { F(Rep) , 420, 1 , CONTROL(None) , SINGLE_REG(None), 0 }, // #167 [ref=1x]
- { 0 , 421, 1 , CONTROL(None) , SINGLE_REG(None), 0 }, // #168 [ref=30x]
- { 0 , 159, 3 , CONTROL(None) , SINGLE_REG(None), 0 }, // #169 [ref=2x]
- { 0 , 422, 1 , CONTROL(None) , SINGLE_REG(None), 0 }, // #170 [ref=3x]
- { F(Rep) , 423, 1 , CONTROL(None) , SINGLE_REG(None), 0 }, // #171 [ref=1x]
- { 0 , 57 , 7 , CONTROL(None) , SINGLE_REG(None), 0 }, // #172 [ref=1x]
- { F(Vec)|F(Evex)|F(Avx512T4X)|F(Avx512KZ) , 424, 1 , CONTROL(None) , SINGLE_REG(None), 0 }, // #173 [ref=4x]
- { F(Vec)|F(Evex)|F(Avx512T4X)|F(Avx512KZ) , 425, 1 , CONTROL(None) , SINGLE_REG(None), 0 }, // #174 [ref=2x]
- { F(Vec)|F(Vex)|F(Evex)|F(Avx512KZ_ER_SAE_B64) , 162, 3 , CONTROL(None) , SINGLE_REG(None), 0 }, // #175 [ref=22x]
- { F(Vec)|F(Vex)|F(Evex)|F(Avx512KZ_ER_SAE_B32) , 162, 3 , CONTROL(None) , SINGLE_REG(None), 0 }, // #176 [ref=22x]
- { F(Vec)|F(Vex)|F(Evex)|F(Avx512KZ_ER_SAE) , 426, 1 , CONTROL(None) , SINGLE_REG(None), 0 }, // #177 [ref=18x]
- { F(Vec)|F(Vex)|F(Evex)|F(Avx512KZ_ER_SAE) , 427, 1 , CONTROL(None) , SINGLE_REG(None), 0 }, // #178 [ref=17x]
- { F(Vec)|F(Vex) , 162, 2 , CONTROL(None) , SINGLE_REG(None), 0 }, // #179 [ref=15x]
- { F(Vec)|F(Vex)|F(Evex) , 162, 3 , CONTROL(None) , SINGLE_REG(None), 0 }, // #180 [ref=5x]
- { F(Vec)|F(Vex) , 70 , 1 , CONTROL(None) , SINGLE_REG(None), 0 }, // #181 [ref=17x]
- { F(Vec)|F(Vex) , 183, 1 , CONTROL(None) , SINGLE_REG(None), 0 }, // #182 [ref=1x]
- { F(Vec)|F(Evex)|F(Avx512KZ_B32) , 165, 3 , CONTROL(None) , SINGLE_REG(None), 0 }, // #183 [ref=4x]
- { F(Vec)|F(Evex)|F(Avx512KZ_B64) , 165, 3 , CONTROL(None) , SINGLE_REG(None), 0 }, // #184 [ref=4x]
- { F(Vec)|F(Vex)|F(Evex)|F(Avx512KZ_B64) , 162, 3 , CONTROL(None) , SINGLE_REG(None), 0 }, // #185 [ref=10x]
- { F(Vec)|F(Vex)|F(Evex)|F(Avx512KZ_B32) , 162, 3 , CONTROL(None) , SINGLE_REG(None), 0 }, // #186 [ref=12x]
- { F(Vec)|F(Vex)|F(Evex)|F(Avx512KZ_B64) , 162, 3 , CONTROL(None) , SINGLE_REG(RO) , 0 }, // #187 [ref=2x]
- { F(Vec)|F(Vex)|F(Evex)|F(Avx512KZ_B32) , 162, 3 , CONTROL(None) , SINGLE_REG(RO) , 0 }, // #188 [ref=6x]
- { F(Vec)|F(Evex)|F(Avx512KZ) , 162, 3 , CONTROL(None) , SINGLE_REG(None), 0 }, // #189 [ref=13x]
- { F(Vec)|F(Evex)|F(Avx512KZ_B32) , 162, 3 , CONTROL(None) , SINGLE_REG(None), 0 }, // #190 [ref=16x]
- { F(Vec)|F(Evex)|F(Avx512KZ_B64) , 162, 3 , CONTROL(None) , SINGLE_REG(None), 0 }, // #191 [ref=19x]
- { F(Vec)|F(Vex) , 165, 2 , CONTROL(None) , SINGLE_REG(None), 0 }, // #192 [ref=6x]
- { F(Vec)|F(Vex) , 313, 2 , CONTROL(None) , SINGLE_REG(None), 0 }, // #193 [ref=3x]
- { F(Vec)|F(Vex) , 428, 1 , CONTROL(None) , SINGLE_REG(None), 0 }, // #194 [ref=2x]
- { F(Vec)|F(Evex)|F(Avx512KZ) , 429, 1 , CONTROL(None) , SINGLE_REG(None), 0 }, // #195 [ref=1x]
- { F(Vec)|F(Evex)|F(Avx512KZ) , 430, 1 , CONTROL(None) , SINGLE_REG(None), 0 }, // #196 [ref=4x]
- { F(Vec)|F(Evex)|F(Avx512KZ) , 431, 1 , CONTROL(None) , SINGLE_REG(None), 0 }, // #197 [ref=4x]
- { F(Vec)|F(Evex)|F(Avx512KZ) , 432, 1 , CONTROL(None) , SINGLE_REG(None), 0 }, // #198 [ref=1x]
- { F(Vec)|F(Vex)|F(Evex)|F(Avx512KZ) , 429, 1 , CONTROL(None) , SINGLE_REG(None), 0 }, // #199 [ref=1x]
- { F(Vec)|F(Vex)|F(Evex)|F(Avx512KZ) , 433, 1 , CONTROL(None) , SINGLE_REG(None), 0 }, // #200 [ref=1x]
- { F(Vec)|F(Vex)|F(Evex)|F(Avx512KZ_SAE_B64) , 168, 3 , CONTROL(None) , SINGLE_REG(None), 0 }, // #201 [ref=1x]
- { F(Vec)|F(Vex)|F(Evex)|F(Avx512KZ_SAE_B32) , 168, 3 , CONTROL(None) , SINGLE_REG(None), 0 }, // #202 [ref=1x]
- { F(Vec)|F(Vex)|F(Evex)|F(Avx512KZ_SAE) , 434, 1 , CONTROL(None) , SINGLE_REG(None), 0 }, // #203 [ref=1x]
- { F(Vec)|F(Vex)|F(Evex)|F(Avx512KZ_SAE) , 435, 1 , CONTROL(None) , SINGLE_REG(None), 0 }, // #204 [ref=1x]
- { F(Vec)|F(Vex)|F(Evex)|F(Avx512SAE) , 97 , 1 , CONTROL(None) , SINGLE_REG(None), 0 }, // #205 [ref=2x]
- { F(Vec)|F(Vex)|F(Evex)|F(Avx512SAE) , 222, 1 , CONTROL(None) , SINGLE_REG(None), 0 }, // #206 [ref=2x]
- { F(Vec)|F(Evex)|F(Avx512KZ) , 171, 3 , CONTROL(None) , SINGLE_REG(None), 0 }, // #207 [ref=6x]
- { F(Vec)|F(Vex)|F(Evex)|F(Avx512KZ_B32) , 174, 3 , CONTROL(None) , SINGLE_REG(None), 0 }, // #208 [ref=1x]
- { F(Vec)|F(Vex)|F(Evex)|F(Avx512KZ_ER_SAE_B32) , 177, 3 , CONTROL(None) , SINGLE_REG(None), 0 }, // #209 [ref=3x]
- { F(Vec)|F(Evex)|F(Avx512KZ_B32) , 315, 2 , CONTROL(None) , SINGLE_REG(None), 0 }, // #210 [ref=1x]
- { F(Vec)|F(Vex)|F(Evex)|F(Avx512KZ_ER_SAE_B64) , 315, 2 , CONTROL(None) , SINGLE_REG(None), 0 }, // #211 [ref=2x]
- { F(Vec)|F(Evex)|F(Avx512KZ_ER_SAE_B64) , 177, 3 , CONTROL(None) , SINGLE_REG(None), 0 }, // #212 [ref=4x]
- { F(Vec)|F(Evex)|F(Avx512KZ_ER_SAE_B64) , 315, 2 , CONTROL(None) , SINGLE_REG(None), 0 }, // #213 [ref=3x]
- { F(Vec)|F(Vex)|F(Evex)|F(Avx512KZ_SAE) , 174, 3 , CONTROL(None) , SINGLE_REG(None), 0 }, // #214 [ref=1x]
- { F(Vec)|F(Vex)|F(Evex)|F(Avx512KZ_ER_SAE_B32) , 174, 3 , CONTROL(None) , SINGLE_REG(None), 0 }, // #215 [ref=1x]
- { F(Vec)|F(Vex)|F(Evex)|F(Avx512KZ_SAE) , 180, 3 , CONTROL(None) , SINGLE_REG(None), 0 }, // #216 [ref=1x]
- { F(Vec)|F(Evex)|F(Avx512KZ_ER_SAE_B32) , 174, 3 , CONTROL(None) , SINGLE_REG(None), 0 }, // #217 [ref=2x]
- { F(Vec)|F(Evex)|F(Avx512KZ_ER_SAE_B32) , 177, 3 , CONTROL(None) , SINGLE_REG(None), 0 }, // #218 [ref=2x]
- { F(Vec)|F(Vex)|F(Evex)|F(Avx512ER_SAE) , 363, 1 , CONTROL(None) , SINGLE_REG(None), 0 }, // #219 [ref=1x]
- { F(Vec)|F(Evex)|F(Avx512ER_SAE) , 363, 1 , CONTROL(None) , SINGLE_REG(None), 0 }, // #220 [ref=1x]
- { F(Vec)|F(Vex)|F(Evex)|F(Avx512ER_SAE) , 436, 1 , CONTROL(None) , SINGLE_REG(None), 0 }, // #221 [ref=2x]
- { F(Vec)|F(Vex)|F(Evex)|F(Avx512KZ_SAE) , 427, 1 , CONTROL(None) , SINGLE_REG(None), 0 }, // #222 [ref=3x]
- { F(Vec)|F(Vex)|F(Evex)|F(Avx512ER_SAE) , 365, 1 , CONTROL(None) , SINGLE_REG(None), 0 }, // #223 [ref=1x]
- { F(Vec)|F(Evex)|F(Avx512ER_SAE) , 365, 1 , CONTROL(None) , SINGLE_REG(None), 0 }, // #224 [ref=1x]
- { F(Vec)|F(Vex)|F(Evex)|F(Avx512KZ_SAE_B64) , 315, 2 , CONTROL(None) , SINGLE_REG(None), 0 }, // #225 [ref=1x]
- { F(Vec)|F(Evex)|F(Avx512KZ_SAE_B64) , 177, 3 , CONTROL(None) , SINGLE_REG(None), 0 }, // #226 [ref=3x]
- { F(Vec)|F(Evex)|F(Avx512KZ_SAE_B64) , 315, 2 , CONTROL(None) , SINGLE_REG(None), 0 }, // #227 [ref=1x]
- { F(Vec)|F(Vex)|F(Evex)|F(Avx512KZ_SAE_B32) , 177, 3 , CONTROL(None) , SINGLE_REG(None), 0 }, // #228 [ref=1x]
- { F(Vec)|F(Evex)|F(Avx512KZ_SAE_B32) , 174, 3 , CONTROL(None) , SINGLE_REG(None), 0 }, // #229 [ref=2x]
- { F(Vec)|F(Evex)|F(Avx512KZ_SAE_B32) , 177, 3 , CONTROL(None) , SINGLE_REG(None), 0 }, // #230 [ref=2x]
- { F(Vec)|F(Vex)|F(Evex)|F(Avx512SAE) , 363, 1 , CONTROL(None) , SINGLE_REG(None), 0 }, // #231 [ref=1x]
- { F(Vec)|F(Evex)|F(Avx512SAE) , 363, 1 , CONTROL(None) , SINGLE_REG(None), 0 }, // #232 [ref=1x]
- { F(Vec)|F(Vex)|F(Evex)|F(Avx512SAE) , 365, 1 , CONTROL(None) , SINGLE_REG(None), 0 }, // #233 [ref=1x]
- { F(Vec)|F(Evex)|F(Avx512SAE) , 365, 1 , CONTROL(None) , SINGLE_REG(None), 0 }, // #234 [ref=1x]
- { F(Vec)|F(Evex)|F(Avx512KZ_B32) , 174, 3 , CONTROL(None) , SINGLE_REG(None), 0 }, // #235 [ref=1x]
- { F(Vec)|F(Evex)|F(Avx512ER_SAE) , 436, 1 , CONTROL(None) , SINGLE_REG(None), 0 }, // #236 [ref=2x]
- { F(Vec)|F(Evex)|F(Avx512KZ) , 165, 3 , CONTROL(None) , SINGLE_REG(None), 0 }, // #237 [ref=3x]
- { F(Vec)|F(Vex) , 165, 1 , CONTROL(None) , SINGLE_REG(None), 0 }, // #238 [ref=9x]
- { F(Vec)|F(Evex)|F(Avx512KZ_SAE_B64) , 74 , 1 , CONTROL(None) , SINGLE_REG(None), 0 }, // #239 [ref=3x]
- { F(Vec)|F(Evex)|F(Avx512KZ_SAE_B32) , 74 , 1 , CONTROL(None) , SINGLE_REG(None), 0 }, // #240 [ref=3x]
- { F(Vec)|F(Evex)|F(Avx512KZ) , 177, 3 , CONTROL(None) , SINGLE_REG(None), 0 }, // #241 [ref=9x]
- { F(Vec)|F(Vex) , 181, 1 , CONTROL(None) , SINGLE_REG(None), 0 }, // #242 [ref=2x]
- { F(Vec)|F(Evex)|F(Avx512KZ) , 437, 1 , CONTROL(None) , SINGLE_REG(None), 0 }, // #243 [ref=4x]
- { F(Vec)|F(Evex)|F(Avx512KZ) , 182, 1 , CONTROL(None) , SINGLE_REG(None), 0 }, // #244 [ref=4x]
- { F(Vec)|F(Vex)|F(Evex) , 369, 1 , CONTROL(None) , SINGLE_REG(None), 0 }, // #245 [ref=2x]
- { F(Vec)|F(Evex)|F(Avx512KZ_SAE_B64) , 165, 3 , CONTROL(None) , SINGLE_REG(None), 0 }, // #246 [ref=2x]
- { F(Vec)|F(Evex)|F(Avx512KZ_SAE_B32) , 165, 3 , CONTROL(None) , SINGLE_REG(None), 0 }, // #247 [ref=2x]
- { F(Vec)|F(Evex)|F(Avx512KZ_SAE) , 438, 1 , CONTROL(None) , SINGLE_REG(None), 0 }, // #248 [ref=4x]
- { F(Vec)|F(Evex)|F(Avx512KZ_SAE) , 439, 1 , CONTROL(None) , SINGLE_REG(None), 0 }, // #249 [ref=4x]
- { F(Vec)|F(Vex) , 130, 4 , CONTROL(None) , SINGLE_REG(None), 0 }, // #250 [ref=13x]
- { F(Vec)|F(Vex) , 317, 2 , CONTROL(None) , SINGLE_REG(None), 0 }, // #251 [ref=4x]
- { F(Vec)|F(Vex) , 319, 2 , CONTROL(None) , SINGLE_REG(None), 0 }, // #252 [ref=4x]
- { F(Vec)|F(Evex)|F(Avx512K_B64) , 440, 1 , CONTROL(None) , SINGLE_REG(None), 0 }, // #253 [ref=1x]
- { F(Vec)|F(Evex)|F(Avx512K_B32) , 440, 1 , CONTROL(None) , SINGLE_REG(None), 0 }, // #254 [ref=1x]
- { F(Vec)|F(Evex)|F(Avx512K) , 441, 1 , CONTROL(None) , SINGLE_REG(None), 0 }, // #255 [ref=1x]
- { F(Vec)|F(Evex)|F(Avx512K) , 442, 1 , CONTROL(None) , SINGLE_REG(None), 0 }, // #256 [ref=1x]
- { F(Vec)|F(Vex) , 177, 2 , CONTROL(None) , SINGLE_REG(None), 0 }, // #257 [ref=7x]
- { F(Vec)|F(Vex) , 97 , 1 , CONTROL(None) , SINGLE_REG(None), 0 }, // #258 [ref=1x]
- { F(Vec)|F(Vex) , 222, 1 , CONTROL(None) , SINGLE_REG(None), 0 }, // #259 [ref=1x]
- { F(Vec)|F(Vsib)|F(Vex)|F(Evex)|F(Avx512K) , 99 , 5 , CONTROL(None) , SINGLE_REG(None), 0 }, // #260 [ref=2x]
- { F(Vec)|F(Vsib)|F(Vex)|F(Evex)|F(Avx512K) , 104, 5 , CONTROL(None) , SINGLE_REG(None), 0 }, // #261 [ref=2x]
- { F(Vsib)|F(Evex)|F(Avx512K) , 443, 1 , CONTROL(None) , SINGLE_REG(None), 0 }, // #262 [ref=4x]
- { F(Vsib)|F(Evex)|F(Avx512K) , 444, 1 , CONTROL(None) , SINGLE_REG(None), 0 }, // #263 [ref=4x]
- { F(Vsib)|F(Evex)|F(Avx512K) , 445, 1 , CONTROL(None) , SINGLE_REG(None), 0 }, // #264 [ref=8x]
- { F(Vec)|F(Vsib)|F(Vex)|F(Evex)|F(Avx512K) , 109, 5 , CONTROL(None) , SINGLE_REG(None), 0 }, // #265 [ref=2x]
- { F(Vec)|F(Vsib)|F(Vex)|F(Evex)|F(Avx512K) , 134, 4 , CONTROL(None) , SINGLE_REG(None), 0 }, // #266 [ref=2x]
- { F(Vec)|F(Evex)|F(Avx512KZ_SAE) , 426, 1 , CONTROL(None) , SINGLE_REG(None), 0 }, // #267 [ref=3x]
- { F(Vec)|F(Evex)|F(Avx512KZ_SAE) , 427, 1 , CONTROL(None) , SINGLE_REG(None), 0 }, // #268 [ref=3x]
- { F(Vec)|F(Evex)|F(Avx512KZ_SAE_B64) , 183, 3 , CONTROL(None) , SINGLE_REG(None), 0 }, // #269 [ref=2x]
- { F(Vec)|F(Evex)|F(Avx512KZ_SAE_B32) , 183, 3 , CONTROL(None) , SINGLE_REG(None), 0 }, // #270 [ref=2x]
- { F(Vec)|F(Vex)|F(Evex)|F(Avx512KZ) , 165, 3 , CONTROL(None) , SINGLE_REG(None), 0 }, // #271 [ref=3x]
- { F(Vec)|F(Vex)|F(Evex)|F(Avx512KZ) , 162, 3 , CONTROL(None) , SINGLE_REG(None), 0 }, // #272 [ref=22x]
- { F(Vec)|F(Vex) , 321, 1 , CONTROL(None) , SINGLE_REG(None), 0 }, // #273 [ref=2x]
- { F(Vec)|F(Evex)|F(Avx512KZ) , 321, 2 , CONTROL(None) , SINGLE_REG(None), 0 }, // #274 [ref=4x]
- { F(Vec)|F(Evex)|F(Avx512KZ) , 446, 1 , CONTROL(None) , SINGLE_REG(None), 0 }, // #275 [ref=4x]
- { F(Vec)|F(Vex)|F(Evex) , 439, 1 , CONTROL(None) , SINGLE_REG(None), 0 }, // #276 [ref=1x]
- { F(Vec)|F(Vex) , 192, 2 , CONTROL(None) , SINGLE_REG(None), 0 }, // #277 [ref=1x]
- { F(Vex) , 386, 1 , CONTROL(None) , SINGLE_REG(None), 0 }, // #278 [ref=2x]
- { F(Vec)|F(Vex) , 392, 1 , CONTROL(None) , SINGLE_REG(None), 0 }, // #279 [ref=1x]
- { F(Vec)|F(Vex) , 138, 4 , CONTROL(None) , SINGLE_REG(None), 0 }, // #280 [ref=4x]
- { F(Vec)|F(Vex)|F(Evex)|F(Avx512KZ_SAE_B64) , 162, 3 , CONTROL(None) , SINGLE_REG(None), 0 }, // #281 [ref=2x]
- { F(Vec)|F(Vex)|F(Evex)|F(Avx512KZ_SAE_B32) , 162, 3 , CONTROL(None) , SINGLE_REG(None), 0 }, // #282 [ref=2x]
- { F(Vec)|F(Vex)|F(Evex)|F(Avx512KZ_SAE) , 426, 1 , CONTROL(None) , SINGLE_REG(None), 0 }, // #283 [ref=2x]
- { 0 , 447, 1 , CONTROL(None) , SINGLE_REG(None), 0 }, // #284 [ref=4x]
- { 0 , 323, 2 , CONTROL(None) , SINGLE_REG(None), 0 }, // #285 [ref=3x]
- { F(Vec)|F(Vex)|F(Evex)|F(Avx512KZ) , 70 , 6 , CONTROL(None) , SINGLE_REG(None), 0 }, // #286 [ref=4x]
- { F(Vec)|F(Vex)|F(Evex) , 325, 2 , CONTROL(None) , SINGLE_REG(None), 0 }, // #287 [ref=1x]
- { F(Vec)|F(Vex)|F(Evex)|F(Avx512KZ) , 186, 3 , CONTROL(None) , SINGLE_REG(None), 0 }, // #288 [ref=1x]
- { F(Vec)|F(Vex) , 70 , 4 , CONTROL(None) , SINGLE_REG(None), 0 }, // #289 [ref=2x]
- { F(Vec)|F(Evex)|F(Avx512KZ) , 70 , 6 , CONTROL(None) , SINGLE_REG(None), 0 }, // #290 [ref=6x]
- { F(Vec)|F(Vex)|F(Evex) , 200, 1 , CONTROL(None) , SINGLE_REG(None), 0 }, // #291 [ref=2x]
- { F(Vec)|F(Vex)|F(Evex) , 327, 2 , CONTROL(None) , SINGLE_REG(None), 0 }, // #292 [ref=4x]
- { F(Vec)|F(Vex) , 448, 1 , CONTROL(None) , SINGLE_REG(None), 0 }, // #293 [ref=3x]
- { F(Vec)|F(Vex)|F(Evex) , 189, 3 , CONTROL(None) , SINGLE_REG(None), 0 }, // #294 [ref=3x]
- { F(Vec)|F(Vex)|F(Evex) , 192, 3 , CONTROL(None) , SINGLE_REG(None), 0 }, // #295 [ref=1x]
- { F(Vec)|F(Vex)|F(Evex) , 195, 3 , CONTROL(None) , SINGLE_REG(None), 0 }, // #296 [ref=1x]
- { F(Vec)|F(Vex)|F(Evex)|F(Avx512KZ) , 198, 3 , CONTROL(None) , SINGLE_REG(None), 0 }, // #297 [ref=1x]
- { F(Vec)|F(Vex)|F(Evex)|F(Avx512KZ) , 177, 3 , CONTROL(None) , SINGLE_REG(None), 0 }, // #298 [ref=5x]
- { F(Vec)|F(Vex)|F(Evex)|F(Avx512KZ) , 201, 3 , CONTROL(None) , SINGLE_REG(None), 0 }, // #299 [ref=1x]
- { 0 , 329, 2 , CONTROL(None) , SINGLE_REG(None), 0 }, // #300 [ref=1x]
- { 0 , 331, 2 , CONTROL(None) , SINGLE_REG(None), 0 }, // #301 [ref=1x]
- { F(Vec)|F(Vex) , 162, 2 , CONTROL(None) , SINGLE_REG(RO) , 0 }, // #302 [ref=2x]
- { F(Vec)|F(Evex)|F(Avx512KZ_B32) , 162, 3 , CONTROL(None) , SINGLE_REG(RO) , 0 }, // #303 [ref=2x]
- { F(Vec)|F(Vex) , 162, 2 , CONTROL(None) , SINGLE_REG(WO) , 0 }, // #304 [ref=2x]
- { F(Vec)|F(Evex)|F(Avx512KZ_B32) , 162, 3 , CONTROL(None) , SINGLE_REG(WO) , 0 }, // #305 [ref=2x]
- { F(Vec)|F(Evex)|F(Avx512KZ_B64) , 162, 3 , CONTROL(None) , SINGLE_REG(WO) , 0 }, // #306 [ref=2x]
- { F(Vec)|F(Evex)|F(Avx512KZ_B64) , 162, 3 , CONTROL(None) , SINGLE_REG(RO) , 0 }, // #307 [ref=2x]
- { F(Vec)|F(Vex)|F(Evex)|F(Avx512KZ) , 449, 1 , CONTROL(None) , SINGLE_REG(None), 0 }, // #308 [ref=1x]
- { F(Vec)|F(Vex)|F(Evex)|F(Avx512KZ) , 450, 1 , CONTROL(None) , SINGLE_REG(None), 0 }, // #309 [ref=1x]
- { F(Vec)|F(Evex) , 451, 1 , CONTROL(None) , SINGLE_REG(None), 0 }, // #310 [ref=6x]
- { F(Vec)|F(Vex)|F(Evex)|F(Avx512KZ) , 204, 3 , CONTROL(None) , SINGLE_REG(None), 0 }, // #311 [ref=1x]
- { F(Vec)|F(Vex)|F(Evex)|F(Avx512KZ) , 452, 1 , CONTROL(None) , SINGLE_REG(None), 0 }, // #312 [ref=1x]
- { F(Vec)|F(Vex)|F(Evex) , 165, 3 , CONTROL(None) , SINGLE_REG(None), 0 }, // #313 [ref=1x]
- { F(Vec)|F(Evex)|F(Avx512K) , 207, 3 , CONTROL(None) , SINGLE_REG(WO) , 0 }, // #314 [ref=2x]
- { F(Vec)|F(Evex)|F(Avx512K_B32) , 207, 3 , CONTROL(None) , SINGLE_REG(WO) , 0 }, // #315 [ref=2x]
- { F(Vec)|F(Vex)|F(Evex)|F(Avx512K) , 210, 3 , CONTROL(None) , SINGLE_REG(WO) , 0 }, // #316 [ref=4x]
- { F(Vec)|F(Vex)|F(Evex)|F(Avx512K_B32) , 210, 3 , CONTROL(None) , SINGLE_REG(WO) , 0 }, // #317 [ref=2x]
- { F(Vec)|F(Vex)|F(Evex)|F(Avx512K_B64) , 210, 3 , CONTROL(None) , SINGLE_REG(WO) , 0 }, // #318 [ref=2x]
- { F(Vec)|F(Vex) , 405, 1 , CONTROL(None) , SINGLE_REG(None), 0 }, // #319 [ref=1x]
- { F(Vec)|F(Vex) , 406, 1 , CONTROL(None) , SINGLE_REG(None), 0 }, // #320 [ref=1x]
- { F(Vec)|F(Vex) , 407, 1 , CONTROL(None) , SINGLE_REG(None), 0 }, // #321 [ref=1x]
- { F(Vec)|F(Vex) , 408, 1 , CONTROL(None) , SINGLE_REG(None), 0 }, // #322 [ref=1x]
- { F(Vec)|F(Evex)|F(Avx512K_B64) , 207, 3 , CONTROL(None) , SINGLE_REG(WO) , 0 }, // #323 [ref=4x]
- { F(Vec)|F(Evex)|F(Avx512KZ_B32) , 177, 3 , CONTROL(None) , SINGLE_REG(None), 0 }, // #324 [ref=6x]
- { F(Vec)|F(Vex) , 166, 1 , CONTROL(None) , SINGLE_REG(None), 0 }, // #325 [ref=2x]
- { F(Vec)|F(Vex)|F(Evex)|F(Avx512KZ_B32) , 163, 2 , CONTROL(None) , SINGLE_REG(None), 0 }, // #326 [ref=2x]
- { F(Vec)|F(Vex) , 142, 4 , CONTROL(None) , SINGLE_REG(None), 0 }, // #327 [ref=2x]
- { F(Vec)|F(Vex)|F(Evex)|F(Avx512KZ_B64) , 76 , 6 , CONTROL(None) , SINGLE_REG(None), 0 }, // #328 [ref=2x]
- { F(Vec)|F(Vex)|F(Evex)|F(Avx512KZ_B64) , 146, 4 , CONTROL(None) , SINGLE_REG(None), 0 }, // #329 [ref=2x]
- { F(Vec)|F(Vex)|F(Evex) , 409, 1 , CONTROL(None) , SINGLE_REG(None), 0 }, // #330 [ref=1x]
- { F(Vec)|F(Vex)|F(Evex) , 410, 1 , CONTROL(None) , SINGLE_REG(None), 0 }, // #331 [ref=1x]
- { F(Vec)|F(Vex)|F(Evex) , 453, 1 , CONTROL(None) , SINGLE_REG(None), 0 }, // #332 [ref=1x]
- { F(Vec)|F(Vex)|F(Evex)|F(Avx512KZ) , 454, 1 , CONTROL(None) , SINGLE_REG(None), 0 }, // #333 [ref=1x]
- { F(Vec)|F(Vex)|F(Evex)|F(Avx512KZ) , 455, 1 , CONTROL(None) , SINGLE_REG(None), 0 }, // #334 [ref=1x]
- { F(Vec)|F(Vex)|F(Evex)|F(Avx512KZ) , 456, 1 , CONTROL(None) , SINGLE_REG(None), 0 }, // #335 [ref=1x]
- { F(Vec)|F(Vex)|F(Evex)|F(Avx512KZ) , 457, 1 , CONTROL(None) , SINGLE_REG(None), 0 }, // #336 [ref=1x]
- { F(Vec)|F(Evex)|F(Avx512KZ_B64) , 177, 3 , CONTROL(None) , SINGLE_REG(None), 0 }, // #337 [ref=4x]
- { F(Vec)|F(Vex) , 313, 1 , CONTROL(None) , SINGLE_REG(None), 0 }, // #338 [ref=12x]
- { F(Vec)|F(Vex)|F(Evex)|F(Avx512KZ) , 162, 3 , CONTROL(None) , SINGLE_REG(RO) , 0 }, // #339 [ref=8x]
- { F(Vec)|F(Evex) , 458, 1 , CONTROL(None) , SINGLE_REG(None), 0 }, // #340 [ref=4x]
- { F(Vec)|F(Evex)|F(Avx512KZ) , 213, 3 , CONTROL(None) , SINGLE_REG(None), 0 }, // #341 [ref=6x]
- { F(Vec)|F(Evex)|F(Avx512KZ) , 216, 3 , CONTROL(None) , SINGLE_REG(None), 0 }, // #342 [ref=9x]
- { F(Vec)|F(Evex)|F(Avx512KZ) , 219, 3 , CONTROL(None) , SINGLE_REG(None), 0 }, // #343 [ref=3x]
- { F(Vec)|F(Vex)|F(Evex)|F(Avx512KZ) , 222, 3 , CONTROL(None) , SINGLE_REG(None), 0 }, // #344 [ref=4x]
- { F(Vec)|F(Vex)|F(Evex)|F(Avx512KZ) , 225, 3 , CONTROL(None) , SINGLE_REG(None), 0 }, // #345 [ref=2x]
- { F(Vec)|F(Vex)|F(Evex)|F(Avx512KZ) , 174, 3 , CONTROL(None) , SINGLE_REG(None), 0 }, // #346 [ref=6x]
- { F(Vec)|F(Vex) , 130, 2 , CONTROL(None) , SINGLE_REG(None), 0 }, // #347 [ref=1x]
- { F(Vec)|F(Evex)|F(Avx512KZ_B32) , 183, 3 , CONTROL(None) , SINGLE_REG(None), 0 }, // #348 [ref=3x]
- { F(Vec)|F(Evex)|F(Avx512KZ_B64) , 183, 3 , CONTROL(None) , SINGLE_REG(None), 0 }, // #349 [ref=3x]
- { F(Vec)|F(Vex) , 333, 2 , CONTROL(None) , SINGLE_REG(None), 0 }, // #350 [ref=4x]
- { F(Vec)|F(Vsib)|F(Evex)|F(Avx512K) , 228, 3 , CONTROL(None) , SINGLE_REG(None), 0 }, // #351 [ref=3x]
- { F(Vec)|F(Vsib)|F(Evex)|F(Avx512K) , 335, 2 , CONTROL(None) , SINGLE_REG(None), 0 }, // #352 [ref=2x]
- { F(Vec)|F(Vsib)|F(Evex)|F(Avx512K) , 231, 3 , CONTROL(None) , SINGLE_REG(None), 0 }, // #353 [ref=2x]
- { F(Vec)|F(Vex) , 337, 2 , CONTROL(None) , SINGLE_REG(None), 0 }, // #354 [ref=8x]
- { F(Vec)|F(Evex)|F(Avx512K) , 234, 3 , CONTROL(None) , SINGLE_REG(None), 0 }, // #355 [ref=5x]
- { F(Vec)|F(Vex)|F(Evex)|F(Avx512KZ_B32) , 183, 3 , CONTROL(None) , SINGLE_REG(None), 0 }, // #356 [ref=1x]
- { F(Vec)|F(Vex)|F(Evex)|F(Avx512KZ) , 183, 3 , CONTROL(None) , SINGLE_REG(None), 0 }, // #357 [ref=2x]
- { F(Vec)|F(Vex)|F(Evex)|F(Avx512KZ_B32) , 82 , 6 , CONTROL(None) , SINGLE_REG(None), 0 }, // #358 [ref=3x]
- { F(Vec)|F(Vex)|F(Evex) , 183, 3 , CONTROL(None) , SINGLE_REG(None), 0 }, // #359 [ref=2x]
- { F(Vec)|F(Vex)|F(Evex)|F(Avx512KZ_B64) , 82 , 6 , CONTROL(None) , SINGLE_REG(None), 0 }, // #360 [ref=2x]
- { F(Vec)|F(Vex)|F(Evex)|F(Avx512KZ) , 82 , 6 , CONTROL(None) , SINGLE_REG(None), 0 }, // #361 [ref=3x]
- { F(Vec)|F(Evex)|F(Avx512KZ_B64) , 88 , 6 , CONTROL(None) , SINGLE_REG(None), 0 }, // #362 [ref=1x]
- { F(Vec)|F(Vex)|F(Evex)|F(Avx512KZ) , 162, 3 , CONTROL(None) , SINGLE_REG(WO) , 0 }, // #363 [ref=6x]
- { F(Vec)|F(Vex)|F(Evex)|F(Avx512KZ_B32) , 162, 3 , CONTROL(None) , SINGLE_REG(WO) , 0 }, // #364 [ref=2x]
- { F(Vec)|F(Vex)|F(Evex)|F(Avx512KZ_B64) , 162, 3 , CONTROL(None) , SINGLE_REG(WO) , 0 }, // #365 [ref=2x]
- { F(Vec)|F(Evex)|F(Avx512K_B32) , 234, 3 , CONTROL(None) , SINGLE_REG(None), 0 }, // #366 [ref=2x]
- { F(Vec)|F(Evex)|F(Avx512K_B64) , 234, 3 , CONTROL(None) , SINGLE_REG(None), 0 }, // #367 [ref=2x]
- { F(Vec)|F(Evex)|F(Avx512KZ) , 426, 1 , CONTROL(None) , SINGLE_REG(None), 0 }, // #368 [ref=2x]
- { F(Vec)|F(Evex)|F(Avx512KZ) , 427, 1 , CONTROL(None) , SINGLE_REG(None), 0 }, // #369 [ref=2x]
- { F(Vec)|F(Vex) , 427, 1 , CONTROL(None) , SINGLE_REG(None), 0 }, // #370 [ref=2x]
- { F(Vec)|F(Evex)|F(Avx512KZ) , 438, 1 , CONTROL(None) , SINGLE_REG(None), 0 }, // #371 [ref=1x]
- { F(Vec)|F(Evex)|F(Avx512KZ) , 439, 1 , CONTROL(None) , SINGLE_REG(None), 0 }, // #372 [ref=1x]
- { F(Vec)|F(Vex) , 183, 2 , CONTROL(None) , SINGLE_REG(None), 0 }, // #373 [ref=2x]
- { F(Vec)|F(Vex) , 438, 1 , CONTROL(None) , SINGLE_REG(None), 0 }, // #374 [ref=1x]
- { F(Vec)|F(Vex) , 439, 1 , CONTROL(None) , SINGLE_REG(None), 0 }, // #375 [ref=1x]
- { F(Vec)|F(Evex)|F(Avx512KZ_ER_SAE_B64) , 162, 3 , CONTROL(None) , SINGLE_REG(None), 0 }, // #376 [ref=1x]
- { F(Vec)|F(Evex)|F(Avx512KZ_ER_SAE_B32) , 162, 3 , CONTROL(None) , SINGLE_REG(None), 0 }, // #377 [ref=1x]
- { F(Vec)|F(Evex)|F(Avx512KZ_ER_SAE) , 426, 1 , CONTROL(None) , SINGLE_REG(None), 0 }, // #378 [ref=1x]
- { F(Vec)|F(Evex)|F(Avx512KZ_ER_SAE) , 427, 1 , CONTROL(None) , SINGLE_REG(None), 0 }, // #379 [ref=1x]
- { F(Vec)|F(Vsib)|F(Evex)|F(Avx512K) , 339, 2 , CONTROL(None) , SINGLE_REG(None), 0 }, // #380 [ref=1x]
- { F(Vec)|F(Evex)|F(Avx512KZ_B32) , 166, 2 , CONTROL(None) , SINGLE_REG(None), 0 }, // #381 [ref=2x]
- { F(Vec)|F(Evex)|F(Avx512KZ_B64) , 166, 2 , CONTROL(None) , SINGLE_REG(None), 0 }, // #382 [ref=2x]
- { F(Vec)|F(Vex)|F(Evex)|F(Avx512KZ_B32) , 165, 3 , CONTROL(None) , SINGLE_REG(None), 0 }, // #383 [ref=1x]
- { F(Vec)|F(Vex)|F(Evex)|F(Avx512KZ_B64) , 165, 3 , CONTROL(None) , SINGLE_REG(None), 0 }, // #384 [ref=1x]
- { F(Vec)|F(Vex)|F(Evex)|F(Avx512KZ_ER_SAE_B64) , 177, 3 , CONTROL(None) , SINGLE_REG(None), 0 }, // #385 [ref=1x]
- { F(Vec)|F(Vex) , 257, 1 , CONTROL(None) , SINGLE_REG(None), 0 }, // #386 [ref=2x]
- { F(Lock)|F(XAcquire)|F(XRelease) , 49 , 4 , CONTROL(None) , SINGLE_REG(None), 0 }, // #387 [ref=1x]
- { 0 , 459, 1 , CONTROL(None) , SINGLE_REG(None), 0 }, // #388 [ref=1x]
- { F(Lock)|F(XAcquire) , 49 , 8 , CONTROL(None) , SINGLE_REG(RO) , 0 }, // #389 [ref=1x]
- { 0 , 460, 1 , CONTROL(None) , SINGLE_REG(None), 0 }, // #390 [ref=6x]
- { 0 , 461, 1 , CONTROL(None) , SINGLE_REG(None), 0 } // #391 [ref=6x]
+ { 0 , 0 , 0 , 0 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #0 [ref=1x]
+ { 0 , 0 , 383, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #1 [ref=4x]
+ { 0 , 0 , 384, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #2 [ref=2x]
+ { F(Lock)|F(XAcquire)|F(XRelease) , 0 , 16 , 12, CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #3 [ref=2x]
+ { 0 , 0 , 180, 2 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #4 [ref=2x]
+ { F(Vec) , 0 , 79 , 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #5 [ref=54x]
+ { F(Vec) , 0 , 106, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #6 [ref=19x]
+ { F(Vec) , 0 , 212, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #7 [ref=16x]
+ { F(Vec) , 0 , 221, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #8 [ref=20x]
+ { F(Lock)|F(XAcquire)|F(XRelease) , 0 , 28 , 11, CONTROL_FLOW(Regular), SAME_REG_HINT(RO)}, // #9 [ref=1x]
+ { F(Vex) , 0 , 275, 2 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #10 [ref=3x]
+ { F(Vec) , 0 , 79 , 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(RO)}, // #11 [ref=12x]
+ { 0 , 0 , 385, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #12 [ref=1x]
+ { F(Vex) , 0 , 277, 2 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #13 [ref=5x]
+ { F(Vex) , 0 , 180, 2 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #14 [ref=12x]
+ { F(Vec) , 0 , 386, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #15 [ref=4x]
+ { 0 , 0 , 279, 2 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #16 [ref=3x]
+ { F(Mib) , 0 , 387, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #17 [ref=1x]
+ { 0 , 0 , 388, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #18 [ref=1x]
+ { 0 , 0 , 281, 2 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #19 [ref=1x]
+ { F(Mib) , 0 , 389, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #20 [ref=1x]
+ { 0 , 0 , 283, 2 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #21 [ref=1x]
+ { 0 , 0 , 179, 3 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #22 [ref=35x]
+ { 0 , 0 , 390, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #23 [ref=3x]
+ { 0 , 0 , 123, 4 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #24 [ref=1x]
+ { F(Lock)|F(XAcquire)|F(XRelease) , 0 , 123, 4 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #25 [ref=3x]
+ { F(Rep)|F(RepIgnored) , 0 , 285, 2 , CONTROL_FLOW(Call), SAME_REG_HINT(None)}, // #26 [ref=1x]
+ { 0 , 0 , 391, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #27 [ref=1x]
+ { 0 , 0 , 392, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #28 [ref=2x]
+ { 0 , 0 , 364, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #29 [ref=1x]
+ { 0 , 0 , 108, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #30 [ref=83x]
+ { 0 , 0 , 393, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #31 [ref=11x]
+ { 0 , 0 , 394, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #32 [ref=6x]
+ { 0 , 0 , 395, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #33 [ref=13x]
+ { 0 , 0 , 396, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #34 [ref=1x]
+ { 0 , 0 , 16 , 12, CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #35 [ref=1x]
+ { F(Rep) , 0 , 127, 4 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #36 [ref=1x]
+ { F(Vec) , 0 , 397, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #37 [ref=2x]
+ { F(Vec) , 0 , 398, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #38 [ref=3x]
+ { F(Lock)|F(XAcquire)|F(XRelease) , 0 , 131, 4 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #39 [ref=1x]
+ { F(Lock)|F(XAcquire)|F(XRelease) , 0 , 399, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #40 [ref=1x]
+ { F(Lock)|F(XAcquire)|F(XRelease) , 0 , 400, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #41 [ref=1x]
+ { 0 , 0 , 401, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #42 [ref=1x]
+ { 0 , 0 , 402, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #43 [ref=1x]
+ { 0 , 0 , 287, 2 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #44 [ref=1x]
+ { F(Mmx)|F(Vec) , 0 , 403, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #45 [ref=2x]
+ { F(Mmx)|F(Vec) , 0 , 404, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #46 [ref=2x]
+ { F(Mmx)|F(Vec) , 0 , 405, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #47 [ref=2x]
+ { F(Vec) , 0 , 406, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #48 [ref=2x]
+ { F(Vec) , 0 , 407, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #49 [ref=2x]
+ { F(Vec) , 0 , 408, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #50 [ref=2x]
+ { 0 , 0 , 409, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #51 [ref=1x]
+ { 0 , 0 , 410, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #52 [ref=2x]
+ { F(Lock)|F(XAcquire)|F(XRelease) , 0 , 289, 2 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #53 [ref=2x]
+ { 0 , 0 , 39 , 4 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #54 [ref=3x]
+ { F(Mmx) , 0 , 108, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #55 [ref=1x]
+ { 0 , 0 , 291, 2 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #56 [ref=2x]
+ { 0 , 0 , 411, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #57 [ref=1x]
+ { F(Vec) , 0 , 412, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #58 [ref=2x]
+ { F(Vec) , 0 , 293, 2 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #59 [ref=1x]
+ { F(FpuM32)|F(FpuM64) , 0 , 182, 3 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #60 [ref=6x]
+ { 0 , 0 , 295, 2 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #61 [ref=9x]
+ { F(FpuM80) , 0 , 413, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #62 [ref=2x]
+ { 0 , 0 , 296, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #63 [ref=13x]
+ { F(FpuM32)|F(FpuM64) , 0 , 297, 2 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #64 [ref=2x]
+ { F(FpuM16)|F(FpuM32) , 0 , 414, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #65 [ref=9x]
+ { F(FpuM16)|F(FpuM32)|F(FpuM64) , 0 , 415, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #66 [ref=3x]
+ { F(FpuM32)|F(FpuM64)|F(FpuM80) , 0 , 416, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #67 [ref=2x]
+ { F(FpuM16) , 0 , 417, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #68 [ref=3x]
+ { 0 , 0 , 418, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #69 [ref=13x]
+ { F(FpuM16) , 0 , 419, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #70 [ref=2x]
+ { F(FpuM32)|F(FpuM64) , 0 , 298, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #71 [ref=1x]
+ { 0 , 0 , 420, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #72 [ref=2x]
+ { 0 , 0 , 421, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #73 [ref=1x]
+ { 0 , 0 , 39 , 10, CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #74 [ref=1x]
+ { 0 , 0 , 422, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #75 [ref=1x]
+ { 0 , 0 , 423, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #76 [ref=2x]
+ { 0 , 0 , 348, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #77 [ref=3x]
+ { F(Rep) , 0 , 424, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #78 [ref=1x]
+ { F(Vec) , 0 , 299, 2 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #79 [ref=1x]
+ { 0 , 0 , 425, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #80 [ref=2x]
+ { 0 , 0 , 426, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #81 [ref=8x]
+ { 0 , 0 , 301, 2 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #82 [ref=3x]
+ { 0 , 0 , 303, 2 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #83 [ref=1x]
+ { 0 , 0 , 108, 1 , CONTROL_FLOW(Return), SAME_REG_HINT(None)}, // #84 [ref=2x]
+ { 0 , 0 , 395, 1 , CONTROL_FLOW(Return), SAME_REG_HINT(None)}, // #85 [ref=1x]
+ { F(Rep)|F(RepIgnored) , 0 , 305, 2 , CONTROL_FLOW(Branch), SAME_REG_HINT(None)}, // #86 [ref=30x]
+ { F(Rep)|F(RepIgnored) , 0 , 307, 2 , CONTROL_FLOW(Branch), SAME_REG_HINT(None)}, // #87 [ref=1x]
+ { F(Rep)|F(RepIgnored) , 0 , 309, 2 , CONTROL_FLOW(Jump), SAME_REG_HINT(None)}, // #88 [ref=1x]
+ { F(Vex) , 0 , 427, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #89 [ref=19x]
+ { F(Vex) , 0 , 311, 2 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #90 [ref=1x]
+ { F(Vex) , 0 , 313, 2 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #91 [ref=1x]
+ { F(Vex) , 0 , 315, 2 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #92 [ref=1x]
+ { F(Vex) , 0 , 317, 2 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #93 [ref=1x]
+ { F(Vex) , 0 , 428, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #94 [ref=12x]
+ { F(Vex) , 0 , 429, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #95 [ref=8x]
+ { F(Vex) , 0 , 427, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(WO)}, // #96 [ref=8x]
+ { 0 , 0 , 430, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #97 [ref=2x]
+ { 0 , 0 , 319, 2 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #98 [ref=1x]
+ { 0 , 0 , 321, 2 , CONTROL_FLOW(Call), SAME_REG_HINT(None)}, // #99 [ref=1x]
+ { F(Vec) , 0 , 230, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #100 [ref=2x]
+ { 0 , 0 , 431, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #101 [ref=2x]
+ { 0 , 0 , 323, 2 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #102 [ref=2x]
+ { F(Vex) , 0 , 432, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #103 [ref=2x]
+ { 0 , 0 , 433, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #104 [ref=1x]
+ { 0 , 0 , 185, 3 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #105 [ref=3x]
+ { 0 , 0 , 321, 2 , CONTROL_FLOW(Jump), SAME_REG_HINT(None)}, // #106 [ref=1x]
+ { 0 , 0 , 434, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #107 [ref=5x]
+ { F(Vex) , 0 , 435, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #108 [ref=2x]
+ { F(Rep) , 0 , 135, 4 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #109 [ref=1x]
+ { 0 , 0 , 307, 2 , CONTROL_FLOW(Branch), SAME_REG_HINT(None)}, // #110 [ref=3x]
+ { 0 , 0 , 325, 2 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #111 [ref=1x]
+ { F(Vex) , 0 , 436, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #112 [ref=2x]
+ { F(Vec) , 0 , 437, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #113 [ref=1x]
+ { F(Mmx) , 0 , 438, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #114 [ref=1x]
+ { 0 , 0 , 439, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #115 [ref=2x]
+ { F(XRelease) , 0 , 0 , 16, CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #116 [ref=1x]
+ { 0 , 0 , 49 , 9 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #117 [ref=1x]
+ { F(Vec) , 0 , 79 , 2 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #118 [ref=6x]
+ { 0 , 0 , 73 , 6 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #119 [ref=1x]
+ { F(Mmx)|F(Vec) , 0 , 327, 2 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #120 [ref=1x]
+ { 0 , 0 , 440, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #121 [ref=1x]
+ { 0 , 0 , 77 , 2 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #122 [ref=2x]
+ { F(Mmx)|F(Vec) , 0 , 441, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #123 [ref=1x]
+ { F(Vec) , 0 , 294, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #124 [ref=2x]
+ { F(Vec) , 0 , 236, 2 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #125 [ref=4x]
+ { F(Vec) , 0 , 442, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #126 [ref=2x]
+ { F(Vec) , 0 , 80 , 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #127 [ref=3x]
+ { F(Mmx) , 0 , 443, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #128 [ref=1x]
+ { F(Vec) , 0 , 107, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #129 [ref=1x]
+ { F(Vec) , 0 , 242, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #130 [ref=1x]
+ { F(Mmx)|F(Vec) , 0 , 103, 5 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #131 [ref=1x]
+ { F(Mmx)|F(Vec) , 0 , 444, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #132 [ref=1x]
+ { F(Rep) , 0 , 139, 4 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #133 [ref=1x]
+ { F(Vec) , 0 , 106, 2 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #134 [ref=1x]
+ { F(Vec) , 0 , 329, 2 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #135 [ref=1x]
+ { 0 , 0 , 331, 2 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #136 [ref=2x]
+ { 0 , 0 , 333, 2 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #137 [ref=1x]
+ { F(Vex) , 0 , 335, 2 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #138 [ref=1x]
+ { 0 , 0 , 445, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #139 [ref=1x]
+ { 0 , 0 , 446, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #140 [ref=1x]
+ { F(Lock)|F(XAcquire)|F(XRelease) , 0 , 290, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #141 [ref=2x]
+ { 0 , 0 , 108, 5 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #142 [ref=1x]
+ { F(Lock)|F(XAcquire)|F(XRelease) , 0 , 16 , 12, CONTROL_FLOW(Regular), SAME_REG_HINT(RO)}, // #143 [ref=1x]
+ { 0 , 0 , 447, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #144 [ref=1x]
+ { F(Rep) , 0 , 448, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #145 [ref=1x]
+ { F(Mmx)|F(Vec) , 0 , 337, 2 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #146 [ref=37x]
+ { F(Mmx)|F(Vec) , 0 , 339, 2 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #147 [ref=1x]
+ { F(Mmx)|F(Vec) , 0 , 337, 2 , CONTROL_FLOW(Regular), SAME_REG_HINT(RO)}, // #148 [ref=6x]
+ { F(Mmx)|F(Vec) , 0 , 337, 2 , CONTROL_FLOW(Regular), SAME_REG_HINT(WO)}, // #149 [ref=16x]
+ { F(Mmx) , 0 , 337, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #150 [ref=26x]
+ { F(Vec) , 0 , 79 , 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(WO)}, // #151 [ref=4x]
+ { F(Vec) , 0 , 449, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #152 [ref=1x]
+ { F(Vec) , 0 , 450, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #153 [ref=1x]
+ { F(Vec) , 0 , 451, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #154 [ref=1x]
+ { F(Vec) , 0 , 452, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #155 [ref=1x]
+ { F(Vec) , 0 , 453, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #156 [ref=1x]
+ { F(Vec) , 0 , 454, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #157 [ref=1x]
+ { F(Mmx)|F(Vec) , 0 , 341, 2 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #158 [ref=1x]
+ { F(Vec) , 0 , 455, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #159 [ref=1x]
+ { F(Vec) , 0 , 456, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #160 [ref=1x]
+ { F(Vec) , 0 , 457, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #161 [ref=1x]
+ { F(Mmx)|F(Vec) , 0 , 458, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #162 [ref=1x]
+ { F(Mmx)|F(Vec) , 0 , 459, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #163 [ref=1x]
+ { F(Vec) , 0 , 263, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #164 [ref=2x]
+ { 0 , 0 , 143, 4 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #165 [ref=1x]
+ { F(Mmx) , 0 , 339, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #166 [ref=1x]
+ { F(Mmx)|F(Vec) , 0 , 343, 2 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #167 [ref=8x]
+ { F(Vec) , 0 , 460, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #168 [ref=2x]
+ { 0 , 0 , 461, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #169 [ref=1x]
+ { F(Mmx)|F(Vec) , 0 , 345, 2 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #170 [ref=3x]
+ { 0 , 0 , 147, 4 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #171 [ref=1x]
+ { 0 , 0 , 462, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #172 [ref=8x]
+ { 0 , 0 , 463, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #173 [ref=4x]
+ { 0 , 0 , 464, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #174 [ref=8x]
+ { 0 , 0 , 347, 2 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #175 [ref=1x]
+ { F(Rep)|F(RepIgnored) , 0 , 349, 2 , CONTROL_FLOW(Return), SAME_REG_HINT(None)}, // #176 [ref=1x]
+ { 0 , 0 , 349, 2 , CONTROL_FLOW(Return), SAME_REG_HINT(None)}, // #177 [ref=1x]
+ { F(Vex) , 0 , 351, 2 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #178 [ref=1x]
+ { F(Lock)|F(XAcquire)|F(XRelease) , 0 , 16 , 12, CONTROL_FLOW(Regular), SAME_REG_HINT(WO)}, // #179 [ref=3x]
+ { F(Rep) , 0 , 151, 4 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #180 [ref=1x]
+ { 0 , 0 , 465, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #181 [ref=30x]
+ { 0 , 0 , 188, 3 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #182 [ref=2x]
+ { 0 , 0 , 466, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #183 [ref=3x]
+ { F(Rep) , 0 , 155, 4 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #184 [ref=1x]
+ { F(Vex) , 0 , 467, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #185 [ref=5x]
+ { 0 , 0 , 66 , 7 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #186 [ref=1x]
+ { F(Tsib)|F(Vex) , 0 , 468, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #187 [ref=2x]
+ { F(Vex) , 0 , 395, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #188 [ref=1x]
+ { F(Tsib)|F(Vex) , 0 , 469, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #189 [ref=1x]
+ { F(Vex) , 0 , 470, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #190 [ref=1x]
+ { 0 , 0 , 471, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #191 [ref=2x]
+ { 0 , 0 , 180, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #192 [ref=2x]
+ { 0 , 0 , 472, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #193 [ref=1x]
+ { F(Evex)|F(Vec) , X(K)|X(T4X)|X(Z) , 473, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #194 [ref=4x]
+ { F(Evex)|F(Vec) , X(K)|X(T4X)|X(Z) , 474, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #195 [ref=2x]
+ { F(Evex)|F(EvexCompat)|F(Vec)|F(Vex) , X(B64)|X(ER)|X(K)|X(SAE)|X(Z) , 191, 3 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #196 [ref=22x]
+ { F(Evex)|F(Vec) , X(B16)|X(ER)|X(K)|X(SAE)|X(Z) , 191, 3 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #197 [ref=23x]
+ { F(Evex)|F(EvexCompat)|F(Vec)|F(Vex) , X(B32)|X(ER)|X(K)|X(SAE)|X(Z) , 191, 3 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #198 [ref=22x]
+ { F(Evex)|F(EvexCompat)|F(Vec)|F(Vex) , X(ER)|X(K)|X(SAE)|X(Z) , 475, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #199 [ref=18x]
+ { F(Evex)|F(Vec) , X(ER)|X(K)|X(SAE)|X(Z) , 476, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #200 [ref=18x]
+ { F(Evex)|F(EvexCompat)|F(Vec)|F(Vex) , X(ER)|X(K)|X(SAE)|X(Z) , 477, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #201 [ref=17x]
+ { F(Vec)|F(Vex) , 0 , 191, 2 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #202 [ref=15x]
+ { F(Evex)|F(EvexCompat)|F(Vec)|F(Vex) , 0 , 191, 3 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #203 [ref=5x]
+ { F(Vec)|F(Vex) , 0 , 79 , 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #204 [ref=17x]
+ { F(Vec)|F(Vex) , 0 , 221, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #205 [ref=1x]
+ { F(Evex)|F(Vec) , X(B32)|X(K)|X(Z) , 194, 3 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #206 [ref=4x]
+ { F(Evex)|F(Vec) , X(B64)|X(K)|X(Z) , 194, 3 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #207 [ref=4x]
+ { F(Evex)|F(EvexCompat)|F(Vec)|F(Vex) , X(B64)|X(K)|X(Z) , 191, 3 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #208 [ref=10x]
+ { F(Evex)|F(EvexCompat)|F(Vec)|F(Vex) , X(B32)|X(K)|X(Z) , 191, 3 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #209 [ref=12x]
+ { F(Evex)|F(EvexCompat)|F(Vec)|F(Vex) , X(B64)|X(K)|X(Z) , 191, 3 , CONTROL_FLOW(Regular), SAME_REG_HINT(RO)}, // #210 [ref=2x]
+ { F(Evex)|F(EvexCompat)|F(Vec)|F(Vex) , X(B32)|X(K)|X(Z) , 191, 3 , CONTROL_FLOW(Regular), SAME_REG_HINT(RO)}, // #211 [ref=6x]
+ { F(Evex)|F(Vec) , X(B64)|X(K)|X(Z) , 191, 3 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #212 [ref=19x]
+ { F(Evex)|F(Vec) , X(B32)|X(K)|X(Z) , 191, 3 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #213 [ref=12x]
+ { F(Vec)|F(Vex) , 0 , 194, 2 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #214 [ref=6x]
+ { F(Vec)|F(Vex) , 0 , 353, 2 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #215 [ref=3x]
+ { F(EvexTransformable)|F(Vec)|F(Vex) , 0 , 478, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #216 [ref=2x]
+ { F(Evex)|F(Vec) , X(K)|X(Z) , 479, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #217 [ref=1x]
+ { F(Evex)|F(Vec) , X(K)|X(Z) , 480, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #218 [ref=4x]
+ { F(Evex)|F(Vec) , X(K)|X(Z) , 481, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #219 [ref=4x]
+ { F(Evex)|F(Vec) , X(K)|X(Z) , 482, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #220 [ref=1x]
+ { F(Evex)|F(EvexCompat)|F(Vec)|F(Vex) , X(K)|X(Z) , 479, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #221 [ref=1x]
+ { F(Evex)|F(EvexCompat)|F(Vec)|F(Vex) , X(K)|X(Z) , 483, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #222 [ref=1x]
+ { F(Evex)|F(EvexKReg)|F(Vec)|F(Vex) , X(B64)|X(ImplicitZ)|X(K)|X(SAE), 197, 3 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #223 [ref=1x]
+ { F(Evex)|F(Vec) , X(B16)|X(ImplicitZ)|X(K)|X(SAE), 200, 3 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #224 [ref=1x]
+ { F(Evex)|F(EvexKReg)|F(Vec)|F(Vex) , X(B32)|X(ImplicitZ)|X(K)|X(SAE), 197, 3 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #225 [ref=1x]
+ { F(Evex)|F(EvexKReg)|F(Vec)|F(Vex) , X(ImplicitZ)|X(K)|X(SAE) , 484, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #226 [ref=1x]
+ { F(Evex)|F(Vec) , X(ImplicitZ)|X(K)|X(SAE) , 485, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #227 [ref=1x]
+ { F(Evex)|F(EvexKReg)|F(Vec)|F(Vex) , X(ImplicitZ)|X(K)|X(SAE) , 486, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #228 [ref=1x]
+ { F(Evex)|F(EvexCompat)|F(Vec)|F(Vex) , X(SAE) , 106, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #229 [ref=2x]
+ { F(Evex)|F(Vec) , X(SAE) , 263, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #230 [ref=2x]
+ { F(Evex)|F(EvexCompat)|F(Vec)|F(Vex) , X(SAE) , 212, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #231 [ref=2x]
+ { F(Evex)|F(Vec) , X(K)|X(Z) , 203, 3 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #232 [ref=6x]
+ { F(Evex)|F(EvexCompat)|F(Vec)|F(Vex) , X(B32)|X(K)|X(Z) , 206, 3 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #233 [ref=1x]
+ { F(Evex)|F(Vec) , X(B32)|X(ER)|X(K)|X(SAE)|X(Z) , 355, 2 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #234 [ref=3x]
+ { F(Evex)|F(EvexCompat)|F(Vec)|F(Vex) , X(B32)|X(ER)|X(K)|X(SAE)|X(Z) , 209, 3 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #235 [ref=3x]
+ { F(Evex)|F(Vec) , X(B32)|X(K)|X(Z) , 355, 2 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #236 [ref=1x]
+ { F(Evex)|F(EvexCompat)|F(Vec)|F(Vex) , X(B64)|X(ER)|X(K)|X(SAE)|X(Z) , 355, 2 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #237 [ref=2x]
+ { F(Evex)|F(Vec) , X(B64)|X(ER)|X(K)|X(SAE)|X(Z) , 487, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #238 [ref=3x]
+ { F(Evex)|F(Vec) , X(B64)|X(ER)|X(K)|X(SAE)|X(Z) , 209, 3 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #239 [ref=4x]
+ { F(Evex)|F(Vec) , X(B64)|X(ER)|X(K)|X(SAE)|X(Z) , 355, 2 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #240 [ref=3x]
+ { F(Evex)|F(Vec) , X(B16)|X(ER)|X(K)|X(SAE)|X(Z) , 206, 3 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #241 [ref=2x]
+ { F(Evex)|F(Vec) , X(B16)|X(K)|X(SAE)|X(Z) , 212, 3 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #242 [ref=3x]
+ { F(Evex)|F(EvexCompat)|F(Vec)|F(Vex) , X(K)|X(SAE)|X(Z) , 206, 3 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #243 [ref=1x]
+ { F(Evex)|F(Vec) , X(B16)|X(K)|X(SAE)|X(Z) , 206, 3 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #244 [ref=3x]
+ { F(Evex)|F(Vec) , X(B16)|X(ER)|X(K)|X(SAE)|X(Z) , 212, 3 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #245 [ref=2x]
+ { F(Evex)|F(Vec) , X(B16)|X(ER)|X(K)|X(SAE)|X(Z) , 209, 3 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #246 [ref=5x]
+ { F(Evex)|F(EvexCompat)|F(Vec)|F(Vex) , X(B32)|X(ER)|X(K)|X(SAE)|X(Z) , 206, 3 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #247 [ref=1x]
+ { F(Evex)|F(EvexCompat)|F(Vec)|F(Vex) , X(K)|X(SAE)|X(Z) , 215, 3 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #248 [ref=1x]
+ { F(Evex)|F(Vec) , X(B32)|X(ER)|X(K)|X(SAE)|X(Z) , 206, 3 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #249 [ref=2x]
+ { F(Evex)|F(Vec) , X(B32)|X(ER)|X(K)|X(SAE)|X(Z) , 209, 3 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #250 [ref=2x]
+ { F(Evex)|F(Vec) , X(ER)|X(K)|X(SAE)|X(Z) , 475, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #251 [ref=2x]
+ { F(Evex)|F(EvexCompat)|F(Vec)|F(Vex) , X(ER)|X(SAE) , 406, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #252 [ref=1x]
+ { F(Evex)|F(Vec) , X(ER)|X(SAE) , 406, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #253 [ref=1x]
+ { F(Evex)|F(Vec) , X(K)|X(SAE)|X(Z) , 476, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #254 [ref=5x]
+ { F(Evex)|F(Vec) , X(ER)|X(SAE) , 488, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #255 [ref=2x]
+ { F(Evex)|F(EvexCompat)|F(Vec)|F(Vex) , X(ER)|X(SAE) , 489, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #256 [ref=2x]
+ { F(Evex)|F(Vec) , X(ER)|X(SAE) , 489, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #257 [ref=4x]
+ { F(Evex)|F(EvexCompat)|F(Vec)|F(Vex) , X(K)|X(SAE)|X(Z) , 477, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #258 [ref=3x]
+ { F(Evex)|F(Vec) , X(ER)|X(K)|X(SAE)|X(Z) , 477, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #259 [ref=6x]
+ { F(Evex)|F(EvexCompat)|F(Vec)|F(Vex) , X(ER)|X(SAE) , 408, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #260 [ref=1x]
+ { F(Evex)|F(Vec) , X(ER)|X(SAE) , 408, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #261 [ref=1x]
+ { F(Evex)|F(EvexCompat)|F(Vec)|F(Vex) , X(B64)|X(K)|X(SAE)|X(Z) , 355, 2 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #262 [ref=1x]
+ { F(Evex)|F(Vec) , X(B64)|X(K)|X(SAE)|X(Z) , 209, 3 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #263 [ref=3x]
+ { F(Evex)|F(Vec) , X(B64)|X(K)|X(SAE)|X(Z) , 355, 2 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #264 [ref=1x]
+ { F(Evex)|F(Vec) , X(B16)|X(K)|X(SAE)|X(Z) , 209, 3 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #265 [ref=3x]
+ { F(Evex)|F(EvexCompat)|F(Vec)|F(Vex) , X(B32)|X(K)|X(SAE)|X(Z) , 209, 3 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #266 [ref=1x]
+ { F(Evex)|F(Vec) , X(B32)|X(K)|X(SAE)|X(Z) , 206, 3 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #267 [ref=2x]
+ { F(Evex)|F(Vec) , X(B32)|X(K)|X(SAE)|X(Z) , 209, 3 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #268 [ref=2x]
+ { F(Evex)|F(EvexCompat)|F(Vec)|F(Vex) , X(SAE) , 406, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #269 [ref=1x]
+ { F(Evex)|F(Vec) , X(SAE) , 406, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #270 [ref=1x]
+ { F(Evex)|F(Vec) , X(SAE) , 488, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #271 [ref=2x]
+ { F(Evex)|F(EvexCompat)|F(Vec)|F(Vex) , X(SAE) , 408, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #272 [ref=1x]
+ { F(Evex)|F(Vec) , X(SAE) , 408, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #273 [ref=1x]
+ { F(Evex)|F(Vec) , X(B32)|X(K)|X(Z) , 206, 3 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #274 [ref=1x]
+ { F(Evex)|F(Vec) , X(K)|X(Z) , 194, 3 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #275 [ref=3x]
+ { F(Vec)|F(Vex) , 0 , 194, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #276 [ref=9x]
+ { F(Evex)|F(Vec) , X(B64)|X(K)|X(SAE)|X(Z) , 83 , 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #277 [ref=3x]
+ { F(Evex)|F(Vec) , X(B32)|X(K)|X(SAE)|X(Z) , 83 , 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #278 [ref=3x]
+ { F(Evex)|F(Vec) , X(K)|X(Z) , 209, 3 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #279 [ref=8x]
+ { F(EvexTransformable)|F(Vec)|F(Vex) , 0 , 216, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #280 [ref=2x]
+ { F(Evex)|F(Vec) , X(K)|X(Z) , 490, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #281 [ref=4x]
+ { F(Evex)|F(Vec) , X(K)|X(Z) , 217, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #282 [ref=4x]
+ { F(Evex)|F(EvexCompat)|F(Vec)|F(Vex) , 0 , 412, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #283 [ref=2x]
+ { F(Evex)|F(Vec) , X(B32)|X(ER)|X(K)|X(SAE)|X(Z) , 191, 3 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #284 [ref=5x]
+ { F(Evex)|F(Vec) , X(B64)|X(K)|X(SAE)|X(Z) , 194, 3 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #285 [ref=2x]
+ { F(Evex)|F(Vec) , X(B32)|X(K)|X(SAE)|X(Z) , 194, 3 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #286 [ref=2x]
+ { F(Evex)|F(Vec) , X(K)|X(SAE)|X(Z) , 491, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #287 [ref=4x]
+ { F(Evex)|F(Vec) , X(K)|X(SAE)|X(Z) , 492, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #288 [ref=4x]
+ { F(Vec)|F(Vex) , 0 , 159, 4 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #289 [ref=13x]
+ { F(Vec)|F(Vex) , 0 , 357, 2 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #290 [ref=4x]
+ { F(Vec)|F(Vex) , 0 , 359, 2 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #291 [ref=4x]
+ { F(Evex)|F(Vec) , X(B64)|X(ImplicitZ)|X(K) , 493, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #292 [ref=1x]
+ { F(Evex)|F(Vec) , X(B16)|X(K) , 493, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #293 [ref=1x]
+ { F(Evex)|F(Vec) , X(B32)|X(ImplicitZ)|X(K) , 493, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #294 [ref=1x]
+ { F(Evex)|F(Vec) , X(ImplicitZ)|X(K) , 494, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #295 [ref=1x]
+ { F(Evex)|F(Vec) , X(K) , 495, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #296 [ref=1x]
+ { F(Evex)|F(Vec) , X(ImplicitZ)|X(K) , 496, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #297 [ref=1x]
+ { F(Vec)|F(Vex) , 0 , 209, 2 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #298 [ref=7x]
+ { F(Vec)|F(Vex) , 0 , 106, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #299 [ref=1x]
+ { F(Vec)|F(Vex) , 0 , 212, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #300 [ref=1x]
+ { F(Evex)|F(EvexTwoOp)|F(Vec)|F(Vex)|F(Vsib) , X(K) , 163, 4 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #301 [ref=2x]
+ { F(Evex)|F(EvexTwoOp)|F(Vec)|F(Vex)|F(Vsib) , X(K) , 113, 5 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #302 [ref=2x]
+ { F(Evex)|F(Vsib) , X(K) , 497, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #303 [ref=4x]
+ { F(Evex)|F(Vsib) , X(K) , 498, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #304 [ref=4x]
+ { F(Evex)|F(Vsib) , X(K) , 499, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #305 [ref=8x]
+ { F(Evex)|F(EvexTwoOp)|F(Vec)|F(Vex)|F(Vsib) , X(K) , 118, 5 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #306 [ref=2x]
+ { F(Evex)|F(EvexTwoOp)|F(Vec)|F(Vex)|F(Vsib) , X(K) , 218, 3 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #307 [ref=2x]
+ { F(Evex)|F(Vec) , X(K)|X(SAE)|X(Z) , 475, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #308 [ref=3x]
+ { F(Evex)|F(Vec) , X(K)|X(SAE)|X(Z) , 477, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #309 [ref=3x]
+ { F(Evex)|F(Vec) , X(B64)|X(K)|X(SAE)|X(Z) , 221, 3 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #310 [ref=2x]
+ { F(Evex)|F(Vec) , X(B16)|X(K)|X(SAE)|X(Z) , 221, 3 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #311 [ref=3x]
+ { F(Evex)|F(Vec) , X(B32)|X(K)|X(SAE)|X(Z) , 221, 3 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #312 [ref=2x]
+ { F(Evex)|F(Vec) , X(K)|X(SAE)|X(Z) , 500, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #313 [ref=3x]
+ { F(Evex)|F(EvexCompat)|F(Vec)|F(Vex) , X(K)|X(Z) , 194, 3 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #314 [ref=3x]
+ { F(Evex)|F(EvexCompat)|F(Vec)|F(Vex) , X(K)|X(Z) , 191, 3 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #315 [ref=22x]
+ { F(EvexTransformable)|F(Vec)|F(Vex) , 0 , 361, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #316 [ref=2x]
+ { F(Evex)|F(Vec) , X(K)|X(Z) , 361, 2 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #317 [ref=4x]
+ { F(Evex)|F(Vec) , X(K)|X(Z) , 501, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #318 [ref=4x]
+ { F(Evex)|F(EvexCompat)|F(Vec)|F(Vex) , 0 , 492, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #319 [ref=1x]
+ { F(Vec)|F(Vex) , 0 , 230, 2 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #320 [ref=1x]
+ { F(Vex) , 0 , 431, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #321 [ref=2x]
+ { F(Vec)|F(Vex) , 0 , 437, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #322 [ref=1x]
+ { F(Vec)|F(Vex) , 0 , 167, 4 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #323 [ref=4x]
+ { F(Evex)|F(EvexCompat)|F(Vec)|F(Vex) , X(B64)|X(K)|X(SAE)|X(Z) , 191, 3 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #324 [ref=2x]
+ { F(Evex)|F(Vec) , X(B16)|X(K)|X(SAE)|X(Z) , 191, 3 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #325 [ref=2x]
+ { F(Evex)|F(EvexCompat)|F(Vec)|F(Vex) , X(B32)|X(K)|X(SAE)|X(Z) , 191, 3 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #326 [ref=2x]
+ { F(Evex)|F(EvexCompat)|F(Vec)|F(Vex) , X(K)|X(SAE)|X(Z) , 475, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #327 [ref=2x]
+ { 0 , 0 , 363, 2 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #328 [ref=3x]
+ { F(Evex)|F(EvexCompat)|F(Vec)|F(Vex) , X(K)|X(Z) , 79 , 6 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #329 [ref=4x]
+ { F(Evex)|F(EvexCompat)|F(Vec)|F(Vex) , 0 , 365, 2 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #330 [ref=1x]
+ { F(Evex)|F(EvexCompat)|F(Vec)|F(Vex) , X(K)|X(Z) , 224, 3 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #331 [ref=1x]
+ { F(EvexTransformable)|F(Vec)|F(Vex) , 0 , 79 , 4 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #332 [ref=2x]
+ { F(Evex)|F(Vec) , X(K)|X(Z) , 79 , 6 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #333 [ref=6x]
+ { F(Evex)|F(EvexCompat)|F(Vec)|F(Vex) , 0 , 238, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #334 [ref=2x]
+ { F(Evex)|F(EvexCompat)|F(Vec)|F(Vex) , 0 , 367, 2 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #335 [ref=4x]
+ { F(Vec)|F(Vex) , 0 , 502, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #336 [ref=3x]
+ { F(Evex)|F(EvexCompat)|F(Vec)|F(Vex) , 0 , 227, 3 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #337 [ref=3x]
+ { F(Evex)|F(EvexCompat)|F(Vec)|F(Vex) , 0 , 230, 3 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #338 [ref=1x]
+ { F(Evex)|F(EvexCompat)|F(Vec)|F(Vex) , 0 , 233, 3 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #339 [ref=1x]
+ { F(Evex)|F(EvexCompat)|F(Vec)|F(Vex) , X(K)|X(Z) , 236, 3 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #340 [ref=1x]
+ { F(Evex)|F(Vec) , X(K)|X(Z) , 239, 3 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #341 [ref=1x]
+ { F(Evex)|F(EvexCompat)|F(Vec)|F(Vex) , X(K)|X(Z) , 209, 3 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #342 [ref=4x]
+ { F(Evex)|F(EvexCompat)|F(Vec)|F(Vex) , X(K)|X(Z) , 242, 3 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #343 [ref=1x]
+ { F(Evex)|F(Vec) , X(K)|X(Z) , 369, 2 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #344 [ref=1x]
+ { 0 , 0 , 371, 2 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #345 [ref=1x]
+ { 0 , 0 , 373, 2 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #346 [ref=1x]
+ { F(Evex)|F(Vec) , X(B32) , 245, 3 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #347 [ref=1x]
+ { F(Evex)|F(Vec) , X(B64) , 245, 3 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #348 [ref=1x]
+ { F(Evex)|F(EvexCompat)|F(Vec)|F(Vex) , X(B32)|X(K)|X(Z) , 209, 3 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #349 [ref=1x]
+ { F(Evex)|F(Vec) , X(B64)|X(K)|X(Z) , 209, 3 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #350 [ref=5x]
+ { F(EvexTransformable)|F(Vec)|F(Vex) , 0 , 191, 2 , CONTROL_FLOW(Regular), SAME_REG_HINT(RO)}, // #351 [ref=2x]
+ { F(Evex)|F(Vec) , X(B32)|X(K)|X(Z) , 191, 3 , CONTROL_FLOW(Regular), SAME_REG_HINT(RO)}, // #352 [ref=2x]
+ { F(EvexTransformable)|F(Vec)|F(Vex) , 0 , 191, 2 , CONTROL_FLOW(Regular), SAME_REG_HINT(WO)}, // #353 [ref=2x]
+ { F(Evex)|F(Vec) , X(B32)|X(K)|X(Z) , 191, 3 , CONTROL_FLOW(Regular), SAME_REG_HINT(WO)}, // #354 [ref=2x]
+ { F(Evex)|F(Vec) , X(B64)|X(K)|X(Z) , 191, 3 , CONTROL_FLOW(Regular), SAME_REG_HINT(WO)}, // #355 [ref=2x]
+ { F(Evex)|F(Vec) , X(B64)|X(K)|X(Z) , 191, 3 , CONTROL_FLOW(Regular), SAME_REG_HINT(RO)}, // #356 [ref=2x]
+ { F(Evex)|F(Vec) , X(K)|X(Z) , 191, 3 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #357 [ref=13x]
+ { F(Evex)|F(EvexCompat)|F(Vec)|F(Vex) , X(K)|X(Z) , 503, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #358 [ref=1x]
+ { F(Evex)|F(EvexCompat)|F(Vec)|F(Vex) , X(K)|X(Z) , 504, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #359 [ref=1x]
+ { F(Evex)|F(Vec) , 0 , 505, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #360 [ref=6x]
+ { F(Evex)|F(EvexCompat)|F(Vec)|F(Vex) , X(K)|X(Z) , 248, 3 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #361 [ref=1x]
+ { F(Evex)|F(EvexCompat)|F(Vec)|F(Vex) , X(K)|X(Z) , 506, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #362 [ref=1x]
+ { F(Evex)|F(EvexCompat)|F(Vec)|F(Vex) , 0 , 194, 3 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #363 [ref=1x]
+ { F(Evex)|F(Vec) , X(ImplicitZ)|X(K) , 200, 3 , CONTROL_FLOW(Regular), SAME_REG_HINT(WO)}, // #364 [ref=2x]
+ { F(Evex)|F(Vec) , X(B32)|X(ImplicitZ)|X(K) , 200, 3 , CONTROL_FLOW(Regular), SAME_REG_HINT(WO)}, // #365 [ref=2x]
+ { F(Evex)|F(EvexKReg)|F(Vec)|F(Vex) , X(ImplicitZ)|X(K) , 251, 3 , CONTROL_FLOW(Regular), SAME_REG_HINT(WO)}, // #366 [ref=4x]
+ { F(Evex)|F(EvexKReg)|F(Vec)|F(Vex) , X(B32)|X(ImplicitZ)|X(K) , 251, 3 , CONTROL_FLOW(Regular), SAME_REG_HINT(WO)}, // #367 [ref=2x]
+ { F(Evex)|F(EvexKReg)|F(Vec)|F(Vex) , X(B64)|X(ImplicitZ)|X(K) , 251, 3 , CONTROL_FLOW(Regular), SAME_REG_HINT(WO)}, // #368 [ref=2x]
+ { F(Vec)|F(Vex) , 0 , 449, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #369 [ref=1x]
+ { F(Vec)|F(Vex) , 0 , 450, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #370 [ref=1x]
+ { F(Vec)|F(Vex) , 0 , 451, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #371 [ref=1x]
+ { F(Vec)|F(Vex) , 0 , 452, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #372 [ref=1x]
+ { F(Evex)|F(Vec) , X(B64)|X(ImplicitZ)|X(K) , 200, 3 , CONTROL_FLOW(Regular), SAME_REG_HINT(WO)}, // #373 [ref=4x]
+ { F(Evex)|F(Vec) , X(B32)|X(K)|X(Z) , 209, 3 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #374 [ref=6x]
+ { F(Evex)|F(EvexCompat)|F(PreferEvex)|F(Vec)|F(Vex) , X(B32)|X(K)|X(Z) , 191, 3 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #375 [ref=4x]
+ { F(Vec)|F(Vex) , 0 , 195, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #376 [ref=2x]
+ { F(Evex)|F(EvexCompat)|F(Vec)|F(Vex) , X(B32)|X(K)|X(Z) , 192, 2 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #377 [ref=2x]
+ { F(Vec)|F(Vex) , 0 , 171, 4 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #378 [ref=2x]
+ { F(Evex)|F(EvexCompat)|F(Vec)|F(Vex) , X(B64)|X(K)|X(Z) , 85 , 6 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #379 [ref=1x]
+ { F(Evex)|F(EvexCompat)|F(Vec)|F(Vex) , X(B32)|X(K)|X(Z) , 85 , 6 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #380 [ref=1x]
+ { F(Evex)|F(EvexCompat)|F(Vec)|F(Vex) , X(B64)|X(K)|X(Z) , 175, 4 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #381 [ref=2x]
+ { F(Evex)|F(EvexCompat)|F(Vec)|F(Vex) , 0 , 453, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #382 [ref=1x]
+ { F(Evex)|F(EvexCompat)|F(Vec)|F(Vex) , 0 , 454, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #383 [ref=1x]
+ { F(Evex)|F(EvexCompat)|F(Vec)|F(Vex) , 0 , 507, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #384 [ref=1x]
+ { F(Evex)|F(EvexCompat)|F(Vec)|F(Vex) , X(K)|X(Z) , 508, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #385 [ref=1x]
+ { F(Evex)|F(EvexCompat)|F(Vec)|F(Vex) , X(K)|X(Z) , 509, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #386 [ref=1x]
+ { F(Evex)|F(EvexCompat)|F(Vec)|F(Vex) , X(K)|X(Z) , 510, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #387 [ref=1x]
+ { F(Evex)|F(EvexCompat)|F(Vec)|F(Vex) , X(K)|X(Z) , 511, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #388 [ref=1x]
+ { F(Vec)|F(Vex) , 0 , 353, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #389 [ref=12x]
+ { F(Evex)|F(EvexCompat)|F(Vec)|F(Vex) , X(K)|X(Z) , 191, 3 , CONTROL_FLOW(Regular), SAME_REG_HINT(RO)}, // #390 [ref=8x]
+ { F(Evex)|F(Vec) , 0 , 512, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #391 [ref=4x]
+ { F(Evex)|F(Vec) , X(K)|X(Z) , 254, 3 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #392 [ref=6x]
+ { F(Evex)|F(Vec) , X(K)|X(Z) , 257, 3 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #393 [ref=9x]
+ { F(Evex)|F(Vec) , X(K)|X(Z) , 260, 3 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #394 [ref=3x]
+ { F(Evex)|F(EvexCompat)|F(Vec)|F(Vex) , X(K)|X(Z) , 212, 3 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #395 [ref=4x]
+ { F(Evex)|F(EvexCompat)|F(Vec)|F(Vex) , X(K)|X(Z) , 263, 3 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #396 [ref=2x]
+ { F(Evex)|F(EvexCompat)|F(Vec)|F(Vex) , X(K)|X(Z) , 206, 3 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #397 [ref=6x]
+ { F(Vec)|F(Vex) , 0 , 159, 2 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #398 [ref=1x]
+ { F(Evex)|F(Vec) , X(B32)|X(K)|X(Z) , 221, 3 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #399 [ref=3x]
+ { F(Evex)|F(Vec) , X(B64)|X(K)|X(Z) , 221, 3 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #400 [ref=3x]
+ { F(Vec)|F(Vex) , 0 , 375, 2 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #401 [ref=4x]
+ { F(Evex)|F(Vec)|F(Vsib) , X(K) , 266, 3 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #402 [ref=2x]
+ { F(Evex)|F(Vec)|F(Vsib) , X(K) , 377, 2 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #403 [ref=2x]
+ { F(Evex)|F(Vec)|F(Vsib) , X(K) , 379, 2 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #404 [ref=2x]
+ { F(Evex)|F(Vec)|F(Vsib) , X(K) , 269, 3 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #405 [ref=2x]
+ { F(Vec)|F(Vex) , 0 , 381, 2 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #406 [ref=8x]
+ { F(Evex)|F(Vec) , X(ImplicitZ)|X(K) , 272, 3 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #407 [ref=5x]
+ { F(Evex)|F(EvexCompat)|F(Vec)|F(Vex) , X(B32)|X(K)|X(Z) , 221, 3 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #408 [ref=1x]
+ { F(Evex)|F(EvexCompat)|F(Vec)|F(Vex) , X(K)|X(Z) , 221, 3 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #409 [ref=2x]
+ { F(Evex)|F(EvexCompat)|F(Vec)|F(Vex) , X(B32)|X(K)|X(Z) , 91 , 6 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #410 [ref=3x]
+ { F(Evex)|F(EvexCompat)|F(Vec)|F(Vex) , 0 , 221, 3 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #411 [ref=2x]
+ { F(Evex)|F(EvexCompat)|F(Vec)|F(Vex) , X(B64)|X(K)|X(Z) , 91 , 6 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #412 [ref=2x]
+ { F(Evex)|F(EvexCompat)|F(Vec)|F(Vex) , X(K)|X(Z) , 91 , 6 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #413 [ref=3x]
+ { F(Evex)|F(Vec) , X(B64)|X(K)|X(Z) , 97 , 6 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #414 [ref=1x]
+ { F(Evex)|F(EvexCompat)|F(Vec)|F(Vex) , X(K)|X(Z) , 191, 3 , CONTROL_FLOW(Regular), SAME_REG_HINT(WO)}, // #415 [ref=6x]
+ { F(Evex)|F(EvexCompat)|F(Vec)|F(Vex) , X(B32)|X(K)|X(Z) , 191, 3 , CONTROL_FLOW(Regular), SAME_REG_HINT(WO)}, // #416 [ref=2x]
+ { F(Evex)|F(EvexCompat)|F(Vec)|F(Vex) , X(B64)|X(K)|X(Z) , 191, 3 , CONTROL_FLOW(Regular), SAME_REG_HINT(WO)}, // #417 [ref=2x]
+ { F(Evex)|F(Vec) , X(B32)|X(ImplicitZ)|X(K) , 272, 3 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #418 [ref=2x]
+ { F(Evex)|F(Vec) , X(B64)|X(ImplicitZ)|X(K) , 272, 3 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #419 [ref=2x]
+ { F(Evex)|F(Vec) , X(K)|X(Z) , 475, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #420 [ref=2x]
+ { F(Evex)|F(Vec) , X(K)|X(Z) , 477, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #421 [ref=2x]
+ { F(Evex)|F(Vec) , X(B16)|X(K)|X(Z) , 209, 3 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #422 [ref=2x]
+ { F(Evex)|F(Vec) , X(K)|X(Z) , 476, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #423 [ref=2x]
+ { F(Vec)|F(Vex) , 0 , 477, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #424 [ref=2x]
+ { F(Evex)|F(Vec) , X(K)|X(Z) , 491, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #425 [ref=1x]
+ { F(Evex)|F(Vec) , X(K)|X(Z) , 492, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #426 [ref=1x]
+ { F(EvexTransformable)|F(Vec)|F(Vex) , 0 , 221, 2 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #427 [ref=2x]
+ { F(EvexTransformable)|F(Vec)|F(Vex) , 0 , 491, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #428 [ref=1x]
+ { F(EvexTransformable)|F(Vec)|F(Vex) , 0 , 492, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #429 [ref=1x]
+ { F(Evex)|F(Vec) , X(B64)|X(ER)|X(K)|X(SAE)|X(Z) , 191, 3 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #430 [ref=1x]
+ { F(Evex)|F(Vec) , X(B32)|X(K)|X(Z) , 195, 2 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #431 [ref=2x]
+ { F(Evex)|F(Vec) , X(B64)|X(K)|X(Z) , 195, 2 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #432 [ref=2x]
+ { F(Evex)|F(EvexCompat)|F(Vec)|F(Vex) , X(B64)|X(K)|X(Z) , 194, 3 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #433 [ref=1x]
+ { F(Evex)|F(EvexCompat)|F(Vec)|F(Vex) , X(B32)|X(K)|X(Z) , 194, 3 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #434 [ref=1x]
+ { F(Evex)|F(EvexCompat)|F(Vec)|F(Vex) , X(B64)|X(ER)|X(K)|X(SAE)|X(Z) , 209, 3 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #435 [ref=1x]
+ { F(Vec)|F(Vex) , 0 , 108, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #436 [ref=2x]
+ { 0 , 0 , 23 , 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #437 [ref=2x]
+ { 0 , 0 , 61 , 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #438 [ref=2x]
+ { F(Lock)|F(XAcquire)|F(XRelease) , 0 , 58 , 4 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #439 [ref=1x]
+ { 0 , 0 , 513, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #440 [ref=1x]
+ { F(Lock)|F(XAcquire) , 0 , 58 , 8 , CONTROL_FLOW(Regular), SAME_REG_HINT(RO)}, // #441 [ref=1x]
+ { 0 , 0 , 514, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #442 [ref=6x]
+ { 0 , 0 , 515, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)} // #443 [ref=6x]
};
-#undef SINGLE_REG
-#undef CONTROL
+#undef SAME_REG_HINT
+#undef CONTROL_FLOW
+#undef X
#undef F
// ----------------------------------------------------------------------------
// ${InstCommonTable:End}
-// ============================================================================
-// [asmjit::x86::InstDB - CommonInfoTableB]
-// ============================================================================
+// x86::InstDB - AdditionalInfoTable
+// =================================
-// ${InstCommonInfoTableB:Begin}
+// ${AdditionalInfoTable:Begin}
// ------------------- Automatically generated, do not edit -------------------
-#define EXT(VAL) uint32_t(Features::k##VAL)
-const InstDB::CommonInfoTableB InstDB::_commonInfoTableB[] = {
- { { 0 }, 0, 0 }, // #0 [ref=144x]
+#define EXT(VAL) uint32_t(CpuFeatures::X86::k##VAL)
+const InstDB::AdditionalInfo InstDB::_additionalInfoTable[] = {
+ { { 0 }, 0, 0 }, // #0 [ref=149x]
{ { 0 }, 1, 0 }, // #1 [ref=32x]
{ { 0 }, 2, 0 }, // #2 [ref=2x]
{ { EXT(ADX) }, 3, 0 }, // #3 [ref=1x]
@@ -2421,139 +2633,161 @@ const InstDB::CommonInfoTableB InstDB::_commonInfoTableB[] = {
{ { EXT(CLFLUSHOPT) }, 0, 0 }, // #21 [ref=1x]
{ { EXT(SVM) }, 0, 0 }, // #22 [ref=6x]
{ { 0 }, 10, 0 }, // #23 [ref=2x]
- { { EXT(CLWB) }, 0, 0 }, // #24 [ref=1x]
- { { EXT(CLZERO) }, 0, 0 }, // #25 [ref=1x]
- { { 0 }, 3, 0 }, // #26 [ref=1x]
- { { EXT(CMOV) }, 11, 0 }, // #27 [ref=6x]
- { { EXT(CMOV) }, 12, 0 }, // #28 [ref=8x]
- { { EXT(CMOV) }, 13, 0 }, // #29 [ref=6x]
- { { EXT(CMOV) }, 14, 0 }, // #30 [ref=4x]
- { { EXT(CMOV) }, 15, 0 }, // #31 [ref=4x]
- { { EXT(CMOV) }, 16, 0 }, // #32 [ref=2x]
- { { EXT(CMOV) }, 17, 0 }, // #33 [ref=6x]
- { { EXT(CMOV) }, 18, 0 }, // #34 [ref=2x]
- { { 0 }, 19, 0 }, // #35 [ref=2x]
- { { EXT(I486) }, 1, 0 }, // #36 [ref=2x]
- { { EXT(CMPXCHG16B) }, 5, 0 }, // #37 [ref=1x]
- { { EXT(CMPXCHG8B) }, 5, 0 }, // #38 [ref=1x]
- { { EXT(SSE2) }, 1, 0 }, // #39 [ref=2x]
- { { EXT(SSE) }, 1, 0 }, // #40 [ref=2x]
- { { EXT(I486) }, 0, 0 }, // #41 [ref=4x]
- { { EXT(SSE4_2) }, 0, 0 }, // #42 [ref=2x]
- { { 0 }, 20, 0 }, // #43 [ref=2x]
- { { EXT(MMX) }, 0, 0 }, // #44 [ref=1x]
- { { EXT(ENQCMD) }, 0, 0 }, // #45 [ref=2x]
- { { EXT(SSE4A) }, 0, 0 }, // #46 [ref=4x]
- { { 0 }, 21, 0 }, // #47 [ref=4x]
- { { EXT(3DNOW) }, 0, 0 }, // #48 [ref=21x]
- { { EXT(FXSR) }, 0, 0 }, // #49 [ref=4x]
- { { EXT(SMX) }, 0, 0 }, // #50 [ref=1x]
- { { EXT(GFNI) }, 0, 0 }, // #51 [ref=3x]
- { { 0 }, 16, 0 }, // #52 [ref=5x]
- { { EXT(VMX) }, 0, 0 }, // #53 [ref=12x]
- { { 0 }, 11, 0 }, // #54 [ref=8x]
- { { 0 }, 12, 0 }, // #55 [ref=12x]
- { { 0 }, 13, 0 }, // #56 [ref=10x]
- { { 0 }, 14, 0 }, // #57 [ref=8x]
- { { 0 }, 15, 0 }, // #58 [ref=8x]
- { { 0 }, 17, 0 }, // #59 [ref=8x]
- { { 0 }, 18, 0 }, // #60 [ref=4x]
- { { EXT(AVX512_DQ) }, 0, 0 }, // #61 [ref=23x]
- { { EXT(AVX512_BW) }, 0, 0 }, // #62 [ref=22x]
- { { EXT(AVX512_F) }, 0, 0 }, // #63 [ref=37x]
- { { EXT(AVX512_DQ) }, 1, 0 }, // #64 [ref=3x]
- { { EXT(AVX512_BW) }, 1, 0 }, // #65 [ref=4x]
- { { EXT(AVX512_F) }, 1, 0 }, // #66 [ref=1x]
- { { EXT(LAHFSAHF) }, 22, 0 }, // #67 [ref=1x]
- { { EXT(LWP) }, 0, 0 }, // #68 [ref=4x]
- { { 0 }, 23, 0 }, // #69 [ref=3x]
- { { EXT(LZCNT) }, 1, 0 }, // #70 [ref=1x]
- { { EXT(MMX2) }, 0, 0 }, // #71 [ref=8x]
- { { EXT(MONITOR) }, 0, 0 }, // #72 [ref=2x]
- { { EXT(MONITORX) }, 0, 0 }, // #73 [ref=2x]
- { { EXT(MOVBE) }, 0, 0 }, // #74 [ref=1x]
- { { EXT(MMX), EXT(SSE2) }, 0, 0 }, // #75 [ref=46x]
- { { EXT(MOVDIR64B) }, 0, 0 }, // #76 [ref=1x]
- { { EXT(MOVDIRI) }, 0, 0 }, // #77 [ref=1x]
- { { EXT(BMI2) }, 0, 0 }, // #78 [ref=7x]
- { { EXT(SSSE3) }, 0, 0 }, // #79 [ref=15x]
- { { EXT(MMX2), EXT(SSE2) }, 0, 0 }, // #80 [ref=10x]
- { { EXT(PCLMULQDQ) }, 0, 0 }, // #81 [ref=1x]
- { { EXT(SSE4_2) }, 1, 0 }, // #82 [ref=4x]
- { { EXT(PCOMMIT) }, 0, 0 }, // #83 [ref=1x]
- { { EXT(MMX2), EXT(SSE2), EXT(SSE4_1) }, 0, 0 }, // #84 [ref=1x]
- { { EXT(3DNOW2) }, 0, 0 }, // #85 [ref=5x]
- { { EXT(GEODE) }, 0, 0 }, // #86 [ref=2x]
- { { EXT(POPCNT) }, 1, 0 }, // #87 [ref=1x]
- { { 0 }, 24, 0 }, // #88 [ref=3x]
- { { EXT(PREFETCHW) }, 1, 0 }, // #89 [ref=1x]
- { { EXT(PREFETCHWT1) }, 1, 0 }, // #90 [ref=1x]
- { { EXT(SSE4_1) }, 1, 0 }, // #91 [ref=1x]
- { { 0 }, 25, 0 }, // #92 [ref=3x]
- { { 0 }, 26, 0 }, // #93 [ref=2x]
- { { EXT(FSGSBASE) }, 0, 0 }, // #94 [ref=4x]
- { { EXT(MSR) }, 0, 0 }, // #95 [ref=2x]
- { { EXT(RDPID) }, 0, 0 }, // #96 [ref=1x]
- { { EXT(RDRAND) }, 1, 0 }, // #97 [ref=1x]
- { { EXT(RDSEED) }, 1, 0 }, // #98 [ref=1x]
- { { EXT(RDTSC) }, 0, 0 }, // #99 [ref=1x]
- { { EXT(RDTSCP) }, 0, 0 }, // #100 [ref=1x]
- { { 0 }, 27, 0 }, // #101 [ref=2x]
- { { EXT(LAHFSAHF) }, 28, 0 }, // #102 [ref=1x]
- { { EXT(SHA) }, 0, 0 }, // #103 [ref=7x]
- { { EXT(SKINIT) }, 0, 0 }, // #104 [ref=2x]
- { { EXT(AVX512_4FMAPS) }, 0, 0 }, // #105 [ref=4x]
- { { EXT(AVX), EXT(AVX512_F), EXT(AVX512_VL) }, 0, 0 }, // #106 [ref=46x]
- { { EXT(AVX), EXT(AVX512_F) }, 0, 0 }, // #107 [ref=32x]
- { { EXT(AVX) }, 0, 0 }, // #108 [ref=37x]
- { { EXT(AESNI), EXT(AVX), EXT(AVX512_F), EXT(AVX512_VL), EXT(VAES) }, 0, 0 }, // #109 [ref=4x]
- { { EXT(AESNI), EXT(AVX) }, 0, 0 }, // #110 [ref=2x]
- { { EXT(AVX512_F), EXT(AVX512_VL) }, 0, 0 }, // #111 [ref=112x]
- { { EXT(AVX), EXT(AVX512_DQ), EXT(AVX512_VL) }, 0, 0 }, // #112 [ref=8x]
- { { EXT(AVX512_BW), EXT(AVX512_VL) }, 0, 0 }, // #113 [ref=26x]
- { { EXT(AVX512_DQ), EXT(AVX512_VL) }, 0, 0 }, // #114 [ref=30x]
- { { EXT(AVX2) }, 0, 0 }, // #115 [ref=7x]
- { { EXT(AVX), EXT(AVX2), EXT(AVX512_F), EXT(AVX512_VL) }, 0, 0 }, // #116 [ref=39x]
- { { EXT(AVX), EXT(AVX512_F) }, 1, 0 }, // #117 [ref=4x]
- { { EXT(AVX512_BF16), EXT(AVX512_VL) }, 0, 0 }, // #118 [ref=3x]
- { { EXT(AVX512_F), EXT(AVX512_VL), EXT(F16C) }, 0, 0 }, // #119 [ref=2x]
- { { EXT(AVX512_ERI) }, 0, 0 }, // #120 [ref=10x]
- { { EXT(AVX512_F), EXT(AVX512_VL), EXT(FMA) }, 0, 0 }, // #121 [ref=36x]
- { { EXT(AVX512_F), EXT(FMA) }, 0, 0 }, // #122 [ref=24x]
- { { EXT(FMA4) }, 0, 0 }, // #123 [ref=20x]
- { { EXT(XOP) }, 0, 0 }, // #124 [ref=55x]
- { { EXT(AVX2), EXT(AVX512_F), EXT(AVX512_VL) }, 0, 0 }, // #125 [ref=19x]
- { { EXT(AVX512_PFI) }, 0, 0 }, // #126 [ref=16x]
- { { EXT(AVX), EXT(AVX512_F), EXT(AVX512_VL), EXT(GFNI) }, 0, 0 }, // #127 [ref=3x]
- { { EXT(AVX), EXT(AVX2) }, 0, 0 }, // #128 [ref=17x]
- { { EXT(AVX512_4VNNIW) }, 0, 0 }, // #129 [ref=2x]
- { { EXT(AVX), EXT(AVX2), EXT(AVX512_BW), EXT(AVX512_VL) }, 0, 0 }, // #130 [ref=54x]
- { { EXT(AVX2), EXT(AVX512_BW), EXT(AVX512_VL) }, 0, 0 }, // #131 [ref=2x]
- { { EXT(AVX512_CDI), EXT(AVX512_VL) }, 0, 0 }, // #132 [ref=6x]
- { { EXT(AVX), EXT(AVX512_F), EXT(AVX512_VL), EXT(PCLMULQDQ), EXT(VPCLMULQDQ) }, 0, 0 }, // #133 [ref=1x]
- { { EXT(AVX) }, 1, 0 }, // #134 [ref=7x]
- { { EXT(AVX512_VBMI2), EXT(AVX512_VL) }, 0, 0 }, // #135 [ref=16x]
- { { EXT(AVX512_VL), EXT(AVX512_VNNI) }, 0, 0 }, // #136 [ref=4x]
- { { EXT(AVX512_VBMI), EXT(AVX512_VL) }, 0, 0 }, // #137 [ref=4x]
- { { EXT(AVX), EXT(AVX512_BW) }, 0, 0 }, // #138 [ref=4x]
- { { EXT(AVX), EXT(AVX512_DQ) }, 0, 0 }, // #139 [ref=4x]
- { { EXT(AVX512_IFMA), EXT(AVX512_VL) }, 0, 0 }, // #140 [ref=2x]
- { { EXT(AVX512_BITALG), EXT(AVX512_VL) }, 0, 0 }, // #141 [ref=3x]
- { { EXT(AVX512_VL), EXT(AVX512_VPOPCNTDQ) }, 0, 0 }, // #142 [ref=2x]
- { { EXT(WBNOINVD) }, 0, 0 }, // #143 [ref=1x]
- { { EXT(RTM) }, 0, 0 }, // #144 [ref=3x]
- { { EXT(XSAVE) }, 0, 0 }, // #145 [ref=6x]
- { { EXT(XSAVES) }, 0, 0 }, // #146 [ref=4x]
- { { EXT(XSAVEC) }, 0, 0 }, // #147 [ref=2x]
- { { EXT(XSAVEOPT) }, 0, 0 }, // #148 [ref=2x]
- { { EXT(TSX) }, 1, 0 } // #149 [ref=1x]
+ { { EXT(CET_SS) }, 1, 0 }, // #24 [ref=3x]
+ { { EXT(UINTR) }, 0, 0 }, // #25 [ref=4x]
+ { { EXT(CLWB) }, 0, 0 }, // #26 [ref=1x]
+ { { EXT(CLZERO) }, 0, 0 }, // #27 [ref=1x]
+ { { 0 }, 3, 0 }, // #28 [ref=1x]
+ { { EXT(CMOV) }, 11, 0 }, // #29 [ref=6x]
+ { { EXT(CMOV) }, 12, 0 }, // #30 [ref=8x]
+ { { EXT(CMOV) }, 13, 0 }, // #31 [ref=6x]
+ { { EXT(CMOV) }, 14, 0 }, // #32 [ref=4x]
+ { { EXT(CMOV) }, 15, 0 }, // #33 [ref=4x]
+ { { EXT(CMOV) }, 16, 0 }, // #34 [ref=2x]
+ { { EXT(CMOV) }, 17, 0 }, // #35 [ref=6x]
+ { { EXT(CMOV) }, 18, 0 }, // #36 [ref=2x]
+ { { 0 }, 19, 0 }, // #37 [ref=2x]
+ { { EXT(I486) }, 1, 0 }, // #38 [ref=2x]
+ { { EXT(CMPXCHG16B) }, 5, 0 }, // #39 [ref=1x]
+ { { EXT(CMPXCHG8B) }, 5, 0 }, // #40 [ref=1x]
+ { { EXT(SSE2) }, 1, 0 }, // #41 [ref=2x]
+ { { EXT(SSE) }, 1, 0 }, // #42 [ref=2x]
+ { { EXT(I486) }, 0, 0 }, // #43 [ref=4x]
+ { { EXT(SSE4_2) }, 0, 0 }, // #44 [ref=2x]
+ { { 0 }, 20, 0 }, // #45 [ref=2x]
+ { { EXT(MMX) }, 0, 0 }, // #46 [ref=1x]
+ { { EXT(CET_IBT) }, 0, 0 }, // #47 [ref=2x]
+ { { EXT(ENQCMD) }, 0, 0 }, // #48 [ref=2x]
+ { { EXT(SSE4A) }, 0, 0 }, // #49 [ref=4x]
+ { { 0 }, 21, 0 }, // #50 [ref=4x]
+ { { EXT(3DNOW) }, 0, 0 }, // #51 [ref=21x]
+ { { EXT(FXSR) }, 0, 0 }, // #52 [ref=4x]
+ { { EXT(SMX) }, 0, 0 }, // #53 [ref=1x]
+ { { EXT(GFNI) }, 0, 0 }, // #54 [ref=3x]
+ { { EXT(HRESET) }, 0, 0 }, // #55 [ref=1x]
+ { { EXT(CET_SS) }, 0, 0 }, // #56 [ref=9x]
+ { { 0 }, 16, 0 }, // #57 [ref=5x]
+ { { EXT(VMX) }, 0, 0 }, // #58 [ref=12x]
+ { { 0 }, 11, 0 }, // #59 [ref=8x]
+ { { 0 }, 12, 0 }, // #60 [ref=12x]
+ { { 0 }, 13, 0 }, // #61 [ref=10x]
+ { { 0 }, 14, 0 }, // #62 [ref=8x]
+ { { 0 }, 15, 0 }, // #63 [ref=8x]
+ { { 0 }, 17, 0 }, // #64 [ref=8x]
+ { { 0 }, 18, 0 }, // #65 [ref=4x]
+ { { EXT(AVX512_DQ) }, 0, 0 }, // #66 [ref=23x]
+ { { EXT(AVX512_BW) }, 0, 0 }, // #67 [ref=22x]
+ { { EXT(AVX512_F) }, 0, 0 }, // #68 [ref=37x]
+ { { EXT(AVX512_DQ) }, 1, 0 }, // #69 [ref=3x]
+ { { EXT(AVX512_BW) }, 1, 0 }, // #70 [ref=4x]
+ { { EXT(AVX512_F) }, 1, 0 }, // #71 [ref=1x]
+ { { EXT(LAHFSAHF) }, 22, 0 }, // #72 [ref=1x]
+ { { EXT(AMX_TILE) }, 0, 0 }, // #73 [ref=7x]
+ { { EXT(LWP) }, 0, 0 }, // #74 [ref=4x]
+ { { 0 }, 23, 0 }, // #75 [ref=3x]
+ { { EXT(LZCNT) }, 1, 0 }, // #76 [ref=1x]
+ { { EXT(MMX2) }, 0, 0 }, // #77 [ref=8x]
+ { { EXT(MCOMMIT) }, 1, 0 }, // #78 [ref=1x]
+ { { EXT(MONITOR) }, 0, 0 }, // #79 [ref=2x]
+ { { EXT(MONITORX) }, 0, 0 }, // #80 [ref=2x]
+ { { EXT(MOVBE) }, 0, 0 }, // #81 [ref=1x]
+ { { EXT(MMX), EXT(SSE2) }, 0, 0 }, // #82 [ref=46x]
+ { { EXT(MOVDIR64B) }, 0, 0 }, // #83 [ref=1x]
+ { { EXT(MOVDIRI) }, 0, 0 }, // #84 [ref=1x]
+ { { EXT(BMI2) }, 0, 0 }, // #85 [ref=7x]
+ { { EXT(SSSE3) }, 0, 0 }, // #86 [ref=15x]
+ { { EXT(MMX2), EXT(SSE2) }, 0, 0 }, // #87 [ref=10x]
+ { { EXT(PCLMULQDQ) }, 0, 0 }, // #88 [ref=1x]
+ { { EXT(SSE4_2) }, 1, 0 }, // #89 [ref=4x]
+ { { EXT(PCONFIG) }, 0, 0 }, // #90 [ref=1x]
+ { { EXT(MMX2), EXT(SSE2), EXT(SSE4_1) }, 0, 0 }, // #91 [ref=1x]
+ { { EXT(3DNOW2) }, 0, 0 }, // #92 [ref=5x]
+ { { EXT(GEODE) }, 0, 0 }, // #93 [ref=2x]
+ { { EXT(POPCNT) }, 1, 0 }, // #94 [ref=1x]
+ { { 0 }, 24, 0 }, // #95 [ref=3x]
+ { { EXT(PREFETCHW) }, 1, 0 }, // #96 [ref=1x]
+ { { EXT(PREFETCHWT1) }, 1, 0 }, // #97 [ref=1x]
+ { { EXT(SNP) }, 20, 0 }, // #98 [ref=3x]
+ { { EXT(SSE4_1) }, 1, 0 }, // #99 [ref=1x]
+ { { EXT(PTWRITE) }, 0, 0 }, // #100 [ref=1x]
+ { { 0 }, 25, 0 }, // #101 [ref=3x]
+ { { EXT(SNP) }, 1, 0 }, // #102 [ref=1x]
+ { { 0 }, 26, 0 }, // #103 [ref=2x]
+ { { EXT(FSGSBASE) }, 0, 0 }, // #104 [ref=4x]
+ { { EXT(MSR) }, 0, 0 }, // #105 [ref=2x]
+ { { EXT(RDPID) }, 0, 0 }, // #106 [ref=1x]
+ { { EXT(OSPKE) }, 0, 0 }, // #107 [ref=1x]
+ { { EXT(RDPRU) }, 0, 0 }, // #108 [ref=1x]
+ { { EXT(RDRAND) }, 1, 0 }, // #109 [ref=1x]
+ { { EXT(RDSEED) }, 1, 0 }, // #110 [ref=1x]
+ { { EXT(RDTSC) }, 0, 0 }, // #111 [ref=1x]
+ { { EXT(RDTSCP) }, 0, 0 }, // #112 [ref=1x]
+ { { 0 }, 27, 0 }, // #113 [ref=2x]
+ { { EXT(LAHFSAHF) }, 28, 0 }, // #114 [ref=1x]
+ { { EXT(SERIALIZE) }, 0, 0 }, // #115 [ref=1x]
+ { { EXT(SHA) }, 0, 0 }, // #116 [ref=7x]
+ { { EXT(SKINIT) }, 0, 0 }, // #117 [ref=2x]
+ { { EXT(AMX_BF16) }, 0, 0 }, // #118 [ref=1x]
+ { { EXT(AMX_INT8) }, 0, 0 }, // #119 [ref=4x]
+ { { EXT(UINTR) }, 1, 0 }, // #120 [ref=1x]
+ { { EXT(WAITPKG) }, 1, 0 }, // #121 [ref=2x]
+ { { EXT(WAITPKG) }, 0, 0 }, // #122 [ref=1x]
+ { { EXT(AVX512_4FMAPS) }, 0, 0 }, // #123 [ref=4x]
+ { { EXT(AVX), EXT(AVX512_F), EXT(AVX512_VL) }, 0, 0 }, // #124 [ref=46x]
+ { { EXT(AVX512_FP16), EXT(AVX512_VL) }, 0, 0 }, // #125 [ref=63x]
+ { { EXT(AVX), EXT(AVX512_F) }, 0, 0 }, // #126 [ref=32x]
+ { { EXT(AVX512_FP16) }, 0, 0 }, // #127 [ref=43x]
+ { { EXT(AVX) }, 0, 0 }, // #128 [ref=37x]
+ { { EXT(AESNI), EXT(AVX), EXT(AVX512_F), EXT(AVX512_VL), EXT(VAES) }, 0, 0 }, // #129 [ref=4x]
+ { { EXT(AESNI), EXT(AVX) }, 0, 0 }, // #130 [ref=2x]
+ { { EXT(AVX512_F), EXT(AVX512_VL) }, 0, 0 }, // #131 [ref=112x]
+ { { EXT(AVX), EXT(AVX512_DQ), EXT(AVX512_VL) }, 0, 0 }, // #132 [ref=8x]
+ { { EXT(AVX512_DQ), EXT(AVX512_VL) }, 0, 0 }, // #133 [ref=30x]
+ { { EXT(AVX2) }, 0, 0 }, // #134 [ref=7x]
+ { { EXT(AVX), EXT(AVX2), EXT(AVX512_F), EXT(AVX512_VL) }, 0, 0 }, // #135 [ref=39x]
+ { { EXT(AVX), EXT(AVX512_F) }, 1, 0 }, // #136 [ref=4x]
+ { { EXT(AVX512_BF16), EXT(AVX512_VL) }, 0, 0 }, // #137 [ref=3x]
+ { { EXT(AVX512_F), EXT(AVX512_VL), EXT(F16C) }, 0, 0 }, // #138 [ref=2x]
+ { { EXT(AVX512_BW), EXT(AVX512_VL) }, 0, 0 }, // #139 [ref=26x]
+ { { EXT(AVX512_ERI) }, 0, 0 }, // #140 [ref=10x]
+ { { EXT(AVX512_F), EXT(AVX512_VL), EXT(FMA) }, 0, 0 }, // #141 [ref=36x]
+ { { EXT(AVX512_F), EXT(FMA) }, 0, 0 }, // #142 [ref=24x]
+ { { EXT(FMA4) }, 0, 0 }, // #143 [ref=20x]
+ { { EXT(XOP) }, 0, 0 }, // #144 [ref=55x]
+ { { EXT(AVX2), EXT(AVX512_F), EXT(AVX512_VL) }, 0, 0 }, // #145 [ref=19x]
+ { { EXT(AVX512_PFI) }, 0, 0 }, // #146 [ref=16x]
+ { { EXT(AVX), EXT(AVX512_F), EXT(AVX512_VL), EXT(GFNI) }, 0, 0 }, // #147 [ref=3x]
+ { { EXT(AVX), EXT(AVX2) }, 0, 0 }, // #148 [ref=17x]
+ { { EXT(AVX512_VP2INTERSECT) }, 0, 0 }, // #149 [ref=2x]
+ { { EXT(AVX512_4VNNIW) }, 0, 0 }, // #150 [ref=2x]
+ { { EXT(AVX), EXT(AVX2), EXT(AVX512_BW), EXT(AVX512_VL) }, 0, 0 }, // #151 [ref=54x]
+ { { EXT(AVX2), EXT(AVX512_BW), EXT(AVX512_VL) }, 0, 0 }, // #152 [ref=2x]
+ { { EXT(AVX512_CDI), EXT(AVX512_VL) }, 0, 0 }, // #153 [ref=6x]
+ { { EXT(AVX), EXT(AVX512_F), EXT(AVX512_VL), EXT(PCLMULQDQ), EXT(VPCLMULQDQ) }, 0, 0 }, // #154 [ref=1x]
+ { { EXT(AVX) }, 1, 0 }, // #155 [ref=7x]
+ { { EXT(AVX512_VBMI2), EXT(AVX512_VL) }, 0, 0 }, // #156 [ref=16x]
+ { { EXT(AVX512_VL), EXT(AVX512_VNNI), EXT(AVX_VNNI) }, 0, 0 }, // #157 [ref=4x]
+ { { EXT(AVX512_VBMI), EXT(AVX512_VL) }, 0, 0 }, // #158 [ref=4x]
+ { { EXT(AVX), EXT(AVX512_BW) }, 0, 0 }, // #159 [ref=4x]
+ { { EXT(AVX), EXT(AVX512_DQ) }, 0, 0 }, // #160 [ref=4x]
+ { { EXT(AVX512_IFMA), EXT(AVX512_VL) }, 0, 0 }, // #161 [ref=2x]
+ { { EXT(AVX512_BITALG), EXT(AVX512_VL) }, 0, 0 }, // #162 [ref=3x]
+ { { EXT(AVX512_VL), EXT(AVX512_VPOPCNTDQ) }, 0, 0 }, // #163 [ref=2x]
+ { { EXT(WBNOINVD) }, 0, 0 }, // #164 [ref=1x]
+ { { EXT(RTM) }, 0, 0 }, // #165 [ref=3x]
+ { { EXT(XSAVE) }, 0, 0 }, // #166 [ref=6x]
+ { { EXT(TSXLDTRK) }, 0, 0 }, // #167 [ref=2x]
+ { { EXT(XSAVES) }, 0, 0 }, // #168 [ref=4x]
+ { { EXT(XSAVEC) }, 0, 0 }, // #169 [ref=2x]
+ { { EXT(XSAVEOPT) }, 0, 0 }, // #170 [ref=2x]
+ { { EXT(TSX) }, 1, 0 } // #171 [ref=1x]
};
#undef EXT
-#define FLAG(VAL) uint32_t(Status::k##VAL)
+#define FLAG(VAL) uint32_t(CpuRWFlags::kX86_##VAL)
const InstDB::RWFlagsInfoTable InstDB::_rwFlagsInfoTable[] = {
- { 0, 0 }, // #0 [ref=1281x]
- { 0, FLAG(AF) | FLAG(CF) | FLAG(OF) | FLAG(PF) | FLAG(SF) | FLAG(ZF) }, // #1 [ref=76x]
+ { 0, 0 }, // #0 [ref=1429x]
+ { 0, FLAG(AF) | FLAG(CF) | FLAG(OF) | FLAG(PF) | FLAG(SF) | FLAG(ZF) }, // #1 [ref=84x]
{ FLAG(CF), FLAG(AF) | FLAG(CF) | FLAG(OF) | FLAG(PF) | FLAG(SF) | FLAG(ZF) }, // #2 [ref=2x]
{ FLAG(CF), FLAG(CF) }, // #3 [ref=2x]
{ FLAG(OF), FLAG(OF) }, // #4 [ref=1x]
@@ -2572,7 +2806,7 @@ const InstDB::RWFlagsInfoTable InstDB::_rwFlagsInfoTable[] = {
{ FLAG(PF), 0 }, // #17 [ref=14x]
{ FLAG(SF), 0 }, // #18 [ref=6x]
{ FLAG(DF), FLAG(AF) | FLAG(CF) | FLAG(OF) | FLAG(PF) | FLAG(SF) | FLAG(ZF) }, // #19 [ref=2x]
- { 0, FLAG(AF) | FLAG(OF) | FLAG(PF) | FLAG(SF) | FLAG(ZF) }, // #20 [ref=2x]
+ { 0, FLAG(AF) | FLAG(OF) | FLAG(PF) | FLAG(SF) | FLAG(ZF) }, // #20 [ref=5x]
{ 0, FLAG(CF) | FLAG(PF) | FLAG(ZF) }, // #21 [ref=4x]
{ FLAG(AF) | FLAG(CF) | FLAG(PF) | FLAG(SF) | FLAG(ZF), 0 }, // #22 [ref=1x]
{ FLAG(DF), 0 }, // #23 [ref=3x]
@@ -2584,11 +2818,10 @@ const InstDB::RWFlagsInfoTable InstDB::_rwFlagsInfoTable[] = {
};
#undef FLAG
// ----------------------------------------------------------------------------
-// ${InstCommonInfoTableB:End}
+// ${AdditionalInfoTable:End}
-// ============================================================================
-// [asmjit::Inst - NameData]
-// ============================================================================
+// Inst - NameData
+// ===============
#ifndef ASMJIT_NO_TEXT
// ${NameData:Begin}
@@ -2597,92 +2830,109 @@ const char InstDB::_nameData[] =
"\0" "aaa\0" "aad\0" "aam\0" "aas\0" "adc\0" "adcx\0" "adox\0" "arpl\0" "bextr\0" "blcfill\0" "blci\0" "blcic\0"
"blcmsk\0" "blcs\0" "blsfill\0" "blsi\0" "blsic\0" "blsmsk\0" "blsr\0" "bndcl\0" "bndcn\0" "bndcu\0" "bndldx\0"
"bndmk\0" "bndmov\0" "bndstx\0" "bound\0" "bsf\0" "bsr\0" "bswap\0" "bt\0" "btc\0" "btr\0" "bts\0" "bzhi\0" "cbw\0"
- "cdq\0" "cdqe\0" "clac\0" "clc\0" "cld\0" "cldemote\0" "clflush\0" "clflushopt\0" "clgi\0" "cli\0" "clts\0" "clwb\0"
- "clzero\0" "cmc\0" "cmova\0" "cmovae\0" "cmovc\0" "cmovg\0" "cmovge\0" "cmovl\0" "cmovle\0" "cmovna\0" "cmovnae\0"
- "cmovnc\0" "cmovng\0" "cmovnge\0" "cmovnl\0" "cmovnle\0" "cmovno\0" "cmovnp\0" "cmovns\0" "cmovnz\0" "cmovo\0"
- "cmovp\0" "cmovpe\0" "cmovpo\0" "cmovs\0" "cmovz\0" "cmp\0" "cmps\0" "cmpxchg\0" "cmpxchg16b\0" "cmpxchg8b\0"
- "cpuid\0" "cqo\0" "crc32\0" "cvtpd2pi\0" "cvtpi2pd\0" "cvtpi2ps\0" "cvtps2pi\0" "cvttpd2pi\0" "cvttps2pi\0" "cwd\0"
- "cwde\0" "daa\0" "das\0" "enqcmd\0" "enqcmds\0" "f2xm1\0" "fabs\0" "faddp\0" "fbld\0" "fbstp\0" "fchs\0" "fclex\0"
- "fcmovb\0" "fcmovbe\0" "fcmove\0" "fcmovnb\0" "fcmovnbe\0" "fcmovne\0" "fcmovnu\0" "fcmovu\0" "fcom\0" "fcomi\0"
- "fcomip\0" "fcomp\0" "fcompp\0" "fcos\0" "fdecstp\0" "fdiv\0" "fdivp\0" "fdivr\0" "fdivrp\0" "femms\0" "ffree\0"
- "fiadd\0" "ficom\0" "ficomp\0" "fidiv\0" "fidivr\0" "fild\0" "fimul\0" "fincstp\0" "finit\0" "fist\0" "fistp\0"
- "fisttp\0" "fisub\0" "fisubr\0" "fld\0" "fld1\0" "fldcw\0" "fldenv\0" "fldl2e\0" "fldl2t\0" "fldlg2\0" "fldln2\0"
- "fldpi\0" "fldz\0" "fmulp\0" "fnclex\0" "fninit\0" "fnop\0" "fnsave\0" "fnstcw\0" "fnstenv\0" "fnstsw\0" "fpatan\0"
- "fprem\0" "fprem1\0" "fptan\0" "frndint\0" "frstor\0" "fsave\0" "fscale\0" "fsin\0" "fsincos\0" "fsqrt\0" "fst\0"
- "fstcw\0" "fstenv\0" "fstp\0" "fstsw\0" "fsubp\0" "fsubrp\0" "ftst\0" "fucom\0" "fucomi\0" "fucomip\0" "fucomp\0"
- "fucompp\0" "fwait\0" "fxam\0" "fxch\0" "fxrstor\0" "fxrstor64\0" "fxsave\0" "fxsave64\0" "fxtract\0" "fyl2x\0"
- "fyl2xp1\0" "getsec\0" "hlt\0" "inc\0" "insertq\0" "int3\0" "into\0" "invept\0" "invlpg\0" "invlpga\0" "invpcid\0"
- "invvpid\0" "iret\0" "iretd\0" "iretq\0" "iretw\0" "ja\0" "jae\0" "jb\0" "jbe\0" "jc\0" "je\0" "jecxz\0" "jg\0"
- "jge\0" "jl\0" "jle\0" "jmp\0" "jna\0" "jnae\0" "jnb\0" "jnbe\0" "jnc\0" "jne\0" "jng\0" "jnge\0" "jnl\0" "jnle\0"
- "jno\0" "jnp\0" "jns\0" "jnz\0" "jo\0" "jp\0" "jpe\0" "jpo\0" "js\0" "jz\0" "kaddb\0" "kaddd\0" "kaddq\0" "kaddw\0"
- "kandb\0" "kandd\0" "kandnb\0" "kandnd\0" "kandnq\0" "kandnw\0" "kandq\0" "kandw\0" "kmovb\0" "kmovw\0" "knotb\0"
- "knotd\0" "knotq\0" "knotw\0" "korb\0" "kord\0" "korq\0" "kortestb\0" "kortestd\0" "kortestq\0" "kortestw\0" "korw\0"
- "kshiftlb\0" "kshiftld\0" "kshiftlq\0" "kshiftlw\0" "kshiftrb\0" "kshiftrd\0" "kshiftrq\0" "kshiftrw\0" "ktestb\0"
- "ktestd\0" "ktestq\0" "ktestw\0" "kunpckbw\0" "kunpckdq\0" "kunpckwd\0" "kxnorb\0" "kxnord\0" "kxnorq\0" "kxnorw\0"
- "kxorb\0" "kxord\0" "kxorq\0" "kxorw\0" "lahf\0" "lar\0" "lds\0" "lea\0" "leave\0" "les\0" "lfence\0" "lfs\0"
- "lgdt\0" "lgs\0" "lidt\0" "lldt\0" "llwpcb\0" "lmsw\0" "lods\0" "loop\0" "loope\0" "loopne\0" "lsl\0" "ltr\0"
- "lwpins\0" "lwpval\0" "lzcnt\0" "mfence\0" "monitor\0" "monitorx\0" "movdir64b\0" "movdiri\0" "movdq2q\0" "movnti\0"
- "movntq\0" "movntsd\0" "movntss\0" "movq2dq\0" "movsx\0" "movsxd\0" "movzx\0" "mulx\0" "mwait\0" "mwaitx\0" "neg\0"
- "not\0" "out\0" "outs\0" "pause\0" "pavgusb\0" "pcommit\0" "pdep\0" "pext\0" "pf2id\0" "pf2iw\0" "pfacc\0" "pfadd\0"
- "pfcmpeq\0" "pfcmpge\0" "pfcmpgt\0" "pfmax\0" "pfmin\0" "pfmul\0" "pfnacc\0" "pfpnacc\0" "pfrcp\0" "pfrcpit1\0"
- "pfrcpit2\0" "pfrcpv\0" "pfrsqit1\0" "pfrsqrt\0" "pfrsqrtv\0" "pfsub\0" "pfsubr\0" "pi2fd\0" "pi2fw\0" "pmulhrw\0"
- "pop\0" "popa\0" "popad\0" "popcnt\0" "popf\0" "popfd\0" "popfq\0" "prefetch\0" "prefetchnta\0" "prefetcht0\0"
- "prefetcht1\0" "prefetcht2\0" "prefetchw\0" "prefetchwt1\0" "pshufw\0" "pswapd\0" "push\0" "pusha\0" "pushad\0"
- "pushf\0" "pushfd\0" "pushfq\0" "rcl\0" "rcr\0" "rdfsbase\0" "rdgsbase\0" "rdmsr\0" "rdpid\0" "rdpmc\0" "rdrand\0"
- "rdseed\0" "rdtsc\0" "rdtscp\0" "rol\0" "ror\0" "rorx\0" "rsm\0" "sahf\0" "sal\0" "sar\0" "sarx\0" "sbb\0" "scas\0"
- "seta\0" "setae\0" "setb\0" "setbe\0" "setc\0" "sete\0" "setg\0" "setge\0" "setl\0" "setle\0" "setna\0" "setnae\0"
- "setnb\0" "setnbe\0" "setnc\0" "setne\0" "setng\0" "setnge\0" "setnl\0" "setnle\0" "setno\0" "setnp\0" "setns\0"
- "setnz\0" "seto\0" "setp\0" "setpe\0" "setpo\0" "sets\0" "setz\0" "sfence\0" "sgdt\0" "sha1msg1\0" "sha1msg2\0"
- "sha1nexte\0" "sha1rnds4\0" "sha256msg1\0" "sha256msg2\0" "sha256rnds2\0" "shl\0" "shlx\0" "shr\0" "shrd\0" "shrx\0"
- "sidt\0" "skinit\0" "sldt\0" "slwpcb\0" "smsw\0" "stac\0" "stc\0" "stgi\0" "sti\0" "stos\0" "str\0" "swapgs\0"
- "syscall\0" "sysenter\0" "sysexit\0" "sysexit64\0" "sysret\0" "sysret64\0" "t1mskc\0" "tzcnt\0" "tzmsk\0" "ud2\0"
- "v4fmaddps\0" "v4fmaddss\0" "v4fnmaddps\0" "v4fnmaddss\0" "vaddpd\0" "vaddps\0" "vaddsd\0" "vaddss\0" "vaddsubpd\0"
+ "cdq\0" "cdqe\0" "clac\0" "clc\0" "cld\0" "cldemote\0" "clflush\0" "clflushopt\0" "clgi\0" "cli\0" "clrssbsy\0"
+ "clts\0" "clui\0" "clwb\0" "clzero\0" "cmc\0" "cmova\0" "cmovae\0" "cmovc\0" "cmovg\0" "cmovge\0" "cmovl\0"
+ "cmovle\0" "cmovna\0" "cmovnae\0" "cmovnc\0" "cmovng\0" "cmovnge\0" "cmovnl\0" "cmovnle\0" "cmovno\0" "cmovnp\0"
+ "cmovns\0" "cmovnz\0" "cmovo\0" "cmovp\0" "cmovpe\0" "cmovpo\0" "cmovs\0" "cmovz\0" "cmp\0" "cmps\0" "cmpxchg\0"
+ "cmpxchg16b\0" "cmpxchg8b\0" "cpuid\0" "cqo\0" "crc32\0" "cvtpd2pi\0" "cvtpi2pd\0" "cvtpi2ps\0" "cvtps2pi\0"
+ "cvttpd2pi\0" "cvttps2pi\0" "cwd\0" "cwde\0" "daa\0" "das\0" "endbr32\0" "endbr64\0" "enqcmd\0" "enqcmds\0" "f2xm1\0"
+ "fabs\0" "faddp\0" "fbld\0" "fbstp\0" "fchs\0" "fclex\0" "fcmovb\0" "fcmovbe\0" "fcmove\0" "fcmovnb\0" "fcmovnbe\0"
+ "fcmovne\0" "fcmovnu\0" "fcmovu\0" "fcom\0" "fcomi\0" "fcomip\0" "fcomp\0" "fcompp\0" "fcos\0" "fdecstp\0" "fdiv\0"
+ "fdivp\0" "fdivr\0" "fdivrp\0" "femms\0" "ffree\0" "fiadd\0" "ficom\0" "ficomp\0" "fidiv\0" "fidivr\0" "fild\0"
+ "fimul\0" "fincstp\0" "finit\0" "fist\0" "fistp\0" "fisttp\0" "fisub\0" "fisubr\0" "fld\0" "fld1\0" "fldcw\0"
+ "fldenv\0" "fldl2e\0" "fldl2t\0" "fldlg2\0" "fldln2\0" "fldpi\0" "fldz\0" "fmulp\0" "fnclex\0" "fninit\0" "fnop\0"
+ "fnsave\0" "fnstcw\0" "fnstenv\0" "fnstsw\0" "fpatan\0" "fprem\0" "fprem1\0" "fptan\0" "frndint\0" "frstor\0"
+ "fsave\0" "fscale\0" "fsin\0" "fsincos\0" "fsqrt\0" "fst\0" "fstcw\0" "fstenv\0" "fstp\0" "fstsw\0" "fsubp\0"
+ "fsubrp\0" "ftst\0" "fucom\0" "fucomi\0" "fucomip\0" "fucomp\0" "fucompp\0" "fwait\0" "fxam\0" "fxch\0" "fxrstor\0"
+ "fxrstor64\0" "fxsave\0" "fxsave64\0" "fxtract\0" "fyl2x\0" "fyl2xp1\0" "getsec\0" "hlt\0" "hreset\0" "inc\0"
+ "incsspd\0" "incsspq\0" "insertq\0" "int3\0" "into\0" "invept\0" "invlpg\0" "invlpga\0" "invpcid\0" "invvpid\0"
+ "iretd\0" "iretq\0" "ja\0" "jae\0" "jb\0" "jbe\0" "jc\0" "je\0" "jecxz\0" "jg\0" "jge\0" "jl\0" "jle\0" "jna\0"
+ "jnae\0" "jnb\0" "jnbe\0" "jnc\0" "jne\0" "jng\0" "jnge\0" "jnl\0" "jnle\0" "jno\0" "jnp\0" "jns\0" "jnz\0" "jo\0"
+ "jp\0" "jpe\0" "jpo\0" "js\0" "jz\0" "kaddb\0" "kaddd\0" "kaddq\0" "kaddw\0" "kandb\0" "kandd\0" "kandnb\0"
+ "kandnd\0" "kandnq\0" "kandnw\0" "kandq\0" "kandw\0" "kmovb\0" "kmovw\0" "knotb\0" "knotd\0" "knotq\0" "knotw\0"
+ "korb\0" "kord\0" "korq\0" "kortestb\0" "kortestd\0" "kortestq\0" "kortestw\0" "korw\0" "kshiftlb\0" "kshiftld\0"
+ "kshiftlq\0" "kshiftlw\0" "kshiftrb\0" "kshiftrd\0" "kshiftrq\0" "kshiftrw\0" "ktestb\0" "ktestd\0" "ktestq\0"
+ "ktestw\0" "kunpckbw\0" "kunpckdq\0" "kunpckwd\0" "kxnorb\0" "kxnord\0" "kxnorq\0" "kxnorw\0" "kxorb\0" "kxord\0"
+ "kxorq\0" "kxorw\0" "lahf\0" "lar\0" "lcall\0" "lds\0" "ldtilecfg\0" "lea\0" "leave\0" "les\0" "lfence\0" "lfs\0"
+ "lgdt\0" "lgs\0" "lidt\0" "ljmp\0" "lldt\0" "llwpcb\0" "lmsw\0" "lods\0" "loop\0" "loope\0" "loopne\0" "lsl\0"
+ "ltr\0" "lwpins\0" "lwpval\0" "lzcnt\0" "mcommit\0" "mfence\0" "monitorx\0" "movabs\0" "movdir64b\0" "movdiri\0"
+ "movdq2q\0" "movnti\0" "movntq\0" "movntsd\0" "movntss\0" "movq2dq\0" "movsx\0" "movsxd\0" "movzx\0" "mulx\0"
+ "mwaitx\0" "neg\0" "not\0" "out\0" "outs\0" "pavgusb\0" "pconfig\0" "pdep\0" "pext\0" "pf2id\0" "pf2iw\0" "pfacc\0"
+ "pfadd\0" "pfcmpeq\0" "pfcmpge\0" "pfcmpgt\0" "pfmax\0" "pfmin\0" "pfmul\0" "pfnacc\0" "pfpnacc\0" "pfrcp\0"
+ "pfrcpit1\0" "pfrcpit2\0" "pfrcpv\0" "pfrsqit1\0" "pfrsqrt\0" "pfrsqrtv\0" "pfsub\0" "pfsubr\0" "pi2fd\0" "pi2fw\0"
+ "pmulhrw\0" "pop\0" "popa\0" "popad\0" "popcnt\0" "popf\0" "popfd\0" "popfq\0" "prefetch\0" "prefetchnta\0"
+ "prefetcht0\0" "prefetcht1\0" "prefetcht2\0" "prefetchw\0" "prefetchwt1\0" "pshufw\0" "psmash\0" "pswapd\0"
+ "ptwrite\0" "push\0" "pusha\0" "pushad\0" "pushf\0" "pushfd\0" "pushfq\0" "pvalidate\0" "rcl\0" "rcr\0" "rdfsbase\0"
+ "rdgsbase\0" "rdmsr\0" "rdpid\0" "rdpkru\0" "rdpmc\0" "rdpru\0" "rdrand\0" "rdseed\0" "rdsspd\0" "rdsspq\0" "rdtsc\0"
+ "rdtscp\0" "retf\0" "rmpadjust\0" "rmpupdate\0" "rol\0" "ror\0" "rorx\0" "rsm\0" "rstorssp\0" "sahf\0" "sal\0"
+ "sar\0" "sarx\0" "saveprevssp\0" "sbb\0" "scas\0" "senduipi\0" "serialize\0" "seta\0" "setae\0" "setb\0" "setbe\0"
+ "setc\0" "sete\0" "setg\0" "setge\0" "setl\0" "setle\0" "setna\0" "setnae\0" "setnb\0" "setnbe\0" "setnc\0" "setne\0"
+ "setng\0" "setnge\0" "setnl\0" "setnle\0" "setno\0" "setnp\0" "setns\0" "setnz\0" "seto\0" "setp\0" "setpe\0"
+ "setpo\0" "sets\0" "setssbsy\0" "setz\0" "sfence\0" "sgdt\0" "sha1msg1\0" "sha1msg2\0" "sha1nexte\0" "sha1rnds4\0"
+ "sha256msg1\0" "sha256msg2\0" "sha256rnds2\0" "shl\0" "shlx\0" "shr\0" "shrd\0" "shrx\0" "sidt\0" "skinit\0" "sldt\0"
+ "slwpcb\0" "smsw\0" "stac\0" "stc\0" "stgi\0" "sti\0" "stos\0" "str\0" "sttilecfg\0" "swapgs\0" "syscall\0"
+ "sysenter\0" "sysexit\0" "sysexitq\0" "sysret\0" "sysretq\0" "t1mskc\0" "tdpbf16ps\0" "tdpbssd\0" "tdpbsud\0"
+ "tdpbusd\0" "tdpbuud\0" "testui\0" "tileloadd\0" "tileloaddt1\0" "tilerelease\0" "tilestored\0" "tilezero\0"
+ "tpause\0" "tzcnt\0" "tzmsk\0" "ud0\0" "ud1\0" "ud2\0" "uiret\0" "umonitor\0" "umwait\0" "v4fmaddps\0" "v4fmaddss\0"
+ "v4fnmaddps\0" "v4fnmaddss\0" "vaddpd\0" "vaddph\0" "vaddps\0" "vaddsd\0" "vaddsh\0" "vaddss\0" "vaddsubpd\0"
"vaddsubps\0" "vaesdec\0" "vaesdeclast\0" "vaesenc\0" "vaesenclast\0" "vaesimc\0" "vaeskeygenassist\0" "valignd\0"
- "valignq\0" "vandnpd\0" "vandnps\0" "vandpd\0" "vandps\0" "vblendmb\0" "vblendmd\0" "vblendmpd\0" "vblendmps\0"
- "vblendmq\0" "vblendmw\0" "vblendpd\0" "vblendps\0" "vblendvpd\0" "vblendvps\0" "vbroadcastf128\0"
- "vbroadcastf32x2\0" "vbroadcastf32x4\0" "vbroadcastf32x8\0" "vbroadcastf64x2\0" "vbroadcastf64x4\0"
- "vbroadcasti128\0" "vbroadcasti32x2\0" "vbroadcasti32x4\0" "vbroadcasti32x8\0" "vbroadcasti64x2\0"
- "vbroadcasti64x4\0" "vbroadcastsd\0" "vbroadcastss\0" "vcmppd\0" "vcmpps\0" "vcmpsd\0" "vcmpss\0" "vcomisd\0"
- "vcomiss\0" "vcompresspd\0" "vcompressps\0" "vcvtdq2pd\0" "vcvtdq2ps\0" "vcvtne2ps2bf16\0" "vcvtneps2bf16\0"
- "vcvtpd2dq\0" "vcvtpd2ps\0" "vcvtpd2qq\0" "vcvtpd2udq\0" "vcvtpd2uqq\0" "vcvtph2ps\0" "vcvtps2dq\0" "vcvtps2pd\0"
- "vcvtps2ph\0" "vcvtps2qq\0" "vcvtps2udq\0" "vcvtps2uqq\0" "vcvtqq2pd\0" "vcvtqq2ps\0" "vcvtsd2si\0" "vcvtsd2ss\0"
- "vcvtsd2usi\0" "vcvtsi2sd\0" "vcvtsi2ss\0" "vcvtss2sd\0" "vcvtss2si\0" "vcvtss2usi\0" "vcvttpd2dq\0" "vcvttpd2qq\0"
- "vcvttpd2udq\0" "vcvttpd2uqq\0" "vcvttps2dq\0" "vcvttps2qq\0" "vcvttps2udq\0" "vcvttps2uqq\0" "vcvttsd2si\0"
- "vcvttsd2usi\0" "vcvttss2si\0" "vcvttss2usi\0" "vcvtudq2pd\0" "vcvtudq2ps\0" "vcvtuqq2pd\0" "vcvtuqq2ps\0"
- "vcvtusi2sd\0" "vcvtusi2ss\0" "vdbpsadbw\0" "vdivpd\0" "vdivps\0" "vdivsd\0" "vdivss\0" "vdpbf16ps\0" "vdppd\0"
- "vdpps\0" "verr\0" "verw\0" "vexp2pd\0" "vexp2ps\0" "vexpandpd\0" "vexpandps\0" "vextractf128\0" "vextractf32x4\0"
+ "valignq\0" "vandnpd\0" "vandnps\0" "vandpd\0" "vandps\0" "vblendmpd\0" "vblendmps\0" "vblendpd\0" "vblendps\0"
+ "vblendvpd\0" "vblendvps\0" "vbroadcastf128\0" "vbroadcastf32x2\0" "vbroadcastf32x4\0" "vbroadcastf32x8\0"
+ "vbroadcastf64x2\0" "vbroadcastf64x4\0" "vbroadcasti128\0" "vbroadcasti32x2\0" "vbroadcasti32x4\0"
+ "vbroadcasti32x8\0" "vbroadcasti64x2\0" "vbroadcasti64x4\0" "vbroadcastsd\0" "vbroadcastss\0" "vcmppd\0" "vcmpph\0"
+ "vcmpps\0" "vcmpsd\0" "vcmpsh\0" "vcmpss\0" "vcomisd\0" "vcomish\0" "vcomiss\0" "vcompresspd\0" "vcompressps\0"
+ "vcvtdq2pd\0" "vcvtdq2ph\0" "vcvtdq2ps\0" "vcvtne2ps2bf16\0" "vcvtneps2bf16\0" "vcvtpd2dq\0" "vcvtpd2ph\0"
+ "vcvtpd2ps\0" "vcvtpd2qq\0" "vcvtpd2udq\0" "vcvtpd2uqq\0" "vcvtph2dq\0" "vcvtph2pd\0" "vcvtph2ps\0" "vcvtph2psx\0"
+ "vcvtph2qq\0" "vcvtph2udq\0" "vcvtph2uqq\0" "vcvtph2uw\0" "vcvtph2w\0" "vcvtps2dq\0" "vcvtps2pd\0" "vcvtps2ph\0"
+ "vcvtps2phx\0" "vcvtps2qq\0" "vcvtps2udq\0" "vcvtps2uqq\0" "vcvtqq2pd\0" "vcvtqq2ph\0" "vcvtqq2ps\0" "vcvtsd2sh\0"
+ "vcvtsd2si\0" "vcvtsd2ss\0" "vcvtsd2usi\0" "vcvtsh2sd\0" "vcvtsh2si\0" "vcvtsh2ss\0" "vcvtsh2usi\0" "vcvtsi2sd\0"
+ "vcvtsi2sh\0" "vcvtsi2ss\0" "vcvtss2sd\0" "vcvtss2sh\0" "vcvtss2si\0" "vcvtss2usi\0" "vcvttpd2dq\0" "vcvttpd2qq\0"
+ "vcvttpd2udq\0" "vcvttpd2uqq\0" "vcvttph2dq\0" "vcvttph2qq\0" "vcvttph2udq\0" "vcvttph2uqq\0" "vcvttph2uw\0"
+ "vcvttph2w\0" "vcvttps2dq\0" "vcvttps2qq\0" "vcvttps2udq\0" "vcvttps2uqq\0" "vcvttsd2si\0" "vcvttsd2usi\0"
+ "vcvttsh2si\0" "vcvttsh2usi\0" "vcvttss2si\0" "vcvttss2usi\0" "vcvtudq2pd\0" "vcvtudq2ph\0" "vcvtudq2ps\0"
+ "vcvtuqq2pd\0" "vcvtuqq2ph\0" "vcvtuqq2ps\0" "vcvtusi2sd\0" "vcvtusi2sh\0" "vcvtusi2ss\0" "vcvtuw2ph\0" "vcvtw2ph\0"
+ "vdbpsadbw\0" "vdivpd\0" "vdivph\0" "vdivps\0" "vdivsd\0" "vdivsh\0" "vdivss\0" "vdpbf16ps\0" "vdppd\0" "vdpps\0"
+ "verr\0" "verw\0" "vexp2pd\0" "vexp2ps\0" "vexpandpd\0" "vexpandps\0" "vextractf128\0" "vextractf32x4\0"
"vextractf32x8\0" "vextractf64x2\0" "vextractf64x4\0" "vextracti128\0" "vextracti32x4\0" "vextracti32x8\0"
- "vextracti64x2\0" "vextracti64x4\0" "vextractps\0" "vfixupimmpd\0" "vfixupimmps\0" "vfixupimmsd\0" "vfixupimmss\0"
- "vfmadd132pd\0" "vfmadd132ps\0" "vfmadd132sd\0" "vfmadd132ss\0" "vfmadd213pd\0" "vfmadd213ps\0" "vfmadd213sd\0"
- "vfmadd213ss\0" "vfmadd231pd\0" "vfmadd231ps\0" "vfmadd231sd\0" "vfmadd231ss\0" "vfmaddpd\0" "vfmaddps\0"
- "vfmaddsd\0" "vfmaddss\0" "vfmaddsub132pd\0" "vfmaddsub132ps\0" "vfmaddsub213pd\0" "vfmaddsub213ps\0"
- "vfmaddsub231pd\0" "vfmaddsub231ps\0" "vfmaddsubpd\0" "vfmaddsubps\0" "vfmsub132pd\0" "vfmsub132ps\0" "vfmsub132sd\0"
- "vfmsub132ss\0" "vfmsub213pd\0" "vfmsub213ps\0" "vfmsub213sd\0" "vfmsub213ss\0" "vfmsub231pd\0" "vfmsub231ps\0"
- "vfmsub231sd\0" "vfmsub231ss\0" "vfmsubadd132pd\0" "vfmsubadd132ps\0" "vfmsubadd213pd\0" "vfmsubadd213ps\0"
- "vfmsubadd231pd\0" "vfmsubadd231ps\0" "vfmsubaddpd\0" "vfmsubaddps\0" "vfmsubpd\0" "vfmsubps\0" "vfmsubsd\0"
- "vfmsubss\0" "vfnmadd132pd\0" "vfnmadd132ps\0" "vfnmadd132sd\0" "vfnmadd132ss\0" "vfnmadd213pd\0" "vfnmadd213ps\0"
- "vfnmadd213sd\0" "vfnmadd213ss\0" "vfnmadd231pd\0" "vfnmadd231ps\0" "vfnmadd231sd\0" "vfnmadd231ss\0" "vfnmaddpd\0"
- "vfnmaddps\0" "vfnmaddsd\0" "vfnmaddss\0" "vfnmsub132pd\0" "vfnmsub132ps\0" "vfnmsub132sd\0" "vfnmsub132ss\0"
- "vfnmsub213pd\0" "vfnmsub213ps\0" "vfnmsub213sd\0" "vfnmsub213ss\0" "vfnmsub231pd\0" "vfnmsub231ps\0"
- "vfnmsub231sd\0" "vfnmsub231ss\0" "vfnmsubpd\0" "vfnmsubps\0" "vfnmsubsd\0" "vfnmsubss\0" "vfpclasspd\0"
- "vfpclassps\0" "vfpclasssd\0" "vfpclassss\0" "vfrczpd\0" "vfrczps\0" "vfrczsd\0" "vfrczss\0" "vgatherdpd\0"
- "vgatherdps\0" "vgatherpf0dpd\0" "vgatherpf0dps\0" "vgatherpf0qpd\0" "vgatherpf0qps\0" "vgatherpf1dpd\0"
- "vgatherpf1dps\0" "vgatherpf1qpd\0" "vgatherpf1qps\0" "vgatherqpd\0" "vgatherqps\0" "vgetexppd\0" "vgetexpps\0"
- "vgetexpsd\0" "vgetexpss\0" "vgetmantpd\0" "vgetmantps\0" "vgetmantsd\0" "vgetmantss\0" "vgf2p8affineinvqb\0"
- "vgf2p8affineqb\0" "vgf2p8mulb\0" "vhaddpd\0" "vhaddps\0" "vhsubpd\0" "vhsubps\0" "vinsertf128\0" "vinsertf32x4\0"
- "vinsertf32x8\0" "vinsertf64x2\0" "vinsertf64x4\0" "vinserti128\0" "vinserti32x4\0" "vinserti32x8\0" "vinserti64x2\0"
- "vinserti64x4\0" "vinsertps\0" "vlddqu\0" "vldmxcsr\0" "vmaskmovdqu\0" "vmaskmovpd\0" "vmaskmovps\0" "vmaxpd\0"
- "vmaxps\0" "vmaxsd\0" "vmaxss\0" "vmcall\0" "vmclear\0" "vmfunc\0" "vminpd\0" "vminps\0" "vminsd\0" "vminss\0"
- "vmlaunch\0" "vmload\0" "vmmcall\0" "vmovapd\0" "vmovaps\0" "vmovd\0" "vmovddup\0" "vmovdqa\0" "vmovdqa32\0"
- "vmovdqa64\0" "vmovdqu\0" "vmovdqu16\0" "vmovdqu32\0" "vmovdqu64\0" "vmovdqu8\0" "vmovhlps\0" "vmovhpd\0" "vmovhps\0"
- "vmovlhps\0" "vmovlpd\0" "vmovlps\0" "vmovmskpd\0" "vmovmskps\0" "vmovntdq\0" "vmovntdqa\0" "vmovntpd\0" "vmovntps\0"
- "vmovq\0" "vmovsd\0" "vmovshdup\0" "vmovsldup\0" "vmovss\0" "vmovupd\0" "vmovups\0" "vmpsadbw\0" "vmptrld\0"
- "vmptrst\0" "vmread\0" "vmresume\0" "vmrun\0" "vmsave\0" "vmulpd\0" "vmulps\0" "vmulsd\0" "vmulss\0" "vmwrite\0"
- "vmxon\0" "vorpd\0" "vorps\0" "vp4dpwssd\0" "vp4dpwssds\0" "vpabsb\0" "vpabsd\0" "vpabsq\0" "vpabsw\0" "vpackssdw\0"
- "vpacksswb\0" "vpackusdw\0" "vpackuswb\0" "vpaddb\0" "vpaddd\0" "vpaddq\0" "vpaddsb\0" "vpaddsw\0" "vpaddusb\0"
- "vpaddusw\0" "vpaddw\0" "vpalignr\0" "vpand\0" "vpandd\0" "vpandn\0" "vpandnd\0" "vpandnq\0" "vpandq\0" "vpavgb\0"
- "vpavgw\0" "vpblendd\0" "vpblendvb\0" "vpblendw\0" "vpbroadcastb\0" "vpbroadcastd\0" "vpbroadcastmb2d\0"
- "vpbroadcastmb2q\0" "vpbroadcastq\0" "vpbroadcastw\0" "vpclmulqdq\0" "vpcmov\0" "vpcmpb\0" "vpcmpd\0" "vpcmpeqb\0"
+ "vextracti64x2\0" "vextracti64x4\0" "vextractps\0" "vfcmaddcph\0" "vfcmaddcsh\0" "vfcmulcph\0" "vfcmulcsh\0"
+ "vfixupimmpd\0" "vfixupimmps\0" "vfixupimmsd\0" "vfixupimmss\0" "vfmadd132pd\0" "vfmadd132ph\0" "vfmadd132ps\0"
+ "vfmadd132sd\0" "vfmadd132sh\0" "vfmadd132ss\0" "vfmadd213pd\0" "vfmadd213ph\0" "vfmadd213ps\0" "vfmadd213sd\0"
+ "vfmadd213sh\0" "vfmadd213ss\0" "vfmadd231pd\0" "vfmadd231ph\0" "vfmadd231ps\0" "vfmadd231sd\0" "vfmadd231sh\0"
+ "vfmadd231ss\0" "vfmaddcph\0" "vfmaddcsh\0" "vfmaddpd\0" "vfmaddps\0" "vfmaddsd\0" "vfmaddss\0" "vfmaddsub132pd\0"
+ "vfmaddsub132ph\0" "vfmaddsub132ps\0" "vfmaddsub213pd\0" "vfmaddsub213ph\0" "vfmaddsub213ps\0" "vfmaddsub231pd\0"
+ "vfmaddsub231ph\0" "vfmaddsub231ps\0" "vfmaddsubpd\0" "vfmaddsubps\0" "vfmsub132pd\0" "vfmsub132ph\0" "vfmsub132ps\0"
+ "vfmsub132sd\0" "vfmsub132sh\0" "vfmsub132ss\0" "vfmsub213pd\0" "vfmsub213ph\0" "vfmsub213ps\0" "vfmsub213sd\0"
+ "vfmsub213sh\0" "vfmsub213ss\0" "vfmsub231pd\0" "vfmsub231ph\0" "vfmsub231ps\0" "vfmsub231sd\0" "vfmsub231sh\0"
+ "vfmsub231ss\0" "vfmsubadd132pd\0" "vfmsubadd132ph\0" "vfmsubadd132ps\0" "vfmsubadd213pd\0" "vfmsubadd213ph\0"
+ "vfmsubadd213ps\0" "vfmsubadd231pd\0" "vfmsubadd231ph\0" "vfmsubadd231ps\0" "vfmsubaddpd\0" "vfmsubaddps\0"
+ "vfmsubpd\0" "vfmsubps\0" "vfmsubsd\0" "vfmsubss\0" "vfmulcph\0" "vfmulcsh\0" "vfnmadd132pd\0" "vfnmadd132ph\0"
+ "vfnmadd132ps\0" "vfnmadd132sd\0" "vfnmadd132sh\0" "vfnmadd132ss\0" "vfnmadd213pd\0" "vfnmadd213ph\0"
+ "vfnmadd213ps\0" "vfnmadd213sd\0" "vfnmadd213sh\0" "vfnmadd213ss\0" "vfnmadd231pd\0" "vfnmadd231ph\0"
+ "vfnmadd231ps\0" "vfnmadd231sd\0" "vfnmadd231sh\0" "vfnmadd231ss\0" "vfnmaddpd\0" "vfnmaddps\0" "vfnmaddsd\0"
+ "vfnmaddss\0" "vfnmsub132pd\0" "vfnmsub132ph\0" "vfnmsub132ps\0" "vfnmsub132sd\0" "vfnmsub132sh\0" "vfnmsub132ss\0"
+ "vfnmsub213pd\0" "vfnmsub213ph\0" "vfnmsub213ps\0" "vfnmsub213sd\0" "vfnmsub213sh\0" "vfnmsub213ss\0"
+ "vfnmsub231pd\0" "vfnmsub231ph\0" "vfnmsub231ps\0" "vfnmsub231sd\0" "vfnmsub231sh\0" "vfnmsub231ss\0" "vfnmsubpd\0"
+ "vfnmsubps\0" "vfnmsubsd\0" "vfnmsubss\0" "vfpclasspd\0" "vfpclassph\0" "vfpclassps\0" "vfpclasssd\0" "vfpclasssh\0"
+ "vfpclassss\0" "vfrczpd\0" "vfrczps\0" "vfrczsd\0" "vfrczss\0" "vgatherdpd\0" "vgatherdps\0" "vgatherpf0dpd\0"
+ "vgatherpf0dps\0" "vgatherpf0qpd\0" "vgatherpf0qps\0" "vgatherpf1dpd\0" "vgatherpf1dps\0" "vgatherpf1qpd\0"
+ "vgatherpf1qps\0" "vgatherqpd\0" "vgatherqps\0" "vgetexppd\0" "vgetexpph\0" "vgetexpps\0" "vgetexpsd\0" "vgetexpsh\0"
+ "vgetexpss\0" "vgetmantpd\0" "vgetmantph\0" "vgetmantps\0" "vgetmantsd\0" "vgetmantsh\0" "vgetmantss\0"
+ "vgf2p8affineinvqb\0" "vgf2p8affineqb\0" "vgf2p8mulb\0" "vhaddpd\0" "vhaddps\0" "vhsubpd\0" "vhsubps\0"
+ "vinsertf128\0" "vinsertf32x4\0" "vinsertf32x8\0" "vinsertf64x2\0" "vinsertf64x4\0" "vinserti128\0" "vinserti32x4\0"
+ "vinserti32x8\0" "vinserti64x2\0" "vinserti64x4\0" "vinsertps\0" "vlddqu\0" "vldmxcsr\0" "vmaskmovdqu\0"
+ "vmaskmovpd\0" "vmaskmovps\0" "vmaxpd\0" "vmaxph\0" "vmaxps\0" "vmaxsd\0" "vmaxsh\0" "vmaxss\0" "vmcall\0"
+ "vmclear\0" "vmfunc\0" "vminpd\0" "vminph\0" "vminps\0" "vminsd\0" "vminsh\0" "vminss\0" "vmlaunch\0" "vmload\0"
+ "vmmcall\0" "vmovapd\0" "vmovaps\0" "vmovd\0" "vmovddup\0" "vmovdqa\0" "vmovdqa32\0" "vmovdqa64\0" "vmovdqu\0"
+ "vmovdqu16\0" "vmovdqu32\0" "vmovdqu64\0" "vmovdqu8\0" "vmovhlps\0" "vmovhpd\0" "vmovhps\0" "vmovlhps\0" "vmovlpd\0"
+ "vmovlps\0" "vmovmskpd\0" "vmovmskps\0" "vmovntdq\0" "vmovntdqa\0" "vmovntpd\0" "vmovntps\0" "vmovq\0" "vmovsd\0"
+ "vmovsh\0" "vmovshdup\0" "vmovsldup\0" "vmovss\0" "vmovupd\0" "vmovups\0" "vmovw\0" "vmpsadbw\0" "vmptrld\0"
+ "vmptrst\0" "vmread\0" "vmresume\0" "vmrun\0" "vmsave\0" "vmulpd\0" "vmulph\0" "vmulps\0" "vmulsd\0" "vmulsh\0"
+ "vmulss\0" "vmwrite\0" "vmxon\0" "vorpd\0" "vorps\0" "vp2intersectd\0" "vp2intersectq\0" "vp4dpwssd\0" "vp4dpwssds\0"
+ "vpabsb\0" "vpabsd\0" "vpabsq\0" "vpabsw\0" "vpackssdw\0" "vpacksswb\0" "vpackusdw\0" "vpackuswb\0" "vpaddb\0"
+ "vpaddd\0" "vpaddq\0" "vpaddsb\0" "vpaddsw\0" "vpaddusb\0" "vpaddusw\0" "vpaddw\0" "vpalignr\0" "vpand\0" "vpandd\0"
+ "vpandn\0" "vpandnd\0" "vpandnq\0" "vpandq\0" "vpavgb\0" "vpavgw\0" "vpblendd\0" "vpblendmb\0" "vpblendmd\0"
+ "vpblendmq\0" "vpblendmw\0" "vpblendvb\0" "vpblendw\0" "vpbroadcastb\0" "vpbroadcastd\0" "vpbroadcastmb2q\0"
+ "vpbroadcastmw2d\0" "vpbroadcastq\0" "vpbroadcastw\0" "vpclmulqdq\0" "vpcmov\0" "vpcmpb\0" "vpcmpd\0" "vpcmpeqb\0"
"vpcmpeqd\0" "vpcmpeqq\0" "vpcmpeqw\0" "vpcmpestri\0" "vpcmpestrm\0" "vpcmpgtb\0" "vpcmpgtd\0" "vpcmpgtq\0"
"vpcmpgtw\0" "vpcmpistri\0" "vpcmpistrm\0" "vpcmpq\0" "vpcmpub\0" "vpcmpud\0" "vpcmpuq\0" "vpcmpuw\0" "vpcmpw\0"
"vpcomb\0" "vpcomd\0" "vpcompressb\0" "vpcompressd\0" "vpcompressq\0" "vpcompressw\0" "vpcomq\0" "vpcomub\0"
@@ -2717,18 +2967,20 @@ const char InstDB::_nameData[] =
"vptestmw\0" "vptestnmb\0" "vptestnmd\0" "vptestnmq\0" "vptestnmw\0" "vpunpckhbw\0" "vpunpckhdq\0" "vpunpckhqdq\0"
"vpunpckhwd\0" "vpunpcklbw\0" "vpunpckldq\0" "vpunpcklqdq\0" "vpunpcklwd\0" "vpxor\0" "vpxord\0" "vpxorq\0"
"vrangepd\0" "vrangeps\0" "vrangesd\0" "vrangess\0" "vrcp14pd\0" "vrcp14ps\0" "vrcp14sd\0" "vrcp14ss\0" "vrcp28pd\0"
- "vrcp28ps\0" "vrcp28sd\0" "vrcp28ss\0" "vrcpps\0" "vrcpss\0" "vreducepd\0" "vreduceps\0" "vreducesd\0" "vreducess\0"
- "vrndscalepd\0" "vrndscaleps\0" "vrndscalesd\0" "vrndscaless\0" "vroundpd\0" "vroundps\0" "vroundsd\0" "vroundss\0"
- "vrsqrt14pd\0" "vrsqrt14ps\0" "vrsqrt14sd\0" "vrsqrt14ss\0" "vrsqrt28pd\0" "vrsqrt28ps\0" "vrsqrt28sd\0"
- "vrsqrt28ss\0" "vrsqrtps\0" "vrsqrtss\0" "vscalefpd\0" "vscalefps\0" "vscalefsd\0" "vscalefss\0" "vscatterdpd\0"
- "vscatterdps\0" "vscatterpf0dpd\0" "vscatterpf0dps\0" "vscatterpf0qpd\0" "vscatterpf0qps\0" "vscatterpf1dpd\0"
- "vscatterpf1dps\0" "vscatterpf1qpd\0" "vscatterpf1qps\0" "vscatterqpd\0" "vscatterqps\0" "vshuff32x4\0"
- "vshuff64x2\0" "vshufi32x4\0" "vshufi64x2\0" "vshufpd\0" "vshufps\0" "vsqrtpd\0" "vsqrtps\0" "vsqrtsd\0" "vsqrtss\0"
- "vstmxcsr\0" "vsubpd\0" "vsubps\0" "vsubsd\0" "vsubss\0" "vtestpd\0" "vtestps\0" "vucomisd\0" "vucomiss\0"
- "vunpckhpd\0" "vunpckhps\0" "vunpcklpd\0" "vunpcklps\0" "vxorpd\0" "vxorps\0" "vzeroall\0" "vzeroupper\0" "wbinvd\0"
- "wbnoinvd\0" "wrfsbase\0" "wrgsbase\0" "wrmsr\0" "xabort\0" "xadd\0" "xbegin\0" "xend\0" "xgetbv\0" "xlatb\0"
- "xrstors\0" "xrstors64\0" "xsavec\0" "xsavec64\0" "xsaveopt\0" "xsaveopt64\0" "xsaves\0" "xsaves64\0" "xsetbv\0"
- "xtest";
+ "vrcp28ps\0" "vrcp28sd\0" "vrcp28ss\0" "vrcpph\0" "vrcpps\0" "vrcpsh\0" "vrcpss\0" "vreducepd\0" "vreduceph\0"
+ "vreduceps\0" "vreducesd\0" "vreducesh\0" "vreducess\0" "vrndscalepd\0" "vrndscaleph\0" "vrndscaleps\0"
+ "vrndscalesd\0" "vrndscalesh\0" "vrndscaless\0" "vroundpd\0" "vroundps\0" "vroundsd\0" "vroundss\0" "vrsqrt14pd\0"
+ "vrsqrt14ps\0" "vrsqrt14sd\0" "vrsqrt14ss\0" "vrsqrt28pd\0" "vrsqrt28ps\0" "vrsqrt28sd\0" "vrsqrt28ss\0" "vrsqrtph\0"
+ "vrsqrtps\0" "vrsqrtsh\0" "vrsqrtss\0" "vscalefpd\0" "vscalefph\0" "vscalefps\0" "vscalefsd\0" "vscalefsh\0"
+ "vscalefss\0" "vscatterdpd\0" "vscatterdps\0" "vscatterpf0dpd\0" "vscatterpf0dps\0" "vscatterpf0qpd\0"
+ "vscatterpf0qps\0" "vscatterpf1dpd\0" "vscatterpf1dps\0" "vscatterpf1qpd\0" "vscatterpf1qps\0" "vscatterqpd\0"
+ "vscatterqps\0" "vshuff32x4\0" "vshuff64x2\0" "vshufi32x4\0" "vshufi64x2\0" "vshufpd\0" "vshufps\0" "vsqrtpd\0"
+ "vsqrtph\0" "vsqrtps\0" "vsqrtsd\0" "vsqrtsh\0" "vsqrtss\0" "vstmxcsr\0" "vsubpd\0" "vsubph\0" "vsubps\0" "vsubsd\0"
+ "vsubsh\0" "vsubss\0" "vtestpd\0" "vtestps\0" "vucomisd\0" "vucomish\0" "vucomiss\0" "vunpckhpd\0" "vunpckhps\0"
+ "vunpcklpd\0" "vunpcklps\0" "vxorpd\0" "vxorps\0" "vzeroall\0" "vzeroupper\0" "wbinvd\0" "wbnoinvd\0" "wrfsbase\0"
+ "wrgsbase\0" "wrmsr\0" "wrssd\0" "wrssq\0" "wrussd\0" "wrussq\0" "xabort\0" "xadd\0" "xbegin\0" "xend\0" "xgetbv\0"
+ "xlatb\0" "xresldtrk\0" "xrstors\0" "xrstors64\0" "xsavec\0" "xsavec64\0" "xsaveopt\0" "xsaveopt64\0" "xsaves\0"
+ "xsaves64\0" "xsetbv\0" "xsusldtrk\0" "xtest";
const InstDB::InstNameIndex InstDB::instNameIndex[26] = {
{ Inst::kIdAaa , Inst::kIdArpl + 1 },
@@ -2739,7 +2991,7 @@ const InstDB::InstNameIndex InstDB::instNameIndex[26] = {
{ Inst::kIdF2xm1 , Inst::kIdFyl2xp1 + 1 },
{ Inst::kIdGetsec , Inst::kIdGf2p8mulb + 1 },
{ Inst::kIdHaddpd , Inst::kIdHsubps + 1 },
- { Inst::kIdIdiv , Inst::kIdIretw + 1 },
+ { Inst::kIdIdiv , Inst::kIdIretq + 1 },
{ Inst::kIdJa , Inst::kIdJz + 1 },
{ Inst::kIdKaddb , Inst::kIdKxorw + 1 },
{ Inst::kIdLahf , Inst::kIdLzcnt + 1 },
@@ -2748,12 +3000,12 @@ const InstDB::InstNameIndex InstDB::instNameIndex[26] = {
{ Inst::kIdOr , Inst::kIdOuts + 1 },
{ Inst::kIdPabsb , Inst::kIdPxor + 1 },
{ Inst::kIdNone , Inst::kIdNone + 1 },
- { Inst::kIdRcl , Inst::kIdRsqrtss + 1 },
- { Inst::kIdSahf , Inst::kIdSysret64 + 1 },
+ { Inst::kIdRcl , Inst::kIdRstorssp + 1 },
+ { Inst::kIdSahf , Inst::kIdSysretq + 1 },
{ Inst::kIdT1mskc , Inst::kIdTzmsk + 1 },
{ Inst::kIdUcomisd , Inst::kIdUnpcklps + 1 },
{ Inst::kIdV4fmaddps , Inst::kIdVzeroupper + 1 },
- { Inst::kIdWbinvd , Inst::kIdWrmsr + 1 },
+ { Inst::kIdWbinvd , Inst::kIdWrussq + 1 },
{ Inst::kIdXabort , Inst::kIdXtest + 1 },
{ Inst::kIdNone , Inst::kIdNone + 1 },
{ Inst::kIdNone , Inst::kIdNone + 1 }
@@ -2762,19 +3014,18 @@ const InstDB::InstNameIndex InstDB::instNameIndex[26] = {
// ${NameData:End}
#endif // !ASMJIT_NO_TEXT
-// ============================================================================
-// [asmjit::x86::InstDB - InstSignature / OpSignature]
-// ============================================================================
+// x86::InstDB - InstSignature & OpSignature
+// =========================================
#ifndef ASMJIT_NO_VALIDATION
// ${InstSignatureTable:Begin}
// ------------------- Automatically generated, do not edit -------------------
-#define ROW(count, x86, x64, implicit, o0, o1, o2, o3, o4, o5) \
- { count, (x86 ? uint8_t(InstDB::kModeX86) : uint8_t(0)) | \
- (x64 ? uint8_t(InstDB::kModeX64) : uint8_t(0)) , \
- implicit, \
- 0, \
- { o0, o1, o2, o3, o4, o5 } \
+#define ROW(count, x86, x64, implicit, o0, o1, o2, o3, o4, o5) \
+ { count, uint8_t(x86 ? uint8_t(InstDB::Mode::kX86) : uint8_t(0)) | \
+ (x64 ? uint8_t(InstDB::Mode::kX64) : uint8_t(0)) , \
+ implicit, \
+ 0, \
+ { o0, o1, o2, o3, o4, o5 } \
}
const InstDB::InstSignature InstDB::_instSignatureTable[] = {
ROW(2, 1, 1, 0, 1 , 2 , 0 , 0 , 0 , 0 ), // #0 {r8lo|r8hi|m8|mem, r8lo|r8hi}
@@ -2800,7 +3051,7 @@ const InstDB::InstSignature InstDB::_instSignatureTable[] = {
ROW(2, 1, 1, 0, 25 , 26 , 0 , 0 , 0 , 0 ), // {r16|m16|r32|m32|r64|m64|mem, i8}
ROW(2, 1, 1, 0, 1 , 2 , 0 , 0 , 0 , 0 ), // {r8lo|r8hi|m8|mem, r8lo|r8hi}
ROW(2, 1, 1, 0, 27 , 4 , 0 , 0 , 0 , 0 ), // {r16|m16|mem, r16}
- ROW(2, 1, 1, 0, 28 , 6 , 0 , 0 , 0 , 0 ), // {r32|m32|mem, r32}
+ ROW(2, 1, 1, 0, 28 , 6 , 0 , 0 , 0 , 0 ), // #23 {r32|m32|mem, r32}
ROW(2, 1, 1, 0, 2 , 18 , 0 , 0 , 0 , 0 ), // {r8lo|r8hi, m8|mem}
ROW(2, 1, 1, 0, 4 , 21 , 0 , 0 , 0 , 0 ), // {r16, m16|mem}
ROW(2, 1, 1, 0, 6 , 29 , 0 , 0 , 0 , 0 ), // {r32, m32|mem}
@@ -2826,1150 +3077,1310 @@ const InstDB::InstSignature InstDB::_instSignatureTable[] = {
ROW(3, 1, 1, 0, 4 , 27 , 42 , 0 , 0 , 0 ), // {r16, r16|m16|mem, i8|i16|u16}
ROW(3, 1, 1, 0, 6 , 28 , 43 , 0 , 0 , 0 ), // {r32, r32|m32|mem, i8|i32|u32}
ROW(3, 0, 1, 0, 8 , 15 , 44 , 0 , 0 , 0 ), // {r64, r64|m64|mem, i8|i32}
- ROW(2, 1, 1, 0, 1 , 2 , 0 , 0 , 0 , 0 ), // #49 {r8lo|r8hi|m8|mem, r8lo|r8hi}
+ ROW(2, 0, 1, 0, 8 , 45 , 0 , 0 , 0 , 0 ), // #49 {r64, i64|u64}
+ ROW(2, 0, 1, 0, 46 , 18 , 0 , 0 , 0 , 0 ), // {al, m8|mem}
+ ROW(2, 0, 1, 0, 47 , 21 , 0 , 0 , 0 , 0 ), // {ax, m16|mem}
+ ROW(2, 0, 1, 0, 48 , 29 , 0 , 0 , 0 , 0 ), // {eax, m32|mem}
+ ROW(2, 0, 1, 0, 49 , 30 , 0 , 0 , 0 , 0 ), // {rax, m64|mem}
+ ROW(2, 0, 1, 0, 18 , 46 , 0 , 0 , 0 , 0 ), // {m8|mem, al}
+ ROW(2, 0, 1, 0, 21 , 47 , 0 , 0 , 0 , 0 ), // {m16|mem, ax}
+ ROW(2, 0, 1, 0, 29 , 48 , 0 , 0 , 0 , 0 ), // {m32|mem, eax}
+ ROW(2, 0, 1, 0, 30 , 49 , 0 , 0 , 0 , 0 ), // {m64|mem, rax}
+ ROW(2, 1, 1, 0, 1 , 2 , 0 , 0 , 0 , 0 ), // #58 {r8lo|r8hi|m8|mem, r8lo|r8hi}
ROW(2, 1, 1, 0, 27 , 4 , 0 , 0 , 0 , 0 ), // {r16|m16|mem, r16}
ROW(2, 1, 1, 0, 28 , 6 , 0 , 0 , 0 , 0 ), // {r32|m32|mem, r32}
- ROW(2, 0, 1, 0, 15 , 8 , 0 , 0 , 0 , 0 ), // {r64|m64|mem, r64}
+ ROW(2, 0, 1, 0, 15 , 8 , 0 , 0 , 0 , 0 ), // #61 {r64|m64|mem, r64}
ROW(2, 1, 1, 0, 2 , 18 , 0 , 0 , 0 , 0 ), // {r8lo|r8hi, m8|mem}
ROW(2, 1, 1, 0, 4 , 21 , 0 , 0 , 0 , 0 ), // {r16, m16|mem}
ROW(2, 1, 1, 0, 6 , 29 , 0 , 0 , 0 , 0 ), // {r32, m32|mem}
ROW(2, 0, 1, 0, 8 , 30 , 0 , 0 , 0 , 0 ), // {r64, m64|mem}
- ROW(2, 1, 1, 0, 9 , 10 , 0 , 0 , 0 , 0 ), // #57 {r8lo|r8hi|m8, i8|u8}
+ ROW(2, 1, 1, 0, 9 , 10 , 0 , 0 , 0 , 0 ), // #66 {r8lo|r8hi|m8, i8|u8}
ROW(2, 1, 1, 0, 11 , 12 , 0 , 0 , 0 , 0 ), // {r16|m16, i16|u16}
ROW(2, 1, 1, 0, 13 , 14 , 0 , 0 , 0 , 0 ), // {r32|m32, i32|u32}
ROW(2, 0, 1, 0, 15 , 24 , 0 , 0 , 0 , 0 ), // {r64|m64|mem, i32|r64}
ROW(2, 1, 1, 0, 1 , 2 , 0 , 0 , 0 , 0 ), // {r8lo|r8hi|m8|mem, r8lo|r8hi}
ROW(2, 1, 1, 0, 27 , 4 , 0 , 0 , 0 , 0 ), // {r16|m16|mem, r16}
ROW(2, 1, 1, 0, 28 , 6 , 0 , 0 , 0 , 0 ), // {r32|m32|mem, r32}
- ROW(2, 1, 1, 0, 4 , 21 , 0 , 0 , 0 , 0 ), // #64 {r16, m16|mem}
+ ROW(2, 1, 1, 0, 4 , 21 , 0 , 0 , 0 , 0 ), // #73 {r16, m16|mem}
ROW(2, 1, 1, 0, 6 , 29 , 0 , 0 , 0 , 0 ), // {r32, m32|mem}
ROW(2, 0, 1, 0, 8 , 30 , 0 , 0 , 0 , 0 ), // {r64, m64|mem}
ROW(2, 1, 1, 0, 21 , 4 , 0 , 0 , 0 , 0 ), // {m16|mem, r16}
- ROW(2, 1, 1, 0, 29 , 6 , 0 , 0 , 0 , 0 ), // #68 {m32|mem, r32}
+ ROW(2, 1, 1, 0, 29 , 6 , 0 , 0 , 0 , 0 ), // #77 {m32|mem, r32}
ROW(2, 0, 1, 0, 30 , 8 , 0 , 0 , 0 , 0 ), // {m64|mem, r64}
- ROW(2, 1, 1, 0, 45 , 46 , 0 , 0 , 0 , 0 ), // #70 {xmm, xmm|m128|mem}
- ROW(2, 1, 1, 0, 47 , 45 , 0 , 0 , 0 , 0 ), // #71 {m128|mem, xmm}
- ROW(2, 1, 1, 0, 48 , 49 , 0 , 0 , 0 , 0 ), // {ymm, ymm|m256|mem}
- ROW(2, 1, 1, 0, 50 , 48 , 0 , 0 , 0 , 0 ), // {m256|mem, ymm}
- ROW(2, 1, 1, 0, 51 , 52 , 0 , 0 , 0 , 0 ), // #74 {zmm, zmm|m512|mem}
- ROW(2, 1, 1, 0, 53 , 51 , 0 , 0 , 0 , 0 ), // {m512|mem, zmm}
- ROW(3, 1, 1, 0, 45 , 45 , 54 , 0 , 0 , 0 ), // #76 {xmm, xmm, xmm|m128|mem|i8|u8}
- ROW(3, 1, 1, 0, 45 , 47 , 10 , 0 , 0 , 0 ), // {xmm, m128|mem, i8|u8}
- ROW(3, 1, 1, 0, 48 , 48 , 55 , 0 , 0 , 0 ), // {ymm, ymm, ymm|m256|mem|i8|u8}
- ROW(3, 1, 1, 0, 48 , 50 , 10 , 0 , 0 , 0 ), // {ymm, m256|mem, i8|u8}
- ROW(3, 1, 1, 0, 51 , 51 , 56 , 0 , 0 , 0 ), // {zmm, zmm, zmm|m512|mem|i8|u8}
- ROW(3, 1, 1, 0, 51 , 53 , 10 , 0 , 0 , 0 ), // {zmm, m512|mem, i8|u8}
- ROW(3, 1, 1, 0, 45 , 45 , 54 , 0 , 0 , 0 ), // #82 {xmm, xmm, i8|u8|xmm|m128|mem}
- ROW(3, 1, 1, 0, 48 , 48 , 54 , 0 , 0 , 0 ), // {ymm, ymm, i8|u8|xmm|m128|mem}
- ROW(3, 1, 1, 0, 45 , 47 , 10 , 0 , 0 , 0 ), // {xmm, m128|mem, i8|u8}
- ROW(3, 1, 1, 0, 48 , 50 , 10 , 0 , 0 , 0 ), // {ymm, m256|mem, i8|u8}
- ROW(3, 1, 1, 0, 51 , 51 , 54 , 0 , 0 , 0 ), // {zmm, zmm, xmm|m128|mem|i8|u8}
- ROW(3, 1, 1, 0, 51 , 53 , 10 , 0 , 0 , 0 ), // {zmm, m512|mem, i8|u8}
- ROW(3, 1, 1, 0, 45 , 45 , 54 , 0 , 0 , 0 ), // #88 {xmm, xmm, xmm|m128|mem|i8|u8}
- ROW(3, 1, 1, 0, 45 , 47 , 10 , 0 , 0 , 0 ), // {xmm, m128|mem, i8|u8}
- ROW(3, 1, 1, 0, 48 , 48 , 54 , 0 , 0 , 0 ), // {ymm, ymm, xmm|m128|mem|i8|u8}
- ROW(3, 1, 1, 0, 48 , 50 , 10 , 0 , 0 , 0 ), // {ymm, m256|mem, i8|u8}
- ROW(3, 1, 1, 0, 51 , 51 , 54 , 0 , 0 , 0 ), // {zmm, zmm, xmm|m128|mem|i8|u8}
- ROW(3, 1, 1, 0, 51 , 53 , 10 , 0 , 0 , 0 ), // {zmm, m512|mem, i8|u8}
- ROW(2, 1, 1, 0, 57 , 58 , 0 , 0 , 0 , 0 ), // #94 {mm, mm|m64|mem|r64}
- ROW(2, 1, 1, 0, 15 , 59 , 0 , 0 , 0 , 0 ), // {m64|mem|r64, mm|xmm}
- ROW(2, 0, 1, 0, 45 , 15 , 0 , 0 , 0 , 0 ), // {xmm, r64|m64|mem}
- ROW(2, 1, 1, 0, 45 , 60 , 0 , 0 , 0 , 0 ), // #97 {xmm, xmm|m64|mem}
- ROW(2, 1, 1, 0, 30 , 45 , 0 , 0 , 0 , 0 ), // #98 {m64|mem, xmm}
- ROW(3, 1, 1, 0, 45 , 61 , 45 , 0 , 0 , 0 ), // #99 {xmm, vm32x, xmm}
- ROW(3, 1, 1, 0, 48 , 61 , 48 , 0 , 0 , 0 ), // {ymm, vm32x, ymm}
- ROW(2, 1, 1, 0, 45 , 61 , 0 , 0 , 0 , 0 ), // {xmm, vm32x}
- ROW(2, 1, 1, 0, 48 , 62 , 0 , 0 , 0 , 0 ), // {ymm, vm32y}
- ROW(2, 1, 1, 0, 51 , 63 , 0 , 0 , 0 , 0 ), // {zmm, vm32z}
- ROW(3, 1, 1, 0, 45 , 61 , 45 , 0 , 0 , 0 ), // #104 {xmm, vm32x, xmm}
- ROW(3, 1, 1, 0, 48 , 62 , 48 , 0 , 0 , 0 ), // {ymm, vm32y, ymm}
- ROW(2, 1, 1, 0, 45 , 61 , 0 , 0 , 0 , 0 ), // {xmm, vm32x}
- ROW(2, 1, 1, 0, 48 , 62 , 0 , 0 , 0 , 0 ), // {ymm, vm32y}
- ROW(2, 1, 1, 0, 51 , 63 , 0 , 0 , 0 , 0 ), // {zmm, vm32z}
- ROW(3, 1, 1, 0, 45 , 64 , 45 , 0 , 0 , 0 ), // #109 {xmm, vm64x, xmm}
- ROW(3, 1, 1, 0, 48 , 65 , 48 , 0 , 0 , 0 ), // {ymm, vm64y, ymm}
- ROW(2, 1, 1, 0, 45 , 64 , 0 , 0 , 0 , 0 ), // {xmm, vm64x}
- ROW(2, 1, 1, 0, 48 , 65 , 0 , 0 , 0 , 0 ), // {ymm, vm64y}
- ROW(2, 1, 1, 0, 51 , 66 , 0 , 0 , 0 , 0 ), // {zmm, vm64z}
- ROW(2, 1, 1, 0, 25 , 10 , 0 , 0 , 0 , 0 ), // #114 {r16|m16|r32|m32|r64|m64|mem, i8|u8}
+ ROW(2, 1, 1, 0, 50 , 51 , 0 , 0 , 0 , 0 ), // #79 {xmm, xmm|m128|mem}
+ ROW(2, 1, 1, 0, 52 , 50 , 0 , 0 , 0 , 0 ), // #80 {m128|mem, xmm}
+ ROW(2, 1, 1, 0, 53 , 54 , 0 , 0 , 0 , 0 ), // {ymm, ymm|m256|mem}
+ ROW(2, 1, 1, 0, 55 , 53 , 0 , 0 , 0 , 0 ), // {m256|mem, ymm}
+ ROW(2, 1, 1, 0, 56 , 57 , 0 , 0 , 0 , 0 ), // #83 {zmm, zmm|m512|mem}
+ ROW(2, 1, 1, 0, 58 , 56 , 0 , 0 , 0 , 0 ), // {m512|mem, zmm}
+ ROW(3, 1, 1, 0, 50 , 50 , 59 , 0 , 0 , 0 ), // #85 {xmm, xmm, xmm|m128|mem|i8|u8}
+ ROW(3, 1, 1, 0, 50 , 52 , 10 , 0 , 0 , 0 ), // {xmm, m128|mem, i8|u8}
+ ROW(3, 1, 1, 0, 53 , 53 , 60 , 0 , 0 , 0 ), // {ymm, ymm, ymm|m256|mem|i8|u8}
+ ROW(3, 1, 1, 0, 53 , 55 , 10 , 0 , 0 , 0 ), // {ymm, m256|mem, i8|u8}
+ ROW(3, 1, 1, 0, 56 , 56 , 61 , 0 , 0 , 0 ), // {zmm, zmm, zmm|m512|mem|i8|u8}
+ ROW(3, 1, 1, 0, 56 , 58 , 10 , 0 , 0 , 0 ), // {zmm, m512|mem, i8|u8}
+ ROW(3, 1, 1, 0, 50 , 50 , 59 , 0 , 0 , 0 ), // #91 {xmm, xmm, i8|u8|xmm|m128|mem}
+ ROW(3, 1, 1, 0, 53 , 53 , 59 , 0 , 0 , 0 ), // {ymm, ymm, i8|u8|xmm|m128|mem}
+ ROW(3, 1, 1, 0, 50 , 52 , 10 , 0 , 0 , 0 ), // {xmm, m128|mem, i8|u8}
+ ROW(3, 1, 1, 0, 53 , 55 , 10 , 0 , 0 , 0 ), // {ymm, m256|mem, i8|u8}
+ ROW(3, 1, 1, 0, 56 , 56 , 59 , 0 , 0 , 0 ), // {zmm, zmm, xmm|m128|mem|i8|u8}
+ ROW(3, 1, 1, 0, 56 , 58 , 10 , 0 , 0 , 0 ), // {zmm, m512|mem, i8|u8}
+ ROW(3, 1, 1, 0, 50 , 50 , 59 , 0 , 0 , 0 ), // #97 {xmm, xmm, xmm|m128|mem|i8|u8}
+ ROW(3, 1, 1, 0, 50 , 52 , 10 , 0 , 0 , 0 ), // {xmm, m128|mem, i8|u8}
+ ROW(3, 1, 1, 0, 53 , 53 , 59 , 0 , 0 , 0 ), // {ymm, ymm, xmm|m128|mem|i8|u8}
+ ROW(3, 1, 1, 0, 53 , 55 , 10 , 0 , 0 , 0 ), // {ymm, m256|mem, i8|u8}
+ ROW(3, 1, 1, 0, 56 , 56 , 59 , 0 , 0 , 0 ), // {zmm, zmm, xmm|m128|mem|i8|u8}
+ ROW(3, 1, 1, 0, 56 , 58 , 10 , 0 , 0 , 0 ), // {zmm, m512|mem, i8|u8}
+ ROW(2, 1, 1, 0, 62 , 63 , 0 , 0 , 0 , 0 ), // #103 {mm, mm|m64|mem|r64}
+ ROW(2, 1, 1, 0, 15 , 64 , 0 , 0 , 0 , 0 ), // {m64|mem|r64, mm|xmm}
+ ROW(2, 0, 1, 0, 50 , 15 , 0 , 0 , 0 , 0 ), // {xmm, r64|m64|mem}
+ ROW(2, 1, 1, 0, 50 , 65 , 0 , 0 , 0 , 0 ), // #106 {xmm, xmm|m64|mem}
+ ROW(2, 1, 1, 0, 30 , 50 , 0 , 0 , 0 , 0 ), // #107 {m64|mem, xmm}
+ ROW(0, 1, 1, 0, 0 , 0 , 0 , 0 , 0 , 0 ), // #108 {}
+ ROW(1, 1, 1, 0, 66 , 0 , 0 , 0 , 0 , 0 ), // {r16|m16|r32|m32|r64|m64}
+ ROW(2, 1, 1, 0, 27 , 4 , 0 , 0 , 0 , 0 ), // {r16|m16|mem, r16}
+ ROW(2, 1, 1, 0, 28 , 6 , 0 , 0 , 0 , 0 ), // {r32|m32|mem, r32}
+ ROW(2, 1, 1, 0, 15 , 8 , 0 , 0 , 0 , 0 ), // {r64|m64|mem, r64}
+ ROW(3, 1, 1, 0, 50 , 67 , 50 , 0 , 0 , 0 ), // #113 {xmm, vm32x, xmm}
+ ROW(3, 1, 1, 0, 53 , 68 , 53 , 0 , 0 , 0 ), // {ymm, vm32y, ymm}
+ ROW(2, 1, 1, 0, 50 , 67 , 0 , 0 , 0 , 0 ), // {xmm, vm32x}
+ ROW(2, 1, 1, 0, 53 , 68 , 0 , 0 , 0 , 0 ), // {ymm, vm32y}
+ ROW(2, 1, 1, 0, 56 , 69 , 0 , 0 , 0 , 0 ), // {zmm, vm32z}
+ ROW(3, 1, 1, 0, 50 , 70 , 50 , 0 , 0 , 0 ), // #118 {xmm, vm64x, xmm}
+ ROW(3, 1, 1, 0, 53 , 71 , 53 , 0 , 0 , 0 ), // {ymm, vm64y, ymm}
+ ROW(2, 1, 1, 0, 50 , 70 , 0 , 0 , 0 , 0 ), // {xmm, vm64x}
+ ROW(2, 1, 1, 0, 53 , 71 , 0 , 0 , 0 , 0 ), // {ymm, vm64y}
+ ROW(2, 1, 1, 0, 56 , 72 , 0 , 0 , 0 , 0 ), // {zmm, vm64z}
+ ROW(2, 1, 1, 0, 25 , 10 , 0 , 0 , 0 , 0 ), // #123 {r16|m16|r32|m32|r64|m64|mem, i8|u8}
ROW(2, 1, 1, 0, 27 , 4 , 0 , 0 , 0 , 0 ), // {r16|m16|mem, r16}
ROW(2, 1, 1, 0, 28 , 6 , 0 , 0 , 0 , 0 ), // {r32|m32|mem, r32}
ROW(2, 0, 1, 0, 15 , 8 , 0 , 0 , 0 , 0 ), // {r64|m64|mem, r64}
- ROW(3, 1, 1, 1, 1 , 2 , 67 , 0 , 0 , 0 ), // #118 {r8lo|r8hi|m8|mem, r8lo|r8hi, <al>}
+ ROW(2, 1, 1, 2, 73 , 74 , 0 , 0 , 0 , 0 ), // #127 {<ds:[m8|memBase|zsi]>, <es:[m8|memBase|zdi]>}
+ ROW(2, 1, 1, 2, 75 , 76 , 0 , 0 , 0 , 0 ), // {<ds:[m16|memBase|zsi]>, <es:[m16|memBase|zdi]>}
+ ROW(2, 1, 1, 2, 77 , 78 , 0 , 0 , 0 , 0 ), // {<ds:[m32|memBase|zsi]>, <es:[m32|memBase|zdi]>}
+ ROW(2, 0, 1, 2, 79 , 80 , 0 , 0 , 0 , 0 ), // {<ds:[m64|memBase|zsi]>, <es:[m64|memBase|zdi]>}
+ ROW(3, 1, 1, 1, 1 , 2 , 81 , 0 , 0 , 0 ), // #131 {r8lo|r8hi|m8|mem, r8lo|r8hi, <al>}
ROW(3, 1, 1, 1, 27 , 4 , 33 , 0 , 0 , 0 ), // {r16|m16|mem, r16, <ax>}
ROW(3, 1, 1, 1, 28 , 6 , 36 , 0 , 0 , 0 ), // {r32|m32|mem, r32, <eax>}
ROW(3, 0, 1, 1, 15 , 8 , 38 , 0 , 0 , 0 ), // {r64|m64|mem, r64, <rax>}
- ROW(1, 1, 1, 0, 68 , 0 , 0 , 0 , 0 , 0 ), // #122 {r16|m16|r64|m64|mem}
+ ROW(2, 1, 1, 2, 81 , 82 , 0 , 0 , 0 , 0 ), // #135 {<al>, <ds:[m8|memBase|zsi|mem]>}
+ ROW(2, 1, 1, 2, 33 , 83 , 0 , 0 , 0 , 0 ), // {<ax>, <ds:[m16|memBase|zsi|mem]>}
+ ROW(2, 1, 1, 2, 36 , 84 , 0 , 0 , 0 , 0 ), // {<eax>, <ds:[m32|memBase|zsi|mem]>}
+ ROW(2, 0, 1, 2, 38 , 85 , 0 , 0 , 0 , 0 ), // {<rax>, <ds:[m64|memBase|zsi|mem]>}
+ ROW(2, 1, 1, 2, 74 , 73 , 0 , 0 , 0 , 0 ), // #139 {<es:[m8|memBase|zdi]>, <ds:[m8|memBase|zsi]>}
+ ROW(2, 1, 1, 2, 76 , 75 , 0 , 0 , 0 , 0 ), // {<es:[m16|memBase|zdi]>, <ds:[m16|memBase|zsi]>}
+ ROW(2, 1, 1, 2, 78 , 77 , 0 , 0 , 0 , 0 ), // {<es:[m32|memBase|zdi]>, <ds:[m32|memBase|zsi]>}
+ ROW(2, 0, 1, 2, 80 , 79 , 0 , 0 , 0 , 0 ), // {<es:[m64|memBase|zdi]>, <ds:[m64|memBase|zsi]>}
+ ROW(1, 1, 1, 0, 86 , 0 , 0 , 0 , 0 , 0 ), // #143 {r16|m16|r64|m64}
ROW(1, 1, 0, 0, 13 , 0 , 0 , 0 , 0 , 0 ), // {r32|m32}
- ROW(1, 1, 0, 0, 69 , 0 , 0 , 0 , 0 , 0 ), // {ds|es|ss}
- ROW(1, 1, 1, 0, 70 , 0 , 0 , 0 , 0 , 0 ), // {fs|gs}
- ROW(1, 1, 1, 0, 71 , 0 , 0 , 0 , 0 , 0 ), // #126 {r16|m16|r64|m64|mem|i8|i16|i32}
- ROW(1, 1, 0, 0, 72 , 0 , 0 , 0 , 0 , 0 ), // {r32|m32|i32|u32}
- ROW(1, 1, 0, 0, 73 , 0 , 0 , 0 , 0 , 0 ), // {cs|ss|ds|es}
- ROW(1, 1, 1, 0, 70 , 0 , 0 , 0 , 0 , 0 ), // {fs|gs}
- ROW(4, 1, 1, 0, 45 , 45 , 45 , 46 , 0 , 0 ), // #130 {xmm, xmm, xmm, xmm|m128|mem}
- ROW(4, 1, 1, 0, 45 , 45 , 47 , 45 , 0 , 0 ), // {xmm, xmm, m128|mem, xmm}
- ROW(4, 1, 1, 0, 48 , 48 , 48 , 49 , 0 , 0 ), // {ymm, ymm, ymm, ymm|m256|mem}
- ROW(4, 1, 1, 0, 48 , 48 , 50 , 48 , 0 , 0 ), // {ymm, ymm, m256|mem, ymm}
- ROW(3, 1, 1, 0, 45 , 74 , 45 , 0 , 0 , 0 ), // #134 {xmm, vm64x|vm64y, xmm}
- ROW(2, 1, 1, 0, 45 , 64 , 0 , 0 , 0 , 0 ), // {xmm, vm64x}
- ROW(2, 1, 1, 0, 48 , 65 , 0 , 0 , 0 , 0 ), // {ymm, vm64y}
- ROW(2, 1, 1, 0, 51 , 66 , 0 , 0 , 0 , 0 ), // {zmm, vm64z}
- ROW(3, 1, 1, 0, 47 , 45 , 45 , 0 , 0 , 0 ), // #138 {m128|mem, xmm, xmm}
- ROW(3, 1, 1, 0, 50 , 48 , 48 , 0 , 0 , 0 ), // {m256|mem, ymm, ymm}
- ROW(3, 1, 1, 0, 45 , 45 , 47 , 0 , 0 , 0 ), // {xmm, xmm, m128|mem}
- ROW(3, 1, 1, 0, 48 , 48 , 50 , 0 , 0 , 0 ), // {ymm, ymm, m256|mem}
- ROW(5, 1, 1, 0, 45 , 45 , 46 , 45 , 75 , 0 ), // #142 {xmm, xmm, xmm|m128|mem, xmm, i4|u4}
- ROW(5, 1, 1, 0, 45 , 45 , 45 , 47 , 75 , 0 ), // {xmm, xmm, xmm, m128|mem, i4|u4}
- ROW(5, 1, 1, 0, 48 , 48 , 49 , 48 , 75 , 0 ), // {ymm, ymm, ymm|m256|mem, ymm, i4|u4}
- ROW(5, 1, 1, 0, 48 , 48 , 48 , 50 , 75 , 0 ), // {ymm, ymm, ymm, m256|mem, i4|u4}
- ROW(3, 1, 1, 0, 48 , 49 , 10 , 0 , 0 , 0 ), // #146 {ymm, ymm|m256|mem, i8|u8}
- ROW(3, 1, 1, 0, 48 , 48 , 49 , 0 , 0 , 0 ), // {ymm, ymm, ymm|m256|mem}
- ROW(3, 1, 1, 0, 51 , 51 , 56 , 0 , 0 , 0 ), // {zmm, zmm, zmm|m512|mem|i8|u8}
- ROW(3, 1, 1, 0, 51 , 53 , 10 , 0 , 0 , 0 ), // {zmm, m512|mem, i8|u8}
- ROW(2, 1, 1, 0, 4 , 27 , 0 , 0 , 0 , 0 ), // #150 {r16, r16|m16|mem}
- ROW(2, 1, 1, 0, 6 , 28 , 0 , 0 , 0 , 0 ), // #151 {r32, r32|m32|mem}
+ ROW(1, 1, 0, 0, 87 , 0 , 0 , 0 , 0 , 0 ), // {ds|es|ss}
+ ROW(1, 1, 1, 0, 88 , 0 , 0 , 0 , 0 , 0 ), // {fs|gs}
+ ROW(1, 1, 1, 0, 89 , 0 , 0 , 0 , 0 , 0 ), // #147 {r16|m16|r64|m64|i8|i16|i32}
+ ROW(1, 1, 0, 0, 90 , 0 , 0 , 0 , 0 , 0 ), // {r32|m32|i32|u32}
+ ROW(1, 1, 0, 0, 91 , 0 , 0 , 0 , 0 , 0 ), // {cs|ss|ds|es}
+ ROW(1, 1, 1, 0, 88 , 0 , 0 , 0 , 0 , 0 ), // {fs|gs}
+ ROW(2, 1, 1, 2, 81 , 92 , 0 , 0 , 0 , 0 ), // #151 {<al>, <es:[m8|memBase|zdi|mem]>}
+ ROW(2, 1, 1, 2, 33 , 93 , 0 , 0 , 0 , 0 ), // {<ax>, <es:[m16|memBase|zdi|mem]>}
+ ROW(2, 1, 1, 2, 36 , 94 , 0 , 0 , 0 , 0 ), // {<eax>, <es:[m32|memBase|zdi|mem]>}
+ ROW(2, 0, 1, 2, 38 , 95 , 0 , 0 , 0 , 0 ), // {<rax>, <es:[m64|memBase|zdi|mem]>}
+ ROW(2, 1, 1, 2, 92 , 81 , 0 , 0 , 0 , 0 ), // #155 {<es:[m8|memBase|zdi|mem]>, <al>}
+ ROW(2, 1, 1, 2, 93 , 33 , 0 , 0 , 0 , 0 ), // {<es:[m16|memBase|zdi|mem]>, <ax>}
+ ROW(2, 1, 1, 2, 94 , 36 , 0 , 0 , 0 , 0 ), // {<es:[m32|memBase|zdi|mem]>, <eax>}
+ ROW(2, 0, 1, 2, 95 , 38 , 0 , 0 , 0 , 0 ), // {<es:[m64|memBase|zdi|mem]>, <rax>}
+ ROW(4, 1, 1, 0, 50 , 50 , 50 , 51 , 0 , 0 ), // #159 {xmm, xmm, xmm, xmm|m128|mem}
+ ROW(4, 1, 1, 0, 50 , 50 , 52 , 50 , 0 , 0 ), // {xmm, xmm, m128|mem, xmm}
+ ROW(4, 1, 1, 0, 53 , 53 , 53 , 54 , 0 , 0 ), // {ymm, ymm, ymm, ymm|m256|mem}
+ ROW(4, 1, 1, 0, 53 , 53 , 55 , 53 , 0 , 0 ), // {ymm, ymm, m256|mem, ymm}
+ ROW(3, 1, 1, 0, 50 , 67 , 50 , 0 , 0 , 0 ), // #163 {xmm, vm32x, xmm}
+ ROW(3, 1, 1, 0, 53 , 67 , 53 , 0 , 0 , 0 ), // {ymm, vm32x, ymm}
+ ROW(2, 1, 1, 0, 96 , 67 , 0 , 0 , 0 , 0 ), // {xmm|ymm, vm32x}
+ ROW(2, 1, 1, 0, 56 , 68 , 0 , 0 , 0 , 0 ), // {zmm, vm32y}
+ ROW(3, 1, 1, 0, 52 , 50 , 50 , 0 , 0 , 0 ), // #167 {m128|mem, xmm, xmm}
+ ROW(3, 1, 1, 0, 55 , 53 , 53 , 0 , 0 , 0 ), // {m256|mem, ymm, ymm}
+ ROW(3, 1, 1, 0, 50 , 50 , 52 , 0 , 0 , 0 ), // {xmm, xmm, m128|mem}
+ ROW(3, 1, 1, 0, 53 , 53 , 55 , 0 , 0 , 0 ), // {ymm, ymm, m256|mem}
+ ROW(5, 1, 1, 0, 50 , 50 , 51 , 50 , 97 , 0 ), // #171 {xmm, xmm, xmm|m128|mem, xmm, i4|u4}
+ ROW(5, 1, 1, 0, 50 , 50 , 50 , 52 , 97 , 0 ), // {xmm, xmm, xmm, m128|mem, i4|u4}
+ ROW(5, 1, 1, 0, 53 , 53 , 54 , 53 , 97 , 0 ), // {ymm, ymm, ymm|m256|mem, ymm, i4|u4}
+ ROW(5, 1, 1, 0, 53 , 53 , 53 , 55 , 97 , 0 ), // {ymm, ymm, ymm, m256|mem, i4|u4}
+ ROW(3, 1, 1, 0, 53 , 54 , 10 , 0 , 0 , 0 ), // #175 {ymm, ymm|m256|mem, i8|u8}
+ ROW(3, 1, 1, 0, 53 , 53 , 54 , 0 , 0 , 0 ), // {ymm, ymm, ymm|m256|mem}
+ ROW(3, 1, 1, 0, 56 , 56 , 61 , 0 , 0 , 0 ), // {zmm, zmm, zmm|m512|mem|i8|u8}
+ ROW(3, 1, 1, 0, 56 , 58 , 10 , 0 , 0 , 0 ), // {zmm, m512|mem, i8|u8}
+ ROW(2, 1, 1, 0, 4 , 27 , 0 , 0 , 0 , 0 ), // #179 {r16, r16|m16|mem}
+ ROW(2, 1, 1, 0, 6 , 28 , 0 , 0 , 0 , 0 ), // #180 {r32, r32|m32|mem}
ROW(2, 0, 1, 0, 8 , 15 , 0 , 0 , 0 , 0 ), // {r64, r64|m64|mem}
- ROW(1, 1, 1, 0, 76 , 0 , 0 , 0 , 0 , 0 ), // #153 {m32|m64}
- ROW(2, 1, 1, 0, 77 , 78 , 0 , 0 , 0 , 0 ), // {st0, st}
- ROW(2, 1, 1, 0, 78 , 77 , 0 , 0 , 0 , 0 ), // {st, st0}
- ROW(2, 1, 1, 0, 4 , 29 , 0 , 0 , 0 , 0 ), // #156 {r16, m32|mem}
- ROW(2, 1, 1, 0, 6 , 79 , 0 , 0 , 0 , 0 ), // {r32, m48|mem}
- ROW(2, 0, 1, 0, 8 , 80 , 0 , 0 , 0 , 0 ), // {r64, m80|mem}
- ROW(3, 1, 1, 0, 27 , 4 , 81 , 0 , 0 , 0 ), // #159 {r16|m16|mem, r16, cl|i8|u8}
- ROW(3, 1, 1, 0, 28 , 6 , 81 , 0 , 0 , 0 ), // {r32|m32|mem, r32, cl|i8|u8}
- ROW(3, 0, 1, 0, 15 , 8 , 81 , 0 , 0 , 0 ), // {r64|m64|mem, r64, cl|i8|u8}
- ROW(3, 1, 1, 0, 45 , 45 , 46 , 0 , 0 , 0 ), // #162 {xmm, xmm, xmm|m128|mem}
- ROW(3, 1, 1, 0, 48 , 48 , 49 , 0 , 0 , 0 ), // #163 {ymm, ymm, ymm|m256|mem}
- ROW(3, 1, 1, 0, 51 , 51 , 52 , 0 , 0 , 0 ), // {zmm, zmm, zmm|m512|mem}
- ROW(4, 1, 1, 0, 45 , 45 , 46 , 10 , 0 , 0 ), // #165 {xmm, xmm, xmm|m128|mem, i8|u8}
- ROW(4, 1, 1, 0, 48 , 48 , 49 , 10 , 0 , 0 ), // #166 {ymm, ymm, ymm|m256|mem, i8|u8}
- ROW(4, 1, 1, 0, 51 , 51 , 52 , 10 , 0 , 0 ), // {zmm, zmm, zmm|m512|mem, i8|u8}
- ROW(4, 1, 1, 0, 82 , 45 , 46 , 10 , 0 , 0 ), // #168 {xmm|k, xmm, xmm|m128|mem, i8|u8}
- ROW(4, 1, 1, 0, 83 , 48 , 49 , 10 , 0 , 0 ), // {ymm|k, ymm, ymm|m256|mem, i8|u8}
- ROW(4, 1, 1, 0, 84 , 51 , 52 , 10 , 0 , 0 ), // {k, zmm, zmm|m512|mem, i8|u8}
- ROW(2, 1, 1, 0, 46 , 45 , 0 , 0 , 0 , 0 ), // #171 {xmm|m128|mem, xmm}
- ROW(2, 1, 1, 0, 49 , 48 , 0 , 0 , 0 , 0 ), // {ymm|m256|mem, ymm}
- ROW(2, 1, 1, 0, 52 , 51 , 0 , 0 , 0 , 0 ), // {zmm|m512|mem, zmm}
- ROW(2, 1, 1, 0, 45 , 60 , 0 , 0 , 0 , 0 ), // #174 {xmm, xmm|m64|mem}
- ROW(2, 1, 1, 0, 48 , 46 , 0 , 0 , 0 , 0 ), // {ymm, xmm|m128|mem}
- ROW(2, 1, 1, 0, 51 , 49 , 0 , 0 , 0 , 0 ), // {zmm, ymm|m256|mem}
- ROW(2, 1, 1, 0, 45 , 46 , 0 , 0 , 0 , 0 ), // #177 {xmm, xmm|m128|mem}
- ROW(2, 1, 1, 0, 48 , 49 , 0 , 0 , 0 , 0 ), // {ymm, ymm|m256|mem}
- ROW(2, 1, 1, 0, 51 , 52 , 0 , 0 , 0 , 0 ), // {zmm, zmm|m512|mem}
- ROW(3, 1, 1, 0, 60 , 45 , 10 , 0 , 0 , 0 ), // #180 {xmm|m64|mem, xmm, i8|u8}
- ROW(3, 1, 1, 0, 46 , 48 , 10 , 0 , 0 , 0 ), // #181 {xmm|m128|mem, ymm, i8|u8}
- ROW(3, 1, 1, 0, 49 , 51 , 10 , 0 , 0 , 0 ), // #182 {ymm|m256|mem, zmm, i8|u8}
- ROW(3, 1, 1, 0, 45 , 46 , 10 , 0 , 0 , 0 ), // #183 {xmm, xmm|m128|mem, i8|u8}
- ROW(3, 1, 1, 0, 48 , 49 , 10 , 0 , 0 , 0 ), // {ymm, ymm|m256|mem, i8|u8}
- ROW(3, 1, 1, 0, 51 , 52 , 10 , 0 , 0 , 0 ), // {zmm, zmm|m512|mem, i8|u8}
- ROW(2, 1, 1, 0, 45 , 60 , 0 , 0 , 0 , 0 ), // #186 {xmm, xmm|m64|mem}
- ROW(2, 1, 1, 0, 48 , 49 , 0 , 0 , 0 , 0 ), // {ymm, ymm|m256|mem}
- ROW(2, 1, 1, 0, 51 , 52 , 0 , 0 , 0 , 0 ), // {zmm, zmm|m512|mem}
- ROW(2, 1, 1, 0, 47 , 45 , 0 , 0 , 0 , 0 ), // #189 {m128|mem, xmm}
- ROW(2, 1, 1, 0, 50 , 48 , 0 , 0 , 0 , 0 ), // {m256|mem, ymm}
- ROW(2, 1, 1, 0, 53 , 51 , 0 , 0 , 0 , 0 ), // {m512|mem, zmm}
- ROW(2, 1, 1, 0, 45 , 47 , 0 , 0 , 0 , 0 ), // #192 {xmm, m128|mem}
- ROW(2, 1, 1, 0, 48 , 50 , 0 , 0 , 0 , 0 ), // {ymm, m256|mem}
- ROW(2, 1, 1, 0, 51 , 53 , 0 , 0 , 0 , 0 ), // {zmm, m512|mem}
- ROW(2, 0, 1, 0, 15 , 45 , 0 , 0 , 0 , 0 ), // #195 {r64|m64|mem, xmm}
- ROW(2, 1, 1, 0, 45 , 85 , 0 , 0 , 0 , 0 ), // {xmm, xmm|m64|mem|r64}
- ROW(2, 1, 1, 0, 30 , 45 , 0 , 0 , 0 , 0 ), // {m64|mem, xmm}
- ROW(2, 1, 1, 0, 30 , 45 , 0 , 0 , 0 , 0 ), // #198 {m64|mem, xmm}
- ROW(2, 1, 1, 0, 45 , 30 , 0 , 0 , 0 , 0 ), // {xmm, m64|mem}
- ROW(3, 1, 1, 0, 45 , 45 , 45 , 0 , 0 , 0 ), // #200 {xmm, xmm, xmm}
- ROW(2, 1, 1, 0, 29 , 45 , 0 , 0 , 0 , 0 ), // #201 {m32|mem, xmm}
- ROW(2, 1, 1, 0, 45 , 29 , 0 , 0 , 0 , 0 ), // {xmm, m32|mem}
- ROW(3, 1, 1, 0, 45 , 45 , 45 , 0 , 0 , 0 ), // {xmm, xmm, xmm}
- ROW(2, 1, 1, 0, 86 , 85 , 0 , 0 , 0 , 0 ), // #204 {xmm|ymm, xmm|m64|mem|r64}
- ROW(2, 0, 1, 0, 51 , 8 , 0 , 0 , 0 , 0 ), // {zmm, r64}
- ROW(2, 1, 1, 0, 51 , 60 , 0 , 0 , 0 , 0 ), // {zmm, xmm|m64|mem}
- ROW(4, 1, 1, 0, 84 , 45 , 46 , 10 , 0 , 0 ), // #207 {k, xmm, xmm|m128|mem, i8|u8}
- ROW(4, 1, 1, 0, 84 , 48 , 49 , 10 , 0 , 0 ), // {k, ymm, ymm|m256|mem, i8|u8}
- ROW(4, 1, 1, 0, 84 , 51 , 52 , 10 , 0 , 0 ), // {k, zmm, zmm|m512|mem, i8|u8}
- ROW(3, 1, 1, 0, 82 , 45 , 46 , 0 , 0 , 0 ), // #210 {xmm|k, xmm, xmm|m128|mem}
- ROW(3, 1, 1, 0, 83 , 48 , 49 , 0 , 0 , 0 ), // {ymm|k, ymm, ymm|m256|mem}
- ROW(3, 1, 1, 0, 84 , 51 , 52 , 0 , 0 , 0 ), // {k, zmm, zmm|m512|mem}
- ROW(2, 1, 1, 0, 87 , 45 , 0 , 0 , 0 , 0 ), // #213 {xmm|m32|mem, xmm}
- ROW(2, 1, 1, 0, 60 , 48 , 0 , 0 , 0 , 0 ), // {xmm|m64|mem, ymm}
- ROW(2, 1, 1, 0, 46 , 51 , 0 , 0 , 0 , 0 ), // {xmm|m128|mem, zmm}
- ROW(2, 1, 1, 0, 60 , 45 , 0 , 0 , 0 , 0 ), // #216 {xmm|m64|mem, xmm}
- ROW(2, 1, 1, 0, 46 , 48 , 0 , 0 , 0 , 0 ), // {xmm|m128|mem, ymm}
- ROW(2, 1, 1, 0, 49 , 51 , 0 , 0 , 0 , 0 ), // {ymm|m256|mem, zmm}
- ROW(2, 1, 1, 0, 88 , 45 , 0 , 0 , 0 , 0 ), // #219 {xmm|m16|mem, xmm}
- ROW(2, 1, 1, 0, 87 , 48 , 0 , 0 , 0 , 0 ), // {xmm|m32|mem, ymm}
- ROW(2, 1, 1, 0, 60 , 51 , 0 , 0 , 0 , 0 ), // {xmm|m64|mem, zmm}
- ROW(2, 1, 1, 0, 45 , 87 , 0 , 0 , 0 , 0 ), // #222 {xmm, xmm|m32|mem}
- ROW(2, 1, 1, 0, 48 , 60 , 0 , 0 , 0 , 0 ), // {ymm, xmm|m64|mem}
- ROW(2, 1, 1, 0, 51 , 46 , 0 , 0 , 0 , 0 ), // {zmm, xmm|m128|mem}
- ROW(2, 1, 1, 0, 45 , 88 , 0 , 0 , 0 , 0 ), // #225 {xmm, xmm|m16|mem}
- ROW(2, 1, 1, 0, 48 , 87 , 0 , 0 , 0 , 0 ), // {ymm, xmm|m32|mem}
- ROW(2, 1, 1, 0, 51 , 60 , 0 , 0 , 0 , 0 ), // {zmm, xmm|m64|mem}
- ROW(2, 1, 1, 0, 61 , 45 , 0 , 0 , 0 , 0 ), // #228 {vm32x, xmm}
- ROW(2, 1, 1, 0, 62 , 48 , 0 , 0 , 0 , 0 ), // {vm32y, ymm}
- ROW(2, 1, 1, 0, 63 , 51 , 0 , 0 , 0 , 0 ), // {vm32z, zmm}
- ROW(2, 1, 1, 0, 64 , 45 , 0 , 0 , 0 , 0 ), // #231 {vm64x, xmm}
- ROW(2, 1, 1, 0, 65 , 48 , 0 , 0 , 0 , 0 ), // {vm64y, ymm}
- ROW(2, 1, 1, 0, 66 , 51 , 0 , 0 , 0 , 0 ), // {vm64z, zmm}
- ROW(3, 1, 1, 0, 84 , 45 , 46 , 0 , 0 , 0 ), // #234 {k, xmm, xmm|m128|mem}
- ROW(3, 1, 1, 0, 84 , 48 , 49 , 0 , 0 , 0 ), // {k, ymm, ymm|m256|mem}
- ROW(3, 1, 1, 0, 84 , 51 , 52 , 0 , 0 , 0 ), // {k, zmm, zmm|m512|mem}
- ROW(3, 1, 1, 0, 6 , 6 , 28 , 0 , 0 , 0 ), // #237 {r32, r32, r32|m32|mem}
+ ROW(1, 1, 1, 0, 98 , 0 , 0 , 0 , 0 , 0 ), // #182 {m32|m64}
+ ROW(2, 1, 1, 0, 99 , 100, 0 , 0 , 0 , 0 ), // {st0, st}
+ ROW(2, 1, 1, 0, 100, 99 , 0 , 0 , 0 , 0 ), // {st, st0}
+ ROW(2, 1, 1, 0, 4 , 29 , 0 , 0 , 0 , 0 ), // #185 {r16, m32|mem}
+ ROW(2, 1, 1, 0, 6 , 101, 0 , 0 , 0 , 0 ), // {r32, m48|mem}
+ ROW(2, 0, 1, 0, 8 , 102, 0 , 0 , 0 , 0 ), // {r64, m80|mem}
+ ROW(3, 1, 1, 0, 27 , 4 , 103, 0 , 0 , 0 ), // #188 {r16|m16|mem, r16, cl|i8|u8}
+ ROW(3, 1, 1, 0, 28 , 6 , 103, 0 , 0 , 0 ), // {r32|m32|mem, r32, cl|i8|u8}
+ ROW(3, 0, 1, 0, 15 , 8 , 103, 0 , 0 , 0 ), // {r64|m64|mem, r64, cl|i8|u8}
+ ROW(3, 1, 1, 0, 50 , 50 , 51 , 0 , 0 , 0 ), // #191 {xmm, xmm, xmm|m128|mem}
+ ROW(3, 1, 1, 0, 53 , 53 , 54 , 0 , 0 , 0 ), // #192 {ymm, ymm, ymm|m256|mem}
+ ROW(3, 1, 1, 0, 56 , 56 , 57 , 0 , 0 , 0 ), // {zmm, zmm, zmm|m512|mem}
+ ROW(4, 1, 1, 0, 50 , 50 , 51 , 10 , 0 , 0 ), // #194 {xmm, xmm, xmm|m128|mem, i8|u8}
+ ROW(4, 1, 1, 0, 53 , 53 , 54 , 10 , 0 , 0 ), // #195 {ymm, ymm, ymm|m256|mem, i8|u8}
+ ROW(4, 1, 1, 0, 56 , 56 , 57 , 10 , 0 , 0 ), // {zmm, zmm, zmm|m512|mem, i8|u8}
+ ROW(4, 1, 1, 0, 104, 50 , 51 , 10 , 0 , 0 ), // #197 {xmm|k, xmm, xmm|m128|mem, i8|u8}
+ ROW(4, 1, 1, 0, 105, 53 , 54 , 10 , 0 , 0 ), // {ymm|k, ymm, ymm|m256|mem, i8|u8}
+ ROW(4, 1, 1, 0, 106, 56 , 57 , 10 , 0 , 0 ), // {k, zmm, zmm|m512|mem, i8|u8}
+ ROW(4, 1, 1, 0, 106, 50 , 51 , 10 , 0 , 0 ), // #200 {k, xmm, xmm|m128|mem, i8|u8}
+ ROW(4, 1, 1, 0, 106, 53 , 54 , 10 , 0 , 0 ), // {k, ymm, ymm|m256|mem, i8|u8}
+ ROW(4, 1, 1, 0, 106, 56 , 57 , 10 , 0 , 0 ), // {k, zmm, zmm|m512|mem, i8|u8}
+ ROW(2, 1, 1, 0, 51 , 50 , 0 , 0 , 0 , 0 ), // #203 {xmm|m128|mem, xmm}
+ ROW(2, 1, 1, 0, 54 , 53 , 0 , 0 , 0 , 0 ), // {ymm|m256|mem, ymm}
+ ROW(2, 1, 1, 0, 57 , 56 , 0 , 0 , 0 , 0 ), // {zmm|m512|mem, zmm}
+ ROW(2, 1, 1, 0, 50 , 65 , 0 , 0 , 0 , 0 ), // #206 {xmm, xmm|m64|mem}
+ ROW(2, 1, 1, 0, 53 , 51 , 0 , 0 , 0 , 0 ), // {ymm, xmm|m128|mem}
+ ROW(2, 1, 1, 0, 56 , 54 , 0 , 0 , 0 , 0 ), // {zmm, ymm|m256|mem}
+ ROW(2, 1, 1, 0, 50 , 51 , 0 , 0 , 0 , 0 ), // #209 {xmm, xmm|m128|mem}
+ ROW(2, 1, 1, 0, 53 , 54 , 0 , 0 , 0 , 0 ), // {ymm, ymm|m256|mem}
+ ROW(2, 1, 1, 0, 56 , 57 , 0 , 0 , 0 , 0 ), // {zmm, zmm|m512|mem}
+ ROW(2, 1, 1, 0, 50 , 107, 0 , 0 , 0 , 0 ), // #212 {xmm, xmm|m32|mem}
+ ROW(2, 1, 1, 0, 53 , 65 , 0 , 0 , 0 , 0 ), // {ymm, xmm|m64|mem}
+ ROW(2, 1, 1, 0, 56 , 51 , 0 , 0 , 0 , 0 ), // {zmm, xmm|m128|mem}
+ ROW(3, 1, 1, 0, 65 , 50 , 10 , 0 , 0 , 0 ), // #215 {xmm|m64|mem, xmm, i8|u8}
+ ROW(3, 1, 1, 0, 51 , 53 , 10 , 0 , 0 , 0 ), // #216 {xmm|m128|mem, ymm, i8|u8}
+ ROW(3, 1, 1, 0, 54 , 56 , 10 , 0 , 0 , 0 ), // #217 {ymm|m256|mem, zmm, i8|u8}
+ ROW(3, 1, 1, 0, 50 , 108, 50 , 0 , 0 , 0 ), // #218 {xmm, vm64x|vm64y, xmm}
+ ROW(2, 1, 1, 0, 50 , 108, 0 , 0 , 0 , 0 ), // {xmm, vm64x|vm64y}
+ ROW(2, 1, 1, 0, 53 , 72 , 0 , 0 , 0 , 0 ), // {ymm, vm64z}
+ ROW(3, 1, 1, 0, 50 , 51 , 10 , 0 , 0 , 0 ), // #221 {xmm, xmm|m128|mem, i8|u8}
+ ROW(3, 1, 1, 0, 53 , 54 , 10 , 0 , 0 , 0 ), // {ymm, ymm|m256|mem, i8|u8}
+ ROW(3, 1, 1, 0, 56 , 57 , 10 , 0 , 0 , 0 ), // {zmm, zmm|m512|mem, i8|u8}
+ ROW(2, 1, 1, 0, 50 , 65 , 0 , 0 , 0 , 0 ), // #224 {xmm, xmm|m64|mem}
+ ROW(2, 1, 1, 0, 53 , 54 , 0 , 0 , 0 , 0 ), // {ymm, ymm|m256|mem}
+ ROW(2, 1, 1, 0, 56 , 57 , 0 , 0 , 0 , 0 ), // {zmm, zmm|m512|mem}
+ ROW(2, 1, 1, 0, 52 , 50 , 0 , 0 , 0 , 0 ), // #227 {m128|mem, xmm}
+ ROW(2, 1, 1, 0, 55 , 53 , 0 , 0 , 0 , 0 ), // {m256|mem, ymm}
+ ROW(2, 1, 1, 0, 58 , 56 , 0 , 0 , 0 , 0 ), // {m512|mem, zmm}
+ ROW(2, 1, 1, 0, 50 , 52 , 0 , 0 , 0 , 0 ), // #230 {xmm, m128|mem}
+ ROW(2, 1, 1, 0, 53 , 55 , 0 , 0 , 0 , 0 ), // {ymm, m256|mem}
+ ROW(2, 1, 1, 0, 56 , 58 , 0 , 0 , 0 , 0 ), // {zmm, m512|mem}
+ ROW(2, 0, 1, 0, 15 , 50 , 0 , 0 , 0 , 0 ), // #233 {r64|m64|mem, xmm}
+ ROW(2, 1, 1, 0, 50 , 109, 0 , 0 , 0 , 0 ), // {xmm, xmm|m64|mem|r64}
+ ROW(2, 1, 1, 0, 30 , 50 , 0 , 0 , 0 , 0 ), // {m64|mem, xmm}
+ ROW(2, 1, 1, 0, 30 , 50 , 0 , 0 , 0 , 0 ), // #236 {m64|mem, xmm}
+ ROW(2, 1, 1, 0, 50 , 30 , 0 , 0 , 0 , 0 ), // {xmm, m64|mem}
+ ROW(3, 1, 1, 0, 50 , 50 , 50 , 0 , 0 , 0 ), // #238 {xmm, xmm, xmm}
+ ROW(2, 1, 1, 0, 21 , 50 , 0 , 0 , 0 , 0 ), // #239 {m16|mem, xmm}
+ ROW(2, 1, 1, 0, 50 , 21 , 0 , 0 , 0 , 0 ), // {xmm, m16|mem}
+ ROW(3, 1, 1, 0, 50 , 50 , 50 , 0 , 0 , 0 ), // {xmm, xmm, xmm}
+ ROW(2, 1, 1, 0, 29 , 50 , 0 , 0 , 0 , 0 ), // #242 {m32|mem, xmm}
+ ROW(2, 1, 1, 0, 50 , 29 , 0 , 0 , 0 , 0 ), // {xmm, m32|mem}
+ ROW(3, 1, 1, 0, 50 , 50 , 50 , 0 , 0 , 0 ), // {xmm, xmm, xmm}
+ ROW(4, 1, 1, 0, 106, 106, 50 , 51 , 0 , 0 ), // #245 {k, k, xmm, xmm|m128|mem}
+ ROW(4, 1, 1, 0, 106, 106, 53 , 54 , 0 , 0 ), // {k, k, ymm, ymm|m256|mem}
+ ROW(4, 1, 1, 0, 106, 106, 56 , 57 , 0 , 0 ), // {k, k, zmm, zmm|m512|mem}
+ ROW(2, 1, 1, 0, 96 , 109, 0 , 0 , 0 , 0 ), // #248 {xmm|ymm, xmm|m64|mem|r64}
+ ROW(2, 0, 1, 0, 56 , 8 , 0 , 0 , 0 , 0 ), // {zmm, r64}
+ ROW(2, 1, 1, 0, 56 , 65 , 0 , 0 , 0 , 0 ), // {zmm, xmm|m64|mem}
+ ROW(3, 1, 1, 0, 104, 50 , 51 , 0 , 0 , 0 ), // #251 {xmm|k, xmm, xmm|m128|mem}
+ ROW(3, 1, 1, 0, 105, 53 , 54 , 0 , 0 , 0 ), // {ymm|k, ymm, ymm|m256|mem}
+ ROW(3, 1, 1, 0, 106, 56 , 57 , 0 , 0 , 0 ), // {k, zmm, zmm|m512|mem}
+ ROW(2, 1, 1, 0, 107, 50 , 0 , 0 , 0 , 0 ), // #254 {xmm|m32|mem, xmm}
+ ROW(2, 1, 1, 0, 65 , 53 , 0 , 0 , 0 , 0 ), // {xmm|m64|mem, ymm}
+ ROW(2, 1, 1, 0, 51 , 56 , 0 , 0 , 0 , 0 ), // {xmm|m128|mem, zmm}
+ ROW(2, 1, 1, 0, 65 , 50 , 0 , 0 , 0 , 0 ), // #257 {xmm|m64|mem, xmm}
+ ROW(2, 1, 1, 0, 51 , 53 , 0 , 0 , 0 , 0 ), // {xmm|m128|mem, ymm}
+ ROW(2, 1, 1, 0, 54 , 56 , 0 , 0 , 0 , 0 ), // {ymm|m256|mem, zmm}
+ ROW(2, 1, 1, 0, 110, 50 , 0 , 0 , 0 , 0 ), // #260 {xmm|m16|mem, xmm}
+ ROW(2, 1, 1, 0, 107, 53 , 0 , 0 , 0 , 0 ), // {xmm|m32|mem, ymm}
+ ROW(2, 1, 1, 0, 65 , 56 , 0 , 0 , 0 , 0 ), // {xmm|m64|mem, zmm}
+ ROW(2, 1, 1, 0, 50 , 110, 0 , 0 , 0 , 0 ), // #263 {xmm, xmm|m16|mem}
+ ROW(2, 1, 1, 0, 53 , 107, 0 , 0 , 0 , 0 ), // {ymm, xmm|m32|mem}
+ ROW(2, 1, 1, 0, 56 , 65 , 0 , 0 , 0 , 0 ), // {zmm, xmm|m64|mem}
+ ROW(2, 1, 1, 0, 67 , 50 , 0 , 0 , 0 , 0 ), // #266 {vm32x, xmm}
+ ROW(2, 1, 1, 0, 68 , 53 , 0 , 0 , 0 , 0 ), // {vm32y, ymm}
+ ROW(2, 1, 1, 0, 69 , 56 , 0 , 0 , 0 , 0 ), // {vm32z, zmm}
+ ROW(2, 1, 1, 0, 70 , 50 , 0 , 0 , 0 , 0 ), // #269 {vm64x, xmm}
+ ROW(2, 1, 1, 0, 71 , 53 , 0 , 0 , 0 , 0 ), // {vm64y, ymm}
+ ROW(2, 1, 1, 0, 72 , 56 , 0 , 0 , 0 , 0 ), // {vm64z, zmm}
+ ROW(3, 1, 1, 0, 106, 50 , 51 , 0 , 0 , 0 ), // #272 {k, xmm, xmm|m128|mem}
+ ROW(3, 1, 1, 0, 106, 53 , 54 , 0 , 0 , 0 ), // {k, ymm, ymm|m256|mem}
+ ROW(3, 1, 1, 0, 106, 56 , 57 , 0 , 0 , 0 ), // {k, zmm, zmm|m512|mem}
+ ROW(3, 1, 1, 0, 6 , 6 , 28 , 0 , 0 , 0 ), // #275 {r32, r32, r32|m32|mem}
ROW(3, 0, 1, 0, 8 , 8 , 15 , 0 , 0 , 0 ), // {r64, r64, r64|m64|mem}
- ROW(3, 1, 1, 0, 6 , 28 , 6 , 0 , 0 , 0 ), // #239 {r32, r32|m32|mem, r32}
+ ROW(3, 1, 1, 0, 6 , 28 , 6 , 0 , 0 , 0 ), // #277 {r32, r32|m32|mem, r32}
ROW(3, 0, 1, 0, 8 , 15 , 8 , 0 , 0 , 0 ), // {r64, r64|m64|mem, r64}
- ROW(2, 1, 0, 0, 89 , 28 , 0 , 0 , 0 , 0 ), // #241 {bnd, r32|m32|mem}
- ROW(2, 0, 1, 0, 89 , 15 , 0 , 0 , 0 , 0 ), // {bnd, r64|m64|mem}
- ROW(2, 1, 1, 0, 89 , 90 , 0 , 0 , 0 , 0 ), // #243 {bnd, bnd|mem}
- ROW(2, 1, 1, 0, 91 , 89 , 0 , 0 , 0 , 0 ), // {mem, bnd}
- ROW(2, 1, 0, 0, 4 , 29 , 0 , 0 , 0 , 0 ), // #245 {r16, m32|mem}
- ROW(2, 1, 0, 0, 6 , 30 , 0 , 0 , 0 , 0 ), // {r32, m64|mem}
- ROW(1, 1, 0, 0, 92 , 0 , 0 , 0 , 0 , 0 ), // #247 {rel16|r16|m16|r32|m32}
- ROW(1, 1, 1, 0, 93 , 0 , 0 , 0 , 0 , 0 ), // {rel32|r64|m64|mem}
- ROW(2, 1, 1, 0, 6 , 94 , 0 , 0 , 0 , 0 ), // #249 {r32, r8lo|r8hi|m8|r16|m16|r32|m32}
- ROW(2, 0, 1, 0, 8 , 95 , 0 , 0 , 0 , 0 ), // {r64, r8lo|r8hi|m8|r64|m64}
- ROW(1, 1, 0, 0, 96 , 0 , 0 , 0 , 0 , 0 ), // #251 {r16|r32}
- ROW(1, 1, 1, 0, 31 , 0 , 0 , 0 , 0 , 0 ), // #252 {r8lo|r8hi|m8|r16|m16|r32|m32|r64|m64|mem}
- ROW(2, 1, 0, 0, 97 , 53 , 0 , 0 , 0 , 0 ), // #253 {es:[memBase], m512|mem}
- ROW(2, 0, 1, 0, 97 , 53 , 0 , 0 , 0 , 0 ), // {es:[memBase], m512|mem}
- ROW(3, 1, 1, 0, 45 , 10 , 10 , 0 , 0 , 0 ), // #255 {xmm, i8|u8, i8|u8}
- ROW(2, 1, 1, 0, 45 , 45 , 0 , 0 , 0 , 0 ), // #256 {xmm, xmm}
- ROW(0, 1, 1, 0, 0 , 0 , 0 , 0 , 0 , 0 ), // #257 {}
- ROW(1, 1, 1, 0, 78 , 0 , 0 , 0 , 0 , 0 ), // #258 {st}
- ROW(0, 1, 1, 0, 0 , 0 , 0 , 0 , 0 , 0 ), // #259 {}
- ROW(1, 1, 1, 0, 98 , 0 , 0 , 0 , 0 , 0 ), // #260 {m32|m64|st}
- ROW(2, 1, 1, 0, 45 , 45 , 0 , 0 , 0 , 0 ), // #261 {xmm, xmm}
- ROW(4, 1, 1, 0, 45 , 45 , 10 , 10 , 0 , 0 ), // {xmm, xmm, i8|u8, i8|u8}
- ROW(2, 1, 0, 0, 6 , 47 , 0 , 0 , 0 , 0 ), // #263 {r32, m128|mem}
- ROW(2, 0, 1, 0, 8 , 47 , 0 , 0 , 0 , 0 ), // {r64, m128|mem}
- ROW(2, 1, 0, 2, 36 , 99 , 0 , 0 , 0 , 0 ), // #265 {<eax>, <ecx>}
- ROW(2, 0, 1, 2, 100, 99 , 0 , 0 , 0 , 0 ), // {<eax|rax>, <ecx>}
- ROW(1, 1, 1, 0, 101, 0 , 0 , 0 , 0 , 0 ), // #267 {rel8|rel32}
- ROW(1, 1, 0, 0, 102, 0 , 0 , 0 , 0 , 0 ), // {rel16}
- ROW(2, 1, 0, 1, 103, 104, 0 , 0 , 0 , 0 ), // #269 {<cx|ecx>, rel8}
- ROW(2, 0, 1, 1, 105, 104, 0 , 0 , 0 , 0 ), // {<ecx|rcx>, rel8}
- ROW(1, 1, 1, 0, 106, 0 , 0 , 0 , 0 , 0 ), // #271 {rel8|rel32|r64|m64|mem}
- ROW(1, 1, 0, 0, 107, 0 , 0 , 0 , 0 , 0 ), // {rel16|r32|m32|mem}
- ROW(2, 1, 1, 0, 84 , 108, 0 , 0 , 0 , 0 ), // #273 {k, k|m8|mem|r32|r8lo|r8hi|r16}
- ROW(2, 1, 1, 0, 109, 84 , 0 , 0 , 0 , 0 ), // {m8|mem|r32|r8lo|r8hi|r16, k}
- ROW(2, 1, 1, 0, 84 , 110, 0 , 0 , 0 , 0 ), // #275 {k, k|m32|mem|r32}
- ROW(2, 1, 1, 0, 28 , 84 , 0 , 0 , 0 , 0 ), // {m32|mem|r32, k}
- ROW(2, 1, 1, 0, 84 , 111, 0 , 0 , 0 , 0 ), // #277 {k, k|m64|mem|r64}
- ROW(2, 1, 1, 0, 15 , 84 , 0 , 0 , 0 , 0 ), // {m64|mem|r64, k}
- ROW(2, 1, 1, 0, 84 , 112, 0 , 0 , 0 , 0 ), // #279 {k, k|m16|mem|r32|r16}
- ROW(2, 1, 1, 0, 113, 84 , 0 , 0 , 0 , 0 ), // {m16|mem|r32|r16, k}
- ROW(2, 1, 1, 0, 4 , 27 , 0 , 0 , 0 , 0 ), // #281 {r16, r16|m16|mem}
- ROW(2, 1, 1, 0, 6 , 113, 0 , 0 , 0 , 0 ), // {r32, r32|m16|mem|r16}
+ ROW(2, 1, 0, 0, 111, 28 , 0 , 0 , 0 , 0 ), // #279 {bnd, r32|m32|mem}
+ ROW(2, 0, 1, 0, 111, 15 , 0 , 0 , 0 , 0 ), // {bnd, r64|m64|mem}
+ ROW(2, 1, 1, 0, 111, 112, 0 , 0 , 0 , 0 ), // #281 {bnd, bnd|mem}
+ ROW(2, 1, 1, 0, 113, 111, 0 , 0 , 0 , 0 ), // {mem, bnd}
ROW(2, 1, 0, 0, 4 , 29 , 0 , 0 , 0 , 0 ), // #283 {r16, m32|mem}
- ROW(2, 1, 0, 0, 6 , 79 , 0 , 0 , 0 , 0 ), // {r32, m48|mem}
- ROW(2, 1, 1, 0, 4 , 27 , 0 , 0 , 0 , 0 ), // #285 {r16, r16|m16|mem}
- ROW(2, 1, 1, 0, 114, 113, 0 , 0 , 0 , 0 ), // {r32|r64, r32|m16|mem|r16}
- ROW(2, 1, 1, 0, 59 , 28 , 0 , 0 , 0 , 0 ), // #287 {mm|xmm, r32|m32|mem}
- ROW(2, 1, 1, 0, 28 , 59 , 0 , 0 , 0 , 0 ), // {r32|m32|mem, mm|xmm}
- ROW(2, 1, 1, 0, 45 , 87 , 0 , 0 , 0 , 0 ), // #289 {xmm, xmm|m32|mem}
- ROW(2, 1, 1, 0, 29 , 45 , 0 , 0 , 0 , 0 ), // {m32|mem, xmm}
- ROW(2, 1, 1, 0, 4 , 9 , 0 , 0 , 0 , 0 ), // #291 {r16, r8lo|r8hi|m8}
- ROW(2, 1, 1, 0, 114, 115, 0 , 0 , 0 , 0 ), // {r32|r64, r8lo|r8hi|m8|r16|m16}
- ROW(2, 0, 1, 0, 4 , 27 , 0 , 0 , 0 , 0 ), // #293 {r16, r16|m16|mem}
- ROW(2, 0, 1, 0, 114, 28 , 0 , 0 , 0 , 0 ), // {r32|r64, r32|m32|mem}
- ROW(4, 1, 1, 1, 6 , 6 , 28 , 35 , 0 , 0 ), // #295 {r32, r32, r32|m32|mem, <edx>}
- ROW(4, 0, 1, 1, 8 , 8 , 15 , 37 , 0 , 0 ), // {r64, r64, r64|m64|mem, <rdx>}
+ ROW(2, 1, 0, 0, 6 , 30 , 0 , 0 , 0 , 0 ), // {r32, m64|mem}
+ ROW(1, 1, 0, 0, 114, 0 , 0 , 0 , 0 , 0 ), // #285 {rel16|r16|m16|r32|m32}
+ ROW(1, 1, 1, 0, 115, 0 , 0 , 0 , 0 , 0 ), // {rel32|r64|m64|mem}
+ ROW(2, 1, 1, 0, 6 , 116, 0 , 0 , 0 , 0 ), // #287 {r32, r8lo|r8hi|m8|r16|m16|r32|m32}
+ ROW(2, 0, 1, 0, 8 , 117, 0 , 0 , 0 , 0 ), // {r64, r8lo|r8hi|m8|r64|m64}
+ ROW(1, 1, 0, 0, 118, 0 , 0 , 0 , 0 , 0 ), // #289 {r16|r32}
+ ROW(1, 1, 1, 0, 31 , 0 , 0 , 0 , 0 , 0 ), // #290 {r8lo|r8hi|m8|r16|m16|r32|m32|r64|m64|mem}
+ ROW(2, 1, 0, 0, 119, 58 , 0 , 0 , 0 , 0 ), // #291 {es:[mem|m512|memBase], m512|mem}
+ ROW(2, 0, 1, 0, 119, 58 , 0 , 0 , 0 , 0 ), // {es:[mem|m512|memBase], m512|mem}
+ ROW(3, 1, 1, 0, 50 , 10 , 10 , 0 , 0 , 0 ), // #293 {xmm, i8|u8, i8|u8}
+ ROW(2, 1, 1, 0, 50 , 50 , 0 , 0 , 0 , 0 ), // #294 {xmm, xmm}
+ ROW(0, 1, 1, 0, 0 , 0 , 0 , 0 , 0 , 0 ), // #295 {}
+ ROW(1, 1, 1, 0, 100, 0 , 0 , 0 , 0 , 0 ), // #296 {st}
ROW(0, 1, 1, 0, 0 , 0 , 0 , 0 , 0 , 0 ), // #297 {}
- ROW(1, 1, 1, 0, 116, 0 , 0 , 0 , 0 , 0 ), // {r16|m16|r32|m32}
- ROW(2, 1, 1, 0, 57 , 117, 0 , 0 , 0 , 0 ), // #299 {mm, mm|m64|mem}
- ROW(2, 1, 1, 0, 45 , 46 , 0 , 0 , 0 , 0 ), // {xmm, xmm|m128|mem}
- ROW(3, 1, 1, 0, 57 , 117, 10 , 0 , 0 , 0 ), // #301 {mm, mm|m64|mem, i8|u8}
- ROW(3, 1, 1, 0, 45 , 46 , 10 , 0 , 0 , 0 ), // {xmm, xmm|m128|mem, i8|u8}
- ROW(3, 1, 1, 0, 6 , 59 , 10 , 0 , 0 , 0 ), // #303 {r32, mm|xmm, i8|u8}
- ROW(3, 1, 1, 0, 21 , 45 , 10 , 0 , 0 , 0 ), // {m16|mem, xmm, i8|u8}
- ROW(2, 1, 1, 0, 57 , 118, 0 , 0 , 0 , 0 ), // #305 {mm, i8|u8|mm|m64|mem}
- ROW(2, 1, 1, 0, 45 , 54 , 0 , 0 , 0 , 0 ), // {xmm, i8|u8|xmm|m128|mem}
- ROW(1, 1, 0, 0, 6 , 0 , 0 , 0 , 0 , 0 ), // #307 {r32}
- ROW(1, 0, 1, 0, 8 , 0 , 0 , 0 , 0 , 0 ), // {r64}
- ROW(0, 1, 1, 0, 0 , 0 , 0 , 0 , 0 , 0 ), // #309 {}
- ROW(1, 1, 1, 0, 119, 0 , 0 , 0 , 0 , 0 ), // {u16}
- ROW(3, 1, 1, 0, 6 , 28 , 10 , 0 , 0 , 0 ), // #311 {r32, r32|m32|mem, i8|u8}
+ ROW(1, 1, 1, 0, 120, 0 , 0 , 0 , 0 , 0 ), // #298 {m32|m64|st}
+ ROW(2, 1, 1, 0, 50 , 50 , 0 , 0 , 0 , 0 ), // #299 {xmm, xmm}
+ ROW(4, 1, 1, 0, 50 , 50 , 10 , 10 , 0 , 0 ), // {xmm, xmm, i8|u8, i8|u8}
+ ROW(2, 1, 0, 0, 6 , 52 , 0 , 0 , 0 , 0 ), // #301 {r32, m128|mem}
+ ROW(2, 0, 1, 0, 8 , 52 , 0 , 0 , 0 , 0 ), // {r64, m128|mem}
+ ROW(2, 1, 0, 2, 36 , 121, 0 , 0 , 0 , 0 ), // #303 {<eax>, <ecx>}
+ ROW(2, 0, 1, 2, 122, 121, 0 , 0 , 0 , 0 ), // {<eax|rax>, <ecx>}
+ ROW(1, 1, 1, 0, 123, 0 , 0 , 0 , 0 , 0 ), // #305 {rel8|rel32}
+ ROW(1, 1, 0, 0, 124, 0 , 0 , 0 , 0 , 0 ), // {rel16}
+ ROW(2, 1, 0, 1, 125, 126, 0 , 0 , 0 , 0 ), // #307 {<cx|ecx>, rel8}
+ ROW(2, 0, 1, 1, 127, 126, 0 , 0 , 0 , 0 ), // {<ecx|rcx>, rel8}
+ ROW(1, 1, 1, 0, 128, 0 , 0 , 0 , 0 , 0 ), // #309 {rel8|rel32|r64|m64|mem}
+ ROW(1, 1, 0, 0, 129, 0 , 0 , 0 , 0 , 0 ), // {rel16|r32|m32|mem}
+ ROW(2, 1, 1, 0, 106, 130, 0 , 0 , 0 , 0 ), // #311 {k, k|m8|mem|r32}
+ ROW(2, 1, 1, 0, 131, 106, 0 , 0 , 0 , 0 ), // {m8|mem|r32, k}
+ ROW(2, 1, 1, 0, 106, 132, 0 , 0 , 0 , 0 ), // #313 {k, k|m32|mem|r32}
+ ROW(2, 1, 1, 0, 28 , 106, 0 , 0 , 0 , 0 ), // {m32|mem|r32, k}
+ ROW(2, 1, 1, 0, 106, 133, 0 , 0 , 0 , 0 ), // #315 {k, k|m64|mem|r64}
+ ROW(2, 1, 1, 0, 15 , 106, 0 , 0 , 0 , 0 ), // {m64|mem|r64, k}
+ ROW(2, 1, 1, 0, 106, 134, 0 , 0 , 0 , 0 ), // #317 {k, k|m16|mem|r32}
+ ROW(2, 1, 1, 0, 135, 106, 0 , 0 , 0 , 0 ), // {m16|mem|r32, k}
+ ROW(2, 1, 1, 0, 4 , 27 , 0 , 0 , 0 , 0 ), // #319 {r16, r16|m16|mem}
+ ROW(2, 1, 1, 0, 6 , 135, 0 , 0 , 0 , 0 ), // {r32, r32|m16|mem}
+ ROW(2, 1, 0, 0, 136, 137, 0 , 0 , 0 , 0 ), // #321 {i16, i16|i32}
+ ROW(1, 1, 1, 0, 138, 0 , 0 , 0 , 0 , 0 ), // {m32|m48|m80|mem}
+ ROW(2, 1, 0, 0, 4 , 29 , 0 , 0 , 0 , 0 ), // #323 {r16, m32|mem}
+ ROW(2, 1, 0, 0, 6 , 101, 0 , 0 , 0 , 0 ), // {r32, m48|mem}
+ ROW(2, 1, 1, 0, 4 , 27 , 0 , 0 , 0 , 0 ), // #325 {r16, r16|m16|mem}
+ ROW(2, 1, 1, 0, 139, 135, 0 , 0 , 0 , 0 ), // {r32|r64, r32|m16|mem}
+ ROW(2, 1, 1, 0, 64 , 28 , 0 , 0 , 0 , 0 ), // #327 {mm|xmm, r32|m32|mem}
+ ROW(2, 1, 1, 0, 28 , 64 , 0 , 0 , 0 , 0 ), // {r32|m32|mem, mm|xmm}
+ ROW(2, 1, 1, 0, 50 , 107, 0 , 0 , 0 , 0 ), // #329 {xmm, xmm|m32|mem}
+ ROW(2, 1, 1, 0, 29 , 50 , 0 , 0 , 0 , 0 ), // {m32|mem, xmm}
+ ROW(2, 1, 1, 0, 4 , 9 , 0 , 0 , 0 , 0 ), // #331 {r16, r8lo|r8hi|m8}
+ ROW(2, 1, 1, 0, 139, 140, 0 , 0 , 0 , 0 ), // {r32|r64, r8lo|r8hi|m8|r16|m16}
+ ROW(2, 0, 1, 0, 4 , 27 , 0 , 0 , 0 , 0 ), // #333 {r16, r16|m16|mem}
+ ROW(2, 0, 1, 0, 139, 28 , 0 , 0 , 0 , 0 ), // {r32|r64, r32|m32|mem}
+ ROW(4, 1, 1, 1, 6 , 6 , 28 , 35 , 0 , 0 ), // #335 {r32, r32, r32|m32|mem, <edx>}
+ ROW(4, 0, 1, 1, 8 , 8 , 15 , 37 , 0 , 0 ), // {r64, r64, r64|m64|mem, <rdx>}
+ ROW(2, 1, 1, 0, 62 , 141, 0 , 0 , 0 , 0 ), // #337 {mm, mm|m64|mem}
+ ROW(2, 1, 1, 0, 50 , 51 , 0 , 0 , 0 , 0 ), // {xmm, xmm|m128|mem}
+ ROW(3, 1, 1, 0, 62 , 141, 10 , 0 , 0 , 0 ), // #339 {mm, mm|m64|mem, i8|u8}
+ ROW(3, 1, 1, 0, 50 , 51 , 10 , 0 , 0 , 0 ), // {xmm, xmm|m128|mem, i8|u8}
+ ROW(3, 1, 1, 0, 6 , 64 , 10 , 0 , 0 , 0 ), // #341 {r32, mm|xmm, i8|u8}
+ ROW(3, 1, 1, 0, 21 , 50 , 10 , 0 , 0 , 0 ), // {m16|mem, xmm, i8|u8}
+ ROW(2, 1, 1, 0, 62 , 142, 0 , 0 , 0 , 0 ), // #343 {mm, i8|u8|mm|m64|mem}
+ ROW(2, 1, 1, 0, 50 , 59 , 0 , 0 , 0 , 0 ), // {xmm, i8|u8|xmm|m128|mem}
+ ROW(2, 1, 1, 0, 62 , 143, 0 , 0 , 0 , 0 ), // #345 {mm, mm|m32|mem}
+ ROW(2, 1, 1, 0, 50 , 51 , 0 , 0 , 0 , 0 ), // {xmm, xmm|m128|mem}
+ ROW(1, 1, 0, 0, 6 , 0 , 0 , 0 , 0 , 0 ), // #347 {r32}
+ ROW(1, 0, 1, 0, 8 , 0 , 0 , 0 , 0 , 0 ), // #348 {r64}
+ ROW(0, 1, 1, 0, 0 , 0 , 0 , 0 , 0 , 0 ), // #349 {}
+ ROW(1, 1, 1, 0, 144, 0 , 0 , 0 , 0 , 0 ), // {u16}
+ ROW(3, 1, 1, 0, 6 , 28 , 10 , 0 , 0 , 0 ), // #351 {r32, r32|m32|mem, i8|u8}
ROW(3, 0, 1, 0, 8 , 15 , 10 , 0 , 0 , 0 ), // {r64, r64|m64|mem, i8|u8}
- ROW(4, 1, 1, 0, 45 , 45 , 46 , 45 , 0 , 0 ), // #313 {xmm, xmm, xmm|m128|mem, xmm}
- ROW(4, 1, 1, 0, 48 , 48 , 49 , 48 , 0 , 0 ), // {ymm, ymm, ymm|m256|mem, ymm}
- ROW(2, 1, 1, 0, 45 , 120, 0 , 0 , 0 , 0 ), // #315 {xmm, xmm|m128|ymm|m256}
- ROW(2, 1, 1, 0, 48 , 52 , 0 , 0 , 0 , 0 ), // {ymm, zmm|m512|mem}
- ROW(4, 1, 1, 0, 45 , 45 , 45 , 60 , 0 , 0 ), // #317 {xmm, xmm, xmm, xmm|m64|mem}
- ROW(4, 1, 1, 0, 45 , 45 , 30 , 45 , 0 , 0 ), // {xmm, xmm, m64|mem, xmm}
- ROW(4, 1, 1, 0, 45 , 45 , 45 , 87 , 0 , 0 ), // #319 {xmm, xmm, xmm, xmm|m32|mem}
- ROW(4, 1, 1, 0, 45 , 45 , 29 , 45 , 0 , 0 ), // {xmm, xmm, m32|mem, xmm}
- ROW(4, 1, 1, 0, 48 , 48 , 46 , 10 , 0 , 0 ), // #321 {ymm, ymm, xmm|m128|mem, i8|u8}
- ROW(4, 1, 1, 0, 51 , 51 , 46 , 10 , 0 , 0 ), // {zmm, zmm, xmm|m128|mem, i8|u8}
- ROW(1, 1, 0, 1, 36 , 0 , 0 , 0 , 0 , 0 ), // #323 {<eax>}
- ROW(1, 0, 1, 1, 38 , 0 , 0 , 0 , 0 , 0 ), // #324 {<rax>}
- ROW(2, 1, 1, 0, 28 , 45 , 0 , 0 , 0 , 0 ), // #325 {r32|m32|mem, xmm}
- ROW(2, 1, 1, 0, 45 , 28 , 0 , 0 , 0 , 0 ), // {xmm, r32|m32|mem}
- ROW(2, 1, 1, 0, 30 , 45 , 0 , 0 , 0 , 0 ), // #327 {m64|mem, xmm}
- ROW(3, 1, 1, 0, 45 , 45 , 30 , 0 , 0 , 0 ), // {xmm, xmm, m64|mem}
- ROW(2, 1, 0, 0, 28 , 6 , 0 , 0 , 0 , 0 ), // #329 {r32|m32|mem, r32}
+ ROW(4, 1, 1, 0, 50 , 50 , 51 , 50 , 0 , 0 ), // #353 {xmm, xmm, xmm|m128|mem, xmm}
+ ROW(4, 1, 1, 0, 53 , 53 , 54 , 53 , 0 , 0 ), // {ymm, ymm, ymm|m256|mem, ymm}
+ ROW(2, 1, 1, 0, 50 , 145, 0 , 0 , 0 , 0 ), // #355 {xmm, xmm|m128|ymm|m256}
+ ROW(2, 1, 1, 0, 53 , 57 , 0 , 0 , 0 , 0 ), // {ymm, zmm|m512|mem}
+ ROW(4, 1, 1, 0, 50 , 50 , 50 , 65 , 0 , 0 ), // #357 {xmm, xmm, xmm, xmm|m64|mem}
+ ROW(4, 1, 1, 0, 50 , 50 , 30 , 50 , 0 , 0 ), // {xmm, xmm, m64|mem, xmm}
+ ROW(4, 1, 1, 0, 50 , 50 , 50 , 107, 0 , 0 ), // #359 {xmm, xmm, xmm, xmm|m32|mem}
+ ROW(4, 1, 1, 0, 50 , 50 , 29 , 50 , 0 , 0 ), // {xmm, xmm, m32|mem, xmm}
+ ROW(4, 1, 1, 0, 53 , 53 , 51 , 10 , 0 , 0 ), // #361 {ymm, ymm, xmm|m128|mem, i8|u8}
+ ROW(4, 1, 1, 0, 56 , 56 , 51 , 10 , 0 , 0 ), // {zmm, zmm, xmm|m128|mem, i8|u8}
+ ROW(1, 1, 0, 1, 36 , 0 , 0 , 0 , 0 , 0 ), // #363 {<eax>}
+ ROW(1, 0, 1, 1, 38 , 0 , 0 , 0 , 0 , 0 ), // #364 {<rax>}
+ ROW(2, 1, 1, 0, 28 , 50 , 0 , 0 , 0 , 0 ), // #365 {r32|m32|mem, xmm}
+ ROW(2, 1, 1, 0, 50 , 28 , 0 , 0 , 0 , 0 ), // {xmm, r32|m32|mem}
+ ROW(2, 1, 1, 0, 30 , 50 , 0 , 0 , 0 , 0 ), // #367 {m64|mem, xmm}
+ ROW(3, 1, 1, 0, 50 , 50 , 30 , 0 , 0 , 0 ), // {xmm, xmm, m64|mem}
+ ROW(2, 1, 1, 0, 135, 50 , 0 , 0 , 0 , 0 ), // #369 {r32|m16|mem, xmm}
+ ROW(2, 1, 1, 0, 50 , 135, 0 , 0 , 0 , 0 ), // {xmm, r32|m16|mem}
+ ROW(2, 1, 0, 0, 28 , 6 , 0 , 0 , 0 , 0 ), // #371 {r32|m32|mem, r32}
ROW(2, 0, 1, 0, 15 , 8 , 0 , 0 , 0 , 0 ), // {r64|m64|mem, r64}
- ROW(2, 1, 0, 0, 6 , 28 , 0 , 0 , 0 , 0 ), // #331 {r32, r32|m32|mem}
+ ROW(2, 1, 0, 0, 6 , 28 , 0 , 0 , 0 , 0 ), // #373 {r32, r32|m32|mem}
ROW(2, 0, 1, 0, 8 , 15 , 0 , 0 , 0 , 0 ), // {r64, r64|m64|mem}
- ROW(3, 1, 1, 0, 45 , 45 , 54 , 0 , 0 , 0 ), // #333 {xmm, xmm, xmm|m128|mem|i8|u8}
- ROW(3, 1, 1, 0, 45 , 47 , 121, 0 , 0 , 0 ), // {xmm, m128|mem, i8|u8|xmm}
- ROW(2, 1, 1, 0, 74 , 45 , 0 , 0 , 0 , 0 ), // #335 {vm64x|vm64y, xmm}
- ROW(2, 1, 1, 0, 66 , 48 , 0 , 0 , 0 , 0 ), // {vm64z, ymm}
- ROW(3, 1, 1, 0, 45 , 45 , 46 , 0 , 0 , 0 ), // #337 {xmm, xmm, xmm|m128|mem}
- ROW(3, 1, 1, 0, 45 , 47 , 45 , 0 , 0 , 0 ), // {xmm, m128|mem, xmm}
- ROW(2, 1, 1, 0, 61 , 86 , 0 , 0 , 0 , 0 ), // #339 {vm32x, xmm|ymm}
- ROW(2, 1, 1, 0, 62 , 51 , 0 , 0 , 0 , 0 ), // {vm32y, zmm}
- ROW(1, 1, 0, 1, 33 , 0 , 0 , 0 , 0 , 0 ), // #341 {<ax>}
- ROW(2, 1, 0, 1, 33 , 10 , 0 , 0 , 0 , 0 ), // #342 {<ax>, i8|u8}
- ROW(2, 1, 0, 0, 27 , 4 , 0 , 0 , 0 , 0 ), // #343 {r16|m16|mem, r16}
- ROW(3, 1, 1, 1, 45 , 46 , 122, 0 , 0 , 0 ), // #344 {xmm, xmm|m128|mem, <xmm0>}
- ROW(2, 1, 1, 0, 89 , 123, 0 , 0 , 0 , 0 ), // #345 {bnd, mib}
- ROW(2, 1, 1, 0, 89 , 91 , 0 , 0 , 0 , 0 ), // #346 {bnd, mem}
- ROW(2, 1, 1, 0, 123, 89 , 0 , 0 , 0 , 0 ), // #347 {mib, bnd}
- ROW(1, 1, 1, 0, 124, 0 , 0 , 0 , 0 , 0 ), // #348 {r16|r32|r64}
- ROW(1, 1, 1, 1, 33 , 0 , 0 , 0 , 0 , 0 ), // #349 {<ax>}
- ROW(2, 1, 1, 2, 35 , 36 , 0 , 0 , 0 , 0 ), // #350 {<edx>, <eax>}
- ROW(1, 1, 1, 0, 91 , 0 , 0 , 0 , 0 , 0 ), // #351 {mem}
- ROW(1, 1, 1, 1, 125, 0 , 0 , 0 , 0 , 0 ), // #352 {<ds:[memBase|zax]>}
- ROW(2, 1, 1, 2, 126, 127, 0 , 0 , 0 , 0 ), // #353 {<ds:[memBase|zsi]>, <es:[memBase|zdi]>}
- ROW(3, 1, 1, 0, 45 , 60 , 10 , 0 , 0 , 0 ), // #354 {xmm, xmm|m64|mem, i8|u8}
- ROW(3, 1, 1, 0, 45 , 87 , 10 , 0 , 0 , 0 ), // #355 {xmm, xmm|m32|mem, i8|u8}
- ROW(5, 0, 1, 4, 47 , 37 , 38 , 128, 129, 0 ), // #356 {m128|mem, <rdx>, <rax>, <rcx>, <rbx>}
- ROW(5, 1, 1, 4, 30 , 35 , 36 , 99 , 130, 0 ), // #357 {m64|mem, <edx>, <eax>, <ecx>, <ebx>}
- ROW(4, 1, 1, 4, 36 , 130, 99 , 35 , 0 , 0 ), // #358 {<eax>, <ebx>, <ecx>, <edx>}
- ROW(2, 0, 1, 2, 37 , 38 , 0 , 0 , 0 , 0 ), // #359 {<rdx>, <rax>}
- ROW(2, 1, 1, 0, 57 , 46 , 0 , 0 , 0 , 0 ), // #360 {mm, xmm|m128|mem}
- ROW(2, 1, 1, 0, 45 , 117, 0 , 0 , 0 , 0 ), // #361 {xmm, mm|m64|mem}
- ROW(2, 1, 1, 0, 57 , 60 , 0 , 0 , 0 , 0 ), // #362 {mm, xmm|m64|mem}
- ROW(2, 1, 1, 0, 114, 60 , 0 , 0 , 0 , 0 ), // #363 {r32|r64, xmm|m64|mem}
- ROW(2, 1, 1, 0, 45 , 131, 0 , 0 , 0 , 0 ), // #364 {xmm, r32|m32|mem|r64|m64}
- ROW(2, 1, 1, 0, 114, 87 , 0 , 0 , 0 , 0 ), // #365 {r32|r64, xmm|m32|mem}
- ROW(2, 1, 1, 2, 34 , 33 , 0 , 0 , 0 , 0 ), // #366 {<dx>, <ax>}
- ROW(1, 1, 1, 1, 36 , 0 , 0 , 0 , 0 , 0 ), // #367 {<eax>}
- ROW(2, 1, 1, 0, 12 , 10 , 0 , 0 , 0 , 0 ), // #368 {i16|u16, i8|u8}
- ROW(3, 1, 1, 0, 28 , 45 , 10 , 0 , 0 , 0 ), // #369 {r32|m32|mem, xmm, i8|u8}
- ROW(1, 1, 1, 0, 80 , 0 , 0 , 0 , 0 , 0 ), // #370 {m80|mem}
- ROW(1, 1, 1, 0, 132, 0 , 0 , 0 , 0 , 0 ), // #371 {m16|m32}
- ROW(1, 1, 1, 0, 133, 0 , 0 , 0 , 0 , 0 ), // #372 {m16|m32|m64}
- ROW(1, 1, 1, 0, 134, 0 , 0 , 0 , 0 , 0 ), // #373 {m32|m64|m80|st}
- ROW(1, 1, 1, 0, 21 , 0 , 0 , 0 , 0 , 0 ), // #374 {m16|mem}
- ROW(1, 1, 1, 0, 135, 0 , 0 , 0 , 0 , 0 ), // #375 {ax|m16|mem}
- ROW(1, 0, 1, 0, 91 , 0 , 0 , 0 , 0 , 0 ), // #376 {mem}
- ROW(2, 1, 1, 0, 136, 137, 0 , 0 , 0 , 0 ), // #377 {al|ax|eax, i8|u8|dx}
- ROW(2, 1, 1, 0, 138, 139, 0 , 0 , 0 , 0 ), // #378 {es:[memBase|zdi], dx}
- ROW(1, 1, 1, 0, 10 , 0 , 0 , 0 , 0 , 0 ), // #379 {i8|u8}
- ROW(0, 1, 0, 0, 0 , 0 , 0 , 0 , 0 , 0 ), // #380 {}
- ROW(0, 0, 1, 0, 0 , 0 , 0 , 0 , 0 , 0 ), // #381 {}
- ROW(3, 1, 1, 0, 84 , 84 , 84 , 0 , 0 , 0 ), // #382 {k, k, k}
- ROW(2, 1, 1, 0, 84 , 84 , 0 , 0 , 0 , 0 ), // #383 {k, k}
- ROW(3, 1, 1, 0, 84 , 84 , 10 , 0 , 0 , 0 ), // #384 {k, k, i8|u8}
- ROW(1, 1, 1, 1, 140, 0 , 0 , 0 , 0 , 0 ), // #385 {<ah>}
- ROW(1, 1, 1, 0, 29 , 0 , 0 , 0 , 0 , 0 ), // #386 {m32|mem}
- ROW(2, 1, 1, 0, 124, 141, 0 , 0 , 0 , 0 ), // #387 {r16|r32|r64, mem|m8|m16|m32|m48|m64|m80|m128|m256|m512|m1024}
- ROW(1, 1, 1, 0, 27 , 0 , 0 , 0 , 0 , 0 ), // #388 {r16|m16|mem}
- ROW(1, 1, 1, 0, 114, 0 , 0 , 0 , 0 , 0 ), // #389 {r32|r64}
- ROW(2, 1, 1, 2, 142, 126, 0 , 0 , 0 , 0 ), // #390 {<al|ax|eax|rax>, <ds:[memBase|zsi]>}
- ROW(3, 1, 1, 0, 114, 28 , 14 , 0 , 0 , 0 ), // #391 {r32|r64, r32|m32|mem, i32|u32}
- ROW(3, 1, 1, 1, 45 , 45 , 143, 0 , 0 , 0 ), // #392 {xmm, xmm, <ds:[memBase|zdi]>}
- ROW(3, 1, 1, 1, 57 , 57 , 143, 0 , 0 , 0 ), // #393 {mm, mm, <ds:[memBase|zdi]>}
- ROW(3, 1, 1, 3, 125, 99 , 35 , 0 , 0 , 0 ), // #394 {<ds:[memBase|zax]>, <ecx>, <edx>}
- ROW(2, 1, 1, 0, 97 , 53 , 0 , 0 , 0 , 0 ), // #395 {es:[memBase], m512|mem}
- ROW(2, 1, 1, 0, 57 , 45 , 0 , 0 , 0 , 0 ), // #396 {mm, xmm}
- ROW(2, 1, 1, 0, 6 , 45 , 0 , 0 , 0 , 0 ), // #397 {r32, xmm}
- ROW(2, 1, 1, 0, 30 , 57 , 0 , 0 , 0 , 0 ), // #398 {m64|mem, mm}
- ROW(2, 1, 1, 0, 45 , 57 , 0 , 0 , 0 , 0 ), // #399 {xmm, mm}
- ROW(2, 1, 1, 2, 127, 126, 0 , 0 , 0 , 0 ), // #400 {<es:[memBase|zdi]>, <ds:[memBase|zsi]>}
- ROW(2, 1, 1, 2, 36 , 99 , 0 , 0 , 0 , 0 ), // #401 {<eax>, <ecx>}
- ROW(3, 1, 1, 3, 36 , 99 , 130, 0 , 0 , 0 ), // #402 {<eax>, <ecx>, <ebx>}
- ROW(2, 1, 1, 0, 144, 136, 0 , 0 , 0 , 0 ), // #403 {u8|dx, al|ax|eax}
- ROW(2, 1, 1, 0, 139, 145, 0 , 0 , 0 , 0 ), // #404 {dx, ds:[memBase|zsi]}
- ROW(6, 1, 1, 3, 45 , 46 , 10 , 99 , 36 , 35 ), // #405 {xmm, xmm|m128|mem, i8|u8, <ecx>, <eax>, <edx>}
- ROW(6, 1, 1, 3, 45 , 46 , 10 , 122, 36 , 35 ), // #406 {xmm, xmm|m128|mem, i8|u8, <xmm0>, <eax>, <edx>}
- ROW(4, 1, 1, 1, 45 , 46 , 10 , 99 , 0 , 0 ), // #407 {xmm, xmm|m128|mem, i8|u8, <ecx>}
- ROW(4, 1, 1, 1, 45 , 46 , 10 , 122, 0 , 0 ), // #408 {xmm, xmm|m128|mem, i8|u8, <xmm0>}
- ROW(3, 1, 1, 0, 109, 45 , 10 , 0 , 0 , 0 ), // #409 {r32|m8|mem|r8lo|r8hi|r16, xmm, i8|u8}
- ROW(3, 0, 1, 0, 15 , 45 , 10 , 0 , 0 , 0 ), // #410 {r64|m64|mem, xmm, i8|u8}
- ROW(3, 1, 1, 0, 45 , 109, 10 , 0 , 0 , 0 ), // #411 {xmm, r32|m8|mem|r8lo|r8hi|r16, i8|u8}
- ROW(3, 1, 1, 0, 45 , 28 , 10 , 0 , 0 , 0 ), // #412 {xmm, r32|m32|mem, i8|u8}
- ROW(3, 0, 1, 0, 45 , 15 , 10 , 0 , 0 , 0 ), // #413 {xmm, r64|m64|mem, i8|u8}
- ROW(3, 1, 1, 0, 59 , 113, 10 , 0 , 0 , 0 ), // #414 {mm|xmm, r32|m16|mem|r16, i8|u8}
- ROW(2, 1, 1, 0, 6 , 59 , 0 , 0 , 0 , 0 ), // #415 {r32, mm|xmm}
- ROW(2, 1, 1, 0, 45 , 10 , 0 , 0 , 0 , 0 ), // #416 {xmm, i8|u8}
- ROW(2, 1, 1, 0, 31 , 81 , 0 , 0 , 0 , 0 ), // #417 {r8lo|r8hi|m8|r16|m16|r32|m32|r64|m64|mem, cl|i8|u8}
- ROW(1, 0, 1, 0, 114, 0 , 0 , 0 , 0 , 0 ), // #418 {r32|r64}
- ROW(3, 1, 1, 3, 35 , 36 , 99 , 0 , 0 , 0 ), // #419 {<edx>, <eax>, <ecx>}
- ROW(2, 1, 1, 2, 142, 127, 0 , 0 , 0 , 0 ), // #420 {<al|ax|eax|rax>, <es:[memBase|zdi]>}
- ROW(1, 1, 1, 0, 1 , 0 , 0 , 0 , 0 , 0 ), // #421 {r8lo|r8hi|m8|mem}
- ROW(1, 1, 1, 0, 146, 0 , 0 , 0 , 0 , 0 ), // #422 {r16|m16|mem|r32|r64}
- ROW(2, 1, 1, 2, 127, 142, 0 , 0 , 0 , 0 ), // #423 {<es:[memBase|zdi]>, <al|ax|eax|rax>}
- ROW(6, 1, 1, 0, 51 , 51 , 51 , 51 , 51 , 47 ), // #424 {zmm, zmm, zmm, zmm, zmm, m128|mem}
- ROW(6, 1, 1, 0, 45 , 45 , 45 , 45 , 45 , 47 ), // #425 {xmm, xmm, xmm, xmm, xmm, m128|mem}
- ROW(3, 1, 1, 0, 45 , 45 , 60 , 0 , 0 , 0 ), // #426 {xmm, xmm, xmm|m64|mem}
- ROW(3, 1, 1, 0, 45 , 45 , 87 , 0 , 0 , 0 ), // #427 {xmm, xmm, xmm|m32|mem}
- ROW(2, 1, 1, 0, 48 , 47 , 0 , 0 , 0 , 0 ), // #428 {ymm, m128|mem}
- ROW(2, 1, 1, 0, 147, 60 , 0 , 0 , 0 , 0 ), // #429 {ymm|zmm, xmm|m64|mem}
- ROW(2, 1, 1, 0, 147, 47 , 0 , 0 , 0 , 0 ), // #430 {ymm|zmm, m128|mem}
- ROW(2, 1, 1, 0, 51 , 50 , 0 , 0 , 0 , 0 ), // #431 {zmm, m256|mem}
- ROW(2, 1, 1, 0, 148, 60 , 0 , 0 , 0 , 0 ), // #432 {xmm|ymm|zmm, xmm|m64|mem}
- ROW(2, 1, 1, 0, 148, 87 , 0 , 0 , 0 , 0 ), // #433 {xmm|ymm|zmm, m32|mem|xmm}
- ROW(4, 1, 1, 0, 82 , 45 , 60 , 10 , 0 , 0 ), // #434 {xmm|k, xmm, xmm|m64|mem, i8|u8}
- ROW(4, 1, 1, 0, 82 , 45 , 87 , 10 , 0 , 0 ), // #435 {xmm|k, xmm, xmm|m32|mem, i8|u8}
- ROW(3, 1, 1, 0, 45 , 45 , 131, 0 , 0 , 0 ), // #436 {xmm, xmm, r32|m32|mem|r64|m64}
- ROW(3, 1, 1, 0, 46 , 147, 10 , 0 , 0 , 0 ), // #437 {xmm|m128|mem, ymm|zmm, i8|u8}
- ROW(4, 1, 1, 0, 45 , 45 , 60 , 10 , 0 , 0 ), // #438 {xmm, xmm, xmm|m64|mem, i8|u8}
- ROW(4, 1, 1, 0, 45 , 45 , 87 , 10 , 0 , 0 ), // #439 {xmm, xmm, xmm|m32|mem, i8|u8}
- ROW(3, 1, 1, 0, 84 , 149, 10 , 0 , 0 , 0 ), // #440 {k, xmm|m128|ymm|m256|zmm|m512, i8|u8}
- ROW(3, 1, 1, 0, 84 , 60 , 10 , 0 , 0 , 0 ), // #441 {k, xmm|m64|mem, i8|u8}
- ROW(3, 1, 1, 0, 84 , 87 , 10 , 0 , 0 , 0 ), // #442 {k, xmm|m32|mem, i8|u8}
- ROW(1, 1, 1, 0, 62 , 0 , 0 , 0 , 0 , 0 ), // #443 {vm32y}
- ROW(1, 1, 1, 0, 63 , 0 , 0 , 0 , 0 , 0 ), // #444 {vm32z}
- ROW(1, 1, 1, 0, 66 , 0 , 0 , 0 , 0 , 0 ), // #445 {vm64z}
- ROW(4, 1, 1, 0, 51 , 51 , 49 , 10 , 0 , 0 ), // #446 {zmm, zmm, ymm|m256|mem, i8|u8}
- ROW(1, 1, 1, 0, 30 , 0 , 0 , 0 , 0 , 0 ), // #447 {m64|mem}
- ROW(2, 1, 1, 0, 6 , 86 , 0 , 0 , 0 , 0 ), // #448 {r32, xmm|ymm}
- ROW(2, 1, 1, 0, 148, 150, 0 , 0 , 0 , 0 ), // #449 {xmm|ymm|zmm, xmm|m8|mem|r32|r8lo|r8hi|r16}
- ROW(2, 1, 1, 0, 148, 151, 0 , 0 , 0 , 0 ), // #450 {xmm|ymm|zmm, xmm|m32|mem|r32}
- ROW(2, 1, 1, 0, 148, 84 , 0 , 0 , 0 , 0 ), // #451 {xmm|ymm|zmm, k}
- ROW(2, 1, 1, 0, 148, 152, 0 , 0 , 0 , 0 ), // #452 {xmm|ymm|zmm, xmm|m16|mem|r32|r16}
- ROW(3, 1, 1, 0, 113, 45 , 10 , 0 , 0 , 0 ), // #453 {r32|m16|mem|r16, xmm, i8|u8}
- ROW(4, 1, 1, 0, 45 , 45 , 109, 10 , 0 , 0 ), // #454 {xmm, xmm, r32|m8|mem|r8lo|r8hi|r16, i8|u8}
- ROW(4, 1, 1, 0, 45 , 45 , 28 , 10 , 0 , 0 ), // #455 {xmm, xmm, r32|m32|mem, i8|u8}
- ROW(4, 0, 1, 0, 45 , 45 , 15 , 10 , 0 , 0 ), // #456 {xmm, xmm, r64|m64|mem, i8|u8}
- ROW(4, 1, 1, 0, 45 , 45 , 113, 10 , 0 , 0 ), // #457 {xmm, xmm, r32|m16|mem|r16, i8|u8}
- ROW(2, 1, 1, 0, 84 , 148, 0 , 0 , 0 , 0 ), // #458 {k, xmm|ymm|zmm}
- ROW(1, 1, 1, 0, 102, 0 , 0 , 0 , 0 , 0 ), // #459 {rel16|rel32}
- ROW(3, 1, 1, 2, 91 , 35 , 36 , 0 , 0 , 0 ), // #460 {mem, <edx>, <eax>}
- ROW(3, 0, 1, 2, 91 , 35 , 36 , 0 , 0 , 0 ) // #461 {mem, <edx>, <eax>}
+ ROW(3, 1, 1, 0, 50 , 50 , 59 , 0 , 0 , 0 ), // #375 {xmm, xmm, xmm|m128|mem|i8|u8}
+ ROW(3, 1, 1, 0, 50 , 52 , 146, 0 , 0 , 0 ), // {xmm, m128|mem, i8|u8|xmm}
+ ROW(2, 1, 1, 0, 67 , 96 , 0 , 0 , 0 , 0 ), // #377 {vm32x, xmm|ymm}
+ ROW(2, 1, 1, 0, 68 , 56 , 0 , 0 , 0 , 0 ), // {vm32y, zmm}
+ ROW(2, 1, 1, 0, 108, 50 , 0 , 0 , 0 , 0 ), // #379 {vm64x|vm64y, xmm}
+ ROW(2, 1, 1, 0, 72 , 53 , 0 , 0 , 0 , 0 ), // {vm64z, ymm}
+ ROW(3, 1, 1, 0, 50 , 50 , 51 , 0 , 0 , 0 ), // #381 {xmm, xmm, xmm|m128|mem}
+ ROW(3, 1, 1, 0, 50 , 52 , 50 , 0 , 0 , 0 ), // {xmm, m128|mem, xmm}
+ ROW(1, 1, 0, 1, 33 , 0 , 0 , 0 , 0 , 0 ), // #383 {<ax>}
+ ROW(2, 1, 0, 1, 33 , 10 , 0 , 0 , 0 , 0 ), // #384 {<ax>, i8|u8}
+ ROW(2, 1, 0, 0, 27 , 4 , 0 , 0 , 0 , 0 ), // #385 {r16|m16|mem, r16}
+ ROW(3, 1, 1, 1, 50 , 51 , 147, 0 , 0 , 0 ), // #386 {xmm, xmm|m128|mem, <xmm0>}
+ ROW(2, 1, 1, 0, 111, 148, 0 , 0 , 0 , 0 ), // #387 {bnd, mib}
+ ROW(2, 1, 1, 0, 111, 113, 0 , 0 , 0 , 0 ), // #388 {bnd, mem}
+ ROW(2, 1, 1, 0, 148, 111, 0 , 0 , 0 , 0 ), // #389 {mib, bnd}
+ ROW(1, 1, 1, 0, 149, 0 , 0 , 0 , 0 , 0 ), // #390 {r16|r32|r64}
+ ROW(1, 1, 1, 1, 33 , 0 , 0 , 0 , 0 , 0 ), // #391 {<ax>}
+ ROW(2, 1, 1, 2, 35 , 36 , 0 , 0 , 0 , 0 ), // #392 {<edx>, <eax>}
+ ROW(1, 1, 1, 0, 150, 0 , 0 , 0 , 0 , 0 ), // #393 {mem|m8|m16|m32|m48|m64|m80|m128|m256|m512|m1024}
+ ROW(1, 1, 1, 0, 30 , 0 , 0 , 0 , 0 , 0 ), // #394 {m64|mem}
+ ROW(0, 0, 1, 0, 0 , 0 , 0 , 0 , 0 , 0 ), // #395 {}
+ ROW(1, 1, 1, 1, 151, 0 , 0 , 0 , 0 , 0 ), // #396 {<ds:[mem|m512|memBase|zax]>}
+ ROW(3, 1, 1, 0, 50 , 65 , 10 , 0 , 0 , 0 ), // #397 {xmm, xmm|m64|mem, i8|u8}
+ ROW(3, 1, 1, 0, 50 , 107, 10 , 0 , 0 , 0 ), // #398 {xmm, xmm|m32|mem, i8|u8}
+ ROW(5, 0, 1, 4, 52 , 37 , 38 , 152, 153, 0 ), // #399 {m128|mem, <rdx>, <rax>, <rcx>, <rbx>}
+ ROW(5, 1, 1, 4, 30 , 35 , 36 , 121, 154, 0 ), // #400 {m64|mem, <edx>, <eax>, <ecx>, <ebx>}
+ ROW(4, 1, 1, 4, 36 , 154, 121, 35 , 0 , 0 ), // #401 {<eax>, <ebx>, <ecx>, <edx>}
+ ROW(2, 0, 1, 2, 37 , 38 , 0 , 0 , 0 , 0 ), // #402 {<rdx>, <rax>}
+ ROW(2, 1, 1, 0, 62 , 51 , 0 , 0 , 0 , 0 ), // #403 {mm, xmm|m128|mem}
+ ROW(2, 1, 1, 0, 50 , 141, 0 , 0 , 0 , 0 ), // #404 {xmm, mm|m64|mem}
+ ROW(2, 1, 1, 0, 62 , 65 , 0 , 0 , 0 , 0 ), // #405 {mm, xmm|m64|mem}
+ ROW(2, 1, 1, 0, 139, 65 , 0 , 0 , 0 , 0 ), // #406 {r32|r64, xmm|m64|mem}
+ ROW(2, 1, 1, 0, 50 , 155, 0 , 0 , 0 , 0 ), // #407 {xmm, r32|m32|mem|r64|m64}
+ ROW(2, 1, 1, 0, 139, 107, 0 , 0 , 0 , 0 ), // #408 {r32|r64, xmm|m32|mem}
+ ROW(2, 1, 1, 2, 34 , 33 , 0 , 0 , 0 , 0 ), // #409 {<dx>, <ax>}
+ ROW(1, 1, 1, 1, 36 , 0 , 0 , 0 , 0 , 0 ), // #410 {<eax>}
+ ROW(2, 1, 1, 0, 12 , 10 , 0 , 0 , 0 , 0 ), // #411 {i16|u16, i8|u8}
+ ROW(3, 1, 1, 0, 28 , 50 , 10 , 0 , 0 , 0 ), // #412 {r32|m32|mem, xmm, i8|u8}
+ ROW(1, 1, 1, 0, 102, 0 , 0 , 0 , 0 , 0 ), // #413 {m80|mem}
+ ROW(1, 1, 1, 0, 156, 0 , 0 , 0 , 0 , 0 ), // #414 {m16|m32}
+ ROW(1, 1, 1, 0, 157, 0 , 0 , 0 , 0 , 0 ), // #415 {m16|m32|m64}
+ ROW(1, 1, 1, 0, 158, 0 , 0 , 0 , 0 , 0 ), // #416 {m32|m64|m80|st}
+ ROW(1, 1, 1, 0, 21 , 0 , 0 , 0 , 0 , 0 ), // #417 {m16|mem}
+ ROW(1, 1, 1, 0, 113, 0 , 0 , 0 , 0 , 0 ), // #418 {mem}
+ ROW(1, 1, 1, 0, 159, 0 , 0 , 0 , 0 , 0 ), // #419 {ax|m16|mem}
+ ROW(1, 0, 1, 0, 113, 0 , 0 , 0 , 0 , 0 ), // #420 {mem}
+ ROW(2, 1, 1, 1, 10 , 36 , 0 , 0 , 0 , 0 ), // #421 {i8|u8, <eax>}
+ ROW(2, 1, 1, 0, 160, 161, 0 , 0 , 0 , 0 ), // #422 {al|ax|eax, i8|u8|dx}
+ ROW(1, 1, 1, 0, 6 , 0 , 0 , 0 , 0 , 0 ), // #423 {r32}
+ ROW(2, 1, 1, 0, 162, 163, 0 , 0 , 0 , 0 ), // #424 {es:[m8|memBase|zdi|m16|m32], dx}
+ ROW(1, 1, 1, 0, 10 , 0 , 0 , 0 , 0 , 0 ), // #425 {i8|u8}
+ ROW(0, 1, 0, 0, 0 , 0 , 0 , 0 , 0 , 0 ), // #426 {}
+ ROW(3, 1, 1, 0, 106, 106, 106, 0 , 0 , 0 ), // #427 {k, k, k}
+ ROW(2, 1, 1, 0, 106, 106, 0 , 0 , 0 , 0 ), // #428 {k, k}
+ ROW(3, 1, 1, 0, 106, 106, 10 , 0 , 0 , 0 ), // #429 {k, k, i8|u8}
+ ROW(1, 1, 1, 1, 164, 0 , 0 , 0 , 0 , 0 ), // #430 {<ah>}
+ ROW(1, 1, 1, 0, 29 , 0 , 0 , 0 , 0 , 0 ), // #431 {m32|mem}
+ ROW(1, 0, 1, 0, 58 , 0 , 0 , 0 , 0 , 0 ), // #432 {m512|mem}
+ ROW(2, 1, 1, 0, 149, 150, 0 , 0 , 0 , 0 ), // #433 {r16|r32|r64, mem|m8|m16|m32|m48|m64|m80|m128|m256|m512|m1024}
+ ROW(1, 1, 1, 0, 27 , 0 , 0 , 0 , 0 , 0 ), // #434 {r16|m16|mem}
+ ROW(1, 1, 1, 0, 139, 0 , 0 , 0 , 0 , 0 ), // #435 {r32|r64}
+ ROW(3, 1, 1, 0, 139, 28 , 14 , 0 , 0 , 0 ), // #436 {r32|r64, r32|m32|mem, i32|u32}
+ ROW(3, 1, 1, 1, 50 , 50 , 165, 0 , 0 , 0 ), // #437 {xmm, xmm, <ds:[mem|m128|memBase|zdi]>}
+ ROW(3, 1, 1, 1, 62 , 62 , 166, 0 , 0 , 0 ), // #438 {mm, mm, <ds:[mem|m64|memBase|zdi]>}
+ ROW(3, 1, 1, 3, 167, 121, 35 , 0 , 0 , 0 ), // #439 {<ds:[mem|memBase|zax]>, <ecx>, <edx>}
+ ROW(2, 1, 1, 0, 119, 58 , 0 , 0 , 0 , 0 ), // #440 {es:[mem|m512|memBase], m512|mem}
+ ROW(2, 1, 1, 0, 62 , 50 , 0 , 0 , 0 , 0 ), // #441 {mm, xmm}
+ ROW(2, 1, 1, 0, 6 , 50 , 0 , 0 , 0 , 0 ), // #442 {r32, xmm}
+ ROW(2, 1, 1, 0, 30 , 62 , 0 , 0 , 0 , 0 ), // #443 {m64|mem, mm}
+ ROW(2, 1, 1, 0, 50 , 62 , 0 , 0 , 0 , 0 ), // #444 {xmm, mm}
+ ROW(2, 1, 1, 2, 36 , 121, 0 , 0 , 0 , 0 ), // #445 {<eax>, <ecx>}
+ ROW(3, 1, 1, 3, 36 , 121, 154, 0 , 0 , 0 ), // #446 {<eax>, <ecx>, <ebx>}
+ ROW(2, 1, 1, 0, 168, 160, 0 , 0 , 0 , 0 ), // #447 {u8|dx, al|ax|eax}
+ ROW(2, 1, 1, 0, 163, 169, 0 , 0 , 0 , 0 ), // #448 {dx, ds:[m8|memBase|zsi|m16|m32]}
+ ROW(6, 1, 1, 3, 50 , 51 , 10 , 121, 36 , 35 ), // #449 {xmm, xmm|m128|mem, i8|u8, <ecx>, <eax>, <edx>}
+ ROW(6, 1, 1, 3, 50 , 51 , 10 , 147, 36 , 35 ), // #450 {xmm, xmm|m128|mem, i8|u8, <xmm0>, <eax>, <edx>}
+ ROW(4, 1, 1, 1, 50 , 51 , 10 , 121, 0 , 0 ), // #451 {xmm, xmm|m128|mem, i8|u8, <ecx>}
+ ROW(4, 1, 1, 1, 50 , 51 , 10 , 147, 0 , 0 ), // #452 {xmm, xmm|m128|mem, i8|u8, <xmm0>}
+ ROW(3, 1, 1, 0, 131, 50 , 10 , 0 , 0 , 0 ), // #453 {r32|m8|mem, xmm, i8|u8}
+ ROW(3, 0, 1, 0, 15 , 50 , 10 , 0 , 0 , 0 ), // #454 {r64|m64|mem, xmm, i8|u8}
+ ROW(3, 1, 1, 0, 50 , 131, 10 , 0 , 0 , 0 ), // #455 {xmm, r32|m8|mem, i8|u8}
+ ROW(3, 1, 1, 0, 50 , 28 , 10 , 0 , 0 , 0 ), // #456 {xmm, r32|m32|mem, i8|u8}
+ ROW(3, 0, 1, 0, 50 , 15 , 10 , 0 , 0 , 0 ), // #457 {xmm, r64|m64|mem, i8|u8}
+ ROW(3, 1, 1, 0, 64 , 135, 10 , 0 , 0 , 0 ), // #458 {mm|xmm, r32|m16|mem, i8|u8}
+ ROW(2, 1, 1, 0, 6 , 64 , 0 , 0 , 0 , 0 ), // #459 {r32, mm|xmm}
+ ROW(2, 1, 1, 0, 50 , 10 , 0 , 0 , 0 , 0 ), // #460 {xmm, i8|u8}
+ ROW(1, 1, 1, 0, 155, 0 , 0 , 0 , 0 , 0 ), // #461 {r32|m32|mem|r64|m64}
+ ROW(2, 1, 1, 0, 31 , 103, 0 , 0 , 0 , 0 ), // #462 {r8lo|r8hi|m8|r16|m16|r32|m32|r64|m64|mem, cl|i8|u8}
+ ROW(1, 0, 1, 0, 139, 0 , 0 , 0 , 0 , 0 ), // #463 {r32|r64}
+ ROW(3, 1, 1, 3, 35 , 36 , 121, 0 , 0 , 0 ), // #464 {<edx>, <eax>, <ecx>}
+ ROW(1, 1, 1, 0, 1 , 0 , 0 , 0 , 0 , 0 ), // #465 {r8lo|r8hi|m8|mem}
+ ROW(1, 1, 1, 0, 170, 0 , 0 , 0 , 0 , 0 ), // #466 {r16|m16|mem|r32|r64}
+ ROW(3, 0, 1, 0, 171, 171, 171, 0 , 0 , 0 ), // #467 {tmm, tmm, tmm}
+ ROW(2, 0, 1, 0, 171, 172, 0 , 0 , 0 , 0 ), // #468 {tmm, tmem}
+ ROW(2, 0, 1, 0, 172, 171, 0 , 0 , 0 , 0 ), // #469 {tmem, tmm}
+ ROW(1, 0, 1, 0, 171, 0 , 0 , 0 , 0 , 0 ), // #470 {tmm}
+ ROW(3, 1, 1, 2, 6 , 35 , 36 , 0 , 0 , 0 ), // #471 {r32, <edx>, <eax>}
+ ROW(1, 1, 1, 0, 173, 0 , 0 , 0 , 0 , 0 ), // #472 {ds:[mem|memBase]}
+ ROW(6, 1, 1, 0, 56 , 56 , 56 , 56 , 56 , 52 ), // #473 {zmm, zmm, zmm, zmm, zmm, m128|mem}
+ ROW(6, 1, 1, 0, 50 , 50 , 50 , 50 , 50 , 52 ), // #474 {xmm, xmm, xmm, xmm, xmm, m128|mem}
+ ROW(3, 1, 1, 0, 50 , 50 , 65 , 0 , 0 , 0 ), // #475 {xmm, xmm, xmm|m64|mem}
+ ROW(3, 1, 1, 0, 50 , 50 , 110, 0 , 0 , 0 ), // #476 {xmm, xmm, xmm|m16|mem}
+ ROW(3, 1, 1, 0, 50 , 50 , 107, 0 , 0 , 0 ), // #477 {xmm, xmm, xmm|m32|mem}
+ ROW(2, 1, 1, 0, 53 , 52 , 0 , 0 , 0 , 0 ), // #478 {ymm, m128|mem}
+ ROW(2, 1, 1, 0, 174, 65 , 0 , 0 , 0 , 0 ), // #479 {ymm|zmm, xmm|m64|mem}
+ ROW(2, 1, 1, 0, 174, 52 , 0 , 0 , 0 , 0 ), // #480 {ymm|zmm, m128|mem}
+ ROW(2, 1, 1, 0, 56 , 55 , 0 , 0 , 0 , 0 ), // #481 {zmm, m256|mem}
+ ROW(2, 1, 1, 0, 175, 65 , 0 , 0 , 0 , 0 ), // #482 {xmm|ymm|zmm, xmm|m64|mem}
+ ROW(2, 1, 1, 0, 175, 107, 0 , 0 , 0 , 0 ), // #483 {xmm|ymm|zmm, m32|mem|xmm}
+ ROW(4, 1, 1, 0, 104, 50 , 65 , 10 , 0 , 0 ), // #484 {xmm|k, xmm, xmm|m64|mem, i8|u8}
+ ROW(4, 1, 1, 0, 106, 50 , 110, 10 , 0 , 0 ), // #485 {k, xmm, xmm|m16|mem, i8|u8}
+ ROW(4, 1, 1, 0, 104, 50 , 107, 10 , 0 , 0 ), // #486 {xmm|k, xmm, xmm|m32|mem, i8|u8}
+ ROW(2, 1, 1, 0, 50 , 176, 0 , 0 , 0 , 0 ), // #487 {xmm, xmm|m128|ymm|m256|zmm|m512}
+ ROW(2, 1, 1, 0, 139, 110, 0 , 0 , 0 , 0 ), // #488 {r32|r64, xmm|m16|mem}
+ ROW(3, 1, 1, 0, 50 , 50 , 155, 0 , 0 , 0 ), // #489 {xmm, xmm, r32|m32|mem|r64|m64}
+ ROW(3, 1, 1, 0, 51 , 174, 10 , 0 , 0 , 0 ), // #490 {xmm|m128|mem, ymm|zmm, i8|u8}
+ ROW(4, 1, 1, 0, 50 , 50 , 65 , 10 , 0 , 0 ), // #491 {xmm, xmm, xmm|m64|mem, i8|u8}
+ ROW(4, 1, 1, 0, 50 , 50 , 107, 10 , 0 , 0 ), // #492 {xmm, xmm, xmm|m32|mem, i8|u8}
+ ROW(3, 1, 1, 0, 106, 176, 10 , 0 , 0 , 0 ), // #493 {k, xmm|m128|ymm|m256|zmm|m512, i8|u8}
+ ROW(3, 1, 1, 0, 106, 65 , 10 , 0 , 0 , 0 ), // #494 {k, xmm|m64|mem, i8|u8}
+ ROW(3, 1, 1, 0, 106, 110, 10 , 0 , 0 , 0 ), // #495 {k, xmm|m16|mem, i8|u8}
+ ROW(3, 1, 1, 0, 106, 107, 10 , 0 , 0 , 0 ), // #496 {k, xmm|m32|mem, i8|u8}
+ ROW(1, 1, 1, 0, 68 , 0 , 0 , 0 , 0 , 0 ), // #497 {vm32y}
+ ROW(1, 1, 1, 0, 69 , 0 , 0 , 0 , 0 , 0 ), // #498 {vm32z}
+ ROW(1, 1, 1, 0, 72 , 0 , 0 , 0 , 0 , 0 ), // #499 {vm64z}
+ ROW(4, 1, 1, 0, 50 , 50 , 110, 10 , 0 , 0 ), // #500 {xmm, xmm, xmm|m16|mem, i8|u8}
+ ROW(4, 1, 1, 0, 56 , 56 , 54 , 10 , 0 , 0 ), // #501 {zmm, zmm, ymm|m256|mem, i8|u8}
+ ROW(2, 1, 1, 0, 6 , 96 , 0 , 0 , 0 , 0 ), // #502 {r32, xmm|ymm}
+ ROW(2, 1, 1, 0, 175, 177, 0 , 0 , 0 , 0 ), // #503 {xmm|ymm|zmm, xmm|m8|mem|r32}
+ ROW(2, 1, 1, 0, 175, 178, 0 , 0 , 0 , 0 ), // #504 {xmm|ymm|zmm, xmm|m32|mem|r32}
+ ROW(2, 1, 1, 0, 175, 106, 0 , 0 , 0 , 0 ), // #505 {xmm|ymm|zmm, k}
+ ROW(2, 1, 1, 0, 175, 179, 0 , 0 , 0 , 0 ), // #506 {xmm|ymm|zmm, xmm|m16|mem|r32}
+ ROW(3, 1, 1, 0, 135, 50 , 10 , 0 , 0 , 0 ), // #507 {r32|m16|mem, xmm, i8|u8}
+ ROW(4, 1, 1, 0, 50 , 50 , 131, 10 , 0 , 0 ), // #508 {xmm, xmm, r32|m8|mem, i8|u8}
+ ROW(4, 1, 1, 0, 50 , 50 , 28 , 10 , 0 , 0 ), // #509 {xmm, xmm, r32|m32|mem, i8|u8}
+ ROW(4, 0, 1, 0, 50 , 50 , 15 , 10 , 0 , 0 ), // #510 {xmm, xmm, r64|m64|mem, i8|u8}
+ ROW(4, 1, 1, 0, 50 , 50 , 135, 10 , 0 , 0 ), // #511 {xmm, xmm, r32|m16|mem, i8|u8}
+ ROW(2, 1, 1, 0, 106, 175, 0 , 0 , 0 , 0 ), // #512 {k, xmm|ymm|zmm}
+ ROW(1, 1, 1, 0, 124, 0 , 0 , 0 , 0 , 0 ), // #513 {rel16|rel32}
+ ROW(3, 1, 1, 2, 113, 35 , 36 , 0 , 0 , 0 ), // #514 {mem, <edx>, <eax>}
+ ROW(3, 0, 1, 2, 113, 35 , 36 , 0 , 0 , 0 ) // #515 {mem, <edx>, <eax>}
};
#undef ROW
-#define ROW(flags, mFlags, extFlags, regId) { uint32_t(flags), uint16_t(mFlags), uint8_t(extFlags), uint8_t(regId) }
-#define F(VAL) InstDB::kOp##VAL
-#define M(VAL) InstDB::kMemOp##VAL
+#define ROW(opFlags, regId) { opFlags, uint8_t(regId) }
+#define F(VAL) uint64_t(InstDB::OpFlags::k##VAL)
const InstDB::OpSignature InstDB::_opSignatureTable[] = {
- ROW(0, 0, 0, 0xFF),
- ROW(F(GpbLo) | F(GpbHi) | F(Mem), M(M8) | M(Any), 0, 0x00),
- ROW(F(GpbLo) | F(GpbHi), 0, 0, 0x00),
- ROW(F(Gpw) | F(SReg) | F(Mem), M(M16) | M(Any), 0, 0x00),
- ROW(F(Gpw), 0, 0, 0x00),
- ROW(F(Gpd) | F(SReg) | F(Mem), M(M32) | M(Any), 0, 0x00),
- ROW(F(Gpd), 0, 0, 0x00),
- ROW(F(Gpq) | F(SReg) | F(CReg) | F(DReg) | F(Mem), M(M64) | M(Any), 0, 0x00),
- ROW(F(Gpq), 0, 0, 0x00),
- ROW(F(GpbLo) | F(GpbHi) | F(Mem), M(M8), 0, 0x00),
- ROW(F(I8) | F(U8), 0, 0, 0x00),
- ROW(F(Gpw) | F(Mem), M(M16), 0, 0x00),
- ROW(F(I16) | F(U16), 0, 0, 0x00),
- ROW(F(Gpd) | F(Mem), M(M32), 0, 0x00),
- ROW(F(I32) | F(U32), 0, 0, 0x00),
- ROW(F(Gpq) | F(Mem), M(M64) | M(Any), 0, 0x00),
- ROW(F(I32), 0, 0, 0x00),
- ROW(F(SReg) | F(CReg) | F(DReg) | F(Mem) | F(I64) | F(U64), M(M64) | M(Any), 0, 0x00),
- ROW(F(Mem), M(M8) | M(Any), 0, 0x00),
- ROW(F(SReg) | F(Mem), M(M16) | M(Any), 0, 0x00),
- ROW(F(SReg) | F(Mem), M(M32) | M(Any), 0, 0x00),
- ROW(F(Mem), M(M16) | M(Any), 0, 0x00),
- ROW(F(SReg), 0, 0, 0x00),
- ROW(F(CReg) | F(DReg), 0, 0, 0x00),
- ROW(F(Gpq) | F(I32), 0, 0, 0x00),
- ROW(F(Gpw) | F(Gpd) | F(Gpq) | F(Mem), M(M16) | M(M32) | M(M64) | M(Any), 0, 0x00),
- ROW(F(I8), 0, 0, 0x00),
- ROW(F(Gpw) | F(Mem), M(M16) | M(Any), 0, 0x00),
- ROW(F(Gpd) | F(Mem), M(M32) | M(Any), 0, 0x00),
- ROW(F(Mem), M(M32) | M(Any), 0, 0x00),
- ROW(F(Mem), M(M64) | M(Any), 0, 0x00),
- ROW(F(GpbLo) | F(GpbHi) | F(Gpw) | F(Gpd) | F(Gpq) | F(Mem), M(M8) | M(M16) | M(M32) | M(M64) | M(Any), 0, 0x00),
- ROW(F(Gpq) | F(Mem) | F(I32) | F(U32), M(M64) | M(Any), 0, 0x00),
- ROW(F(Gpw) | F(Implicit), 0, 0, 0x01),
- ROW(F(Gpw) | F(Implicit), 0, 0, 0x04),
- ROW(F(Gpd) | F(Implicit), 0, 0, 0x04),
- ROW(F(Gpd) | F(Implicit), 0, 0, 0x01),
- ROW(F(Gpq) | F(Implicit), 0, 0, 0x04),
- ROW(F(Gpq) | F(Implicit), 0, 0, 0x01),
- ROW(F(Gpw) | F(Mem) | F(I8) | F(I16), M(M16) | M(Any), 0, 0x00),
- ROW(F(Gpd) | F(Mem) | F(I8) | F(I32), M(M32) | M(Any), 0, 0x00),
- ROW(F(Gpq) | F(Mem) | F(I8) | F(I32), M(M64) | M(Any), 0, 0x00),
- ROW(F(I8) | F(I16) | F(U16), 0, 0, 0x00),
- ROW(F(I8) | F(I32) | F(U32), 0, 0, 0x00),
- ROW(F(I8) | F(I32), 0, 0, 0x00),
- ROW(F(Xmm), 0, 0, 0x00),
- ROW(F(Xmm) | F(Mem), M(M128) | M(Any), 0, 0x00),
- ROW(F(Mem), M(M128) | M(Any), 0, 0x00),
- ROW(F(Ymm), 0, 0, 0x00),
- ROW(F(Ymm) | F(Mem), M(M256) | M(Any), 0, 0x00),
- ROW(F(Mem), M(M256) | M(Any), 0, 0x00),
- ROW(F(Zmm), 0, 0, 0x00),
- ROW(F(Zmm) | F(Mem), M(M512) | M(Any), 0, 0x00),
- ROW(F(Mem), M(M512) | M(Any), 0, 0x00),
- ROW(F(Xmm) | F(Mem) | F(I8) | F(U8), M(M128) | M(Any), 0, 0x00),
- ROW(F(Ymm) | F(Mem) | F(I8) | F(U8), M(M256) | M(Any), 0, 0x00),
- ROW(F(Zmm) | F(Mem) | F(I8) | F(U8), M(M512) | M(Any), 0, 0x00),
- ROW(F(Mm), 0, 0, 0x00),
- ROW(F(Gpq) | F(Mm) | F(Mem), M(M64) | M(Any), 0, 0x00),
- ROW(F(Xmm) | F(Mm), 0, 0, 0x00),
- ROW(F(Xmm) | F(Mem), M(M64) | M(Any), 0, 0x00),
- ROW(F(Vm), M(Vm32x), 0, 0x00),
- ROW(F(Vm), M(Vm32y), 0, 0x00),
- ROW(F(Vm), M(Vm32z), 0, 0x00),
- ROW(F(Vm), M(Vm64x), 0, 0x00),
- ROW(F(Vm), M(Vm64y), 0, 0x00),
- ROW(F(Vm), M(Vm64z), 0, 0x00),
- ROW(F(GpbLo) | F(Implicit), 0, 0, 0x01),
- ROW(F(Gpw) | F(Gpq) | F(Mem), M(M16) | M(M64) | M(Any), 0, 0x00),
- ROW(F(SReg), 0, 0, 0x1A),
- ROW(F(SReg), 0, 0, 0x60),
- ROW(F(Gpw) | F(Gpq) | F(Mem) | F(I8) | F(I16) | F(I32), M(M16) | M(M64) | M(Any), 0, 0x00),
- ROW(F(Gpd) | F(Mem) | F(I32) | F(U32), M(M32), 0, 0x00),
- ROW(F(SReg), 0, 0, 0x1E),
- ROW(F(Vm), M(Vm64x) | M(Vm64y), 0, 0x00),
- ROW(F(I4) | F(U4), 0, 0, 0x00),
- ROW(F(Mem), M(M32) | M(M64), 0, 0x00),
- ROW(F(St), 0, 0, 0x01),
- ROW(F(St), 0, 0, 0x00),
- ROW(F(Mem), M(M48) | M(Any), 0, 0x00),
- ROW(F(Mem), M(M80) | M(Any), 0, 0x00),
- ROW(F(GpbLo) | F(I8) | F(U8), 0, 0, 0x02),
- ROW(F(Xmm) | F(KReg), 0, 0, 0x00),
- ROW(F(Ymm) | F(KReg), 0, 0, 0x00),
- ROW(F(KReg), 0, 0, 0x00),
- ROW(F(Gpq) | F(Xmm) | F(Mem), M(M64) | M(Any), 0, 0x00),
- ROW(F(Xmm) | F(Ymm), 0, 0, 0x00),
- ROW(F(Xmm) | F(Mem), M(M32) | M(Any), 0, 0x00),
- ROW(F(Xmm) | F(Mem), M(M16) | M(Any), 0, 0x00),
- ROW(F(Bnd), 0, 0, 0x00),
- ROW(F(Bnd) | F(Mem), M(Any), 0, 0x00),
- ROW(F(Mem), M(Any), 0, 0x00),
- ROW(F(Gpw) | F(Gpd) | F(Mem) | F(I32) | F(I64) | F(Rel32), M(M16) | M(M32), 0, 0x00),
- ROW(F(Gpq) | F(Mem) | F(I32) | F(I64) | F(Rel32), M(M64) | M(Any), 0, 0x00),
- ROW(F(GpbLo) | F(GpbHi) | F(Gpw) | F(Gpd) | F(Mem), M(M8) | M(M16) | M(M32), 0, 0x00),
- ROW(F(GpbLo) | F(GpbHi) | F(Gpq) | F(Mem), M(M8) | M(M64), 0, 0x00),
- ROW(F(Gpw) | F(Gpd), 0, 0, 0x00),
- ROW(F(Mem), M(BaseOnly) | M(Es), 0, 0x00),
- ROW(F(St) | F(Mem), M(M32) | M(M64), 0, 0x00),
- ROW(F(Gpd) | F(Implicit), 0, 0, 0x02),
- ROW(F(Gpd) | F(Gpq) | F(Implicit), 0, 0, 0x01),
- ROW(F(I32) | F(I64) | F(Rel8) | F(Rel32), 0, 0, 0x00),
- ROW(F(I32) | F(I64) | F(Rel32), 0, 0, 0x00),
- ROW(F(Gpw) | F(Gpd) | F(Implicit), 0, 0, 0x02),
- ROW(F(I32) | F(I64) | F(Rel8), 0, 0, 0x00),
- ROW(F(Gpd) | F(Gpq) | F(Implicit), 0, 0, 0x02),
- ROW(F(Gpq) | F(Mem) | F(I32) | F(I64) | F(Rel8) | F(Rel32), M(M64) | M(Any), 0, 0x00),
- ROW(F(Gpd) | F(Mem) | F(I32) | F(I64) | F(Rel32), M(M32) | M(Any), 0, 0x00),
- ROW(F(GpbLo) | F(GpbHi) | F(Gpw) | F(Gpd) | F(KReg) | F(Mem), M(M8) | M(Any), 0, 0x00),
- ROW(F(GpbLo) | F(GpbHi) | F(Gpw) | F(Gpd) | F(Mem), M(M8) | M(Any), 0, 0x00),
- ROW(F(Gpd) | F(KReg) | F(Mem), M(M32) | M(Any), 0, 0x00),
- ROW(F(Gpq) | F(KReg) | F(Mem), M(M64) | M(Any), 0, 0x00),
- ROW(F(Gpw) | F(Gpd) | F(KReg) | F(Mem), M(M16) | M(Any), 0, 0x00),
- ROW(F(Gpw) | F(Gpd) | F(Mem), M(M16) | M(Any), 0, 0x00),
- ROW(F(Gpd) | F(Gpq), 0, 0, 0x00),
- ROW(F(GpbLo) | F(GpbHi) | F(Gpw) | F(Mem), M(M8) | M(M16), 0, 0x00),
- ROW(F(Gpw) | F(Gpd) | F(Mem), M(M16) | M(M32), 0, 0x00),
- ROW(F(Mm) | F(Mem), M(M64) | M(Any), 0, 0x00),
- ROW(F(Mm) | F(Mem) | F(I8) | F(U8), M(M64) | M(Any), 0, 0x00),
- ROW(F(U16), 0, 0, 0x00),
- ROW(F(Xmm) | F(Ymm) | F(Mem), M(M128) | M(M256), 0, 0x00),
- ROW(F(Xmm) | F(I8) | F(U8), 0, 0, 0x00),
- ROW(F(Xmm) | F(Implicit), 0, 0, 0x01),
- ROW(F(Mem), M(Mib), 0, 0x00),
- ROW(F(Gpw) | F(Gpd) | F(Gpq), 0, 0, 0x00),
- ROW(F(Mem) | F(Implicit), M(BaseOnly) | M(Ds), 0, 0x01),
- ROW(F(Mem) | F(Implicit), M(BaseOnly) | M(Ds), 0, 0x40),
- ROW(F(Mem) | F(Implicit), M(BaseOnly) | M(Es), 0, 0x80),
- ROW(F(Gpq) | F(Implicit), 0, 0, 0x02),
- ROW(F(Gpq) | F(Implicit), 0, 0, 0x08),
- ROW(F(Gpd) | F(Implicit), 0, 0, 0x08),
- ROW(F(Gpd) | F(Gpq) | F(Mem), M(M32) | M(M64) | M(Any), 0, 0x00),
- ROW(F(Mem), M(M16) | M(M32), 0, 0x00),
- ROW(F(Mem), M(M16) | M(M32) | M(M64), 0, 0x00),
- ROW(F(St) | F(Mem), M(M32) | M(M64) | M(M80), 0, 0x00),
- ROW(F(Gpw) | F(Mem), M(M16) | M(Any), 0, 0x01),
- ROW(F(GpbLo) | F(Gpw) | F(Gpd), 0, 0, 0x01),
- ROW(F(Gpw) | F(I8) | F(U8), 0, 0, 0x04),
- ROW(F(Mem), M(BaseOnly) | M(Es), 0, 0x80),
- ROW(F(Gpw), 0, 0, 0x04),
- ROW(F(GpbHi) | F(Implicit), 0, 0, 0x01),
- ROW(F(Mem), M(M8) | M(M16) | M(M32) | M(M48) | M(M64) | M(M80) | M(M128) | M(M256) | M(M512) | M(M1024) | M(Any), 0, 0x00),
- ROW(F(GpbLo) | F(Gpw) | F(Gpd) | F(Gpq) | F(Implicit), 0, 0, 0x01),
- ROW(F(Mem) | F(Implicit), M(BaseOnly) | M(Ds), 0, 0x80),
- ROW(F(Gpw) | F(U8), 0, 0, 0x04),
- ROW(F(Mem), M(BaseOnly) | M(Ds), 0, 0x40),
- ROW(F(Gpw) | F(Gpd) | F(Gpq) | F(Mem), M(M16) | M(Any), 0, 0x00),
- ROW(F(Ymm) | F(Zmm), 0, 0, 0x00),
- ROW(F(Xmm) | F(Ymm) | F(Zmm), 0, 0, 0x00),
- ROW(F(Xmm) | F(Ymm) | F(Zmm) | F(Mem), M(M128) | M(M256) | M(M512), 0, 0x00),
- ROW(F(GpbLo) | F(GpbHi) | F(Gpw) | F(Gpd) | F(Xmm) | F(Mem), M(M8) | M(Any), 0, 0x00),
- ROW(F(Gpd) | F(Xmm) | F(Mem), M(M32) | M(Any), 0, 0x00),
- ROW(F(Gpw) | F(Gpd) | F(Xmm) | F(Mem), M(M16) | M(Any), 0, 0x00)
+ ROW(0, 0xFF),
+ ROW(F(RegGpbLo) | F(RegGpbHi) | F(MemUnspecified) | F(Mem8), 0x00),
+ ROW(F(RegGpbLo) | F(RegGpbHi), 0x00),
+ ROW(F(RegGpw) | F(RegSReg) | F(MemUnspecified) | F(Mem16), 0x00),
+ ROW(F(RegGpw), 0x00),
+ ROW(F(RegGpd) | F(RegSReg) | F(MemUnspecified) | F(Mem32), 0x00),
+ ROW(F(RegGpd), 0x00),
+ ROW(F(RegGpq) | F(RegSReg) | F(RegCReg) | F(RegDReg) | F(MemUnspecified) | F(Mem64), 0x00),
+ ROW(F(RegGpq), 0x00),
+ ROW(F(RegGpbLo) | F(RegGpbHi) | F(Mem8), 0x00),
+ ROW(F(ImmI8) | F(ImmU8), 0x00),
+ ROW(F(RegGpw) | F(Mem16), 0x00),
+ ROW(F(ImmI16) | F(ImmU16), 0x00),
+ ROW(F(RegGpd) | F(Mem32), 0x00),
+ ROW(F(ImmI32) | F(ImmU32), 0x00),
+ ROW(F(RegGpq) | F(MemUnspecified) | F(Mem64), 0x00),
+ ROW(F(ImmI32), 0x00),
+ ROW(F(RegSReg) | F(RegCReg) | F(RegDReg) | F(MemUnspecified) | F(Mem64) | F(ImmI64) | F(ImmU64), 0x00),
+ ROW(F(MemUnspecified) | F(Mem8), 0x00),
+ ROW(F(RegSReg) | F(MemUnspecified) | F(Mem16), 0x00),
+ ROW(F(RegSReg) | F(MemUnspecified) | F(Mem32), 0x00),
+ ROW(F(MemUnspecified) | F(Mem16), 0x00),
+ ROW(F(RegSReg), 0x00),
+ ROW(F(RegCReg) | F(RegDReg), 0x00),
+ ROW(F(RegGpq) | F(ImmI32), 0x00),
+ ROW(F(RegGpw) | F(RegGpd) | F(RegGpq) | F(MemUnspecified) | F(Mem16) | F(Mem32) | F(Mem64), 0x00),
+ ROW(F(ImmI8), 0x00),
+ ROW(F(RegGpw) | F(MemUnspecified) | F(Mem16), 0x00),
+ ROW(F(RegGpd) | F(MemUnspecified) | F(Mem32), 0x00),
+ ROW(F(MemUnspecified) | F(Mem32), 0x00),
+ ROW(F(MemUnspecified) | F(Mem64), 0x00),
+ ROW(F(RegGpbLo) | F(RegGpbHi) | F(RegGpw) | F(RegGpd) | F(RegGpq) | F(MemUnspecified) | F(Mem8) | F(Mem16) | F(Mem32) | F(Mem64), 0x00),
+ ROW(F(RegGpq) | F(MemUnspecified) | F(Mem64) | F(ImmI32) | F(ImmU32), 0x00),
+ ROW(F(RegGpw) | F(FlagImplicit), 0x01),
+ ROW(F(RegGpw) | F(FlagImplicit), 0x04),
+ ROW(F(RegGpd) | F(FlagImplicit), 0x04),
+ ROW(F(RegGpd) | F(FlagImplicit), 0x01),
+ ROW(F(RegGpq) | F(FlagImplicit), 0x04),
+ ROW(F(RegGpq) | F(FlagImplicit), 0x01),
+ ROW(F(RegGpw) | F(MemUnspecified) | F(Mem16) | F(ImmI8) | F(ImmI16), 0x00),
+ ROW(F(RegGpd) | F(MemUnspecified) | F(Mem32) | F(ImmI8) | F(ImmI32), 0x00),
+ ROW(F(RegGpq) | F(MemUnspecified) | F(Mem64) | F(ImmI8) | F(ImmI32), 0x00),
+ ROW(F(ImmI8) | F(ImmI16) | F(ImmU16), 0x00),
+ ROW(F(ImmI8) | F(ImmI32) | F(ImmU32), 0x00),
+ ROW(F(ImmI8) | F(ImmI32), 0x00),
+ ROW(F(ImmI64) | F(ImmU64), 0x00),
+ ROW(F(RegGpbLo), 0x01),
+ ROW(F(RegGpw), 0x01),
+ ROW(F(RegGpd), 0x01),
+ ROW(F(RegGpq), 0x01),
+ ROW(F(RegXmm), 0x00),
+ ROW(F(RegXmm) | F(MemUnspecified) | F(Mem128), 0x00),
+ ROW(F(MemUnspecified) | F(Mem128), 0x00),
+ ROW(F(RegYmm), 0x00),
+ ROW(F(RegYmm) | F(MemUnspecified) | F(Mem256), 0x00),
+ ROW(F(MemUnspecified) | F(Mem256), 0x00),
+ ROW(F(RegZmm), 0x00),
+ ROW(F(RegZmm) | F(MemUnspecified) | F(Mem512), 0x00),
+ ROW(F(MemUnspecified) | F(Mem512), 0x00),
+ ROW(F(RegXmm) | F(MemUnspecified) | F(Mem128) | F(ImmI8) | F(ImmU8), 0x00),
+ ROW(F(RegYmm) | F(MemUnspecified) | F(Mem256) | F(ImmI8) | F(ImmU8), 0x00),
+ ROW(F(RegZmm) | F(MemUnspecified) | F(Mem512) | F(ImmI8) | F(ImmU8), 0x00),
+ ROW(F(RegMm), 0x00),
+ ROW(F(RegGpq) | F(RegMm) | F(MemUnspecified) | F(Mem64), 0x00),
+ ROW(F(RegXmm) | F(RegMm), 0x00),
+ ROW(F(RegXmm) | F(MemUnspecified) | F(Mem64), 0x00),
+ ROW(F(RegGpw) | F(RegGpd) | F(RegGpq) | F(Mem16) | F(Mem32) | F(Mem64), 0x00),
+ ROW(F(Vm32x), 0x00),
+ ROW(F(Vm32y), 0x00),
+ ROW(F(Vm32z), 0x00),
+ ROW(F(Vm64x), 0x00),
+ ROW(F(Vm64y), 0x00),
+ ROW(F(Vm64z), 0x00),
+ ROW(F(Mem8) | F(FlagMemBase) | F(FlagMemDs) | F(FlagImplicit), 0x40),
+ ROW(F(Mem8) | F(FlagMemBase) | F(FlagMemEs) | F(FlagImplicit), 0x80),
+ ROW(F(Mem16) | F(FlagMemBase) | F(FlagMemDs) | F(FlagImplicit), 0x40),
+ ROW(F(Mem16) | F(FlagMemBase) | F(FlagMemEs) | F(FlagImplicit), 0x80),
+ ROW(F(Mem32) | F(FlagMemBase) | F(FlagMemDs) | F(FlagImplicit), 0x40),
+ ROW(F(Mem32) | F(FlagMemBase) | F(FlagMemEs) | F(FlagImplicit), 0x80),
+ ROW(F(Mem64) | F(FlagMemBase) | F(FlagMemDs) | F(FlagImplicit), 0x40),
+ ROW(F(Mem64) | F(FlagMemBase) | F(FlagMemEs) | F(FlagImplicit), 0x80),
+ ROW(F(RegGpbLo) | F(FlagImplicit), 0x01),
+ ROW(F(MemUnspecified) | F(Mem8) | F(FlagMemBase) | F(FlagMemDs) | F(FlagImplicit), 0x40),
+ ROW(F(MemUnspecified) | F(Mem16) | F(FlagMemBase) | F(FlagMemDs) | F(FlagImplicit), 0x40),
+ ROW(F(MemUnspecified) | F(Mem32) | F(FlagMemBase) | F(FlagMemDs) | F(FlagImplicit), 0x40),
+ ROW(F(MemUnspecified) | F(Mem64) | F(FlagMemBase) | F(FlagMemDs) | F(FlagImplicit), 0x40),
+ ROW(F(RegGpw) | F(RegGpq) | F(Mem16) | F(Mem64), 0x00),
+ ROW(F(RegSReg), 0x1A),
+ ROW(F(RegSReg), 0x60),
+ ROW(F(RegGpw) | F(RegGpq) | F(Mem16) | F(Mem64) | F(ImmI8) | F(ImmI16) | F(ImmI32), 0x00),
+ ROW(F(RegGpd) | F(Mem32) | F(ImmI32) | F(ImmU32), 0x00),
+ ROW(F(RegSReg), 0x1E),
+ ROW(F(MemUnspecified) | F(Mem8) | F(FlagMemBase) | F(FlagMemEs) | F(FlagImplicit), 0x80),
+ ROW(F(MemUnspecified) | F(Mem16) | F(FlagMemBase) | F(FlagMemEs) | F(FlagImplicit), 0x80),
+ ROW(F(MemUnspecified) | F(Mem32) | F(FlagMemBase) | F(FlagMemEs) | F(FlagImplicit), 0x80),
+ ROW(F(MemUnspecified) | F(Mem64) | F(FlagMemBase) | F(FlagMemEs) | F(FlagImplicit), 0x80),
+ ROW(F(RegXmm) | F(RegYmm), 0x00),
+ ROW(F(ImmI4) | F(ImmU4), 0x00),
+ ROW(F(Mem32) | F(Mem64), 0x00),
+ ROW(F(RegSt), 0x01),
+ ROW(F(RegSt), 0x00),
+ ROW(F(MemUnspecified) | F(Mem48), 0x00),
+ ROW(F(MemUnspecified) | F(Mem80), 0x00),
+ ROW(F(RegGpbLo) | F(ImmI8) | F(ImmU8), 0x02),
+ ROW(F(RegXmm) | F(RegKReg), 0x00),
+ ROW(F(RegYmm) | F(RegKReg), 0x00),
+ ROW(F(RegKReg), 0x00),
+ ROW(F(RegXmm) | F(MemUnspecified) | F(Mem32), 0x00),
+ ROW(F(Vm64x) | F(Vm64y), 0x00),
+ ROW(F(RegGpq) | F(RegXmm) | F(MemUnspecified) | F(Mem64), 0x00),
+ ROW(F(RegXmm) | F(MemUnspecified) | F(Mem16), 0x00),
+ ROW(F(RegBnd), 0x00),
+ ROW(F(RegBnd) | F(MemUnspecified), 0x00),
+ ROW(F(MemUnspecified), 0x00),
+ ROW(F(RegGpw) | F(RegGpd) | F(Mem16) | F(Mem32) | F(ImmI32) | F(ImmI64) | F(Rel32), 0x00),
+ ROW(F(RegGpq) | F(MemUnspecified) | F(Mem64) | F(ImmI32) | F(ImmI64) | F(Rel32), 0x00),
+ ROW(F(RegGpbLo) | F(RegGpbHi) | F(RegGpw) | F(RegGpd) | F(Mem8) | F(Mem16) | F(Mem32), 0x00),
+ ROW(F(RegGpbLo) | F(RegGpbHi) | F(RegGpq) | F(Mem8) | F(Mem64), 0x00),
+ ROW(F(RegGpw) | F(RegGpd), 0x00),
+ ROW(F(MemUnspecified) | F(Mem512) | F(FlagMemBase) | F(FlagMemEs), 0x00),
+ ROW(F(RegSt) | F(Mem32) | F(Mem64), 0x00),
+ ROW(F(RegGpd) | F(FlagImplicit), 0x02),
+ ROW(F(RegGpd) | F(RegGpq) | F(FlagImplicit), 0x01),
+ ROW(F(ImmI32) | F(ImmI64) | F(Rel8) | F(Rel32), 0x00),
+ ROW(F(ImmI32) | F(ImmI64) | F(Rel32), 0x00),
+ ROW(F(RegGpw) | F(RegGpd) | F(FlagImplicit), 0x02),
+ ROW(F(ImmI32) | F(ImmI64) | F(Rel8), 0x00),
+ ROW(F(RegGpd) | F(RegGpq) | F(FlagImplicit), 0x02),
+ ROW(F(RegGpq) | F(MemUnspecified) | F(Mem64) | F(ImmI32) | F(ImmI64) | F(Rel8) | F(Rel32), 0x00),
+ ROW(F(RegGpd) | F(MemUnspecified) | F(Mem32) | F(ImmI32) | F(ImmI64) | F(Rel32), 0x00),
+ ROW(F(RegGpd) | F(RegKReg) | F(MemUnspecified) | F(Mem8), 0x00),
+ ROW(F(RegGpd) | F(MemUnspecified) | F(Mem8), 0x00),
+ ROW(F(RegGpd) | F(RegKReg) | F(MemUnspecified) | F(Mem32), 0x00),
+ ROW(F(RegGpq) | F(RegKReg) | F(MemUnspecified) | F(Mem64), 0x00),
+ ROW(F(RegGpd) | F(RegKReg) | F(MemUnspecified) | F(Mem16), 0x00),
+ ROW(F(RegGpd) | F(MemUnspecified) | F(Mem16), 0x00),
+ ROW(F(ImmI16), 0x00),
+ ROW(F(ImmI16) | F(ImmI32), 0x00),
+ ROW(F(MemUnspecified) | F(Mem32) | F(Mem48) | F(Mem80), 0x00),
+ ROW(F(RegGpd) | F(RegGpq), 0x00),
+ ROW(F(RegGpbLo) | F(RegGpbHi) | F(RegGpw) | F(Mem8) | F(Mem16), 0x00),
+ ROW(F(RegMm) | F(MemUnspecified) | F(Mem64), 0x00),
+ ROW(F(RegMm) | F(MemUnspecified) | F(Mem64) | F(ImmI8) | F(ImmU8), 0x00),
+ ROW(F(RegMm) | F(MemUnspecified) | F(Mem32), 0x00),
+ ROW(F(ImmU16), 0x00),
+ ROW(F(RegXmm) | F(RegYmm) | F(Mem128) | F(Mem256), 0x00),
+ ROW(F(RegXmm) | F(ImmI8) | F(ImmU8), 0x00),
+ ROW(F(RegXmm) | F(FlagImplicit), 0x01),
+ ROW(F(MemUnspecified) | F(FlagMib), 0x00),
+ ROW(F(RegGpw) | F(RegGpd) | F(RegGpq), 0x00),
+ ROW(F(MemUnspecified) | F(Mem8) | F(Mem16) | F(Mem32) | F(Mem48) | F(Mem64) | F(Mem80) | F(Mem128) | F(Mem256) | F(Mem512) | F(Mem1024), 0x00),
+ ROW(F(MemUnspecified) | F(Mem512) | F(FlagMemBase) | F(FlagMemDs) | F(FlagImplicit), 0x01),
+ ROW(F(RegGpq) | F(FlagImplicit), 0x02),
+ ROW(F(RegGpq) | F(FlagImplicit), 0x08),
+ ROW(F(RegGpd) | F(FlagImplicit), 0x08),
+ ROW(F(RegGpd) | F(RegGpq) | F(MemUnspecified) | F(Mem32) | F(Mem64), 0x00),
+ ROW(F(Mem16) | F(Mem32), 0x00),
+ ROW(F(Mem16) | F(Mem32) | F(Mem64), 0x00),
+ ROW(F(RegSt) | F(Mem32) | F(Mem64) | F(Mem80), 0x00),
+ ROW(F(RegGpw) | F(MemUnspecified) | F(Mem16), 0x01),
+ ROW(F(RegGpbLo) | F(RegGpw) | F(RegGpd), 0x01),
+ ROW(F(RegGpw) | F(ImmI8) | F(ImmU8), 0x04),
+ ROW(F(Mem8) | F(Mem16) | F(Mem32) | F(FlagMemBase) | F(FlagMemEs), 0x80),
+ ROW(F(RegGpw), 0x04),
+ ROW(F(RegGpbHi) | F(FlagImplicit), 0x01),
+ ROW(F(MemUnspecified) | F(Mem128) | F(FlagMemBase) | F(FlagMemDs) | F(FlagImplicit), 0x80),
+ ROW(F(MemUnspecified) | F(Mem64) | F(FlagMemBase) | F(FlagMemDs) | F(FlagImplicit), 0x80),
+ ROW(F(MemUnspecified) | F(FlagMemBase) | F(FlagMemDs) | F(FlagImplicit), 0x01),
+ ROW(F(RegGpw) | F(ImmU8), 0x04),
+ ROW(F(Mem8) | F(Mem16) | F(Mem32) | F(FlagMemBase) | F(FlagMemDs), 0x40),
+ ROW(F(RegGpw) | F(RegGpd) | F(RegGpq) | F(MemUnspecified) | F(Mem16), 0x00),
+ ROW(F(RegTmm), 0x00),
+ ROW(F(MemUnspecified) | F(FlagTMem), 0x00),
+ ROW(F(MemUnspecified) | F(FlagMemBase) | F(FlagMemDs), 0x00),
+ ROW(F(RegYmm) | F(RegZmm), 0x00),
+ ROW(F(RegXmm) | F(RegYmm) | F(RegZmm), 0x00),
+ ROW(F(RegXmm) | F(RegYmm) | F(RegZmm) | F(Mem128) | F(Mem256) | F(Mem512), 0x00),
+ ROW(F(RegGpd) | F(RegXmm) | F(MemUnspecified) | F(Mem8), 0x00),
+ ROW(F(RegGpd) | F(RegXmm) | F(MemUnspecified) | F(Mem32), 0x00),
+ ROW(F(RegGpd) | F(RegXmm) | F(MemUnspecified) | F(Mem16), 0x00)
};
-#undef M
#undef F
#undef ROW
// ----------------------------------------------------------------------------
// ${InstSignatureTable:End}
#endif // !ASMJIT_NO_VALIDATION
-// ============================================================================
-// [asmjit::x86::InstInternal - QueryRWInfo]
-// ============================================================================
+// x86::InstInternal - QueryRWInfo
+// ===============================
// ${InstRWInfoTable:Begin}
// ------------------- Automatically generated, do not edit -------------------
-const uint8_t InstDB::rwInfoIndex[Inst::_kIdCount * 2] = {
- 0, 0, 0, 1, 1, 0, 1, 0, 0, 1, 2, 0, 3, 0, 2, 0, 4, 0, 4, 0, 5, 0, 6, 0, 4, 0,
- 4, 0, 3, 0, 4, 0, 4, 0, 4, 0, 4, 0, 7, 0, 0, 7, 2, 0, 0, 8, 4, 0, 4, 0, 4, 0,
- 4, 0, 9, 0, 0, 10, 11, 0, 11, 0, 11, 0, 11, 0, 11, 0, 0, 4, 0, 4, 0, 12, 0, 12,
- 11, 0, 11, 0, 11, 0, 11, 0, 11, 0, 13, 0, 13, 0, 13, 0, 14, 0, 14, 0, 15, 0,
- 16, 0, 17, 0, 11, 0, 11, 0, 0, 18, 19, 0, 20, 0, 20, 0, 20, 0, 0, 10, 0, 21,
- 0, 1, 22, 0, 0, 23, 0, 0, 0, 0, 0, 0, 0, 24, 0, 24, 0, 24, 0, 0, 0, 0, 0, 0, 0,
- 24, 0, 25, 0, 0, 3, 0, 3, 0, 3, 0, 3, 0, 3, 0, 3, 0, 3, 0, 3, 0, 3, 0, 3, 0,
- 3, 0, 3, 0, 3, 0, 3, 0, 3, 0, 3, 0, 3, 0, 3, 0, 3, 0, 3, 0, 3, 0, 3, 0, 3, 0,
- 3, 0, 3, 0, 3, 0, 3, 0, 3, 0, 3, 0, 3, 0, 26, 0, 0, 4, 0, 4, 27, 0, 0, 5, 0,
- 6, 0, 28, 0, 29, 0, 30, 31, 0, 32, 0, 0, 33, 34, 0, 35, 0, 36, 0, 7, 0, 37, 0,
- 37, 0, 37, 0, 36, 0, 38, 0, 7, 0, 36, 0, 39, 0, 40, 0, 41, 0, 42, 0, 43, 0, 44,
- 0, 45, 0, 37, 0, 37, 0, 7, 0, 39, 0, 40, 0, 45, 0, 46, 0, 0, 47, 0, 1, 0, 1,
- 0, 48, 49, 50, 4, 0, 4, 0, 5, 0, 6, 0, 0, 4, 0, 4, 0, 0, 51, 0, 51, 0, 0, 0,
- 0, 52, 53, 54, 0, 0, 0, 0, 55, 56, 0, 57, 0, 58, 0, 59, 0, 0, 0, 0, 0, 57, 0,
- 57, 0, 57, 0, 57, 0, 57, 0, 57, 0, 57, 0, 57, 0, 60, 0, 61, 0, 61, 0, 60, 0,
- 0, 0, 0, 0, 0, 55, 56, 0, 57, 55, 56, 0, 57, 0, 0, 0, 57, 0, 56, 0, 56, 0, 56,
- 0, 56, 0, 56, 0, 56, 0, 56, 0, 0, 0, 0, 0, 62, 0, 62, 0, 62, 0, 56, 0, 56, 0,
- 60, 0, 0, 0, 63, 0, 24, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 55, 56, 0, 57, 0,
- 0, 0, 0, 0, 0, 0, 64, 0, 65, 0, 64, 0, 66, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 24,
- 0, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 67, 0, 65, 0, 64, 0, 67, 0, 66, 55, 56, 0,
- 57, 55, 56, 0, 57, 0, 0, 0, 61, 0, 61, 0, 61, 0, 61, 0, 0, 0, 0, 0, 0, 0, 57,
- 0, 24, 0, 24, 0, 64, 0, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 4, 4, 0, 4, 0,
- 4, 0, 0, 0, 4, 0, 4, 0, 49, 50, 68, 69, 70, 0, 0, 48, 71, 0, 0, 72, 53, 53, 0,
- 0, 0, 0, 0, 0, 0, 0, 73, 0, 0, 24, 74, 0, 73, 0, 73, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 75, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 21, 0,
+const uint8_t InstDB::rwInfoIndexA[Inst::_kIdCount] = {
+ 0, 0, 1, 1, 0, 2, 3, 2, 4, 4, 5, 6, 4, 4, 3, 4, 4, 4, 4, 7, 0, 2, 0, 4, 4, 4,
+ 4, 8, 0, 9, 9, 9, 9, 9, 0, 0, 0, 0, 9, 9, 9, 9, 9, 10, 10, 10, 11, 11, 12, 13,
+ 14, 9, 9, 0, 15, 16, 16, 16, 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 3, 18, 0, 0, 19, 0, 0, 0, 0, 0, 20, 21, 0, 22, 23, 24, 7, 25,
+ 25, 25, 24, 26, 7, 24, 27, 28, 29, 30, 31, 32, 33, 25, 25, 7, 27, 28, 33, 34,
+ 0, 0, 0, 0, 35, 4, 4, 5, 6, 0, 0, 0, 0, 0, 36, 36, 0, 0, 37, 0, 0, 38, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 38, 0, 38, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 38, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 38, 0, 38,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 4, 4, 0, 39, 4,
+ 4, 35, 40, 41, 0, 0, 0, 42, 0, 37, 0, 0, 0, 0, 43, 0, 44, 43, 43, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 45, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 46, 47, 48, 49, 50, 51,
+ 52, 53, 0, 0, 0, 54, 55, 56, 57, 0, 0, 0, 0, 0, 0, 0, 0, 0, 54, 55, 56, 57, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 58, 0, 59, 0, 60, 0, 61, 0, 60, 0, 60, 0, 60,
+ 0, 0, 0, 0, 0, 62, 63, 63, 63, 58, 60, 0, 0, 0, 9, 0, 0, 4, 4, 5, 6, 0, 0, 4,
+ 4, 5, 6, 0, 0, 64, 65, 66, 66, 67, 47, 24, 36, 67, 52, 66, 66, 68, 69, 69, 70,
+ 71, 71, 72, 72, 59, 59, 67, 59, 59, 71, 71, 73, 48, 52, 74, 48, 7, 7, 47, 75,
+ 9, 66, 66, 75, 0, 35, 4, 4, 5, 6, 0, 76, 0, 0, 77, 0, 2, 4, 4, 78, 79, 9, 9,
+ 9, 3, 3, 4, 3, 3, 3, 3, 3, 3, 3, 3, 3, 0, 3, 3, 0, 3, 80, 3, 0, 0, 0, 3, 3,
+ 4, 3, 0, 0, 3, 3, 4, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 27, 27, 80, 80, 80, 80, 80,
+ 80, 80, 80, 80, 80, 27, 80, 80, 80, 27, 27, 80, 80, 80, 3, 3, 3, 81, 3, 3, 3,
+ 27, 27, 0, 0, 0, 0, 3, 3, 4, 4, 3, 3, 4, 4, 4, 4, 3, 3, 4, 4, 82, 83, 84, 24,
+ 24, 24, 83, 83, 84, 24, 24, 24, 83, 4, 3, 80, 3, 3, 4, 3, 3, 0, 0, 0, 9, 0, 0,
+ 0, 3, 0, 0, 0, 0, 0, 0, 0, 3, 3, 0, 0, 0, 0, 3, 3, 3, 3, 85, 3, 3, 0, 3, 3,
+ 3, 85, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 27, 86, 0, 3, 3, 4, 3, 87, 87, 4, 87, 0,
+ 0, 0, 0, 0, 0, 0, 3, 88, 7, 89, 88, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 90, 0, 0,
+ 0, 0, 0, 88, 88, 0, 0, 0, 0, 0, 0, 7, 89, 0, 0, 88, 88, 0, 0, 2, 91, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 4, 4, 4, 0, 4, 4, 0, 88, 0, 0, 88, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 7, 7, 26, 89, 0, 0, 0, 0, 0, 0, 92, 0, 0, 0, 2, 4, 4, 5, 6, 0, 0, 0, 0, 0,
+ 0, 0, 9, 0, 0, 0, 0, 0, 15, 0, 93, 93, 0, 94, 0, 0, 9, 9, 20, 21, 95, 95, 0, 0,
+ 0, 0, 4, 4, 4, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 96, 28, 97, 98, 97, 98, 96, 28, 97, 98, 97, 98,
+ 99, 100, 0, 0, 0, 0, 0, 0, 20, 101, 21, 102, 102, 103, 75, 9, 0, 75, 104, 105,
+ 104, 9, 104, 9, 106, 107, 103, 106, 107, 106, 107, 9, 9, 9, 103, 0, 75, 103,
+ 9, 103, 9, 105, 104, 0, 28, 0, 28, 0, 108, 0, 108, 0, 0, 0, 0, 0, 33, 33, 104,
+ 9, 104, 9, 106, 107, 106, 107, 9, 9, 9, 103, 9, 103, 28, 28, 108, 108, 33,
+ 33, 103, 75, 9, 9, 105, 104, 0, 0, 0, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 109, 109, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 76, 0, 77, 0, 78, 0, 79, 0, 76, 0,
- 77, 0, 76, 0, 77, 0, 78, 0, 79, 0, 78, 0, 79, 80, 0, 81, 0, 82, 0, 83, 0, 84,
- 0, 85, 0, 86, 0, 87, 0, 0, 76, 0, 77, 0, 78, 88, 0, 89, 0, 90, 0, 91, 0, 0, 79,
- 0, 84, 0, 85, 0, 86, 0, 87, 0, 84, 0, 85, 0, 86, 0, 87, 88, 0, 89, 0, 90, 0,
- 91, 0, 0, 92, 0, 93, 0, 94, 0, 76, 0, 77, 0, 78, 0, 79, 0, 76, 0, 77, 0, 78,
- 0, 79, 0, 95, 96, 0, 97, 0, 0, 98, 99, 0, 100, 0, 0, 0, 99, 0, 0, 0, 99, 0, 0,
- 24, 99, 0, 0, 24, 0, 101, 0, 102, 0, 101, 103, 0, 104, 0, 104, 0, 104, 0, 96,
- 0, 99, 0, 0, 101, 0, 105, 0, 105, 11, 0, 0, 106, 0, 107, 4, 0, 4, 0, 5, 0, 6,
- 0, 0, 0, 4, 0, 4, 0, 5, 0, 6, 0, 0, 108, 0, 108, 109, 0, 110, 0, 110, 0, 111,
- 0, 81, 0, 36, 0, 112, 0, 111, 0, 86, 0, 110, 0, 110, 0, 113, 0, 114, 0, 114,
- 0, 115, 0, 116, 0, 116, 0, 117, 0, 117, 0, 97, 0, 97, 0, 111, 0, 97, 0, 97, 0,
- 116, 0, 116, 0, 118, 0, 82, 0, 86, 0, 119, 0, 82, 0, 7, 0, 7, 0, 81, 0, 120,
- 0, 11, 0, 110, 0, 110, 0, 120, 0, 0, 4, 49, 121, 4, 0, 4, 0, 5, 0, 6, 0, 0, 122,
- 123, 0, 0, 124, 0, 48, 0, 125, 0, 48, 2, 0, 4, 0, 4, 0, 126, 0, 127, 0, 11,
- 0, 11, 0, 11, 0, 3, 0, 3, 0, 4, 0, 3, 0, 3, 0, 3, 0, 3, 0, 3, 0, 3, 0, 3, 0,
- 3, 0, 3, 0, 0, 3, 3, 0, 3, 0, 0, 0, 3, 0, 128, 0, 3, 0, 0, 12, 0, 4, 0, 4, 3,
- 0, 3, 0, 4, 0, 3, 0, 0, 129, 0, 130, 3, 0, 3, 0, 4, 0, 3, 0, 0, 131, 0, 132,
- 0, 0, 0, 8, 0, 8, 0, 133, 0, 52, 0, 134, 0, 135, 39, 0, 39, 0, 128, 0, 128, 0,
- 128, 0, 128, 0, 128, 0, 128, 0, 128, 0, 128, 0, 128, 0, 128, 0, 39, 0, 128, 0,
- 128, 0, 128, 0, 39, 0, 39, 0, 128, 0, 128, 0, 128, 0, 3, 0, 3, 0, 3, 0, 136,
- 0, 3, 0, 3, 0, 3, 0, 39, 0, 39, 0, 0, 137, 0, 72, 0, 138, 0, 139, 3, 0, 3, 0,
- 4, 0, 4, 0, 3, 0, 3, 0, 4, 0, 4, 0, 4, 0, 4, 0, 3, 0, 3, 0, 4, 0, 4, 0, 140,
- 0, 141, 0, 142, 0, 36, 0, 36, 0, 36, 0, 141, 0, 141, 0, 142, 0, 36, 0, 36, 0,
- 36, 0, 141, 0, 4, 0, 3, 0, 128, 0, 3, 0, 3, 0, 4, 0, 3, 0, 3, 0, 0, 143, 0, 0,
- 0, 0, 11, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 24, 0, 24, 0, 24, 0, 24, 0, 24, 0, 24,
- 0, 24, 3, 0, 3, 0, 0, 7, 0, 7, 0, 7, 0, 39, 3, 0, 3, 0, 3, 0, 3, 0, 54, 0, 3,
- 0, 3, 0, 3, 0, 3, 0, 3, 0, 54, 0, 3, 0, 3, 0, 3, 0, 3, 0, 3, 0, 3, 0, 3, 0,
- 3, 0, 3, 0, 3, 0, 39, 0, 144, 0, 3, 0, 3, 0, 4, 0, 3, 0, 3, 0, 3, 0, 4, 0, 3,
- 0, 0, 145, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 146, 0, 7, 0, 147, 0, 146, 0, 0,
- 148, 0, 148, 0, 149, 0, 148, 0, 149, 0, 148, 0, 148, 150, 0, 0, 151, 0, 0, 146,
- 0, 146, 0, 0, 11, 0, 7, 0, 7, 0, 38, 0, 147, 0, 0, 7, 0, 147, 0, 0, 152, 146,
- 0, 146, 0, 0, 10, 2, 0, 153, 0, 0, 154, 0, 154, 0, 154, 0, 154, 0, 154, 0,
- 154, 0, 154, 0, 154, 0, 154, 0, 154, 0, 154, 0, 154, 0, 154, 0, 154, 0, 154,
- 0, 154, 0, 154, 0, 154, 0, 154, 0, 154, 0, 154, 0, 154, 0, 154, 0, 154, 0, 154,
- 0, 154, 0, 154, 0, 154, 0, 154, 0, 154, 0, 0, 0, 64, 4, 0, 4, 0, 4, 0, 0, 4,
- 4, 0, 4, 0, 0, 12, 146, 0, 0, 155, 0, 10, 146, 0, 0, 155, 0, 10, 0, 4, 0, 4,
- 0, 64, 0, 47, 0, 156, 0, 148, 0, 156, 7, 0, 7, 0, 38, 0, 147, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 157, 158, 0, 0, 156, 2, 0, 4, 0, 4, 0, 5, 0, 6, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11, 0, 19, 0, 11, 0, 11, 0, 31, 0, 32, 0, 0,
- 0, 4, 0, 4, 0, 4, 0, 4, 0, 0, 159, 0, 160, 0, 159, 0, 160, 0, 8, 0, 8, 0, 161,
- 0, 162, 0, 8, 0, 8, 0, 8, 0, 8, 0, 8, 0, 8, 7, 0, 0, 7, 0, 8, 0, 8, 0, 8, 0,
- 8, 0, 8, 0, 8, 0, 8, 0, 8, 0, 8, 0, 8, 0, 8, 0, 8, 0, 8, 0, 8, 0, 163, 0, 163,
- 164, 0, 40, 0, 165, 0, 166, 0, 165, 0, 166, 0, 164, 0, 40, 0, 165, 0, 166,
- 0, 165, 0, 166, 0, 167, 0, 168, 0, 0, 8, 0, 8, 0, 169, 0, 170, 31, 0, 32, 0, 171,
- 0, 171, 0, 172, 0, 11, 0, 0, 8, 120, 0, 173, 0, 173, 0, 11, 0, 173, 0, 11,
- 0, 172, 0, 11, 0, 172, 0, 0, 174, 172, 0, 11, 0, 172, 0, 11, 0, 173, 0, 40, 0,
- 0, 175, 40, 0, 0, 176, 0, 177, 0, 178, 45, 0, 45, 0, 173, 0, 11, 0, 173, 0,
- 11, 0, 11, 0, 172, 0, 11, 0, 172, 0, 40, 0, 40, 0, 45, 0, 45, 0, 172, 0, 11, 0,
- 11, 0, 173, 0, 0, 176, 0, 177, 0, 8, 0, 8, 0, 8, 0, 161, 0, 162, 0, 8, 0, 179,
- 0, 8, 0, 101, 0, 101, 180, 0, 180, 0, 11, 0, 11, 0, 0, 181, 0, 182, 0, 183,
- 0, 182, 0, 183, 0, 181, 0, 182, 0, 183, 0, 182, 0, 183, 0, 52, 0, 184, 0, 184,
- 0, 185, 0, 186, 0, 184, 0, 184, 0, 187, 0, 188, 0, 184, 0, 184, 0, 187, 0, 188,
- 0, 184, 0, 184, 0, 187, 0, 188, 0, 189, 0, 189, 0, 190, 0, 191, 0, 184, 0,
- 184, 0, 184, 0, 184, 0, 184, 0, 184, 0, 189, 0, 189, 0, 184, 0, 184, 0, 187,
- 0, 188, 0, 184, 0, 184, 0, 187, 0, 188, 0, 184, 0, 184, 0, 187, 0, 188, 0, 184,
- 0, 184, 0, 184, 0, 184, 0, 184, 0, 184, 0, 189, 0, 189, 0, 189, 0, 189, 0, 190,
- 0, 191, 0, 184, 0, 184, 0, 187, 0, 188, 0, 184, 0, 184, 0, 187, 0, 188, 0,
- 184, 0, 184, 0, 187, 0, 188, 0, 189, 0, 189, 0, 190, 0, 191, 0, 184, 0, 184,
- 0, 187, 0, 188, 0, 184, 0, 184, 0, 187, 0, 188, 0, 184, 0, 184, 0, 192, 0, 193,
- 0, 189, 0, 189, 0, 190, 0, 191, 0, 194, 0, 194, 0, 39, 0, 195, 11, 0, 11, 0,
- 39, 0, 196, 0, 99, 197, 99, 198, 0, 24, 0, 24, 0, 24, 0, 24, 0, 24, 0, 24, 0,
- 24, 0, 24, 99, 198, 99, 199, 11, 0, 11, 0, 0, 200, 0, 201, 0, 11, 0, 11, 0, 200,
- 0, 201, 0, 8, 0, 8, 0, 8, 0, 8, 0, 8, 0, 8, 0, 8, 0, 202, 0, 203, 0, 204,
- 0, 203, 0, 204, 0, 202, 0, 203, 0, 204, 0, 203, 0, 204, 0, 162, 111, 0, 0, 98,
- 0, 106, 0, 205, 0, 205, 0, 8, 0, 8, 0, 161, 0, 162, 0, 0, 0, 206, 0, 0, 0, 8,
- 0, 8, 0, 161, 0, 162, 0, 0, 0, 207, 0, 0, 208, 0, 208, 0, 81, 0, 209, 0, 208,
- 0, 208, 0, 208, 0, 208, 0, 208, 0, 208, 0, 208, 0, 208, 0, 0, 210, 211, 212,
- 211, 212, 0, 213, 116, 214, 116, 214, 215, 0, 216, 0, 111, 0, 111, 0, 111, 0,
- 111, 0, 217, 0, 116, 218, 11, 0, 11, 0, 118, 219, 208, 0, 208, 0, 0, 8, 0, 220,
- 0, 206, 171, 0, 0, 0, 0, 221, 0, 207, 0, 8, 0, 8, 0, 161, 0, 162, 222, 0, 0,
- 220, 0, 8, 0, 8, 0, 223, 0, 223, 11, 0, 11, 0, 11, 0, 11, 0, 0, 8, 0, 8, 0, 8,
- 0, 8, 0, 8, 0, 8, 0, 8, 0, 8, 0, 8, 0, 8, 0, 8, 0, 8, 0, 8, 0, 8, 0, 8, 0, 8,
- 0, 8, 0, 8, 0, 8, 0, 8, 0, 8, 0, 8, 0, 163, 0, 8, 224, 0, 45, 0, 225, 0, 225,
- 0, 40, 0, 226, 0, 0, 8, 0, 189, 0, 227, 0, 227, 0, 8, 0, 8, 0, 8, 0, 8, 0, 129,
- 0, 130, 0, 8, 0, 8, 0, 8, 0, 8, 0, 131, 0, 132, 0, 227, 0, 227, 0, 227, 0,
- 227, 0, 227, 0, 227, 0, 179, 0, 179, 171, 0, 171, 0, 171, 0, 171, 0, 0, 179,
- 0, 179, 0, 179, 0, 179, 0, 179, 0, 179, 11, 0, 11, 0, 0, 184, 0, 184, 0, 184,
- 0, 184, 0, 228, 0, 228, 0, 8, 0, 8, 0, 8, 0, 184, 0, 8, 0, 8, 0, 184, 0, 184,
- 0, 189, 0, 189, 0, 229, 0, 229, 0, 229, 0, 8, 0, 229, 0, 8, 0, 184, 0, 184, 0,
- 184, 0, 184, 0, 184, 0, 8, 11, 0, 11, 0, 11, 0, 11, 0, 0, 133, 0, 52, 0, 134,
- 0, 230, 99, 198, 99, 197, 99, 199, 99, 198, 7, 0, 7, 0, 7, 0, 0, 8, 7, 0, 0,
- 8, 7, 0, 7, 0, 7, 0, 7, 0, 7, 0, 7, 0, 0, 8, 7, 0, 7, 0, 136, 0, 7, 0, 0, 8, 7,
- 0, 0, 8, 0, 8, 7, 0, 0, 231, 0, 162, 0, 161, 0, 232, 11, 0, 11, 0, 0, 233, 0,
- 233, 0, 233, 0, 233, 0, 233, 0, 233, 0, 233, 0, 233, 0, 233, 0, 233, 0, 233,
- 0, 233, 0, 184, 0, 184, 0, 8, 0, 8, 0, 205, 0, 205, 0, 8, 0, 8, 0, 8, 0, 8, 0,
- 8, 0, 8, 0, 8, 0, 8, 0, 8, 0, 8, 0, 8, 0, 8, 0, 8, 0, 8, 0, 8, 0, 8, 234, 0,
- 234, 0, 235, 0, 174, 0, 225, 0, 225, 0, 225, 0, 225, 0, 140, 0, 234, 0, 236,
- 0, 174, 0, 235, 0, 235, 0, 174, 0, 236, 0, 174, 0, 235, 0, 174, 0, 237, 0, 238,
- 0, 172, 0, 172, 0, 172, 0, 237, 0, 235, 0, 174, 0, 236, 0, 174, 0, 235, 0, 174,
- 0, 234, 0, 174, 0, 237, 0, 238, 0, 172, 0, 172, 0, 172, 0, 237, 0, 0, 8, 0,
- 8, 0, 8, 0, 8, 0, 8, 0, 8, 0, 8, 0, 8, 0, 8, 11, 0, 11, 0, 11, 0, 11, 0, 0,
- 8, 0, 8, 0, 8, 0, 239, 0, 11, 0, 11, 0, 8, 0, 8, 0, 11, 0, 11, 0, 8, 0, 8, 0,
- 240, 0, 240, 0, 240, 0, 240, 0, 8, 111, 0, 111, 0, 241, 0, 111, 0, 0, 240, 0,
- 240, 0, 240, 0, 240, 0, 240, 0, 240, 0, 8, 0, 8, 0, 184, 0, 184, 0, 184, 0, 8,
- 0, 240, 0, 240, 0, 8, 0, 8, 0, 184, 0, 184, 0, 184, 0, 8, 0, 8, 0, 227, 0, 11,
- 0, 11, 0, 11, 0, 8, 0, 8, 0, 8, 0, 242, 0, 243, 0, 242, 0, 8, 0, 8, 0, 8, 0,
- 242, 0, 242, 0, 242, 0, 8, 0, 8, 0, 8, 0, 242, 0, 242, 0, 243, 0, 242, 0, 8,
- 0, 8, 0, 8, 0, 242, 0, 8, 0, 8, 0, 8, 0, 8, 0, 8, 0, 8, 0, 8, 0, 8, 0, 184, 0,
- 184, 222, 0, 0, 227, 0, 227, 0, 227, 0, 227, 0, 227, 0, 227, 0, 227, 0, 227,
- 0, 8, 0, 8, 0, 8, 0, 8, 0, 8, 0, 8, 0, 8, 0, 8, 0, 8, 0, 8, 0, 8, 0, 8, 0, 8,
- 0, 200, 0, 201, 11, 0, 11, 0, 0, 200, 0, 201, 180, 0, 180, 0, 0, 200, 0, 201,
- 11, 0, 0, 201, 0, 11, 0, 11, 0, 200, 0, 201, 0, 11, 0, 11, 0, 200, 0, 201, 0,
- 11, 0, 11, 0, 200, 0, 201, 11, 0, 11, 0, 0, 200, 0, 201, 180, 0, 180, 0, 0, 200,
- 0, 201, 11, 0, 0, 201, 0, 8, 0, 8, 0, 161, 0, 162, 111, 0, 111, 0, 0, 24, 0,
- 24, 0, 24, 0, 24, 0, 24, 0, 24, 0, 24, 0, 24, 111, 0, 241, 0, 0, 8, 0, 8, 0,
- 8, 0, 8, 0, 8, 0, 8, 11, 0, 11, 0, 0, 200, 0, 201, 0, 157, 0, 8, 0, 8, 0, 161,
- 0, 162, 222, 0, 222, 0, 31, 0, 32, 0, 0, 8, 0, 8, 0, 8, 0, 8, 0, 8, 0, 8, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 102, 0, 102, 0, 244, 0, 0, 245, 0, 0, 0, 246, 0, 0, 0,
- 0, 149, 0, 0, 2, 0, 4, 0, 4, 0, 0, 247, 0, 247, 0, 247, 0, 247, 0, 248, 0, 248,
- 0, 248, 0, 248, 0, 248, 0, 248, 0, 248, 0, 248, 0, 244, 0, 0
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 27, 110, 60, 60, 0, 0, 0, 0,
+ 0, 0, 0, 0, 60, 111, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 67, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 112, 112, 47, 113, 112, 112, 112, 112, 112, 112, 112,
+ 112, 0, 114, 114, 0, 71, 71, 115, 116, 67, 67, 67, 67, 117, 71, 118, 9, 9,
+ 73, 112, 112, 49, 0, 0, 0, 102, 0, 0, 0, 0, 0, 0, 0, 0, 0, 119, 0, 0, 0, 0, 0,
+ 0, 0, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 120, 33, 121, 121, 28, 122, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 102, 102, 102, 102, 0, 0, 0, 0,
+ 0, 0, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 0, 0, 0, 0, 60, 60, 111, 60, 7, 7, 7, 0, 7, 0,
+ 7, 7, 7, 7, 7, 7, 0, 7, 7, 81, 7, 0, 7, 0, 0, 7, 0, 0, 0, 0, 9, 9, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 123, 123, 124, 125, 121, 121, 121, 121, 82, 123, 126, 125, 124, 124,
+ 125, 126, 125, 124, 125, 127, 128, 103, 103, 103, 127, 124, 125, 126, 125,
+ 124, 125, 123, 125, 127, 128, 103, 103, 103, 127, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 67, 67, 129, 67,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 119, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 9, 9, 0, 0, 109, 109, 0, 0, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 0, 0, 109, 109, 0, 0, 9, 9, 0, 0, 0, 0, 0, 0,
+ 0, 0, 67, 67, 0, 0, 0, 0, 0, 0, 0, 0, 67, 129, 0, 0, 0, 0, 0, 0, 9, 9, 9, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 119, 119, 20, 101, 21, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 130, 131, 130, 131, 0, 132, 0, 133, 0, 0, 0, 2, 4, 4, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
};
-const InstDB::RWInfo InstDB::rwInfo[] = {
- { InstDB::RWInfo::kCategoryGeneric , 0 , { 0 , 0 , 0 , 0 , 0 , 0 } }, // #0 [ref=1609x]
- { InstDB::RWInfo::kCategoryGeneric , 0 , { 1 , 0 , 0 , 0 , 0 , 0 } }, // #1 [ref=7x]
+const uint8_t InstDB::rwInfoIndexB[Inst::_kIdCount] = {
+ 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 3, 0, 0, 0,
+ 0, 0, 4, 0, 0, 0, 0, 0, 5, 5, 6, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 7, 0, 0, 0, 0, 4, 8, 1, 0, 9, 0, 0, 0, 10, 10, 10, 0, 0, 11, 0, 0, 10, 12,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 5, 5, 0, 13, 14, 15, 16, 17, 0, 0, 18, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 1, 1, 20, 21, 0, 0,
+ 0, 0, 5, 5, 0, 0, 0, 0, 0, 0, 22, 23, 0, 0, 24, 25, 26, 27, 0, 0, 25, 25, 25,
+ 25, 25, 25, 25, 25, 28, 29, 29, 28, 0, 0, 0, 24, 25, 24, 25, 0, 25, 24, 24, 24,
+ 24, 24, 24, 24, 0, 0, 30, 30, 30, 24, 24, 28, 0, 31, 10, 0, 0, 0, 0, 0, 0, 24,
+ 25, 0, 0, 0, 32, 33, 32, 34, 0, 0, 0, 0, 0, 10, 32, 0, 0, 0, 0, 35, 33, 32,
+ 35, 34, 24, 25, 24, 25, 0, 29, 29, 29, 29, 0, 0, 0, 25, 10, 10, 32, 32, 0, 0,
+ 0, 0, 5, 5, 0, 0, 0, 0, 0, 0, 0, 21, 36, 0, 20, 37, 38, 0, 39, 40, 0, 0, 0, 0,
+ 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 41, 42, 43, 44, 41, 42, 41, 42, 43,
+ 44, 43, 44, 0, 0, 0, 0, 0, 0, 0, 0, 41, 42, 43, 0, 0, 0, 0, 44, 45, 46, 47,
+ 48, 45, 46, 47, 48, 0, 0, 0, 0, 49, 50, 51, 41, 42, 43, 44, 41, 42, 43, 44, 52,
+ 0, 24, 0, 53, 0, 54, 0, 0, 0, 0, 0, 10, 0, 10, 24, 55, 56, 55, 0, 0, 0, 0,
+ 0, 0, 55, 57, 57, 0, 58, 59, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 60, 60, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 61, 0, 0, 0, 0, 62, 0, 63, 20, 64, 20, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 65, 0, 0, 0, 0, 0, 0, 6,
+ 5, 5, 0, 0, 0, 0, 66, 67, 0, 0, 0, 0, 68, 69, 0, 3, 3, 70, 22, 71, 72, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 73, 39, 74, 75, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 76, 0, 0, 0, 0, 0, 0, 0, 10,
+ 10, 10, 10, 10, 10, 10, 0, 0, 2, 2, 2, 77, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64, 0, 0, 0, 0, 0, 0, 0, 0, 78, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 79, 79, 80, 79, 80, 80, 80, 79, 79, 81, 82, 0, 83, 0,
+ 0, 0, 0, 0, 0, 84, 2, 2, 85, 86, 0, 0, 0, 11, 87, 0, 0, 4, 0, 0, 0, 88, 0, 89,
+ 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89,
+ 89, 89, 89, 89, 89, 89, 89, 89, 89, 0, 89, 0, 32, 0, 0, 0, 5, 0, 0, 6, 0, 90,
+ 4, 0, 90, 4, 5, 5, 32, 19, 91, 79, 91, 0, 0, 0, 0, 0, 0, 0, 0, 0, 92, 0, 91, 93,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 94, 94, 94, 94, 94, 0, 0, 0, 0, 0,
+ 0, 95, 96, 0, 0, 0, 0, 0, 0, 0, 0, 56, 96, 0, 0, 0, 0, 97, 98, 97, 98, 3, 3,
+ 3, 99, 100, 101, 3, 3, 3, 3, 3, 3, 0, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 102, 102,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 103, 3, 104, 105, 106, 0, 0,
+ 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 107,
+ 0, 0, 0, 0, 0, 0, 0, 108, 0, 109, 0, 110, 0, 110, 0, 111, 112, 113, 114, 115,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 111, 112, 113, 0, 0, 3, 3, 3, 3, 99, 110, 101, 3, 116, 3, 55, 55, 0, 0,
+ 0, 0, 117, 118, 119, 118, 119, 117, 118, 119, 118, 119, 22, 120, 121, 120, 121,
+ 120, 120, 122, 123, 120, 120, 120, 124, 125, 126, 120, 120, 120, 124, 125,
+ 126, 120, 120, 120, 124, 125, 126, 120, 121, 127, 127, 128, 129, 120, 120, 120,
+ 120, 120, 120, 120, 120, 120, 127, 127, 120, 120, 120, 124, 130, 126, 120,
+ 120, 120, 124, 130, 126, 120, 120, 120, 124, 130, 126, 120, 120, 120, 120, 120,
+ 120, 120, 120, 120, 127, 127, 127, 127, 128, 129, 120, 121, 120, 120, 120, 124,
+ 125, 126, 120, 120, 120, 124, 125, 126, 120, 120, 120, 124, 125, 126, 127,
+ 127, 128, 129, 120, 120, 120, 124, 130, 126, 120, 120, 120, 124, 130, 126, 120,
+ 120, 120, 131, 130, 132, 127, 127, 128, 129, 133, 133, 133, 77, 134, 135, 0,
+ 0, 0, 0, 136, 137, 10, 10, 10, 10, 10, 10, 10, 10, 137, 138, 0, 0, 0, 139, 140,
+ 141, 84, 84, 84, 139, 140, 141, 3, 3, 3, 3, 3, 3, 3, 142, 143, 144, 143, 144,
+ 142, 143, 144, 143, 144, 101, 0, 53, 58, 145, 145, 3, 3, 3, 99, 100, 101,
+ 0, 146, 0, 3, 3, 3, 99, 100, 101, 0, 147, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 148, 149, 149, 150, 151, 151, 0, 0, 0, 0, 0, 0, 0, 152, 153, 0, 0, 154, 0,
+ 0, 0, 3, 11, 146, 0, 0, 155, 147, 3, 3, 3, 99, 100, 101, 0, 11, 3, 3, 156, 156,
+ 157, 157, 0, 0, 0, 0, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 3, 3, 102, 3, 0, 0, 0, 0, 0, 0, 3, 127, 103, 103, 3, 3, 3, 3,
+ 66, 67, 3, 3, 3, 3, 68, 69, 103, 103, 103, 103, 103, 103, 116, 116, 0, 0, 0,
+ 0, 116, 116, 116, 116, 116, 116, 0, 0, 120, 120, 120, 120, 158, 158, 3, 3, 3,
+ 120, 3, 3, 120, 120, 127, 127, 159, 159, 159, 3, 159, 3, 120, 120, 120, 120,
+ 120, 3, 0, 0, 0, 0, 70, 22, 71, 160, 137, 136, 138, 137, 0, 0, 0, 3, 0, 3, 0,
+ 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 3, 0, 3, 3, 0, 161, 101, 99, 100, 0, 0, 162, 162,
+ 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 120, 120, 3, 3, 145, 145,
+ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 3, 3, 3, 3, 3, 3, 3, 3, 3, 0, 0, 0, 0, 3, 3, 3, 163, 84, 84, 3, 3, 84,
+ 84, 3, 3, 164, 164, 164, 164, 3, 0, 0, 0, 0, 164, 164, 164, 164, 164, 164, 3,
+ 3, 120, 120, 120, 3, 164, 164, 3, 3, 120, 120, 120, 3, 3, 103, 84, 84, 84, 3,
+ 3, 3, 165, 166, 165, 3, 3, 3, 165, 165, 165, 3, 3, 3, 165, 165, 166, 165, 3,
+ 3, 3, 165, 3, 3, 3, 3, 3, 3, 3, 3, 120, 120, 0, 103, 103, 103, 103, 103, 103,
+ 103, 103, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 139, 141, 0, 0, 139, 141, 0,
+ 0, 139, 141, 0, 0, 140, 141, 84, 84, 84, 139, 140, 141, 84, 84, 84, 139, 140,
+ 141, 84, 84, 139, 141, 0, 0, 139, 141, 0, 0, 139, 141, 0, 0, 140, 141, 3, 3,
+ 3, 99, 100, 101, 0, 0, 10, 10, 10, 10, 10, 10, 10, 10, 0, 0, 3, 3, 3, 3, 3, 3,
+ 0, 0, 0, 139, 140, 141, 92, 3, 3, 3, 99, 100, 101, 0, 0, 0, 0, 0, 3, 3, 3, 3,
+ 3, 3, 0, 0, 0, 0, 56, 56, 167, 0, 0, 0, 0, 0, 0, 0, 0, 0, 80, 0, 0, 0, 0, 0,
+ 168, 168, 168, 168, 169, 169, 169, 169, 169, 169, 169, 169, 167, 0, 0
+};
+
+const InstDB::RWInfo InstDB::rwInfoA[] = {
+ { InstDB::RWInfo::kCategoryGeneric , 0 , { 0 , 0 , 0 , 0 , 0 , 0 } }, // #0 [ref=1008x]
+ { InstDB::RWInfo::kCategoryGeneric , 0 , { 1 , 0 , 0 , 0 , 0 , 0 } }, // #1 [ref=2x]
{ InstDB::RWInfo::kCategoryGeneric , 1 , { 2 , 3 , 0 , 0 , 0 , 0 } }, // #2 [ref=7x]
- { InstDB::RWInfo::kCategoryGeneric , 2 , { 2 , 3 , 0 , 0 , 0 , 0 } }, // #3 [ref=100x]
- { InstDB::RWInfo::kCategoryGeneric , 3 , { 4 , 5 , 0 , 0 , 0 , 0 } }, // #4 [ref=69x]
- { InstDB::RWInfo::kCategoryGeneric , 4 , { 6 , 7 , 0 , 0 , 0 , 0 } }, // #5 [ref=7x]
- { InstDB::RWInfo::kCategoryGeneric , 5 , { 8 , 9 , 0 , 0 , 0 , 0 } }, // #6 [ref=7x]
- { InstDB::RWInfo::kCategoryGeneric , 3 , { 10, 5 , 0 , 0 , 0 , 0 } }, // #7 [ref=33x]
- { InstDB::RWInfo::kCategoryGeneric , 6 , { 11, 3 , 3 , 0 , 0 , 0 } }, // #8 [ref=186x]
- { InstDB::RWInfo::kCategoryGeneric , 7 , { 12, 13, 0 , 0 , 0 , 0 } }, // #9 [ref=1x]
- { InstDB::RWInfo::kCategoryGeneric , 2 , { 11, 3 , 3 , 0 , 0 , 0 } }, // #10 [ref=5x]
- { InstDB::RWInfo::kCategoryGeneric , 2 , { 11, 3 , 0 , 0 , 0 , 0 } }, // #11 [ref=81x]
- { InstDB::RWInfo::kCategoryGeneric , 3 , { 4 , 5 , 14, 0 , 0 , 0 } }, // #12 [ref=4x]
- { InstDB::RWInfo::kCategoryGeneric , 2 , { 5 , 3 , 0 , 0 , 0 , 0 } }, // #13 [ref=3x]
- { InstDB::RWInfo::kCategoryGeneric , 8 , { 10, 3 , 0 , 0 , 0 , 0 } }, // #14 [ref=2x]
- { InstDB::RWInfo::kCategoryGeneric , 9 , { 10, 5 , 0 , 0 , 0 , 0 } }, // #15 [ref=1x]
- { InstDB::RWInfo::kCategoryGeneric , 8 , { 11, 5 , 0 , 0 , 0 , 0 } }, // #16 [ref=1x]
- { InstDB::RWInfo::kCategoryGeneric , 0 , { 3 , 3 , 0 , 0 , 0 , 0 } }, // #17 [ref=1x]
- { InstDB::RWInfo::kCategoryGeneric , 0 , { 2 , 0 , 0 , 0 , 0 , 0 } }, // #18 [ref=1x]
- { InstDB::RWInfo::kCategoryGeneric , 10, { 3 , 3 , 0 , 0 , 0 , 0 } }, // #19 [ref=2x]
- { InstDB::RWInfo::kCategoryGeneric , 10, { 2 , 3 , 0 , 0 , 0 , 0 } }, // #20 [ref=3x]
- { InstDB::RWInfo::kCategoryGeneric , 11, { 3 , 0 , 0 , 0 , 0 , 0 } }, // #21 [ref=2x]
- { InstDB::RWInfo::kCategoryGeneric , 0 , { 15, 16, 0 , 0 , 0 , 0 } }, // #22 [ref=1x]
- { InstDB::RWInfo::kCategoryGeneric , 0 , { 17, 0 , 0 , 0 , 0 , 0 } }, // #23 [ref=1x]
- { InstDB::RWInfo::kCategoryGeneric , 8 , { 3 , 0 , 0 , 0 , 0 , 0 } }, // #24 [ref=34x]
- { InstDB::RWInfo::kCategoryGeneric , 0 , { 18, 0 , 0 , 0 , 0 , 0 } }, // #25 [ref=1x]
- { InstDB::RWInfo::kCategoryGeneric , 1 , { 3 , 3 , 0 , 0 , 0 , 0 } }, // #26 [ref=1x]
- { InstDB::RWInfo::kCategoryGeneric , 0 , { 19, 20, 0 , 0 , 0 , 0 } }, // #27 [ref=1x]
- { InstDB::RWInfo::kCategoryGeneric , 11, { 2 , 3 , 21, 0 , 0 , 0 } }, // #28 [ref=1x]
- { InstDB::RWInfo::kCategoryGeneric , 12, { 4 , 22, 17, 23, 24, 0 } }, // #29 [ref=1x]
- { InstDB::RWInfo::kCategoryGeneric , 13, { 25, 26, 27, 28, 29, 0 } }, // #30 [ref=1x]
- { InstDB::RWInfo::kCategoryGeneric , 4 , { 7 , 7 , 0 , 0 , 0 , 0 } }, // #31 [ref=4x]
- { InstDB::RWInfo::kCategoryGeneric , 5 , { 9 , 9 , 0 , 0 , 0 , 0 } }, // #32 [ref=4x]
- { InstDB::RWInfo::kCategoryGeneric , 0 , { 27, 30, 31, 15, 0 , 0 } }, // #33 [ref=1x]
- { InstDB::RWInfo::kCategoryGeneric , 0 , { 32, 33, 0 , 0 , 0 , 0 } }, // #34 [ref=1x]
- { InstDB::RWInfo::kCategoryGeneric , 14, { 2 , 3 , 0 , 0 , 0 , 0 } }, // #35 [ref=1x]
- { InstDB::RWInfo::kCategoryGeneric , 4 , { 10, 7 , 0 , 0 , 0 , 0 } }, // #36 [ref=10x]
- { InstDB::RWInfo::kCategoryGeneric , 3 , { 34, 5 , 0 , 0 , 0 , 0 } }, // #37 [ref=5x]
- { InstDB::RWInfo::kCategoryGeneric , 4 , { 35, 7 , 0 , 0 , 0 , 0 } }, // #38 [ref=3x]
- { InstDB::RWInfo::kCategoryGeneric , 4 , { 34, 7 , 0 , 0 , 0 , 0 } }, // #39 [ref=13x]
- { InstDB::RWInfo::kCategoryGeneric , 4 , { 11, 7 , 0 , 0 , 0 , 0 } }, // #40 [ref=9x]
- { InstDB::RWInfo::kCategoryGeneric , 4 , { 36, 7 , 0 , 0 , 0 , 0 } }, // #41 [ref=1x]
- { InstDB::RWInfo::kCategoryGeneric , 14, { 35, 3 , 0 , 0 , 0 , 0 } }, // #42 [ref=1x]
- { InstDB::RWInfo::kCategoryGeneric , 14, { 36, 3 , 0 , 0 , 0 , 0 } }, // #43 [ref=1x]
- { InstDB::RWInfo::kCategoryGeneric , 5 , { 35, 9 , 0 , 0 , 0 , 0 } }, // #44 [ref=1x]
- { InstDB::RWInfo::kCategoryGeneric , 5 , { 11, 9 , 0 , 0 , 0 , 0 } }, // #45 [ref=7x]
- { InstDB::RWInfo::kCategoryGeneric , 0 , { 37, 38, 0 , 0 , 0 , 0 } }, // #46 [ref=1x]
- { InstDB::RWInfo::kCategoryGeneric , 0 , { 27, 0 , 0 , 0 , 0 , 0 } }, // #47 [ref=2x]
- { InstDB::RWInfo::kCategoryGeneric , 10, { 2 , 0 , 0 , 0 , 0 , 0 } }, // #48 [ref=4x]
- { InstDB::RWInfo::kCategoryGeneric , 15, { 1 , 39, 0 , 0 , 0 , 0 } }, // #49 [ref=3x]
- { InstDB::RWInfo::kCategoryGeneric , 6 , { 40, 41, 3 , 0 , 0 , 0 } }, // #50 [ref=2x]
- { InstDB::RWInfo::kCategoryGeneric , 16, { 42, 43, 0 , 0 , 0 , 0 } }, // #51 [ref=2x]
- { InstDB::RWInfo::kCategoryGeneric , 17, { 42, 5 , 0 , 0 , 0 , 0 } }, // #52 [ref=4x]
- { InstDB::RWInfo::kCategoryGeneric , 0 , { 4 , 5 , 0 , 0 , 0 , 0 } }, // #53 [ref=3x]
- { InstDB::RWInfo::kCategoryGeneric , 0 , { 4 , 0 , 0 , 0 , 0 , 0 } }, // #54 [ref=3x]
- { InstDB::RWInfo::kCategoryGeneric , 0 , { 44, 45, 0 , 0 , 0 , 0 } }, // #55 [ref=6x]
- { InstDB::RWInfo::kCategoryGeneric , 18, { 3 , 0 , 0 , 0 , 0 , 0 } }, // #56 [ref=15x]
- { InstDB::RWInfo::kCategoryGeneric , 0 , { 44, 0 , 0 , 0 , 0 , 0 } }, // #57 [ref=16x]
- { InstDB::RWInfo::kCategoryGeneric , 19, { 45, 0 , 0 , 0 , 0 , 0 } }, // #58 [ref=1x]
- { InstDB::RWInfo::kCategoryGeneric , 19, { 46, 0 , 0 , 0 , 0 , 0 } }, // #59 [ref=1x]
- { InstDB::RWInfo::kCategoryGeneric , 20, { 3 , 0 , 0 , 0 , 0 , 0 } }, // #60 [ref=3x]
- { InstDB::RWInfo::kCategoryGeneric , 0 , { 45, 0 , 0 , 0 , 0 , 0 } }, // #61 [ref=6x]
- { InstDB::RWInfo::kCategoryGeneric , 18, { 11, 0 , 0 , 0 , 0 , 0 } }, // #62 [ref=3x]
- { InstDB::RWInfo::kCategoryGeneric , 21, { 13, 0 , 0 , 0 , 0 , 0 } }, // #63 [ref=1x]
- { InstDB::RWInfo::kCategoryGeneric , 8 , { 11, 0 , 0 , 0 , 0 , 0 } }, // #64 [ref=8x]
- { InstDB::RWInfo::kCategoryGeneric , 21, { 47, 0 , 0 , 0 , 0 , 0 } }, // #65 [ref=2x]
- { InstDB::RWInfo::kCategoryGeneric , 7 , { 48, 0 , 0 , 0 , 0 , 0 } }, // #66 [ref=2x]
- { InstDB::RWInfo::kCategoryGeneric , 20, { 11, 0 , 0 , 0 , 0 , 0 } }, // #67 [ref=2x]
- { InstDB::RWInfo::kCategoryImul , 2 , { 0 , 0 , 0 , 0 , 0 , 0 } }, // #68 [ref=1x]
- { InstDB::RWInfo::kCategoryImul , 22, { 0 , 0 , 0 , 0 , 0 , 0 } }, // #69 [ref=1x]
- { InstDB::RWInfo::kCategoryGeneric , 0 , { 49, 50, 0 , 0 , 0 , 0 } }, // #70 [ref=1x]
- { InstDB::RWInfo::kCategoryGeneric , 0 , { 51, 50, 0 , 0 , 0 , 0 } }, // #71 [ref=1x]
- { InstDB::RWInfo::kCategoryGeneric , 5 , { 4 , 9 , 0 , 0 , 0 , 0 } }, // #72 [ref=2x]
- { InstDB::RWInfo::kCategoryGeneric , 12, { 3 , 5 , 0 , 0 , 0 , 0 } }, // #73 [ref=3x]
- { InstDB::RWInfo::kCategoryGeneric , 0 , { 21, 28, 0 , 0 , 0 , 0 } }, // #74 [ref=1x]
- { InstDB::RWInfo::kCategoryGeneric , 0 , { 52, 0 , 0 , 0 , 0 , 0 } }, // #75 [ref=1x]
- { InstDB::RWInfo::kCategoryGeneric , 0 , { 53, 39, 39, 0 , 0 , 0 } }, // #76 [ref=6x]
- { InstDB::RWInfo::kCategoryGeneric , 0 , { 42, 9 , 9 , 0 , 0 , 0 } }, // #77 [ref=6x]
- { InstDB::RWInfo::kCategoryGeneric , 0 , { 34, 7 , 7 , 0 , 0 , 0 } }, // #78 [ref=6x]
- { InstDB::RWInfo::kCategoryGeneric , 0 , { 47, 13, 13, 0 , 0 , 0 } }, // #79 [ref=6x]
- { InstDB::RWInfo::kCategoryGeneric , 23, { 53, 39, 0 , 0 , 0 , 0 } }, // #80 [ref=1x]
- { InstDB::RWInfo::kCategoryGeneric , 24, { 42, 9 , 0 , 0 , 0 , 0 } }, // #81 [ref=4x]
- { InstDB::RWInfo::kCategoryGeneric , 25, { 34, 7 , 0 , 0 , 0 , 0 } }, // #82 [ref=3x]
- { InstDB::RWInfo::kCategoryGeneric , 26, { 47, 13, 0 , 0 , 0 , 0 } }, // #83 [ref=1x]
- { InstDB::RWInfo::kCategoryGeneric , 0 , { 53, 39, 0 , 0 , 0 , 0 } }, // #84 [ref=3x]
- { InstDB::RWInfo::kCategoryGeneric , 0 , { 42, 9 , 0 , 0 , 0 , 0 } }, // #85 [ref=3x]
- { InstDB::RWInfo::kCategoryGeneric , 0 , { 34, 7 , 0 , 0 , 0 , 0 } }, // #86 [ref=5x]
- { InstDB::RWInfo::kCategoryGeneric , 0 , { 47, 13, 0 , 0 , 0 , 0 } }, // #87 [ref=3x]
- { InstDB::RWInfo::kCategoryGeneric , 0 , { 39, 39, 0 , 0 , 0 , 0 } }, // #88 [ref=2x]
- { InstDB::RWInfo::kCategoryGeneric , 0 , { 9 , 9 , 0 , 0 , 0 , 0 } }, // #89 [ref=2x]
- { InstDB::RWInfo::kCategoryGeneric , 0 , { 7 , 7 , 0 , 0 , 0 , 0 } }, // #90 [ref=2x]
- { InstDB::RWInfo::kCategoryGeneric , 0 , { 13, 13, 0 , 0 , 0 , 0 } }, // #91 [ref=2x]
- { InstDB::RWInfo::kCategoryGeneric , 0 , { 47, 39, 39, 0 , 0 , 0 } }, // #92 [ref=1x]
- { InstDB::RWInfo::kCategoryGeneric , 0 , { 34, 9 , 9 , 0 , 0 , 0 } }, // #93 [ref=1x]
- { InstDB::RWInfo::kCategoryGeneric , 0 , { 42, 13, 13, 0 , 0 , 0 } }, // #94 [ref=1x]
- { InstDB::RWInfo::kCategoryGeneric , 0 , { 54, 0 , 0 , 0 , 0 , 0 } }, // #95 [ref=1x]
- { InstDB::RWInfo::kCategoryGeneric , 27, { 11, 3 , 0 , 0 , 0 , 0 } }, // #96 [ref=2x]
- { InstDB::RWInfo::kCategoryGeneric , 12, { 10, 5 , 0 , 0 , 0 , 0 } }, // #97 [ref=5x]
- { InstDB::RWInfo::kCategoryGeneric , 28, { 9 , 0 , 0 , 0 , 0 , 0 } }, // #98 [ref=2x]
- { InstDB::RWInfo::kCategoryGeneric , 0 , { 2 , 3 , 0 , 0 , 0 , 0 } }, // #99 [ref=13x]
- { InstDB::RWInfo::kCategoryGeneric , 8 , { 11, 3 , 0 , 0 , 0 , 0 } }, // #100 [ref=1x]
- { InstDB::RWInfo::kCategoryGeneric , 7 , { 13, 0 , 0 , 0 , 0 , 0 } }, // #101 [ref=5x]
- { InstDB::RWInfo::kCategoryGeneric , 0 , { 3 , 0 , 0 , 0 , 0 , 0 } }, // #102 [ref=3x]
- { InstDB::RWInfo::kCategoryGeneric , 0 , { 49, 19, 0 , 0 , 0 , 0 } }, // #103 [ref=1x]
- { InstDB::RWInfo::kCategoryGeneric , 0 , { 55, 0 , 0 , 0 , 0 , 0 } }, // #104 [ref=3x]
- { InstDB::RWInfo::kCategoryGeneric , 5 , { 3 , 9 , 0 , 0 , 0 , 0 } }, // #105 [ref=2x]
- { InstDB::RWInfo::kCategoryGeneric , 0 , { 5 , 5 , 20, 0 , 0 , 0 } }, // #106 [ref=2x]
- { InstDB::RWInfo::kCategoryGeneric , 0 , { 7 , 7 , 20, 0 , 0 , 0 } }, // #107 [ref=1x]
- { InstDB::RWInfo::kCategoryGeneric , 0 , { 18, 28, 56, 0 , 0 , 0 } }, // #108 [ref=2x]
- { InstDB::RWInfo::kCategoryMov , 29, { 0 , 0 , 0 , 0 , 0 , 0 } }, // #109 [ref=1x]
- { InstDB::RWInfo::kCategoryGeneric , 30, { 10, 5 , 0 , 0 , 0 , 0 } }, // #110 [ref=6x]
- { InstDB::RWInfo::kCategoryGeneric , 0 , { 11, 3 , 0 , 0 , 0 , 0 } }, // #111 [ref=14x]
- { InstDB::RWInfo::kCategoryGeneric , 16, { 11, 43, 0 , 0 , 0 , 0 } }, // #112 [ref=1x]
- { InstDB::RWInfo::kCategoryGeneric , 0 , { 35, 57, 0 , 0 , 0 , 0 } }, // #113 [ref=1x]
- { InstDB::RWInfo::kCategoryMovh64 , 13, { 0 , 0 , 0 , 0 , 0 , 0 } }, // #114 [ref=2x]
- { InstDB::RWInfo::kCategoryGeneric , 0 , { 58, 7 , 0 , 0 , 0 , 0 } }, // #115 [ref=1x]
- { InstDB::RWInfo::kCategoryGeneric , 13, { 34, 7 , 0 , 0 , 0 , 0 } }, // #116 [ref=7x]
- { InstDB::RWInfo::kCategoryGeneric , 0 , { 53, 5 , 0 , 0 , 0 , 0 } }, // #117 [ref=2x]
- { InstDB::RWInfo::kCategoryGeneric , 28, { 42, 9 , 0 , 0 , 0 , 0 } }, // #118 [ref=2x]
- { InstDB::RWInfo::kCategoryGeneric , 0 , { 20, 19, 0 , 0 , 0 , 0 } }, // #119 [ref=1x]
- { InstDB::RWInfo::kCategoryGeneric , 14, { 11, 3 , 0 , 0 , 0 , 0 } }, // #120 [ref=3x]
- { InstDB::RWInfo::kCategoryGeneric , 6 , { 59, 41, 3 , 0 , 0 , 0 } }, // #121 [ref=1x]
- { InstDB::RWInfo::kCategoryGeneric , 6 , { 11, 11, 3 , 60, 0 , 0 } }, // #122 [ref=1x]
- { InstDB::RWInfo::kCategoryGeneric , 0 , { 16, 28, 0 , 0 , 0 , 0 } }, // #123 [ref=1x]
- { InstDB::RWInfo::kCategoryGeneric , 0 , { 16, 28, 29, 0 , 0 , 0 } }, // #124 [ref=1x]
- { InstDB::RWInfo::kCategoryGeneric , 10, { 3 , 0 , 0 , 0 , 0 , 0 } }, // #125 [ref=1x]
- { InstDB::RWInfo::kCategoryGeneric , 0 , { 50, 21, 0 , 0 , 0 , 0 } }, // #126 [ref=1x]
- { InstDB::RWInfo::kCategoryGeneric , 0 , { 50, 61, 0 , 0 , 0 , 0 } }, // #127 [ref=1x]
- { InstDB::RWInfo::kCategoryGeneric , 4 , { 25, 7 , 0 , 0 , 0 , 0 } }, // #128 [ref=18x]
- { InstDB::RWInfo::kCategoryGeneric , 3 , { 5 , 5 , 0 , 62, 16, 56 } }, // #129 [ref=2x]
- { InstDB::RWInfo::kCategoryGeneric , 3 , { 5 , 5 , 0 , 63, 16, 56 } }, // #130 [ref=2x]
- { InstDB::RWInfo::kCategoryGeneric , 3 , { 5 , 5 , 0 , 62, 0 , 0 } }, // #131 [ref=2x]
- { InstDB::RWInfo::kCategoryGeneric , 3 , { 5 , 5 , 0 , 63, 0 , 0 } }, // #132 [ref=2x]
- { InstDB::RWInfo::kCategoryGeneric , 31, { 53, 5 , 0 , 0 , 0 , 0 } }, // #133 [ref=2x]
- { InstDB::RWInfo::kCategoryGeneric , 32, { 34, 5 , 0 , 0 , 0 , 0 } }, // #134 [ref=2x]
- { InstDB::RWInfo::kCategoryGeneric , 33, { 47, 3 , 0 , 0 , 0 , 0 } }, // #135 [ref=1x]
- { InstDB::RWInfo::kCategoryGeneric , 3 , { 64, 5 , 0 , 0 , 0 , 0 } }, // #136 [ref=2x]
- { InstDB::RWInfo::kCategoryGeneric , 15, { 4 , 39, 0 , 0 , 0 , 0 } }, // #137 [ref=1x]
- { InstDB::RWInfo::kCategoryGeneric , 4 , { 4 , 7 , 0 , 0 , 0 , 0 } }, // #138 [ref=1x]
- { InstDB::RWInfo::kCategoryGeneric , 27, { 2 , 13, 0 , 0 , 0 , 0 } }, // #139 [ref=1x]
- { InstDB::RWInfo::kCategoryVmov1_8 , 0 , { 0 , 0 , 0 , 0 , 0 , 0 } }, // #140 [ref=2x]
- { InstDB::RWInfo::kCategoryGeneric , 5 , { 10, 9 , 0 , 0 , 0 , 0 } }, // #141 [ref=4x]
- { InstDB::RWInfo::kCategoryGeneric , 27, { 10, 13, 0 , 0 , 0 , 0 } }, // #142 [ref=2x]
- { InstDB::RWInfo::kCategoryGeneric , 10, { 65, 0 , 0 , 0 , 0 , 0 } }, // #143 [ref=1x]
- { InstDB::RWInfo::kCategoryGeneric , 3 , { 5 , 5 , 0 , 0 , 0 , 0 } }, // #144 [ref=1x]
- { InstDB::RWInfo::kCategoryGeneric , 10, { 60, 0 , 0 , 0 , 0 , 0 } }, // #145 [ref=1x]
- { InstDB::RWInfo::kCategoryGeneric , 10, { 2 , 66, 0 , 0 , 0 , 0 } }, // #146 [ref=8x]
- { InstDB::RWInfo::kCategoryGeneric , 5 , { 36, 9 , 0 , 0 , 0 , 0 } }, // #147 [ref=4x]
- { InstDB::RWInfo::kCategoryGeneric , 0 , { 11, 0 , 0 , 0 , 0 , 0 } }, // #148 [ref=6x]
- { InstDB::RWInfo::kCategoryGeneric , 0 , { 15, 67, 28, 0 , 0 , 0 } }, // #149 [ref=3x]
- { InstDB::RWInfo::kCategoryGeneric , 0 , { 15, 67, 0 , 0 , 0 , 0 } }, // #150 [ref=1x]
- { InstDB::RWInfo::kCategoryGeneric , 0 , { 15, 67, 62, 0 , 0 , 0 } }, // #151 [ref=1x]
- { InstDB::RWInfo::kCategoryGeneric , 0 , { 68, 0 , 0 , 0 , 0 , 0 } }, // #152 [ref=1x]
- { InstDB::RWInfo::kCategoryGeneric , 0 , { 21, 20, 0 , 0 , 0 , 0 } }, // #153 [ref=1x]
- { InstDB::RWInfo::kCategoryGeneric , 31, { 69, 0 , 0 , 0 , 0 , 0 } }, // #154 [ref=30x]
- { InstDB::RWInfo::kCategoryGeneric , 11, { 2 , 3 , 66, 0 , 0 , 0 } }, // #155 [ref=2x]
- { InstDB::RWInfo::kCategoryGeneric , 34, { 11, 0 , 0 , 0 , 0 , 0 } }, // #156 [ref=3x]
- { InstDB::RWInfo::kCategoryGeneric , 28, { 42, 0 , 0 , 0 , 0 , 0 } }, // #157 [ref=2x]
- { InstDB::RWInfo::kCategoryGeneric , 0 , { 20, 21, 0 , 0 , 0 , 0 } }, // #158 [ref=1x]
- { InstDB::RWInfo::kCategoryGeneric , 12, { 70, 43, 43, 43, 43, 5 } }, // #159 [ref=2x]
- { InstDB::RWInfo::kCategoryGeneric , 12, { 4 , 5 , 5 , 5 , 5 , 5 } }, // #160 [ref=2x]
- { InstDB::RWInfo::kCategoryGeneric , 35, { 10, 5 , 7 , 0 , 0 , 0 } }, // #161 [ref=8x]
- { InstDB::RWInfo::kCategoryGeneric , 36, { 10, 5 , 9 , 0 , 0 , 0 } }, // #162 [ref=9x]
- { InstDB::RWInfo::kCategoryGeneric , 6 , { 11, 3 , 3 , 3 , 0 , 0 } }, // #163 [ref=3x]
- { InstDB::RWInfo::kCategoryGeneric , 12, { 71, 5 , 0 , 0 , 0 , 0 } }, // #164 [ref=2x]
- { InstDB::RWInfo::kCategoryGeneric , 12, { 11, 5 , 0 , 0 , 0 , 0 } }, // #165 [ref=4x]
- { InstDB::RWInfo::kCategoryGeneric , 37, { 72, 73, 0 , 0 , 0 , 0 } }, // #166 [ref=4x]
- { InstDB::RWInfo::kCategoryGeneric , 38, { 11, 7 , 0 , 0 , 0 , 0 } }, // #167 [ref=1x]
- { InstDB::RWInfo::kCategoryGeneric , 39, { 11, 9 , 0 , 0 , 0 , 0 } }, // #168 [ref=1x]
- { InstDB::RWInfo::kCategoryGeneric , 35, { 11, 5 , 7 , 0 , 0 , 0 } }, // #169 [ref=1x]
- { InstDB::RWInfo::kCategoryGeneric , 36, { 11, 5 , 9 , 0 , 0 , 0 } }, // #170 [ref=1x]
- { InstDB::RWInfo::kCategoryGeneric , 11, { 11, 3 , 0 , 0 , 0 , 0 } }, // #171 [ref=7x]
- { InstDB::RWInfo::kCategoryVmov2_1 , 40, { 0 , 0 , 0 , 0 , 0 , 0 } }, // #172 [ref=14x]
- { InstDB::RWInfo::kCategoryVmov1_2 , 14, { 0 , 0 , 0 , 0 , 0 , 0 } }, // #173 [ref=7x]
- { InstDB::RWInfo::kCategoryVmov1_2 , 41, { 0 , 0 , 0 , 0 , 0 , 0 } }, // #174 [ref=10x]
- { InstDB::RWInfo::kCategoryGeneric , 35, { 10, 74, 7 , 0 , 0 , 0 } }, // #175 [ref=1x]
- { InstDB::RWInfo::kCategoryGeneric , 42, { 10, 57, 3 , 0 , 0 , 0 } }, // #176 [ref=2x]
- { InstDB::RWInfo::kCategoryGeneric , 42, { 10, 74, 3 , 0 , 0 , 0 } }, // #177 [ref=2x]
- { InstDB::RWInfo::kCategoryGeneric , 36, { 10, 57, 9 , 0 , 0 , 0 } }, // #178 [ref=1x]
- { InstDB::RWInfo::kCategoryGeneric , 43, { 10, 5 , 5 , 0 , 0 , 0 } }, // #179 [ref=9x]
- { InstDB::RWInfo::kCategoryGeneric , 44, { 72, 43, 0 , 0 , 0 , 0 } }, // #180 [ref=6x]
- { InstDB::RWInfo::kCategoryGeneric , 45, { 10, 73, 0 , 0 , 0 , 0 } }, // #181 [ref=2x]
- { InstDB::RWInfo::kCategoryGeneric , 45, { 10, 3 , 0 , 0 , 0 , 0 } }, // #182 [ref=4x]
- { InstDB::RWInfo::kCategoryGeneric , 46, { 71, 43, 0 , 0 , 0 , 0 } }, // #183 [ref=4x]
- { InstDB::RWInfo::kCategoryGeneric , 6 , { 2 , 3 , 3 , 0 , 0 , 0 } }, // #184 [ref=60x]
- { InstDB::RWInfo::kCategoryGeneric , 35, { 4 , 57, 7 , 0 , 0 , 0 } }, // #185 [ref=1x]
- { InstDB::RWInfo::kCategoryGeneric , 36, { 4 , 74, 9 , 0 , 0 , 0 } }, // #186 [ref=1x]
- { InstDB::RWInfo::kCategoryGeneric , 35, { 6 , 7 , 7 , 0 , 0 , 0 } }, // #187 [ref=11x]
- { InstDB::RWInfo::kCategoryGeneric , 36, { 8 , 9 , 9 , 0 , 0 , 0 } }, // #188 [ref=11x]
- { InstDB::RWInfo::kCategoryGeneric , 47, { 11, 3 , 3 , 3 , 0 , 0 } }, // #189 [ref=15x]
- { InstDB::RWInfo::kCategoryGeneric , 48, { 34, 7 , 7 , 7 , 0 , 0 } }, // #190 [ref=4x]
- { InstDB::RWInfo::kCategoryGeneric , 49, { 42, 9 , 9 , 9 , 0 , 0 } }, // #191 [ref=4x]
- { InstDB::RWInfo::kCategoryGeneric , 35, { 25, 7 , 7 , 0 , 0 , 0 } }, // #192 [ref=1x]
- { InstDB::RWInfo::kCategoryGeneric , 36, { 75, 9 , 9 , 0 , 0 , 0 } }, // #193 [ref=1x]
- { InstDB::RWInfo::kCategoryGeneric , 14, { 34, 3 , 0 , 0 , 0 , 0 } }, // #194 [ref=2x]
- { InstDB::RWInfo::kCategoryGeneric , 5 , { 34, 9 , 0 , 0 , 0 , 0 } }, // #195 [ref=1x]
- { InstDB::RWInfo::kCategoryGeneric , 5 , { 42, 9 , 0 , 0 , 0 , 0 } }, // #196 [ref=1x]
- { InstDB::RWInfo::kCategoryGeneric , 8 , { 2 , 3 , 2 , 0 , 0 , 0 } }, // #197 [ref=2x]
- { InstDB::RWInfo::kCategoryGeneric , 0 , { 2 , 3 , 2 , 0 , 0 , 0 } }, // #198 [ref=4x]
- { InstDB::RWInfo::kCategoryGeneric , 18, { 4 , 3 , 4 , 0 , 0 , 0 } }, // #199 [ref=2x]
- { InstDB::RWInfo::kCategoryGeneric , 35, { 10, 57, 7 , 0 , 0 , 0 } }, // #200 [ref=11x]
- { InstDB::RWInfo::kCategoryGeneric , 36, { 10, 74, 9 , 0 , 0 , 0 } }, // #201 [ref=13x]
- { InstDB::RWInfo::kCategoryGeneric , 43, { 71, 73, 5 , 0 , 0 , 0 } }, // #202 [ref=2x]
- { InstDB::RWInfo::kCategoryGeneric , 43, { 11, 3 , 5 , 0 , 0 , 0 } }, // #203 [ref=4x]
- { InstDB::RWInfo::kCategoryGeneric , 50, { 72, 43, 73, 0 , 0 , 0 } }, // #204 [ref=4x]
- { InstDB::RWInfo::kCategoryVmaskmov , 0 , { 0 , 0 , 0 , 0 , 0 , 0 } }, // #205 [ref=4x]
- { InstDB::RWInfo::kCategoryGeneric , 13, { 34, 0 , 0 , 0 , 0 , 0 } }, // #206 [ref=2x]
- { InstDB::RWInfo::kCategoryGeneric , 0 , { 21, 0 , 0 , 0 , 0 , 0 } }, // #207 [ref=2x]
- { InstDB::RWInfo::kCategoryGeneric , 51, { 11, 3 , 0 , 0 , 0 , 0 } }, // #208 [ref=12x]
- { InstDB::RWInfo::kCategoryVmovddup , 52, { 0 , 0 , 0 , 0 , 0 , 0 } }, // #209 [ref=1x]
- { InstDB::RWInfo::kCategoryGeneric , 0 , { 10, 57, 57, 0 , 0 , 0 } }, // #210 [ref=1x]
- { InstDB::RWInfo::kCategoryGeneric , 13, { 34, 57, 0 , 0 , 0 , 0 } }, // #211 [ref=2x]
- { InstDB::RWInfo::kCategoryGeneric , 13, { 10, 7 , 7 , 0 , 0 , 0 } }, // #212 [ref=2x]
- { InstDB::RWInfo::kCategoryGeneric , 0 , { 10, 7 , 7 , 0 , 0 , 0 } }, // #213 [ref=1x]
- { InstDB::RWInfo::kCategoryGeneric , 13, { 10, 57, 7 , 0 , 0 , 0 } }, // #214 [ref=2x]
- { InstDB::RWInfo::kCategoryVmovmskpd , 0 , { 0 , 0 , 0 , 0 , 0 , 0 } }, // #215 [ref=1x]
- { InstDB::RWInfo::kCategoryVmovmskps , 0 , { 0 , 0 , 0 , 0 , 0 , 0 } }, // #216 [ref=1x]
- { InstDB::RWInfo::kCategoryGeneric , 53, { 34, 7 , 0 , 0 , 0 , 0 } }, // #217 [ref=1x]
- { InstDB::RWInfo::kCategoryGeneric , 0 , { 10, 57, 7 , 0 , 0 , 0 } }, // #218 [ref=1x]
- { InstDB::RWInfo::kCategoryGeneric , 0 , { 10, 74, 9 , 0 , 0 , 0 } }, // #219 [ref=1x]
- { InstDB::RWInfo::kCategoryGeneric , 13, { 7 , 0 , 0 , 0 , 0 , 0 } }, // #220 [ref=2x]
- { InstDB::RWInfo::kCategoryGeneric , 0 , { 76, 0 , 0 , 0 , 0 , 0 } }, // #221 [ref=1x]
- { InstDB::RWInfo::kCategoryGeneric , 2 , { 3 , 3 , 0 , 0 , 0 , 0 } }, // #222 [ref=4x]
- { InstDB::RWInfo::kCategoryGeneric , 12, { 72, 43, 43, 43, 43, 5 } }, // #223 [ref=2x]
- { InstDB::RWInfo::kCategoryGeneric , 15, { 11, 39, 0 , 0 , 0 , 0 } }, // #224 [ref=1x]
- { InstDB::RWInfo::kCategoryGeneric , 0 , { 11, 7 , 0 , 0 , 0 , 0 } }, // #225 [ref=6x]
- { InstDB::RWInfo::kCategoryGeneric , 27, { 11, 13, 0 , 0 , 0 , 0 } }, // #226 [ref=1x]
- { InstDB::RWInfo::kCategoryGeneric , 6 , { 34, 3 , 3 , 0 , 0 , 0 } }, // #227 [ref=17x]
- { InstDB::RWInfo::kCategoryGeneric , 50, { 71, 73, 73, 0 , 0 , 0 } }, // #228 [ref=2x]
- { InstDB::RWInfo::kCategoryGeneric , 22, { 11, 3 , 3 , 0 , 0 , 0 } }, // #229 [ref=4x]
- { InstDB::RWInfo::kCategoryGeneric , 7 , { 47, 5 , 0 , 0 , 0 , 0 } }, // #230 [ref=1x]
- { InstDB::RWInfo::kCategoryGeneric , 54, { 10, 5 , 39, 0 , 0 , 0 } }, // #231 [ref=1x]
- { InstDB::RWInfo::kCategoryGeneric , 55, { 10, 5 , 13, 0 , 0 , 0 } }, // #232 [ref=1x]
- { InstDB::RWInfo::kCategoryGeneric , 43, { 10, 5 , 5 , 5 , 0 , 0 } }, // #233 [ref=12x]
- { InstDB::RWInfo::kCategoryGeneric , 0 , { 34, 3 , 0 , 0 , 0 , 0 } }, // #234 [ref=4x]
- { InstDB::RWInfo::kCategoryVmov1_4 , 56, { 0 , 0 , 0 , 0 , 0 , 0 } }, // #235 [ref=6x]
- { InstDB::RWInfo::kCategoryVmov1_8 , 57, { 0 , 0 , 0 , 0 , 0 , 0 } }, // #236 [ref=3x]
- { InstDB::RWInfo::kCategoryVmov4_1 , 58, { 0 , 0 , 0 , 0 , 0 , 0 } }, // #237 [ref=4x]
- { InstDB::RWInfo::kCategoryVmov8_1 , 59, { 0 , 0 , 0 , 0 , 0 , 0 } }, // #238 [ref=2x]
- { InstDB::RWInfo::kCategoryGeneric , 60, { 10, 5 , 5 , 5 , 0 , 0 } }, // #239 [ref=1x]
- { InstDB::RWInfo::kCategoryGeneric , 61, { 10, 5 , 5 , 0 , 0 , 0 } }, // #240 [ref=12x]
- { InstDB::RWInfo::kCategoryGeneric , 18, { 11, 3 , 0 , 0 , 0 , 0 } }, // #241 [ref=2x]
- { InstDB::RWInfo::kCategoryGeneric , 22, { 11, 3 , 5 , 0 , 0 , 0 } }, // #242 [ref=9x]
- { InstDB::RWInfo::kCategoryGeneric , 62, { 11, 3 , 0 , 0 , 0 , 0 } }, // #243 [ref=2x]
- { InstDB::RWInfo::kCategoryGeneric , 0 , { 56, 16, 28, 0 , 0 , 0 } }, // #244 [ref=2x]
- { InstDB::RWInfo::kCategoryGeneric , 11, { 2 , 2 , 0 , 0 , 0 , 0 } }, // #245 [ref=1x]
- { InstDB::RWInfo::kCategoryGeneric , 51, { 2 , 2 , 0 , 0 , 0 , 0 } }, // #246 [ref=1x]
- { InstDB::RWInfo::kCategoryGeneric , 8 , { 3 , 56, 16, 0 , 0 , 0 } }, // #247 [ref=4x]
- { InstDB::RWInfo::kCategoryGeneric , 8 , { 11, 56, 16, 0 , 0 , 0 } } // #248 [ref=8x]
+ { InstDB::RWInfo::kCategoryGeneric , 2 , { 2 , 3 , 0 , 0 , 0 , 0 } }, // #3 [ref=96x]
+ { InstDB::RWInfo::kCategoryGeneric , 3 , { 4 , 5 , 0 , 0 , 0 , 0 } }, // #4 [ref=55x]
+ { InstDB::RWInfo::kCategoryGeneric , 4 , { 6 , 7 , 0 , 0 , 0 , 0 } }, // #5 [ref=6x]
+ { InstDB::RWInfo::kCategoryGeneric , 5 , { 8 , 9 , 0 , 0 , 0 , 0 } }, // #6 [ref=6x]
+ { InstDB::RWInfo::kCategoryGeneric , 3 , { 10, 5 , 0 , 0 , 0 , 0 } }, // #7 [ref=26x]
+ { InstDB::RWInfo::kCategoryGeneric , 7 , { 12, 13, 0 , 0 , 0 , 0 } }, // #8 [ref=1x]
+ { InstDB::RWInfo::kCategoryGeneric , 2 , { 11, 3 , 0 , 0 , 0 , 0 } }, // #9 [ref=75x]
+ { InstDB::RWInfo::kCategoryGeneric , 2 , { 5 , 3 , 0 , 0 , 0 , 0 } }, // #10 [ref=3x]
+ { InstDB::RWInfo::kCategoryGeneric , 8 , { 10, 3 , 0 , 0 , 0 , 0 } }, // #11 [ref=2x]
+ { InstDB::RWInfo::kCategoryGeneric , 9 , { 10, 5 , 0 , 0 , 0 , 0 } }, // #12 [ref=1x]
+ { InstDB::RWInfo::kCategoryGeneric , 8 , { 15, 5 , 0 , 0 , 0 , 0 } }, // #13 [ref=1x]
+ { InstDB::RWInfo::kCategoryGeneric , 0 , { 3 , 3 , 0 , 0 , 0 , 0 } }, // #14 [ref=1x]
+ { InstDB::RWInfo::kCategoryGeneric , 10, { 3 , 3 , 0 , 0 , 0 , 0 } }, // #15 [ref=2x]
+ { InstDB::RWInfo::kCategoryGeneric , 10, { 2 , 3 , 0 , 0 , 0 , 0 } }, // #16 [ref=3x]
+ { InstDB::RWInfo::kCategoryGeneric , 0 , { 16, 17, 0 , 0 , 0 , 0 } }, // #17 [ref=1x]
+ { InstDB::RWInfo::kCategoryGeneric , 1 , { 3 , 3 , 0 , 0 , 0 , 0 } }, // #18 [ref=1x]
+ { InstDB::RWInfo::kCategoryGeneric , 0 , { 20, 21, 0 , 0 , 0 , 0 } }, // #19 [ref=1x]
+ { InstDB::RWInfo::kCategoryGeneric , 4 , { 7 , 7 , 0 , 0 , 0 , 0 } }, // #20 [ref=4x]
+ { InstDB::RWInfo::kCategoryGeneric , 5 , { 9 , 9 , 0 , 0 , 0 , 0 } }, // #21 [ref=4x]
+ { InstDB::RWInfo::kCategoryGeneric , 0 , { 33, 34, 0 , 0 , 0 , 0 } }, // #22 [ref=1x]
+ { InstDB::RWInfo::kCategoryGeneric , 14, { 2 , 3 , 0 , 0 , 0 , 0 } }, // #23 [ref=1x]
+ { InstDB::RWInfo::kCategoryGeneric , 4 , { 10, 7 , 0 , 0 , 0 , 0 } }, // #24 [ref=10x]
+ { InstDB::RWInfo::kCategoryGeneric , 3 , { 35, 5 , 0 , 0 , 0 , 0 } }, // #25 [ref=5x]
+ { InstDB::RWInfo::kCategoryGeneric , 4 , { 36, 7 , 0 , 0 , 0 , 0 } }, // #26 [ref=2x]
+ { InstDB::RWInfo::kCategoryGeneric , 4 , { 35, 7 , 0 , 0 , 0 , 0 } }, // #27 [ref=11x]
+ { InstDB::RWInfo::kCategoryGeneric , 4 , { 11, 7 , 0 , 0 , 0 , 0 } }, // #28 [ref=9x]
+ { InstDB::RWInfo::kCategoryGeneric , 4 , { 37, 7 , 0 , 0 , 0 , 0 } }, // #29 [ref=1x]
+ { InstDB::RWInfo::kCategoryGeneric , 14, { 36, 3 , 0 , 0 , 0 , 0 } }, // #30 [ref=1x]
+ { InstDB::RWInfo::kCategoryGeneric , 14, { 37, 3 , 0 , 0 , 0 , 0 } }, // #31 [ref=1x]
+ { InstDB::RWInfo::kCategoryGeneric , 5 , { 36, 9 , 0 , 0 , 0 , 0 } }, // #32 [ref=1x]
+ { InstDB::RWInfo::kCategoryGeneric , 5 , { 11, 9 , 0 , 0 , 0 , 0 } }, // #33 [ref=7x]
+ { InstDB::RWInfo::kCategoryGeneric , 0 , { 38, 39, 0 , 0 , 0 , 0 } }, // #34 [ref=1x]
+ { InstDB::RWInfo::kCategoryGeneric , 15, { 1 , 40, 0 , 0 , 0 , 0 } }, // #35 [ref=3x]
+ { InstDB::RWInfo::kCategoryGeneric , 16, { 11, 43, 0 , 0 , 0 , 0 } }, // #36 [ref=3x]
+ { InstDB::RWInfo::kCategoryGeneric , 0 , { 4 , 5 , 0 , 0 , 0 , 0 } }, // #37 [ref=2x]
+ { InstDB::RWInfo::kCategoryGeneric , 0 , { 45, 46, 0 , 0 , 0 , 0 } }, // #38 [ref=6x]
+ { InstDB::RWInfo::kCategoryGeneric , 0 , { 0 , 50, 0 , 0 , 0 , 0 } }, // #39 [ref=1x]
+ { InstDB::RWInfo::kCategoryImul , 2 , { 0 , 0 , 0 , 0 , 0 , 0 } }, // #40 [ref=1x]
+ { InstDB::RWInfo::kCategoryGeneric , 0 , { 51, 52, 0 , 0 , 0 , 0 } }, // #41 [ref=1x]
+ { InstDB::RWInfo::kCategoryGeneric , 0 , { 54, 52, 0 , 0 , 0 , 0 } }, // #42 [ref=1x]
+ { InstDB::RWInfo::kCategoryGeneric , 13, { 3 , 5 , 0 , 0 , 0 , 0 } }, // #43 [ref=3x]
+ { InstDB::RWInfo::kCategoryGeneric , 0 , { 22, 29, 0 , 0 , 0 , 0 } }, // #44 [ref=1x]
+ { InstDB::RWInfo::kCategoryGeneric , 0 , { 55, 0 , 0 , 0 , 0 , 0 } }, // #45 [ref=1x]
+ { InstDB::RWInfo::kCategoryGeneric , 23, { 56, 40, 0 , 0 , 0 , 0 } }, // #46 [ref=1x]
+ { InstDB::RWInfo::kCategoryGeneric , 24, { 44, 9 , 0 , 0 , 0 , 0 } }, // #47 [ref=4x]
+ { InstDB::RWInfo::kCategoryGeneric , 25, { 35, 7 , 0 , 0 , 0 , 0 } }, // #48 [ref=3x]
+ { InstDB::RWInfo::kCategoryGeneric , 26, { 48, 13, 0 , 0 , 0 , 0 } }, // #49 [ref=2x]
+ { InstDB::RWInfo::kCategoryGeneric , 0 , { 56, 40, 0 , 0 , 0 , 0 } }, // #50 [ref=1x]
+ { InstDB::RWInfo::kCategoryGeneric , 0 , { 44, 9 , 0 , 0 , 0 , 0 } }, // #51 [ref=1x]
+ { InstDB::RWInfo::kCategoryGeneric , 0 , { 35, 7 , 0 , 0 , 0 , 0 } }, // #52 [ref=3x]
+ { InstDB::RWInfo::kCategoryGeneric , 0 , { 48, 13, 0 , 0 , 0 , 0 } }, // #53 [ref=1x]
+ { InstDB::RWInfo::kCategoryGeneric , 0 , { 40, 40, 0 , 0 , 0 , 0 } }, // #54 [ref=2x]
+ { InstDB::RWInfo::kCategoryGeneric , 0 , { 9 , 9 , 0 , 0 , 0 , 0 } }, // #55 [ref=2x]
+ { InstDB::RWInfo::kCategoryGeneric , 0 , { 7 , 7 , 0 , 0 , 0 , 0 } }, // #56 [ref=2x]
+ { InstDB::RWInfo::kCategoryGeneric , 0 , { 13, 13, 0 , 0 , 0 , 0 } }, // #57 [ref=2x]
+ { InstDB::RWInfo::kCategoryGeneric , 27, { 11, 3 , 0 , 0 , 0 , 0 } }, // #58 [ref=2x]
+ { InstDB::RWInfo::kCategoryGeneric , 13, { 10, 5 , 0 , 0 , 0 , 0 } }, // #59 [ref=5x]
+ { InstDB::RWInfo::kCategoryGeneric , 0 , { 2 , 3 , 0 , 0 , 0 , 0 } }, // #60 [ref=11x]
+ { InstDB::RWInfo::kCategoryGeneric , 8 , { 11, 3 , 0 , 0 , 0 , 0 } }, // #61 [ref=1x]
+ { InstDB::RWInfo::kCategoryGeneric , 0 , { 51, 20, 0 , 0 , 0 , 0 } }, // #62 [ref=1x]
+ { InstDB::RWInfo::kCategoryGeneric , 0 , { 58, 0 , 0 , 0 , 0 , 0 } }, // #63 [ref=3x]
+ { InstDB::RWInfo::kCategoryMov , 29, { 0 , 0 , 0 , 0 , 0 , 0 } }, // #64 [ref=1x]
+ { InstDB::RWInfo::kCategoryMovabs , 0 , { 0 , 0 , 0 , 0 , 0 , 0 } }, // #65 [ref=1x]
+ { InstDB::RWInfo::kCategoryGeneric , 30, { 10, 5 , 0 , 0 , 0 , 0 } }, // #66 [ref=6x]
+ { InstDB::RWInfo::kCategoryGeneric , 0 , { 11, 3 , 0 , 0 , 0 , 0 } }, // #67 [ref=14x]
+ { InstDB::RWInfo::kCategoryGeneric , 0 , { 36, 61, 0 , 0 , 0 , 0 } }, // #68 [ref=1x]
+ { InstDB::RWInfo::kCategoryMovh64 , 12, { 0 , 0 , 0 , 0 , 0 , 0 } }, // #69 [ref=2x]
+ { InstDB::RWInfo::kCategoryGeneric , 0 , { 62, 7 , 0 , 0 , 0 , 0 } }, // #70 [ref=1x]
+ { InstDB::RWInfo::kCategoryGeneric , 12, { 35, 7 , 0 , 0 , 0 , 0 } }, // #71 [ref=7x]
+ { InstDB::RWInfo::kCategoryGeneric , 0 , { 56, 5 , 0 , 0 , 0 , 0 } }, // #72 [ref=2x]
+ { InstDB::RWInfo::kCategoryGeneric , 28, { 44, 9 , 0 , 0 , 0 , 0 } }, // #73 [ref=2x]
+ { InstDB::RWInfo::kCategoryGeneric , 0 , { 63, 20, 0 , 0 , 0 , 0 } }, // #74 [ref=1x]
+ { InstDB::RWInfo::kCategoryGeneric , 14, { 11, 3 , 0 , 0 , 0 , 0 } }, // #75 [ref=6x]
+ { InstDB::RWInfo::kCategoryGeneric , 0 , { 17, 29, 0 , 0 , 0 , 0 } }, // #76 [ref=1x]
+ { InstDB::RWInfo::kCategoryGeneric , 11, { 3 , 3 , 0 , 0 , 0 , 0 } }, // #77 [ref=1x]
+ { InstDB::RWInfo::kCategoryGeneric , 0 , { 52, 22, 0 , 0 , 0 , 0 } }, // #78 [ref=1x]
+ { InstDB::RWInfo::kCategoryGeneric , 0 , { 52, 66, 0 , 0 , 0 , 0 } }, // #79 [ref=1x]
+ { InstDB::RWInfo::kCategoryGeneric , 4 , { 26, 7 , 0 , 0 , 0 , 0 } }, // #80 [ref=18x]
+ { InstDB::RWInfo::kCategoryGeneric , 3 , { 69, 5 , 0 , 0 , 0 , 0 } }, // #81 [ref=2x]
+ { InstDB::RWInfo::kCategoryVmov1_8 , 0 , { 0 , 0 , 0 , 0 , 0 , 0 } }, // #82 [ref=2x]
+ { InstDB::RWInfo::kCategoryGeneric , 5 , { 10, 9 , 0 , 0 , 0 , 0 } }, // #83 [ref=4x]
+ { InstDB::RWInfo::kCategoryGeneric , 27, { 10, 13, 0 , 0 , 0 , 0 } }, // #84 [ref=2x]
+ { InstDB::RWInfo::kCategoryGeneric , 0 , { 4 , 0 , 0 , 0 , 0 , 0 } }, // #85 [ref=2x]
+ { InstDB::RWInfo::kCategoryGeneric , 3 , { 5 , 5 , 0 , 0 , 0 , 0 } }, // #86 [ref=1x]
+ { InstDB::RWInfo::kCategoryPunpcklxx , 34, { 0 , 0 , 0 , 0 , 0 , 0 } }, // #87 [ref=3x]
+ { InstDB::RWInfo::kCategoryGeneric , 10, { 2 , 71, 0 , 0 , 0 , 0 } }, // #88 [ref=8x]
+ { InstDB::RWInfo::kCategoryGeneric , 5 , { 37, 9 , 0 , 0 , 0 , 0 } }, // #89 [ref=3x]
+ { InstDB::RWInfo::kCategoryGeneric , 0 , { 16, 50, 0 , 0 , 0 , 0 } }, // #90 [ref=1x]
+ { InstDB::RWInfo::kCategoryGeneric , 0 , { 22, 21, 0 , 0 , 0 , 0 } }, // #91 [ref=1x]
+ { InstDB::RWInfo::kCategoryGeneric , 0 , { 63, 22, 0 , 0 , 0 , 0 } }, // #92 [ref=1x]
+ { InstDB::RWInfo::kCategoryGeneric , 8 , { 74, 3 , 0 , 0 , 0 , 0 } }, // #93 [ref=2x]
+ { InstDB::RWInfo::kCategoryGeneric , 8 , { 11, 43, 0 , 0 , 0 , 0 } }, // #94 [ref=1x]
+ { InstDB::RWInfo::kCategoryGeneric , 5 , { 53, 9 , 0 , 0 , 0 , 0 } }, // #95 [ref=2x]
+ { InstDB::RWInfo::kCategoryGeneric , 13, { 80, 5 , 0 , 0 , 0 , 0 } }, // #96 [ref=2x]
+ { InstDB::RWInfo::kCategoryGeneric , 13, { 11, 5 , 0 , 0 , 0 , 0 } }, // #97 [ref=4x]
+ { InstDB::RWInfo::kCategoryGeneric , 39, { 74, 81, 0 , 0 , 0 , 0 } }, // #98 [ref=4x]
+ { InstDB::RWInfo::kCategoryGeneric , 40, { 11, 7 , 0 , 0 , 0 , 0 } }, // #99 [ref=1x]
+ { InstDB::RWInfo::kCategoryGeneric , 41, { 11, 9 , 0 , 0 , 0 , 0 } }, // #100 [ref=1x]
+ { InstDB::RWInfo::kCategoryGeneric , 27, { 13, 13, 0 , 0 , 0 , 0 } }, // #101 [ref=2x]
+ { InstDB::RWInfo::kCategoryGeneric , 11, { 11, 3 , 0 , 0 , 0 , 0 } }, // #102 [ref=7x]
+ { InstDB::RWInfo::kCategoryVmov2_1 , 42, { 0 , 0 , 0 , 0 , 0 , 0 } }, // #103 [ref=14x]
+ { InstDB::RWInfo::kCategoryVmov1_2 , 14, { 0 , 0 , 0 , 0 , 0 , 0 } }, // #104 [ref=7x]
+ { InstDB::RWInfo::kCategoryGeneric , 14, { 10, 3 , 0 , 0 , 0 , 0 } }, // #105 [ref=3x]
+ { InstDB::RWInfo::kCategoryGeneric , 42, { 11, 3 , 0 , 0 , 0 , 0 } }, // #106 [ref=5x]
+ { InstDB::RWInfo::kCategoryGeneric , 43, { 11, 5 , 0 , 0 , 0 , 0 } }, // #107 [ref=5x]
+ { InstDB::RWInfo::kCategoryGeneric , 27, { 11, 5 , 0 , 0 , 0 , 0 } }, // #108 [ref=4x]
+ { InstDB::RWInfo::kCategoryGeneric , 47, { 74, 43, 0 , 0 , 0 , 0 } }, // #109 [ref=6x]
+ { InstDB::RWInfo::kCategoryGeneric , 5 , { 44, 9 , 0 , 0 , 0 , 0 } }, // #110 [ref=1x]
+ { InstDB::RWInfo::kCategoryGeneric , 18, { 2 , 3 , 0 , 0 , 0 , 0 } }, // #111 [ref=2x]
+ { InstDB::RWInfo::kCategoryGeneric , 54, { 11, 3 , 0 , 0 , 0 , 0 } }, // #112 [ref=12x]
+ { InstDB::RWInfo::kCategoryVmovddup , 34, { 0 , 0 , 0 , 0 , 0 , 0 } }, // #113 [ref=1x]
+ { InstDB::RWInfo::kCategoryGeneric , 12, { 35, 61, 0 , 0 , 0 , 0 } }, // #114 [ref=2x]
+ { InstDB::RWInfo::kCategoryVmovmskpd , 0 , { 0 , 0 , 0 , 0 , 0 , 0 } }, // #115 [ref=1x]
+ { InstDB::RWInfo::kCategoryVmovmskps , 0 , { 0 , 0 , 0 , 0 , 0 , 0 } }, // #116 [ref=1x]
+ { InstDB::RWInfo::kCategoryGeneric , 55, { 35, 7 , 0 , 0 , 0 , 0 } }, // #117 [ref=1x]
+ { InstDB::RWInfo::kCategoryGeneric , 21, { 48, 13, 0 , 0 , 0 , 0 } }, // #118 [ref=1x]
+ { InstDB::RWInfo::kCategoryGeneric , 2 , { 3 , 3 , 0 , 0 , 0 , 0 } }, // #119 [ref=4x]
+ { InstDB::RWInfo::kCategoryGeneric , 15, { 11, 40, 0 , 0 , 0 , 0 } }, // #120 [ref=1x]
+ { InstDB::RWInfo::kCategoryGeneric , 0 , { 11, 7 , 0 , 0 , 0 , 0 } }, // #121 [ref=6x]
+ { InstDB::RWInfo::kCategoryGeneric , 27, { 11, 13, 0 , 0 , 0 , 0 } }, // #122 [ref=1x]
+ { InstDB::RWInfo::kCategoryGeneric , 0 , { 35, 3 , 0 , 0 , 0 , 0 } }, // #123 [ref=4x]
+ { InstDB::RWInfo::kCategoryVmov1_4 , 58, { 0 , 0 , 0 , 0 , 0 , 0 } }, // #124 [ref=6x]
+ { InstDB::RWInfo::kCategoryVmov1_2 , 44, { 0 , 0 , 0 , 0 , 0 , 0 } }, // #125 [ref=9x]
+ { InstDB::RWInfo::kCategoryVmov1_8 , 59, { 0 , 0 , 0 , 0 , 0 , 0 } }, // #126 [ref=3x]
+ { InstDB::RWInfo::kCategoryVmov4_1 , 43, { 0 , 0 , 0 , 0 , 0 , 0 } }, // #127 [ref=4x]
+ { InstDB::RWInfo::kCategoryVmov8_1 , 60, { 0 , 0 , 0 , 0 , 0 , 0 } }, // #128 [ref=2x]
+ { InstDB::RWInfo::kCategoryGeneric , 18, { 11, 3 , 0 , 0 , 0 , 0 } }, // #129 [ref=2x]
+ { InstDB::RWInfo::kCategoryGeneric , 17, { 44, 9 , 0 , 0 , 0 , 0 } }, // #130 [ref=2x]
+ { InstDB::RWInfo::kCategoryGeneric , 32, { 35, 7 , 0 , 0 , 0 , 0 } }, // #131 [ref=2x]
+ { InstDB::RWInfo::kCategoryGeneric , 11, { 2 , 2 , 0 , 0 , 0 , 0 } }, // #132 [ref=1x]
+ { InstDB::RWInfo::kCategoryGeneric , 54, { 2 , 2 , 0 , 0 , 0 , 0 } } // #133 [ref=1x]
+};
+
+const InstDB::RWInfo InstDB::rwInfoB[] = {
+ { InstDB::RWInfo::kCategoryGeneric , 0 , { 0 , 0 , 0 , 0 , 0 , 0 } }, // #0 [ref=775x]
+ { InstDB::RWInfo::kCategoryGeneric , 0 , { 1 , 0 , 0 , 0 , 0 , 0 } }, // #1 [ref=5x]
+ { InstDB::RWInfo::kCategoryGeneric , 3 , { 10, 5 , 0 , 0 , 0 , 0 } }, // #2 [ref=7x]
+ { InstDB::RWInfo::kCategoryGeneric , 6 , { 11, 3 , 3 , 0 , 0 , 0 } }, // #3 [ref=193x]
+ { InstDB::RWInfo::kCategoryGeneric , 2 , { 11, 3 , 3 , 0 , 0 , 0 } }, // #4 [ref=5x]
+ { InstDB::RWInfo::kCategoryGeneric , 3 , { 4 , 5 , 0 , 0 , 0 , 0 } }, // #5 [ref=14x]
+ { InstDB::RWInfo::kCategoryGeneric , 3 , { 4 , 5 , 14, 0 , 0 , 0 } }, // #6 [ref=4x]
+ { InstDB::RWInfo::kCategoryGeneric , 0 , { 2 , 0 , 0 , 0 , 0 , 0 } }, // #7 [ref=1x]
+ { InstDB::RWInfo::kCategoryGeneric , 11, { 3 , 0 , 0 , 0 , 0 , 0 } }, // #8 [ref=2x]
+ { InstDB::RWInfo::kCategoryGeneric , 0 , { 18, 0 , 0 , 0 , 0 , 0 } }, // #9 [ref=1x]
+ { InstDB::RWInfo::kCategoryGeneric , 8 , { 3 , 0 , 0 , 0 , 0 , 0 } }, // #10 [ref=34x]
+ { InstDB::RWInfo::kCategoryGeneric , 12, { 7 , 0 , 0 , 0 , 0 , 0 } }, // #11 [ref=4x]
+ { InstDB::RWInfo::kCategoryGeneric , 0 , { 19, 0 , 0 , 0 , 0 , 0 } }, // #12 [ref=1x]
+ { InstDB::RWInfo::kCategoryGeneric , 4 , { 6 , 7 , 0 , 0 , 0 , 0 } }, // #13 [ref=1x]
+ { InstDB::RWInfo::kCategoryGeneric , 5 , { 8 , 9 , 0 , 0 , 0 , 0 } }, // #14 [ref=1x]
+ { InstDB::RWInfo::kCategoryGeneric , 11, { 2 , 3 , 22, 0 , 0 , 0 } }, // #15 [ref=1x]
+ { InstDB::RWInfo::kCategoryGeneric , 13, { 4 , 23, 18, 24, 25, 0 } }, // #16 [ref=1x]
+ { InstDB::RWInfo::kCategoryGeneric , 12, { 26, 27, 28, 29, 30, 0 } }, // #17 [ref=1x]
+ { InstDB::RWInfo::kCategoryGeneric , 0 , { 28, 31, 32, 16, 0 , 0 } }, // #18 [ref=1x]
+ { InstDB::RWInfo::kCategoryGeneric , 0 , { 28, 0 , 0 , 0 , 0 , 0 } }, // #19 [ref=2x]
+ { InstDB::RWInfo::kCategoryGeneric , 10, { 2 , 0 , 0 , 0 , 0 , 0 } }, // #20 [ref=4x]
+ { InstDB::RWInfo::kCategoryGeneric , 6 , { 41, 42, 3 , 0 , 0 , 0 } }, // #21 [ref=2x]
+ { InstDB::RWInfo::kCategoryGeneric , 17, { 44, 5 , 0 , 0 , 0 , 0 } }, // #22 [ref=4x]
+ { InstDB::RWInfo::kCategoryGeneric , 0 , { 4 , 0 , 0 , 0 , 0 , 0 } }, // #23 [ref=1x]
+ { InstDB::RWInfo::kCategoryGeneric , 18, { 3 , 0 , 0 , 0 , 0 , 0 } }, // #24 [ref=17x]
+ { InstDB::RWInfo::kCategoryGeneric , 0 , { 45, 0 , 0 , 0 , 0 , 0 } }, // #25 [ref=16x]
+ { InstDB::RWInfo::kCategoryGeneric , 19, { 46, 0 , 0 , 0 , 0 , 0 } }, // #26 [ref=1x]
+ { InstDB::RWInfo::kCategoryGeneric , 19, { 47, 0 , 0 , 0 , 0 , 0 } }, // #27 [ref=1x]
+ { InstDB::RWInfo::kCategoryGeneric , 20, { 3 , 0 , 0 , 0 , 0 , 0 } }, // #28 [ref=3x]
+ { InstDB::RWInfo::kCategoryGeneric , 0 , { 46, 0 , 0 , 0 , 0 , 0 } }, // #29 [ref=6x]
+ { InstDB::RWInfo::kCategoryGeneric , 18, { 11, 0 , 0 , 0 , 0 , 0 } }, // #30 [ref=3x]
+ { InstDB::RWInfo::kCategoryGeneric , 21, { 13, 0 , 0 , 0 , 0 , 0 } }, // #31 [ref=1x]
+ { InstDB::RWInfo::kCategoryGeneric , 8 , { 11, 0 , 0 , 0 , 0 , 0 } }, // #32 [ref=8x]
+ { InstDB::RWInfo::kCategoryGeneric , 21, { 48, 0 , 0 , 0 , 0 , 0 } }, // #33 [ref=2x]
+ { InstDB::RWInfo::kCategoryGeneric , 7 , { 49, 0 , 0 , 0 , 0 , 0 } }, // #34 [ref=2x]
+ { InstDB::RWInfo::kCategoryGeneric , 20, { 11, 0 , 0 , 0 , 0 , 0 } }, // #35 [ref=2x]
+ { InstDB::RWInfo::kCategoryImul , 22, { 0 , 0 , 0 , 0 , 0 , 0 } }, // #36 [ref=1x]
+ { InstDB::RWInfo::kCategoryGeneric , 0 , { 53, 0 , 0 , 0 , 0 , 0 } }, // #37 [ref=1x]
+ { InstDB::RWInfo::kCategoryGeneric , 0 , { 26, 0 , 0 , 0 , 0 , 0 } }, // #38 [ref=1x]
+ { InstDB::RWInfo::kCategoryGeneric , 5 , { 4 , 9 , 0 , 0 , 0 , 0 } }, // #39 [ref=2x]
+ { InstDB::RWInfo::kCategoryGeneric , 0 , { 4 , 5 , 0 , 0 , 0 , 0 } }, // #40 [ref=1x]
+ { InstDB::RWInfo::kCategoryGeneric , 0 , { 56, 40, 40, 0 , 0 , 0 } }, // #41 [ref=6x]
+ { InstDB::RWInfo::kCategoryGeneric , 0 , { 44, 9 , 9 , 0 , 0 , 0 } }, // #42 [ref=6x]
+ { InstDB::RWInfo::kCategoryGeneric , 0 , { 35, 7 , 7 , 0 , 0 , 0 } }, // #43 [ref=6x]
+ { InstDB::RWInfo::kCategoryGeneric , 0 , { 48, 13, 13, 0 , 0 , 0 } }, // #44 [ref=6x]
+ { InstDB::RWInfo::kCategoryGeneric , 0 , { 56, 40, 0 , 0 , 0 , 0 } }, // #45 [ref=2x]
+ { InstDB::RWInfo::kCategoryGeneric , 0 , { 44, 9 , 0 , 0 , 0 , 0 } }, // #46 [ref=2x]
+ { InstDB::RWInfo::kCategoryGeneric , 0 , { 35, 7 , 0 , 0 , 0 , 0 } }, // #47 [ref=2x]
+ { InstDB::RWInfo::kCategoryGeneric , 0 , { 48, 13, 0 , 0 , 0 , 0 } }, // #48 [ref=2x]
+ { InstDB::RWInfo::kCategoryGeneric , 0 , { 48, 40, 40, 0 , 0 , 0 } }, // #49 [ref=1x]
+ { InstDB::RWInfo::kCategoryGeneric , 0 , { 35, 9 , 9 , 0 , 0 , 0 } }, // #50 [ref=1x]
+ { InstDB::RWInfo::kCategoryGeneric , 0 , { 44, 13, 13, 0 , 0 , 0 } }, // #51 [ref=1x]
+ { InstDB::RWInfo::kCategoryGeneric , 0 , { 57, 0 , 0 , 0 , 0 , 0 } }, // #52 [ref=1x]
+ { InstDB::RWInfo::kCategoryGeneric , 28, { 9 , 0 , 0 , 0 , 0 , 0 } }, // #53 [ref=2x]
+ { InstDB::RWInfo::kCategoryGeneric , 16, { 43, 0 , 0 , 0 , 0 , 0 } }, // #54 [ref=1x]
+ { InstDB::RWInfo::kCategoryGeneric , 7 , { 13, 0 , 0 , 0 , 0 , 0 } }, // #55 [ref=5x]
+ { InstDB::RWInfo::kCategoryGeneric , 0 , { 3 , 0 , 0 , 0 , 0 , 0 } }, // #56 [ref=4x]
+ { InstDB::RWInfo::kCategoryGeneric , 5 , { 3 , 9 , 0 , 0 , 0 , 0 } }, // #57 [ref=2x]
+ { InstDB::RWInfo::kCategoryGeneric , 0 , { 5 , 5 , 59, 0 , 0 , 0 } }, // #58 [ref=2x]
+ { InstDB::RWInfo::kCategoryGeneric , 0 , { 7 , 7 , 59, 0 , 0 , 0 } }, // #59 [ref=1x]
+ { InstDB::RWInfo::kCategoryGeneric , 0 , { 19, 29, 60, 0 , 0 , 0 } }, // #60 [ref=2x]
+ { InstDB::RWInfo::kCategoryGeneric , 6 , { 64, 42, 3 , 0 , 0 , 0 } }, // #61 [ref=1x]
+ { InstDB::RWInfo::kCategoryGeneric , 6 , { 11, 11, 3 , 65, 0 , 0 } }, // #62 [ref=1x]
+ { InstDB::RWInfo::kCategoryGeneric , 0 , { 17, 29, 30, 0 , 0 , 0 } }, // #63 [ref=1x]
+ { InstDB::RWInfo::kCategoryGeneric , 10, { 3 , 0 , 0 , 0 , 0 , 0 } }, // #64 [ref=2x]
+ { InstDB::RWInfo::kCategoryGeneric , 2 , { 2 , 3 , 0 , 0 , 0 , 0 } }, // #65 [ref=1x]
+ { InstDB::RWInfo::kCategoryGeneric , 3 , { 5 , 5 , 0 , 67, 17, 60 } }, // #66 [ref=2x]
+ { InstDB::RWInfo::kCategoryGeneric , 3 , { 5 , 5 , 0 , 68, 17, 60 } }, // #67 [ref=2x]
+ { InstDB::RWInfo::kCategoryGeneric , 3 , { 5 , 5 , 0 , 67, 0 , 0 } }, // #68 [ref=2x]
+ { InstDB::RWInfo::kCategoryGeneric , 3 , { 5 , 5 , 0 , 68, 0 , 0 } }, // #69 [ref=2x]
+ { InstDB::RWInfo::kCategoryGeneric , 31, { 56, 5 , 0 , 0 , 0 , 0 } }, // #70 [ref=2x]
+ { InstDB::RWInfo::kCategoryGeneric , 32, { 35, 5 , 0 , 0 , 0 , 0 } }, // #71 [ref=2x]
+ { InstDB::RWInfo::kCategoryGeneric , 33, { 48, 3 , 0 , 0 , 0 , 0 } }, // #72 [ref=1x]
+ { InstDB::RWInfo::kCategoryGeneric , 15, { 4 , 40, 0 , 0 , 0 , 0 } }, // #73 [ref=1x]
+ { InstDB::RWInfo::kCategoryGeneric , 4 , { 4 , 7 , 0 , 0 , 0 , 0 } }, // #74 [ref=1x]
+ { InstDB::RWInfo::kCategoryGeneric , 27, { 2 , 13, 0 , 0 , 0 , 0 } }, // #75 [ref=1x]
+ { InstDB::RWInfo::kCategoryGeneric , 10, { 70, 0 , 0 , 0 , 0 , 0 } }, // #76 [ref=1x]
+ { InstDB::RWInfo::kCategoryGeneric , 4 , { 35, 7 , 0 , 0 , 0 , 0 } }, // #77 [ref=2x]
+ { InstDB::RWInfo::kCategoryGeneric , 10, { 65, 0 , 0 , 0 , 0 , 0 } }, // #78 [ref=1x]
+ { InstDB::RWInfo::kCategoryGeneric , 0 , { 11, 0 , 0 , 0 , 0 , 0 } }, // #79 [ref=6x]
+ { InstDB::RWInfo::kCategoryGeneric , 0 , { 16, 50, 29, 0 , 0 , 0 } }, // #80 [ref=5x]
+ { InstDB::RWInfo::kCategoryGeneric , 0 , { 44, 0 , 0 , 0 , 0 , 0 } }, // #81 [ref=1x]
+ { InstDB::RWInfo::kCategoryGeneric , 0 , { 35, 0 , 0 , 0 , 0 , 0 } }, // #82 [ref=1x]
+ { InstDB::RWInfo::kCategoryGeneric , 0 , { 16, 50, 67, 0 , 0 , 0 } }, // #83 [ref=1x]
+ { InstDB::RWInfo::kCategoryGeneric , 2 , { 11, 3 , 0 , 0 , 0 , 0 } }, // #84 [ref=19x]
+ { InstDB::RWInfo::kCategoryGeneric , 4 , { 36, 7 , 0 , 0 , 0 , 0 } }, // #85 [ref=1x]
+ { InstDB::RWInfo::kCategoryGeneric , 5 , { 37, 9 , 0 , 0 , 0 , 0 } }, // #86 [ref=1x]
+ { InstDB::RWInfo::kCategoryGeneric , 0 , { 72, 0 , 0 , 0 , 0 , 0 } }, // #87 [ref=1x]
+ { InstDB::RWInfo::kCategoryGeneric , 0 , { 7 , 0 , 0 , 0 , 0 , 0 } }, // #88 [ref=1x]
+ { InstDB::RWInfo::kCategoryGeneric , 31, { 73, 0 , 0 , 0 , 0 , 0 } }, // #89 [ref=30x]
+ { InstDB::RWInfo::kCategoryGeneric , 11, { 2 , 3 , 71, 0 , 0 , 0 } }, // #90 [ref=2x]
+ { InstDB::RWInfo::kCategoryGeneric , 35, { 11, 0 , 0 , 0 , 0 , 0 } }, // #91 [ref=3x]
+ { InstDB::RWInfo::kCategoryGeneric , 28, { 44, 0 , 0 , 0 , 0 , 0 } }, // #92 [ref=2x]
+ { InstDB::RWInfo::kCategoryGeneric , 16, { 74, 0 , 0 , 0 , 0 , 0 } }, // #93 [ref=1x]
+ { InstDB::RWInfo::kCategoryGeneric , 0 , { 75, 43, 43, 0 , 0 , 0 } }, // #94 [ref=5x]
+ { InstDB::RWInfo::kCategoryGeneric , 0 , { 74, 0 , 0 , 0 , 0 , 0 } }, // #95 [ref=1x]
+ { InstDB::RWInfo::kCategoryGeneric , 0 , { 9 , 60, 17, 0 , 0 , 0 } }, // #96 [ref=2x]
+ { InstDB::RWInfo::kCategoryGeneric , 13, { 75, 76, 77, 77, 77, 5 } }, // #97 [ref=2x]
+ { InstDB::RWInfo::kCategoryGeneric , 13, { 4 , 78, 79, 79, 79, 5 } }, // #98 [ref=2x]
+ { InstDB::RWInfo::kCategoryGeneric , 36, { 10, 5 , 7 , 0 , 0 , 0 } }, // #99 [ref=8x]
+ { InstDB::RWInfo::kCategoryGeneric , 37, { 10, 5 , 13, 0 , 0 , 0 } }, // #100 [ref=7x]
+ { InstDB::RWInfo::kCategoryGeneric , 38, { 10, 5 , 9 , 0 , 0 , 0 } }, // #101 [ref=9x]
+ { InstDB::RWInfo::kCategoryGeneric , 6 , { 11, 3 , 3 , 3 , 0 , 0 } }, // #102 [ref=3x]
+ { InstDB::RWInfo::kCategoryGeneric , 6 , { 35, 3 , 3 , 0 , 0 , 0 } }, // #103 [ref=18x]
+ { InstDB::RWInfo::kCategoryGeneric , 36, { 11, 5 , 7 , 0 , 0 , 0 } }, // #104 [ref=1x]
+ { InstDB::RWInfo::kCategoryGeneric , 37, { 35, 13, 13, 0 , 0 , 0 } }, // #105 [ref=1x]
+ { InstDB::RWInfo::kCategoryGeneric , 38, { 11, 5 , 9 , 0 , 0 , 0 } }, // #106 [ref=1x]
+ { InstDB::RWInfo::kCategoryVmov1_2 , 44, { 0 , 0 , 0 , 0 , 0 , 0 } }, // #107 [ref=1x]
+ { InstDB::RWInfo::kCategoryGeneric , 36, { 10, 5 , 5 , 0 , 0 , 0 } }, // #108 [ref=1x]
+ { InstDB::RWInfo::kCategoryGeneric , 36, { 10, 82, 7 , 0 , 0 , 0 } }, // #109 [ref=1x]
+ { InstDB::RWInfo::kCategoryGeneric , 37, { 10, 5 , 5 , 0 , 0 , 0 } }, // #110 [ref=3x]
+ { InstDB::RWInfo::kCategoryGeneric , 45, { 10, 61, 3 , 0 , 0 , 0 } }, // #111 [ref=2x]
+ { InstDB::RWInfo::kCategoryGeneric , 45, { 10, 3 , 3 , 0 , 0 , 0 } }, // #112 [ref=2x]
+ { InstDB::RWInfo::kCategoryGeneric , 45, { 10, 82, 3 , 0 , 0 , 0 } }, // #113 [ref=2x]
+ { InstDB::RWInfo::kCategoryGeneric , 38, { 10, 61, 9 , 0 , 0 , 0 } }, // #114 [ref=1x]
+ { InstDB::RWInfo::kCategoryGeneric , 38, { 10, 5 , 5 , 0 , 0 , 0 } }, // #115 [ref=1x]
+ { InstDB::RWInfo::kCategoryGeneric , 46, { 10, 5 , 5 , 0 , 0 , 0 } }, // #116 [ref=9x]
+ { InstDB::RWInfo::kCategoryGeneric , 48, { 10, 81, 0 , 0 , 0 , 0 } }, // #117 [ref=2x]
+ { InstDB::RWInfo::kCategoryGeneric , 48, { 10, 3 , 0 , 0 , 0 , 0 } }, // #118 [ref=4x]
+ { InstDB::RWInfo::kCategoryGeneric , 49, { 80, 43, 0 , 0 , 0 , 0 } }, // #119 [ref=4x]
+ { InstDB::RWInfo::kCategoryGeneric , 6 , { 2 , 3 , 3 , 0 , 0 , 0 } }, // #120 [ref=82x]
+ { InstDB::RWInfo::kCategoryGeneric , 38, { 4 , 5 , 5 , 0 , 0 , 0 } }, // #121 [ref=4x]
+ { InstDB::RWInfo::kCategoryGeneric , 36, { 4 , 61, 7 , 0 , 0 , 0 } }, // #122 [ref=1x]
+ { InstDB::RWInfo::kCategoryGeneric , 38, { 4 , 82, 9 , 0 , 0 , 0 } }, // #123 [ref=1x]
+ { InstDB::RWInfo::kCategoryGeneric , 36, { 6 , 7 , 7 , 0 , 0 , 0 } }, // #124 [ref=11x]
+ { InstDB::RWInfo::kCategoryGeneric , 37, { 4 , 5 , 5 , 0 , 0 , 0 } }, // #125 [ref=6x]
+ { InstDB::RWInfo::kCategoryGeneric , 38, { 8 , 9 , 9 , 0 , 0 , 0 } }, // #126 [ref=11x]
+ { InstDB::RWInfo::kCategoryGeneric , 50, { 11, 3 , 3 , 3 , 0 , 0 } }, // #127 [ref=15x]
+ { InstDB::RWInfo::kCategoryGeneric , 51, { 35, 7 , 7 , 7 , 0 , 0 } }, // #128 [ref=4x]
+ { InstDB::RWInfo::kCategoryGeneric , 52, { 44, 9 , 9 , 9 , 0 , 0 } }, // #129 [ref=4x]
+ { InstDB::RWInfo::kCategoryGeneric , 37, { 4 , 5 , 13, 0 , 0 , 0 } }, // #130 [ref=6x]
+ { InstDB::RWInfo::kCategoryGeneric , 36, { 26, 7 , 7 , 0 , 0 , 0 } }, // #131 [ref=1x]
+ { InstDB::RWInfo::kCategoryGeneric , 38, { 53, 9 , 9 , 0 , 0 , 0 } }, // #132 [ref=1x]
+ { InstDB::RWInfo::kCategoryGeneric , 14, { 35, 3 , 0 , 0 , 0 , 0 } }, // #133 [ref=3x]
+ { InstDB::RWInfo::kCategoryGeneric , 27, { 35, 13, 0 , 0 , 0 , 0 } }, // #134 [ref=1x]
+ { InstDB::RWInfo::kCategoryGeneric , 5 , { 35, 9 , 0 , 0 , 0 , 0 } }, // #135 [ref=1x]
+ { InstDB::RWInfo::kCategoryGeneric , 8 , { 2 , 3 , 2 , 0 , 0 , 0 } }, // #136 [ref=2x]
+ { InstDB::RWInfo::kCategoryGeneric , 0 , { 2 , 3 , 2 , 0 , 0 , 0 } }, // #137 [ref=4x]
+ { InstDB::RWInfo::kCategoryGeneric , 18, { 4 , 3 , 4 , 0 , 0 , 0 } }, // #138 [ref=2x]
+ { InstDB::RWInfo::kCategoryGeneric , 36, { 10, 61, 7 , 0 , 0 , 0 } }, // #139 [ref=11x]
+ { InstDB::RWInfo::kCategoryGeneric , 37, { 10, 83, 13, 0 , 0 , 0 } }, // #140 [ref=7x]
+ { InstDB::RWInfo::kCategoryGeneric , 38, { 10, 82, 9 , 0 , 0 , 0 } }, // #141 [ref=13x]
+ { InstDB::RWInfo::kCategoryGeneric , 46, { 80, 81, 5 , 0 , 0 , 0 } }, // #142 [ref=2x]
+ { InstDB::RWInfo::kCategoryGeneric , 46, { 11, 3 , 5 , 0 , 0 , 0 } }, // #143 [ref=4x]
+ { InstDB::RWInfo::kCategoryGeneric , 53, { 74, 43, 81, 0 , 0 , 0 } }, // #144 [ref=4x]
+ { InstDB::RWInfo::kCategoryVmaskmov , 0 , { 0 , 0 , 0 , 0 , 0 , 0 } }, // #145 [ref=4x]
+ { InstDB::RWInfo::kCategoryGeneric , 12, { 35, 0 , 0 , 0 , 0 , 0 } }, // #146 [ref=2x]
+ { InstDB::RWInfo::kCategoryGeneric , 0 , { 22, 0 , 0 , 0 , 0 , 0 } }, // #147 [ref=2x]
+ { InstDB::RWInfo::kCategoryGeneric , 0 , { 10, 61, 61, 0 , 0 , 0 } }, // #148 [ref=1x]
+ { InstDB::RWInfo::kCategoryGeneric , 12, { 10, 7 , 7 , 0 , 0 , 0 } }, // #149 [ref=2x]
+ { InstDB::RWInfo::kCategoryGeneric , 0 , { 10, 7 , 7 , 0 , 0 , 0 } }, // #150 [ref=1x]
+ { InstDB::RWInfo::kCategoryGeneric , 12, { 10, 61, 7 , 0 , 0 , 0 } }, // #151 [ref=2x]
+ { InstDB::RWInfo::kCategoryGeneric , 0 , { 10, 61, 7 , 0 , 0 , 0 } }, // #152 [ref=1x]
+ { InstDB::RWInfo::kCategoryGeneric , 0 , { 10, 83, 13, 0 , 0 , 0 } }, // #153 [ref=1x]
+ { InstDB::RWInfo::kCategoryGeneric , 0 , { 10, 82, 9 , 0 , 0 , 0 } }, // #154 [ref=1x]
+ { InstDB::RWInfo::kCategoryGeneric , 0 , { 84, 0 , 0 , 0 , 0 , 0 } }, // #155 [ref=1x]
+ { InstDB::RWInfo::kCategoryGeneric , 56, { 85, 86, 3 , 3 , 0 , 0 } }, // #156 [ref=2x]
+ { InstDB::RWInfo::kCategoryGeneric , 13, { 74, 76, 77, 77, 77, 5 } }, // #157 [ref=2x]
+ { InstDB::RWInfo::kCategoryGeneric , 53, { 80, 81, 81, 0 , 0 , 0 } }, // #158 [ref=2x]
+ { InstDB::RWInfo::kCategoryGeneric , 22, { 11, 3 , 3 , 0 , 0 , 0 } }, // #159 [ref=4x]
+ { InstDB::RWInfo::kCategoryGeneric , 7 , { 48, 5 , 0 , 0 , 0 , 0 } }, // #160 [ref=1x]
+ { InstDB::RWInfo::kCategoryGeneric , 57, { 10, 5 , 40, 0 , 0 , 0 } }, // #161 [ref=1x]
+ { InstDB::RWInfo::kCategoryGeneric , 46, { 10, 5 , 5 , 5 , 0 , 0 } }, // #162 [ref=12x]
+ { InstDB::RWInfo::kCategoryGeneric , 61, { 10, 5 , 5 , 5 , 0 , 0 } }, // #163 [ref=1x]
+ { InstDB::RWInfo::kCategoryGeneric , 62, { 10, 5 , 5 , 0 , 0 , 0 } }, // #164 [ref=12x]
+ { InstDB::RWInfo::kCategoryGeneric , 22, { 11, 3 , 5 , 0 , 0 , 0 } }, // #165 [ref=9x]
+ { InstDB::RWInfo::kCategoryGeneric , 63, { 11, 3 , 0 , 0 , 0 , 0 } }, // #166 [ref=2x]
+ { InstDB::RWInfo::kCategoryGeneric , 0 , { 60, 17, 29, 0 , 0 , 0 } }, // #167 [ref=2x]
+ { InstDB::RWInfo::kCategoryGeneric , 8 , { 3 , 60, 17, 0 , 0 , 0 } }, // #168 [ref=4x]
+ { InstDB::RWInfo::kCategoryGeneric , 8 , { 11, 60, 17, 0 , 0 , 0 } } // #169 [ref=8x]
};
const InstDB::RWInfoOp InstDB::rwInfoOp[] = {
- { 0x0000000000000000u, 0x0000000000000000u, 0xFF, { 0 }, 0 }, // #0 [ref=14957x]
- { 0x0000000000000003u, 0x0000000000000003u, 0x00, { 0 }, OpRWInfo::kRW | OpRWInfo::kRegPhysId }, // #1 [ref=10x]
- { 0x0000000000000000u, 0x0000000000000000u, 0xFF, { 0 }, OpRWInfo::kRW | OpRWInfo::kZExt }, // #2 [ref=217x]
- { 0x0000000000000000u, 0x0000000000000000u, 0xFF, { 0 }, OpRWInfo::kRead }, // #3 [ref=979x]
- { 0x000000000000FFFFu, 0x000000000000FFFFu, 0xFF, { 0 }, OpRWInfo::kRW | OpRWInfo::kZExt }, // #4 [ref=92x]
- { 0x000000000000FFFFu, 0x0000000000000000u, 0xFF, { 0 }, OpRWInfo::kRead }, // #5 [ref=305x]
- { 0x00000000000000FFu, 0x00000000000000FFu, 0xFF, { 0 }, OpRWInfo::kRW }, // #6 [ref=18x]
- { 0x00000000000000FFu, 0x0000000000000000u, 0xFF, { 0 }, OpRWInfo::kRead }, // #7 [ref=181x]
- { 0x000000000000000Fu, 0x000000000000000Fu, 0xFF, { 0 }, OpRWInfo::kRW }, // #8 [ref=18x]
- { 0x000000000000000Fu, 0x0000000000000000u, 0xFF, { 0 }, OpRWInfo::kRead }, // #9 [ref=129x]
- { 0x0000000000000000u, 0x000000000000FFFFu, 0xFF, { 0 }, OpRWInfo::kWrite | OpRWInfo::kZExt }, // #10 [ref=160x]
- { 0x0000000000000000u, 0x0000000000000000u, 0xFF, { 0 }, OpRWInfo::kWrite | OpRWInfo::kZExt }, // #11 [ref=416x]
- { 0x0000000000000003u, 0x0000000000000003u, 0xFF, { 0 }, OpRWInfo::kRW }, // #12 [ref=1x]
- { 0x0000000000000003u, 0x0000000000000000u, 0xFF, { 0 }, OpRWInfo::kRead }, // #13 [ref=34x]
- { 0x000000000000FFFFu, 0x0000000000000000u, 0x00, { 0 }, OpRWInfo::kRead | OpRWInfo::kRegPhysId }, // #14 [ref=4x]
- { 0x0000000000000000u, 0x000000000000000Fu, 0x02, { 0 }, OpRWInfo::kWrite | OpRWInfo::kZExt | OpRWInfo::kRegPhysId }, // #15 [ref=7x]
- { 0x000000000000000Fu, 0x0000000000000000u, 0x00, { 0 }, OpRWInfo::kRead | OpRWInfo::kRegPhysId }, // #16 [ref=21x]
- { 0x00000000000000FFu, 0x00000000000000FFu, 0x00, { 0 }, OpRWInfo::kRW | OpRWInfo::kZExt | OpRWInfo::kRegPhysId }, // #17 [ref=2x]
- { 0x0000000000000000u, 0x0000000000000000u, 0x00, { 0 }, OpRWInfo::kRead | OpRWInfo::kMemPhysId }, // #18 [ref=3x]
- { 0x0000000000000000u, 0x0000000000000000u, 0x06, { 0 }, OpRWInfo::kRW | OpRWInfo::kZExt | OpRWInfo::kMemPhysId }, // #19 [ref=3x]
- { 0x0000000000000000u, 0x0000000000000000u, 0x07, { 0 }, OpRWInfo::kRW | OpRWInfo::kZExt | OpRWInfo::kMemPhysId }, // #20 [ref=7x]
- { 0x0000000000000000u, 0x0000000000000000u, 0x00, { 0 }, OpRWInfo::kRead | OpRWInfo::kRegPhysId }, // #21 [ref=7x]
- { 0x00000000000000FFu, 0x00000000000000FFu, 0x02, { 0 }, OpRWInfo::kRW | OpRWInfo::kZExt | OpRWInfo::kRegPhysId }, // #22 [ref=1x]
- { 0x00000000000000FFu, 0x0000000000000000u, 0x01, { 0 }, OpRWInfo::kRead | OpRWInfo::kRegPhysId }, // #23 [ref=1x]
- { 0x00000000000000FFu, 0x0000000000000000u, 0x03, { 0 }, OpRWInfo::kRead | OpRWInfo::kRegPhysId }, // #24 [ref=1x]
- { 0x00000000000000FFu, 0x00000000000000FFu, 0xFF, { 0 }, OpRWInfo::kRW | OpRWInfo::kZExt }, // #25 [ref=20x]
- { 0x000000000000000Fu, 0x000000000000000Fu, 0x02, { 0 }, OpRWInfo::kRW | OpRWInfo::kZExt | OpRWInfo::kRegPhysId }, // #26 [ref=1x]
- { 0x000000000000000Fu, 0x000000000000000Fu, 0x00, { 0 }, OpRWInfo::kRW | OpRWInfo::kZExt | OpRWInfo::kRegPhysId }, // #27 [ref=4x]
- { 0x000000000000000Fu, 0x0000000000000000u, 0x01, { 0 }, OpRWInfo::kRead | OpRWInfo::kRegPhysId }, // #28 [ref=11x]
- { 0x000000000000000Fu, 0x0000000000000000u, 0x03, { 0 }, OpRWInfo::kRead | OpRWInfo::kRegPhysId }, // #29 [ref=2x]
- { 0x0000000000000000u, 0x000000000000000Fu, 0x03, { 0 }, OpRWInfo::kWrite | OpRWInfo::kZExt | OpRWInfo::kRegPhysId }, // #30 [ref=1x]
- { 0x000000000000000Fu, 0x000000000000000Fu, 0x01, { 0 }, OpRWInfo::kRW | OpRWInfo::kZExt | OpRWInfo::kRegPhysId }, // #31 [ref=1x]
- { 0x0000000000000000u, 0x00000000000000FFu, 0x02, { 0 }, OpRWInfo::kWrite | OpRWInfo::kZExt | OpRWInfo::kRegPhysId }, // #32 [ref=1x]
- { 0x00000000000000FFu, 0x0000000000000000u, 0x00, { 0 }, OpRWInfo::kRead | OpRWInfo::kRegPhysId }, // #33 [ref=1x]
- { 0x0000000000000000u, 0x00000000000000FFu, 0xFF, { 0 }, OpRWInfo::kWrite | OpRWInfo::kZExt }, // #34 [ref=75x]
- { 0x0000000000000000u, 0x00000000000000FFu, 0xFF, { 0 }, OpRWInfo::kWrite }, // #35 [ref=6x]
- { 0x0000000000000000u, 0x000000000000000Fu, 0xFF, { 0 }, OpRWInfo::kWrite }, // #36 [ref=6x]
- { 0x0000000000000000u, 0x0000000000000003u, 0x02, { 0 }, OpRWInfo::kWrite | OpRWInfo::kRegPhysId }, // #37 [ref=1x]
- { 0x0000000000000003u, 0x0000000000000000u, 0x00, { 0 }, OpRWInfo::kRead | OpRWInfo::kRegPhysId }, // #38 [ref=1x]
- { 0x0000000000000001u, 0x0000000000000000u, 0xFF, { 0 }, OpRWInfo::kRead }, // #39 [ref=28x]
- { 0x0000000000000000u, 0x0000000000000000u, 0x02, { 0 }, OpRWInfo::kRW | OpRWInfo::kRegPhysId | OpRWInfo::kZExt }, // #40 [ref=2x]
- { 0x0000000000000000u, 0x0000000000000000u, 0x00, { 0 }, OpRWInfo::kRW | OpRWInfo::kRegPhysId | OpRWInfo::kZExt }, // #41 [ref=3x]
- { 0x0000000000000000u, 0x000000000000000Fu, 0xFF, { 0 }, OpRWInfo::kWrite | OpRWInfo::kZExt }, // #42 [ref=29x]
- { 0xFFFFFFFFFFFFFFFFu, 0x0000000000000000u, 0xFF, { 0 }, OpRWInfo::kRead }, // #43 [ref=33x]
- { 0x00000000000003FFu, 0x00000000000003FFu, 0xFF, { 0 }, OpRWInfo::kRW | OpRWInfo::kZExt }, // #44 [ref=22x]
- { 0x00000000000003FFu, 0x0000000000000000u, 0xFF, { 0 }, OpRWInfo::kRead }, // #45 [ref=13x]
- { 0x0000000000000000u, 0x00000000000003FFu, 0xFF, { 0 }, OpRWInfo::kWrite | OpRWInfo::kZExt }, // #46 [ref=1x]
- { 0x0000000000000000u, 0x0000000000000003u, 0xFF, { 0 }, OpRWInfo::kWrite | OpRWInfo::kZExt }, // #47 [ref=15x]
- { 0x0000000000000000u, 0x0000000000000003u, 0x00, { 0 }, OpRWInfo::kWrite | OpRWInfo::kRegPhysId | OpRWInfo::kZExt }, // #48 [ref=2x]
- { 0x0000000000000000u, 0x0000000000000000u, 0x00, { 0 }, OpRWInfo::kWrite | OpRWInfo::kRegPhysId | OpRWInfo::kZExt }, // #49 [ref=2x]
- { 0x0000000000000003u, 0x0000000000000000u, 0x02, { 0 }, OpRWInfo::kRead | OpRWInfo::kRegPhysId }, // #50 [ref=4x]
- { 0x0000000000000000u, 0x0000000000000000u, 0x07, { 0 }, OpRWInfo::kWrite | OpRWInfo::kZExt | OpRWInfo::kMemPhysId }, // #51 [ref=1x]
- { 0x0000000000000000u, 0x0000000000000000u, 0x01, { 0 }, OpRWInfo::kRead | OpRWInfo::kRegPhysId }, // #52 [ref=1x]
- { 0x0000000000000000u, 0x0000000000000001u, 0xFF, { 0 }, OpRWInfo::kWrite | OpRWInfo::kZExt }, // #53 [ref=14x]
- { 0x0000000000000000u, 0x0000000000000001u, 0x00, { 0 }, OpRWInfo::kWrite | OpRWInfo::kRegPhysId }, // #54 [ref=1x]
- { 0x0000000000000000u, 0x0000000000000000u, 0x01, { 0 }, OpRWInfo::kRW | OpRWInfo::kRegPhysId | OpRWInfo::kZExt }, // #55 [ref=3x]
- { 0x000000000000000Fu, 0x0000000000000000u, 0x02, { 0 }, OpRWInfo::kRead | OpRWInfo::kRegPhysId }, // #56 [ref=20x]
- { 0x000000000000FF00u, 0x0000000000000000u, 0xFF, { 0 }, OpRWInfo::kRead }, // #57 [ref=23x]
- { 0x0000000000000000u, 0x000000000000FF00u, 0xFF, { 0 }, OpRWInfo::kWrite }, // #58 [ref=1x]
- { 0x0000000000000000u, 0x0000000000000000u, 0x02, { 0 }, OpRWInfo::kWrite | OpRWInfo::kRegPhysId | OpRWInfo::kZExt }, // #59 [ref=1x]
- { 0x0000000000000000u, 0x0000000000000000u, 0x02, { 0 }, OpRWInfo::kRead | OpRWInfo::kRegPhysId }, // #60 [ref=2x]
- { 0x0000000000000000u, 0x0000000000000000u, 0x06, { 0 }, OpRWInfo::kRead | OpRWInfo::kMemPhysId }, // #61 [ref=1x]
- { 0x0000000000000000u, 0x000000000000000Fu, 0x01, { 0 }, OpRWInfo::kWrite | OpRWInfo::kZExt | OpRWInfo::kRegPhysId }, // #62 [ref=5x]
- { 0x0000000000000000u, 0x000000000000FFFFu, 0x00, { 0 }, OpRWInfo::kWrite | OpRWInfo::kZExt | OpRWInfo::kRegPhysId }, // #63 [ref=4x]
- { 0x0000000000000000u, 0x0000000000000007u, 0xFF, { 0 }, OpRWInfo::kWrite | OpRWInfo::kZExt }, // #64 [ref=2x]
- { 0x0000000000000000u, 0x0000000000000000u, 0x04, { 0 }, OpRWInfo::kWrite | OpRWInfo::kZExt | OpRWInfo::kRegPhysId }, // #65 [ref=1x]
- { 0x0000000000000001u, 0x0000000000000000u, 0x01, { 0 }, OpRWInfo::kRead | OpRWInfo::kRegPhysId }, // #66 [ref=10x]
- { 0x0000000000000000u, 0x000000000000000Fu, 0x00, { 0 }, OpRWInfo::kWrite | OpRWInfo::kZExt | OpRWInfo::kRegPhysId }, // #67 [ref=5x]
- { 0x0000000000000001u, 0x0000000000000000u, 0x00, { 0 }, OpRWInfo::kRead | OpRWInfo::kRegPhysId }, // #68 [ref=1x]
- { 0x0000000000000000u, 0x0000000000000001u, 0xFF, { 0 }, OpRWInfo::kWrite }, // #69 [ref=30x]
- { 0xFFFFFFFFFFFFFFFFu, 0xFFFFFFFFFFFFFFFFu, 0xFF, { 0 }, OpRWInfo::kRW | OpRWInfo::kZExt }, // #70 [ref=2x]
- { 0x0000000000000000u, 0x00000000FFFFFFFFu, 0xFF, { 0 }, OpRWInfo::kWrite | OpRWInfo::kZExt }, // #71 [ref=10x]
- { 0x0000000000000000u, 0xFFFFFFFFFFFFFFFFu, 0xFF, { 0 }, OpRWInfo::kWrite | OpRWInfo::kZExt }, // #72 [ref=16x]
- { 0x00000000FFFFFFFFu, 0x0000000000000000u, 0xFF, { 0 }, OpRWInfo::kRead }, // #73 [ref=16x]
- { 0x000000000000FFF0u, 0x0000000000000000u, 0xFF, { 0 }, OpRWInfo::kRead }, // #74 [ref=18x]
- { 0x000000000000000Fu, 0x000000000000000Fu, 0xFF, { 0 }, OpRWInfo::kRW | OpRWInfo::kZExt }, // #75 [ref=1x]
- { 0x0000000000000000u, 0x0000000000000000u, 0x00, { 0 }, OpRWInfo::kRW | OpRWInfo::kZExt | OpRWInfo::kRegPhysId } // #76 [ref=1x]
+ { 0x0000000000000000u, 0x0000000000000000u, 0xFF, 0, { 0 }, OpRWFlags::kNone }, // #0 [ref=16519x]
+ { 0x0000000000000003u, 0x0000000000000003u, 0x00, 0, { 0 }, OpRWFlags::kRW | OpRWFlags::kRegPhysId }, // #1 [ref=10x]
+ { 0x0000000000000000u, 0x0000000000000000u, 0xFF, 0, { 0 }, OpRWFlags::kRW | OpRWFlags::kZExt }, // #2 [ref=236x]
+ { 0x0000000000000000u, 0x0000000000000000u, 0xFF, 0, { 0 }, OpRWFlags::kRead }, // #3 [ref=1077x]
+ { 0x000000000000FFFFu, 0x000000000000FFFFu, 0xFF, 0, { 0 }, OpRWFlags::kRW | OpRWFlags::kZExt }, // #4 [ref=108x]
+ { 0x000000000000FFFFu, 0x0000000000000000u, 0xFF, 0, { 0 }, OpRWFlags::kRead }, // #5 [ref=348x]
+ { 0x00000000000000FFu, 0x00000000000000FFu, 0xFF, 0, { 0 }, OpRWFlags::kRW }, // #6 [ref=18x]
+ { 0x00000000000000FFu, 0x0000000000000000u, 0xFF, 0, { 0 }, OpRWFlags::kRead }, // #7 [ref=186x]
+ { 0x000000000000000Fu, 0x000000000000000Fu, 0xFF, 0, { 0 }, OpRWFlags::kRW }, // #8 [ref=18x]
+ { 0x000000000000000Fu, 0x0000000000000000u, 0xFF, 0, { 0 }, OpRWFlags::kRead }, // #9 [ref=135x]
+ { 0x0000000000000000u, 0x000000000000FFFFu, 0xFF, 0, { 0 }, OpRWFlags::kWrite | OpRWFlags::kZExt }, // #10 [ref=184x]
+ { 0x0000000000000000u, 0x0000000000000000u, 0xFF, 0, { 0 }, OpRWFlags::kWrite | OpRWFlags::kZExt }, // #11 [ref=455x]
+ { 0x0000000000000003u, 0x0000000000000003u, 0xFF, 0, { 0 }, OpRWFlags::kRW }, // #12 [ref=1x]
+ { 0x0000000000000003u, 0x0000000000000000u, 0xFF, 0, { 0 }, OpRWFlags::kRead }, // #13 [ref=63x]
+ { 0x000000000000FFFFu, 0x0000000000000000u, 0x00, 0, { 0 }, OpRWFlags::kRead | OpRWFlags::kRegPhysId }, // #14 [ref=4x]
+ { 0x0000000000000000u, 0x0000000000000000u, 0xFF, 0, { 0 }, OpRWFlags::kWrite | OpRWFlags::kZExt | OpRWFlags::kMemBaseWrite | OpRWFlags::kMemIndexWrite }, // #15 [ref=1x]
+ { 0x0000000000000000u, 0x000000000000000Fu, 0x02, 0, { 0 }, OpRWFlags::kWrite | OpRWFlags::kZExt | OpRWFlags::kRegPhysId }, // #16 [ref=9x]
+ { 0x000000000000000Fu, 0x0000000000000000u, 0x00, 0, { 0 }, OpRWFlags::kRead | OpRWFlags::kRegPhysId }, // #17 [ref=23x]
+ { 0x00000000000000FFu, 0x00000000000000FFu, 0x00, 0, { 0 }, OpRWFlags::kRW | OpRWFlags::kZExt | OpRWFlags::kRegPhysId }, // #18 [ref=2x]
+ { 0x0000000000000000u, 0x0000000000000000u, 0x00, 0, { 0 }, OpRWFlags::kRead | OpRWFlags::kMemPhysId }, // #19 [ref=3x]
+ { 0x0000000000000000u, 0x0000000000000000u, 0x06, 0, { 0 }, OpRWFlags::kRead | OpRWFlags::kMemBaseRW | OpRWFlags::kMemBasePostModify | OpRWFlags::kMemPhysId }, // #20 [ref=3x]
+ { 0x0000000000000000u, 0x0000000000000000u, 0x07, 0, { 0 }, OpRWFlags::kRead | OpRWFlags::kMemBaseRW | OpRWFlags::kMemBasePostModify | OpRWFlags::kMemPhysId }, // #21 [ref=2x]
+ { 0x0000000000000000u, 0x0000000000000000u, 0x00, 0, { 0 }, OpRWFlags::kRead | OpRWFlags::kRegPhysId }, // #22 [ref=7x]
+ { 0x00000000000000FFu, 0x00000000000000FFu, 0x02, 0, { 0 }, OpRWFlags::kRW | OpRWFlags::kZExt | OpRWFlags::kRegPhysId }, // #23 [ref=1x]
+ { 0x00000000000000FFu, 0x0000000000000000u, 0x01, 0, { 0 }, OpRWFlags::kRead | OpRWFlags::kRegPhysId }, // #24 [ref=1x]
+ { 0x00000000000000FFu, 0x0000000000000000u, 0x03, 0, { 0 }, OpRWFlags::kRead | OpRWFlags::kRegPhysId }, // #25 [ref=1x]
+ { 0x00000000000000FFu, 0x00000000000000FFu, 0xFF, 0, { 0 }, OpRWFlags::kRW | OpRWFlags::kZExt }, // #26 [ref=21x]
+ { 0x000000000000000Fu, 0x000000000000000Fu, 0x02, 0, { 0 }, OpRWFlags::kRW | OpRWFlags::kZExt | OpRWFlags::kRegPhysId }, // #27 [ref=1x]
+ { 0x000000000000000Fu, 0x000000000000000Fu, 0x00, 0, { 0 }, OpRWFlags::kRW | OpRWFlags::kZExt | OpRWFlags::kRegPhysId }, // #28 [ref=4x]
+ { 0x000000000000000Fu, 0x0000000000000000u, 0x01, 0, { 0 }, OpRWFlags::kRead | OpRWFlags::kRegPhysId }, // #29 [ref=13x]
+ { 0x000000000000000Fu, 0x0000000000000000u, 0x03, 0, { 0 }, OpRWFlags::kRead | OpRWFlags::kRegPhysId }, // #30 [ref=2x]
+ { 0x0000000000000000u, 0x000000000000000Fu, 0x03, 0, { 0 }, OpRWFlags::kWrite | OpRWFlags::kZExt | OpRWFlags::kRegPhysId }, // #31 [ref=1x]
+ { 0x000000000000000Fu, 0x000000000000000Fu, 0x01, 0, { 0 }, OpRWFlags::kRW | OpRWFlags::kZExt | OpRWFlags::kRegPhysId }, // #32 [ref=1x]
+ { 0x0000000000000000u, 0x00000000000000FFu, 0x02, 0, { 0 }, OpRWFlags::kWrite | OpRWFlags::kZExt | OpRWFlags::kRegPhysId }, // #33 [ref=1x]
+ { 0x00000000000000FFu, 0x0000000000000000u, 0x00, 0, { 0 }, OpRWFlags::kRead | OpRWFlags::kRegPhysId }, // #34 [ref=1x]
+ { 0x0000000000000000u, 0x00000000000000FFu, 0xFF, 0, { 0 }, OpRWFlags::kWrite | OpRWFlags::kZExt }, // #35 [ref=82x]
+ { 0x0000000000000000u, 0x00000000000000FFu, 0xFF, 0, { 0 }, OpRWFlags::kWrite }, // #36 [ref=6x]
+ { 0x0000000000000000u, 0x000000000000000Fu, 0xFF, 0, { 0 }, OpRWFlags::kWrite }, // #37 [ref=6x]
+ { 0x0000000000000000u, 0x0000000000000003u, 0x02, 0, { 0 }, OpRWFlags::kWrite | OpRWFlags::kRegPhysId }, // #38 [ref=1x]
+ { 0x0000000000000003u, 0x0000000000000000u, 0x00, 0, { 0 }, OpRWFlags::kRead | OpRWFlags::kRegPhysId }, // #39 [ref=1x]
+ { 0x0000000000000001u, 0x0000000000000000u, 0xFF, 0, { 0 }, OpRWFlags::kRead }, // #40 [ref=28x]
+ { 0x0000000000000000u, 0x0000000000000000u, 0x02, 0, { 0 }, OpRWFlags::kRW | OpRWFlags::kRegPhysId | OpRWFlags::kZExt }, // #41 [ref=2x]
+ { 0x0000000000000000u, 0x0000000000000000u, 0x00, 0, { 0 }, OpRWFlags::kRW | OpRWFlags::kRegPhysId | OpRWFlags::kZExt }, // #42 [ref=3x]
+ { 0xFFFFFFFFFFFFFFFFu, 0x0000000000000000u, 0xFF, 0, { 0 }, OpRWFlags::kRead }, // #43 [ref=29x]
+ { 0x0000000000000000u, 0x000000000000000Fu, 0xFF, 0, { 0 }, OpRWFlags::kWrite | OpRWFlags::kZExt }, // #44 [ref=30x]
+ { 0x00000000000003FFu, 0x00000000000003FFu, 0xFF, 0, { 0 }, OpRWFlags::kRW | OpRWFlags::kZExt }, // #45 [ref=22x]
+ { 0x00000000000003FFu, 0x0000000000000000u, 0xFF, 0, { 0 }, OpRWFlags::kRead }, // #46 [ref=13x]
+ { 0x0000000000000000u, 0x00000000000003FFu, 0xFF, 0, { 0 }, OpRWFlags::kWrite | OpRWFlags::kZExt }, // #47 [ref=1x]
+ { 0x0000000000000000u, 0x0000000000000003u, 0xFF, 0, { 0 }, OpRWFlags::kWrite | OpRWFlags::kZExt }, // #48 [ref=17x]
+ { 0x0000000000000000u, 0x0000000000000003u, 0x00, 0, { 0 }, OpRWFlags::kWrite | OpRWFlags::kRegPhysId | OpRWFlags::kZExt }, // #49 [ref=2x]
+ { 0x0000000000000000u, 0x000000000000000Fu, 0x00, 0, { 0 }, OpRWFlags::kWrite | OpRWFlags::kZExt | OpRWFlags::kRegPhysId }, // #50 [ref=8x]
+ { 0x0000000000000000u, 0x0000000000000000u, 0x00, 0, { 0 }, OpRWFlags::kWrite | OpRWFlags::kRegPhysId | OpRWFlags::kZExt }, // #51 [ref=2x]
+ { 0x0000000000000003u, 0x0000000000000000u, 0x02, 0, { 0 }, OpRWFlags::kRead | OpRWFlags::kRegPhysId }, // #52 [ref=4x]
+ { 0x000000000000000Fu, 0x000000000000000Fu, 0xFF, 0, { 0 }, OpRWFlags::kRW | OpRWFlags::kZExt }, // #53 [ref=4x]
+ { 0x0000000000000000u, 0x0000000000000000u, 0x07, 0, { 0 }, OpRWFlags::kWrite | OpRWFlags::kZExt | OpRWFlags::kMemPhysId }, // #54 [ref=1x]
+ { 0x0000000000000000u, 0x0000000000000000u, 0x01, 0, { 0 }, OpRWFlags::kRead | OpRWFlags::kRegPhysId }, // #55 [ref=1x]
+ { 0x0000000000000000u, 0x0000000000000001u, 0xFF, 0, { 0 }, OpRWFlags::kWrite | OpRWFlags::kZExt }, // #56 [ref=14x]
+ { 0x0000000000000000u, 0x0000000000000001u, 0x00, 0, { 0 }, OpRWFlags::kWrite | OpRWFlags::kRegPhysId }, // #57 [ref=1x]
+ { 0x0000000000000000u, 0x0000000000000000u, 0x01, 0, { 0 }, OpRWFlags::kRW | OpRWFlags::kRegPhysId | OpRWFlags::kZExt }, // #58 [ref=3x]
+ { 0x0000000000000000u, 0x0000000000000000u, 0x07, 0, { 0 }, OpRWFlags::kRW | OpRWFlags::kZExt | OpRWFlags::kMemPhysId }, // #59 [ref=3x]
+ { 0x000000000000000Fu, 0x0000000000000000u, 0x02, 0, { 0 }, OpRWFlags::kRead | OpRWFlags::kRegPhysId }, // #60 [ref=22x]
+ { 0x000000000000FF00u, 0x0000000000000000u, 0xFF, 0, { 0 }, OpRWFlags::kRead }, // #61 [ref=23x]
+ { 0x0000000000000000u, 0x000000000000FF00u, 0xFF, 0, { 0 }, OpRWFlags::kWrite }, // #62 [ref=1x]
+ { 0x0000000000000000u, 0x0000000000000000u, 0x07, 0, { 0 }, OpRWFlags::kWrite | OpRWFlags::kZExt | OpRWFlags::kMemBaseRW | OpRWFlags::kMemBasePostModify | OpRWFlags::kMemPhysId }, // #63 [ref=2x]
+ { 0x0000000000000000u, 0x0000000000000000u, 0x02, 0, { 0 }, OpRWFlags::kWrite | OpRWFlags::kRegPhysId | OpRWFlags::kZExt }, // #64 [ref=1x]
+ { 0x0000000000000000u, 0x0000000000000000u, 0x02, 0, { 0 }, OpRWFlags::kRead | OpRWFlags::kRegPhysId }, // #65 [ref=2x]
+ { 0x0000000000000000u, 0x0000000000000000u, 0x06, 0, { 0 }, OpRWFlags::kRead | OpRWFlags::kMemPhysId }, // #66 [ref=1x]
+ { 0x0000000000000000u, 0x000000000000000Fu, 0x01, 0, { 0 }, OpRWFlags::kWrite | OpRWFlags::kZExt | OpRWFlags::kRegPhysId }, // #67 [ref=5x]
+ { 0x0000000000000000u, 0x000000000000FFFFu, 0x00, 0, { 0 }, OpRWFlags::kWrite | OpRWFlags::kZExt | OpRWFlags::kRegPhysId }, // #68 [ref=4x]
+ { 0x0000000000000000u, 0x0000000000000007u, 0xFF, 0, { 0 }, OpRWFlags::kWrite | OpRWFlags::kZExt }, // #69 [ref=2x]
+ { 0x0000000000000000u, 0x0000000000000000u, 0x04, 0, { 0 }, OpRWFlags::kWrite | OpRWFlags::kZExt | OpRWFlags::kRegPhysId }, // #70 [ref=1x]
+ { 0x0000000000000001u, 0x0000000000000000u, 0x01, 0, { 0 }, OpRWFlags::kRead | OpRWFlags::kRegPhysId }, // #71 [ref=10x]
+ { 0x0000000000000001u, 0x0000000000000000u, 0x00, 0, { 0 }, OpRWFlags::kRead | OpRWFlags::kRegPhysId }, // #72 [ref=1x]
+ { 0x0000000000000000u, 0x0000000000000001u, 0xFF, 0, { 0 }, OpRWFlags::kWrite }, // #73 [ref=30x]
+ { 0x0000000000000000u, 0xFFFFFFFFFFFFFFFFu, 0xFF, 0, { 0 }, OpRWFlags::kWrite | OpRWFlags::kZExt }, // #74 [ref=20x]
+ { 0xFFFFFFFFFFFFFFFFu, 0xFFFFFFFFFFFFFFFFu, 0xFF, 0, { 0 }, OpRWFlags::kRW | OpRWFlags::kZExt }, // #75 [ref=7x]
+ { 0xFFFFFFFFFFFFFFFFu, 0x0000000000000000u, 0xFF, 4, { 0 }, OpRWFlags::kRead }, // #76 [ref=4x]
+ { 0xFFFFFFFFFFFFFFFFu, 0x0000000000000000u, 0xFF, 0, { 0 }, OpRWFlags::kRead | OpRWFlags::kConsecutive }, // #77 [ref=12x]
+ { 0x000000000000FFFFu, 0x0000000000000000u, 0xFF, 4, { 0 }, OpRWFlags::kRead }, // #78 [ref=2x]
+ { 0x000000000000FFFFu, 0x0000000000000000u, 0xFF, 0, { 0 }, OpRWFlags::kRead | OpRWFlags::kConsecutive }, // #79 [ref=6x]
+ { 0x0000000000000000u, 0x00000000FFFFFFFFu, 0xFF, 0, { 0 }, OpRWFlags::kWrite | OpRWFlags::kZExt }, // #80 [ref=10x]
+ { 0x00000000FFFFFFFFu, 0x0000000000000000u, 0xFF, 0, { 0 }, OpRWFlags::kRead }, // #81 [ref=16x]
+ { 0x000000000000FFF0u, 0x0000000000000000u, 0xFF, 0, { 0 }, OpRWFlags::kRead }, // #82 [ref=18x]
+ { 0x000000000000FFFCu, 0x0000000000000000u, 0xFF, 0, { 0 }, OpRWFlags::kRead }, // #83 [ref=8x]
+ { 0x0000000000000000u, 0x0000000000000000u, 0x00, 0, { 0 }, OpRWFlags::kRW | OpRWFlags::kZExt | OpRWFlags::kRegPhysId }, // #84 [ref=1x]
+ { 0x0000000000000000u, 0x00000000000000FFu, 0xFF, 2, { 0 }, OpRWFlags::kWrite | OpRWFlags::kZExt }, // #85 [ref=2x]
+ { 0x0000000000000000u, 0x0000000000000000u, 0xFF, 0, { 0 }, OpRWFlags::kWrite | OpRWFlags::kZExt | OpRWFlags::kConsecutive } // #86 [ref=2x]
};
const InstDB::RWInfoRm InstDB::rwInfoRm[] = {
- { InstDB::RWInfoRm::kCategoryNone , 0x00, 0 , 0, 0 }, // #0 [ref=1809x]
+ { InstDB::RWInfoRm::kCategoryNone , 0x00, 0 , 0, 0 }, // #0 [ref=2000x]
{ InstDB::RWInfoRm::kCategoryConsistent, 0x03, 0 , InstDB::RWInfoRm::kFlagAmbiguous, 0 }, // #1 [ref=8x]
- { InstDB::RWInfoRm::kCategoryConsistent, 0x02, 0 , 0, 0 }, // #2 [ref=194x]
+ { InstDB::RWInfoRm::kCategoryConsistent, 0x02, 0 , 0, 0 }, // #2 [ref=204x]
{ InstDB::RWInfoRm::kCategoryFixed , 0x02, 16, 0, 0 }, // #3 [ref=122x]
{ InstDB::RWInfoRm::kCategoryFixed , 0x02, 8 , 0, 0 }, // #4 [ref=66x]
- { InstDB::RWInfoRm::kCategoryFixed , 0x02, 4 , 0, 0 }, // #5 [ref=33x]
- { InstDB::RWInfoRm::kCategoryConsistent, 0x04, 0 , 0, 0 }, // #6 [ref=270x]
+ { InstDB::RWInfoRm::kCategoryFixed , 0x02, 4 , 0, 0 }, // #5 [ref=35x]
+ { InstDB::RWInfoRm::kCategoryConsistent, 0x04, 0 , 0, 0 }, // #6 [ref=300x]
{ InstDB::RWInfoRm::kCategoryFixed , 0x01, 2 , 0, 0 }, // #7 [ref=9x]
- { InstDB::RWInfoRm::kCategoryFixed , 0x00, 0 , 0, 0 }, // #8 [ref=60x]
+ { InstDB::RWInfoRm::kCategoryFixed , 0x00, 0 , 0, 0 }, // #8 [ref=63x]
{ InstDB::RWInfoRm::kCategoryFixed , 0x03, 0 , 0, 0 }, // #9 [ref=1x]
- { InstDB::RWInfoRm::kCategoryConsistent, 0x01, 0 , InstDB::RWInfoRm::kFlagAmbiguous, 0 }, // #10 [ref=20x]
- { InstDB::RWInfoRm::kCategoryConsistent, 0x01, 0 , 0, 0 }, // #11 [ref=13x]
- { InstDB::RWInfoRm::kCategoryFixed , 0x00, 16, 0, 0 }, // #12 [ref=21x]
- { InstDB::RWInfoRm::kCategoryFixed , 0x00, 8 , 0, 0 }, // #13 [ref=20x]
- { InstDB::RWInfoRm::kCategoryConsistent, 0x02, 0 , InstDB::RWInfoRm::kFlagAmbiguous, 0 }, // #14 [ref=15x]
+ { InstDB::RWInfoRm::kCategoryConsistent, 0x01, 0 , InstDB::RWInfoRm::kFlagAmbiguous, 0 }, // #10 [ref=21x]
+ { InstDB::RWInfoRm::kCategoryConsistent, 0x01, 0 , 0, 0 }, // #11 [ref=14x]
+ { InstDB::RWInfoRm::kCategoryFixed , 0x00, 8 , 0, 0 }, // #12 [ref=22x]
+ { InstDB::RWInfoRm::kCategoryFixed , 0x00, 16, 0, 0 }, // #13 [ref=21x]
+ { InstDB::RWInfoRm::kCategoryConsistent, 0x02, 0 , InstDB::RWInfoRm::kFlagAmbiguous, 0 }, // #14 [ref=22x]
{ InstDB::RWInfoRm::kCategoryFixed , 0x02, 1 , 0, 0 }, // #15 [ref=5x]
- { InstDB::RWInfoRm::kCategoryFixed , 0x00, 64, 0, 0 }, // #16 [ref=3x]
- { InstDB::RWInfoRm::kCategoryFixed , 0x01, 4 , 0, 0 }, // #17 [ref=4x]
- { InstDB::RWInfoRm::kCategoryNone , 0x00, 0 , InstDB::RWInfoRm::kFlagAmbiguous, 0 }, // #18 [ref=22x]
+ { InstDB::RWInfoRm::kCategoryFixed , 0x00, 64, 0, 0 }, // #16 [ref=5x]
+ { InstDB::RWInfoRm::kCategoryFixed , 0x01, 4 , 0, 0 }, // #17 [ref=6x]
+ { InstDB::RWInfoRm::kCategoryNone , 0x00, 0 , InstDB::RWInfoRm::kFlagAmbiguous, 0 }, // #18 [ref=26x]
{ InstDB::RWInfoRm::kCategoryFixed , 0x00, 10, 0, 0 }, // #19 [ref=2x]
{ InstDB::RWInfoRm::kCategoryNone , 0x01, 0 , InstDB::RWInfoRm::kFlagAmbiguous, 0 }, // #20 [ref=5x]
- { InstDB::RWInfoRm::kCategoryFixed , 0x00, 2 , 0, 0 }, // #21 [ref=3x]
+ { InstDB::RWInfoRm::kCategoryFixed , 0x00, 2 , 0, 0 }, // #21 [ref=4x]
{ InstDB::RWInfoRm::kCategoryConsistent, 0x06, 0 , 0, 0 }, // #22 [ref=14x]
{ InstDB::RWInfoRm::kCategoryFixed , 0x03, 1 , 0, 0 }, // #23 [ref=1x]
{ InstDB::RWInfoRm::kCategoryFixed , 0x03, 4 , 0, 0 }, // #24 [ref=4x]
{ InstDB::RWInfoRm::kCategoryFixed , 0x03, 8 , 0, 0 }, // #25 [ref=3x]
- { InstDB::RWInfoRm::kCategoryFixed , 0x03, 2 , 0, 0 }, // #26 [ref=1x]
- { InstDB::RWInfoRm::kCategoryFixed , 0x02, 2 , 0, 0 }, // #27 [ref=6x]
+ { InstDB::RWInfoRm::kCategoryFixed , 0x03, 2 , 0, 0 }, // #26 [ref=2x]
+ { InstDB::RWInfoRm::kCategoryFixed , 0x02, 2 , 0, 0 }, // #27 [ref=13x]
{ InstDB::RWInfoRm::kCategoryFixed , 0x00, 4 , 0, 0 }, // #28 [ref=6x]
{ InstDB::RWInfoRm::kCategoryNone , 0x03, 0 , InstDB::RWInfoRm::kFlagAmbiguous, 0 }, // #29 [ref=1x]
{ InstDB::RWInfoRm::kCategoryFixed , 0x03, 16, 0, 0 }, // #30 [ref=6x]
{ InstDB::RWInfoRm::kCategoryFixed , 0x01, 1 , 0, 0 }, // #31 [ref=32x]
- { InstDB::RWInfoRm::kCategoryFixed , 0x01, 8 , 0, 0 }, // #32 [ref=2x]
- { InstDB::RWInfoRm::kCategoryFixed , 0x01, 2 , 0, Features::kSSE4_1 }, // #33 [ref=1x]
- { InstDB::RWInfoRm::kCategoryFixed , 0x01, 2 , InstDB::RWInfoRm::kFlagAmbiguous, 0 }, // #34 [ref=3x]
- { InstDB::RWInfoRm::kCategoryFixed , 0x04, 8 , 0, 0 }, // #35 [ref=34x]
- { InstDB::RWInfoRm::kCategoryFixed , 0x04, 4 , 0, 0 }, // #36 [ref=37x]
- { InstDB::RWInfoRm::kCategoryFixed , 0x00, 32, 0, 0 }, // #37 [ref=4x]
- { InstDB::RWInfoRm::kCategoryFixed , 0x02, 8 , InstDB::RWInfoRm::kFlagAmbiguous, 0 }, // #38 [ref=1x]
- { InstDB::RWInfoRm::kCategoryFixed , 0x02, 4 , InstDB::RWInfoRm::kFlagAmbiguous, 0 }, // #39 [ref=1x]
- { InstDB::RWInfoRm::kCategoryHalf , 0x02, 0 , 0, 0 }, // #40 [ref=14x]
- { InstDB::RWInfoRm::kCategoryHalf , 0x01, 0 , 0, 0 }, // #41 [ref=10x]
- { InstDB::RWInfoRm::kCategoryConsistent, 0x04, 0 , InstDB::RWInfoRm::kFlagAmbiguous, 0 }, // #42 [ref=4x]
- { InstDB::RWInfoRm::kCategoryFixed , 0x04, 16, 0, 0 }, // #43 [ref=27x]
- { InstDB::RWInfoRm::kCategoryFixed , 0x02, 64, 0, 0 }, // #44 [ref=6x]
- { InstDB::RWInfoRm::kCategoryFixed , 0x01, 16, 0, 0 }, // #45 [ref=6x]
- { InstDB::RWInfoRm::kCategoryFixed , 0x01, 32, 0, 0 }, // #46 [ref=4x]
- { InstDB::RWInfoRm::kCategoryConsistent, 0x0C, 0 , 0, 0 }, // #47 [ref=15x]
- { InstDB::RWInfoRm::kCategoryFixed , 0x0C, 8 , 0, 0 }, // #48 [ref=4x]
- { InstDB::RWInfoRm::kCategoryFixed , 0x0C, 4 , 0, 0 }, // #49 [ref=4x]
- { InstDB::RWInfoRm::kCategoryFixed , 0x04, 32, 0, 0 }, // #50 [ref=6x]
- { InstDB::RWInfoRm::kCategoryConsistent, 0x03, 0 , 0, 0 }, // #51 [ref=13x]
- { InstDB::RWInfoRm::kCategoryNone , 0x02, 0 , 0, 0 }, // #52 [ref=1x]
- { InstDB::RWInfoRm::kCategoryFixed , 0x03, 8 , InstDB::RWInfoRm::kFlagAmbiguous, 0 }, // #53 [ref=1x]
- { InstDB::RWInfoRm::kCategoryFixed , 0x04, 1 , 0, 0 }, // #54 [ref=1x]
- { InstDB::RWInfoRm::kCategoryFixed , 0x04, 2 , 0, 0 }, // #55 [ref=1x]
- { InstDB::RWInfoRm::kCategoryQuarter , 0x01, 0 , 0, 0 }, // #56 [ref=6x]
- { InstDB::RWInfoRm::kCategoryEighth , 0x01, 0 , 0, 0 }, // #57 [ref=3x]
- { InstDB::RWInfoRm::kCategoryQuarter , 0x02, 0 , 0, 0 }, // #58 [ref=4x]
- { InstDB::RWInfoRm::kCategoryEighth , 0x02, 0 , 0, 0 }, // #59 [ref=2x]
- { InstDB::RWInfoRm::kCategoryFixed , 0x0C, 16, 0, 0 }, // #60 [ref=1x]
- { InstDB::RWInfoRm::kCategoryFixed , 0x06, 16, 0, 0 }, // #61 [ref=12x]
- { InstDB::RWInfoRm::kCategoryConsistent, 0x02, 0 , 0, Features::kAVX512_BW } // #62 [ref=2x]
+ { InstDB::RWInfoRm::kCategoryFixed , 0x01, 8 , 0, 0 }, // #32 [ref=4x]
+ { InstDB::RWInfoRm::kCategoryFixed , 0x01, 2 , 0, uint32_t(CpuFeatures::X86::kSSE4_1) }, // #33 [ref=1x]
+ { InstDB::RWInfoRm::kCategoryNone , 0x02, 0 , 0, 0 }, // #34 [ref=4x]
+ { InstDB::RWInfoRm::kCategoryFixed , 0x01, 2 , InstDB::RWInfoRm::kFlagAmbiguous, 0 }, // #35 [ref=3x]
+ { InstDB::RWInfoRm::kCategoryFixed , 0x04, 8 , 0, 0 }, // #36 [ref=35x]
+ { InstDB::RWInfoRm::kCategoryFixed , 0x04, 2 , 0, 0 }, // #37 [ref=30x]
+ { InstDB::RWInfoRm::kCategoryFixed , 0x04, 4 , 0, 0 }, // #38 [ref=42x]
+ { InstDB::RWInfoRm::kCategoryFixed , 0x00, 32, 0, 0 }, // #39 [ref=4x]
+ { InstDB::RWInfoRm::kCategoryFixed , 0x02, 8 , InstDB::RWInfoRm::kFlagAmbiguous, 0 }, // #40 [ref=1x]
+ { InstDB::RWInfoRm::kCategoryFixed , 0x02, 4 , InstDB::RWInfoRm::kFlagAmbiguous, 0 }, // #41 [ref=1x]
+ { InstDB::RWInfoRm::kCategoryHalf , 0x02, 0 , 0, 0 }, // #42 [ref=19x]
+ { InstDB::RWInfoRm::kCategoryQuarter , 0x02, 0 , 0, 0 }, // #43 [ref=9x]
+ { InstDB::RWInfoRm::kCategoryHalf , 0x01, 0 , 0, 0 }, // #44 [ref=10x]
+ { InstDB::RWInfoRm::kCategoryConsistent, 0x04, 0 , InstDB::RWInfoRm::kFlagAmbiguous, 0 }, // #45 [ref=6x]
+ { InstDB::RWInfoRm::kCategoryFixed , 0x04, 16, 0, 0 }, // #46 [ref=27x]
+ { InstDB::RWInfoRm::kCategoryFixed , 0x02, 64, 0, 0 }, // #47 [ref=6x]
+ { InstDB::RWInfoRm::kCategoryFixed , 0x01, 16, 0, 0 }, // #48 [ref=6x]
+ { InstDB::RWInfoRm::kCategoryFixed , 0x01, 32, 0, 0 }, // #49 [ref=4x]
+ { InstDB::RWInfoRm::kCategoryConsistent, 0x0C, 0 , 0, 0 }, // #50 [ref=15x]
+ { InstDB::RWInfoRm::kCategoryFixed , 0x0C, 8 , 0, 0 }, // #51 [ref=4x]
+ { InstDB::RWInfoRm::kCategoryFixed , 0x0C, 4 , 0, 0 }, // #52 [ref=4x]
+ { InstDB::RWInfoRm::kCategoryFixed , 0x04, 32, 0, 0 }, // #53 [ref=6x]
+ { InstDB::RWInfoRm::kCategoryConsistent, 0x03, 0 , 0, 0 }, // #54 [ref=13x]
+ { InstDB::RWInfoRm::kCategoryFixed , 0x03, 8 , InstDB::RWInfoRm::kFlagAmbiguous, 0 }, // #55 [ref=1x]
+ { InstDB::RWInfoRm::kCategoryConsistent, 0x08, 0 , 0, 0 }, // #56 [ref=2x]
+ { InstDB::RWInfoRm::kCategoryFixed , 0x04, 1 , 0, 0 }, // #57 [ref=1x]
+ { InstDB::RWInfoRm::kCategoryQuarter , 0x01, 0 , 0, 0 }, // #58 [ref=6x]
+ { InstDB::RWInfoRm::kCategoryEighth , 0x01, 0 , 0, 0 }, // #59 [ref=3x]
+ { InstDB::RWInfoRm::kCategoryEighth , 0x02, 0 , 0, 0 }, // #60 [ref=2x]
+ { InstDB::RWInfoRm::kCategoryFixed , 0x0C, 16, 0, 0 }, // #61 [ref=1x]
+ { InstDB::RWInfoRm::kCategoryFixed , 0x06, 16, 0, 0 }, // #62 [ref=12x]
+ { InstDB::RWInfoRm::kCategoryConsistent, 0x02, 0 , 0, uint32_t(CpuFeatures::X86::kAVX512_BW) } // #63 [ref=2x]
};
// ----------------------------------------------------------------------------
// ${InstRWInfoTable:End}
-// ============================================================================
-// [asmjit::x86::InstDB - Unit]
-// ============================================================================
+// x86::InstDB - Tests
+// ===================
#if defined(ASMJIT_TEST)
UNIT(x86_inst_db) {
INFO("Checking validity of Inst enums");
// Cross-validate prefixes.
- EXPECT(Inst::kOptionRex == 0x40000000u, "REX prefix must be at 0x40000000");
- EXPECT(Inst::kOptionVex3 == 0x00000400u, "VEX3 prefix must be at 0x00000400");
- EXPECT(Inst::kOptionEvex == 0x00001000u, "EVEX prefix must be at 0x00001000");
+ EXPECT(uint32_t(InstOptions::kX86_Rex ) == 0x40000000u, "REX prefix must be at 0x40000000");
+ EXPECT(uint32_t(InstOptions::kX86_Evex) == 0x00001000u, "EVEX prefix must be at 0x00001000");
// These could be combined together to form a valid REX prefix, they must match.
- EXPECT(uint32_t(Inst::kOptionOpCodeB) == uint32_t(Opcode::kB), "Opcode::kB must match Inst::kOptionOpCodeB");
- EXPECT(uint32_t(Inst::kOptionOpCodeX) == uint32_t(Opcode::kX), "Opcode::kX must match Inst::kOptionOpCodeX");
- EXPECT(uint32_t(Inst::kOptionOpCodeR) == uint32_t(Opcode::kR), "Opcode::kR must match Inst::kOptionOpCodeR");
- EXPECT(uint32_t(Inst::kOptionOpCodeW) == uint32_t(Opcode::kW), "Opcode::kW must match Inst::kOptionOpCodeW");
+ EXPECT(uint32_t(InstOptions::kX86_OpCodeB) == uint32_t(Opcode::kB), "Opcode::kB must match InstOptions::kX86_OpCodeB");
+ EXPECT(uint32_t(InstOptions::kX86_OpCodeX) == uint32_t(Opcode::kX), "Opcode::kX must match InstOptions::kX86_OpCodeX");
+ EXPECT(uint32_t(InstOptions::kX86_OpCodeR) == uint32_t(Opcode::kR), "Opcode::kR must match InstOptions::kX86_OpCodeR");
+ EXPECT(uint32_t(InstOptions::kX86_OpCodeW) == uint32_t(Opcode::kW), "Opcode::kW must match InstOptions::kX86_OpCodeW");
uint32_t rex_rb = (Opcode::kR >> Opcode::kREX_Shift) | (Opcode::kB >> Opcode::kREX_Shift) | 0x40;
uint32_t rex_rw = (Opcode::kR >> Opcode::kREX_Shift) | (Opcode::kW >> Opcode::kREX_Shift) | 0x40;
@@ -3981,4 +4392,4 @@ UNIT(x86_inst_db) {
ASMJIT_END_SUB_NAMESPACE
-#endif // ASMJIT_BUILD_X86
+#endif // !ASMJIT_NO_X86
diff --git a/3rdparty/asmjit/src/asmjit/x86/x86instdb.h b/3rdparty/asmjit/src/asmjit/x86/x86instdb.h
index 6bc2af5000a..99112891e02 100644
--- a/3rdparty/asmjit/src/asmjit/x86/x86instdb.h
+++ b/3rdparty/asmjit/src/asmjit/x86/x86instdb.h
@@ -1,25 +1,7 @@
-// AsmJit - Machine code generation for C++
+// This file is part of AsmJit project <https://asmjit.com>
//
-// * Official AsmJit Home Page: https://asmjit.com
-// * Official Github Repository: https://github.com/asmjit/asmjit
-//
-// Copyright (c) 2008-2020 The AsmJit Authors
-//
-// This software is provided 'as-is', without any express or implied
-// warranty. In no event will the authors be held liable for any damages
-// arising from the use of this software.
-//
-// Permission is granted to anyone to use this software for any purpose,
-// including commercial applications, and to alter it and redistribute it
-// freely, subject to the following restrictions:
-//
-// 1. The origin of this software must not be misrepresented; you must not
-// claim that you wrote the original software. If you use this software
-// in a product, an acknowledgment in the product documentation would be
-// appreciated but is not required.
-// 2. Altered source versions must be plainly marked as such, and must not be
-// misrepresented as being the original software.
-// 3. This notice may not be removed or altered from any source distribution.
+// See asmjit.h or LICENSE.md for license and copyright information
+// SPDX-License-Identifier: Zlib
#ifndef ASMJIT_X86_X86INSTDB_H_INCLUDED
#define ASMJIT_X86_X86INSTDB_H_INCLUDED
@@ -34,312 +16,412 @@ ASMJIT_BEGIN_SUB_NAMESPACE(x86)
//! Instruction database (X86).
namespace InstDB {
-// ============================================================================
-// [asmjit::x86::InstDB::Mode]
-// ============================================================================
-
-//! Describes which mode is supported by an instruction or instruction signature.
-enum Mode : uint32_t {
- kModeNone = 0x00u, //!< Invalid.
- kModeX86 = 0x01u, //!< X86 mode supported.
- kModeX64 = 0x02u, //!< X64 mode supported.
- kModeAny = 0x03u //!< Both X86 and X64 modes supported.
+//! Describes which operation mode is supported by an instruction.
+enum class Mode : uint8_t {
+ //! Invalid mode.
+ kNone = 0x00u,
+ //! X86 mode supported.
+ kX86 = 0x01u,
+ //! X64 mode supported.
+ kX64 = 0x02u,
+ //! Both X86 and X64 modes supported.
+ kAny = 0x03u
};
+ASMJIT_DEFINE_ENUM_FLAGS(Mode)
-static constexpr uint32_t modeFromArch(uint32_t arch) noexcept {
- return arch == Environment::kArchX86 ? kModeX86 :
- arch == Environment::kArchX64 ? kModeX64 : kModeNone;
+//! Converts architecture to operation mode, see \ref Mode.
+static constexpr Mode modeFromArch(Arch arch) noexcept {
+ return arch == Arch::kX86 ? Mode::kX86 :
+ arch == Arch::kX64 ? Mode::kX64 : Mode::kNone;
}
-// ============================================================================
-// [asmjit::x86::InstDB::OpFlags]
-// ============================================================================
-
-//! Operand flags (X86).
-enum OpFlags : uint32_t {
- kOpNone = 0x00000000u, //!< No flags.
-
- kOpGpbLo = 0x00000001u, //!< Operand can be low 8-bit GPB register.
- kOpGpbHi = 0x00000002u, //!< Operand can be high 8-bit GPB register.
- kOpGpw = 0x00000004u, //!< Operand can be 16-bit GPW register.
- kOpGpd = 0x00000008u, //!< Operand can be 32-bit GPD register.
- kOpGpq = 0x00000010u, //!< Operand can be 64-bit GPQ register.
- kOpXmm = 0x00000020u, //!< Operand can be 128-bit XMM register.
- kOpYmm = 0x00000040u, //!< Operand can be 256-bit YMM register.
- kOpZmm = 0x00000080u, //!< Operand can be 512-bit ZMM register.
- kOpMm = 0x00000100u, //!< Operand can be 64-bit MM register.
- kOpKReg = 0x00000200u, //!< Operand can be 64-bit K register.
- kOpSReg = 0x00000400u, //!< Operand can be SReg (segment register).
- kOpCReg = 0x00000800u, //!< Operand can be CReg (control register).
- kOpDReg = 0x00001000u, //!< Operand can be DReg (debug register).
- kOpSt = 0x00002000u, //!< Operand can be 80-bit ST register (X87).
- kOpBnd = 0x00004000u, //!< Operand can be 128-bit BND register.
- kOpAllRegs = 0x00007FFFu, //!< Combination of all possible registers.
-
- kOpI4 = 0x00010000u, //!< Operand can be unsigned 4-bit immediate.
- kOpU4 = 0x00020000u, //!< Operand can be unsigned 4-bit immediate.
- kOpI8 = 0x00040000u, //!< Operand can be signed 8-bit immediate.
- kOpU8 = 0x00080000u, //!< Operand can be unsigned 8-bit immediate.
- kOpI16 = 0x00100000u, //!< Operand can be signed 16-bit immediate.
- kOpU16 = 0x00200000u, //!< Operand can be unsigned 16-bit immediate.
- kOpI32 = 0x00400000u, //!< Operand can be signed 32-bit immediate.
- kOpU32 = 0x00800000u, //!< Operand can be unsigned 32-bit immediate.
- kOpI64 = 0x01000000u, //!< Operand can be signed 64-bit immediate.
- kOpU64 = 0x02000000u, //!< Operand can be unsigned 64-bit immediate.
- kOpAllImm = 0x03FF0000u, //!< Operand can be any immediate.
-
- kOpMem = 0x04000000u, //!< Operand can be a scalar memory pointer.
- kOpVm = 0x08000000u, //!< Operand can be a vector memory pointer.
-
- kOpRel8 = 0x10000000u, //!< Operand can be relative 8-bit displacement.
- kOpRel32 = 0x20000000u, //!< Operand can be relative 32-bit displacement.
-
- kOpImplicit = 0x80000000u //!< Operand is implicit.
-};
-
-// ============================================================================
-// [asmjit::x86::InstDB::MemFlags]
-// ============================================================================
-
-//! Memory operand flags (X86).
-enum MemFlags : uint32_t {
- // NOTE: Instruction uses either scalar or vector memory operands, they never
- // collide. This allows us to share bits between "M" and "Vm" enums.
-
- kMemOpAny = 0x0001u, //!< Operand can be any scalar memory pointer.
- kMemOpM8 = 0x0002u, //!< Operand can be an 8-bit memory pointer.
- kMemOpM16 = 0x0004u, //!< Operand can be a 16-bit memory pointer.
- kMemOpM32 = 0x0008u, //!< Operand can be a 32-bit memory pointer.
- kMemOpM48 = 0x0010u, //!< Operand can be a 48-bit memory pointer (FAR pointers only).
- kMemOpM64 = 0x0020u, //!< Operand can be a 64-bit memory pointer.
- kMemOpM80 = 0x0040u, //!< Operand can be an 80-bit memory pointer.
- kMemOpM128 = 0x0080u, //!< Operand can be a 128-bit memory pointer.
- kMemOpM256 = 0x0100u, //!< Operand can be a 256-bit memory pointer.
- kMemOpM512 = 0x0200u, //!< Operand can be a 512-bit memory pointer.
- kMemOpM1024 = 0x0400u, //!< Operand can be a 1024-bit memory pointer.
-
- kMemOpVm32x = 0x0002u, //!< Operand can be a vm32x (vector) pointer.
- kMemOpVm32y = 0x0004u, //!< Operand can be a vm32y (vector) pointer.
- kMemOpVm32z = 0x0008u, //!< Operand can be a vm32z (vector) pointer.
- kMemOpVm64x = 0x0020u, //!< Operand can be a vm64x (vector) pointer.
- kMemOpVm64y = 0x0040u, //!< Operand can be a vm64y (vector) pointer.
- kMemOpVm64z = 0x0080u, //!< Operand can be a vm64z (vector) pointer.
-
- kMemOpBaseOnly = 0x0800u, //!< Only memory base is allowed (no index, no offset).
- kMemOpDs = 0x1000u, //!< Implicit memory operand's DS segment.
- kMemOpEs = 0x2000u, //!< Implicit memory operand's ES segment.
-
- kMemOpMib = 0x4000u //!< Operand must be MIB (base+index) pointer.
+//! Operand signature flags used by \ref OpSignature.
+enum class OpFlags : uint64_t {
+ //! No operand flags.
+ kNone = 0u,
+
+ kRegGpbLo = 0x0000000000000001u, //!< Operand can be low 8-bit GPB register.
+ kRegGpbHi = 0x0000000000000002u, //!< Operand can be high 8-bit GPB register.
+ kRegGpw = 0x0000000000000004u, //!< Operand can be 16-bit GPW register.
+ kRegGpd = 0x0000000000000008u, //!< Operand can be 32-bit GPD register.
+ kRegGpq = 0x0000000000000010u, //!< Operand can be 64-bit GPQ register.
+ kRegXmm = 0x0000000000000020u, //!< Operand can be 128-bit XMM register.
+ kRegYmm = 0x0000000000000040u, //!< Operand can be 256-bit YMM register.
+ kRegZmm = 0x0000000000000080u, //!< Operand can be 512-bit ZMM register.
+ kRegMm = 0x0000000000000100u, //!< Operand can be 64-bit MM register.
+ kRegKReg = 0x0000000000000200u, //!< Operand can be 64-bit K register.
+ kRegSReg = 0x0000000000000400u, //!< Operand can be SReg (segment register).
+ kRegCReg = 0x0000000000000800u, //!< Operand can be CReg (control register).
+ kRegDReg = 0x0000000000001000u, //!< Operand can be DReg (debug register).
+ kRegSt = 0x0000000000002000u, //!< Operand can be 80-bit ST register (X87).
+ kRegBnd = 0x0000000000004000u, //!< Operand can be 128-bit BND register.
+ kRegTmm = 0x0000000000008000u, //!< Operand can be 0..8192-bit TMM register.
+ kRegMask = 0x000000000000FFFFu, //!< Mask of all possible register types.
+
+ kMemUnspecified = 0x0000000000040000u, //!< Operand can be a scalar memory pointer without size.
+ kMem8 = 0x0000000000080000u, //!< Operand can be an 8-bit memory pointer.
+ kMem16 = 0x0000000000100000u, //!< Operand can be a 16-bit memory pointer.
+ kMem32 = 0x0000000000200000u, //!< Operand can be a 32-bit memory pointer.
+ kMem48 = 0x0000000000400000u, //!< Operand can be a 48-bit memory pointer (FAR pointers only).
+ kMem64 = 0x0000000000800000u, //!< Operand can be a 64-bit memory pointer.
+ kMem80 = 0x0000000001000000u, //!< Operand can be an 80-bit memory pointer.
+ kMem128 = 0x0000000002000000u, //!< Operand can be a 128-bit memory pointer.
+ kMem256 = 0x0000000004000000u, //!< Operand can be a 256-bit memory pointer.
+ kMem512 = 0x0000000008000000u, //!< Operand can be a 512-bit memory pointer.
+ kMem1024 = 0x0000000010000000u, //!< Operand can be a 1024-bit memory pointer.
+ kMemMask = 0x000000001FFC0000u, //!< Mask of all possible scalar memory types.
+
+ kVm32x = 0x0000000040000000u, //!< Operand can be a vm32x (vector) pointer.
+ kVm32y = 0x0000000080000000u, //!< Operand can be a vm32y (vector) pointer.
+ kVm32z = 0x0000000100000000u, //!< Operand can be a vm32z (vector) pointer.
+ kVm64x = 0x0000000200000000u, //!< Operand can be a vm64x (vector) pointer.
+ kVm64y = 0x0000000400000000u, //!< Operand can be a vm64y (vector) pointer.
+ kVm64z = 0x0000000800000000u, //!< Operand can be a vm64z (vector) pointer.
+ kVmMask = 0x0000000FC0000000u, //!< Mask of all possible vector memory types.
+
+ kImmI4 = 0x0000001000000000u, //!< Operand can be signed 4-bit immediate.
+ kImmU4 = 0x0000002000000000u, //!< Operand can be unsigned 4-bit immediate.
+ kImmI8 = 0x0000004000000000u, //!< Operand can be signed 8-bit immediate.
+ kImmU8 = 0x0000008000000000u, //!< Operand can be unsigned 8-bit immediate.
+ kImmI16 = 0x0000010000000000u, //!< Operand can be signed 16-bit immediate.
+ kImmU16 = 0x0000020000000000u, //!< Operand can be unsigned 16-bit immediate.
+ kImmI32 = 0x0000040000000000u, //!< Operand can be signed 32-bit immediate.
+ kImmU32 = 0x0000080000000000u, //!< Operand can be unsigned 32-bit immediate.
+ kImmI64 = 0x0000100000000000u, //!< Operand can be signed 64-bit immediate.
+ kImmU64 = 0x0000200000000000u, //!< Operand can be unsigned 64-bit immediate.
+ kImmMask = 0x00003FF000000000u, //!< Mask of all immediate types.
+
+ kRel8 = 0x0000400000000000u, //!< Operand can be relative 8-bit displacement.
+ kRel32 = 0x0000800000000000u, //!< Operand can be relative 32-bit displacement.
+ kRelMask = 0x0000C00000000000u, //!< Mask of all relative displacement types.
+
+ kFlagMemBase = 0x0001000000000000u, //!< Flag: Only memory base is allowed (no index, no offset).
+ kFlagMemDs = 0x0002000000000000u, //!< Flag: Implicit memory operand's DS segment.
+ kFlagMemEs = 0x0004000000000000u, //!< Flag: Implicit memory operand's ES segment.
+
+ kFlagMib = 0x0008000000000000u, //!< Flag: Operand is MIB (base+index) pointer.
+ kFlagTMem = 0x0010000000000000u, //!< Flag: Operand is TMEM (sib_mem), AMX memory pointer.
+
+ kFlagImplicit = 0x0080000000000000u, //!< Flag: Operand is implicit.
+ kFlagMask = 0x009F000000000000u, //!< Mask of all flags.
+
+ //! Contains mask of all registers, memory operands, immediate operands, and displacement operands.
+ kOpMask = kRegMask | kMemMask | kVmMask | kImmMask | kRelMask
};
+ASMJIT_DEFINE_ENUM_FLAGS(OpFlags)
-// ============================================================================
-// [asmjit::x86::InstDB::Flags]
-// ============================================================================
-
-//! Instruction flags (X86).
+//! Operand signature.
//!
-//! Details about instruction encoding, operation, features, and some limitations.
-enum Flags : uint32_t {
- kFlagNone = 0x00000000u, //!< No flags.
-
- // Instruction Family
- // ------------------
- //
- // Instruction family information.
+//! Contains all possible operand combinations, memory size information, and a fixed register id (or `BaseReg::kIdBad`
+//! if fixed id isn't required).
+struct OpSignature {
+ //! \name Members
+ //! \{
- kFlagFpu = 0x00000100u, //!< Instruction that accesses FPU registers.
- kFlagMmx = 0x00000200u, //!< Instruction that accesses MMX registers (including 3DNOW and GEODE) and EMMS.
- kFlagVec = 0x00000400u, //!< Instruction that accesses XMM registers (SSE, AVX, AVX512).
+ uint64_t _flags : 56;
+ uint64_t _regMask : 8;
- // Prefixes and Encoding Flags
- // ---------------------------
- //
- // These describe optional X86 prefixes that can be used to change the instruction's operation.
+ //! \}
- kFlagRep = 0x00001000u, //!< Instruction can be prefixed with using the REP(REPE) or REPNE prefix.
- kFlagRepIgnored = 0x00002000u, //!< Instruction ignores REP|REPNE prefixes, but they are accepted.
- kFlagLock = 0x00004000u, //!< Instruction can be prefixed with using the LOCK prefix.
- kFlagXAcquire = 0x00008000u, //!< Instruction can be prefixed with using the XACQUIRE prefix.
- kFlagXRelease = 0x00010000u, //!< Instruction can be prefixed with using the XRELEASE prefix.
- kFlagMib = 0x00020000u, //!< Instruction uses MIB (BNDLDX|BNDSTX) to encode two registers.
- kFlagVsib = 0x00040000u, //!< Instruction uses VSIB instead of legacy SIB.
- kFlagVex = 0x00080000u, //!< Instruction can be encoded by VEX|XOP (AVX|AVX2|BMI|XOP|...).
- kFlagEvex = 0x00100000u, //!< Instruction can be encoded by EVEX (AVX512).
+ //! \name Accessors
+ //! \{
- // FPU Flags
- // ---------
- //
- // Used to tell the encoder which memory operand sizes are encodable.
+ //! Returns operand signature flags.
+ inline OpFlags flags() const noexcept { return (OpFlags)_flags; }
- kFlagFpuM16 = 0x00200000u, //!< FPU instruction can address `word_ptr` (shared with M80).
- kFlagFpuM32 = 0x00400000u, //!< FPU instruction can address `dword_ptr`.
- kFlagFpuM64 = 0x00800000u, //!< FPU instruction can address `qword_ptr`.
- kFlagFpuM80 = 0x00200000u, //!< FPU instruction can address `tword_ptr` (shared with M16).
+ //! Tests whether the given `flag` is set.
+ inline bool hasFlag(OpFlags flag) const noexcept { return (_flags & uint64_t(flag)) != 0; }
- // AVX and AVX515 Flags
- // --------------------
- //
- // If both `kFlagPrefixVex` and `kFlagPrefixEvex` flags are specified it
- // means that the instructions can be encoded by either VEX or EVEX prefix.
- // In that case AsmJit checks global options and also instruction options
- // to decide whether to emit VEX or EVEX prefix.
-
- kFlagAvx512_ = 0x00000000u, //!< Internally used in tables, has no meaning.
- kFlagAvx512K = 0x01000000u, //!< Supports masking {k1..k7}.
- kFlagAvx512Z = 0x02000000u, //!< Supports zeroing {z}, must be used together with `kAvx512k`.
- kFlagAvx512ER = 0x04000000u, //!< Supports 'embedded-rounding' {er} with implicit {sae},
- kFlagAvx512SAE = 0x08000000u, //!< Supports 'suppress-all-exceptions' {sae}.
- kFlagAvx512B32 = 0x10000000u, //!< Supports 32-bit broadcast 'b32'.
- kFlagAvx512B64 = 0x20000000u, //!< Supports 64-bit broadcast 'b64'.
- kFlagAvx512T4X = 0x80000000u, //!< Operates on a vector of consecutive registers (AVX512_4FMAPS and AVX512_4VNNIW).
-
- // Combinations used by instruction tables to make AVX512 definitions more compact.
- kFlagAvx512KZ = kFlagAvx512K | kFlagAvx512Z,
- kFlagAvx512ER_SAE = kFlagAvx512ER | kFlagAvx512SAE,
- kFlagAvx512KZ_SAE = kFlagAvx512KZ | kFlagAvx512SAE,
- kFlagAvx512KZ_SAE_B32 = kFlagAvx512KZ_SAE | kFlagAvx512B32,
- kFlagAvx512KZ_SAE_B64 = kFlagAvx512KZ_SAE | kFlagAvx512B64,
-
- kFlagAvx512KZ_ER_SAE = kFlagAvx512KZ | kFlagAvx512ER_SAE,
- kFlagAvx512KZ_ER_SAE_B32 = kFlagAvx512KZ_ER_SAE | kFlagAvx512B32,
- kFlagAvx512KZ_ER_SAE_B64 = kFlagAvx512KZ_ER_SAE | kFlagAvx512B64,
-
- kFlagAvx512K_B32 = kFlagAvx512K | kFlagAvx512B32,
- kFlagAvx512K_B64 = kFlagAvx512K | kFlagAvx512B64,
- kFlagAvx512KZ_B32 = kFlagAvx512KZ | kFlagAvx512B32,
- kFlagAvx512KZ_B64 = kFlagAvx512KZ | kFlagAvx512B64
-};
+ //! Tests whether this signature contains at least one register operand of any type.
+ inline bool hasReg() const noexcept { return hasFlag(OpFlags::kRegMask); }
+ //! Tests whether this signature contains at least one scalar memory operand of any type.
+ inline bool hasMem() const noexcept { return hasFlag(OpFlags::kMemMask); }
+ //! Tests whether this signature contains at least one vector memory operand of any type.
+ inline bool hasVm() const noexcept { return hasFlag(OpFlags::kVmMask); }
+ //! Tests whether this signature contains at least one immediate operand of any type.
+ inline bool hasImm() const noexcept { return hasFlag(OpFlags::kImmMask); }
+ //! Tests whether this signature contains at least one relative displacement operand of any type.
+ inline bool hasRel() const noexcept { return hasFlag(OpFlags::kRelMask); }
-// ============================================================================
-// [asmjit::x86::InstDB::SingleRegCase]
-// ============================================================================
-
-enum SingleRegCase : uint32_t {
- //! No special handling.
- kSingleRegNone = 0,
- //! Operands become read-only - `REG & REG` and similar.
- kSingleRegRO = 1,
- //! Operands become write-only - `REG ^ REG` and similar.
- kSingleRegWO = 2
-};
+ //! Tests whether the operand is implicit.
+ inline bool isImplicit() const noexcept { return hasFlag(OpFlags::kFlagImplicit); }
-// ============================================================================
-// [asmjit::x86::InstDB::InstSignature / OpSignature]
-// ============================================================================
+ //! Returns a physical register mask.
+ inline RegMask regMask() const noexcept { return _regMask; }
-//! Operand signature (X86).
-//!
-//! Contains all possible operand combinations, memory size information, and
-//! a fixed register id (or `BaseReg::kIdBad` if fixed id isn't required).
-struct OpSignature {
- //! Operand flags.
- uint32_t opFlags;
- //! Memory flags.
- uint16_t memFlags;
- //! Extra flags.
- uint8_t extFlags;
- //! Mask of possible register IDs.
- uint8_t regMask;
+ //! \}
};
ASMJIT_VARAPI const OpSignature _opSignatureTable[];
-//! Instruction signature (X86).
+//! Instruction signature.
//!
-//! Contains a sequence of operands' combinations and other metadata that defines
-//! a single instruction. This data is used by instruction validator.
+//! Contains a sequence of operands' combinations and other metadata that defines a single instruction. This data is
+//! used by instruction validator.
struct InstSignature {
+ //! \name Members
+ //! \{
+
//! Count of operands in `opIndex` (0..6).
- uint8_t opCount : 3;
+ uint8_t _opCount : 3;
//! Architecture modes supported (X86 / X64).
- uint8_t modes : 2;
+ uint8_t _mode : 2;
//! Number of implicit operands.
- uint8_t implicit : 3;
+ uint8_t _implicitOpCount : 3;
//! Reserved for future use.
- uint8_t reserved;
+ uint8_t _reserved;
//! Indexes to `OpSignature` table.
- uint8_t operands[Globals::kMaxOpCount];
+ uint8_t _opSignatureIndexes[Globals::kMaxOpCount];
+
+ //! \}
+
+ //! \name Accessors
+ //! \{
+
+ //! Returns instruction operation mode.
+ inline Mode mode() const noexcept { return (Mode)_mode; }
+ //! Tests whether the instruction supports the given operating mode.
+ inline bool supportsMode(Mode mode) const noexcept { return (uint8_t(_mode) & uint8_t(mode)) != 0; }
+
+ //! Returns the number of operands of this signature.
+ inline uint32_t opCount() const noexcept { return _opCount; }
+ //! Returns the number of implicit operands this signature has.
+ inline uint32_t implicitOpCount() const noexcept { return _implicitOpCount; }
+ //! Tests whether this instruction signature has at least one implicit operand.
+ inline bool hasImplicitOperands() const noexcept { return _implicitOpCount != 0; }
+
+ //! Returns indexes to \ref _opSignatureTable for each operand of the instruction.
+ //!
+ //! \note The returned array always provides indexes for all operands (see \ref Globals::kMaxOpCount) even if the
+ //! instruction provides less operands. Undefined operands have always index of zero.
+ inline const uint8_t* opSignatureIndexes() const noexcept { return _opSignatureIndexes; }
+
+ //! Returns index to \ref _opSignatureTable, corresponding to the requested operand `index` of the instruction.
+ inline uint8_t opSignatureIndex(size_t index) const noexcept {
+ ASMJIT_ASSERT(index < Globals::kMaxOpCount);
+ return _opSignatureIndexes[index];
+ }
+
+ //! Returns \ref OpSignature corresponding to the requested operand `index` of the instruction.
+ inline const OpSignature& opSignature(size_t index) const noexcept {
+ ASMJIT_ASSERT(index < Globals::kMaxOpCount);
+ return _opSignatureTable[_opSignatureIndexes[index]];
+ }
+
+ //! \}
};
ASMJIT_VARAPI const InstSignature _instSignatureTable[];
-// ============================================================================
-// [asmjit::x86::InstDB::CommonInfo]
-// ============================================================================
+//! Instruction flags.
+//!
+//! Details about instruction encoding, operation, features, and some limitations.
+enum class InstFlags : uint32_t {
+ //! No flags.
+ kNone = 0x00000000u,
-//! Instruction common information (X86)
+ // Instruction Family
+ // ------------------
+ //
+ // Instruction family information.
+
+ //! Instruction that accesses FPU registers.
+ kFpu = 0x00000100u,
+ //! Instruction that accesses MMX registers (including 3DNOW and GEODE) and EMMS.
+ kMmx = 0x00000200u,
+ //! Instruction that accesses XMM registers (SSE, AVX, AVX512).
+ kVec = 0x00000400u,
+
+ // FPU Flags
+ // ---------
+ //
+ // Used to tell the encoder which memory operand sizes are encodable.
+
+ //! FPU instruction can address `word_ptr` (shared with M80).
+ kFpuM16 = 0x00000800u,
+ //! FPU instruction can address `dword_ptr`.
+ kFpuM32 = 0x00001000u,
+ //! FPU instruction can address `qword_ptr`.
+ kFpuM64 = 0x00002000u,
+ //! FPU instruction can address `tword_ptr` (shared with M16).
+ kFpuM80 = 0x00000800u,
+
+ // Prefixes and Encoding Flags
+ // ---------------------------
+ //
+ // These describe optional X86 prefixes that can be used to change the instruction's operation.
+
+ //! Instruction can be prefixed with using the REP(REPE) or REPNE prefix.
+ kRep = 0x00004000u,
+ //! Rep prefix is accepted, but it has no effect other than being emitted with the instruction (as an extra byte).
+ kRepIgnored = 0x00008000u,
+ //! Instruction can be prefixed with using the LOCK prefix.
+ kLock = 0x00010000u,
+ //! Instruction can be prefixed with using the XACQUIRE prefix.
+ kXAcquire = 0x00020000u,
+ //! Instruction can be prefixed with using the XRELEASE prefix.
+ kXRelease = 0x00040000u,
+ //! Instruction uses MIB (BNDLDX|BNDSTX) to encode two registers.
+ kMib = 0x00080000u,
+ //! Instruction uses VSIB instead of legacy SIB.
+ kVsib = 0x00100000u,
+ //! Instruction uses TSIB (or SIB_MEM) encoding (MODRM followed by SIB).
+ kTsib = 0x00200000u,
+
+ // If both `kPrefixVex` and `kPrefixEvex` flags are specified it means that the instructions can be encoded
+ // by either VEX or EVEX prefix. In that case AsmJit checks global options and also instruction options to decide
+ // whether to emit VEX or EVEX prefix.
+
+ //! Instruction can be encoded by VEX|XOP (AVX|AVX2|BMI|XOP|...).
+ kVex = 0x00400000u,
+ //! Instruction can be encoded by EVEX (AVX512).
+ kEvex = 0x00800000u,
+ //! EVEX encoding is preferred over VEX encoding (AVX515_VNNI vs AVX_VNNI).
+ kPreferEvex = 0x01000000u,
+ //! EVEX and VEX signatures are compatible.
+ kEvexCompat = 0x02000000u,
+ //! EVEX instruction requires K register in the first operand (compare instructions).
+ kEvexKReg = 0x04000000u,
+ //! EVEX instruction requires two operands and K register as a selector (gather instructions).
+ kEvexTwoOp = 0x08000000u,
+ //! VEX instruction that can be transformed to a compatible EVEX instruction.
+ kEvexTransformable = 0x10000000u,
+
+ // Other Flags
+ // -----------
+
+ //! Instruction uses consecutive registers.
+ //!
+ //! Used by V4FMADDPS, V4FMADDSS, V4FNMADDPS, V4FNMADDSS, VP4DPWSSD, VP4DPWSSDS, VP2INTERSECTD, and VP2INTERSECTQ
+ //! instructions
+ kConsecutiveRegs = 0x20000000u
+};
+ASMJIT_DEFINE_ENUM_FLAGS(InstFlags)
+
+//! AVX-512 flags.
+enum class Avx512Flags : uint32_t {
+ //! No AVX-512 flags.
+ kNone = 0,
+
+ //! Internally used in tables, has no meaning.
+ k_ = 0x00000000u,
+ //! Supports masking {k1..k7}.
+ kK = 0x00000001u,
+ //! Supports zeroing {z}, must be used together with `kAvx512k`.
+ kZ = 0x00000002u,
+ //! Supports 'embedded-rounding' {er} with implicit {sae},
+ kER = 0x00000004u,
+ //! Supports 'suppress-all-exceptions' {sae}.
+ kSAE = 0x00000008u,
+ //! Supports 16-bit broadcast 'b16'.
+ kB16 = 0x00000010u,
+ //! Supports 32-bit broadcast 'b32'.
+ kB32 = 0x00000020u,
+ //! Supports 64-bit broadcast 'b64'.
+ kB64 = 0x00000040u,
+ //! Operates on a vector of consecutive registers (AVX512_4FMAPS and AVX512_4VNNIW).
+ kT4X = 0x00000080u,
+
+ //! Implicit zeroing if {k} masking is used. Using {z} is not valid in this case as it's implicit.
+ kImplicitZ = 0x00000100,
+};
+ASMJIT_DEFINE_ENUM_FLAGS(Avx512Flags)
+
+//! Instruction common information.
//!
//! Aggregated information shared across one or more instruction.
struct CommonInfo {
//! Instruction flags.
uint32_t _flags;
+ //! Reserved for future use.
+ uint32_t _avx512Flags : 11;
//! First `InstSignature` entry in the database.
uint32_t _iSignatureIndex : 11;
//! Number of relevant `ISignature` entries.
uint32_t _iSignatureCount : 5;
- //! Control type, see `ControlType`.
- uint32_t _controlType : 3;
+ //! Instruction control flow category, see \ref InstControlFlow.
+ uint32_t _controlFlow : 3;
//! Specifies what happens if all source operands share the same register.
- uint32_t _singleRegCase : 2;
- //! Reserved for future use.
- uint32_t _reserved : 11;
+ uint32_t _sameRegHint : 2;
+
+ //! \name Accessors
+ //! \{
- // --------------------------------------------------------------------------
- // [Accessors]
- // --------------------------------------------------------------------------
+ //! Returns instruction flags.
+ inline InstFlags flags() const noexcept { return (InstFlags)_flags; }
+ //! Tests whether the instruction has a `flag`.
+ inline bool hasFlag(InstFlags flag) const noexcept { return Support::test(_flags, flag); }
- //! Returns instruction flags, see `InstInfo::Flags`.
- inline uint32_t flags() const noexcept { return _flags; }
- //! Tests whether the instruction has a `flag`, see `InstInfo::Flags`.
- inline bool hasFlag(uint32_t flag) const noexcept { return (_flags & flag) != 0; }
+ //! Returns instruction AVX-512 flags.
+ inline Avx512Flags avx512Flags() const noexcept { return (Avx512Flags)_avx512Flags; }
+ //! Tests whether the instruction has an AVX-512 `flag`.
+ inline bool hasAvx512Flag(Avx512Flags flag) const noexcept { return Support::test(_avx512Flags, flag); }
//! Tests whether the instruction is FPU instruction.
- inline bool isFpu() const noexcept { return hasFlag(kFlagFpu); }
+ inline bool isFpu() const noexcept { return hasFlag(InstFlags::kFpu); }
//! Tests whether the instruction is MMX/3DNOW instruction that accesses MMX registers (includes EMMS and FEMMS).
- inline bool isMmx() const noexcept { return hasFlag(kFlagMmx); }
+ inline bool isMmx() const noexcept { return hasFlag(InstFlags::kMmx); }
//! Tests whether the instruction is SSE|AVX|AVX512 instruction that accesses XMM|YMM|ZMM registers.
- inline bool isVec() const noexcept { return hasFlag(kFlagVec); }
+ inline bool isVec() const noexcept { return hasFlag(InstFlags::kVec); }
//! Tests whether the instruction is SSE+ (SSE4.2, AES, SHA included) instruction that accesses XMM registers.
- inline bool isSse() const noexcept { return (flags() & (kFlagVec | kFlagVex | kFlagEvex)) == kFlagVec; }
+ inline bool isSse() const noexcept { return (flags() & (InstFlags::kVec | InstFlags::kVex | InstFlags::kEvex)) == InstFlags::kVec; }
//! Tests whether the instruction is AVX+ (FMA included) instruction that accesses XMM|YMM|ZMM registers.
inline bool isAvx() const noexcept { return isVec() && isVexOrEvex(); }
//! Tests whether the instruction can be prefixed with LOCK prefix.
- inline bool hasLockPrefix() const noexcept { return hasFlag(kFlagLock); }
+ inline bool hasLockPrefix() const noexcept { return hasFlag(InstFlags::kLock); }
//! Tests whether the instruction can be prefixed with REP (REPE|REPZ) prefix.
- inline bool hasRepPrefix() const noexcept { return hasFlag(kFlagRep); }
+ inline bool hasRepPrefix() const noexcept { return hasFlag(InstFlags::kRep); }
//! Tests whether the instruction can be prefixed with XACQUIRE prefix.
- inline bool hasXAcquirePrefix() const noexcept { return hasFlag(kFlagXAcquire); }
+ inline bool hasXAcquirePrefix() const noexcept { return hasFlag(InstFlags::kXAcquire); }
//! Tests whether the instruction can be prefixed with XRELEASE prefix.
- inline bool hasXReleasePrefix() const noexcept { return hasFlag(kFlagXRelease); }
+ inline bool hasXReleasePrefix() const noexcept { return hasFlag(InstFlags::kXRelease); }
//! Tests whether the rep prefix is supported by the instruction, but ignored (has no effect).
- inline bool isRepIgnored() const noexcept { return hasFlag(kFlagRepIgnored); }
+ inline bool isRepIgnored() const noexcept { return hasFlag(InstFlags::kRepIgnored); }
//! Tests whether the instruction uses MIB.
- inline bool isMibOp() const noexcept { return hasFlag(kFlagMib); }
+ inline bool isMibOp() const noexcept { return hasFlag(InstFlags::kMib); }
//! Tests whether the instruction uses VSIB.
- inline bool isVsibOp() const noexcept { return hasFlag(kFlagVsib); }
+ inline bool isVsibOp() const noexcept { return hasFlag(InstFlags::kVsib); }
+ //! Tests whether the instruction uses TSIB (AMX, instruction requires MOD+SIB).
+ inline bool isTsibOp() const noexcept { return hasFlag(InstFlags::kTsib); }
//! Tests whether the instruction uses VEX (can be set together with EVEX if both are encodable).
- inline bool isVex() const noexcept { return hasFlag(kFlagVex); }
+ inline bool isVex() const noexcept { return hasFlag(InstFlags::kVex); }
//! Tests whether the instruction uses EVEX (can be set together with VEX if both are encodable).
- inline bool isEvex() const noexcept { return hasFlag(kFlagEvex); }
+ inline bool isEvex() const noexcept { return hasFlag(InstFlags::kEvex); }
//! Tests whether the instruction uses EVEX (can be set together with VEX if both are encodable).
- inline bool isVexOrEvex() const noexcept { return hasFlag(kFlagVex | kFlagEvex); }
+ inline bool isVexOrEvex() const noexcept { return hasFlag(InstFlags::kVex | InstFlags::kEvex); }
+
+ //! Tests whether the instruction should prefer EVEX prefix instead of VEX prefix.
+ inline bool preferEvex() const noexcept { return hasFlag(InstFlags::kPreferEvex); }
+
+ inline bool isEvexCompatible() const noexcept { return hasFlag(InstFlags::kEvexCompat); }
+ inline bool isEvexKRegOnly() const noexcept { return hasFlag(InstFlags::kEvexKReg); }
+ inline bool isEvexTwoOpOnly() const noexcept { return hasFlag(InstFlags::kEvexTwoOp); }
+ inline bool isEvexTransformable() const noexcept { return hasFlag(InstFlags::kEvexTransformable); }
//! Tests whether the instruction supports AVX512 masking {k}.
- inline bool hasAvx512K() const noexcept { return hasFlag(kFlagAvx512K); }
+ inline bool hasAvx512K() const noexcept { return hasAvx512Flag(Avx512Flags::kK); }
//! Tests whether the instruction supports AVX512 zeroing {k}{z}.
- inline bool hasAvx512Z() const noexcept { return hasFlag(kFlagAvx512Z); }
+ inline bool hasAvx512Z() const noexcept { return hasAvx512Flag(Avx512Flags::kZ); }
//! Tests whether the instruction supports AVX512 embedded-rounding {er}.
- inline bool hasAvx512ER() const noexcept { return hasFlag(kFlagAvx512ER); }
+ inline bool hasAvx512ER() const noexcept { return hasAvx512Flag(Avx512Flags::kER); }
//! Tests whether the instruction supports AVX512 suppress-all-exceptions {sae}.
- inline bool hasAvx512SAE() const noexcept { return hasFlag(kFlagAvx512SAE); }
+ inline bool hasAvx512SAE() const noexcept { return hasAvx512Flag(Avx512Flags::kSAE); }
//! Tests whether the instruction supports AVX512 broadcast (either 32-bit or 64-bit).
- inline bool hasAvx512B() const noexcept { return hasFlag(kFlagAvx512B32 | kFlagAvx512B64); }
+ inline bool hasAvx512B() const noexcept { return hasAvx512Flag(Avx512Flags::kB16 | Avx512Flags::kB32 | Avx512Flags::kB64); }
+ //! Tests whether the instruction supports AVX512 broadcast (16-bit).
+ inline bool hasAvx512B16() const noexcept { return hasAvx512Flag(Avx512Flags::kB16); }
//! Tests whether the instruction supports AVX512 broadcast (32-bit).
- inline bool hasAvx512B32() const noexcept { return hasFlag(kFlagAvx512B32); }
+ inline bool hasAvx512B32() const noexcept { return hasAvx512Flag(Avx512Flags::kB32); }
//! Tests whether the instruction supports AVX512 broadcast (64-bit).
- inline bool hasAvx512B64() const noexcept { return hasFlag(kFlagAvx512B64); }
+ inline bool hasAvx512B64() const noexcept { return hasAvx512Flag(Avx512Flags::kB64); }
+
+ // Returns the size of the broadcast - either 2, 4, or 8, or 0 if broadcast is not supported.
+ inline uint32_t broadcastSize() const noexcept {
+ constexpr uint32_t kShift = Support::ConstCTZ<uint32_t(Avx512Flags::kB16)>::value;
+ return (uint32_t(_avx512Flags) & uint32_t(Avx512Flags::kB16 | Avx512Flags::kB32 | Avx512Flags::kB64)) >> (kShift - 1);
+ }
inline uint32_t signatureIndex() const noexcept { return _iSignatureIndex; }
inline uint32_t signatureCount() const noexcept { return _iSignatureCount; }
@@ -347,48 +429,50 @@ struct CommonInfo {
inline const InstSignature* signatureData() const noexcept { return _instSignatureTable + _iSignatureIndex; }
inline const InstSignature* signatureEnd() const noexcept { return _instSignatureTable + _iSignatureIndex + _iSignatureCount; }
- //! Returns the control-flow type of the instruction.
- inline uint32_t controlType() const noexcept { return _controlType; }
+ //! Returns a control flow category of the instruction.
+ inline InstControlFlow controlFlow() const noexcept { return (InstControlFlow)_controlFlow; }
+
+ //! Returns a hint that can be used when both inputs are the same register.
+ inline InstSameRegHint sameRegHint() const noexcept { return (InstSameRegHint)_sameRegHint; }
- inline uint32_t singleRegCase() const noexcept { return _singleRegCase; }
+ //! \}
};
ASMJIT_VARAPI const CommonInfo _commonInfoTable[];
-// ============================================================================
-// [asmjit::x86::InstDB::InstInfo]
-// ============================================================================
-
-//! Instruction information (X86).
+//! Instruction information.
struct InstInfo {
- //! Index to `_nameData`.
+ //! Index to \ref _nameData.
uint32_t _nameDataIndex : 14;
- //! Index to `_commonInfoTable`.
+ //! Index to \ref _commonInfoTable.
uint32_t _commonInfoIndex : 10;
- //! Index to `InstDB::_commonInfoTableB`.
- uint32_t _commonInfoIndexB : 8;
+ //! Index to \ref _additionalInfoTable.
+ uint32_t _additionalInfoIndex : 8;
- //! Instruction encoding, see `InstDB::EncodingId`.
+ //! Instruction encoding (internal encoding identifier used by \ref Assembler).
uint8_t _encoding;
- //! Main opcode value (0.255).
+ //! Main opcode value (0..255).
uint8_t _mainOpcodeValue;
- //! Index to `InstDB::_mainOpcodeTable` that is combined with `_mainOpcodeValue`
- //! to form the final opcode.
+ //! Index to \ref _mainOpcodeTable` that is combined with \ref _mainOpcodeValue to form the final opcode.
uint8_t _mainOpcodeIndex;
- //! Index to `InstDB::_altOpcodeTable` that contains a full alternative opcode.
+ //! Index to \ref _altOpcodeTable that contains a full alternative opcode.
uint8_t _altOpcodeIndex;
- // --------------------------------------------------------------------------
- // [Accessors]
- // --------------------------------------------------------------------------
+ //! \name Accessors
+ //! \{
//! Returns common information, see `CommonInfo`.
inline const CommonInfo& commonInfo() const noexcept { return _commonInfoTable[_commonInfoIndex]; }
- //! Tests whether the instruction has flag `flag`, see `Flags`.
- inline bool hasFlag(uint32_t flag) const noexcept { return commonInfo().hasFlag(flag); }
- //! Returns instruction flags, see `Flags`.
- inline uint32_t flags() const noexcept { return commonInfo().flags(); }
+ //! Returns instruction flags, see \ref Flags.
+ inline InstFlags flags() const noexcept { return commonInfo().flags(); }
+ //! Tests whether the instruction has flag `flag`, see \ref Flags.
+ inline bool hasFlag(InstFlags flag) const noexcept { return commonInfo().hasFlag(flag); }
+
+ //! Returns instruction AVX-512 flags, see \ref Avx512Flags.
+ inline Avx512Flags avx512Flags() const noexcept { return commonInfo().avx512Flags(); }
+ //! Tests whether the instruction has an AVX-512 `flag`, see \ref Avx512Flags.
+ inline bool hasAvx512Flag(Avx512Flags flag) const noexcept { return commonInfo().hasAvx512Flag(flag); }
//! Tests whether the instruction is FPU instruction.
inline bool isFpu() const noexcept { return commonInfo().isFpu(); }
@@ -413,49 +497,63 @@ struct InstInfo {
//! Tests whether the rep prefix is supported by the instruction, but ignored (has no effect).
inline bool isRepIgnored() const noexcept { return commonInfo().isRepIgnored(); }
//! Tests whether the instruction uses MIB.
- inline bool isMibOp() const noexcept { return hasFlag(kFlagMib); }
+ inline bool isMibOp() const noexcept { return hasFlag(InstFlags::kMib); }
//! Tests whether the instruction uses VSIB.
- inline bool isVsibOp() const noexcept { return hasFlag(kFlagVsib); }
+ inline bool isVsibOp() const noexcept { return hasFlag(InstFlags::kVsib); }
//! Tests whether the instruction uses VEX (can be set together with EVEX if both are encodable).
- inline bool isVex() const noexcept { return hasFlag(kFlagVex); }
+ inline bool isVex() const noexcept { return hasFlag(InstFlags::kVex); }
//! Tests whether the instruction uses EVEX (can be set together with VEX if both are encodable).
- inline bool isEvex() const noexcept { return hasFlag(kFlagEvex); }
+ inline bool isEvex() const noexcept { return hasFlag(InstFlags::kEvex); }
//! Tests whether the instruction uses EVEX (can be set together with VEX if both are encodable).
- inline bool isVexOrEvex() const noexcept { return hasFlag(kFlagVex | kFlagEvex); }
+ inline bool isVexOrEvex() const noexcept { return hasFlag(InstFlags::kVex | InstFlags::kEvex); }
+
+ inline bool isEvexCompatible() const noexcept { return hasFlag(InstFlags::kEvexCompat); }
+ inline bool isEvexKRegOnly() const noexcept { return hasFlag(InstFlags::kEvexKReg); }
+ inline bool isEvexTwoOpOnly() const noexcept { return hasFlag(InstFlags::kEvexTwoOp); }
+ inline bool isEvexTransformable() const noexcept { return hasFlag(InstFlags::kEvexTransformable); }
//! Tests whether the instruction supports AVX512 masking {k}.
- inline bool hasAvx512K() const noexcept { return hasFlag(kFlagAvx512K); }
+ inline bool hasAvx512K() const noexcept { return hasAvx512Flag(Avx512Flags::kK); }
//! Tests whether the instruction supports AVX512 zeroing {k}{z}.
- inline bool hasAvx512Z() const noexcept { return hasFlag(kFlagAvx512Z); }
+ inline bool hasAvx512Z() const noexcept { return hasAvx512Flag(Avx512Flags::kZ); }
//! Tests whether the instruction supports AVX512 embedded-rounding {er}.
- inline bool hasAvx512ER() const noexcept { return hasFlag(kFlagAvx512ER); }
+ inline bool hasAvx512ER() const noexcept { return hasAvx512Flag(Avx512Flags::kER); }
//! Tests whether the instruction supports AVX512 suppress-all-exceptions {sae}.
- inline bool hasAvx512SAE() const noexcept { return hasFlag(kFlagAvx512SAE); }
+ inline bool hasAvx512SAE() const noexcept { return hasAvx512Flag(Avx512Flags::kSAE); }
//! Tests whether the instruction supports AVX512 broadcast (either 32-bit or 64-bit).
- inline bool hasAvx512B() const noexcept { return hasFlag(kFlagAvx512B32 | kFlagAvx512B64); }
+ inline bool hasAvx512B() const noexcept { return hasAvx512Flag(Avx512Flags::kB16 | Avx512Flags::kB32 | Avx512Flags::kB64); }
+ //! Tests whether the instruction supports AVX512 broadcast (16-bit).
+ inline bool hasAvx512B16() const noexcept { return hasAvx512Flag(Avx512Flags::kB16); }
//! Tests whether the instruction supports AVX512 broadcast (32-bit).
- inline bool hasAvx512B32() const noexcept { return hasFlag(kFlagAvx512B32); }
+ inline bool hasAvx512B32() const noexcept { return hasAvx512Flag(Avx512Flags::kB32); }
//! Tests whether the instruction supports AVX512 broadcast (64-bit).
- inline bool hasAvx512B64() const noexcept { return hasFlag(kFlagAvx512B64); }
+ inline bool hasAvx512B64() const noexcept { return hasAvx512Flag(Avx512Flags::kB64); }
- //! Gets the control-flow type of the instruction.
- inline uint32_t controlType() const noexcept { return commonInfo().controlType(); }
- inline uint32_t singleRegCase() const noexcept { return commonInfo().singleRegCase(); }
+ //! Returns a control flow category of the instruction.
+ inline InstControlFlow controlFlow() const noexcept { return commonInfo().controlFlow(); }
+ //! Returns a hint that can be used when both inputs are the same register.
+ inline InstSameRegHint sameRegHint() const noexcept { return commonInfo().sameRegHint(); }
inline uint32_t signatureIndex() const noexcept { return commonInfo().signatureIndex(); }
inline uint32_t signatureCount() const noexcept { return commonInfo().signatureCount(); }
inline const InstSignature* signatureData() const noexcept { return commonInfo().signatureData(); }
inline const InstSignature* signatureEnd() const noexcept { return commonInfo().signatureEnd(); }
+
+ //! \}
};
ASMJIT_VARAPI const InstInfo _instInfoTable[];
-inline const InstInfo& infoById(uint32_t instId) noexcept {
+static inline const InstInfo& infoById(InstId instId) noexcept {
ASMJIT_ASSERT(Inst::isDefinedId(instId));
return _instInfoTable[instId];
}
+//! \cond INTERNAL
+static_assert(sizeof(OpSignature) == 8, "InstDB::OpSignature must be 8 bytes long");
+//! \endcond
+
} // {InstDB}
//! \}
diff --git a/3rdparty/asmjit/src/asmjit/x86/x86instdb_p.h b/3rdparty/asmjit/src/asmjit/x86/x86instdb_p.h
index b8ec1dbd597..9a6f780ea1c 100644
--- a/3rdparty/asmjit/src/asmjit/x86/x86instdb_p.h
+++ b/3rdparty/asmjit/src/asmjit/x86/x86instdb_p.h
@@ -1,25 +1,7 @@
-// AsmJit - Machine code generation for C++
+// This file is part of AsmJit project <https://asmjit.com>
//
-// * Official AsmJit Home Page: https://asmjit.com
-// * Official Github Repository: https://github.com/asmjit/asmjit
-//
-// Copyright (c) 2008-2020 The AsmJit Authors
-//
-// This software is provided 'as-is', without any express or implied
-// warranty. In no event will the authors be held liable for any damages
-// arising from the use of this software.
-//
-// Permission is granted to anyone to use this software for any purpose,
-// including commercial applications, and to alter it and redistribute it
-// freely, subject to the following restrictions:
-//
-// 1. The origin of this software must not be misrepresented; you must not
-// claim that you wrote the original software. If you use this software
-// in a product, an acknowledgment in the product documentation would be
-// appreciated but is not required.
-// 2. Altered source versions must be plainly marked as such, and must not be
-// misrepresented as being the original software.
-// 3. This notice may not be removed or altered from any source distribution.
+// See asmjit.h or LICENSE.md for license and copyright information
+// SPDX-License-Identifier: Zlib
#ifndef ASMJIT_X86_X86INSTDB_P_H_INCLUDED
#define ASMJIT_X86_X86INSTDB_P_H_INCLUDED
@@ -34,34 +16,33 @@ ASMJIT_BEGIN_SUB_NAMESPACE(x86)
namespace InstDB {
-// ============================================================================
-// [asmjit::x86::InstDB::Encoding]
-// ============================================================================
-
//! Instruction encoding (X86).
//!
-//! This is a specific identifier that is used by AsmJit to describe the way
-//! each instruction is encoded. Some encodings are special only for a single
-//! instruction as X86 instruction set contains a lot of legacy encodings, and
-//! some encodings describe a group of instructions that share some commons,
-//! like MMX, SSE, AVX, AVX512 instructions, etc...
+//! This is a specific identifier that is used by AsmJit to describe the way each instruction is encoded. Some
+//! encodings are special only for a single instruction as X86 instruction set contains a lot of legacy encodings,
+//! and some encodings describe a group of instructions that share some commons, like MMX, SSE, AVX, AVX512
+//! instructions, etc...
enum EncodingId : uint32_t {
kEncodingNone = 0, //!< Never used.
kEncodingX86Op, //!< X86 [OP].
- kEncodingX86Op_O, //!< X86 [OP] (opcode and /0-7).
- kEncodingX86Op_O_I8, //!< X86 [OP] (opcode and /0-7 + 8-bit immediate).
+ kEncodingX86Op_Mod11RM, //!< X86 [OP] (opcode with ModRM byte where MOD must be 11b).
+ kEncodingX86Op_Mod11RM_I8, //!< X86 [OP] (opcode with ModRM byte + 8-bit immediate).
kEncodingX86Op_xAddr, //!< X86 [OP] (implicit address in the first register operand).
kEncodingX86Op_xAX, //!< X86 [OP] (implicit or explicit '?AX' form).
kEncodingX86Op_xDX_xAX, //!< X86 [OP] (implicit or explicit '?DX, ?AX' form).
kEncodingX86Op_MemZAX, //!< X86 [OP] (implicit or explicit '[EAX|RAX]' form).
kEncodingX86I_xAX, //!< X86 [I] (implicit or explicit '?AX' form).
kEncodingX86M, //!< X86 [M] (handles 2|4|8-bytes size).
+ kEncodingX86M_NoMemSize, //!< X86 [M] (handles 2|4|8-bytes size, but doesn't consider memory size).
kEncodingX86M_NoSize, //!< X86 [M] (doesn't handle any size).
kEncodingX86M_GPB, //!< X86 [M] (handles single-byte size).
kEncodingX86M_GPB_MulDiv, //!< X86 [M] (like GPB, handles implicit|explicit MUL|DIV|IDIV).
kEncodingX86M_Only, //!< X86 [M] (restricted to memory operand of any size).
+ kEncodingX86M_Only_EDX_EAX, //!< X86 [M] (memory operand only, followed by implicit <edx> and <eax>).
kEncodingX86M_Nop, //!< X86 [M] (special case of NOP instruction).
kEncodingX86R_Native, //!< X86 [R] (register must be either 32-bit or 64-bit depending on arch).
+ kEncodingX86R_FromM, //!< X86 [R] - which specifies memory address.
+ kEncodingX86R32_EDX_EAX, //!< X86 [R32] followed by implicit EDX and EAX.
kEncodingX86Rm, //!< X86 [RM] (doesn't handle single-byte size).
kEncodingX86Rm_Raw66H, //!< X86 [RM] (used by LZCNT, POPCNT, and TZCNT).
kEncodingX86Rm_NoSize, //!< X86 [RM] (doesn't add REX.W prefix if 64-bit reg is used).
@@ -84,8 +65,10 @@ enum EncodingId : uint32_t {
kEncodingX86JecxzLoop, //!< X86 jcxz, jecxz, jrcxz, loop, loope, loopne.
kEncodingX86Jmp, //!< X86 jmp.
kEncodingX86JmpRel, //!< X86 xbegin.
+ kEncodingX86LcallLjmp, //!< X86 lcall/ljmp.
kEncodingX86Lea, //!< X86 lea.
kEncodingX86Mov, //!< X86 mov (all possible cases).
+ kEncodingX86Movabs, //!< X86 movabs.
kEncodingX86MovsxMovzx, //!< X86 movsx, movzx.
kEncodingX86MovntiMovdiri, //!< X86 movnti/movdiri.
kEncodingX86EnqcmdMovdir64b, //!< X86 enqcmd/enqcmds/movdir64b.
@@ -117,7 +100,8 @@ enum EncodingId : uint32_t {
kEncodingExtRm_XMM0, //!< EXT [RM<XMM0>].
kEncodingExtRm_ZDI, //!< EXT [RM<ZDI>].
kEncodingExtRm_P, //!< EXT [RM] (propagates 66H if the instruction uses XMM register).
- kEncodingExtRm_Wx, //!< EXT [RM] (propagates REX.W if GPQ is used).
+ kEncodingExtRm_Wx, //!< EXT [RM] (propagates REX.W if GPQ is used or the second operand is GPQ/QWORD_PTR).
+ kEncodingExtRm_Wx_GpqOnly, //!< EXT [RM] (propagates REX.W if the first operand is GPQ register).
kEncodingExtRmRi, //!< EXT [RM|RI].
kEncodingExtRmRi_P, //!< EXT [RM|RI] (propagates 66H if the instruction uses XMM register).
kEncodingExtRmi, //!< EXT [RMI].
@@ -132,18 +116,21 @@ enum EncodingId : uint32_t {
kEncodingExtInsertq, //!< EXT insrq (SSE4A).
kEncodingExt3dNow, //!< EXT [RMI] (3DNOW specific).
kEncodingVexOp, //!< VEX [OP].
+ kEncodingVexOpMod, //!< VEX [OP] with MODR/M.
kEncodingVexKmov, //!< VEX [RM|MR] (used by kmov[b|w|d|q]).
kEncodingVexR_Wx, //!< VEX|EVEX [R] (propagatex VEX.W if GPQ used).
kEncodingVexM, //!< VEX|EVEX [M].
kEncodingVexM_VM, //!< VEX|EVEX [M] (propagates VEX|EVEX.L, VSIB support).
kEncodingVexMr_Lx, //!< VEX|EVEX [MR] (propagates VEX|EVEX.L if YMM used).
- kEncodingVexMr_VM, //!< VEX|EVEX [MR] (propagates VEX|EVEX.L, VSIB support).
+ kEncodingVexMr_VM, //!< VEX|EVEX [MR] (VSIB support).
kEncodingVexMri, //!< VEX|EVEX [MRI].
kEncodingVexMri_Lx, //!< VEX|EVEX [MRI] (propagates VEX|EVEX.L if YMM used).
+ kEncodingVexMri_Vpextrw, //!< VEX|EVEX [MRI] (special case required by VPEXTRW instruction).
kEncodingVexRm, //!< VEX|EVEX [RM].
kEncodingVexRm_ZDI, //!< VEX|EVEX [RM<ZDI>].
kEncodingVexRm_Wx, //!< VEX|EVEX [RM] (propagates VEX|EVEX.W if GPQ used).
kEncodingVexRm_Lx, //!< VEX|EVEX [RM] (propagates VEX|EVEX.L if YMM used).
+ kEncodingVexRm_Lx_Narrow, //!< VEX|EVEX [RM] (the destination vector size is narrowed).
kEncodingVexRm_Lx_Bcst, //!< VEX|EVEX [RM] (can handle broadcast r32/r64).
kEncodingVexRm_VM, //!< VEX|EVEX [RM] (propagates VEX|EVEX.L, VSIB support).
kEncodingVexRm_T1_4X, //!< EVEX [RM] (used by NN instructions that use RM-T1_4X encoding).
@@ -154,10 +141,14 @@ enum EncodingId : uint32_t {
kEncodingVexRvm_Wx, //!< VEX|EVEX [RVM] (propagates VEX|EVEX.W if GPQ used).
kEncodingVexRvm_ZDX_Wx, //!< VEX|EVEX [RVM<ZDX>] (propagates VEX|EVEX.W if GPQ used).
kEncodingVexRvm_Lx, //!< VEX|EVEX [RVM] (propagates VEX|EVEX.L if YMM used).
+ kEncodingVexRvm_Lx_KEvex, //!< VEX|EVEX [RVM] (forces EVEX prefix if K register is used on destination).
+ kEncodingVexRvm_Lx_2xK, //!< VEX|EVEX [RVM] (vp2intersectd/vp2intersectq).
kEncodingVexRvmr, //!< VEX|EVEX [RVMR].
kEncodingVexRvmr_Lx, //!< VEX|EVEX [RVMR] (propagates VEX|EVEX.L if YMM used).
kEncodingVexRvmi, //!< VEX|EVEX [RVMI].
+ kEncodingVexRvmi_KEvex, //!< VEX|EVEX [RVMI] (forces EVEX prefix if K register is used on destination).
kEncodingVexRvmi_Lx, //!< VEX|EVEX [RVMI] (propagates VEX|EVEX.L if YMM used).
+ kEncodingVexRvmi_Lx_KEvex, //!< VEX|EVEX [RVMI] (forces EVEX prefix if K register is used on destination).
kEncodingVexRmv, //!< VEX|EVEX [RMV].
kEncodingVexRmv_Wx, //!< VEX|EVEX [RMV] (propagates VEX|EVEX.W if GPQ used).
kEncodingVexRmv_VM, //!< VEX|EVEX [RMV] (propagates VEX|EVEX.L, VSIB support).
@@ -174,12 +165,13 @@ enum EncodingId : uint32_t {
kEncodingVexRvmMvr_Lx, //!< VEX|EVEX [RVM|MVR] (propagates VEX|EVEX.L if YMM used).
kEncodingVexRvmVmi, //!< VEX|EVEX [RVM|VMI].
kEncodingVexRvmVmi_Lx, //!< VEX|EVEX [RVM|VMI] (propagates VEX|EVEX.L if YMM used).
+ kEncodingVexRvmVmi_Lx_MEvex, //!< VEX|EVEX [RVM|VMI] (propagates EVEX if the second operand is memory).
kEncodingVexVm, //!< VEX|EVEX [VM].
kEncodingVexVm_Wx, //!< VEX|EVEX [VM] (propagates VEX|EVEX.W if GPQ used).
kEncodingVexVmi, //!< VEX|EVEX [VMI].
kEncodingVexVmi_Lx, //!< VEX|EVEX [VMI] (propagates VEX|EVEX.L if YMM used).
kEncodingVexVmi4_Wx, //!< VEX|EVEX [VMI] (propagates VEX|EVEX.W if GPQ used, DWORD Immediate).
- kEncodingVexEvexVmi_Lx, //!< VEX|EVEX [VMI] (special, used by vpsrldq and vpslldq)
+ kEncodingVexVmi_Lx_MEvex, //!< VEX|EVEX [VMI] (force EVEX prefix when the second operand is memory)
kEncodingVexRvrmRvmr, //!< VEX|EVEX [RVRM|RVMR].
kEncodingVexRvrmRvmr_Lx, //!< VEX|EVEX [RVRM|RVMR] (propagates VEX|EVEX.L if YMM used).
kEncodingVexRvrmiRvmri_Lx, //!< VEX|EVEX [RVRMI|RVMRI] (propagates VEX|EVEX.L if YMM used).
@@ -187,15 +179,16 @@ enum EncodingId : uint32_t {
kEncodingVexMovssMovsd, //!< VEX|EVEX vmovss, vmovsd.
kEncodingFma4, //!< FMA4 [R, R, R/M, R/M].
kEncodingFma4_Lx, //!< FMA4 [R, R, R/M, R/M] (propagates AVX.L if YMM used).
+ kEncodingAmxCfg, //!< AMX ldtilecfg/sttilecfg.
+ kEncodingAmxR, //!< AMX [R] - tilezero.
+ kEncodingAmxRm, //!< AMX tileloadd/tileloaddt1.
+ kEncodingAmxMr, //!< AMX tilestored.
+ kEncodingAmxRmv, //!< AMX instructions that use TMM registers.
kEncodingCount //!< Count of instruction encodings.
};
-// ============================================================================
-// [asmjit::x86::InstDB - CommonInfoTableB]
-// ============================================================================
-
-//! CPU extensions required to execute instruction.
-struct CommonInfoTableB {
+//! Additional information table, provides CPU extensions required to execute an instruction and RW flags.
+struct AdditionalInfo {
//! Features vector.
uint8_t _features[6];
//! Index to `_rwFlagsTable`.
@@ -207,10 +200,6 @@ struct CommonInfoTableB {
inline const uint8_t* featuresEnd() const noexcept { return _features + ASMJIT_ARRAY_SIZE(_features); }
};
-// ============================================================================
-// [asmjit::x86::InstDB - InstNameIndex]
-// ============================================================================
-
// ${NameLimits:Begin}
// ------------------- Automatically generated, do not edit -------------------
enum : uint32_t { kMaxNameSize = 17 };
@@ -222,16 +211,14 @@ struct InstNameIndex {
uint16_t end;
};
-// ============================================================================
-// [asmjit::x86::InstDB - RWInfo]
-// ============================================================================
-
struct RWInfo {
enum Category : uint8_t {
kCategoryGeneric,
kCategoryMov,
+ kCategoryMovabs,
kCategoryImul,
kCategoryMovh64,
+ kCategoryPunpcklxx,
kCategoryVmaskmov,
kCategoryVmovddup,
kCategoryVmovmskpd,
@@ -253,8 +240,9 @@ struct RWInfoOp {
uint64_t rByteMask;
uint64_t wByteMask;
uint8_t physId;
- uint8_t reserved[3];
- uint32_t flags;
+ uint8_t consecutiveLeadCount;
+ uint8_t reserved[2];
+ OpRWFlags flags;
};
//! R/M information.
@@ -288,16 +276,14 @@ struct RWFlagsInfoTable {
uint32_t writeFlags;
};
-extern const uint8_t rwInfoIndex[Inst::_kIdCount * 2];
-extern const RWInfo rwInfo[];
+extern const uint8_t rwInfoIndexA[Inst::_kIdCount];
+extern const uint8_t rwInfoIndexB[Inst::_kIdCount];
+extern const RWInfo rwInfoA[];
+extern const RWInfo rwInfoB[];
extern const RWInfoOp rwInfoOp[];
extern const RWInfoRm rwInfoRm[];
extern const RWFlagsInfoTable _rwFlagsInfoTable[];
-// ============================================================================
-// [asmjit::x86::InstDB::Tables]
-// ============================================================================
-
extern const uint32_t _mainOpcodeTable[];
extern const uint32_t _altOpcodeTable[];
@@ -306,7 +292,7 @@ extern const char _nameData[];
extern const InstNameIndex instNameIndex[26];
#endif // !ASMJIT_NO_TEXT
-extern const CommonInfoTableB _commonInfoTableB[];
+extern const AdditionalInfo _additionalInfoTable[];
} // {InstDB}
diff --git a/3rdparty/asmjit/src/asmjit/x86/x86internal.cpp b/3rdparty/asmjit/src/asmjit/x86/x86internal.cpp
deleted file mode 100644
index 062525f5982..00000000000
--- a/3rdparty/asmjit/src/asmjit/x86/x86internal.cpp
+++ /dev/null
@@ -1,1733 +0,0 @@
-// AsmJit - Machine code generation for C++
-//
-// * Official AsmJit Home Page: https://asmjit.com
-// * Official Github Repository: https://github.com/asmjit/asmjit
-//
-// Copyright (c) 2008-2020 The AsmJit Authors
-//
-// This software is provided 'as-is', without any express or implied
-// warranty. In no event will the authors be held liable for any damages
-// arising from the use of this software.
-//
-// Permission is granted to anyone to use this software for any purpose,
-// including commercial applications, and to alter it and redistribute it
-// freely, subject to the following restrictions:
-//
-// 1. The origin of this software must not be misrepresented; you must not
-// claim that you wrote the original software. If you use this software
-// in a product, an acknowledgment in the product documentation would be
-// appreciated but is not required.
-// 2. Altered source versions must be plainly marked as such, and must not be
-// misrepresented as being the original software.
-// 3. This notice may not be removed or altered from any source distribution.
-
-#include "../core/api-build_p.h"
-#ifdef ASMJIT_BUILD_X86
-
-#include "../core/formatter.h"
-#include "../core/string.h"
-#include "../core/support.h"
-#include "../core/type.h"
-#include "../x86/x86internal_p.h"
-
-// Can be used for debugging...
-// #define ASMJIT_DUMP_ARGS_ASSIGNMENT
-
-ASMJIT_BEGIN_SUB_NAMESPACE(x86)
-
-// ============================================================================
-// [asmjit::X86Internal - Helpers]
-// ============================================================================
-
-static ASMJIT_INLINE uint32_t x86GetXmmMovInst(const FuncFrame& frame) {
- bool avx = frame.isAvxEnabled();
- bool aligned = frame.hasAlignedVecSR();
-
- return aligned ? (avx ? Inst::kIdVmovaps : Inst::kIdMovaps)
- : (avx ? Inst::kIdVmovups : Inst::kIdMovups);
-}
-
-static ASMJIT_INLINE uint32_t x86VecTypeIdToRegType(uint32_t typeId) noexcept {
- return typeId <= Type::_kIdVec128End ? Reg::kTypeXmm :
- typeId <= Type::_kIdVec256End ? Reg::kTypeYmm : Reg::kTypeZmm;
-}
-
-//! Converts `size` to a 'kmov?' instructio.
-static inline uint32_t x86KmovFromSize(uint32_t size) noexcept {
- switch (size) {
- case 1: return Inst::kIdKmovb;
- case 2: return Inst::kIdKmovw;
- case 4: return Inst::kIdKmovd;
- case 8: return Inst::kIdKmovq;
- default: return Inst::kIdNone;
- }
-}
-
-// ============================================================================
-// [asmjit::X86Internal - FuncDetail]
-// ============================================================================
-
-ASMJIT_FAVOR_SIZE Error X86Internal::initFuncDetail(FuncDetail& func, const FuncSignature& signature, uint32_t registerSize) noexcept {
- const CallConv& cc = func.callConv();
- uint32_t arch = cc.arch();
- uint32_t stackOffset = cc._spillZoneSize;
-
- uint32_t i;
- uint32_t argCount = func.argCount();
-
- if (func.retCount() != 0) {
- uint32_t typeId = func._rets[0].typeId();
- switch (typeId) {
- case Type::kIdI64:
- case Type::kIdU64: {
- if (Environment::is32Bit(arch)) {
- // Convert a 64-bit return value to two 32-bit return values.
- func._retCount = 2;
- typeId -= 2;
-
- // 64-bit value is returned in EDX:EAX on X86.
- func._rets[0].initReg(Reg::kTypeGpd, Gp::kIdAx, typeId);
- func._rets[1].initReg(Reg::kTypeGpd, Gp::kIdDx, typeId);
- break;
- }
- else {
- func._rets[0].initReg(Reg::kTypeGpq, Gp::kIdAx, typeId);
- }
- break;
- }
-
- case Type::kIdI8:
- case Type::kIdI16:
- case Type::kIdI32: {
- func._rets[0].initReg(Reg::kTypeGpd, Gp::kIdAx, Type::kIdI32);
- break;
- }
-
- case Type::kIdU8:
- case Type::kIdU16:
- case Type::kIdU32: {
- func._rets[0].initReg(Reg::kTypeGpd, Gp::kIdAx, Type::kIdU32);
- break;
- }
-
- case Type::kIdF32:
- case Type::kIdF64: {
- uint32_t regType = Environment::is32Bit(arch) ? Reg::kTypeSt : Reg::kTypeXmm;
- func._rets[0].initReg(regType, 0, typeId);
- break;
- }
-
- case Type::kIdF80: {
- // 80-bit floats are always returned by FP0.
- func._rets[0].initReg(Reg::kTypeSt, 0, typeId);
- break;
- }
-
- case Type::kIdMmx32:
- case Type::kIdMmx64: {
- // MM registers are returned through XMM (SystemV) or GPQ (Win64).
- uint32_t regType = Reg::kTypeMm;
- if (Environment::is64Bit(arch))
- regType = cc.strategy() == CallConv::kStrategyDefault ? Reg::kTypeXmm : Reg::kTypeGpq;
-
- func._rets[0].initReg(regType, 0, typeId);
- break;
- }
-
- default: {
- func._rets[0].initReg(x86VecTypeIdToRegType(typeId), 0, typeId);
- break;
- }
- }
- }
-
- switch (cc.strategy()) {
- case CallConv::kStrategyDefault: {
- uint32_t gpzPos = 0;
- uint32_t vecPos = 0;
-
- for (i = 0; i < argCount; i++) {
- FuncValue& arg = func._args[i];
- uint32_t typeId = arg.typeId();
-
- if (Type::isInt(typeId)) {
- uint32_t regId = BaseReg::kIdBad;
-
- if (gpzPos < CallConv::kMaxRegArgsPerGroup)
- regId = cc._passedOrder[Reg::kGroupGp].id[gpzPos];
-
- if (regId != BaseReg::kIdBad) {
- uint32_t regType = (typeId <= Type::kIdU32) ? Reg::kTypeGpd : Reg::kTypeGpq;
- arg.assignRegData(regType, regId);
- func.addUsedRegs(Reg::kGroupGp, Support::bitMask(regId));
- gpzPos++;
- }
- else {
- uint32_t size = Support::max<uint32_t>(Type::sizeOf(typeId), registerSize);
- arg.assignStackOffset(int32_t(stackOffset));
- stackOffset += size;
- }
- continue;
- }
-
- if (Type::isFloat(typeId) || Type::isVec(typeId)) {
- uint32_t regId = BaseReg::kIdBad;
-
- if (vecPos < CallConv::kMaxRegArgsPerGroup)
- regId = cc._passedOrder[Reg::kGroupVec].id[vecPos];
-
- if (Type::isFloat(typeId)) {
- // If this is a float, but `kFlagPassFloatsByVec` is false, we have
- // to use stack instead. This should be only used by 32-bit calling
- // conventions.
- if (!cc.hasFlag(CallConv::kFlagPassFloatsByVec))
- regId = BaseReg::kIdBad;
- }
- else {
- // Pass vector registers via stack if this is a variable arguments
- // function. This should be only used by 32-bit calling conventions.
- if (signature.hasVarArgs() && cc.hasFlag(CallConv::kFlagPassVecByStackIfVA))
- regId = BaseReg::kIdBad;
- }
-
- if (regId != BaseReg::kIdBad) {
- arg.initTypeId(typeId);
- arg.assignRegData(x86VecTypeIdToRegType(typeId), regId);
- func.addUsedRegs(Reg::kGroupVec, Support::bitMask(regId));
- vecPos++;
- }
- else {
- uint32_t size = Type::sizeOf(typeId);
- arg.assignStackOffset(int32_t(stackOffset));
- stackOffset += size;
- }
- continue;
- }
- }
- break;
- }
-
- case CallConv::kStrategyX64Windows:
- case CallConv::kStrategyX64VectorCall: {
- // Both X64 and VectorCall behave similarly - arguments are indexed
- // from left to right. The position of the argument determines in
- // which register the argument is allocated, so it's either GP or
- // one of XMM/YMM/ZMM registers.
- //
- // [ X64 ] [VecCall]
- // Index: #0 #1 #2 #3 #4 #5
- //
- // GP : RCX RDX R8 R9
- // VEC : XMM0 XMM1 XMM2 XMM3 XMM4 XMM5
- //
- // For example function `f(int a, double b, int c, double d)` will be:
- //
- // (a) (b) (c) (d)
- // RCX XMM1 R8 XMM3
- //
- // Unused vector registers are used by HVA.
-
- bool isVectorCall = (cc.strategy() == CallConv::kStrategyX64VectorCall);
-
- for (i = 0; i < argCount; i++) {
- FuncValue& arg = func._args[i];
-
- uint32_t typeId = arg.typeId();
- uint32_t size = Type::sizeOf(typeId);
-
- if (Type::isInt(typeId) || Type::isMmx(typeId)) {
- uint32_t regId = BaseReg::kIdBad;
-
- if (i < CallConv::kMaxRegArgsPerGroup)
- regId = cc._passedOrder[Reg::kGroupGp].id[i];
-
- if (regId != BaseReg::kIdBad) {
- uint32_t regType = (size <= 4 && !Type::isMmx(typeId)) ? Reg::kTypeGpd : Reg::kTypeGpq;
- arg.assignRegData(regType, regId);
- func.addUsedRegs(Reg::kGroupGp, Support::bitMask(regId));
- }
- else {
- arg.assignStackOffset(int32_t(stackOffset));
- stackOffset += 8;
- }
- continue;
- }
-
- if (Type::isFloat(typeId) || Type::isVec(typeId)) {
- uint32_t regId = BaseReg::kIdBad;
-
- if (i < CallConv::kMaxRegArgsPerGroup)
- regId = cc._passedOrder[Reg::kGroupVec].id[i];
-
- if (regId != BaseReg::kIdBad) {
- // X64-ABI doesn't allow vector types (XMM|YMM|ZMM) to be passed
- // via registers, however, VectorCall was designed for that purpose.
- if (Type::isFloat(typeId) || isVectorCall) {
- uint32_t regType = x86VecTypeIdToRegType(typeId);
- arg.assignRegData(regType, regId);
- func.addUsedRegs(Reg::kGroupVec, Support::bitMask(regId));
- continue;
- }
- }
-
- // Passed via stack if the argument is float/double or indirectly.
- // The trap is - if the argument is passed indirectly, the address
- // can be passed via register, if the argument's index has GP one.
- if (Type::isFloat(typeId)) {
- arg.assignStackOffset(int32_t(stackOffset));
- }
- else {
- uint32_t gpRegId = cc._passedOrder[Reg::kGroupGp].id[i];
- if (gpRegId != BaseReg::kIdBad)
- arg.assignRegData(Reg::kTypeGpq, gpRegId);
- else
- arg.assignStackOffset(int32_t(stackOffset));
- arg.addFlags(FuncValue::kFlagIsIndirect);
- }
-
- // Always 8 bytes (float/double/pointer).
- stackOffset += 8;
- continue;
- }
- }
- break;
- }
- }
-
- func._argStackSize = stackOffset;
- return kErrorOk;
-}
-
-// ============================================================================
-// [asmjit::X86FuncArgsContext]
-// ============================================================================
-
-static RegInfo x86GetRegForMemToMemMove(uint32_t arch, uint32_t dstTypeId, uint32_t srcTypeId) noexcept {
- uint32_t dstSize = Type::sizeOf(dstTypeId);
- uint32_t srcSize = Type::sizeOf(srcTypeId);
- uint32_t maxSize = Support::max<uint32_t>(dstSize, srcSize);
- uint32_t regSize = Environment::registerSizeFromArch(arch);
-
- uint32_t signature = 0;
- if (maxSize <= regSize || (Type::isInt(dstTypeId) && Type::isInt(srcTypeId)))
- signature = maxSize <= 4 ? Gpd::kSignature : Gpq::kSignature;
- else if (maxSize <= 16)
- signature = Xmm::kSignature;
- else if (maxSize <= 32)
- signature = Ymm::kSignature;
- else if (maxSize <= 64)
- signature = Zmm::kSignature;
-
- return RegInfo { signature };
-}
-
-// Used by both `argsToFuncFrame()` and `emitArgsAssignment()`.
-class X86FuncArgsContext {
-public:
- enum VarId : uint32_t {
- kVarIdNone = 0xFF
- };
-
- //! Contains information about a single argument or SA register that may need shuffling.
- struct Var {
- inline void init(const FuncValue& cur_, const FuncValue& out_) noexcept {
- cur = cur_;
- out = out_;
- }
-
- //! Reset the value to its unassigned state.
- inline void reset() noexcept {
- cur.reset();
- out.reset();
- }
-
- inline bool isDone() const noexcept { return cur.isDone(); }
- inline void markDone() noexcept { cur.addFlags(FuncValue::kFlagIsDone); }
-
- FuncValue cur;
- FuncValue out;
- };
-
- struct WorkData {
- inline void reset() noexcept {
- _archRegs = 0;
- _workRegs = 0;
- _usedRegs = 0;
- _assignedRegs = 0;
- _dstRegs = 0;
- _dstShuf = 0;
- _numSwaps = 0;
- _numStackArgs = 0;
- memset(_reserved, 0, sizeof(_reserved));
- memset(_physToVarId, kVarIdNone, 32);
- }
-
- inline bool isAssigned(uint32_t regId) const noexcept {
- ASMJIT_ASSERT(regId < 32);
- return Support::bitTest(_assignedRegs, regId);
- }
-
- inline void assign(uint32_t varId, uint32_t regId) noexcept {
- ASMJIT_ASSERT(!isAssigned(regId));
- ASMJIT_ASSERT(_physToVarId[regId] == kVarIdNone);
-
- _physToVarId[regId] = uint8_t(varId);
- _assignedRegs ^= Support::bitMask(regId);
- }
-
- inline void reassign(uint32_t varId, uint32_t newId, uint32_t oldId) noexcept {
- ASMJIT_ASSERT( isAssigned(oldId));
- ASMJIT_ASSERT(!isAssigned(newId));
- ASMJIT_ASSERT(_physToVarId[oldId] == varId);
- ASMJIT_ASSERT(_physToVarId[newId] == kVarIdNone);
-
- _physToVarId[oldId] = uint8_t(kVarIdNone);
- _physToVarId[newId] = uint8_t(varId);
- _assignedRegs ^= Support::bitMask(newId) ^ Support::bitMask(oldId);
- }
-
- inline void swap(uint32_t aVarId, uint32_t aRegId, uint32_t bVarId, uint32_t bRegId) noexcept {
- ASMJIT_ASSERT(isAssigned(aRegId));
- ASMJIT_ASSERT(isAssigned(bRegId));
- ASMJIT_ASSERT(_physToVarId[aRegId] == aVarId);
- ASMJIT_ASSERT(_physToVarId[bRegId] == bVarId);
-
- _physToVarId[aRegId] = uint8_t(bVarId);
- _physToVarId[bRegId] = uint8_t(aVarId);
- }
-
- inline void unassign(uint32_t varId, uint32_t regId) noexcept {
- ASMJIT_ASSERT(isAssigned(regId));
- ASMJIT_ASSERT(_physToVarId[regId] == varId);
-
- DebugUtils::unused(varId);
- _physToVarId[regId] = uint8_t(kVarIdNone);
- _assignedRegs ^= Support::bitMask(regId);
- }
-
- inline uint32_t archRegs() const noexcept { return _archRegs; }
- inline uint32_t workRegs() const noexcept { return _workRegs; }
- inline uint32_t usedRegs() const noexcept { return _usedRegs; }
- inline uint32_t assignedRegs() const noexcept { return _assignedRegs; }
- inline uint32_t dstRegs() const noexcept { return _dstRegs; }
- inline uint32_t availableRegs() const noexcept { return _workRegs & ~_assignedRegs; }
-
- uint32_t _archRegs; //!< All allocable registers provided by the architecture.
- uint32_t _workRegs; //!< All registers that can be used by the shuffler.
- uint32_t _usedRegs; //!< Registers used by the shuffler (all).
- uint32_t _assignedRegs; //!< Assigned registers.
- uint32_t _dstRegs; //!< Destination registers assigned to arguments or SA.
- uint32_t _dstShuf; //!< Destination registers that require shuffling.
- uint8_t _numSwaps; //!< Number of register swaps.
- uint8_t _numStackArgs; //!< Number of stack loads.
- uint8_t _reserved[6]; //!< Reserved (only used as padding).
- uint8_t _physToVarId[32]; //!< Physical ID to variable ID mapping.
- };
-
- uint8_t _arch;
- bool _hasStackSrc; //!< Has arguments passed via stack (SRC).
- bool _hasPreservedFP; //!< Has preserved frame-pointer (FP).
- uint8_t _stackDstMask; //!< Has arguments assigned to stack (DST).
- uint8_t _regSwapsMask; //!< Register swap groups (bit-mask).
- uint8_t _saVarId;
- uint32_t _varCount;
- WorkData _workData[BaseReg::kGroupVirt];
- Var _vars[kFuncArgCountLoHi + 1];
-
- X86FuncArgsContext() noexcept;
-
- inline uint32_t arch() const noexcept { return _arch; }
- inline uint32_t varCount() const noexcept { return _varCount; }
-
- inline Var& var(size_t varId) noexcept { return _vars[varId]; }
- inline const Var& var(size_t varId) const noexcept { return _vars[varId]; }
- inline size_t indexOf(const Var* var) const noexcept { return (size_t)(var - _vars); }
-
- Error initWorkData(const FuncFrame& frame, const FuncArgsAssignment& args) noexcept;
- Error markScratchRegs(FuncFrame& frame) noexcept;
- Error markDstRegsDirty(FuncFrame& frame) noexcept;
- Error markStackArgsReg(FuncFrame& frame) noexcept;
-};
-
-X86FuncArgsContext::X86FuncArgsContext() noexcept {
- _arch = Environment::kArchUnknown;
- _varCount = 0;
- _hasStackSrc = false;
- _hasPreservedFP = false;
- _stackDstMask = 0;
- _regSwapsMask = 0;
- _saVarId = kVarIdNone;
-
- for (uint32_t group = 0; group < BaseReg::kGroupVirt; group++)
- _workData[group].reset();
-}
-
-ASMJIT_FAVOR_SIZE Error X86FuncArgsContext::initWorkData(const FuncFrame& frame, const FuncArgsAssignment& args) noexcept {
- // The code has to be updated if this changes.
- ASMJIT_ASSERT(BaseReg::kGroupVirt == 4);
-
- uint32_t i;
- const FuncDetail& func = *args.funcDetail();
-
- // Initialize Architecture.
- uint32_t arch = func.callConv().arch();
- uint32_t archRegCount = Environment::is32Bit(arch) ? 8 : 16;
-
- _arch = uint8_t(arch);
-
- // Initialize `_archRegs`.
- _workData[Reg::kGroupGp ]._archRegs = Support::lsbMask<uint32_t>(archRegCount) & ~Support::bitMask(Gp::kIdSp);
- _workData[Reg::kGroupVec ]._archRegs = Support::lsbMask<uint32_t>(archRegCount);
- _workData[Reg::kGroupMm ]._archRegs = Support::lsbMask<uint32_t>(8);
- _workData[Reg::kGroupKReg]._archRegs = Support::lsbMask<uint32_t>(8);
-
- if (frame.hasPreservedFP())
- _workData[Reg::kGroupGp]._archRegs &= ~Support::bitMask(Gp::kIdBp);
-
- // Extract information from all function arguments/assignments and build Var[] array.
- uint32_t varId = 0;
- for (i = 0; i < kFuncArgCountLoHi; i++) {
- const FuncValue& dst_ = args.arg(i);
- if (!dst_.isAssigned())
- continue;
-
- const FuncValue& src_ = func.arg(i);
- if (ASMJIT_UNLIKELY(!src_.isAssigned()))
- return DebugUtils::errored(kErrorInvalidState);
-
- Var& var = _vars[varId];
- var.init(src_, dst_);
-
- FuncValue& src = var.cur;
- FuncValue& dst = var.out;
-
- uint32_t dstGroup = 0xFFFFFFFFu;
- uint32_t dstId = BaseReg::kIdBad;
- WorkData* dstWd = nullptr;
-
- // Not supported.
- if (src.isIndirect())
- return DebugUtils::errored(kErrorInvalidAssignment);
-
- if (dst.isReg()) {
- uint32_t dstType = dst.regType();
- if (ASMJIT_UNLIKELY(dstType >= Reg::kTypeCount))
- return DebugUtils::errored(kErrorInvalidRegType);
-
- // Copy TypeId from source if the destination doesn't have it. The RA
- // used by BaseCompiler would never leave TypeId undefined, but users
- // of FuncAPI can just assign phys regs without specifying the type.
- if (!dst.hasTypeId())
- dst.setTypeId(Reg::typeIdOf(dst.regType()));
-
- dstGroup = Reg::groupOf(dstType);
- if (ASMJIT_UNLIKELY(dstGroup >= BaseReg::kGroupVirt))
- return DebugUtils::errored(kErrorInvalidRegGroup);
-
- dstWd = &_workData[dstGroup];
- dstId = dst.regId();
- if (ASMJIT_UNLIKELY(dstId >= 32 || !Support::bitTest(dstWd->archRegs(), dstId)))
- return DebugUtils::errored(kErrorInvalidPhysId);
-
- if (ASMJIT_UNLIKELY(Support::bitTest(dstWd->dstRegs(), dstId)))
- return DebugUtils::errored(kErrorOverlappedRegs);
-
- dstWd->_dstRegs |= Support::bitMask(dstId);
- dstWd->_dstShuf |= Support::bitMask(dstId);
- dstWd->_usedRegs |= Support::bitMask(dstId);
- }
- else {
- if (!dst.hasTypeId())
- dst.setTypeId(src.typeId());
-
- RegInfo regInfo = x86GetRegForMemToMemMove(arch, dst.typeId(), src.typeId());
- if (ASMJIT_UNLIKELY(!regInfo.isValid()))
- return DebugUtils::errored(kErrorInvalidState);
- _stackDstMask = uint8_t(_stackDstMask | Support::bitMask(regInfo.group()));
- }
-
- if (src.isReg()) {
- uint32_t srcId = src.regId();
- uint32_t srcGroup = Reg::groupOf(src.regType());
-
- if (dstGroup == srcGroup) {
- dstWd->assign(varId, srcId);
-
- // The best case, register is allocated where it is expected to be.
- if (dstId == srcId)
- var.markDone();
- }
- else {
- if (ASMJIT_UNLIKELY(srcGroup >= BaseReg::kGroupVirt))
- return DebugUtils::errored(kErrorInvalidState);
-
- WorkData& srcData = _workData[srcGroup];
- srcData.assign(varId, srcId);
- }
- }
- else {
- if (dstWd)
- dstWd->_numStackArgs++;
- _hasStackSrc = true;
- }
-
- varId++;
- }
-
- // Initialize WorkData::workRegs.
- for (i = 0; i < BaseReg::kGroupVirt; i++)
- _workData[i]._workRegs = (_workData[i].archRegs() & (frame.dirtyRegs(i) | ~frame.preservedRegs(i))) | _workData[i].dstRegs() | _workData[i].assignedRegs();
-
- // Create a variable that represents `SARegId` if necessary.
- bool saRegRequired = _hasStackSrc && frame.hasDynamicAlignment() && !frame.hasPreservedFP();
-
- WorkData& gpRegs = _workData[BaseReg::kGroupGp];
- uint32_t saCurRegId = frame.saRegId();
- uint32_t saOutRegId = args.saRegId();
-
- if (saCurRegId != BaseReg::kIdBad) {
- // Check if the provided `SARegId` doesn't collide with input registers.
- if (ASMJIT_UNLIKELY(gpRegs.isAssigned(saCurRegId)))
- return DebugUtils::errored(kErrorOverlappedRegs);
- }
-
- if (saOutRegId != BaseReg::kIdBad) {
- // Check if the provided `SARegId` doesn't collide with argument assignments.
- if (ASMJIT_UNLIKELY(Support::bitTest(gpRegs.dstRegs(), saOutRegId)))
- return DebugUtils::errored(kErrorOverlappedRegs);
- saRegRequired = true;
- }
-
- if (saRegRequired) {
- uint32_t ptrTypeId = Environment::is32Bit(arch) ? Type::kIdU32 : Type::kIdU64;
- uint32_t ptrRegType = Environment::is32Bit(arch) ? BaseReg::kTypeGp32 : BaseReg::kTypeGp64;
-
- _saVarId = uint8_t(varId);
- _hasPreservedFP = frame.hasPreservedFP();
-
- Var& var = _vars[varId];
- var.reset();
-
- if (saCurRegId == BaseReg::kIdBad) {
- if (saOutRegId != BaseReg::kIdBad && !gpRegs.isAssigned(saOutRegId)) {
- saCurRegId = saOutRegId;
- }
- else {
- uint32_t availableRegs = gpRegs.availableRegs();
- if (!availableRegs)
- availableRegs = gpRegs.archRegs() & ~gpRegs.workRegs();
-
- if (ASMJIT_UNLIKELY(!availableRegs))
- return DebugUtils::errored(kErrorNoMorePhysRegs);
-
- saCurRegId = Support::ctz(availableRegs);
- }
- }
-
- var.cur.initReg(ptrRegType, saCurRegId, ptrTypeId);
- gpRegs.assign(varId, saCurRegId);
- gpRegs._workRegs |= Support::bitMask(saCurRegId);
-
- if (saOutRegId != BaseReg::kIdBad) {
- var.out.initReg(ptrRegType, saOutRegId, ptrTypeId);
- gpRegs._dstRegs |= Support::bitMask(saOutRegId);
- gpRegs._workRegs |= Support::bitMask(saOutRegId);
- }
- else {
- var.markDone();
- }
-
- varId++;
- }
-
- _varCount = varId;
-
- // Detect register swaps.
- for (varId = 0; varId < _varCount; varId++) {
- Var& var = _vars[varId];
- if (var.cur.isReg() && var.out.isReg()) {
- uint32_t srcId = var.cur.regId();
- uint32_t dstId = var.out.regId();
-
- uint32_t group = Reg::groupOf(var.cur.regType());
- if (group != Reg::groupOf(var.out.regType()))
- continue;
-
- WorkData& wd = _workData[group];
- if (wd.isAssigned(dstId)) {
- Var& other = _vars[wd._physToVarId[dstId]];
- if (Reg::groupOf(other.out.regType()) == group && other.out.regId() == srcId) {
- wd._numSwaps++;
- _regSwapsMask = uint8_t(_regSwapsMask | Support::bitMask(group));
- }
- }
- }
- }
-
- return kErrorOk;
-}
-
-ASMJIT_FAVOR_SIZE Error X86FuncArgsContext::markDstRegsDirty(FuncFrame& frame) noexcept {
- for (uint32_t i = 0; i < BaseReg::kGroupVirt; i++) {
- WorkData& wd = _workData[i];
- uint32_t regs = wd.usedRegs() | wd._dstShuf;
-
- wd._workRegs |= regs;
- frame.addDirtyRegs(i, regs);
- }
-
- return kErrorOk;
-}
-
-ASMJIT_FAVOR_SIZE Error X86FuncArgsContext::markScratchRegs(FuncFrame& frame) noexcept {
- uint32_t groupMask = 0;
-
- // Handle stack to stack moves.
- groupMask |= _stackDstMask;
-
- // Handle register swaps.
- groupMask |= _regSwapsMask & ~Support::bitMask(BaseReg::kGroupGp);
-
- if (!groupMask)
- return kErrorOk;
-
- // Selects one dirty register per affected group that can be used as a scratch register.
- for (uint32_t group = 0; group < BaseReg::kGroupVirt; group++) {
- if (Support::bitTest(groupMask, group)) {
- WorkData& wd = _workData[group];
-
- // Initially, pick some clobbered or dirty register.
- uint32_t workRegs = wd.workRegs();
- uint32_t regs = workRegs & ~(wd.usedRegs() | wd._dstShuf);
-
- // If that didn't work out pick some register which is not in 'used'.
- if (!regs)
- regs = workRegs & ~wd.usedRegs();
-
- // If that didn't work out pick any other register that is allocable.
- // This last resort case will, however, result in marking one more
- // register dirty.
- if (!regs)
- regs = wd.archRegs() & ~workRegs;
-
- // If that didn't work out we will have to use XORs instead of MOVs.
- if (!regs)
- continue;
-
- uint32_t regMask = Support::blsi(regs);
- wd._workRegs |= regMask;
- frame.addDirtyRegs(group, regMask);
- }
- }
-
- return kErrorOk;
-}
-
-ASMJIT_FAVOR_SIZE Error X86FuncArgsContext::markStackArgsReg(FuncFrame& frame) noexcept {
- if (_saVarId != kVarIdNone) {
- const Var& var = _vars[_saVarId];
- frame.setSARegId(var.cur.regId());
- }
- else if (frame.hasPreservedFP()) {
- // Always EBP|RBP if the frame-pointer isn't omitted.
- frame.setSARegId(Gp::kIdBp);
- }
-
- return kErrorOk;
-}
-
-// ============================================================================
-// [asmjit::X86Internal - FrameLayout]
-// ============================================================================
-
-ASMJIT_FAVOR_SIZE Error X86Internal::initFuncFrame(FuncFrame& frame, const FuncDetail& func) noexcept {
- uint32_t arch = func.callConv().arch();
-
- // Initializing FuncFrame means making a copy of some properties of `func`.
- // Properties like `_localStackSize` will be set by the user before the frame
- // is finalized.
- frame.reset();
-
- frame._arch = uint8_t(arch);
- frame._spRegId = Gp::kIdSp;
- frame._saRegId = Gp::kIdBad;
-
- uint32_t naturalStackAlignment = func.callConv().naturalStackAlignment();
- uint32_t minDynamicAlignment = Support::max<uint32_t>(naturalStackAlignment, 16);
-
- if (minDynamicAlignment == naturalStackAlignment)
- minDynamicAlignment <<= 1;
-
- frame._naturalStackAlignment = uint8_t(naturalStackAlignment);
- frame._minDynamicAlignment = uint8_t(minDynamicAlignment);
- frame._redZoneSize = uint8_t(func.redZoneSize());
- frame._spillZoneSize = uint8_t(func.spillZoneSize());
- frame._finalStackAlignment = uint8_t(frame._naturalStackAlignment);
-
- if (func.hasFlag(CallConv::kFlagCalleePopsStack)) {
- frame._calleeStackCleanup = uint16_t(func.argStackSize());
- }
-
- // Initial masks of dirty and preserved registers.
- for (uint32_t group = 0; group < BaseReg::kGroupVirt; group++) {
- frame._dirtyRegs[group] = func.usedRegs(group);
- frame._preservedRegs[group] = func.preservedRegs(group);
- }
-
- // Exclude ESP/RSP - this register is never included in saved GP regs.
- frame._preservedRegs[BaseReg::kGroupGp] &= ~Support::bitMask(Gp::kIdSp);
-
- return kErrorOk;
-}
-
-ASMJIT_FAVOR_SIZE Error X86Internal::finalizeFuncFrame(FuncFrame& frame) noexcept {
- uint32_t registerSize = Environment::registerSizeFromArch(frame.arch());
-
- // The final stack alignment must be updated accordingly to call and local stack alignments.
- uint32_t stackAlignment = frame._finalStackAlignment;
- ASMJIT_ASSERT(stackAlignment == Support::max(frame._naturalStackAlignment,
- frame._callStackAlignment,
- frame._localStackAlignment));
-
- // TODO: Must be configurable.
- uint32_t vecSize = 16;
-
- bool hasFP = frame.hasPreservedFP();
- bool hasDA = frame.hasDynamicAlignment();
-
- // Include EBP|RBP if the function preserves the frame-pointer.
- if (hasFP)
- frame._dirtyRegs[Reg::kGroupGp] |= Support::bitMask(Gp::kIdBp);
-
- // These two are identical if the function doesn't align its stack dynamically.
- uint32_t saRegId = frame.saRegId();
- if (saRegId == BaseReg::kIdBad)
- saRegId = Gp::kIdSp;
-
- // Fix stack arguments base-register from ESP|RSP to EBP|RBP in case it was
- // not picked before and the function performs dynamic stack alignment.
- if (hasDA && saRegId == Gp::kIdSp)
- saRegId = Gp::kIdBp;
-
- // Mark as dirty any register but ESP|RSP if used as SA pointer.
- if (saRegId != Gp::kIdSp)
- frame._dirtyRegs[Reg::kGroupGp] |= Support::bitMask(saRegId);
-
- frame._spRegId = uint8_t(Gp::kIdSp);
- frame._saRegId = uint8_t(saRegId);
-
- // Setup stack size used to save preserved registers.
- frame._gpSaveSize = uint16_t(Support::popcnt(frame.savedRegs(Reg::kGroupGp )) * registerSize);
- frame._nonGpSaveSize = uint16_t(Support::popcnt(frame.savedRegs(Reg::kGroupVec )) * vecSize +
- Support::popcnt(frame.savedRegs(Reg::kGroupMm )) * 8 +
- Support::popcnt(frame.savedRegs(Reg::kGroupKReg)) * 8);
-
- uint32_t v = 0; // The beginning of the stack frame relative to SP after prolog.
- v += frame.callStackSize(); // Count 'callStackSize' <- This is used to call functions.
- v = Support::alignUp(v, stackAlignment); // Align to function's stack alignment.
-
- frame._localStackOffset = v; // Store 'localStackOffset' <- Function's local stack starts here.
- v += frame.localStackSize(); // Count 'localStackSize' <- Function's local stack ends here.
-
- // If the function's stack must be aligned, calculate the alignment necessary
- // to store vector registers, and set `FuncFrame::kAttrAlignedVecSR` to inform
- // PEI that it can use instructions that perform aligned stores/loads.
- if (stackAlignment >= vecSize && frame._nonGpSaveSize) {
- frame.addAttributes(FuncFrame::kAttrAlignedVecSR);
- v = Support::alignUp(v, vecSize); // Align '_nonGpSaveOffset'.
- }
-
- frame._nonGpSaveOffset = v; // Store '_nonGpSaveOffset' <- Non-GP Save/Restore starts here.
- v += frame._nonGpSaveSize; // Count '_nonGpSaveSize' <- Non-GP Save/Restore ends here.
-
- // Calculate if dynamic alignment (DA) slot (stored as offset relative to SP) is required and its offset.
- if (hasDA && !hasFP) {
- frame._daOffset = v; // Store 'daOffset' <- DA pointer would be stored here.
- v += registerSize; // Count 'daOffset'.
- }
- else {
- frame._daOffset = FuncFrame::kTagInvalidOffset;
- }
-
- // The return address should be stored after GP save/restore regs. It has
- // the same size as `registerSize` (basically the native register/pointer
- // size). We don't adjust it now as `v` now contains the exact size that the
- // function requires to adjust (call frame + stack frame, vec stack size).
- // The stack (if we consider this size) is misaligned now, as it's always
- // aligned before the function call - when `call()` is executed it pushes
- // the current EIP|RIP onto the stack, and misaligns it by 12 or 8 bytes
- // (depending on the architecture). So count number of bytes needed to align
- // it up to the function's CallFrame (the beginning).
- if (v || frame.hasFuncCalls())
- v += Support::alignUpDiff(v + frame.gpSaveSize() + registerSize, stackAlignment);
-
- frame._gpSaveOffset = v; // Store 'gpSaveOffset' <- Function's GP Save/Restore starts here.
- frame._stackAdjustment = v; // Store 'stackAdjustment' <- SA used by 'add zsp, SA' and 'sub zsp, SA'.
-
- v += frame._gpSaveSize; // Count 'gpSaveSize' <- Function's GP Save/Restore ends here.
- v += registerSize; // Count 'ReturnAddress' <- As CALL pushes onto stack.
-
- // If the function performs dynamic stack alignment then the stack-adjustment must be aligned.
- if (hasDA)
- frame._stackAdjustment = Support::alignUp(frame._stackAdjustment, stackAlignment);
-
- uint32_t saInvOff = FuncFrame::kTagInvalidOffset;
- uint32_t saTmpOff = registerSize + frame._gpSaveSize;
-
- // Calculate where the function arguments start relative to SP.
- frame._saOffsetFromSP = hasDA ? saInvOff : v;
-
- // Calculate where the function arguments start relative to FP or user-provided register.
- frame._saOffsetFromSA = hasFP ? registerSize * 2 // Return address + frame pointer.
- : saTmpOff; // Return address + all saved GP regs.
-
- return kErrorOk;
-}
-
-// ============================================================================
-// [asmjit::X86Internal - ArgsToFrameInfo]
-// ============================================================================
-
-ASMJIT_FAVOR_SIZE Error X86Internal::argsToFuncFrame(const FuncArgsAssignment& args, FuncFrame& frame) noexcept {
- X86FuncArgsContext ctx;
- ASMJIT_PROPAGATE(ctx.initWorkData(frame, args));
- ASMJIT_PROPAGATE(ctx.markDstRegsDirty(frame));
- ASMJIT_PROPAGATE(ctx.markScratchRegs(frame));
- ASMJIT_PROPAGATE(ctx.markStackArgsReg(frame));
- return kErrorOk;
-}
-
-// ============================================================================
-// [asmjit::X86Internal - Emit Helpers]
-// ============================================================================
-
-ASMJIT_FAVOR_SIZE Error X86Internal::emitRegMove(Emitter* emitter,
- const Operand_& dst_,
- const Operand_& src_, uint32_t typeId, bool avxEnabled, const char* comment) {
-
- // Invalid or abstract TypeIds are not allowed.
- ASMJIT_ASSERT(Type::isValid(typeId) && !Type::isAbstract(typeId));
-
- Operand dst(dst_);
- Operand src(src_);
-
- uint32_t instId = Inst::kIdNone;
- uint32_t memFlags = 0;
- uint32_t overrideMemSize = 0;
-
- enum MemFlags : uint32_t {
- kDstMem = 0x1,
- kSrcMem = 0x2
- };
-
- // Detect memory operands and patch them to have the same size as the register.
- // BaseCompiler always sets memory size of allocs and spills, so it shouldn't
- // be really necessary, however, after this function was separated from Compiler
- // it's better to make sure that the size is always specified, as we can use
- // 'movzx' and 'movsx' that rely on it.
- if (dst.isMem()) { memFlags |= kDstMem; dst.as<Mem>().setSize(src.size()); }
- if (src.isMem()) { memFlags |= kSrcMem; src.as<Mem>().setSize(dst.size()); }
-
- switch (typeId) {
- case Type::kIdI8:
- case Type::kIdU8:
- case Type::kIdI16:
- case Type::kIdU16:
- // Special case - 'movzx' load.
- if (memFlags & kSrcMem) {
- instId = Inst::kIdMovzx;
- dst.setSignature(Reg::signatureOfT<Reg::kTypeGpd>());
- }
- else if (!memFlags) {
- // Change both destination and source registers to GPD (safer, no dependencies).
- dst.setSignature(Reg::signatureOfT<Reg::kTypeGpd>());
- src.setSignature(Reg::signatureOfT<Reg::kTypeGpd>());
- }
- ASMJIT_FALLTHROUGH;
-
- case Type::kIdI32:
- case Type::kIdU32:
- case Type::kIdI64:
- case Type::kIdU64:
- instId = Inst::kIdMov;
- break;
-
- case Type::kIdMmx32:
- instId = Inst::kIdMovd;
- if (memFlags) break;
- ASMJIT_FALLTHROUGH;
-
- case Type::kIdMmx64 : instId = Inst::kIdMovq ; break;
- case Type::kIdMask8 : instId = Inst::kIdKmovb; break;
- case Type::kIdMask16: instId = Inst::kIdKmovw; break;
- case Type::kIdMask32: instId = Inst::kIdKmovd; break;
- case Type::kIdMask64: instId = Inst::kIdKmovq; break;
-
- default: {
- uint32_t elementTypeId = Type::baseOf(typeId);
- if (Type::isVec32(typeId) && memFlags) {
- overrideMemSize = 4;
- if (elementTypeId == Type::kIdF32)
- instId = avxEnabled ? Inst::kIdVmovss : Inst::kIdMovss;
- else
- instId = avxEnabled ? Inst::kIdVmovd : Inst::kIdMovd;
- break;
- }
-
- if (Type::isVec64(typeId) && memFlags) {
- overrideMemSize = 8;
- if (elementTypeId == Type::kIdF64)
- instId = avxEnabled ? Inst::kIdVmovsd : Inst::kIdMovsd;
- else
- instId = avxEnabled ? Inst::kIdVmovq : Inst::kIdMovq;
- break;
- }
-
- if (elementTypeId == Type::kIdF32)
- instId = avxEnabled ? Inst::kIdVmovaps : Inst::kIdMovaps;
- else if (elementTypeId == Type::kIdF64)
- instId = avxEnabled ? Inst::kIdVmovapd : Inst::kIdMovapd;
- else if (typeId <= Type::_kIdVec256End)
- instId = avxEnabled ? Inst::kIdVmovdqa : Inst::kIdMovdqa;
- else if (elementTypeId <= Type::kIdU32)
- instId = Inst::kIdVmovdqa32;
- else
- instId = Inst::kIdVmovdqa64;
- break;
- }
- }
-
- if (!instId)
- return DebugUtils::errored(kErrorInvalidState);
-
- if (overrideMemSize) {
- if (dst.isMem()) dst.as<Mem>().setSize(overrideMemSize);
- if (src.isMem()) src.as<Mem>().setSize(overrideMemSize);
- }
-
- emitter->setInlineComment(comment);
- return emitter->emit(instId, dst, src);
-}
-
-ASMJIT_FAVOR_SIZE Error X86Internal::emitArgMove(Emitter* emitter,
- const Reg& dst_, uint32_t dstTypeId,
- const Operand_& src_, uint32_t srcTypeId, bool avxEnabled, const char* comment) {
-
- // Deduce optional `dstTypeId`, which may be `Type::kIdVoid` in some cases.
- if (!dstTypeId)
- dstTypeId = opData.archRegs.regTypeToTypeId[dst_.type()];
-
- // Invalid or abstract TypeIds are not allowed.
- ASMJIT_ASSERT(Type::isValid(dstTypeId) && !Type::isAbstract(dstTypeId));
- ASMJIT_ASSERT(Type::isValid(srcTypeId) && !Type::isAbstract(srcTypeId));
-
- Reg dst(dst_);
- Operand src(src_);
-
- uint32_t dstSize = Type::sizeOf(dstTypeId);
- uint32_t srcSize = Type::sizeOf(srcTypeId);
-
- uint32_t instId = Inst::kIdNone;
-
- // Not a real loop, just 'break' is nicer than 'goto'.
- for (;;) {
- if (Type::isInt(dstTypeId)) {
- if (Type::isInt(srcTypeId)) {
- instId = Inst::kIdMovsx;
- uint32_t typeOp = (dstTypeId << 8) | srcTypeId;
-
- // Sign extend by using 'movsx'.
- if (typeOp == ((Type::kIdI16 << 8) | Type::kIdI8 ) ||
- typeOp == ((Type::kIdI32 << 8) | Type::kIdI8 ) ||
- typeOp == ((Type::kIdI32 << 8) | Type::kIdI16) ||
- typeOp == ((Type::kIdI64 << 8) | Type::kIdI8 ) ||
- typeOp == ((Type::kIdI64 << 8) | Type::kIdI16))
- break;
-
- // Sign extend by using 'movsxd'.
- instId = Inst::kIdMovsxd;
- if (typeOp == ((Type::kIdI64 << 8) | Type::kIdI32))
- break;
- }
-
- if (Type::isInt(srcTypeId) || src_.isMem()) {
- // Zero extend by using 'movzx' or 'mov'.
- if (dstSize <= 4 && srcSize < 4) {
- instId = Inst::kIdMovzx;
- dst.setSignature(Reg::signatureOfT<Reg::kTypeGpd>());
- }
- else {
- // We should have caught all possibilities where `srcSize` is less
- // than 4, so we don't have to worry about 'movzx' anymore. Minimum
- // size is enough to determine if we want 32-bit or 64-bit move.
- instId = Inst::kIdMov;
- srcSize = Support::min(srcSize, dstSize);
-
- dst.setSignature(srcSize == 4 ? Reg::signatureOfT<Reg::kTypeGpd>()
- : Reg::signatureOfT<Reg::kTypeGpq>());
- if (src.isReg())
- src.setSignature(dst.signature());
- }
- break;
- }
-
- // NOTE: The previous branch caught all memory sources, from here it's
- // always register to register conversion, so catch the remaining cases.
- srcSize = Support::min(srcSize, dstSize);
-
- if (Type::isMmx(srcTypeId)) {
- // 64-bit move.
- instId = Inst::kIdMovq;
- if (srcSize == 8)
- break;
-
- // 32-bit move.
- instId = Inst::kIdMovd;
- dst.setSignature(Reg::signatureOfT<Reg::kTypeGpd>());
- break;
- }
-
- if (Type::isMask(srcTypeId)) {
- instId = x86KmovFromSize(srcSize);
- dst.setSignature(srcSize <= 4 ? Reg::signatureOfT<Reg::kTypeGpd>()
- : Reg::signatureOfT<Reg::kTypeGpq>());
- break;
- }
-
- if (Type::isVec(srcTypeId)) {
- // 64-bit move.
- instId = avxEnabled ? Inst::kIdVmovq : Inst::kIdMovq;
- if (srcSize == 8)
- break;
-
- // 32-bit move.
- instId = avxEnabled ? Inst::kIdVmovd : Inst::kIdMovd;
- dst.setSignature(Reg::signatureOfT<Reg::kTypeGpd>());
- break;
- }
- }
-
- if (Type::isMmx(dstTypeId)) {
- instId = Inst::kIdMovq;
- srcSize = Support::min(srcSize, dstSize);
-
- if (Type::isInt(srcTypeId) || src.isMem()) {
- // 64-bit move.
- if (srcSize == 8)
- break;
-
- // 32-bit move.
- instId = Inst::kIdMovd;
- if (src.isReg())
- src.setSignature(Reg::signatureOfT<Reg::kTypeGpd>());
- break;
- }
-
- if (Type::isMmx(srcTypeId))
- break;
-
- // This will hurt if `avxEnabled`.
- instId = Inst::kIdMovdq2q;
- if (Type::isVec(srcTypeId))
-break;
- }
-
- if (Type::isMask(dstTypeId)) {
- srcSize = Support::min(srcSize, dstSize);
-
- if (Type::isInt(srcTypeId) || Type::isMask(srcTypeId) || src.isMem()) {
- instId = x86KmovFromSize(srcSize);
- if (Reg::isGp(src) && srcSize <= 4)
- src.setSignature(Reg::signatureOfT<Reg::kTypeGpd>());
- break;
- }
- }
-
- if (Type::isVec(dstTypeId)) {
- // By default set destination to XMM, will be set to YMM|ZMM if needed.
- dst.setSignature(Reg::signatureOfT<Reg::kTypeXmm>());
-
- // This will hurt if `avxEnabled`.
- if (Reg::isMm(src)) {
- // 64-bit move.
- instId = Inst::kIdMovq2dq;
- break;
- }
-
- // Argument conversion.
- uint32_t dstElement = Type::baseOf(dstTypeId);
- uint32_t srcElement = Type::baseOf(srcTypeId);
-
- if (dstElement == Type::kIdF32 && srcElement == Type::kIdF64) {
- srcSize = Support::min(dstSize * 2, srcSize);
- dstSize = srcSize / 2;
-
- if (srcSize <= 8)
- instId = avxEnabled ? Inst::kIdVcvtss2sd : Inst::kIdCvtss2sd;
- else
- instId = avxEnabled ? Inst::kIdVcvtps2pd : Inst::kIdCvtps2pd;
-
- if (dstSize == 32)
- dst.setSignature(Reg::signatureOfT<Reg::kTypeYmm>());
- if (src.isReg())
- src.setSignature(Reg::signatureOfVecBySize(srcSize));
- break;
- }
-
- if (dstElement == Type::kIdF64 && srcElement == Type::kIdF32) {
- srcSize = Support::min(dstSize, srcSize * 2) / 2;
- dstSize = srcSize * 2;
-
- if (srcSize <= 4)
- instId = avxEnabled ? Inst::kIdVcvtsd2ss : Inst::kIdCvtsd2ss;
- else
- instId = avxEnabled ? Inst::kIdVcvtpd2ps : Inst::kIdCvtpd2ps;
-
- dst.setSignature(Reg::signatureOfVecBySize(dstSize));
- if (src.isReg() && srcSize >= 32)
- src.setSignature(Reg::signatureOfT<Reg::kTypeYmm>());
- break;
- }
-
- srcSize = Support::min(srcSize, dstSize);
- if (Reg::isGp(src) || src.isMem()) {
- // 32-bit move.
- if (srcSize <= 4) {
- instId = avxEnabled ? Inst::kIdVmovd : Inst::kIdMovd;
- if (src.isReg())
- src.setSignature(Reg::signatureOfT<Reg::kTypeGpd>());
- break;
- }
-
- // 64-bit move.
- if (srcSize == 8) {
- instId = avxEnabled ? Inst::kIdVmovq : Inst::kIdMovq;
- break;
- }
- }
-
- if (Reg::isVec(src) || src.isMem()) {
- instId = avxEnabled ? Inst::kIdVmovaps : Inst::kIdMovaps;
-
- if (src.isMem() && srcSize < emitter->environment().stackAlignment())
- instId = avxEnabled ? Inst::kIdVmovups : Inst::kIdMovups;
-
- uint32_t signature = Reg::signatureOfVecBySize(srcSize);
- dst.setSignature(signature);
- if (src.isReg())
- src.setSignature(signature);
- break;
- }
- }
-
- return DebugUtils::errored(kErrorInvalidState);
- }
-
- if (src.isMem())
- src.as<Mem>().setSize(srcSize);
-
- emitter->setInlineComment(comment);
- return emitter->emit(instId, dst, src);
-}
-
-// ============================================================================
-// [asmjit::X86Internal - Emit Prolog & Epilog]
-// ============================================================================
-
-static ASMJIT_INLINE void X86Internal_setupSaveRestoreInfo(uint32_t group, const FuncFrame& frame, Reg& xReg, uint32_t& xInst, uint32_t& xSize) noexcept {
- switch (group) {
- case Reg::kGroupVec:
- xReg = xmm(0);
- xInst = x86GetXmmMovInst(frame);
- xSize = xReg.size();
- break;
- case Reg::kGroupMm:
- xReg = mm(0);
- xInst = Inst::kIdMovq;
- xSize = xReg.size();
- break;
- case Reg::kGroupKReg:
- xReg = k(0);
- xInst = Inst::kIdKmovq;
- xSize = xReg.size();
- break;
- }
-}
-
-ASMJIT_FAVOR_SIZE Error X86Internal::emitProlog(Emitter* emitter, const FuncFrame& frame) {
- uint32_t gpSaved = frame.savedRegs(Reg::kGroupGp);
-
- Gp zsp = emitter->zsp(); // ESP|RSP register.
- Gp zbp = emitter->zbp(); // EBP|RBP register.
- Gp gpReg = zsp; // General purpose register (temporary).
- Gp saReg = zsp; // Stack-arguments base pointer.
-
- // Emit: 'push zbp'
- // 'mov zbp, zsp'.
- if (frame.hasPreservedFP()) {
- gpSaved &= ~Support::bitMask(Gp::kIdBp);
- ASMJIT_PROPAGATE(emitter->push(zbp));
- ASMJIT_PROPAGATE(emitter->mov(zbp, zsp));
- }
-
- // Emit: 'push gp' sequence.
- {
- Support::BitWordIterator<uint32_t> it(gpSaved);
- while (it.hasNext()) {
- gpReg.setId(it.next());
- ASMJIT_PROPAGATE(emitter->push(gpReg));
- }
- }
-
- // Emit: 'mov saReg, zsp'.
- uint32_t saRegId = frame.saRegId();
- if (saRegId != BaseReg::kIdBad && saRegId != Gp::kIdSp) {
- saReg.setId(saRegId);
- if (frame.hasPreservedFP()) {
- if (saRegId != Gp::kIdBp)
- ASMJIT_PROPAGATE(emitter->mov(saReg, zbp));
- }
- else {
- ASMJIT_PROPAGATE(emitter->mov(saReg, zsp));
- }
- }
-
- // Emit: 'and zsp, StackAlignment'.
- if (frame.hasDynamicAlignment()) {
- ASMJIT_PROPAGATE(emitter->and_(zsp, -int32_t(frame.finalStackAlignment())));
- }
-
- // Emit: 'sub zsp, StackAdjustment'.
- if (frame.hasStackAdjustment()) {
- ASMJIT_PROPAGATE(emitter->sub(zsp, frame.stackAdjustment()));
- }
-
- // Emit: 'mov [zsp + DAOffset], saReg'.
- if (frame.hasDynamicAlignment() && frame.hasDAOffset()) {
- Mem saMem = ptr(zsp, int32_t(frame.daOffset()));
- ASMJIT_PROPAGATE(emitter->mov(saMem, saReg));
- }
-
- // Emit 'movxxx [zsp + X], {[x|y|z]mm, k}'.
- {
- Reg xReg;
- Mem xBase = ptr(zsp, int32_t(frame.nonGpSaveOffset()));
-
- uint32_t xInst;
- uint32_t xSize;
-
- for (uint32_t group = 1; group < BaseReg::kGroupVirt; group++) {
- Support::BitWordIterator<uint32_t> it(frame.savedRegs(group));
- if (it.hasNext()) {
- X86Internal_setupSaveRestoreInfo(group, frame, xReg, xInst, xSize);
- do {
- xReg.setId(it.next());
- ASMJIT_PROPAGATE(emitter->emit(xInst, xBase, xReg));
- xBase.addOffsetLo32(int32_t(xSize));
- } while (it.hasNext());
- }
- }
- }
-
- return kErrorOk;
-}
-
-ASMJIT_FAVOR_SIZE Error X86Internal::emitEpilog(Emitter* emitter, const FuncFrame& frame) {
- uint32_t i;
- uint32_t regId;
-
- uint32_t registerSize = emitter->registerSize();
- uint32_t gpSaved = frame.savedRegs(Reg::kGroupGp);
-
- Gp zsp = emitter->zsp(); // ESP|RSP register.
- Gp zbp = emitter->zbp(); // EBP|RBP register.
- Gp gpReg = emitter->zsp(); // General purpose register (temporary).
-
- // Don't emit 'pop zbp' in the pop sequence, this case is handled separately.
- if (frame.hasPreservedFP())
- gpSaved &= ~Support::bitMask(Gp::kIdBp);
-
- // Emit 'movxxx {[x|y|z]mm, k}, [zsp + X]'.
- {
- Reg xReg;
- Mem xBase = ptr(zsp, int32_t(frame.nonGpSaveOffset()));
-
- uint32_t xInst;
- uint32_t xSize;
-
- for (uint32_t group = 1; group < BaseReg::kGroupVirt; group++) {
- Support::BitWordIterator<uint32_t> it(frame.savedRegs(group));
- if (it.hasNext()) {
- X86Internal_setupSaveRestoreInfo(group, frame, xReg, xInst, xSize);
- do {
- xReg.setId(it.next());
- ASMJIT_PROPAGATE(emitter->emit(xInst, xReg, xBase));
- xBase.addOffsetLo32(int32_t(xSize));
- } while (it.hasNext());
- }
- }
- }
-
- // Emit 'emms' and/or 'vzeroupper'.
- if (frame.hasMmxCleanup()) ASMJIT_PROPAGATE(emitter->emms());
- if (frame.hasAvxCleanup()) ASMJIT_PROPAGATE(emitter->vzeroupper());
-
- if (frame.hasPreservedFP()) {
- // Emit 'mov zsp, zbp' or 'lea zsp, [zbp - x]'
- int32_t count = int32_t(frame.gpSaveSize() - registerSize);
- if (!count)
- ASMJIT_PROPAGATE(emitter->mov(zsp, zbp));
- else
- ASMJIT_PROPAGATE(emitter->lea(zsp, ptr(zbp, -count)));
- }
- else {
- if (frame.hasDynamicAlignment() && frame.hasDAOffset()) {
- // Emit 'mov zsp, [zsp + DsaSlot]'.
- Mem saMem = ptr(zsp, int32_t(frame.daOffset()));
- ASMJIT_PROPAGATE(emitter->mov(zsp, saMem));
- }
- else if (frame.hasStackAdjustment()) {
- // Emit 'add zsp, StackAdjustment'.
- ASMJIT_PROPAGATE(emitter->add(zsp, int32_t(frame.stackAdjustment())));
- }
- }
-
- // Emit 'pop gp' sequence.
- if (gpSaved) {
- i = gpSaved;
- regId = 16;
-
- do {
- regId--;
- if (i & 0x8000) {
- gpReg.setId(regId);
- ASMJIT_PROPAGATE(emitter->pop(gpReg));
- }
- i <<= 1;
- } while (regId != 0);
- }
-
- // Emit 'pop zbp'.
- if (frame.hasPreservedFP())
- ASMJIT_PROPAGATE(emitter->pop(zbp));
-
- // Emit 'ret' or 'ret x'.
- if (frame.hasCalleeStackCleanup())
- ASMJIT_PROPAGATE(emitter->emit(Inst::kIdRet, int(frame.calleeStackCleanup())));
- else
- ASMJIT_PROPAGATE(emitter->emit(Inst::kIdRet));
-
- return kErrorOk;
-}
-
-// ============================================================================
-// [asmjit::X86Internal - Emit Arguments Assignment]
-// ============================================================================
-
-#ifdef ASMJIT_DUMP_ARGS_ASSIGNMENT
-static void dumpFuncValue(String& sb, uint32_t arch, const FuncValue& value) noexcept {
- Formatter::formatTypeId(sb, value.typeId());
- sb.append('@');
-
- if (value.isIndirect())
- sb.append('[');
-
- if (value.isReg())
- Formatter::formatRegister(sb, 0, nullptr, arch, value.regType(), value.regId());
- else if (value.isStack())
- sb.appendFormat("[%d]", value.stackOffset());
- else
- sb.append("<none>");
-
- if (value.isIndirect())
- sb.append(']');
-}
-
-static void dumpAssignment(String& sb, const X86FuncArgsContext& ctx) noexcept {
- typedef X86FuncArgsContext::Var Var;
-
- uint32_t arch = ctx.arch();
- uint32_t varCount = ctx.varCount();
-
- for (uint32_t i = 0; i < varCount; i++) {
- const Var& var = ctx.var(i);
- const FuncValue& dst = var.out;
- const FuncValue& cur = var.cur;
-
- sb.appendFormat("Var%u: ", i);
- dumpFuncValue(sb, arch, dst);
- sb.append(" <- ");
- dumpFuncValue(sb, arch, cur);
-
- if (var.isDone())
- sb.append(" {Done}");
-
- sb.append('\n');
- }
-}
-#endif
-
-ASMJIT_FAVOR_SIZE Error X86Internal::emitArgsAssignment(Emitter* emitter, const FuncFrame& frame, const FuncArgsAssignment& args) {
- typedef X86FuncArgsContext::Var Var;
- typedef X86FuncArgsContext::WorkData WorkData;
-
- enum WorkFlags : uint32_t {
- kWorkNone = 0x00,
- kWorkDidSome = 0x01,
- kWorkPending = 0x02,
- kWorkPostponed = 0x04
- };
-
- X86FuncArgsContext ctx;
- ASMJIT_PROPAGATE(ctx.initWorkData(frame, args));
-
-#ifdef ASMJIT_DUMP_ARGS_ASSIGNMENT
- {
- String sb;
- dumpAssignment(sb, ctx);
- printf("%s\n", sb.data());
- }
-#endif
-
- uint32_t arch = ctx.arch();
- uint32_t varCount = ctx._varCount;
- WorkData* workData = ctx._workData;
-
- // Use AVX if it's enabled.
- bool avxEnabled = frame.isAvxEnabled();
-
- uint32_t saVarId = ctx._saVarId;
- uint32_t saRegId = Gp::kIdSp;
-
- if (frame.hasDynamicAlignment()) {
- if (frame.hasPreservedFP())
- saRegId = Gp::kIdBp;
- else
- saRegId = saVarId < varCount ? ctx._vars[saVarId].cur.regId() : frame.saRegId();
- }
-
- RegInfo gpRegInfo = emitter->_gpRegInfo;
-
- // --------------------------------------------------------------------------
- // Register to stack and stack to stack moves must be first as now we have
- // the biggest chance of having as many as possible unassigned registers.
- // --------------------------------------------------------------------------
-
- if (ctx._stackDstMask) {
- // Base address of all arguments passed by stack.
- Mem baseArgPtr = ptr(emitter->gpz(saRegId), int32_t(frame.saOffset(saRegId)));
- Mem baseStackPtr = ptr(emitter->gpz(Gp::kIdSp), int32_t(0));
-
- for (uint32_t varId = 0; varId < varCount; varId++) {
- Var& var = ctx._vars[varId];
-
- if (!var.out.isStack())
- continue;
-
- FuncValue& cur = var.cur;
- FuncValue& out = var.out;
-
- ASMJIT_ASSERT(cur.isReg() || cur.isStack());
- Reg reg;
-
- Mem dstStackPtr = baseStackPtr.cloneAdjusted(out.stackOffset());
- Mem srcStackPtr = baseArgPtr.cloneAdjusted(cur.stackOffset());
-
- if (cur.isIndirect()) {
- if (cur.isStack()) {
- // TODO: Indirect stack.
- return DebugUtils::errored(kErrorInvalidAssignment);
- }
- else {
- srcStackPtr = ptr(Gp(gpRegInfo.signature(), cur.regId()));
- }
- }
-
- if (cur.isReg() && !cur.isIndirect()) {
- WorkData& wd = workData[Reg::groupOf(cur.regType())];
- uint32_t rId = cur.regId();
-
- reg.setSignatureAndId(Reg::signatureOf(cur.regType()), rId);
- wd.unassign(varId, rId);
- }
- else {
- // Stack to reg move - tricky since we move stack to stack we can decide which
- // register to use. In general we follow the rule that IntToInt moves will use
- // GP regs with possibility to signature or zero extend, and all other moves will
- // either use GP or VEC regs depending on the size of the move.
- RegInfo rInfo = x86GetRegForMemToMemMove(arch, out.typeId(), cur.typeId());
- if (ASMJIT_UNLIKELY(!rInfo.isValid()))
- return DebugUtils::errored(kErrorInvalidState);
-
- WorkData& wd = workData[rInfo.group()];
- uint32_t availableRegs = wd.availableRegs();
- if (ASMJIT_UNLIKELY(!availableRegs))
- return DebugUtils::errored(kErrorInvalidState);
-
- uint32_t rId = Support::ctz(availableRegs);
- reg.setSignatureAndId(rInfo.signature(), rId);
-
- ASMJIT_PROPAGATE(emitArgMove(emitter, reg, out.typeId(), srcStackPtr, cur.typeId(), avxEnabled));
- }
-
- if (cur.isIndirect() && cur.isReg())
- workData[BaseReg::kGroupGp].unassign(varId, cur.regId());
-
- // Register to stack move.
- ASMJIT_PROPAGATE(emitRegMove(emitter, dstStackPtr, reg, cur.typeId(), avxEnabled));
- var.markDone();
- }
- }
-
- // --------------------------------------------------------------------------
- // Shuffle all registers that are currently assigned accordingly to target
- // assignment.
- // --------------------------------------------------------------------------
-
- uint32_t workFlags = kWorkNone;
- for (;;) {
- for (uint32_t varId = 0; varId < varCount; varId++) {
- Var& var = ctx._vars[varId];
- if (var.isDone() || !var.cur.isReg())
- continue;
-
- FuncValue& cur = var.cur;
- FuncValue& out = var.out;
-
- uint32_t curGroup = Reg::groupOf(cur.regType());
- uint32_t outGroup = Reg::groupOf(out.regType());
-
- uint32_t curId = cur.regId();
- uint32_t outId = out.regId();
-
- if (curGroup != outGroup) {
- // TODO: Conversion is not supported.
- return DebugUtils::errored(kErrorInvalidAssignment);
- }
- else {
- WorkData& wd = workData[outGroup];
- if (!wd.isAssigned(outId)) {
-EmitMove:
- ASMJIT_PROPAGATE(
- emitArgMove(emitter,
- Reg::fromTypeAndId(out.regType(), outId), out.typeId(),
- Reg::fromTypeAndId(cur.regType(), curId), cur.typeId(), avxEnabled));
-
- wd.reassign(varId, outId, curId);
- cur.initReg(out.regType(), outId, out.typeId());
-
- if (outId == out.regId())
- var.markDone();
- workFlags |= kWorkDidSome | kWorkPending;
- }
- else {
- uint32_t altId = wd._physToVarId[outId];
- Var& altVar = ctx._vars[altId];
-
- if (!altVar.out.isInitialized() || (altVar.out.isReg() && altVar.out.regId() == curId)) {
- // Swap operation is possible only between two GP registers.
- if (curGroup == Reg::kGroupGp) {
- uint32_t highestType = Support::max(cur.regType(), altVar.cur.regType());
- uint32_t signature = highestType == Reg::kTypeGpq ? Reg::signatureOfT<Reg::kTypeGpq>()
- : Reg::signatureOfT<Reg::kTypeGpd>();
-
- ASMJIT_PROPAGATE(emitter->emit(Inst::kIdXchg, Reg(signature, outId), Reg(signature, curId)));
- wd.swap(varId, curId, altId, outId);
- cur.setRegId(outId);
- var.markDone();
- altVar.cur.setRegId(curId);
-
- if (altVar.out.isInitialized())
- altVar.markDone();
- workFlags |= kWorkDidSome;
- }
- else {
- // If there is a scratch register it can be used to perform the swap.
- uint32_t availableRegs = wd.availableRegs();
- if (availableRegs) {
- uint32_t inOutRegs = wd.dstRegs();
- if (availableRegs & ~inOutRegs)
- availableRegs &= ~inOutRegs;
- outId = Support::ctz(availableRegs);
- goto EmitMove;
- }
- else {
- workFlags |= kWorkPending;
- }
- }
- }
- else {
- workFlags |= kWorkPending;
- }
- }
- }
- }
-
- if (!(workFlags & kWorkPending))
- break;
-
- // If we did nothing twice it means that something is really broken.
- if ((workFlags & (kWorkDidSome | kWorkPostponed)) == kWorkPostponed)
- return DebugUtils::errored(kErrorInvalidState);
-
- workFlags = (workFlags & kWorkDidSome) ? kWorkNone : kWorkPostponed;
- }
-
- // --------------------------------------------------------------------------
- // Load arguments passed by stack into registers. This is pretty simple and
- // it never requires multiple iterations like the previous phase.
- // --------------------------------------------------------------------------
-
- if (ctx._hasStackSrc) {
- uint32_t iterCount = 1;
- if (frame.hasDynamicAlignment() && !frame.hasPreservedFP())
- saRegId = saVarId < varCount ? ctx._vars[saVarId].cur.regId() : frame.saRegId();
-
- // Base address of all arguments passed by stack.
- Mem baseArgPtr = ptr(emitter->gpz(saRegId), int32_t(frame.saOffset(saRegId)));
-
- for (uint32_t iter = 0; iter < iterCount; iter++) {
- for (uint32_t varId = 0; varId < varCount; varId++) {
- Var& var = ctx._vars[varId];
- if (var.isDone())
- continue;
-
- if (var.cur.isStack()) {
- ASMJIT_ASSERT(var.out.isReg());
-
- uint32_t outId = var.out.regId();
- uint32_t outType = var.out.regType();
-
- uint32_t group = Reg::groupOf(outType);
- WorkData& wd = ctx._workData[group];
-
- if (outId == saRegId && group == BaseReg::kGroupGp) {
- // This register will be processed last as we still need `saRegId`.
- if (iterCount == 1) {
- iterCount++;
- continue;
- }
- wd.unassign(wd._physToVarId[outId], outId);
- }
-
- Reg dstReg = Reg::fromTypeAndId(outType, outId);
- Mem srcMem = baseArgPtr.cloneAdjusted(var.cur.stackOffset());
-
- ASMJIT_PROPAGATE(
- emitArgMove(emitter,
- dstReg, var.out.typeId(),
- srcMem, var.cur.typeId(), avxEnabled));
-
- wd.assign(varId, outId);
- var.cur.initReg(outType, outId, var.cur.typeId(), FuncValue::kFlagIsDone);
- }
- }
- }
- }
-
- return kErrorOk;
-}
-
-ASMJIT_END_SUB_NAMESPACE
-
-#endif // ASMJIT_BUILD_X86
diff --git a/3rdparty/asmjit/src/asmjit/x86/x86internal_p.h b/3rdparty/asmjit/src/asmjit/x86/x86internal_p.h
deleted file mode 100644
index d4ea8e1f9bf..00000000000
--- a/3rdparty/asmjit/src/asmjit/x86/x86internal_p.h
+++ /dev/null
@@ -1,87 +0,0 @@
-// AsmJit - Machine code generation for C++
-//
-// * Official AsmJit Home Page: https://asmjit.com
-// * Official Github Repository: https://github.com/asmjit/asmjit
-//
-// Copyright (c) 2008-2020 The AsmJit Authors
-//
-// This software is provided 'as-is', without any express or implied
-// warranty. In no event will the authors be held liable for any damages
-// arising from the use of this software.
-//
-// Permission is granted to anyone to use this software for any purpose,
-// including commercial applications, and to alter it and redistribute it
-// freely, subject to the following restrictions:
-//
-// 1. The origin of this software must not be misrepresented; you must not
-// claim that you wrote the original software. If you use this software
-// in a product, an acknowledgment in the product documentation would be
-// appreciated but is not required.
-// 2. Altered source versions must be plainly marked as such, and must not be
-// misrepresented as being the original software.
-// 3. This notice may not be removed or altered from any source distribution.
-
-#ifndef ASMJIT_X86_X86INTERNAL_P_H_INCLUDED
-#define ASMJIT_X86_X86INTERNAL_P_H_INCLUDED
-
-#include "../core/api-config.h"
-
-#include "../core/func.h"
-#include "../x86/x86emitter.h"
-#include "../x86/x86operand.h"
-
-ASMJIT_BEGIN_SUB_NAMESPACE(x86)
-
-//! \cond INTERNAL
-//! \addtogroup asmjit_x86
-//! \{
-
-// ============================================================================
-// [asmjit::X86Internal]
-// ============================================================================
-
-//! X86 utilities used at multiple places, not part of public API, not exported.
-struct X86Internal {
- //! Initialize `FuncDetail` (X86 specific).
- static Error initFuncDetail(FuncDetail& func, const FuncSignature& signature, uint32_t registerSize) noexcept;
-
- //! Initialize `FuncFrame` (X86 specific).
- static Error initFuncFrame(FuncFrame& frame, const FuncDetail& signature) noexcept;
-
- //! Finalize `FuncFrame` (X86 specific).
- static Error finalizeFuncFrame(FuncFrame& frame) noexcept;
-
- static Error argsToFuncFrame(const FuncArgsAssignment& args, FuncFrame& frame) noexcept;
-
- //! Emit function prolog.
- static Error emitProlog(Emitter* emitter, const FuncFrame& frame);
-
- //! Emit function epilog.
- static Error emitEpilog(Emitter* emitter, const FuncFrame& frame);
-
- //! Emit a pure move operation between two registers or the same type or
- //! between a register and its home slot. This function does not handle
- //! register conversion.
- static Error emitRegMove(Emitter* emitter,
- const Operand_& dst_,
- const Operand_& src_, uint32_t typeId, bool avxEnabled, const char* comment = nullptr);
-
- //! Emit move from a function argument (either register or stack) to a register.
- //!
- //! This function can handle the necessary conversion from one argument to
- //! another, and from one register type to another, if it's possible. Any
- //! attempt of conversion that requires third register of a different group
- //! (for example conversion from K to MMX) will fail.
- static Error emitArgMove(Emitter* emitter,
- const Reg& dst_, uint32_t dstTypeId,
- const Operand_& src_, uint32_t srcTypeId, bool avxEnabled, const char* comment = nullptr);
-
- static Error emitArgsAssignment(Emitter* emitter, const FuncFrame& frame, const FuncArgsAssignment& args);
-};
-
-//! \}
-//! \endcond
-
-ASMJIT_END_SUB_NAMESPACE
-
-#endif // ASMJIT_X86_X86INTERNAL_P_H_INCLUDED
diff --git a/3rdparty/asmjit/src/asmjit/x86/x86opcode_p.h b/3rdparty/asmjit/src/asmjit/x86/x86opcode_p.h
index 164b26c1dea..94a76f04818 100644
--- a/3rdparty/asmjit/src/asmjit/x86/x86opcode_p.h
+++ b/3rdparty/asmjit/src/asmjit/x86/x86opcode_p.h
@@ -1,25 +1,7 @@
-// AsmJit - Machine code generation for C++
+// This file is part of AsmJit project <https://asmjit.com>
//
-// * Official AsmJit Home Page: https://asmjit.com
-// * Official Github Repository: https://github.com/asmjit/asmjit
-//
-// Copyright (c) 2008-2020 The AsmJit Authors
-//
-// This software is provided 'as-is', without any express or implied
-// warranty. In no event will the authors be held liable for any damages
-// arising from the use of this software.
-//
-// Permission is granted to anyone to use this software for any purpose,
-// including commercial applications, and to alter it and redistribute it
-// freely, subject to the following restrictions:
-//
-// 1. The origin of this software must not be misrepresented; you must not
-// claim that you wrote the original software. If you use this software
-// in a product, an acknowledgment in the product documentation would be
-// appreciated but is not required.
-// 2. Altered source versions must be plainly marked as such, and must not be
-// misrepresented as being the original software.
-// 3. This notice may not be removed or altered from any source distribution.
+// See asmjit.h or LICENSE.md for license and copyright information
+// SPDX-License-Identifier: Zlib
#ifndef ASMJIT_X86_X86OPCODE_P_H_INCLUDED
#define ASMJIT_X86_X86OPCODE_P_H_INCLUDED
@@ -32,85 +14,66 @@ ASMJIT_BEGIN_SUB_NAMESPACE(x86)
//! \addtogroup asmjit_x86
//! \{
-// ============================================================================
-// [asmjit::x86::Opcode]
-// ============================================================================
-
//! Helper class to store and manipulate X86 opcodes.
//!
-//! The first 8 least significant bits describe the opcode byte as defined in
-//! ISA manuals, all other bits describe other properties like prefixes, see
-//! `Opcode::Bits` for more information.
+//! The first 8 least significant bits describe the opcode byte as defined in ISA manuals, all other bits
+//! describe other properties like prefixes, see `Opcode::Bits` for more information.
struct Opcode {
uint32_t v;
//! Describes a meaning of all bits of AsmJit's 32-bit opcode value.
//!
- //! This schema is AsmJit specific and has been designed to allow encoding of
- //! all X86 instructions available. X86, MMX, and SSE+ instructions always use
- //! `MM` and `PP` fields, which are encoded to corresponding prefixes needed
- //! by X86 or SIMD instructions. AVX+ instructions embed `MMMMM` and `PP` fields
- //! in a VEX prefix, and AVX-512 instructions embed `MM` and `PP` in EVEX prefix.
+ //! This schema is AsmJit specific and has been designed to allow encoding of all X86 instructions available. X86,
+ //! MMX, and SSE+ instructions always use `MM` and `PP` fields, which are encoded to corresponding prefixes needed
+ //! by X86 or SIMD instructions. AVX+ instructions embed `MMMMM` and `PP` fields in a VEX prefix, and AVX-512
+ //! instructions embed `MM` and `PP` in EVEX prefix.
//!
- //! The instruction opcode definition uses 1 or 2 bytes as an opcode value. 1
- //! byte is needed by most of the instructions, 2 bytes are only used by legacy
- //! X87-FPU instructions. This means that a second byte is free to by used by
- //! instructions encoded by using VEX and/or EVEX prefix.
+ //! The instruction opcode definition uses 1 or 2 bytes as an opcode value. 1 byte is needed by most of the
+ //! instructions, 2 bytes are only used by legacy X87-FPU instructions. This means that a second byte is free to
+ //! by used by instructions encoded by using VEX and/or EVEX prefix.
//!
//! The fields description:
//!
- //! - `MM` field is used to encode prefixes needed by the instruction or as
- //! a part of VEX/EVEX prefix. Described as `mm` and `mmmmm` in instruction
- //! manuals.
+ //! - `MM` field is used to encode prefixes needed by the instruction or as a part of VEX/EVEX prefix. Described as
+ //! `mm` and `mmmmm` in instruction manuals.
//!
- //! NOTE: Since `MM` field is defined as `mmmmm` (5 bits), but only 2 least
- //! significant bits are used by VEX and EVEX prefixes, and additional 4th
- //! bit is used by XOP prefix, AsmJit uses the 3rd and 5th bit for it's own
- //! purposes. These bits will probably never be used in future encodings as
- //! AVX512 uses only `000mm` from `mmmmm`.
+ //! NOTE: Since `MM` field is defined as `mmmmm` (5 bits), but only 2 least significant bits are used by VEX and
+ //! EVEX prefixes, and additional 4th bit is used by XOP prefix, AsmJit uses the 3rd and 5th bit for it's own
+ //! purposes. These bits will probably never be used in future encodings as AVX512 uses only `000mm` from `mmmmm`.
//!
- //! - `PP` field is used to encode prefixes needed by the instruction or as a
- //! part of VEX/EVEX prefix. Described as `pp` in instruction manuals.
+ //! - `PP` field is used to encode prefixes needed by the instruction or as a part of VEX/EVEX prefix. Described as
+ //! `pp` in instruction manuals.
//!
- //! - `LL` field is used exclusively by AVX+ and AVX512+ instruction sets. It
- //! describes vector size, which is `L.128` for XMM register, `L.256` for
- //! for YMM register, and `L.512` for ZMM register. The `LL` field is omitted
- //! in case that instruction supports multiple vector lengths, however, if the
- //! instruction requires specific `L` value it must be specified as a part of
- //! the opcode.
+ //! - `LL` field is used exclusively by AVX+ and AVX512+ instruction sets. It describes vector size, which is `L.128`
+ //! for XMM register, `L.256` for for YMM register, and `L.512` for ZMM register. The `LL` field is omitted in case
+ //! that instruction supports multiple vector lengths, however, if the instruction requires specific `L` value it
+ //! must be specified as a part of the opcode.
//!
//! NOTE: `LL` having value `11` is not defined yet.
//!
- //! - `W` field is the most complicated. It was added by 64-bit architecture
- //! to promote default operation width (instructions that perform 32-bit
- //! operation by default require to override the width to 64-bit explicitly).
- //! There is nothing wrong on this, however, some instructions introduced
- //! implicit `W` override, for example a `cdqe` instruction is basically a
- //! `cwde` instruction with overridden `W` (set to 1). There are some others
- //! in the base X86 instruction set. More recent instruction sets started
- //! using `W` field more often:
+ //! - `W` field is the most complicated. It was added by 64-bit architecture to promote default operation width
+ //! (instructions that perform 32-bit operation by default require to override the width to 64-bit explicitly).
+ //! There is nothing wrong on this, however, some instructions introduced implicit `W` override, for example a
+ //! `cdqe` instruction is basically a `cwde` instruction with overridden `W` (set to 1). There are some others
+ //! in the base X86 instruction set. More recent instruction sets started using `W` field more often:
//!
- //! - AVX instructions started using `W` field as an extended opcode for FMA,
- //! GATHER, PERM, and other instructions. It also uses `W` field to override
- //! the default operation width in instructions like `vmovq`.
+ //! - AVX instructions started using `W` field as an extended opcode for FMA, GATHER, PERM, and other instructions.
+ //! It also uses `W` field to override the default operation width in instructions like `vmovq`.
//!
- //! - AVX-512 instructions started using `W` field as an extended opcode for
- //! all new instructions. This wouldn't have been an issue if the `W` field
- //! of AVX-512 have matched AVX, but this is not always the case.
+ //! - AVX-512 instructions started using `W` field as an extended opcode for all new instructions. This wouldn't
+ //! have been an issue if the `W` field of AVX-512 have matched AVX, but this is not always the case.
//!
//! - `O` field is an extended opcode field (3 bits) embedded in ModR/M BYTE.
//!
- //! - `CDSHL` and `CDTT` fields describe 'compressed-displacement'. `CDSHL` is
- //! defined for each instruction that is AVX-512 encodable (EVEX) and contains
- //! a base N shift (base shift to perform the calculation). The `CDTT` field
- //! is derived from instruction specification and describes additional shift
- //! to calculate the final `CDSHL` that will be used in SIB byte.
+ //! - `CDSHL` and `CDTT` fields describe 'compressed-displacement'. `CDSHL` is defined for each instruction that is
+ //! AVX-512 encodable (EVEX) and contains a base N shift (base shift to perform the calculation). The `CDTT` field
+ //! is derived from instruction specification and describes additional shift to calculate the final `CDSHL` that
+ //! will be used in SIB byte.
//!
- //! \note Don't reorder any fields here, the shifts and masks were defined
- //! carefully to make encoding of X86 instructions fast, especially to construct
- //! REX, VEX, and EVEX prefixes in the most efficient way. Changing values defined
- //! by these enums many cause AsmJit to emit invalid binary representations of
- //! instructions passed to `x86::Assembler::_emit`.
+ //! \note Don't reorder any fields here, the shifts and masks were defined carefully to make encoding of X86
+ //! instructions fast, especially to construct REX, VEX, and EVEX prefixes in the most efficient way. Changing
+ //! values defined by these enums many cause AsmJit to emit invalid binary representations of instructions passed to
+ //! `x86::Assembler::_emit`.
enum Bits : uint32_t {
// MM & VEX & EVEX & XOP
// ---------------------
@@ -119,22 +82,15 @@ struct Opcode {
// * Part of a legacy opcode (prefixes emitted before the main opcode byte).
// * `MMMMM` field in VEX|EVEX|XOP instruction.
//
- // AVX reserves 5 bits for `MMMMM` field, however AVX instructions only use
- // 2 bits and XOP 3 bits. AVX-512 shrinks `MMMMM` field into `MM` so it's
- // safe to assume that bits [4:2] of `MM` field won't be used in future
- // extensions, which will most probably use EVEX encoding. AsmJit divides
- // MM field into this layout:
+ // AVX reserves 5 bits for `MMMMM` field, however AVX instructions only use 2 bits and XOP 3 bits. AVX-512 shrinks
+ // `MMMMM` field into `MMM` so it's safe to use [4:3] bits of `MMMMM` field for internal payload.
+ //
+ // AsmJit divides MMMMM field into this layout:
//
- // [1:0] - Used to describe 0F, 0F38 and 0F3A legacy prefix bytes and
- // 2 bits of MM field.
- // [2] - Used to force 3-BYTE VEX prefix, but then cleared to zero before
- // the prefix is emitted. This bit is not used by any instruction
- // so it can be used for any purpose by AsmJit. Also, this bit is
- // used as an extension to `MM` field describing 0F|0F38|0F3A to also
- // describe 0F01 as used by some legacy instructions (instructions
- // not using VEX/EVEX prefix).
- // [3] - Required by XOP instructions, so we use this bit also to indicate
- // that this is a XOP opcode.
+ // [2:0] - Used to describe 0F, 0F38 and 0F3A legacy prefix bytes and 3 bits of MMMMM field for XOP/AVX/AVX512.
+ // [3] - Required by XOP instructions, so we use this bit also to indicate that this is a XOP opcode.
+ // [4] - Used to force EVEX prefix - this bit is not used by any X86 instruction yet, so AsmJit uses it to
+ // describe EVEX only instructions or sets its bit when user uses InstOptions::kX86_Evex to force EVEX.
kMM_Shift = 8,
kMM_Mask = 0x1Fu << kMM_Shift,
kMM_00 = 0x00u << kMM_Shift,
@@ -143,11 +99,12 @@ struct Opcode {
kMM_0F3A = 0x03u << kMM_Shift, // Described also as XOP.M3 in AMD manuals.
kMM_0F01 = 0x04u << kMM_Shift, // AsmJit way to describe 0F01 (never VEX/EVEX).
- // `XOP` field is only used to force XOP prefix instead of VEX3 prefix. We
- // know that only XOP encoding uses bit 0b1000 of MM field and that no VEX
- // and EVEX instruction uses such bit, so we can use this bit to force XOP
- // prefix to be emitted instead of VEX3 prefix. See `x86VEXPrefix` defined
- // in `x86assembler.cpp`.
+ kMM_MAP5 = 0x05u << kMM_Shift, // EVEX.MAP5.
+ kMM_MAP6 = 0x06u << kMM_Shift, // EVEX.MAP6.
+
+ // `XOP` field is only used to force XOP prefix instead of VEX3 prefix. We know XOP encodings always use 0b1000
+ // bit of MM field and that no VEX and EVEX instruction use such bit yet, so we can use this bit to force XOP
+ // prefix to be emitted instead of VEX3 prefix. See `x86VEXPrefix` defined in `x86assembler.cpp`.
kMM_XOP08 = 0x08u << kMM_Shift, // XOP.M8.
kMM_XOP09 = 0x09u << kMM_Shift, // XOP.M9.
kMM_XOP0A = 0x0Au << kMM_Shift, // XOP.MA.
@@ -155,21 +112,17 @@ struct Opcode {
kMM_IsXOP_Shift= kMM_Shift + 3,
kMM_IsXOP = kMM_XOP08,
- // NOTE: Force VEX3 allows to force to emit VEX3 instead of VEX2 in some
- // cases (similar to forcing REX prefix). Force EVEX will force emitting
- // EVEX prefix instead of VEX2|VEX3. EVEX-only instructions will have
- // ForceEvex always set, however. instructions that can be encoded by
- // either VEX or EVEX prefix should not have ForceEvex set.
-
- kMM_ForceVex3 = 0x04u << kMM_Shift, // Force 3-BYTE VEX prefix.
+ // NOTE: Force VEX3 allows to force to emit VEX3 instead of VEX2 in some cases (similar to forcing REX prefix).
+ // Force EVEX will force emitting EVEX prefix instead of VEX2|VEX3. EVEX-only instructions will have ForceEvex
+ // always set, however. instructions that can be encoded by either VEX or EVEX prefix should not have ForceEvex
+ // set.
kMM_ForceEvex = 0x10u << kMM_Shift, // Force 4-BYTE EVEX prefix.
// FPU_2B - Second-Byte of the Opcode used by FPU
// ----------------------------------------------
//
- // Second byte opcode. This BYTE is ONLY used by FPU instructions and
- // collides with 3 bits from `MM` and 5 bits from 'CDSHL' and 'CDTT'.
- // It's fine as FPU and AVX512 flags are never used at the same time.
+ // Second byte opcode. This BYTE is ONLY used by FPU instructions and collides with 3 bits from `MM` and 5 bits
+ // from 'CDSHL' and 'CDTT'. It's fine as FPU and AVX512 flags are never used at the same time.
kFPU_2B_Shift = 10,
kFPU_2B_Mask = 0xFF << kFPU_2B_Shift,
@@ -203,8 +156,8 @@ struct Opcode {
// Compressed displacement tuple-type (specific to AsmJit).
//
- // Since we store the base offset independently of CDTT we can simplify the
- // number of 'TUPLE_TYPE' groups significantly and just handle special cases.
+ // Since we store the base offset independently of CDTT we can simplify the number of 'TUPLE_TYPE' groups
+ // significantly and just handle special cases.
kCDTT_Shift = 16,
kCDTT_Mask = 0x3u << kCDTT_Shift,
kCDTT_None = 0x0u << kCDTT_Shift, // Does nothing.
@@ -216,10 +169,12 @@ struct Opcode {
kCDTT__ = kCDTT_None,
kCDTT_FV = kCDTT_ByLL,
kCDTT_HV = kCDTT_ByLL,
+ kCDTT_QV = kCDTT_ByLL,
kCDTT_FVM = kCDTT_ByLL,
kCDTT_T1S = kCDTT_None,
kCDTT_T1F = kCDTT_None,
kCDTT_T1_4X = kCDTT_None,
+ kCDTT_T4X = kCDTT_None, // Alias to have only 3 letters.
kCDTT_T2 = kCDTT_None,
kCDTT_T4 = kCDTT_None,
kCDTT_T8 = kCDTT_None,
@@ -228,37 +183,53 @@ struct Opcode {
kCDTT_OVM = kCDTT_ByLL,
kCDTT_128 = kCDTT_None,
- kCDTT_T4X = kCDTT_T1_4X, // Alias to have only 3 letters.
+ // `O` Field in ModR/M (??:xxx:???)
+ // --------------------------------
- // `O` Field in MorR/M
- // -------------------
+ kModO_Shift = 18,
+ kModO_Mask = 0x7u << kModO_Shift,
- kO_Shift = 18,
- kO_Mask = 0x7u << kO_Shift,
+ kModO__ = 0x0u,
+ kModO_0 = 0x0u << kModO_Shift,
+ kModO_1 = 0x1u << kModO_Shift,
+ kModO_2 = 0x2u << kModO_Shift,
+ kModO_3 = 0x3u << kModO_Shift,
+ kModO_4 = 0x4u << kModO_Shift,
+ kModO_5 = 0x5u << kModO_Shift,
+ kModO_6 = 0x6u << kModO_Shift,
+ kModO_7 = 0x7u << kModO_Shift,
- kO__ = 0x0u,
- kO_0 = 0x0u << kO_Shift,
- kO_1 = 0x1u << kO_Shift,
- kO_2 = 0x2u << kO_Shift,
- kO_3 = 0x3u << kO_Shift,
- kO_4 = 0x4u << kO_Shift,
- kO_5 = 0x5u << kO_Shift,
- kO_6 = 0x6u << kO_Shift,
- kO_7 = 0x7u << kO_Shift,
+ // `RM` Field in ModR/M (??:???:xxx)
+ // ---------------------------------
+ //
+ // Second data field used by ModR/M byte. This is only used by few instructions that use OPCODE+MOD/RM where both
+ // values in Mod/RM are part of the opcode.
+
+ kModRM_Shift = 13,
+ kModRM_Mask = 0x7u << kModRM_Shift,
+
+ kModRM__ = 0x0u,
+ kModRM_0 = 0x0u << kModRM_Shift,
+ kModRM_1 = 0x1u << kModRM_Shift,
+ kModRM_2 = 0x2u << kModRM_Shift,
+ kModRM_3 = 0x3u << kModRM_Shift,
+ kModRM_4 = 0x4u << kModRM_Shift,
+ kModRM_5 = 0x5u << kModRM_Shift,
+ kModRM_6 = 0x6u << kModRM_Shift,
+ kModRM_7 = 0x7u << kModRM_Shift,
// `PP` Field
// ----------
//
- // These fields are stored deliberately right after each other as it makes
- // it easier to construct VEX prefix from the opcode value stored in the
- // instruction database.
+ // These fields are stored deliberately right after each other as it makes it easier to construct VEX prefix from
+ // the opcode value stored in the instruction database.
//
// Two meanings:
// * "PP" field in AVX/XOP/AVX-512 instruction.
// * Mandatory Prefix in legacy encoding.
//
- // AVX reserves 2 bits for `PP` field, but AsmJit extends the storage by 1
- // more bit that is used to emit 9B prefix for some X87-FPU instructions.
+ // AVX reserves 2 bits for `PP` field, but AsmJit extends the storage by 1 more bit that is used to emit 9B prefix
+ // for some X87-FPU instructions.
kPP_Shift = 21,
kPP_VEXMask = 0x03u << kPP_Shift, // PP field mask used by VEX/EVEX.
@@ -273,9 +244,8 @@ struct Opcode {
// REX|VEX|EVEX B|X|R|W Bits
// -------------------------
//
- // NOTE: REX.[B|X|R] are never stored within the opcode itself, they are
- // reserved by AsmJit are are added dynamically to the opcode to represent
- // [REX|VEX|EVEX].[B|X|R] bits. REX.W can be stored in DB as it's sometimes
+ // NOTE: REX.[B|X|R] are never stored within the opcode itself, they are reserved by AsmJit are are added
+ // dynamically to the opcode to represent [REX|VEX|EVEX].[B|X|R] bits. REX.W can be stored in DB as it's sometimes
// part of the opcode itself.
// These must be binary compatible with instruction options.
@@ -310,11 +280,9 @@ struct Opcode {
// `L` or `LL` field in AVX/XOP/AVX-512
// ------------------------------------
//
- // VEX/XOP prefix can only use the first bit `L.128` or `L.256`. EVEX prefix
- // prefix makes it possible to use also `L.512`.
- //
- // If the instruction set manual describes an instruction by `LIG` it means
- // that the `L` field is ignored and AsmJit defaults to `0` in such case.
+ // VEX/XOP prefix can only use the first bit `L.128` or `L.256`. EVEX prefix prefix makes it possible to use also
+ // `L.512`. If the instruction set manual describes an instruction by `LIG` it means that the `L` field is ignored
+ // and AsmJit defaults to `0` in such case.
kLL_Shift = 29,
kLL_Mask = 0x3u << kLL_Shift,
@@ -333,20 +301,31 @@ struct Opcode {
k000F00 = kPP_00 | kMM_0F, // '0F'
k000F01 = kPP_00 | kMM_0F01, // '0F01'
k000F0F = kPP_00 | kMM_0F, // '0F0F' - 3DNOW, equal to 0x0F, must have special encoding to take effect.
- k000F38 = kPP_00 | kMM_0F38, // '0F38'
- k000F3A = kPP_00 | kMM_0F3A, // '0F3A'
+ k000F38 = kPP_00 | kMM_0F38, // 'NP.0F38'
+ k000F3A = kPP_00 | kMM_0F3A, // 'NP.0F3A'
+ k00MAP5 = kPP_00 | kMM_MAP5, // 'NP.MAP5'
+ k00MAP6 = kPP_00 | kMM_MAP6, // 'NP.MAP5'
k660000 = kPP_66 | kMM_00, // '66'
- k660F00 = kPP_66 | kMM_0F, // '660F'
- k660F38 = kPP_66 | kMM_0F38, // '660F38'
- k660F3A = kPP_66 | kMM_0F3A, // '660F3A'
+ k660F00 = kPP_66 | kMM_0F, // '66.0F'
+ k660F01 = kPP_66 | kMM_0F01, // '66.0F01'
+ k660F38 = kPP_66 | kMM_0F38, // '66.0F38'
+ k660F3A = kPP_66 | kMM_0F3A, // '66.0F3A'
+ k66MAP5 = kPP_66 | kMM_MAP5, // '66.MAP5'
+ k66MAP6 = kPP_66 | kMM_MAP6, // '66.MAP5'
kF20000 = kPP_F2 | kMM_00, // 'F2'
- kF20F00 = kPP_F2 | kMM_0F, // 'F20F'
- kF20F38 = kPP_F2 | kMM_0F38, // 'F20F38'
- kF20F3A = kPP_F2 | kMM_0F3A, // 'F20F3A'
+ kF20F00 = kPP_F2 | kMM_0F, // 'F2.0F'
+ kF20F01 = kPP_F2 | kMM_0F01, // 'F2.0F01'
+ kF20F38 = kPP_F2 | kMM_0F38, // 'F2.0F38'
+ kF20F3A = kPP_F2 | kMM_0F3A, // 'F2.0F3A'
+ kF2MAP5 = kPP_F2 | kMM_MAP5, // 'F2.MAP5'
+ kF2MAP6 = kPP_F2 | kMM_MAP6, // 'F2.MAP5'
kF30000 = kPP_F3 | kMM_00, // 'F3'
- kF30F00 = kPP_F3 | kMM_0F, // 'F30F'
- kF30F38 = kPP_F3 | kMM_0F38, // 'F30F38'
- kF30F3A = kPP_F3 | kMM_0F3A, // 'F30F3A'
+ kF30F00 = kPP_F3 | kMM_0F, // 'F3.0F'
+ kF30F01 = kPP_F3 | kMM_0F01, // 'F3.0F01'
+ kF30F38 = kPP_F3 | kMM_0F38, // 'F3.0F38'
+ kF30F3A = kPP_F3 | kMM_0F3A, // 'F3.0F3A'
+ kF3MAP5 = kPP_F3 | kMM_MAP5, // 'F3.MAP5'
+ kF3MAP6 = kPP_F3 | kMM_MAP6, // 'F3.MAP5'
kFPU_00 = kPP_00 | kMM_00, // '__' (FPU)
kFPU_9B = kPP_9B | kMM_00, // '9B' (FPU)
kXOP_M8 = kPP_00 | kMM_XOP08, // 'M8' (XOP)
@@ -354,31 +333,30 @@ struct Opcode {
kXOP_MA = kPP_00 | kMM_XOP0A // 'MA' (XOP)
};
- // --------------------------------------------------------------------------
- // [Opcode Builder]
- // --------------------------------------------------------------------------
+ // Opcode Builder
+ // --------------
- ASMJIT_INLINE uint32_t get() const noexcept { return v; }
+ inline uint32_t get() const noexcept { return v; }
- ASMJIT_INLINE bool hasW() const noexcept { return (v & kW) != 0; }
- ASMJIT_INLINE bool has66h() const noexcept { return (v & kPP_66) != 0; }
+ inline bool hasW() const noexcept { return (v & kW) != 0; }
+ inline bool has66h() const noexcept { return (v & kPP_66) != 0; }
- ASMJIT_INLINE Opcode& add(uint32_t x) noexcept { return operator+=(x); }
+ inline Opcode& add(uint32_t x) noexcept { return operator+=(x); }
- ASMJIT_INLINE Opcode& add66h() noexcept { return operator|=(kPP_66); }
+ inline Opcode& add66h() noexcept { return operator|=(kPP_66); }
template<typename T>
- ASMJIT_INLINE Opcode& add66hIf(T exp) noexcept { return operator|=(uint32_t(exp) << kPP_Shift); }
+ inline Opcode& add66hIf(T exp) noexcept { return operator|=(uint32_t(exp) << kPP_Shift); }
template<typename T>
- ASMJIT_INLINE Opcode& add66hBySize(T size) noexcept { return add66hIf(size == 2); }
+ inline Opcode& add66hBySize(T size) noexcept { return add66hIf(size == 2); }
- ASMJIT_INLINE Opcode& addW() noexcept { return operator|=(kW); }
+ inline Opcode& addW() noexcept { return operator|=(kW); }
template<typename T>
- ASMJIT_INLINE Opcode& addWIf(T exp) noexcept { return operator|=(uint32_t(exp) << kW_Shift); }
+ inline Opcode& addWIf(T exp) noexcept { return operator|=(uint32_t(exp) << kW_Shift); }
template<typename T>
- ASMJIT_INLINE Opcode& addWBySize(T size) noexcept { return addWIf(size == 8); }
+ inline Opcode& addWBySize(T size) noexcept { return addWIf(size == 8); }
template<typename T>
- ASMJIT_INLINE Opcode& addPrefixBySize(T size) noexcept {
+ inline Opcode& addPrefixBySize(T size) noexcept {
static const uint32_t mask[16] = {
0, // #0
0, // #1 -> nothing (already handled or not possible)
@@ -394,7 +372,7 @@ struct Opcode {
}
template<typename T>
- ASMJIT_INLINE Opcode& addArithBySize(T size) noexcept {
+ inline Opcode& addArithBySize(T size) noexcept {
static const uint32_t mask[16] = {
0, // #0
0, // #1 -> nothing
@@ -409,37 +387,45 @@ struct Opcode {
return operator|=(mask[size & 0xF]);
}
- //! Extract `O` field from the opcode.
- ASMJIT_INLINE uint32_t extractO() const noexcept {
- return (v >> kO_Shift) & 0x07;
+ inline Opcode& forceEvex() noexcept { return operator|=(kMM_ForceEvex); }
+ template<typename T>
+ inline Opcode& forceEvexIf(T exp) noexcept { return operator|=(uint32_t(exp) << Support::ConstCTZ<uint32_t(kMM_ForceEvex)>::value); }
+
+ //! Extract `O` field (R) from the opcode (specified as /0..7 in instruction manuals).
+ inline uint32_t extractModO() const noexcept {
+ return (v >> kModO_Shift) & 0x07;
+ }
+
+ //! Extract `RM` field (RM) from the opcode (usually specified as another opcode value).
+ inline uint32_t extractModRM() const noexcept {
+ return (v >> kModRM_Shift) & 0x07;
}
//! Extract `REX` prefix from opcode combined with `options`.
- ASMJIT_INLINE uint32_t extractRex(uint32_t options) const noexcept {
- // kREX was designed in a way that when shifted there will be no bytes
- // set except REX.[B|X|R|W]. The returned value forms a real REX prefix byte.
- // This case should be unit-tested as well.
- return (v | options) >> kREX_Shift;
+ inline uint32_t extractRex(InstOptions options) const noexcept {
+ // kREX was designed in a way that when shifted there will be no bytes set except REX.[B|X|R|W].
+ // The returned value forms a real REX prefix byte. This case should be unit-tested as well.
+ return (v | uint32_t(options)) >> kREX_Shift;
}
- ASMJIT_INLINE uint32_t extractLLMM(uint32_t options) const noexcept {
- uint32_t x = v & (kLL_Mask | kMM_Mask);
- uint32_t y = options & (Inst::kOptionVex3 | Inst::kOptionEvex);
- return (x | y) >> kMM_Shift;
+ inline uint32_t extractLLMMMMM(InstOptions options) const noexcept {
+ uint32_t llMmmmm = uint32_t(v & (kLL_Mask | kMM_Mask));
+ uint32_t vexEvex = uint32_t(options & InstOptions::kX86_Evex);
+ return (llMmmmm | vexEvex) >> kMM_Shift;
}
- ASMJIT_INLINE Opcode& operator=(uint32_t x) noexcept { v = x; return *this; }
- ASMJIT_INLINE Opcode& operator+=(uint32_t x) noexcept { v += x; return *this; }
- ASMJIT_INLINE Opcode& operator-=(uint32_t x) noexcept { v -= x; return *this; }
- ASMJIT_INLINE Opcode& operator&=(uint32_t x) noexcept { v &= x; return *this; }
- ASMJIT_INLINE Opcode& operator|=(uint32_t x) noexcept { v |= x; return *this; }
- ASMJIT_INLINE Opcode& operator^=(uint32_t x) noexcept { v ^= x; return *this; }
-
- ASMJIT_INLINE uint32_t operator&(uint32_t x) const noexcept { return v & x; }
- ASMJIT_INLINE uint32_t operator|(uint32_t x) const noexcept { return v | x; }
- ASMJIT_INLINE uint32_t operator^(uint32_t x) const noexcept { return v ^ x; }
- ASMJIT_INLINE uint32_t operator<<(uint32_t x) const noexcept { return v << x; }
- ASMJIT_INLINE uint32_t operator>>(uint32_t x) const noexcept { return v >> x; }
+ inline Opcode& operator=(uint32_t x) noexcept { v = x; return *this; }
+ inline Opcode& operator+=(uint32_t x) noexcept { v += x; return *this; }
+ inline Opcode& operator-=(uint32_t x) noexcept { v -= x; return *this; }
+ inline Opcode& operator&=(uint32_t x) noexcept { v &= x; return *this; }
+ inline Opcode& operator|=(uint32_t x) noexcept { v |= x; return *this; }
+ inline Opcode& operator^=(uint32_t x) noexcept { v ^= x; return *this; }
+
+ inline uint32_t operator&(uint32_t x) const noexcept { return v & x; }
+ inline uint32_t operator|(uint32_t x) const noexcept { return v | x; }
+ inline uint32_t operator^(uint32_t x) const noexcept { return v ^ x; }
+ inline uint32_t operator<<(uint32_t x) const noexcept { return v << x; }
+ inline uint32_t operator>>(uint32_t x) const noexcept { return v >> x; }
};
//! \}
diff --git a/3rdparty/asmjit/src/asmjit/x86/x86operand.cpp b/3rdparty/asmjit/src/asmjit/x86/x86operand.cpp
index ca7ce5a8c66..a47fec2b5b2 100644
--- a/3rdparty/asmjit/src/asmjit/x86/x86operand.cpp
+++ b/3rdparty/asmjit/src/asmjit/x86/x86operand.cpp
@@ -1,60 +1,18 @@
-// AsmJit - Machine code generation for C++
+// This file is part of AsmJit project <https://asmjit.com>
//
-// * Official AsmJit Home Page: https://asmjit.com
-// * Official Github Repository: https://github.com/asmjit/asmjit
-//
-// Copyright (c) 2008-2020 The AsmJit Authors
-//
-// This software is provided 'as-is', without any express or implied
-// warranty. In no event will the authors be held liable for any damages
-// arising from the use of this software.
-//
-// Permission is granted to anyone to use this software for any purpose,
-// including commercial applications, and to alter it and redistribute it
-// freely, subject to the following restrictions:
-//
-// 1. The origin of this software must not be misrepresented; you must not
-// claim that you wrote the original software. If you use this software
-// in a product, an acknowledgment in the product documentation would be
-// appreciated but is not required.
-// 2. Altered source versions must be plainly marked as such, and must not be
-// misrepresented as being the original software.
-// 3. This notice may not be removed or altered from any source distribution.
+// See asmjit.h or LICENSE.md for license and copyright information
+// SPDX-License-Identifier: Zlib
#include "../core/api-build_p.h"
-#ifdef ASMJIT_BUILD_X86
+#if !defined(ASMJIT_NO_X86)
#include "../core/misc_p.h"
#include "../x86/x86operand.h"
ASMJIT_BEGIN_SUB_NAMESPACE(x86)
-// ============================================================================
-// [asmjit::x86::OpData]
-// ============================================================================
-
-const OpData opData = {
- {
- // RegInfo[]
- #define VALUE(X) { RegTraits<X>::kSignature }
- { ASMJIT_LOOKUP_TABLE_32(VALUE, 0) },
- #undef VALUE
-
- // RegCount[]
- #define VALUE(X) RegTraits<X>::kCount
- { ASMJIT_LOOKUP_TABLE_32(VALUE, 0) },
- #undef VALUE
-
- // RegTypeToTypeId[]
- #define VALUE(X) RegTraits<X>::kTypeId
- { ASMJIT_LOOKUP_TABLE_32(VALUE, 0) }
- #undef VALUE
- }
-};
-
-// ============================================================================
-// [asmjit::x86::Operand - Unit]
-// ============================================================================
+// x86::Operand - Tests
+// ====================
#if defined(ASMJIT_TEST)
UNIT(x86_operand) {
@@ -115,16 +73,16 @@ UNIT(x86_operand) {
EXPECT(eax.isReg() == true);
EXPECT(eax.id() == 0);
EXPECT(eax.size() == 4);
- EXPECT(eax.type() == Reg::kTypeGpd);
- EXPECT(eax.group() == Reg::kGroupGp);
+ EXPECT(eax.type() == RegType::kX86_Gpd);
+ EXPECT(eax.group() == RegGroup::kGp);
INFO("Checking x86::Xmm register properties");
EXPECT(Xmm().isReg() == true);
EXPECT(xmm4.isReg() == true);
EXPECT(xmm4.id() == 4);
EXPECT(xmm4.size() == 16);
- EXPECT(xmm4.type() == Reg::kTypeXmm);
- EXPECT(xmm4.group() == Reg::kGroupVec);
+ EXPECT(xmm4.type() == RegType::kX86_Xmm);
+ EXPECT(xmm4.group() == RegGroup::kVec);
EXPECT(xmm4.isVec());
INFO("Checking x86::Ymm register properties");
@@ -132,8 +90,8 @@ UNIT(x86_operand) {
EXPECT(ymm5.isReg() == true);
EXPECT(ymm5.id() == 5);
EXPECT(ymm5.size() == 32);
- EXPECT(ymm5.type() == Reg::kTypeYmm);
- EXPECT(ymm5.group() == Reg::kGroupVec);
+ EXPECT(ymm5.type() == RegType::kX86_Ymm);
+ EXPECT(ymm5.group() == RegGroup::kVec);
EXPECT(ymm5.isVec());
INFO("Checking x86::Zmm register properties");
@@ -141,8 +99,8 @@ UNIT(x86_operand) {
EXPECT(zmm6.isReg() == true);
EXPECT(zmm6.id() == 6);
EXPECT(zmm6.size() == 64);
- EXPECT(zmm6.type() == Reg::kTypeZmm);
- EXPECT(zmm6.group() == Reg::kGroupVec);
+ EXPECT(zmm6.type() == RegType::kX86_Zmm);
+ EXPECT(zmm6.group() == RegGroup::kVec);
EXPECT(zmm6.isVec());
INFO("Checking x86::Vec register properties");
@@ -167,29 +125,29 @@ UNIT(x86_operand) {
EXPECT(zmm7.ymm() == ymm7);
EXPECT(zmm7.zmm() == zmm7);
- INFO("Checking x86::FpMm register properties");
+ INFO("Checking x86::Mm register properties");
EXPECT(Mm().isReg() == true);
EXPECT(mm2.isReg() == true);
EXPECT(mm2.id() == 2);
EXPECT(mm2.size() == 8);
- EXPECT(mm2.type() == Reg::kTypeMm);
- EXPECT(mm2.group() == Reg::kGroupMm);
+ EXPECT(mm2.type() == RegType::kX86_Mm);
+ EXPECT(mm2.group() == RegGroup::kX86_MM);
INFO("Checking x86::KReg register properties");
EXPECT(KReg().isReg() == true);
EXPECT(k3.isReg() == true);
EXPECT(k3.id() == 3);
EXPECT(k3.size() == 0);
- EXPECT(k3.type() == Reg::kTypeKReg);
- EXPECT(k3.group() == Reg::kGroupKReg);
+ EXPECT(k3.type() == RegType::kX86_KReg);
+ EXPECT(k3.group() == RegGroup::kX86_K);
INFO("Checking x86::St register properties");
EXPECT(St().isReg() == true);
EXPECT(st1.isReg() == true);
EXPECT(st1.id() == 1);
EXPECT(st1.size() == 10);
- EXPECT(st1.type() == Reg::kTypeSt);
- EXPECT(st1.group() == Reg::kGroupSt);
+ EXPECT(st1.type() == RegType::kX86_St);
+ EXPECT(st1.group() == RegGroup::kX86_St);
INFO("Checking if default constructed regs behave as expected");
EXPECT(Reg().isValid() == false);
@@ -230,13 +188,15 @@ UNIT(x86_operand) {
m.addOffset(1);
EXPECT(m.offset() == int64_t(0x0123456789ABCDF0u));
- m = ptr(0x0123456789ABCDEFu, rdi, 4);
+ m = ptr(0x0123456789ABCDEFu, rdi, 3);
+ EXPECT(m.hasSegment() == false);
EXPECT(m.hasBase() == false);
EXPECT(m.hasBaseReg() == false);
EXPECT(m.hasIndex() == true);
EXPECT(m.hasIndexReg() == true);
EXPECT(m.indexType() == rdi.type());
EXPECT(m.indexId() == rdi.id());
+ EXPECT(m.shift() == 3);
EXPECT(m.hasOffset() == true);
EXPECT(m.isOffset64Bit() == true);
EXPECT(m.offset() == int64_t(0x0123456789ABCDEFu));
@@ -252,7 +212,7 @@ UNIT(x86_operand) {
EXPECT(m.baseId() == rax.id());
EXPECT(m.hasIndex() == false);
EXPECT(m.hasIndexReg() == false);
- EXPECT(m.indexType() == 0);
+ EXPECT(m.indexType() == RegType::kNone);
EXPECT(m.indexId() == 0);
EXPECT(m.hasOffset() == false);
EXPECT(m.isOffset64Bit() == false);
@@ -268,4 +228,4 @@ UNIT(x86_operand) {
ASMJIT_END_SUB_NAMESPACE
-#endif // ASMJIT_BUILD_X86
+#endif // !ASMJIT_NO_X86
diff --git a/3rdparty/asmjit/src/asmjit/x86/x86operand.h b/3rdparty/asmjit/src/asmjit/x86/x86operand.h
index ccbe87e9ea3..037d4af4ddf 100644
--- a/3rdparty/asmjit/src/asmjit/x86/x86operand.h
+++ b/3rdparty/asmjit/src/asmjit/x86/x86operand.h
@@ -1,92 +1,21 @@
-// AsmJit - Machine code generation for C++
+// This file is part of AsmJit project <https://asmjit.com>
//
-// * Official AsmJit Home Page: https://asmjit.com
-// * Official Github Repository: https://github.com/asmjit/asmjit
-//
-// Copyright (c) 2008-2020 The AsmJit Authors
-//
-// This software is provided 'as-is', without any express or implied
-// warranty. In no event will the authors be held liable for any damages
-// arising from the use of this software.
-//
-// Permission is granted to anyone to use this software for any purpose,
-// including commercial applications, and to alter it and redistribute it
-// freely, subject to the following restrictions:
-//
-// 1. The origin of this software must not be misrepresented; you must not
-// claim that you wrote the original software. If you use this software
-// in a product, an acknowledgment in the product documentation would be
-// appreciated but is not required.
-// 2. Altered source versions must be plainly marked as such, and must not be
-// misrepresented as being the original software.
-// 3. This notice may not be removed or altered from any source distribution.
+// See asmjit.h or LICENSE.md for license and copyright information
+// SPDX-License-Identifier: Zlib
#ifndef ASMJIT_X86_X86OPERAND_H_INCLUDED
#define ASMJIT_X86_X86OPERAND_H_INCLUDED
-#include "../core/arch.h"
+#include "../core/archtraits.h"
#include "../core/operand.h"
#include "../core/type.h"
#include "../x86/x86globals.h"
ASMJIT_BEGIN_SUB_NAMESPACE(x86)
-#define ASMJIT_MEM_PTR(FUNC, SIZE) \
- static constexpr Mem FUNC(const Gp& base, int32_t offset = 0) noexcept { \
- return Mem(base, offset, SIZE); \
- } \
- static constexpr Mem FUNC(const Gp& base, const Gp& index, uint32_t shift = 0, int32_t offset = 0) noexcept { \
- return Mem(base, index, shift, offset, SIZE); \
- } \
- static constexpr Mem FUNC(const Gp& base, const Vec& index, uint32_t shift = 0, int32_t offset = 0) noexcept { \
- return Mem(base, index, shift, offset, SIZE); \
- } \
- static constexpr Mem FUNC(const Label& base, int32_t offset = 0) noexcept { \
- return Mem(base, offset, SIZE); \
- } \
- static constexpr Mem FUNC(const Label& base, const Gp& index, uint32_t shift = 0, int32_t offset = 0) noexcept { \
- return Mem(base, index, shift, offset, SIZE); \
- } \
- static constexpr Mem FUNC(const Rip& rip_, int32_t offset = 0) noexcept { \
- return Mem(rip_, offset, SIZE); \
- } \
- static constexpr Mem FUNC(uint64_t base) noexcept { \
- return Mem(base, SIZE); \
- } \
- static constexpr Mem FUNC(uint64_t base, const Gp& index, uint32_t shift = 0) noexcept { \
- return Mem(base, index, shift, SIZE); \
- } \
- static constexpr Mem FUNC(uint64_t base, const Vec& index, uint32_t shift = 0) noexcept { \
- return Mem(base, index, shift, SIZE); \
- } \
- \
- static constexpr Mem FUNC##_abs(uint64_t base) noexcept { \
- return Mem(base, SIZE, BaseMem::kSignatureMemAbs); \
- } \
- static constexpr Mem FUNC##_abs(uint64_t base, const Gp& index, uint32_t shift = 0) noexcept { \
- return Mem(base, index, shift, SIZE, BaseMem::kSignatureMemAbs); \
- } \
- static constexpr Mem FUNC##_abs(uint64_t base, const Vec& index, uint32_t shift = 0) noexcept { \
- return Mem(base, index, shift, SIZE, BaseMem::kSignatureMemAbs); \
- } \
- \
- static constexpr Mem FUNC##_rel(uint64_t base) noexcept { \
- return Mem(base, SIZE, BaseMem::kSignatureMemRel); \
- } \
- static constexpr Mem FUNC##_rel(uint64_t base, const Gp& index, uint32_t shift = 0) noexcept { \
- return Mem(base, index, shift, SIZE, BaseMem::kSignatureMemRel); \
- } \
- static constexpr Mem FUNC##_rel(uint64_t base, const Vec& index, uint32_t shift = 0) noexcept { \
- return Mem(base, index, shift, SIZE, BaseMem::kSignatureMemRel); \
- }
-
//! \addtogroup asmjit_x86
//! \{
-// ============================================================================
-// [Forward Declarations]
-// ============================================================================
-
class Reg;
class Mem;
@@ -108,41 +37,38 @@ class CReg;
class DReg;
class St;
class Bnd;
+class Tmm;
class Rip;
-// ============================================================================
-// [asmjit::x86::Reg]
-// ============================================================================
-
//! Register traits (X86).
//!
-//! Register traits contains information about a particular register type. It's
-//! used by asmjit to setup register information on-the-fly and to populate
-//! tables that contain register information (this way it's possible to change
+//! Register traits contains information about a particular register type. It's used by asmjit to setup register
+//! information on-the-fly and to populate tables that contain register information (this way it's possible to change
//! register types and groups without having to reorder these tables).
-template<uint32_t REG_TYPE>
+template<RegType kRegType>
struct RegTraits : public BaseRegTraits {};
//! \cond
-// <--------------------+-----+-------------------------+------------------------+---+---+----------------+
-// | Reg | Reg-Type | Reg-Group |Sz |Cnt| TypeId |
-// <--------------------+-----+-------------------------+------------------------+---+---+----------------+
-ASMJIT_DEFINE_REG_TRAITS(GpbLo, BaseReg::kTypeGp8Lo , BaseReg::kGroupGp , 1 , 16, Type::kIdI8 );
-ASMJIT_DEFINE_REG_TRAITS(GpbHi, BaseReg::kTypeGp8Hi , BaseReg::kGroupGp , 1 , 4 , Type::kIdI8 );
-ASMJIT_DEFINE_REG_TRAITS(Gpw , BaseReg::kTypeGp16 , BaseReg::kGroupGp , 2 , 16, Type::kIdI16 );
-ASMJIT_DEFINE_REG_TRAITS(Gpd , BaseReg::kTypeGp32 , BaseReg::kGroupGp , 4 , 16, Type::kIdI32 );
-ASMJIT_DEFINE_REG_TRAITS(Gpq , BaseReg::kTypeGp64 , BaseReg::kGroupGp , 8 , 16, Type::kIdI64 );
-ASMJIT_DEFINE_REG_TRAITS(Xmm , BaseReg::kTypeVec128 , BaseReg::kGroupVec , 16, 32, Type::kIdI32x4 );
-ASMJIT_DEFINE_REG_TRAITS(Ymm , BaseReg::kTypeVec256 , BaseReg::kGroupVec , 32, 32, Type::kIdI32x8 );
-ASMJIT_DEFINE_REG_TRAITS(Zmm , BaseReg::kTypeVec512 , BaseReg::kGroupVec , 64, 32, Type::kIdI32x16);
-ASMJIT_DEFINE_REG_TRAITS(Mm , BaseReg::kTypeOther0 , BaseReg::kGroupOther0 , 8 , 8 , Type::kIdMmx64 );
-ASMJIT_DEFINE_REG_TRAITS(KReg , BaseReg::kTypeOther1 , BaseReg::kGroupOther1 , 0 , 8 , Type::kIdVoid );
-ASMJIT_DEFINE_REG_TRAITS(SReg , BaseReg::kTypeCustom + 0, BaseReg::kGroupVirt + 0, 2 , 7 , Type::kIdVoid );
-ASMJIT_DEFINE_REG_TRAITS(CReg , BaseReg::kTypeCustom + 1, BaseReg::kGroupVirt + 1, 0 , 16, Type::kIdVoid );
-ASMJIT_DEFINE_REG_TRAITS(DReg , BaseReg::kTypeCustom + 2, BaseReg::kGroupVirt + 2, 0 , 16, Type::kIdVoid );
-ASMJIT_DEFINE_REG_TRAITS(St , BaseReg::kTypeCustom + 3, BaseReg::kGroupVirt + 3, 10, 8 , Type::kIdF80 );
-ASMJIT_DEFINE_REG_TRAITS(Bnd , BaseReg::kTypeCustom + 4, BaseReg::kGroupVirt + 4, 16, 4 , Type::kIdVoid );
-ASMJIT_DEFINE_REG_TRAITS(Rip , BaseReg::kTypeIP , BaseReg::kGroupVirt + 5, 0 , 1 , Type::kIdVoid );
+// <--------------------+-----+-------------------------+------------------------+---+---+------------------+
+// | Reg | Reg-Type | Reg-Group |Sz |Cnt| TypeId |
+// <--------------------+-----+-------------------------+------------------------+---+---+------------------+
+ASMJIT_DEFINE_REG_TRAITS(Rip , RegType::kX86_Rip , RegGroup::kX86_Rip , 0 , 1 , TypeId::kVoid );
+ASMJIT_DEFINE_REG_TRAITS(GpbLo, RegType::kX86_GpbLo , RegGroup::kGp , 1 , 16, TypeId::kInt8 );
+ASMJIT_DEFINE_REG_TRAITS(GpbHi, RegType::kX86_GpbHi , RegGroup::kGp , 1 , 4 , TypeId::kInt8 );
+ASMJIT_DEFINE_REG_TRAITS(Gpw , RegType::kX86_Gpw , RegGroup::kGp , 2 , 16, TypeId::kInt16 );
+ASMJIT_DEFINE_REG_TRAITS(Gpd , RegType::kX86_Gpd , RegGroup::kGp , 4 , 16, TypeId::kInt32 );
+ASMJIT_DEFINE_REG_TRAITS(Gpq , RegType::kX86_Gpq , RegGroup::kGp , 8 , 16, TypeId::kInt64 );
+ASMJIT_DEFINE_REG_TRAITS(Xmm , RegType::kX86_Xmm , RegGroup::kVec , 16, 32, TypeId::kInt32x4 );
+ASMJIT_DEFINE_REG_TRAITS(Ymm , RegType::kX86_Ymm , RegGroup::kVec , 32, 32, TypeId::kInt32x8 );
+ASMJIT_DEFINE_REG_TRAITS(Zmm , RegType::kX86_Zmm , RegGroup::kVec , 64, 32, TypeId::kInt32x16);
+ASMJIT_DEFINE_REG_TRAITS(KReg , RegType::kX86_KReg , RegGroup::kX86_K , 0 , 8 , TypeId::kVoid );
+ASMJIT_DEFINE_REG_TRAITS(Mm , RegType::kX86_Mm , RegGroup::kX86_MM , 8 , 8 , TypeId::kMmx64 );
+ASMJIT_DEFINE_REG_TRAITS(SReg , RegType::kX86_SReg , RegGroup::kX86_SReg , 2 , 7 , TypeId::kVoid );
+ASMJIT_DEFINE_REG_TRAITS(CReg , RegType::kX86_CReg , RegGroup::kX86_CReg , 0 , 16, TypeId::kVoid );
+ASMJIT_DEFINE_REG_TRAITS(DReg , RegType::kX86_DReg , RegGroup::kX86_DReg , 0 , 16, TypeId::kVoid );
+ASMJIT_DEFINE_REG_TRAITS(St , RegType::kX86_St , RegGroup::kX86_St , 10, 8 , TypeId::kFloat80 );
+ASMJIT_DEFINE_REG_TRAITS(Bnd , RegType::kX86_Bnd , RegGroup::kX86_Bnd , 16, 4 , TypeId::kVoid );
+ASMJIT_DEFINE_REG_TRAITS(Tmm , RegType::kX86_Tmm , RegGroup::kX86_Tmm , 0 , 8 , TypeId::kVoid );
//! \endcond
//! Register (X86).
@@ -150,120 +76,84 @@ class Reg : public BaseReg {
public:
ASMJIT_DEFINE_ABSTRACT_REG(Reg, BaseReg)
- //! Register type.
- enum RegType : uint32_t {
- kTypeNone = BaseReg::kTypeNone, //!< No register type or invalid register.
- kTypeGpbLo = BaseReg::kTypeGp8Lo, //!< Low GPB register (AL, BL, CL, DL, ...).
- kTypeGpbHi = BaseReg::kTypeGp8Hi, //!< High GPB register (AH, BH, CH, DH only).
- kTypeGpw = BaseReg::kTypeGp16, //!< GPW register.
- kTypeGpd = BaseReg::kTypeGp32, //!< GPD register.
- kTypeGpq = BaseReg::kTypeGp64, //!< GPQ register (64-bit).
- kTypeXmm = BaseReg::kTypeVec128, //!< XMM register (SSE+).
- kTypeYmm = BaseReg::kTypeVec256, //!< YMM register (AVX+).
- kTypeZmm = BaseReg::kTypeVec512, //!< ZMM register (AVX512+).
- kTypeMm = BaseReg::kTypeOther0, //!< MMX register.
- kTypeKReg = BaseReg::kTypeOther1, //!< K register (AVX512+).
- kTypeSReg = BaseReg::kTypeCustom+0, //!< Segment register (None, ES, CS, SS, DS, FS, GS).
- kTypeCReg = BaseReg::kTypeCustom+1, //!< Control register (CR).
- kTypeDReg = BaseReg::kTypeCustom+2, //!< Debug register (DR).
- kTypeSt = BaseReg::kTypeCustom+3, //!< FPU (x87) register.
- kTypeBnd = BaseReg::kTypeCustom+4, //!< Bound register (BND).
- kTypeRip = BaseReg::kTypeIP, //!< Instruction pointer (EIP, RIP).
- kTypeCount = BaseReg::kTypeCustom+5 //!< Count of register types.
- };
-
- //! Register group.
- enum RegGroup : uint32_t {
- kGroupGp = BaseReg::kGroupGp, //!< GP register group or none (universal).
- kGroupVec = BaseReg::kGroupVec, //!< XMM|YMM|ZMM register group (universal).
- kGroupMm = BaseReg::kGroupOther0, //!< MMX register group (legacy).
- kGroupKReg = BaseReg::kGroupOther1, //!< K register group.
-
- // These are not managed by BaseCompiler nor used by Func-API:
- kGroupSReg = BaseReg::kGroupVirt+0, //!< Segment register group.
- kGroupCReg = BaseReg::kGroupVirt+1, //!< Control register group.
- kGroupDReg = BaseReg::kGroupVirt+2, //!< Debug register group.
- kGroupSt = BaseReg::kGroupVirt+3, //!< FPU register group.
- kGroupBnd = BaseReg::kGroupVirt+4, //!< Bound register group.
- kGroupRip = BaseReg::kGroupVirt+5, //!< Instrucion pointer (IP).
- kGroupCount //!< Count of all register groups.
- };
-
//! Tests whether the register is a GPB register (8-bit).
- constexpr bool isGpb() const noexcept { return size() == 1; }
+ inline constexpr bool isGpb() const noexcept { return size() == 1; }
//! Tests whether the register is a low GPB register (8-bit).
- constexpr bool isGpbLo() const noexcept { return hasSignature(RegTraits<kTypeGpbLo>::kSignature); }
+ inline constexpr bool isGpbLo() const noexcept { return hasBaseSignature(RegTraits<RegType::kX86_GpbLo>::kSignature); }
//! Tests whether the register is a high GPB register (8-bit).
- constexpr bool isGpbHi() const noexcept { return hasSignature(RegTraits<kTypeGpbHi>::kSignature); }
+ inline constexpr bool isGpbHi() const noexcept { return hasBaseSignature(RegTraits<RegType::kX86_GpbHi>::kSignature); }
//! Tests whether the register is a GPW register (16-bit).
- constexpr bool isGpw() const noexcept { return hasSignature(RegTraits<kTypeGpw>::kSignature); }
+ inline constexpr bool isGpw() const noexcept { return hasBaseSignature(RegTraits<RegType::kX86_Gpw>::kSignature); }
//! Tests whether the register is a GPD register (32-bit).
- constexpr bool isGpd() const noexcept { return hasSignature(RegTraits<kTypeGpd>::kSignature); }
+ inline constexpr bool isGpd() const noexcept { return hasBaseSignature(RegTraits<RegType::kX86_Gpd>::kSignature); }
//! Tests whether the register is a GPQ register (64-bit).
- constexpr bool isGpq() const noexcept { return hasSignature(RegTraits<kTypeGpq>::kSignature); }
+ inline constexpr bool isGpq() const noexcept { return hasBaseSignature(RegTraits<RegType::kX86_Gpq>::kSignature); }
//! Tests whether the register is an XMM register (128-bit).
- constexpr bool isXmm() const noexcept { return hasSignature(RegTraits<kTypeXmm>::kSignature); }
+ inline constexpr bool isXmm() const noexcept { return hasBaseSignature(RegTraits<RegType::kX86_Xmm>::kSignature); }
//! Tests whether the register is a YMM register (256-bit).
- constexpr bool isYmm() const noexcept { return hasSignature(RegTraits<kTypeYmm>::kSignature); }
+ inline constexpr bool isYmm() const noexcept { return hasBaseSignature(RegTraits<RegType::kX86_Ymm>::kSignature); }
//! Tests whether the register is a ZMM register (512-bit).
- constexpr bool isZmm() const noexcept { return hasSignature(RegTraits<kTypeZmm>::kSignature); }
+ inline constexpr bool isZmm() const noexcept { return hasBaseSignature(RegTraits<RegType::kX86_Zmm>::kSignature); }
//! Tests whether the register is an MMX register (64-bit).
- constexpr bool isMm() const noexcept { return hasSignature(RegTraits<kTypeMm>::kSignature); }
+ inline constexpr bool isMm() const noexcept { return hasBaseSignature(RegTraits<RegType::kX86_Mm>::kSignature); }
//! Tests whether the register is a K register (64-bit).
- constexpr bool isKReg() const noexcept { return hasSignature(RegTraits<kTypeKReg>::kSignature); }
+ inline constexpr bool isKReg() const noexcept { return hasBaseSignature(RegTraits<RegType::kX86_KReg>::kSignature); }
//! Tests whether the register is a segment register.
- constexpr bool isSReg() const noexcept { return hasSignature(RegTraits<kTypeSReg>::kSignature); }
+ inline constexpr bool isSReg() const noexcept { return hasBaseSignature(RegTraits<RegType::kX86_SReg>::kSignature); }
//! Tests whether the register is a control register.
- constexpr bool isCReg() const noexcept { return hasSignature(RegTraits<kTypeCReg>::kSignature); }
+ inline constexpr bool isCReg() const noexcept { return hasBaseSignature(RegTraits<RegType::kX86_CReg>::kSignature); }
//! Tests whether the register is a debug register.
- constexpr bool isDReg() const noexcept { return hasSignature(RegTraits<kTypeDReg>::kSignature); }
+ inline constexpr bool isDReg() const noexcept { return hasBaseSignature(RegTraits<RegType::kX86_DReg>::kSignature); }
//! Tests whether the register is an FPU register (80-bit).
- constexpr bool isSt() const noexcept { return hasSignature(RegTraits<kTypeSt>::kSignature); }
+ inline constexpr bool isSt() const noexcept { return hasBaseSignature(RegTraits<RegType::kX86_St>::kSignature); }
//! Tests whether the register is a bound register.
- constexpr bool isBnd() const noexcept { return hasSignature(RegTraits<kTypeBnd>::kSignature); }
+ inline constexpr bool isBnd() const noexcept { return hasBaseSignature(RegTraits<RegType::kX86_Bnd>::kSignature); }
+ //! Tests whether the register is a TMM register.
+ inline constexpr bool isTmm() const noexcept { return hasBaseSignature(RegTraits<RegType::kX86_Tmm>::kSignature); }
//! Tests whether the register is RIP.
- constexpr bool isRip() const noexcept { return hasSignature(RegTraits<kTypeRip>::kSignature); }
+ inline constexpr bool isRip() const noexcept { return hasBaseSignature(RegTraits<RegType::kX86_Rip>::kSignature); }
- template<uint32_t REG_TYPE>
+ template<RegType REG_TYPE>
inline void setRegT(uint32_t rId) noexcept {
- setSignature(RegTraits<REG_TYPE>::kSignature);
+ setSignature(OperandSignature{RegTraits<REG_TYPE>::kSignature});
setId(rId);
}
- inline void setTypeAndId(uint32_t rType, uint32_t rId) noexcept {
- ASMJIT_ASSERT(rType < kTypeCount);
- setSignature(signatureOf(rType));
- setId(rId);
+ inline void setTypeAndId(RegType type, uint32_t id) noexcept {
+ setSignature(signatureOf(type));
+ setId(id);
}
- static inline uint32_t groupOf(uint32_t rType) noexcept;
- template<uint32_t REG_TYPE>
- static inline uint32_t groupOfT() noexcept { return RegTraits<REG_TYPE>::kGroup; }
+ static inline RegGroup groupOf(RegType type) noexcept { return ArchTraits::byArch(Arch::kX86).regTypeToGroup(type); }
+ static inline TypeId typeIdOf(RegType type) noexcept { return ArchTraits::byArch(Arch::kX86).regTypeToTypeId(type); }
+ static inline OperandSignature signatureOf(RegType type) noexcept { return ArchTraits::byArch(Arch::kX86).regTypeToSignature(type); }
+
+ template<RegType REG_TYPE>
+ static inline RegGroup groupOfT() noexcept { return RegGroup(RegTraits<REG_TYPE>::kGroup); }
- static inline uint32_t typeIdOf(uint32_t rType) noexcept;
- template<uint32_t REG_TYPE>
- static inline uint32_t typeIdOfT() noexcept { return RegTraits<REG_TYPE>::kTypeId; }
+ template<RegType REG_TYPE>
+ static inline TypeId typeIdOfT() noexcept { return TypeId(RegTraits<REG_TYPE>::kTypeId); }
- static inline uint32_t signatureOf(uint32_t rType) noexcept;
- template<uint32_t REG_TYPE>
- static inline uint32_t signatureOfT() noexcept { return RegTraits<REG_TYPE>::kSignature; }
+ template<RegType REG_TYPE>
+ static inline OperandSignature signatureOfT() noexcept { return OperandSignature{RegTraits<REG_TYPE>::kSignature}; }
- static inline uint32_t signatureOfVecByType(uint32_t typeId) noexcept {
- return typeId <= Type::_kIdVec128End ? RegTraits<kTypeXmm>::kSignature :
- typeId <= Type::_kIdVec256End ? RegTraits<kTypeYmm>::kSignature : RegTraits<kTypeZmm>::kSignature;
+ static inline OperandSignature signatureOfVecByType(TypeId typeId) noexcept {
+ return OperandSignature{typeId <= TypeId::_kVec128End ? uint32_t(RegTraits<RegType::kX86_Xmm>::kSignature) :
+ typeId <= TypeId::_kVec256End ? uint32_t(RegTraits<RegType::kX86_Ymm>::kSignature) :
+ uint32_t(RegTraits<RegType::kX86_Zmm>::kSignature)};
}
- static inline uint32_t signatureOfVecBySize(uint32_t size) noexcept {
- return size <= 16 ? RegTraits<kTypeXmm>::kSignature :
- size <= 32 ? RegTraits<kTypeYmm>::kSignature : RegTraits<kTypeZmm>::kSignature;
+ static inline OperandSignature signatureOfVecBySize(uint32_t size) noexcept {
+ return OperandSignature{size <= 16 ? uint32_t(RegTraits<RegType::kX86_Xmm>::kSignature) :
+ size <= 32 ? uint32_t(RegTraits<RegType::kX86_Ymm>::kSignature) :
+ uint32_t(RegTraits<RegType::kX86_Zmm>::kSignature)};
}
//! Tests whether the `op` operand is either a low or high 8-bit GPB register.
static inline bool isGpb(const Operand_& op) noexcept {
// Check operand type, register group, and size. Not interested in register type.
- const uint32_t kSgn = (Operand::kOpReg << kSignatureOpShift ) |
- (1 << kSignatureSizeShift) ;
- return (op.signature() & (kSignatureOpMask | kSignatureSizeMask)) == kSgn;
+ return op.signature().subset(Signature::kOpTypeMask | Signature::kRegGroupMask | Signature::kSizeMask) ==
+ (Signature::fromOpType(OperandType::kReg) | Signature::fromRegGroup(RegGroup::kGp) | Signature::fromSize(1));
}
static inline bool isGpbLo(const Operand_& op) noexcept { return op.as<Reg>().isGpbLo(); }
@@ -281,6 +171,7 @@ public:
static inline bool isDReg(const Operand_& op) noexcept { return op.as<Reg>().isDReg(); }
static inline bool isSt(const Operand_& op) noexcept { return op.as<Reg>().isSt(); }
static inline bool isBnd(const Operand_& op) noexcept { return op.as<Reg>().isBnd(); }
+ static inline bool isTmm(const Operand_& op) noexcept { return op.as<Reg>().isTmm(); }
static inline bool isRip(const Operand_& op) noexcept { return op.as<Reg>().isRip(); }
static inline bool isGpb(const Operand_& op, uint32_t rId) noexcept { return isGpb(op) & (op.id() == rId); }
@@ -299,6 +190,7 @@ public:
static inline bool isDReg(const Operand_& op, uint32_t rId) noexcept { return isDReg(op) & (op.id() == rId); }
static inline bool isSt(const Operand_& op, uint32_t rId) noexcept { return isSt(op) & (op.id() == rId); }
static inline bool isBnd(const Operand_& op, uint32_t rId) noexcept { return isBnd(op) & (op.id() == rId); }
+ static inline bool isTmm(const Operand_& op, uint32_t rId) noexcept { return isTmm(op) & (op.id() == rId); }
static inline bool isRip(const Operand_& op, uint32_t rId) noexcept { return isRip(op) & (op.id() == rId); }
};
@@ -309,9 +201,8 @@ public:
//! Physical id (X86).
//!
- //! \note Register indexes have been reduced to only support general purpose
- //! registers. There is no need to have enumerations with number suffix that
- //! expands to the exactly same value as the suffix value itself.
+ //! \note Register indexes have been reduced to only support general purpose registers. There is no need to
+ //! have enumerations with number suffix that expands to the exactly same value as the suffix value itself.
enum Id : uint32_t {
kIdAx = 0, //!< Physical id of AL|AH|AX|EAX|RAX registers.
kIdCx = 1, //!< Physical id of CL|CH|CX|ECX|RCX registers.
@@ -358,31 +249,36 @@ class Vec : public Reg {
//! Casts this register to a register that has half the size (or XMM if it's already XMM).
inline Vec half() const noexcept {
- return Vec(type() == kTypeZmm ? signatureOf(kTypeYmm) : signatureOf(kTypeXmm), id());
+ return Vec(type() == RegType::kX86_Zmm ? signatureOfT<RegType::kX86_Ymm>() : signatureOfT<RegType::kX86_Xmm>(), id());
}
};
//! Segment register (X86).
class SReg : public Reg {
- ASMJIT_DEFINE_FINAL_REG(SReg, Reg, RegTraits<kTypeSReg>)
+ ASMJIT_DEFINE_FINAL_REG(SReg, Reg, RegTraits<RegType::kX86_SReg>)
//! X86 segment id.
enum Id : uint32_t {
- kIdNone = 0, //!< No segment (default).
- kIdEs = 1, //!< ES segment.
- kIdCs = 2, //!< CS segment.
- kIdSs = 3, //!< SS segment.
- kIdDs = 4, //!< DS segment.
- kIdFs = 5, //!< FS segment.
- kIdGs = 6, //!< GS segment.
-
- //! Count of segment registers supported by AsmJit.
+ //! No segment (default).
+ kIdNone = 0,
+ //! ES segment.
+ kIdEs = 1,
+ //! CS segment.
+ kIdCs = 2,
+ //! SS segment.
+ kIdSs = 3,
+ //! DS segment.
+ kIdDs = 4,
+ //! FS segment.
+ kIdFs = 5,
+ //! GS segment.
+ kIdGs = 6,
+
+ //! Count of X86 segment registers supported by AsmJit.
//!
- //! \note X86 architecture has 6 segment registers - ES, CS, SS, DS, FS, GS.
- //! X64 architecture lowers them down to just FS and GS. AsmJit supports 7
- //! segment registers - all addressable in both and X64 modes and one
- //! extra called `SReg::kIdNone`, which is AsmJit specific and means that
- //! there is no segment register specified.
+ //! \note X86 architecture has 6 segment registers - ES, CS, SS, DS, FS, GS. X64 architecture lowers them down to
+ //! just FS and GS. AsmJit supports 7 segment registers - all addressable in both X86 and X64 modes and one extra
+ //! called `SReg::kIdNone`, which is AsmJit specific and means that there is no segment register specified.
kIdCount = 7
};
};
@@ -390,51 +286,53 @@ class SReg : public Reg {
//! GPB low or high register (X86).
class Gpb : public Gp { ASMJIT_DEFINE_ABSTRACT_REG(Gpb, Gp) };
//! GPB low register (X86).
-class GpbLo : public Gpb { ASMJIT_DEFINE_FINAL_REG(GpbLo, Gpb, RegTraits<kTypeGpbLo>) };
+class GpbLo : public Gpb { ASMJIT_DEFINE_FINAL_REG(GpbLo, Gpb, RegTraits<RegType::kX86_GpbLo>) };
//! GPB high register (X86).
-class GpbHi : public Gpb { ASMJIT_DEFINE_FINAL_REG(GpbHi, Gpb, RegTraits<kTypeGpbHi>) };
+class GpbHi : public Gpb { ASMJIT_DEFINE_FINAL_REG(GpbHi, Gpb, RegTraits<RegType::kX86_GpbHi>) };
//! GPW register (X86).
-class Gpw : public Gp { ASMJIT_DEFINE_FINAL_REG(Gpw, Gp, RegTraits<kTypeGpw>) };
+class Gpw : public Gp { ASMJIT_DEFINE_FINAL_REG(Gpw, Gp, RegTraits<RegType::kX86_Gpw>) };
//! GPD register (X86).
-class Gpd : public Gp { ASMJIT_DEFINE_FINAL_REG(Gpd, Gp, RegTraits<kTypeGpd>) };
+class Gpd : public Gp { ASMJIT_DEFINE_FINAL_REG(Gpd, Gp, RegTraits<RegType::kX86_Gpd>) };
//! GPQ register (X86_64).
-class Gpq : public Gp { ASMJIT_DEFINE_FINAL_REG(Gpq, Gp, RegTraits<kTypeGpq>) };
+class Gpq : public Gp { ASMJIT_DEFINE_FINAL_REG(Gpq, Gp, RegTraits<RegType::kX86_Gpq>) };
//! 128-bit XMM register (SSE+).
class Xmm : public Vec {
- ASMJIT_DEFINE_FINAL_REG(Xmm, Vec, RegTraits<kTypeXmm>)
+ ASMJIT_DEFINE_FINAL_REG(Xmm, Vec, RegTraits<RegType::kX86_Xmm>)
//! Casts this register to a register that has half the size (XMM).
inline Xmm half() const noexcept { return Xmm(id()); }
};
//! 256-bit YMM register (AVX+).
class Ymm : public Vec {
- ASMJIT_DEFINE_FINAL_REG(Ymm, Vec, RegTraits<kTypeYmm>)
+ ASMJIT_DEFINE_FINAL_REG(Ymm, Vec, RegTraits<RegType::kX86_Ymm>)
//! Casts this register to a register that has half the size (XMM).
inline Xmm half() const noexcept { return Xmm(id()); }
};
//! 512-bit ZMM register (AVX512+).
class Zmm : public Vec {
- ASMJIT_DEFINE_FINAL_REG(Zmm, Vec, RegTraits<kTypeZmm>)
+ ASMJIT_DEFINE_FINAL_REG(Zmm, Vec, RegTraits<RegType::kX86_Zmm>)
//! Casts this register to a register that has half the size (YMM).
inline Ymm half() const noexcept { return Ymm(id()); }
};
//! 64-bit MMX register (MMX+).
-class Mm : public Reg { ASMJIT_DEFINE_FINAL_REG(Mm, Reg, RegTraits<kTypeMm>) };
+class Mm : public Reg { ASMJIT_DEFINE_FINAL_REG(Mm, Reg, RegTraits<RegType::kX86_Mm>) };
//! 64-bit K register (AVX512+).
-class KReg : public Reg { ASMJIT_DEFINE_FINAL_REG(KReg, Reg, RegTraits<kTypeKReg>) };
+class KReg : public Reg { ASMJIT_DEFINE_FINAL_REG(KReg, Reg, RegTraits<RegType::kX86_KReg>) };
//! 32-bit or 64-bit control register (X86).
-class CReg : public Reg { ASMJIT_DEFINE_FINAL_REG(CReg, Reg, RegTraits<kTypeCReg>) };
+class CReg : public Reg { ASMJIT_DEFINE_FINAL_REG(CReg, Reg, RegTraits<RegType::kX86_CReg>) };
//! 32-bit or 64-bit debug register (X86).
-class DReg : public Reg { ASMJIT_DEFINE_FINAL_REG(DReg, Reg, RegTraits<kTypeDReg>) };
+class DReg : public Reg { ASMJIT_DEFINE_FINAL_REG(DReg, Reg, RegTraits<RegType::kX86_DReg>) };
//! 80-bit FPU register (X86).
-class St : public Reg { ASMJIT_DEFINE_FINAL_REG(St, Reg, RegTraits<kTypeSt>) };
+class St : public Reg { ASMJIT_DEFINE_FINAL_REG(St, Reg, RegTraits<RegType::kX86_St>) };
//! 128-bit BND register (BND+).
-class Bnd : public Reg { ASMJIT_DEFINE_FINAL_REG(Bnd, Reg, RegTraits<kTypeBnd>) };
+class Bnd : public Reg { ASMJIT_DEFINE_FINAL_REG(Bnd, Reg, RegTraits<RegType::kX86_Bnd>) };
+//! 8192-bit TMM register (AMX).
+class Tmm : public Reg { ASMJIT_DEFINE_FINAL_REG(Tmm, Reg, RegTraits<RegType::kX86_Tmm>) };
//! RIP register (X86).
-class Rip : public Reg { ASMJIT_DEFINE_FINAL_REG(Rip, Reg, RegTraits<kTypeRip>) };
+class Rip : public Reg { ASMJIT_DEFINE_FINAL_REG(Rip, Reg, RegTraits<RegType::kX86_Rip>) };
//! \cond
inline GpbLo Gp::r8() const noexcept { return GpbLo(id()); }
@@ -489,79 +387,81 @@ static constexpr DReg dr(uint32_t rId) noexcept { return DReg(rId); }
static constexpr St st(uint32_t rId) noexcept { return St(rId); }
//! Creates a 128-bit bound register operand.
static constexpr Bnd bnd(uint32_t rId) noexcept { return Bnd(rId); }
-
-static constexpr Gp al = Gp(GpbLo::kSignature, Gp::kIdAx);
-static constexpr Gp bl = Gp(GpbLo::kSignature, Gp::kIdBx);
-static constexpr Gp cl = Gp(GpbLo::kSignature, Gp::kIdCx);
-static constexpr Gp dl = Gp(GpbLo::kSignature, Gp::kIdDx);
-static constexpr Gp spl = Gp(GpbLo::kSignature, Gp::kIdSp);
-static constexpr Gp bpl = Gp(GpbLo::kSignature, Gp::kIdBp);
-static constexpr Gp sil = Gp(GpbLo::kSignature, Gp::kIdSi);
-static constexpr Gp dil = Gp(GpbLo::kSignature, Gp::kIdDi);
-static constexpr Gp r8b = Gp(GpbLo::kSignature, Gp::kIdR8);
-static constexpr Gp r9b = Gp(GpbLo::kSignature, Gp::kIdR9);
-static constexpr Gp r10b = Gp(GpbLo::kSignature, Gp::kIdR10);
-static constexpr Gp r11b = Gp(GpbLo::kSignature, Gp::kIdR11);
-static constexpr Gp r12b = Gp(GpbLo::kSignature, Gp::kIdR12);
-static constexpr Gp r13b = Gp(GpbLo::kSignature, Gp::kIdR13);
-static constexpr Gp r14b = Gp(GpbLo::kSignature, Gp::kIdR14);
-static constexpr Gp r15b = Gp(GpbLo::kSignature, Gp::kIdR15);
-
-static constexpr Gp ah = Gp(GpbHi::kSignature, Gp::kIdAx);
-static constexpr Gp bh = Gp(GpbHi::kSignature, Gp::kIdBx);
-static constexpr Gp ch = Gp(GpbHi::kSignature, Gp::kIdCx);
-static constexpr Gp dh = Gp(GpbHi::kSignature, Gp::kIdDx);
-
-static constexpr Gp ax = Gp(Gpw::kSignature, Gp::kIdAx);
-static constexpr Gp bx = Gp(Gpw::kSignature, Gp::kIdBx);
-static constexpr Gp cx = Gp(Gpw::kSignature, Gp::kIdCx);
-static constexpr Gp dx = Gp(Gpw::kSignature, Gp::kIdDx);
-static constexpr Gp sp = Gp(Gpw::kSignature, Gp::kIdSp);
-static constexpr Gp bp = Gp(Gpw::kSignature, Gp::kIdBp);
-static constexpr Gp si = Gp(Gpw::kSignature, Gp::kIdSi);
-static constexpr Gp di = Gp(Gpw::kSignature, Gp::kIdDi);
-static constexpr Gp r8w = Gp(Gpw::kSignature, Gp::kIdR8);
-static constexpr Gp r9w = Gp(Gpw::kSignature, Gp::kIdR9);
-static constexpr Gp r10w = Gp(Gpw::kSignature, Gp::kIdR10);
-static constexpr Gp r11w = Gp(Gpw::kSignature, Gp::kIdR11);
-static constexpr Gp r12w = Gp(Gpw::kSignature, Gp::kIdR12);
-static constexpr Gp r13w = Gp(Gpw::kSignature, Gp::kIdR13);
-static constexpr Gp r14w = Gp(Gpw::kSignature, Gp::kIdR14);
-static constexpr Gp r15w = Gp(Gpw::kSignature, Gp::kIdR15);
-
-static constexpr Gp eax = Gp(Gpd::kSignature, Gp::kIdAx);
-static constexpr Gp ebx = Gp(Gpd::kSignature, Gp::kIdBx);
-static constexpr Gp ecx = Gp(Gpd::kSignature, Gp::kIdCx);
-static constexpr Gp edx = Gp(Gpd::kSignature, Gp::kIdDx);
-static constexpr Gp esp = Gp(Gpd::kSignature, Gp::kIdSp);
-static constexpr Gp ebp = Gp(Gpd::kSignature, Gp::kIdBp);
-static constexpr Gp esi = Gp(Gpd::kSignature, Gp::kIdSi);
-static constexpr Gp edi = Gp(Gpd::kSignature, Gp::kIdDi);
-static constexpr Gp r8d = Gp(Gpd::kSignature, Gp::kIdR8);
-static constexpr Gp r9d = Gp(Gpd::kSignature, Gp::kIdR9);
-static constexpr Gp r10d = Gp(Gpd::kSignature, Gp::kIdR10);
-static constexpr Gp r11d = Gp(Gpd::kSignature, Gp::kIdR11);
-static constexpr Gp r12d = Gp(Gpd::kSignature, Gp::kIdR12);
-static constexpr Gp r13d = Gp(Gpd::kSignature, Gp::kIdR13);
-static constexpr Gp r14d = Gp(Gpd::kSignature, Gp::kIdR14);
-static constexpr Gp r15d = Gp(Gpd::kSignature, Gp::kIdR15);
-
-static constexpr Gp rax = Gp(Gpq::kSignature, Gp::kIdAx);
-static constexpr Gp rbx = Gp(Gpq::kSignature, Gp::kIdBx);
-static constexpr Gp rcx = Gp(Gpq::kSignature, Gp::kIdCx);
-static constexpr Gp rdx = Gp(Gpq::kSignature, Gp::kIdDx);
-static constexpr Gp rsp = Gp(Gpq::kSignature, Gp::kIdSp);
-static constexpr Gp rbp = Gp(Gpq::kSignature, Gp::kIdBp);
-static constexpr Gp rsi = Gp(Gpq::kSignature, Gp::kIdSi);
-static constexpr Gp rdi = Gp(Gpq::kSignature, Gp::kIdDi);
-static constexpr Gp r8 = Gp(Gpq::kSignature, Gp::kIdR8);
-static constexpr Gp r9 = Gp(Gpq::kSignature, Gp::kIdR9);
-static constexpr Gp r10 = Gp(Gpq::kSignature, Gp::kIdR10);
-static constexpr Gp r11 = Gp(Gpq::kSignature, Gp::kIdR11);
-static constexpr Gp r12 = Gp(Gpq::kSignature, Gp::kIdR12);
-static constexpr Gp r13 = Gp(Gpq::kSignature, Gp::kIdR13);
-static constexpr Gp r14 = Gp(Gpq::kSignature, Gp::kIdR14);
-static constexpr Gp r15 = Gp(Gpq::kSignature, Gp::kIdR15);
+//! Creates a TMM register operand.
+static constexpr Tmm tmm(uint32_t rId) noexcept { return Tmm(rId); }
+
+static constexpr GpbLo al = GpbLo(Gp::kIdAx);
+static constexpr GpbLo bl = GpbLo(Gp::kIdBx);
+static constexpr GpbLo cl = GpbLo(Gp::kIdCx);
+static constexpr GpbLo dl = GpbLo(Gp::kIdDx);
+static constexpr GpbLo spl = GpbLo(Gp::kIdSp);
+static constexpr GpbLo bpl = GpbLo(Gp::kIdBp);
+static constexpr GpbLo sil = GpbLo(Gp::kIdSi);
+static constexpr GpbLo dil = GpbLo(Gp::kIdDi);
+static constexpr GpbLo r8b = GpbLo(Gp::kIdR8);
+static constexpr GpbLo r9b = GpbLo(Gp::kIdR9);
+static constexpr GpbLo r10b = GpbLo(Gp::kIdR10);
+static constexpr GpbLo r11b = GpbLo(Gp::kIdR11);
+static constexpr GpbLo r12b = GpbLo(Gp::kIdR12);
+static constexpr GpbLo r13b = GpbLo(Gp::kIdR13);
+static constexpr GpbLo r14b = GpbLo(Gp::kIdR14);
+static constexpr GpbLo r15b = GpbLo(Gp::kIdR15);
+
+static constexpr GpbHi ah = GpbHi(Gp::kIdAx);
+static constexpr GpbHi bh = GpbHi(Gp::kIdBx);
+static constexpr GpbHi ch = GpbHi(Gp::kIdCx);
+static constexpr GpbHi dh = GpbHi(Gp::kIdDx);
+
+static constexpr Gpw ax = Gpw(Gp::kIdAx);
+static constexpr Gpw bx = Gpw(Gp::kIdBx);
+static constexpr Gpw cx = Gpw(Gp::kIdCx);
+static constexpr Gpw dx = Gpw(Gp::kIdDx);
+static constexpr Gpw sp = Gpw(Gp::kIdSp);
+static constexpr Gpw bp = Gpw(Gp::kIdBp);
+static constexpr Gpw si = Gpw(Gp::kIdSi);
+static constexpr Gpw di = Gpw(Gp::kIdDi);
+static constexpr Gpw r8w = Gpw(Gp::kIdR8);
+static constexpr Gpw r9w = Gpw(Gp::kIdR9);
+static constexpr Gpw r10w = Gpw(Gp::kIdR10);
+static constexpr Gpw r11w = Gpw(Gp::kIdR11);
+static constexpr Gpw r12w = Gpw(Gp::kIdR12);
+static constexpr Gpw r13w = Gpw(Gp::kIdR13);
+static constexpr Gpw r14w = Gpw(Gp::kIdR14);
+static constexpr Gpw r15w = Gpw(Gp::kIdR15);
+
+static constexpr Gpd eax = Gpd(Gp::kIdAx);
+static constexpr Gpd ebx = Gpd(Gp::kIdBx);
+static constexpr Gpd ecx = Gpd(Gp::kIdCx);
+static constexpr Gpd edx = Gpd(Gp::kIdDx);
+static constexpr Gpd esp = Gpd(Gp::kIdSp);
+static constexpr Gpd ebp = Gpd(Gp::kIdBp);
+static constexpr Gpd esi = Gpd(Gp::kIdSi);
+static constexpr Gpd edi = Gpd(Gp::kIdDi);
+static constexpr Gpd r8d = Gpd(Gp::kIdR8);
+static constexpr Gpd r9d = Gpd(Gp::kIdR9);
+static constexpr Gpd r10d = Gpd(Gp::kIdR10);
+static constexpr Gpd r11d = Gpd(Gp::kIdR11);
+static constexpr Gpd r12d = Gpd(Gp::kIdR12);
+static constexpr Gpd r13d = Gpd(Gp::kIdR13);
+static constexpr Gpd r14d = Gpd(Gp::kIdR14);
+static constexpr Gpd r15d = Gpd(Gp::kIdR15);
+
+static constexpr Gpq rax = Gpq(Gp::kIdAx);
+static constexpr Gpq rbx = Gpq(Gp::kIdBx);
+static constexpr Gpq rcx = Gpq(Gp::kIdCx);
+static constexpr Gpq rdx = Gpq(Gp::kIdDx);
+static constexpr Gpq rsp = Gpq(Gp::kIdSp);
+static constexpr Gpq rbp = Gpq(Gp::kIdBp);
+static constexpr Gpq rsi = Gpq(Gp::kIdSi);
+static constexpr Gpq rdi = Gpq(Gp::kIdDi);
+static constexpr Gpq r8 = Gpq(Gp::kIdR8);
+static constexpr Gpq r9 = Gpq(Gp::kIdR9);
+static constexpr Gpq r10 = Gpq(Gp::kIdR10);
+static constexpr Gpq r11 = Gpq(Gp::kIdR11);
+static constexpr Gpq r12 = Gpq(Gp::kIdR12);
+static constexpr Gpq r13 = Gpq(Gp::kIdR13);
+static constexpr Gpq r14 = Gpq(Gp::kIdR14);
+static constexpr Gpq r15 = Gpq(Gp::kIdR15);
static constexpr Xmm xmm0 = Xmm(0);
static constexpr Xmm xmm1 = Xmm(1);
@@ -736,6 +636,15 @@ static constexpr Bnd bnd1 = Bnd(1);
static constexpr Bnd bnd2 = Bnd(2);
static constexpr Bnd bnd3 = Bnd(3);
+static constexpr Tmm tmm0 = Tmm(0);
+static constexpr Tmm tmm1 = Tmm(1);
+static constexpr Tmm tmm2 = Tmm(2);
+static constexpr Tmm tmm3 = Tmm(3);
+static constexpr Tmm tmm4 = Tmm(4);
+static constexpr Tmm tmm5 = Tmm(5);
+static constexpr Tmm tmm6 = Tmm(6);
+static constexpr Tmm tmm7 = Tmm(7);
+
static constexpr Rip rip = Rip(0);
#ifndef _DOXYGEN
@@ -745,79 +654,141 @@ static constexpr Rip rip = Rip(0);
using namespace regs;
#endif
-// ============================================================================
-// [asmjit::x86::Mem]
-// ============================================================================
-
-//! Memory operand.
+//! Memory operand specific to X86 and X86_64 architecture.
class Mem : public BaseMem {
public:
- //! Additional bits of operand's signature used by `Mem`.
- enum AdditionalBits : uint32_t {
- kSignatureMemSegmentShift = 16,
- kSignatureMemSegmentMask = 0x07u << kSignatureMemSegmentShift,
-
- kSignatureMemShiftShift = 19,
- kSignatureMemShiftMask = 0x03u << kSignatureMemShiftShift,
+ //! \name Constants
+ //! \{
+ //! Additional bits of operand's signature used by `x86::Mem`.
+ enum AdditionalBits : uint32_t {
+ // Memory address type (2 bits).
+ // |........|........|XX......|........|
+ kSignatureMemAddrTypeShift = 14,
+ kSignatureMemAddrTypeMask = 0x03u << kSignatureMemAddrTypeShift,
+
+ // Memory shift amount (2 bits).
+ // |........|......XX|........|........|
+ kSignatureMemShiftValueShift = 16,
+ kSignatureMemShiftValueMask = 0x03u << kSignatureMemShiftValueShift,
+
+ // Memory segment reg (3 bits).
+ // |........|...XXX..|........|........|
+ kSignatureMemSegmentShift = 18,
+ kSignatureMemSegmentMask = 0x07u << kSignatureMemSegmentShift,
+
+ // Memory broadcast type (3 bits).
+ // |........|XXX.....|........|........|
kSignatureMemBroadcastShift = 21,
- kSignatureMemBroadcastMask = 0x7u << kSignatureMemBroadcastShift
+ kSignatureMemBroadcastMask = 0x7u << kSignatureMemBroadcastShift
+ };
+
+ //! Address type.
+ enum class AddrType : uint32_t {
+ //! Default address type, Assembler will select the best type when necessary.
+ kDefault = 0,
+ //! Absolute address type.
+ kAbs = 1,
+ //! Relative address type.
+ kRel = 2,
+
+ //! Maximum value of `AddrType`.
+ kMaxValue = kRel
};
- enum Broadcast : uint32_t {
- kBroadcast1To1 = 0,
- kBroadcast1To2 = 1,
- kBroadcast1To4 = 2,
- kBroadcast1To8 = 3,
- kBroadcast1To16 = 4,
- kBroadcast1To32 = 5,
- kBroadcast1To64 = 6
+ //! Memory broadcast type.
+ enum class Broadcast : uint32_t {
+ //! No broadcast (regular memory operand).
+ kNone = 0,
+ //! Broadcast {1to2}.
+ k1To2 = 1,
+ //! Broadcast {1to4}.
+ k1To4 = 2,
+ //! Broadcast {1to8}.
+ k1To8 = 3,
+ //! Broadcast {1to16}.
+ k1To16 = 4,
+ //! Broadcast {1to32}.
+ k1To32 = 5,
+ //! Broadcast {1to64}.
+ k1To64 = 6,
+
+ //! Maximum value of `Broadcast`.
+ kMaxValue = k1To64
};
- // --------------------------------------------------------------------------
- // [Construction / Destruction]
- // --------------------------------------------------------------------------
+ //! \}
+
+ //! \name Construction & Destruction
+ //! \{
//! Creates a default `Mem` operand that points to [0].
- constexpr Mem() noexcept
+ inline constexpr Mem() noexcept
: BaseMem() {}
- constexpr Mem(const Mem& other) noexcept
+ inline constexpr Mem(const Mem& other) noexcept
: BaseMem(other) {}
- //! \cond INTERNAL
- //!
- //! A constructor used internally to create `Mem` operand from `Decomposed` data.
- constexpr explicit Mem(const Decomposed& d) noexcept
- : BaseMem(d) {}
- //! \endcond
-
- constexpr Mem(const Label& base, int32_t off, uint32_t size = 0, uint32_t flags = 0) noexcept
- : BaseMem(Decomposed { Label::kLabelTag, base.id(), 0, 0, off, size, flags }) {}
-
- constexpr Mem(const Label& base, const BaseReg& index, uint32_t shift, int32_t off, uint32_t size = 0, uint32_t flags = 0) noexcept
- : BaseMem(Decomposed { Label::kLabelTag, base.id(), index.type(), index.id(), off, size, flags | (shift << kSignatureMemShiftShift) }) {}
-
- constexpr Mem(const BaseReg& base, int32_t off, uint32_t size = 0, uint32_t flags = 0) noexcept
- : BaseMem(Decomposed { base.type(), base.id(), 0, 0, off, size, flags }) {}
+ inline explicit Mem(Globals::NoInit_) noexcept
+ : BaseMem(Globals::NoInit) {}
- constexpr Mem(const BaseReg& base, const BaseReg& index, uint32_t shift, int32_t off, uint32_t size = 0, uint32_t flags = 0) noexcept
- : BaseMem(Decomposed { base.type(), base.id(), index.type(), index.id(), off, size, flags | (shift << kSignatureMemShiftShift) }) {}
+ inline constexpr Mem(const Signature& signature, uint32_t baseId, uint32_t indexId, int32_t offset) noexcept
+ : BaseMem(signature, baseId, indexId, offset) {}
+
+ inline constexpr Mem(const Label& base, int32_t off, uint32_t size = 0, Signature signature = OperandSignature{0}) noexcept
+ : BaseMem(Signature::fromOpType(OperandType::kMem) |
+ Signature::fromMemBaseType(RegType::kLabelTag) |
+ Signature::fromSize(size) |
+ signature, base.id(), 0, off) {}
+
+ inline constexpr Mem(const Label& base, const BaseReg& index, uint32_t shift, int32_t off, uint32_t size = 0, Signature signature = OperandSignature{0}) noexcept
+ : BaseMem(Signature::fromOpType(OperandType::kMem) |
+ Signature::fromMemBaseType(RegType::kLabelTag) |
+ Signature::fromMemIndexType(index.type()) |
+ Signature::fromValue<kSignatureMemShiftValueMask>(shift) |
+ Signature::fromSize(size) |
+ signature, base.id(), index.id(), off) {}
+
+ inline constexpr Mem(const BaseReg& base, int32_t off, uint32_t size = 0, Signature signature = OperandSignature{0}) noexcept
+ : BaseMem(Signature::fromOpType(OperandType::kMem) |
+ Signature::fromMemBaseType(base.type()) |
+ Signature::fromSize(size) |
+ signature, base.id(), 0, off) {}
+
+ inline constexpr Mem(const BaseReg& base, const BaseReg& index, uint32_t shift, int32_t off, uint32_t size = 0, Signature signature = OperandSignature{0}) noexcept
+ : BaseMem(Signature::fromOpType(OperandType::kMem) |
+ Signature::fromMemBaseType(base.type()) |
+ Signature::fromMemIndexType(index.type()) |
+ Signature::fromValue<kSignatureMemShiftValueMask>(shift) |
+ Signature::fromSize(size) |
+ signature, base.id(), index.id(), off) {}
+
+ inline constexpr explicit Mem(uint64_t base, uint32_t size = 0, Signature signature = OperandSignature{0}) noexcept
+ : BaseMem(Signature::fromOpType(OperandType::kMem) |
+ Signature::fromSize(size) |
+ signature, uint32_t(base >> 32), 0, int32_t(uint32_t(base & 0xFFFFFFFFu))) {}
+
+ inline constexpr Mem(uint64_t base, const BaseReg& index, uint32_t shift = 0, uint32_t size = 0, Signature signature = OperandSignature{0}) noexcept
+ : BaseMem(Signature::fromOpType(OperandType::kMem) |
+ Signature::fromMemIndexType(index.type()) |
+ Signature::fromValue<kSignatureMemShiftValueMask>(shift) |
+ Signature::fromSize(size) |
+ signature, uint32_t(base >> 32), index.id(), int32_t(uint32_t(base & 0xFFFFFFFFu))) {}
+
+ //! \}
+
+ //! \name Overloaded Operators
+ //! \{
- constexpr explicit Mem(uint64_t base, uint32_t size = 0, uint32_t flags = 0) noexcept
- : BaseMem(Decomposed { 0, uint32_t(base >> 32), 0, 0, int32_t(uint32_t(base & 0xFFFFFFFFu)), size, flags }) {}
+ inline Mem& operator=(const Mem& other) noexcept = default;
- constexpr Mem(uint64_t base, const BaseReg& index, uint32_t shift = 0, uint32_t size = 0, uint32_t flags = 0) noexcept
- : BaseMem(Decomposed { 0, uint32_t(base >> 32), index.type(), index.id(), int32_t(uint32_t(base & 0xFFFFFFFFu)), size, flags | (shift << kSignatureMemShiftShift) }) {}
+ //! \}
- constexpr Mem(Globals::Init_, uint32_t u0, uint32_t u1, uint32_t u2, uint32_t u3) noexcept
- : BaseMem(Globals::Init, u0, u1, u2, u3) {}
-
- inline explicit Mem(Globals::NoInit_) noexcept
- : BaseMem(Globals::NoInit) {}
+ //! \name Clone
+ //! \{
//! Clones the memory operand.
- constexpr Mem clone() const noexcept { return Mem(*this); }
+ inline constexpr Mem clone() const noexcept { return Mem(*this); }
//! Creates a new copy of this memory operand adjusted by `off`.
inline Mem cloneAdjusted(int64_t off) const noexcept {
@@ -826,6 +797,15 @@ public:
return result;
}
+ inline constexpr Mem cloneBroadcasted(Broadcast b) const noexcept {
+ return Mem((_signature & ~Signature{kSignatureMemBroadcastMask}) | Signature::fromValue<kSignatureMemBroadcastMask>(b), _baseId, _data[0], int32_t(_data[1]));
+ }
+
+ //! \}
+
+ //! \name Base & Index
+ //! \{
+
//! Converts memory `baseType` and `baseId` to `x86::Reg` instance.
//!
//! The memory must have a valid base register otherwise the result will be wrong.
@@ -836,18 +816,6 @@ public:
//! The memory must have a valid index register otherwise the result will be wrong.
inline Reg indexReg() const noexcept { return Reg::fromTypeAndId(indexType(), indexId()); }
- constexpr Mem _1to1() const noexcept { return Mem(Globals::Init, (_signature & ~kSignatureMemBroadcastMask) | (kBroadcast1To1 << kSignatureMemBroadcastShift), _baseId, _data[0], _data[1]); }
- constexpr Mem _1to2() const noexcept { return Mem(Globals::Init, (_signature & ~kSignatureMemBroadcastMask) | (kBroadcast1To2 << kSignatureMemBroadcastShift), _baseId, _data[0], _data[1]); }
- constexpr Mem _1to4() const noexcept { return Mem(Globals::Init, (_signature & ~kSignatureMemBroadcastMask) | (kBroadcast1To4 << kSignatureMemBroadcastShift), _baseId, _data[0], _data[1]); }
- constexpr Mem _1to8() const noexcept { return Mem(Globals::Init, (_signature & ~kSignatureMemBroadcastMask) | (kBroadcast1To8 << kSignatureMemBroadcastShift), _baseId, _data[0], _data[1]); }
- constexpr Mem _1to16() const noexcept { return Mem(Globals::Init, (_signature & ~kSignatureMemBroadcastMask) | (kBroadcast1To16 << kSignatureMemBroadcastShift), _baseId, _data[0], _data[1]); }
- constexpr Mem _1to32() const noexcept { return Mem(Globals::Init, (_signature & ~kSignatureMemBroadcastMask) | (kBroadcast1To32 << kSignatureMemBroadcastShift), _baseId, _data[0], _data[1]); }
- constexpr Mem _1to64() const noexcept { return Mem(Globals::Init, (_signature & ~kSignatureMemBroadcastMask) | (kBroadcast1To64 << kSignatureMemBroadcastShift), _baseId, _data[0], _data[1]); }
-
- // --------------------------------------------------------------------------
- // [Mem]
- // --------------------------------------------------------------------------
-
using BaseMem::setIndex;
inline void setIndex(const BaseReg& index, uint32_t shift) noexcept {
@@ -855,115 +823,220 @@ public:
setShift(shift);
}
+ //! \}
+
+ //! \name Address Type
+ //! \{
+
+ //! Returns the address type of the memory operand.
+ //!
+ //! By default, address type of newly created memory operands is always \ref AddrType::kDefault.
+ inline constexpr AddrType addrType() const noexcept { return (AddrType)_signature.getField<kSignatureMemAddrTypeMask>(); }
+ //! Sets the address type to `addrType`.
+ inline void setAddrType(AddrType addrType) noexcept { _signature.setField<kSignatureMemAddrTypeMask>(uint32_t(addrType)); }
+ //! Resets the address type to \ref AddrType::kDefault.
+ inline void resetAddrType() noexcept { _signature.setField<kSignatureMemAddrTypeMask>(uint32_t(AddrType::kDefault)); }
+
+ //! Tests whether the address type is \ref AddrType::kAbs.
+ inline constexpr bool isAbs() const noexcept { return addrType() == AddrType::kAbs; }
+ //! Sets the address type to \ref AddrType::kAbs.
+ inline void setAbs() noexcept { setAddrType(AddrType::kAbs); }
+
+ //! Tests whether the address type is \ref AddrType::kRel.
+ inline constexpr bool isRel() const noexcept { return addrType() == AddrType::kRel; }
+ //! Sets the address type to \ref AddrType::kRel.
+ inline void setRel() noexcept { setAddrType(AddrType::kRel); }
+
+ //! \}
+
+ //! \name Segment
+ //! \{
+
//! Tests whether the memory operand has a segment override.
- constexpr bool hasSegment() const noexcept { return _hasSignaturePart<kSignatureMemSegmentMask>(); }
+ inline constexpr bool hasSegment() const noexcept { return _signature.hasField<kSignatureMemSegmentMask>(); }
//! Returns the associated segment override as `SReg` operand.
- constexpr SReg segment() const noexcept { return SReg(segmentId()); }
+ inline constexpr SReg segment() const noexcept { return SReg(segmentId()); }
//! Returns segment override register id, see `SReg::Id`.
- constexpr uint32_t segmentId() const noexcept { return _getSignaturePart<kSignatureMemSegmentMask>(); }
+ inline constexpr uint32_t segmentId() const noexcept { return _signature.getField<kSignatureMemSegmentMask>(); }
//! Sets the segment override to `seg`.
inline void setSegment(const SReg& seg) noexcept { setSegment(seg.id()); }
//! Sets the segment override to `id`.
- inline void setSegment(uint32_t rId) noexcept { _setSignaturePart<kSignatureMemSegmentMask>(rId); }
+ inline void setSegment(uint32_t rId) noexcept { _signature.setField<kSignatureMemSegmentMask>(rId); }
//! Resets the segment override.
- inline void resetSegment() noexcept { _setSignaturePart<kSignatureMemSegmentMask>(0); }
+ inline void resetSegment() noexcept { _signature.setField<kSignatureMemSegmentMask>(0); }
+
+ //! \}
+
+ //! \name Shift
+ //! \{
//! Tests whether the memory operand has shift (aka scale) value.
- constexpr bool hasShift() const noexcept { return _hasSignaturePart<kSignatureMemShiftMask>(); }
+ inline constexpr bool hasShift() const noexcept { return _signature.hasField<kSignatureMemShiftValueMask>(); }
//! Returns the memory operand's shift (aka scale) value.
- constexpr uint32_t shift() const noexcept { return _getSignaturePart<kSignatureMemShiftMask>(); }
+ inline constexpr uint32_t shift() const noexcept { return _signature.getField<kSignatureMemShiftValueMask>(); }
//! Sets the memory operand's shift (aka scale) value.
- inline void setShift(uint32_t shift) noexcept { _setSignaturePart<kSignatureMemShiftMask>(shift); }
+ inline void setShift(uint32_t shift) noexcept { _signature.setField<kSignatureMemShiftValueMask>(shift); }
//! Resets the memory operand's shift (aka scale) value to zero.
- inline void resetShift() noexcept { _setSignaturePart<kSignatureMemShiftMask>(0); }
+ inline void resetShift() noexcept { _signature.setField<kSignatureMemShiftValueMask>(0); }
+
+ //! \}
+
+ //! \name Broadcast
+ //! \{
//! Tests whether the memory operand has broadcast {1tox}.
- constexpr bool hasBroadcast() const noexcept { return _hasSignaturePart<kSignatureMemBroadcastMask>(); }
+ inline constexpr bool hasBroadcast() const noexcept { return _signature.hasField<kSignatureMemBroadcastMask>(); }
//! Returns the memory operand's broadcast.
- constexpr uint32_t getBroadcast() const noexcept { return _getSignaturePart<kSignatureMemBroadcastMask>(); }
+ inline constexpr Broadcast getBroadcast() const noexcept { return (Broadcast)_signature.getField<kSignatureMemBroadcastMask>(); }
//! Sets the memory operand's broadcast.
- inline void setBroadcast(uint32_t bcst) noexcept { _setSignaturePart<kSignatureMemBroadcastMask>(bcst); }
+ inline void setBroadcast(Broadcast b) noexcept { _signature.setField<kSignatureMemBroadcastMask>(uint32_t(b)); }
//! Resets the memory operand's broadcast to none.
- inline void resetBroadcast() noexcept { _setSignaturePart<kSignatureMemBroadcastMask>(0); }
-
- // --------------------------------------------------------------------------
- // [Operator Overload]
- // --------------------------------------------------------------------------
-
- inline Mem& operator=(const Mem& other) noexcept = default;
+ inline void resetBroadcast() noexcept { _signature.setField<kSignatureMemBroadcastMask>(0); }
+
+ //! Returns a new `Mem` without a broadcast (the possible broadcast is cleared).
+ inline constexpr Mem _1to1() const noexcept { return cloneBroadcasted(Broadcast::kNone); }
+ //! Returns a new `Mem` with {1to2} broadcast (AVX-512).
+ inline constexpr Mem _1to2() const noexcept { return cloneBroadcasted(Broadcast::k1To2); }
+ //! Returns a new `Mem` with {1to4} broadcast (AVX-512).
+ inline constexpr Mem _1to4() const noexcept { return cloneBroadcasted(Broadcast::k1To4); }
+ //! Returns a new `Mem` with {1to8} broadcast (AVX-512).
+ inline constexpr Mem _1to8() const noexcept { return cloneBroadcasted(Broadcast::k1To8); }
+ //! Returns a new `Mem` with {1to16} broadcast (AVX-512).
+ inline constexpr Mem _1to16() const noexcept { return cloneBroadcasted(Broadcast::k1To16); }
+ //! Returns a new `Mem` with {1to32} broadcast (AVX-512).
+ inline constexpr Mem _1to32() const noexcept { return cloneBroadcasted(Broadcast::k1To32); }
+ //! Returns a new `Mem` with {1to64} broadcast (AVX-512).
+ inline constexpr Mem _1to64() const noexcept { return cloneBroadcasted(Broadcast::k1To64); }
+
+ //! \}
};
//! Creates `[base.reg + offset]` memory operand.
-static constexpr Mem ptr(const Gp& base, int32_t offset = 0, uint32_t size = 0) noexcept {
+static inline constexpr Mem ptr(const Gp& base, int32_t offset = 0, uint32_t size = 0) noexcept {
return Mem(base, offset, size);
}
//! Creates `[base.reg + (index << shift) + offset]` memory operand (scalar index).
-static constexpr Mem ptr(const Gp& base, const Gp& index, uint32_t shift = 0, int32_t offset = 0, uint32_t size = 0) noexcept {
+static inline constexpr Mem ptr(const Gp& base, const Gp& index, uint32_t shift = 0, int32_t offset = 0, uint32_t size = 0) noexcept {
return Mem(base, index, shift, offset, size);
}
//! Creates `[base.reg + (index << shift) + offset]` memory operand (vector index).
-static constexpr Mem ptr(const Gp& base, const Vec& index, uint32_t shift = 0, int32_t offset = 0, uint32_t size = 0) noexcept {
+static inline constexpr Mem ptr(const Gp& base, const Vec& index, uint32_t shift = 0, int32_t offset = 0, uint32_t size = 0) noexcept {
return Mem(base, index, shift, offset, size);
}
//! Creates `[base + offset]` memory operand.
-static constexpr Mem ptr(const Label& base, int32_t offset = 0, uint32_t size = 0) noexcept {
+static inline constexpr Mem ptr(const Label& base, int32_t offset = 0, uint32_t size = 0) noexcept {
return Mem(base, offset, size);
}
//! Creates `[base + (index << shift) + offset]` memory operand.
-static constexpr Mem ptr(const Label& base, const Gp& index, uint32_t shift = 0, int32_t offset = 0, uint32_t size = 0) noexcept {
+static inline constexpr Mem ptr(const Label& base, const Gp& index, uint32_t shift = 0, int32_t offset = 0, uint32_t size = 0) noexcept {
return Mem(base, index, shift, offset, size);
}
//! Creates `[base + (index << shift) + offset]` memory operand.
-static constexpr Mem ptr(const Label& base, const Vec& index, uint32_t shift = 0, int32_t offset = 0, uint32_t size = 0) noexcept {
+static inline constexpr Mem ptr(const Label& base, const Vec& index, uint32_t shift = 0, int32_t offset = 0, uint32_t size = 0) noexcept {
return Mem(base, index, shift, offset, size);
}
//! Creates `[rip + offset]` memory operand.
-static constexpr Mem ptr(const Rip& rip_, int32_t offset = 0, uint32_t size = 0) noexcept {
+static inline constexpr Mem ptr(const Rip& rip_, int32_t offset = 0, uint32_t size = 0) noexcept {
return Mem(rip_, offset, size);
}
//! Creates `[base]` absolute memory operand.
-static constexpr Mem ptr(uint64_t base, uint32_t size = 0) noexcept {
+static inline constexpr Mem ptr(uint64_t base, uint32_t size = 0) noexcept {
return Mem(base, size);
}
//! Creates `[base + (index.reg << shift)]` absolute memory operand.
-static constexpr Mem ptr(uint64_t base, const Reg& index, uint32_t shift = 0, uint32_t size = 0) noexcept {
+static inline constexpr Mem ptr(uint64_t base, const Reg& index, uint32_t shift = 0, uint32_t size = 0) noexcept {
return Mem(base, index, shift, size);
}
//! Creates `[base + (index.reg << shift)]` absolute memory operand.
-static constexpr Mem ptr(uint64_t base, const Vec& index, uint32_t shift = 0, uint32_t size = 0) noexcept {
+static inline constexpr Mem ptr(uint64_t base, const Vec& index, uint32_t shift = 0, uint32_t size = 0) noexcept {
return Mem(base, index, shift, size);
}
//! Creates `[base]` absolute memory operand (absolute).
-static constexpr Mem ptr_abs(uint64_t base, uint32_t size = 0) noexcept {
- return Mem(base, size, BaseMem::kSignatureMemAbs);
+static inline constexpr Mem ptr_abs(uint64_t base, uint32_t size = 0) noexcept {
+ return Mem(base, size, OperandSignature::fromValue<Mem::kSignatureMemAddrTypeMask>(Mem::AddrType::kAbs));
}
//! Creates `[base + (index.reg << shift)]` absolute memory operand (absolute).
-static constexpr Mem ptr_abs(uint64_t base, const Reg& index, uint32_t shift = 0, uint32_t size = 0) noexcept {
- return Mem(base, index, shift, size, BaseMem::kSignatureMemAbs);
+static inline constexpr Mem ptr_abs(uint64_t base, const Reg& index, uint32_t shift = 0, uint32_t size = 0) noexcept {
+ return Mem(base, index, shift, size, OperandSignature::fromValue<Mem::kSignatureMemAddrTypeMask>(Mem::AddrType::kAbs));
}
//! Creates `[base + (index.reg << shift)]` absolute memory operand (absolute).
-static constexpr Mem ptr_abs(uint64_t base, const Vec& index, uint32_t shift = 0, uint32_t size = 0) noexcept {
- return Mem(base, index, shift, size, BaseMem::kSignatureMemAbs);
+static inline constexpr Mem ptr_abs(uint64_t base, const Vec& index, uint32_t shift = 0, uint32_t size = 0) noexcept {
+ return Mem(base, index, shift, size, OperandSignature::fromValue<Mem::kSignatureMemAddrTypeMask>(Mem::AddrType::kAbs));
}
//! Creates `[base]` relative memory operand (relative).
-static constexpr Mem ptr_rel(uint64_t base, uint32_t size = 0) noexcept {
- return Mem(base, size, BaseMem::kSignatureMemRel);
+static inline constexpr Mem ptr_rel(uint64_t base, uint32_t size = 0) noexcept {
+ return Mem(base, size, OperandSignature::fromValue<Mem::kSignatureMemAddrTypeMask>(Mem::AddrType::kRel));
}
//! Creates `[base + (index.reg << shift)]` relative memory operand (relative).
-static constexpr Mem ptr_rel(uint64_t base, const Reg& index, uint32_t shift = 0, uint32_t size = 0) noexcept {
- return Mem(base, index, shift, size, BaseMem::kSignatureMemRel);
+static inline constexpr Mem ptr_rel(uint64_t base, const Reg& index, uint32_t shift = 0, uint32_t size = 0) noexcept {
+ return Mem(base, index, shift, size, OperandSignature::fromValue<Mem::kSignatureMemAddrTypeMask>(Mem::AddrType::kRel));
}
//! Creates `[base + (index.reg << shift)]` relative memory operand (relative).
-static constexpr Mem ptr_rel(uint64_t base, const Vec& index, uint32_t shift = 0, uint32_t size = 0) noexcept {
- return Mem(base, index, shift, size, BaseMem::kSignatureMemRel);
+static inline constexpr Mem ptr_rel(uint64_t base, const Vec& index, uint32_t shift = 0, uint32_t size = 0) noexcept {
+ return Mem(base, index, shift, size, OperandSignature::fromValue<Mem::kSignatureMemAddrTypeMask>(Mem::AddrType::kRel));
}
+#define ASMJIT_MEM_PTR(FUNC, SIZE) \
+ static constexpr Mem FUNC(const Gp& base, int32_t offset = 0) noexcept { \
+ return Mem(base, offset, SIZE); \
+ } \
+ static constexpr Mem FUNC(const Gp& base, const Gp& index, uint32_t shift = 0, int32_t offset = 0) noexcept { \
+ return Mem(base, index, shift, offset, SIZE); \
+ } \
+ static constexpr Mem FUNC(const Gp& base, const Vec& index, uint32_t shift = 0, int32_t offset = 0) noexcept { \
+ return Mem(base, index, shift, offset, SIZE); \
+ } \
+ static constexpr Mem FUNC(const Label& base, int32_t offset = 0) noexcept { \
+ return Mem(base, offset, SIZE); \
+ } \
+ static constexpr Mem FUNC(const Label& base, const Gp& index, uint32_t shift = 0, int32_t offset = 0) noexcept { \
+ return Mem(base, index, shift, offset, SIZE); \
+ } \
+ static constexpr Mem FUNC(const Rip& rip_, int32_t offset = 0) noexcept { \
+ return Mem(rip_, offset, SIZE); \
+ } \
+ static constexpr Mem FUNC(uint64_t base) noexcept { \
+ return Mem(base, SIZE); \
+ } \
+ static constexpr Mem FUNC(uint64_t base, const Gp& index, uint32_t shift = 0) noexcept { \
+ return Mem(base, index, shift, SIZE); \
+ } \
+ static constexpr Mem FUNC(uint64_t base, const Vec& index, uint32_t shift = 0) noexcept { \
+ return Mem(base, index, shift, SIZE); \
+ } \
+ \
+ static constexpr Mem FUNC##_abs(uint64_t base) noexcept { \
+ return Mem(base, SIZE, \
+ OperandSignature::fromValue<Mem::kSignatureMemAddrTypeMask>(Mem::AddrType::kAbs)); \
+ } \
+ static constexpr Mem FUNC##_abs(uint64_t base, const Gp& index, uint32_t shift = 0) noexcept { \
+ return Mem(base, index, shift, SIZE, \
+ OperandSignature::fromValue<Mem::kSignatureMemAddrTypeMask>(Mem::AddrType::kAbs)); \
+ } \
+ static constexpr Mem FUNC##_abs(uint64_t base, const Vec& index, uint32_t shift = 0) noexcept { \
+ return Mem(base, index, shift, SIZE, \
+ OperandSignature::fromValue<Mem::kSignatureMemAddrTypeMask>(Mem::AddrType::kAbs)); \
+ } \
+ \
+ static constexpr Mem FUNC##_rel(uint64_t base) noexcept { \
+ return Mem(base, SIZE, \
+ OperandSignature::fromValue<Mem::kSignatureMemAddrTypeMask>(Mem::AddrType::kRel)); \
+ } \
+ static constexpr Mem FUNC##_rel(uint64_t base, const Gp& index, uint32_t shift = 0) noexcept { \
+ return Mem(base, index, shift, SIZE, \
+ OperandSignature::fromValue<Mem::kSignatureMemAddrTypeMask>(Mem::AddrType::kRel)); \
+ } \
+ static constexpr Mem FUNC##_rel(uint64_t base, const Vec& index, uint32_t shift = 0) noexcept { \
+ return Mem(base, index, shift, SIZE, \
+ OperandSignature::fromValue<Mem::kSignatureMemAddrTypeMask>(Mem::AddrType::kRel)); \
+ }
+
// Definition of memory operand constructors that use platform independent naming.
ASMJIT_MEM_PTR(ptr_8, 1)
ASMJIT_MEM_PTR(ptr_16, 2)
@@ -979,7 +1052,9 @@ ASMJIT_MEM_PTR(ptr_512, 64)
ASMJIT_MEM_PTR(byte_ptr, 1)
ASMJIT_MEM_PTR(word_ptr, 2)
ASMJIT_MEM_PTR(dword_ptr, 4)
+ASMJIT_MEM_PTR(fword_ptr, 6)
ASMJIT_MEM_PTR(qword_ptr, 8)
+ASMJIT_MEM_PTR(tbyte_ptr, 10)
ASMJIT_MEM_PTR(tword_ptr, 10)
ASMJIT_MEM_PTR(oword_ptr, 16)
ASMJIT_MEM_PTR(dqword_ptr, 16)
@@ -988,55 +1063,23 @@ ASMJIT_MEM_PTR(xmmword_ptr, 16)
ASMJIT_MEM_PTR(ymmword_ptr, 32)
ASMJIT_MEM_PTR(zmmword_ptr, 64)
-// ============================================================================
-// [asmjit::x86::OpData]
-// ============================================================================
-
-struct OpData {
- //! Information about all architecture registers.
- ArchRegs archRegs;
-};
-ASMJIT_VARAPI const OpData opData;
-
-//! \cond
-// ... Reg methods that require `opData`.
-inline uint32_t Reg::groupOf(uint32_t rType) noexcept {
- ASMJIT_ASSERT(rType <= BaseReg::kTypeMax);
- return opData.archRegs.regInfo[rType].group();
-}
-
-inline uint32_t Reg::typeIdOf(uint32_t rType) noexcept {
- ASMJIT_ASSERT(rType <= BaseReg::kTypeMax);
- return opData.archRegs.regTypeToTypeId[rType];
-}
-
-inline uint32_t Reg::signatureOf(uint32_t rType) noexcept {
- ASMJIT_ASSERT(rType <= BaseReg::kTypeMax);
- return opData.archRegs.regInfo[rType].signature();
-}
-//! \endcond
+#undef ASMJIT_MEM_PTR
//! \}
ASMJIT_END_SUB_NAMESPACE
-// ============================================================================
-// [asmjit::Type::IdOfT<x86::Reg>]
-// ============================================================================
-
//! \cond INTERNAL
ASMJIT_BEGIN_NAMESPACE
-ASMJIT_DEFINE_TYPE_ID(x86::Gpb, kIdI8);
-ASMJIT_DEFINE_TYPE_ID(x86::Gpw, kIdI16);
-ASMJIT_DEFINE_TYPE_ID(x86::Gpd, kIdI32);
-ASMJIT_DEFINE_TYPE_ID(x86::Gpq, kIdI64);
-ASMJIT_DEFINE_TYPE_ID(x86::Mm , kIdMmx64);
-ASMJIT_DEFINE_TYPE_ID(x86::Xmm, kIdI32x4);
-ASMJIT_DEFINE_TYPE_ID(x86::Ymm, kIdI32x8);
-ASMJIT_DEFINE_TYPE_ID(x86::Zmm, kIdI32x16);
+ASMJIT_DEFINE_TYPE_ID(x86::Gpb, TypeId::kInt8);
+ASMJIT_DEFINE_TYPE_ID(x86::Gpw, TypeId::kInt16);
+ASMJIT_DEFINE_TYPE_ID(x86::Gpd, TypeId::kInt32);
+ASMJIT_DEFINE_TYPE_ID(x86::Gpq, TypeId::kInt64);
+ASMJIT_DEFINE_TYPE_ID(x86::Mm , TypeId::kMmx64);
+ASMJIT_DEFINE_TYPE_ID(x86::Xmm, TypeId::kInt32x4);
+ASMJIT_DEFINE_TYPE_ID(x86::Ymm, TypeId::kInt32x8);
+ASMJIT_DEFINE_TYPE_ID(x86::Zmm, TypeId::kInt32x16);
ASMJIT_END_NAMESPACE
//! \endcond
-#undef ASMJIT_MEM_PTR
-
#endif // ASMJIT_X86_X86OPERAND_H_INCLUDED
diff --git a/3rdparty/asmjit/src/asmjit/x86/x86rapass.cpp b/3rdparty/asmjit/src/asmjit/x86/x86rapass.cpp
index 6cbb0064388..4f0325ad9f1 100644
--- a/3rdparty/asmjit/src/asmjit/x86/x86rapass.cpp
+++ b/3rdparty/asmjit/src/asmjit/x86/x86rapass.cpp
@@ -1,28 +1,10 @@
-// AsmJit - Machine code generation for C++
+// This file is part of AsmJit project <https://asmjit.com>
//
-// * Official AsmJit Home Page: https://asmjit.com
-// * Official Github Repository: https://github.com/asmjit/asmjit
-//
-// Copyright (c) 2008-2020 The AsmJit Authors
-//
-// This software is provided 'as-is', without any express or implied
-// warranty. In no event will the authors be held liable for any damages
-// arising from the use of this software.
-//
-// Permission is granted to anyone to use this software for any purpose,
-// including commercial applications, and to alter it and redistribute it
-// freely, subject to the following restrictions:
-//
-// 1. The origin of this software must not be misrepresented; you must not
-// claim that you wrote the original software. If you use this software
-// in a product, an acknowledgment in the product documentation would be
-// appreciated but is not required.
-// 2. Altered source versions must be plainly marked as such, and must not be
-// misrepresented as being the original software.
-// 3. This notice may not be removed or altered from any source distribution.
+// See asmjit.h or LICENSE.md for license and copyright information
+// SPDX-License-Identifier: Zlib
#include "../core/api-build_p.h"
-#if defined(ASMJIT_BUILD_X86) && !defined(ASMJIT_NO_COMPILER)
+#if !defined(ASMJIT_NO_X86) && !defined(ASMJIT_NO_COMPILER)
#include "../core/cpuinfo.h"
#include "../core/support.h"
@@ -31,18 +13,17 @@
#include "../x86/x86compiler.h"
#include "../x86/x86instapi_p.h"
#include "../x86/x86instdb_p.h"
-#include "../x86/x86internal_p.h"
+#include "../x86/x86emithelper_p.h"
#include "../x86/x86rapass_p.h"
ASMJIT_BEGIN_SUB_NAMESPACE(x86)
-// ============================================================================
-// [asmjit::x86::X86RAPass - Helpers]
-// ============================================================================
+// x86::X86RAPass - Utilities
+// ==========================
-static ASMJIT_INLINE uint64_t raImmMaskFromSize(uint32_t size) noexcept {
+static ASMJIT_FORCE_INLINE uint64_t raImmMaskFromSize(uint32_t size) noexcept {
ASMJIT_ASSERT(size > 0 && size < 256);
- static const uint64_t masks[] = {
+ static constexpr uint64_t masks[] = {
0x00000000000000FFu, // 1
0x000000000000FFFFu, // 2
0x00000000FFFFFFFFu, // 4
@@ -56,50 +37,57 @@ static ASMJIT_INLINE uint64_t raImmMaskFromSize(uint32_t size) noexcept {
return masks[Support::ctz(size)];
}
-static ASMJIT_INLINE uint32_t raUseOutFlagsFromRWFlags(uint32_t rwFlags) noexcept {
- static const uint32_t map[] = {
- 0,
- RATiedReg::kRead | RATiedReg::kUse, // kRead
- RATiedReg::kWrite | RATiedReg::kOut, // kWrite
- RATiedReg::kRW | RATiedReg::kUse, // kRW
- 0,
- RATiedReg::kRead | RATiedReg::kUse | RATiedReg::kUseRM, // kRead | kRegMem
- RATiedReg::kWrite | RATiedReg::kOut | RATiedReg::kOutRM, // kWrite | kRegMem
- RATiedReg::kRW | RATiedReg::kUse | RATiedReg::kUseRM // kRW | kRegMem
+static const RegMask raConsecutiveLeadCountToRegMaskFilter[5] = {
+ 0xFFFFFFFFu, // [0] No consecutive.
+ 0x00000000u, // [1] Invalid, never used.
+ 0x55555555u, // [2] Even registers.
+ 0x00000000u, // [3] Invalid, never used.
+ 0x11111111u // [4] Every fourth register.
+};
+
+static ASMJIT_FORCE_INLINE RATiedFlags raUseOutFlagsFromRWFlags(OpRWFlags rwFlags) noexcept {
+ static constexpr RATiedFlags map[] = {
+ RATiedFlags::kNone,
+ RATiedFlags::kRead | RATiedFlags::kUse, // kRead
+ RATiedFlags::kWrite | RATiedFlags::kOut, // kWrite
+ RATiedFlags::kRW | RATiedFlags::kUse, // kRW
+ RATiedFlags::kNone,
+ RATiedFlags::kRead | RATiedFlags::kUse | RATiedFlags::kUseRM, // kRead | kRegMem
+ RATiedFlags::kWrite | RATiedFlags::kOut | RATiedFlags::kOutRM, // kWrite | kRegMem
+ RATiedFlags::kRW | RATiedFlags::kUse | RATiedFlags::kUseRM // kRW | kRegMem
};
- return map[rwFlags & (OpRWInfo::kRW | OpRWInfo::kRegMem)];
+ return map[uint32_t(rwFlags & (OpRWFlags::kRW | OpRWFlags::kRegMem))];
}
-static ASMJIT_INLINE uint32_t raRegRwFlags(uint32_t flags) noexcept {
- return raUseOutFlagsFromRWFlags(flags);
+static ASMJIT_FORCE_INLINE RATiedFlags raRegRwFlags(OpRWFlags flags) noexcept {
+ return (RATiedFlags)raUseOutFlagsFromRWFlags(flags);
}
-static ASMJIT_INLINE uint32_t raMemBaseRwFlags(uint32_t flags) noexcept {
- constexpr uint32_t shift = Support::constCtz(OpRWInfo::kMemBaseRW);
- return raUseOutFlagsFromRWFlags((flags >> shift) & OpRWInfo::kRW);
+static ASMJIT_FORCE_INLINE RATiedFlags raMemBaseRwFlags(OpRWFlags flags) noexcept {
+ constexpr uint32_t kShift = Support::ConstCTZ<uint32_t(OpRWFlags::kMemBaseRW)>::value;
+ return (RATiedFlags)raUseOutFlagsFromRWFlags(OpRWFlags(uint32_t(flags) >> kShift) & OpRWFlags::kRW);
}
-static ASMJIT_INLINE uint32_t raMemIndexRwFlags(uint32_t flags) noexcept {
- constexpr uint32_t shift = Support::constCtz(OpRWInfo::kMemIndexRW);
- return raUseOutFlagsFromRWFlags((flags >> shift) & OpRWInfo::kRW);
+static ASMJIT_FORCE_INLINE RATiedFlags raMemIndexRwFlags(OpRWFlags flags) noexcept {
+ constexpr uint32_t kShift = Support::ConstCTZ<uint32_t(OpRWFlags::kMemIndexRW)>::value;
+ return (RATiedFlags)raUseOutFlagsFromRWFlags(OpRWFlags(uint32_t(flags) >> kShift) & OpRWFlags::kRW);
}
-// ============================================================================
-// [asmjit::x86::X86RACFGBuilder]
-// ============================================================================
+// x86::RACFGBuilder
+// =================
-class X86RACFGBuilder : public RACFGBuilder<X86RACFGBuilder> {
+class RACFGBuilder : public RACFGBuilderT<RACFGBuilder> {
public:
- uint32_t _arch;
+ Arch _arch;
bool _is64Bit;
bool _avxEnabled;
- inline X86RACFGBuilder(X86RAPass* pass) noexcept
- : RACFGBuilder<X86RACFGBuilder>(pass),
+ inline RACFGBuilder(X86RAPass* pass) noexcept
+ : RACFGBuilderT<RACFGBuilder>(pass),
_arch(pass->cc()->arch()),
_is64Bit(pass->registerSize() == 8),
- _avxEnabled(pass->_avxEnabled) {
+ _avxEnabled(pass->avxEnabled()) {
}
inline Compiler* cc() const noexcept { return static_cast<Compiler*>(_cc); }
@@ -108,7 +96,7 @@ public:
return _avxEnabled ? avxInst : sseInst;
}
- Error onInst(InstNode* inst, uint32_t& controlType, RAInstBuilder& ib) noexcept;
+ Error onInst(InstNode* inst, InstControlFlow& cf, RAInstBuilder& ib) noexcept;
Error onBeforeInvoke(InvokeNode* invokeNode) noexcept;
Error onInvoke(InvokeNode* invokeNode, RAInstBuilder& ib) noexcept;
@@ -122,14 +110,13 @@ public:
Error onRet(FuncRetNode* funcRet, RAInstBuilder& ib) noexcept;
};
-// ============================================================================
-// [asmjit::x86::X86RACFGBuilder - OnInst]
-// ============================================================================
+// x86::RACFGBuilder - OnInst
+// ==========================
-Error X86RACFGBuilder::onInst(InstNode* inst, uint32_t& controlType, RAInstBuilder& ib) noexcept {
+Error RACFGBuilder::onInst(InstNode* inst, InstControlFlow& cf, RAInstBuilder& ib) noexcept {
InstRWInfo rwInfo;
- uint32_t instId = inst->id();
+ InstId instId = inst->id();
if (Inst::isDefinedId(instId)) {
uint32_t opCount = inst->opCount();
const Operand* opArray = inst->operands();
@@ -140,6 +127,42 @@ Error X86RACFGBuilder::onInst(InstNode* inst, uint32_t& controlType, RAInstBuild
uint32_t singleRegOps = 0;
if (opCount) {
+ // The mask is for all registers, but we are mostly interested in AVX-512 registers at the moment. The mask
+ // will be combined with all available registers of the Compiler at the end so we it never use more registers
+ // than available.
+ RegMask instructionAllowedRegs = 0xFFFFFFFFu;
+
+ uint32_t consecutiveOffset = 0;
+ uint32_t consecutiveLeadId = Globals::kInvalidId;
+ uint32_t consecutiveParent = Globals::kInvalidId;
+
+ if (instInfo.isEvex()) {
+ // EVEX instruction and VEX instructions that can be encoded with EVEX have the possibility to use 32 SIMD
+ // registers (XMM/YMM/ZMM).
+ if (instInfo.isVex() && !instInfo.isEvexCompatible()) {
+ if (instInfo.isEvexKRegOnly()) {
+ // EVEX encodable only if the first operand is K register (compare instructions).
+ if (!Reg::isKReg(opArray[0]))
+ instructionAllowedRegs = 0xFFFFu;
+ }
+ else if (instInfo.isEvexTwoOpOnly()) {
+ // EVEX encodable only if the instruction has two operands (gather instructions).
+ if (opCount != 2)
+ instructionAllowedRegs = 0xFFFFu;
+ }
+ else {
+ instructionAllowedRegs = 0xFFFFu;
+ }
+ }
+ }
+ else if (instInfo.isEvexTransformable()) {
+ ib.addAggregatedFlags(RATiedFlags::kInst_IsTransformable);
+ }
+ else {
+ // Not EVEX, restrict everything to [0-15] registers.
+ instructionAllowedRegs = 0xFFFFu;
+ }
+
for (uint32_t i = 0; i < opCount; i++) {
const Operand& op = opArray[i];
const OpRWInfo& opRwInfo = rwInfo.operand(i);
@@ -149,26 +172,24 @@ Error X86RACFGBuilder::onInst(InstNode* inst, uint32_t& controlType, RAInstBuild
// ----------------
const Reg& reg = op.as<Reg>();
- uint32_t flags = raRegRwFlags(opRwInfo.opFlags());
- uint32_t allowedRegs = 0xFFFFFFFFu;
+ RATiedFlags flags = raRegRwFlags(opRwInfo.opFlags());
+ RegMask allowedRegs = instructionAllowedRegs;
- // X86-specific constraints related to LO|HI general purpose registers.
- // This is only required when the register is part of the encoding. If
- // the register is fixed we won't restrict anything as it doesn't restrict
- // encoding of other registers.
- if (reg.isGpb() && !(opRwInfo.opFlags() & OpRWInfo::kRegPhysId)) {
- flags |= RATiedReg::kX86Gpb;
+ // X86-specific constraints related to LO|HI general purpose registers. This is only required when the
+ // register is part of the encoding. If the register is fixed we won't restrict anything as it doesn't
+ // restrict encoding of other registers.
+ if (reg.isGpb() && !opRwInfo.hasOpFlag(OpRWFlags::kRegPhysId)) {
+ flags |= RATiedFlags::kX86_Gpb;
if (!_is64Bit) {
- // Restrict to first four - AL|AH|BL|BH|CL|CH|DL|DH. In 32-bit mode
- // it's not possible to access SIL|DIL, etc, so this is just enough.
+ // Restrict to first four - AL|AH|BL|BH|CL|CH|DL|DH. In 32-bit mode it's not possible to access
+ // SIL|DIL, etc, so this is just enough.
allowedRegs = 0x0Fu;
}
else {
- // If we encountered GPB-HI register the situation is much more
- // complicated than in 32-bit mode. We need to patch all registers
- // to not use ID higher than 7 and all GPB-LO registers to not use
- // index higher than 3. Instead of doing the patching here we just
- // set a flag and will do it later, to not complicate this loop.
+ // If we encountered GPB-HI register the situation is much more complicated than in 32-bit mode.
+ // We need to patch all registers to not use ID higher than 7 and all GPB-LO registers to not use
+ // index higher than 3. Instead of doing the patching here we just set a flag and will do it later,
+ // to not complicate this loop.
if (reg.isGpbHi()) {
hasGpbHiConstraint = true;
allowedRegs = 0x0Fu;
@@ -181,25 +202,24 @@ Error X86RACFGBuilder::onInst(InstNode* inst, uint32_t& controlType, RAInstBuild
RAWorkReg* workReg;
ASMJIT_PROPAGATE(_pass->virtIndexAsWorkReg(vIndex, &workReg));
- // Use RW instead of Write in case that not the whole register is
- // overwritten. This is important for liveness as we cannot kill a
- // register that will be used. For example `mov al, 0xFF` is not a
- // write-only operation if user allocated the whole `rax` register.
- if ((flags & RATiedReg::kRW) == RATiedReg::kWrite) {
+ // Use RW instead of Write in case that not the whole register is overwritten. This is important
+ // for liveness as we cannot kill a register that will be used. For example `mov al, 0xFF` is not
+ // a write-only operation if user allocated the whole `rax` register.
+ if ((flags & RATiedFlags::kRW) == RATiedFlags::kWrite) {
if (workReg->regByteMask() & ~(opRwInfo.writeByteMask() | opRwInfo.extendByteMask())) {
// Not write-only operation.
- flags = (flags & ~RATiedReg::kOut) | (RATiedReg::kRead | RATiedReg::kUse);
+ flags = (flags & ~RATiedFlags::kOut) | (RATiedFlags::kRead | RATiedFlags::kUse);
}
}
- // Do not use RegMem flag if changing Reg to Mem requires additional
- // CPU feature that may not be enabled.
- if (rwInfo.rmFeature() && (flags & (RATiedReg::kUseRM | RATiedReg::kOutRM))) {
- flags &= ~(RATiedReg::kUseRM | RATiedReg::kOutRM);
+ // Do not use RegMem flag if changing Reg to Mem requires additional CPU feature that may not be enabled.
+ if (rwInfo.rmFeature() && Support::test(flags, RATiedFlags::kUseRM | RATiedFlags::kOutRM)) {
+ flags &= ~(RATiedFlags::kUseRM | RATiedFlags::kOutRM);
}
- uint32_t group = workReg->group();
- uint32_t allocable = _pass->_availableRegs[group] & allowedRegs;
+ RegGroup group = workReg->group();
+ RegMask useRegs = _pass->_availableRegs[group] & allowedRegs;
+ RegMask outRegs = useRegs;
uint32_t useId = BaseReg::kIdBad;
uint32_t outId = BaseReg::kIdBad;
@@ -207,31 +227,75 @@ Error X86RACFGBuilder::onInst(InstNode* inst, uint32_t& controlType, RAInstBuild
uint32_t useRewriteMask = 0;
uint32_t outRewriteMask = 0;
- if (flags & RATiedReg::kUse) {
+ if (opRwInfo.consecutiveLeadCount()) {
+ // There must be a single consecutive register lead, otherwise the RW data is invalid.
+ if (consecutiveLeadId != Globals::kInvalidId)
+ return DebugUtils::errored(kErrorInvalidState);
+
+ // A consecutive lead register cannot be used as a consecutive +1/+2/+3 register, the registers must be distinct.
+ if (RATiedReg::consecutiveDataFromFlags(flags) != 0)
+ return DebugUtils::errored(kErrorNotConsecutiveRegs);
+
+ flags |= RATiedFlags::kLeadConsecutive | RATiedReg::consecutiveDataToFlags(opRwInfo.consecutiveLeadCount() - 1);
+ consecutiveLeadId = workReg->workId();
+
+ RegMask filter = raConsecutiveLeadCountToRegMaskFilter[opRwInfo.consecutiveLeadCount()];
+ if (Support::test(flags, RATiedFlags::kUse)) {
+ flags |= RATiedFlags::kUseConsecutive;
+ useRegs &= filter;
+ }
+ else {
+ flags |= RATiedFlags::kOutConsecutive;
+ outRegs &= filter;
+ }
+ }
+
+ if (Support::test(flags, RATiedFlags::kUse)) {
useRewriteMask = Support::bitMask(inst->getRewriteIndex(&reg._baseId));
- if (opRwInfo.opFlags() & OpRWInfo::kRegPhysId) {
+ if (opRwInfo.hasOpFlag(OpRWFlags::kRegPhysId)) {
useId = opRwInfo.physId();
- flags |= RATiedReg::kUseFixed;
+ flags |= RATiedFlags::kUseFixed;
+ }
+ else if (opRwInfo.hasOpFlag(OpRWFlags::kConsecutive)) {
+ if (consecutiveLeadId == Globals::kInvalidId)
+ return DebugUtils::errored(kErrorInvalidState);
+
+ if (consecutiveLeadId == workReg->workId())
+ return DebugUtils::errored(kErrorOverlappedRegs);
+
+ flags |= RATiedFlags::kUseConsecutive | RATiedReg::consecutiveDataToFlags(++consecutiveOffset);
}
}
else {
outRewriteMask = Support::bitMask(inst->getRewriteIndex(&reg._baseId));
- if (opRwInfo.opFlags() & OpRWInfo::kRegPhysId) {
+ if (opRwInfo.hasOpFlag(OpRWFlags::kRegPhysId)) {
outId = opRwInfo.physId();
- flags |= RATiedReg::kOutFixed;
+ flags |= RATiedFlags::kOutFixed;
+ }
+ else if (opRwInfo.hasOpFlag(OpRWFlags::kConsecutive)) {
+ if (consecutiveLeadId == Globals::kInvalidId)
+ return DebugUtils::errored(kErrorInvalidState);
+
+ if (consecutiveLeadId == workReg->workId())
+ return DebugUtils::errored(kErrorOverlappedRegs);
+
+ flags |= RATiedFlags::kOutConsecutive | RATiedReg::consecutiveDataToFlags(++consecutiveOffset);
}
}
- ASMJIT_PROPAGATE(ib.add(workReg, flags, allocable, useId, useRewriteMask, outId, outRewriteMask, opRwInfo.rmSize()));
+ ASMJIT_PROPAGATE(ib.add(workReg, flags, useRegs, useId, useRewriteMask, outRegs, outId, outRewriteMask, opRwInfo.rmSize(), consecutiveParent));
if (singleRegOps == i)
singleRegOps++;
+
+ if (Support::test(flags, RATiedFlags::kLeadConsecutive | RATiedFlags::kUseConsecutive | RATiedFlags::kOutConsecutive))
+ consecutiveParent = workReg->workId();
}
}
else if (op.isMem()) {
// Memory Operand
// --------------
const Mem& mem = op.as<Mem>();
- ib.addForbiddenFlags(RATiedReg::kUseRM | RATiedReg::kOutRM);
+ ib.addForbiddenFlags(RATiedFlags::kUseRM | RATiedFlags::kOutRM);
if (mem.isRegHome()) {
RAWorkReg* workReg;
@@ -244,9 +308,9 @@ Error X86RACFGBuilder::onInst(InstNode* inst, uint32_t& controlType, RAInstBuild
RAWorkReg* workReg;
ASMJIT_PROPAGATE(_pass->virtIndexAsWorkReg(vIndex, &workReg));
- uint32_t flags = raMemBaseRwFlags(opRwInfo.opFlags());
- uint32_t group = workReg->group();
- uint32_t allocable = _pass->_availableRegs[group];
+ RATiedFlags flags = raMemBaseRwFlags(opRwInfo.opFlags());
+ RegGroup group = workReg->group();
+ RegMask inOutRegs = _pass->_availableRegs[group];
uint32_t useId = BaseReg::kIdBad;
uint32_t outId = BaseReg::kIdBad;
@@ -254,22 +318,22 @@ Error X86RACFGBuilder::onInst(InstNode* inst, uint32_t& controlType, RAInstBuild
uint32_t useRewriteMask = 0;
uint32_t outRewriteMask = 0;
- if (flags & RATiedReg::kUse) {
+ if (Support::test(flags, RATiedFlags::kUse)) {
useRewriteMask = Support::bitMask(inst->getRewriteIndex(&mem._baseId));
- if (opRwInfo.opFlags() & OpRWInfo::kMemPhysId) {
+ if (opRwInfo.hasOpFlag(OpRWFlags::kMemPhysId)) {
useId = opRwInfo.physId();
- flags |= RATiedReg::kUseFixed;
+ flags |= RATiedFlags::kUseFixed;
}
}
else {
outRewriteMask = Support::bitMask(inst->getRewriteIndex(&mem._baseId));
- if (opRwInfo.opFlags() & OpRWInfo::kMemPhysId) {
+ if (opRwInfo.hasOpFlag(OpRWFlags::kMemPhysId)) {
outId = opRwInfo.physId();
- flags |= RATiedReg::kOutFixed;
+ flags |= RATiedFlags::kOutFixed;
}
}
- ASMJIT_PROPAGATE(ib.add(workReg, flags, allocable, useId, useRewriteMask, outId, outRewriteMask));
+ ASMJIT_PROPAGATE(ib.add(workReg, flags, inOutRegs, useId, useRewriteMask, inOutRegs, outId, outRewriteMask));
}
}
@@ -279,9 +343,9 @@ Error X86RACFGBuilder::onInst(InstNode* inst, uint32_t& controlType, RAInstBuild
RAWorkReg* workReg;
ASMJIT_PROPAGATE(_pass->virtIndexAsWorkReg(vIndex, &workReg));
- uint32_t flags = raMemIndexRwFlags(opRwInfo.opFlags());
- uint32_t group = workReg->group();
- uint32_t allocable = _pass->_availableRegs[group];
+ RATiedFlags flags = raMemIndexRwFlags(opRwInfo.opFlags());
+ RegGroup group = workReg->group();
+ RegMask inOutRegs = _pass->_availableRegs[group] & instructionAllowedRegs;
// Index registers have never fixed id on X86/x64.
const uint32_t useId = BaseReg::kIdBad;
@@ -290,12 +354,12 @@ Error X86RACFGBuilder::onInst(InstNode* inst, uint32_t& controlType, RAInstBuild
uint32_t useRewriteMask = 0;
uint32_t outRewriteMask = 0;
- if (flags & RATiedReg::kUse)
+ if (Support::test(flags, RATiedFlags::kUse))
useRewriteMask = Support::bitMask(inst->getRewriteIndex(&mem._data[Operand::kDataMemIndexId]));
else
outRewriteMask = Support::bitMask(inst->getRewriteIndex(&mem._data[Operand::kDataMemIndexId]));
- ASMJIT_PROPAGATE(ib.add(workReg, RATiedReg::kUse | RATiedReg::kRead, allocable, useId, useRewriteMask, outId, outRewriteMask));
+ ASMJIT_PROPAGATE(ib.add(workReg, RATiedFlags::kUse | RATiedFlags::kRead, inOutRegs, useId, useRewriteMask, inOutRegs, outId, outRewriteMask));
}
}
}
@@ -309,23 +373,23 @@ Error X86RACFGBuilder::onInst(InstNode* inst, uint32_t& controlType, RAInstBuild
RAWorkReg* workReg;
ASMJIT_PROPAGATE(_pass->virtIndexAsWorkReg(vIndex, &workReg));
- uint32_t group = workReg->group();
+ RegGroup group = workReg->group();
+ RegMask inOutRegs = _pass->_availableRegs[group];
uint32_t rewriteMask = Support::bitMask(inst->getRewriteIndex(&inst->extraReg()._id));
- if (group == Gp::kGroupKReg) {
+ if (group == RegGroup::kX86_K) {
// AVX-512 mask selector {k} register - read-only, allocable to any register except {k0}.
- uint32_t allocableRegs= _pass->_availableRegs[group] & ~Support::bitMask(0);
- ASMJIT_PROPAGATE(ib.add(workReg, RATiedReg::kUse | RATiedReg::kRead, allocableRegs, BaseReg::kIdBad, rewriteMask, BaseReg::kIdBad, 0));
+ ASMJIT_PROPAGATE(ib.add(workReg, RATiedFlags::kUse | RATiedFlags::kRead, inOutRegs, BaseReg::kIdBad, rewriteMask, inOutRegs, BaseReg::kIdBad, 0));
singleRegOps = 0;
}
else {
// REP {cx|ecx|rcx} register - read & write, allocable to {cx|ecx|rcx} only.
- ASMJIT_PROPAGATE(ib.add(workReg, RATiedReg::kUse | RATiedReg::kRW, 0, Gp::kIdCx, rewriteMask, Gp::kIdBad, 0));
+ ASMJIT_PROPAGATE(ib.add(workReg, RATiedFlags::kUse | RATiedFlags::kRW, inOutRegs, Gp::kIdCx, rewriteMask, inOutRegs, Gp::kIdBad, 0));
}
}
else {
- uint32_t group = inst->extraReg().group();
- if (group == Gp::kGroupKReg && inst->extraReg().id() != 0)
+ RegGroup group = inst->extraReg().group();
+ if (group == RegGroup::kX86_K && inst->extraReg().id() != 0)
singleRegOps = 0;
}
}
@@ -333,16 +397,18 @@ Error X86RACFGBuilder::onInst(InstNode* inst, uint32_t& controlType, RAInstBuild
// Handle X86 constraints.
if (hasGpbHiConstraint) {
for (RATiedReg& tiedReg : ib) {
- tiedReg._allocableRegs &= tiedReg.hasFlag(RATiedReg::kX86Gpb) ? 0x0Fu : 0xFFu;
+ RegMask filter = tiedReg.hasFlag(RATiedFlags::kX86_Gpb) ? 0x0Fu : 0xFFu;
+ tiedReg._useRegMask &= filter;
+ tiedReg._outRegMask &= filter;
}
}
if (ib.tiedRegCount() == 1) {
// Handle special cases of some instructions where all operands share the same
// register. In such case the single operand becomes read-only or write-only.
- uint32_t singleRegCase = InstDB::kSingleRegNone;
+ InstSameRegHint sameRegHint = InstSameRegHint::kNone;
if (singleRegOps == opCount) {
- singleRegCase = instInfo.singleRegCase();
+ sameRegHint = instInfo.sameRegHint();
}
else if (opCount == 2 && inst->op(1).isImm()) {
// Handle some tricks used by X86 asm.
@@ -350,14 +416,14 @@ Error X86RACFGBuilder::onInst(InstNode* inst, uint32_t& controlType, RAInstBuild
const Imm& imm = inst->op(1).as<Imm>();
const RAWorkReg* workReg = _pass->workRegById(ib[0]->workId());
- uint32_t workRegSize = workReg->info().size();
+ uint32_t workRegSize = workReg->signature().size();
switch (inst->id()) {
case Inst::kIdOr: {
// Sets the value of the destination register to -1, previous content unused.
if (reg.size() >= 4 || reg.size() >= workRegSize) {
if (imm.value() == -1 || imm.valueAs<uint64_t>() == raImmMaskFromSize(reg.size()))
- singleRegCase = InstDB::kSingleRegWO;
+ sameRegHint = InstSameRegHint::kWO;
}
ASMJIT_FALLTHROUGH;
}
@@ -374,52 +440,49 @@ Error X86RACFGBuilder::onInst(InstNode* inst, uint32_t& controlType, RAInstBuild
// Updates [E|R]FLAGS without changing the content.
if (reg.size() != 4 || reg.size() >= workRegSize) {
if (imm.value() == 0)
- singleRegCase = InstDB::kSingleRegRO;
+ sameRegHint = InstSameRegHint::kRO;
}
break;
}
}
}
- switch (singleRegCase) {
- case InstDB::kSingleRegNone:
+ switch (sameRegHint) {
+ case InstSameRegHint::kNone:
break;
- case InstDB::kSingleRegRO:
+ case InstSameRegHint::kRO:
ib[0]->makeReadOnly();
break;
- case InstDB::kSingleRegWO:
+ case InstSameRegHint::kWO:
ib[0]->makeWriteOnly();
break;
}
}
- controlType = instInfo.controlType();
+ cf = instInfo.controlFlow();
}
return kErrorOk;
}
-// ============================================================================
-// [asmjit::x86::X86RACFGBuilder - OnCall]
-// ============================================================================
+// x86::RACFGBuilder - OnInvoke
+// ============================
-Error X86RACFGBuilder::onBeforeInvoke(InvokeNode* invokeNode) noexcept {
- uint32_t argCount = invokeNode->argCount();
- uint32_t retCount = invokeNode->retCount();
+Error RACFGBuilder::onBeforeInvoke(InvokeNode* invokeNode) noexcept {
const FuncDetail& fd = invokeNode->detail();
+ uint32_t argCount = invokeNode->argCount();
cc()->_setCursor(invokeNode->prev());
+ RegType nativeRegType = cc()->_gpSignature.regType();
- uint32_t nativeRegType = cc()->_gpRegInfo.type();
-
- for (uint32_t loIndex = 0; loIndex < argCount; loIndex++) {
- for (uint32_t hiIndex = 0; hiIndex <= kFuncArgHi; hiIndex += kFuncArgHi) {
- uint32_t argIndex = loIndex + hiIndex;
- if (!fd.hasArg(argIndex))
- continue;
+ for (uint32_t argIndex = 0; argIndex < argCount; argIndex++) {
+ const FuncValuePack& argPack = fd.argPack(argIndex);
+ for (uint32_t valueIndex = 0; valueIndex < Globals::kMaxValuePack; valueIndex++) {
+ if (!argPack[valueIndex])
+ break;
- const FuncValue& arg = fd.arg(argIndex);
- const Operand& op = invokeNode->arg(argIndex);
+ const FuncValue& arg = argPack[valueIndex];
+ const Operand& op = invokeNode->arg(argIndex, valueIndex);
if (op.isNone())
continue;
@@ -430,8 +493,8 @@ Error X86RACFGBuilder::onBeforeInvoke(InvokeNode* invokeNode) noexcept {
ASMJIT_PROPAGATE(_pass->virtIndexAsWorkReg(Operand::virtIdToIndex(reg.id()), &workReg));
if (arg.isReg()) {
- uint32_t regGroup = workReg->group();
- uint32_t argGroup = Reg::groupOf(arg.regType());
+ RegGroup regGroup = workReg->group();
+ RegGroup argGroup = Reg::groupOf(arg.regType());
if (arg.isIndirect()) {
if (reg.isGp()) {
@@ -443,7 +506,7 @@ Error X86RACFGBuilder::onBeforeInvoke(InvokeNode* invokeNode) noexcept {
BaseReg indirectReg;
moveVecToPtr(invokeNode, arg, reg.as<Vec>(), &indirectReg);
- invokeNode->_args[argIndex] = indirectReg;
+ invokeNode->_args[argIndex][valueIndex] = indirectReg;
}
else {
if (regGroup != argGroup) {
@@ -475,7 +538,7 @@ Error X86RACFGBuilder::onBeforeInvoke(InvokeNode* invokeNode) noexcept {
if (arg.isReg()) {
BaseReg reg;
ASMJIT_PROPAGATE(moveImmToRegArg(invokeNode, arg, op.as<Imm>(), &reg));
- invokeNode->_args[argIndex] = reg;
+ invokeNode->_args[argIndex][valueIndex] = reg;
}
else {
ASMJIT_PROPAGATE(moveImmToStackArg(invokeNode, arg, op.as<Imm>()));
@@ -485,82 +548,86 @@ Error X86RACFGBuilder::onBeforeInvoke(InvokeNode* invokeNode) noexcept {
}
cc()->_setCursor(invokeNode);
- if (fd.hasFlag(CallConv::kFlagCalleePopsStack))
+ if (fd.hasFlag(CallConvFlags::kCalleePopsStack) && fd.argStackSize() != 0)
ASMJIT_PROPAGATE(cc()->sub(cc()->zsp(), fd.argStackSize()));
- for (uint32_t retIndex = 0; retIndex < retCount; retIndex++) {
- const FuncValue& ret = fd.ret(retIndex);
- const Operand& op = invokeNode->ret(retIndex);
-
- if (op.isReg()) {
- const Reg& reg = op.as<Reg>();
- RAWorkReg* workReg;
- ASMJIT_PROPAGATE(_pass->virtIndexAsWorkReg(Operand::virtIdToIndex(reg.id()), &workReg));
-
- if (ret.isReg()) {
- if (ret.regType() == Reg::kTypeSt) {
- if (workReg->group() != Reg::kGroupVec)
- return DebugUtils::errored(kErrorInvalidAssignment);
-
- Reg dst = Reg(workReg->signature(), workReg->virtId());
- Mem mem;
-
- uint32_t typeId = Type::baseOf(workReg->typeId());
- if (ret.hasTypeId())
- typeId = ret.typeId();
-
- switch (typeId) {
- case Type::kIdF32:
- ASMJIT_PROPAGATE(_pass->useTemporaryMem(mem, 4, 4));
- mem.setSize(4);
- ASMJIT_PROPAGATE(cc()->fstp(mem));
- ASMJIT_PROPAGATE(cc()->emit(choose(Inst::kIdMovss, Inst::kIdVmovss), dst.as<Xmm>(), mem));
- break;
+ if (fd.hasRet()) {
+ for (uint32_t valueIndex = 0; valueIndex < Globals::kMaxValuePack; valueIndex++) {
+ const FuncValue& ret = fd.ret(valueIndex);
+ if (!ret)
+ break;
- case Type::kIdF64:
- ASMJIT_PROPAGATE(_pass->useTemporaryMem(mem, 8, 4));
- mem.setSize(8);
- ASMJIT_PROPAGATE(cc()->fstp(mem));
- ASMJIT_PROPAGATE(cc()->emit(choose(Inst::kIdMovsd, Inst::kIdVmovsd), dst.as<Xmm>(), mem));
- break;
+ const Operand& op = invokeNode->ret(valueIndex);
+ if (op.isReg()) {
+ const Reg& reg = op.as<Reg>();
+ RAWorkReg* workReg;
+ ASMJIT_PROPAGATE(_pass->virtIndexAsWorkReg(Operand::virtIdToIndex(reg.id()), &workReg));
- default:
+ if (ret.isReg()) {
+ if (ret.regType() == RegType::kX86_St) {
+ if (workReg->group() != RegGroup::kVec)
return DebugUtils::errored(kErrorInvalidAssignment);
+
+ Reg dst(workReg->signature(), workReg->virtId());
+ Mem mem;
+
+ TypeId typeId = TypeUtils::scalarOf(workReg->typeId());
+ if (ret.hasTypeId())
+ typeId = ret.typeId();
+
+ switch (typeId) {
+ case TypeId::kFloat32:
+ ASMJIT_PROPAGATE(_pass->useTemporaryMem(mem, 4, 4));
+ mem.setSize(4);
+ ASMJIT_PROPAGATE(cc()->fstp(mem));
+ ASMJIT_PROPAGATE(cc()->emit(choose(Inst::kIdMovss, Inst::kIdVmovss), dst.as<Xmm>(), mem));
+ break;
+
+ case TypeId::kFloat64:
+ ASMJIT_PROPAGATE(_pass->useTemporaryMem(mem, 8, 4));
+ mem.setSize(8);
+ ASMJIT_PROPAGATE(cc()->fstp(mem));
+ ASMJIT_PROPAGATE(cc()->emit(choose(Inst::kIdMovsd, Inst::kIdVmovsd), dst.as<Xmm>(), mem));
+ break;
+
+ default:
+ return DebugUtils::errored(kErrorInvalidAssignment);
+ }
}
- }
- else {
- uint32_t regGroup = workReg->group();
- uint32_t retGroup = Reg::groupOf(ret.regType());
+ else {
+ RegGroup regGroup = workReg->group();
+ RegGroup retGroup = Reg::groupOf(ret.regType());
- if (regGroup != retGroup) {
- // TODO: Conversion is not supported.
- return DebugUtils::errored(kErrorInvalidAssignment);
+ if (regGroup != retGroup) {
+ // TODO: Conversion is not supported.
+ return DebugUtils::errored(kErrorInvalidAssignment);
+ }
}
}
}
}
}
- // This block has function invokeNode(s).
- _curBlock->addFlags(RABlock::kFlagHasFuncCalls);
- _pass->func()->frame().addAttributes(FuncFrame::kAttrHasFuncCalls);
+ // This block has function call(s).
+ _curBlock->addFlags(RABlockFlags::kHasFuncCalls);
+ _pass->func()->frame().addAttributes(FuncAttributes::kHasFuncCalls);
_pass->func()->frame().updateCallStackSize(fd.argStackSize());
return kErrorOk;
}
-Error X86RACFGBuilder::onInvoke(InvokeNode* invokeNode, RAInstBuilder& ib) noexcept {
+Error RACFGBuilder::onInvoke(InvokeNode* invokeNode, RAInstBuilder& ib) noexcept {
uint32_t argCount = invokeNode->argCount();
- uint32_t retCount = invokeNode->retCount();
const FuncDetail& fd = invokeNode->detail();
for (uint32_t argIndex = 0; argIndex < argCount; argIndex++) {
- for (uint32_t argHi = 0; argHi <= kFuncArgHi; argHi += kFuncArgHi) {
- if (!fd.hasArg(argIndex + argHi))
+ const FuncValuePack& argPack = fd.argPack(argIndex);
+ for (uint32_t valueIndex = 0; valueIndex < Globals::kMaxValuePack; valueIndex++) {
+ if (!argPack[valueIndex])
continue;
- const FuncValue& arg = fd.arg(argIndex + argHi);
- const Operand& op = invokeNode->arg(argIndex + argHi);
+ const FuncValue& arg = argPack[valueIndex];
+ const Operand& op = invokeNode->arg(argIndex, valueIndex);
if (op.isNone())
continue;
@@ -571,14 +638,14 @@ Error X86RACFGBuilder::onInvoke(InvokeNode* invokeNode, RAInstBuilder& ib) noexc
ASMJIT_PROPAGATE(_pass->virtIndexAsWorkReg(Operand::virtIdToIndex(reg.id()), &workReg));
if (arg.isIndirect()) {
- uint32_t regGroup = workReg->group();
- if (regGroup != BaseReg::kGroupGp)
+ RegGroup regGroup = workReg->group();
+ if (regGroup != RegGroup::kGp)
return DebugUtils::errored(kErrorInvalidState);
ASMJIT_PROPAGATE(ib.addCallArg(workReg, arg.regId()));
}
else if (arg.isReg()) {
- uint32_t regGroup = workReg->group();
- uint32_t argGroup = Reg::groupOf(arg.regType());
+ RegGroup regGroup = workReg->group();
+ RegGroup argGroup = Reg::groupOf(arg.regType());
if (regGroup == argGroup) {
ASMJIT_PROPAGATE(ib.addCallArg(workReg, arg.regId()));
@@ -588,12 +655,14 @@ Error X86RACFGBuilder::onInvoke(InvokeNode* invokeNode, RAInstBuilder& ib) noexc
}
}
- for (uint32_t retIndex = 0; retIndex < retCount; retIndex++) {
+ for (uint32_t retIndex = 0; retIndex < Globals::kMaxValuePack; retIndex++) {
const FuncValue& ret = fd.ret(retIndex);
- const Operand& op = invokeNode->ret(retIndex);
+ if (!ret)
+ break;
// Not handled here...
- if (ret.regType() == Reg::kTypeSt)
+ const Operand& op = invokeNode->ret(retIndex);
+ if (ret.regType() == RegType::kX86_St)
continue;
if (op.isReg()) {
@@ -602,8 +671,8 @@ Error X86RACFGBuilder::onInvoke(InvokeNode* invokeNode, RAInstBuilder& ib) noexc
ASMJIT_PROPAGATE(_pass->virtIndexAsWorkReg(Operand::virtIdToIndex(reg.id()), &workReg));
if (ret.isReg()) {
- uint32_t regGroup = workReg->group();
- uint32_t retGroup = Reg::groupOf(ret.regType());
+ RegGroup regGroup = workReg->group();
+ RegGroup retGroup = Reg::groupOf(ret.regType());
if (regGroup == retGroup) {
ASMJIT_PROPAGATE(ib.addCallRet(workReg, ret.regId()));
@@ -616,32 +685,25 @@ Error X86RACFGBuilder::onInvoke(InvokeNode* invokeNode, RAInstBuilder& ib) noexc
}
// Setup clobbered registers.
- ib._clobbered[0] = Support::lsbMask<uint32_t>(_pass->_physRegCount[0]) & ~fd.preservedRegs(0);
- ib._clobbered[1] = Support::lsbMask<uint32_t>(_pass->_physRegCount[1]) & ~fd.preservedRegs(1);
- ib._clobbered[2] = Support::lsbMask<uint32_t>(_pass->_physRegCount[2]) & ~fd.preservedRegs(2);
- ib._clobbered[3] = Support::lsbMask<uint32_t>(_pass->_physRegCount[3]) & ~fd.preservedRegs(3);
+ for (RegGroup group : RegGroupVirtValues{})
+ ib._clobbered[group] = Support::lsbMask<RegMask>(_pass->_physRegCount[group]) & ~fd.preservedRegs(group);
return kErrorOk;
}
-// ============================================================================
-// [asmjit::x86::X86RACFGBuilder - MoveVecToPtr]
-// ============================================================================
-
-static uint32_t x86VecRegSignatureBySize(uint32_t size) noexcept {
- if (size >= 64)
- return Zmm::kSignature;
- else if (size >= 32)
- return Ymm::kSignature;
- else
- return Xmm::kSignature;
+// x86::RACFGBuilder - MoveVecToPtr
+// ================================
+
+static inline OperandSignature x86VecRegSignatureBySize(uint32_t size) noexcept {
+ return OperandSignature{size >= 64 ? uint32_t(Zmm::kSignature) :
+ size >= 32 ? uint32_t(Ymm::kSignature) : uint32_t(Xmm::kSignature)};
}
-Error X86RACFGBuilder::moveVecToPtr(InvokeNode* invokeNode, const FuncValue& arg, const Vec& src, BaseReg* out) noexcept {
+Error RACFGBuilder::moveVecToPtr(InvokeNode* invokeNode, const FuncValue& arg, const Vec& src, BaseReg* out) noexcept {
DebugUtils::unused(invokeNode);
ASMJIT_ASSERT(arg.isReg());
- uint32_t argSize = Type::sizeOf(arg.typeId());
+ uint32_t argSize = TypeUtils::sizeOf(arg.typeId());
if (argSize == 0)
return DebugUtils::errored(kErrorInvalidState);
@@ -659,10 +721,10 @@ Error X86RACFGBuilder::moveVecToPtr(InvokeNode* invokeNode, const FuncValue& arg
if (argSize > 16)
vMovInstId = Inst::kIdVmovaps;
- ASMJIT_PROPAGATE(cc()->_newReg(out, cc()->_gpRegInfo.type(), nullptr));
+ ASMJIT_PROPAGATE(cc()->_newReg(out, ArchTraits::byArch(cc()->arch()).regTypeToTypeId(cc()->_gpSignature.regType()), nullptr));
VirtReg* vReg = cc()->virtRegById(out->id());
- vReg->setWeight(RAPass::kCallArgWeight);
+ vReg->setWeight(BaseRAPass::kCallArgWeight);
ASMJIT_PROPAGATE(cc()->lea(out->as<Gp>(), vecPtr));
ASMJIT_PROPAGATE(cc()->emit(vMovInstId, ptr(out->as<Gp>()), vecReg));
@@ -675,38 +737,37 @@ Error X86RACFGBuilder::moveVecToPtr(InvokeNode* invokeNode, const FuncValue& arg
return kErrorOk;
}
-// ============================================================================
-// [asmjit::x86::X86RACFGBuilder - MoveImmToRegArg]
-// ============================================================================
+// x86::RACFGBuilder - MoveImmToRegArg
+// ===================================
-Error X86RACFGBuilder::moveImmToRegArg(InvokeNode* invokeNode, const FuncValue& arg, const Imm& imm_, BaseReg* out) noexcept {
+Error RACFGBuilder::moveImmToRegArg(InvokeNode* invokeNode, const FuncValue& arg, const Imm& imm_, BaseReg* out) noexcept {
DebugUtils::unused(invokeNode);
ASMJIT_ASSERT(arg.isReg());
Imm imm(imm_);
- uint32_t rTypeId = Type::kIdU32;
+ TypeId rTypeId = TypeId::kUInt32;
switch (arg.typeId()) {
- case Type::kIdI8: imm.signExtend8Bits(); goto MovU32;
- case Type::kIdU8: imm.zeroExtend8Bits(); goto MovU32;
- case Type::kIdI16: imm.signExtend16Bits(); goto MovU32;
- case Type::kIdU16: imm.zeroExtend16Bits(); goto MovU32;
+ case TypeId::kInt8: imm.signExtend8Bits(); goto MovU32;
+ case TypeId::kUInt8: imm.zeroExtend8Bits(); goto MovU32;
+ case TypeId::kInt16: imm.signExtend16Bits(); goto MovU32;
+ case TypeId::kUInt16: imm.zeroExtend16Bits(); goto MovU32;
- case Type::kIdI32:
- case Type::kIdU32:
+ case TypeId::kInt32:
+ case TypeId::kUInt32:
MovU32:
imm.zeroExtend32Bits();
break;
- case Type::kIdI64:
- case Type::kIdU64:
+ case TypeId::kInt64:
+ case TypeId::kUInt64:
// Moving to GPD automatically zero extends in 64-bit mode.
if (imm.isUInt32()) {
imm.zeroExtend32Bits();
break;
}
- rTypeId = Type::kIdU64;
+ rTypeId = TypeId::kUInt64;
break;
default:
@@ -714,16 +775,15 @@ MovU32:
}
ASMJIT_PROPAGATE(cc()->_newReg(out, rTypeId, nullptr));
- cc()->virtRegById(out->id())->setWeight(RAPass::kCallArgWeight);
+ cc()->virtRegById(out->id())->setWeight(BaseRAPass::kCallArgWeight);
return cc()->mov(out->as<x86::Gp>(), imm);
}
-// ============================================================================
-// [asmjit::x86::X86RACFGBuilder - MoveImmToStackArg]
-// ============================================================================
+// x86::RACFGBuilder - MoveImmToStackArg
+// =====================================
-Error X86RACFGBuilder::moveImmToStackArg(InvokeNode* invokeNode, const FuncValue& arg, const Imm& imm_) noexcept {
+Error RACFGBuilder::moveImmToStackArg(InvokeNode* invokeNode, const FuncValue& arg, const Imm& imm_) noexcept {
DebugUtils::unused(invokeNode);
ASMJIT_ASSERT(arg.isStack());
@@ -734,30 +794,28 @@ Error X86RACFGBuilder::moveImmToStackArg(InvokeNode* invokeNode, const FuncValue
imm[0] = imm_;
uint32_t nMovs = 0;
- // One stack entry has the same size as the native register size. That means
- // that if we want to move a 32-bit integer on the stack in 64-bit mode, we
- // need to extend it to a 64-bit integer first. In 32-bit mode, pushing a
- // 64-bit on stack is done in two steps by pushing low and high parts
- // separately.
+ // One stack entry has the same size as the native register size. That means that if we want to move a 32-bit
+ // integer on the stack in 64-bit mode, we need to extend it to a 64-bit integer first. In 32-bit mode, pushing
+ // a 64-bit on stack is done in two steps by pushing low and high parts separately.
switch (arg.typeId()) {
- case Type::kIdI8: imm[0].signExtend8Bits(); goto MovU32;
- case Type::kIdU8: imm[0].zeroExtend8Bits(); goto MovU32;
- case Type::kIdI16: imm[0].signExtend16Bits(); goto MovU32;
- case Type::kIdU16: imm[0].zeroExtend16Bits(); goto MovU32;
-
- case Type::kIdI32:
- case Type::kIdU32:
- case Type::kIdF32:
+ case TypeId::kInt8: imm[0].signExtend8Bits(); goto MovU32;
+ case TypeId::kUInt8: imm[0].zeroExtend8Bits(); goto MovU32;
+ case TypeId::kInt16: imm[0].signExtend16Bits(); goto MovU32;
+ case TypeId::kUInt16: imm[0].zeroExtend16Bits(); goto MovU32;
+
+ case TypeId::kInt32:
+ case TypeId::kUInt32:
+ case TypeId::kFloat32:
MovU32:
imm[0].zeroExtend32Bits();
nMovs = 1;
break;
- case Type::kIdI64:
- case Type::kIdU64:
- case Type::kIdF64:
- case Type::kIdMmx32:
- case Type::kIdMmx64:
+ case TypeId::kInt64:
+ case TypeId::kUInt64:
+ case TypeId::kFloat64:
+ case TypeId::kMmx32:
+ case TypeId::kMmx64:
if (_is64Bit && imm[0].isInt32()) {
stackPtr.setSize(8);
nMovs = 1;
@@ -781,11 +839,10 @@ MovU32:
return kErrorOk;
}
-// ============================================================================
-// [asmjit::x86::X86RACFGBuilder - MoveRegToStackArg]
-// ============================================================================
+// x86::RACFGBuilder - MoveRegToStackArg
+// =====================================
-Error X86RACFGBuilder::moveRegToStackArg(InvokeNode* invokeNode, const FuncValue& arg, const BaseReg& reg) noexcept {
+Error RACFGBuilder::moveRegToStackArg(InvokeNode* invokeNode, const FuncValue& arg, const BaseReg& reg) noexcept {
DebugUtils::unused(invokeNode);
ASMJIT_ASSERT(arg.isStack());
@@ -794,124 +851,124 @@ Error X86RACFGBuilder::moveRegToStackArg(InvokeNode* invokeNode, const FuncValue
VirtReg* vr = cc()->virtRegById(reg.id());
uint32_t registerSize = cc()->registerSize();
- uint32_t instId = 0;
+ InstId instId = 0;
- uint32_t dstTypeId = arg.typeId();
- uint32_t srcTypeId = vr->typeId();
+ TypeId dstTypeId = arg.typeId();
+ TypeId srcTypeId = vr->typeId();
switch (dstTypeId) {
- case Type::kIdI64:
- case Type::kIdU64:
+ case TypeId::kInt64:
+ case TypeId::kUInt64:
// Extend BYTE->QWORD (GP).
- if (Type::isGp8(srcTypeId)) {
- r1.setRegT<Reg::kTypeGpbLo>(reg.id());
+ if (TypeUtils::isGp8(srcTypeId)) {
+ r1.setRegT<RegType::kX86_GpbLo>(reg.id());
- instId = (dstTypeId == Type::kIdI64 && srcTypeId == Type::kIdI8) ? Inst::kIdMovsx : Inst::kIdMovzx;
+ instId = (dstTypeId == TypeId::kInt64 && srcTypeId == TypeId::kInt8) ? Inst::kIdMovsx : Inst::kIdMovzx;
goto ExtendMovGpXQ;
}
// Extend WORD->QWORD (GP).
- if (Type::isGp16(srcTypeId)) {
- r1.setRegT<Reg::kTypeGpw>(reg.id());
+ if (TypeUtils::isGp16(srcTypeId)) {
+ r1.setRegT<RegType::kX86_Gpw>(reg.id());
- instId = (dstTypeId == Type::kIdI64 && srcTypeId == Type::kIdI16) ? Inst::kIdMovsx : Inst::kIdMovzx;
+ instId = (dstTypeId == TypeId::kInt64 && srcTypeId == TypeId::kInt16) ? Inst::kIdMovsx : Inst::kIdMovzx;
goto ExtendMovGpXQ;
}
// Extend DWORD->QWORD (GP).
- if (Type::isGp32(srcTypeId)) {
- r1.setRegT<Reg::kTypeGpd>(reg.id());
+ if (TypeUtils::isGp32(srcTypeId)) {
+ r1.setRegT<RegType::kX86_Gpd>(reg.id());
instId = Inst::kIdMovsxd;
- if (dstTypeId == Type::kIdI64 && srcTypeId == Type::kIdI32)
+ if (dstTypeId == TypeId::kInt64 && srcTypeId == TypeId::kInt32)
goto ExtendMovGpXQ;
else
goto ZeroExtendGpDQ;
}
// Move QWORD (GP).
- if (Type::isGp64(srcTypeId)) goto MovGpQ;
- if (Type::isMmx(srcTypeId)) goto MovMmQ;
- if (Type::isVec(srcTypeId)) goto MovXmmQ;
+ if (TypeUtils::isGp64(srcTypeId)) goto MovGpQ;
+ if (TypeUtils::isMmx(srcTypeId)) goto MovMmQ;
+ if (TypeUtils::isVec(srcTypeId)) goto MovXmmQ;
break;
- case Type::kIdI32:
- case Type::kIdU32:
- case Type::kIdI16:
- case Type::kIdU16:
+ case TypeId::kInt32:
+ case TypeId::kUInt32:
+ case TypeId::kInt16:
+ case TypeId::kUInt16:
// DWORD <- WORD (Zero|Sign Extend).
- if (Type::isGp16(srcTypeId)) {
- bool isDstSigned = dstTypeId == Type::kIdI16 || dstTypeId == Type::kIdI32;
- bool isSrcSigned = srcTypeId == Type::kIdI8 || srcTypeId == Type::kIdI16;
+ if (TypeUtils::isGp16(srcTypeId)) {
+ bool isDstSigned = dstTypeId == TypeId::kInt16 || dstTypeId == TypeId::kInt32;
+ bool isSrcSigned = srcTypeId == TypeId::kInt8 || srcTypeId == TypeId::kInt16;
- r1.setRegT<Reg::kTypeGpw>(reg.id());
+ r1.setRegT<RegType::kX86_Gpw>(reg.id());
instId = isDstSigned && isSrcSigned ? Inst::kIdMovsx : Inst::kIdMovzx;
goto ExtendMovGpD;
}
// DWORD <- BYTE (Zero|Sign Extend).
- if (Type::isGp8(srcTypeId)) {
- bool isDstSigned = dstTypeId == Type::kIdI16 || dstTypeId == Type::kIdI32;
- bool isSrcSigned = srcTypeId == Type::kIdI8 || srcTypeId == Type::kIdI16;
+ if (TypeUtils::isGp8(srcTypeId)) {
+ bool isDstSigned = dstTypeId == TypeId::kInt16 || dstTypeId == TypeId::kInt32;
+ bool isSrcSigned = srcTypeId == TypeId::kInt8 || srcTypeId == TypeId::kInt16;
- r1.setRegT<Reg::kTypeGpbLo>(reg.id());
+ r1.setRegT<RegType::kX86_GpbLo>(reg.id());
instId = isDstSigned && isSrcSigned ? Inst::kIdMovsx : Inst::kIdMovzx;
goto ExtendMovGpD;
}
ASMJIT_FALLTHROUGH;
- case Type::kIdI8:
- case Type::kIdU8:
- if (Type::isInt(srcTypeId)) goto MovGpD;
- if (Type::isMmx(srcTypeId)) goto MovMmD;
- if (Type::isVec(srcTypeId)) goto MovXmmD;
+ case TypeId::kInt8:
+ case TypeId::kUInt8:
+ if (TypeUtils::isInt(srcTypeId)) goto MovGpD;
+ if (TypeUtils::isMmx(srcTypeId)) goto MovMmD;
+ if (TypeUtils::isVec(srcTypeId)) goto MovXmmD;
break;
- case Type::kIdMmx32:
- case Type::kIdMmx64:
+ case TypeId::kMmx32:
+ case TypeId::kMmx64:
// Extend BYTE->QWORD (GP).
- if (Type::isGp8(srcTypeId)) {
- r1.setRegT<Reg::kTypeGpbLo>(reg.id());
+ if (TypeUtils::isGp8(srcTypeId)) {
+ r1.setRegT<RegType::kX86_GpbLo>(reg.id());
instId = Inst::kIdMovzx;
goto ExtendMovGpXQ;
}
// Extend WORD->QWORD (GP).
- if (Type::isGp16(srcTypeId)) {
- r1.setRegT<Reg::kTypeGpw>(reg.id());
+ if (TypeUtils::isGp16(srcTypeId)) {
+ r1.setRegT<RegType::kX86_Gpw>(reg.id());
instId = Inst::kIdMovzx;
goto ExtendMovGpXQ;
}
- if (Type::isGp32(srcTypeId)) goto ExtendMovGpDQ;
- if (Type::isGp64(srcTypeId)) goto MovGpQ;
- if (Type::isMmx(srcTypeId)) goto MovMmQ;
- if (Type::isVec(srcTypeId)) goto MovXmmQ;
+ if (TypeUtils::isGp32(srcTypeId)) goto ExtendMovGpDQ;
+ if (TypeUtils::isGp64(srcTypeId)) goto MovGpQ;
+ if (TypeUtils::isMmx(srcTypeId)) goto MovMmQ;
+ if (TypeUtils::isVec(srcTypeId)) goto MovXmmQ;
break;
- case Type::kIdF32:
- case Type::kIdF32x1:
- if (Type::isVec(srcTypeId)) goto MovXmmD;
+ case TypeId::kFloat32:
+ case TypeId::kFloat32x1:
+ if (TypeUtils::isVec(srcTypeId)) goto MovXmmD;
break;
- case Type::kIdF64:
- case Type::kIdF64x1:
- if (Type::isVec(srcTypeId)) goto MovXmmQ;
+ case TypeId::kFloat64:
+ case TypeId::kFloat64x1:
+ if (TypeUtils::isVec(srcTypeId)) goto MovXmmQ;
break;
default:
- if (Type::isVec(dstTypeId) && reg.as<Reg>().isVec()) {
- stackPtr.setSize(Type::sizeOf(dstTypeId));
+ if (TypeUtils::isVec(dstTypeId) && reg.as<Reg>().isVec()) {
+ stackPtr.setSize(TypeUtils::sizeOf(dstTypeId));
uint32_t vMovInstId = choose(Inst::kIdMovaps, Inst::kIdVmovaps);
- if (Type::isVec128(dstTypeId))
- r0.setRegT<Reg::kTypeXmm>(reg.id());
- else if (Type::isVec256(dstTypeId))
- r0.setRegT<Reg::kTypeYmm>(reg.id());
- else if (Type::isVec512(dstTypeId))
- r0.setRegT<Reg::kTypeZmm>(reg.id());
+ if (TypeUtils::isVec128(dstTypeId))
+ r0.setRegT<RegType::kX86_Xmm>(reg.id());
+ else if (TypeUtils::isVec256(dstTypeId))
+ r0.setRegT<RegType::kX86_Ymm>(reg.id());
+ else if (TypeUtils::isVec512(dstTypeId))
+ r0.setRegT<RegType::kX86_Zmm>(reg.id());
else
break;
@@ -924,7 +981,7 @@ Error X86RACFGBuilder::moveRegToStackArg(InvokeNode* invokeNode, const FuncValue
// Extend+Move Gp.
ExtendMovGpD:
stackPtr.setSize(4);
- r0.setRegT<Reg::kTypeGpd>(reg.id());
+ r0.setRegT<RegType::kX86_Gpd>(reg.id());
ASMJIT_PROPAGATE(cc()->emit(instId, r0, r1));
ASMJIT_PROPAGATE(cc()->emit(Inst::kIdMov, stackPtr, r0));
@@ -933,14 +990,14 @@ ExtendMovGpD:
ExtendMovGpXQ:
if (registerSize == 8) {
stackPtr.setSize(8);
- r0.setRegT<Reg::kTypeGpq>(reg.id());
+ r0.setRegT<RegType::kX86_Gpq>(reg.id());
ASMJIT_PROPAGATE(cc()->emit(instId, r0, r1));
ASMJIT_PROPAGATE(cc()->emit(Inst::kIdMov, stackPtr, r0));
}
else {
stackPtr.setSize(4);
- r0.setRegT<Reg::kTypeGpd>(reg.id());
+ r0.setRegT<RegType::kX86_Gpd>(reg.id());
ASMJIT_PROPAGATE(cc()->emit(instId, r0, r1));
@@ -953,45 +1010,44 @@ ExtendMovGpDQ:
ZeroExtendGpDQ:
stackPtr.setSize(4);
- r0.setRegT<Reg::kTypeGpd>(reg.id());
+ r0.setRegT<RegType::kX86_Gpd>(reg.id());
goto ExtendMovGpDQ;
MovGpD:
stackPtr.setSize(4);
- r0.setRegT<Reg::kTypeGpd>(reg.id());
+ r0.setRegT<RegType::kX86_Gpd>(reg.id());
return cc()->emit(Inst::kIdMov, stackPtr, r0);
MovGpQ:
stackPtr.setSize(8);
- r0.setRegT<Reg::kTypeGpq>(reg.id());
+ r0.setRegT<RegType::kX86_Gpq>(reg.id());
return cc()->emit(Inst::kIdMov, stackPtr, r0);
MovMmD:
stackPtr.setSize(4);
- r0.setRegT<Reg::kTypeMm>(reg.id());
+ r0.setRegT<RegType::kX86_Mm>(reg.id());
return cc()->emit(choose(Inst::kIdMovd, Inst::kIdVmovd), stackPtr, r0);
MovMmQ:
stackPtr.setSize(8);
- r0.setRegT<Reg::kTypeMm>(reg.id());
+ r0.setRegT<RegType::kX86_Mm>(reg.id());
return cc()->emit(choose(Inst::kIdMovq, Inst::kIdVmovq), stackPtr, r0);
MovXmmD:
stackPtr.setSize(4);
- r0.setRegT<Reg::kTypeXmm>(reg.id());
+ r0.setRegT<RegType::kX86_Xmm>(reg.id());
return cc()->emit(choose(Inst::kIdMovss, Inst::kIdVmovss), stackPtr, r0);
MovXmmQ:
stackPtr.setSize(8);
- r0.setRegT<Reg::kTypeXmm>(reg.id());
+ r0.setRegT<RegType::kX86_Xmm>(reg.id());
return cc()->emit(choose(Inst::kIdMovlps, Inst::kIdVmovlps), stackPtr, r0);
}
-// ============================================================================
-// [asmjit::x86::X86RACFGBuilder - OnReg]
-// ============================================================================
+// x86::RACFGBuilder - OnReg
+// =========================
-Error X86RACFGBuilder::onBeforeRet(FuncRetNode* funcRet) noexcept {
+Error RACFGBuilder::onBeforeRet(FuncRetNode* funcRet) noexcept {
const FuncDetail& funcDetail = _pass->func()->detail();
const Operand* opArray = funcRet->operands();
uint32_t opCount = funcRet->opCount();
@@ -1005,7 +1061,7 @@ Error X86RACFGBuilder::onBeforeRet(FuncRetNode* funcRet) noexcept {
if (!op.isReg())
continue;
- if (ret.regType() == Reg::kTypeSt) {
+ if (ret.regType() == RegType::kX86_St) {
const Reg& reg = op.as<Reg>();
uint32_t vIndex = Operand::virtIdToIndex(reg.id());
@@ -1013,25 +1069,25 @@ Error X86RACFGBuilder::onBeforeRet(FuncRetNode* funcRet) noexcept {
RAWorkReg* workReg;
ASMJIT_PROPAGATE(_pass->virtIndexAsWorkReg(vIndex, &workReg));
- if (workReg->group() != Reg::kGroupVec)
+ if (workReg->group() != RegGroup::kVec)
return DebugUtils::errored(kErrorInvalidAssignment);
- Reg src = Reg(workReg->signature(), workReg->virtId());
+ Reg src(workReg->signature(), workReg->virtId());
Mem mem;
- uint32_t typeId = Type::baseOf(workReg->typeId());
+ TypeId typeId = TypeUtils::scalarOf(workReg->typeId());
if (ret.hasTypeId())
typeId = ret.typeId();
switch (typeId) {
- case Type::kIdF32:
+ case TypeId::kFloat32:
ASMJIT_PROPAGATE(_pass->useTemporaryMem(mem, 4, 4));
mem.setSize(4);
ASMJIT_PROPAGATE(cc()->emit(choose(Inst::kIdMovss, Inst::kIdVmovss), mem, src.as<Xmm>()));
ASMJIT_PROPAGATE(cc()->fld(mem));
break;
- case Type::kIdF64:
+ case TypeId::kFloat64:
ASMJIT_PROPAGATE(_pass->useTemporaryMem(mem, 8, 4));
mem.setSize(8);
ASMJIT_PROPAGATE(cc()->emit(choose(Inst::kIdMovsd, Inst::kIdVmovsd), mem, src.as<Xmm>()));
@@ -1048,7 +1104,7 @@ Error X86RACFGBuilder::onBeforeRet(FuncRetNode* funcRet) noexcept {
return kErrorOk;
}
-Error X86RACFGBuilder::onRet(FuncRetNode* funcRet, RAInstBuilder& ib) noexcept {
+Error RACFGBuilder::onRet(FuncRetNode* funcRet, RAInstBuilder& ib) noexcept {
const FuncDetail& funcDetail = _pass->func()->detail();
const Operand* opArray = funcRet->operands();
uint32_t opCount = funcRet->opCount();
@@ -1062,7 +1118,7 @@ Error X86RACFGBuilder::onRet(FuncRetNode* funcRet, RAInstBuilder& ib) noexcept {
return DebugUtils::errored(kErrorInvalidAssignment);
// Not handled here...
- if (ret.regType() == Reg::kTypeSt)
+ if (ret.regType() == RegType::kX86_St)
continue;
if (op.isReg()) {
@@ -1074,9 +1130,9 @@ Error X86RACFGBuilder::onRet(FuncRetNode* funcRet, RAInstBuilder& ib) noexcept {
RAWorkReg* workReg;
ASMJIT_PROPAGATE(_pass->virtIndexAsWorkReg(vIndex, &workReg));
- uint32_t group = workReg->group();
- uint32_t allocable = _pass->_availableRegs[group];
- ASMJIT_PROPAGATE(ib.add(workReg, RATiedReg::kUse | RATiedReg::kRead, allocable, ret.regId(), 0, BaseReg::kIdBad, 0));
+ RegGroup group = workReg->group();
+ RegMask inOutRegs = _pass->_availableRegs[group];
+ ASMJIT_PROPAGATE(ib.add(workReg, RATiedFlags::kUse | RATiedFlags::kRead, inOutRegs, ret.regId(), 0, inOutRegs, BaseReg::kIdBad, 0));
}
}
else {
@@ -1087,37 +1143,43 @@ Error X86RACFGBuilder::onRet(FuncRetNode* funcRet, RAInstBuilder& ib) noexcept {
return kErrorOk;
}
-// ============================================================================
-// [asmjit::x86::X86RAPass - Construction / Destruction]
-// ============================================================================
+// x86::X86RAPass - Construction & Destruction
+// ===========================================
X86RAPass::X86RAPass() noexcept
- : RAPass(),
- _avxEnabled(false) {}
+ : BaseRAPass() { _iEmitHelper = &_emitHelper; }
X86RAPass::~X86RAPass() noexcept {}
-// ============================================================================
-// [asmjit::x86::X86RAPass - OnInit / OnDone]
-// ============================================================================
+// x86::X86RAPass - OnInit & OnDone
+// ================================
void X86RAPass::onInit() noexcept {
- uint32_t arch = cc()->arch();
+ Arch arch = cc()->arch();
uint32_t baseRegCount = Environment::is32Bit(arch) ? 8u : 16u;
+ uint32_t simdRegCount = baseRegCount;
+
+ if (Environment::is64Bit(arch) && _func->frame().isAvx512Enabled())
+ simdRegCount = 32u;
- _archRegsInfo = &opData.archRegs;
- _archTraits[Reg::kGroupGp] |= RAArchTraits::kHasSwap;
+ bool avxEnabled = _func->frame().isAvxEnabled();
+ bool avx512Enabled = _func->frame().isAvx512Enabled();
- _physRegCount.set(Reg::kGroupGp , baseRegCount);
- _physRegCount.set(Reg::kGroupVec , baseRegCount);
- _physRegCount.set(Reg::kGroupMm , 8);
- _physRegCount.set(Reg::kGroupKReg, 8);
+ _emitHelper._emitter = _cb;
+ _emitHelper._avxEnabled = avxEnabled || avx512Enabled;
+ _emitHelper._avx512Enabled = avx512Enabled;
+
+ _archTraits = &ArchTraits::byArch(arch);
+ _physRegCount.set(RegGroup::kGp, baseRegCount);
+ _physRegCount.set(RegGroup::kVec, simdRegCount);
+ _physRegCount.set(RegGroup::kX86_K, 8);
+ _physRegCount.set(RegGroup::kX86_MM, 8);
_buildPhysIndex();
_availableRegCount = _physRegCount;
- _availableRegs[Reg::kGroupGp ] = Support::lsbMask<uint32_t>(_physRegCount.get(Reg::kGroupGp ));
- _availableRegs[Reg::kGroupVec ] = Support::lsbMask<uint32_t>(_physRegCount.get(Reg::kGroupVec ));
- _availableRegs[Reg::kGroupMm ] = Support::lsbMask<uint32_t>(_physRegCount.get(Reg::kGroupMm ));
- _availableRegs[Reg::kGroupKReg] = Support::lsbMask<uint32_t>(_physRegCount.get(Reg::kGroupKReg));
+ _availableRegs[RegGroup::kGp] = Support::lsbMask<RegMask>(_physRegCount.get(RegGroup::kGp));
+ _availableRegs[RegGroup::kVec] = Support::lsbMask<RegMask>(_physRegCount.get(RegGroup::kVec));
+ _availableRegs[RegGroup::kX86_K] = Support::lsbMask<RegMask>(_physRegCount.get(RegGroup::kX86_K)) ^ 1u;
+ _availableRegs[RegGroup::kX86_MM] = Support::lsbMask<RegMask>(_physRegCount.get(RegGroup::kX86_MM));
_scratchRegIndexes[0] = uint8_t(Gp::kIdCx);
_scratchRegIndexes[1] = uint8_t(baseRegCount - 1);
@@ -1126,55 +1188,181 @@ void X86RAPass::onInit() noexcept {
// make unavailable all registers that are special and cannot be used in general.
bool hasFP = _func->frame().hasPreservedFP();
- makeUnavailable(Reg::kGroupGp, Gp::kIdSp); // ESP|RSP used as a stack-pointer (SP).
- if (hasFP) makeUnavailable(Reg::kGroupGp, Gp::kIdBp); // EBP|RBP used as a frame-pointer (FP).
+ makeUnavailable(RegGroup::kGp, Gp::kIdSp); // ESP|RSP used as a stack-pointer (SP).
+ if (hasFP) makeUnavailable(RegGroup::kGp, Gp::kIdBp); // EBP|RBP used as a frame-pointer (FP).
_sp = cc()->zsp();
_fp = cc()->zbp();
- _avxEnabled = _func->frame().isAvxEnabled();
}
void X86RAPass::onDone() noexcept {}
-// ============================================================================
-// [asmjit::x86::X86RAPass - BuildCFG]
-// ============================================================================
+// x86::X86RAPass - BuildCFG
+// =========================
Error X86RAPass::buildCFG() noexcept {
- return X86RACFGBuilder(this).run();
+ return RACFGBuilder(this).run();
+}
+
+// x86::X86RAPass - Rewrite
+// ========================
+
+static InstId transformVexToEvex(InstId instId) {
+ switch (instId) {
+ case Inst::kIdVbroadcastf128: return Inst::kIdVbroadcastf32x4;
+ case Inst::kIdVbroadcasti128: return Inst::kIdVbroadcasti32x4;
+ case Inst::kIdVextractf128: return Inst::kIdVextractf32x4;
+ case Inst::kIdVextracti128: return Inst::kIdVextracti32x4;
+ case Inst::kIdVinsertf128: return Inst::kIdVinsertf32x4;
+ case Inst::kIdVinserti128: return Inst::kIdVinserti32x4;
+ case Inst::kIdVmovdqa: return Inst::kIdVmovdqa32;
+ case Inst::kIdVmovdqu: return Inst::kIdVmovdqu32;
+ case Inst::kIdVpand: return Inst::kIdVpandd;
+ case Inst::kIdVpandn: return Inst::kIdVpandnd;
+ case Inst::kIdVpor: return Inst::kIdVpord;
+ case Inst::kIdVpxor: return Inst::kIdVpxord;
+ case Inst::kIdVroundpd: return Inst::kIdVrndscalepd;
+ case Inst::kIdVroundps: return Inst::kIdVrndscaleps;
+ case Inst::kIdVroundsd: return Inst::kIdVrndscalesd;
+ case Inst::kIdVroundss: return Inst::kIdVrndscaless;
+
+ default:
+ // This should never happen as only transformable instructions should go this path.
+ ASMJIT_ASSERT(false);
+ return 0;
+ }
+}
+
+ASMJIT_FAVOR_SPEED Error X86RAPass::_rewrite(BaseNode* first, BaseNode* stop) noexcept {
+ uint32_t virtCount = cc()->_vRegArray.size();
+
+ BaseNode* node = first;
+ while (node != stop) {
+ BaseNode* next = node->next();
+ if (node->isInst()) {
+ InstNode* inst = node->as<InstNode>();
+ RAInst* raInst = node->passData<RAInst>();
+
+ Operand* operands = inst->operands();
+ uint32_t opCount = inst->opCount();
+ uint32_t maxRegId = 0;
+
+ uint32_t i;
+
+ // Rewrite virtual registers into physical registers.
+ if (raInst) {
+ // If the instruction contains pass data (raInst) then it was a subject for register allocation and must be
+ // rewritten to use physical regs.
+ RATiedReg* tiedRegs = raInst->tiedRegs();
+ uint32_t tiedCount = raInst->tiedCount();
+
+ for (i = 0; i < tiedCount; i++) {
+ RATiedReg* tiedReg = &tiedRegs[i];
+
+ Support::BitWordIterator<uint32_t> useIt(tiedReg->useRewriteMask());
+ uint32_t useId = tiedReg->useId();
+ while (useIt.hasNext()) {
+ maxRegId = Support::max(maxRegId, useId);
+ inst->rewriteIdAtIndex(useIt.next(), useId);
+ }
+
+ Support::BitWordIterator<uint32_t> outIt(tiedReg->outRewriteMask());
+ uint32_t outId = tiedReg->outId();
+ while (outIt.hasNext()) {
+ maxRegId = Support::max(maxRegId, outId);
+ inst->rewriteIdAtIndex(outIt.next(), outId);
+ }
+ }
+
+ if (raInst->isTransformable()) {
+ if (maxRegId > 15) {
+ // Transform VEX instruction to EVEX.
+ inst->setId(transformVexToEvex(inst->id()));
+ }
+ }
+
+ // This data is allocated by Zone passed to `runOnFunction()`, which will be reset after the RA pass finishes.
+ // So reset this data to prevent having a dead pointer after the RA pass is complete.
+ node->resetPassData();
+
+ if (ASMJIT_UNLIKELY(node->type() != NodeType::kInst)) {
+ // FuncRet terminates the flow, it must either be removed if the exit label is next to it (optimization) or
+ // patched to an architecture dependent jump instruction that jumps to the function's exit before the epilog.
+ if (node->type() == NodeType::kFuncRet) {
+ RABlock* block = raInst->block();
+ if (!isNextTo(node, _func->exitNode())) {
+ cc()->_setCursor(node->prev());
+ ASMJIT_PROPAGATE(emitJump(_func->exitNode()->label()));
+ }
+
+ BaseNode* prev = node->prev();
+ cc()->removeNode(node);
+ block->setLast(prev);
+ }
+ }
+ }
+
+ // Rewrite stack slot addresses.
+ for (i = 0; i < opCount; i++) {
+ Operand& op = operands[i];
+ if (op.isMem()) {
+ BaseMem& mem = op.as<BaseMem>();
+ if (mem.isRegHome()) {
+ uint32_t virtIndex = Operand::virtIdToIndex(mem.baseId());
+ if (ASMJIT_UNLIKELY(virtIndex >= virtCount))
+ return DebugUtils::errored(kErrorInvalidVirtId);
+
+ VirtReg* virtReg = cc()->virtRegByIndex(virtIndex);
+ RAWorkReg* workReg = virtReg->workReg();
+ ASMJIT_ASSERT(workReg != nullptr);
+
+ RAStackSlot* slot = workReg->stackSlot();
+ int32_t offset = slot->offset();
+
+ mem._setBase(_sp.type(), slot->baseRegId());
+ mem.clearRegHome();
+ mem.addOffsetLo32(offset);
+ }
+ }
+ }
+ }
+
+ node = next;
+ }
+
+ return kErrorOk;
}
-// ============================================================================
-// [asmjit::x86::X86RAPass - OnEmit]
-// ============================================================================
+// x86::X86RAPass - OnEmit
+// =======================
-Error X86RAPass::onEmitMove(uint32_t workId, uint32_t dstPhysId, uint32_t srcPhysId) noexcept {
+Error X86RAPass::emitMove(uint32_t workId, uint32_t dstPhysId, uint32_t srcPhysId) noexcept {
RAWorkReg* wReg = workRegById(workId);
- BaseReg dst(wReg->info().signature(), dstPhysId);
- BaseReg src(wReg->info().signature(), srcPhysId);
+ BaseReg dst(wReg->signature(), dstPhysId);
+ BaseReg src(wReg->signature(), srcPhysId);
const char* comment = nullptr;
#ifndef ASMJIT_NO_LOGGING
- if (_loggerFlags & FormatOptions::kFlagAnnotations) {
+ if (hasDiagnosticOption(DiagnosticOptions::kRAAnnotate)) {
_tmpString.assignFormat("<MOVE> %s", workRegById(workId)->name());
comment = _tmpString.data();
}
#endif
- return X86Internal::emitRegMove(cc()->as<Emitter>(), dst, src, wReg->typeId(), _avxEnabled, comment);
+ return _emitHelper.emitRegMove(dst, src, wReg->typeId(), comment);
}
-Error X86RAPass::onEmitSwap(uint32_t aWorkId, uint32_t aPhysId, uint32_t bWorkId, uint32_t bPhysId) noexcept {
+Error X86RAPass::emitSwap(uint32_t aWorkId, uint32_t aPhysId, uint32_t bWorkId, uint32_t bPhysId) noexcept {
RAWorkReg* waReg = workRegById(aWorkId);
RAWorkReg* wbReg = workRegById(bWorkId);
- bool is64Bit = Support::max(waReg->typeId(), wbReg->typeId()) >= Type::kIdI64;
- uint32_t sign = is64Bit ? uint32_t(RegTraits<Reg::kTypeGpq>::kSignature)
- : uint32_t(RegTraits<Reg::kTypeGpd>::kSignature);
+ bool is64Bit = Support::max(waReg->typeId(), wbReg->typeId()) >= TypeId::kInt64;
+ OperandSignature sign = is64Bit ? OperandSignature{RegTraits<RegType::kX86_Gpq>::kSignature}
+ : OperandSignature{RegTraits<RegType::kX86_Gpd>::kSignature};
#ifndef ASMJIT_NO_LOGGING
- if (_loggerFlags & FormatOptions::kFlagAnnotations) {
+ if (hasDiagnosticOption(DiagnosticOptions::kRAAnnotate)) {
_tmpString.assignFormat("<SWAP> %s, %s", waReg->name(), wbReg->name());
cc()->setInlineComment(_tmpString.data());
}
@@ -1183,60 +1371,61 @@ Error X86RAPass::onEmitSwap(uint32_t aWorkId, uint32_t aPhysId, uint32_t bWorkId
return cc()->emit(Inst::kIdXchg, Reg(sign, aPhysId), Reg(sign, bPhysId));
}
-Error X86RAPass::onEmitLoad(uint32_t workId, uint32_t dstPhysId) noexcept {
+Error X86RAPass::emitLoad(uint32_t workId, uint32_t dstPhysId) noexcept {
RAWorkReg* wReg = workRegById(workId);
- BaseReg dstReg(wReg->info().signature(), dstPhysId);
+ BaseReg dstReg(wReg->signature(), dstPhysId);
BaseMem srcMem(workRegAsMem(wReg));
const char* comment = nullptr;
#ifndef ASMJIT_NO_LOGGING
- if (_loggerFlags & FormatOptions::kFlagAnnotations) {
+ if (hasDiagnosticOption(DiagnosticOptions::kRAAnnotate)) {
_tmpString.assignFormat("<LOAD> %s", workRegById(workId)->name());
comment = _tmpString.data();
}
#endif
- return X86Internal::emitRegMove(cc()->as<Emitter>(), dstReg, srcMem, wReg->typeId(), _avxEnabled, comment);
+ return _emitHelper.emitRegMove(dstReg, srcMem, wReg->typeId(), comment);
}
-Error X86RAPass::onEmitSave(uint32_t workId, uint32_t srcPhysId) noexcept {
+Error X86RAPass::emitSave(uint32_t workId, uint32_t srcPhysId) noexcept {
RAWorkReg* wReg = workRegById(workId);
BaseMem dstMem(workRegAsMem(wReg));
- BaseReg srcReg(wReg->info().signature(), srcPhysId);
+ BaseReg srcReg(wReg->signature(), srcPhysId);
const char* comment = nullptr;
#ifndef ASMJIT_NO_LOGGING
- if (_loggerFlags & FormatOptions::kFlagAnnotations) {
+ if (hasDiagnosticOption(DiagnosticOptions::kRAAnnotate)) {
_tmpString.assignFormat("<SAVE> %s", workRegById(workId)->name());
comment = _tmpString.data();
}
#endif
- return X86Internal::emitRegMove(cc()->as<Emitter>(), dstMem, srcReg, wReg->typeId(), _avxEnabled, comment);
+ return _emitHelper.emitRegMove(dstMem, srcReg, wReg->typeId(), comment);
}
-Error X86RAPass::onEmitJump(const Label& label) noexcept {
+Error X86RAPass::emitJump(const Label& label) noexcept {
return cc()->jmp(label);
}
-Error X86RAPass::onEmitPreCall(InvokeNode* invokeNode) noexcept {
+Error X86RAPass::emitPreCall(InvokeNode* invokeNode) noexcept {
if (invokeNode->detail().hasVarArgs() && cc()->is64Bit()) {
- uint32_t argCount = invokeNode->argCount();
const FuncDetail& fd = invokeNode->detail();
+ uint32_t argCount = invokeNode->argCount();
switch (invokeNode->detail().callConv().id()) {
- case CallConv::kIdX64SystemV: {
+ case CallConvId::kX64SystemV: {
// AL register contains the number of arguments passed in XMM register(s).
uint32_t n = 0;
for (uint32_t argIndex = 0; argIndex < argCount; argIndex++) {
- for (uint32_t argHi = 0; argHi <= kFuncArgHi; argHi += kFuncArgHi) {
- if (!fd.hasArg(argIndex + argHi))
- continue;
+ const FuncValuePack& argPack = fd.argPack(argIndex);
+ for (uint32_t valueIndex = 0; valueIndex < Globals::kMaxValuePack; valueIndex++) {
+ const FuncValue& arg = argPack[valueIndex];
+ if (!arg)
+ break;
- const FuncValue& arg = fd.arg(argIndex + argHi);
- if (arg.isReg() && Reg::groupOf(arg.regType()) == Reg::kGroupVec)
+ if (arg.isReg() && Reg::groupOf(arg.regType()) == RegGroup::kVec)
n++;
}
}
@@ -1248,16 +1437,17 @@ Error X86RAPass::onEmitPreCall(InvokeNode* invokeNode) noexcept {
break;
}
- case CallConv::kIdX64Windows: {
+ case CallConvId::kX64Windows: {
// Each double-precision argument passed in XMM must be also passed in GP.
for (uint32_t argIndex = 0; argIndex < argCount; argIndex++) {
- for (uint32_t argHi = 0; argHi <= kFuncArgHi; argHi += kFuncArgHi) {
- if (!fd.hasArg(argIndex + argHi))
- continue;
+ const FuncValuePack& argPack = fd.argPack(argIndex);
+ for (uint32_t valueIndex = 0; valueIndex < Globals::kMaxValuePack; valueIndex++) {
+ const FuncValue& arg = argPack[valueIndex];
+ if (!arg)
+ break;
- const FuncValue& arg = fd.arg(argIndex + argHi);
- if (arg.isReg() && Reg::groupOf(arg.regType()) == Reg::kGroupVec) {
- Gp dst = gpq(fd.callConv().passedOrder(Reg::kGroupGp)[argIndex]);
+ if (arg.isReg() && Reg::groupOf(arg.regType()) == RegGroup::kVec) {
+ Gp dst = gpq(fd.callConv().passedOrder(RegGroup::kGp)[argIndex]);
Xmm src = xmm(arg.regId());
ASMJIT_PROPAGATE(cc()->emit(choose(Inst::kIdMovq, Inst::kIdVmovq), dst, src));
}
@@ -1276,4 +1466,4 @@ Error X86RAPass::onEmitPreCall(InvokeNode* invokeNode) noexcept {
ASMJIT_END_SUB_NAMESPACE
-#endif // ASMJIT_BUILD_X86 && !ASMJIT_NO_COMPILER
+#endif // !ASMJIT_NO_X86 && !ASMJIT_NO_COMPILER
diff --git a/3rdparty/asmjit/src/asmjit/x86/x86rapass_p.h b/3rdparty/asmjit/src/asmjit/x86/x86rapass_p.h
index 99093ab69f8..b9603c21afc 100644
--- a/3rdparty/asmjit/src/asmjit/x86/x86rapass_p.h
+++ b/3rdparty/asmjit/src/asmjit/x86/x86rapass_p.h
@@ -1,25 +1,7 @@
-// AsmJit - Machine code generation for C++
+// This file is part of AsmJit project <https://asmjit.com>
//
-// * Official AsmJit Home Page: https://asmjit.com
-// * Official Github Repository: https://github.com/asmjit/asmjit
-//
-// Copyright (c) 2008-2020 The AsmJit Authors
-//
-// This software is provided 'as-is', without any express or implied
-// warranty. In no event will the authors be held liable for any damages
-// arising from the use of this software.
-//
-// Permission is granted to anyone to use this software for any purpose,
-// including commercial applications, and to alter it and redistribute it
-// freely, subject to the following restrictions:
-//
-// 1. The origin of this software must not be misrepresented; you must not
-// claim that you wrote the original software. If you use this software
-// in a product, an acknowledgment in the product documentation would be
-// appreciated but is not required.
-// 2. Altered source versions must be plainly marked as such, and must not be
-// misrepresented as being the original software.
-// 3. This notice may not be removed or altered from any source distribution.
+// See asmjit.h or LICENSE.md for license and copyright information
+// SPDX-License-Identifier: Zlib
#ifndef ASMJIT_X86_X86RAPASS_P_H_INCLUDED
#define ASMJIT_X86_X86RAPASS_P_H_INCLUDED
@@ -32,78 +14,75 @@
#include "../core/rapass_p.h"
#include "../x86/x86assembler.h"
#include "../x86/x86compiler.h"
+#include "../x86/x86emithelper_p.h"
ASMJIT_BEGIN_SUB_NAMESPACE(x86)
//! \cond INTERNAL
-
-//! \brief X86/X64 register allocation.
-
-//! \addtogroup asmjit_ra
+//! \addtogroup asmjit_x86
//! \{
-// ============================================================================
-// [asmjit::X86RAPass]
-// ============================================================================
-
//! X86 register allocation pass.
//!
-//! Takes care of generating function prologs and epilogs, and also performs
-//! register allocation.
-class X86RAPass : public RAPass {
+//! Takes care of generating function prologs and epilogs, and also performs register allocation.
+class X86RAPass : public BaseRAPass {
public:
ASMJIT_NONCOPYABLE(X86RAPass)
- typedef RAPass Base;
+ typedef BaseRAPass Base;
- bool _avxEnabled;
+ EmitHelper _emitHelper;
- // --------------------------------------------------------------------------
- // [Construction / Destruction]
- // --------------------------------------------------------------------------
+ //! \name Construction & Destruction
+ //! \{
X86RAPass() noexcept;
virtual ~X86RAPass() noexcept;
- // --------------------------------------------------------------------------
- // [Accessors]
- // --------------------------------------------------------------------------
+ //! \}
+
+ //! \name Accessors
+ //! \{
//! Returns the compiler casted to `x86::Compiler`.
inline Compiler* cc() const noexcept { return static_cast<Compiler*>(_cb); }
- // --------------------------------------------------------------------------
- // [Utilities]
- // --------------------------------------------------------------------------
+ //! Returns emit helper.
+ inline EmitHelper* emitHelper() noexcept { return &_emitHelper; }
+
+ inline bool avxEnabled() const noexcept { return _emitHelper._avxEnabled; }
+ inline bool avx512Enabled() const noexcept { return _emitHelper._avx512Enabled; }
+
+ //! \}
+
+ //! \name Utilities
+ //! \{
inline uint32_t choose(uint32_t sseInstId, uint32_t avxInstId) noexcept {
- return _avxEnabled ? avxInstId : sseInstId;
+ return avxEnabled() ? avxInstId : sseInstId;
}
- // --------------------------------------------------------------------------
- // [OnInit / OnDone]
- // --------------------------------------------------------------------------
+ //! \}
+
+ //! \name Interface
+ //! \{
void onInit() noexcept override;
void onDone() noexcept override;
- // --------------------------------------------------------------------------
- // [CFG]
- // --------------------------------------------------------------------------
-
Error buildCFG() noexcept override;
- // --------------------------------------------------------------------------
- // [Emit]
- // --------------------------------------------------------------------------
+ Error _rewrite(BaseNode* first, BaseNode* stop) noexcept override;
+
+ Error emitMove(uint32_t workId, uint32_t dstPhysId, uint32_t srcPhysId) noexcept override;
+ Error emitSwap(uint32_t aWorkId, uint32_t aPhysId, uint32_t bWorkId, uint32_t bPhysId) noexcept override;
- Error onEmitMove(uint32_t workId, uint32_t dstPhysId, uint32_t srcPhysId) noexcept override;
- Error onEmitSwap(uint32_t aWorkId, uint32_t aPhysId, uint32_t bWorkId, uint32_t bPhysId) noexcept override;
+ Error emitLoad(uint32_t workId, uint32_t dstPhysId) noexcept override;
+ Error emitSave(uint32_t workId, uint32_t srcPhysId) noexcept override;
- Error onEmitLoad(uint32_t workId, uint32_t dstPhysId) noexcept override;
- Error onEmitSave(uint32_t workId, uint32_t srcPhysId) noexcept override;
+ Error emitJump(const Label& label) noexcept override;
+ Error emitPreCall(InvokeNode* invokeNode) noexcept override;
- Error onEmitJump(const Label& label) noexcept override;
- Error onEmitPreCall(InvokeNode* invokeNode) noexcept override;
+ //! \}
};
//! \}
diff --git a/3rdparty/asmjit/test/asmjit_bench_x86.cpp b/3rdparty/asmjit/test/asmjit_bench_x86.cpp
deleted file mode 100644
index 40d90088c01..00000000000
--- a/3rdparty/asmjit/test/asmjit_bench_x86.cpp
+++ /dev/null
@@ -1,172 +0,0 @@
-// AsmJit - Machine code generation for C++
-//
-// * Official AsmJit Home Page: https://asmjit.com
-// * Official Github Repository: https://github.com/asmjit/asmjit
-//
-// Copyright (c) 2008-2020 The AsmJit Authors
-//
-// This software is provided 'as-is', without any express or implied
-// warranty. In no event will the authors be held liable for any damages
-// arising from the use of this software.
-//
-// Permission is granted to anyone to use this software for any purpose,
-// including commercial applications, and to alter it and redistribute it
-// freely, subject to the following restrictions:
-//
-// 1. The origin of this software must not be misrepresented; you must not
-// claim that you wrote the original software. If you use this software
-// in a product, an acknowledgment in the product documentation would be
-// appreciated but is not required.
-// 2. Altered source versions must be plainly marked as such, and must not be
-// misrepresented as being the original software.
-// 3. This notice may not be removed or altered from any source distribution.
-
-#include <asmjit/x86.h>
-#include <stdio.h>
-#include <string.h>
-
-#include "./asmjit_test_opcode.h"
-
-#ifndef ASMJIT_NO_COMPILER
- #include "./asmjit_test_misc.h"
-#endif
-
-using namespace asmjit;
-
-// ============================================================================
-// [Configuration]
-// ============================================================================
-
-static constexpr uint32_t kNumRepeats = 20;
-static constexpr uint32_t kNumIterations = 1000;
-
-// ============================================================================
-// [BenchUtils]
-// ============================================================================
-
-namespace BenchUtils {
- class Performance {
- public:
- inline Performance() noexcept { reset(); }
-
- inline void reset() noexcept {
- tick = 0u;
- best = 0xFFFFFFFFu;
- }
-
- inline uint32_t start() noexcept { return (tick = now()); }
- inline uint32_t diff() const noexcept { return now() - tick; }
-
- inline uint32_t end() noexcept {
- tick = diff();
- if (best > tick)
- best = tick;
- return tick;
- }
-
- static inline uint32_t now() noexcept {
- return OSUtils::getTickCount();
- }
-
- uint32_t tick;
- uint32_t best;
- };
-
- static double mbps(uint32_t time, uint64_t outputSize) noexcept {
- if (!time) return 0.0;
-
- double bytesTotal = double(outputSize);
- return (bytesTotal * 1000) / (double(time) * 1024 * 1024);
- }
-
- template<typename EmitterT, typename FuncT>
- static void bench(CodeHolder& code, uint32_t arch, const char* testName, const FuncT& func) noexcept {
- EmitterT emitter;
-
- const char* archName =
- arch == Environment::kArchX86 ? "X86" :
- arch == Environment::kArchX64 ? "X64" : "???";
-
- const char* emitterName =
- emitter.isAssembler() ? "Assembler" :
- emitter.isCompiler() ? "Compiler" :
- emitter.isBuilder() ? "Builder" : "Unknown";
-
- Performance perf;
- uint64_t codeSize = 0;
-
- Environment env(arch);
-
- for (uint32_t r = 0; r < kNumRepeats; r++) {
- perf.start();
- codeSize = 0;
- for (uint32_t i = 0; i < kNumIterations; i++) {
- code.init(env);
- code.attach(&emitter);
-
- func(emitter);
- codeSize += code.codeSize();
-
- code.reset();
- }
- perf.end();
- }
-
- printf("[%s] %-9s %-10s | Time:%6u [ms] | ", archName, emitterName, testName, perf.best);
- if (codeSize)
- printf("Speed: %7.3f [MB/s]", mbps(perf.best, codeSize));
- else
- printf("Speed: N/A");
- printf("\n");
- }
-}
-
-// ============================================================================
-// [Main]
-// ============================================================================
-
-#ifdef ASMJIT_BUILD_X86
-static void benchX86(uint32_t arch) noexcept {
- CodeHolder code;
-
- BenchUtils::bench<x86::Assembler>(code, arch, "[fast]", [](x86::Assembler& a) {
- asmtest::generateOpcodes(a.as<x86::Emitter>());
- });
-
- BenchUtils::bench<x86::Assembler>(code, arch, "[validate]", [](x86::Assembler& a) {
- a.addValidationOptions(BaseEmitter::kValidationOptionAssembler);
- asmtest::generateOpcodes(a.as<x86::Emitter>());
- });
-
-#ifndef ASMJIT_NO_BUILDER
- BenchUtils::bench<x86::Builder>(code, arch, "[no-asm]", [](x86::Builder& cb) {
- asmtest::generateOpcodes(cb.as<x86::Emitter>());
- });
-
- BenchUtils::bench<x86::Builder>(code, arch, "[asm]", [](x86::Builder& cb) {
- asmtest::generateOpcodes(cb.as<x86::Emitter>());
- cb.finalize();
- });
-#endif
-
-#ifndef ASMJIT_NO_COMPILER
- BenchUtils::bench<x86::Compiler>(code, arch, "[no-asm]", [](x86::Compiler& cc) {
- asmtest::generateAlphaBlend(cc);
- });
-
- BenchUtils::bench<x86::Compiler>(code, arch, "[asm]", [](x86::Compiler& cc) {
- asmtest::generateAlphaBlend(cc);
- cc.finalize();
- });
-#endif
-}
-#endif
-
-int main() {
-#ifdef ASMJIT_BUILD_X86
- benchX86(Environment::kArchX86);
- benchX86(Environment::kArchX64);
-#endif
-
- return 0;
-}
diff --git a/3rdparty/asmjit/test/asmjit_test_assembler.cpp b/3rdparty/asmjit/test/asmjit_test_assembler.cpp
new file mode 100644
index 00000000000..4b40a751fe4
--- /dev/null
+++ b/3rdparty/asmjit/test/asmjit_test_assembler.cpp
@@ -0,0 +1,84 @@
+// This file is part of AsmJit project <https://asmjit.com>
+//
+// See asmjit.h or LICENSE.md for license and copyright information
+// SPDX-License-Identifier: Zlib
+
+#include <asmjit/core.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include "asmjit_test_assembler.h"
+#include "cmdline.h"
+
+using namespace asmjit;
+
+#if !defined(ASMJIT_NO_X86)
+bool testX86Assembler(const TestSettings& settings) noexcept;
+bool testX64Assembler(const TestSettings& settings) noexcept;
+#endif
+
+#if !defined(ASMJIT_NO_AARCH64)
+bool testA64Assembler(const TestSettings& settings) noexcept;
+#endif
+
+int main(int argc, char* argv[]) {
+ CmdLine cmdLine(argc, argv);
+
+ TestSettings settings {};
+ settings.quiet = cmdLine.hasArg("--quiet");
+ settings.validate = cmdLine.hasArg("--validate");
+
+ printf("AsmJit Assembler Test-Suite v%u.%u.%u:\n\n",
+ unsigned((ASMJIT_LIBRARY_VERSION >> 16) ),
+ unsigned((ASMJIT_LIBRARY_VERSION >> 8) & 0xFF),
+ unsigned((ASMJIT_LIBRARY_VERSION ) & 0xFF));
+
+ printf("Usage:\n");
+ printf(" --help Show usage only\n");
+ printf(" --arch=<ARCH> Select architecture to run ('all' by default)\n");
+ printf(" --quiet Show only assembling errors [%s]\n", settings.quiet ? "x" : " ");
+ printf(" --validate Use instruction validation [%s]\n", settings.validate ? "x" : " ");
+ printf("\n");
+
+ if (cmdLine.hasArg("--help"))
+ return 0;
+
+ const char* arch = cmdLine.valueOf("--arch", "all");
+ bool x86Failed = false;
+ bool x64Failed = false;
+ bool aarch64Failed = false;
+
+#if !defined(ASMJIT_NO_X86)
+ if ((strcmp(arch, "all") == 0 || strcmp(arch, "x86") == 0))
+ x86Failed = !testX86Assembler(settings);
+
+ if ((strcmp(arch, "all") == 0 || strcmp(arch, "x64") == 0))
+ x64Failed = !testX64Assembler(settings);
+#endif
+
+#if !defined(ASMJIT_NO_AARCH64)
+ if ((strcmp(arch, "all") == 0 || strcmp(arch, "aarch64") == 0))
+ aarch64Failed = !testA64Assembler(settings);
+#endif
+
+ bool failed = x86Failed || x64Failed || aarch64Failed;
+
+ if (failed) {
+ if (x86Failed)
+ printf("** X86 test suite failed **\n");
+
+ if (x64Failed)
+ printf("** X64 test suite failed **\n");
+
+ if (aarch64Failed)
+ printf("** AArch64 test suite failed **\n");
+
+ printf("** FAILURE **\n");
+ }
+ else {
+ printf("** SUCCESS **\n");
+ }
+
+ return failed ? 1 : 0;
+}
diff --git a/3rdparty/asmjit/test/asmjit_test_assembler.h b/3rdparty/asmjit/test/asmjit_test_assembler.h
new file mode 100644
index 00000000000..61d774bbb1d
--- /dev/null
+++ b/3rdparty/asmjit/test/asmjit_test_assembler.h
@@ -0,0 +1,85 @@
+// This file is part of AsmJit project <https://asmjit.com>
+//
+// See asmjit.h or LICENSE.md for license and copyright information
+// SPDX-License-Identifier: Zlib
+
+#ifndef ASMJIT_TEST_ASSEMBLER_H_INCLUDED
+#define ASMJIT_TEST_ASSEMBLER_H_INCLUDED
+
+#include <asmjit/core.h>
+#include <stdio.h>
+
+struct TestSettings {
+ bool quiet;
+ bool validate;
+};
+
+template<typename AssemblerType>
+class AssemblerTester {
+public:
+ asmjit::Environment env {};
+ asmjit::CodeHolder code {};
+ AssemblerType assembler {};
+ asmjit::Label L0 {};
+ const TestSettings& settings;
+
+ size_t passed {};
+ size_t count {};
+
+ AssemblerTester(asmjit::Arch arch, const TestSettings& settings) noexcept
+ : env(arch),
+ settings(settings) {
+ prepare();
+ }
+
+ void printHeader(const char* archName) noexcept {
+ printf("%s assembler tests:\n", archName);
+ }
+
+ void printSummary() noexcept {
+ printf(" Passed: %zu / %zu tests\n\n", passed, count);
+ }
+
+ bool didPass() const noexcept { return passed == count; }
+
+ void prepare() noexcept {
+ code.reset();
+ code.init(env, 0);
+ code.attach(&assembler);
+ L0 = assembler.newLabel();
+
+ if (settings.validate)
+ assembler.addDiagnosticOptions(asmjit::DiagnosticOptions::kValidateAssembler);
+ }
+
+ ASMJIT_NOINLINE bool testInstruction(const char* expectedOpcode, const char* s, uint32_t err) noexcept {
+ count++;
+
+ if (err) {
+ printf(" !! %s\n"
+ " <%s>\n", s, asmjit::DebugUtils::errorAsString(err));
+ prepare();
+ return false;
+ }
+
+ asmjit::String encodedOpcode;
+ asmjit::Section* text = code.textSection();
+
+ encodedOpcode.appendHex(text->data(), text->bufferSize());
+ if (encodedOpcode != expectedOpcode) {
+ printf(" !! [%s] <- %s\n"
+ " [%s] (Expected)\n", encodedOpcode.data(), s, expectedOpcode);
+ prepare();
+ return false;
+ }
+
+ if (!settings.quiet)
+ printf(" OK [%s] <- %s\n", encodedOpcode.data(), s);
+
+ passed++;
+ prepare();
+ return true;
+ }
+};
+
+#endif // ASMJIT_TEST_ASSEMBLER_H_INCLUDED
diff --git a/3rdparty/asmjit/test/asmjit_test_assembler_a64.cpp b/3rdparty/asmjit/test/asmjit_test_assembler_a64.cpp
new file mode 100644
index 00000000000..a1d1178532f
--- /dev/null
+++ b/3rdparty/asmjit/test/asmjit_test_assembler_a64.cpp
@@ -0,0 +1,4006 @@
+// This file is part of AsmJit project <https://asmjit.com>
+//
+// See asmjit.h or LICENSE.md for license and copyright information
+// SPDX-License-Identifier: Zlib
+
+#include <asmjit/core.h>
+#if !defined(ASMJIT_NO_AARCH64)
+
+#include <asmjit/a64.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include "asmjit_test_assembler.h"
+#include "cmdline.h"
+
+using namespace asmjit;
+
+#define TEST_INSTRUCTION(OPCODE, ...) \
+ tester.testInstruction(OPCODE, #__VA_ARGS__, tester.assembler.__VA_ARGS__)
+
+static void ASMJIT_NOINLINE testA64AssemblerBase(AssemblerTester<a64::Assembler>& tester) noexcept {
+ using namespace a64;
+
+ TEST_INSTRUCTION("4100031A", adc(w1, w2, w3));
+ TEST_INSTRUCTION("4100039A", adc(x1, x2, x3));
+ TEST_INSTRUCTION("E103031A", adc(w1, wzr, w3));
+ TEST_INSTRUCTION("E103039A", adc(x1, xzr, x3));
+ TEST_INSTRUCTION("5F00031A", adc(wzr, w2, w3));
+ TEST_INSTRUCTION("5F00039A", adc(xzr, x2, x3));
+ TEST_INSTRUCTION("4100033A", adcs(w1, w2, w3));
+ TEST_INSTRUCTION("410003BA", adcs(x1, x2, x3));
+ TEST_INSTRUCTION("4100030B", add(w1, w2, w3));
+ TEST_INSTRUCTION("4100038B", add(x1, x2, x3));
+ TEST_INSTRUCTION("410C030B", add(w1, w2, w3, lsl(3)));
+ TEST_INSTRUCTION("410C038B", add(x1, x2, x3, lsl(3)));
+ TEST_INSTRUCTION("FF030411", add(wsp, wsp, 256));
+ TEST_INSTRUCTION("FFFF3F11", add(wsp, wsp, 0xFFF));
+ TEST_INSTRUCTION("FF030491", add(sp, sp, 256));
+ TEST_INSTRUCTION("FFFF3F91", add(sp, sp, 0xFFF));
+ TEST_INSTRUCTION("E103030B", add(w1, wzr, w3));
+ TEST_INSTRUCTION("E103038B", add(x1, xzr, x3));
+ TEST_INSTRUCTION("5F00030B", add(wzr, w2, w3));
+ TEST_INSTRUCTION("5F00038B", add(xzr, x2, x3));
+ TEST_INSTRUCTION("83004011", add(w3, w4, 0, lsl(12)));
+ TEST_INSTRUCTION("83004091", add(x3, x4, 0, lsl(12)));
+ TEST_INSTRUCTION("83005011", add(w3, w4, 1024, lsl(12)));
+ TEST_INSTRUCTION("83005091", add(x3, x4, 1024, lsl(12)));
+ TEST_INSTRUCTION("83005011", add(w3, w4, 1024, lsl(12)));
+ TEST_INSTRUCTION("83005091", add(x3, x4, 1024, lsl(12)));
+ TEST_INSTRUCTION("FF830091", add(sp, sp, 32));
+ TEST_INSTRUCTION("412C8291", addg(x1, x2, 32, 11));
+ TEST_INSTRUCTION("5F2C8291", addg(sp, x2, 32, 11));
+ TEST_INSTRUCTION("E12F8291", addg(x1, sp, 32, 11));
+ TEST_INSTRUCTION("4100032B", adds(w1, w2, w3));
+ TEST_INSTRUCTION("410003AB", adds(x1, x2, x3));
+ TEST_INSTRUCTION("01000010", adr(x1, 0));
+ TEST_INSTRUCTION("01080010", adr(x1, 256));
+ TEST_INSTRUCTION("010000B0", adrp(x1, 4096));
+ TEST_INSTRUCTION("4100030A", and_(w1, w2, w3));
+ TEST_INSTRUCTION("4100038A", and_(x1, x2, x3));
+ TEST_INSTRUCTION("41000012", and_(w1, w2, 1));
+ TEST_INSTRUCTION("41004092", and_(x1, x2, 1));
+ TEST_INSTRUCTION("410C0012", and_(w1, w2, 15));
+ TEST_INSTRUCTION("410C4092", and_(x1, x2, 15));
+ TEST_INSTRUCTION("3F1C0012", and_(wsp, w1, 0xFF));
+ TEST_INSTRUCTION("3F1C4092", and_(sp, x1, 0xFF));
+ TEST_INSTRUCTION("E103030A", and_(w1, wzr, w3));
+ TEST_INSTRUCTION("E103038A", and_(x1, xzr, x3));
+ TEST_INSTRUCTION("5F00030A", and_(wzr, w2, w3));
+ TEST_INSTRUCTION("5F00038A", and_(xzr, x2, x3));
+ TEST_INSTRUCTION("00000012", and_(w0, w0, 0x1));
+ TEST_INSTRUCTION("00004092", and_(x0, x0, 0x1));
+ TEST_INSTRUCTION("410C0012", and_(w1, w2, 0xf));
+ TEST_INSTRUCTION("410C4092", and_(x1, x2, 0xf));
+ TEST_INSTRUCTION("BFEC7C92", and_(sp, x5, 0xfffffffffffffff0));
+ TEST_INSTRUCTION("4100036A", ands(w1, w2, w3));
+ TEST_INSTRUCTION("410003EA", ands(x1, x2, x3));
+ TEST_INSTRUCTION("E103036A", ands(w1, wzr, w3));
+ TEST_INSTRUCTION("E10303EA", ands(x1, xzr, x3));
+ TEST_INSTRUCTION("5F00036A", ands(wzr, w2, w3));
+ TEST_INSTRUCTION("5F0003EA", ands(xzr, x2, x3));
+ TEST_INSTRUCTION("00000072", ands(w0, w0, 0x1));
+ TEST_INSTRUCTION("000040F2", ands(x0, x0, 0x1));
+ TEST_INSTRUCTION("410C0072", ands(w1, w2, 0xf));
+ TEST_INSTRUCTION("410C40F2", ands(x1, x2, 0xf));
+ TEST_INSTRUCTION("417C0F13", asr(w1, w2, 15));
+ TEST_INSTRUCTION("41FC4F93", asr(x1, x2, 15));
+ TEST_INSTRUCTION("4128C31A", asrv(w1, w2, w3));
+ TEST_INSTRUCTION("4128C39A", asrv(x1, x2, x3));
+ TEST_INSTRUCTION("4F7808D5", at(Predicate::AT::kS1E0R, x15));
+ TEST_INSTRUCTION("4118C1DA", autda(x1, x2));
+ TEST_INSTRUCTION("E11BC1DA", autda(x1, sp));
+ TEST_INSTRUCTION("411CC1DA", autdb(x1, x2));
+ TEST_INSTRUCTION("E11FC1DA", autdb(x1, sp));
+ TEST_INSTRUCTION("E13BC1DA", autdza(x1));
+ TEST_INSTRUCTION("F43BC1DA", autdza(x20));
+ TEST_INSTRUCTION("E13FC1DA", autdzb(x1));
+ TEST_INSTRUCTION("F43FC1DA", autdzb(x20));
+ TEST_INSTRUCTION("4110C1DA", autia(x1, x2));
+ TEST_INSTRUCTION("E113C1DA", autia(x1, sp));
+ TEST_INSTRUCTION("9F2103D5", autia1716());
+ TEST_INSTRUCTION("BF2303D5", autiasp());
+ TEST_INSTRUCTION("9F2303D5", autiaz());
+ TEST_INSTRUCTION("4114C1DA", autib(x1, x2));
+ TEST_INSTRUCTION("E117C1DA", autib(x1, sp));
+ TEST_INSTRUCTION("DF2103D5", autib1716());
+ TEST_INSTRUCTION("FF2303D5", autibsp());
+ TEST_INSTRUCTION("DF2303D5", autibz());
+ TEST_INSTRUCTION("E133C1DA", autiza(x1));
+ TEST_INSTRUCTION("F433C1DA", autiza(x20));
+ TEST_INSTRUCTION("E137C1DA", autizb(x1));
+ TEST_INSTRUCTION("F437C1DA", autizb(x20));
+ TEST_INSTRUCTION("5F4000D5", axflag());
+ TEST_INSTRUCTION("E13F1833", bfc(w1, 8, 16));
+ TEST_INSTRUCTION("E13F78B3", bfc(x1, 8, 16));
+ TEST_INSTRUCTION("413C1833", bfi(w1, w2, 8, 16));
+ TEST_INSTRUCTION("413C78B3", bfi(x1, x2, 8, 16));
+ TEST_INSTRUCTION("41400833", bfm(w1, w2, 8, 16));
+ TEST_INSTRUCTION("414048B3", bfm(x1, x2, 8, 16));
+ TEST_INSTRUCTION("415C0833", bfxil(w1, w2, 8, 16));
+ TEST_INSTRUCTION("415C48B3", bfxil(x1, x2, 8, 16));
+ TEST_INSTRUCTION("41781F12", bic(w1, w2, 1));
+ TEST_INSTRUCTION("41F87F92", bic(x1, x2, 1));
+ TEST_INSTRUCTION("416C1C12", bic(w1, w2, 15));
+ TEST_INSTRUCTION("41EC7C92", bic(x1, x2, 15));
+ TEST_INSTRUCTION("4110230A", bic(w1, w2, w3, lsl(4)));
+ TEST_INSTRUCTION("4110238A", bic(x1, x2, x3, lsl(4)));
+ TEST_INSTRUCTION("E103230A", bic(w1, wzr, w3));
+ TEST_INSTRUCTION("E103238A", bic(x1, xzr, x3));
+ TEST_INSTRUCTION("41781F72", bics(w1, w2, 1));
+ TEST_INSTRUCTION("41F87FF2", bics(x1, x2, 1));
+ TEST_INSTRUCTION("416C1C72", bics(w1, w2, 15));
+ TEST_INSTRUCTION("41EC7CF2", bics(x1, x2, 15));
+ TEST_INSTRUCTION("4110236A", bics(w1, w2, w3, lsl(4)));
+ TEST_INSTRUCTION("411023EA", bics(x1, x2, x3, lsl(4)));
+ TEST_INSTRUCTION("E103236A", bics(w1, wzr, w3));
+ TEST_INSTRUCTION("E10323EA", bics(x1, xzr, x3));
+ TEST_INSTRUCTION("60031FD6", br(x27));
+ TEST_INSTRUCTION("E0031FD6", br(xzr));
+ TEST_INSTRUCTION("200020D4", brk(1));
+ TEST_INSTRUCTION("627CA188", cas(w1, w2, ptr(x3)));
+ TEST_INSTRUCTION("627CA1C8", cas(x1, x2, ptr(x3)));
+ TEST_INSTRUCTION("627CE188", casa(w1, w2, ptr(x3)));
+ TEST_INSTRUCTION("627CE1C8", casa(x1, x2, ptr(x3)));
+ TEST_INSTRUCTION("627CE108", casab(w1, w2, ptr(x3)));
+ TEST_INSTRUCTION("627CE148", casah(w1, w2, ptr(x3)));
+ TEST_INSTRUCTION("62FCE188", casal(w1, w2, ptr(x3)));
+ TEST_INSTRUCTION("62FCE1C8", casal(x1, x2, ptr(x3)));
+ TEST_INSTRUCTION("62FCE108", casalb(w1, w2, ptr(x3)));
+ TEST_INSTRUCTION("62FCE148", casalh(w1, w2, ptr(x3)));
+ TEST_INSTRUCTION("627CA108", casb(w1, w2, ptr(x3)));
+ TEST_INSTRUCTION("627CA148", cash(w1, w2, ptr(x3)));
+ TEST_INSTRUCTION("62FCA188", casl(w1, w2, ptr(x3)));
+ TEST_INSTRUCTION("62FCA1C8", casl(x1, x2, ptr(x3)));
+ TEST_INSTRUCTION("62FCA108", caslb(w1, w2, ptr(x3)));
+ TEST_INSTRUCTION("62FCA148", caslh(w1, w2, ptr(x3)));
+ TEST_INSTRUCTION("687C2208", casp(w2, w3, w8, w9, ptr(x3)));
+ TEST_INSTRUCTION("687C2248", casp(x2, x3, x8, x9, ptr(x3)));
+ TEST_INSTRUCTION("687C6208", caspa(w2, w3, w8, w9, ptr(x3)));
+ TEST_INSTRUCTION("687C6248", caspa(x2, x3, x8, x9, ptr(x3)));
+ TEST_INSTRUCTION("68FC6208", caspal(w2, w3, w8, w9, ptr(x3)));
+ TEST_INSTRUCTION("68FC6248", caspal(x2, x3, x8, x9, ptr(x3)));
+ TEST_INSTRUCTION("68FC2208", caspl(w2, w3, w8, w9, ptr(x3)));
+ TEST_INSTRUCTION("68FC2248", caspl(x2, x3, x8, x9, ptr(x3)));
+ TEST_INSTRUCTION("2300423A", ccmn(w1, w2, 3, CondCode::kEQ));
+ TEST_INSTRUCTION("230042BA", ccmn(x1, x2, 3, CondCode::kEQ));
+ TEST_INSTRUCTION("2308423A", ccmn(w1, 2, 3, CondCode::kEQ));
+ TEST_INSTRUCTION("230842BA", ccmn(x1, 2, 3, CondCode::kEQ));
+ TEST_INSTRUCTION("23005F3A", ccmn(w1, wzr, 3, CondCode::kEQ));
+ TEST_INSTRUCTION("23005FBA", ccmn(x1, xzr, 3, CondCode::kEQ));
+ TEST_INSTRUCTION("2300427A", ccmp(w1, w2, 3, CondCode::kEQ));
+ TEST_INSTRUCTION("230042FA", ccmp(x1, x2, 3, CondCode::kEQ));
+ TEST_INSTRUCTION("2308427A", ccmp(w1, 2, 3, CondCode::kEQ));
+ TEST_INSTRUCTION("230842FA", ccmp(x1, 2, 3, CondCode::kEQ));
+ TEST_INSTRUCTION("23005F7A", ccmp(w1, wzr, 3, CondCode::kEQ));
+ TEST_INSTRUCTION("23005FFA", ccmp(x1, xzr, 3, CondCode::kEQ));
+ TEST_INSTRUCTION("1F4000D5", cfinv());
+ TEST_INSTRUCTION("4114821A", cinc(w1, w2, CondCode::kEQ));
+ TEST_INSTRUCTION("4114829A", cinc(x1, x2, CondCode::kEQ));
+ TEST_INSTRUCTION("5F14821A", cinc(wzr, w2, CondCode::kEQ));
+ TEST_INSTRUCTION("E1179F1A", cinc(w1, wzr, CondCode::kEQ));
+ TEST_INSTRUCTION("5F14829A", cinc(xzr, x2, CondCode::kEQ));
+ TEST_INSTRUCTION("E1179F9A", cinc(x1, xzr, CondCode::kEQ));
+ TEST_INSTRUCTION("4110825A", cinv(w1, w2, CondCode::kEQ));
+ TEST_INSTRUCTION("411082DA", cinv(x1, x2, CondCode::kEQ));
+ TEST_INSTRUCTION("5F10825A", cinv(wzr, w2, CondCode::kEQ));
+ TEST_INSTRUCTION("E1139F5A", cinv(w1, wzr, CondCode::kEQ));
+ TEST_INSTRUCTION("5F1082DA", cinv(xzr, x2, CondCode::kEQ));
+ TEST_INSTRUCTION("E1139FDA", cinv(x1, xzr, CondCode::kEQ));
+ TEST_INSTRUCTION("5F3B03D5", clrex(11));
+ TEST_INSTRUCTION("4114C05A", cls(w1, w2));
+ TEST_INSTRUCTION("4114C0DA", cls(x1, x2));
+ TEST_INSTRUCTION("E117C05A", cls(w1, wzr));
+ TEST_INSTRUCTION("E117C0DA", cls(x1, xzr));
+ TEST_INSTRUCTION("5F14C05A", cls(wzr, w2));
+ TEST_INSTRUCTION("5F14C0DA", cls(xzr, x2));
+ TEST_INSTRUCTION("4110C05A", clz(w1, w2));
+ TEST_INSTRUCTION("4110C0DA", clz(x1, x2));
+ TEST_INSTRUCTION("E113C05A", clz(w1, wzr));
+ TEST_INSTRUCTION("E113C0DA", clz(x1, xzr));
+ TEST_INSTRUCTION("5F10C05A", clz(wzr, w2));
+ TEST_INSTRUCTION("5F10C0DA", clz(xzr, x2));
+ TEST_INSTRUCTION("3F840031", cmn(w1, 33));
+ TEST_INSTRUCTION("3FFC4331", cmn(w1, 0xFF000));
+ TEST_INSTRUCTION("FF030231", cmn(wsp, 128));
+ TEST_INSTRUCTION("3F8400B1", cmn(x1, 33));
+ TEST_INSTRUCTION("3FFC43B1", cmn(x1, 0xFF000));
+ TEST_INSTRUCTION("FF0302B1", cmn(sp, 128));
+ TEST_INSTRUCTION("3F00022B", cmn(w1, w2));
+ TEST_INSTRUCTION("3F0002AB", cmn(x1, x2));
+ TEST_INSTRUCTION("3F08222B", cmn(w1, w2, uxtb(2)));
+ TEST_INSTRUCTION("3F0822AB", cmn(x1, x2, uxtb(2)));
+ TEST_INSTRUCTION("FF43212B", cmn(wsp, w1));
+ TEST_INSTRUCTION("FF07212B", cmn(wsp, w1, uxtb(1)));
+ TEST_INSTRUCTION("FF6321AB", cmn(sp, x1));
+ TEST_INSTRUCTION("FF6721AB", cmn(sp, x1, uxtx(1)));
+ TEST_INSTRUCTION("3F840071", cmp(w1, 33));
+ TEST_INSTRUCTION("3FFC4371", cmp(w1, 0xFF000));
+ TEST_INSTRUCTION("FF030271", cmp(wsp, 128));
+ TEST_INSTRUCTION("3F8400F1", cmp(x1, 33));
+ TEST_INSTRUCTION("3FFC43F1", cmp(x1, 0xFF000));
+ TEST_INSTRUCTION("FF0302F1", cmp(sp, 128));
+ TEST_INSTRUCTION("3F00026B", cmp(w1, w2));
+ TEST_INSTRUCTION("3F0002EB", cmp(x1, x2));
+ TEST_INSTRUCTION("3F08226B", cmp(w1, w2, uxtb(2)));
+ TEST_INSTRUCTION("3F0822EB", cmp(x1, x2, uxtb(2)));
+ TEST_INSTRUCTION("FF43216B", cmp(wsp, w1));
+ TEST_INSTRUCTION("FF07216B", cmp(wsp, w1, uxtb(1)));
+ TEST_INSTRUCTION("FF6321EB", cmp(sp, x1));
+ TEST_INSTRUCTION("FF6721EB", cmp(sp, x1, uxtx(1)));
+ TEST_INSTRUCTION("3F00C2BA", cmpp(x1, x2));
+ TEST_INSTRUCTION("3F00DFBA", cmpp(x1, sp));
+ TEST_INSTRUCTION("FF03C2BA", cmpp(sp, x2));
+ TEST_INSTRUCTION("FF03DFBA", cmpp(sp, sp));
+ TEST_INSTRUCTION("4140C31A", crc32b(w1, w2, w3));
+ TEST_INSTRUCTION("5F40C31A", crc32b(wzr, w2, w3));
+ TEST_INSTRUCTION("E143C31A", crc32b(w1, wzr, w3));
+ TEST_INSTRUCTION("4140DF1A", crc32b(w1, w2, wzr));
+ TEST_INSTRUCTION("4150C31A", crc32cb(w1, w2, w3));
+ TEST_INSTRUCTION("5F50C31A", crc32cb(wzr, w2, w3));
+ TEST_INSTRUCTION("E153C31A", crc32cb(w1, wzr, w3));
+ TEST_INSTRUCTION("4150DF1A", crc32cb(w1, w2, wzr));
+ TEST_INSTRUCTION("4154C31A", crc32ch(w1, w2, w3));
+ TEST_INSTRUCTION("5F54C31A", crc32ch(wzr, w2, w3));
+ TEST_INSTRUCTION("E157C31A", crc32ch(w1, wzr, w3));
+ TEST_INSTRUCTION("4154DF1A", crc32ch(w1, w2, wzr));
+ TEST_INSTRUCTION("4158C31A", crc32cw(w1, w2, w3));
+ TEST_INSTRUCTION("5F58C31A", crc32cw(wzr, w2, w3));
+ TEST_INSTRUCTION("E15BC31A", crc32cw(w1, wzr, w3));
+ TEST_INSTRUCTION("4158DF1A", crc32cw(w1, w2, wzr));
+ TEST_INSTRUCTION("415CC39A", crc32cx(w1, w2, x3));
+ TEST_INSTRUCTION("5F5CC39A", crc32cx(wzr, w2, x3));
+ TEST_INSTRUCTION("E15FC39A", crc32cx(w1, wzr, x3));
+ TEST_INSTRUCTION("415CDF9A", crc32cx(w1, w2, xzr));
+ TEST_INSTRUCTION("4144C31A", crc32h(w1, w2, w3));
+ TEST_INSTRUCTION("5F44C31A", crc32h(wzr, w2, w3));
+ TEST_INSTRUCTION("E147C31A", crc32h(w1, wzr, w3));
+ TEST_INSTRUCTION("4144DF1A", crc32h(w1, w2, wzr));
+ TEST_INSTRUCTION("4148C31A", crc32w(w1, w2, w3));
+ TEST_INSTRUCTION("5F48C31A", crc32w(wzr, w2, w3));
+ TEST_INSTRUCTION("E14BC31A", crc32w(w1, wzr, w3));
+ TEST_INSTRUCTION("4148DF1A", crc32w(w1, w2, wzr));
+ TEST_INSTRUCTION("414CC39A", crc32x(w1, w2, x3));
+ TEST_INSTRUCTION("5F4CC39A", crc32x(wzr, w2, x3));
+ TEST_INSTRUCTION("E14FC39A", crc32x(w1, wzr, x3));
+ TEST_INSTRUCTION("414CDF9A", crc32x(w1, w2, xzr));
+ TEST_INSTRUCTION("9F2203D5", csdb());
+ TEST_INSTRUCTION("4100831A", csel(w1, w2, w3, CondCode::kEQ));
+ TEST_INSTRUCTION("4100839A", csel(x1, x2, x3, CondCode::kEQ));
+ TEST_INSTRUCTION("E1179F1A", cset(w1, CondCode::kEQ));
+ TEST_INSTRUCTION("E1179F9A", cset(x1, CondCode::kEQ));
+ TEST_INSTRUCTION("E1179F1A", cset(w1, CondCode::kEQ));
+ TEST_INSTRUCTION("E1179F9A", cset(x1, CondCode::kEQ));
+ TEST_INSTRUCTION("E1139F5A", csetm(w1, CondCode::kEQ));
+ TEST_INSTRUCTION("E1139FDA", csetm(x1, CondCode::kEQ));
+ TEST_INSTRUCTION("4104831A", csinc(w1, w2, w3, CondCode::kEQ));
+ TEST_INSTRUCTION("4104839A", csinc(x1, x2, x3, CondCode::kEQ));
+ TEST_INSTRUCTION("4100835A", csinv(w1, w2, w3, CondCode::kEQ));
+ TEST_INSTRUCTION("410083DA", csinv(x1, x2, x3, CondCode::kEQ));
+ TEST_INSTRUCTION("4104835A", csneg(w1, w2, w3, CondCode::kEQ));
+ TEST_INSTRUCTION("410483DA", csneg(x1, x2, x3, CondCode::kEQ));
+ TEST_INSTRUCTION("2F740BD5", dc(Predicate::DC::kZVA, x15));
+ TEST_INSTRUCTION("2100B0D4", dcps1(0x8001));
+ TEST_INSTRUCTION("2200B0D4", dcps2(0x8001));
+ TEST_INSTRUCTION("2300B0D4", dcps3(0x8001));
+ TEST_INSTRUCTION("DF2003D5", dgh());
+ TEST_INSTRUCTION("BF3103D5", dmb(1));
+ TEST_INSTRUCTION("E003BFD6", drps());
+ TEST_INSTRUCTION("9F3103D5", dsb(1));
+ TEST_INSTRUCTION("4100234A", eon(w1, w2, w3));
+ TEST_INSTRUCTION("5F00234A", eon(wzr, w2, w3));
+ TEST_INSTRUCTION("E103234A", eon(w1, wzr, w3));
+ TEST_INSTRUCTION("41003F4A", eon(w1, w2, wzr));
+ TEST_INSTRUCTION("4110234A", eon(w1, w2, w3, lsl(4)));
+ TEST_INSTRUCTION("410023CA", eon(x1, x2, x3));
+ TEST_INSTRUCTION("5F0023CA", eon(xzr, x2, x3));
+ TEST_INSTRUCTION("E10323CA", eon(x1, xzr, x3));
+ TEST_INSTRUCTION("41003FCA", eon(x1, x2, xzr));
+ TEST_INSTRUCTION("411023CA", eon(x1, x2, x3, lsl(4)));
+ TEST_INSTRUCTION("4100034A", eor(w1, w2, w3));
+ TEST_INSTRUCTION("5F00034A", eor(wzr, w2, w3));
+ TEST_INSTRUCTION("E103034A", eor(w1, wzr, w3));
+ TEST_INSTRUCTION("41001F4A", eor(w1, w2, wzr));
+ TEST_INSTRUCTION("410003CA", eor(x1, x2, x3));
+ TEST_INSTRUCTION("5F0003CA", eor(xzr, x2, x3));
+ TEST_INSTRUCTION("E10303CA", eor(x1, xzr, x3));
+ TEST_INSTRUCTION("41001FCA", eor(x1, x2, xzr));
+ TEST_INSTRUCTION("4110034A", eor(w1, w2, w3, lsl(4)));
+ TEST_INSTRUCTION("411003CA", eor(x1, x2, x3, lsl(4)));
+ TEST_INSTRUCTION("3F1C0052", eor(wsp, w1, 0xFF));
+ TEST_INSTRUCTION("FF1F0052", eor(wsp, wzr, 0xFF));
+ TEST_INSTRUCTION("3F1C40D2", eor(sp, x1, 0xFF));
+ TEST_INSTRUCTION("FF1F40D2", eor(sp, xzr, 0xFF));
+ TEST_INSTRUCTION("41001252", eor(w1, w2, 0x4000));
+ TEST_INSTRUCTION("410071D2", eor(x1, x2, 0x8000));
+ TEST_INSTRUCTION("E0039FD6", eret());
+ TEST_INSTRUCTION("1F2203D5", esb());
+ TEST_INSTRUCTION("413C8313", extr(w1, w2, w3, 15));
+ TEST_INSTRUCTION("5F3C8313", extr(wzr, w2, w3, 15));
+ TEST_INSTRUCTION("E13F8313", extr(w1, wzr, w3, 15));
+ TEST_INSTRUCTION("413C9F13", extr(w1, w2, wzr, 15));
+ TEST_INSTRUCTION("413CC393", extr(x1, x2, x3, 15));
+ TEST_INSTRUCTION("5F3CC393", extr(xzr, x2, x3, 15));
+ TEST_INSTRUCTION("E13FC393", extr(x1, xzr, x3, 15));
+ TEST_INSTRUCTION("413CDF93", extr(x1, x2, xzr, 15));
+ TEST_INSTRUCTION("4114C39A", gmi(x1, x2, x3));
+ TEST_INSTRUCTION("E117C39A", gmi(x1, sp, x3));
+ TEST_INSTRUCTION("200040D4", hlt(1));
+ TEST_INSTRUCTION("220000D4", hvc(1));
+ TEST_INSTRUCTION("2F750BD5", ic(Predicate::IC::kIVAU, x15));
+ TEST_INSTRUCTION("DF3103D5", isb(1));
+ TEST_INSTRUCTION("620021B8", ldadd(w1, w2, ptr(x3)));
+ TEST_INSTRUCTION("E20321B8", ldadd(w1, w2, ptr(sp)));
+ TEST_INSTRUCTION("620021F8", ldadd(x1, x2, ptr(x3)));
+ TEST_INSTRUCTION("E20321F8", ldadd(x1, x2, ptr(sp)));
+ TEST_INSTRUCTION("6200A1B8", ldadda(w1, w2, ptr(x3)));
+ TEST_INSTRUCTION("E203A1B8", ldadda(w1, w2, ptr(sp)));
+ TEST_INSTRUCTION("6200A1F8", ldadda(x1, x2, ptr(x3)));
+ TEST_INSTRUCTION("E203A1F8", ldadda(x1, x2, ptr(sp)));
+ TEST_INSTRUCTION("6200A138", ldaddab(w1, w2, ptr(x3)));
+ TEST_INSTRUCTION("E203A138", ldaddab(w1, w2, ptr(sp)));
+ TEST_INSTRUCTION("6200A178", ldaddah(w1, w2, ptr(x3)));
+ TEST_INSTRUCTION("E203A178", ldaddah(w1, w2, ptr(sp)));
+ TEST_INSTRUCTION("6200E1B8", ldaddal(w1, w2, ptr(x3)));
+ TEST_INSTRUCTION("E203E1B8", ldaddal(w1, w2, ptr(sp)));
+ TEST_INSTRUCTION("6200E1F8", ldaddal(x1, x2, ptr(x3)));
+ TEST_INSTRUCTION("E203E1F8", ldaddal(x1, x2, ptr(sp)));
+ TEST_INSTRUCTION("6200E138", ldaddalb(w1, w2, ptr(x3)));
+ TEST_INSTRUCTION("E203E138", ldaddalb(w1, w2, ptr(sp)));
+ TEST_INSTRUCTION("6200E178", ldaddalh(w1, w2, ptr(x3)));
+ TEST_INSTRUCTION("E203E178", ldaddalh(w1, w2, ptr(sp)));
+ TEST_INSTRUCTION("62002138", ldaddb(w1, w2, ptr(x3)));
+ TEST_INSTRUCTION("E2032138", ldaddb(w1, w2, ptr(sp)));
+ TEST_INSTRUCTION("62002178", ldaddh(w1, w2, ptr(x3)));
+ TEST_INSTRUCTION("E2032178", ldaddh(w1, w2, ptr(sp)));
+ TEST_INSTRUCTION("620061B8", ldaddl(w1, w2, ptr(x3)));
+ TEST_INSTRUCTION("E20361B8", ldaddl(w1, w2, ptr(sp)));
+ TEST_INSTRUCTION("620061F8", ldaddl(x1, x2, ptr(x3)));
+ TEST_INSTRUCTION("E20361F8", ldaddl(x1, x2, ptr(sp)));
+ TEST_INSTRUCTION("62006138", ldaddlb(w1, w2, ptr(x3)));
+ TEST_INSTRUCTION("E2036138", ldaddlb(w1, w2, ptr(sp)));
+ TEST_INSTRUCTION("62006178", ldaddlh(w1, w2, ptr(x3)));
+ TEST_INSTRUCTION("E2036178", ldaddlh(w1, w2, ptr(sp)));
+ TEST_INSTRUCTION("621021B8", ldclr(w1, w2, ptr(x3)));
+ TEST_INSTRUCTION("E21321B8", ldclr(w1, w2, ptr(sp)));
+ TEST_INSTRUCTION("621021F8", ldclr(x1, x2, ptr(x3)));
+ TEST_INSTRUCTION("E21321F8", ldclr(x1, x2, ptr(sp)));
+ TEST_INSTRUCTION("6210A1B8", ldclra(w1, w2, ptr(x3)));
+ TEST_INSTRUCTION("E213A1B8", ldclra(w1, w2, ptr(sp)));
+ TEST_INSTRUCTION("6210A1F8", ldclra(x1, x2, ptr(x3)));
+ TEST_INSTRUCTION("E213A1F8", ldclra(x1, x2, ptr(sp)));
+ TEST_INSTRUCTION("6210A138", ldclrab(w1, w2, ptr(x3)));
+ TEST_INSTRUCTION("E213A138", ldclrab(w1, w2, ptr(sp)));
+ TEST_INSTRUCTION("6210A178", ldclrah(w1, w2, ptr(x3)));
+ TEST_INSTRUCTION("E213A178", ldclrah(w1, w2, ptr(sp)));
+ TEST_INSTRUCTION("6210E1B8", ldclral(w1, w2, ptr(x3)));
+ TEST_INSTRUCTION("E213E1B8", ldclral(w1, w2, ptr(sp)));
+ TEST_INSTRUCTION("6210E1F8", ldclral(x1, x2, ptr(x3)));
+ TEST_INSTRUCTION("E213E1F8", ldclral(x1, x2, ptr(sp)));
+ TEST_INSTRUCTION("6210E138", ldclralb(w1, w2, ptr(x3)));
+ TEST_INSTRUCTION("E213E138", ldclralb(w1, w2, ptr(sp)));
+ TEST_INSTRUCTION("6210E178", ldclralh(w1, w2, ptr(x3)));
+ TEST_INSTRUCTION("E213E178", ldclralh(w1, w2, ptr(sp)));
+ TEST_INSTRUCTION("62102138", ldclrb(w1, w2, ptr(x3)));
+ TEST_INSTRUCTION("E2132138", ldclrb(w1, w2, ptr(sp)));
+ TEST_INSTRUCTION("62102178", ldclrh(w1, w2, ptr(x3)));
+ TEST_INSTRUCTION("E2132178", ldclrh(w1, w2, ptr(sp)));
+ TEST_INSTRUCTION("621061B8", ldclrl(w1, w2, ptr(x3)));
+ TEST_INSTRUCTION("E21361B8", ldclrl(w1, w2, ptr(sp)));
+ TEST_INSTRUCTION("621061F8", ldclrl(x1, x2, ptr(x3)));
+ TEST_INSTRUCTION("E21361F8", ldclrl(x1, x2, ptr(sp)));
+ TEST_INSTRUCTION("62106138", ldclrlb(w1, w2, ptr(x3)));
+ TEST_INSTRUCTION("E2136138", ldclrlb(w1, w2, ptr(sp)));
+ TEST_INSTRUCTION("62106178", ldclrlh(w1, w2, ptr(x3)));
+ TEST_INSTRUCTION("E2136178", ldclrlh(w1, w2, ptr(sp)));
+ TEST_INSTRUCTION("622021B8", ldeor(w1, w2, ptr(x3)));
+ TEST_INSTRUCTION("E22321B8", ldeor(w1, w2, ptr(sp)));
+ TEST_INSTRUCTION("622021F8", ldeor(x1, x2, ptr(x3)));
+ TEST_INSTRUCTION("E22321F8", ldeor(x1, x2, ptr(sp)));
+ TEST_INSTRUCTION("6220A1B8", ldeora(w1, w2, ptr(x3)));
+ TEST_INSTRUCTION("E223A1B8", ldeora(w1, w2, ptr(sp)));
+ TEST_INSTRUCTION("6220A1F8", ldeora(x1, x2, ptr(x3)));
+ TEST_INSTRUCTION("E223A1F8", ldeora(x1, x2, ptr(sp)));
+ TEST_INSTRUCTION("6220A138", ldeorab(w1, w2, ptr(x3)));
+ TEST_INSTRUCTION("E223A138", ldeorab(w1, w2, ptr(sp)));
+ TEST_INSTRUCTION("6220A178", ldeorah(w1, w2, ptr(x3)));
+ TEST_INSTRUCTION("E223A178", ldeorah(w1, w2, ptr(sp)));
+ TEST_INSTRUCTION("6220E1B8", ldeoral(w1, w2, ptr(x3)));
+ TEST_INSTRUCTION("E223E1B8", ldeoral(w1, w2, ptr(sp)));
+ TEST_INSTRUCTION("6220E1F8", ldeoral(x1, x2, ptr(x3)));
+ TEST_INSTRUCTION("E223E1F8", ldeoral(x1, x2, ptr(sp)));
+ TEST_INSTRUCTION("6220E138", ldeoralb(w1, w2, ptr(x3)));
+ TEST_INSTRUCTION("E223E138", ldeoralb(w1, w2, ptr(sp)));
+ TEST_INSTRUCTION("6220E178", ldeoralh(w1, w2, ptr(x3)));
+ TEST_INSTRUCTION("E223E178", ldeoralh(w1, w2, ptr(sp)));
+ TEST_INSTRUCTION("62202138", ldeorb(w1, w2, ptr(x3)));
+ TEST_INSTRUCTION("E2232138", ldeorb(w1, w2, ptr(sp)));
+ TEST_INSTRUCTION("62202178", ldeorh(w1, w2, ptr(x3)));
+ TEST_INSTRUCTION("E2232178", ldeorh(w1, w2, ptr(sp)));
+ TEST_INSTRUCTION("622061B8", ldeorl(w1, w2, ptr(x3)));
+ TEST_INSTRUCTION("E22361B8", ldeorl(w1, w2, ptr(sp)));
+ TEST_INSTRUCTION("622061F8", ldeorl(x1, x2, ptr(x3)));
+ TEST_INSTRUCTION("E22361F8", ldeorl(x1, x2, ptr(sp)));
+ TEST_INSTRUCTION("62206138", ldeorlb(w1, w2, ptr(x3)));
+ TEST_INSTRUCTION("E2236138", ldeorlb(w1, w2, ptr(sp)));
+ TEST_INSTRUCTION("62206178", ldeorlh(w1, w2, ptr(x3)));
+ TEST_INSTRUCTION("E2236178", ldeorlh(w1, w2, ptr(sp)));
+ TEST_INSTRUCTION("410060D9", ldg(x1, ptr(x2)));
+ TEST_INSTRUCTION("418060D9", ldg(x1, ptr(x2, 128)));
+ TEST_INSTRUCTION("E10360D9", ldg(x1, ptr(sp)));
+ TEST_INSTRUCTION("E18360D9", ldg(x1, ptr(sp, 128)));
+ TEST_INSTRUCTION("4100E0D9", ldgm(x1, ptr(x2)));
+ TEST_INSTRUCTION("E103E0D9", ldgm(x1, ptr(sp)));
+ TEST_INSTRUCTION("417CDF88", ldlar(w1, ptr(x2)));
+ TEST_INSTRUCTION("E17FDF88", ldlar(w1, ptr(sp)));
+ TEST_INSTRUCTION("417CDFC8", ldlar(x1, ptr(x2)));
+ TEST_INSTRUCTION("E17FDFC8", ldlar(x1, ptr(sp)));
+ TEST_INSTRUCTION("417CDF08", ldlarb(w1, ptr(x2)));
+ TEST_INSTRUCTION("E17FDF08", ldlarb(w1, ptr(sp)));
+ TEST_INSTRUCTION("417CDF48", ldlarh(w1, ptr(x2)));
+ TEST_INSTRUCTION("E17FDF48", ldlarh(w1, ptr(sp)));
+ TEST_INSTRUCTION("41084028", ldnp(w1, w2, ptr(x2)));
+ TEST_INSTRUCTION("41086028", ldnp(w1, w2, ptr(x2, -256)));
+ TEST_INSTRUCTION("41885F28", ldnp(w1, w2, ptr(x2, 252)));
+ TEST_INSTRUCTION("410840A8", ldnp(x1, x2, ptr(x2)));
+ TEST_INSTRUCTION("410860A8", ldnp(x1, x2, ptr(x2, -512)));
+ TEST_INSTRUCTION("41885FA8", ldnp(x1, x2, ptr(x2, 504)));
+ TEST_INSTRUCTION("41084029", ldp(w1, w2, ptr(x2)));
+ TEST_INSTRUCTION("41086029", ldp(w1, w2, ptr(x2, -256)));
+ TEST_INSTRUCTION("41885F29", ldp(w1, w2, ptr(x2, 252)));
+ TEST_INSTRUCTION("410840A9", ldp(x1, x2, ptr(x2)));
+ TEST_INSTRUCTION("410860A9", ldp(x1, x2, ptr(x2, -512)));
+ TEST_INSTRUCTION("41885FA9", ldp(x1, x2, ptr(x2, 504)));
+ TEST_INSTRUCTION("41084069", ldpsw(x1, x2, ptr(x2)));
+ TEST_INSTRUCTION("41086069", ldpsw(x1, x2, ptr(x2, -256)));
+ TEST_INSTRUCTION("41885F69", ldpsw(x1, x2, ptr(x2, 252)));
+ TEST_INSTRUCTION("410040B9", ldr(w1, ptr(x2)));
+ TEST_INSTRUCTION("413040B9", ldr(w1, ptr(x2, 48)));
+ TEST_INSTRUCTION("410C43B8", ldr(w1, ptr_pre(x2, 48)));
+ TEST_INSTRUCTION("416863B8", ldr(w1, ptr(x2, x3)));
+ TEST_INSTRUCTION("410040F9", ldr(x1, ptr(x2)));
+ TEST_INSTRUCTION("411840F9", ldr(x1, ptr(x2, 48)));
+ TEST_INSTRUCTION("410C43F8", ldr(x1, ptr_pre(x2, 48)));
+ TEST_INSTRUCTION("416863F8", ldr(x1, ptr(x2, x3)));
+ TEST_INSTRUCTION("FB0F5FF8", ldr(x27, ptr_pre(sp, -16)));
+ TEST_INSTRUCTION("FB0741F8", ldr(x27, ptr_post(sp, 16)));
+ TEST_INSTRUCTION("411040B8", ldr(w1, ptr(x2, 1))); // LDUR
+ TEST_INSTRUCTION("41D05FB8", ldr(w1, ptr(x2, -3))); // LDUR
+ TEST_INSTRUCTION("41705FB8", ldr(w1, ptr(x2, -9))); // LDUR
+ TEST_INSTRUCTION("411040F8", ldr(x1, ptr(x2, 1))); // LDUR
+ TEST_INSTRUCTION("413040F8", ldr(x1, ptr(x2, 3))); // LDUR
+ TEST_INSTRUCTION("41705FF8", ldr(x1, ptr(x2, -9))); // LDUR
+ TEST_INSTRUCTION("41004039", ldrb(w1, ptr(x2)));
+ TEST_INSTRUCTION("41C04039", ldrb(w1, ptr(x2, 48)));
+ TEST_INSTRUCTION("410C4338", ldrb(w1, ptr_pre(x2, 48)));
+ TEST_INSTRUCTION("41686338", ldrb(w1, ptr(x2, x3)));
+ TEST_INSTRUCTION("41044039", ldrb(w1, ptr(x2, 1)));
+ TEST_INSTRUCTION("41D05F38", ldrb(w1, ptr(x2, -3))); // LDURB
+ TEST_INSTRUCTION("41705F38", ldrb(w1, ptr(x2, -9))); // LDURB
+ TEST_INSTRUCTION("41004079", ldrh(w1, ptr(x2)));
+ TEST_INSTRUCTION("41604079", ldrh(w1, ptr(x2, 48)));
+ TEST_INSTRUCTION("410C4378", ldrh(w1, ptr_pre(x2, 48)));
+ TEST_INSTRUCTION("41686378", ldrh(w1, ptr(x2, x3)));
+ TEST_INSTRUCTION("41104078", ldrh(w1, ptr(x2, 1))); // LDURH
+ TEST_INSTRUCTION("41D05F78", ldrh(w1, ptr(x2, -3))); // LDURH
+ TEST_INSTRUCTION("41705F78", ldrh(w1, ptr(x2, -9))); // LDURH
+ TEST_INSTRUCTION("4104C039", ldrsb(w1, ptr(x2, 1)));
+ TEST_INSTRUCTION("41D0DF38", ldrsb(w1, ptr(x2, -3))); // LDURSB
+ TEST_INSTRUCTION("4170DF38", ldrsb(w1, ptr(x2, -9))); // LDURSB
+ TEST_INSTRUCTION("41048039", ldrsb(x1, ptr(x2, 1)));
+ TEST_INSTRUCTION("41D09F38", ldrsb(x1, ptr(x2, -3))); // LDURSB
+ TEST_INSTRUCTION("41709F38", ldrsb(x1, ptr(x2, -9))); // LDURSB
+ TEST_INSTRUCTION("4110C078", ldrsh(w1, ptr(x2, 1))); // LDURSH
+ TEST_INSTRUCTION("41D0DF78", ldrsh(w1, ptr(x2, -3))); // LDURSH
+ TEST_INSTRUCTION("4170DF78", ldrsh(w1, ptr(x2, -9))); // LDURSH
+ TEST_INSTRUCTION("41108078", ldrsh(x1, ptr(x2, 1))); // LDURSH
+ TEST_INSTRUCTION("41D09F78", ldrsh(x1, ptr(x2, -3))); // LDURSH
+ TEST_INSTRUCTION("41709F78", ldrsh(x1, ptr(x2, -9))); // LDURSH
+ TEST_INSTRUCTION("410080B9", ldrsw(x1, ptr(x2)));
+ TEST_INSTRUCTION("413080B9", ldrsw(x1, ptr(x2, 48)));
+ TEST_INSTRUCTION("410C83B8", ldrsw(x1, ptr_pre(x2, 48)));
+ TEST_INSTRUCTION("410483B8", ldrsw(x1, ptr_post(x2, 48)));
+ TEST_INSTRUCTION("4168A3B8", ldrsw(x1, ptr(x2, x3)));
+ TEST_INSTRUCTION("411080B8", ldrsw(x1, ptr(x2, 1))); // LDURSW
+ TEST_INSTRUCTION("413080B8", ldrsw(x1, ptr(x2, 3))); // LDURSW
+ TEST_INSTRUCTION("41709FB8", ldrsw(x1, ptr(x2, -9))); // LDURSW
+ TEST_INSTRUCTION("410420F8", ldraa(x1, ptr(x2)));
+ TEST_INSTRUCTION("410460F8", ldraa(x1, ptr(x2, -4096)));
+ TEST_INSTRUCTION("410C60F8", ldraa(x1, ptr_pre(x2, -4096)));
+ TEST_INSTRUCTION("41FC3FF8", ldraa(x1, ptr_pre(x2, 4088)));
+ TEST_INSTRUCTION("E10720F8", ldraa(x1, ptr(sp)));
+ TEST_INSTRUCTION("E10760F8", ldraa(x1, ptr(sp, -4096)));
+ TEST_INSTRUCTION("E10F60F8", ldraa(x1, ptr_pre(sp, -4096)));
+ TEST_INSTRUCTION("E1FF3FF8", ldraa(x1, ptr_pre(sp, 4088)));
+ TEST_INSTRUCTION("4104A0F8", ldrab(x1, ptr(x2)));
+ TEST_INSTRUCTION("4104E0F8", ldrab(x1, ptr(x2, -4096)));
+ TEST_INSTRUCTION("410CE0F8", ldrab(x1, ptr_pre(x2, -4096)));
+ TEST_INSTRUCTION("41FCBFF8", ldrab(x1, ptr_pre(x2, 4088)));
+ TEST_INSTRUCTION("E107A0F8", ldrab(x1, ptr(sp)));
+ TEST_INSTRUCTION("E107E0F8", ldrab(x1, ptr(sp, -4096)));
+ TEST_INSTRUCTION("E10FE0F8", ldrab(x1, ptr_pre(sp, -4096)));
+ TEST_INSTRUCTION("E1FFBFF8", ldrab(x1, ptr_pre(sp, 4088)));
+ TEST_INSTRUCTION("60DBA0B8", ldrsw(x0, ptr(x27, w0, sxtw(2))));
+ TEST_INSTRUCTION("623021B8", ldset(w1, w2, ptr(x3)));
+ TEST_INSTRUCTION("E23321B8", ldset(w1, w2, ptr(sp)));
+ TEST_INSTRUCTION("623021F8", ldset(x1, x2, ptr(x3)));
+ TEST_INSTRUCTION("E23321F8", ldset(x1, x2, ptr(sp)));
+ TEST_INSTRUCTION("6230A1B8", ldseta(w1, w2, ptr(x3)));
+ TEST_INSTRUCTION("E233A1B8", ldseta(w1, w2, ptr(sp)));
+ TEST_INSTRUCTION("6230A1F8", ldseta(x1, x2, ptr(x3)));
+ TEST_INSTRUCTION("E233A1F8", ldseta(x1, x2, ptr(sp)));
+ TEST_INSTRUCTION("6230A138", ldsetab(w1, w2, ptr(x3)));
+ TEST_INSTRUCTION("E233A138", ldsetab(w1, w2, ptr(sp)));
+ TEST_INSTRUCTION("6230A178", ldsetah(w1, w2, ptr(x3)));
+ TEST_INSTRUCTION("E233A178", ldsetah(w1, w2, ptr(sp)));
+ TEST_INSTRUCTION("6230E1B8", ldsetal(w1, w2, ptr(x3)));
+ TEST_INSTRUCTION("E233E1B8", ldsetal(w1, w2, ptr(sp)));
+ TEST_INSTRUCTION("6230E1F8", ldsetal(x1, x2, ptr(x3)));
+ TEST_INSTRUCTION("E233E1F8", ldsetal(x1, x2, ptr(sp)));
+ TEST_INSTRUCTION("6230E178", ldsetalh(w1, w2, ptr(x3)));
+ TEST_INSTRUCTION("E233E178", ldsetalh(w1, w2, ptr(sp)));
+ TEST_INSTRUCTION("6230E138", ldsetalb(w1, w2, ptr(x3)));
+ TEST_INSTRUCTION("E233E138", ldsetalb(w1, w2, ptr(sp)));
+ TEST_INSTRUCTION("62302138", ldsetb(w1, w2, ptr(x3)));
+ TEST_INSTRUCTION("E2332138", ldsetb(w1, w2, ptr(sp)));
+ TEST_INSTRUCTION("62302178", ldseth(w1, w2, ptr(x3)));
+ TEST_INSTRUCTION("E2332178", ldseth(w1, w2, ptr(sp)));
+ TEST_INSTRUCTION("623061B8", ldsetl(w1, w2, ptr(x3)));
+ TEST_INSTRUCTION("E23361B8", ldsetl(w1, w2, ptr(sp)));
+ TEST_INSTRUCTION("623061F8", ldsetl(x1, x2, ptr(x3)));
+ TEST_INSTRUCTION("E23361F8", ldsetl(x1, x2, ptr(sp)));
+ TEST_INSTRUCTION("62306138", ldsetlb(w1, w2, ptr(x3)));
+ TEST_INSTRUCTION("E2336138", ldsetlb(w1, w2, ptr(sp)));
+ TEST_INSTRUCTION("62306178", ldsetlh(w1, w2, ptr(x3)));
+ TEST_INSTRUCTION("E2336178", ldsetlh(w1, w2, ptr(sp)));
+ TEST_INSTRUCTION("624021B8", ldsmax(w1, w2, ptr(x3)));
+ TEST_INSTRUCTION("E24321B8", ldsmax(w1, w2, ptr(sp)));
+ TEST_INSTRUCTION("624021F8", ldsmax(x1, x2, ptr(x3)));
+ TEST_INSTRUCTION("E24321F8", ldsmax(x1, x2, ptr(sp)));
+ TEST_INSTRUCTION("6240A1B8", ldsmaxa(w1, w2, ptr(x3)));
+ TEST_INSTRUCTION("E243A1B8", ldsmaxa(w1, w2, ptr(sp)));
+ TEST_INSTRUCTION("6240A1F8", ldsmaxa(x1, x2, ptr(x3)));
+ TEST_INSTRUCTION("E243A1F8", ldsmaxa(x1, x2, ptr(sp)));
+ TEST_INSTRUCTION("6240A138", ldsmaxab(w1, w2, ptr(x3)));
+ TEST_INSTRUCTION("E243A138", ldsmaxab(w1, w2, ptr(sp)));
+ TEST_INSTRUCTION("6240A178", ldsmaxah(w1, w2, ptr(x3)));
+ TEST_INSTRUCTION("E243A178", ldsmaxah(w1, w2, ptr(sp)));
+ TEST_INSTRUCTION("6240E1B8", ldsmaxal(w1, w2, ptr(x3)));
+ TEST_INSTRUCTION("E243E1B8", ldsmaxal(w1, w2, ptr(sp)));
+ TEST_INSTRUCTION("6240E1F8", ldsmaxal(x1, x2, ptr(x3)));
+ TEST_INSTRUCTION("E243E1F8", ldsmaxal(x1, x2, ptr(sp)));
+ TEST_INSTRUCTION("6240E138", ldsmaxalb(w1, w2, ptr(x3)));
+ TEST_INSTRUCTION("E243E138", ldsmaxalb(w1, w2, ptr(sp)));
+ TEST_INSTRUCTION("6240E178", ldsmaxalh(w1, w2, ptr(x3)));
+ TEST_INSTRUCTION("E243E178", ldsmaxalh(w1, w2, ptr(sp)));
+ TEST_INSTRUCTION("62402138", ldsmaxb(w1, w2, ptr(x3)));
+ TEST_INSTRUCTION("E2432138", ldsmaxb(w1, w2, ptr(sp)));
+ TEST_INSTRUCTION("62402178", ldsmaxh(w1, w2, ptr(x3)));
+ TEST_INSTRUCTION("E2432178", ldsmaxh(w1, w2, ptr(sp)));
+ TEST_INSTRUCTION("624061B8", ldsmaxl(w1, w2, ptr(x3)));
+ TEST_INSTRUCTION("E24361B8", ldsmaxl(w1, w2, ptr(sp)));
+ TEST_INSTRUCTION("624061F8", ldsmaxl(x1, x2, ptr(x3)));
+ TEST_INSTRUCTION("E24361F8", ldsmaxl(x1, x2, ptr(sp)));
+ TEST_INSTRUCTION("62406138", ldsmaxlb(w1, w2, ptr(x3)));
+ TEST_INSTRUCTION("E2436138", ldsmaxlb(w1, w2, ptr(sp)));
+ TEST_INSTRUCTION("62406178", ldsmaxlh(w1, w2, ptr(x3)));
+ TEST_INSTRUCTION("E2436178", ldsmaxlh(w1, w2, ptr(sp)));
+ TEST_INSTRUCTION("625021B8", ldsmin(w1, w2, ptr(x3)));
+ TEST_INSTRUCTION("E25321B8", ldsmin(w1, w2, ptr(sp)));
+ TEST_INSTRUCTION("625021F8", ldsmin(x1, x2, ptr(x3)));
+ TEST_INSTRUCTION("E25321F8", ldsmin(x1, x2, ptr(sp)));
+ TEST_INSTRUCTION("6250A1B8", ldsmina(w1, w2, ptr(x3)));
+ TEST_INSTRUCTION("E253A1B8", ldsmina(w1, w2, ptr(sp)));
+ TEST_INSTRUCTION("6250A1F8", ldsmina(x1, x2, ptr(x3)));
+ TEST_INSTRUCTION("E253A1F8", ldsmina(x1, x2, ptr(sp)));
+ TEST_INSTRUCTION("6250A138", ldsminab(w1, w2, ptr(x3)));
+ TEST_INSTRUCTION("E253A138", ldsminab(w1, w2, ptr(sp)));
+ TEST_INSTRUCTION("6250A178", ldsminah(w1, w2, ptr(x3)));
+ TEST_INSTRUCTION("E253A178", ldsminah(w1, w2, ptr(sp)));
+ TEST_INSTRUCTION("6250E1B8", ldsminal(w1, w2, ptr(x3)));
+ TEST_INSTRUCTION("E253E1B8", ldsminal(w1, w2, ptr(sp)));
+ TEST_INSTRUCTION("6250E1F8", ldsminal(x1, x2, ptr(x3)));
+ TEST_INSTRUCTION("E253E1F8", ldsminal(x1, x2, ptr(sp)));
+ TEST_INSTRUCTION("6250E138", ldsminalb(w1, w2, ptr(x3)));
+ TEST_INSTRUCTION("E253E138", ldsminalb(w1, w2, ptr(sp)));
+ TEST_INSTRUCTION("6250E178", ldsminalh(w1, w2, ptr(x3)));
+ TEST_INSTRUCTION("E253E178", ldsminalh(w1, w2, ptr(sp)));
+ TEST_INSTRUCTION("62502138", ldsminb(w1, w2, ptr(x3)));
+ TEST_INSTRUCTION("E2532138", ldsminb(w1, w2, ptr(sp)));
+ TEST_INSTRUCTION("62502178", ldsminh(w1, w2, ptr(x3)));
+ TEST_INSTRUCTION("E2532178", ldsminh(w1, w2, ptr(sp)));
+ TEST_INSTRUCTION("625061B8", ldsminl(w1, w2, ptr(x3)));
+ TEST_INSTRUCTION("E25361B8", ldsminl(w1, w2, ptr(sp)));
+ TEST_INSTRUCTION("625061F8", ldsminl(x1, x2, ptr(x3)));
+ TEST_INSTRUCTION("E25361F8", ldsminl(x1, x2, ptr(sp)));
+ TEST_INSTRUCTION("62506138", ldsminlb(w1, w2, ptr(x3)));
+ TEST_INSTRUCTION("E2536138", ldsminlb(w1, w2, ptr(sp)));
+ TEST_INSTRUCTION("62506178", ldsminlh(w1, w2, ptr(x3)));
+ TEST_INSTRUCTION("E2536178", ldsminlh(w1, w2, ptr(sp)));
+ TEST_INSTRUCTION("410840B8", ldtr(w1, ptr(x2)));
+ TEST_INSTRUCTION("411848B8", ldtr(w1, ptr(x2, 129)));
+ TEST_INSTRUCTION("E10B40B8", ldtr(w1, ptr(sp)));
+ TEST_INSTRUCTION("E11B48B8", ldtr(w1, ptr(sp, 129)));
+ TEST_INSTRUCTION("410840F8", ldtr(x1, ptr(x2)));
+ TEST_INSTRUCTION("411848F8", ldtr(x1, ptr(x2, 129)));
+ TEST_INSTRUCTION("E10B40F8", ldtr(x1, ptr(sp)));
+ TEST_INSTRUCTION("E11B48F8", ldtr(x1, ptr(sp, 129)));
+ TEST_INSTRUCTION("41084038", ldtrb(w1, ptr(x2)));
+ TEST_INSTRUCTION("41184838", ldtrb(w1, ptr(x2, 129)));
+ TEST_INSTRUCTION("E10B4038", ldtrb(w1, ptr(sp)));
+ TEST_INSTRUCTION("E11B4838", ldtrb(w1, ptr(sp, 129)));
+ TEST_INSTRUCTION("41084078", ldtrh(w1, ptr(x2)));
+ TEST_INSTRUCTION("41184878", ldtrh(w1, ptr(x2, 129)));
+ TEST_INSTRUCTION("E10B4078", ldtrh(w1, ptr(sp)));
+ TEST_INSTRUCTION("E11B4878", ldtrh(w1, ptr(sp, 129)));
+ TEST_INSTRUCTION("4108C038", ldtrsb(w1, ptr(x2)));
+ TEST_INSTRUCTION("4118C838", ldtrsb(w1, ptr(x2, 129)));
+ TEST_INSTRUCTION("E10BC038", ldtrsb(w1, ptr(sp)));
+ TEST_INSTRUCTION("E11BC838", ldtrsb(w1, ptr(sp, 129)));
+ TEST_INSTRUCTION("4108C078", ldtrsh(w1, ptr(x2)));
+ TEST_INSTRUCTION("4118C878", ldtrsh(w1, ptr(x2, 129)));
+ TEST_INSTRUCTION("E10BC078", ldtrsh(w1, ptr(sp)));
+ TEST_INSTRUCTION("E11BC878", ldtrsh(w1, ptr(sp, 129)));
+ TEST_INSTRUCTION("410880B8", ldtrsw(x1, ptr(x2)));
+ TEST_INSTRUCTION("411888B8", ldtrsw(x1, ptr(x2, 129)));
+ TEST_INSTRUCTION("E10B80B8", ldtrsw(x1, ptr(sp)));
+ TEST_INSTRUCTION("E11B88B8", ldtrsw(x1, ptr(sp, 129)));
+ TEST_INSTRUCTION("626021B8", ldumax(w1, w2, ptr(x3)));
+ TEST_INSTRUCTION("E26321B8", ldumax(w1, w2, ptr(sp)));
+ TEST_INSTRUCTION("626021F8", ldumax(x1, x2, ptr(x3)));
+ TEST_INSTRUCTION("E26321F8", ldumax(x1, x2, ptr(sp)));
+ TEST_INSTRUCTION("6260A1B8", ldumaxa(w1, w2, ptr(x3)));
+ TEST_INSTRUCTION("E263A1B8", ldumaxa(w1, w2, ptr(sp)));
+ TEST_INSTRUCTION("6260A1F8", ldumaxa(x1, x2, ptr(x3)));
+ TEST_INSTRUCTION("E263A1F8", ldumaxa(x1, x2, ptr(sp)));
+ TEST_INSTRUCTION("6260A138", ldumaxab(w1, w2, ptr(x3)));
+ TEST_INSTRUCTION("E263A138", ldumaxab(w1, w2, ptr(sp)));
+ TEST_INSTRUCTION("6260A178", ldumaxah(w1, w2, ptr(x3)));
+ TEST_INSTRUCTION("E263A178", ldumaxah(w1, w2, ptr(sp)));
+ TEST_INSTRUCTION("6260E1B8", ldumaxal(w1, w2, ptr(x3)));
+ TEST_INSTRUCTION("E263E1B8", ldumaxal(w1, w2, ptr(sp)));
+ TEST_INSTRUCTION("6260E1F8", ldumaxal(x1, x2, ptr(x3)));
+ TEST_INSTRUCTION("E263E1F8", ldumaxal(x1, x2, ptr(sp)));
+ TEST_INSTRUCTION("6260E138", ldumaxalb(w1, w2, ptr(x3)));
+ TEST_INSTRUCTION("E263E138", ldumaxalb(w1, w2, ptr(sp)));
+ TEST_INSTRUCTION("6260E178", ldumaxalh(w1, w2, ptr(x3)));
+ TEST_INSTRUCTION("E263E178", ldumaxalh(w1, w2, ptr(sp)));
+ TEST_INSTRUCTION("62602138", ldumaxb(w1, w2, ptr(x3)));
+ TEST_INSTRUCTION("E2632138", ldumaxb(w1, w2, ptr(sp)));
+ TEST_INSTRUCTION("62602178", ldumaxh(w1, w2, ptr(x3)));
+ TEST_INSTRUCTION("E2632178", ldumaxh(w1, w2, ptr(sp)));
+ TEST_INSTRUCTION("626061B8", ldumaxl(w1, w2, ptr(x3)));
+ TEST_INSTRUCTION("E26361B8", ldumaxl(w1, w2, ptr(sp)));
+ TEST_INSTRUCTION("626061F8", ldumaxl(x1, x2, ptr(x3)));
+ TEST_INSTRUCTION("E26361F8", ldumaxl(x1, x2, ptr(sp)));
+ TEST_INSTRUCTION("62606138", ldumaxlb(w1, w2, ptr(x3)));
+ TEST_INSTRUCTION("E2636138", ldumaxlb(w1, w2, ptr(sp)));
+ TEST_INSTRUCTION("62606178", ldumaxlh(w1, w2, ptr(x3)));
+ TEST_INSTRUCTION("E2636178", ldumaxlh(w1, w2, ptr(sp)));
+ TEST_INSTRUCTION("627021B8", ldumin(w1, w2, ptr(x3)));
+ TEST_INSTRUCTION("E27321B8", ldumin(w1, w2, ptr(sp)));
+ TEST_INSTRUCTION("627021F8", ldumin(x1, x2, ptr(x3)));
+ TEST_INSTRUCTION("E27321F8", ldumin(x1, x2, ptr(sp)));
+ TEST_INSTRUCTION("6270A1B8", ldumina(w1, w2, ptr(x3)));
+ TEST_INSTRUCTION("E273A1B8", ldumina(w1, w2, ptr(sp)));
+ TEST_INSTRUCTION("6270A1F8", ldumina(x1, x2, ptr(x3)));
+ TEST_INSTRUCTION("E273A1F8", ldumina(x1, x2, ptr(sp)));
+ TEST_INSTRUCTION("6270A138", lduminab(w1, w2, ptr(x3)));
+ TEST_INSTRUCTION("E273A138", lduminab(w1, w2, ptr(sp)));
+ TEST_INSTRUCTION("6270A178", lduminah(w1, w2, ptr(x3)));
+ TEST_INSTRUCTION("E273A178", lduminah(w1, w2, ptr(sp)));
+ TEST_INSTRUCTION("6270E1B8", lduminal(w1, w2, ptr(x3)));
+ TEST_INSTRUCTION("E273E1B8", lduminal(w1, w2, ptr(sp)));
+ TEST_INSTRUCTION("6270E1F8", lduminal(x1, x2, ptr(x3)));
+ TEST_INSTRUCTION("E273E1F8", lduminal(x1, x2, ptr(sp)));
+ TEST_INSTRUCTION("6270E138", lduminalb(w1, w2, ptr(x3)));
+ TEST_INSTRUCTION("E273E138", lduminalb(w1, w2, ptr(sp)));
+ TEST_INSTRUCTION("6270E178", lduminalh(w1, w2, ptr(x3)));
+ TEST_INSTRUCTION("E273E178", lduminalh(w1, w2, ptr(sp)));
+ TEST_INSTRUCTION("62702138", lduminb(w1, w2, ptr(x3)));
+ TEST_INSTRUCTION("E2732138", lduminb(w1, w2, ptr(sp)));
+ TEST_INSTRUCTION("62702178", lduminh(w1, w2, ptr(x3)));
+ TEST_INSTRUCTION("E2732178", lduminh(w1, w2, ptr(sp)));
+ TEST_INSTRUCTION("627061B8", lduminl(w1, w2, ptr(x3)));
+ TEST_INSTRUCTION("E27361B8", lduminl(w1, w2, ptr(sp)));
+ TEST_INSTRUCTION("627061F8", lduminl(x1, x2, ptr(x3)));
+ TEST_INSTRUCTION("E27361F8", lduminl(x1, x2, ptr(sp)));
+ TEST_INSTRUCTION("62706138", lduminlb(w1, w2, ptr(x3)));
+ TEST_INSTRUCTION("E2736138", lduminlb(w1, w2, ptr(sp)));
+ TEST_INSTRUCTION("62706178", lduminlh(w1, w2, ptr(x3)));
+ TEST_INSTRUCTION("E2736178", lduminlh(w1, w2, ptr(sp)));
+ TEST_INSTRUCTION("410040B8", ldur(w1, ptr(x2)));
+ TEST_INSTRUCTION("411048B8", ldur(w1, ptr(x2, 129)));
+ TEST_INSTRUCTION("E10340B8", ldur(w1, ptr(sp)));
+ TEST_INSTRUCTION("E11348B8", ldur(w1, ptr(sp, 129)));
+ TEST_INSTRUCTION("410040F8", ldur(x1, ptr(x2)));
+ TEST_INSTRUCTION("411048F8", ldur(x1, ptr(x2, 129)));
+ TEST_INSTRUCTION("E10340F8", ldur(x1, ptr(sp)));
+ TEST_INSTRUCTION("E11348F8", ldur(x1, ptr(sp, 129)));
+ TEST_INSTRUCTION("41004038", ldurb(w1, ptr(x2)));
+ TEST_INSTRUCTION("41104838", ldurb(w1, ptr(x2, 129)));
+ TEST_INSTRUCTION("E1034038", ldurb(w1, ptr(sp)));
+ TEST_INSTRUCTION("E1134838", ldurb(w1, ptr(sp, 129)));
+ TEST_INSTRUCTION("41004078", ldurh(w1, ptr(x2)));
+ TEST_INSTRUCTION("41104878", ldurh(w1, ptr(x2, 129)));
+ TEST_INSTRUCTION("E1034078", ldurh(w1, ptr(sp)));
+ TEST_INSTRUCTION("E1134878", ldurh(w1, ptr(sp, 129)));
+ TEST_INSTRUCTION("4100C038", ldursb(w1, ptr(x2)));
+ TEST_INSTRUCTION("4110C838", ldursb(w1, ptr(x2, 129)));
+ TEST_INSTRUCTION("E103C038", ldursb(w1, ptr(sp)));
+ TEST_INSTRUCTION("E113C838", ldursb(w1, ptr(sp, 129)));
+ TEST_INSTRUCTION("4100C078", ldursh(w1, ptr(x2)));
+ TEST_INSTRUCTION("4110C878", ldursh(w1, ptr(x2, 129)));
+ TEST_INSTRUCTION("E103C078", ldursh(w1, ptr(sp)));
+ TEST_INSTRUCTION("E113C878", ldursh(w1, ptr(sp, 129)));
+ TEST_INSTRUCTION("410080B8", ldursw(x1, ptr(x2)));
+ TEST_INSTRUCTION("411088B8", ldursw(x1, ptr(x2, 129)));
+ TEST_INSTRUCTION("E10380B8", ldursw(x1, ptr(sp)));
+ TEST_INSTRUCTION("E11388B8", ldursw(x1, ptr(sp, 129)));
+ TEST_INSTRUCTION("61087F88", ldxp(w1, w2, ptr(x3)));
+ TEST_INSTRUCTION("E10B7F88", ldxp(w1, w2, ptr(sp)));
+ TEST_INSTRUCTION("61087FC8", ldxp(x1, x2, ptr(x3)));
+ TEST_INSTRUCTION("E10B7FC8", ldxp(x1, x2, ptr(sp)));
+ TEST_INSTRUCTION("417C5F88", ldxr(w1, ptr(x2)));
+ TEST_INSTRUCTION("E17F5F88", ldxr(w1, ptr(sp)));
+ TEST_INSTRUCTION("417C5FC8", ldxr(x1, ptr(x2)));
+ TEST_INSTRUCTION("E17F5FC8", ldxr(x1, ptr(sp)));
+ TEST_INSTRUCTION("417C5F08", ldxrb(w1, ptr(x2)));
+ TEST_INSTRUCTION("E17F5F08", ldxrb(w1, ptr(sp)));
+ TEST_INSTRUCTION("417C5F48", ldxrh(w1, ptr(x2)));
+ TEST_INSTRUCTION("E17F5F48", ldxrh(w1, ptr(sp)));
+ TEST_INSTRUCTION("4120C31A", lsl(w1, w2, w3));
+ TEST_INSTRUCTION("4120C39A", lsl(x1, x2, x3));
+ TEST_INSTRUCTION("41401153", lsl(w1, w2, 15));
+ TEST_INSTRUCTION("41C071D3", lsl(x1, x2, 15));
+ TEST_INSTRUCTION("4120C31A", lslv(w1, w2, w3));
+ TEST_INSTRUCTION("4120C39A", lslv(x1, x2, x3));
+ TEST_INSTRUCTION("4124C31A", lsr(w1, w2, w3));
+ TEST_INSTRUCTION("4124C39A", lsr(x1, x2, x3));
+ TEST_INSTRUCTION("417C0F53", lsr(w1, w2, 15));
+ TEST_INSTRUCTION("41FC4FD3", lsr(x1, x2, 15));
+ TEST_INSTRUCTION("4124C31A", lsrv(w1, w2, w3));
+ TEST_INSTRUCTION("4124C39A", lsrv(x1, x2, x3));
+ TEST_INSTRUCTION("4110031B", madd(w1, w2, w3, w4));
+ TEST_INSTRUCTION("4110039B", madd(x1, x2, x3, x4));
+ TEST_INSTRUCTION("41FC031B", mneg(w1, w2, w3));
+ TEST_INSTRUCTION("41FC039B", mneg(x1, x2, x3));
+ TEST_INSTRUCTION("E103022A", mov(w1, w2));
+ TEST_INSTRUCTION("E10302AA", mov(x1, x2));
+ TEST_INSTRUCTION("01008052", mov(w1, 0));
+ TEST_INSTRUCTION("01008012", mov(w1, -1));
+ TEST_INSTRUCTION("21008052", mov(w1, 1));
+ TEST_INSTRUCTION("41008052", mov(w1, 2));
+ TEST_INSTRUCTION("61008052", mov(w1, 3));
+ TEST_INSTRUCTION("81008052", mov(w1, 4));
+ TEST_INSTRUCTION("A1008052", mov(w1, 5));
+ TEST_INSTRUCTION("C1008052", mov(w1, 6));
+ TEST_INSTRUCTION("E1008052", mov(w1, 7));
+ TEST_INSTRUCTION("01018052", mov(w1, 8));
+ TEST_INSTRUCTION("21018052", mov(w1, 9));
+ TEST_INSTRUCTION("41018052", mov(w1, 10));
+ TEST_INSTRUCTION("8146A252", mov(w1, 0x12340000));
+ TEST_INSTRUCTION("81468252", mov(w1, 0x00001234));
+ TEST_INSTRUCTION("61B9BD12", mov(w1, 0x1234FFFF));
+ TEST_INSTRUCTION("61B99D12", mov(w1, 0xFFFF1234));
+ TEST_INSTRUCTION("010080D2", mov(x1, 0));
+ TEST_INSTRUCTION("01008092", mov(x1, -1));
+ TEST_INSTRUCTION("8146E2D2", mov(x1, 0x1234000000000000));
+ TEST_INSTRUCTION("8146C2D2", mov(x1, 0x0000123400000000));
+ TEST_INSTRUCTION("8146A2D2", mov(x1, 0x0000000012340000));
+ TEST_INSTRUCTION("814682D2", mov(x1, 0x0000000000001234));
+ TEST_INSTRUCTION("61B9FD92", mov(x1, 0x1234FFFFFFFFFFFF));
+ TEST_INSTRUCTION("61B9DD92", mov(x1, 0xFFFF1234FFFFFFFF));
+ TEST_INSTRUCTION("61B9BD92", mov(x1, 0xFFFFFFFF1234FFFF));
+ TEST_INSTRUCTION("61B99D92", mov(x1, 0xFFFFFFFFFFFF1234));
+ TEST_INSTRUCTION("E1030011", mov(w1, wsp));
+ TEST_INSTRUCTION("E1030091", mov(x1, sp));
+ TEST_INSTRUCTION("3F000011", mov(wsp, w1));
+ TEST_INSTRUCTION("FF3F0032", mov(wsp, 0xFFFF));
+ TEST_INSTRUCTION("3F000091", mov(sp, x1));
+ TEST_INSTRUCTION("FF3F40B2", mov(sp, 0xFFFF));
+ TEST_INSTRUCTION("FF030011", mov(wsp, wsp));
+ TEST_INSTRUCTION("FF030091", mov(sp, sp));
+ TEST_INSTRUCTION("015138D5", mrs(x1, Predicate::SysReg::kAFSR0_EL1));
+ TEST_INSTRUCTION("01423BD5", mrs(x1, Predicate::SysReg::kNZCV));
+ TEST_INSTRUCTION("015118D5", msr(Predicate::SysReg::kAFSR0_EL1, x1));
+ TEST_INSTRUCTION("01421BD5", msr(Predicate::SysReg::kNZCV, x1));
+ TEST_INSTRUCTION("4190031B", msub(w1, w2, w3, w4));
+ TEST_INSTRUCTION("4190039B", msub(x1, x2, x3, x4));
+ TEST_INSTRUCTION("417C031B", mul(w1, w2, w3));
+ TEST_INSTRUCTION("417C039B", mul(x1, x2, x3));
+ TEST_INSTRUCTION("E103222A", mvn(w1, w2));
+ TEST_INSTRUCTION("E10322AA", mvn(x1, x2));
+ TEST_INSTRUCTION("E113222A", mvn(w1, w2, lsl(4)));
+ TEST_INSTRUCTION("E11322AA", mvn(x1, x2, lsl(4)));
+ TEST_INSTRUCTION("E103024B", neg(w1, w2));
+ TEST_INSTRUCTION("E10302CB", neg(x1, x2));
+ TEST_INSTRUCTION("E113024B", neg(w1, w2, lsl(4)));
+ TEST_INSTRUCTION("E11302CB", neg(x1, x2, lsl(4)));
+ TEST_INSTRUCTION("E103026B", negs(w1, w2));
+ TEST_INSTRUCTION("E10302EB", negs(x1, x2));
+ TEST_INSTRUCTION("E113026B", negs(w1, w2, lsl(4)));
+ TEST_INSTRUCTION("E11302EB", negs(x1, x2, lsl(4)));
+ TEST_INSTRUCTION("E103025A", ngc(w1, w2));
+ TEST_INSTRUCTION("E10302DA", ngc(x1, x2));
+ TEST_INSTRUCTION("E103027A", ngcs(w1, w2));
+ TEST_INSTRUCTION("E10302FA", ngcs(x1, x2));
+ TEST_INSTRUCTION("4100232A", orn(w1, w2, w3));
+ TEST_INSTRUCTION("410023AA", orn(x1, x2, x3));
+ TEST_INSTRUCTION("4110232A", orn(w1, w2, w3, lsl(4)));
+ TEST_INSTRUCTION("411023AA", orn(x1, x2, x3, lsl(4)));
+ TEST_INSTRUCTION("4100032A", orr(w1, w2, w3));
+ TEST_INSTRUCTION("410003AA", orr(x1, x2, x3));
+ TEST_INSTRUCTION("4110032A", orr(w1, w2, w3, lsl(4)));
+ TEST_INSTRUCTION("411003AA", orr(x1, x2, x3, lsl(4)));
+ TEST_INSTRUCTION("3F1C0032", orr(wsp, w1, 0xFF));
+ TEST_INSTRUCTION("3F1C40B2", orr(sp, x1, 0xFF));
+ TEST_INSTRUCTION("41001232", orr(w1, w2, 0x4000));
+ TEST_INSTRUCTION("410071B2", orr(x1, x2, 0x8000));
+ TEST_INSTRUCTION("E8030032", orr(w8, wzr, 0x1));
+ TEST_INSTRUCTION("E80340B2", orr(x8, xzr, 0x1));
+ TEST_INSTRUCTION("4108C1DA", pacda(x1, x2));
+ TEST_INSTRUCTION("E10BC1DA", pacda(x1, sp));
+ TEST_INSTRUCTION("410CC1DA", pacdb(x1, x2));
+ TEST_INSTRUCTION("E10FC1DA", pacdb(x1, sp));
+ TEST_INSTRUCTION("E12BC1DA", pacdza(x1));
+ TEST_INSTRUCTION("F42BC1DA", pacdza(x20));
+ TEST_INSTRUCTION("E12FC1DA", pacdzb(x1));
+ TEST_INSTRUCTION("F42FC1DA", pacdzb(x20));
+ TEST_INSTRUCTION("4130C39A", pacga(x1, x2, x3));
+ TEST_INSTRUCTION("4130DF9A", pacga(x1, x2, sp));
+ TEST_INSTRUCTION("9F3403D5", pssbb());
+ TEST_INSTRUCTION("4100C05A", rbit(w1, w2));
+ TEST_INSTRUCTION("4100C0DA", rbit(x1, x2));
+ TEST_INSTRUCTION("4108C05A", rev(w1, w2));
+ TEST_INSTRUCTION("410CC0DA", rev(x1, x2));
+ TEST_INSTRUCTION("4104C05A", rev16(w1, w2));
+ TEST_INSTRUCTION("4104C0DA", rev16(x1, x2));
+ TEST_INSTRUCTION("4108C0DA", rev32(x1, x2));
+ TEST_INSTRUCTION("410CC0DA", rev64(x1, x2));
+ TEST_INSTRUCTION("412CC31A", ror(w1, w2, w3));
+ TEST_INSTRUCTION("412CC39A", ror(x1, x2, x3));
+ TEST_INSTRUCTION("413C8213", ror(w1, w2, 15));
+ TEST_INSTRUCTION("413CC293", ror(x1, x2, 15));
+ TEST_INSTRUCTION("412CC31A", rorv(w1, w2, w3));
+ TEST_INSTRUCTION("412CC39A", rorv(x1, x2, x3));
+ TEST_INSTRUCTION("4100035A", sbc(w1, w2, w3));
+ TEST_INSTRUCTION("410003DA", sbc(x1, x2, x3));
+ TEST_INSTRUCTION("4100037A", sbcs(w1, w2, w3));
+ TEST_INSTRUCTION("410003FA", sbcs(x1, x2, x3));
+ TEST_INSTRUCTION("41241B13", sbfiz(w1, w2, 5, 10));
+ TEST_INSTRUCTION("41247B93", sbfiz(x1, x2, 5, 10));
+ TEST_INSTRUCTION("41280513", sbfm(w1, w2, 5, 10));
+ TEST_INSTRUCTION("41284593", sbfm(x1, x2, 5, 10));
+ TEST_INSTRUCTION("41380513", sbfx(w1, w2, 5, 10));
+ TEST_INSTRUCTION("41384593", sbfx(x1, x2, 5, 10));
+ TEST_INSTRUCTION("410CC31A", sdiv(w1, w2, w3));
+ TEST_INSTRUCTION("410CC39A", sdiv(x1, x2, x3));
+ TEST_INSTRUCTION("2D08003A", setf8(w1));
+ TEST_INSTRUCTION("2D48003A", setf16(w1));
+ TEST_INSTRUCTION("4110239B", smaddl(x1, w2, w3, x4));
+ TEST_INSTRUCTION("230000D4", smc(1));
+ TEST_INSTRUCTION("41FC239B", smnegl(x1, w2, w3));
+ TEST_INSTRUCTION("4190239B", smsubl(x1, w2, w3, x4));
+ TEST_INSTRUCTION("417C439B", smulh(x1, x2, x3));
+ TEST_INSTRUCTION("417C239B", smull(x1, w2, w3));
+ TEST_INSTRUCTION("9F3003D5", ssbb());
+ TEST_INSTRUCTION("4108A0D9", st2g(x1, ptr(x2)));
+ TEST_INSTRUCTION("4188A0D9", st2g(x1, ptr(x2, 128)));
+ TEST_INSTRUCTION("418CA0D9", st2g(x1, ptr_pre(x2, 128)));
+ TEST_INSTRUCTION("4184A0D9", st2g(x1, ptr_post(x2, 128)));
+ TEST_INSTRUCTION("E10BA0D9", st2g(x1, ptr(sp)));
+ TEST_INSTRUCTION("E18BA0D9", st2g(x1, ptr(sp, 128)));
+ TEST_INSTRUCTION("E18FA0D9", st2g(x1, ptr_pre(sp, 128)));
+ TEST_INSTRUCTION("E187A0D9", st2g(x1, ptr_post(sp, 128)));
+ TEST_INSTRUCTION("5F08A0D9", st2g(sp, ptr(x2)));
+ TEST_INSTRUCTION("5F88A0D9", st2g(sp, ptr(x2, 128)));
+ TEST_INSTRUCTION("5F8CA0D9", st2g(sp, ptr_pre(x2, 128)));
+ TEST_INSTRUCTION("5F84A0D9", st2g(sp, ptr_post(x2, 128)));
+ TEST_INSTRUCTION("FF0BA0D9", st2g(sp, ptr(sp)));
+ TEST_INSTRUCTION("FF8BA0D9", st2g(sp, ptr(sp, 128)));
+ TEST_INSTRUCTION("FF8FA0D9", st2g(sp, ptr_pre(sp, 128)));
+ TEST_INSTRUCTION("FF87A0D9", st2g(sp, ptr_post(sp, 128)));
+ TEST_INSTRUCTION("410820D9", stg(x1, ptr(x2)));
+ TEST_INSTRUCTION("418820D9", stg(x1, ptr(x2, 128)));
+ TEST_INSTRUCTION("418C20D9", stg(x1, ptr_pre(x2, 128)));
+ TEST_INSTRUCTION("418420D9", stg(x1, ptr_post(x2, 128)));
+ TEST_INSTRUCTION("E10B20D9", stg(x1, ptr(sp)));
+ TEST_INSTRUCTION("E18B20D9", stg(x1, ptr(sp, 128)));
+ TEST_INSTRUCTION("E18F20D9", stg(x1, ptr_pre(sp, 128)));
+ TEST_INSTRUCTION("E18720D9", stg(x1, ptr_post(sp, 128)));
+ TEST_INSTRUCTION("5F0820D9", stg(sp, ptr(x2)));
+ TEST_INSTRUCTION("5F8820D9", stg(sp, ptr(x2, 128)));
+ TEST_INSTRUCTION("5F8C20D9", stg(sp, ptr_pre(x2, 128)));
+ TEST_INSTRUCTION("5F8420D9", stg(sp, ptr_post(x2, 128)));
+ TEST_INSTRUCTION("FF0B20D9", stg(sp, ptr(sp)));
+ TEST_INSTRUCTION("FF8B20D9", stg(sp, ptr(sp, 128)));
+ TEST_INSTRUCTION("FF8F20D9", stg(sp, ptr_pre(sp, 128)));
+ TEST_INSTRUCTION("FF8720D9", stg(sp, ptr_post(sp, 128)));
+ TEST_INSTRUCTION("4100A0D9", stgm(x1, ptr(x2)));
+ TEST_INSTRUCTION("E103A0D9", stgm(x1, ptr(sp)));
+ TEST_INSTRUCTION("FF03A0D9", stgm(xzr, ptr(sp)));
+ TEST_INSTRUCTION("61080069", stgp(x1, x2, ptr(x3)));
+ TEST_INSTRUCTION("61082069", stgp(x1, x2, ptr(x3, -1024)));
+ TEST_INSTRUCTION("6108A069", stgp(x1, x2, ptr_pre(x3, -1024)));
+ TEST_INSTRUCTION("6108A068", stgp(x1, x2, ptr_post(x3, -1024)));
+ TEST_INSTRUCTION("61881F69", stgp(x1, x2, ptr(x3, 1008)));
+ TEST_INSTRUCTION("61889F69", stgp(x1, x2, ptr_pre(x3, 1008)));
+ TEST_INSTRUCTION("61889F68", stgp(x1, x2, ptr_post(x3, 1008)));
+ TEST_INSTRUCTION("E10B0069", stgp(x1, x2, ptr(sp)));
+ TEST_INSTRUCTION("E10B2069", stgp(x1, x2, ptr(sp, -1024)));
+ TEST_INSTRUCTION("E10BA069", stgp(x1, x2, ptr_pre(sp, -1024)));
+ TEST_INSTRUCTION("E10BA068", stgp(x1, x2, ptr_post(sp, -1024)));
+ TEST_INSTRUCTION("E18B1F69", stgp(x1, x2, ptr(sp, 1008)));
+ TEST_INSTRUCTION("E18B9F69", stgp(x1, x2, ptr_pre(sp, 1008)));
+ TEST_INSTRUCTION("E18B9F68", stgp(x1, x2, ptr_post(sp, 1008)));
+ TEST_INSTRUCTION("41080029", stp(w1, w2, ptr(x2)));
+ TEST_INSTRUCTION("41082029", stp(w1, w2, ptr(x2, -256)));
+ TEST_INSTRUCTION("41881F29", stp(w1, w2, ptr(x2, 252)));
+ TEST_INSTRUCTION("410800A9", stp(x1, x2, ptr(x2)));
+ TEST_INSTRUCTION("410820A9", stp(x1, x2, ptr(x2, -512)));
+ TEST_INSTRUCTION("41881FA9", stp(x1, x2, ptr(x2, 504)));
+ TEST_INSTRUCTION("FB0F1FF8", str(x27, ptr_pre(sp, -16)));
+ TEST_INSTRUCTION("411000B8", str(w1, ptr(x2, 1))); // STUR
+ TEST_INSTRUCTION("41D01FB8", str(w1, ptr(x2, -3))); // STUR
+ TEST_INSTRUCTION("41701FB8", str(w1, ptr(x2, -9))); // STUR
+ TEST_INSTRUCTION("411000F8", str(x1, ptr(x2, 1))); // STUR
+ TEST_INSTRUCTION("413000F8", str(x1, ptr(x2, 3))); // STUR
+ TEST_INSTRUCTION("41701FF8", str(x1, ptr(x2, -9))); // STUR
+ TEST_INSTRUCTION("41040039", strb(w1, ptr(x2, 1)));
+ TEST_INSTRUCTION("41D01F38", strb(w1, ptr(x2, -3))); // STURB
+ TEST_INSTRUCTION("41701F38", strb(w1, ptr(x2, -9))); // STURB
+ TEST_INSTRUCTION("41100078", strh(w1, ptr(x2, 1))); // STURH
+ TEST_INSTRUCTION("41D01F78", strh(w1, ptr(x2, -3))); // STURH
+ TEST_INSTRUCTION("41701F78", strh(w1, ptr(x2, -9))); // STURH
+ TEST_INSTRUCTION("410800B8", sttr(w1, ptr(x2)));
+ TEST_INSTRUCTION("411808B8", sttr(w1, ptr(x2, 129)));
+ TEST_INSTRUCTION("E10B00B8", sttr(w1, ptr(sp)));
+ TEST_INSTRUCTION("E11B08B8", sttr(w1, ptr(sp, 129)));
+ TEST_INSTRUCTION("410800F8", sttr(x1, ptr(x2)));
+ TEST_INSTRUCTION("411808F8", sttr(x1, ptr(x2, 129)));
+ TEST_INSTRUCTION("E10B00F8", sttr(x1, ptr(sp)));
+ TEST_INSTRUCTION("E11B08F8", sttr(x1, ptr(sp, 129)));
+ TEST_INSTRUCTION("41080038", sttrb(w1, ptr(x2)));
+ TEST_INSTRUCTION("41180838", sttrb(w1, ptr(x2, 129)));
+ TEST_INSTRUCTION("E10B0038", sttrb(w1, ptr(sp)));
+ TEST_INSTRUCTION("E11B0838", sttrb(w1, ptr(sp, 129)));
+ TEST_INSTRUCTION("41080078", sttrh(w1, ptr(x2)));
+ TEST_INSTRUCTION("41180878", sttrh(w1, ptr(x2, 129)));
+ TEST_INSTRUCTION("E10B0078", sttrh(w1, ptr(sp)));
+ TEST_INSTRUCTION("E11B0878", sttrh(w1, ptr(sp, 129)));
+ TEST_INSTRUCTION("410000B8", stur(w1, ptr(x2)));
+ TEST_INSTRUCTION("411008B8", stur(w1, ptr(x2, 129)));
+ TEST_INSTRUCTION("E10300B8", stur(w1, ptr(sp)));
+ TEST_INSTRUCTION("E11308B8", stur(w1, ptr(sp, 129)));
+ TEST_INSTRUCTION("410000F8", stur(x1, ptr(x2)));
+ TEST_INSTRUCTION("411008F8", stur(x1, ptr(x2, 129)));
+ TEST_INSTRUCTION("E10300F8", stur(x1, ptr(sp)));
+ TEST_INSTRUCTION("E11308F8", stur(x1, ptr(sp, 129)));
+ TEST_INSTRUCTION("41000038", sturb(w1, ptr(x2)));
+ TEST_INSTRUCTION("41100838", sturb(w1, ptr(x2, 129)));
+ TEST_INSTRUCTION("E1030038", sturb(w1, ptr(sp)));
+ TEST_INSTRUCTION("E1130838", sturb(w1, ptr(sp, 129)));
+ TEST_INSTRUCTION("41000078", sturh(w1, ptr(x2)));
+ TEST_INSTRUCTION("41100878", sturh(w1, ptr(x2, 129)));
+ TEST_INSTRUCTION("E1030078", sturh(w1, ptr(sp)));
+ TEST_INSTRUCTION("E1130878", sturh(w1, ptr(sp, 129)));
+ TEST_INSTRUCTION("820C2188", stxp(w1, w2, w3, ptr(x4)));
+ TEST_INSTRUCTION("E20F2188", stxp(w1, w2, w3, ptr(sp)));
+ TEST_INSTRUCTION("820C21C8", stxp(w1, x2, x3, ptr(x4)));
+ TEST_INSTRUCTION("E20F21C8", stxp(w1, x2, x3, ptr(sp)));
+ TEST_INSTRUCTION("627C0188", stxr(w1, w2, ptr(x3)));
+ TEST_INSTRUCTION("E27F0188", stxr(w1, w2, ptr(sp)));
+ TEST_INSTRUCTION("627C01C8", stxr(w1, x2, ptr(x3)));
+ TEST_INSTRUCTION("E27F01C8", stxr(w1, x2, ptr(sp)));
+ TEST_INSTRUCTION("627C0108", stxrb(w1, w2, ptr(x3)));
+ TEST_INSTRUCTION("E27F0108", stxrb(w1, w2, ptr(sp)));
+ TEST_INSTRUCTION("627C0148", stxrh(w1, w2, ptr(x3)));
+ TEST_INSTRUCTION("E27F0148", stxrh(w1, w2, ptr(sp)));
+ TEST_INSTRUCTION("4108E0D9", stz2g(x1, ptr(x2)));
+ TEST_INSTRUCTION("4108F0D9", stz2g(x1, ptr(x2, -4096)));
+ TEST_INSTRUCTION("410CF0D9", stz2g(x1, ptr_pre(x2, -4096)));
+ TEST_INSTRUCTION("4104F0D9", stz2g(x1, ptr_post(x2, -4096)));
+ TEST_INSTRUCTION("41F8EFD9", stz2g(x1, ptr(x2, 4080)));
+ TEST_INSTRUCTION("41FCEFD9", stz2g(x1, ptr_pre(x2, 4080)));
+ TEST_INSTRUCTION("41F4EFD9", stz2g(x1, ptr_post(x2, 4080)));
+ TEST_INSTRUCTION("E10BE0D9", stz2g(x1, ptr(sp)));
+ TEST_INSTRUCTION("E10BF0D9", stz2g(x1, ptr(sp, -4096)));
+ TEST_INSTRUCTION("E10FF0D9", stz2g(x1, ptr_pre(sp, -4096)));
+ TEST_INSTRUCTION("E107F0D9", stz2g(x1, ptr_post(sp, -4096)));
+ TEST_INSTRUCTION("E1FBEFD9", stz2g(x1, ptr(sp, 4080)));
+ TEST_INSTRUCTION("E1FFEFD9", stz2g(x1, ptr_pre(sp, 4080)));
+ TEST_INSTRUCTION("E1F7EFD9", stz2g(x1, ptr_post(sp, 4080)));
+ TEST_INSTRUCTION("410860D9", stzg(x1, ptr(x2)));
+ TEST_INSTRUCTION("418860D9", stzg(x1, ptr(x2, 128)));
+ TEST_INSTRUCTION("418C60D9", stzg(x1, ptr_pre(x2, 128)));
+ TEST_INSTRUCTION("418460D9", stzg(x1, ptr_post(x2, 128)));
+ TEST_INSTRUCTION("E10B60D9", stzg(x1, ptr(sp)));
+ TEST_INSTRUCTION("E18B60D9", stzg(x1, ptr(sp, 128)));
+ TEST_INSTRUCTION("E18F60D9", stzg(x1, ptr_pre(sp, 128)));
+ TEST_INSTRUCTION("E18760D9", stzg(x1, ptr_post(sp, 128)));
+ TEST_INSTRUCTION("5F0860D9", stzg(sp, ptr(x2)));
+ TEST_INSTRUCTION("5F8860D9", stzg(sp, ptr(x2, 128)));
+ TEST_INSTRUCTION("5F8C60D9", stzg(sp, ptr_pre(x2, 128)));
+ TEST_INSTRUCTION("5F8460D9", stzg(sp, ptr_post(x2, 128)));
+ TEST_INSTRUCTION("FF0B60D9", stzg(sp, ptr(sp)));
+ TEST_INSTRUCTION("FF8B60D9", stzg(sp, ptr(sp, 128)));
+ TEST_INSTRUCTION("FF8F60D9", stzg(sp, ptr_pre(sp, 128)));
+ TEST_INSTRUCTION("FF8760D9", stzg(sp, ptr_post(sp, 128)));
+ TEST_INSTRUCTION("410020D9", stzgm(x1, ptr(x2)));
+ TEST_INSTRUCTION("E10320D9", stzgm(x1, ptr(sp)));
+ TEST_INSTRUCTION("4100034B", sub(w1, w2, w3));
+ TEST_INSTRUCTION("410003CB", sub(x1, x2, x3));
+ TEST_INSTRUCTION("410C034B", sub(w1, w2, w3, lsl(3)));
+ TEST_INSTRUCTION("410C03CB", sub(x1, x2, x3, lsl(3)));
+ TEST_INSTRUCTION("FF030451", sub(wsp, wsp, 256));
+ TEST_INSTRUCTION("FFFF3F51", sub(wsp, wsp, 0xFFF));
+ TEST_INSTRUCTION("FF0304D1", sub(sp, sp, 256));
+ TEST_INSTRUCTION("FFFF3FD1", sub(sp, sp, 0xFFF));
+ TEST_INSTRUCTION("412C82D1", subg(x1, x2, 32, 11));
+ TEST_INSTRUCTION("5F2C82D1", subg(sp, x2, 32, 11));
+ TEST_INSTRUCTION("E12F82D1", subg(x1, sp, 32, 11));
+ TEST_INSTRUCTION("4100C39A", subp(x1, x2, x3));
+ TEST_INSTRUCTION("E103C39A", subp(x1, sp, x3));
+ TEST_INSTRUCTION("4100DF9A", subp(x1, x2, sp));
+ TEST_INSTRUCTION("4100C3BA", subps(x1, x2, x3));
+ TEST_INSTRUCTION("E103C3BA", subps(x1, sp, x3));
+ TEST_INSTRUCTION("4100DFBA", subps(x1, x2, sp));
+ TEST_INSTRUCTION("4100036B", subs(w1, w2, w3));
+ TEST_INSTRUCTION("410003EB", subs(x1, x2, x3));
+ TEST_INSTRUCTION("410C036B", subs(w1, w2, w3, lsl(3)));
+ TEST_INSTRUCTION("410C03EB", subs(x1, x2, x3, lsl(3)));
+ TEST_INSTRUCTION("210000D4", svc(1));
+ TEST_INSTRUCTION("411C0013", sxtb(w1, w2));
+ TEST_INSTRUCTION("411C4093", sxtb(x1, w2));
+ TEST_INSTRUCTION("413C0013", sxth(w1, w2));
+ TEST_INSTRUCTION("413C4093", sxth(x1, w2));
+ TEST_INSTRUCTION("417C4093", sxtw(x1, w2));
+ TEST_INSTRUCTION("932309D5", sys(1, 2, 3, 4, x19));
+ TEST_INSTRUCTION("AF8708D5", tlbi(Predicate::TLBI::kVALE1, x15));
+ TEST_INSTRUCTION("3F000072", tst(w1, 1));
+ TEST_INSTRUCTION("3F0040F2", tst(x1, 1));
+ TEST_INSTRUCTION("3F00026A", tst(w1, w2));
+ TEST_INSTRUCTION("3F0002EA", tst(x1, x2));
+ TEST_INSTRUCTION("3F10026A", tst(w1, w2, lsl(4)));
+ TEST_INSTRUCTION("3F1002EA", tst(x1, x2, lsl(4)));
+ TEST_INSTRUCTION("00000000", udf(0));
+ TEST_INSTRUCTION("01800000", udf(0x8001));
+ TEST_INSTRUCTION("4108C31A", udiv(w1, w2, w3));
+ TEST_INSTRUCTION("4108C39A", udiv(x1, x2, x3));
+ TEST_INSTRUCTION("41241B53", ubfiz(w1, w2, 5, 10));
+ TEST_INSTRUCTION("41247BD3", ubfiz(x1, x2, 5, 10));
+ TEST_INSTRUCTION("41280553", ubfm(w1, w2, 5, 10));
+ TEST_INSTRUCTION("412845D3", ubfm(x1, x2, 5, 10));
+ TEST_INSTRUCTION("41380553", ubfx(w1, w2, 5, 10));
+ TEST_INSTRUCTION("413845D3", ubfx(x1, x2, 5, 10));
+ TEST_INSTRUCTION("4110A39B", umaddl(x1, w2, w3, x4));
+ TEST_INSTRUCTION("41FCA39B", umnegl(x1, w2, w3));
+ TEST_INSTRUCTION("4190A39B", umsubl(x1, w2, w3, x4));
+ TEST_INSTRUCTION("417CC39B", umulh(x1, x2, x3));
+ TEST_INSTRUCTION("417CA39B", umull(x1, w2, w3));
+ TEST_INSTRUCTION("411C0053", uxtb(w1, w2));
+ TEST_INSTRUCTION("413C0053", uxth(w1, w2));
+ TEST_INSTRUCTION("3F4000D5", xaflag());
+ TEST_INSTRUCTION("E147C1DA", xpacd(x1));
+ TEST_INSTRUCTION("E143C1DA", xpaci(x1));
+ TEST_INSTRUCTION("FF2003D5", xpaclri());
+}
+
+static void ASMJIT_NOINLINE testA64AssemblerRel(AssemblerTester<a64::Assembler>& tester) noexcept {
+ using namespace a64;
+
+ // Must be a reference, because it's recreated after every `TEST_INSTRUCTION()`.
+ const Label& L0 = tester.L0;
+
+ TEST_INSTRUCTION("01000010", adr(x1, L0));
+ TEST_INSTRUCTION("00000014", b(L0));
+ TEST_INSTRUCTION("00000014", b_al(L0));
+ TEST_INSTRUCTION("00000054", b_eq(L0));
+ TEST_INSTRUCTION("01000054", b_ne(L0));
+ TEST_INSTRUCTION("02000054", b_hs(L0));
+ TEST_INSTRUCTION("03000054", b_lo(L0));
+ TEST_INSTRUCTION("04000054", b_mi(L0));
+ TEST_INSTRUCTION("05000054", b_pl(L0));
+ TEST_INSTRUCTION("06000054", b_vs(L0));
+ TEST_INSTRUCTION("07000054", b_vc(L0));
+ TEST_INSTRUCTION("08000054", b_hi(L0));
+ TEST_INSTRUCTION("09000054", b_ls(L0));
+ TEST_INSTRUCTION("0A000054", b_ge(L0));
+ TEST_INSTRUCTION("0B000054", b_lt(L0));
+ TEST_INSTRUCTION("0C000054", b_gt(L0));
+ TEST_INSTRUCTION("0D000054", b_le(L0));
+ TEST_INSTRUCTION("00000014", b(CondCode::kAL, L0));
+ TEST_INSTRUCTION("00000054", b(CondCode::kEQ, L0));
+ TEST_INSTRUCTION("01000054", b(CondCode::kNE, L0));
+ TEST_INSTRUCTION("02000054", b(CondCode::kHS, L0));
+ TEST_INSTRUCTION("03000054", b(CondCode::kLO, L0));
+ TEST_INSTRUCTION("04000054", b(CondCode::kMI, L0));
+ TEST_INSTRUCTION("05000054", b(CondCode::kPL, L0));
+ TEST_INSTRUCTION("06000054", b(CondCode::kVS, L0));
+ TEST_INSTRUCTION("07000054", b(CondCode::kVC, L0));
+ TEST_INSTRUCTION("08000054", b(CondCode::kHI, L0));
+ TEST_INSTRUCTION("09000054", b(CondCode::kLS, L0));
+ TEST_INSTRUCTION("0A000054", b(CondCode::kGE, L0));
+ TEST_INSTRUCTION("0B000054", b(CondCode::kLT, L0));
+ TEST_INSTRUCTION("0C000054", b(CondCode::kGT, L0));
+ TEST_INSTRUCTION("0D000054", b(CondCode::kLE, L0));
+
+ TEST_INSTRUCTION("00000094", bl(L0));
+ TEST_INSTRUCTION("01000034", cbz(w1, L0));
+ TEST_INSTRUCTION("010000B4", cbz(x1, L0));
+ TEST_INSTRUCTION("01000035", cbnz(w1, L0));
+ TEST_INSTRUCTION("010000B5", cbnz(x1, L0));
+ TEST_INSTRUCTION("01001837", tbnz(w1, 3, L0));
+ TEST_INSTRUCTION("010008B7", tbnz(x1, 33, L0));
+ TEST_INSTRUCTION("01001836", tbz(w1, 3, L0));
+ TEST_INSTRUCTION("010008B6", tbz(x1, 33, L0));
+}
+
+static void ASMJIT_NOINLINE testA64AssemblerSIMD(AssemblerTester<a64::Assembler>& tester) noexcept {
+ using namespace a64;
+
+ TEST_INSTRUCTION("41B8200E", abs(v1.b8(), v2.b8()));
+ TEST_INSTRUCTION("41B8600E", abs(v1.h4(), v2.h4()));
+ TEST_INSTRUCTION("41B8A00E", abs(v1.s2(), v2.s2()));
+ TEST_INSTRUCTION("41B8E05E", abs(d1, d2));
+ TEST_INSTRUCTION("41B8204E", abs(v1.b16(), v2.b16()));
+ TEST_INSTRUCTION("41B8604E", abs(v1.h8(), v2.h8()));
+ TEST_INSTRUCTION("41B8A04E", abs(v1.s4(), v2.s4()));
+ TEST_INSTRUCTION("41B8E04E", abs(v1.d2(), v2.d2()));
+ TEST_INSTRUCTION("4184230E", add(v1.b8(), v2.b8(), v3.b8()));
+ TEST_INSTRUCTION("4184630E", add(v1.h4(), v2.h4(), v3.h4()));
+ TEST_INSTRUCTION("4184A30E", add(v1.s2(), v2.s2(), v3.s2()));
+ TEST_INSTRUCTION("4184E35E", add(d1, d2, d3));
+ TEST_INSTRUCTION("4184234E", add(v1.b16(), v2.b16(), v3.b16()));
+ TEST_INSTRUCTION("4184634E", add(v1.h8(), v2.h8(), v3.h8()));
+ TEST_INSTRUCTION("4184A34E", add(v1.s4(), v2.s4(), v3.s4()));
+ TEST_INSTRUCTION("4184E34E", add(v1.d2(), v2.d2(), v3.d2()));
+ TEST_INSTRUCTION("4140230E", addhn(v1.b8(), v2.h8(), v3.h8()));
+ TEST_INSTRUCTION("4140630E", addhn(v1.h4(), v2.s4(), v3.s4()));
+ TEST_INSTRUCTION("4140A30E", addhn(v1.s2(), v2.d2(), v3.d2()));
+ TEST_INSTRUCTION("4140234E", addhn2(v1.b16(), v2.h8(), v3.h8()));
+ TEST_INSTRUCTION("4140634E", addhn2(v1.h8(), v2.s4(), v3.s4()));
+ TEST_INSTRUCTION("4140A34E", addhn2(v1.s4(), v2.d2(), v3.d2()));
+ TEST_INSTRUCTION("41BC230E", addp(v1.b8(), v2.b8(), v3.b8()));
+ TEST_INSTRUCTION("41BC630E", addp(v1.h4(), v2.h4(), v3.h4()));
+ TEST_INSTRUCTION("41BCA30E", addp(v1.s2(), v2.s2(), v3.s2()));
+ TEST_INSTRUCTION("41B8F15E", addp(d1, v2.d2()));
+ TEST_INSTRUCTION("41BC234E", addp(v1.b16(), v2.b16(), v3.b16()));
+ TEST_INSTRUCTION("41BC634E", addp(v1.h8(), v2.h8(), v3.h8()));
+ TEST_INSTRUCTION("41BCA34E", addp(v1.s4(), v2.s4(), v3.s4()));
+ TEST_INSTRUCTION("41BCE34E", addp(v1.d2(), v2.d2(), v3.d2()));
+ TEST_INSTRUCTION("41B8310E", addv(b1, v2.b8()));
+ TEST_INSTRUCTION("41B8314E", addv(b1, v2.b16()));
+ TEST_INSTRUCTION("41B8710E", addv(h1, v2.h4()));
+ TEST_INSTRUCTION("41B8714E", addv(h1, v2.h8()));
+ TEST_INSTRUCTION("41B8B14E", addv(s1, v2.s4()));
+ TEST_INSTRUCTION("4158284E", aesd(v1.b16(), v2.b16()));
+ TEST_INSTRUCTION("4148284E", aese(v1.b16(), v2.b16()));
+ TEST_INSTRUCTION("4178284E", aesimc(v1.b16(), v2.b16()));
+ TEST_INSTRUCTION("4168284E", aesmc(v1.b16(), v2.b16()));
+ TEST_INSTRUCTION("411C230E", and_(v1.b8(), v2.b8(), v3.b8()));
+ TEST_INSTRUCTION("411C234E", and_(v1.b16(), v2.b16(), v3.b16()));
+ TEST_INSTRUCTION("411023CE", bcax(v1.b16(), v2.b16(), v3.b16(), v4.b16()));
+ TEST_INSTRUCTION("4140631E", bfcvt(h1, s2));
+ TEST_INSTRUCTION("4168A10E", bfcvtn(v1.h4(), v2.s4()));
+ TEST_INSTRUCTION("4168A14E", bfcvtn2(v1.h8(), v2.s4()));
+ TEST_INSTRUCTION("41FC432E", bfdot(v1.s2(), v2.h4(), v3.h4()));
+ TEST_INSTRUCTION("41FC436E", bfdot(v1.s4(), v2.h8(), v3.h8()));
+ TEST_INSTRUCTION("41F0430F", bfdot(v1.s2(), v2.h4(), v3.h2(0)));
+ TEST_INSTRUCTION("41F8634F", bfdot(v1.s4(), v2.h8(), v3.h2(3)));
+ TEST_INSTRUCTION("41FCC32E", bfmlalb(v1.s4(), v2.h8(), v3.h8()));
+ TEST_INSTRUCTION("41F0C30F", bfmlalb(v1.s4(), v2.h8(), v3.h(0)));
+ TEST_INSTRUCTION("41F8F30F", bfmlalb(v1.s4(), v2.h8(), v3.h(7)));
+ TEST_INSTRUCTION("41FCC36E", bfmlalt(v1.s4(), v2.h8(), v3.h8()));
+ TEST_INSTRUCTION("41F0C34F", bfmlalt(v1.s4(), v2.h8(), v3.h(0)));
+ TEST_INSTRUCTION("41F8F34F", bfmlalt(v1.s4(), v2.h8(), v3.h(7)));
+ TEST_INSTRUCTION("41EC436E", bfmmla(v1.s4(), v2.h8(), v3.h8()));
+ TEST_INSTRUCTION("411C630E", bic(v1.b8(), v2.b8(), v3.b8()));
+ TEST_INSTRUCTION("411C634E", bic(v1.b16(), v2.b16(), v3.b16()));
+ TEST_INSTRUCTION("E197072F", bic(v1.h4(), 255));
+ TEST_INSTRUCTION("E1B7072F", bic(v1.h4(), 255, lsl(8)));
+ TEST_INSTRUCTION("E197076F", bic(v1.h8(), 255));
+ TEST_INSTRUCTION("E1B7076F", bic(v1.h8(), 255, lsl(8)));
+ TEST_INSTRUCTION("E117072F", bic(v1.s2(), 255));
+ TEST_INSTRUCTION("E137072F", bic(v1.s2(), 255, lsl(8)));
+ TEST_INSTRUCTION("E117076F", bic(v1.s4(), 255));
+ TEST_INSTRUCTION("E177076F", bic(v1.s4(), 255, lsl(24)));
+ TEST_INSTRUCTION("411CE32E", bif(v1.b8(), v2.b8(), v3.b8()));
+ TEST_INSTRUCTION("411CE36E", bif(v1.b16(), v2.b16(), v3.b16()));
+ TEST_INSTRUCTION("411CA32E", bit(v1.b8(), v2.b8(), v3.b8()));
+ TEST_INSTRUCTION("411CA36E", bit(v1.b16(), v2.b16(), v3.b16()));
+ TEST_INSTRUCTION("411C632E", bsl(v1.b8(), v2.b8(), v3.b8()));
+ TEST_INSTRUCTION("411C636E", bsl(v1.b16(), v2.b16(), v3.b16()));
+ TEST_INSTRUCTION("4148200E", cls(v1.b8(), v2.b8()));
+ TEST_INSTRUCTION("4148600E", cls(v1.h4(), v2.h4()));
+ TEST_INSTRUCTION("4148A00E", cls(v1.s2(), v2.s2()));
+ TEST_INSTRUCTION("4148204E", cls(v1.b16(), v2.b16()));
+ TEST_INSTRUCTION("4148604E", cls(v1.h8(), v2.h8()));
+ TEST_INSTRUCTION("4148A04E", cls(v1.s4(), v2.s4()));
+ TEST_INSTRUCTION("4148202E", clz(v1.b8(), v2.b8()));
+ TEST_INSTRUCTION("4148602E", clz(v1.h4(), v2.h4()));
+ TEST_INSTRUCTION("4148A02E", clz(v1.s2(), v2.s2()));
+ TEST_INSTRUCTION("4148206E", clz(v1.b16(), v2.b16()));
+ TEST_INSTRUCTION("4148606E", clz(v1.h8(), v2.h8()));
+ TEST_INSTRUCTION("4148A06E", clz(v1.s4(), v2.s4()));
+ TEST_INSTRUCTION("418C232E", cmeq(v1.b8(), v2.b8(), v3.b8()));
+ TEST_INSTRUCTION("418C632E", cmeq(v1.h4(), v2.h4(), v3.h4()));
+ TEST_INSTRUCTION("418CA32E", cmeq(v1.s2(), v2.s2(), v3.s2()));
+ TEST_INSTRUCTION("418CE37E", cmeq(d1, d2, d3));
+ TEST_INSTRUCTION("418C236E", cmeq(v1.b16(), v2.b16(), v3.b16()));
+ TEST_INSTRUCTION("418C636E", cmeq(v1.h8(), v2.h8(), v3.h8()));
+ TEST_INSTRUCTION("418CA36E", cmeq(v1.s4(), v2.s4(), v3.s4()));
+ TEST_INSTRUCTION("418CE36E", cmeq(v1.d2(), v2.d2(), v3.d2()));
+ TEST_INSTRUCTION("4198200E", cmeq(v1.b8(), v2.b8(), 0));
+ TEST_INSTRUCTION("4198600E", cmeq(v1.h4(), v2.h4(), 0));
+ TEST_INSTRUCTION("4198A00E", cmeq(v1.s2(), v2.s2(), 0));
+ TEST_INSTRUCTION("4198E05E", cmeq(d1, d2, 0));
+ TEST_INSTRUCTION("4198204E", cmeq(v1.b16(), v2.b16(), 0));
+ TEST_INSTRUCTION("4198604E", cmeq(v1.h8(), v2.h8(), 0));
+ TEST_INSTRUCTION("4198A04E", cmeq(v1.s4(), v2.s4(), 0));
+ TEST_INSTRUCTION("4198E04E", cmeq(v1.d2(), v2.d2(), 0));
+ TEST_INSTRUCTION("413C230E", cmge(v1.b8(), v2.b8(), v3.b8()));
+ TEST_INSTRUCTION("413C630E", cmge(v1.h4(), v2.h4(), v3.h4()));
+ TEST_INSTRUCTION("413CA30E", cmge(v1.s2(), v2.s2(), v3.s2()));
+ TEST_INSTRUCTION("413CE35E", cmge(d1, d2, d3));
+ TEST_INSTRUCTION("413C234E", cmge(v1.b16(), v2.b16(), v3.b16()));
+ TEST_INSTRUCTION("413C634E", cmge(v1.h8(), v2.h8(), v3.h8()));
+ TEST_INSTRUCTION("413CA34E", cmge(v1.s4(), v2.s4(), v3.s4()));
+ TEST_INSTRUCTION("413CE34E", cmge(v1.d2(), v2.d2(), v3.d2()));
+ TEST_INSTRUCTION("4188202E", cmge(v1.b8(), v2.b8(), 0));
+ TEST_INSTRUCTION("4188602E", cmge(v1.h4(), v2.h4(), 0));
+ TEST_INSTRUCTION("4188A02E", cmge(v1.s2(), v2.s2(), 0));
+ TEST_INSTRUCTION("4188E07E", cmge(d1, d2, 0));
+ TEST_INSTRUCTION("4188206E", cmge(v1.b16(), v2.b16(), 0));
+ TEST_INSTRUCTION("4188606E", cmge(v1.h8(), v2.h8(), 0));
+ TEST_INSTRUCTION("4188A06E", cmge(v1.s4(), v2.s4(), 0));
+ TEST_INSTRUCTION("4188E06E", cmge(v1.d2(), v2.d2(), 0));
+ TEST_INSTRUCTION("4134230E", cmgt(v1.b8(), v2.b8(), v3.b8()));
+ TEST_INSTRUCTION("4134630E", cmgt(v1.h4(), v2.h4(), v3.h4()));
+ TEST_INSTRUCTION("4134A30E", cmgt(v1.s2(), v2.s2(), v3.s2()));
+ TEST_INSTRUCTION("4134E35E", cmgt(d1, d2, d3));
+ TEST_INSTRUCTION("4134234E", cmgt(v1.b16(), v2.b16(), v3.b16()));
+ TEST_INSTRUCTION("4134634E", cmgt(v1.h8(), v2.h8(), v3.h8()));
+ TEST_INSTRUCTION("4134A34E", cmgt(v1.s4(), v2.s4(), v3.s4()));
+ TEST_INSTRUCTION("4134E34E", cmgt(v1.d2(), v2.d2(), v3.d2()));
+ TEST_INSTRUCTION("4188200E", cmgt(v1.b8(), v2.b8(), 0));
+ TEST_INSTRUCTION("4188600E", cmgt(v1.h4(), v2.h4(), 0));
+ TEST_INSTRUCTION("4188A00E", cmgt(v1.s2(), v2.s2(), 0));
+ TEST_INSTRUCTION("4188E05E", cmgt(d1, d2, 0));
+ TEST_INSTRUCTION("4188204E", cmgt(v1.b16(), v2.b16(), 0));
+ TEST_INSTRUCTION("4188604E", cmgt(v1.h8(), v2.h8(), 0));
+ TEST_INSTRUCTION("4188A04E", cmgt(v1.s4(), v2.s4(), 0));
+ TEST_INSTRUCTION("4188E04E", cmgt(v1.d2(), v2.d2(), 0));
+ TEST_INSTRUCTION("4134232E", cmhi(v1.b8(), v2.b8(), v3.b8()));
+ TEST_INSTRUCTION("4134632E", cmhi(v1.h4(), v2.h4(), v3.h4()));
+ TEST_INSTRUCTION("4134A32E", cmhi(v1.s2(), v2.s2(), v3.s2()));
+ TEST_INSTRUCTION("4134E37E", cmhi(d1, d2, d3));
+ TEST_INSTRUCTION("4134236E", cmhi(v1.b16(), v2.b16(), v3.b16()));
+ TEST_INSTRUCTION("4134636E", cmhi(v1.h8(), v2.h8(), v3.h8()));
+ TEST_INSTRUCTION("4134A36E", cmhi(v1.s4(), v2.s4(), v3.s4()));
+ TEST_INSTRUCTION("4134E36E", cmhi(v1.d2(), v2.d2(), v3.d2()));
+ TEST_INSTRUCTION("413C232E", cmhs(v1.b8(), v2.b8(), v3.b8()));
+ TEST_INSTRUCTION("413C632E", cmhs(v1.h4(), v2.h4(), v3.h4()));
+ TEST_INSTRUCTION("413CA32E", cmhs(v1.s2(), v2.s2(), v3.s2()));
+ TEST_INSTRUCTION("413CE37E", cmhs(d1, d2, d3));
+ TEST_INSTRUCTION("413C236E", cmhs(v1.b16(), v2.b16(), v3.b16()));
+ TEST_INSTRUCTION("413C636E", cmhs(v1.h8(), v2.h8(), v3.h8()));
+ TEST_INSTRUCTION("413CA36E", cmhs(v1.s4(), v2.s4(), v3.s4()));
+ TEST_INSTRUCTION("413CE36E", cmhs(v1.d2(), v2.d2(), v3.d2()));
+ TEST_INSTRUCTION("4198202E", cmle(v1.b8(), v2.b8(), 0));
+ TEST_INSTRUCTION("4198602E", cmle(v1.h4(), v2.h4(), 0));
+ TEST_INSTRUCTION("4198A02E", cmle(v1.s2(), v2.s2(), 0));
+ TEST_INSTRUCTION("4198E07E", cmle(d1, d2, 0));
+ TEST_INSTRUCTION("4198206E", cmle(v1.b16(), v2.b16(), 0));
+ TEST_INSTRUCTION("4198606E", cmle(v1.h8(), v2.h8(), 0));
+ TEST_INSTRUCTION("4198A06E", cmle(v1.s4(), v2.s4(), 0));
+ TEST_INSTRUCTION("4198E06E", cmle(v1.d2(), v2.d2(), 0));
+ TEST_INSTRUCTION("41A8200E", cmlt(v1.b8(), v2.b8(), 0));
+ TEST_INSTRUCTION("41A8600E", cmlt(v1.h4(), v2.h4(), 0));
+ TEST_INSTRUCTION("41A8A00E", cmlt(v1.s2(), v2.s2(), 0));
+ TEST_INSTRUCTION("41A8E05E", cmlt(d1, d2, 0));
+ TEST_INSTRUCTION("41A8204E", cmlt(v1.b16(), v2.b16(), 0));
+ TEST_INSTRUCTION("41A8604E", cmlt(v1.h8(), v2.h8(), 0));
+ TEST_INSTRUCTION("41A8A04E", cmlt(v1.s4(), v2.s4(), 0));
+ TEST_INSTRUCTION("41A8E04E", cmlt(v1.d2(), v2.d2(), 0));
+ TEST_INSTRUCTION("418C230E", cmtst(v1.b8(), v2.b8(), v3.b8()));
+ TEST_INSTRUCTION("418C630E", cmtst(v1.h4(), v2.h4(), v3.h4()));
+ TEST_INSTRUCTION("418CA30E", cmtst(v1.s2(), v2.s2(), v3.s2()));
+ TEST_INSTRUCTION("418CE35E", cmtst(d1, d2, d3));
+ TEST_INSTRUCTION("418C234E", cmtst(v1.b16(), v2.b16(), v3.b16()));
+ TEST_INSTRUCTION("418C634E", cmtst(v1.h8(), v2.h8(), v3.h8()));
+ TEST_INSTRUCTION("418CA34E", cmtst(v1.s4(), v2.s4(), v3.s4()));
+ TEST_INSTRUCTION("418CE34E", cmtst(v1.d2(), v2.d2(), v3.d2()));
+ TEST_INSTRUCTION("4158200E", cnt(v1.b8(), v2.b8()));
+ TEST_INSTRUCTION("4158204E", cnt(v1.b16(), v2.b16()));
+ TEST_INSTRUCTION("410C010E", dup(v1.b8(), w2));
+ TEST_INSTRUCTION("410C020E", dup(v1.h4(), w2));
+ TEST_INSTRUCTION("410C040E", dup(v1.s2(), w2));
+ TEST_INSTRUCTION("410C014E", dup(v1.b16(), w2));
+ TEST_INSTRUCTION("410C024E", dup(v1.h8(), w2));
+ TEST_INSTRUCTION("410C044E", dup(v1.s4(), w2));
+ TEST_INSTRUCTION("410C084E", dup(v1.d2(), x2));
+ TEST_INSTRUCTION("4F04035E", dup(b15, v2.b(1)));
+ TEST_INSTRUCTION("4F04065E", dup(h15, v2.h(1)));
+ TEST_INSTRUCTION("4F040C5E", dup(s15, v2.s(1)));
+ TEST_INSTRUCTION("4F04185E", dup(d15, v2.d(1)));
+ TEST_INSTRUCTION("4F04030E", dup(v15.b8(), v2.b(1)));
+ TEST_INSTRUCTION("4F04060E", dup(v15.h4(), v2.h(1)));
+ TEST_INSTRUCTION("4F040C0E", dup(v15.s2(), v2.s(1)));
+ TEST_INSTRUCTION("4F04034E", dup(v15.b16(), v2.b(1)));
+ TEST_INSTRUCTION("4F04064E", dup(v15.h8(), v2.h(1)));
+ TEST_INSTRUCTION("4F040C4E", dup(v15.s4(), v2.s(1)));
+ TEST_INSTRUCTION("4F04184E", dup(v15.d2(), v2.d(1)));
+ TEST_INSTRUCTION("411C232E", eor(v1.b8(), v2.b8(), v3.b8()));
+ TEST_INSTRUCTION("411C236E", eor(v1.b16(), v2.b16(), v3.b16()));
+ TEST_INSTRUCTION("411003CE", eor3(v1.b16(), v2.b16(), v3.b16(), v4.b16()));
+ TEST_INSTRUCTION("4128032E", ext(v1.b8(), v2.b8(), v3.b8(), 5));
+ TEST_INSTRUCTION("4128036E", ext(v1.b16(), v2.b16(), v3.b16(), 5));
+ TEST_INSTRUCTION("4114C37E", fabd(h1, h2, h3));
+ TEST_INSTRUCTION("41D4A37E", fabd(s1, s2, s3));
+ TEST_INSTRUCTION("41D4E37E", fabd(d1, d2, d3));
+ TEST_INSTRUCTION("4114C32E", fabd(v1.h4(), v2.h4(), v3.h4()));
+ TEST_INSTRUCTION("41D4A32E", fabd(v1.s2(), v2.s2(), v3.s2()));
+ TEST_INSTRUCTION("4114C36E", fabd(v1.h8(), v2.h8(), v3.h8()));
+ TEST_INSTRUCTION("41D4A36E", fabd(v1.s4(), v2.s4(), v3.s4()));
+ TEST_INSTRUCTION("41D4E36E", fabd(v1.d2(), v2.d2(), v3.d2()));
+ TEST_INSTRUCTION("41C0E01E", fabs(h1, h2));
+ TEST_INSTRUCTION("41C0201E", fabs(s1, s2));
+ TEST_INSTRUCTION("41C0601E", fabs(d1, d2));
+ TEST_INSTRUCTION("41F8F80E", fabs(v1.h4(), v2.h4()));
+ TEST_INSTRUCTION("41F8A00E", fabs(v1.s2(), v2.s2()));
+ TEST_INSTRUCTION("41F8F84E", fabs(v1.h8(), v2.h8()));
+ TEST_INSTRUCTION("41F8A04E", fabs(v1.s4(), v2.s4()));
+ TEST_INSTRUCTION("41F8E04E", fabs(v1.d2(), v2.d2()));
+ TEST_INSTRUCTION("412C437E", facge(h1, h2, h3));
+ TEST_INSTRUCTION("41EC237E", facge(s1, s2, s3));
+ TEST_INSTRUCTION("41EC637E", facge(d1, d2, d3));
+ TEST_INSTRUCTION("412C432E", facge(v1.h4(), v2.h4(), v3.h4()));
+ TEST_INSTRUCTION("41EC232E", facge(v1.s2(), v2.s2(), v3.s2()));
+ TEST_INSTRUCTION("412C436E", facge(v1.h8(), v2.h8(), v3.h8()));
+ TEST_INSTRUCTION("41EC236E", facge(v1.s4(), v2.s4(), v3.s4()));
+ TEST_INSTRUCTION("41EC636E", facge(v1.d2(), v2.d2(), v3.d2()));
+ TEST_INSTRUCTION("412CC37E", facgt(h1, h2, h3));
+ TEST_INSTRUCTION("41ECA37E", facgt(s1, s2, s3));
+ TEST_INSTRUCTION("41ECE37E", facgt(d1, d2, d3));
+ TEST_INSTRUCTION("412CC32E", facgt(v1.h4(), v2.h4(), v3.h4()));
+ TEST_INSTRUCTION("41ECA32E", facgt(v1.s2(), v2.s2(), v3.s2()));
+ TEST_INSTRUCTION("412CC36E", facgt(v1.h8(), v2.h8(), v3.h8()));
+ TEST_INSTRUCTION("41ECA36E", facgt(v1.s4(), v2.s4(), v3.s4()));
+ TEST_INSTRUCTION("41ECE36E", facgt(v1.d2(), v2.d2(), v3.d2()));
+ TEST_INSTRUCTION("4128E31E", fadd(h1, h2, h3));
+ TEST_INSTRUCTION("4128231E", fadd(s1, s2, s3));
+ TEST_INSTRUCTION("4128631E", fadd(d1, d2, d3));
+ TEST_INSTRUCTION("4114430E", fadd(v1.h4(), v2.h4(), v3.h4()));
+ TEST_INSTRUCTION("41D4230E", fadd(v1.s2(), v2.s2(), v3.s2()));
+ TEST_INSTRUCTION("4114434E", fadd(v1.h8(), v2.h8(), v3.h8()));
+ TEST_INSTRUCTION("41D4234E", fadd(v1.s4(), v2.s4(), v3.s4()));
+ TEST_INSTRUCTION("41D4634E", fadd(v1.d2(), v2.d2(), v3.d2()));
+ TEST_INSTRUCTION("41D8305E", faddp(h1, v2.h2()));
+ TEST_INSTRUCTION("41D8307E", faddp(s1, v2.s2()));
+ TEST_INSTRUCTION("41D8707E", faddp(d1, v2.d2()));
+ TEST_INSTRUCTION("4114432E", faddp(v1.h4(), v2.h4(), v3.h4()));
+ TEST_INSTRUCTION("41D4232E", faddp(v1.s2(), v2.s2(), v3.s2()));
+ TEST_INSTRUCTION("4114436E", faddp(v1.h8(), v2.h8(), v3.h8()));
+ TEST_INSTRUCTION("41D4236E", faddp(v1.s4(), v2.s4(), v3.s4()));
+ TEST_INSTRUCTION("41D4636E", faddp(v1.d2(), v2.d2(), v3.d2()));
+ TEST_INSTRUCTION("41E4432E", fcadd(v1.h4(), v2.h4(), v3.h4(), 90));
+ TEST_INSTRUCTION("41E4832E", fcadd(v1.s2(), v2.s2(), v3.s2(), 90));
+ TEST_INSTRUCTION("41E4436E", fcadd(v1.h8(), v2.h8(), v3.h8(), 90));
+ TEST_INSTRUCTION("41E4836E", fcadd(v1.s4(), v2.s4(), v3.s4(), 90));
+ TEST_INSTRUCTION("41E4C36E", fcadd(v1.d2(), v2.d2(), v3.d2(), 90));
+ TEST_INSTRUCTION("41F4432E", fcadd(v1.h4(), v2.h4(), v3.h4(), 270));
+ TEST_INSTRUCTION("41F4832E", fcadd(v1.s2(), v2.s2(), v3.s2(), 270));
+ TEST_INSTRUCTION("41F4436E", fcadd(v1.h8(), v2.h8(), v3.h8(), 270));
+ TEST_INSTRUCTION("41F4836E", fcadd(v1.s4(), v2.s4(), v3.s4(), 270));
+ TEST_INSTRUCTION("41F4C36E", fcadd(v1.d2(), v2.d2(), v3.d2(), 270));
+ TEST_INSTRUCTION("2404E21E", fccmp(h1, h2, 4, CondCode::kEQ));
+ TEST_INSTRUCTION("2404221E", fccmp(s1, s2, 4, CondCode::kEQ));
+ TEST_INSTRUCTION("2404621E", fccmp(d1, d2, 4, CondCode::kEQ));
+ TEST_INSTRUCTION("3404E21E", fccmpe(h1, h2, 4, CondCode::kEQ));
+ TEST_INSTRUCTION("3404221E", fccmpe(s1, s2, 4, CondCode::kEQ));
+ TEST_INSTRUCTION("3404621E", fccmpe(d1, d2, 4, CondCode::kEQ));
+ TEST_INSTRUCTION("4124435E", fcmeq(h1, h2, h3));
+ TEST_INSTRUCTION("41E4235E", fcmeq(s1, s2, s3));
+ TEST_INSTRUCTION("41E4635E", fcmeq(d1, d2, d3));
+ TEST_INSTRUCTION("4124430E", fcmeq(v1.h4(), v2.h4(), v3.h4()));
+ TEST_INSTRUCTION("41E4230E", fcmeq(v1.s2(), v2.s2(), v3.s2()));
+ TEST_INSTRUCTION("4124434E", fcmeq(v1.h8(), v2.h8(), v3.h8()));
+ TEST_INSTRUCTION("41E4234E", fcmeq(v1.s4(), v2.s4(), v3.s4()));
+ TEST_INSTRUCTION("41E4634E", fcmeq(v1.d2(), v2.d2(), v3.d2()));
+ TEST_INSTRUCTION("41D8F85E", fcmeq(h1, h2, 0));
+ TEST_INSTRUCTION("41D8A05E", fcmeq(s1, s2, 0));
+ TEST_INSTRUCTION("41D8E05E", fcmeq(d1, d2, 0));
+ TEST_INSTRUCTION("41D8F80E", fcmeq(v1.h4(), v2.h4(), 0));
+ TEST_INSTRUCTION("41D8A00E", fcmeq(v1.s2(), v2.s2(), 0));
+ TEST_INSTRUCTION("41D8F84E", fcmeq(v1.h8(), v2.h8(), 0));
+ TEST_INSTRUCTION("41D8A04E", fcmeq(v1.s4(), v2.s4(), 0));
+ TEST_INSTRUCTION("41D8E04E", fcmeq(v1.d2(), v2.d2(), 0));
+ TEST_INSTRUCTION("4124437E", fcmge(h1, h2, h3));
+ TEST_INSTRUCTION("41E4237E", fcmge(s1, s2, s3));
+ TEST_INSTRUCTION("41E4637E", fcmge(d1, d2, d3));
+ TEST_INSTRUCTION("4124432E", fcmge(v1.h4(), v2.h4(), v3.h4()));
+ TEST_INSTRUCTION("41E4232E", fcmge(v1.s2(), v2.s2(), v3.s2()));
+ TEST_INSTRUCTION("4124436E", fcmge(v1.h8(), v2.h8(), v3.h8()));
+ TEST_INSTRUCTION("41E4236E", fcmge(v1.s4(), v2.s4(), v3.s4()));
+ TEST_INSTRUCTION("41E4636E", fcmge(v1.d2(), v2.d2(), v3.d2()));
+ TEST_INSTRUCTION("41C8F87E", fcmge(h1, h2, 0));
+ TEST_INSTRUCTION("41C8A07E", fcmge(s1, s2, 0));
+ TEST_INSTRUCTION("41C8E07E", fcmge(d1, d2, 0));
+ TEST_INSTRUCTION("41C8F82E", fcmge(v1.h4(), v2.h4(), 0));
+ TEST_INSTRUCTION("41C8A02E", fcmge(v1.s2(), v2.s2(), 0));
+ TEST_INSTRUCTION("41C8F86E", fcmge(v1.h8(), v2.h8(), 0));
+ TEST_INSTRUCTION("41C8A06E", fcmge(v1.s4(), v2.s4(), 0));
+ TEST_INSTRUCTION("41C8E06E", fcmge(v1.d2(), v2.d2(), 0));
+ TEST_INSTRUCTION("4124C37E", fcmgt(h1, h2, h3));
+ TEST_INSTRUCTION("41E4A37E", fcmgt(s1, s2, s3));
+ TEST_INSTRUCTION("41E4E37E", fcmgt(d1, d2, d3));
+ TEST_INSTRUCTION("4124C32E", fcmgt(v1.h4(), v2.h4(), v3.h4()));
+ TEST_INSTRUCTION("41E4A32E", fcmgt(v1.s2(), v2.s2(), v3.s2()));
+ TEST_INSTRUCTION("4124C36E", fcmgt(v1.h8(), v2.h8(), v3.h8()));
+ TEST_INSTRUCTION("41E4A36E", fcmgt(v1.s4(), v2.s4(), v3.s4()));
+ TEST_INSTRUCTION("41E4E36E", fcmgt(v1.d2(), v2.d2(), v3.d2()));
+ TEST_INSTRUCTION("41C8F85E", fcmgt(h1, h2, 0));
+ TEST_INSTRUCTION("41C8A05E", fcmgt(s1, s2, 0));
+ TEST_INSTRUCTION("41C8E05E", fcmgt(d1, d2, 0));
+ TEST_INSTRUCTION("41C8F80E", fcmgt(v1.h4(), v2.h4(), 0));
+ TEST_INSTRUCTION("41C8A00E", fcmgt(v1.s2(), v2.s2(), 0));
+ TEST_INSTRUCTION("41C8F84E", fcmgt(v1.h8(), v2.h8(), 0));
+ TEST_INSTRUCTION("41C8A04E", fcmgt(v1.s4(), v2.s4(), 0));
+ TEST_INSTRUCTION("41C8E04E", fcmgt(v1.d2(), v2.d2(), 0));
+ TEST_INSTRUCTION("41CC432E", fcmla(v1.h4(), v2.h4(), v3.h4(), 90));
+ TEST_INSTRUCTION("41CC832E", fcmla(v1.s2(), v2.s2(), v3.s2(), 90));
+ TEST_INSTRUCTION("41CC436E", fcmla(v1.h8(), v2.h8(), v3.h8(), 90));
+ TEST_INSTRUCTION("41CC836E", fcmla(v1.s4(), v2.s4(), v3.s4(), 90));
+ TEST_INSTRUCTION("41CCC36E", fcmla(v1.d2(), v2.d2(), v3.d2(), 90));
+ TEST_INSTRUCTION("41DC432E", fcmla(v1.h4(), v2.h4(), v3.h4(), 270));
+ TEST_INSTRUCTION("41DC832E", fcmla(v1.s2(), v2.s2(), v3.s2(), 270));
+ TEST_INSTRUCTION("41DC436E", fcmla(v1.h8(), v2.h8(), v3.h8(), 270));
+ TEST_INSTRUCTION("41DC836E", fcmla(v1.s4(), v2.s4(), v3.s4(), 270));
+ TEST_INSTRUCTION("41DCC36E", fcmla(v1.d2(), v2.d2(), v3.d2(), 270));
+ TEST_INSTRUCTION("4130432F", fcmla(v1.h4(), v2.h4(), v3.h(0), 90));
+ TEST_INSTRUCTION("4130632F", fcmla(v1.h4(), v2.h4(), v3.h(1), 90));
+ TEST_INSTRUCTION("4130436F", fcmla(v1.h8(), v2.h8(), v3.h(0), 90));
+ TEST_INSTRUCTION("4138636F", fcmla(v1.h8(), v2.h8(), v3.h(3), 90));
+ TEST_INSTRUCTION("4130836F", fcmla(v1.s4(), v2.s4(), v3.s(0), 90));
+ TEST_INSTRUCTION("4138836F", fcmla(v1.s4(), v2.s4(), v3.s(1), 90));
+ TEST_INSTRUCTION("4170432F", fcmla(v1.h4(), v2.h4(), v3.h(0), 270));
+ TEST_INSTRUCTION("4170632F", fcmla(v1.h4(), v2.h4(), v3.h(1), 270));
+ TEST_INSTRUCTION("4170436F", fcmla(v1.h8(), v2.h8(), v3.h(0), 270));
+ TEST_INSTRUCTION("4178636F", fcmla(v1.h8(), v2.h8(), v3.h(3), 270));
+ TEST_INSTRUCTION("4170836F", fcmla(v1.s4(), v2.s4(), v3.s(0), 270));
+ TEST_INSTRUCTION("4178836F", fcmla(v1.s4(), v2.s4(), v3.s(1), 270));
+ TEST_INSTRUCTION("41D8F87E", fcmle(h1, h2, 0));
+ TEST_INSTRUCTION("41D8A07E", fcmle(s1, s2, 0));
+ TEST_INSTRUCTION("41D8E07E", fcmle(d1, d2, 0));
+ TEST_INSTRUCTION("41D8F82E", fcmle(v1.h4(), v2.h4(), 0));
+ TEST_INSTRUCTION("41D8A02E", fcmle(v1.s2(), v2.s2(), 0));
+ TEST_INSTRUCTION("41D8F86E", fcmle(v1.h8(), v2.h8(), 0));
+ TEST_INSTRUCTION("41D8A06E", fcmle(v1.s4(), v2.s4(), 0));
+ TEST_INSTRUCTION("41D8E06E", fcmle(v1.d2(), v2.d2(), 0));
+ TEST_INSTRUCTION("41E8F85E", fcmlt(h1, h2, 0));
+ TEST_INSTRUCTION("41E8A05E", fcmlt(s1, s2, 0));
+ TEST_INSTRUCTION("41E8E05E", fcmlt(d1, d2, 0));
+ TEST_INSTRUCTION("41E8F80E", fcmlt(v1.h4(), v2.h4(), 0));
+ TEST_INSTRUCTION("41E8A00E", fcmlt(v1.s2(), v2.s2(), 0));
+ TEST_INSTRUCTION("41E8F84E", fcmlt(v1.h8(), v2.h8(), 0));
+ TEST_INSTRUCTION("41E8A04E", fcmlt(v1.s4(), v2.s4(), 0));
+ TEST_INSTRUCTION("41E8E04E", fcmlt(v1.d2(), v2.d2(), 0));
+ TEST_INSTRUCTION("2020E21E", fcmp(h1, h2));
+ TEST_INSTRUCTION("2020221E", fcmp(s1, s2));
+ TEST_INSTRUCTION("2020621E", fcmp(d1, d2));
+ TEST_INSTRUCTION("2820E01E", fcmp(h1, 0));
+ TEST_INSTRUCTION("2820201E", fcmp(s1, 0));
+ TEST_INSTRUCTION("2820601E", fcmp(d1, 0));
+ TEST_INSTRUCTION("3020E21E", fcmpe(h1, h2));
+ TEST_INSTRUCTION("3020221E", fcmpe(s1, s2));
+ TEST_INSTRUCTION("3020621E", fcmpe(d1, d2));
+ TEST_INSTRUCTION("3820E01E", fcmpe(h1, 0));
+ TEST_INSTRUCTION("3820201E", fcmpe(s1, 0));
+ TEST_INSTRUCTION("3820601E", fcmpe(d1, 0));
+ TEST_INSTRUCTION("410CE31E", fcsel(h1, h2, h3, CondCode::kEQ));
+ TEST_INSTRUCTION("410C231E", fcsel(s1, s2, s3, CondCode::kEQ));
+ TEST_INSTRUCTION("410C631E", fcsel(d1, d2, d3, CondCode::kEQ));
+ TEST_INSTRUCTION("41C0231E", fcvt(h1, s2));
+ TEST_INSTRUCTION("41C0631E", fcvt(h1, d2));
+ TEST_INSTRUCTION("4140E21E", fcvt(s1, h2));
+ TEST_INSTRUCTION("4140621E", fcvt(s1, d2));
+ TEST_INSTRUCTION("41C0E21E", fcvt(d1, h2));
+ TEST_INSTRUCTION("41C0221E", fcvt(d1, s2));
+ TEST_INSTRUCTION("4100E41E", fcvtas(w1, h2));
+ TEST_INSTRUCTION("4100241E", fcvtas(w1, s2));
+ TEST_INSTRUCTION("4100641E", fcvtas(w1, d2));
+ TEST_INSTRUCTION("4100E49E", fcvtas(x1, h2));
+ TEST_INSTRUCTION("4100249E", fcvtas(x1, s2));
+ TEST_INSTRUCTION("4100649E", fcvtas(x1, d2));
+ TEST_INSTRUCTION("41C8795E", fcvtas(h1, h2));
+ TEST_INSTRUCTION("41C8215E", fcvtas(s1, s2));
+ TEST_INSTRUCTION("41C8615E", fcvtas(d1, d2));
+ TEST_INSTRUCTION("41C8790E", fcvtas(v1.h4(), v2.h4()));
+ TEST_INSTRUCTION("41C8210E", fcvtas(v1.s2(), v2.s2()));
+ TEST_INSTRUCTION("41C8794E", fcvtas(v1.h8(), v2.h8()));
+ TEST_INSTRUCTION("41C8214E", fcvtas(v1.s4(), v2.s4()));
+ TEST_INSTRUCTION("41C8614E", fcvtas(v1.d2(), v2.d2()));
+ TEST_INSTRUCTION("4100E51E", fcvtau(w1, h2));
+ TEST_INSTRUCTION("4100251E", fcvtau(w1, s2));
+ TEST_INSTRUCTION("4100651E", fcvtau(w1, d2));
+ TEST_INSTRUCTION("4100E59E", fcvtau(x1, h2));
+ TEST_INSTRUCTION("4100259E", fcvtau(x1, s2));
+ TEST_INSTRUCTION("4100659E", fcvtau(x1, d2));
+ TEST_INSTRUCTION("41C8797E", fcvtau(h1, h2));
+ TEST_INSTRUCTION("41C8217E", fcvtau(s1, s2));
+ TEST_INSTRUCTION("41C8617E", fcvtau(d1, d2));
+ TEST_INSTRUCTION("41C8792E", fcvtau(v1.h4(), v2.h4()));
+ TEST_INSTRUCTION("41C8212E", fcvtau(v1.s2(), v2.s2()));
+ TEST_INSTRUCTION("41C8796E", fcvtau(v1.h8(), v2.h8()));
+ TEST_INSTRUCTION("41C8216E", fcvtau(v1.s4(), v2.s4()));
+ TEST_INSTRUCTION("41C8616E", fcvtau(v1.d2(), v2.d2()));
+ TEST_INSTRUCTION("4178210E", fcvtl(v1.s4(), v2.h4()));
+ TEST_INSTRUCTION("4178214E", fcvtl2(v1.s4(), v2.h8()));
+ TEST_INSTRUCTION("4178610E", fcvtl(v1.d2(), v2.s2()));
+ TEST_INSTRUCTION("4178614E", fcvtl2(v1.d2(), v2.s4()));
+ TEST_INSTRUCTION("4100F01E", fcvtms(w1, h2));
+ TEST_INSTRUCTION("4100301E", fcvtms(w1, s2));
+ TEST_INSTRUCTION("4100701E", fcvtms(w1, d2));
+ TEST_INSTRUCTION("4100F09E", fcvtms(x1, h2));
+ TEST_INSTRUCTION("4100309E", fcvtms(x1, s2));
+ TEST_INSTRUCTION("4100709E", fcvtms(x1, d2));
+ TEST_INSTRUCTION("41B8795E", fcvtms(h1, h2));
+ TEST_INSTRUCTION("41B8215E", fcvtms(s1, s2));
+ TEST_INSTRUCTION("41B8615E", fcvtms(d1, d2));
+ TEST_INSTRUCTION("41B8790E", fcvtms(v1.h4(), v2.h4()));
+ TEST_INSTRUCTION("41B8210E", fcvtms(v1.s2(), v2.s2()));
+ TEST_INSTRUCTION("41B8794E", fcvtms(v1.h8(), v2.h8()));
+ TEST_INSTRUCTION("41B8214E", fcvtms(v1.s4(), v2.s4()));
+ TEST_INSTRUCTION("41B8614E", fcvtms(v1.d2(), v2.d2()));
+ TEST_INSTRUCTION("4100F11E", fcvtmu(w1, h2));
+ TEST_INSTRUCTION("4100311E", fcvtmu(w1, s2));
+ TEST_INSTRUCTION("4100711E", fcvtmu(w1, d2));
+ TEST_INSTRUCTION("4100F19E", fcvtmu(x1, h2));
+ TEST_INSTRUCTION("4100319E", fcvtmu(x1, s2));
+ TEST_INSTRUCTION("4100719E", fcvtmu(x1, d2));
+ TEST_INSTRUCTION("41B8797E", fcvtmu(h1, h2));
+ TEST_INSTRUCTION("41B8217E", fcvtmu(s1, s2));
+ TEST_INSTRUCTION("41B8617E", fcvtmu(d1, d2));
+ TEST_INSTRUCTION("41B8792E", fcvtmu(v1.h4(), v2.h4()));
+ TEST_INSTRUCTION("41B8212E", fcvtmu(v1.s2(), v2.s2()));
+ TEST_INSTRUCTION("41B8796E", fcvtmu(v1.h8(), v2.h8()));
+ TEST_INSTRUCTION("41B8216E", fcvtmu(v1.s4(), v2.s4()));
+ TEST_INSTRUCTION("41B8616E", fcvtmu(v1.d2(), v2.d2()));
+ TEST_INSTRUCTION("4168210E", fcvtn(v1.h4(), v2.s4()));
+ TEST_INSTRUCTION("4168214E", fcvtn2(v1.h8(), v2.s4()));
+ TEST_INSTRUCTION("4168610E", fcvtn(v1.s2(), v2.d2()));
+ TEST_INSTRUCTION("4168614E", fcvtn2(v1.s4(), v2.d2()));
+ TEST_INSTRUCTION("4100E01E", fcvtns(w1, h2));
+ TEST_INSTRUCTION("4100201E", fcvtns(w1, s2));
+ TEST_INSTRUCTION("4100601E", fcvtns(w1, d2));
+ TEST_INSTRUCTION("4100E09E", fcvtns(x1, h2));
+ TEST_INSTRUCTION("4100209E", fcvtns(x1, s2));
+ TEST_INSTRUCTION("4100609E", fcvtns(x1, d2));
+ TEST_INSTRUCTION("41A8795E", fcvtns(h1, h2));
+ TEST_INSTRUCTION("41A8215E", fcvtns(s1, s2));
+ TEST_INSTRUCTION("41A8615E", fcvtns(d1, d2));
+ TEST_INSTRUCTION("41A8790E", fcvtns(v1.h4(), v2.h4()));
+ TEST_INSTRUCTION("41A8210E", fcvtns(v1.s2(), v2.s2()));
+ TEST_INSTRUCTION("41A8794E", fcvtns(v1.h8(), v2.h8()));
+ TEST_INSTRUCTION("41A8214E", fcvtns(v1.s4(), v2.s4()));
+ TEST_INSTRUCTION("41A8614E", fcvtns(v1.d2(), v2.d2()));
+ TEST_INSTRUCTION("4100E11E", fcvtnu(w1, h2));
+ TEST_INSTRUCTION("4100211E", fcvtnu(w1, s2));
+ TEST_INSTRUCTION("4100611E", fcvtnu(w1, d2));
+ TEST_INSTRUCTION("4100E19E", fcvtnu(x1, h2));
+ TEST_INSTRUCTION("4100219E", fcvtnu(x1, s2));
+ TEST_INSTRUCTION("4100619E", fcvtnu(x1, d2));
+ TEST_INSTRUCTION("41A8797E", fcvtnu(h1, h2));
+ TEST_INSTRUCTION("41A8217E", fcvtnu(s1, s2));
+ TEST_INSTRUCTION("41A8617E", fcvtnu(d1, d2));
+ TEST_INSTRUCTION("41A8792E", fcvtnu(v1.h4(), v2.h4()));
+ TEST_INSTRUCTION("41A8212E", fcvtnu(v1.s2(), v2.s2()));
+ TEST_INSTRUCTION("41A8796E", fcvtnu(v1.h8(), v2.h8()));
+ TEST_INSTRUCTION("41A8216E", fcvtnu(v1.s4(), v2.s4()));
+ TEST_INSTRUCTION("41A8616E", fcvtnu(v1.d2(), v2.d2()));
+ TEST_INSTRUCTION("4100E81E", fcvtps(w1, h2));
+ TEST_INSTRUCTION("4100281E", fcvtps(w1, s2));
+ TEST_INSTRUCTION("4100681E", fcvtps(w1, d2));
+ TEST_INSTRUCTION("4100E89E", fcvtps(x1, h2));
+ TEST_INSTRUCTION("4100289E", fcvtps(x1, s2));
+ TEST_INSTRUCTION("4100689E", fcvtps(x1, d2));
+ TEST_INSTRUCTION("41A8F95E", fcvtps(h1, h2));
+ TEST_INSTRUCTION("41A8A15E", fcvtps(s1, s2));
+ TEST_INSTRUCTION("41A8E15E", fcvtps(d1, d2));
+ TEST_INSTRUCTION("41A8F90E", fcvtps(v1.h4(), v2.h4()));
+ TEST_INSTRUCTION("41A8A10E", fcvtps(v1.s2(), v2.s2()));
+ TEST_INSTRUCTION("41A8F94E", fcvtps(v1.h8(), v2.h8()));
+ TEST_INSTRUCTION("41A8A14E", fcvtps(v1.s4(), v2.s4()));
+ TEST_INSTRUCTION("41A8E14E", fcvtps(v1.d2(), v2.d2()));
+ TEST_INSTRUCTION("4100E91E", fcvtpu(w1, h2));
+ TEST_INSTRUCTION("4100291E", fcvtpu(w1, s2));
+ TEST_INSTRUCTION("4100691E", fcvtpu(w1, d2));
+ TEST_INSTRUCTION("4100E99E", fcvtpu(x1, h2));
+ TEST_INSTRUCTION("4100299E", fcvtpu(x1, s2));
+ TEST_INSTRUCTION("4100699E", fcvtpu(x1, d2));
+ TEST_INSTRUCTION("41A8F97E", fcvtpu(h1, h2));
+ TEST_INSTRUCTION("41A8A17E", fcvtpu(s1, s2));
+ TEST_INSTRUCTION("41A8E17E", fcvtpu(d1, d2));
+ TEST_INSTRUCTION("41A8F92E", fcvtpu(v1.h4(), v2.h4()));
+ TEST_INSTRUCTION("41A8A12E", fcvtpu(v1.s2(), v2.s2()));
+ TEST_INSTRUCTION("41A8F96E", fcvtpu(v1.h8(), v2.h8()));
+ TEST_INSTRUCTION("41A8A16E", fcvtpu(v1.s4(), v2.s4()));
+ TEST_INSTRUCTION("41A8E16E", fcvtpu(v1.d2(), v2.d2()));
+ TEST_INSTRUCTION("2168617E", fcvtxn(s1, d1));
+ TEST_INSTRUCTION("4168612E", fcvtxn(v1.s2(), v2.d2()));
+ TEST_INSTRUCTION("4168616E", fcvtxn2(v1.s4(), v2.d2()));
+ TEST_INSTRUCTION("4100F81E", fcvtzs(w1, h2));
+ TEST_INSTRUCTION("4100381E", fcvtzs(w1, s2));
+ TEST_INSTRUCTION("4100781E", fcvtzs(w1, d2));
+ TEST_INSTRUCTION("4100F89E", fcvtzs(x1, h2));
+ TEST_INSTRUCTION("4100389E", fcvtzs(x1, s2));
+ TEST_INSTRUCTION("4100789E", fcvtzs(x1, d2));
+ TEST_INSTRUCTION("41B8F95E", fcvtzs(h1, h2));
+ TEST_INSTRUCTION("41B8A15E", fcvtzs(s1, s2));
+ TEST_INSTRUCTION("41B8E15E", fcvtzs(d1, d2));
+ TEST_INSTRUCTION("41B8F90E", fcvtzs(v1.h4(), v2.h4()));
+ TEST_INSTRUCTION("41B8A10E", fcvtzs(v1.s2(), v2.s2()));
+ TEST_INSTRUCTION("41B8F94E", fcvtzs(v1.h8(), v2.h8()));
+ TEST_INSTRUCTION("41B8A14E", fcvtzs(v1.s4(), v2.s4()));
+ TEST_INSTRUCTION("41B8E14E", fcvtzs(v1.d2(), v2.d2()));
+ TEST_INSTRUCTION("41E0D81E", fcvtzs(w1, h2, 8));
+ TEST_INSTRUCTION("41E0181E", fcvtzs(w1, s2, 8));
+ TEST_INSTRUCTION("41E0581E", fcvtzs(w1, d2, 8));
+ TEST_INSTRUCTION("41E0D89E", fcvtzs(x1, h2, 8));
+ TEST_INSTRUCTION("41E0189E", fcvtzs(x1, s2, 8));
+ TEST_INSTRUCTION("41E0589E", fcvtzs(x1, d2, 8));
+ TEST_INSTRUCTION("41FC185F", fcvtzs(h1, h2, 8));
+ TEST_INSTRUCTION("41FC385F", fcvtzs(s1, s2, 8));
+ TEST_INSTRUCTION("41FC785F", fcvtzs(d1, d2, 8));
+ TEST_INSTRUCTION("41FC180F", fcvtzs(v1.h4(), v2.h4(), 8));
+ TEST_INSTRUCTION("41FC380F", fcvtzs(v1.s2(), v2.s2(), 8));
+ TEST_INSTRUCTION("41FC184F", fcvtzs(v1.h8(), v2.h8(), 8));
+ TEST_INSTRUCTION("41FC384F", fcvtzs(v1.s4(), v2.s4(), 8));
+ TEST_INSTRUCTION("41FC784F", fcvtzs(v1.d2(), v2.d2(), 8));
+ TEST_INSTRUCTION("4100F91E", fcvtzu(w1, h2));
+ TEST_INSTRUCTION("4100391E", fcvtzu(w1, s2));
+ TEST_INSTRUCTION("4100791E", fcvtzu(w1, d2));
+ TEST_INSTRUCTION("4100F99E", fcvtzu(x1, h2));
+ TEST_INSTRUCTION("4100399E", fcvtzu(x1, s2));
+ TEST_INSTRUCTION("4100799E", fcvtzu(x1, d2));
+ TEST_INSTRUCTION("41B8F97E", fcvtzu(h1, h2));
+ TEST_INSTRUCTION("41B8A17E", fcvtzu(s1, s2));
+ TEST_INSTRUCTION("41B8E17E", fcvtzu(d1, d2));
+ TEST_INSTRUCTION("41B8F92E", fcvtzu(v1.h4(), v2.h4()));
+ TEST_INSTRUCTION("41B8A12E", fcvtzu(v1.s2(), v2.s2()));
+ TEST_INSTRUCTION("41B8F96E", fcvtzu(v1.h8(), v2.h8()));
+ TEST_INSTRUCTION("41B8A16E", fcvtzu(v1.s4(), v2.s4()));
+ TEST_INSTRUCTION("41B8E16E", fcvtzu(v1.d2(), v2.d2()));
+ TEST_INSTRUCTION("41E0D91E", fcvtzu(w1, h2, 8));
+ TEST_INSTRUCTION("41E0191E", fcvtzu(w1, s2, 8));
+ TEST_INSTRUCTION("41E0591E", fcvtzu(w1, d2, 8));
+ TEST_INSTRUCTION("41E0D99E", fcvtzu(x1, h2, 8));
+ TEST_INSTRUCTION("41E0199E", fcvtzu(x1, s2, 8));
+ TEST_INSTRUCTION("41E0599E", fcvtzu(x1, d2, 8));
+ TEST_INSTRUCTION("41FC187F", fcvtzu(h1, h2, 8));
+ TEST_INSTRUCTION("41FC387F", fcvtzu(s1, s2, 8));
+ TEST_INSTRUCTION("41FC787F", fcvtzu(d1, d2, 8));
+ TEST_INSTRUCTION("41FC182F", fcvtzu(v1.h4(), v2.h4(), 8));
+ TEST_INSTRUCTION("41FC382F", fcvtzu(v1.s2(), v2.s2(), 8));
+ TEST_INSTRUCTION("41FC186F", fcvtzu(v1.h8(), v2.h8(), 8));
+ TEST_INSTRUCTION("41FC386F", fcvtzu(v1.s4(), v2.s4(), 8));
+ TEST_INSTRUCTION("41FC786F", fcvtzu(v1.d2(), v2.d2(), 8));
+ TEST_INSTRUCTION("4118E31E", fdiv(h1, h2, h3));
+ TEST_INSTRUCTION("4118231E", fdiv(s1, s2, s3));
+ TEST_INSTRUCTION("4118631E", fdiv(d1, d2, d3));
+ TEST_INSTRUCTION("413C432E", fdiv(v1.h4(), v2.h4(), v3.h4()));
+ TEST_INSTRUCTION("41FC232E", fdiv(v1.s2(), v2.s2(), v3.s2()));
+ TEST_INSTRUCTION("413C436E", fdiv(v1.h8(), v2.h8(), v3.h8()));
+ TEST_INSTRUCTION("41FC236E", fdiv(v1.s4(), v2.s4(), v3.s4()));
+ TEST_INSTRUCTION("41FC636E", fdiv(v1.d2(), v2.d2(), v3.d2()));
+ TEST_INSTRUCTION("41007E1E", fjcvtzs(w1, d2));
+ TEST_INSTRUCTION("4110C31F", fmadd(h1, h2, h3, h4));
+ TEST_INSTRUCTION("4110031F", fmadd(s1, s2, s3, s4));
+ TEST_INSTRUCTION("4110431F", fmadd(d1, d2, d3, d4));
+ TEST_INSTRUCTION("4148E31E", fmax(h1, h2, h3));
+ TEST_INSTRUCTION("4148231E", fmax(s1, s2, s3));
+ TEST_INSTRUCTION("4148631E", fmax(d1, d2, d3));
+ TEST_INSTRUCTION("4134430E", fmax(v1.h4(), v2.h4(), v3.h4()));
+ TEST_INSTRUCTION("41F4230E", fmax(v1.s2(), v2.s2(), v3.s2()));
+ TEST_INSTRUCTION("4134434E", fmax(v1.h8(), v2.h8(), v3.h8()));
+ TEST_INSTRUCTION("41F4234E", fmax(v1.s4(), v2.s4(), v3.s4()));
+ TEST_INSTRUCTION("41F4634E", fmax(v1.d2(), v2.d2(), v3.d2()));
+ TEST_INSTRUCTION("4168E31E", fmaxnm(h1, h2, h3));
+ TEST_INSTRUCTION("4168231E", fmaxnm(s1, s2, s3));
+ TEST_INSTRUCTION("4168631E", fmaxnm(d1, d2, d3));
+ TEST_INSTRUCTION("4104430E", fmaxnm(v1.h4(), v2.h4(), v3.h4()));
+ TEST_INSTRUCTION("41C4230E", fmaxnm(v1.s2(), v2.s2(), v3.s2()));
+ TEST_INSTRUCTION("4104434E", fmaxnm(v1.h8(), v2.h8(), v3.h8()));
+ TEST_INSTRUCTION("41C4234E", fmaxnm(v1.s4(), v2.s4(), v3.s4()));
+ TEST_INSTRUCTION("41C4634E", fmaxnm(v1.d2(), v2.d2(), v3.d2()));
+ TEST_INSTRUCTION("41C8305E", fmaxnmp(h1, v2.h2()));
+ TEST_INSTRUCTION("41C8307E", fmaxnmp(s1, v2.s2()));
+ TEST_INSTRUCTION("41C8707E", fmaxnmp(d1, v2.d2()));
+ TEST_INSTRUCTION("4104432E", fmaxnmp(v1.h4(), v2.h4(), v3.h4()));
+ TEST_INSTRUCTION("41C4232E", fmaxnmp(v1.s2(), v2.s2(), v3.s2()));
+ TEST_INSTRUCTION("4104436E", fmaxnmp(v1.h8(), v2.h8(), v3.h8()));
+ TEST_INSTRUCTION("41C4236E", fmaxnmp(v1.s4(), v2.s4(), v3.s4()));
+ TEST_INSTRUCTION("41C4636E", fmaxnmp(v1.d2(), v2.d2(), v3.d2()));
+ TEST_INSTRUCTION("41C8300E", fmaxnmv(h1, v2.h4()));
+ TEST_INSTRUCTION("41C8304E", fmaxnmv(h1, v2.h8()));
+ TEST_INSTRUCTION("41C8306E", fmaxnmv(s1, v2.s4()));
+ TEST_INSTRUCTION("41F8305E", fmaxp(h1, v2.h2()));
+ TEST_INSTRUCTION("41F8307E", fmaxp(s1, v2.s2()));
+ TEST_INSTRUCTION("41F8707E", fmaxp(d1, v2.d2()));
+ TEST_INSTRUCTION("4134432E", fmaxp(v1.h4(), v2.h4(), v3.h4()));
+ TEST_INSTRUCTION("41F4232E", fmaxp(v1.s2(), v2.s2(), v3.s2()));
+ TEST_INSTRUCTION("4134436E", fmaxp(v1.h8(), v2.h8(), v3.h8()));
+ TEST_INSTRUCTION("41F4236E", fmaxp(v1.s4(), v2.s4(), v3.s4()));
+ TEST_INSTRUCTION("41F4636E", fmaxp(v1.d2(), v2.d2(), v3.d2()));
+ TEST_INSTRUCTION("41F8300E", fmaxv(h1, v2.h4()));
+ TEST_INSTRUCTION("41F8304E", fmaxv(h1, v2.h8()));
+ TEST_INSTRUCTION("41F8306E", fmaxv(s1, v2.s4()));
+ TEST_INSTRUCTION("4158E31E", fmin(h1, h2, h3));
+ TEST_INSTRUCTION("4158231E", fmin(s1, s2, s3));
+ TEST_INSTRUCTION("4158631E", fmin(d1, d2, d3));
+ TEST_INSTRUCTION("4134C30E", fmin(v1.h4(), v2.h4(), v3.h4()));
+ TEST_INSTRUCTION("41F4A30E", fmin(v1.s2(), v2.s2(), v3.s2()));
+ TEST_INSTRUCTION("4134C34E", fmin(v1.h8(), v2.h8(), v3.h8()));
+ TEST_INSTRUCTION("41F4A34E", fmin(v1.s4(), v2.s4(), v3.s4()));
+ TEST_INSTRUCTION("41F4E34E", fmin(v1.d2(), v2.d2(), v3.d2()));
+ TEST_INSTRUCTION("4178E31E", fminnm(h1, h2, h3));
+ TEST_INSTRUCTION("4178231E", fminnm(s1, s2, s3));
+ TEST_INSTRUCTION("4178631E", fminnm(d1, d2, d3));
+ TEST_INSTRUCTION("4104C30E", fminnm(v1.h4(), v2.h4(), v3.h4()));
+ TEST_INSTRUCTION("41C4A30E", fminnm(v1.s2(), v2.s2(), v3.s2()));
+ TEST_INSTRUCTION("4104C34E", fminnm(v1.h8(), v2.h8(), v3.h8()));
+ TEST_INSTRUCTION("41C4A34E", fminnm(v1.s4(), v2.s4(), v3.s4()));
+ TEST_INSTRUCTION("41C4E34E", fminnm(v1.d2(), v2.d2(), v3.d2()));
+ TEST_INSTRUCTION("41C8B05E", fminnmp(h1, v2.h2()));
+ TEST_INSTRUCTION("41C8B07E", fminnmp(s1, v2.s2()));
+ TEST_INSTRUCTION("41C8F07E", fminnmp(d1, v2.d2()));
+ TEST_INSTRUCTION("4104C32E", fminnmp(v1.h4(), v2.h4(), v3.h4()));
+ TEST_INSTRUCTION("41C4A32E", fminnmp(v1.s2(), v2.s2(), v3.s2()));
+ TEST_INSTRUCTION("4104C36E", fminnmp(v1.h8(), v2.h8(), v3.h8()));
+ TEST_INSTRUCTION("41C4A36E", fminnmp(v1.s4(), v2.s4(), v3.s4()));
+ TEST_INSTRUCTION("41C4E36E", fminnmp(v1.d2(), v2.d2(), v3.d2()));
+ TEST_INSTRUCTION("41C8B00E", fminnmv(h1, v2.h4()));
+ TEST_INSTRUCTION("41C8B04E", fminnmv(h1, v2.h8()));
+ TEST_INSTRUCTION("41C8B06E", fminnmv(s1, v2.s4()));
+ TEST_INSTRUCTION("41F8B05E", fminp(h1, v2.h2()));
+ TEST_INSTRUCTION("41F8B07E", fminp(s1, v2.s2()));
+ TEST_INSTRUCTION("41F8F07E", fminp(d1, v2.d2()));
+ TEST_INSTRUCTION("4134C32E", fminp(v1.h4(), v2.h4(), v3.h4()));
+ TEST_INSTRUCTION("41F4A32E", fminp(v1.s2(), v2.s2(), v3.s2()));
+ TEST_INSTRUCTION("4134C36E", fminp(v1.h8(), v2.h8(), v3.h8()));
+ TEST_INSTRUCTION("41F4A36E", fminp(v1.s4(), v2.s4(), v3.s4()));
+ TEST_INSTRUCTION("41F4E36E", fminp(v1.d2(), v2.d2(), v3.d2()));
+ TEST_INSTRUCTION("41F8B00E", fminv(h1, v2.h4()));
+ TEST_INSTRUCTION("41F8B04E", fminv(h1, v2.h8()));
+ TEST_INSTRUCTION("41F8B06E", fminv(s1, v2.s4()));
+ TEST_INSTRUCTION("410C430E", fmla(v1.h4(), v2.h4(), v3.h4()));
+ TEST_INSTRUCTION("41CC230E", fmla(v1.s2(), v2.s2(), v3.s2()));
+ TEST_INSTRUCTION("410C434E", fmla(v1.h8(), v2.h8(), v3.h8()));
+ TEST_INSTRUCTION("41CC234E", fmla(v1.s4(), v2.s4(), v3.s4()));
+ TEST_INSTRUCTION("41CC634E", fmla(v1.d2(), v2.d2(), v3.d2()));
+ TEST_INSTRUCTION("4118335F", fmla(h1, h2, v3.h(7)));
+ TEST_INSTRUCTION("4118A35F", fmla(s1, s2, v3.s(3)));
+ TEST_INSTRUCTION("4118C35F", fmla(d1, d2, v3.d(1)));
+ TEST_INSTRUCTION("4118330F", fmla(v1.h4(), v2.h4(), v3.h(7)));
+ TEST_INSTRUCTION("4118A30F", fmla(v1.s2(), v2.s2(), v3.s(3)));
+ TEST_INSTRUCTION("4118334F", fmla(v1.h8(), v2.h8(), v3.h(7)));
+ TEST_INSTRUCTION("4118A34F", fmla(v1.s4(), v2.s4(), v3.s(3)));
+ TEST_INSTRUCTION("4118C34F", fmla(v1.d2(), v2.d2(), v3.d(1)));
+ TEST_INSTRUCTION("41EC230E", fmlal(v1.s2(), v2.h2(), v3.h2()));
+ TEST_INSTRUCTION("41EC234E", fmlal(v1.s4(), v2.h4(), v3.h4()));
+ TEST_INSTRUCTION("4100830F", fmlal(v1.s2(), v2.h2(), v3.h(0)));
+ TEST_INSTRUCTION("4108B30F", fmlal(v1.s2(), v2.h2(), v3.h(7)));
+ TEST_INSTRUCTION("4100834F", fmlal(v1.s4(), v2.h4(), v3.h(0)));
+ TEST_INSTRUCTION("4108B34F", fmlal(v1.s4(), v2.h4(), v3.h(7)));
+ TEST_INSTRUCTION("41CC232E", fmlal2(v1.s2(), v2.h2(), v3.h2()));
+ TEST_INSTRUCTION("41CC236E", fmlal2(v1.s4(), v2.h4(), v3.h4()));
+ TEST_INSTRUCTION("4180832F", fmlal2(v1.s2(), v2.h2(), v3.h(0)));
+ TEST_INSTRUCTION("4188B32F", fmlal2(v1.s2(), v2.h2(), v3.h(7)));
+ TEST_INSTRUCTION("4180836F", fmlal2(v1.s4(), v2.h4(), v3.h(0)));
+ TEST_INSTRUCTION("4188B36F", fmlal2(v1.s4(), v2.h4(), v3.h(7)));
+ TEST_INSTRUCTION("410CC30E", fmls(v1.h4(), v2.h4(), v3.h4()));
+ TEST_INSTRUCTION("41CCA30E", fmls(v1.s2(), v2.s2(), v3.s2()));
+ TEST_INSTRUCTION("410CC34E", fmls(v1.h8(), v2.h8(), v3.h8()));
+ TEST_INSTRUCTION("41CCA34E", fmls(v1.s4(), v2.s4(), v3.s4()));
+ TEST_INSTRUCTION("41CCE34E", fmls(v1.d2(), v2.d2(), v3.d2()));
+ TEST_INSTRUCTION("4158335F", fmls(h1, h2, v3.h(7)));
+ TEST_INSTRUCTION("4158A35F", fmls(s1, s2, v3.s(3)));
+ TEST_INSTRUCTION("4158C35F", fmls(d1, d2, v3.d(1)));
+ TEST_INSTRUCTION("4158330F", fmls(v1.h4(), v2.h4(), v3.h(7)));
+ TEST_INSTRUCTION("4158A30F", fmls(v1.s2(), v2.s2(), v3.s(3)));
+ TEST_INSTRUCTION("4158334F", fmls(v1.h8(), v2.h8(), v3.h(7)));
+ TEST_INSTRUCTION("4158A34F", fmls(v1.s4(), v2.s4(), v3.s(3)));
+ TEST_INSTRUCTION("4158C34F", fmls(v1.d2(), v2.d2(), v3.d(1)));
+ TEST_INSTRUCTION("41ECA30E", fmlsl(v1.s2(), v2.h2(), v3.h2()));
+ TEST_INSTRUCTION("41ECA34E", fmlsl(v1.s4(), v2.h4(), v3.h4()));
+ TEST_INSTRUCTION("4140830F", fmlsl(v1.s2(), v2.h2(), v3.h(0)));
+ TEST_INSTRUCTION("4148B30F", fmlsl(v1.s2(), v2.h2(), v3.h(7)));
+ TEST_INSTRUCTION("4140834F", fmlsl(v1.s4(), v2.h4(), v3.h(0)));
+ TEST_INSTRUCTION("4148B34F", fmlsl(v1.s4(), v2.h4(), v3.h(7)));
+ TEST_INSTRUCTION("41CCA32E", fmlsl2(v1.s2(), v2.h2(), v3.h2()));
+ TEST_INSTRUCTION("41CCA36E", fmlsl2(v1.s4(), v2.h4(), v3.h4()));
+ TEST_INSTRUCTION("41C0832F", fmlsl2(v1.s2(), v2.h2(), v3.h(0)));
+ TEST_INSTRUCTION("41C8B32F", fmlsl2(v1.s2(), v2.h2(), v3.h(7)));
+ TEST_INSTRUCTION("41C0836F", fmlsl2(v1.s4(), v2.h4(), v3.h(0)));
+ TEST_INSTRUCTION("41C8B36F", fmlsl2(v1.s4(), v2.h4(), v3.h(7)));
+ TEST_INSTRUCTION("4100E71E", fmov(h1, w2));
+ TEST_INSTRUCTION("4100E79E", fmov(h1, x2));
+ TEST_INSTRUCTION("4100271E", fmov(s1, w2));
+ TEST_INSTRUCTION("4100679E", fmov(d1, x2));
+ TEST_INSTRUCTION("4100AF9E", fmov(v1.d(1), x2));
+ TEST_INSTRUCTION("4100E61E", fmov(w1, h2));
+ TEST_INSTRUCTION("4100E69E", fmov(x1, h2));
+ TEST_INSTRUCTION("4100261E", fmov(w1, s2));
+ TEST_INSTRUCTION("4100669E", fmov(x1, d2));
+ TEST_INSTRUCTION("4100AE9E", fmov(x1, v2.d(1)));
+ TEST_INSTRUCTION("0110EA1E", fmov(h1, 0.25));
+ TEST_INSTRUCTION("0110EC1E", fmov(h1, 0.5));
+ TEST_INSTRUCTION("0110EF1E", fmov(h1, 1.5));
+ TEST_INSTRUCTION("0110E01E", fmov(h1, 2.0));
+ TEST_INSTRUCTION("01D0E51E", fmov(h1, 15.0));
+ TEST_INSTRUCTION("01102A1E", fmov(s1, 0.25));
+ TEST_INSTRUCTION("01102C1E", fmov(s1, 0.5));
+ TEST_INSTRUCTION("01102F1E", fmov(s1, 1.5));
+ TEST_INSTRUCTION("0110201E", fmov(s1, 2.0));
+ TEST_INSTRUCTION("01D0251E", fmov(s1, 15.0));
+ TEST_INSTRUCTION("01106A1E", fmov(d1, 0.25));
+ TEST_INSTRUCTION("01106C1E", fmov(d1, 0.5));
+ TEST_INSTRUCTION("01106F1E", fmov(d1, 1.5));
+ TEST_INSTRUCTION("0110601E", fmov(d1, 2.0));
+ TEST_INSTRUCTION("01D0651E", fmov(d1, 15.0));
+ TEST_INSTRUCTION("01FC030F", fmov(v1.h4(), 0.5));
+ TEST_INSTRUCTION("01FC000F", fmov(v1.h4(), 2.0));
+ TEST_INSTRUCTION("01FC034F", fmov(v1.h8(), 0.5));
+ TEST_INSTRUCTION("01FC004F", fmov(v1.h8(), 2.0));
+ TEST_INSTRUCTION("01F4030F", fmov(v1.s2(), 0.5));
+ TEST_INSTRUCTION("01F4000F", fmov(v1.s2(), 2.0));
+ TEST_INSTRUCTION("01F4034F", fmov(v1.s4(), 0.5));
+ TEST_INSTRUCTION("01F4004F", fmov(v1.s4(), 2.0));
+ TEST_INSTRUCTION("01F4036F", fmov(v1.d2(), 0.5));
+ TEST_INSTRUCTION("01F4006F", fmov(v1.d2(), 2.0));
+ TEST_INSTRUCTION("4190C31F", fmsub(h1, h2, h3, h4));
+ TEST_INSTRUCTION("4190031F", fmsub(s1, s2, s3, s4));
+ TEST_INSTRUCTION("4190431F", fmsub(d1, d2, d3, d4));
+ TEST_INSTRUCTION("4108E31E", fmul(h1, h2, h3));
+ TEST_INSTRUCTION("4108231E", fmul(s1, s2, s3));
+ TEST_INSTRUCTION("4108631E", fmul(d1, d2, d3));
+ TEST_INSTRUCTION("411C432E", fmul(v1.h4(), v2.h4(), v3.h4()));
+ TEST_INSTRUCTION("41DC232E", fmul(v1.s2(), v2.s2(), v3.s2()));
+ TEST_INSTRUCTION("411C436E", fmul(v1.h8(), v2.h8(), v3.h8()));
+ TEST_INSTRUCTION("41DC236E", fmul(v1.s4(), v2.s4(), v3.s4()));
+ TEST_INSTRUCTION("41DC636E", fmul(v1.d2(), v2.d2(), v3.d2()));
+ TEST_INSTRUCTION("4198335F", fmul(h1, h2, v3.h(7)));
+ TEST_INSTRUCTION("4198A35F", fmul(s1, s2, v3.s(3)));
+ TEST_INSTRUCTION("4198C35F", fmul(d1, d2, v3.d(1)));
+ TEST_INSTRUCTION("4198330F", fmul(v1.h4(), v2.h4(), v3.h(7)));
+ TEST_INSTRUCTION("4198A30F", fmul(v1.s2(), v2.s2(), v3.s(3)));
+ TEST_INSTRUCTION("4198334F", fmul(v1.h8(), v2.h8(), v3.h(7)));
+ TEST_INSTRUCTION("4198A34F", fmul(v1.s4(), v2.s4(), v3.s(3)));
+ TEST_INSTRUCTION("4198C34F", fmul(v1.d2(), v2.d2(), v3.d(1)));
+ TEST_INSTRUCTION("411C435E", fmulx(h1, h2, h3));
+ TEST_INSTRUCTION("41DC235E", fmulx(s1, s2, s3));
+ TEST_INSTRUCTION("41DC635E", fmulx(d1, d2, d3));
+ TEST_INSTRUCTION("411C430E", fmulx(v1.h4(), v2.h4(), v3.h4()));
+ TEST_INSTRUCTION("41DC230E", fmulx(v1.s2(), v2.s2(), v3.s2()));
+ TEST_INSTRUCTION("411C434E", fmulx(v1.h8(), v2.h8(), v3.h8()));
+ TEST_INSTRUCTION("41DC234E", fmulx(v1.s4(), v2.s4(), v3.s4()));
+ TEST_INSTRUCTION("41DC634E", fmulx(v1.d2(), v2.d2(), v3.d2()));
+ TEST_INSTRUCTION("4198337F", fmulx(h1, h2, v3.h(7)));
+ TEST_INSTRUCTION("4198A37F", fmulx(s1, s2, v3.s(3)));
+ TEST_INSTRUCTION("4198C37F", fmulx(d1, d2, v3.d(1)));
+ TEST_INSTRUCTION("4198332F", fmulx(v1.h4(), v2.h4(), v3.h(7)));
+ TEST_INSTRUCTION("4198A32F", fmulx(v1.s2(), v2.s2(), v3.s(3)));
+ TEST_INSTRUCTION("4198336F", fmulx(v1.h8(), v2.h8(), v3.h(7)));
+ TEST_INSTRUCTION("4198A36F", fmulx(v1.s4(), v2.s4(), v3.s(3)));
+ TEST_INSTRUCTION("4198C36F", fmulx(v1.d2(), v2.d2(), v3.d(1)));
+ TEST_INSTRUCTION("4140E11E", fneg(h1, h2));
+ TEST_INSTRUCTION("4140211E", fneg(s1, s2));
+ TEST_INSTRUCTION("4140611E", fneg(d1, d2));
+ TEST_INSTRUCTION("41F8F82E", fneg(v1.h4(), v2.h4()));
+ TEST_INSTRUCTION("41F8A02E", fneg(v1.s2(), v2.s2()));
+ TEST_INSTRUCTION("41F8F86E", fneg(v1.h8(), v2.h8()));
+ TEST_INSTRUCTION("41F8A06E", fneg(v1.s4(), v2.s4()));
+ TEST_INSTRUCTION("41F8E06E", fneg(v1.d2(), v2.d2()));
+ TEST_INSTRUCTION("4110E31F", fnmadd(h1, h2, h3, h4));
+ TEST_INSTRUCTION("4110231F", fnmadd(s1, s2, s3, s4));
+ TEST_INSTRUCTION("4110631F", fnmadd(d1, d2, d3, d4));
+ TEST_INSTRUCTION("4190E31F", fnmsub(h1, h2, h3, h4));
+ TEST_INSTRUCTION("4190231F", fnmsub(s1, s2, s3, s4));
+ TEST_INSTRUCTION("4190631F", fnmsub(d1, d2, d3, d4));
+ TEST_INSTRUCTION("4188E31E", fnmul(h1, h2, h3));
+ TEST_INSTRUCTION("4188231E", fnmul(s1, s2, s3));
+ TEST_INSTRUCTION("4188631E", fnmul(d1, d2, d3));
+ TEST_INSTRUCTION("41D8F95E", frecpe(h1, h2));
+ TEST_INSTRUCTION("41D8A15E", frecpe(s1, s2));
+ TEST_INSTRUCTION("41D8E15E", frecpe(d1, d2));
+ TEST_INSTRUCTION("41D8F90E", frecpe(v1.h4(), v2.h4()));
+ TEST_INSTRUCTION("41D8A10E", frecpe(v1.s2(), v2.s2()));
+ TEST_INSTRUCTION("41D8F94E", frecpe(v1.h8(), v2.h8()));
+ TEST_INSTRUCTION("41D8A14E", frecpe(v1.s4(), v2.s4()));
+ TEST_INSTRUCTION("41D8E14E", frecpe(v1.d2(), v2.d2()));
+ TEST_INSTRUCTION("413C435E", frecps(h1, h2, h3));
+ TEST_INSTRUCTION("41FC235E", frecps(s1, s2, s3));
+ TEST_INSTRUCTION("41FC635E", frecps(d1, d2, d3));
+ TEST_INSTRUCTION("413C430E", frecps(v1.h4(), v2.h4(), v3.h4()));
+ TEST_INSTRUCTION("41FC230E", frecps(v1.s2(), v2.s2(), v3.s2()));
+ TEST_INSTRUCTION("413C434E", frecps(v1.h8(), v2.h8(), v3.h8()));
+ TEST_INSTRUCTION("41FC234E", frecps(v1.s4(), v2.s4(), v3.s4()));
+ TEST_INSTRUCTION("41FC634E", frecps(v1.d2(), v2.d2(), v3.d2()));
+ TEST_INSTRUCTION("41F8F95E", frecpx(h1, h2));
+ TEST_INSTRUCTION("41F8A15E", frecpx(s1, s2));
+ TEST_INSTRUCTION("41F8E15E", frecpx(d1, d2));
+ TEST_INSTRUCTION("41C0281E", frint32x(s1, s2));
+ TEST_INSTRUCTION("41C0681E", frint32x(d1, d2));
+ TEST_INSTRUCTION("41E8212E", frint32x(v1.s2(), v2.s2()));
+ TEST_INSTRUCTION("41E8216E", frint32x(v1.s4(), v2.s4()));
+ TEST_INSTRUCTION("41E8616E", frint32x(v1.d2(), v2.d2()));
+ TEST_INSTRUCTION("4140281E", frint32z(s1, s2));
+ TEST_INSTRUCTION("4140681E", frint32z(d1, d2));
+ TEST_INSTRUCTION("41E8210E", frint32z(v1.s2(), v2.s2()));
+ TEST_INSTRUCTION("41E8214E", frint32z(v1.s4(), v2.s4()));
+ TEST_INSTRUCTION("41E8614E", frint32z(v1.d2(), v2.d2()));
+ TEST_INSTRUCTION("41C0291E", frint64x(s1, s2));
+ TEST_INSTRUCTION("41C0691E", frint64x(d1, d2));
+ TEST_INSTRUCTION("41F8212E", frint64x(v1.s2(), v2.s2()));
+ TEST_INSTRUCTION("41F8216E", frint64x(v1.s4(), v2.s4()));
+ TEST_INSTRUCTION("41F8616E", frint64x(v1.d2(), v2.d2()));
+ TEST_INSTRUCTION("4140291E", frint64z(s1, s2));
+ TEST_INSTRUCTION("4140691E", frint64z(d1, d2));
+ TEST_INSTRUCTION("41F8210E", frint64z(v1.s2(), v2.s2()));
+ TEST_INSTRUCTION("41F8214E", frint64z(v1.s4(), v2.s4()));
+ TEST_INSTRUCTION("41F8614E", frint64z(v1.d2(), v2.d2()));
+ TEST_INSTRUCTION("4140E61E", frinta(h1, h2));
+ TEST_INSTRUCTION("4140261E", frinta(s1, s2));
+ TEST_INSTRUCTION("4140661E", frinta(d1, d2));
+ TEST_INSTRUCTION("4188792E", frinta(v1.h4(), v2.h4()));
+ TEST_INSTRUCTION("4188212E", frinta(v1.s2(), v2.s2()));
+ TEST_INSTRUCTION("4188796E", frinta(v1.h8(), v2.h8()));
+ TEST_INSTRUCTION("4188216E", frinta(v1.s4(), v2.s4()));
+ TEST_INSTRUCTION("4188616E", frinta(v1.d2(), v2.d2()));
+ TEST_INSTRUCTION("41C0E71E", frinti(h1, h2));
+ TEST_INSTRUCTION("41C0271E", frinti(s1, s2));
+ TEST_INSTRUCTION("41C0671E", frinti(d1, d2));
+ TEST_INSTRUCTION("4198F92E", frinti(v1.h4(), v2.h4()));
+ TEST_INSTRUCTION("4198A12E", frinti(v1.s2(), v2.s2()));
+ TEST_INSTRUCTION("4198F96E", frinti(v1.h8(), v2.h8()));
+ TEST_INSTRUCTION("4198A16E", frinti(v1.s4(), v2.s4()));
+ TEST_INSTRUCTION("4198E16E", frinti(v1.d2(), v2.d2()));
+ TEST_INSTRUCTION("4140E51E", frintm(h1, h2));
+ TEST_INSTRUCTION("4140251E", frintm(s1, s2));
+ TEST_INSTRUCTION("4140651E", frintm(d1, d2));
+ TEST_INSTRUCTION("4198790E", frintm(v1.h4(), v2.h4()));
+ TEST_INSTRUCTION("4198210E", frintm(v1.s2(), v2.s2()));
+ TEST_INSTRUCTION("4198794E", frintm(v1.h8(), v2.h8()));
+ TEST_INSTRUCTION("4198214E", frintm(v1.s4(), v2.s4()));
+ TEST_INSTRUCTION("4198614E", frintm(v1.d2(), v2.d2()));
+ TEST_INSTRUCTION("4140E41E", frintn(h1, h2));
+ TEST_INSTRUCTION("4140241E", frintn(s1, s2));
+ TEST_INSTRUCTION("4140641E", frintn(d1, d2));
+ TEST_INSTRUCTION("4188790E", frintn(v1.h4(), v2.h4()));
+ TEST_INSTRUCTION("4188210E", frintn(v1.s2(), v2.s2()));
+ TEST_INSTRUCTION("4188794E", frintn(v1.h8(), v2.h8()));
+ TEST_INSTRUCTION("4188214E", frintn(v1.s4(), v2.s4()));
+ TEST_INSTRUCTION("4188614E", frintn(v1.d2(), v2.d2()));
+ TEST_INSTRUCTION("41C0E41E", frintp(h1, h2));
+ TEST_INSTRUCTION("41C0241E", frintp(s1, s2));
+ TEST_INSTRUCTION("41C0641E", frintp(d1, d2));
+ TEST_INSTRUCTION("4188F90E", frintp(v1.h4(), v2.h4()));
+ TEST_INSTRUCTION("4188A10E", frintp(v1.s2(), v2.s2()));
+ TEST_INSTRUCTION("4188F94E", frintp(v1.h8(), v2.h8()));
+ TEST_INSTRUCTION("4188A14E", frintp(v1.s4(), v2.s4()));
+ TEST_INSTRUCTION("4188E14E", frintp(v1.d2(), v2.d2()));
+ TEST_INSTRUCTION("4140E71E", frintx(h1, h2));
+ TEST_INSTRUCTION("4140271E", frintx(s1, s2));
+ TEST_INSTRUCTION("4140671E", frintx(d1, d2));
+ TEST_INSTRUCTION("4198792E", frintx(v1.h4(), v2.h4()));
+ TEST_INSTRUCTION("4198212E", frintx(v1.s2(), v2.s2()));
+ TEST_INSTRUCTION("4198796E", frintx(v1.h8(), v2.h8()));
+ TEST_INSTRUCTION("4198216E", frintx(v1.s4(), v2.s4()));
+ TEST_INSTRUCTION("4198616E", frintx(v1.d2(), v2.d2()));
+ TEST_INSTRUCTION("41C0E51E", frintz(h1, h2));
+ TEST_INSTRUCTION("41C0251E", frintz(s1, s2));
+ TEST_INSTRUCTION("41C0651E", frintz(d1, d2));
+ TEST_INSTRUCTION("4198F90E", frintz(v1.h4(), v2.h4()));
+ TEST_INSTRUCTION("4198A10E", frintz(v1.s2(), v2.s2()));
+ TEST_INSTRUCTION("4198F94E", frintz(v1.h8(), v2.h8()));
+ TEST_INSTRUCTION("4198A14E", frintz(v1.s4(), v2.s4()));
+ TEST_INSTRUCTION("4198E14E", frintz(v1.d2(), v2.d2()));
+ TEST_INSTRUCTION("41D8F97E", frsqrte(h1, h2));
+ TEST_INSTRUCTION("41D8A17E", frsqrte(s1, s2));
+ TEST_INSTRUCTION("41D8E17E", frsqrte(d1, d2));
+ TEST_INSTRUCTION("41D8F92E", frsqrte(v1.h4(), v2.h4()));
+ TEST_INSTRUCTION("41D8A12E", frsqrte(v1.s2(), v2.s2()));
+ TEST_INSTRUCTION("41D8F96E", frsqrte(v1.h8(), v2.h8()));
+ TEST_INSTRUCTION("41D8A16E", frsqrte(v1.s4(), v2.s4()));
+ TEST_INSTRUCTION("41D8E16E", frsqrte(v1.d2(), v2.d2()));
+ TEST_INSTRUCTION("413CC35E", frsqrts(h1, h2, h3));
+ TEST_INSTRUCTION("41FCA35E", frsqrts(s1, s2, s3));
+ TEST_INSTRUCTION("41FCE35E", frsqrts(d1, d2, d3));
+ TEST_INSTRUCTION("413CC30E", frsqrts(v1.h4(), v2.h4(), v3.h4()));
+ TEST_INSTRUCTION("41FCA30E", frsqrts(v1.s2(), v2.s2(), v3.s2()));
+ TEST_INSTRUCTION("413CC34E", frsqrts(v1.h8(), v2.h8(), v3.h8()));
+ TEST_INSTRUCTION("41FCA34E", frsqrts(v1.s4(), v2.s4(), v3.s4()));
+ TEST_INSTRUCTION("41FCE34E", frsqrts(v1.d2(), v2.d2(), v3.d2()));
+ TEST_INSTRUCTION("41C0E11E", fsqrt(h1, h2));
+ TEST_INSTRUCTION("41C0211E", fsqrt(s1, s2));
+ TEST_INSTRUCTION("41C0611E", fsqrt(d1, d2));
+ TEST_INSTRUCTION("41F8F92E", fsqrt(v1.h4(), v2.h4()));
+ TEST_INSTRUCTION("41F8A12E", fsqrt(v1.s2(), v2.s2()));
+ TEST_INSTRUCTION("41F8F96E", fsqrt(v1.h8(), v2.h8()));
+ TEST_INSTRUCTION("41F8A16E", fsqrt(v1.s4(), v2.s4()));
+ TEST_INSTRUCTION("41F8E16E", fsqrt(v1.d2(), v2.d2()));
+ TEST_INSTRUCTION("4138E31E", fsub(h1, h2, h3));
+ TEST_INSTRUCTION("4138231E", fsub(s1, s2, s3));
+ TEST_INSTRUCTION("4138631E", fsub(d1, d2, d3));
+ TEST_INSTRUCTION("4114C30E", fsub(v1.h4(), v2.h4(), v3.h4()));
+ TEST_INSTRUCTION("41D4A30E", fsub(v1.s2(), v2.s2(), v3.s2()));
+ TEST_INSTRUCTION("4114C34E", fsub(v1.h8(), v2.h8(), v3.h8()));
+ TEST_INSTRUCTION("41D4A34E", fsub(v1.s4(), v2.s4(), v3.s4()));
+ TEST_INSTRUCTION("41D4E34E", fsub(v1.d2(), v2.d2(), v3.d2()));
+ TEST_INSTRUCTION("411C014E", ins(v1.b(0), w2));
+ TEST_INSTRUCTION("411C074E", ins(v1.b(3), w2));
+ TEST_INSTRUCTION("411C0D4E", ins(v1.b(6), w2));
+ TEST_INSTRUCTION("411C134E", ins(v1.b(9), w2));
+ TEST_INSTRUCTION("411C1F4E", ins(v1.b(15), w2));
+ TEST_INSTRUCTION("411C024E", ins(v1.h(0), w2));
+ TEST_INSTRUCTION("411C0E4E", ins(v1.h(3), w2));
+ TEST_INSTRUCTION("411C1E4E", ins(v1.h(7), w2));
+ TEST_INSTRUCTION("411C044E", ins(v1.s(0), w2));
+ TEST_INSTRUCTION("411C0C4E", ins(v1.s(1), w2));
+ TEST_INSTRUCTION("411C144E", ins(v1.s(2), w2));
+ TEST_INSTRUCTION("411C1C4E", ins(v1.s(3), w2));
+ TEST_INSTRUCTION("411C084E", ins(v1.d(0), x2));
+ TEST_INSTRUCTION("411C184E", ins(v1.d(1), x2));
+ TEST_INSTRUCTION("417C016E", ins(v1.b(0), v2.b(15)));
+ TEST_INSTRUCTION("4174036E", ins(v1.b(1), v2.b(14)));
+ TEST_INSTRUCTION("4174026E", ins(v1.h(0), v2.h(7)));
+ TEST_INSTRUCTION("4164066E", ins(v1.h(1), v2.h(6)));
+ TEST_INSTRUCTION("4164046E", ins(v1.s(0), v2.s(3)));
+ TEST_INSTRUCTION("41440C6E", ins(v1.s(1), v2.s(2)));
+ TEST_INSTRUCTION("4144086E", ins(v1.d(0), v2.d(1)));
+ TEST_INSTRUCTION("4104186E", ins(v1.d(1), v2.d(0)));
+ TEST_INSTRUCTION("4100400D", ld1(v1.b(0), ptr(x2)));
+ TEST_INSTRUCTION("4100DF0D", ld1(v1.b(0), ptr_post(x2, 1)));
+ TEST_INSTRUCTION("4100CB0D", ld1(v1.b(0), ptr_post(x2, x11)));
+ TEST_INSTRUCTION("4140400D", ld1(v1.h(0), ptr(x2)));
+ TEST_INSTRUCTION("4140DF0D", ld1(v1.h(0), ptr_post(x2, 2)));
+ TEST_INSTRUCTION("4140CB0D", ld1(v1.h(0), ptr_post(x2, x11)));
+ TEST_INSTRUCTION("4180400D", ld1(v1.s(0), ptr(x2)));
+ TEST_INSTRUCTION("4180DF0D", ld1(v1.s(0), ptr_post(x2, 4)));
+ TEST_INSTRUCTION("4180CB0D", ld1(v1.s(0), ptr_post(x2, x11)));
+ TEST_INSTRUCTION("4184400D", ld1(v1.d(0), ptr(x2)));
+ TEST_INSTRUCTION("4184DF0D", ld1(v1.d(0), ptr_post(x2, 8)));
+ TEST_INSTRUCTION("4184CB0D", ld1(v1.d(0), ptr_post(x2, x11)));
+ TEST_INSTRUCTION("411C404D", ld1(v1.b(15), ptr(x2)));
+ TEST_INSTRUCTION("411CDF4D", ld1(v1.b(15), ptr_post(x2, 1)));
+ TEST_INSTRUCTION("411CCB4D", ld1(v1.b(15), ptr_post(x2, x11)));
+ TEST_INSTRUCTION("4158404D", ld1(v1.h(7), ptr(x2)));
+ TEST_INSTRUCTION("4158DF4D", ld1(v1.h(7), ptr_post(x2, 2)));
+ TEST_INSTRUCTION("4158CB4D", ld1(v1.h(7), ptr_post(x2, x11)));
+ TEST_INSTRUCTION("4190404D", ld1(v1.s(3), ptr(x2)));
+ TEST_INSTRUCTION("4190DF4D", ld1(v1.s(3), ptr_post(x2, 4)));
+ TEST_INSTRUCTION("4190CB4D", ld1(v1.s(3), ptr_post(x2, x11)));
+ TEST_INSTRUCTION("4184404D", ld1(v1.d(1), ptr(x2)));
+ TEST_INSTRUCTION("4184DF4D", ld1(v1.d(1), ptr_post(x2, 8)));
+ TEST_INSTRUCTION("4184CB4D", ld1(v1.d(1), ptr_post(x2, x11)));
+ TEST_INSTRUCTION("4170400C", ld1(v1.b8(), ptr(x2)));
+ TEST_INSTRUCTION("4170DF0C", ld1(v1.b8(), ptr_post(x2, 8)));
+ TEST_INSTRUCTION("4170404C", ld1(v1.b16(), ptr(x2)));
+ TEST_INSTRUCTION("4170DF4C", ld1(v1.b16(), ptr_post(x2, 16)));
+ TEST_INSTRUCTION("61A0400C", ld1(v1.b8(), v2.b8(), ptr(x3)));
+ TEST_INSTRUCTION("61A0DF0C", ld1(v1.b8(), v2.b8(), ptr_post(x3, 16)));
+ TEST_INSTRUCTION("61A0404C", ld1(v1.b16(), v2.b16(), ptr(x3)));
+ TEST_INSTRUCTION("61A0DF4C", ld1(v1.b16(), v2.b16(), ptr_post(x3, 32)));
+ TEST_INSTRUCTION("8160400C", ld1(v1.b8(), v2.b8(), v3.b8(), ptr(x4)));
+ TEST_INSTRUCTION("8160DF0C", ld1(v1.b8(), v2.b8(), v3.b8(), ptr_post(x4, 24)));
+ TEST_INSTRUCTION("8160404C", ld1(v1.b16(), v2.b16(), v3.b16(), ptr(x4)));
+ TEST_INSTRUCTION("8160DF4C", ld1(v1.b16(), v2.b16(), v3.b16(), ptr_post(x4, 48)));
+ TEST_INSTRUCTION("A120400C", ld1(v1.b8(), v2.b8(), v3.b8(), v4.b8(), ptr(x5)));
+ TEST_INSTRUCTION("A120DF0C", ld1(v1.b8(), v2.b8(), v3.b8(), v4.b8(), ptr_post(x5, 32)));
+ TEST_INSTRUCTION("A120404C", ld1(v1.b16(), v2.b16(), v3.b16(), v4.b16(), ptr(x5)));
+ TEST_INSTRUCTION("A120DF4C", ld1(v1.b16(), v2.b16(), v3.b16(), v4.b16(), ptr_post(x5, 64)));
+ TEST_INSTRUCTION("4174400C", ld1(v1.h4(), ptr(x2)));
+ TEST_INSTRUCTION("4174DF0C", ld1(v1.h4(), ptr_post(x2, 8)));
+ TEST_INSTRUCTION("4174404C", ld1(v1.h8(), ptr(x2)));
+ TEST_INSTRUCTION("4174DF4C", ld1(v1.h8(), ptr_post(x2, 16)));
+ TEST_INSTRUCTION("61A4400C", ld1(v1.h4(), v2.h4(), ptr(x3)));
+ TEST_INSTRUCTION("61A4DF0C", ld1(v1.h4(), v2.h4(), ptr_post(x3, 16)));
+ TEST_INSTRUCTION("61A4404C", ld1(v1.h8(), v2.h8(), ptr(x3)));
+ TEST_INSTRUCTION("61A4DF4C", ld1(v1.h8(), v2.h8(), ptr_post(x3, 32)));
+ TEST_INSTRUCTION("8164400C", ld1(v1.h4(), v2.h4(), v3.h4(), ptr(x4)));
+ TEST_INSTRUCTION("8164DF0C", ld1(v1.h4(), v2.h4(), v3.h4(), ptr_post(x4, 24)));
+ TEST_INSTRUCTION("8164404C", ld1(v1.h8(), v2.h8(), v3.h8(), ptr(x4)));
+ TEST_INSTRUCTION("8164DF4C", ld1(v1.h8(), v2.h8(), v3.h8(), ptr_post(x4, 48)));
+ TEST_INSTRUCTION("A124400C", ld1(v1.h4(), v2.h4(), v3.h4(), v4.h4(), ptr(x5)));
+ TEST_INSTRUCTION("A124DF0C", ld1(v1.h4(), v2.h4(), v3.h4(), v4.h4(), ptr_post(x5, 32)));
+ TEST_INSTRUCTION("A124404C", ld1(v1.h8(), v2.h8(), v3.h8(), v4.h8(), ptr(x5)));
+ TEST_INSTRUCTION("A124DF4C", ld1(v1.h8(), v2.h8(), v3.h8(), v4.h8(), ptr_post(x5, 64)));
+ TEST_INSTRUCTION("4178400C", ld1(v1.s2(), ptr(x2)));
+ TEST_INSTRUCTION("4178DF0C", ld1(v1.s2(), ptr_post(x2, 8)));
+ TEST_INSTRUCTION("4178404C", ld1(v1.s4(), ptr(x2)));
+ TEST_INSTRUCTION("4178DF4C", ld1(v1.s4(), ptr_post(x2, 16)));
+ TEST_INSTRUCTION("61A8400C", ld1(v1.s2(), v2.s2(), ptr(x3)));
+ TEST_INSTRUCTION("61A8DF0C", ld1(v1.s2(), v2.s2(), ptr_post(x3, 16)));
+ TEST_INSTRUCTION("61A8404C", ld1(v1.s4(), v2.s4(), ptr(x3)));
+ TEST_INSTRUCTION("61A8DF4C", ld1(v1.s4(), v2.s4(), ptr_post(x3, 32)));
+ TEST_INSTRUCTION("8168400C", ld1(v1.s2(), v2.s2(), v3.s2(), ptr(x4)));
+ TEST_INSTRUCTION("8168DF0C", ld1(v1.s2(), v2.s2(), v3.s2(), ptr_post(x4, 24)));
+ TEST_INSTRUCTION("8168404C", ld1(v1.s4(), v2.s4(), v3.s4(), ptr(x4)));
+ TEST_INSTRUCTION("8168DF4C", ld1(v1.s4(), v2.s4(), v3.s4(), ptr_post(x4, 48)));
+ TEST_INSTRUCTION("A128400C", ld1(v1.s2(), v2.s2(), v3.s2(), v4.s2(), ptr(x5)));
+ TEST_INSTRUCTION("A128DF0C", ld1(v1.s2(), v2.s2(), v3.s2(), v4.s2(), ptr_post(x5, 32)));
+ TEST_INSTRUCTION("A128404C", ld1(v1.s4(), v2.s4(), v3.s4(), v4.s4(), ptr(x5)));
+ TEST_INSTRUCTION("A128DF4C", ld1(v1.s4(), v2.s4(), v3.s4(), v4.s4(), ptr_post(x5, 64)));
+ TEST_INSTRUCTION("417C404C", ld1(v1.d2(), ptr(x2)));
+ TEST_INSTRUCTION("417CDF4C", ld1(v1.d2(), ptr_post(x2, 16)));
+ TEST_INSTRUCTION("61AC404C", ld1(v1.d2(), v2.d2(), ptr(x3)));
+ TEST_INSTRUCTION("61ACDF4C", ld1(v1.d2(), v2.d2(), ptr_post(x3, 32)));
+ TEST_INSTRUCTION("816C404C", ld1(v1.d2(), v2.d2(), v3.d2(), ptr(x4)));
+ TEST_INSTRUCTION("816CDF4C", ld1(v1.d2(), v2.d2(), v3.d2(), ptr_post(x4, 48)));
+ TEST_INSTRUCTION("A12C404C", ld1(v1.d2(), v2.d2(), v3.d2(), v4.d2(), ptr(x5)));
+ TEST_INSTRUCTION("A12CDF4C", ld1(v1.d2(), v2.d2(), v3.d2(), v4.d2(), ptr_post(x5, 64)));
+ TEST_INSTRUCTION("41C0400D", ld1r(v1.b8(), ptr(x2)));
+ TEST_INSTRUCTION("41C0DF0D", ld1r(v1.b8(), ptr_post(x2, 1)));
+ TEST_INSTRUCTION("41C0CB0D", ld1r(v1.b8(), ptr_post(x2, x11)));
+ TEST_INSTRUCTION("41C0404D", ld1r(v1.b16(), ptr(x2)));
+ TEST_INSTRUCTION("41C0DF4D", ld1r(v1.b16(), ptr_post(x2, 1)));
+ TEST_INSTRUCTION("41C0CB4D", ld1r(v1.b16(), ptr_post(x2, x11)));
+ TEST_INSTRUCTION("41C4400D", ld1r(v1.h4(), ptr(x2)));
+ TEST_INSTRUCTION("41C4DF0D", ld1r(v1.h4(), ptr_post(x2, 2)));
+ TEST_INSTRUCTION("41C4CB0D", ld1r(v1.h4(), ptr_post(x2, x11)));
+ TEST_INSTRUCTION("41C4404D", ld1r(v1.h8(), ptr(x2)));
+ TEST_INSTRUCTION("41C4DF4D", ld1r(v1.h8(), ptr_post(x2, 2)));
+ TEST_INSTRUCTION("41C4CB4D", ld1r(v1.h8(), ptr_post(x2, x11)));
+ TEST_INSTRUCTION("41C8400D", ld1r(v1.s2(), ptr(x2)));
+ TEST_INSTRUCTION("41C8DF0D", ld1r(v1.s2(), ptr_post(x2, 4)));
+ TEST_INSTRUCTION("41C8CB0D", ld1r(v1.s2(), ptr_post(x2, x11)));
+ TEST_INSTRUCTION("41C8404D", ld1r(v1.s4(), ptr(x2)));
+ TEST_INSTRUCTION("41C8DF4D", ld1r(v1.s4(), ptr_post(x2, 4)));
+ TEST_INSTRUCTION("41C8CB4D", ld1r(v1.s4(), ptr_post(x2, x11)));
+ TEST_INSTRUCTION("41CC404D", ld1r(v1.d2(), ptr(x2)));
+ TEST_INSTRUCTION("41CCDF4D", ld1r(v1.d2(), ptr_post(x2, 8)));
+ TEST_INSTRUCTION("41CCCB4D", ld1r(v1.d2(), ptr_post(x2, x11)));
+ TEST_INSTRUCTION("6100600D", ld2(v1.b(0), v2.b(0), ptr(x3)));
+ TEST_INSTRUCTION("6100FF0D", ld2(v1.b(0), v2.b(0), ptr_post(x3, 2)));
+ TEST_INSTRUCTION("6100EB0D", ld2(v1.b(0), v2.b(0), ptr_post(x3, x11)));
+ TEST_INSTRUCTION("6140600D", ld2(v1.h(0), v2.h(0), ptr(x3)));
+ TEST_INSTRUCTION("6140FF0D", ld2(v1.h(0), v2.h(0), ptr_post(x3, 4)));
+ TEST_INSTRUCTION("6140EB0D", ld2(v1.h(0), v2.h(0), ptr_post(x3, x11)));
+ TEST_INSTRUCTION("6180600D", ld2(v1.s(0), v2.s(0), ptr(x3)));
+ TEST_INSTRUCTION("6180FF0D", ld2(v1.s(0), v2.s(0), ptr_post(x3, 8)));
+ TEST_INSTRUCTION("6180EB0D", ld2(v1.s(0), v2.s(0), ptr_post(x3, x11)));
+ TEST_INSTRUCTION("6184600D", ld2(v1.d(0), v2.d(0), ptr(x3)));
+ TEST_INSTRUCTION("6184FF0D", ld2(v1.d(0), v2.d(0), ptr_post(x3, 16)));
+ TEST_INSTRUCTION("6184EB0D", ld2(v1.d(0), v2.d(0), ptr_post(x3, x11)));
+ TEST_INSTRUCTION("611C604D", ld2(v1.b(15), v2.b(15), ptr(x3)));
+ TEST_INSTRUCTION("611CFF4D", ld2(v1.b(15), v2.b(15), ptr_post(x3, 2)));
+ TEST_INSTRUCTION("611CEB4D", ld2(v1.b(15), v2.b(15), ptr_post(x3, x11)));
+ TEST_INSTRUCTION("6158604D", ld2(v1.h(7), v2.h(7), ptr(x3)));
+ TEST_INSTRUCTION("6158FF4D", ld2(v1.h(7), v2.h(7), ptr_post(x3, 4)));
+ TEST_INSTRUCTION("6158EB4D", ld2(v1.h(7), v2.h(7), ptr_post(x3, x11)));
+ TEST_INSTRUCTION("6190604D", ld2(v1.s(3), v2.s(3), ptr(x3)));
+ TEST_INSTRUCTION("6190FF4D", ld2(v1.s(3), v2.s(3), ptr_post(x3, 8)));
+ TEST_INSTRUCTION("6190EB4D", ld2(v1.s(3), v2.s(3), ptr_post(x3, x11)));
+ TEST_INSTRUCTION("6184604D", ld2(v1.d(1), v2.d(1), ptr(x3)));
+ TEST_INSTRUCTION("6184FF4D", ld2(v1.d(1), v2.d(1), ptr_post(x3, 16)));
+ TEST_INSTRUCTION("6184EB4D", ld2(v1.d(1), v2.d(1), ptr_post(x3, x11)));
+ TEST_INSTRUCTION("6180400C", ld2(v1.b8(), v2.b8(), ptr(x3)));
+ TEST_INSTRUCTION("6180DF0C", ld2(v1.b8(), v2.b8(), ptr_post(x3, 16)));
+ TEST_INSTRUCTION("6180CB0C", ld2(v1.b8(), v2.b8(), ptr_post(x3, x11)));
+ TEST_INSTRUCTION("6180404C", ld2(v1.b16(), v2.b16(), ptr(x3)));
+ TEST_INSTRUCTION("6180DF4C", ld2(v1.b16(), v2.b16(), ptr_post(x3, 32)));
+ TEST_INSTRUCTION("6180CB4C", ld2(v1.b16(), v2.b16(), ptr_post(x3, x11)));
+ TEST_INSTRUCTION("6184400C", ld2(v1.h4(), v2.h4(), ptr(x3)));
+ TEST_INSTRUCTION("6184DF0C", ld2(v1.h4(), v2.h4(), ptr_post(x3, 16)));
+ TEST_INSTRUCTION("6184CB0C", ld2(v1.h4(), v2.h4(), ptr_post(x3, x11)));
+ TEST_INSTRUCTION("6184404C", ld2(v1.h8(), v2.h8(), ptr(x3)));
+ TEST_INSTRUCTION("6184DF4C", ld2(v1.h8(), v2.h8(), ptr_post(x3, 32)));
+ TEST_INSTRUCTION("6184CB4C", ld2(v1.h8(), v2.h8(), ptr_post(x3, x11)));
+ TEST_INSTRUCTION("6188400C", ld2(v1.s2(), v2.s2(), ptr(x3)));
+ TEST_INSTRUCTION("6188DF0C", ld2(v1.s2(), v2.s2(), ptr_post(x3, 16)));
+ TEST_INSTRUCTION("6188CB0C", ld2(v1.s2(), v2.s2(), ptr_post(x3, x11)));
+ TEST_INSTRUCTION("6188404C", ld2(v1.s4(), v2.s4(), ptr(x3)));
+ TEST_INSTRUCTION("6188DF4C", ld2(v1.s4(), v2.s4(), ptr_post(x3, 32)));
+ TEST_INSTRUCTION("6188CB4C", ld2(v1.s4(), v2.s4(), ptr_post(x3, x11)));
+ TEST_INSTRUCTION("618C404C", ld2(v1.d2(), v2.d2(), ptr(x3)));
+ TEST_INSTRUCTION("618CDF4C", ld2(v1.d2(), v2.d2(), ptr_post(x3, 32)));
+ TEST_INSTRUCTION("618CCB4C", ld2(v1.d2(), v2.d2(), ptr_post(x3, x11)));
+ TEST_INSTRUCTION("61C0600D", ld2r(v1.b8(), v2.b8(), ptr(x3)));
+ TEST_INSTRUCTION("61C0FF0D", ld2r(v1.b8(), v2.b8(), ptr_post(x3, 2)));
+ TEST_INSTRUCTION("61C0EB0D", ld2r(v1.b8(), v2.b8(), ptr_post(x3, x11)));
+ TEST_INSTRUCTION("61C0604D", ld2r(v1.b16(), v2.b16(), ptr(x3)));
+ TEST_INSTRUCTION("61C0FF4D", ld2r(v1.b16(), v2.b16(), ptr_post(x3, 2)));
+ TEST_INSTRUCTION("61C0EB4D", ld2r(v1.b16(), v2.b16(), ptr_post(x3, x11)));
+ TEST_INSTRUCTION("61C4600D", ld2r(v1.h4(), v2.h4(), ptr(x3)));
+ TEST_INSTRUCTION("61C4FF0D", ld2r(v1.h4(), v2.h4(), ptr_post(x3, 4)));
+ TEST_INSTRUCTION("61C4EB0D", ld2r(v1.h4(), v2.h4(), ptr_post(x3, x11)));
+ TEST_INSTRUCTION("61C4604D", ld2r(v1.h8(), v2.h8(), ptr(x3)));
+ TEST_INSTRUCTION("61C4FF4D", ld2r(v1.h8(), v2.h8(), ptr_post(x3, 4)));
+ TEST_INSTRUCTION("61C4EB4D", ld2r(v1.h8(), v2.h8(), ptr_post(x3, x11)));
+ TEST_INSTRUCTION("61C8600D", ld2r(v1.s2(), v2.s2(), ptr(x3)));
+ TEST_INSTRUCTION("61C8FF0D", ld2r(v1.s2(), v2.s2(), ptr_post(x3, 8)));
+ TEST_INSTRUCTION("61C8EB0D", ld2r(v1.s2(), v2.s2(), ptr_post(x3, x11)));
+ TEST_INSTRUCTION("61C8604D", ld2r(v1.s4(), v2.s4(), ptr(x3)));
+ TEST_INSTRUCTION("61C8FF4D", ld2r(v1.s4(), v2.s4(), ptr_post(x3, 8)));
+ TEST_INSTRUCTION("61C8EB4D", ld2r(v1.s4(), v2.s4(), ptr_post(x3, x11)));
+ TEST_INSTRUCTION("61CC604D", ld2r(v1.d2(), v2.d2(), ptr(x3)));
+ TEST_INSTRUCTION("61CCFF4D", ld2r(v1.d2(), v2.d2(), ptr_post(x3, 16)));
+ TEST_INSTRUCTION("61CCEB4D", ld2r(v1.d2(), v2.d2(), ptr_post(x3, x11)));
+ TEST_INSTRUCTION("8120400D", ld3(v1.b(0), v2.b(0), v3.b(0), ptr(x4)));
+ TEST_INSTRUCTION("8120DF0D", ld3(v1.b(0), v2.b(0), v3.b(0), ptr_post(x4, 3)));
+ TEST_INSTRUCTION("8120CB0D", ld3(v1.b(0), v2.b(0), v3.b(0), ptr_post(x4, x11)));
+ TEST_INSTRUCTION("8160400D", ld3(v1.h(0), v2.h(0), v3.h(0), ptr(x4)));
+ TEST_INSTRUCTION("8160DF0D", ld3(v1.h(0), v2.h(0), v3.h(0), ptr_post(x4, 6)));
+ TEST_INSTRUCTION("8160CB0D", ld3(v1.h(0), v2.h(0), v3.h(0), ptr_post(x4, x11)));
+ TEST_INSTRUCTION("81A0400D", ld3(v1.s(0), v2.s(0), v3.s(0), ptr(x4)));
+ TEST_INSTRUCTION("81A0DF0D", ld3(v1.s(0), v2.s(0), v3.s(0), ptr_post(x4, 12)));
+ TEST_INSTRUCTION("81A0CB0D", ld3(v1.s(0), v2.s(0), v3.s(0), ptr_post(x4, x11)));
+ TEST_INSTRUCTION("81A4400D", ld3(v1.d(0), v2.d(0), v3.d(0), ptr(x4)));
+ TEST_INSTRUCTION("81A4DF0D", ld3(v1.d(0), v2.d(0), v3.d(0), ptr_post(x4, 24)));
+ TEST_INSTRUCTION("81A4CB0D", ld3(v1.d(0), v2.d(0), v3.d(0), ptr_post(x4, x11)));
+ TEST_INSTRUCTION("813C404D", ld3(v1.b(15), v2.b(15), v3.b(15), ptr(x4)));
+ TEST_INSTRUCTION("813CDF4D", ld3(v1.b(15), v2.b(15), v3.b(15), ptr_post(x4, 3)));
+ TEST_INSTRUCTION("813CCB4D", ld3(v1.b(15), v2.b(15), v3.b(15), ptr_post(x4, x11)));
+ TEST_INSTRUCTION("8178404D", ld3(v1.h(7), v2.h(7), v3.h(7), ptr(x4)));
+ TEST_INSTRUCTION("8178DF4D", ld3(v1.h(7), v2.h(7), v3.h(7), ptr_post(x4, 6)));
+ TEST_INSTRUCTION("8178CB4D", ld3(v1.h(7), v2.h(7), v3.h(7), ptr_post(x4, x11)));
+ TEST_INSTRUCTION("81B0404D", ld3(v1.s(3), v2.s(3), v3.s(3), ptr(x4)));
+ TEST_INSTRUCTION("81B0DF4D", ld3(v1.s(3), v2.s(3), v3.s(3), ptr_post(x4, 12)));
+ TEST_INSTRUCTION("81B0CB4D", ld3(v1.s(3), v2.s(3), v3.s(3), ptr_post(x4, x11)));
+ TEST_INSTRUCTION("81A4404D", ld3(v1.d(1), v2.d(1), v3.d(1), ptr(x4)));
+ TEST_INSTRUCTION("81A4DF4D", ld3(v1.d(1), v2.d(1), v3.d(1), ptr_post(x4, 24)));
+ TEST_INSTRUCTION("81A4CB4D", ld3(v1.d(1), v2.d(1), v3.d(1), ptr_post(x4, x11)));
+ TEST_INSTRUCTION("8140400C", ld3(v1.b8(), v2.b8(), v3.b8(), ptr(x4)));
+ TEST_INSTRUCTION("8140DF0C", ld3(v1.b8(), v2.b8(), v3.b8(), ptr_post(x4, 24)));
+ TEST_INSTRUCTION("8140CB0C", ld3(v1.b8(), v2.b8(), v3.b8(), ptr_post(x4, x11)));
+ TEST_INSTRUCTION("8140404C", ld3(v1.b16(), v2.b16(), v3.b16(), ptr(x4)));
+ TEST_INSTRUCTION("8140DF4C", ld3(v1.b16(), v2.b16(), v3.b16(), ptr_post(x4, 48)));
+ TEST_INSTRUCTION("8140CB4C", ld3(v1.b16(), v2.b16(), v3.b16(), ptr_post(x4, x11)));
+ TEST_INSTRUCTION("8144400C", ld3(v1.h4(), v2.h4(), v3.h4(), ptr(x4)));
+ TEST_INSTRUCTION("8144DF0C", ld3(v1.h4(), v2.h4(), v3.h4(), ptr_post(x4, 24)));
+ TEST_INSTRUCTION("8144CB0C", ld3(v1.h4(), v2.h4(), v3.h4(), ptr_post(x4, x11)));
+ TEST_INSTRUCTION("8144404C", ld3(v1.h8(), v2.h8(), v3.h8(), ptr(x4)));
+ TEST_INSTRUCTION("8144DF4C", ld3(v1.h8(), v2.h8(), v3.h8(), ptr_post(x4, 48)));
+ TEST_INSTRUCTION("8144CB4C", ld3(v1.h8(), v2.h8(), v3.h8(), ptr_post(x4, x11)));
+ TEST_INSTRUCTION("8148400C", ld3(v1.s2(), v2.s2(), v3.s2(), ptr(x4)));
+ TEST_INSTRUCTION("8148DF0C", ld3(v1.s2(), v2.s2(), v3.s2(), ptr_post(x4, 24)));
+ TEST_INSTRUCTION("8148CB0C", ld3(v1.s2(), v2.s2(), v3.s2(), ptr_post(x4, x11)));
+ TEST_INSTRUCTION("8148404C", ld3(v1.s4(), v2.s4(), v3.s4(), ptr(x4)));
+ TEST_INSTRUCTION("8148DF4C", ld3(v1.s4(), v2.s4(), v3.s4(), ptr_post(x4, 48)));
+ TEST_INSTRUCTION("8148CB4C", ld3(v1.s4(), v2.s4(), v3.s4(), ptr_post(x4, x11)));
+ TEST_INSTRUCTION("814C404C", ld3(v1.d2(), v2.d2(), v3.d2(), ptr(x4)));
+ TEST_INSTRUCTION("814CDF4C", ld3(v1.d2(), v2.d2(), v3.d2(), ptr_post(x4, 48)));
+ TEST_INSTRUCTION("814CCB4C", ld3(v1.d2(), v2.d2(), v3.d2(), ptr_post(x4, x11)));
+ TEST_INSTRUCTION("81E0400D", ld3r(v1.b8(), v2.b8(), v3.b8(), ptr(x4)));
+ TEST_INSTRUCTION("81E0DF0D", ld3r(v1.b8(), v2.b8(), v3.b8(), ptr_post(x4, 3)));
+ TEST_INSTRUCTION("81E0CB0D", ld3r(v1.b8(), v2.b8(), v3.b8(), ptr_post(x4, x11)));
+ TEST_INSTRUCTION("81E0404D", ld3r(v1.b16(), v2.b16(), v3.b16(), ptr(x4)));
+ TEST_INSTRUCTION("81E0DF4D", ld3r(v1.b16(), v2.b16(), v3.b16(), ptr_post(x4, 3)));
+ TEST_INSTRUCTION("81E0CB4D", ld3r(v1.b16(), v2.b16(), v3.b16(), ptr_post(x4, x11)));
+ TEST_INSTRUCTION("81E4400D", ld3r(v1.h4(), v2.h4(), v3.h4(), ptr(x4)));
+ TEST_INSTRUCTION("81E4DF0D", ld3r(v1.h4(), v2.h4(), v3.h4(), ptr_post(x4, 6)));
+ TEST_INSTRUCTION("81E4CB0D", ld3r(v1.h4(), v2.h4(), v3.h4(), ptr_post(x4, x11)));
+ TEST_INSTRUCTION("81E4404D", ld3r(v1.h8(), v2.h8(), v3.h8(), ptr(x4)));
+ TEST_INSTRUCTION("81E4DF4D", ld3r(v1.h8(), v2.h8(), v3.h8(), ptr_post(x4, 6)));
+ TEST_INSTRUCTION("81E4CB4D", ld3r(v1.h8(), v2.h8(), v3.h8(), ptr_post(x4, x11)));
+ TEST_INSTRUCTION("81E8400D", ld3r(v1.s2(), v2.s2(), v3.s2(), ptr(x4)));
+ TEST_INSTRUCTION("81E8DF0D", ld3r(v1.s2(), v2.s2(), v3.s2(), ptr_post(x4, 12)));
+ TEST_INSTRUCTION("81E8CB0D", ld3r(v1.s2(), v2.s2(), v3.s2(), ptr_post(x4, x11)));
+ TEST_INSTRUCTION("81E8404D", ld3r(v1.s4(), v2.s4(), v3.s4(), ptr(x4)));
+ TEST_INSTRUCTION("81E8DF4D", ld3r(v1.s4(), v2.s4(), v3.s4(), ptr_post(x4, 12)));
+ TEST_INSTRUCTION("81E8CB4D", ld3r(v1.s4(), v2.s4(), v3.s4(), ptr_post(x4, x11)));
+ TEST_INSTRUCTION("81EC404D", ld3r(v1.d2(), v2.d2(), v3.d2(), ptr(x4)));
+ TEST_INSTRUCTION("81ECDF4D", ld3r(v1.d2(), v2.d2(), v3.d2(), ptr_post(x4, 24)));
+ TEST_INSTRUCTION("81ECCB4D", ld3r(v1.d2(), v2.d2(), v3.d2(), ptr_post(x4, x11)));
+ TEST_INSTRUCTION("A120600D", ld4(v1.b(0), v2.b(0), v3.b(0), v4.b(0), ptr(x5)));
+ TEST_INSTRUCTION("A120FF0D", ld4(v1.b(0), v2.b(0), v3.b(0), v4.b(0), ptr_post(x5, 4)));
+ TEST_INSTRUCTION("A120EB0D", ld4(v1.b(0), v2.b(0), v3.b(0), v4.b(0), ptr_post(x5, x11)));
+ TEST_INSTRUCTION("A160600D", ld4(v1.h(0), v2.h(0), v3.h(0), v4.h(0), ptr(x5)));
+ TEST_INSTRUCTION("A160FF0D", ld4(v1.h(0), v2.h(0), v3.h(0), v4.h(0), ptr_post(x5, 8)));
+ TEST_INSTRUCTION("A160EB0D", ld4(v1.h(0), v2.h(0), v3.h(0), v4.h(0), ptr_post(x5, x11)));
+ TEST_INSTRUCTION("A1A0600D", ld4(v1.s(0), v2.s(0), v3.s(0), v4.s(0), ptr(x5)));
+ TEST_INSTRUCTION("A1A0FF0D", ld4(v1.s(0), v2.s(0), v3.s(0), v4.s(0), ptr_post(x5, 16)));
+ TEST_INSTRUCTION("A1A0EB0D", ld4(v1.s(0), v2.s(0), v3.s(0), v4.s(0), ptr_post(x5, x11)));
+ TEST_INSTRUCTION("A1A4600D", ld4(v1.d(0), v2.d(0), v3.d(0), v4.d(0), ptr(x5)));
+ TEST_INSTRUCTION("A1A4FF0D", ld4(v1.d(0), v2.d(0), v3.d(0), v4.d(0), ptr_post(x5, 32)));
+ TEST_INSTRUCTION("A1A4EB0D", ld4(v1.d(0), v2.d(0), v3.d(0), v4.d(0), ptr_post(x5, x11)));
+ TEST_INSTRUCTION("A13C604D", ld4(v1.b(15), v2.b(15), v3.b(15), v4.b(15), ptr(x5)));
+ TEST_INSTRUCTION("A13CFF4D", ld4(v1.b(15), v2.b(15), v3.b(15), v4.b(15), ptr_post(x5, 4)));
+ TEST_INSTRUCTION("A13CEB4D", ld4(v1.b(15), v2.b(15), v3.b(15), v4.b(15), ptr_post(x5, x11)));
+ TEST_INSTRUCTION("A178604D", ld4(v1.h(7), v2.h(7), v3.h(7), v4.h(7), ptr(x5)));
+ TEST_INSTRUCTION("A178FF4D", ld4(v1.h(7), v2.h(7), v3.h(7), v4.h(7), ptr_post(x5, 8)));
+ TEST_INSTRUCTION("A178EB4D", ld4(v1.h(7), v2.h(7), v3.h(7), v4.h(7), ptr_post(x5, x11)));
+ TEST_INSTRUCTION("A1B0604D", ld4(v1.s(3), v2.s(3), v3.s(3), v4.s(3), ptr(x5)));
+ TEST_INSTRUCTION("A1B0FF4D", ld4(v1.s(3), v2.s(3), v3.s(3), v4.s(3), ptr_post(x5, 16)));
+ TEST_INSTRUCTION("A1B0EB4D", ld4(v1.s(3), v2.s(3), v3.s(3), v4.s(3), ptr_post(x5, x11)));
+ TEST_INSTRUCTION("A1A4604D", ld4(v1.d(1), v2.d(1), v3.d(1), v4.d(1), ptr(x5)));
+ TEST_INSTRUCTION("A1A4FF4D", ld4(v1.d(1), v2.d(1), v3.d(1), v4.d(1), ptr_post(x5, 32)));
+ TEST_INSTRUCTION("A1A4EB4D", ld4(v1.d(1), v2.d(1), v3.d(1), v4.d(1), ptr_post(x5, x11)));
+ TEST_INSTRUCTION("A100400C", ld4(v1.b8(), v2.b8(), v3.b8(), v4.b8(), ptr(x5)));
+ TEST_INSTRUCTION("A100DF0C", ld4(v1.b8(), v2.b8(), v3.b8(), v4.b8(), ptr_post(x5, 32)));
+ TEST_INSTRUCTION("A100CB0C", ld4(v1.b8(), v2.b8(), v3.b8(), v4.b8(), ptr_post(x5, x11)));
+ TEST_INSTRUCTION("A100404C", ld4(v1.b16(), v2.b16(), v3.b16(), v4.b16(), ptr(x5)));
+ TEST_INSTRUCTION("A100DF4C", ld4(v1.b16(), v2.b16(), v3.b16(), v4.b16(), ptr_post(x5, 64)));
+ TEST_INSTRUCTION("A100CB4C", ld4(v1.b16(), v2.b16(), v3.b16(), v4.b16(), ptr_post(x5, x11)));
+ TEST_INSTRUCTION("A104400C", ld4(v1.h4(), v2.h4(), v3.h4(), v4.h4(), ptr(x5)));
+ TEST_INSTRUCTION("A104DF0C", ld4(v1.h4(), v2.h4(), v3.h4(), v4.h4(), ptr_post(x5, 32)));
+ TEST_INSTRUCTION("A104CB0C", ld4(v1.h4(), v2.h4(), v3.h4(), v4.h4(), ptr_post(x5, x11)));
+ TEST_INSTRUCTION("A104404C", ld4(v1.h8(), v2.h8(), v3.h8(), v4.h8(), ptr(x5)));
+ TEST_INSTRUCTION("A104DF4C", ld4(v1.h8(), v2.h8(), v3.h8(), v4.h8(), ptr_post(x5, 64)));
+ TEST_INSTRUCTION("A104CB4C", ld4(v1.h8(), v2.h8(), v3.h8(), v4.h8(), ptr_post(x5, x11)));
+ TEST_INSTRUCTION("A108400C", ld4(v1.s2(), v2.s2(), v3.s2(), v4.s2(), ptr(x5)));
+ TEST_INSTRUCTION("A108DF0C", ld4(v1.s2(), v2.s2(), v3.s2(), v4.s2(), ptr_post(x5, 32)));
+ TEST_INSTRUCTION("A108CB0C", ld4(v1.s2(), v2.s2(), v3.s2(), v4.s2(), ptr_post(x5, x11)));
+ TEST_INSTRUCTION("A108404C", ld4(v1.s4(), v2.s4(), v3.s4(), v4.s4(), ptr(x5)));
+ TEST_INSTRUCTION("A108DF4C", ld4(v1.s4(), v2.s4(), v3.s4(), v4.s4(), ptr_post(x5, 64)));
+ TEST_INSTRUCTION("A108CB4C", ld4(v1.s4(), v2.s4(), v3.s4(), v4.s4(), ptr_post(x5, x11)));
+ TEST_INSTRUCTION("A10C404C", ld4(v1.d2(), v2.d2(), v3.d2(), v4.d2(), ptr(x5)));
+ TEST_INSTRUCTION("A10CDF4C", ld4(v1.d2(), v2.d2(), v3.d2(), v4.d2(), ptr_post(x5, 64)));
+ TEST_INSTRUCTION("A10CCB4C", ld4(v1.d2(), v2.d2(), v3.d2(), v4.d2(), ptr_post(x5, x11)));
+ TEST_INSTRUCTION("A1E0600D", ld4r(v1.b8(), v2.b8(), v3.b8(), v4.b8(), ptr(x5)));
+ TEST_INSTRUCTION("A1E0FF0D", ld4r(v1.b8(), v2.b8(), v3.b8(), v4.b8(), ptr_post(x5, 4)));
+ TEST_INSTRUCTION("A1E0EB0D", ld4r(v1.b8(), v2.b8(), v3.b8(), v4.b8(), ptr_post(x5, x11)));
+ TEST_INSTRUCTION("A1E0604D", ld4r(v1.b16(), v2.b16(), v3.b16(), v4.b16(), ptr(x5)));
+ TEST_INSTRUCTION("A1E0FF4D", ld4r(v1.b16(), v2.b16(), v3.b16(), v4.b16(), ptr_post(x5, 4)));
+ TEST_INSTRUCTION("A1E0EB4D", ld4r(v1.b16(), v2.b16(), v3.b16(), v4.b16(), ptr_post(x5, x11)));
+ TEST_INSTRUCTION("A1E4600D", ld4r(v1.h4(), v2.h4(), v3.h4(), v4.h4(), ptr(x5)));
+ TEST_INSTRUCTION("A1E4FF0D", ld4r(v1.h4(), v2.h4(), v3.h4(), v4.h4(), ptr_post(x5, 8)));
+ TEST_INSTRUCTION("A1E4EB0D", ld4r(v1.h4(), v2.h4(), v3.h4(), v4.h4(), ptr_post(x5, x11)));
+ TEST_INSTRUCTION("A1E4604D", ld4r(v1.h8(), v2.h8(), v3.h8(), v4.h8(), ptr(x5)));
+ TEST_INSTRUCTION("A1E4FF4D", ld4r(v1.h8(), v2.h8(), v3.h8(), v4.h8(), ptr_post(x5, 8)));
+ TEST_INSTRUCTION("A1E4EB4D", ld4r(v1.h8(), v2.h8(), v3.h8(), v4.h8(), ptr_post(x5, x11)));
+ TEST_INSTRUCTION("A1E8600D", ld4r(v1.s2(), v2.s2(), v3.s2(), v4.s2(), ptr(x5)));
+ TEST_INSTRUCTION("A1E8FF0D", ld4r(v1.s2(), v2.s2(), v3.s2(), v4.s2(), ptr_post(x5, 16)));
+ TEST_INSTRUCTION("A1E8EB0D", ld4r(v1.s2(), v2.s2(), v3.s2(), v4.s2(), ptr_post(x5, x11)));
+ TEST_INSTRUCTION("A1E8604D", ld4r(v1.s4(), v2.s4(), v3.s4(), v4.s4(), ptr(x5)));
+ TEST_INSTRUCTION("A1E8FF4D", ld4r(v1.s4(), v2.s4(), v3.s4(), v4.s4(), ptr_post(x5, 16)));
+ TEST_INSTRUCTION("A1E8EB4D", ld4r(v1.s4(), v2.s4(), v3.s4(), v4.s4(), ptr_post(x5, x11)));
+ TEST_INSTRUCTION("A1EC604D", ld4r(v1.d2(), v2.d2(), v3.d2(), v4.d2(), ptr(x5)));
+ TEST_INSTRUCTION("A1ECFF4D", ld4r(v1.d2(), v2.d2(), v3.d2(), v4.d2(), ptr_post(x5, 32)));
+ TEST_INSTRUCTION("A1ECEB4D", ld4r(v1.d2(), v2.d2(), v3.d2(), v4.d2(), ptr_post(x5, x11)));
+ TEST_INSTRUCTION("8109402C", ldnp(s1, s2, ptr(x12)));
+ TEST_INSTRUCTION("8189402C", ldnp(s1, s2, ptr(x12, 4)));
+ TEST_INSTRUCTION("8109702C", ldnp(s1, s2, ptr(x12, -128)));
+ TEST_INSTRUCTION("E10B402C", ldnp(s1, s2, ptr(sp)));
+ TEST_INSTRUCTION("E18B402C", ldnp(s1, s2, ptr(sp, 4)));
+ TEST_INSTRUCTION("E10B502C", ldnp(s1, s2, ptr(sp, 128)));
+ TEST_INSTRUCTION("8109406C", ldnp(d1, d2, ptr(x12)));
+ TEST_INSTRUCTION("8189406C", ldnp(d1, d2, ptr(x12, 8)));
+ TEST_INSTRUCTION("8109786C", ldnp(d1, d2, ptr(x12, -128)));
+ TEST_INSTRUCTION("E10B406C", ldnp(d1, d2, ptr(sp)));
+ TEST_INSTRUCTION("E18B406C", ldnp(d1, d2, ptr(sp, 8)));
+ TEST_INSTRUCTION("E10B486C", ldnp(d1, d2, ptr(sp, 128)));
+ TEST_INSTRUCTION("810940AC", ldnp(q1, q2, ptr(x12)));
+ TEST_INSTRUCTION("818940AC", ldnp(q1, q2, ptr(x12, 16)));
+ TEST_INSTRUCTION("81097CAC", ldnp(q1, q2, ptr(x12, -128)));
+ TEST_INSTRUCTION("E10B40AC", ldnp(q1, q2, ptr(sp)));
+ TEST_INSTRUCTION("E18B40AC", ldnp(q1, q2, ptr(sp, 16)));
+ TEST_INSTRUCTION("E10B44AC", ldnp(q1, q2, ptr(sp, 128)));
+ TEST_INSTRUCTION("8109402D", ldp(s1, s2, ptr(x12)));
+ TEST_INSTRUCTION("8189402D", ldp(s1, s2, ptr(x12, 4)));
+ TEST_INSTRUCTION("8109702D", ldp(s1, s2, ptr(x12, -128)));
+ TEST_INSTRUCTION("8189C02D", ldp(s1, s2, ptr_pre(x12, 4)));
+ TEST_INSTRUCTION("8189C02C", ldp(s1, s2, ptr_post(x12, 4)));
+ TEST_INSTRUCTION("E10B402D", ldp(s1, s2, ptr(sp)));
+ TEST_INSTRUCTION("E18B402D", ldp(s1, s2, ptr(sp, 4)));
+ TEST_INSTRUCTION("E10B502D", ldp(s1, s2, ptr(sp, 128)));
+ TEST_INSTRUCTION("E18BC02C", ldp(s1, s2, ptr_post(sp, 4)));
+ TEST_INSTRUCTION("E18BC02D", ldp(s1, s2, ptr_pre(sp, 4)));
+ TEST_INSTRUCTION("8109406D", ldp(d1, d2, ptr(x12)));
+ TEST_INSTRUCTION("8189406D", ldp(d1, d2, ptr(x12, 8)));
+ TEST_INSTRUCTION("8109786D", ldp(d1, d2, ptr(x12, -128)));
+ TEST_INSTRUCTION("8189C06D", ldp(d1, d2, ptr_pre(x12, 8)));
+ TEST_INSTRUCTION("8189C06C", ldp(d1, d2, ptr_post(x12, 8)));
+ TEST_INSTRUCTION("E10B406D", ldp(d1, d2, ptr(sp)));
+ TEST_INSTRUCTION("E18B406D", ldp(d1, d2, ptr(sp, 8)));
+ TEST_INSTRUCTION("E10B486D", ldp(d1, d2, ptr(sp, 128)));
+ TEST_INSTRUCTION("E18BC06D", ldp(d1, d2, ptr_pre(sp, 8)));
+ TEST_INSTRUCTION("E18BC06C", ldp(d1, d2, ptr_post(sp, 8)));
+ TEST_INSTRUCTION("810940AD", ldp(q1, q2, ptr(x12)));
+ TEST_INSTRUCTION("818940AD", ldp(q1, q2, ptr(x12, 16)));
+ TEST_INSTRUCTION("81097CAD", ldp(q1, q2, ptr(x12, -128)));
+ TEST_INSTRUCTION("8189C0AD", ldp(q1, q2, ptr_pre(x12, 16)));
+ TEST_INSTRUCTION("8189C0AC", ldp(q1, q2, ptr_post(x12, 16)));
+ TEST_INSTRUCTION("E10B40AD", ldp(q1, q2, ptr(sp)));
+ TEST_INSTRUCTION("E18B40AD", ldp(q1, q2, ptr(sp, 16)));
+ TEST_INSTRUCTION("E10B44AD", ldp(q1, q2, ptr(sp, 128)));
+ TEST_INSTRUCTION("E18BC0AD", ldp(q1, q2, ptr_pre(sp, 16)));
+ TEST_INSTRUCTION("E18BC0AC", ldp(q1, q2, ptr_post(sp, 16)));
+ TEST_INSTRUCTION("4100403D", ldr(b1, ptr(x2)));
+ TEST_INSTRUCTION("4114403C", ldr(b1, ptr_post(x2, 1)));
+ TEST_INSTRUCTION("4104403D", ldr(b1, ptr(x2, 1)));
+ TEST_INSTRUCTION("411C403C", ldr(b1, ptr_pre(x2, 1)));
+ TEST_INSTRUCTION("4114483C", ldr(b1, ptr_post(x2, 129)));
+ TEST_INSTRUCTION("4100407D", ldr(h1, ptr(x2)));
+ TEST_INSTRUCTION("4124407C", ldr(h1, ptr_post(x2, 2)));
+ TEST_INSTRUCTION("4104407D", ldr(h1, ptr(x2, 2)));
+ TEST_INSTRUCTION("412C407C", ldr(h1, ptr_pre(x2, 2)));
+ TEST_INSTRUCTION("4124487C", ldr(h1, ptr_post(x2, 130)));
+ TEST_INSTRUCTION("410040BD", ldr(s1, ptr(x2)));
+ TEST_INSTRUCTION("414440BC", ldr(s1, ptr_post(x2, 4)));
+ TEST_INSTRUCTION("410440BD", ldr(s1, ptr(x2, 4)));
+ TEST_INSTRUCTION("414C40BC", ldr(s1, ptr_pre(x2, 4)));
+ TEST_INSTRUCTION("414448BC", ldr(s1, ptr_post(x2, 132)));
+ TEST_INSTRUCTION("410040FD", ldr(d1, ptr(x2)));
+ TEST_INSTRUCTION("418440FC", ldr(d1, ptr_post(x2, 8)));
+ TEST_INSTRUCTION("410440FD", ldr(d1, ptr(x2, 8)));
+ TEST_INSTRUCTION("418C40FC", ldr(d1, ptr_pre(x2, 8)));
+ TEST_INSTRUCTION("414448FC", ldr(d1, ptr_post(x2, 132)));
+ TEST_INSTRUCTION("4168633C", ldr(b1, ptr(x2, x3)));
+ TEST_INSTRUCTION("4148633C", ldr(b1, ptr(x2, w3, uxtw(0))));
+ TEST_INSTRUCTION("41C8633C", ldr(b1, ptr(x2, w3, sxtw(0))));
+ TEST_INSTRUCTION("4168637C", ldr(h1, ptr(x2, x3)));
+ TEST_INSTRUCTION("4178637C", ldr(h1, ptr(x2, x3, lsl(1))));
+ TEST_INSTRUCTION("4148637C", ldr(h1, ptr(x2, w3, uxtw(0))));
+ TEST_INSTRUCTION("4158637C", ldr(h1, ptr(x2, w3, uxtw(1))));
+ TEST_INSTRUCTION("41C8637C", ldr(h1, ptr(x2, w3, sxtw(0))));
+ TEST_INSTRUCTION("41D8637C", ldr(h1, ptr(x2, w3, sxtw(1))));
+ TEST_INSTRUCTION("416863BC", ldr(s1, ptr(x2, x3)));
+ TEST_INSTRUCTION("417863BC", ldr(s1, ptr(x2, x3, lsl(2))));
+ TEST_INSTRUCTION("414863BC", ldr(s1, ptr(x2, w3, uxtw(0))));
+ TEST_INSTRUCTION("415863BC", ldr(s1, ptr(x2, w3, uxtw(2))));
+ TEST_INSTRUCTION("41C863BC", ldr(s1, ptr(x2, w3, sxtw(0))));
+ TEST_INSTRUCTION("41D863BC", ldr(s1, ptr(x2, w3, sxtw(2))));
+ TEST_INSTRUCTION("416863FC", ldr(d1, ptr(x2, x3)));
+ TEST_INSTRUCTION("417863FC", ldr(d1, ptr(x2, x3, lsl(3))));
+ TEST_INSTRUCTION("414863FC", ldr(d1, ptr(x2, w3, uxtw(0))));
+ TEST_INSTRUCTION("415863FC", ldr(d1, ptr(x2, w3, uxtw(3))));
+ TEST_INSTRUCTION("41C863FC", ldr(d1, ptr(x2, w3, sxtw(0))));
+ TEST_INSTRUCTION("41D863FC", ldr(d1, ptr(x2, w3, sxtw(3))));
+ TEST_INSTRUCTION("4104403D", ldr(b1, ptr(x2, 1)));
+ TEST_INSTRUCTION("41F05F3C", ldr(b1, ptr(x2, -1))); // LDUR
+ TEST_INSTRUCTION("4110407C", ldr(h1, ptr(x2, 1))); // LDUR
+ TEST_INSTRUCTION("41F05F7C", ldr(h1, ptr(x2, -1))); // LDUR
+ TEST_INSTRUCTION("411040BC", ldr(s1, ptr(x2, 1))); // LDUR
+ TEST_INSTRUCTION("41F05FBC", ldr(s1, ptr(x2, -1))); // LDUR
+ TEST_INSTRUCTION("411040FC", ldr(d1, ptr(x2, 1))); // LDUR
+ TEST_INSTRUCTION("41F05FFC", ldr(d1, ptr(x2, -1))); // LDUR
+ TEST_INSTRUCTION("8101403C", ldur(b1, ptr(x12)));
+ TEST_INSTRUCTION("8131403C", ldur(b1, ptr(x12, 3)));
+ TEST_INSTRUCTION("8131463C", ldur(b1, ptr(x12, 99)));
+ TEST_INSTRUCTION("81F14F3C", ldur(b1, ptr(x12, 255)));
+ TEST_INSTRUCTION("8101503C", ldur(b1, ptr(x12, -256)));
+ TEST_INSTRUCTION("E103403C", ldur(b1, ptr(sp)));
+ TEST_INSTRUCTION("E153483C", ldur(b1, ptr(sp, 133)));
+ TEST_INSTRUCTION("8101407C", ldur(h1, ptr(x12)));
+ TEST_INSTRUCTION("8131407C", ldur(h1, ptr(x12, 3)));
+ TEST_INSTRUCTION("8131467C", ldur(h1, ptr(x12, 99)));
+ TEST_INSTRUCTION("81F14F7C", ldur(h1, ptr(x12, 255)));
+ TEST_INSTRUCTION("8101507C", ldur(h1, ptr(x12, -256)));
+ TEST_INSTRUCTION("E103407C", ldur(h1, ptr(sp)));
+ TEST_INSTRUCTION("E153487C", ldur(h1, ptr(sp, 133)));
+ TEST_INSTRUCTION("810140BC", ldur(s1, ptr(x12)));
+ TEST_INSTRUCTION("813140BC", ldur(s1, ptr(x12, 3)));
+ TEST_INSTRUCTION("813146BC", ldur(s1, ptr(x12, 99)));
+ TEST_INSTRUCTION("81F14FBC", ldur(s1, ptr(x12, 255)));
+ TEST_INSTRUCTION("810150BC", ldur(s1, ptr(x12, -256)));
+ TEST_INSTRUCTION("E10340BC", ldur(s1, ptr(sp)));
+ TEST_INSTRUCTION("E15348BC", ldur(s1, ptr(sp, 133)));
+ TEST_INSTRUCTION("810140FC", ldur(d1, ptr(x12)));
+ TEST_INSTRUCTION("813140FC", ldur(d1, ptr(x12, 3)));
+ TEST_INSTRUCTION("813146FC", ldur(d1, ptr(x12, 99)));
+ TEST_INSTRUCTION("81F14FFC", ldur(d1, ptr(x12, 255)));
+ TEST_INSTRUCTION("810150FC", ldur(d1, ptr(x12, -256)));
+ TEST_INSTRUCTION("E10340FC", ldur(d1, ptr(sp)));
+ TEST_INSTRUCTION("E15348FC", ldur(d1, ptr(sp, 133)));
+ TEST_INSTRUCTION("8101C03C", ldur(q1, ptr(x12)));
+ TEST_INSTRUCTION("8131C03C", ldur(q1, ptr(x12, 3)));
+ TEST_INSTRUCTION("8131C63C", ldur(q1, ptr(x12, 99)));
+ TEST_INSTRUCTION("81F1CF3C", ldur(q1, ptr(x12, 255)));
+ TEST_INSTRUCTION("8101D03C", ldur(q1, ptr(x12, -256)));
+ TEST_INSTRUCTION("E103C03C", ldur(q1, ptr(sp)));
+ TEST_INSTRUCTION("E153C83C", ldur(q1, ptr(sp, 133)));
+ TEST_INSTRUCTION("4194230E", mla(v1.b8(), v2.b8(), v3.b8()));
+ TEST_INSTRUCTION("4194630E", mla(v1.h4(), v2.h4(), v3.h4()));
+ TEST_INSTRUCTION("4194A30E", mla(v1.s2(), v2.s2(), v3.s2()));
+ TEST_INSTRUCTION("4194234E", mla(v1.b16(), v2.b16(), v3.b16()));
+ TEST_INSTRUCTION("4194634E", mla(v1.h8(), v2.h8(), v3.h8()));
+ TEST_INSTRUCTION("4194A34E", mla(v1.s4(), v2.s4(), v3.s4()));
+ TEST_INSTRUCTION("4100432F", mla(v1.h4(), v2.h4(), v3.h(0)));
+ TEST_INSTRUCTION("4100532F", mla(v1.h4(), v2.h4(), v3.h(1)));
+ TEST_INSTRUCTION("4100632F", mla(v1.h4(), v2.h4(), v3.h(2)));
+ TEST_INSTRUCTION("4100732F", mla(v1.h4(), v2.h4(), v3.h(3)));
+ TEST_INSTRUCTION("4108436F", mla(v1.h8(), v2.h8(), v3.h(4)));
+ TEST_INSTRUCTION("4108536F", mla(v1.h8(), v2.h8(), v3.h(5)));
+ TEST_INSTRUCTION("4108636F", mla(v1.h8(), v2.h8(), v3.h(6)));
+ TEST_INSTRUCTION("4108736F", mla(v1.h8(), v2.h8(), v3.h(7)));
+ TEST_INSTRUCTION("4100832F", mla(v1.s2(), v2.s2(), v3.s(0)));
+ TEST_INSTRUCTION("4100A32F", mla(v1.s2(), v2.s2(), v3.s(1)));
+ TEST_INSTRUCTION("4108836F", mla(v1.s4(), v2.s4(), v3.s(2)));
+ TEST_INSTRUCTION("4108A36F", mla(v1.s4(), v2.s4(), v3.s(3)));
+ TEST_INSTRUCTION("4194232E", mls(v1.b8(), v2.b8(), v3.b8()));
+ TEST_INSTRUCTION("4194632E", mls(v1.h4(), v2.h4(), v3.h4()));
+ TEST_INSTRUCTION("4194A32E", mls(v1.s2(), v2.s2(), v3.s2()));
+ TEST_INSTRUCTION("4194236E", mls(v1.b16(), v2.b16(), v3.b16()));
+ TEST_INSTRUCTION("4194636E", mls(v1.h8(), v2.h8(), v3.h8()));
+ TEST_INSTRUCTION("4194A36E", mls(v1.s4(), v2.s4(), v3.s4()));
+ TEST_INSTRUCTION("4140432F", mls(v1.h4(), v2.h4(), v3.h(0)));
+ TEST_INSTRUCTION("4140532F", mls(v1.h4(), v2.h4(), v3.h(1)));
+ TEST_INSTRUCTION("4140632F", mls(v1.h4(), v2.h4(), v3.h(2)));
+ TEST_INSTRUCTION("4140732F", mls(v1.h4(), v2.h4(), v3.h(3)));
+ TEST_INSTRUCTION("4148436F", mls(v1.h8(), v2.h8(), v3.h(4)));
+ TEST_INSTRUCTION("4148536F", mls(v1.h8(), v2.h8(), v3.h(5)));
+ TEST_INSTRUCTION("4148636F", mls(v1.h8(), v2.h8(), v3.h(6)));
+ TEST_INSTRUCTION("4148736F", mls(v1.h8(), v2.h8(), v3.h(7)));
+ TEST_INSTRUCTION("4140832F", mls(v1.s2(), v2.s2(), v3.s(0)));
+ TEST_INSTRUCTION("4140A32F", mls(v1.s2(), v2.s2(), v3.s(1)));
+ TEST_INSTRUCTION("4148836F", mls(v1.s4(), v2.s4(), v3.s(2)));
+ TEST_INSTRUCTION("4148A36F", mls(v1.s4(), v2.s4(), v3.s(3)));
+ TEST_INSTRUCTION("4F04035E", mov(b15, v2.b(1)));
+ TEST_INSTRUCTION("4F04065E", mov(h15, v2.h(1)));
+ TEST_INSTRUCTION("4F040C5E", mov(s15, v2.s(1)));
+ TEST_INSTRUCTION("4F04185E", mov(d15, v2.d(1)));
+ TEST_INSTRUCTION("411C014E", mov(v1.b(0), w2));
+ TEST_INSTRUCTION("411C074E", mov(v1.b(3), w2));
+ TEST_INSTRUCTION("411C0D4E", mov(v1.b(6), w2));
+ TEST_INSTRUCTION("411C134E", mov(v1.b(9), w2));
+ TEST_INSTRUCTION("411C1F4E", mov(v1.b(15), w2));
+ TEST_INSTRUCTION("411C024E", mov(v1.h(0), w2));
+ TEST_INSTRUCTION("411C0E4E", mov(v1.h(3), w2));
+ TEST_INSTRUCTION("411C1E4E", mov(v1.h(7), w2));
+ TEST_INSTRUCTION("411C044E", mov(v1.s(0), w2));
+ TEST_INSTRUCTION("411C0C4E", mov(v1.s(1), w2));
+ TEST_INSTRUCTION("411C144E", mov(v1.s(2), w2));
+ TEST_INSTRUCTION("411C1C4E", mov(v1.s(3), w2));
+ TEST_INSTRUCTION("411C084E", mov(v1.d(0), x2));
+ TEST_INSTRUCTION("411C184E", mov(v1.d(1), x2));
+ TEST_INSTRUCTION("417C016E", mov(v1.b(0), v2.b(15)));
+ TEST_INSTRUCTION("4174036E", mov(v1.b(1), v2.b(14)));
+ TEST_INSTRUCTION("4174026E", mov(v1.h(0), v2.h(7)));
+ TEST_INSTRUCTION("4164066E", mov(v1.h(1), v2.h(6)));
+ TEST_INSTRUCTION("4164046E", mov(v1.s(0), v2.s(3)));
+ TEST_INSTRUCTION("41440C6E", mov(v1.s(1), v2.s(2)));
+ TEST_INSTRUCTION("4144086E", mov(v1.d(0), v2.d(1)));
+ TEST_INSTRUCTION("4104186E", mov(v1.d(1), v2.d(0)));
+ TEST_INSTRUCTION("41E5010F", movi(v1.b8(), 42));
+ TEST_INSTRUCTION("4185010F", movi(v1.h4(), 42));
+ TEST_INSTRUCTION("4105010F", movi(v1.s2(), 42));
+ TEST_INSTRUCTION("C1E5022F", movi(d1, 0x00FF0000FFFFFF00u));
+ TEST_INSTRUCTION("41E5014F", movi(v1.b16(), 42));
+ TEST_INSTRUCTION("4185014F", movi(v1.h8(), 42));
+ TEST_INSTRUCTION("4105014F", movi(v1.s4(), 42));
+ TEST_INSTRUCTION("E167074F", movi(v1.s4(), 0xFF, lsl(24)));
+ TEST_INSTRUCTION("E1D7074F", movi(v1.s4(), 0xFF, msl(16)));
+ TEST_INSTRUCTION("C1E5026F", movi(v1.d2(), 0x00FF0000FFFFFF00u));
+ TEST_INSTRUCTION("419C230E", mul(v1.b8(), v2.b8(), v3.b8()));
+ TEST_INSTRUCTION("419C630E", mul(v1.h4(), v2.h4(), v3.h4()));
+ TEST_INSTRUCTION("419CA30E", mul(v1.s2(), v2.s2(), v3.s2()));
+ TEST_INSTRUCTION("419C234E", mul(v1.b16(), v2.b16(), v3.b16()));
+ TEST_INSTRUCTION("419C634E", mul(v1.h8(), v2.h8(), v3.h8()));
+ TEST_INSTRUCTION("419CA34E", mul(v1.s4(), v2.s4(), v3.s4()));
+ TEST_INSTRUCTION("4158202E", mvn(v1.b8(), v2.b8()));
+ TEST_INSTRUCTION("4158206E", mvn(v1.b16(), v2.b16()));
+ TEST_INSTRUCTION("4185012F", mvni(v1.h4(), 42));
+ TEST_INSTRUCTION("4105012F", mvni(v1.s2(), 42));
+ TEST_INSTRUCTION("4185016F", mvni(v1.h8(), 42));
+ TEST_INSTRUCTION("4105016F", mvni(v1.s4(), 42));
+ TEST_INSTRUCTION("41B8202E", neg(v1.b8(), v2.b8()));
+ TEST_INSTRUCTION("41B8602E", neg(v1.h4(), v2.h4()));
+ TEST_INSTRUCTION("41B8A02E", neg(v1.s2(), v2.s2()));
+ TEST_INSTRUCTION("41B8E07E", neg(d1, d2));
+ TEST_INSTRUCTION("41B8206E", neg(v1.b16(), v2.b16()));
+ TEST_INSTRUCTION("41B8606E", neg(v1.h8(), v2.h8()));
+ TEST_INSTRUCTION("41B8A06E", neg(v1.s4(), v2.s4()));
+ TEST_INSTRUCTION("41B8E06E", neg(v1.d2(), v2.d2()));
+ TEST_INSTRUCTION("4158202E", not_(v1.b8(), v2.b8()));
+ TEST_INSTRUCTION("4158206E", not_(v1.b16(), v2.b16()));
+ TEST_INSTRUCTION("411CE30E", orn(v1.b8(), v2.b8(), v3.b8()));
+ TEST_INSTRUCTION("411CE34E", orn(v1.b16(), v2.b16(), v3.b16()));
+ TEST_INSTRUCTION("411CA30E", orr(v1.b8(), v2.b8(), v3.b8()));
+ TEST_INSTRUCTION("411CA34E", orr(v1.b16(), v2.b16(), v3.b16()));
+ TEST_INSTRUCTION("E197070F", orr(v1.h4(), 255));
+ TEST_INSTRUCTION("E1B7070F", orr(v1.h4(), 255, lsl(8)));
+ TEST_INSTRUCTION("E197074F", orr(v1.h8(), 255));
+ TEST_INSTRUCTION("E1B7074F", orr(v1.h8(), 255, lsl(8)));
+ TEST_INSTRUCTION("E117070F", orr(v1.s2(), 255));
+ TEST_INSTRUCTION("E137070F", orr(v1.s2(), 255, lsl(8)));
+ TEST_INSTRUCTION("E117074F", orr(v1.s4(), 255));
+ TEST_INSTRUCTION("E177074F", orr(v1.s4(), 255, lsl(24)));
+ TEST_INSTRUCTION("419C232E", pmul(v1.b8(), v2.b8(), v3.b8()));
+ TEST_INSTRUCTION("419C236E", pmul(v1.b16(), v2.b16(), v3.b16()));
+ TEST_INSTRUCTION("41E0230E", pmull(v1.h8(), v2.b8(), v3.b8()));
+ TEST_INSTRUCTION("41E0E30E", pmull(q1, d2, d3));
+ TEST_INSTRUCTION("41E0234E", pmull2(v1.h8(), v2.b16(), v3.b16()));
+ TEST_INSTRUCTION("41E0E34E", pmull2(q1, v2.d2(), v3.d2()));
+ TEST_INSTRUCTION("4140232E", raddhn(v1.b8(), v2.h8(), v3.h8()));
+ TEST_INSTRUCTION("4140632E", raddhn(v1.h4(), v2.s4(), v3.s4()));
+ TEST_INSTRUCTION("4140A32E", raddhn(v1.s2(), v2.d2(), v3.d2()));
+ TEST_INSTRUCTION("4140236E", raddhn2(v1.b16(), v2.h8(), v3.h8()));
+ TEST_INSTRUCTION("4140636E", raddhn2(v1.h8(), v2.s4(), v3.s4()));
+ TEST_INSTRUCTION("4140A36E", raddhn2(v1.s4(), v2.d2(), v3.d2()));
+ TEST_INSTRUCTION("418C63CE", rax1(v1.d2(), v2.d2(), v3.d2()));
+ TEST_INSTRUCTION("4158602E", rbit(v1.b8(), v2.b8()));
+ TEST_INSTRUCTION("4158606E", rbit(v1.b16(), v2.b16()));
+ TEST_INSTRUCTION("4118200E", rev16(v1.b8(), v2.b8()));
+ TEST_INSTRUCTION("4118204E", rev16(v1.b16(), v2.b16()));
+ TEST_INSTRUCTION("4108202E", rev32(v1.b8(), v2.b8()));
+ TEST_INSTRUCTION("4108206E", rev32(v1.b16(), v2.b16()));
+ TEST_INSTRUCTION("4108602E", rev32(v1.h4(), v2.h4()));
+ TEST_INSTRUCTION("4108606E", rev32(v1.h8(), v2.h8()));
+ TEST_INSTRUCTION("4108200E", rev64(v1.b8(), v2.b8()));
+ TEST_INSTRUCTION("4108204E", rev64(v1.b16(), v2.b16()));
+ TEST_INSTRUCTION("4108600E", rev64(v1.h4(), v2.h4()));
+ TEST_INSTRUCTION("4108604E", rev64(v1.h8(), v2.h8()));
+ TEST_INSTRUCTION("4108A00E", rev64(v1.s2(), v2.s2()));
+ TEST_INSTRUCTION("4108A04E", rev64(v1.s4(), v2.s4()));
+ TEST_INSTRUCTION("418C090F", rshrn(v1.b8(), v2.h8(), 7));
+ TEST_INSTRUCTION("418C110F", rshrn(v1.h4(), v2.s4(), 15));
+ TEST_INSTRUCTION("418C210F", rshrn(v1.s2(), v2.d2(), 31));
+ TEST_INSTRUCTION("418C094F", rshrn2(v1.b16(), v2.h8(), 7));
+ TEST_INSTRUCTION("418C114F", rshrn2(v1.h8(), v2.s4(), 15));
+ TEST_INSTRUCTION("418C214F", rshrn2(v1.s4(), v2.d2(), 31));
+ TEST_INSTRUCTION("4160232E", rsubhn(v1.b8(), v2.h8(), v3.h8()));
+ TEST_INSTRUCTION("4160632E", rsubhn(v1.h4(), v2.s4(), v3.s4()));
+ TEST_INSTRUCTION("4160A32E", rsubhn(v1.s2(), v2.d2(), v3.d2()));
+ TEST_INSTRUCTION("4160236E", rsubhn2(v1.b16(), v2.h8(), v3.h8()));
+ TEST_INSTRUCTION("4160636E", rsubhn2(v1.h8(), v2.s4(), v3.s4()));
+ TEST_INSTRUCTION("4160A36E", rsubhn2(v1.s4(), v2.d2(), v3.d2()));
+ TEST_INSTRUCTION("417C230E", saba(v1.b8(), v2.b8(), v3.b8()));
+ TEST_INSTRUCTION("417C630E", saba(v1.h4(), v2.h4(), v3.h4()));
+ TEST_INSTRUCTION("417CA30E", saba(v1.s2(), v2.s2(), v3.s2()));
+ TEST_INSTRUCTION("417C234E", saba(v1.b16(), v2.b16(), v3.b16()));
+ TEST_INSTRUCTION("417C634E", saba(v1.h8(), v2.h8(), v3.h8()));
+ TEST_INSTRUCTION("417CA34E", saba(v1.s4(), v2.s4(), v3.s4()));
+ TEST_INSTRUCTION("4150230E", sabal(v1.h8(), v2.b8(), v3.b8()));
+ TEST_INSTRUCTION("4150630E", sabal(v1.s4(), v2.h4(), v3.h4()));
+ TEST_INSTRUCTION("4150A30E", sabal(v1.d2(), v2.s2(), v3.s2()));
+ TEST_INSTRUCTION("4150234E", sabal2(v1.h8(), v2.b16(), v3.b16()));
+ TEST_INSTRUCTION("4150634E", sabal2(v1.s4(), v2.h8(), v3.h8()));
+ TEST_INSTRUCTION("4150A34E", sabal2(v1.d2(), v2.s4(), v3.s4()));
+ TEST_INSTRUCTION("4174230E", sabd(v1.b8(), v2.b8(), v3.b8()));
+ TEST_INSTRUCTION("4174630E", sabd(v1.h4(), v2.h4(), v3.h4()));
+ TEST_INSTRUCTION("4174A30E", sabd(v1.s2(), v2.s2(), v3.s2()));
+ TEST_INSTRUCTION("4174234E", sabd(v1.b16(), v2.b16(), v3.b16()));
+ TEST_INSTRUCTION("4174634E", sabd(v1.h8(), v2.h8(), v3.h8()));
+ TEST_INSTRUCTION("4174A34E", sabd(v1.s4(), v2.s4(), v3.s4()));
+ TEST_INSTRUCTION("4170230E", sabdl(v1.h8(), v2.b8(), v3.b8()));
+ TEST_INSTRUCTION("4170630E", sabdl(v1.s4(), v2.h4(), v3.h4()));
+ TEST_INSTRUCTION("4170A30E", sabdl(v1.d2(), v2.s2(), v3.s2()));
+ TEST_INSTRUCTION("4170234E", sabdl2(v1.h8(), v2.b16(), v3.b16()));
+ TEST_INSTRUCTION("4170634E", sabdl2(v1.s4(), v2.h8(), v3.h8()));
+ TEST_INSTRUCTION("4170A34E", sabdl2(v1.d2(), v2.s4(), v3.s4()));
+ TEST_INSTRUCTION("4168200E", sadalp(v1.h4(), v2.b8()));
+ TEST_INSTRUCTION("4168600E", sadalp(v1.s2(), v2.h4()));
+ TEST_INSTRUCTION("4168A00E", sadalp(d1, v2.s2()));
+ TEST_INSTRUCTION("4168204E", sadalp(v1.h8(), v2.b16()));
+ TEST_INSTRUCTION("4168604E", sadalp(v1.s4(), v2.h8()));
+ TEST_INSTRUCTION("4168A04E", sadalp(v1.d2(), v2.s4()));
+ TEST_INSTRUCTION("4100230E", saddl(v1.h8(), v2.b8(), v3.b8()));
+ TEST_INSTRUCTION("4100630E", saddl(v1.s4(), v2.h4(), v3.h4()));
+ TEST_INSTRUCTION("4100A30E", saddl(v1.d2(), v2.s2(), v3.s2()));
+ TEST_INSTRUCTION("4100234E", saddl2(v1.h8(), v2.b16(), v3.b16()));
+ TEST_INSTRUCTION("4100634E", saddl2(v1.s4(), v2.h8(), v3.h8()));
+ TEST_INSTRUCTION("4100A34E", saddl2(v1.d2(), v2.s4(), v3.s4()));
+ TEST_INSTRUCTION("4128200E", saddlp(v1.h4(), v2.b8()));
+ TEST_INSTRUCTION("4128600E", saddlp(v1.s2(), v2.h4()));
+ TEST_INSTRUCTION("4128A00E", saddlp(d1, v2.s2()));
+ TEST_INSTRUCTION("4128204E", saddlp(v1.h8(), v2.b16()));
+ TEST_INSTRUCTION("4128604E", saddlp(v1.s4(), v2.h8()));
+ TEST_INSTRUCTION("4128A04E", saddlp(v1.d2(), v2.s4()));
+ TEST_INSTRUCTION("4138300E", saddlv(h1, v2.b8()));
+ TEST_INSTRUCTION("4138304E", saddlv(h1, v2.b16()));
+ TEST_INSTRUCTION("4138700E", saddlv(s1, v2.h4()));
+ TEST_INSTRUCTION("4138704E", saddlv(s1, v2.h8()));
+ TEST_INSTRUCTION("4138B04E", saddlv(d1, v2.s4()));
+ TEST_INSTRUCTION("4110230E", saddw(v1.h8(), v2.h8(), v3.b8()));
+ TEST_INSTRUCTION("4110630E", saddw(v1.s4(), v2.s4(), v3.h4()));
+ TEST_INSTRUCTION("4110A30E", saddw(v1.d2(), v2.d2(), v3.s2()));
+ TEST_INSTRUCTION("4110234E", saddw2(v1.h8(), v2.h8(), v3.b16()));
+ TEST_INSTRUCTION("4110634E", saddw2(v1.s4(), v2.s4(), v3.h8()));
+ TEST_INSTRUCTION("4110A34E", saddw2(v1.d2(), v2.d2(), v3.s4()));
+ TEST_INSTRUCTION("4100E21E", scvtf(h1, w2));
+ TEST_INSTRUCTION("4100221E", scvtf(s1, w2));
+ TEST_INSTRUCTION("4100621E", scvtf(d1, w2));
+ TEST_INSTRUCTION("4100E29E", scvtf(h1, x2));
+ TEST_INSTRUCTION("4100229E", scvtf(s1, x2));
+ TEST_INSTRUCTION("4100629E", scvtf(d1, x2));
+ TEST_INSTRUCTION("41D8795E", scvtf(h1, h2));
+ TEST_INSTRUCTION("41D8215E", scvtf(s1, s2));
+ TEST_INSTRUCTION("41D8615E", scvtf(d1, d2));
+ TEST_INSTRUCTION("41D8790E", scvtf(v1.h4(), v2.h4()));
+ TEST_INSTRUCTION("41D8210E", scvtf(v1.s2(), v2.s2()));
+ TEST_INSTRUCTION("41D8794E", scvtf(v1.h8(), v2.h8()));
+ TEST_INSTRUCTION("41D8214E", scvtf(v1.s4(), v2.s4()));
+ TEST_INSTRUCTION("41D8614E", scvtf(v1.d2(), v2.d2()));
+ TEST_INSTRUCTION("41E0C21E", scvtf(h1, w2, 8));
+ TEST_INSTRUCTION("41E0021E", scvtf(s1, w2, 8));
+ TEST_INSTRUCTION("41E0421E", scvtf(d1, w2, 8));
+ TEST_INSTRUCTION("41E0C29E", scvtf(h1, x2, 8));
+ TEST_INSTRUCTION("41E0029E", scvtf(s1, x2, 8));
+ TEST_INSTRUCTION("41E0429E", scvtf(d1, x2, 8));
+ TEST_INSTRUCTION("41E4185F", scvtf(h1, h2, 8));
+ TEST_INSTRUCTION("41E4385F", scvtf(s1, s2, 8));
+ TEST_INSTRUCTION("41E4785F", scvtf(d1, d2, 8));
+ TEST_INSTRUCTION("41E4180F", scvtf(v1.h4(), v2.h4(), 8));
+ TEST_INSTRUCTION("41E4380F", scvtf(v1.s2(), v2.s2(), 8));
+ TEST_INSTRUCTION("41E4184F", scvtf(v1.h8(), v2.h8(), 8));
+ TEST_INSTRUCTION("41E4384F", scvtf(v1.s4(), v2.s4(), 8));
+ TEST_INSTRUCTION("41E4784F", scvtf(v1.d2(), v2.d2(), 8));
+ TEST_INSTRUCTION("4194830E", sdot(v1.s2(), v2.b8(), v3.b8()));
+ TEST_INSTRUCTION("4194834E", sdot(v1.s4(), v2.b16(), v3.b16()));
+ TEST_INSTRUCTION("41E0830F", sdot(v1.s2(), v2.b8(), v3.b4(0)));
+ TEST_INSTRUCTION("41E0A30F", sdot(v1.s2(), v2.b8(), v3.b4(1)));
+ TEST_INSTRUCTION("41E8830F", sdot(v1.s2(), v2.b8(), v3.b4(2)));
+ TEST_INSTRUCTION("41E8A30F", sdot(v1.s2(), v2.b8(), v3.b4(3)));
+ TEST_INSTRUCTION("41E0834F", sdot(v1.s4(), v2.b16(), v3.b4(0)));
+ TEST_INSTRUCTION("41E0A34F", sdot(v1.s4(), v2.b16(), v3.b4(1)));
+ TEST_INSTRUCTION("41E8834F", sdot(v1.s4(), v2.b16(), v3.b4(2)));
+ TEST_INSTRUCTION("41E8A34F", sdot(v1.s4(), v2.b16(), v3.b4(3)));
+ TEST_INSTRUCTION("4100035E", sha1c(q1, s2, v3.s4()));
+ TEST_INSTRUCTION("4108285E", sha1h(s1, s2));
+ TEST_INSTRUCTION("4120035E", sha1m(q1, s2, v3.s4()));
+ TEST_INSTRUCTION("4110035E", sha1p(q1, s2, v3.s4()));
+ TEST_INSTRUCTION("4130035E", sha1su0(v1.s4(), v2.s4(), v3.s4()));
+ TEST_INSTRUCTION("4118285E", sha1su1(v1.s4(), v2.s4()));
+ TEST_INSTRUCTION("4140035E", sha256h(q1, q2, v3.s4()));
+ TEST_INSTRUCTION("4150035E", sha256h2(q1, q2, v3.s4()));
+ TEST_INSTRUCTION("4128285E", sha256su0(v1.s4(), v2.s4()));
+ TEST_INSTRUCTION("4160035E", sha256su1(v1.s4(), v2.s4(), v3.s4()));
+ TEST_INSTRUCTION("4104230E", shadd(v1.b8(), v2.b8(), v3.b8()));
+ TEST_INSTRUCTION("4104630E", shadd(v1.h4(), v2.h4(), v3.h4()));
+ TEST_INSTRUCTION("4104A30E", shadd(v1.s2(), v2.s2(), v3.s2()));
+ TEST_INSTRUCTION("4104234E", shadd(v1.b16(), v2.b16(), v3.b16()));
+ TEST_INSTRUCTION("4104634E", shadd(v1.h8(), v2.h8(), v3.h8()));
+ TEST_INSTRUCTION("4104A34E", shadd(v1.s4(), v2.s4(), v3.s4()));
+ TEST_INSTRUCTION("41540F0F", shl(v1.b8(), v2.b8(), 7));
+ TEST_INSTRUCTION("41541F0F", shl(v1.h4(), v2.h4(), 15));
+ TEST_INSTRUCTION("41543F0F", shl(v1.s2(), v2.s2(), 31));
+ TEST_INSTRUCTION("41547F5F", shl(d1, d2, 63));
+ TEST_INSTRUCTION("41540F4F", shl(v1.b16(), v2.b16(), 7));
+ TEST_INSTRUCTION("41541F4F", shl(v1.h8(), v2.h8(), 15));
+ TEST_INSTRUCTION("41543F4F", shl(v1.s4(), v2.s4(), 31));
+ TEST_INSTRUCTION("41547F4F", shl(v1.d2(), v2.d2(), 63));
+ TEST_INSTRUCTION("4138212E", shll(v1.h8(), v2.b8(), 8));
+ TEST_INSTRUCTION("4138612E", shll(v1.s4(), v2.h4(), 16));
+ TEST_INSTRUCTION("4138A12E", shll(v1.d2(), v2.s2(), 32));
+ TEST_INSTRUCTION("4138216E", shll2(v1.h8(), v2.b16(), 8));
+ TEST_INSTRUCTION("4138616E", shll2(v1.s4(), v2.h8(), 16));
+ TEST_INSTRUCTION("4138A16E", shll2(v1.d2(), v2.s4(), 32));
+ TEST_INSTRUCTION("4184090F", shrn(v1.b8(), v2.h8(), 7));
+ TEST_INSTRUCTION("4184110F", shrn(v1.h4(), v2.s4(), 15));
+ TEST_INSTRUCTION("4184210F", shrn(v1.s2(), v2.d2(), 31));
+ TEST_INSTRUCTION("4184094F", shrn2(v1.b16(), v2.h8(), 7));
+ TEST_INSTRUCTION("4184114F", shrn2(v1.h8(), v2.s4(), 15));
+ TEST_INSTRUCTION("4184214F", shrn2(v1.s4(), v2.d2(), 31));
+ TEST_INSTRUCTION("4124230E", shsub(v1.b8(), v2.b8(), v3.b8()));
+ TEST_INSTRUCTION("4124630E", shsub(v1.h4(), v2.h4(), v3.h4()));
+ TEST_INSTRUCTION("4124A30E", shsub(v1.s2(), v2.s2(), v3.s2()));
+ TEST_INSTRUCTION("4124234E", shsub(v1.b16(), v2.b16(), v3.b16()));
+ TEST_INSTRUCTION("4124634E", shsub(v1.h8(), v2.h8(), v3.h8()));
+ TEST_INSTRUCTION("4124A34E", shsub(v1.s4(), v2.s4(), v3.s4()));
+ TEST_INSTRUCTION("41540F2F", sli(v1.b8(), v2.b8(), 7));
+ TEST_INSTRUCTION("41541F2F", sli(v1.h4(), v2.h4(), 15));
+ TEST_INSTRUCTION("41543F2F", sli(v1.s2(), v2.s2(), 31));
+ TEST_INSTRUCTION("41547F7F", sli(d1, d2, 63));
+ TEST_INSTRUCTION("41540F6F", sli(v1.b16(), v2.b16(), 7));
+ TEST_INSTRUCTION("41541F6F", sli(v1.h8(), v2.h8(), 15));
+ TEST_INSTRUCTION("41543F6F", sli(v1.s4(), v2.s4(), 31));
+ TEST_INSTRUCTION("41547F6F", sli(v1.d2(), v2.d2(), 63));
+ TEST_INSTRUCTION("41C063CE", sm3partw1(v1.s4(), v2.s4(), v3.s4()));
+ TEST_INSTRUCTION("41C463CE", sm3partw2(v1.s4(), v2.s4(), v3.s4()));
+ TEST_INSTRUCTION("411043CE", sm3ss1(v1.s4(), v2.s4(), v3.s4(), v4.s4()));
+ TEST_INSTRUCTION("418044CE", sm3tt1a(v1.s4(), v2.s4(), v4.s(0)));
+ TEST_INSTRUCTION("41B044CE", sm3tt1a(v1.s4(), v2.s4(), v4.s(3)));
+ TEST_INSTRUCTION("418444CE", sm3tt1b(v1.s4(), v2.s4(), v4.s(0)));
+ TEST_INSTRUCTION("41B444CE", sm3tt1b(v1.s4(), v2.s4(), v4.s(3)));
+ TEST_INSTRUCTION("418844CE", sm3tt2a(v1.s4(), v2.s4(), v4.s(0)));
+ TEST_INSTRUCTION("41B844CE", sm3tt2a(v1.s4(), v2.s4(), v4.s(3)));
+ TEST_INSTRUCTION("418C44CE", sm3tt2b(v1.s4(), v2.s4(), v4.s(0)));
+ TEST_INSTRUCTION("41BC44CE", sm3tt2b(v1.s4(), v2.s4(), v4.s(3)));
+ TEST_INSTRUCTION("4184C0CE", sm4e(v1.s4(), v2.s4()));
+ TEST_INSTRUCTION("41C863CE", sm4ekey(v1.s4(), v2.s4(), v3.s4()));
+ TEST_INSTRUCTION("4164230E", smax(v1.b8(), v2.b8(), v3.b8()));
+ TEST_INSTRUCTION("4164630E", smax(v1.h4(), v2.h4(), v3.h4()));
+ TEST_INSTRUCTION("4164A30E", smax(v1.s2(), v2.s2(), v3.s2()));
+ TEST_INSTRUCTION("4164234E", smax(v1.b16(), v2.b16(), v3.b16()));
+ TEST_INSTRUCTION("4164634E", smax(v1.h8(), v2.h8(), v3.h8()));
+ TEST_INSTRUCTION("4164A34E", smax(v1.s4(), v2.s4(), v3.s4()));
+ TEST_INSTRUCTION("41A4230E", smaxp(v1.b8(), v2.b8(), v3.b8()));
+ TEST_INSTRUCTION("41A4630E", smaxp(v1.h4(), v2.h4(), v3.h4()));
+ TEST_INSTRUCTION("41A4A30E", smaxp(v1.s2(), v2.s2(), v3.s2()));
+ TEST_INSTRUCTION("41A4234E", smaxp(v1.b16(), v2.b16(), v3.b16()));
+ TEST_INSTRUCTION("41A4634E", smaxp(v1.h8(), v2.h8(), v3.h8()));
+ TEST_INSTRUCTION("41A4A34E", smaxp(v1.s4(), v2.s4(), v3.s4()));
+ TEST_INSTRUCTION("41A8300E", smaxv(b1, v2.b8()));
+ TEST_INSTRUCTION("41A8304E", smaxv(b1, v2.b16()));
+ TEST_INSTRUCTION("41A8700E", smaxv(h1, v2.h4()));
+ TEST_INSTRUCTION("41A8704E", smaxv(h1, v2.h8()));
+ TEST_INSTRUCTION("41A8B04E", smaxv(s1, v2.s4()));
+ TEST_INSTRUCTION("416C230E", smin(v1.b8(), v2.b8(), v3.b8()));
+ TEST_INSTRUCTION("416C630E", smin(v1.h4(), v2.h4(), v3.h4()));
+ TEST_INSTRUCTION("416CA30E", smin(v1.s2(), v2.s2(), v3.s2()));
+ TEST_INSTRUCTION("416C234E", smin(v1.b16(), v2.b16(), v3.b16()));
+ TEST_INSTRUCTION("416C634E", smin(v1.h8(), v2.h8(), v3.h8()));
+ TEST_INSTRUCTION("416CA34E", smin(v1.s4(), v2.s4(), v3.s4()));
+ TEST_INSTRUCTION("41AC230E", sminp(v1.b8(), v2.b8(), v3.b8()));
+ TEST_INSTRUCTION("41AC630E", sminp(v1.h4(), v2.h4(), v3.h4()));
+ TEST_INSTRUCTION("41ACA30E", sminp(v1.s2(), v2.s2(), v3.s2()));
+ TEST_INSTRUCTION("41AC234E", sminp(v1.b16(), v2.b16(), v3.b16()));
+ TEST_INSTRUCTION("41AC634E", sminp(v1.h8(), v2.h8(), v3.h8()));
+ TEST_INSTRUCTION("41ACA34E", sminp(v1.s4(), v2.s4(), v3.s4()));
+ TEST_INSTRUCTION("41A8310E", sminv(b1, v2.b8()));
+ TEST_INSTRUCTION("41A8314E", sminv(b1, v2.b16()));
+ TEST_INSTRUCTION("41A8710E", sminv(h1, v2.h4()));
+ TEST_INSTRUCTION("41A8714E", sminv(h1, v2.h8()));
+ TEST_INSTRUCTION("41A8B14E", sminv(s1, v2.s4()));
+ TEST_INSTRUCTION("4180230E", smlal(v1.h8(), v2.b8(), v3.b8()));
+ TEST_INSTRUCTION("4180630E", smlal(v1.s4(), v2.h4(), v3.h4()));
+ TEST_INSTRUCTION("4180A30E", smlal(v1.d2(), v2.s2(), v3.s2()));
+ TEST_INSTRUCTION("4120730F", smlal(v1.s4(), v2.h4(), v3.h(3)));
+ TEST_INSTRUCTION("4128A30F", smlal(v1.d2(), v2.s2(), v3.s(3)));
+ TEST_INSTRUCTION("4180234E", smlal2(v1.h8(), v2.b16(), v3.b16()));
+ TEST_INSTRUCTION("4180634E", smlal2(v1.s4(), v2.h8(), v3.h8()));
+ TEST_INSTRUCTION("4180A34E", smlal2(v1.d2(), v2.s4(), v3.s4()));
+ TEST_INSTRUCTION("4120734F", smlal2(v1.s4(), v2.h8(), v3.h(3)));
+ TEST_INSTRUCTION("4128A34F", smlal2(v1.d2(), v2.s4(), v3.s(3)));
+ TEST_INSTRUCTION("41A0230E", smlsl(v1.h8(), v2.b8(), v3.b8()));
+ TEST_INSTRUCTION("41A0630E", smlsl(v1.s4(), v2.h4(), v3.h4()));
+ TEST_INSTRUCTION("41A0A30E", smlsl(v1.d2(), v2.s2(), v3.s2()));
+ TEST_INSTRUCTION("4160730F", smlsl(v1.s4(), v2.h4(), v3.h(3)));
+ TEST_INSTRUCTION("4168A30F", smlsl(v1.d2(), v2.s2(), v3.s(3)));
+ TEST_INSTRUCTION("41A0234E", smlsl2(v1.h8(), v2.b16(), v3.b16()));
+ TEST_INSTRUCTION("41A0634E", smlsl2(v1.s4(), v2.h8(), v3.h8()));
+ TEST_INSTRUCTION("41A0A34E", smlsl2(v1.d2(), v2.s4(), v3.s4()));
+ TEST_INSTRUCTION("4160734F", smlsl2(v1.s4(), v2.h8(), v3.h(3)));
+ TEST_INSTRUCTION("4168A34F", smlsl2(v1.d2(), v2.s4(), v3.s(3)));
+ TEST_INSTRUCTION("41A4834E", smmla(v1.s4(), v2.b16(), v3.b16()));
+ TEST_INSTRUCTION("412C010E", smov(w1, v2.b(0)));
+ TEST_INSTRUCTION("412C1F0E", smov(w1, v2.b(15)));
+ TEST_INSTRUCTION("412C020E", smov(w1, v2.h(0)));
+ TEST_INSTRUCTION("412C1E0E", smov(w1, v2.h(7)));
+ TEST_INSTRUCTION("412C014E", smov(x1, v2.b(0)));
+ TEST_INSTRUCTION("412C1F4E", smov(x1, v2.b(15)));
+ TEST_INSTRUCTION("412C024E", smov(x1, v2.h(0)));
+ TEST_INSTRUCTION("412C1E4E", smov(x1, v2.h(7)));
+ TEST_INSTRUCTION("412C044E", smov(x1, v2.s(0)));
+ TEST_INSTRUCTION("412C1C4E", smov(x1, v2.s(3)));
+ TEST_INSTRUCTION("41C0230E", smull(v1.h8(), v2.b8(), v3.b8()));
+ TEST_INSTRUCTION("41C0630E", smull(v1.s4(), v2.h4(), v3.h4()));
+ TEST_INSTRUCTION("41C0A30E", smull(v1.d2(), v2.s2(), v3.s2()));
+ TEST_INSTRUCTION("41A0730F", smull(v1.s4(), v2.h4(), v3.h(3)));
+ TEST_INSTRUCTION("41A8A30F", smull(v1.d2(), v2.s2(), v3.s(3)));
+ TEST_INSTRUCTION("41C0234E", smull2(v1.h8(), v2.b16(), v3.b16()));
+ TEST_INSTRUCTION("41C0634E", smull2(v1.s4(), v2.h8(), v3.h8()));
+ TEST_INSTRUCTION("41C0A34E", smull2(v1.d2(), v2.s4(), v3.s4()));
+ TEST_INSTRUCTION("41A0734F", smull2(v1.s4(), v2.h8(), v3.h(3)));
+ TEST_INSTRUCTION("41A8A34F", smull2(v1.d2(), v2.s4(), v3.s(3)));
+ TEST_INSTRUCTION("4178205E", sqabs(b1, b2));
+ TEST_INSTRUCTION("4178605E", sqabs(h1, h2));
+ TEST_INSTRUCTION("4178A05E", sqabs(s1, s2));
+ TEST_INSTRUCTION("4178E05E", sqabs(d1, d2));
+ TEST_INSTRUCTION("4178200E", sqabs(v1.b8(), v2.b8()));
+ TEST_INSTRUCTION("4178600E", sqabs(v1.h4(), v2.h4()));
+ TEST_INSTRUCTION("4178A00E", sqabs(v1.s2(), v2.s2()));
+ TEST_INSTRUCTION("4178204E", sqabs(v1.b16(), v2.b16()));
+ TEST_INSTRUCTION("4178604E", sqabs(v1.h8(), v2.h8()));
+ TEST_INSTRUCTION("4178A04E", sqabs(v1.s4(), v2.s4()));
+ TEST_INSTRUCTION("4178E04E", sqabs(v1.d2(), v2.d2()));
+ TEST_INSTRUCTION("410C235E", sqadd(b1, b2, b3));
+ TEST_INSTRUCTION("410C635E", sqadd(h1, h2, h3));
+ TEST_INSTRUCTION("410CA35E", sqadd(s1, s2, s3));
+ TEST_INSTRUCTION("410CE35E", sqadd(d1, d2, d3));
+ TEST_INSTRUCTION("410C230E", sqadd(v1.b8(), v2.b8(), v3.b8()));
+ TEST_INSTRUCTION("410C630E", sqadd(v1.h4(), v2.h4(), v3.h4()));
+ TEST_INSTRUCTION("410CA30E", sqadd(v1.s2(), v2.s2(), v3.s2()));
+ TEST_INSTRUCTION("410C234E", sqadd(v1.b16(), v2.b16(), v3.b16()));
+ TEST_INSTRUCTION("410C634E", sqadd(v1.h8(), v2.h8(), v3.h8()));
+ TEST_INSTRUCTION("410CA34E", sqadd(v1.s4(), v2.s4(), v3.s4()));
+ TEST_INSTRUCTION("410CE34E", sqadd(v1.d2(), v2.d2(), v3.d2()));
+ TEST_INSTRUCTION("4190635E", sqdmlal(s1, h2, h3));
+ TEST_INSTRUCTION("4190A35E", sqdmlal(d1, s2, s3));
+ TEST_INSTRUCTION("4190630E", sqdmlal(v1.s4(), v2.h4(), v3.h4()));
+ TEST_INSTRUCTION("4190A30E", sqdmlal(v1.d2(), v2.s2(), v3.s2()));
+ TEST_INSTRUCTION("4130730F", sqdmlal(v1.s4(), v2.h4(), v3.h(3)));
+ TEST_INSTRUCTION("4138A30F", sqdmlal(v1.d2(), v2.s2(), v3.s(3)));
+ TEST_INSTRUCTION("4190634E", sqdmlal2(v1.s4(), v2.h8(), v3.h8()));
+ TEST_INSTRUCTION("4190A34E", sqdmlal2(v1.d2(), v2.s4(), v3.s4()));
+ TEST_INSTRUCTION("4130734F", sqdmlal2(v1.s4(), v2.h8(), v3.h(3)));
+ TEST_INSTRUCTION("4138A34F", sqdmlal2(v1.d2(), v2.s4(), v3.s(3)));
+ TEST_INSTRUCTION("41B0635E", sqdmlsl(s1, h2, h3));
+ TEST_INSTRUCTION("41B0A35E", sqdmlsl(d1, s2, s3));
+ TEST_INSTRUCTION("41B0630E", sqdmlsl(v1.s4(), v2.h4(), v3.h4()));
+ TEST_INSTRUCTION("41B0A30E", sqdmlsl(v1.d2(), v2.s2(), v3.s2()));
+ TEST_INSTRUCTION("4170730F", sqdmlsl(v1.s4(), v2.h4(), v3.h(3)));
+ TEST_INSTRUCTION("4178A30F", sqdmlsl(v1.d2(), v2.s2(), v3.s(3)));
+ TEST_INSTRUCTION("41B0634E", sqdmlsl2(v1.s4(), v2.h8(), v3.h8()));
+ TEST_INSTRUCTION("41B0A34E", sqdmlsl2(v1.d2(), v2.s4(), v3.s4()));
+ TEST_INSTRUCTION("4170734F", sqdmlsl2(v1.s4(), v2.h8(), v3.h(3)));
+ TEST_INSTRUCTION("4178A34F", sqdmlsl2(v1.d2(), v2.s4(), v3.s(3)));
+ TEST_INSTRUCTION("41B4635E", sqdmulh(h1, h2, h3));
+ TEST_INSTRUCTION("41B4A35E", sqdmulh(s1, s2, s3));
+ TEST_INSTRUCTION("41B4630E", sqdmulh(v1.h4(), v2.h4(), v3.h4()));
+ TEST_INSTRUCTION("41B4A30E", sqdmulh(v1.s2(), v2.s2(), v3.s2()));
+ TEST_INSTRUCTION("41B4634E", sqdmulh(v1.h8(), v2.h8(), v3.h8()));
+ TEST_INSTRUCTION("41B4A34E", sqdmulh(v1.s4(), v2.s4(), v3.s4()));
+ TEST_INSTRUCTION("41C0730F", sqdmulh(v1.h4(), v2.h4(), v3.h(3)));
+ TEST_INSTRUCTION("41C8A30F", sqdmulh(v1.s2(), v2.s2(), v3.s(3)));
+ TEST_INSTRUCTION("41C0734F", sqdmulh(v1.h8(), v2.h8(), v3.h(3)));
+ TEST_INSTRUCTION("41C8A34F", sqdmulh(v1.s4(), v2.s4(), v3.s(3)));
+ TEST_INSTRUCTION("41D0635E", sqdmull(s1, h2, h3));
+ TEST_INSTRUCTION("41D0A35E", sqdmull(d1, s2, s3));
+ TEST_INSTRUCTION("41D0630E", sqdmull(v1.s4(), v2.h4(), v3.h4()));
+ TEST_INSTRUCTION("41D0A30E", sqdmull(v1.d2(), v2.s2(), v3.s2()));
+ TEST_INSTRUCTION("41B0730F", sqdmull(v1.s4(), v2.h4(), v3.h(3)));
+ TEST_INSTRUCTION("41B8A30F", sqdmull(v1.d2(), v2.s2(), v3.s(3)));
+ TEST_INSTRUCTION("41D0634E", sqdmull2(v1.s4(), v2.h8(), v3.h8()));
+ TEST_INSTRUCTION("41D0A34E", sqdmull2(v1.d2(), v2.s4(), v3.s4()));
+ TEST_INSTRUCTION("41B0734F", sqdmull2(v1.s4(), v2.h8(), v3.h(3)));
+ TEST_INSTRUCTION("41B8A34F", sqdmull2(v1.d2(), v2.s4(), v3.s(3)));
+ TEST_INSTRUCTION("4178207E", sqneg(b1, b2));
+ TEST_INSTRUCTION("4178607E", sqneg(h1, h2));
+ TEST_INSTRUCTION("4178A07E", sqneg(s1, s2));
+ TEST_INSTRUCTION("4178E07E", sqneg(d1, d2));
+ TEST_INSTRUCTION("4178202E", sqneg(v1.b8(), v2.b8()));
+ TEST_INSTRUCTION("4178602E", sqneg(v1.h4(), v2.h4()));
+ TEST_INSTRUCTION("4178A02E", sqneg(v1.s2(), v2.s2()));
+ TEST_INSTRUCTION("4178206E", sqneg(v1.b16(), v2.b16()));
+ TEST_INSTRUCTION("4178606E", sqneg(v1.h8(), v2.h8()));
+ TEST_INSTRUCTION("4178A06E", sqneg(v1.s4(), v2.s4()));
+ TEST_INSTRUCTION("4178E06E", sqneg(v1.d2(), v2.d2()));
+ TEST_INSTRUCTION("4184437E", sqrdmlah(h1, h2, h3));
+ TEST_INSTRUCTION("4184837E", sqrdmlah(s1, s2, s3));
+ TEST_INSTRUCTION("4184432E", sqrdmlah(v1.h4(), v2.h4(), v3.h4()));
+ TEST_INSTRUCTION("4184832E", sqrdmlah(v1.s2(), v2.s2(), v3.s2()));
+ TEST_INSTRUCTION("41D0732F", sqrdmlah(v1.h4(), v2.h4(), v3.h(3)));
+ TEST_INSTRUCTION("41D8A32F", sqrdmlah(v1.s2(), v2.s2(), v3.s(3)));
+ TEST_INSTRUCTION("4184436E", sqrdmlah(v1.h8(), v2.h8(), v3.h8()));
+ TEST_INSTRUCTION("4184836E", sqrdmlah(v1.s4(), v2.s4(), v3.s4()));
+ TEST_INSTRUCTION("41D0736F", sqrdmlah(v1.h8(), v2.h8(), v3.h(3)));
+ TEST_INSTRUCTION("41D8A36F", sqrdmlah(v1.s4(), v2.s4(), v3.s(3)));
+ TEST_INSTRUCTION("418C437E", sqrdmlsh(h1, h2, h3));
+ TEST_INSTRUCTION("418C837E", sqrdmlsh(s1, s2, s3));
+ TEST_INSTRUCTION("418C432E", sqrdmlsh(v1.h4(), v2.h4(), v3.h4()));
+ TEST_INSTRUCTION("418C832E", sqrdmlsh(v1.s2(), v2.s2(), v3.s2()));
+ TEST_INSTRUCTION("41F0732F", sqrdmlsh(v1.h4(), v2.h4(), v3.h(3)));
+ TEST_INSTRUCTION("41F8A32F", sqrdmlsh(v1.s2(), v2.s2(), v3.s(3)));
+ TEST_INSTRUCTION("418C436E", sqrdmlsh(v1.h8(), v2.h8(), v3.h8()));
+ TEST_INSTRUCTION("418C836E", sqrdmlsh(v1.s4(), v2.s4(), v3.s4()));
+ TEST_INSTRUCTION("41F0736F", sqrdmlsh(v1.h8(), v2.h8(), v3.h(3)));
+ TEST_INSTRUCTION("41F8A36F", sqrdmlsh(v1.s4(), v2.s4(), v3.s(3)));
+ TEST_INSTRUCTION("41B4637E", sqrdmulh(h1, h2, h3));
+ TEST_INSTRUCTION("41B4A37E", sqrdmulh(s1, s2, s3));
+ TEST_INSTRUCTION("41B4632E", sqrdmulh(v1.h4(), v2.h4(), v3.h4()));
+ TEST_INSTRUCTION("41B4A32E", sqrdmulh(v1.s2(), v2.s2(), v3.s2()));
+ TEST_INSTRUCTION("41D0730F", sqrdmulh(v1.h4(), v2.h4(), v3.h(3)));
+ TEST_INSTRUCTION("41D8A30F", sqrdmulh(v1.s2(), v2.s2(), v3.s(3)));
+ TEST_INSTRUCTION("41B4636E", sqrdmulh(v1.h8(), v2.h8(), v3.h8()));
+ TEST_INSTRUCTION("41B4A36E", sqrdmulh(v1.s4(), v2.s4(), v3.s4()));
+ TEST_INSTRUCTION("41D0734F", sqrdmulh(v1.h8(), v2.h8(), v3.h(3)));
+ TEST_INSTRUCTION("41D8A34F", sqrdmulh(v1.s4(), v2.s4(), v3.s(3)));
+ TEST_INSTRUCTION("415C235E", sqrshl(b1, b2, b3));
+ TEST_INSTRUCTION("415C635E", sqrshl(h1, h2, h3));
+ TEST_INSTRUCTION("415CA35E", sqrshl(s1, s2, s3));
+ TEST_INSTRUCTION("415C230E", sqrshl(v1.b8(), v2.b8(), v3.b8()));
+ TEST_INSTRUCTION("415C630E", sqrshl(v1.h4(), v2.h4(), v3.h4()));
+ TEST_INSTRUCTION("415CA30E", sqrshl(v1.s2(), v2.s2(), v3.s2()));
+ TEST_INSTRUCTION("415CE35E", sqrshl(d1, d2, d3));
+ TEST_INSTRUCTION("415C234E", sqrshl(v1.b16(), v2.b16(), v3.b16()));
+ TEST_INSTRUCTION("415C634E", sqrshl(v1.h8(), v2.h8(), v3.h8()));
+ TEST_INSTRUCTION("415CA34E", sqrshl(v1.s4(), v2.s4(), v3.s4()));
+ TEST_INSTRUCTION("415CE34E", sqrshl(v1.d2(), v2.d2(), v3.d2()));
+ TEST_INSTRUCTION("419C085F", sqrshrn(b1, h2, 8));
+ TEST_INSTRUCTION("419C105F", sqrshrn(h1, s2, 16));
+ TEST_INSTRUCTION("419C205F", sqrshrn(s1, d2, 32));
+ TEST_INSTRUCTION("419C080F", sqrshrn(v1.b8(), v2.h8(), 8));
+ TEST_INSTRUCTION("419C100F", sqrshrn(v1.h4(), v2.s4(), 16));
+ TEST_INSTRUCTION("419C200F", sqrshrn(v1.s2(), v2.d2(), 32));
+ TEST_INSTRUCTION("419C084F", sqrshrn2(v1.b16(), v2.h8(), 8));
+ TEST_INSTRUCTION("419C104F", sqrshrn2(v1.h8(), v2.s4(), 16));
+ TEST_INSTRUCTION("419C204F", sqrshrn2(v1.s4(), v2.d2(), 32));
+ TEST_INSTRUCTION("418C087F", sqrshrun(b1, h2, 8));
+ TEST_INSTRUCTION("418C107F", sqrshrun(h1, s2, 16));
+ TEST_INSTRUCTION("418C207F", sqrshrun(s1, d2, 32));
+ TEST_INSTRUCTION("418C082F", sqrshrun(v1.b8(), v2.h8(), 8));
+ TEST_INSTRUCTION("418C102F", sqrshrun(v1.h4(), v2.s4(), 16));
+ TEST_INSTRUCTION("418C202F", sqrshrun(v1.s2(), v2.d2(), 32));
+ TEST_INSTRUCTION("418C086F", sqrshrun2(v1.b16(), v2.h8(), 8));
+ TEST_INSTRUCTION("418C106F", sqrshrun2(v1.h8(), v2.s4(), 16));
+ TEST_INSTRUCTION("418C206F", sqrshrun2(v1.s4(), v2.d2(), 32));
+ TEST_INSTRUCTION("4174095F", sqshl(b1, b2, 1));
+ TEST_INSTRUCTION("4174125F", sqshl(h1, h2, 2));
+ TEST_INSTRUCTION("4174235F", sqshl(s1, s2, 3));
+ TEST_INSTRUCTION("41740F0F", sqshl(v1.b8(), v2.b8(), 7));
+ TEST_INSTRUCTION("41741F0F", sqshl(v1.h4(), v2.h4(), 15));
+ TEST_INSTRUCTION("41743F0F", sqshl(v1.s2(), v2.s2(), 31));
+ TEST_INSTRUCTION("41747F5F", sqshl(d1, d2, 63));
+ TEST_INSTRUCTION("41740F4F", sqshl(v1.b16(), v2.b16(), 7));
+ TEST_INSTRUCTION("41741F4F", sqshl(v1.h8(), v2.h8(), 15));
+ TEST_INSTRUCTION("41743F4F", sqshl(v1.s4(), v2.s4(), 31));
+ TEST_INSTRUCTION("41747F4F", sqshl(v1.d2(), v2.d2(), 63));
+ TEST_INSTRUCTION("414C235E", sqshl(b1, b2, b3));
+ TEST_INSTRUCTION("414C635E", sqshl(h1, h2, h3));
+ TEST_INSTRUCTION("414CA35E", sqshl(s1, s2, s3));
+ TEST_INSTRUCTION("414C230E", sqshl(v1.b8(), v2.b8(), v3.b8()));
+ TEST_INSTRUCTION("414C630E", sqshl(v1.h4(), v2.h4(), v3.h4()));
+ TEST_INSTRUCTION("414CA30E", sqshl(v1.s2(), v2.s2(), v3.s2()));
+ TEST_INSTRUCTION("414CE35E", sqshl(d1, d2, d3));
+ TEST_INSTRUCTION("414C234E", sqshl(v1.b16(), v2.b16(), v3.b16()));
+ TEST_INSTRUCTION("414C634E", sqshl(v1.h8(), v2.h8(), v3.h8()));
+ TEST_INSTRUCTION("414CA34E", sqshl(v1.s4(), v2.s4(), v3.s4()));
+ TEST_INSTRUCTION("414CE34E", sqshl(v1.d2(), v2.d2(), v3.d2()));
+ TEST_INSTRUCTION("4164097F", sqshlu(b1, b2, 1));
+ TEST_INSTRUCTION("4164127F", sqshlu(h1, h2, 2));
+ TEST_INSTRUCTION("4164237F", sqshlu(s1, s2, 3));
+ TEST_INSTRUCTION("41640F2F", sqshlu(v1.b8(), v2.b8(), 7));
+ TEST_INSTRUCTION("41641F2F", sqshlu(v1.h4(), v2.h4(), 15));
+ TEST_INSTRUCTION("41643F2F", sqshlu(v1.s2(), v2.s2(), 31));
+ TEST_INSTRUCTION("41647F7F", sqshlu(d1, d2, 63));
+ TEST_INSTRUCTION("41640F6F", sqshlu(v1.b16(), v2.b16(), 7));
+ TEST_INSTRUCTION("41641F6F", sqshlu(v1.h8(), v2.h8(), 15));
+ TEST_INSTRUCTION("41643F6F", sqshlu(v1.s4(), v2.s4(), 31));
+ TEST_INSTRUCTION("41647F6F", sqshlu(v1.d2(), v2.d2(), 63));
+ TEST_INSTRUCTION("4194085F", sqshrn(b1, h2, 8));
+ TEST_INSTRUCTION("4194105F", sqshrn(h1, s2, 16));
+ TEST_INSTRUCTION("4194205F", sqshrn(s1, d2, 32));
+ TEST_INSTRUCTION("4194080F", sqshrn(v1.b8(), v2.h8(), 8));
+ TEST_INSTRUCTION("4194100F", sqshrn(v1.h4(), v2.s4(), 16));
+ TEST_INSTRUCTION("4194200F", sqshrn(v1.s2(), v2.d2(), 32));
+ TEST_INSTRUCTION("4194084F", sqshrn2(v1.b16(), v2.h8(), 8));
+ TEST_INSTRUCTION("4194104F", sqshrn2(v1.h8(), v2.s4(), 16));
+ TEST_INSTRUCTION("4194204F", sqshrn2(v1.s4(), v2.d2(), 32));
+ TEST_INSTRUCTION("4184087F", sqshrun(b1, h2, 8));
+ TEST_INSTRUCTION("4184107F", sqshrun(h1, s2, 16));
+ TEST_INSTRUCTION("4184207F", sqshrun(s1, d2, 32));
+ TEST_INSTRUCTION("4184082F", sqshrun(v1.b8(), v2.h8(), 8));
+ TEST_INSTRUCTION("4184102F", sqshrun(v1.h4(), v2.s4(), 16));
+ TEST_INSTRUCTION("4184202F", sqshrun(v1.s2(), v2.d2(), 32));
+ TEST_INSTRUCTION("4184086F", sqshrun2(v1.b16(), v2.h8(), 8));
+ TEST_INSTRUCTION("4184106F", sqshrun2(v1.h8(), v2.s4(), 16));
+ TEST_INSTRUCTION("4184206F", sqshrun2(v1.s4(), v2.d2(), 32));
+ TEST_INSTRUCTION("412C235E", sqsub(b1, b2, b3));
+ TEST_INSTRUCTION("412C635E", sqsub(h1, h2, h3));
+ TEST_INSTRUCTION("412CA35E", sqsub(s1, s2, s3));
+ TEST_INSTRUCTION("412CE35E", sqsub(d1, d2, d3));
+ TEST_INSTRUCTION("412C230E", sqsub(v1.b8(), v2.b8(), v3.b8()));
+ TEST_INSTRUCTION("412C630E", sqsub(v1.h4(), v2.h4(), v3.h4()));
+ TEST_INSTRUCTION("412CA30E", sqsub(v1.s2(), v2.s2(), v3.s2()));
+ TEST_INSTRUCTION("412C234E", sqsub(v1.b16(), v2.b16(), v3.b16()));
+ TEST_INSTRUCTION("412C634E", sqsub(v1.h8(), v2.h8(), v3.h8()));
+ TEST_INSTRUCTION("412CA34E", sqsub(v1.s4(), v2.s4(), v3.s4()));
+ TEST_INSTRUCTION("412CE34E", sqsub(v1.d2(), v2.d2(), v3.d2()));
+ TEST_INSTRUCTION("4148215E", sqxtn(b1, h2));
+ TEST_INSTRUCTION("4148615E", sqxtn(h1, s2));
+ TEST_INSTRUCTION("4148A15E", sqxtn(s1, d2));
+ TEST_INSTRUCTION("4148210E", sqxtn(v1.b8(), v2.h8()));
+ TEST_INSTRUCTION("4148610E", sqxtn(v1.h4(), v2.s4()));
+ TEST_INSTRUCTION("4148A10E", sqxtn(v1.s2(), v2.d2()));
+ TEST_INSTRUCTION("4148214E", sqxtn2(v1.b16(), v2.h8()));
+ TEST_INSTRUCTION("4148614E", sqxtn2(v1.h8(), v2.s4()));
+ TEST_INSTRUCTION("4148A14E", sqxtn2(v1.s4(), v2.d2()));
+ TEST_INSTRUCTION("4128217E", sqxtun(b1, h2));
+ TEST_INSTRUCTION("4128617E", sqxtun(h1, s2));
+ TEST_INSTRUCTION("4128A17E", sqxtun(s1, d2));
+ TEST_INSTRUCTION("4128212E", sqxtun(v1.b8(), v2.h8()));
+ TEST_INSTRUCTION("4128612E", sqxtun(v1.h4(), v2.s4()));
+ TEST_INSTRUCTION("4128A12E", sqxtun(v1.s2(), v2.d2()));
+ TEST_INSTRUCTION("4128216E", sqxtun2(v1.b16(), v2.h8()));
+ TEST_INSTRUCTION("4128616E", sqxtun2(v1.h8(), v2.s4()));
+ TEST_INSTRUCTION("4128A16E", sqxtun2(v1.s4(), v2.d2()));
+ TEST_INSTRUCTION("4114230E", srhadd(v1.b8(), v2.b8(), v3.b8()));
+ TEST_INSTRUCTION("4114630E", srhadd(v1.h4(), v2.h4(), v3.h4()));
+ TEST_INSTRUCTION("4114A30E", srhadd(v1.s2(), v2.s2(), v3.s2()));
+ TEST_INSTRUCTION("4114234E", srhadd(v1.b16(), v2.b16(), v3.b16()));
+ TEST_INSTRUCTION("4114634E", srhadd(v1.h8(), v2.h8(), v3.h8()));
+ TEST_INSTRUCTION("4114A34E", srhadd(v1.s4(), v2.s4(), v3.s4()));
+ TEST_INSTRUCTION("4144092F", sri(v1.b8(), v2.b8(), 7));
+ TEST_INSTRUCTION("4144112F", sri(v1.h4(), v2.h4(), 15));
+ TEST_INSTRUCTION("4144212F", sri(v1.s2(), v2.s2(), 31));
+ TEST_INSTRUCTION("4144417F", sri(d1, d2, 63));
+ TEST_INSTRUCTION("4144096F", sri(v1.b16(), v2.b16(), 7));
+ TEST_INSTRUCTION("4144116F", sri(v1.h8(), v2.h8(), 15));
+ TEST_INSTRUCTION("4144216F", sri(v1.s4(), v2.s4(), 31));
+ TEST_INSTRUCTION("4144416F", sri(v1.d2(), v2.d2(), 63));
+ TEST_INSTRUCTION("4154230E", srshl(v1.b8(), v2.b8(), v3.b8()));
+ TEST_INSTRUCTION("4154630E", srshl(v1.h4(), v2.h4(), v3.h4()));
+ TEST_INSTRUCTION("4154A30E", srshl(v1.s2(), v2.s2(), v3.s2()));
+ TEST_INSTRUCTION("4154E35E", srshl(d1, d2, d3));
+ TEST_INSTRUCTION("4154234E", srshl(v1.b16(), v2.b16(), v3.b16()));
+ TEST_INSTRUCTION("4154634E", srshl(v1.h8(), v2.h8(), v3.h8()));
+ TEST_INSTRUCTION("4154A34E", srshl(v1.s4(), v2.s4(), v3.s4()));
+ TEST_INSTRUCTION("4154E34E", srshl(v1.d2(), v2.d2(), v3.d2()));
+ TEST_INSTRUCTION("4124090F", srshr(v1.b8(), v2.b8(), 7));
+ TEST_INSTRUCTION("4124110F", srshr(v1.h4(), v2.h4(), 15));
+ TEST_INSTRUCTION("4124210F", srshr(v1.s2(), v2.s2(), 31));
+ TEST_INSTRUCTION("4124415F", srshr(d1, d2, 63));
+ TEST_INSTRUCTION("4124094F", srshr(v1.b16(), v2.b16(), 7));
+ TEST_INSTRUCTION("4124114F", srshr(v1.h8(), v2.h8(), 15));
+ TEST_INSTRUCTION("4124214F", srshr(v1.s4(), v2.s4(), 31));
+ TEST_INSTRUCTION("4124414F", srshr(v1.d2(), v2.d2(), 63));
+ TEST_INSTRUCTION("4134090F", srsra(v1.b8(), v2.b8(), 7));
+ TEST_INSTRUCTION("4134110F", srsra(v1.h4(), v2.h4(), 15));
+ TEST_INSTRUCTION("4134210F", srsra(v1.s2(), v2.s2(), 31));
+ TEST_INSTRUCTION("4134415F", srsra(d1, d2, 63));
+ TEST_INSTRUCTION("4134094F", srsra(v1.b16(), v2.b16(), 7));
+ TEST_INSTRUCTION("4134114F", srsra(v1.h8(), v2.h8(), 15));
+ TEST_INSTRUCTION("4134214F", srsra(v1.s4(), v2.s4(), 31));
+ TEST_INSTRUCTION("4134414F", srsra(v1.d2(), v2.d2(), 63));
+ TEST_INSTRUCTION("4144230E", sshl(v1.b8(), v2.b8(), v3.b8()));
+ TEST_INSTRUCTION("4144630E", sshl(v1.h4(), v2.h4(), v3.h4()));
+ TEST_INSTRUCTION("4144A30E", sshl(v1.s2(), v2.s2(), v3.s2()));
+ TEST_INSTRUCTION("4144E35E", sshl(d1, d2, d3));
+ TEST_INSTRUCTION("4144234E", sshl(v1.b16(), v2.b16(), v3.b16()));
+ TEST_INSTRUCTION("4144634E", sshl(v1.h8(), v2.h8(), v3.h8()));
+ TEST_INSTRUCTION("4144A34E", sshl(v1.s4(), v2.s4(), v3.s4()));
+ TEST_INSTRUCTION("4144E34E", sshl(v1.d2(), v2.d2(), v3.d2()));
+ TEST_INSTRUCTION("41A40F0F", sshll(v1.h8(), v2.b8(), 7));
+ TEST_INSTRUCTION("41A41F0F", sshll(v1.s4(), v2.h4(), 15));
+ TEST_INSTRUCTION("41A43F0F", sshll(v1.d2(), v2.s2(), 31));
+ TEST_INSTRUCTION("41A40F4F", sshll2(v1.h8(), v2.b16(), 7));
+ TEST_INSTRUCTION("41A41F4F", sshll2(v1.s4(), v2.h8(), 15));
+ TEST_INSTRUCTION("41A43F4F", sshll2(v1.s2(), v2.s4(), 31));
+ TEST_INSTRUCTION("4104090F", sshr(v1.b8(), v2.b8(), 7));
+ TEST_INSTRUCTION("4104110F", sshr(v1.h4(), v2.h4(), 15));
+ TEST_INSTRUCTION("4104210F", sshr(v1.s2(), v2.s2(), 31));
+ TEST_INSTRUCTION("4104415F", sshr(d1, d2, 63));
+ TEST_INSTRUCTION("4104094F", sshr(v1.b16(), v2.b16(), 7));
+ TEST_INSTRUCTION("4104114F", sshr(v1.h8(), v2.h8(), 15));
+ TEST_INSTRUCTION("4104214F", sshr(v1.s4(), v2.s4(), 31));
+ TEST_INSTRUCTION("4104414F", sshr(v1.d2(), v2.d2(), 63));
+ TEST_INSTRUCTION("4114090F", ssra(v1.b8(), v2.b8(), 7));
+ TEST_INSTRUCTION("4114110F", ssra(v1.h4(), v2.h4(), 15));
+ TEST_INSTRUCTION("4114210F", ssra(v1.s2(), v2.s2(), 31));
+ TEST_INSTRUCTION("4114415F", ssra(d1, d2, 63));
+ TEST_INSTRUCTION("4114094F", ssra(v1.b16(), v2.b16(), 7));
+ TEST_INSTRUCTION("4114114F", ssra(v1.h8(), v2.h8(), 15));
+ TEST_INSTRUCTION("4114214F", ssra(v1.s4(), v2.s4(), 31));
+ TEST_INSTRUCTION("4114414F", ssra(v1.d2(), v2.d2(), 63));
+ TEST_INSTRUCTION("4120230E", ssubl(v1.h8(), v2.b8(), v3.b8()));
+ TEST_INSTRUCTION("4120630E", ssubl(v1.s4(), v2.h4(), v3.h4()));
+ TEST_INSTRUCTION("4120A30E", ssubl(v1.d2(), v2.s2(), v3.s2()));
+ TEST_INSTRUCTION("4120234E", ssubl2(v1.h8(), v2.b16(), v3.b16()));
+ TEST_INSTRUCTION("4120634E", ssubl2(v1.s4(), v2.h8(), v3.h8()));
+ TEST_INSTRUCTION("4120A34E", ssubl2(v1.d2(), v2.s4(), v3.s4()));
+ TEST_INSTRUCTION("4130230E", ssubw(v1.h8(), v2.h8(), v3.b8()));
+ TEST_INSTRUCTION("4130630E", ssubw(v1.s4(), v2.s4(), v3.h4()));
+ TEST_INSTRUCTION("4130A30E", ssubw(v1.d2(), v2.d2(), v3.s2()));
+ TEST_INSTRUCTION("4130234E", ssubw2(v1.h8(), v2.h8(), v3.b16()));
+ TEST_INSTRUCTION("4130634E", ssubw2(v1.s4(), v2.s4(), v3.h8()));
+ TEST_INSTRUCTION("4130A34E", ssubw2(v1.d2(), v2.d2(), v3.s4()));
+ TEST_INSTRUCTION("4100000D", st1(v1.b(0), ptr(x2)));
+ TEST_INSTRUCTION("41009F0D", st1(v1.b(0), ptr_post(x2, 1)));
+ TEST_INSTRUCTION("4140000D", st1(v1.h(0), ptr(x2)));
+ TEST_INSTRUCTION("41409F0D", st1(v1.h(0), ptr_post(x2, 2)));
+ TEST_INSTRUCTION("4180000D", st1(v1.s(0), ptr(x2)));
+ TEST_INSTRUCTION("41809F0D", st1(v1.s(0), ptr_post(x2, 4)));
+ TEST_INSTRUCTION("4184000D", st1(v1.d(0), ptr(x2)));
+ TEST_INSTRUCTION("41849F0D", st1(v1.d(0), ptr_post(x2, 8)));
+ TEST_INSTRUCTION("411C004D", st1(v1.b(15), ptr(x2)));
+ TEST_INSTRUCTION("411C9F4D", st1(v1.b(15), ptr_post(x2, 1)));
+ TEST_INSTRUCTION("4158004D", st1(v1.h(7), ptr(x2)));
+ TEST_INSTRUCTION("41589F4D", st1(v1.h(7), ptr_post(x2, 2)));
+ TEST_INSTRUCTION("4190004D", st1(v1.s(3), ptr(x2)));
+ TEST_INSTRUCTION("41909F4D", st1(v1.s(3), ptr_post(x2, 4)));
+ TEST_INSTRUCTION("4184004D", st1(v1.d(1), ptr(x2)));
+ TEST_INSTRUCTION("41849F4D", st1(v1.d(1), ptr_post(x2, 8)));
+ TEST_INSTRUCTION("4170000C", st1(v1.b8(), ptr(x2)));
+ TEST_INSTRUCTION("41709F0C", st1(v1.b8(), ptr_post(x2, 8)));
+ TEST_INSTRUCTION("4170004C", st1(v1.b16(), ptr(x2)));
+ TEST_INSTRUCTION("41709F4C", st1(v1.b16(), ptr_post(x2, 16)));
+ TEST_INSTRUCTION("61A0000C", st1(v1.b8(), v2.b8(), ptr(x3)));
+ TEST_INSTRUCTION("61A09F0C", st1(v1.b8(), v2.b8(), ptr_post(x3, 16)));
+ TEST_INSTRUCTION("61A0004C", st1(v1.b16(), v2.b16(), ptr(x3)));
+ TEST_INSTRUCTION("61A09F4C", st1(v1.b16(), v2.b16(), ptr_post(x3, 32)));
+ TEST_INSTRUCTION("8160000C", st1(v1.b8(), v2.b8(), v3.b8(), ptr(x4)));
+ TEST_INSTRUCTION("81609F0C", st1(v1.b8(), v2.b8(), v3.b8(), ptr_post(x4, 24)));
+ TEST_INSTRUCTION("8160004C", st1(v1.b16(), v2.b16(), v3.b16(), ptr(x4)));
+ TEST_INSTRUCTION("81609F4C", st1(v1.b16(), v2.b16(), v3.b16(), ptr_post(x4, 48)));
+ TEST_INSTRUCTION("A120000C", st1(v1.b8(), v2.b8(), v3.b8(), v4.b8(), ptr(x5)));
+ TEST_INSTRUCTION("A1209F0C", st1(v1.b8(), v2.b8(), v3.b8(), v4.b8(), ptr_post(x5, 32)));
+ TEST_INSTRUCTION("A120004C", st1(v1.b16(), v2.b16(), v3.b16(), v4.b16(), ptr(x5)));
+ TEST_INSTRUCTION("A1209F4C", st1(v1.b16(), v2.b16(), v3.b16(), v4.b16(), ptr_post(x5, 64)));
+ TEST_INSTRUCTION("4174000C", st1(v1.h4(), ptr(x2)));
+ TEST_INSTRUCTION("41749F0C", st1(v1.h4(), ptr_post(x2, 8)));
+ TEST_INSTRUCTION("4174004C", st1(v1.h8(), ptr(x2)));
+ TEST_INSTRUCTION("41749F4C", st1(v1.h8(), ptr_post(x2, 16)));
+ TEST_INSTRUCTION("61A4000C", st1(v1.h4(), v2.h4(), ptr(x3)));
+ TEST_INSTRUCTION("61A49F0C", st1(v1.h4(), v2.h4(), ptr_post(x3, 16)));
+ TEST_INSTRUCTION("61A4004C", st1(v1.h8(), v2.h8(), ptr(x3)));
+ TEST_INSTRUCTION("61A49F4C", st1(v1.h8(), v2.h8(), ptr_post(x3, 32)));
+ TEST_INSTRUCTION("8164000C", st1(v1.h4(), v2.h4(), v3.h4(), ptr(x4)));
+ TEST_INSTRUCTION("81649F0C", st1(v1.h4(), v2.h4(), v3.h4(), ptr_post(x4, 24)));
+ TEST_INSTRUCTION("8164004C", st1(v1.h8(), v2.h8(), v3.h8(), ptr(x4)));
+ TEST_INSTRUCTION("81649F4C", st1(v1.h8(), v2.h8(), v3.h8(), ptr_post(x4, 48)));
+ TEST_INSTRUCTION("A124000C", st1(v1.h4(), v2.h4(), v3.h4(), v4.h4(), ptr(x5)));
+ TEST_INSTRUCTION("A1249F0C", st1(v1.h4(), v2.h4(), v3.h4(), v4.h4(), ptr_post(x5, 32)));
+ TEST_INSTRUCTION("A124004C", st1(v1.h8(), v2.h8(), v3.h8(), v4.h8(), ptr(x5)));
+ TEST_INSTRUCTION("A1249F4C", st1(v1.h8(), v2.h8(), v3.h8(), v4.h8(), ptr_post(x5, 64)));
+ TEST_INSTRUCTION("4178000C", st1(v1.s2(), ptr(x2)));
+ TEST_INSTRUCTION("41789F0C", st1(v1.s2(), ptr_post(x2, 8)));
+ TEST_INSTRUCTION("4178004C", st1(v1.s4(), ptr(x2)));
+ TEST_INSTRUCTION("41789F4C", st1(v1.s4(), ptr_post(x2, 16)));
+ TEST_INSTRUCTION("61A8000C", st1(v1.s2(), v2.s2(), ptr(x3)));
+ TEST_INSTRUCTION("61A89F0C", st1(v1.s2(), v2.s2(), ptr_post(x3, 16)));
+ TEST_INSTRUCTION("61A8004C", st1(v1.s4(), v2.s4(), ptr(x3)));
+ TEST_INSTRUCTION("61A89F4C", st1(v1.s4(), v2.s4(), ptr_post(x3, 32)));
+ TEST_INSTRUCTION("8168000C", st1(v1.s2(), v2.s2(), v3.s2(), ptr(x4)));
+ TEST_INSTRUCTION("81689F0C", st1(v1.s2(), v2.s2(), v3.s2(), ptr_post(x4, 24)));
+ TEST_INSTRUCTION("8168004C", st1(v1.s4(), v2.s4(), v3.s4(), ptr(x4)));
+ TEST_INSTRUCTION("81689F4C", st1(v1.s4(), v2.s4(), v3.s4(), ptr_post(x4, 48)));
+ TEST_INSTRUCTION("A128000C", st1(v1.s2(), v2.s2(), v3.s2(), v4.s2(), ptr(x5)));
+ TEST_INSTRUCTION("A1289F0C", st1(v1.s2(), v2.s2(), v3.s2(), v4.s2(), ptr_post(x5, 32)));
+ TEST_INSTRUCTION("A128004C", st1(v1.s4(), v2.s4(), v3.s4(), v4.s4(), ptr(x5)));
+ TEST_INSTRUCTION("A1289F4C", st1(v1.s4(), v2.s4(), v3.s4(), v4.s4(), ptr_post(x5, 64)));
+ TEST_INSTRUCTION("417C004C", st1(v1.d2(), ptr(x2)));
+ TEST_INSTRUCTION("417C9F4C", st1(v1.d2(), ptr_post(x2, 16)));
+ TEST_INSTRUCTION("61AC004C", st1(v1.d2(), v2.d2(), ptr(x3)));
+ TEST_INSTRUCTION("61AC9F4C", st1(v1.d2(), v2.d2(), ptr_post(x3, 32)));
+ TEST_INSTRUCTION("816C004C", st1(v1.d2(), v2.d2(), v3.d2(), ptr(x4)));
+ TEST_INSTRUCTION("816C9F4C", st1(v1.d2(), v2.d2(), v3.d2(), ptr_post(x4, 48)));
+ TEST_INSTRUCTION("A12C004C", st1(v1.d2(), v2.d2(), v3.d2(), v4.d2(), ptr(x5)));
+ TEST_INSTRUCTION("A12C9F4C", st1(v1.d2(), v2.d2(), v3.d2(), v4.d2(), ptr_post(x5, 64)));
+ TEST_INSTRUCTION("6100200D", st2(v1.b(0), v2.b(0), ptr(x3)));
+ TEST_INSTRUCTION("6100BF0D", st2(v1.b(0), v2.b(0), ptr_post(x3, 2)));
+ TEST_INSTRUCTION("6100AB0D", st2(v1.b(0), v2.b(0), ptr_post(x3, x11)));
+ TEST_INSTRUCTION("6140200D", st2(v1.h(0), v2.h(0), ptr(x3)));
+ TEST_INSTRUCTION("6140BF0D", st2(v1.h(0), v2.h(0), ptr_post(x3, 4)));
+ TEST_INSTRUCTION("6140AB0D", st2(v1.h(0), v2.h(0), ptr_post(x3, x11)));
+ TEST_INSTRUCTION("6180200D", st2(v1.s(0), v2.s(0), ptr(x3)));
+ TEST_INSTRUCTION("6180BF0D", st2(v1.s(0), v2.s(0), ptr_post(x3, 8)));
+ TEST_INSTRUCTION("6180AB0D", st2(v1.s(0), v2.s(0), ptr_post(x3, x11)));
+ TEST_INSTRUCTION("6184200D", st2(v1.d(0), v2.d(0), ptr(x3)));
+ TEST_INSTRUCTION("6184BF0D", st2(v1.d(0), v2.d(0), ptr_post(x3, 16)));
+ TEST_INSTRUCTION("6184AB0D", st2(v1.d(0), v2.d(0), ptr_post(x3, x11)));
+ TEST_INSTRUCTION("611C204D", st2(v1.b(15), v2.b(15), ptr(x3)));
+ TEST_INSTRUCTION("611CBF4D", st2(v1.b(15), v2.b(15), ptr_post(x3, 2)));
+ TEST_INSTRUCTION("611CAB4D", st2(v1.b(15), v2.b(15), ptr_post(x3, x11)));
+ TEST_INSTRUCTION("6158204D", st2(v1.h(7), v2.h(7), ptr(x3)));
+ TEST_INSTRUCTION("6158BF4D", st2(v1.h(7), v2.h(7), ptr_post(x3, 4)));
+ TEST_INSTRUCTION("6158AB4D", st2(v1.h(7), v2.h(7), ptr_post(x3, x11)));
+ TEST_INSTRUCTION("6190204D", st2(v1.s(3), v2.s(3), ptr(x3)));
+ TEST_INSTRUCTION("6190BF4D", st2(v1.s(3), v2.s(3), ptr_post(x3, 8)));
+ TEST_INSTRUCTION("6190AB4D", st2(v1.s(3), v2.s(3), ptr_post(x3, x11)));
+ TEST_INSTRUCTION("6184204D", st2(v1.d(1), v2.d(1), ptr(x3)));
+ TEST_INSTRUCTION("6184BF4D", st2(v1.d(1), v2.d(1), ptr_post(x3, 16)));
+ TEST_INSTRUCTION("6184AB4D", st2(v1.d(1), v2.d(1), ptr_post(x3, x11)));
+ TEST_INSTRUCTION("6180000C", st2(v1.b8(), v2.b8(), ptr(x3)));
+ TEST_INSTRUCTION("61809F0C", st2(v1.b8(), v2.b8(), ptr_post(x3, 16)));
+ TEST_INSTRUCTION("61808B0C", st2(v1.b8(), v2.b8(), ptr_post(x3, x11)));
+ TEST_INSTRUCTION("6180004C", st2(v1.b16(), v2.b16(), ptr(x3)));
+ TEST_INSTRUCTION("61809F4C", st2(v1.b16(), v2.b16(), ptr_post(x3, 32)));
+ TEST_INSTRUCTION("61808B4C", st2(v1.b16(), v2.b16(), ptr_post(x3, x11)));
+ TEST_INSTRUCTION("6184000C", st2(v1.h4(), v2.h4(), ptr(x3)));
+ TEST_INSTRUCTION("61849F0C", st2(v1.h4(), v2.h4(), ptr_post(x3, 16)));
+ TEST_INSTRUCTION("61848B0C", st2(v1.h4(), v2.h4(), ptr_post(x3, x11)));
+ TEST_INSTRUCTION("6184004C", st2(v1.h8(), v2.h8(), ptr(x3)));
+ TEST_INSTRUCTION("61849F4C", st2(v1.h8(), v2.h8(), ptr_post(x3, 32)));
+ TEST_INSTRUCTION("61848B4C", st2(v1.h8(), v2.h8(), ptr_post(x3, x11)));
+ TEST_INSTRUCTION("6188000C", st2(v1.s2(), v2.s2(), ptr(x3)));
+ TEST_INSTRUCTION("61889F0C", st2(v1.s2(), v2.s2(), ptr_post(x3, 16)));
+ TEST_INSTRUCTION("61888B0C", st2(v1.s2(), v2.s2(), ptr_post(x3, x11)));
+ TEST_INSTRUCTION("6188004C", st2(v1.s4(), v2.s4(), ptr(x3)));
+ TEST_INSTRUCTION("61889F4C", st2(v1.s4(), v2.s4(), ptr_post(x3, 32)));
+ TEST_INSTRUCTION("61888B4C", st2(v1.s4(), v2.s4(), ptr_post(x3, x11)));
+ TEST_INSTRUCTION("618C004C", st2(v1.d2(), v2.d2(), ptr(x3)));
+ TEST_INSTRUCTION("618C9F4C", st2(v1.d2(), v2.d2(), ptr_post(x3, 32)));
+ TEST_INSTRUCTION("618C8B4C", st2(v1.d2(), v2.d2(), ptr_post(x3, x11)));
+ TEST_INSTRUCTION("8120000D", st3(v1.b(0), v2.b(0), v3.b(0), ptr(x4)));
+ TEST_INSTRUCTION("81209F0D", st3(v1.b(0), v2.b(0), v3.b(0), ptr_post(x4, 3)));
+ TEST_INSTRUCTION("81208B0D", st3(v1.b(0), v2.b(0), v3.b(0), ptr_post(x4, x11)));
+ TEST_INSTRUCTION("8160000D", st3(v1.h(0), v2.h(0), v3.h(0), ptr(x4)));
+ TEST_INSTRUCTION("81609F0D", st3(v1.h(0), v2.h(0), v3.h(0), ptr_post(x4, 6)));
+ TEST_INSTRUCTION("81608B0D", st3(v1.h(0), v2.h(0), v3.h(0), ptr_post(x4, x11)));
+ TEST_INSTRUCTION("81A0000D", st3(v1.s(0), v2.s(0), v3.s(0), ptr(x4)));
+ TEST_INSTRUCTION("81A09F0D", st3(v1.s(0), v2.s(0), v3.s(0), ptr_post(x4, 12)));
+ TEST_INSTRUCTION("81A08B0D", st3(v1.s(0), v2.s(0), v3.s(0), ptr_post(x4, x11)));
+ TEST_INSTRUCTION("81A4000D", st3(v1.d(0), v2.d(0), v3.d(0), ptr(x4)));
+ TEST_INSTRUCTION("81A49F0D", st3(v1.d(0), v2.d(0), v3.d(0), ptr_post(x4, 24)));
+ TEST_INSTRUCTION("81A48B0D", st3(v1.d(0), v2.d(0), v3.d(0), ptr_post(x4, x11)));
+ TEST_INSTRUCTION("813C004D", st3(v1.b(15), v2.b(15), v3.b(15), ptr(x4)));
+ TEST_INSTRUCTION("813C9F4D", st3(v1.b(15), v2.b(15), v3.b(15), ptr_post(x4, 3)));
+ TEST_INSTRUCTION("813C8B4D", st3(v1.b(15), v2.b(15), v3.b(15), ptr_post(x4, x11)));
+ TEST_INSTRUCTION("8178004D", st3(v1.h(7), v2.h(7), v3.h(7), ptr(x4)));
+ TEST_INSTRUCTION("81789F4D", st3(v1.h(7), v2.h(7), v3.h(7), ptr_post(x4, 6)));
+ TEST_INSTRUCTION("81788B4D", st3(v1.h(7), v2.h(7), v3.h(7), ptr_post(x4, x11)));
+ TEST_INSTRUCTION("81B0004D", st3(v1.s(3), v2.s(3), v3.s(3), ptr(x4)));
+ TEST_INSTRUCTION("81B09F4D", st3(v1.s(3), v2.s(3), v3.s(3), ptr_post(x4, 12)));
+ TEST_INSTRUCTION("81B08B4D", st3(v1.s(3), v2.s(3), v3.s(3), ptr_post(x4, x11)));
+ TEST_INSTRUCTION("81A4004D", st3(v1.d(1), v2.d(1), v3.d(1), ptr(x4)));
+ TEST_INSTRUCTION("81A49F4D", st3(v1.d(1), v2.d(1), v3.d(1), ptr_post(x4, 24)));
+ TEST_INSTRUCTION("81A48B4D", st3(v1.d(1), v2.d(1), v3.d(1), ptr_post(x4, x11)));
+ TEST_INSTRUCTION("8140000C", st3(v1.b8(), v2.b8(), v3.b8(), ptr(x4)));
+ TEST_INSTRUCTION("81409F0C", st3(v1.b8(), v2.b8(), v3.b8(), ptr_post(x4, 24)));
+ TEST_INSTRUCTION("81408B0C", st3(v1.b8(), v2.b8(), v3.b8(), ptr_post(x4, x11)));
+ TEST_INSTRUCTION("8140004C", st3(v1.b16(), v2.b16(), v3.b16(), ptr(x4)));
+ TEST_INSTRUCTION("81409F4C", st3(v1.b16(), v2.b16(), v3.b16(), ptr_post(x4, 48)));
+ TEST_INSTRUCTION("81408B4C", st3(v1.b16(), v2.b16(), v3.b16(), ptr_post(x4, x11)));
+ TEST_INSTRUCTION("8144000C", st3(v1.h4(), v2.h4(), v3.h4(), ptr(x4)));
+ TEST_INSTRUCTION("81449F0C", st3(v1.h4(), v2.h4(), v3.h4(), ptr_post(x4, 24)));
+ TEST_INSTRUCTION("81448B0C", st3(v1.h4(), v2.h4(), v3.h4(), ptr_post(x4, x11)));
+ TEST_INSTRUCTION("8144004C", st3(v1.h8(), v2.h8(), v3.h8(), ptr(x4)));
+ TEST_INSTRUCTION("81449F4C", st3(v1.h8(), v2.h8(), v3.h8(), ptr_post(x4, 48)));
+ TEST_INSTRUCTION("81448B4C", st3(v1.h8(), v2.h8(), v3.h8(), ptr_post(x4, x11)));
+ TEST_INSTRUCTION("8148000C", st3(v1.s2(), v2.s2(), v3.s2(), ptr(x4)));
+ TEST_INSTRUCTION("81489F0C", st3(v1.s2(), v2.s2(), v3.s2(), ptr_post(x4, 24)));
+ TEST_INSTRUCTION("81488B0C", st3(v1.s2(), v2.s2(), v3.s2(), ptr_post(x4, x11)));
+ TEST_INSTRUCTION("8148004C", st3(v1.s4(), v2.s4(), v3.s4(), ptr(x4)));
+ TEST_INSTRUCTION("81489F4C", st3(v1.s4(), v2.s4(), v3.s4(), ptr_post(x4, 48)));
+ TEST_INSTRUCTION("81488B4C", st3(v1.s4(), v2.s4(), v3.s4(), ptr_post(x4, x11)));
+ TEST_INSTRUCTION("814C004C", st3(v1.d2(), v2.d2(), v3.d2(), ptr(x4)));
+ TEST_INSTRUCTION("814C9F4C", st3(v1.d2(), v2.d2(), v3.d2(), ptr_post(x4, 48)));
+ TEST_INSTRUCTION("814C8B4C", st3(v1.d2(), v2.d2(), v3.d2(), ptr_post(x4, x11)));
+ TEST_INSTRUCTION("A120200D", st4(v1.b(0), v2.b(0), v3.b(0), v4.b(0), ptr(x5)));
+ TEST_INSTRUCTION("A120BF0D", st4(v1.b(0), v2.b(0), v3.b(0), v4.b(0), ptr_post(x5, 4)));
+ TEST_INSTRUCTION("A120AB0D", st4(v1.b(0), v2.b(0), v3.b(0), v4.b(0), ptr_post(x5, x11)));
+ TEST_INSTRUCTION("A160200D", st4(v1.h(0), v2.h(0), v3.h(0), v4.h(0), ptr(x5)));
+ TEST_INSTRUCTION("A160BF0D", st4(v1.h(0), v2.h(0), v3.h(0), v4.h(0), ptr_post(x5, 8)));
+ TEST_INSTRUCTION("A160AB0D", st4(v1.h(0), v2.h(0), v3.h(0), v4.h(0), ptr_post(x5, x11)));
+ TEST_INSTRUCTION("A1A0200D", st4(v1.s(0), v2.s(0), v3.s(0), v4.s(0), ptr(x5)));
+ TEST_INSTRUCTION("A1A0BF0D", st4(v1.s(0), v2.s(0), v3.s(0), v4.s(0), ptr_post(x5, 16)));
+ TEST_INSTRUCTION("A1A0AB0D", st4(v1.s(0), v2.s(0), v3.s(0), v4.s(0), ptr_post(x5, x11)));
+ TEST_INSTRUCTION("A1A4200D", st4(v1.d(0), v2.d(0), v3.d(0), v4.d(0), ptr(x5)));
+ TEST_INSTRUCTION("A1A4BF0D", st4(v1.d(0), v2.d(0), v3.d(0), v4.d(0), ptr_post(x5, 32)));
+ TEST_INSTRUCTION("A1A4AB0D", st4(v1.d(0), v2.d(0), v3.d(0), v4.d(0), ptr_post(x5, x11)));
+ TEST_INSTRUCTION("A13C204D", st4(v1.b(15), v2.b(15), v3.b(15), v4.b(15), ptr(x5)));
+ TEST_INSTRUCTION("A13CBF4D", st4(v1.b(15), v2.b(15), v3.b(15), v4.b(15), ptr_post(x5, 4)));
+ TEST_INSTRUCTION("A13CAB4D", st4(v1.b(15), v2.b(15), v3.b(15), v4.b(15), ptr_post(x5, x11)));
+ TEST_INSTRUCTION("A178204D", st4(v1.h(7), v2.h(7), v3.h(7), v4.h(7), ptr(x5)));
+ TEST_INSTRUCTION("A178BF4D", st4(v1.h(7), v2.h(7), v3.h(7), v4.h(7), ptr_post(x5, 8)));
+ TEST_INSTRUCTION("A178AB4D", st4(v1.h(7), v2.h(7), v3.h(7), v4.h(7), ptr_post(x5, x11)));
+ TEST_INSTRUCTION("A1B0204D", st4(v1.s(3), v2.s(3), v3.s(3), v4.s(3), ptr(x5)));
+ TEST_INSTRUCTION("A1B0BF4D", st4(v1.s(3), v2.s(3), v3.s(3), v4.s(3), ptr_post(x5, 16)));
+ TEST_INSTRUCTION("A1B0AB4D", st4(v1.s(3), v2.s(3), v3.s(3), v4.s(3), ptr_post(x5, x11)));
+ TEST_INSTRUCTION("A1A4204D", st4(v1.d(1), v2.d(1), v3.d(1), v4.d(1), ptr(x5)));
+ TEST_INSTRUCTION("A1A4BF4D", st4(v1.d(1), v2.d(1), v3.d(1), v4.d(1), ptr_post(x5, 32)));
+ TEST_INSTRUCTION("A1A4AB4D", st4(v1.d(1), v2.d(1), v3.d(1), v4.d(1), ptr_post(x5, x11)));
+ TEST_INSTRUCTION("A100000C", st4(v1.b8(), v2.b8(), v3.b8(), v4.b8(), ptr(x5)));
+ TEST_INSTRUCTION("A1009F0C", st4(v1.b8(), v2.b8(), v3.b8(), v4.b8(), ptr_post(x5, 32)));
+ TEST_INSTRUCTION("A1008B0C", st4(v1.b8(), v2.b8(), v3.b8(), v4.b8(), ptr_post(x5, x11)));
+ TEST_INSTRUCTION("A100004C", st4(v1.b16(), v2.b16(), v3.b16(), v4.b16(), ptr(x5)));
+ TEST_INSTRUCTION("A1009F4C", st4(v1.b16(), v2.b16(), v3.b16(), v4.b16(), ptr_post(x5, 64)));
+ TEST_INSTRUCTION("A1008B4C", st4(v1.b16(), v2.b16(), v3.b16(), v4.b16(), ptr_post(x5, x11)));
+ TEST_INSTRUCTION("A104000C", st4(v1.h4(), v2.h4(), v3.h4(), v4.h4(), ptr(x5)));
+ TEST_INSTRUCTION("A1049F0C", st4(v1.h4(), v2.h4(), v3.h4(), v4.h4(), ptr_post(x5, 32)));
+ TEST_INSTRUCTION("A1048B0C", st4(v1.h4(), v2.h4(), v3.h4(), v4.h4(), ptr_post(x5, x11)));
+ TEST_INSTRUCTION("A104004C", st4(v1.h8(), v2.h8(), v3.h8(), v4.h8(), ptr(x5)));
+ TEST_INSTRUCTION("A1049F4C", st4(v1.h8(), v2.h8(), v3.h8(), v4.h8(), ptr_post(x5, 64)));
+ TEST_INSTRUCTION("A1048B4C", st4(v1.h8(), v2.h8(), v3.h8(), v4.h8(), ptr_post(x5, x11)));
+ TEST_INSTRUCTION("A108000C", st4(v1.s2(), v2.s2(), v3.s2(), v4.s2(), ptr(x5)));
+ TEST_INSTRUCTION("A1089F0C", st4(v1.s2(), v2.s2(), v3.s2(), v4.s2(), ptr_post(x5, 32)));
+ TEST_INSTRUCTION("A1088B0C", st4(v1.s2(), v2.s2(), v3.s2(), v4.s2(), ptr_post(x5, x11)));
+ TEST_INSTRUCTION("A108004C", st4(v1.s4(), v2.s4(), v3.s4(), v4.s4(), ptr(x5)));
+ TEST_INSTRUCTION("A1089F4C", st4(v1.s4(), v2.s4(), v3.s4(), v4.s4(), ptr_post(x5, 64)));
+ TEST_INSTRUCTION("A1088B4C", st4(v1.s4(), v2.s4(), v3.s4(), v4.s4(), ptr_post(x5, x11)));
+ TEST_INSTRUCTION("A10C004C", st4(v1.d2(), v2.d2(), v3.d2(), v4.d2(), ptr(x5)));
+ TEST_INSTRUCTION("A10C9F4C", st4(v1.d2(), v2.d2(), v3.d2(), v4.d2(), ptr_post(x5, 64)));
+ TEST_INSTRUCTION("A10C8B4C", st4(v1.d2(), v2.d2(), v3.d2(), v4.d2(), ptr_post(x5, x11)));
+ TEST_INSTRUCTION("8109002C", stnp(s1, s2, ptr(x12)));
+ TEST_INSTRUCTION("8189002C", stnp(s1, s2, ptr(x12, 4)));
+ TEST_INSTRUCTION("8109302C", stnp(s1, s2, ptr(x12, -128)));
+ TEST_INSTRUCTION("E10B002C", stnp(s1, s2, ptr(sp)));
+ TEST_INSTRUCTION("E18B002C", stnp(s1, s2, ptr(sp, 4)));
+ TEST_INSTRUCTION("E10B102C", stnp(s1, s2, ptr(sp, 128)));
+ TEST_INSTRUCTION("8109006C", stnp(d1, d2, ptr(x12)));
+ TEST_INSTRUCTION("8189006C", stnp(d1, d2, ptr(x12, 8)));
+ TEST_INSTRUCTION("8109386C", stnp(d1, d2, ptr(x12, -128)));
+ TEST_INSTRUCTION("E10B006C", stnp(d1, d2, ptr(sp)));
+ TEST_INSTRUCTION("E18B006C", stnp(d1, d2, ptr(sp, 8)));
+ TEST_INSTRUCTION("E10B086C", stnp(d1, d2, ptr(sp, 128)));
+ TEST_INSTRUCTION("810900AC", stnp(q1, q2, ptr(x12)));
+ TEST_INSTRUCTION("818900AC", stnp(q1, q2, ptr(x12, 16)));
+ TEST_INSTRUCTION("81093CAC", stnp(q1, q2, ptr(x12, -128)));
+ TEST_INSTRUCTION("E10B00AC", stnp(q1, q2, ptr(sp)));
+ TEST_INSTRUCTION("E18B00AC", stnp(q1, q2, ptr(sp, 16)));
+ TEST_INSTRUCTION("E10B04AC", stnp(q1, q2, ptr(sp, 128)));
+ TEST_INSTRUCTION("8109002D", stp(s1, s2, ptr(x12)));
+ TEST_INSTRUCTION("8189002D", stp(s1, s2, ptr(x12, 4)));
+ TEST_INSTRUCTION("8109302D", stp(s1, s2, ptr(x12, -128)));
+ TEST_INSTRUCTION("8189802D", stp(s1, s2, ptr_pre(x12, 4)));
+ TEST_INSTRUCTION("8189802C", stp(s1, s2, ptr_post(x12, 4)));
+ TEST_INSTRUCTION("E10B002D", stp(s1, s2, ptr(sp)));
+ TEST_INSTRUCTION("E18B002D", stp(s1, s2, ptr(sp, 4)));
+ TEST_INSTRUCTION("E10B102D", stp(s1, s2, ptr(sp, 128)));
+ TEST_INSTRUCTION("E18B802D", stp(s1, s2, ptr_pre(sp, 4)));
+ TEST_INSTRUCTION("E18B802C", stp(s1, s2, ptr_post(sp, 4)));
+ TEST_INSTRUCTION("8109006D", stp(d1, d2, ptr(x12)));
+ TEST_INSTRUCTION("8189006D", stp(d1, d2, ptr(x12, 8)));
+ TEST_INSTRUCTION("8109386D", stp(d1, d2, ptr(x12, -128)));
+ TEST_INSTRUCTION("8189806D", stp(d1, d2, ptr_pre(x12, 8)));
+ TEST_INSTRUCTION("8189806C", stp(d1, d2, ptr_post(x12, 8)));
+ TEST_INSTRUCTION("E10B006D", stp(d1, d2, ptr(sp)));
+ TEST_INSTRUCTION("E18B006D", stp(d1, d2, ptr(sp, 8)));
+ TEST_INSTRUCTION("E10B086D", stp(d1, d2, ptr(sp, 128)));
+ TEST_INSTRUCTION("E18B806D", stp(d1, d2, ptr_pre(sp, 8)));
+ TEST_INSTRUCTION("E18B806C", stp(d1, d2, ptr_post(sp, 8)));
+ TEST_INSTRUCTION("810900AD", stp(q1, q2, ptr(x12)));
+ TEST_INSTRUCTION("818900AD", stp(q1, q2, ptr(x12, 16)));
+ TEST_INSTRUCTION("81093CAD", stp(q1, q2, ptr(x12, -128)));
+ TEST_INSTRUCTION("818980AD", stp(q1, q2, ptr_pre(x12, 16)));
+ TEST_INSTRUCTION("818980AC", stp(q1, q2, ptr_post(x12, 16)));
+ TEST_INSTRUCTION("E10B00AD", stp(q1, q2, ptr(sp)));
+ TEST_INSTRUCTION("E18B00AD", stp(q1, q2, ptr(sp, 16)));
+ TEST_INSTRUCTION("E10B04AD", stp(q1, q2, ptr(sp, 128)));
+ TEST_INSTRUCTION("E18B80AD", stp(q1, q2, ptr_pre(sp, 16)));
+ TEST_INSTRUCTION("E18B80AC", stp(q1, q2, ptr_post(sp, 16)));
+ TEST_INSTRUCTION("4100003D", str(b1, ptr(x2)));
+ TEST_INSTRUCTION("4114003C", str(b1, ptr_post(x2, 1)));
+ TEST_INSTRUCTION("4104003D", str(b1, ptr(x2, 1)));
+ TEST_INSTRUCTION("411C003C", str(b1, ptr_pre(x2, 1)));
+ TEST_INSTRUCTION("4114083C", str(b1, ptr_post(x2, 129)));
+ TEST_INSTRUCTION("4100007D", str(h1, ptr(x2)));
+ TEST_INSTRUCTION("4124007C", str(h1, ptr_post(x2, 2)));
+ TEST_INSTRUCTION("4104007D", str(h1, ptr(x2, 2)));
+ TEST_INSTRUCTION("412C007C", str(h1, ptr_pre(x2, 2)));
+ TEST_INSTRUCTION("4124087C", str(h1, ptr_post(x2, 130)));
+ TEST_INSTRUCTION("410000BD", str(s1, ptr(x2)));
+ TEST_INSTRUCTION("414400BC", str(s1, ptr_post(x2, 4)));
+ TEST_INSTRUCTION("410400BD", str(s1, ptr(x2, 4)));
+ TEST_INSTRUCTION("414C00BC", str(s1, ptr_pre(x2, 4)));
+ TEST_INSTRUCTION("414408BC", str(s1, ptr_post(x2, 132)));
+ TEST_INSTRUCTION("410000FD", str(d1, ptr(x2)));
+ TEST_INSTRUCTION("418400FC", str(d1, ptr_post(x2, 8)));
+ TEST_INSTRUCTION("410400FD", str(d1, ptr(x2, 8)));
+ TEST_INSTRUCTION("418C00FC", str(d1, ptr_pre(x2, 8)));
+ TEST_INSTRUCTION("414408FC", str(d1, ptr_post(x2, 132)));
+ TEST_INSTRUCTION("4168233C", str(b1, ptr(x2, x3)));
+ TEST_INSTRUCTION("4148233C", str(b1, ptr(x2, w3, uxtw(0))));
+ TEST_INSTRUCTION("41C8233C", str(b1, ptr(x2, w3, sxtw(0))));
+ TEST_INSTRUCTION("4168237C", str(h1, ptr(x2, x3)));
+ TEST_INSTRUCTION("4178237C", str(h1, ptr(x2, x3, lsl(1))));
+ TEST_INSTRUCTION("4148237C", str(h1, ptr(x2, w3, uxtw(0))));
+ TEST_INSTRUCTION("4158237C", str(h1, ptr(x2, w3, uxtw(1))));
+ TEST_INSTRUCTION("41C8237C", str(h1, ptr(x2, w3, sxtw(0))));
+ TEST_INSTRUCTION("41D8237C", str(h1, ptr(x2, w3, sxtw(1))));
+ TEST_INSTRUCTION("416823BC", str(s1, ptr(x2, x3)));
+ TEST_INSTRUCTION("417823BC", str(s1, ptr(x2, x3, lsl(2))));
+ TEST_INSTRUCTION("414823BC", str(s1, ptr(x2, w3, uxtw(0))));
+ TEST_INSTRUCTION("415823BC", str(s1, ptr(x2, w3, uxtw(2))));
+ TEST_INSTRUCTION("41C823BC", str(s1, ptr(x2, w3, sxtw(0))));
+ TEST_INSTRUCTION("41D823BC", str(s1, ptr(x2, w3, sxtw(2))));
+ TEST_INSTRUCTION("416823FC", str(d1, ptr(x2, x3)));
+ TEST_INSTRUCTION("417823FC", str(d1, ptr(x2, x3, lsl(3))));
+ TEST_INSTRUCTION("414823FC", str(d1, ptr(x2, w3, uxtw(0))));
+ TEST_INSTRUCTION("415823FC", str(d1, ptr(x2, w3, uxtw(3))));
+ TEST_INSTRUCTION("41C823FC", str(d1, ptr(x2, w3, sxtw(0))));
+ TEST_INSTRUCTION("41D823FC", str(d1, ptr(x2, w3, sxtw(3))));
+ TEST_INSTRUCTION("4104003D", str(b1, ptr(x2, 1)));
+ TEST_INSTRUCTION("41F01F3C", str(b1, ptr(x2, -1))); // STUR
+ TEST_INSTRUCTION("4110007C", str(h1, ptr(x2, 1))); // STUR
+ TEST_INSTRUCTION("41F01F7C", str(h1, ptr(x2, -1))); // STUR
+ TEST_INSTRUCTION("411000BC", str(s1, ptr(x2, 1))); // STUR
+ TEST_INSTRUCTION("41F01FBC", str(s1, ptr(x2, -1))); // STUR
+ TEST_INSTRUCTION("411000FC", str(d1, ptr(x2, 1))); // STUR
+ TEST_INSTRUCTION("41F01FFC", str(d1, ptr(x2, -1))); // STUR
+ TEST_INSTRUCTION("8101003C", stur(b1, ptr(x12)));
+ TEST_INSTRUCTION("8131003C", stur(b1, ptr(x12, 3)));
+ TEST_INSTRUCTION("8131063C", stur(b1, ptr(x12, 99)));
+ TEST_INSTRUCTION("81F10F3C", stur(b1, ptr(x12, 255)));
+ TEST_INSTRUCTION("8101103C", stur(b1, ptr(x12, -256)));
+ TEST_INSTRUCTION("E103003C", stur(b1, ptr(sp)));
+ TEST_INSTRUCTION("E153083C", stur(b1, ptr(sp, 133)));
+ TEST_INSTRUCTION("8101007C", stur(h1, ptr(x12)));
+ TEST_INSTRUCTION("8131007C", stur(h1, ptr(x12, 3)));
+ TEST_INSTRUCTION("8131067C", stur(h1, ptr(x12, 99)));
+ TEST_INSTRUCTION("81F10F7C", stur(h1, ptr(x12, 255)));
+ TEST_INSTRUCTION("8101107C", stur(h1, ptr(x12, -256)));
+ TEST_INSTRUCTION("E103007C", stur(h1, ptr(sp)));
+ TEST_INSTRUCTION("E153087C", stur(h1, ptr(sp, 133)));
+ TEST_INSTRUCTION("810100BC", stur(s1, ptr(x12)));
+ TEST_INSTRUCTION("813100BC", stur(s1, ptr(x12, 3)));
+ TEST_INSTRUCTION("813106BC", stur(s1, ptr(x12, 99)));
+ TEST_INSTRUCTION("81F10FBC", stur(s1, ptr(x12, 255)));
+ TEST_INSTRUCTION("810110BC", stur(s1, ptr(x12, -256)));
+ TEST_INSTRUCTION("E10300BC", stur(s1, ptr(sp)));
+ TEST_INSTRUCTION("E15308BC", stur(s1, ptr(sp, 133)));
+ TEST_INSTRUCTION("810100FC", stur(d1, ptr(x12)));
+ TEST_INSTRUCTION("813100FC", stur(d1, ptr(x12, 3)));
+ TEST_INSTRUCTION("813106FC", stur(d1, ptr(x12, 99)));
+ TEST_INSTRUCTION("81F10FFC", stur(d1, ptr(x12, 255)));
+ TEST_INSTRUCTION("810110FC", stur(d1, ptr(x12, -256)));
+ TEST_INSTRUCTION("E10300FC", stur(d1, ptr(sp)));
+ TEST_INSTRUCTION("E15308FC", stur(d1, ptr(sp, 133)));
+ TEST_INSTRUCTION("8101803C", stur(q1, ptr(x12)));
+ TEST_INSTRUCTION("8131803C", stur(q1, ptr(x12, 3)));
+ TEST_INSTRUCTION("8131863C", stur(q1, ptr(x12, 99)));
+ TEST_INSTRUCTION("81F18F3C", stur(q1, ptr(x12, 255)));
+ TEST_INSTRUCTION("8101903C", stur(q1, ptr(x12, -256)));
+ TEST_INSTRUCTION("E103803C", stur(q1, ptr(sp)));
+ TEST_INSTRUCTION("E153883C", stur(q1, ptr(sp, 133)));
+ TEST_INSTRUCTION("4184232E", sub(v1.b8(), v2.b8(), v3.b8()));
+ TEST_INSTRUCTION("4184632E", sub(v1.h4(), v2.h4(), v3.h4()));
+ TEST_INSTRUCTION("4184A32E", sub(v1.s2(), v2.s2(), v3.s2()));
+ TEST_INSTRUCTION("4184E37E", sub(d1, d2, d3));
+ TEST_INSTRUCTION("4184236E", sub(v1.b16(), v2.b16(), v3.b16()));
+ TEST_INSTRUCTION("4184636E", sub(v1.h8(), v2.h8(), v3.h8()));
+ TEST_INSTRUCTION("4184A36E", sub(v1.s4(), v2.s4(), v3.s4()));
+ TEST_INSTRUCTION("4184E36E", sub(v1.d2(), v2.d2(), v3.d2()));
+ TEST_INSTRUCTION("4160230E", subhn(v1.b8(), v2.h8(), v3.h8()));
+ TEST_INSTRUCTION("4160630E", subhn(v1.h4(), v2.s4(), v3.s4()));
+ TEST_INSTRUCTION("4160A30E", subhn(v1.s2(), v2.d2(), v3.d2()));
+ TEST_INSTRUCTION("4160234E", subhn2(v1.b16(), v2.h8(), v3.h8()));
+ TEST_INSTRUCTION("4160634E", subhn2(v1.h8(), v2.s4(), v3.s4()));
+ TEST_INSTRUCTION("4160A34E", subhn2(v1.s4(), v2.d2(), v3.d2()));
+ TEST_INSTRUCTION("41F0030F", sudot(v1.s2(), v2.b8(), v3.b4(0)));
+ TEST_INSTRUCTION("41F0230F", sudot(v1.s2(), v2.b8(), v3.b4(1)));
+ TEST_INSTRUCTION("41F8030F", sudot(v1.s2(), v2.b8(), v3.b4(2)));
+ TEST_INSTRUCTION("41F8230F", sudot(v1.s2(), v2.b8(), v3.b4(3)));
+ TEST_INSTRUCTION("41F0034F", sudot(v1.s4(), v2.b16(), v3.b4(0)));
+ TEST_INSTRUCTION("41F0234F", sudot(v1.s4(), v2.b16(), v3.b4(1)));
+ TEST_INSTRUCTION("41F8034F", sudot(v1.s4(), v2.b16(), v3.b4(2)));
+ TEST_INSTRUCTION("41F8234F", sudot(v1.s4(), v2.b16(), v3.b4(3)));
+ TEST_INSTRUCTION("4138205E", suqadd(b1, b2));
+ TEST_INSTRUCTION("4138605E", suqadd(h1, h2));
+ TEST_INSTRUCTION("4138A05E", suqadd(s1, s2));
+ TEST_INSTRUCTION("4138E05E", suqadd(d1, d2));
+ TEST_INSTRUCTION("4138200E", suqadd(v1.b8(), v2.b8()));
+ TEST_INSTRUCTION("4138600E", suqadd(v1.h4(), v2.h4()));
+ TEST_INSTRUCTION("4138A00E", suqadd(v1.s2(), v2.s2()));
+ TEST_INSTRUCTION("4138204E", suqadd(v1.b16(), v2.b16()));
+ TEST_INSTRUCTION("4138604E", suqadd(v1.h8(), v2.h8()));
+ TEST_INSTRUCTION("4138A04E", suqadd(v1.s4(), v2.s4()));
+ TEST_INSTRUCTION("4138E04E", suqadd(v1.d2(), v2.d2()));
+ TEST_INSTRUCTION("41A4080F", sxtl(v1.h8(), v2.b8()));
+ TEST_INSTRUCTION("41A4100F", sxtl(v1.s4(), v2.h4()));
+ TEST_INSTRUCTION("41A4200F", sxtl(v1.d2(), v2.s2()));
+ TEST_INSTRUCTION("41A4084F", sxtl2(v1.h8(), v2.b16()));
+ TEST_INSTRUCTION("41A4104F", sxtl2(v1.s4(), v2.h8()));
+ TEST_INSTRUCTION("41A4204F", sxtl2(v1.d2(), v2.s4()));
+ TEST_INSTRUCTION("4100030E", tbl(v1.b8(), v2.b16(), v3.b8()));
+ TEST_INSTRUCTION("4120040E", tbl(v1.b8(), v2.b16(), v3.b16(), v4.b8()));
+ TEST_INSTRUCTION("4140050E", tbl(v1.b8(), v2.b16(), v3.b16(), v4.b16(), v5.b8()));
+ TEST_INSTRUCTION("4160060E", tbl(v1.b8(), v2.b16(), v3.b16(), v4.b16(), v5.b16(), v6.b8()));
+ TEST_INSTRUCTION("4100034E", tbl(v1.b16(), v2.b16(), v3.b16()));
+ TEST_INSTRUCTION("4120044E", tbl(v1.b16(), v2.b16(), v3.b16(), v4.b16()));
+ TEST_INSTRUCTION("4140054E", tbl(v1.b16(), v2.b16(), v3.b16(), v4.b16(), v5.b16()));
+ TEST_INSTRUCTION("4160064E", tbl(v1.b16(), v2.b16(), v3.b16(), v4.b16(), v5.b16(), v6.b16()));
+ TEST_INSTRUCTION("4110030E", tbx(v1.b8(), v2.b16(), v3.b8()));
+ TEST_INSTRUCTION("4130040E", tbx(v1.b8(), v2.b16(), v3.b16(), v4.b8()));
+ TEST_INSTRUCTION("4150050E", tbx(v1.b8(), v2.b16(), v3.b16(), v4.b16(), v5.b8()));
+ TEST_INSTRUCTION("4170060E", tbx(v1.b8(), v2.b16(), v3.b16(), v4.b16(), v5.b16(), v6.b8()));
+ TEST_INSTRUCTION("4110034E", tbx(v1.b16(), v2.b16(), v3.b16()));
+ TEST_INSTRUCTION("4130044E", tbx(v1.b16(), v2.b16(), v3.b16(), v4.b16()));
+ TEST_INSTRUCTION("4150054E", tbx(v1.b16(), v2.b16(), v3.b16(), v4.b16(), v5.b16()));
+ TEST_INSTRUCTION("4170064E", tbx(v1.b16(), v2.b16(), v3.b16(), v4.b16(), v5.b16(), v6.b16()));
+ TEST_INSTRUCTION("4128030E", trn1(v1.b8(), v2.b8(), v3.b8()));
+ TEST_INSTRUCTION("4128430E", trn1(v1.h4(), v2.h4(), v3.h4()));
+ TEST_INSTRUCTION("4128830E", trn1(v1.s2(), v2.s2(), v3.s2()));
+ TEST_INSTRUCTION("4128034E", trn1(v1.b16(), v2.b16(), v3.b16()));
+ TEST_INSTRUCTION("4128434E", trn1(v1.h8(), v2.h8(), v3.h8()));
+ TEST_INSTRUCTION("4128834E", trn1(v1.s4(), v2.s4(), v3.s4()));
+ TEST_INSTRUCTION("4128C34E", trn1(v1.d2(), v2.d2(), v3.d2()));
+ TEST_INSTRUCTION("4168030E", trn2(v1.b8(), v2.b8(), v3.b8()));
+ TEST_INSTRUCTION("4168430E", trn2(v1.h4(), v2.h4(), v3.h4()));
+ TEST_INSTRUCTION("4168830E", trn2(v1.s2(), v2.s2(), v3.s2()));
+ TEST_INSTRUCTION("4168034E", trn2(v1.b16(), v2.b16(), v3.b16()));
+ TEST_INSTRUCTION("4168434E", trn2(v1.h8(), v2.h8(), v3.h8()));
+ TEST_INSTRUCTION("4168834E", trn2(v1.s4(), v2.s4(), v3.s4()));
+ TEST_INSTRUCTION("4168C34E", trn2(v1.d2(), v2.d2(), v3.d2()));
+ TEST_INSTRUCTION("417C232E", uaba(v1.b8(), v2.b8(), v3.b8()));
+ TEST_INSTRUCTION("417C632E", uaba(v1.h4(), v2.h4(), v3.h4()));
+ TEST_INSTRUCTION("417CA32E", uaba(v1.s2(), v2.s2(), v3.s2()));
+ TEST_INSTRUCTION("417C236E", uaba(v1.b16(), v2.b16(), v3.b16()));
+ TEST_INSTRUCTION("417C636E", uaba(v1.h8(), v2.h8(), v3.h8()));
+ TEST_INSTRUCTION("417CA36E", uaba(v1.s4(), v2.s4(), v3.s4()));
+ TEST_INSTRUCTION("4150232E", uabal(v1.h8(), v2.b8(), v3.b8()));
+ TEST_INSTRUCTION("4150632E", uabal(v1.s4(), v2.h4(), v3.h4()));
+ TEST_INSTRUCTION("4150A32E", uabal(v1.d2(), v2.s2(), v3.s2()));
+ TEST_INSTRUCTION("4150236E", uabal2(v1.h8(), v2.b16(), v3.b16()));
+ TEST_INSTRUCTION("4150636E", uabal2(v1.s4(), v2.h8(), v3.h8()));
+ TEST_INSTRUCTION("4150A36E", uabal2(v1.d2(), v2.s4(), v3.s4()));
+ TEST_INSTRUCTION("4174232E", uabd(v1.b8(), v2.b8(), v3.b8()));
+ TEST_INSTRUCTION("4174632E", uabd(v1.h4(), v2.h4(), v3.h4()));
+ TEST_INSTRUCTION("4174A32E", uabd(v1.s2(), v2.s2(), v3.s2()));
+ TEST_INSTRUCTION("4174236E", uabd(v1.b16(), v2.b16(), v3.b16()));
+ TEST_INSTRUCTION("4174636E", uabd(v1.h8(), v2.h8(), v3.h8()));
+ TEST_INSTRUCTION("4174A36E", uabd(v1.s4(), v2.s4(), v3.s4()));
+ TEST_INSTRUCTION("4170232E", uabdl(v1.h8(), v2.b8(), v3.b8()));
+ TEST_INSTRUCTION("4170632E", uabdl(v1.s4(), v2.h4(), v3.h4()));
+ TEST_INSTRUCTION("4170A32E", uabdl(v1.d2(), v2.s2(), v3.s2()));
+ TEST_INSTRUCTION("4170236E", uabdl2(v1.h8(), v2.b16(), v3.b16()));
+ TEST_INSTRUCTION("4170636E", uabdl2(v1.s4(), v2.h8(), v3.h8()));
+ TEST_INSTRUCTION("4170A36E", uabdl2(v1.d2(), v2.s4(), v3.s4()));
+ TEST_INSTRUCTION("4168202E", uadalp(v1.h4(), v2.b8()));
+ TEST_INSTRUCTION("4168602E", uadalp(v1.s2(), v2.h4()));
+ TEST_INSTRUCTION("4168A02E", uadalp(d1, v2.s2()));
+ TEST_INSTRUCTION("4168206E", uadalp(v1.h8(), v2.b16()));
+ TEST_INSTRUCTION("4168606E", uadalp(v1.s4(), v2.h8()));
+ TEST_INSTRUCTION("4168A06E", uadalp(v1.d2(), v2.s4()));
+ TEST_INSTRUCTION("4100232E", uaddl(v1.h8(), v2.b8(), v3.b8()));
+ TEST_INSTRUCTION("4100632E", uaddl(v1.s4(), v2.h4(), v3.h4()));
+ TEST_INSTRUCTION("4100A32E", uaddl(v1.d2(), v2.s2(), v3.s2()));
+ TEST_INSTRUCTION("4100236E", uaddl2(v1.h8(), v2.b16(), v3.b16()));
+ TEST_INSTRUCTION("4100636E", uaddl2(v1.s4(), v2.h8(), v3.h8()));
+ TEST_INSTRUCTION("4100A36E", uaddl2(v1.d2(), v2.s4(), v3.s4()));
+ TEST_INSTRUCTION("4128202E", uaddlp(v1.h4(), v2.b8()));
+ TEST_INSTRUCTION("4128602E", uaddlp(v1.s2(), v2.h4()));
+ TEST_INSTRUCTION("4128A02E", uaddlp(d1, v2.s2()));
+ TEST_INSTRUCTION("4128206E", uaddlp(v1.h8(), v2.b16()));
+ TEST_INSTRUCTION("4128606E", uaddlp(v1.s4(), v2.h8()));
+ TEST_INSTRUCTION("4128A06E", uaddlp(v1.d2(), v2.s4()));
+ TEST_INSTRUCTION("4138302E", uaddlv(h1, v2.b8()));
+ TEST_INSTRUCTION("4138306E", uaddlv(h1, v2.b16()));
+ TEST_INSTRUCTION("4138702E", uaddlv(s1, v2.h4()));
+ TEST_INSTRUCTION("4138706E", uaddlv(s1, v2.h8()));
+ TEST_INSTRUCTION("4138B06E", uaddlv(d1, v2.s4()));
+ TEST_INSTRUCTION("4110232E", uaddw(v1.h8(), v2.h8(), v3.b8()));
+ TEST_INSTRUCTION("4110632E", uaddw(v1.s4(), v2.s4(), v3.h4()));
+ TEST_INSTRUCTION("4110A32E", uaddw(v1.d2(), v2.d2(), v3.s2()));
+ TEST_INSTRUCTION("4110236E", uaddw2(v1.h8(), v2.h8(), v3.b16()));
+ TEST_INSTRUCTION("4110636E", uaddw2(v1.s4(), v2.s4(), v3.h8()));
+ TEST_INSTRUCTION("4110A36E", uaddw2(v1.d2(), v2.d2(), v3.s4()));
+ TEST_INSTRUCTION("4100E31E", ucvtf(h1, w2));
+ TEST_INSTRUCTION("4100231E", ucvtf(s1, w2));
+ TEST_INSTRUCTION("4100631E", ucvtf(d1, w2));
+ TEST_INSTRUCTION("4100E39E", ucvtf(h1, x2));
+ TEST_INSTRUCTION("4100239E", ucvtf(s1, x2));
+ TEST_INSTRUCTION("4100639E", ucvtf(d1, x2));
+ TEST_INSTRUCTION("41D8797E", ucvtf(h1, h2));
+ TEST_INSTRUCTION("41D8217E", ucvtf(s1, s2));
+ TEST_INSTRUCTION("41D8617E", ucvtf(d1, d2));
+ TEST_INSTRUCTION("41D8792E", ucvtf(v1.h4(), v2.h4()));
+ TEST_INSTRUCTION("41D8212E", ucvtf(v1.s2(), v2.s2()));
+ TEST_INSTRUCTION("41D8796E", ucvtf(v1.h8(), v2.h8()));
+ TEST_INSTRUCTION("41D8216E", ucvtf(v1.s4(), v2.s4()));
+ TEST_INSTRUCTION("41D8616E", ucvtf(v1.d2(), v2.d2()));
+ TEST_INSTRUCTION("41E0C31E", ucvtf(h1, w2, 8));
+ TEST_INSTRUCTION("41E0031E", ucvtf(s1, w2, 8));
+ TEST_INSTRUCTION("41E0431E", ucvtf(d1, w2, 8));
+ TEST_INSTRUCTION("41E0C39E", ucvtf(h1, x2, 8));
+ TEST_INSTRUCTION("41E0039E", ucvtf(s1, x2, 8));
+ TEST_INSTRUCTION("41E0439E", ucvtf(d1, x2, 8));
+ TEST_INSTRUCTION("41E4187F", ucvtf(h1, h2, 8));
+ TEST_INSTRUCTION("41E4387F", ucvtf(s1, s2, 8));
+ TEST_INSTRUCTION("41E4787F", ucvtf(d1, d2, 8));
+ TEST_INSTRUCTION("41E4182F", ucvtf(v1.h4(), v2.h4(), 8));
+ TEST_INSTRUCTION("41E4382F", ucvtf(v1.s2(), v2.s2(), 8));
+ TEST_INSTRUCTION("41E4186F", ucvtf(v1.h8(), v2.h8(), 8));
+ TEST_INSTRUCTION("41E4386F", ucvtf(v1.s4(), v2.s4(), 8));
+ TEST_INSTRUCTION("41E4786F", ucvtf(v1.d2(), v2.d2(), 8));
+ TEST_INSTRUCTION("4194832E", udot(v1.s2(), v2.b8(), v3.b8()));
+ TEST_INSTRUCTION("4194836E", udot(v1.s4(), v2.b16(), v3.b16()));
+ TEST_INSTRUCTION("41E0832F", udot(v1.s2(), v2.b8(), v3.b4(0)));
+ TEST_INSTRUCTION("41E0A32F", udot(v1.s2(), v2.b8(), v3.b4(1)));
+ TEST_INSTRUCTION("41E8832F", udot(v1.s2(), v2.b8(), v3.b4(2)));
+ TEST_INSTRUCTION("41E8A32F", udot(v1.s2(), v2.b8(), v3.b4(3)));
+ TEST_INSTRUCTION("41E0836F", udot(v1.s4(), v2.b16(), v3.b4(0)));
+ TEST_INSTRUCTION("41E0A36F", udot(v1.s4(), v2.b16(), v3.b4(1)));
+ TEST_INSTRUCTION("41E8836F", udot(v1.s4(), v2.b16(), v3.b4(2)));
+ TEST_INSTRUCTION("41E8A36F", udot(v1.s4(), v2.b16(), v3.b4(3)));
+ TEST_INSTRUCTION("4104232E", uhadd(v1.b8(), v2.b8(), v3.b8()));
+ TEST_INSTRUCTION("4104632E", uhadd(v1.h4(), v2.h4(), v3.h4()));
+ TEST_INSTRUCTION("4104A32E", uhadd(v1.s2(), v2.s2(), v3.s2()));
+ TEST_INSTRUCTION("4104236E", uhadd(v1.b16(), v2.b16(), v3.b16()));
+ TEST_INSTRUCTION("4104636E", uhadd(v1.h8(), v2.h8(), v3.h8()));
+ TEST_INSTRUCTION("4104A36E", uhadd(v1.s4(), v2.s4(), v3.s4()));
+ TEST_INSTRUCTION("4124232E", uhsub(v1.b8(), v2.b8(), v3.b8()));
+ TEST_INSTRUCTION("4124632E", uhsub(v1.h4(), v2.h4(), v3.h4()));
+ TEST_INSTRUCTION("4124A32E", uhsub(v1.s2(), v2.s2(), v3.s2()));
+ TEST_INSTRUCTION("4124236E", uhsub(v1.b16(), v2.b16(), v3.b16()));
+ TEST_INSTRUCTION("4124636E", uhsub(v1.h8(), v2.h8(), v3.h8()));
+ TEST_INSTRUCTION("4124A36E", uhsub(v1.s4(), v2.s4(), v3.s4()));
+ TEST_INSTRUCTION("4164232E", umax(v1.b8(), v2.b8(), v3.b8()));
+ TEST_INSTRUCTION("4164632E", umax(v1.h4(), v2.h4(), v3.h4()));
+ TEST_INSTRUCTION("4164A32E", umax(v1.s2(), v2.s2(), v3.s2()));
+ TEST_INSTRUCTION("4164236E", umax(v1.b16(), v2.b16(), v3.b16()));
+ TEST_INSTRUCTION("4164636E", umax(v1.h8(), v2.h8(), v3.h8()));
+ TEST_INSTRUCTION("4164A36E", umax(v1.s4(), v2.s4(), v3.s4()));
+ TEST_INSTRUCTION("41A4232E", umaxp(v1.b8(), v2.b8(), v3.b8()));
+ TEST_INSTRUCTION("41A4632E", umaxp(v1.h4(), v2.h4(), v3.h4()));
+ TEST_INSTRUCTION("41A4A32E", umaxp(v1.s2(), v2.s2(), v3.s2()));
+ TEST_INSTRUCTION("41A4236E", umaxp(v1.b16(), v2.b16(), v3.b16()));
+ TEST_INSTRUCTION("41A4636E", umaxp(v1.h8(), v2.h8(), v3.h8()));
+ TEST_INSTRUCTION("41A4A36E", umaxp(v1.s4(), v2.s4(), v3.s4()));
+ TEST_INSTRUCTION("41A8302E", umaxv(b1, v2.b8()));
+ TEST_INSTRUCTION("41A8306E", umaxv(b1, v2.b16()));
+ TEST_INSTRUCTION("41A8702E", umaxv(h1, v2.h4()));
+ TEST_INSTRUCTION("41A8706E", umaxv(h1, v2.h8()));
+ TEST_INSTRUCTION("41A8B06E", umaxv(s1, v2.s4()));
+ TEST_INSTRUCTION("416C232E", umin(v1.b8(), v2.b8(), v3.b8()));
+ TEST_INSTRUCTION("416C632E", umin(v1.h4(), v2.h4(), v3.h4()));
+ TEST_INSTRUCTION("416CA32E", umin(v1.s2(), v2.s2(), v3.s2()));
+ TEST_INSTRUCTION("416C236E", umin(v1.b16(), v2.b16(), v3.b16()));
+ TEST_INSTRUCTION("416C636E", umin(v1.h8(), v2.h8(), v3.h8()));
+ TEST_INSTRUCTION("416CA36E", umin(v1.s4(), v2.s4(), v3.s4()));
+ TEST_INSTRUCTION("41AC232E", uminp(v1.b8(), v2.b8(), v3.b8()));
+ TEST_INSTRUCTION("41AC632E", uminp(v1.h4(), v2.h4(), v3.h4()));
+ TEST_INSTRUCTION("41ACA32E", uminp(v1.s2(), v2.s2(), v3.s2()));
+ TEST_INSTRUCTION("41AC236E", uminp(v1.b16(), v2.b16(), v3.b16()));
+ TEST_INSTRUCTION("41AC636E", uminp(v1.h8(), v2.h8(), v3.h8()));
+ TEST_INSTRUCTION("41ACA36E", uminp(v1.s4(), v2.s4(), v3.s4()));
+ TEST_INSTRUCTION("41A8312E", uminv(b1, v2.b8()));
+ TEST_INSTRUCTION("41A8316E", uminv(b1, v2.b16()));
+ TEST_INSTRUCTION("41A8712E", uminv(h1, v2.h4()));
+ TEST_INSTRUCTION("41A8716E", uminv(h1, v2.h8()));
+ TEST_INSTRUCTION("41A8B16E", uminv(s1, v2.s4()));
+ TEST_INSTRUCTION("4180232E", umlal(v1.h8(), v2.b8(), v3.b8()));
+ TEST_INSTRUCTION("4180632E", umlal(v1.s4(), v2.h4(), v3.h4()));
+ TEST_INSTRUCTION("4180A32E", umlal(v1.d2(), v2.s2(), v3.s2()));
+ TEST_INSTRUCTION("4120732F", umlal(v1.s4(), v2.h4(), v3.h(3)));
+ TEST_INSTRUCTION("4128A32F", umlal(v1.d2(), v2.s2(), v3.s(3)));
+ TEST_INSTRUCTION("4180236E", umlal2(v1.h8(), v2.b16(), v3.b16()));
+ TEST_INSTRUCTION("4180636E", umlal2(v1.s4(), v2.h8(), v3.h8()));
+ TEST_INSTRUCTION("4180A36E", umlal2(v1.d2(), v2.s4(), v3.s4()));
+ TEST_INSTRUCTION("4120736F", umlal2(v1.s4(), v2.h8(), v3.h(3)));
+ TEST_INSTRUCTION("4128A36F", umlal2(v1.d2(), v2.s4(), v3.s(3)));
+ TEST_INSTRUCTION("41A0232E", umlsl(v1.h8(), v2.b8(), v3.b8()));
+ TEST_INSTRUCTION("41A0632E", umlsl(v1.s4(), v2.h4(), v3.h4()));
+ TEST_INSTRUCTION("41A0A32E", umlsl(v1.d2(), v2.s2(), v3.s2()));
+ TEST_INSTRUCTION("4160732F", umlsl(v1.s4(), v2.h4(), v3.h(3)));
+ TEST_INSTRUCTION("4168A32F", umlsl(v1.d2(), v2.s2(), v3.s(3)));
+ TEST_INSTRUCTION("41A0236E", umlsl2(v1.h8(), v2.b16(), v3.b16()));
+ TEST_INSTRUCTION("41A0636E", umlsl2(v1.s4(), v2.h8(), v3.h8()));
+ TEST_INSTRUCTION("41A0A36E", umlsl2(v1.d2(), v2.s4(), v3.s4()));
+ TEST_INSTRUCTION("4160736F", umlsl2(v1.s4(), v2.h8(), v3.h(3)));
+ TEST_INSTRUCTION("4168A36F", umlsl2(v1.d2(), v2.s4(), v3.s(3)));
+ TEST_INSTRUCTION("41A4836E", ummla(v1.s4(), v2.b16(), v3.b16()));
+ TEST_INSTRUCTION("413C010E", umov(w1, v2.b(0)));
+ TEST_INSTRUCTION("413C1F0E", umov(w1, v2.b(15)));
+ TEST_INSTRUCTION("413C020E", umov(w1, v2.h(0)));
+ TEST_INSTRUCTION("413C1E0E", umov(w1, v2.h(7)));
+ TEST_INSTRUCTION("413C040E", umov(w1, v2.s(0)));
+ TEST_INSTRUCTION("413C1C0E", umov(w1, v2.s(3)));
+ TEST_INSTRUCTION("413C084E", umov(x1, v2.d(0)));
+ TEST_INSTRUCTION("413C184E", umov(x1, v2.d(1)));
+ TEST_INSTRUCTION("41C0232E", umull(v1.h8(), v2.b8(), v3.b8()));
+ TEST_INSTRUCTION("41C0632E", umull(v1.s4(), v2.h4(), v3.h4()));
+ TEST_INSTRUCTION("41C0A32E", umull(v1.d2(), v2.s2(), v3.s2()));
+ TEST_INSTRUCTION("41A0732F", umull(v1.s4(), v2.h4(), v3.h(3)));
+ TEST_INSTRUCTION("41A8A32F", umull(v1.d2(), v2.s2(), v3.s(3)));
+ TEST_INSTRUCTION("41C0236E", umull2(v1.h8(), v2.b16(), v3.b16()));
+ TEST_INSTRUCTION("41C0636E", umull2(v1.s4(), v2.h8(), v3.h8()));
+ TEST_INSTRUCTION("41C0A36E", umull2(v1.d2(), v2.s4(), v3.s4()));
+ TEST_INSTRUCTION("41A0736F", umull2(v1.s4(), v2.h8(), v3.h(3)));
+ TEST_INSTRUCTION("41A8A36F", umull2(v1.d2(), v2.s4(), v3.s(3)));
+ TEST_INSTRUCTION("410C237E", uqadd(b1, b2, b3));
+ TEST_INSTRUCTION("410C637E", uqadd(h1, h2, h3));
+ TEST_INSTRUCTION("410CA37E", uqadd(s1, s2, s3));
+ TEST_INSTRUCTION("410CE37E", uqadd(d1, d2, d3));
+ TEST_INSTRUCTION("410C232E", uqadd(v1.b8(), v2.b8(), v3.b8()));
+ TEST_INSTRUCTION("410C632E", uqadd(v1.h4(), v2.h4(), v3.h4()));
+ TEST_INSTRUCTION("410CA32E", uqadd(v1.s2(), v2.s2(), v3.s2()));
+ TEST_INSTRUCTION("410C236E", uqadd(v1.b16(), v2.b16(), v3.b16()));
+ TEST_INSTRUCTION("410C636E", uqadd(v1.h8(), v2.h8(), v3.h8()));
+ TEST_INSTRUCTION("410CA36E", uqadd(v1.s4(), v2.s4(), v3.s4()));
+ TEST_INSTRUCTION("410CE36E", uqadd(v1.d2(), v2.d2(), v3.d2()));
+ TEST_INSTRUCTION("415C237E", uqrshl(b1, b2, b3));
+ TEST_INSTRUCTION("415C637E", uqrshl(h1, h2, h3));
+ TEST_INSTRUCTION("415CA37E", uqrshl(s1, s2, s3));
+ TEST_INSTRUCTION("415C232E", uqrshl(v1.b8(), v2.b8(), v3.b8()));
+ TEST_INSTRUCTION("415C632E", uqrshl(v1.h4(), v2.h4(), v3.h4()));
+ TEST_INSTRUCTION("415CA32E", uqrshl(v1.s2(), v2.s2(), v3.s2()));
+ TEST_INSTRUCTION("415CE37E", uqrshl(d1, d2, d3));
+ TEST_INSTRUCTION("415C236E", uqrshl(v1.b16(), v2.b16(), v3.b16()));
+ TEST_INSTRUCTION("415C636E", uqrshl(v1.h8(), v2.h8(), v3.h8()));
+ TEST_INSTRUCTION("415CA36E", uqrshl(v1.s4(), v2.s4(), v3.s4()));
+ TEST_INSTRUCTION("415CE36E", uqrshl(v1.d2(), v2.d2(), v3.d2()));
+ TEST_INSTRUCTION("419C087F", uqrshrn(b1, h2, 8));
+ TEST_INSTRUCTION("419C107F", uqrshrn(h1, s2, 16));
+ TEST_INSTRUCTION("419C207F", uqrshrn(s1, d2, 32));
+ TEST_INSTRUCTION("419C082F", uqrshrn(v1.b8(), v2.h8(), 8));
+ TEST_INSTRUCTION("419C102F", uqrshrn(v1.h4(), v2.s4(), 16));
+ TEST_INSTRUCTION("419C202F", uqrshrn(v1.s2(), v2.d2(), 32));
+ TEST_INSTRUCTION("419C086F", uqrshrn2(v1.b16(), v2.h8(), 8));
+ TEST_INSTRUCTION("419C106F", uqrshrn2(v1.h8(), v2.s4(), 16));
+ TEST_INSTRUCTION("419C206F", uqrshrn2(v1.s4(), v2.d2(), 32));
+ TEST_INSTRUCTION("4174097F", uqshl(b1, b2, 1));
+ TEST_INSTRUCTION("4174127F", uqshl(h1, h2, 2));
+ TEST_INSTRUCTION("4174237F", uqshl(s1, s2, 3));
+ TEST_INSTRUCTION("41740F2F", uqshl(v1.b8(), v2.b8(), 7));
+ TEST_INSTRUCTION("41741F2F", uqshl(v1.h4(), v2.h4(), 15));
+ TEST_INSTRUCTION("41743F2F", uqshl(v1.s2(), v2.s2(), 31));
+ TEST_INSTRUCTION("41747F7F", uqshl(d1, d2, 63));
+ TEST_INSTRUCTION("41740F6F", uqshl(v1.b16(), v2.b16(), 7));
+ TEST_INSTRUCTION("41741F6F", uqshl(v1.h8(), v2.h8(), 15));
+ TEST_INSTRUCTION("41743F6F", uqshl(v1.s4(), v2.s4(), 31));
+ TEST_INSTRUCTION("41747F6F", uqshl(v1.d2(), v2.d2(), 63));
+ TEST_INSTRUCTION("414C237E", uqshl(b1, b2, b3));
+ TEST_INSTRUCTION("414C637E", uqshl(h1, h2, h3));
+ TEST_INSTRUCTION("414CA37E", uqshl(s1, s2, s3));
+ TEST_INSTRUCTION("414C232E", uqshl(v1.b8(), v2.b8(), v3.b8()));
+ TEST_INSTRUCTION("414C632E", uqshl(v1.h4(), v2.h4(), v3.h4()));
+ TEST_INSTRUCTION("414CA32E", uqshl(v1.s2(), v2.s2(), v3.s2()));
+ TEST_INSTRUCTION("414CE37E", uqshl(d1, d2, d3));
+ TEST_INSTRUCTION("414C236E", uqshl(v1.b16(), v2.b16(), v3.b16()));
+ TEST_INSTRUCTION("414C636E", uqshl(v1.h8(), v2.h8(), v3.h8()));
+ TEST_INSTRUCTION("414CA36E", uqshl(v1.s4(), v2.s4(), v3.s4()));
+ TEST_INSTRUCTION("414CE36E", uqshl(v1.d2(), v2.d2(), v3.d2()));
+ TEST_INSTRUCTION("4194087F", uqshrn(b1, h2, 8));
+ TEST_INSTRUCTION("4194107F", uqshrn(h1, s2, 16));
+ TEST_INSTRUCTION("4194207F", uqshrn(s1, d2, 32));
+ TEST_INSTRUCTION("4194082F", uqshrn(v1.b8(), v2.h8(), 8));
+ TEST_INSTRUCTION("4194102F", uqshrn(v1.h4(), v2.s4(), 16));
+ TEST_INSTRUCTION("4194202F", uqshrn(v1.s2(), v2.d2(), 32));
+ TEST_INSTRUCTION("4194086F", uqshrn2(v1.b16(), v2.h8(), 8));
+ TEST_INSTRUCTION("4194106F", uqshrn2(v1.h8(), v2.s4(), 16));
+ TEST_INSTRUCTION("4194206F", uqshrn2(v1.s4(), v2.d2(), 32));
+ TEST_INSTRUCTION("412C237E", uqsub(b1, b2, b3));
+ TEST_INSTRUCTION("412C637E", uqsub(h1, h2, h3));
+ TEST_INSTRUCTION("412CA37E", uqsub(s1, s2, s3));
+ TEST_INSTRUCTION("412CE37E", uqsub(d1, d2, d3));
+ TEST_INSTRUCTION("412C232E", uqsub(v1.b8(), v2.b8(), v3.b8()));
+ TEST_INSTRUCTION("412C632E", uqsub(v1.h4(), v2.h4(), v3.h4()));
+ TEST_INSTRUCTION("412CA32E", uqsub(v1.s2(), v2.s2(), v3.s2()));
+ TEST_INSTRUCTION("412C236E", uqsub(v1.b16(), v2.b16(), v3.b16()));
+ TEST_INSTRUCTION("412C636E", uqsub(v1.h8(), v2.h8(), v3.h8()));
+ TEST_INSTRUCTION("412CA36E", uqsub(v1.s4(), v2.s4(), v3.s4()));
+ TEST_INSTRUCTION("412CE36E", uqsub(v1.d2(), v2.d2(), v3.d2()));
+ TEST_INSTRUCTION("4148217E", uqxtn(b1, h2));
+ TEST_INSTRUCTION("4148617E", uqxtn(h1, s2));
+ TEST_INSTRUCTION("4148A17E", uqxtn(s1, d2));
+ TEST_INSTRUCTION("4148212E", uqxtn(v1.b8(), v2.h8()));
+ TEST_INSTRUCTION("4148612E", uqxtn(v1.h4(), v2.s4()));
+ TEST_INSTRUCTION("4148A12E", uqxtn(v1.s2(), v2.d2()));
+ TEST_INSTRUCTION("4148216E", uqxtn2(v1.b16(), v2.h8()));
+ TEST_INSTRUCTION("4148616E", uqxtn2(v1.h8(), v2.s4()));
+ TEST_INSTRUCTION("4148A16E", uqxtn2(v1.s4(), v2.d2()));
+ TEST_INSTRUCTION("41C8A10E", urecpe(v1.s2(), v2.s2()));
+ TEST_INSTRUCTION("41C8A14E", urecpe(v1.s4(), v2.s4()));
+ TEST_INSTRUCTION("4114232E", urhadd(v1.b8(), v2.b8(), v3.b8()));
+ TEST_INSTRUCTION("4114632E", urhadd(v1.h4(), v2.h4(), v3.h4()));
+ TEST_INSTRUCTION("4114A32E", urhadd(v1.s2(), v2.s2(), v3.s2()));
+ TEST_INSTRUCTION("4114236E", urhadd(v1.b16(), v2.b16(), v3.b16()));
+ TEST_INSTRUCTION("4114636E", urhadd(v1.h8(), v2.h8(), v3.h8()));
+ TEST_INSTRUCTION("4114A36E", urhadd(v1.s4(), v2.s4(), v3.s4()));
+ TEST_INSTRUCTION("4154232E", urshl(v1.b8(), v2.b8(), v3.b8()));
+ TEST_INSTRUCTION("4154632E", urshl(v1.h4(), v2.h4(), v3.h4()));
+ TEST_INSTRUCTION("4154A32E", urshl(v1.s2(), v2.s2(), v3.s2()));
+ TEST_INSTRUCTION("4154E37E", urshl(d1, d2, d3));
+ TEST_INSTRUCTION("4154236E", urshl(v1.b16(), v2.b16(), v3.b16()));
+ TEST_INSTRUCTION("4154636E", urshl(v1.h8(), v2.h8(), v3.h8()));
+ TEST_INSTRUCTION("4154A36E", urshl(v1.s4(), v2.s4(), v3.s4()));
+ TEST_INSTRUCTION("4154E36E", urshl(v1.d2(), v2.d2(), v3.d2()));
+ TEST_INSTRUCTION("4124092F", urshr(v1.b8(), v2.b8(), 7));
+ TEST_INSTRUCTION("4124112F", urshr(v1.h4(), v2.h4(), 15));
+ TEST_INSTRUCTION("4124212F", urshr(v1.s2(), v2.s2(), 31));
+ TEST_INSTRUCTION("4124417F", urshr(d1, d2, 63));
+ TEST_INSTRUCTION("4124096F", urshr(v1.b16(), v2.b16(), 7));
+ TEST_INSTRUCTION("4124116F", urshr(v1.h8(), v2.h8(), 15));
+ TEST_INSTRUCTION("4124216F", urshr(v1.s4(), v2.s4(), 31));
+ TEST_INSTRUCTION("4124416F", urshr(v1.d2(), v2.d2(), 63));
+ TEST_INSTRUCTION("41C8A12E", ursqrte(v1.s2(), v2.s2()));
+ TEST_INSTRUCTION("41C8A16E", ursqrte(v1.s4(), v2.s4()));
+ TEST_INSTRUCTION("4134092F", ursra(v1.b8(), v2.b8(), 7));
+ TEST_INSTRUCTION("4134112F", ursra(v1.h4(), v2.h4(), 15));
+ TEST_INSTRUCTION("4134212F", ursra(v1.s2(), v2.s2(), 31));
+ TEST_INSTRUCTION("4134417F", ursra(d1, d2, 63));
+ TEST_INSTRUCTION("4134096F", ursra(v1.b16(), v2.b16(), 7));
+ TEST_INSTRUCTION("4134116F", ursra(v1.h8(), v2.h8(), 15));
+ TEST_INSTRUCTION("4134216F", ursra(v1.s4(), v2.s4(), 31));
+ TEST_INSTRUCTION("4134416F", ursra(v1.d2(), v2.d2(), 63));
+ TEST_INSTRUCTION("419C830E", usdot(v1.s2(), v2.b8(), v3.b8()));
+ TEST_INSTRUCTION("419C834E", usdot(v1.s4(), v2.b16(), v3.b16()));
+ TEST_INSTRUCTION("41F0830F", usdot(v1.s2(), v2.b8(), v3.b4(0)));
+ TEST_INSTRUCTION("41F0A30F", usdot(v1.s2(), v2.b8(), v3.b4(1)));
+ TEST_INSTRUCTION("41F8830F", usdot(v1.s2(), v2.b8(), v3.b4(2)));
+ TEST_INSTRUCTION("41F8A30F", usdot(v1.s2(), v2.b8(), v3.b4(3)));
+ TEST_INSTRUCTION("41F0834F", usdot(v1.s4(), v2.b16(), v3.b4(0)));
+ TEST_INSTRUCTION("41F0A34F", usdot(v1.s4(), v2.b16(), v3.b4(1)));
+ TEST_INSTRUCTION("41F8834F", usdot(v1.s4(), v2.b16(), v3.b4(2)));
+ TEST_INSTRUCTION("41F8A34F", usdot(v1.s4(), v2.b16(), v3.b4(3)));
+ TEST_INSTRUCTION("4144232E", ushl(v1.b8(), v2.b8(), v3.b8()));
+ TEST_INSTRUCTION("4144632E", ushl(v1.h4(), v2.h4(), v3.h4()));
+ TEST_INSTRUCTION("4144A32E", ushl(v1.s2(), v2.s2(), v3.s2()));
+ TEST_INSTRUCTION("4144E37E", ushl(d1, d2, d3));
+ TEST_INSTRUCTION("4144236E", ushl(v1.b16(), v2.b16(), v3.b16()));
+ TEST_INSTRUCTION("4144636E", ushl(v1.h8(), v2.h8(), v3.h8()));
+ TEST_INSTRUCTION("4144A36E", ushl(v1.s4(), v2.s4(), v3.s4()));
+ TEST_INSTRUCTION("4144E36E", ushl(v1.d2(), v2.d2(), v3.d2()));
+ TEST_INSTRUCTION("41A40F2F", ushll(v1.h8(), v2.b8(), 7));
+ TEST_INSTRUCTION("41A41F2F", ushll(v1.s4(), v2.h4(), 15));
+ TEST_INSTRUCTION("41A43F2F", ushll(v1.d2(), v2.s2(), 31));
+ TEST_INSTRUCTION("41A40F6F", ushll2(v1.h8(), v2.b16(), 7));
+ TEST_INSTRUCTION("41A41F6F", ushll2(v1.s4(), v2.h8(), 15));
+ TEST_INSTRUCTION("41A43F6F", ushll2(v1.s2(), v2.s4(), 31));
+ TEST_INSTRUCTION("4104092F", ushr(v1.b8(), v2.b8(), 7));
+ TEST_INSTRUCTION("4104112F", ushr(v1.h4(), v2.h4(), 15));
+ TEST_INSTRUCTION("4104212F", ushr(v1.s2(), v2.s2(), 31));
+ TEST_INSTRUCTION("4104417F", ushr(d1, d2, 63));
+ TEST_INSTRUCTION("4104096F", ushr(v1.b16(), v2.b16(), 7));
+ TEST_INSTRUCTION("4104116F", ushr(v1.h8(), v2.h8(), 15));
+ TEST_INSTRUCTION("4104216F", ushr(v1.s4(), v2.s4(), 31));
+ TEST_INSTRUCTION("4104416F", ushr(v1.d2(), v2.d2(), 63));
+ TEST_INSTRUCTION("41AC834E", usmmla(v1.s4(), v2.b16(), v3.b16()));
+ TEST_INSTRUCTION("4138207E", usqadd(b1, b2));
+ TEST_INSTRUCTION("4138607E", usqadd(h1, h2));
+ TEST_INSTRUCTION("4138A07E", usqadd(s1, s2));
+ TEST_INSTRUCTION("4138E07E", usqadd(d1, d2));
+ TEST_INSTRUCTION("4138202E", usqadd(v1.b8(), v2.b8()));
+ TEST_INSTRUCTION("4138602E", usqadd(v1.h4(), v2.h4()));
+ TEST_INSTRUCTION("4138A02E", usqadd(v1.s2(), v2.s2()));
+ TEST_INSTRUCTION("4138206E", usqadd(v1.b16(), v2.b16()));
+ TEST_INSTRUCTION("4138606E", usqadd(v1.h8(), v2.h8()));
+ TEST_INSTRUCTION("4138A06E", usqadd(v1.s4(), v2.s4()));
+ TEST_INSTRUCTION("4138E06E", usqadd(v1.d2(), v2.d2()));
+ TEST_INSTRUCTION("4114092F", usra(v1.b8(), v2.b8(), 7));
+ TEST_INSTRUCTION("4114112F", usra(v1.h4(), v2.h4(), 15));
+ TEST_INSTRUCTION("4114212F", usra(v1.s2(), v2.s2(), 31));
+ TEST_INSTRUCTION("4114417F", usra(d1, d2, 63));
+ TEST_INSTRUCTION("4114096F", usra(v1.b16(), v2.b16(), 7));
+ TEST_INSTRUCTION("4114116F", usra(v1.h8(), v2.h8(), 15));
+ TEST_INSTRUCTION("4114216F", usra(v1.s4(), v2.s4(), 31));
+ TEST_INSTRUCTION("4114416F", usra(v1.d2(), v2.d2(), 63));
+ TEST_INSTRUCTION("4120232E", usubl(v1.h8(), v2.b8(), v3.b8()));
+ TEST_INSTRUCTION("4120632E", usubl(v1.s4(), v2.h4(), v3.h4()));
+ TEST_INSTRUCTION("4120A32E", usubl(v1.d2(), v2.s2(), v3.s2()));
+ TEST_INSTRUCTION("4120236E", usubl2(v1.h8(), v2.b16(), v3.b16()));
+ TEST_INSTRUCTION("4120636E", usubl2(v1.s4(), v2.h8(), v3.h8()));
+ TEST_INSTRUCTION("4120A36E", usubl2(v1.d2(), v2.s4(), v3.s4()));
+ TEST_INSTRUCTION("4130232E", usubw(v1.h8(), v2.h8(), v3.b8()));
+ TEST_INSTRUCTION("4130632E", usubw(v1.s4(), v2.s4(), v3.h4()));
+ TEST_INSTRUCTION("4130A32E", usubw(v1.d2(), v2.d2(), v3.s2()));
+ TEST_INSTRUCTION("4130236E", usubw2(v1.h8(), v2.h8(), v3.b16()));
+ TEST_INSTRUCTION("4130636E", usubw2(v1.s4(), v2.s4(), v3.h8()));
+ TEST_INSTRUCTION("4130A36E", usubw2(v1.d2(), v2.d2(), v3.s4()));
+ TEST_INSTRUCTION("41A4082F", uxtl(v1.h8(), v2.b8()));
+ TEST_INSTRUCTION("41A4102F", uxtl(v1.s4(), v2.h4()));
+ TEST_INSTRUCTION("41A4202F", uxtl(v1.d2(), v2.s2()));
+ TEST_INSTRUCTION("41A4086F", uxtl2(v1.h8(), v2.b16()));
+ TEST_INSTRUCTION("41A4106F", uxtl2(v1.s4(), v2.h8()));
+ TEST_INSTRUCTION("41A4206F", uxtl2(v1.d2(), v2.s4()));
+ TEST_INSTRUCTION("4118030E", uzp1(v1.b8(), v2.b8(), v3.b8()));
+ TEST_INSTRUCTION("4118430E", uzp1(v1.h4(), v2.h4(), v3.h4()));
+ TEST_INSTRUCTION("4118830E", uzp1(v1.s2(), v2.s2(), v3.s2()));
+ TEST_INSTRUCTION("4118034E", uzp1(v1.b16(), v2.b16(), v3.b16()));
+ TEST_INSTRUCTION("4118434E", uzp1(v1.h8(), v2.h8(), v3.h8()));
+ TEST_INSTRUCTION("4118834E", uzp1(v1.s4(), v2.s4(), v3.s4()));
+ TEST_INSTRUCTION("4118C34E", uzp1(v1.d2(), v2.d2(), v3.d2()));
+ TEST_INSTRUCTION("4158030E", uzp2(v1.b8(), v2.b8(), v3.b8()));
+ TEST_INSTRUCTION("4158430E", uzp2(v1.h4(), v2.h4(), v3.h4()));
+ TEST_INSTRUCTION("4158830E", uzp2(v1.s2(), v2.s2(), v3.s2()));
+ TEST_INSTRUCTION("4158034E", uzp2(v1.b16(), v2.b16(), v3.b16()));
+ TEST_INSTRUCTION("4158434E", uzp2(v1.h8(), v2.h8(), v3.h8()));
+ TEST_INSTRUCTION("4158834E", uzp2(v1.s4(), v2.s4(), v3.s4()));
+ TEST_INSTRUCTION("4158C34E", uzp2(v1.d2(), v2.d2(), v3.d2()));
+ TEST_INSTRUCTION("4128210E", xtn(v1.b8(), v2.h8()));
+ TEST_INSTRUCTION("4128610E", xtn(v1.h4(), v2.s4()));
+ TEST_INSTRUCTION("4128A10E", xtn(v1.s2(), v2.d2()));
+ TEST_INSTRUCTION("4128214E", xtn2(v1.b16(), v2.h8()));
+ TEST_INSTRUCTION("4128614E", xtn2(v1.h8(), v2.s4()));
+ TEST_INSTRUCTION("4128A14E", xtn2(v1.s4(), v2.d2()));
+ TEST_INSTRUCTION("4138030E", zip1(v1.b8(), v2.b8(), v3.b8()));
+ TEST_INSTRUCTION("4138430E", zip1(v1.h4(), v2.h4(), v3.h4()));
+ TEST_INSTRUCTION("4138830E", zip1(v1.s2(), v2.s2(), v3.s2()));
+ TEST_INSTRUCTION("4138034E", zip1(v1.b16(), v2.b16(), v3.b16()));
+ TEST_INSTRUCTION("4138434E", zip1(v1.h8(), v2.h8(), v3.h8()));
+ TEST_INSTRUCTION("4138834E", zip1(v1.s4(), v2.s4(), v3.s4()));
+ TEST_INSTRUCTION("4138C34E", zip1(v1.d2(), v2.d2(), v3.d2()));
+ TEST_INSTRUCTION("4178030E", zip2(v1.b8(), v2.b8(), v3.b8()));
+ TEST_INSTRUCTION("4178430E", zip2(v1.h4(), v2.h4(), v3.h4()));
+ TEST_INSTRUCTION("4178830E", zip2(v1.s2(), v2.s2(), v3.s2()));
+ TEST_INSTRUCTION("4178034E", zip2(v1.b16(), v2.b16(), v3.b16()));
+ TEST_INSTRUCTION("4178434E", zip2(v1.h8(), v2.h8(), v3.h8()));
+ TEST_INSTRUCTION("4178834E", zip2(v1.s4(), v2.s4(), v3.s4()));
+ TEST_INSTRUCTION("4178C34E", zip2(v1.d2(), v2.d2(), v3.d2()));
+}
+
+static void ASMJIT_NOINLINE testA64AssemblerExtras(AssemblerTester<a64::Assembler>& tester) noexcept {
+ using namespace a64;
+
+ // AsmJit additions - AArch64 assembler accepts variety of immediates in
+ // MOVI instruction that it encodes by changing the size of its operands.
+ TEST_INSTRUCTION("C1E7074F", movi(v1.b16(), 0xFE));
+ TEST_INSTRUCTION("C1E7074F", movi(v1.h8(), 0xFEFE));
+ TEST_INSTRUCTION("C1E7074F", movi(v1.s4(), 0xFEFEFEFE));
+ TEST_INSTRUCTION("C1E7074F", movi(v1.d2(), 0xFEFEFEFEFEFEFEFE));
+ TEST_INSTRUCTION("C1A7074F", movi(v1.h8(), 0xFE, lsl(8)));
+ TEST_INSTRUCTION("C1A7074F", movi(v1.h8(), 0xFE00));
+ TEST_INSTRUCTION("C1A7074F", movi(v1.s4(), 0xFE00FE00));
+ TEST_INSTRUCTION("C1A7074F", movi(v1.d2(), 0xFE00FE00FE00FE00));
+ TEST_INSTRUCTION("C147074F", movi(v1.s4(), 0xFE, lsl(16)));
+ TEST_INSTRUCTION("C147074F", movi(v1.s4(), 0x00FE0000));
+ TEST_INSTRUCTION("C147074F", movi(v1.d2(), 0x00FE000000FE0000));
+ TEST_INSTRUCTION("C167074F", movi(v1.s4(), 0xFE, lsl(24)));
+ TEST_INSTRUCTION("C167074F", movi(v1.s4(), 0xFE000000));
+ TEST_INSTRUCTION("C167074F", movi(v1.d2(), 0xFE000000FE000000));
+}
+
+bool testA64Assembler(const TestSettings& settings) noexcept {
+ using namespace a64;
+
+ AssemblerTester<Assembler> tester(Arch::kAArch64, settings);
+ tester.printHeader("AArch64");
+
+ testA64AssemblerBase(tester);
+ testA64AssemblerRel(tester);
+ testA64AssemblerSIMD(tester);
+ testA64AssemblerExtras(tester);
+
+ tester.printSummary();
+ return tester.didPass();
+}
+
+#undef TEST_INSTRUCTION
+
+#endif // !ASMJIT_NO_AARCH64
diff --git a/3rdparty/asmjit/test/asmjit_test_assembler_x64.cpp b/3rdparty/asmjit/test/asmjit_test_assembler_x64.cpp
new file mode 100644
index 00000000000..bedf7964541
--- /dev/null
+++ b/3rdparty/asmjit/test/asmjit_test_assembler_x64.cpp
@@ -0,0 +1,17833 @@
+// This file is part of AsmJit project <https://asmjit.com>
+//
+// See asmjit.h or LICENSE.md for license and copyright information
+// SPDX-License-Identifier: Zlib
+
+#include <asmjit/core.h>
+#if !defined(ASMJIT_NO_X86)
+
+#include <asmjit/x86.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include "asmjit_test_assembler.h"
+#include "cmdline.h"
+
+using namespace asmjit;
+
+#define TEST_INSTRUCTION(OPCODE, ...) \
+ tester.testInstruction(OPCODE, #__VA_ARGS__, tester.assembler.__VA_ARGS__)
+
+static void ASMJIT_NOINLINE testX64AssemblerBase(AssemblerTester<x86::Assembler>& tester) noexcept {
+ using namespace x86;
+
+ TEST_INSTRUCTION("80D101" , adc(cl, 1));
+ TEST_INSTRUCTION("80D501" , adc(ch, 1));
+ TEST_INSTRUCTION("8094118000000001" , adc(byte_ptr(rcx, rdx, 0, 128), 1));
+ TEST_INSTRUCTION("6683D101" , adc(cx, 1));
+ TEST_INSTRUCTION("668394118000000001" , adc(word_ptr(rcx, rdx, 0, 128), 1));
+ TEST_INSTRUCTION("83D101" , adc(ecx, 1));
+ TEST_INSTRUCTION("8394118000000001" , adc(dword_ptr(rcx, rdx, 0, 128), 1));
+ TEST_INSTRUCTION("4811D1" , adc(rcx, rdx));
+ TEST_INSTRUCTION("4883D101" , adc(rcx, 1));
+ TEST_INSTRUCTION("48119C1180000000" , adc(ptr(rcx, rdx, 0, 128), rbx));
+ TEST_INSTRUCTION("48119C1180000000" , adc(qword_ptr(rcx, rdx, 0, 128), rbx));
+ TEST_INSTRUCTION("488394118000000001" , adc(qword_ptr(rcx, rdx, 0, 128), 1));
+ TEST_INSTRUCTION("10D1" , adc(cl, dl));
+ TEST_INSTRUCTION("10F1" , adc(cl, dh));
+ TEST_INSTRUCTION("10D5" , adc(ch, dl));
+ TEST_INSTRUCTION("10F5" , adc(ch, dh));
+ TEST_INSTRUCTION("109C1180000000" , adc(ptr(rcx, rdx, 0, 128), bl));
+ TEST_INSTRUCTION("10BC1180000000" , adc(ptr(rcx, rdx, 0, 128), bh));
+ TEST_INSTRUCTION("109C1180000000" , adc(byte_ptr(rcx, rdx, 0, 128), bl));
+ TEST_INSTRUCTION("10BC1180000000" , adc(byte_ptr(rcx, rdx, 0, 128), bh));
+ TEST_INSTRUCTION("6611D1" , adc(cx, dx));
+ TEST_INSTRUCTION("66119C1180000000" , adc(ptr(rcx, rdx, 0, 128), bx));
+ TEST_INSTRUCTION("66119C1180000000" , adc(word_ptr(rcx, rdx, 0, 128), bx));
+ TEST_INSTRUCTION("11D1" , adc(ecx, edx));
+ TEST_INSTRUCTION("119C1180000000" , adc(ptr(rcx, rdx, 0, 128), ebx));
+ TEST_INSTRUCTION("119C1180000000" , adc(dword_ptr(rcx, rdx, 0, 128), ebx));
+ TEST_INSTRUCTION("128C1A80000000" , adc(cl, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("128C1A80000000" , adc(cl, byte_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("12AC1A80000000" , adc(ch, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("12AC1A80000000" , adc(ch, byte_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("66138C1A80000000" , adc(cx, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("66138C1A80000000" , adc(cx, word_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("138C1A80000000" , adc(ecx, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("138C1A80000000" , adc(ecx, dword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("48138C1A80000000" , adc(rcx, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("48138C1A80000000" , adc(rcx, qword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("660F38F6CA" , adcx(ecx, edx));
+ TEST_INSTRUCTION("660F38F68C1A80000000" , adcx(ecx, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("660F38F68C1A80000000" , adcx(ecx, dword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("66480F38F6CA" , adcx(rcx, rdx));
+ TEST_INSTRUCTION("66480F38F68C1A80000000" , adcx(rcx, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("66480F38F68C1A80000000" , adcx(rcx, qword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("80C101" , add(cl, 1));
+ TEST_INSTRUCTION("80C501" , add(ch, 1));
+ TEST_INSTRUCTION("8084118000000001" , add(byte_ptr(rcx, rdx, 0, 128), 1));
+ TEST_INSTRUCTION("6683C101" , add(cx, 1));
+ TEST_INSTRUCTION("668384118000000001" , add(word_ptr(rcx, rdx, 0, 128), 1));
+ TEST_INSTRUCTION("83C101" , add(ecx, 1));
+ TEST_INSTRUCTION("8384118000000001" , add(dword_ptr(rcx, rdx, 0, 128), 1));
+ TEST_INSTRUCTION("4801D1" , add(rcx, rdx));
+ TEST_INSTRUCTION("4883C101" , add(rcx, 1));
+ TEST_INSTRUCTION("48019C1180000000" , add(ptr(rcx, rdx, 0, 128), rbx));
+ TEST_INSTRUCTION("48019C1180000000" , add(qword_ptr(rcx, rdx, 0, 128), rbx));
+ TEST_INSTRUCTION("488384118000000001" , add(qword_ptr(rcx, rdx, 0, 128), 1));
+ TEST_INSTRUCTION("00D1" , add(cl, dl));
+ TEST_INSTRUCTION("00F1" , add(cl, dh));
+ TEST_INSTRUCTION("00D5" , add(ch, dl));
+ TEST_INSTRUCTION("00F5" , add(ch, dh));
+ TEST_INSTRUCTION("009C1180000000" , add(ptr(rcx, rdx, 0, 128), bl));
+ TEST_INSTRUCTION("00BC1180000000" , add(ptr(rcx, rdx, 0, 128), bh));
+ TEST_INSTRUCTION("009C1180000000" , add(byte_ptr(rcx, rdx, 0, 128), bl));
+ TEST_INSTRUCTION("00BC1180000000" , add(byte_ptr(rcx, rdx, 0, 128), bh));
+ TEST_INSTRUCTION("6601D1" , add(cx, dx));
+ TEST_INSTRUCTION("66019C1180000000" , add(ptr(rcx, rdx, 0, 128), bx));
+ TEST_INSTRUCTION("66019C1180000000" , add(word_ptr(rcx, rdx, 0, 128), bx));
+ TEST_INSTRUCTION("01D1" , add(ecx, edx));
+ TEST_INSTRUCTION("019C1180000000" , add(ptr(rcx, rdx, 0, 128), ebx));
+ TEST_INSTRUCTION("019C1180000000" , add(dword_ptr(rcx, rdx, 0, 128), ebx));
+ TEST_INSTRUCTION("028C1A80000000" , add(cl, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("028C1A80000000" , add(cl, byte_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("02AC1A80000000" , add(ch, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("02AC1A80000000" , add(ch, byte_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("66038C1A80000000" , add(cx, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("66038C1A80000000" , add(cx, word_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("038C1A80000000" , add(ecx, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("038C1A80000000" , add(ecx, dword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("48038C1A80000000" , add(rcx, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("48038C1A80000000" , add(rcx, qword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("F30F38F6CA" , adox(ecx, edx));
+ TEST_INSTRUCTION("F30F38F68C1A80000000" , adox(ecx, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("F30F38F68C1A80000000" , adox(ecx, dword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("F3480F38F6CA" , adox(rcx, rdx));
+ TEST_INSTRUCTION("F3480F38F68C1A80000000" , adox(rcx, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("F3480F38F68C1A80000000" , adox(rcx, qword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("80E101" , and_(cl, 1));
+ TEST_INSTRUCTION("80E501" , and_(ch, 1));
+ TEST_INSTRUCTION("6683E101" , and_(cx, 1));
+ TEST_INSTRUCTION("83E101" , and_(ecx, 1));
+ TEST_INSTRUCTION("4883E101" , and_(rcx, 1));
+ TEST_INSTRUCTION("80A4118000000001" , and_(byte_ptr(rcx, rdx, 0, 128), 1));
+ TEST_INSTRUCTION("6683A4118000000001" , and_(word_ptr(rcx, rdx, 0, 128), 1));
+ TEST_INSTRUCTION("83A4118000000001" , and_(dword_ptr(rcx, rdx, 0, 128), 1));
+ TEST_INSTRUCTION("4883A4118000000001" , and_(qword_ptr(rcx, rdx, 0, 128), 1));
+ TEST_INSTRUCTION("4821D1" , and_(rcx, rdx));
+ TEST_INSTRUCTION("48238C1A80000000" , and_(rcx, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("48238C1A80000000" , and_(rcx, qword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("48219C1180000000" , and_(ptr(rcx, rdx, 0, 128), rbx));
+ TEST_INSTRUCTION("48219C1180000000" , and_(qword_ptr(rcx, rdx, 0, 128), rbx));
+ TEST_INSTRUCTION("20D1" , and_(cl, dl));
+ TEST_INSTRUCTION("20F1" , and_(cl, dh));
+ TEST_INSTRUCTION("20D5" , and_(ch, dl));
+ TEST_INSTRUCTION("20F5" , and_(ch, dh));
+ TEST_INSTRUCTION("209C1180000000" , and_(ptr(rcx, rdx, 0, 128), bl));
+ TEST_INSTRUCTION("20BC1180000000" , and_(ptr(rcx, rdx, 0, 128), bh));
+ TEST_INSTRUCTION("209C1180000000" , and_(byte_ptr(rcx, rdx, 0, 128), bl));
+ TEST_INSTRUCTION("20BC1180000000" , and_(byte_ptr(rcx, rdx, 0, 128), bh));
+ TEST_INSTRUCTION("6621D1" , and_(cx, dx));
+ TEST_INSTRUCTION("66219C1180000000" , and_(ptr(rcx, rdx, 0, 128), bx));
+ TEST_INSTRUCTION("66219C1180000000" , and_(word_ptr(rcx, rdx, 0, 128), bx));
+ TEST_INSTRUCTION("21D1" , and_(ecx, edx));
+ TEST_INSTRUCTION("219C1180000000" , and_(ptr(rcx, rdx, 0, 128), ebx));
+ TEST_INSTRUCTION("219C1180000000" , and_(dword_ptr(rcx, rdx, 0, 128), ebx));
+ TEST_INSTRUCTION("228C1A80000000" , and_(cl, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("228C1A80000000" , and_(cl, byte_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("22AC1A80000000" , and_(ch, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("22AC1A80000000" , and_(ch, byte_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("66238C1A80000000" , and_(cx, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("66238C1A80000000" , and_(cx, word_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("238C1A80000000" , and_(ecx, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("238C1A80000000" , and_(ecx, dword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("C4E268F2CB" , andn(ecx, edx, ebx));
+ TEST_INSTRUCTION("C4E268F28C2B80000000" , andn(ecx, edx, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C4E268F28C2B80000000" , andn(ecx, edx, dword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C4E2E8F2CB" , andn(rcx, rdx, rbx));
+ TEST_INSTRUCTION("C4E2E8F28C2B80000000" , andn(rcx, rdx, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C4E2E8F28C2B80000000" , andn(rcx, rdx, qword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C4E260F7CA" , bextr(ecx, edx, ebx));
+ TEST_INSTRUCTION("C4E258F78C1A80000000" , bextr(ecx, ptr(rdx, rbx, 0, 128), esp));
+ TEST_INSTRUCTION("C4E258F78C1A80000000" , bextr(ecx, dword_ptr(rdx, rbx, 0, 128), esp));
+ TEST_INSTRUCTION("C4E2E0F7CA" , bextr(rcx, rdx, rbx));
+ TEST_INSTRUCTION("C4E2D8F78C1A80000000" , bextr(rcx, ptr(rdx, rbx, 0, 128), rsp));
+ TEST_INSTRUCTION("C4E2D8F78C1A80000000" , bextr(rcx, qword_ptr(rdx, rbx, 0, 128), rsp));
+ TEST_INSTRUCTION("8FE97001CA" , blcfill(ecx, edx));
+ TEST_INSTRUCTION("8FE970018C1A80000000" , blcfill(ecx, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("8FE970018C1A80000000" , blcfill(ecx, dword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("8FE9F001CA" , blcfill(rcx, rdx));
+ TEST_INSTRUCTION("8FE9F0018C1A80000000" , blcfill(rcx, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("8FE9F0018C1A80000000" , blcfill(rcx, qword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("8FE97002F2" , blci(ecx, edx));
+ TEST_INSTRUCTION("8FE97002B41A80000000" , blci(ecx, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("8FE97002B41A80000000" , blci(ecx, dword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("8FE9F002F2" , blci(rcx, rdx));
+ TEST_INSTRUCTION("8FE9F002B41A80000000" , blci(rcx, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("8FE9F002B41A80000000" , blci(rcx, qword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("8FE97001EA" , blcic(ecx, edx));
+ TEST_INSTRUCTION("8FE97001AC1A80000000" , blcic(ecx, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("8FE97001AC1A80000000" , blcic(ecx, dword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("8FE9F001EA" , blcic(rcx, rdx));
+ TEST_INSTRUCTION("8FE9F001AC1A80000000" , blcic(rcx, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("8FE9F001AC1A80000000" , blcic(rcx, qword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("8FE97002CA" , blcmsk(ecx, edx));
+ TEST_INSTRUCTION("8FE970028C1A80000000" , blcmsk(ecx, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("8FE970028C1A80000000" , blcmsk(ecx, dword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("8FE9F002CA" , blcmsk(rcx, rdx));
+ TEST_INSTRUCTION("8FE9F0028C1A80000000" , blcmsk(rcx, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("8FE9F0028C1A80000000" , blcmsk(rcx, qword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("8FE97001DA" , blcs(ecx, edx));
+ TEST_INSTRUCTION("8FE970019C1A80000000" , blcs(ecx, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("8FE970019C1A80000000" , blcs(ecx, dword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("8FE9F001DA" , blcs(rcx, rdx));
+ TEST_INSTRUCTION("8FE9F0019C1A80000000" , blcs(rcx, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("8FE9F0019C1A80000000" , blcs(rcx, qword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("8FE97001D2" , blsfill(ecx, edx));
+ TEST_INSTRUCTION("8FE97001941A80000000" , blsfill(ecx, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("8FE97001941A80000000" , blsfill(ecx, dword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("8FE9F001D2" , blsfill(rcx, rdx));
+ TEST_INSTRUCTION("8FE9F001941A80000000" , blsfill(rcx, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("8FE9F001941A80000000" , blsfill(rcx, qword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("C4E270F3DA" , blsi(ecx, edx));
+ TEST_INSTRUCTION("C4E270F39C1A80000000" , blsi(ecx, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("C4E270F39C1A80000000" , blsi(ecx, dword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("C4E2F0F3DA" , blsi(rcx, rdx));
+ TEST_INSTRUCTION("C4E2F0F39C1A80000000" , blsi(rcx, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("C4E2F0F39C1A80000000" , blsi(rcx, qword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("8FE97001F2" , blsic(ecx, edx));
+ TEST_INSTRUCTION("8FE97001B41A80000000" , blsic(ecx, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("8FE97001B41A80000000" , blsic(ecx, dword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("8FE9F001F2" , blsic(rcx, rdx));
+ TEST_INSTRUCTION("8FE9F001B41A80000000" , blsic(rcx, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("8FE9F001B41A80000000" , blsic(rcx, qword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("C4E270F3D2" , blsmsk(ecx, edx));
+ TEST_INSTRUCTION("C4E270F3941A80000000" , blsmsk(ecx, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("C4E270F3941A80000000" , blsmsk(ecx, dword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("C4E2F0F3D2" , blsmsk(rcx, rdx));
+ TEST_INSTRUCTION("C4E2F0F3941A80000000" , blsmsk(rcx, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("C4E2F0F3941A80000000" , blsmsk(rcx, qword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("C4E270F3CA" , blsr(ecx, edx));
+ TEST_INSTRUCTION("C4E270F38C1A80000000" , blsr(ecx, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("C4E270F38C1A80000000" , blsr(ecx, dword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("C4E2F0F3CA" , blsr(rcx, rdx));
+ TEST_INSTRUCTION("C4E2F0F38C1A80000000" , blsr(rcx, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("C4E2F0F38C1A80000000" , blsr(rcx, qword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("F30F1ACA" , bndcl(bnd1, rdx));
+ TEST_INSTRUCTION("F30F1A8C1A80000000" , bndcl(bnd1, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("F30F1A8C1A80000000" , bndcl(bnd1, qword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("F20F1BCA" , bndcn(bnd1, rdx));
+ TEST_INSTRUCTION("F20F1B8C1A80000000" , bndcn(bnd1, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("F20F1B8C1A80000000" , bndcn(bnd1, qword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("F20F1ACA" , bndcu(bnd1, rdx));
+ TEST_INSTRUCTION("F20F1A8C1A80000000" , bndcu(bnd1, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("F20F1A8C1A80000000" , bndcu(bnd1, qword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("0F1A8C1A80000000" , bndldx(bnd1, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("F30F1B8C1A80000000" , bndmk(bnd1, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("660F1ACA" , bndmov(bnd1, bnd2));
+ TEST_INSTRUCTION("660F1A8C1A80000000" , bndmov(bnd1, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("660F1B9C1180000000" , bndmov(ptr(rcx, rdx, 0, 128), bnd3));
+ TEST_INSTRUCTION("0F1B9C1180000000" , bndstx(ptr(rcx, rdx, 0, 128), bnd3));
+ TEST_INSTRUCTION("660FBCCA" , bsf(cx, dx));
+ TEST_INSTRUCTION("660FBC8C1A80000000" , bsf(cx, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("660FBC8C1A80000000" , bsf(cx, word_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("0FBCCA" , bsf(ecx, edx));
+ TEST_INSTRUCTION("0FBC8C1A80000000" , bsf(ecx, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("0FBC8C1A80000000" , bsf(ecx, dword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("480FBCCA" , bsf(rcx, rdx));
+ TEST_INSTRUCTION("480FBC8C1A80000000" , bsf(rcx, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("480FBC8C1A80000000" , bsf(rcx, qword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("660FBDCA" , bsr(cx, dx));
+ TEST_INSTRUCTION("660FBD8C1A80000000" , bsr(cx, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("660FBD8C1A80000000" , bsr(cx, word_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("0FBDCA" , bsr(ecx, edx));
+ TEST_INSTRUCTION("0FBD8C1A80000000" , bsr(ecx, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("0FBD8C1A80000000" , bsr(ecx, dword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("480FBDCA" , bsr(rcx, rdx));
+ TEST_INSTRUCTION("480FBD8C1A80000000" , bsr(rcx, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("480FBD8C1A80000000" , bsr(rcx, qword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("660FC9" , bswap(cx));
+ TEST_INSTRUCTION("0FC9" , bswap(ecx));
+ TEST_INSTRUCTION("480FC9" , bswap(rcx));
+ TEST_INSTRUCTION("660FBAE101" , bt(cx, 1));
+ TEST_INSTRUCTION("0FBAE101" , bt(ecx, 1));
+ TEST_INSTRUCTION("480FBAE101" , bt(rcx, 1));
+ TEST_INSTRUCTION("660FBAA4118000000001" , bt(word_ptr(rcx, rdx, 0, 128), 1));
+ TEST_INSTRUCTION("0FBAA4118000000001" , bt(dword_ptr(rcx, rdx, 0, 128), 1));
+ TEST_INSTRUCTION("480FBAA4118000000001" , bt(qword_ptr(rcx, rdx, 0, 128), 1));
+ TEST_INSTRUCTION("660FA3D1" , bt(cx, dx));
+ TEST_INSTRUCTION("660FA39C1180000000" , bt(ptr(rcx, rdx, 0, 128), bx));
+ TEST_INSTRUCTION("660FA39C1180000000" , bt(word_ptr(rcx, rdx, 0, 128), bx));
+ TEST_INSTRUCTION("0FA3D1" , bt(ecx, edx));
+ TEST_INSTRUCTION("0FA39C1180000000" , bt(ptr(rcx, rdx, 0, 128), ebx));
+ TEST_INSTRUCTION("0FA39C1180000000" , bt(dword_ptr(rcx, rdx, 0, 128), ebx));
+ TEST_INSTRUCTION("480FA3D1" , bt(rcx, rdx));
+ TEST_INSTRUCTION("480FA39C1180000000" , bt(ptr(rcx, rdx, 0, 128), rbx));
+ TEST_INSTRUCTION("480FA39C1180000000" , bt(qword_ptr(rcx, rdx, 0, 128), rbx));
+ TEST_INSTRUCTION("660FBAF901" , btc(cx, 1));
+ TEST_INSTRUCTION("0FBAF901" , btc(ecx, 1));
+ TEST_INSTRUCTION("480FBAF901" , btc(rcx, 1));
+ TEST_INSTRUCTION("660FBABC118000000001" , btc(word_ptr(rcx, rdx, 0, 128), 1));
+ TEST_INSTRUCTION("0FBABC118000000001" , btc(dword_ptr(rcx, rdx, 0, 128), 1));
+ TEST_INSTRUCTION("480FBABC118000000001" , btc(qword_ptr(rcx, rdx, 0, 128), 1));
+ TEST_INSTRUCTION("660FBBD1" , btc(cx, dx));
+ TEST_INSTRUCTION("660FBB9C1180000000" , btc(ptr(rcx, rdx, 0, 128), bx));
+ TEST_INSTRUCTION("660FBB9C1180000000" , btc(word_ptr(rcx, rdx, 0, 128), bx));
+ TEST_INSTRUCTION("0FBBD1" , btc(ecx, edx));
+ TEST_INSTRUCTION("0FBB9C1180000000" , btc(ptr(rcx, rdx, 0, 128), ebx));
+ TEST_INSTRUCTION("0FBB9C1180000000" , btc(dword_ptr(rcx, rdx, 0, 128), ebx));
+ TEST_INSTRUCTION("480FBBD1" , btc(rcx, rdx));
+ TEST_INSTRUCTION("480FBB9C1180000000" , btc(ptr(rcx, rdx, 0, 128), rbx));
+ TEST_INSTRUCTION("480FBB9C1180000000" , btc(qword_ptr(rcx, rdx, 0, 128), rbx));
+ TEST_INSTRUCTION("660FBAF101" , btr(cx, 1));
+ TEST_INSTRUCTION("0FBAF101" , btr(ecx, 1));
+ TEST_INSTRUCTION("480FBAF101" , btr(rcx, 1));
+ TEST_INSTRUCTION("660FBAB4118000000001" , btr(word_ptr(rcx, rdx, 0, 128), 1));
+ TEST_INSTRUCTION("0FBAB4118000000001" , btr(dword_ptr(rcx, rdx, 0, 128), 1));
+ TEST_INSTRUCTION("480FBAB4118000000001" , btr(qword_ptr(rcx, rdx, 0, 128), 1));
+ TEST_INSTRUCTION("660FB3D1" , btr(cx, dx));
+ TEST_INSTRUCTION("660FB39C1180000000" , btr(ptr(rcx, rdx, 0, 128), bx));
+ TEST_INSTRUCTION("660FB39C1180000000" , btr(word_ptr(rcx, rdx, 0, 128), bx));
+ TEST_INSTRUCTION("0FB3D1" , btr(ecx, edx));
+ TEST_INSTRUCTION("0FB39C1180000000" , btr(ptr(rcx, rdx, 0, 128), ebx));
+ TEST_INSTRUCTION("0FB39C1180000000" , btr(dword_ptr(rcx, rdx, 0, 128), ebx));
+ TEST_INSTRUCTION("480FB3D1" , btr(rcx, rdx));
+ TEST_INSTRUCTION("480FB39C1180000000" , btr(ptr(rcx, rdx, 0, 128), rbx));
+ TEST_INSTRUCTION("480FB39C1180000000" , btr(qword_ptr(rcx, rdx, 0, 128), rbx));
+ TEST_INSTRUCTION("660FBAE901" , bts(cx, 1));
+ TEST_INSTRUCTION("0FBAE901" , bts(ecx, 1));
+ TEST_INSTRUCTION("480FBAE901" , bts(rcx, 1));
+ TEST_INSTRUCTION("660FBAAC118000000001" , bts(word_ptr(rcx, rdx, 0, 128), 1));
+ TEST_INSTRUCTION("0FBAAC118000000001" , bts(dword_ptr(rcx, rdx, 0, 128), 1));
+ TEST_INSTRUCTION("480FBAAC118000000001" , bts(qword_ptr(rcx, rdx, 0, 128), 1));
+ TEST_INSTRUCTION("660FABD1" , bts(cx, dx));
+ TEST_INSTRUCTION("660FAB9C1180000000" , bts(ptr(rcx, rdx, 0, 128), bx));
+ TEST_INSTRUCTION("660FAB9C1180000000" , bts(word_ptr(rcx, rdx, 0, 128), bx));
+ TEST_INSTRUCTION("0FABD1" , bts(ecx, edx));
+ TEST_INSTRUCTION("0FAB9C1180000000" , bts(ptr(rcx, rdx, 0, 128), ebx));
+ TEST_INSTRUCTION("0FAB9C1180000000" , bts(dword_ptr(rcx, rdx, 0, 128), ebx));
+ TEST_INSTRUCTION("480FABD1" , bts(rcx, rdx));
+ TEST_INSTRUCTION("480FAB9C1180000000" , bts(ptr(rcx, rdx, 0, 128), rbx));
+ TEST_INSTRUCTION("480FAB9C1180000000" , bts(qword_ptr(rcx, rdx, 0, 128), rbx));
+ TEST_INSTRUCTION("C4E260F5CA" , bzhi(ecx, edx, ebx));
+ TEST_INSTRUCTION("C4E258F58C1A80000000" , bzhi(ecx, ptr(rdx, rbx, 0, 128), esp));
+ TEST_INSTRUCTION("C4E258F58C1A80000000" , bzhi(ecx, dword_ptr(rdx, rbx, 0, 128), esp));
+ TEST_INSTRUCTION("C4E2E0F5CA" , bzhi(rcx, rdx, rbx));
+ TEST_INSTRUCTION("C4E2D8F58C1A80000000" , bzhi(rcx, ptr(rdx, rbx, 0, 128), rsp));
+ TEST_INSTRUCTION("C4E2D8F58C1A80000000" , bzhi(rcx, qword_ptr(rdx, rbx, 0, 128), rsp));
+ TEST_INSTRUCTION("6698" , cbw(ax));
+ TEST_INSTRUCTION("99" , cdq(edx, eax));
+ TEST_INSTRUCTION("4898" , cdqe(rax));
+ TEST_INSTRUCTION("0F01CA" , clac());
+ TEST_INSTRUCTION("F8" , clc());
+ TEST_INSTRUCTION("FC" , cld());
+ TEST_INSTRUCTION("0F1C841180000000" , cldemote(ptr(rcx, rdx, 0, 128)));
+ TEST_INSTRUCTION("0FAEBC1180000000" , clflush(ptr(rcx, rdx, 0, 128)));
+ TEST_INSTRUCTION("660FAEBC1180000000" , clflushopt(ptr(rcx, rdx, 0, 128)));
+ TEST_INSTRUCTION("0F01DD" , clgi());
+ TEST_INSTRUCTION("FA" , cli());
+ TEST_INSTRUCTION("F30FAEB41180000000" , clrssbsy(ptr(rcx, rdx, 0, 128)));
+ TEST_INSTRUCTION("F30FAEB41180000000" , clrssbsy(qword_ptr(rcx, rdx, 0, 128)));
+ TEST_INSTRUCTION("0F06" , clts());
+ TEST_INSTRUCTION("F30F01EE" , clui());
+ TEST_INSTRUCTION("660FAEB41180000000" , clwb(ptr(rcx, rdx, 0, 128)));
+ TEST_INSTRUCTION("0F01FC" , clzero(ptr(rax)));
+ TEST_INSTRUCTION("0F01FC" , clzero(zmmword_ptr(rax)));
+ TEST_INSTRUCTION("F5" , cmc());
+ TEST_INSTRUCTION("660F47CA" , cmova(cx, dx));
+ TEST_INSTRUCTION("660F478C1A80000000" , cmova(cx, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("660F478C1A80000000" , cmova(cx, word_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("0F47CA" , cmova(ecx, edx));
+ TEST_INSTRUCTION("0F478C1A80000000" , cmova(ecx, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("0F478C1A80000000" , cmova(ecx, dword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("480F47CA" , cmova(rcx, rdx));
+ TEST_INSTRUCTION("480F478C1A80000000" , cmova(rcx, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("480F478C1A80000000" , cmova(rcx, qword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("660F43CA" , cmovae(cx, dx));
+ TEST_INSTRUCTION("660F438C1A80000000" , cmovae(cx, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("660F438C1A80000000" , cmovae(cx, word_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("0F43CA" , cmovae(ecx, edx));
+ TEST_INSTRUCTION("0F438C1A80000000" , cmovae(ecx, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("0F438C1A80000000" , cmovae(ecx, dword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("480F43CA" , cmovae(rcx, rdx));
+ TEST_INSTRUCTION("480F438C1A80000000" , cmovae(rcx, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("480F438C1A80000000" , cmovae(rcx, qword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("660F42CA" , cmovb(cx, dx));
+ TEST_INSTRUCTION("660F428C1A80000000" , cmovb(cx, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("660F428C1A80000000" , cmovb(cx, word_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("0F42CA" , cmovb(ecx, edx));
+ TEST_INSTRUCTION("0F428C1A80000000" , cmovb(ecx, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("0F428C1A80000000" , cmovb(ecx, dword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("480F42CA" , cmovb(rcx, rdx));
+ TEST_INSTRUCTION("480F428C1A80000000" , cmovb(rcx, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("480F428C1A80000000" , cmovb(rcx, qword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("660F46CA" , cmovbe(cx, dx));
+ TEST_INSTRUCTION("660F468C1A80000000" , cmovbe(cx, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("660F468C1A80000000" , cmovbe(cx, word_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("0F46CA" , cmovbe(ecx, edx));
+ TEST_INSTRUCTION("0F468C1A80000000" , cmovbe(ecx, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("0F468C1A80000000" , cmovbe(ecx, dword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("480F46CA" , cmovbe(rcx, rdx));
+ TEST_INSTRUCTION("480F468C1A80000000" , cmovbe(rcx, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("480F468C1A80000000" , cmovbe(rcx, qword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("660F42CA" , cmovc(cx, dx));
+ TEST_INSTRUCTION("660F428C1A80000000" , cmovc(cx, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("660F428C1A80000000" , cmovc(cx, word_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("0F42CA" , cmovc(ecx, edx));
+ TEST_INSTRUCTION("0F428C1A80000000" , cmovc(ecx, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("0F428C1A80000000" , cmovc(ecx, dword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("480F42CA" , cmovc(rcx, rdx));
+ TEST_INSTRUCTION("480F428C1A80000000" , cmovc(rcx, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("480F428C1A80000000" , cmovc(rcx, qword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("660F44CA" , cmove(cx, dx));
+ TEST_INSTRUCTION("660F448C1A80000000" , cmove(cx, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("660F448C1A80000000" , cmove(cx, word_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("0F44CA" , cmove(ecx, edx));
+ TEST_INSTRUCTION("0F448C1A80000000" , cmove(ecx, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("0F448C1A80000000" , cmove(ecx, dword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("480F44CA" , cmove(rcx, rdx));
+ TEST_INSTRUCTION("480F448C1A80000000" , cmove(rcx, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("480F448C1A80000000" , cmove(rcx, qword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("660F4FCA" , cmovg(cx, dx));
+ TEST_INSTRUCTION("660F4F8C1A80000000" , cmovg(cx, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("660F4F8C1A80000000" , cmovg(cx, word_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("0F4FCA" , cmovg(ecx, edx));
+ TEST_INSTRUCTION("0F4F8C1A80000000" , cmovg(ecx, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("0F4F8C1A80000000" , cmovg(ecx, dword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("480F4FCA" , cmovg(rcx, rdx));
+ TEST_INSTRUCTION("480F4F8C1A80000000" , cmovg(rcx, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("480F4F8C1A80000000" , cmovg(rcx, qword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("660F4DCA" , cmovge(cx, dx));
+ TEST_INSTRUCTION("660F4D8C1A80000000" , cmovge(cx, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("660F4D8C1A80000000" , cmovge(cx, word_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("0F4DCA" , cmovge(ecx, edx));
+ TEST_INSTRUCTION("0F4D8C1A80000000" , cmovge(ecx, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("0F4D8C1A80000000" , cmovge(ecx, dword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("480F4DCA" , cmovge(rcx, rdx));
+ TEST_INSTRUCTION("480F4D8C1A80000000" , cmovge(rcx, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("480F4D8C1A80000000" , cmovge(rcx, qword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("660F4CCA" , cmovl(cx, dx));
+ TEST_INSTRUCTION("660F4C8C1A80000000" , cmovl(cx, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("660F4C8C1A80000000" , cmovl(cx, word_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("0F4CCA" , cmovl(ecx, edx));
+ TEST_INSTRUCTION("0F4C8C1A80000000" , cmovl(ecx, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("0F4C8C1A80000000" , cmovl(ecx, dword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("480F4CCA" , cmovl(rcx, rdx));
+ TEST_INSTRUCTION("480F4C8C1A80000000" , cmovl(rcx, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("480F4C8C1A80000000" , cmovl(rcx, qword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("660F4ECA" , cmovle(cx, dx));
+ TEST_INSTRUCTION("660F4E8C1A80000000" , cmovle(cx, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("660F4E8C1A80000000" , cmovle(cx, word_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("0F4ECA" , cmovle(ecx, edx));
+ TEST_INSTRUCTION("0F4E8C1A80000000" , cmovle(ecx, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("0F4E8C1A80000000" , cmovle(ecx, dword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("480F4ECA" , cmovle(rcx, rdx));
+ TEST_INSTRUCTION("480F4E8C1A80000000" , cmovle(rcx, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("480F4E8C1A80000000" , cmovle(rcx, qword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("660F46CA" , cmovna(cx, dx));
+ TEST_INSTRUCTION("660F468C1A80000000" , cmovna(cx, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("660F468C1A80000000" , cmovna(cx, word_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("0F46CA" , cmovna(ecx, edx));
+ TEST_INSTRUCTION("0F468C1A80000000" , cmovna(ecx, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("0F468C1A80000000" , cmovna(ecx, dword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("480F46CA" , cmovna(rcx, rdx));
+ TEST_INSTRUCTION("480F468C1A80000000" , cmovna(rcx, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("480F468C1A80000000" , cmovna(rcx, qword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("660F42CA" , cmovnae(cx, dx));
+ TEST_INSTRUCTION("660F428C1A80000000" , cmovnae(cx, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("660F428C1A80000000" , cmovnae(cx, word_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("0F42CA" , cmovnae(ecx, edx));
+ TEST_INSTRUCTION("0F428C1A80000000" , cmovnae(ecx, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("0F428C1A80000000" , cmovnae(ecx, dword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("480F42CA" , cmovnae(rcx, rdx));
+ TEST_INSTRUCTION("480F428C1A80000000" , cmovnae(rcx, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("480F428C1A80000000" , cmovnae(rcx, qword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("660F43CA" , cmovnb(cx, dx));
+ TEST_INSTRUCTION("660F438C1A80000000" , cmovnb(cx, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("660F438C1A80000000" , cmovnb(cx, word_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("0F43CA" , cmovnb(ecx, edx));
+ TEST_INSTRUCTION("0F438C1A80000000" , cmovnb(ecx, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("0F438C1A80000000" , cmovnb(ecx, dword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("480F43CA" , cmovnb(rcx, rdx));
+ TEST_INSTRUCTION("480F438C1A80000000" , cmovnb(rcx, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("480F438C1A80000000" , cmovnb(rcx, qword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("660F47CA" , cmovnbe(cx, dx));
+ TEST_INSTRUCTION("660F478C1A80000000" , cmovnbe(cx, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("660F478C1A80000000" , cmovnbe(cx, word_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("0F47CA" , cmovnbe(ecx, edx));
+ TEST_INSTRUCTION("0F478C1A80000000" , cmovnbe(ecx, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("0F478C1A80000000" , cmovnbe(ecx, dword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("480F47CA" , cmovnbe(rcx, rdx));
+ TEST_INSTRUCTION("480F478C1A80000000" , cmovnbe(rcx, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("480F478C1A80000000" , cmovnbe(rcx, qword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("660F43CA" , cmovnc(cx, dx));
+ TEST_INSTRUCTION("660F438C1A80000000" , cmovnc(cx, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("660F438C1A80000000" , cmovnc(cx, word_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("0F43CA" , cmovnc(ecx, edx));
+ TEST_INSTRUCTION("0F438C1A80000000" , cmovnc(ecx, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("0F438C1A80000000" , cmovnc(ecx, dword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("480F43CA" , cmovnc(rcx, rdx));
+ TEST_INSTRUCTION("480F438C1A80000000" , cmovnc(rcx, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("480F438C1A80000000" , cmovnc(rcx, qword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("660F45CA" , cmovne(cx, dx));
+ TEST_INSTRUCTION("660F458C1A80000000" , cmovne(cx, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("660F458C1A80000000" , cmovne(cx, word_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("0F45CA" , cmovne(ecx, edx));
+ TEST_INSTRUCTION("0F458C1A80000000" , cmovne(ecx, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("0F458C1A80000000" , cmovne(ecx, dword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("480F45CA" , cmovne(rcx, rdx));
+ TEST_INSTRUCTION("480F458C1A80000000" , cmovne(rcx, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("480F458C1A80000000" , cmovne(rcx, qword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("660F4ECA" , cmovng(cx, dx));
+ TEST_INSTRUCTION("660F4E8C1A80000000" , cmovng(cx, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("660F4E8C1A80000000" , cmovng(cx, word_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("0F4ECA" , cmovng(ecx, edx));
+ TEST_INSTRUCTION("0F4E8C1A80000000" , cmovng(ecx, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("0F4E8C1A80000000" , cmovng(ecx, dword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("480F4ECA" , cmovng(rcx, rdx));
+ TEST_INSTRUCTION("480F4E8C1A80000000" , cmovng(rcx, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("480F4E8C1A80000000" , cmovng(rcx, qword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("660F4CCA" , cmovnge(cx, dx));
+ TEST_INSTRUCTION("660F4C8C1A80000000" , cmovnge(cx, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("660F4C8C1A80000000" , cmovnge(cx, word_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("0F4CCA" , cmovnge(ecx, edx));
+ TEST_INSTRUCTION("0F4C8C1A80000000" , cmovnge(ecx, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("0F4C8C1A80000000" , cmovnge(ecx, dword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("480F4CCA" , cmovnge(rcx, rdx));
+ TEST_INSTRUCTION("480F4C8C1A80000000" , cmovnge(rcx, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("480F4C8C1A80000000" , cmovnge(rcx, qword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("660F4DCA" , cmovnl(cx, dx));
+ TEST_INSTRUCTION("660F4D8C1A80000000" , cmovnl(cx, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("660F4D8C1A80000000" , cmovnl(cx, word_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("0F4DCA" , cmovnl(ecx, edx));
+ TEST_INSTRUCTION("0F4D8C1A80000000" , cmovnl(ecx, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("0F4D8C1A80000000" , cmovnl(ecx, dword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("480F4DCA" , cmovnl(rcx, rdx));
+ TEST_INSTRUCTION("480F4D8C1A80000000" , cmovnl(rcx, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("480F4D8C1A80000000" , cmovnl(rcx, qword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("660F4FCA" , cmovnle(cx, dx));
+ TEST_INSTRUCTION("660F4F8C1A80000000" , cmovnle(cx, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("660F4F8C1A80000000" , cmovnle(cx, word_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("0F4FCA" , cmovnle(ecx, edx));
+ TEST_INSTRUCTION("0F4F8C1A80000000" , cmovnle(ecx, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("0F4F8C1A80000000" , cmovnle(ecx, dword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("480F4FCA" , cmovnle(rcx, rdx));
+ TEST_INSTRUCTION("480F4F8C1A80000000" , cmovnle(rcx, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("480F4F8C1A80000000" , cmovnle(rcx, qword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("660F41CA" , cmovno(cx, dx));
+ TEST_INSTRUCTION("660F418C1A80000000" , cmovno(cx, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("660F418C1A80000000" , cmovno(cx, word_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("0F41CA" , cmovno(ecx, edx));
+ TEST_INSTRUCTION("0F418C1A80000000" , cmovno(ecx, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("0F418C1A80000000" , cmovno(ecx, dword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("480F41CA" , cmovno(rcx, rdx));
+ TEST_INSTRUCTION("480F418C1A80000000" , cmovno(rcx, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("480F418C1A80000000" , cmovno(rcx, qword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("660F4BCA" , cmovnp(cx, dx));
+ TEST_INSTRUCTION("660F4B8C1A80000000" , cmovnp(cx, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("660F4B8C1A80000000" , cmovnp(cx, word_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("0F4BCA" , cmovnp(ecx, edx));
+ TEST_INSTRUCTION("0F4B8C1A80000000" , cmovnp(ecx, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("0F4B8C1A80000000" , cmovnp(ecx, dword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("480F4BCA" , cmovnp(rcx, rdx));
+ TEST_INSTRUCTION("480F4B8C1A80000000" , cmovnp(rcx, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("480F4B8C1A80000000" , cmovnp(rcx, qword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("660F49CA" , cmovns(cx, dx));
+ TEST_INSTRUCTION("660F498C1A80000000" , cmovns(cx, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("660F498C1A80000000" , cmovns(cx, word_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("0F49CA" , cmovns(ecx, edx));
+ TEST_INSTRUCTION("0F498C1A80000000" , cmovns(ecx, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("0F498C1A80000000" , cmovns(ecx, dword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("480F49CA" , cmovns(rcx, rdx));
+ TEST_INSTRUCTION("480F498C1A80000000" , cmovns(rcx, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("480F498C1A80000000" , cmovns(rcx, qword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("660F45CA" , cmovnz(cx, dx));
+ TEST_INSTRUCTION("660F458C1A80000000" , cmovnz(cx, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("660F458C1A80000000" , cmovnz(cx, word_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("0F45CA" , cmovnz(ecx, edx));
+ TEST_INSTRUCTION("0F458C1A80000000" , cmovnz(ecx, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("0F458C1A80000000" , cmovnz(ecx, dword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("480F45CA" , cmovnz(rcx, rdx));
+ TEST_INSTRUCTION("480F458C1A80000000" , cmovnz(rcx, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("480F458C1A80000000" , cmovnz(rcx, qword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("660F40CA" , cmovo(cx, dx));
+ TEST_INSTRUCTION("660F408C1A80000000" , cmovo(cx, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("660F408C1A80000000" , cmovo(cx, word_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("0F40CA" , cmovo(ecx, edx));
+ TEST_INSTRUCTION("0F408C1A80000000" , cmovo(ecx, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("0F408C1A80000000" , cmovo(ecx, dword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("480F40CA" , cmovo(rcx, rdx));
+ TEST_INSTRUCTION("480F408C1A80000000" , cmovo(rcx, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("480F408C1A80000000" , cmovo(rcx, qword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("660F4ACA" , cmovp(cx, dx));
+ TEST_INSTRUCTION("660F4A8C1A80000000" , cmovp(cx, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("660F4A8C1A80000000" , cmovp(cx, word_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("0F4ACA" , cmovp(ecx, edx));
+ TEST_INSTRUCTION("0F4A8C1A80000000" , cmovp(ecx, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("0F4A8C1A80000000" , cmovp(ecx, dword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("480F4ACA" , cmovp(rcx, rdx));
+ TEST_INSTRUCTION("480F4A8C1A80000000" , cmovp(rcx, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("480F4A8C1A80000000" , cmovp(rcx, qword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("660F4ACA" , cmovpe(cx, dx));
+ TEST_INSTRUCTION("660F4A8C1A80000000" , cmovpe(cx, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("660F4A8C1A80000000" , cmovpe(cx, word_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("0F4ACA" , cmovpe(ecx, edx));
+ TEST_INSTRUCTION("0F4A8C1A80000000" , cmovpe(ecx, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("0F4A8C1A80000000" , cmovpe(ecx, dword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("480F4ACA" , cmovpe(rcx, rdx));
+ TEST_INSTRUCTION("480F4A8C1A80000000" , cmovpe(rcx, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("480F4A8C1A80000000" , cmovpe(rcx, qword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("660F4BCA" , cmovpo(cx, dx));
+ TEST_INSTRUCTION("660F4B8C1A80000000" , cmovpo(cx, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("660F4B8C1A80000000" , cmovpo(cx, word_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("0F4BCA" , cmovpo(ecx, edx));
+ TEST_INSTRUCTION("0F4B8C1A80000000" , cmovpo(ecx, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("0F4B8C1A80000000" , cmovpo(ecx, dword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("480F4BCA" , cmovpo(rcx, rdx));
+ TEST_INSTRUCTION("480F4B8C1A80000000" , cmovpo(rcx, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("480F4B8C1A80000000" , cmovpo(rcx, qword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("660F48CA" , cmovs(cx, dx));
+ TEST_INSTRUCTION("660F488C1A80000000" , cmovs(cx, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("660F488C1A80000000" , cmovs(cx, word_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("0F48CA" , cmovs(ecx, edx));
+ TEST_INSTRUCTION("0F488C1A80000000" , cmovs(ecx, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("0F488C1A80000000" , cmovs(ecx, dword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("480F48CA" , cmovs(rcx, rdx));
+ TEST_INSTRUCTION("480F488C1A80000000" , cmovs(rcx, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("480F488C1A80000000" , cmovs(rcx, qword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("660F44CA" , cmovz(cx, dx));
+ TEST_INSTRUCTION("660F448C1A80000000" , cmovz(cx, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("660F448C1A80000000" , cmovz(cx, word_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("0F44CA" , cmovz(ecx, edx));
+ TEST_INSTRUCTION("0F448C1A80000000" , cmovz(ecx, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("0F448C1A80000000" , cmovz(ecx, dword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("480F44CA" , cmovz(rcx, rdx));
+ TEST_INSTRUCTION("480F448C1A80000000" , cmovz(rcx, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("480F448C1A80000000" , cmovz(rcx, qword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("80F901" , cmp(cl, 1));
+ TEST_INSTRUCTION("80FD01" , cmp(ch, 1));
+ TEST_INSTRUCTION("80BC118000000001" , cmp(byte_ptr(rcx, rdx, 0, 128), 1));
+ TEST_INSTRUCTION("6683F901" , cmp(cx, 1));
+ TEST_INSTRUCTION("6683BC118000000001" , cmp(word_ptr(rcx, rdx, 0, 128), 1));
+ TEST_INSTRUCTION("83F901" , cmp(ecx, 1));
+ TEST_INSTRUCTION("83BC118000000001" , cmp(dword_ptr(rcx, rdx, 0, 128), 1));
+ TEST_INSTRUCTION("4839D1" , cmp(rcx, rdx));
+ TEST_INSTRUCTION("4883F901" , cmp(rcx, 1));
+ TEST_INSTRUCTION("48399C1180000000" , cmp(ptr(rcx, rdx, 0, 128), rbx));
+ TEST_INSTRUCTION("48399C1180000000" , cmp(qword_ptr(rcx, rdx, 0, 128), rbx));
+ TEST_INSTRUCTION("4883BC118000000001" , cmp(qword_ptr(rcx, rdx, 0, 128), 1));
+ TEST_INSTRUCTION("38D1" , cmp(cl, dl));
+ TEST_INSTRUCTION("38F1" , cmp(cl, dh));
+ TEST_INSTRUCTION("38D5" , cmp(ch, dl));
+ TEST_INSTRUCTION("38F5" , cmp(ch, dh));
+ TEST_INSTRUCTION("389C1180000000" , cmp(ptr(rcx, rdx, 0, 128), bl));
+ TEST_INSTRUCTION("38BC1180000000" , cmp(ptr(rcx, rdx, 0, 128), bh));
+ TEST_INSTRUCTION("389C1180000000" , cmp(byte_ptr(rcx, rdx, 0, 128), bl));
+ TEST_INSTRUCTION("38BC1180000000" , cmp(byte_ptr(rcx, rdx, 0, 128), bh));
+ TEST_INSTRUCTION("6639D1" , cmp(cx, dx));
+ TEST_INSTRUCTION("66399C1180000000" , cmp(ptr(rcx, rdx, 0, 128), bx));
+ TEST_INSTRUCTION("66399C1180000000" , cmp(word_ptr(rcx, rdx, 0, 128), bx));
+ TEST_INSTRUCTION("39D1" , cmp(ecx, edx));
+ TEST_INSTRUCTION("399C1180000000" , cmp(ptr(rcx, rdx, 0, 128), ebx));
+ TEST_INSTRUCTION("399C1180000000" , cmp(dword_ptr(rcx, rdx, 0, 128), ebx));
+ TEST_INSTRUCTION("3A8C1A80000000" , cmp(cl, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("3A8C1A80000000" , cmp(cl, byte_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("3AAC1A80000000" , cmp(ch, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("3AAC1A80000000" , cmp(ch, byte_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("663B8C1A80000000" , cmp(cx, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("663B8C1A80000000" , cmp(cx, word_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("3B8C1A80000000" , cmp(ecx, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("3B8C1A80000000" , cmp(ecx, dword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("483B8C1A80000000" , cmp(rcx, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("483B8C1A80000000" , cmp(rcx, qword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("A6" , cmps(byte_ptr(rsi), byte_ptr(rdi)));
+ TEST_INSTRUCTION("66A7" , cmps(word_ptr(rsi), word_ptr(rdi)));
+ TEST_INSTRUCTION("A7" , cmps(dword_ptr(rsi), dword_ptr(rdi)));
+ TEST_INSTRUCTION("48A7" , cmps(qword_ptr(rsi), qword_ptr(rdi)));
+ TEST_INSTRUCTION("0FB0D1" , cmpxchg(cl, dl, al));
+ TEST_INSTRUCTION("0FB0F1" , cmpxchg(cl, dh, al));
+ TEST_INSTRUCTION("0FB0D5" , cmpxchg(ch, dl, al));
+ TEST_INSTRUCTION("0FB0F5" , cmpxchg(ch, dh, al));
+ TEST_INSTRUCTION("0FB09C1180000000" , cmpxchg(ptr(rcx, rdx, 0, 128), bl, al));
+ TEST_INSTRUCTION("0FB0BC1180000000" , cmpxchg(ptr(rcx, rdx, 0, 128), bh, al));
+ TEST_INSTRUCTION("0FB09C1180000000" , cmpxchg(byte_ptr(rcx, rdx, 0, 128), bl, al));
+ TEST_INSTRUCTION("0FB0BC1180000000" , cmpxchg(byte_ptr(rcx, rdx, 0, 128), bh, al));
+ TEST_INSTRUCTION("660FB1D1" , cmpxchg(cx, dx, ax));
+ TEST_INSTRUCTION("660FB19C1180000000" , cmpxchg(ptr(rcx, rdx, 0, 128), bx, ax));
+ TEST_INSTRUCTION("660FB19C1180000000" , cmpxchg(word_ptr(rcx, rdx, 0, 128), bx, ax));
+ TEST_INSTRUCTION("0FB1D1" , cmpxchg(ecx, edx, eax));
+ TEST_INSTRUCTION("0FB19C1180000000" , cmpxchg(ptr(rcx, rdx, 0, 128), ebx, eax));
+ TEST_INSTRUCTION("0FB19C1180000000" , cmpxchg(dword_ptr(rcx, rdx, 0, 128), ebx, eax));
+ TEST_INSTRUCTION("480FB1D1" , cmpxchg(rcx, rdx, rax));
+ TEST_INSTRUCTION("480FB19C1180000000" , cmpxchg(ptr(rcx, rdx, 0, 128), rbx, rax));
+ TEST_INSTRUCTION("480FB19C1180000000" , cmpxchg(qword_ptr(rcx, rdx, 0, 128), rbx, rax));
+ TEST_INSTRUCTION("480FC78C1180000000" , cmpxchg16b(ptr(rcx, rdx, 0, 128), rdx, rax, rcx, rbx));
+ TEST_INSTRUCTION("480FC78C1180000000" , cmpxchg16b(xmmword_ptr(rcx, rdx, 0, 128), rdx, rax, rcx, rbx));
+ TEST_INSTRUCTION("0FC78C1180000000" , cmpxchg8b(ptr(rcx, rdx, 0, 128), edx, eax, ecx, ebx));
+ TEST_INSTRUCTION("0FC78C1180000000" , cmpxchg8b(qword_ptr(rcx, rdx, 0, 128), edx, eax, ecx, ebx));
+ TEST_INSTRUCTION("0FA2" , cpuid(eax, ebx, ecx, edx));
+ TEST_INSTRUCTION("4899" , cqo(rdx, rax));
+ TEST_INSTRUCTION("F20F38F0CA" , crc32(ecx, dl));
+ TEST_INSTRUCTION("F20F38F0CE" , crc32(ecx, dh));
+ TEST_INSTRUCTION("66F20F38F1CA" , crc32(ecx, dx));
+ TEST_INSTRUCTION("F20F38F1CA" , crc32(ecx, edx));
+ TEST_INSTRUCTION("F20F38F08C1A80000000" , crc32(ecx, byte_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("66F20F38F18C1A80000000" , crc32(ecx, word_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("F20F38F18C1A80000000" , crc32(ecx, dword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("F2480F38F0CA" , crc32(rcx, dl));
+ TEST_INSTRUCTION("F2480F38F1CA" , crc32(rcx, rdx));
+ TEST_INSTRUCTION("F2480F38F08C1A80000000" , crc32(rcx, byte_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("F2480F38F18C1A80000000" , crc32(rcx, qword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("6699" , cwd(dx, ax));
+ TEST_INSTRUCTION("98" , cwde(eax));
+ TEST_INSTRUCTION("FEC9" , dec(cl));
+ TEST_INSTRUCTION("FECD" , dec(ch));
+ TEST_INSTRUCTION("66FFC9" , dec(cx));
+ TEST_INSTRUCTION("FFC9" , dec(ecx));
+ TEST_INSTRUCTION("48FFC9" , dec(rcx));
+ TEST_INSTRUCTION("FE8C1180000000" , dec(byte_ptr(rcx, rdx, 0, 128)));
+ TEST_INSTRUCTION("66FF8C1180000000" , dec(word_ptr(rcx, rdx, 0, 128)));
+ TEST_INSTRUCTION("FF8C1180000000" , dec(dword_ptr(rcx, rdx, 0, 128)));
+ TEST_INSTRUCTION("48FF8C1180000000" , dec(qword_ptr(rcx, rdx, 0, 128)));
+ TEST_INSTRUCTION("F6F1" , div(ax, cl));
+ TEST_INSTRUCTION("F6F5" , div(ax, ch));
+ TEST_INSTRUCTION("F6B41180000000" , div(ax, ptr(rcx, rdx, 0, 128)));
+ TEST_INSTRUCTION("F6B41180000000" , div(ax, byte_ptr(rcx, rdx, 0, 128)));
+ TEST_INSTRUCTION("66F7F1" , div(dx, ax, cx));
+ TEST_INSTRUCTION("66F7B41180000000" , div(dx, ax, ptr(rcx, rdx, 0, 128)));
+ TEST_INSTRUCTION("66F7B41180000000" , div(dx, ax, word_ptr(rcx, rdx, 0, 128)));
+ TEST_INSTRUCTION("F7F1" , div(edx, eax, ecx));
+ TEST_INSTRUCTION("F7B41180000000" , div(edx, eax, ptr(rcx, rdx, 0, 128)));
+ TEST_INSTRUCTION("F7B41180000000" , div(edx, eax, dword_ptr(rcx, rdx, 0, 128)));
+ TEST_INSTRUCTION("48F7F1" , div(rdx, rax, rcx));
+ TEST_INSTRUCTION("48F7B41180000000" , div(rdx, rax, ptr(rcx, rdx, 0, 128)));
+ TEST_INSTRUCTION("48F7B41180000000" , div(rdx, rax, qword_ptr(rcx, rdx, 0, 128)));
+ TEST_INSTRUCTION("F30F1EFB" , endbr32());
+ TEST_INSTRUCTION("F30F1EFA" , endbr64());
+ TEST_INSTRUCTION("F20F38F88C1A80000000" , enqcmd(zmmword_ptr(rcx), zmmword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("F30F38F88C1A80000000" , enqcmds(zmmword_ptr(rcx), zmmword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("C8010002" , enter(1, 2));
+ TEST_INSTRUCTION("0FAE8C1180000000" , fxrstor(ptr(rcx, rdx, 0, 128)));
+ TEST_INSTRUCTION("480FAE8C1180000000" , fxrstor64(ptr(rcx, rdx, 0, 128)));
+ TEST_INSTRUCTION("0FAE841180000000" , fxsave(ptr(rcx, rdx, 0, 128)));
+ TEST_INSTRUCTION("480FAE841180000000" , fxsave64(ptr(rcx, rdx, 0, 128)));
+ TEST_INSTRUCTION("D9F4" , fxtract());
+ TEST_INSTRUCTION("0F37" , getsec());
+ TEST_INSTRUCTION("F4" , hlt());
+ TEST_INSTRUCTION("F30F3AF0C001" , hreset(1, eax));
+ TEST_INSTRUCTION("F6F9" , idiv(ax, cl));
+ TEST_INSTRUCTION("F6FD" , idiv(ax, ch));
+ TEST_INSTRUCTION("F6BC1180000000" , idiv(ax, ptr(rcx, rdx, 0, 128)));
+ TEST_INSTRUCTION("F6BC1180000000" , idiv(ax, byte_ptr(rcx, rdx, 0, 128)));
+ TEST_INSTRUCTION("66F7F9" , idiv(dx, ax, cx));
+ TEST_INSTRUCTION("66F7BC1180000000" , idiv(dx, ax, ptr(rcx, rdx, 0, 128)));
+ TEST_INSTRUCTION("66F7BC1180000000" , idiv(dx, ax, word_ptr(rcx, rdx, 0, 128)));
+ TEST_INSTRUCTION("F7F9" , idiv(edx, eax, ecx));
+ TEST_INSTRUCTION("F7BC1180000000" , idiv(edx, eax, ptr(rcx, rdx, 0, 128)));
+ TEST_INSTRUCTION("F7BC1180000000" , idiv(edx, eax, dword_ptr(rcx, rdx, 0, 128)));
+ TEST_INSTRUCTION("48F7F9" , idiv(rdx, rax, rcx));
+ TEST_INSTRUCTION("48F7BC1180000000" , idiv(rdx, rax, ptr(rcx, rdx, 0, 128)));
+ TEST_INSTRUCTION("48F7BC1180000000" , idiv(rdx, rax, qword_ptr(rcx, rdx, 0, 128)));
+ TEST_INSTRUCTION("F6E9" , imul(ax, cl));
+ TEST_INSTRUCTION("F6ED" , imul(ax, ch));
+ TEST_INSTRUCTION("660FAF841180000000" , imul(ax, ptr(rcx, rdx, 0, 128)));
+ TEST_INSTRUCTION("F6AC1180000000" , imul(ax, byte_ptr(rcx, rdx, 0, 128)));
+ TEST_INSTRUCTION("66F7E9" , imul(dx, ax, cx));
+ TEST_INSTRUCTION("66F7AC1180000000" , imul(dx, ax, ptr(rcx, rdx, 0, 128)));
+ TEST_INSTRUCTION("66F7AC1180000000" , imul(dx, ax, word_ptr(rcx, rdx, 0, 128)));
+ TEST_INSTRUCTION("F7E9" , imul(edx, eax, ecx));
+ TEST_INSTRUCTION("F7AC1180000000" , imul(edx, eax, ptr(rcx, rdx, 0, 128)));
+ TEST_INSTRUCTION("F7AC1180000000" , imul(edx, eax, dword_ptr(rcx, rdx, 0, 128)));
+ TEST_INSTRUCTION("48F7E9" , imul(rdx, rax, rcx));
+ TEST_INSTRUCTION("48F7AC1180000000" , imul(rdx, rax, ptr(rcx, rdx, 0, 128)));
+ TEST_INSTRUCTION("48F7AC1180000000" , imul(rdx, rax, qword_ptr(rcx, rdx, 0, 128)));
+ TEST_INSTRUCTION("660FAFCA" , imul(cx, dx));
+ TEST_INSTRUCTION("666BC901" , imul(cx, 1));
+ TEST_INSTRUCTION("660FAF8C1A80000000" , imul(cx, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("660FAF8C1A80000000" , imul(cx, word_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("0FAFCA" , imul(ecx, edx));
+ TEST_INSTRUCTION("6BC901" , imul(ecx, 1));
+ TEST_INSTRUCTION("0FAF8C1A80000000" , imul(ecx, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("0FAF8C1A80000000" , imul(ecx, dword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("480FAFCA" , imul(rcx, rdx));
+ TEST_INSTRUCTION("486BC901" , imul(rcx, 1));
+ TEST_INSTRUCTION("480FAF8C1A80000000" , imul(rcx, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("480FAF8C1A80000000" , imul(rcx, qword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("666BCA01" , imul(cx, dx, 1));
+ TEST_INSTRUCTION("666B8C1A8000000001" , imul(cx, ptr(rdx, rbx, 0, 128), 1));
+ TEST_INSTRUCTION("666B8C1A8000000001" , imul(cx, word_ptr(rdx, rbx, 0, 128), 1));
+ TEST_INSTRUCTION("6BCA01" , imul(ecx, edx, 1));
+ TEST_INSTRUCTION("6B8C1A8000000001" , imul(ecx, ptr(rdx, rbx, 0, 128), 1));
+ TEST_INSTRUCTION("6B8C1A8000000001" , imul(ecx, dword_ptr(rdx, rbx, 0, 128), 1));
+ TEST_INSTRUCTION("486BCA01" , imul(rcx, rdx, 1));
+ TEST_INSTRUCTION("486B8C1A8000000001" , imul(rcx, ptr(rdx, rbx, 0, 128), 1));
+ TEST_INSTRUCTION("486B8C1A8000000001" , imul(rcx, qword_ptr(rdx, rbx, 0, 128), 1));
+ TEST_INSTRUCTION("EC" , in(al, dx));
+ TEST_INSTRUCTION("E401" , in(al, 1));
+ TEST_INSTRUCTION("66ED" , in(ax, dx));
+ TEST_INSTRUCTION("66E501" , in(ax, 1));
+ TEST_INSTRUCTION("ED" , in(eax, dx));
+ TEST_INSTRUCTION("E501" , in(eax, 1));
+ TEST_INSTRUCTION("FEC1" , inc(cl));
+ TEST_INSTRUCTION("FEC5" , inc(ch));
+ TEST_INSTRUCTION("66FFC1" , inc(cx));
+ TEST_INSTRUCTION("FFC1" , inc(ecx));
+ TEST_INSTRUCTION("48FFC1" , inc(rcx));
+ TEST_INSTRUCTION("FE841180000000" , inc(byte_ptr(rcx, rdx, 0, 128)));
+ TEST_INSTRUCTION("66FF841180000000" , inc(word_ptr(rcx, rdx, 0, 128)));
+ TEST_INSTRUCTION("FF841180000000" , inc(dword_ptr(rcx, rdx, 0, 128)));
+ TEST_INSTRUCTION("48FF841180000000" , inc(qword_ptr(rcx, rdx, 0, 128)));
+ TEST_INSTRUCTION("F30FAEE9" , incsspd(ecx));
+ TEST_INSTRUCTION("F3480FAEE9" , incsspq(rcx));
+ TEST_INSTRUCTION("6C" , ins(byte_ptr(rdi), dx));
+ TEST_INSTRUCTION("666D" , ins(word_ptr(rdi), dx));
+ TEST_INSTRUCTION("6D" , ins(dword_ptr(rdi), dx));
+ TEST_INSTRUCTION("CD01" , int_(1));
+ TEST_INSTRUCTION("CC" , int3());
+ TEST_INSTRUCTION("0F08" , invd());
+ TEST_INSTRUCTION("660F38808C1A80000000" , invept(rcx, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("660F38808C1A80000000" , invept(rcx, xmmword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("0F01BC1180000000" , invlpg(ptr(rcx, rdx, 0, 128)));
+ TEST_INSTRUCTION("670F01DF" , invlpga(eax, ecx));
+ TEST_INSTRUCTION("0F01DF" , invlpga(rax, ecx));
+ TEST_INSTRUCTION("660F38828C1A80000000" , invpcid(rcx, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("660F38828C1A80000000" , invpcid(rcx, xmmword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("660F38818C1A80000000" , invvpid(rcx, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("660F38818C1A80000000" , invvpid(rcx, xmmword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("66CF" , iret());
+ TEST_INSTRUCTION("CF" , iretd());
+ TEST_INSTRUCTION("48CF" , iretq());
+ TEST_INSTRUCTION("C5ED4ACB" , kaddb(k1, k2, k3));
+ TEST_INSTRUCTION("C4E1ED4ACB" , kaddd(k1, k2, k3));
+ TEST_INSTRUCTION("C4E1EC4ACB" , kaddq(k1, k2, k3));
+ TEST_INSTRUCTION("C5EC4ACB" , kaddw(k1, k2, k3));
+ TEST_INSTRUCTION("C5ED41CB" , kandb(k1, k2, k3));
+ TEST_INSTRUCTION("C4E1ED41CB" , kandd(k1, k2, k3));
+ TEST_INSTRUCTION("C5ED42CB" , kandnb(k1, k2, k3));
+ TEST_INSTRUCTION("C4E1ED42CB" , kandnd(k1, k2, k3));
+ TEST_INSTRUCTION("C4E1EC42CB" , kandnq(k1, k2, k3));
+ TEST_INSTRUCTION("C5EC42CB" , kandnw(k1, k2, k3));
+ TEST_INSTRUCTION("C4E1EC41CB" , kandq(k1, k2, k3));
+ TEST_INSTRUCTION("C5EC41CB" , kandw(k1, k2, k3));
+ TEST_INSTRUCTION("C5F992CA" , kmovb(k1, edx));
+ TEST_INSTRUCTION("C5F990CA" , kmovb(k1, k2));
+ TEST_INSTRUCTION("C5F9908C1A80000000" , kmovb(k1, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("C5F9908C1A80000000" , kmovb(k1, byte_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("C5F993CA" , kmovb(ecx, k2));
+ TEST_INSTRUCTION("C5F9919C1180000000" , kmovb(ptr(rcx, rdx, 0, 128), k3));
+ TEST_INSTRUCTION("C5F9919C1180000000" , kmovb(byte_ptr(rcx, rdx, 0, 128), k3));
+ TEST_INSTRUCTION("C5FB92CA" , kmovd(k1, edx));
+ TEST_INSTRUCTION("C4E1F990CA" , kmovd(k1, k2));
+ TEST_INSTRUCTION("C4E1F9908C1A80000000" , kmovd(k1, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("C4E1F9908C1A80000000" , kmovd(k1, dword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("C5FB93CA" , kmovd(ecx, k2));
+ TEST_INSTRUCTION("C4E1F9919C1180000000" , kmovd(ptr(rcx, rdx, 0, 128), k3));
+ TEST_INSTRUCTION("C4E1F9919C1180000000" , kmovd(dword_ptr(rcx, rdx, 0, 128), k3));
+ TEST_INSTRUCTION("C4E1FB92CA" , kmovq(k1, rdx));
+ TEST_INSTRUCTION("C4E1F890CA" , kmovq(k1, k2));
+ TEST_INSTRUCTION("C4E1F8908C1A80000000" , kmovq(k1, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("C4E1F8908C1A80000000" , kmovq(k1, qword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("C4E1FB93CA" , kmovq(rcx, k2));
+ TEST_INSTRUCTION("C4E1F8919C1180000000" , kmovq(ptr(rcx, rdx, 0, 128), k3));
+ TEST_INSTRUCTION("C4E1F8919C1180000000" , kmovq(qword_ptr(rcx, rdx, 0, 128), k3));
+ TEST_INSTRUCTION("C5F892CA" , kmovw(k1, edx));
+ TEST_INSTRUCTION("C5F890CA" , kmovw(k1, k2));
+ TEST_INSTRUCTION("C5F8908C1A80000000" , kmovw(k1, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("C5F8908C1A80000000" , kmovw(k1, word_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("C5F893CA" , kmovw(ecx, k2));
+ TEST_INSTRUCTION("C5F8919C1180000000" , kmovw(ptr(rcx, rdx, 0, 128), k3));
+ TEST_INSTRUCTION("C5F8919C1180000000" , kmovw(word_ptr(rcx, rdx, 0, 128), k3));
+ TEST_INSTRUCTION("C5F944CA" , knotb(k1, k2));
+ TEST_INSTRUCTION("C4E1F944CA" , knotd(k1, k2));
+ TEST_INSTRUCTION("C4E1F844CA" , knotq(k1, k2));
+ TEST_INSTRUCTION("C5F844CA" , knotw(k1, k2));
+ TEST_INSTRUCTION("C5ED45CB" , korb(k1, k2, k3));
+ TEST_INSTRUCTION("C4E1ED45CB" , kord(k1, k2, k3));
+ TEST_INSTRUCTION("C4E1EC45CB" , korq(k1, k2, k3));
+ TEST_INSTRUCTION("C5F998CA" , kortestb(k1, k2));
+ TEST_INSTRUCTION("C4E1F998CA" , kortestd(k1, k2));
+ TEST_INSTRUCTION("C4E1F898CA" , kortestq(k1, k2));
+ TEST_INSTRUCTION("C5F898CA" , kortestw(k1, k2));
+ TEST_INSTRUCTION("C5EC45CB" , korw(k1, k2, k3));
+ TEST_INSTRUCTION("C4E37932CA01" , kshiftlb(k1, k2, 1));
+ TEST_INSTRUCTION("C4E37933CA01" , kshiftld(k1, k2, 1));
+ TEST_INSTRUCTION("C4E3F933CA01" , kshiftlq(k1, k2, 1));
+ TEST_INSTRUCTION("C4E3F932CA01" , kshiftlw(k1, k2, 1));
+ TEST_INSTRUCTION("C4E37930CA01" , kshiftrb(k1, k2, 1));
+ TEST_INSTRUCTION("C4E37931CA01" , kshiftrd(k1, k2, 1));
+ TEST_INSTRUCTION("C4E3F931CA01" , kshiftrq(k1, k2, 1));
+ TEST_INSTRUCTION("C4E3F930CA01" , kshiftrw(k1, k2, 1));
+ TEST_INSTRUCTION("C5F999CA" , ktestb(k1, k2));
+ TEST_INSTRUCTION("C4E1F999CA" , ktestd(k1, k2));
+ TEST_INSTRUCTION("C4E1F899CA" , ktestq(k1, k2));
+ TEST_INSTRUCTION("C5F899CA" , ktestw(k1, k2));
+ TEST_INSTRUCTION("C5ED4BCB" , kunpckbw(k1, k2, k3));
+ TEST_INSTRUCTION("C4E1EC4BCB" , kunpckdq(k1, k2, k3));
+ TEST_INSTRUCTION("C5EC4BCB" , kunpckwd(k1, k2, k3));
+ TEST_INSTRUCTION("C5ED46CB" , kxnorb(k1, k2, k3));
+ TEST_INSTRUCTION("C4E1ED46CB" , kxnord(k1, k2, k3));
+ TEST_INSTRUCTION("C4E1EC46CB" , kxnorq(k1, k2, k3));
+ TEST_INSTRUCTION("C5EC46CB" , kxnorw(k1, k2, k3));
+ TEST_INSTRUCTION("C5ED47CB" , kxorb(k1, k2, k3));
+ TEST_INSTRUCTION("C4E1ED47CB" , kxord(k1, k2, k3));
+ TEST_INSTRUCTION("C4E1EC47CB" , kxorq(k1, k2, k3));
+ TEST_INSTRUCTION("C5EC47CB" , kxorw(k1, k2, k3));
+ TEST_INSTRUCTION("9F" , lahf(ah));
+ TEST_INSTRUCTION("660F02CA" , lar(cx, dx));
+ TEST_INSTRUCTION("660F028C1A80000000" , lar(cx, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("660F028C1A80000000" , lar(cx, word_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("0F02CA" , lar(ecx, edx));
+ TEST_INSTRUCTION("0F028C1A80000000" , lar(ecx, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("0F028C1A80000000" , lar(ecx, word_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("48FF9C1180000000" , lcall(ptr(rcx, rdx, 0, 128)));
+ TEST_INSTRUCTION("66FF9C1180000000" , lcall(dword_ptr(rcx, rdx, 0, 128)));
+ TEST_INSTRUCTION("FF9C1180000000" , lcall(fword_ptr(rcx, rdx, 0, 128)));
+ TEST_INSTRUCTION("48FF9C1180000000" , lcall(tbyte_ptr(rcx, rdx, 0, 128)));
+ TEST_INSTRUCTION("0FAE941180000000" , ldmxcsr(ptr(rcx, rdx, 0, 128)));
+ TEST_INSTRUCTION("0FAE941180000000" , ldmxcsr(dword_ptr(rcx, rdx, 0, 128)));
+ TEST_INSTRUCTION("668D8C1A80000000" , lea(cx, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("8D8C1A80000000" , lea(ecx, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("488D8C1A80000000" , lea(rcx, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("C9" , leave());
+ TEST_INSTRUCTION("0FAEE8" , lfence());
+ TEST_INSTRUCTION("660FB48C1A80000000" , lfs(cx, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("660FB48C1A80000000" , lfs(cx, dword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("0FB48C1A80000000" , lfs(ecx, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("0FB48C1A80000000" , lfs(ecx, fword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("480FB48C1A80000000" , lfs(rcx, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("480FB48C1A80000000" , lfs(rcx, tbyte_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("0F01941180000000" , lgdt(ptr(rcx, rdx, 0, 128)));
+ TEST_INSTRUCTION("660FB58C1A80000000" , lgs(cx, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("660FB58C1A80000000" , lgs(cx, dword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("0FB58C1A80000000" , lgs(ecx, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("0FB58C1A80000000" , lgs(ecx, fword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("480FB58C1A80000000" , lgs(rcx, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("480FB58C1A80000000" , lgs(rcx, tbyte_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("0F019C1180000000" , lidt(ptr(rcx, rdx, 0, 128)));
+ TEST_INSTRUCTION("48FFAC1180000000" , ljmp(ptr(rcx, rdx, 0, 128)));
+ TEST_INSTRUCTION("66FFAC1180000000" , ljmp(dword_ptr(rcx, rdx, 0, 128)));
+ TEST_INSTRUCTION("FFAC1180000000" , ljmp(fword_ptr(rcx, rdx, 0, 128)));
+ TEST_INSTRUCTION("48FFAC1180000000" , ljmp(tbyte_ptr(rcx, rdx, 0, 128)));
+ TEST_INSTRUCTION("0F00D1" , lldt(cx));
+ TEST_INSTRUCTION("0F00941180000000" , lldt(ptr(rcx, rdx, 0, 128)));
+ TEST_INSTRUCTION("0F00941180000000" , lldt(word_ptr(rcx, rdx, 0, 128)));
+ TEST_INSTRUCTION("8FE97812C1" , llwpcb(ecx));
+ TEST_INSTRUCTION("8FE9F812C1" , llwpcb(rcx));
+ TEST_INSTRUCTION("0F01F1" , lmsw(cx));
+ TEST_INSTRUCTION("0F01B41180000000" , lmsw(ptr(rcx, rdx, 0, 128)));
+ TEST_INSTRUCTION("0F01B41180000000" , lmsw(word_ptr(rcx, rdx, 0, 128)));
+ TEST_INSTRUCTION("AC" , lods(al, ptr(rsi)));
+ TEST_INSTRUCTION("AC" , lods(al, byte_ptr(rsi)));
+ TEST_INSTRUCTION("66AD" , lods(ax, ptr(rsi)));
+ TEST_INSTRUCTION("66AD" , lods(ax, word_ptr(rsi)));
+ TEST_INSTRUCTION("AD" , lods(eax, ptr(rsi)));
+ TEST_INSTRUCTION("AD" , lods(eax, dword_ptr(rsi)));
+ TEST_INSTRUCTION("48AD" , lods(rax, ptr(rsi)));
+ TEST_INSTRUCTION("48AD" , lods(rax, qword_ptr(rsi)));
+ TEST_INSTRUCTION("660F03CA" , lsl(cx, dx));
+ TEST_INSTRUCTION("660F038C1A80000000" , lsl(cx, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("660F038C1A80000000" , lsl(cx, word_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("0F03CA" , lsl(ecx, edx));
+ TEST_INSTRUCTION("0F038C1A80000000" , lsl(ecx, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("0F038C1A80000000" , lsl(ecx, word_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("480F03CA" , lsl(rcx, edx));
+ TEST_INSTRUCTION("480F038C1A80000000" , lsl(rcx, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("480F038C1A80000000" , lsl(rcx, word_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("660FB28C1A80000000" , lss(cx, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("660FB28C1A80000000" , lss(cx, dword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("0FB28C1A80000000" , lss(ecx, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("0FB28C1A80000000" , lss(ecx, fword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("480FB28C1A80000000" , lss(rcx, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("480FB28C1A80000000" , lss(rcx, tbyte_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("0F00D9" , ltr(cx));
+ TEST_INSTRUCTION("0F009C1180000000" , ltr(ptr(rcx, rdx, 0, 128)));
+ TEST_INSTRUCTION("0F009C1180000000" , ltr(word_ptr(rcx, rdx, 0, 128)));
+ TEST_INSTRUCTION("8FEA7012C201000000" , lwpins(ecx, edx, 1));
+ TEST_INSTRUCTION("8FEA7012841A8000000001000000" , lwpins(ecx, ptr(rdx, rbx, 0, 128), 1));
+ TEST_INSTRUCTION("8FEA7012841A8000000001000000" , lwpins(ecx, dword_ptr(rdx, rbx, 0, 128), 1));
+ TEST_INSTRUCTION("8FEAF012C201000000" , lwpins(rcx, edx, 1));
+ TEST_INSTRUCTION("8FEAF012841A8000000001000000" , lwpins(rcx, ptr(rdx, rbx, 0, 128), 1));
+ TEST_INSTRUCTION("8FEAF012841A8000000001000000" , lwpins(rcx, dword_ptr(rdx, rbx, 0, 128), 1));
+ TEST_INSTRUCTION("8FEA7012CA01000000" , lwpval(ecx, edx, 1));
+ TEST_INSTRUCTION("8FEA70128C1A8000000001000000" , lwpval(ecx, ptr(rdx, rbx, 0, 128), 1));
+ TEST_INSTRUCTION("8FEA70128C1A8000000001000000" , lwpval(ecx, dword_ptr(rdx, rbx, 0, 128), 1));
+ TEST_INSTRUCTION("8FEAF012CA01000000" , lwpval(rcx, edx, 1));
+ TEST_INSTRUCTION("8FEAF0128C1A8000000001000000" , lwpval(rcx, ptr(rdx, rbx, 0, 128), 1));
+ TEST_INSTRUCTION("8FEAF0128C1A8000000001000000" , lwpval(rcx, dword_ptr(rdx, rbx, 0, 128), 1));
+ TEST_INSTRUCTION("66F30FBDCA" , lzcnt(cx, dx));
+ TEST_INSTRUCTION("66F30FBD8C1A80000000" , lzcnt(cx, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("66F30FBD8C1A80000000" , lzcnt(cx, word_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("F30FBDCA" , lzcnt(ecx, edx));
+ TEST_INSTRUCTION("F30FBD8C1A80000000" , lzcnt(ecx, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("F30FBD8C1A80000000" , lzcnt(ecx, dword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("F3480FBDCA" , lzcnt(rcx, rdx));
+ TEST_INSTRUCTION("F3480FBD8C1A80000000" , lzcnt(rcx, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("F3480FBD8C1A80000000" , lzcnt(rcx, qword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("F30F01FA" , mcommit());
+ TEST_INSTRUCTION("0FAEF0" , mfence());
+ TEST_INSTRUCTION("0F01C8" , monitor(ptr(rax), ecx, edx));
+ TEST_INSTRUCTION("0F01FA" , monitorx(ptr(rax), ecx, edx));
+ TEST_INSTRUCTION("88D1" , mov(cl, dl));
+ TEST_INSTRUCTION("88F1" , mov(cl, dh));
+ TEST_INSTRUCTION("88D5" , mov(ch, dl));
+ TEST_INSTRUCTION("88F5" , mov(ch, dh));
+ TEST_INSTRUCTION("889C1180000000" , mov(ptr(rcx, rdx, 0, 128), bl));
+ TEST_INSTRUCTION("88BC1180000000" , mov(ptr(rcx, rdx, 0, 128), bh));
+ TEST_INSTRUCTION("889C1180000000" , mov(byte_ptr(rcx, rdx, 0, 128), bl));
+ TEST_INSTRUCTION("88BC1180000000" , mov(byte_ptr(rcx, rdx, 0, 128), bh));
+ TEST_INSTRUCTION("6689D1" , mov(cx, dx));
+ TEST_INSTRUCTION("668EE2" , mov(fs, dx));
+ TEST_INSTRUCTION("66899C1180000000" , mov(ptr(rcx, rdx, 0, 128), bx));
+ TEST_INSTRUCTION("66899C1180000000" , mov(word_ptr(rcx, rdx, 0, 128), bx));
+ TEST_INSTRUCTION("89D1" , mov(ecx, edx));
+ TEST_INSTRUCTION("8EE2" , mov(fs, edx));
+ TEST_INSTRUCTION("899C1180000000" , mov(ptr(rcx, rdx, 0, 128), ebx));
+ TEST_INSTRUCTION("899C1180000000" , mov(dword_ptr(rcx, rdx, 0, 128), ebx));
+ TEST_INSTRUCTION("4889D1" , mov(rcx, rdx));
+ TEST_INSTRUCTION("488EE2" , mov(fs, rdx));
+ TEST_INSTRUCTION("0F22CA" , mov(cr1, rdx));
+ TEST_INSTRUCTION("0F23CA" , mov(dr1, rdx));
+ TEST_INSTRUCTION("48899C1180000000" , mov(ptr(rcx, rdx, 0, 128), rbx));
+ TEST_INSTRUCTION("48899C1180000000" , mov(qword_ptr(rcx, rdx, 0, 128), rbx));
+ TEST_INSTRUCTION("B101" , mov(cl, 1));
+ TEST_INSTRUCTION("B501" , mov(ch, 1));
+ TEST_INSTRUCTION("C684118000000001" , mov(byte_ptr(rcx, rdx, 0, 128), 1));
+ TEST_INSTRUCTION("66B90100" , mov(cx, 1));
+ TEST_INSTRUCTION("66C78411800000000100" , mov(word_ptr(rcx, rdx, 0, 128), 1));
+ TEST_INSTRUCTION("B901000000" , mov(ecx, 1));
+ TEST_INSTRUCTION("C784118000000001000000" , mov(dword_ptr(rcx, rdx, 0, 128), 1));
+ TEST_INSTRUCTION("48C7C101000000" , mov(rcx, 1));
+ TEST_INSTRUCTION("48C784118000000001000000" , mov(qword_ptr(rcx, rdx, 0, 128), 1));
+ TEST_INSTRUCTION("488CE1" , mov(rcx, fs));
+ TEST_INSTRUCTION("0F20D1" , mov(rcx, cr2));
+ TEST_INSTRUCTION("0F21D1" , mov(rcx, dr2));
+ TEST_INSTRUCTION("488B8C1A80000000" , mov(rcx, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("488B8C1A80000000" , mov(rcx, qword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("8A8C1A80000000" , mov(cl, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("8A8C1A80000000" , mov(cl, byte_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("8AAC1A80000000" , mov(ch, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("8AAC1A80000000" , mov(ch, byte_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("668CE1" , mov(cx, fs));
+ TEST_INSTRUCTION("668B8C1A80000000" , mov(cx, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("668B8C1A80000000" , mov(cx, word_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("8CE1" , mov(ecx, fs));
+ TEST_INSTRUCTION("8B8C1A80000000" , mov(ecx, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("8B8C1A80000000" , mov(ecx, dword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("8CA41180000000" , mov(ptr(rcx, rdx, 0, 128), fs));
+ TEST_INSTRUCTION("668CA41180000000" , mov(word_ptr(rcx, rdx, 0, 128), fs));
+ TEST_INSTRUCTION("8EA41A80000000" , mov(fs, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("668EA41A80000000" , mov(fs, word_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("48B90100000000000000" , movabs(rcx, 1));
+ TEST_INSTRUCTION("660F38F08C1A80000000" , movbe(cx, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("660F38F08C1A80000000" , movbe(cx, word_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("0F38F08C1A80000000" , movbe(ecx, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("0F38F08C1A80000000" , movbe(ecx, dword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("480F38F08C1A80000000" , movbe(rcx, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("480F38F08C1A80000000" , movbe(rcx, qword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("660F38F19C1180000000" , movbe(ptr(rcx, rdx, 0, 128), bx));
+ TEST_INSTRUCTION("660F38F19C1180000000" , movbe(word_ptr(rcx, rdx, 0, 128), bx));
+ TEST_INSTRUCTION("0F38F19C1180000000" , movbe(ptr(rcx, rdx, 0, 128), ebx));
+ TEST_INSTRUCTION("0F38F19C1180000000" , movbe(dword_ptr(rcx, rdx, 0, 128), ebx));
+ TEST_INSTRUCTION("480F38F19C1180000000" , movbe(ptr(rcx, rdx, 0, 128), rbx));
+ TEST_INSTRUCTION("480F38F19C1180000000" , movbe(qword_ptr(rcx, rdx, 0, 128), rbx));
+ TEST_INSTRUCTION("660F38F88C1A80000000" , movdir64b(zmmword_ptr(rcx), zmmword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("0F38F99C1180000000" , movdiri(ptr(rcx, rdx, 0, 128), ebx));
+ TEST_INSTRUCTION("0F38F99C1180000000" , movdiri(dword_ptr(rcx, rdx, 0, 128), ebx));
+ TEST_INSTRUCTION("480F38F99C1180000000" , movdiri(ptr(rcx, rdx, 0, 128), rbx));
+ TEST_INSTRUCTION("480F38F99C1180000000" , movdiri(qword_ptr(rcx, rdx, 0, 128), rbx));
+ TEST_INSTRUCTION("0FC39C1180000000" , movnti(ptr(rcx, rdx, 0, 128), ebx));
+ TEST_INSTRUCTION("0FC39C1180000000" , movnti(dword_ptr(rcx, rdx, 0, 128), ebx));
+ TEST_INSTRUCTION("480FC39C1180000000" , movnti(ptr(rcx, rdx, 0, 128), rbx));
+ TEST_INSTRUCTION("480FC39C1180000000" , movnti(qword_ptr(rcx, rdx, 0, 128), rbx));
+ TEST_INSTRUCTION("A4" , movs(byte_ptr(rdi), byte_ptr(rsi)));
+ TEST_INSTRUCTION("66A5" , movs(word_ptr(rdi), word_ptr(rsi)));
+ TEST_INSTRUCTION("A5" , movs(dword_ptr(rdi), dword_ptr(rsi)));
+ TEST_INSTRUCTION("48A5" , movs(qword_ptr(rdi), qword_ptr(rsi)));
+ TEST_INSTRUCTION("660FBECA" , movsx(cx, dl));
+ TEST_INSTRUCTION("660FBECE" , movsx(cx, dh));
+ TEST_INSTRUCTION("660FBE8C1A80000000" , movsx(cx, byte_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("0FBECA" , movsx(ecx, dl));
+ TEST_INSTRUCTION("0FBECE" , movsx(ecx, dh));
+ TEST_INSTRUCTION("0FBFCA" , movsx(ecx, dx));
+ TEST_INSTRUCTION("0FBE8C1A80000000" , movsx(ecx, byte_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("0FBF8C1A80000000" , movsx(ecx, word_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("480FBECA" , movsx(rcx, dl));
+ TEST_INSTRUCTION("480FBFCA" , movsx(rcx, dx));
+ TEST_INSTRUCTION("480FBE8C1A80000000" , movsx(rcx, byte_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("480FBF8C1A80000000" , movsx(rcx, word_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("6663CA" , movsxd(cx, dx));
+ TEST_INSTRUCTION("66638C1A80000000" , movsxd(cx, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("66638C1A80000000" , movsxd(cx, word_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("63CA" , movsxd(ecx, edx));
+ TEST_INSTRUCTION("638C1A80000000" , movsxd(ecx, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("638C1A80000000" , movsxd(ecx, dword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("4863CA" , movsxd(rcx, edx));
+ TEST_INSTRUCTION("48638C1A80000000" , movsxd(rcx, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("48638C1A80000000" , movsxd(rcx, dword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("660FB6CA" , movzx(cx, dl));
+ TEST_INSTRUCTION("660FB6CE" , movzx(cx, dh));
+ TEST_INSTRUCTION("660FB68C1A80000000" , movzx(cx, byte_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("0FB6CA" , movzx(ecx, dl));
+ TEST_INSTRUCTION("0FB6CE" , movzx(ecx, dh));
+ TEST_INSTRUCTION("0FB7CA" , movzx(ecx, dx));
+ TEST_INSTRUCTION("0FB68C1A80000000" , movzx(ecx, byte_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("0FB78C1A80000000" , movzx(ecx, word_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("480FB6CA" , movzx(rcx, dl));
+ TEST_INSTRUCTION("480FB7CA" , movzx(rcx, dx));
+ TEST_INSTRUCTION("480FB68C1A80000000" , movzx(rcx, byte_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("480FB78C1A80000000" , movzx(rcx, word_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("F6E1" , mul(ax, cl));
+ TEST_INSTRUCTION("F6E5" , mul(ax, ch));
+ TEST_INSTRUCTION("F6A41180000000" , mul(ax, ptr(rcx, rdx, 0, 128)));
+ TEST_INSTRUCTION("F6A41180000000" , mul(ax, byte_ptr(rcx, rdx, 0, 128)));
+ TEST_INSTRUCTION("66F7E1" , mul(dx, ax, cx));
+ TEST_INSTRUCTION("66F7A41180000000" , mul(dx, ax, ptr(rcx, rdx, 0, 128)));
+ TEST_INSTRUCTION("66F7A41180000000" , mul(dx, ax, word_ptr(rcx, rdx, 0, 128)));
+ TEST_INSTRUCTION("F7E1" , mul(edx, eax, ecx));
+ TEST_INSTRUCTION("F7A41180000000" , mul(edx, eax, ptr(rcx, rdx, 0, 128)));
+ TEST_INSTRUCTION("F7A41180000000" , mul(edx, eax, dword_ptr(rcx, rdx, 0, 128)));
+ TEST_INSTRUCTION("48F7E1" , mul(rdx, rax, rcx));
+ TEST_INSTRUCTION("48F7A41180000000" , mul(rdx, rax, ptr(rcx, rdx, 0, 128)));
+ TEST_INSTRUCTION("48F7A41180000000" , mul(rdx, rax, qword_ptr(rcx, rdx, 0, 128)));
+ TEST_INSTRUCTION("C4E26BF6CB" , mulx(ecx, edx, ebx, edx));
+ TEST_INSTRUCTION("C4E26BF68C2B80000000" , mulx(ecx, edx, ptr(rbx, rbp, 0, 128), edx));
+ TEST_INSTRUCTION("C4E26BF68C2B80000000" , mulx(ecx, edx, dword_ptr(rbx, rbp, 0, 128), edx));
+ TEST_INSTRUCTION("C4E2EBF6CB" , mulx(rcx, rdx, rbx, rdx));
+ TEST_INSTRUCTION("C4E2EBF68C2B80000000" , mulx(rcx, rdx, ptr(rbx, rbp, 0, 128), rdx));
+ TEST_INSTRUCTION("C4E2EBF68C2B80000000" , mulx(rcx, rdx, qword_ptr(rbx, rbp, 0, 128), rdx));
+ TEST_INSTRUCTION("0F01C9" , mwait(eax, ecx));
+ TEST_INSTRUCTION("0F01FB" , mwaitx(eax, ecx, ebx));
+ TEST_INSTRUCTION("F6D9" , neg(cl));
+ TEST_INSTRUCTION("F6DD" , neg(ch));
+ TEST_INSTRUCTION("66F7D9" , neg(cx));
+ TEST_INSTRUCTION("F7D9" , neg(ecx));
+ TEST_INSTRUCTION("48F7D9" , neg(rcx));
+ TEST_INSTRUCTION("F69C1180000000" , neg(byte_ptr(rcx, rdx, 0, 128)));
+ TEST_INSTRUCTION("66F79C1180000000" , neg(word_ptr(rcx, rdx, 0, 128)));
+ TEST_INSTRUCTION("F79C1180000000" , neg(dword_ptr(rcx, rdx, 0, 128)));
+ TEST_INSTRUCTION("48F79C1180000000" , neg(qword_ptr(rcx, rdx, 0, 128)));
+ TEST_INSTRUCTION("90" , nop());
+ TEST_INSTRUCTION("660F1FC1" , nop(cx));
+ TEST_INSTRUCTION("0F1FC1" , nop(ecx));
+ TEST_INSTRUCTION("480F1FC1" , nop(rcx));
+ TEST_INSTRUCTION("660F1F841180000000" , nop(word_ptr(rcx, rdx, 0, 128)));
+ TEST_INSTRUCTION("0F1F841180000000" , nop(dword_ptr(rcx, rdx, 0, 128)));
+ TEST_INSTRUCTION("480F1F841180000000" , nop(qword_ptr(rcx, rdx, 0, 128)));
+ TEST_INSTRUCTION("660F1FD1" , nop(cx, dx));
+ TEST_INSTRUCTION("660F1F9C1180000000" , nop(ptr(rcx, rdx, 0, 128), bx));
+ TEST_INSTRUCTION("660F1F9C1180000000" , nop(word_ptr(rcx, rdx, 0, 128), bx));
+ TEST_INSTRUCTION("0F1FD1" , nop(ecx, edx));
+ TEST_INSTRUCTION("0F1F9C1180000000" , nop(ptr(rcx, rdx, 0, 128), ebx));
+ TEST_INSTRUCTION("0F1F9C1180000000" , nop(dword_ptr(rcx, rdx, 0, 128), ebx));
+ TEST_INSTRUCTION("480F1FD1" , nop(rcx, rdx));
+ TEST_INSTRUCTION("480F1F9C1180000000" , nop(ptr(rcx, rdx, 0, 128), rbx));
+ TEST_INSTRUCTION("480F1F9C1180000000" , nop(qword_ptr(rcx, rdx, 0, 128), rbx));
+ TEST_INSTRUCTION("F6D1" , not_(cl));
+ TEST_INSTRUCTION("F6D5" , not_(ch));
+ TEST_INSTRUCTION("66F7D1" , not_(cx));
+ TEST_INSTRUCTION("F7D1" , not_(ecx));
+ TEST_INSTRUCTION("48F7D1" , not_(rcx));
+ TEST_INSTRUCTION("F6941180000000" , not_(byte_ptr(rcx, rdx, 0, 128)));
+ TEST_INSTRUCTION("66F7941180000000" , not_(word_ptr(rcx, rdx, 0, 128)));
+ TEST_INSTRUCTION("F7941180000000" , not_(dword_ptr(rcx, rdx, 0, 128)));
+ TEST_INSTRUCTION("48F7941180000000" , not_(qword_ptr(rcx, rdx, 0, 128)));
+ TEST_INSTRUCTION("80C901" , or_(cl, 1));
+ TEST_INSTRUCTION("80CD01" , or_(ch, 1));
+ TEST_INSTRUCTION("808C118000000001" , or_(byte_ptr(rcx, rdx, 0, 128), 1));
+ TEST_INSTRUCTION("6683C901" , or_(cx, 1));
+ TEST_INSTRUCTION("66838C118000000001" , or_(word_ptr(rcx, rdx, 0, 128), 1));
+ TEST_INSTRUCTION("83C901" , or_(ecx, 1));
+ TEST_INSTRUCTION("838C118000000001" , or_(dword_ptr(rcx, rdx, 0, 128), 1));
+ TEST_INSTRUCTION("4809D1" , or_(rcx, rdx));
+ TEST_INSTRUCTION("4883C901" , or_(rcx, 1));
+ TEST_INSTRUCTION("48099C1180000000" , or_(ptr(rcx, rdx, 0, 128), rbx));
+ TEST_INSTRUCTION("48099C1180000000" , or_(qword_ptr(rcx, rdx, 0, 128), rbx));
+ TEST_INSTRUCTION("48838C118000000001" , or_(qword_ptr(rcx, rdx, 0, 128), 1));
+ TEST_INSTRUCTION("08D1" , or_(cl, dl));
+ TEST_INSTRUCTION("08F1" , or_(cl, dh));
+ TEST_INSTRUCTION("08D5" , or_(ch, dl));
+ TEST_INSTRUCTION("08F5" , or_(ch, dh));
+ TEST_INSTRUCTION("089C1180000000" , or_(ptr(rcx, rdx, 0, 128), bl));
+ TEST_INSTRUCTION("08BC1180000000" , or_(ptr(rcx, rdx, 0, 128), bh));
+ TEST_INSTRUCTION("089C1180000000" , or_(byte_ptr(rcx, rdx, 0, 128), bl));
+ TEST_INSTRUCTION("08BC1180000000" , or_(byte_ptr(rcx, rdx, 0, 128), bh));
+ TEST_INSTRUCTION("6609D1" , or_(cx, dx));
+ TEST_INSTRUCTION("66099C1180000000" , or_(ptr(rcx, rdx, 0, 128), bx));
+ TEST_INSTRUCTION("66099C1180000000" , or_(word_ptr(rcx, rdx, 0, 128), bx));
+ TEST_INSTRUCTION("09D1" , or_(ecx, edx));
+ TEST_INSTRUCTION("099C1180000000" , or_(ptr(rcx, rdx, 0, 128), ebx));
+ TEST_INSTRUCTION("099C1180000000" , or_(dword_ptr(rcx, rdx, 0, 128), ebx));
+ TEST_INSTRUCTION("0A8C1A80000000" , or_(cl, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("0A8C1A80000000" , or_(cl, byte_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("0AAC1A80000000" , or_(ch, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("0AAC1A80000000" , or_(ch, byte_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("660B8C1A80000000" , or_(cx, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("660B8C1A80000000" , or_(cx, word_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("0B8C1A80000000" , or_(ecx, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("0B8C1A80000000" , or_(ecx, dword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("480B8C1A80000000" , or_(rcx, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("480B8C1A80000000" , or_(rcx, qword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("EE" , out(dx, al));
+ TEST_INSTRUCTION("66EF" , out(dx, ax));
+ TEST_INSTRUCTION("EF" , out(dx, eax));
+ TEST_INSTRUCTION("E601" , out(1, al));
+ TEST_INSTRUCTION("66E701" , out(1, ax));
+ TEST_INSTRUCTION("E701" , out(1, eax));
+ TEST_INSTRUCTION("6E" , outs(dx, byte_ptr(rsi)));
+ TEST_INSTRUCTION("666F" , outs(dx, word_ptr(rsi)));
+ TEST_INSTRUCTION("6F" , outs(dx, dword_ptr(rsi)));
+ TEST_INSTRUCTION("F390" , pause());
+ TEST_INSTRUCTION("0F01C5" , pconfig());
+ TEST_INSTRUCTION("C4E26BF5CB" , pdep(ecx, edx, ebx));
+ TEST_INSTRUCTION("C4E26BF58C2B80000000" , pdep(ecx, edx, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C4E26BF58C2B80000000" , pdep(ecx, edx, dword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C4E2EBF5CB" , pdep(rcx, rdx, rbx));
+ TEST_INSTRUCTION("C4E2EBF58C2B80000000" , pdep(rcx, rdx, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C4E2EBF58C2B80000000" , pdep(rcx, rdx, qword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C4E26AF5CB" , pext(ecx, edx, ebx));
+ TEST_INSTRUCTION("C4E26AF58C2B80000000" , pext(ecx, edx, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C4E26AF58C2B80000000" , pext(ecx, edx, dword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C4E2EAF5CB" , pext(rcx, rdx, rbx));
+ TEST_INSTRUCTION("C4E2EAF58C2B80000000" , pext(rcx, rdx, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C4E2EAF58C2B80000000" , pext(rcx, rdx, qword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("6659" , pop(cx));
+ TEST_INSTRUCTION("59" , pop(rcx));
+ TEST_INSTRUCTION("668F841180000000" , pop(word_ptr(rcx, rdx, 0, 128)));
+ TEST_INSTRUCTION("8F841180000000" , pop(qword_ptr(rcx, rdx, 0, 128)));
+ TEST_INSTRUCTION("0FA1" , pop(fs));
+ TEST_INSTRUCTION("66F30FB8CA" , popcnt(cx, dx));
+ TEST_INSTRUCTION("66F30FB88C1A80000000" , popcnt(cx, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("66F30FB88C1A80000000" , popcnt(cx, word_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("F30FB8CA" , popcnt(ecx, edx));
+ TEST_INSTRUCTION("F30FB88C1A80000000" , popcnt(ecx, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("F30FB88C1A80000000" , popcnt(ecx, dword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("F3480FB8CA" , popcnt(rcx, rdx));
+ TEST_INSTRUCTION("F3480FB88C1A80000000" , popcnt(rcx, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("F3480FB88C1A80000000" , popcnt(rcx, qword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("669D" , popf());
+ TEST_INSTRUCTION("9D" , popfq());
+ TEST_INSTRUCTION("0F0D841180000000" , prefetch(ptr(rcx, rdx, 0, 128)));
+ TEST_INSTRUCTION("0F18841180000000" , prefetchnta(ptr(rcx, rdx, 0, 128)));
+ TEST_INSTRUCTION("0F188C1180000000" , prefetcht0(ptr(rcx, rdx, 0, 128)));
+ TEST_INSTRUCTION("0F18941180000000" , prefetcht1(ptr(rcx, rdx, 0, 128)));
+ TEST_INSTRUCTION("0F189C1180000000" , prefetcht2(ptr(rcx, rdx, 0, 128)));
+ TEST_INSTRUCTION("0F0D8C1180000000" , prefetchw(ptr(rcx, rdx, 0, 128)));
+ TEST_INSTRUCTION("0F0D941180000000" , prefetchwt1(ptr(rcx, rdx, 0, 128)));
+ TEST_INSTRUCTION("F30F01FF" , psmash());
+ TEST_INSTRUCTION("F30FAEE1" , ptwrite(ecx));
+ TEST_INSTRUCTION("F3480FAEE1" , ptwrite(rcx));
+ TEST_INSTRUCTION("F30FAEA41180000000" , ptwrite(ptr(rcx, rdx, 0, 128)));
+ TEST_INSTRUCTION("F30FAEA41180000000" , ptwrite(dword_ptr(rcx, rdx, 0, 128)));
+ TEST_INSTRUCTION("F3480FAEA41180000000" , ptwrite(qword_ptr(rcx, rdx, 0, 128)));
+ TEST_INSTRUCTION("6651" , push(cx));
+ TEST_INSTRUCTION("51" , push(rcx));
+ TEST_INSTRUCTION("6A01" , push(1));
+ TEST_INSTRUCTION("66FFB41180000000" , push(word_ptr(rcx, rdx, 0, 128)));
+ TEST_INSTRUCTION("FFB41180000000" , push(qword_ptr(rcx, rdx, 0, 128)));
+ TEST_INSTRUCTION("0FA0" , push(fs));
+ TEST_INSTRUCTION("669C" , pushf());
+ TEST_INSTRUCTION("9C" , pushfq());
+ TEST_INSTRUCTION("F20F01FF" , pvalidate());
+ TEST_INSTRUCTION("D2D1" , rcl(cl, cl));
+ TEST_INSTRUCTION("D0D1" , rcl(cl, 1));
+ TEST_INSTRUCTION("D2D5" , rcl(ch, cl));
+ TEST_INSTRUCTION("D0D5" , rcl(ch, 1));
+ TEST_INSTRUCTION("66D3D1" , rcl(cx, cl));
+ TEST_INSTRUCTION("66D1D1" , rcl(cx, 1));
+ TEST_INSTRUCTION("D3D1" , rcl(ecx, cl));
+ TEST_INSTRUCTION("D1D1" , rcl(ecx, 1));
+ TEST_INSTRUCTION("48D3D1" , rcl(rcx, cl));
+ TEST_INSTRUCTION("48D1D1" , rcl(rcx, 1));
+ TEST_INSTRUCTION("D2941180000000" , rcl(byte_ptr(rcx, rdx, 0, 128), cl));
+ TEST_INSTRUCTION("D0941180000000" , rcl(byte_ptr(rcx, rdx, 0, 128), 1));
+ TEST_INSTRUCTION("66D3941180000000" , rcl(word_ptr(rcx, rdx, 0, 128), cl));
+ TEST_INSTRUCTION("66D1941180000000" , rcl(word_ptr(rcx, rdx, 0, 128), 1));
+ TEST_INSTRUCTION("D3941180000000" , rcl(dword_ptr(rcx, rdx, 0, 128), cl));
+ TEST_INSTRUCTION("D1941180000000" , rcl(dword_ptr(rcx, rdx, 0, 128), 1));
+ TEST_INSTRUCTION("48D3941180000000" , rcl(qword_ptr(rcx, rdx, 0, 128), cl));
+ TEST_INSTRUCTION("48D1941180000000" , rcl(qword_ptr(rcx, rdx, 0, 128), 1));
+ TEST_INSTRUCTION("D2D9" , rcr(cl, cl));
+ TEST_INSTRUCTION("D0D9" , rcr(cl, 1));
+ TEST_INSTRUCTION("D2DD" , rcr(ch, cl));
+ TEST_INSTRUCTION("D0DD" , rcr(ch, 1));
+ TEST_INSTRUCTION("66D3D9" , rcr(cx, cl));
+ TEST_INSTRUCTION("66D1D9" , rcr(cx, 1));
+ TEST_INSTRUCTION("D3D9" , rcr(ecx, cl));
+ TEST_INSTRUCTION("D1D9" , rcr(ecx, 1));
+ TEST_INSTRUCTION("48D3D9" , rcr(rcx, cl));
+ TEST_INSTRUCTION("48D1D9" , rcr(rcx, 1));
+ TEST_INSTRUCTION("D29C1180000000" , rcr(byte_ptr(rcx, rdx, 0, 128), cl));
+ TEST_INSTRUCTION("D09C1180000000" , rcr(byte_ptr(rcx, rdx, 0, 128), 1));
+ TEST_INSTRUCTION("66D39C1180000000" , rcr(word_ptr(rcx, rdx, 0, 128), cl));
+ TEST_INSTRUCTION("66D19C1180000000" , rcr(word_ptr(rcx, rdx, 0, 128), 1));
+ TEST_INSTRUCTION("D39C1180000000" , rcr(dword_ptr(rcx, rdx, 0, 128), cl));
+ TEST_INSTRUCTION("D19C1180000000" , rcr(dword_ptr(rcx, rdx, 0, 128), 1));
+ TEST_INSTRUCTION("48D39C1180000000" , rcr(qword_ptr(rcx, rdx, 0, 128), cl));
+ TEST_INSTRUCTION("48D19C1180000000" , rcr(qword_ptr(rcx, rdx, 0, 128), 1));
+ TEST_INSTRUCTION("F30FAEC1" , rdfsbase(ecx));
+ TEST_INSTRUCTION("F3480FAEC1" , rdfsbase(rcx));
+ TEST_INSTRUCTION("F30FAEC9" , rdgsbase(ecx));
+ TEST_INSTRUCTION("F3480FAEC9" , rdgsbase(rcx));
+ TEST_INSTRUCTION("0F32" , rdmsr(edx, eax, ecx));
+ TEST_INSTRUCTION("F30FC7F9" , rdpid(rcx));
+ TEST_INSTRUCTION("0F01EE" , rdpkru(edx, eax, ecx));
+ TEST_INSTRUCTION("0F33" , rdpmc(edx, eax, ecx));
+ TEST_INSTRUCTION("0F01FD" , rdpru(edx, eax, ecx));
+ TEST_INSTRUCTION("660FC7F1" , rdrand(cx));
+ TEST_INSTRUCTION("0FC7F1" , rdrand(ecx));
+ TEST_INSTRUCTION("480FC7F1" , rdrand(rcx));
+ TEST_INSTRUCTION("660FC7F9" , rdseed(cx));
+ TEST_INSTRUCTION("0FC7F9" , rdseed(ecx));
+ TEST_INSTRUCTION("480FC7F9" , rdseed(rcx));
+ TEST_INSTRUCTION("F30F1EC9" , rdsspd(ecx));
+ TEST_INSTRUCTION("F3480F1EC9" , rdsspq(rcx));
+ TEST_INSTRUCTION("0F31" , rdtsc(edx, eax));
+ TEST_INSTRUCTION("0F01F9" , rdtscp(edx, eax, ecx));
+ TEST_INSTRUCTION("C3" , ret());
+ TEST_INSTRUCTION("C20100" , ret(1));
+ TEST_INSTRUCTION("CB" , retf());
+ TEST_INSTRUCTION("CA0100" , retf(1));
+ TEST_INSTRUCTION("F30F01FE" , rmpadjust());
+ TEST_INSTRUCTION("F20F01FE" , rmpupdate());
+ TEST_INSTRUCTION("D2C1" , rol(cl, cl));
+ TEST_INSTRUCTION("D0C1" , rol(cl, 1));
+ TEST_INSTRUCTION("D2C5" , rol(ch, cl));
+ TEST_INSTRUCTION("D0C5" , rol(ch, 1));
+ TEST_INSTRUCTION("66D3C1" , rol(cx, cl));
+ TEST_INSTRUCTION("66D1C1" , rol(cx, 1));
+ TEST_INSTRUCTION("D3C1" , rol(ecx, cl));
+ TEST_INSTRUCTION("D1C1" , rol(ecx, 1));
+ TEST_INSTRUCTION("48D3C1" , rol(rcx, cl));
+ TEST_INSTRUCTION("48D1C1" , rol(rcx, 1));
+ TEST_INSTRUCTION("D2841180000000" , rol(byte_ptr(rcx, rdx, 0, 128), cl));
+ TEST_INSTRUCTION("D0841180000000" , rol(byte_ptr(rcx, rdx, 0, 128), 1));
+ TEST_INSTRUCTION("66D3841180000000" , rol(word_ptr(rcx, rdx, 0, 128), cl));
+ TEST_INSTRUCTION("66D1841180000000" , rol(word_ptr(rcx, rdx, 0, 128), 1));
+ TEST_INSTRUCTION("D3841180000000" , rol(dword_ptr(rcx, rdx, 0, 128), cl));
+ TEST_INSTRUCTION("D1841180000000" , rol(dword_ptr(rcx, rdx, 0, 128), 1));
+ TEST_INSTRUCTION("48D3841180000000" , rol(qword_ptr(rcx, rdx, 0, 128), cl));
+ TEST_INSTRUCTION("48D1841180000000" , rol(qword_ptr(rcx, rdx, 0, 128), 1));
+ TEST_INSTRUCTION("D2C9" , ror(cl, cl));
+ TEST_INSTRUCTION("D0C9" , ror(cl, 1));
+ TEST_INSTRUCTION("D2CD" , ror(ch, cl));
+ TEST_INSTRUCTION("D0CD" , ror(ch, 1));
+ TEST_INSTRUCTION("66D3C9" , ror(cx, cl));
+ TEST_INSTRUCTION("66D1C9" , ror(cx, 1));
+ TEST_INSTRUCTION("D3C9" , ror(ecx, cl));
+ TEST_INSTRUCTION("D1C9" , ror(ecx, 1));
+ TEST_INSTRUCTION("48D3C9" , ror(rcx, cl));
+ TEST_INSTRUCTION("48D1C9" , ror(rcx, 1));
+ TEST_INSTRUCTION("D28C1180000000" , ror(byte_ptr(rcx, rdx, 0, 128), cl));
+ TEST_INSTRUCTION("D08C1180000000" , ror(byte_ptr(rcx, rdx, 0, 128), 1));
+ TEST_INSTRUCTION("66D38C1180000000" , ror(word_ptr(rcx, rdx, 0, 128), cl));
+ TEST_INSTRUCTION("66D18C1180000000" , ror(word_ptr(rcx, rdx, 0, 128), 1));
+ TEST_INSTRUCTION("D38C1180000000" , ror(dword_ptr(rcx, rdx, 0, 128), cl));
+ TEST_INSTRUCTION("D18C1180000000" , ror(dword_ptr(rcx, rdx, 0, 128), 1));
+ TEST_INSTRUCTION("48D38C1180000000" , ror(qword_ptr(rcx, rdx, 0, 128), cl));
+ TEST_INSTRUCTION("48D18C1180000000" , ror(qword_ptr(rcx, rdx, 0, 128), 1));
+ TEST_INSTRUCTION("C4E37BF0CA01" , rorx(ecx, edx, 1));
+ TEST_INSTRUCTION("C4E37BF08C1A8000000001" , rorx(ecx, ptr(rdx, rbx, 0, 128), 1));
+ TEST_INSTRUCTION("C4E37BF08C1A8000000001" , rorx(ecx, dword_ptr(rdx, rbx, 0, 128), 1));
+ TEST_INSTRUCTION("C4E3FBF0CA01" , rorx(rcx, rdx, 1));
+ TEST_INSTRUCTION("C4E3FBF08C1A8000000001" , rorx(rcx, ptr(rdx, rbx, 0, 128), 1));
+ TEST_INSTRUCTION("C4E3FBF08C1A8000000001" , rorx(rcx, qword_ptr(rdx, rbx, 0, 128), 1));
+ TEST_INSTRUCTION("9E" , sahf(ah));
+ TEST_INSTRUCTION("D2E1" , sal(cl, cl));
+ TEST_INSTRUCTION("D0E1" , sal(cl, 1));
+ TEST_INSTRUCTION("D2E5" , sal(ch, cl));
+ TEST_INSTRUCTION("D0E5" , sal(ch, 1));
+ TEST_INSTRUCTION("66D3E1" , sal(cx, cl));
+ TEST_INSTRUCTION("66D1E1" , sal(cx, 1));
+ TEST_INSTRUCTION("D3E1" , sal(ecx, cl));
+ TEST_INSTRUCTION("D1E1" , sal(ecx, 1));
+ TEST_INSTRUCTION("48D3E1" , sal(rcx, cl));
+ TEST_INSTRUCTION("48D1E1" , sal(rcx, 1));
+ TEST_INSTRUCTION("D2A41180000000" , sal(byte_ptr(rcx, rdx, 0, 128), cl));
+ TEST_INSTRUCTION("D0A41180000000" , sal(byte_ptr(rcx, rdx, 0, 128), 1));
+ TEST_INSTRUCTION("66D3A41180000000" , sal(word_ptr(rcx, rdx, 0, 128), cl));
+ TEST_INSTRUCTION("66D1A41180000000" , sal(word_ptr(rcx, rdx, 0, 128), 1));
+ TEST_INSTRUCTION("D3A41180000000" , sal(dword_ptr(rcx, rdx, 0, 128), cl));
+ TEST_INSTRUCTION("D1A41180000000" , sal(dword_ptr(rcx, rdx, 0, 128), 1));
+ TEST_INSTRUCTION("48D3A41180000000" , sal(qword_ptr(rcx, rdx, 0, 128), cl));
+ TEST_INSTRUCTION("48D1A41180000000" , sal(qword_ptr(rcx, rdx, 0, 128), 1));
+ TEST_INSTRUCTION("D2F9" , sar(cl, cl));
+ TEST_INSTRUCTION("D0F9" , sar(cl, 1));
+ TEST_INSTRUCTION("D2FD" , sar(ch, cl));
+ TEST_INSTRUCTION("D0FD" , sar(ch, 1));
+ TEST_INSTRUCTION("66D3F9" , sar(cx, cl));
+ TEST_INSTRUCTION("66D1F9" , sar(cx, 1));
+ TEST_INSTRUCTION("D3F9" , sar(ecx, cl));
+ TEST_INSTRUCTION("D1F9" , sar(ecx, 1));
+ TEST_INSTRUCTION("48D3F9" , sar(rcx, cl));
+ TEST_INSTRUCTION("48D1F9" , sar(rcx, 1));
+ TEST_INSTRUCTION("D2BC1180000000" , sar(byte_ptr(rcx, rdx, 0, 128), cl));
+ TEST_INSTRUCTION("D0BC1180000000" , sar(byte_ptr(rcx, rdx, 0, 128), 1));
+ TEST_INSTRUCTION("66D3BC1180000000" , sar(word_ptr(rcx, rdx, 0, 128), cl));
+ TEST_INSTRUCTION("66D1BC1180000000" , sar(word_ptr(rcx, rdx, 0, 128), 1));
+ TEST_INSTRUCTION("D3BC1180000000" , sar(dword_ptr(rcx, rdx, 0, 128), cl));
+ TEST_INSTRUCTION("D1BC1180000000" , sar(dword_ptr(rcx, rdx, 0, 128), 1));
+ TEST_INSTRUCTION("48D3BC1180000000" , sar(qword_ptr(rcx, rdx, 0, 128), cl));
+ TEST_INSTRUCTION("48D1BC1180000000" , sar(qword_ptr(rcx, rdx, 0, 128), 1));
+ TEST_INSTRUCTION("C4E262F7CA" , sarx(ecx, edx, ebx));
+ TEST_INSTRUCTION("C4E25AF78C1A80000000" , sarx(ecx, ptr(rdx, rbx, 0, 128), esp));
+ TEST_INSTRUCTION("C4E25AF78C1A80000000" , sarx(ecx, dword_ptr(rdx, rbx, 0, 128), esp));
+ TEST_INSTRUCTION("C4E2E2F7CA" , sarx(rcx, rdx, rbx));
+ TEST_INSTRUCTION("C4E2DAF78C1A80000000" , sarx(rcx, ptr(rdx, rbx, 0, 128), rsp));
+ TEST_INSTRUCTION("C4E2DAF78C1A80000000" , sarx(rcx, qword_ptr(rdx, rbx, 0, 128), rsp));
+ TEST_INSTRUCTION("F30F01EA" , saveprevssp());
+ TEST_INSTRUCTION("80D901" , sbb(cl, 1));
+ TEST_INSTRUCTION("80DD01" , sbb(ch, 1));
+ TEST_INSTRUCTION("809C118000000001" , sbb(byte_ptr(rcx, rdx, 0, 128), 1));
+ TEST_INSTRUCTION("6683D901" , sbb(cx, 1));
+ TEST_INSTRUCTION("66839C118000000001" , sbb(word_ptr(rcx, rdx, 0, 128), 1));
+ TEST_INSTRUCTION("83D901" , sbb(ecx, 1));
+ TEST_INSTRUCTION("839C118000000001" , sbb(dword_ptr(rcx, rdx, 0, 128), 1));
+ TEST_INSTRUCTION("4819D1" , sbb(rcx, rdx));
+ TEST_INSTRUCTION("4883D901" , sbb(rcx, 1));
+ TEST_INSTRUCTION("48199C1180000000" , sbb(ptr(rcx, rdx, 0, 128), rbx));
+ TEST_INSTRUCTION("48199C1180000000" , sbb(qword_ptr(rcx, rdx, 0, 128), rbx));
+ TEST_INSTRUCTION("48839C118000000001" , sbb(qword_ptr(rcx, rdx, 0, 128), 1));
+ TEST_INSTRUCTION("18D1" , sbb(cl, dl));
+ TEST_INSTRUCTION("18F1" , sbb(cl, dh));
+ TEST_INSTRUCTION("18D5" , sbb(ch, dl));
+ TEST_INSTRUCTION("18F5" , sbb(ch, dh));
+ TEST_INSTRUCTION("189C1180000000" , sbb(ptr(rcx, rdx, 0, 128), bl));
+ TEST_INSTRUCTION("18BC1180000000" , sbb(ptr(rcx, rdx, 0, 128), bh));
+ TEST_INSTRUCTION("189C1180000000" , sbb(byte_ptr(rcx, rdx, 0, 128), bl));
+ TEST_INSTRUCTION("18BC1180000000" , sbb(byte_ptr(rcx, rdx, 0, 128), bh));
+ TEST_INSTRUCTION("6619D1" , sbb(cx, dx));
+ TEST_INSTRUCTION("66199C1180000000" , sbb(ptr(rcx, rdx, 0, 128), bx));
+ TEST_INSTRUCTION("66199C1180000000" , sbb(word_ptr(rcx, rdx, 0, 128), bx));
+ TEST_INSTRUCTION("19D1" , sbb(ecx, edx));
+ TEST_INSTRUCTION("199C1180000000" , sbb(ptr(rcx, rdx, 0, 128), ebx));
+ TEST_INSTRUCTION("199C1180000000" , sbb(dword_ptr(rcx, rdx, 0, 128), ebx));
+ TEST_INSTRUCTION("1A8C1A80000000" , sbb(cl, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("1A8C1A80000000" , sbb(cl, byte_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("1AAC1A80000000" , sbb(ch, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("1AAC1A80000000" , sbb(ch, byte_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("661B8C1A80000000" , sbb(cx, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("661B8C1A80000000" , sbb(cx, word_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("1B8C1A80000000" , sbb(ecx, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("1B8C1A80000000" , sbb(ecx, dword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("481B8C1A80000000" , sbb(rcx, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("481B8C1A80000000" , sbb(rcx, qword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("AE" , scas(al, ptr(rdi)));
+ TEST_INSTRUCTION("AE" , scas(al, byte_ptr(rdi)));
+ TEST_INSTRUCTION("66AF" , scas(ax, ptr(rdi)));
+ TEST_INSTRUCTION("66AF" , scas(ax, word_ptr(rdi)));
+ TEST_INSTRUCTION("AF" , scas(eax, ptr(rdi)));
+ TEST_INSTRUCTION("AF" , scas(eax, dword_ptr(rdi)));
+ TEST_INSTRUCTION("48AF" , scas(rax, ptr(rdi)));
+ TEST_INSTRUCTION("48AF" , scas(rax, qword_ptr(rdi)));
+ TEST_INSTRUCTION("F30FC7F1" , senduipi(rcx));
+ TEST_INSTRUCTION("0F01E8" , serialize());
+ TEST_INSTRUCTION("0F97C1" , seta(cl));
+ TEST_INSTRUCTION("0F97C5" , seta(ch));
+ TEST_INSTRUCTION("0F97841180000000" , seta(ptr(rcx, rdx, 0, 128)));
+ TEST_INSTRUCTION("0F97841180000000" , seta(byte_ptr(rcx, rdx, 0, 128)));
+ TEST_INSTRUCTION("0F93C1" , setae(cl));
+ TEST_INSTRUCTION("0F93C5" , setae(ch));
+ TEST_INSTRUCTION("0F93841180000000" , setae(ptr(rcx, rdx, 0, 128)));
+ TEST_INSTRUCTION("0F93841180000000" , setae(byte_ptr(rcx, rdx, 0, 128)));
+ TEST_INSTRUCTION("0F92C1" , setb(cl));
+ TEST_INSTRUCTION("0F92C5" , setb(ch));
+ TEST_INSTRUCTION("0F92841180000000" , setb(ptr(rcx, rdx, 0, 128)));
+ TEST_INSTRUCTION("0F92841180000000" , setb(byte_ptr(rcx, rdx, 0, 128)));
+ TEST_INSTRUCTION("0F96C1" , setbe(cl));
+ TEST_INSTRUCTION("0F96C5" , setbe(ch));
+ TEST_INSTRUCTION("0F96841180000000" , setbe(ptr(rcx, rdx, 0, 128)));
+ TEST_INSTRUCTION("0F96841180000000" , setbe(byte_ptr(rcx, rdx, 0, 128)));
+ TEST_INSTRUCTION("0F92C1" , setc(cl));
+ TEST_INSTRUCTION("0F92C5" , setc(ch));
+ TEST_INSTRUCTION("0F92841180000000" , setc(ptr(rcx, rdx, 0, 128)));
+ TEST_INSTRUCTION("0F92841180000000" , setc(byte_ptr(rcx, rdx, 0, 128)));
+ TEST_INSTRUCTION("0F94C1" , sete(cl));
+ TEST_INSTRUCTION("0F94C5" , sete(ch));
+ TEST_INSTRUCTION("0F94841180000000" , sete(ptr(rcx, rdx, 0, 128)));
+ TEST_INSTRUCTION("0F94841180000000" , sete(byte_ptr(rcx, rdx, 0, 128)));
+ TEST_INSTRUCTION("0F9FC1" , setg(cl));
+ TEST_INSTRUCTION("0F9FC5" , setg(ch));
+ TEST_INSTRUCTION("0F9F841180000000" , setg(ptr(rcx, rdx, 0, 128)));
+ TEST_INSTRUCTION("0F9F841180000000" , setg(byte_ptr(rcx, rdx, 0, 128)));
+ TEST_INSTRUCTION("0F9DC1" , setge(cl));
+ TEST_INSTRUCTION("0F9DC5" , setge(ch));
+ TEST_INSTRUCTION("0F9D841180000000" , setge(ptr(rcx, rdx, 0, 128)));
+ TEST_INSTRUCTION("0F9D841180000000" , setge(byte_ptr(rcx, rdx, 0, 128)));
+ TEST_INSTRUCTION("0F9CC1" , setl(cl));
+ TEST_INSTRUCTION("0F9CC5" , setl(ch));
+ TEST_INSTRUCTION("0F9C841180000000" , setl(ptr(rcx, rdx, 0, 128)));
+ TEST_INSTRUCTION("0F9C841180000000" , setl(byte_ptr(rcx, rdx, 0, 128)));
+ TEST_INSTRUCTION("0F9EC1" , setle(cl));
+ TEST_INSTRUCTION("0F9EC5" , setle(ch));
+ TEST_INSTRUCTION("0F9E841180000000" , setle(ptr(rcx, rdx, 0, 128)));
+ TEST_INSTRUCTION("0F9E841180000000" , setle(byte_ptr(rcx, rdx, 0, 128)));
+ TEST_INSTRUCTION("0F96C1" , setna(cl));
+ TEST_INSTRUCTION("0F96C5" , setna(ch));
+ TEST_INSTRUCTION("0F96841180000000" , setna(ptr(rcx, rdx, 0, 128)));
+ TEST_INSTRUCTION("0F96841180000000" , setna(byte_ptr(rcx, rdx, 0, 128)));
+ TEST_INSTRUCTION("0F92C1" , setnae(cl));
+ TEST_INSTRUCTION("0F92C5" , setnae(ch));
+ TEST_INSTRUCTION("0F92841180000000" , setnae(ptr(rcx, rdx, 0, 128)));
+ TEST_INSTRUCTION("0F92841180000000" , setnae(byte_ptr(rcx, rdx, 0, 128)));
+ TEST_INSTRUCTION("0F93C1" , setnb(cl));
+ TEST_INSTRUCTION("0F93C5" , setnb(ch));
+ TEST_INSTRUCTION("0F93841180000000" , setnb(ptr(rcx, rdx, 0, 128)));
+ TEST_INSTRUCTION("0F93841180000000" , setnb(byte_ptr(rcx, rdx, 0, 128)));
+ TEST_INSTRUCTION("0F97C1" , setnbe(cl));
+ TEST_INSTRUCTION("0F97C5" , setnbe(ch));
+ TEST_INSTRUCTION("0F97841180000000" , setnbe(ptr(rcx, rdx, 0, 128)));
+ TEST_INSTRUCTION("0F97841180000000" , setnbe(byte_ptr(rcx, rdx, 0, 128)));
+ TEST_INSTRUCTION("0F93C1" , setnc(cl));
+ TEST_INSTRUCTION("0F93C5" , setnc(ch));
+ TEST_INSTRUCTION("0F93841180000000" , setnc(ptr(rcx, rdx, 0, 128)));
+ TEST_INSTRUCTION("0F93841180000000" , setnc(byte_ptr(rcx, rdx, 0, 128)));
+ TEST_INSTRUCTION("0F95C1" , setne(cl));
+ TEST_INSTRUCTION("0F95C5" , setne(ch));
+ TEST_INSTRUCTION("0F95841180000000" , setne(ptr(rcx, rdx, 0, 128)));
+ TEST_INSTRUCTION("0F95841180000000" , setne(byte_ptr(rcx, rdx, 0, 128)));
+ TEST_INSTRUCTION("0F9EC1" , setng(cl));
+ TEST_INSTRUCTION("0F9EC5" , setng(ch));
+ TEST_INSTRUCTION("0F9E841180000000" , setng(ptr(rcx, rdx, 0, 128)));
+ TEST_INSTRUCTION("0F9E841180000000" , setng(byte_ptr(rcx, rdx, 0, 128)));
+ TEST_INSTRUCTION("0F9CC1" , setnge(cl));
+ TEST_INSTRUCTION("0F9CC5" , setnge(ch));
+ TEST_INSTRUCTION("0F9C841180000000" , setnge(ptr(rcx, rdx, 0, 128)));
+ TEST_INSTRUCTION("0F9C841180000000" , setnge(byte_ptr(rcx, rdx, 0, 128)));
+ TEST_INSTRUCTION("0F9DC1" , setnl(cl));
+ TEST_INSTRUCTION("0F9DC5" , setnl(ch));
+ TEST_INSTRUCTION("0F9D841180000000" , setnl(ptr(rcx, rdx, 0, 128)));
+ TEST_INSTRUCTION("0F9D841180000000" , setnl(byte_ptr(rcx, rdx, 0, 128)));
+ TEST_INSTRUCTION("0F9FC1" , setnle(cl));
+ TEST_INSTRUCTION("0F9FC5" , setnle(ch));
+ TEST_INSTRUCTION("0F9F841180000000" , setnle(ptr(rcx, rdx, 0, 128)));
+ TEST_INSTRUCTION("0F9F841180000000" , setnle(byte_ptr(rcx, rdx, 0, 128)));
+ TEST_INSTRUCTION("0F91C1" , setno(cl));
+ TEST_INSTRUCTION("0F91C5" , setno(ch));
+ TEST_INSTRUCTION("0F91841180000000" , setno(ptr(rcx, rdx, 0, 128)));
+ TEST_INSTRUCTION("0F91841180000000" , setno(byte_ptr(rcx, rdx, 0, 128)));
+ TEST_INSTRUCTION("0F9BC1" , setnp(cl));
+ TEST_INSTRUCTION("0F9BC5" , setnp(ch));
+ TEST_INSTRUCTION("0F9B841180000000" , setnp(ptr(rcx, rdx, 0, 128)));
+ TEST_INSTRUCTION("0F9B841180000000" , setnp(byte_ptr(rcx, rdx, 0, 128)));
+ TEST_INSTRUCTION("0F99C1" , setns(cl));
+ TEST_INSTRUCTION("0F99C5" , setns(ch));
+ TEST_INSTRUCTION("0F99841180000000" , setns(ptr(rcx, rdx, 0, 128)));
+ TEST_INSTRUCTION("0F99841180000000" , setns(byte_ptr(rcx, rdx, 0, 128)));
+ TEST_INSTRUCTION("0F95C1" , setnz(cl));
+ TEST_INSTRUCTION("0F95C5" , setnz(ch));
+ TEST_INSTRUCTION("0F95841180000000" , setnz(ptr(rcx, rdx, 0, 128)));
+ TEST_INSTRUCTION("0F95841180000000" , setnz(byte_ptr(rcx, rdx, 0, 128)));
+ TEST_INSTRUCTION("0F90C1" , seto(cl));
+ TEST_INSTRUCTION("0F90C5" , seto(ch));
+ TEST_INSTRUCTION("0F90841180000000" , seto(ptr(rcx, rdx, 0, 128)));
+ TEST_INSTRUCTION("0F90841180000000" , seto(byte_ptr(rcx, rdx, 0, 128)));
+ TEST_INSTRUCTION("0F9AC1" , setp(cl));
+ TEST_INSTRUCTION("0F9AC5" , setp(ch));
+ TEST_INSTRUCTION("0F9A841180000000" , setp(ptr(rcx, rdx, 0, 128)));
+ TEST_INSTRUCTION("0F9A841180000000" , setp(byte_ptr(rcx, rdx, 0, 128)));
+ TEST_INSTRUCTION("0F9AC1" , setpe(cl));
+ TEST_INSTRUCTION("0F9AC5" , setpe(ch));
+ TEST_INSTRUCTION("0F9A841180000000" , setpe(ptr(rcx, rdx, 0, 128)));
+ TEST_INSTRUCTION("0F9A841180000000" , setpe(byte_ptr(rcx, rdx, 0, 128)));
+ TEST_INSTRUCTION("0F9BC1" , setpo(cl));
+ TEST_INSTRUCTION("0F9BC5" , setpo(ch));
+ TEST_INSTRUCTION("0F9B841180000000" , setpo(ptr(rcx, rdx, 0, 128)));
+ TEST_INSTRUCTION("0F9B841180000000" , setpo(byte_ptr(rcx, rdx, 0, 128)));
+ TEST_INSTRUCTION("0F98C1" , sets(cl));
+ TEST_INSTRUCTION("0F98C5" , sets(ch));
+ TEST_INSTRUCTION("0F98841180000000" , sets(ptr(rcx, rdx, 0, 128)));
+ TEST_INSTRUCTION("0F98841180000000" , sets(byte_ptr(rcx, rdx, 0, 128)));
+ TEST_INSTRUCTION("F30F01E8" , setssbsy());
+ TEST_INSTRUCTION("0F94C1" , setz(cl));
+ TEST_INSTRUCTION("0F94C5" , setz(ch));
+ TEST_INSTRUCTION("0F94841180000000" , setz(ptr(rcx, rdx, 0, 128)));
+ TEST_INSTRUCTION("0F94841180000000" , setz(byte_ptr(rcx, rdx, 0, 128)));
+ TEST_INSTRUCTION("0FAEF8" , sfence());
+ TEST_INSTRUCTION("0F01841180000000" , sgdt(ptr(rcx, rdx, 0, 128)));
+ TEST_INSTRUCTION("D2E1" , shl(cl, cl));
+ TEST_INSTRUCTION("D0E1" , shl(cl, 1));
+ TEST_INSTRUCTION("D2E5" , shl(ch, cl));
+ TEST_INSTRUCTION("D0E5" , shl(ch, 1));
+ TEST_INSTRUCTION("66D3E1" , shl(cx, cl));
+ TEST_INSTRUCTION("66D1E1" , shl(cx, 1));
+ TEST_INSTRUCTION("D3E1" , shl(ecx, cl));
+ TEST_INSTRUCTION("D1E1" , shl(ecx, 1));
+ TEST_INSTRUCTION("48D3E1" , shl(rcx, cl));
+ TEST_INSTRUCTION("48D1E1" , shl(rcx, 1));
+ TEST_INSTRUCTION("D2A41180000000" , shl(byte_ptr(rcx, rdx, 0, 128), cl));
+ TEST_INSTRUCTION("D0A41180000000" , shl(byte_ptr(rcx, rdx, 0, 128), 1));
+ TEST_INSTRUCTION("66D3A41180000000" , shl(word_ptr(rcx, rdx, 0, 128), cl));
+ TEST_INSTRUCTION("66D1A41180000000" , shl(word_ptr(rcx, rdx, 0, 128), 1));
+ TEST_INSTRUCTION("D3A41180000000" , shl(dword_ptr(rcx, rdx, 0, 128), cl));
+ TEST_INSTRUCTION("D1A41180000000" , shl(dword_ptr(rcx, rdx, 0, 128), 1));
+ TEST_INSTRUCTION("48D3A41180000000" , shl(qword_ptr(rcx, rdx, 0, 128), cl));
+ TEST_INSTRUCTION("48D1A41180000000" , shl(qword_ptr(rcx, rdx, 0, 128), 1));
+ TEST_INSTRUCTION("660FA5D1" , shld(cx, dx, cl));
+ TEST_INSTRUCTION("660FA4D101" , shld(cx, dx, 1));
+ TEST_INSTRUCTION("660FA59C1180000000" , shld(ptr(rcx, rdx, 0, 128), bx, cl));
+ TEST_INSTRUCTION("660FA49C118000000001" , shld(ptr(rcx, rdx, 0, 128), bx, 1));
+ TEST_INSTRUCTION("660FA59C1180000000" , shld(word_ptr(rcx, rdx, 0, 128), bx, cl));
+ TEST_INSTRUCTION("660FA49C118000000001" , shld(word_ptr(rcx, rdx, 0, 128), bx, 1));
+ TEST_INSTRUCTION("0FA5D1" , shld(ecx, edx, cl));
+ TEST_INSTRUCTION("0FA4D101" , shld(ecx, edx, 1));
+ TEST_INSTRUCTION("0FA59C1180000000" , shld(ptr(rcx, rdx, 0, 128), ebx, cl));
+ TEST_INSTRUCTION("0FA49C118000000001" , shld(ptr(rcx, rdx, 0, 128), ebx, 1));
+ TEST_INSTRUCTION("0FA59C1180000000" , shld(dword_ptr(rcx, rdx, 0, 128), ebx, cl));
+ TEST_INSTRUCTION("0FA49C118000000001" , shld(dword_ptr(rcx, rdx, 0, 128), ebx, 1));
+ TEST_INSTRUCTION("480FA5D1" , shld(rcx, rdx, cl));
+ TEST_INSTRUCTION("480FA4D101" , shld(rcx, rdx, 1));
+ TEST_INSTRUCTION("480FA59C1180000000" , shld(ptr(rcx, rdx, 0, 128), rbx, cl));
+ TEST_INSTRUCTION("480FA49C118000000001" , shld(ptr(rcx, rdx, 0, 128), rbx, 1));
+ TEST_INSTRUCTION("480FA59C1180000000" , shld(qword_ptr(rcx, rdx, 0, 128), rbx, cl));
+ TEST_INSTRUCTION("480FA49C118000000001" , shld(qword_ptr(rcx, rdx, 0, 128), rbx, 1));
+ TEST_INSTRUCTION("C4E261F7CA" , shlx(ecx, edx, ebx));
+ TEST_INSTRUCTION("C4E259F78C1A80000000" , shlx(ecx, ptr(rdx, rbx, 0, 128), esp));
+ TEST_INSTRUCTION("C4E259F78C1A80000000" , shlx(ecx, dword_ptr(rdx, rbx, 0, 128), esp));
+ TEST_INSTRUCTION("C4E2E1F7CA" , shlx(rcx, rdx, rbx));
+ TEST_INSTRUCTION("C4E2D9F78C1A80000000" , shlx(rcx, ptr(rdx, rbx, 0, 128), rsp));
+ TEST_INSTRUCTION("C4E2D9F78C1A80000000" , shlx(rcx, qword_ptr(rdx, rbx, 0, 128), rsp));
+ TEST_INSTRUCTION("D2E9" , shr(cl, cl));
+ TEST_INSTRUCTION("D0E9" , shr(cl, 1));
+ TEST_INSTRUCTION("D2ED" , shr(ch, cl));
+ TEST_INSTRUCTION("D0ED" , shr(ch, 1));
+ TEST_INSTRUCTION("66D3E9" , shr(cx, cl));
+ TEST_INSTRUCTION("66D1E9" , shr(cx, 1));
+ TEST_INSTRUCTION("D3E9" , shr(ecx, cl));
+ TEST_INSTRUCTION("D1E9" , shr(ecx, 1));
+ TEST_INSTRUCTION("48D3E9" , shr(rcx, cl));
+ TEST_INSTRUCTION("48D1E9" , shr(rcx, 1));
+ TEST_INSTRUCTION("D2AC1180000000" , shr(byte_ptr(rcx, rdx, 0, 128), cl));
+ TEST_INSTRUCTION("D0AC1180000000" , shr(byte_ptr(rcx, rdx, 0, 128), 1));
+ TEST_INSTRUCTION("66D3AC1180000000" , shr(word_ptr(rcx, rdx, 0, 128), cl));
+ TEST_INSTRUCTION("66D1AC1180000000" , shr(word_ptr(rcx, rdx, 0, 128), 1));
+ TEST_INSTRUCTION("D3AC1180000000" , shr(dword_ptr(rcx, rdx, 0, 128), cl));
+ TEST_INSTRUCTION("D1AC1180000000" , shr(dword_ptr(rcx, rdx, 0, 128), 1));
+ TEST_INSTRUCTION("48D3AC1180000000" , shr(qword_ptr(rcx, rdx, 0, 128), cl));
+ TEST_INSTRUCTION("48D1AC1180000000" , shr(qword_ptr(rcx, rdx, 0, 128), 1));
+ TEST_INSTRUCTION("660FADD1" , shrd(cx, dx, cl));
+ TEST_INSTRUCTION("660FACD101" , shrd(cx, dx, 1));
+ TEST_INSTRUCTION("660FAD9C1180000000" , shrd(ptr(rcx, rdx, 0, 128), bx, cl));
+ TEST_INSTRUCTION("660FAC9C118000000001" , shrd(ptr(rcx, rdx, 0, 128), bx, 1));
+ TEST_INSTRUCTION("660FAD9C1180000000" , shrd(word_ptr(rcx, rdx, 0, 128), bx, cl));
+ TEST_INSTRUCTION("660FAC9C118000000001" , shrd(word_ptr(rcx, rdx, 0, 128), bx, 1));
+ TEST_INSTRUCTION("0FADD1" , shrd(ecx, edx, cl));
+ TEST_INSTRUCTION("0FACD101" , shrd(ecx, edx, 1));
+ TEST_INSTRUCTION("0FAD9C1180000000" , shrd(ptr(rcx, rdx, 0, 128), ebx, cl));
+ TEST_INSTRUCTION("0FAC9C118000000001" , shrd(ptr(rcx, rdx, 0, 128), ebx, 1));
+ TEST_INSTRUCTION("0FAD9C1180000000" , shrd(dword_ptr(rcx, rdx, 0, 128), ebx, cl));
+ TEST_INSTRUCTION("0FAC9C118000000001" , shrd(dword_ptr(rcx, rdx, 0, 128), ebx, 1));
+ TEST_INSTRUCTION("480FADD1" , shrd(rcx, rdx, cl));
+ TEST_INSTRUCTION("480FACD101" , shrd(rcx, rdx, 1));
+ TEST_INSTRUCTION("480FAD9C1180000000" , shrd(ptr(rcx, rdx, 0, 128), rbx, cl));
+ TEST_INSTRUCTION("480FAC9C118000000001" , shrd(ptr(rcx, rdx, 0, 128), rbx, 1));
+ TEST_INSTRUCTION("480FAD9C1180000000" , shrd(qword_ptr(rcx, rdx, 0, 128), rbx, cl));
+ TEST_INSTRUCTION("480FAC9C118000000001" , shrd(qword_ptr(rcx, rdx, 0, 128), rbx, 1));
+ TEST_INSTRUCTION("C4E263F7CA" , shrx(ecx, edx, ebx));
+ TEST_INSTRUCTION("C4E25BF78C1A80000000" , shrx(ecx, ptr(rdx, rbx, 0, 128), esp));
+ TEST_INSTRUCTION("C4E25BF78C1A80000000" , shrx(ecx, dword_ptr(rdx, rbx, 0, 128), esp));
+ TEST_INSTRUCTION("C4E2E3F7CA" , shrx(rcx, rdx, rbx));
+ TEST_INSTRUCTION("C4E2DBF78C1A80000000" , shrx(rcx, ptr(rdx, rbx, 0, 128), rsp));
+ TEST_INSTRUCTION("C4E2DBF78C1A80000000" , shrx(rcx, qword_ptr(rdx, rbx, 0, 128), rsp));
+ TEST_INSTRUCTION("0F018C1180000000" , sidt(ptr(rcx, rdx, 0, 128)));
+ TEST_INSTRUCTION("0F01DE" , skinit(eax));
+ TEST_INSTRUCTION("660F00C1" , sldt(cx));
+ TEST_INSTRUCTION("0F00C1" , sldt(ecx));
+ TEST_INSTRUCTION("480F00C1" , sldt(rcx));
+ TEST_INSTRUCTION("0F00841180000000" , sldt(ptr(rcx, rdx, 0, 128)));
+ TEST_INSTRUCTION("0F00841180000000" , sldt(word_ptr(rcx, rdx, 0, 128)));
+ TEST_INSTRUCTION("8FE97812C9" , slwpcb(ecx));
+ TEST_INSTRUCTION("8FE9F812C9" , slwpcb(rcx));
+ TEST_INSTRUCTION("660F01E1" , smsw(cx));
+ TEST_INSTRUCTION("0F01E1" , smsw(ecx));
+ TEST_INSTRUCTION("480F01E1" , smsw(rcx));
+ TEST_INSTRUCTION("0F01A41180000000" , smsw(ptr(rcx, rdx, 0, 128)));
+ TEST_INSTRUCTION("0F01A41180000000" , smsw(word_ptr(rcx, rdx, 0, 128)));
+ TEST_INSTRUCTION("0F01CB" , stac());
+ TEST_INSTRUCTION("F9" , stc());
+ TEST_INSTRUCTION("FD" , std());
+ TEST_INSTRUCTION("0F01DC" , stgi());
+ TEST_INSTRUCTION("FB" , sti());
+ TEST_INSTRUCTION("0FAE9C1180000000" , stmxcsr(ptr(rcx, rdx, 0, 128)));
+ TEST_INSTRUCTION("0FAE9C1180000000" , stmxcsr(dword_ptr(rcx, rdx, 0, 128)));
+ TEST_INSTRUCTION("AA" , stos(ptr(rdi), al));
+ TEST_INSTRUCTION("AA" , stos(byte_ptr(rdi), al));
+ TEST_INSTRUCTION("66AB" , stos(ptr(rdi), ax));
+ TEST_INSTRUCTION("66AB" , stos(word_ptr(rdi), ax));
+ TEST_INSTRUCTION("AB" , stos(ptr(rdi), eax));
+ TEST_INSTRUCTION("AB" , stos(dword_ptr(rdi), eax));
+ TEST_INSTRUCTION("48AB" , stos(ptr(rdi), rax));
+ TEST_INSTRUCTION("48AB" , stos(qword_ptr(rdi), rax));
+ TEST_INSTRUCTION("660F00C9" , str(cx));
+ TEST_INSTRUCTION("0F00C9" , str(ecx));
+ TEST_INSTRUCTION("480F00C9" , str(rcx));
+ TEST_INSTRUCTION("0F008C1180000000" , str(ptr(rcx, rdx, 0, 128)));
+ TEST_INSTRUCTION("0F008C1180000000" , str(word_ptr(rcx, rdx, 0, 128)));
+ TEST_INSTRUCTION("F30F01EF" , stui());
+ TEST_INSTRUCTION("80E901" , sub(cl, 1));
+ TEST_INSTRUCTION("80ED01" , sub(ch, 1));
+ TEST_INSTRUCTION("80AC118000000001" , sub(byte_ptr(rcx, rdx, 0, 128), 1));
+ TEST_INSTRUCTION("6683E901" , sub(cx, 1));
+ TEST_INSTRUCTION("6683AC118000000001" , sub(word_ptr(rcx, rdx, 0, 128), 1));
+ TEST_INSTRUCTION("83E901" , sub(ecx, 1));
+ TEST_INSTRUCTION("83AC118000000001" , sub(dword_ptr(rcx, rdx, 0, 128), 1));
+ TEST_INSTRUCTION("4829D1" , sub(rcx, rdx));
+ TEST_INSTRUCTION("4883E901" , sub(rcx, 1));
+ TEST_INSTRUCTION("48299C1180000000" , sub(ptr(rcx, rdx, 0, 128), rbx));
+ TEST_INSTRUCTION("48299C1180000000" , sub(qword_ptr(rcx, rdx, 0, 128), rbx));
+ TEST_INSTRUCTION("4883AC118000000001" , sub(qword_ptr(rcx, rdx, 0, 128), 1));
+ TEST_INSTRUCTION("28D1" , sub(cl, dl));
+ TEST_INSTRUCTION("28F1" , sub(cl, dh));
+ TEST_INSTRUCTION("28D5" , sub(ch, dl));
+ TEST_INSTRUCTION("28F5" , sub(ch, dh));
+ TEST_INSTRUCTION("289C1180000000" , sub(ptr(rcx, rdx, 0, 128), bl));
+ TEST_INSTRUCTION("28BC1180000000" , sub(ptr(rcx, rdx, 0, 128), bh));
+ TEST_INSTRUCTION("289C1180000000" , sub(byte_ptr(rcx, rdx, 0, 128), bl));
+ TEST_INSTRUCTION("28BC1180000000" , sub(byte_ptr(rcx, rdx, 0, 128), bh));
+ TEST_INSTRUCTION("6629D1" , sub(cx, dx));
+ TEST_INSTRUCTION("66299C1180000000" , sub(ptr(rcx, rdx, 0, 128), bx));
+ TEST_INSTRUCTION("66299C1180000000" , sub(word_ptr(rcx, rdx, 0, 128), bx));
+ TEST_INSTRUCTION("29D1" , sub(ecx, edx));
+ TEST_INSTRUCTION("299C1180000000" , sub(ptr(rcx, rdx, 0, 128), ebx));
+ TEST_INSTRUCTION("299C1180000000" , sub(dword_ptr(rcx, rdx, 0, 128), ebx));
+ TEST_INSTRUCTION("2A8C1A80000000" , sub(cl, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("2A8C1A80000000" , sub(cl, byte_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("2AAC1A80000000" , sub(ch, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("2AAC1A80000000" , sub(ch, byte_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("662B8C1A80000000" , sub(cx, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("662B8C1A80000000" , sub(cx, word_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("2B8C1A80000000" , sub(ecx, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("2B8C1A80000000" , sub(ecx, dword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("482B8C1A80000000" , sub(rcx, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("482B8C1A80000000" , sub(rcx, qword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("0F01F8" , swapgs());
+ TEST_INSTRUCTION("0F05" , syscall());
+ TEST_INSTRUCTION("0F34" , sysenter());
+ TEST_INSTRUCTION("0F35" , sysexit());
+ TEST_INSTRUCTION("480F35" , sysexitq());
+ TEST_INSTRUCTION("0F07" , sysret());
+ TEST_INSTRUCTION("480F07" , sysretq());
+ TEST_INSTRUCTION("8FE97001FA" , t1mskc(ecx, edx));
+ TEST_INSTRUCTION("8FE97001BC1A80000000" , t1mskc(ecx, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("8FE97001BC1A80000000" , t1mskc(ecx, dword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("8FE9F001FA" , t1mskc(rcx, rdx));
+ TEST_INSTRUCTION("8FE9F001BC1A80000000" , t1mskc(rcx, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("8FE9F001BC1A80000000" , t1mskc(rcx, qword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("F6C101" , test(cl, 1));
+ TEST_INSTRUCTION("F6C501" , test(ch, 1));
+ TEST_INSTRUCTION("F684118000000001" , test(byte_ptr(rcx, rdx, 0, 128), 1));
+ TEST_INSTRUCTION("66F7C10100" , test(cx, 1));
+ TEST_INSTRUCTION("66F78411800000000100" , test(word_ptr(rcx, rdx, 0, 128), 1));
+ TEST_INSTRUCTION("F7C101000000" , test(ecx, 1));
+ TEST_INSTRUCTION("F784118000000001000000" , test(dword_ptr(rcx, rdx, 0, 128), 1));
+ TEST_INSTRUCTION("4885D1" , test(rcx, rdx));
+ TEST_INSTRUCTION("48F7C101000000" , test(rcx, 1));
+ TEST_INSTRUCTION("48859C1180000000" , test(ptr(rcx, rdx, 0, 128), rbx));
+ TEST_INSTRUCTION("48859C1180000000" , test(qword_ptr(rcx, rdx, 0, 128), rbx));
+ TEST_INSTRUCTION("48F784118000000001000000" , test(qword_ptr(rcx, rdx, 0, 128), 1));
+ TEST_INSTRUCTION("84D1" , test(cl, dl));
+ TEST_INSTRUCTION("84F1" , test(cl, dh));
+ TEST_INSTRUCTION("84D5" , test(ch, dl));
+ TEST_INSTRUCTION("84F5" , test(ch, dh));
+ TEST_INSTRUCTION("849C1180000000" , test(ptr(rcx, rdx, 0, 128), bl));
+ TEST_INSTRUCTION("84BC1180000000" , test(ptr(rcx, rdx, 0, 128), bh));
+ TEST_INSTRUCTION("849C1180000000" , test(byte_ptr(rcx, rdx, 0, 128), bl));
+ TEST_INSTRUCTION("84BC1180000000" , test(byte_ptr(rcx, rdx, 0, 128), bh));
+ TEST_INSTRUCTION("6685D1" , test(cx, dx));
+ TEST_INSTRUCTION("66859C1180000000" , test(ptr(rcx, rdx, 0, 128), bx));
+ TEST_INSTRUCTION("66859C1180000000" , test(word_ptr(rcx, rdx, 0, 128), bx));
+ TEST_INSTRUCTION("85D1" , test(ecx, edx));
+ TEST_INSTRUCTION("859C1180000000" , test(ptr(rcx, rdx, 0, 128), ebx));
+ TEST_INSTRUCTION("859C1180000000" , test(dword_ptr(rcx, rdx, 0, 128), ebx));
+ TEST_INSTRUCTION("F30F01ED" , testui());
+ TEST_INSTRUCTION("660FAEF1" , tpause(ecx, edx, eax));
+ TEST_INSTRUCTION("66F30FBCCA" , tzcnt(cx, dx));
+ TEST_INSTRUCTION("66F30FBC8C1A80000000" , tzcnt(cx, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("66F30FBC8C1A80000000" , tzcnt(cx, word_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("F30FBCCA" , tzcnt(ecx, edx));
+ TEST_INSTRUCTION("F30FBC8C1A80000000" , tzcnt(ecx, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("F30FBC8C1A80000000" , tzcnt(ecx, dword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("F3480FBCCA" , tzcnt(rcx, rdx));
+ TEST_INSTRUCTION("F3480FBC8C1A80000000" , tzcnt(rcx, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("F3480FBC8C1A80000000" , tzcnt(rcx, qword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("8FE97001E2" , tzmsk(ecx, edx));
+ TEST_INSTRUCTION("8FE97001A41A80000000" , tzmsk(ecx, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("8FE97001A41A80000000" , tzmsk(ecx, dword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("8FE9F001E2" , tzmsk(rcx, rdx));
+ TEST_INSTRUCTION("8FE9F001A41A80000000" , tzmsk(rcx, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("8FE9F001A41A80000000" , tzmsk(rcx, qword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("0FFFCA" , ud0(ecx, edx));
+ TEST_INSTRUCTION("0FFF8C1A80000000" , ud0(ecx, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("0FFF8C1A80000000" , ud0(ecx, dword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("0FB9CA" , ud1(ecx, edx));
+ TEST_INSTRUCTION("0FB98C1A80000000" , ud1(ecx, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("0FB98C1A80000000" , ud1(ecx, dword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("0F0B" , ud2());
+ TEST_INSTRUCTION("F30F01EC" , uiret());
+ TEST_INSTRUCTION("F30FAEF1" , umonitor(ptr(rcx)));
+ TEST_INSTRUCTION("F20FAEF1" , umwait(ecx, edx, eax));
+ TEST_INSTRUCTION("0F00E1" , verr(cx));
+ TEST_INSTRUCTION("0F00A41180000000" , verr(ptr(rcx, rdx, 0, 128)));
+ TEST_INSTRUCTION("0F00A41180000000" , verr(word_ptr(rcx, rdx, 0, 128)));
+ TEST_INSTRUCTION("0F00E9" , verw(cx));
+ TEST_INSTRUCTION("0F00AC1180000000" , verw(ptr(rcx, rdx, 0, 128)));
+ TEST_INSTRUCTION("0F00AC1180000000" , verw(word_ptr(rcx, rdx, 0, 128)));
+ TEST_INSTRUCTION("0F01C1" , vmcall());
+ TEST_INSTRUCTION("660FC7B41180000000" , vmclear(ptr(rcx, rdx, 0, 128)));
+ TEST_INSTRUCTION("660FC7B41180000000" , vmclear(qword_ptr(rcx, rdx, 0, 128)));
+ TEST_INSTRUCTION("0F01D4" , vmfunc());
+ TEST_INSTRUCTION("0F01C2" , vmlaunch());
+ TEST_INSTRUCTION("0F01DA" , vmload(rax));
+ TEST_INSTRUCTION("0F01D9" , vmmcall());
+ TEST_INSTRUCTION("0FC7B41180000000" , vmptrld(ptr(rcx, rdx, 0, 128)));
+ TEST_INSTRUCTION("0FC7B41180000000" , vmptrld(qword_ptr(rcx, rdx, 0, 128)));
+ TEST_INSTRUCTION("0FC7BC1180000000" , vmptrst(ptr(rcx, rdx, 0, 128)));
+ TEST_INSTRUCTION("0FC7BC1180000000" , vmptrst(qword_ptr(rcx, rdx, 0, 128)));
+ TEST_INSTRUCTION("0F78D1" , vmread(rcx, rdx));
+ TEST_INSTRUCTION("0F789C1180000000" , vmread(ptr(rcx, rdx, 0, 128), rbx));
+ TEST_INSTRUCTION("0F789C1180000000" , vmread(qword_ptr(rcx, rdx, 0, 128), rbx));
+ TEST_INSTRUCTION("0F01C3" , vmresume());
+ TEST_INSTRUCTION("0F01D8" , vmrun(rax));
+ TEST_INSTRUCTION("0F01DB" , vmsave(rax));
+ TEST_INSTRUCTION("0F79CA" , vmwrite(rcx, rdx));
+ TEST_INSTRUCTION("0F798C1A80000000" , vmwrite(rcx, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("0F798C1A80000000" , vmwrite(rcx, qword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("F30FC7B41180000000" , vmxon(ptr(rcx, rdx, 0, 128)));
+ TEST_INSTRUCTION("F30FC7B41180000000" , vmxon(qword_ptr(rcx, rdx, 0, 128)));
+ TEST_INSTRUCTION("0F09" , wbinvd());
+ TEST_INSTRUCTION("F30F09" , wbnoinvd());
+ TEST_INSTRUCTION("F30FAED1" , wrfsbase(ecx));
+ TEST_INSTRUCTION("F3480FAED1" , wrfsbase(rcx));
+ TEST_INSTRUCTION("F30FAED9" , wrgsbase(ecx));
+ TEST_INSTRUCTION("F3480FAED9" , wrgsbase(rcx));
+ TEST_INSTRUCTION("0F30" , wrmsr(edx, eax, ecx));
+ TEST_INSTRUCTION("0F38F6D1" , wrssd(ecx, edx));
+ TEST_INSTRUCTION("0F38F69C1180000000" , wrssd(ptr(rcx, rdx, 0, 128), ebx));
+ TEST_INSTRUCTION("0F38F69C1180000000" , wrssd(dword_ptr(rcx, rdx, 0, 128), ebx));
+ TEST_INSTRUCTION("480F38F6D1" , wrssq(rcx, rdx));
+ TEST_INSTRUCTION("480F38F69C1180000000" , wrssq(ptr(rcx, rdx, 0, 128), rbx));
+ TEST_INSTRUCTION("480F38F69C1180000000" , wrssq(qword_ptr(rcx, rdx, 0, 128), rbx));
+ TEST_INSTRUCTION("660F38F5D1" , wrussd(ecx, edx));
+ TEST_INSTRUCTION("660F38F59C1180000000" , wrussd(ptr(rcx, rdx, 0, 128), ebx));
+ TEST_INSTRUCTION("660F38F59C1180000000" , wrussd(dword_ptr(rcx, rdx, 0, 128), ebx));
+ TEST_INSTRUCTION("66480F38F5D1" , wrussq(rcx, rdx));
+ TEST_INSTRUCTION("66480F38F59C1180000000" , wrussq(ptr(rcx, rdx, 0, 128), rbx));
+ TEST_INSTRUCTION("66480F38F59C1180000000" , wrussq(qword_ptr(rcx, rdx, 0, 128), rbx));
+ TEST_INSTRUCTION("C6F801" , xabort(1));
+ TEST_INSTRUCTION("0FC0D1" , xadd(cl, dl));
+ TEST_INSTRUCTION("0FC0F1" , xadd(cl, dh));
+ TEST_INSTRUCTION("0FC0D5" , xadd(ch, dl));
+ TEST_INSTRUCTION("0FC0F5" , xadd(ch, dh));
+ TEST_INSTRUCTION("0FC09C1180000000" , xadd(ptr(rcx, rdx, 0, 128), bl));
+ TEST_INSTRUCTION("0FC0BC1180000000" , xadd(ptr(rcx, rdx, 0, 128), bh));
+ TEST_INSTRUCTION("0FC09C1180000000" , xadd(byte_ptr(rcx, rdx, 0, 128), bl));
+ TEST_INSTRUCTION("0FC0BC1180000000" , xadd(byte_ptr(rcx, rdx, 0, 128), bh));
+ TEST_INSTRUCTION("660FC1D1" , xadd(cx, dx));
+ TEST_INSTRUCTION("660FC19C1180000000" , xadd(ptr(rcx, rdx, 0, 128), bx));
+ TEST_INSTRUCTION("660FC19C1180000000" , xadd(word_ptr(rcx, rdx, 0, 128), bx));
+ TEST_INSTRUCTION("0FC1D1" , xadd(ecx, edx));
+ TEST_INSTRUCTION("0FC19C1180000000" , xadd(ptr(rcx, rdx, 0, 128), ebx));
+ TEST_INSTRUCTION("0FC19C1180000000" , xadd(dword_ptr(rcx, rdx, 0, 128), ebx));
+ TEST_INSTRUCTION("480FC1D1" , xadd(rcx, rdx));
+ TEST_INSTRUCTION("480FC19C1180000000" , xadd(ptr(rcx, rdx, 0, 128), rbx));
+ TEST_INSTRUCTION("480FC19C1180000000" , xadd(qword_ptr(rcx, rdx, 0, 128), rbx));
+ TEST_INSTRUCTION("86D1" , xchg(cl, dl));
+ TEST_INSTRUCTION("86F1" , xchg(cl, dh));
+ TEST_INSTRUCTION("86D5" , xchg(ch, dl));
+ TEST_INSTRUCTION("86F5" , xchg(ch, dh));
+ TEST_INSTRUCTION("869C1180000000" , xchg(ptr(rcx, rdx, 0, 128), bl));
+ TEST_INSTRUCTION("86BC1180000000" , xchg(ptr(rcx, rdx, 0, 128), bh));
+ TEST_INSTRUCTION("869C1180000000" , xchg(byte_ptr(rcx, rdx, 0, 128), bl));
+ TEST_INSTRUCTION("86BC1180000000" , xchg(byte_ptr(rcx, rdx, 0, 128), bh));
+ TEST_INSTRUCTION("6687D1" , xchg(cx, dx));
+ TEST_INSTRUCTION("66879C1180000000" , xchg(ptr(rcx, rdx, 0, 128), bx));
+ TEST_INSTRUCTION("66879C1180000000" , xchg(word_ptr(rcx, rdx, 0, 128), bx));
+ TEST_INSTRUCTION("87D1" , xchg(ecx, edx));
+ TEST_INSTRUCTION("879C1180000000" , xchg(ptr(rcx, rdx, 0, 128), ebx));
+ TEST_INSTRUCTION("879C1180000000" , xchg(dword_ptr(rcx, rdx, 0, 128), ebx));
+ TEST_INSTRUCTION("4887D1" , xchg(rcx, rdx));
+ TEST_INSTRUCTION("48879C1180000000" , xchg(ptr(rcx, rdx, 0, 128), rbx));
+ TEST_INSTRUCTION("48879C1180000000" , xchg(qword_ptr(rcx, rdx, 0, 128), rbx));
+ TEST_INSTRUCTION("868C1A80000000" , xchg(cl, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("868C1A80000000" , xchg(cl, byte_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("86AC1A80000000" , xchg(ch, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("86AC1A80000000" , xchg(ch, byte_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("66878C1A80000000" , xchg(cx, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("66878C1A80000000" , xchg(cx, word_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("878C1A80000000" , xchg(ecx, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("878C1A80000000" , xchg(ecx, dword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("48878C1A80000000" , xchg(rcx, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("48878C1A80000000" , xchg(rcx, qword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("0F01D5" , xend());
+ TEST_INSTRUCTION("0F01D0" , xgetbv(edx, eax, ecx));
+ TEST_INSTRUCTION("D7" , xlatb());
+ TEST_INSTRUCTION("80F101" , xor_(cl, 1));
+ TEST_INSTRUCTION("80F501" , xor_(ch, 1));
+ TEST_INSTRUCTION("80B4118000000001" , xor_(byte_ptr(rcx, rdx, 0, 128), 1));
+ TEST_INSTRUCTION("6683F101" , xor_(cx, 1));
+ TEST_INSTRUCTION("6683B4118000000001" , xor_(word_ptr(rcx, rdx, 0, 128), 1));
+ TEST_INSTRUCTION("83F101" , xor_(ecx, 1));
+ TEST_INSTRUCTION("83B4118000000001" , xor_(dword_ptr(rcx, rdx, 0, 128), 1));
+ TEST_INSTRUCTION("4831D1" , xor_(rcx, rdx));
+ TEST_INSTRUCTION("4883F101" , xor_(rcx, 1));
+ TEST_INSTRUCTION("48319C1180000000" , xor_(ptr(rcx, rdx, 0, 128), rbx));
+ TEST_INSTRUCTION("48319C1180000000" , xor_(qword_ptr(rcx, rdx, 0, 128), rbx));
+ TEST_INSTRUCTION("4883B4118000000001" , xor_(qword_ptr(rcx, rdx, 0, 128), 1));
+ TEST_INSTRUCTION("30D1" , xor_(cl, dl));
+ TEST_INSTRUCTION("30F1" , xor_(cl, dh));
+ TEST_INSTRUCTION("30D5" , xor_(ch, dl));
+ TEST_INSTRUCTION("30F5" , xor_(ch, dh));
+ TEST_INSTRUCTION("309C1180000000" , xor_(ptr(rcx, rdx, 0, 128), bl));
+ TEST_INSTRUCTION("30BC1180000000" , xor_(ptr(rcx, rdx, 0, 128), bh));
+ TEST_INSTRUCTION("309C1180000000" , xor_(byte_ptr(rcx, rdx, 0, 128), bl));
+ TEST_INSTRUCTION("30BC1180000000" , xor_(byte_ptr(rcx, rdx, 0, 128), bh));
+ TEST_INSTRUCTION("6631D1" , xor_(cx, dx));
+ TEST_INSTRUCTION("66319C1180000000" , xor_(ptr(rcx, rdx, 0, 128), bx));
+ TEST_INSTRUCTION("66319C1180000000" , xor_(word_ptr(rcx, rdx, 0, 128), bx));
+ TEST_INSTRUCTION("31D1" , xor_(ecx, edx));
+ TEST_INSTRUCTION("319C1180000000" , xor_(ptr(rcx, rdx, 0, 128), ebx));
+ TEST_INSTRUCTION("319C1180000000" , xor_(dword_ptr(rcx, rdx, 0, 128), ebx));
+ TEST_INSTRUCTION("328C1A80000000" , xor_(cl, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("328C1A80000000" , xor_(cl, byte_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("32AC1A80000000" , xor_(ch, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("32AC1A80000000" , xor_(ch, byte_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("66338C1A80000000" , xor_(cx, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("66338C1A80000000" , xor_(cx, word_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("338C1A80000000" , xor_(ecx, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("338C1A80000000" , xor_(ecx, dword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("48338C1A80000000" , xor_(rcx, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("48338C1A80000000" , xor_(rcx, qword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("F20F01E9" , xresldtrk());
+ TEST_INSTRUCTION("0FAEAC1180000000" , xrstor(ptr(rcx, rdx, 0, 128), edx, eax));
+ TEST_INSTRUCTION("480FAEAC1180000000" , xrstor64(ptr(rcx, rdx, 0, 128), edx, eax));
+ TEST_INSTRUCTION("0FC79C1180000000" , xrstors(ptr(rcx, rdx, 0, 128), edx, eax));
+ TEST_INSTRUCTION("480FC79C1180000000" , xrstors64(ptr(rcx, rdx, 0, 128), edx, eax));
+ TEST_INSTRUCTION("0FAEA41180000000" , xsave(ptr(rcx, rdx, 0, 128), edx, eax));
+ TEST_INSTRUCTION("480FAEA41180000000" , xsave64(ptr(rcx, rdx, 0, 128), edx, eax));
+ TEST_INSTRUCTION("0FC7A41180000000" , xsavec(ptr(rcx, rdx, 0, 128), edx, eax));
+ TEST_INSTRUCTION("480FC7A41180000000" , xsavec64(ptr(rcx, rdx, 0, 128), edx, eax));
+ TEST_INSTRUCTION("0FAEB41180000000" , xsaveopt(ptr(rcx, rdx, 0, 128), edx, eax));
+ TEST_INSTRUCTION("480FAEB41180000000" , xsaveopt64(ptr(rcx, rdx, 0, 128), edx, eax));
+ TEST_INSTRUCTION("0FC7AC1180000000" , xsaves(ptr(rcx, rdx, 0, 128), edx, eax));
+ TEST_INSTRUCTION("480FC7AC1180000000" , xsaves64(ptr(rcx, rdx, 0, 128), edx, eax));
+ TEST_INSTRUCTION("0F01D1" , xsetbv(edx, eax, ecx));
+ TEST_INSTRUCTION("F20F01E8" , xsusldtrk());
+ TEST_INSTRUCTION("0F01D6" , xtest());
+}
+
+static void ASMJIT_NOINLINE testX64AssemblerMMX_SSE(AssemblerTester<x86::Assembler>& tester) noexcept {
+ using namespace x86;
+
+ TEST_INSTRUCTION("660F58CA" , addpd(xmm1, xmm2));
+ TEST_INSTRUCTION("660F588C1A80000000" , addpd(xmm1, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("660F588C1A80000000" , addpd(xmm1, xmmword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("0F58CA" , addps(xmm1, xmm2));
+ TEST_INSTRUCTION("0F588C1A80000000" , addps(xmm1, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("0F588C1A80000000" , addps(xmm1, xmmword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("F20F58CA" , addsd(xmm1, xmm2));
+ TEST_INSTRUCTION("F20F588C1A80000000" , addsd(xmm1, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("F20F588C1A80000000" , addsd(xmm1, qword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("F30F58CA" , addss(xmm1, xmm2));
+ TEST_INSTRUCTION("F30F588C1A80000000" , addss(xmm1, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("F30F588C1A80000000" , addss(xmm1, dword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("660FD0CA" , addsubpd(xmm1, xmm2));
+ TEST_INSTRUCTION("660FD08C1A80000000" , addsubpd(xmm1, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("660FD08C1A80000000" , addsubpd(xmm1, xmmword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("F20FD0CA" , addsubps(xmm1, xmm2));
+ TEST_INSTRUCTION("F20FD08C1A80000000" , addsubps(xmm1, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("F20FD08C1A80000000" , addsubps(xmm1, xmmword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("660F38DECA" , aesdec(xmm1, xmm2));
+ TEST_INSTRUCTION("660F38DE8C1A80000000" , aesdec(xmm1, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("660F38DE8C1A80000000" , aesdec(xmm1, xmmword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("660F38DFCA" , aesdeclast(xmm1, xmm2));
+ TEST_INSTRUCTION("660F38DF8C1A80000000" , aesdeclast(xmm1, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("660F38DF8C1A80000000" , aesdeclast(xmm1, xmmword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("660F38DCCA" , aesenc(xmm1, xmm2));
+ TEST_INSTRUCTION("660F38DC8C1A80000000" , aesenc(xmm1, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("660F38DC8C1A80000000" , aesenc(xmm1, xmmword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("660F38DDCA" , aesenclast(xmm1, xmm2));
+ TEST_INSTRUCTION("660F38DD8C1A80000000" , aesenclast(xmm1, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("660F38DD8C1A80000000" , aesenclast(xmm1, xmmword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("660F38DBCA" , aesimc(xmm1, xmm2));
+ TEST_INSTRUCTION("660F38DB8C1A80000000" , aesimc(xmm1, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("660F38DB8C1A80000000" , aesimc(xmm1, xmmword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("660F3ADFCA01" , aeskeygenassist(xmm1, xmm2, 1));
+ TEST_INSTRUCTION("660F3ADF8C1A8000000001" , aeskeygenassist(xmm1, ptr(rdx, rbx, 0, 128), 1));
+ TEST_INSTRUCTION("660F3ADF8C1A8000000001" , aeskeygenassist(xmm1, xmmword_ptr(rdx, rbx, 0, 128), 1));
+ TEST_INSTRUCTION("660F55CA" , andnpd(xmm1, xmm2));
+ TEST_INSTRUCTION("660F558C1A80000000" , andnpd(xmm1, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("660F558C1A80000000" , andnpd(xmm1, xmmword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("0F55CA" , andnps(xmm1, xmm2));
+ TEST_INSTRUCTION("0F558C1A80000000" , andnps(xmm1, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("0F558C1A80000000" , andnps(xmm1, xmmword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("660F54CA" , andpd(xmm1, xmm2));
+ TEST_INSTRUCTION("660F548C1A80000000" , andpd(xmm1, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("660F548C1A80000000" , andpd(xmm1, xmmword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("0F54CA" , andps(xmm1, xmm2));
+ TEST_INSTRUCTION("0F548C1A80000000" , andps(xmm1, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("0F548C1A80000000" , andps(xmm1, xmmword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("660F3A0DCA01" , blendpd(xmm1, xmm2, 1));
+ TEST_INSTRUCTION("660F3A0D8C1A8000000001" , blendpd(xmm1, ptr(rdx, rbx, 0, 128), 1));
+ TEST_INSTRUCTION("660F3A0D8C1A8000000001" , blendpd(xmm1, xmmword_ptr(rdx, rbx, 0, 128), 1));
+ TEST_INSTRUCTION("660F3A0CCA01" , blendps(xmm1, xmm2, 1));
+ TEST_INSTRUCTION("660F3A0C8C1A8000000001" , blendps(xmm1, ptr(rdx, rbx, 0, 128), 1));
+ TEST_INSTRUCTION("660F3A0C8C1A8000000001" , blendps(xmm1, xmmword_ptr(rdx, rbx, 0, 128), 1));
+ TEST_INSTRUCTION("660F3815CA" , blendvpd(xmm1, xmm2, xmm0));
+ TEST_INSTRUCTION("660F38158C1A80000000" , blendvpd(xmm1, ptr(rdx, rbx, 0, 128), xmm0));
+ TEST_INSTRUCTION("660F38158C1A80000000" , blendvpd(xmm1, xmmword_ptr(rdx, rbx, 0, 128), xmm0));
+ TEST_INSTRUCTION("660F3814CA" , blendvps(xmm1, xmm2, xmm0));
+ TEST_INSTRUCTION("660F38148C1A80000000" , blendvps(xmm1, ptr(rdx, rbx, 0, 128), xmm0));
+ TEST_INSTRUCTION("660F38148C1A80000000" , blendvps(xmm1, xmmword_ptr(rdx, rbx, 0, 128), xmm0));
+ TEST_INSTRUCTION("660FC2CA01" , cmppd(xmm1, xmm2, 1));
+ TEST_INSTRUCTION("660FC28C1A8000000001" , cmppd(xmm1, ptr(rdx, rbx, 0, 128), 1));
+ TEST_INSTRUCTION("660FC28C1A8000000001" , cmppd(xmm1, xmmword_ptr(rdx, rbx, 0, 128), 1));
+ TEST_INSTRUCTION("0FC2CA01" , cmpps(xmm1, xmm2, 1));
+ TEST_INSTRUCTION("0FC28C1A8000000001" , cmpps(xmm1, ptr(rdx, rbx, 0, 128), 1));
+ TEST_INSTRUCTION("0FC28C1A8000000001" , cmpps(xmm1, xmmword_ptr(rdx, rbx, 0, 128), 1));
+ TEST_INSTRUCTION("F20FC2CA01" , cmpsd(xmm1, xmm2, 1));
+ TEST_INSTRUCTION("F20FC28C1A8000000001" , cmpsd(xmm1, ptr(rdx, rbx, 0, 128), 1));
+ TEST_INSTRUCTION("F20FC28C1A8000000001" , cmpsd(xmm1, qword_ptr(rdx, rbx, 0, 128), 1));
+ TEST_INSTRUCTION("F30FC2CA01" , cmpss(xmm1, xmm2, 1));
+ TEST_INSTRUCTION("F30FC28C1A8000000001" , cmpss(xmm1, ptr(rdx, rbx, 0, 128), 1));
+ TEST_INSTRUCTION("F30FC28C1A8000000001" , cmpss(xmm1, dword_ptr(rdx, rbx, 0, 128), 1));
+ TEST_INSTRUCTION("660F2FCA" , comisd(xmm1, xmm2));
+ TEST_INSTRUCTION("660F2F8C1A80000000" , comisd(xmm1, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("660F2F8C1A80000000" , comisd(xmm1, qword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("0F2FCA" , comiss(xmm1, xmm2));
+ TEST_INSTRUCTION("0F2F8C1A80000000" , comiss(xmm1, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("0F2F8C1A80000000" , comiss(xmm1, dword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("F30FE6CA" , cvtdq2pd(xmm1, xmm2));
+ TEST_INSTRUCTION("F30FE68C1A80000000" , cvtdq2pd(xmm1, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("F30FE68C1A80000000" , cvtdq2pd(xmm1, qword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("0F5BCA" , cvtdq2ps(xmm1, xmm2));
+ TEST_INSTRUCTION("0F5B8C1A80000000" , cvtdq2ps(xmm1, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("0F5B8C1A80000000" , cvtdq2ps(xmm1, xmmword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("F20FE6CA" , cvtpd2dq(xmm1, xmm2));
+ TEST_INSTRUCTION("F20FE68C1A80000000" , cvtpd2dq(xmm1, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("F20FE68C1A80000000" , cvtpd2dq(xmm1, xmmword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("660F2DCA" , cvtpd2pi(mm1, xmm2));
+ TEST_INSTRUCTION("660F2D8C1A80000000" , cvtpd2pi(mm1, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("660F2D8C1A80000000" , cvtpd2pi(mm1, xmmword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("660F5ACA" , cvtpd2ps(xmm1, xmm2));
+ TEST_INSTRUCTION("660F5A8C1A80000000" , cvtpd2ps(xmm1, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("660F5A8C1A80000000" , cvtpd2ps(xmm1, xmmword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("660F2ACA" , cvtpi2pd(xmm1, mm2));
+ TEST_INSTRUCTION("660F2A8C1A80000000" , cvtpi2pd(xmm1, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("660F2A8C1A80000000" , cvtpi2pd(xmm1, qword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("0F2ACA" , cvtpi2ps(xmm1, mm2));
+ TEST_INSTRUCTION("0F2A8C1A80000000" , cvtpi2ps(xmm1, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("0F2A8C1A80000000" , cvtpi2ps(xmm1, qword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("660F5BCA" , cvtps2dq(xmm1, xmm2));
+ TEST_INSTRUCTION("660F5B8C1A80000000" , cvtps2dq(xmm1, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("660F5B8C1A80000000" , cvtps2dq(xmm1, xmmword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("0F5ACA" , cvtps2pd(xmm1, xmm2));
+ TEST_INSTRUCTION("0F5A8C1A80000000" , cvtps2pd(xmm1, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("0F5A8C1A80000000" , cvtps2pd(xmm1, qword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("0F2DCA" , cvtps2pi(mm1, xmm2));
+ TEST_INSTRUCTION("0F2D8C1A80000000" , cvtps2pi(mm1, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("0F2D8C1A80000000" , cvtps2pi(mm1, qword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("F20F2DCA" , cvtsd2si(ecx, xmm2));
+ TEST_INSTRUCTION("F20F2D8C1A80000000" , cvtsd2si(ecx, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("F20F2D8C1A80000000" , cvtsd2si(ecx, qword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("F2480F2DCA" , cvtsd2si(rcx, xmm2));
+ TEST_INSTRUCTION("F2480F2D8C1A80000000" , cvtsd2si(rcx, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("F2480F2D8C1A80000000" , cvtsd2si(rcx, qword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("F20F5ACA" , cvtsd2ss(xmm1, xmm2));
+ TEST_INSTRUCTION("F20F5A8C1A80000000" , cvtsd2ss(xmm1, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("F20F5A8C1A80000000" , cvtsd2ss(xmm1, qword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("F20F2ACA" , cvtsi2sd(xmm1, edx));
+ TEST_INSTRUCTION("F2480F2ACA" , cvtsi2sd(xmm1, rdx));
+ TEST_INSTRUCTION("F20F2A8C1A80000000" , cvtsi2sd(xmm1, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("F20F2A8C1A80000000" , cvtsi2sd(xmm1, dword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("F2480F2A8C1A80000000" , cvtsi2sd(xmm1, qword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("F30F2ACA" , cvtsi2ss(xmm1, edx));
+ TEST_INSTRUCTION("F3480F2ACA" , cvtsi2ss(xmm1, rdx));
+ TEST_INSTRUCTION("F30F2A8C1A80000000" , cvtsi2ss(xmm1, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("F30F2A8C1A80000000" , cvtsi2ss(xmm1, dword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("F3480F2A8C1A80000000" , cvtsi2ss(xmm1, qword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("F30F5ACA" , cvtss2sd(xmm1, xmm2));
+ TEST_INSTRUCTION("F30F5A8C1A80000000" , cvtss2sd(xmm1, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("F30F5A8C1A80000000" , cvtss2sd(xmm1, dword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("F30F2DCA" , cvtss2si(ecx, xmm2));
+ TEST_INSTRUCTION("F30F2D8C1A80000000" , cvtss2si(ecx, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("F30F2D8C1A80000000" , cvtss2si(ecx, dword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("F3480F2DCA" , cvtss2si(rcx, xmm2));
+ TEST_INSTRUCTION("F3480F2D8C1A80000000" , cvtss2si(rcx, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("F3480F2D8C1A80000000" , cvtss2si(rcx, dword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("660FE6CA" , cvttpd2dq(xmm1, xmm2));
+ TEST_INSTRUCTION("660FE68C1A80000000" , cvttpd2dq(xmm1, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("660FE68C1A80000000" , cvttpd2dq(xmm1, xmmword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("660F2CCA" , cvttpd2pi(mm1, xmm2));
+ TEST_INSTRUCTION("660F2C8C1A80000000" , cvttpd2pi(mm1, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("660F2C8C1A80000000" , cvttpd2pi(mm1, xmmword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("F30F5BCA" , cvttps2dq(xmm1, xmm2));
+ TEST_INSTRUCTION("F30F5B8C1A80000000" , cvttps2dq(xmm1, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("F30F5B8C1A80000000" , cvttps2dq(xmm1, xmmword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("0F2CCA" , cvttps2pi(mm1, xmm2));
+ TEST_INSTRUCTION("0F2C8C1A80000000" , cvttps2pi(mm1, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("0F2C8C1A80000000" , cvttps2pi(mm1, qword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("F20F2CCA" , cvttsd2si(ecx, xmm2));
+ TEST_INSTRUCTION("F20F2C8C1A80000000" , cvttsd2si(ecx, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("F20F2C8C1A80000000" , cvttsd2si(ecx, qword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("F2480F2CCA" , cvttsd2si(rcx, xmm2));
+ TEST_INSTRUCTION("F2480F2C8C1A80000000" , cvttsd2si(rcx, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("F2480F2C8C1A80000000" , cvttsd2si(rcx, qword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("F30F2CCA" , cvttss2si(ecx, xmm2));
+ TEST_INSTRUCTION("F30F2C8C1A80000000" , cvttss2si(ecx, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("F30F2C8C1A80000000" , cvttss2si(ecx, dword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("F3480F2CCA" , cvttss2si(rcx, xmm2));
+ TEST_INSTRUCTION("F3480F2C8C1A80000000" , cvttss2si(rcx, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("F3480F2C8C1A80000000" , cvttss2si(rcx, dword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("660F5ECA" , divpd(xmm1, xmm2));
+ TEST_INSTRUCTION("660F5E8C1A80000000" , divpd(xmm1, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("660F5E8C1A80000000" , divpd(xmm1, xmmword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("0F5ECA" , divps(xmm1, xmm2));
+ TEST_INSTRUCTION("0F5E8C1A80000000" , divps(xmm1, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("0F5E8C1A80000000" , divps(xmm1, xmmword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("F20F5ECA" , divsd(xmm1, xmm2));
+ TEST_INSTRUCTION("F20F5E8C1A80000000" , divsd(xmm1, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("F20F5E8C1A80000000" , divsd(xmm1, qword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("F30F5ECA" , divss(xmm1, xmm2));
+ TEST_INSTRUCTION("F30F5E8C1A80000000" , divss(xmm1, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("F30F5E8C1A80000000" , divss(xmm1, dword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("660F3A41CA01" , dppd(xmm1, xmm2, 1));
+ TEST_INSTRUCTION("660F3A418C1A8000000001" , dppd(xmm1, ptr(rdx, rbx, 0, 128), 1));
+ TEST_INSTRUCTION("660F3A418C1A8000000001" , dppd(xmm1, xmmword_ptr(rdx, rbx, 0, 128), 1));
+ TEST_INSTRUCTION("660F3A40CA01" , dpps(xmm1, xmm2, 1));
+ TEST_INSTRUCTION("660F3A408C1A8000000001" , dpps(xmm1, ptr(rdx, rbx, 0, 128), 1));
+ TEST_INSTRUCTION("660F3A408C1A8000000001" , dpps(xmm1, xmmword_ptr(rdx, rbx, 0, 128), 1));
+ TEST_INSTRUCTION("0F77" , emms());
+ TEST_INSTRUCTION("660F3A17D101" , extractps(ecx, xmm2, 1));
+ TEST_INSTRUCTION("660F3A179C118000000001" , extractps(ptr(rcx, rdx, 0, 128), xmm3, 1));
+ TEST_INSTRUCTION("660F3A179C118000000001" , extractps(dword_ptr(rcx, rdx, 0, 128), xmm3, 1));
+ TEST_INSTRUCTION("660F78C10102" , extrq(xmm1, 1, 2));
+ TEST_INSTRUCTION("660F79CA" , extrq(xmm1, xmm2));
+ TEST_INSTRUCTION("660F3ACFCA01" , gf2p8affineinvqb(xmm1, xmm2, 1));
+ TEST_INSTRUCTION("660F3ACF8C1A8000000001" , gf2p8affineinvqb(xmm1, ptr(rdx, rbx, 0, 128), 1));
+ TEST_INSTRUCTION("660F3ACF8C1A8000000001" , gf2p8affineinvqb(xmm1, xmmword_ptr(rdx, rbx, 0, 128), 1));
+ TEST_INSTRUCTION("660F3ACECA01" , gf2p8affineqb(xmm1, xmm2, 1));
+ TEST_INSTRUCTION("660F3ACE8C1A8000000001" , gf2p8affineqb(xmm1, ptr(rdx, rbx, 0, 128), 1));
+ TEST_INSTRUCTION("660F3ACE8C1A8000000001" , gf2p8affineqb(xmm1, xmmword_ptr(rdx, rbx, 0, 128), 1));
+ TEST_INSTRUCTION("660F38CFCA" , gf2p8mulb(xmm1, xmm2));
+ TEST_INSTRUCTION("660F38CF8C1A80000000" , gf2p8mulb(xmm1, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("660F38CF8C1A80000000" , gf2p8mulb(xmm1, xmmword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("660F7CCA" , haddpd(xmm1, xmm2));
+ TEST_INSTRUCTION("660F7C8C1A80000000" , haddpd(xmm1, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("660F7C8C1A80000000" , haddpd(xmm1, xmmword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("F20F7CCA" , haddps(xmm1, xmm2));
+ TEST_INSTRUCTION("F20F7C8C1A80000000" , haddps(xmm1, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("F20F7C8C1A80000000" , haddps(xmm1, xmmword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("660F7DCA" , hsubpd(xmm1, xmm2));
+ TEST_INSTRUCTION("660F7D8C1A80000000" , hsubpd(xmm1, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("660F7D8C1A80000000" , hsubpd(xmm1, xmmword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("F20F7DCA" , hsubps(xmm1, xmm2));
+ TEST_INSTRUCTION("F20F7D8C1A80000000" , hsubps(xmm1, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("F20F7D8C1A80000000" , hsubps(xmm1, xmmword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("660F3A21CA01" , insertps(xmm1, xmm2, 1));
+ TEST_INSTRUCTION("660F3A218C1A8000000001" , insertps(xmm1, ptr(rdx, rbx, 0, 128), 1));
+ TEST_INSTRUCTION("660F3A218C1A8000000001" , insertps(xmm1, dword_ptr(rdx, rbx, 0, 128), 1));
+ TEST_INSTRUCTION("F20F79CA" , insertq(xmm1, xmm2));
+ TEST_INSTRUCTION("F20F78CA0102" , insertq(xmm1, xmm2, 1, 2));
+ TEST_INSTRUCTION("F20FF08C1A80000000" , lddqu(xmm1, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("F20FF08C1A80000000" , lddqu(xmm1, xmmword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("660FF7CA" , maskmovdqu(xmm1, xmm2, ptr(rdi)));
+ TEST_INSTRUCTION("660FF7CA" , maskmovdqu(xmm1, xmm2, xmmword_ptr(rdi)));
+ TEST_INSTRUCTION("0FF7CA" , maskmovq(mm1, mm2, ptr(rdi)));
+ TEST_INSTRUCTION("0FF7CA" , maskmovq(mm1, mm2, qword_ptr(rdi)));
+ TEST_INSTRUCTION("660F5FCA" , maxpd(xmm1, xmm2));
+ TEST_INSTRUCTION("660F5F8C1A80000000" , maxpd(xmm1, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("660F5F8C1A80000000" , maxpd(xmm1, xmmword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("0F5FCA" , maxps(xmm1, xmm2));
+ TEST_INSTRUCTION("0F5F8C1A80000000" , maxps(xmm1, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("0F5F8C1A80000000" , maxps(xmm1, xmmword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("F20F5FCA" , maxsd(xmm1, xmm2));
+ TEST_INSTRUCTION("F20F5F8C1A80000000" , maxsd(xmm1, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("F20F5F8C1A80000000" , maxsd(xmm1, qword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("F30F5FCA" , maxss(xmm1, xmm2));
+ TEST_INSTRUCTION("F30F5F8C1A80000000" , maxss(xmm1, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("F30F5F8C1A80000000" , maxss(xmm1, dword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("660F5DCA" , minpd(xmm1, xmm2));
+ TEST_INSTRUCTION("660F5D8C1A80000000" , minpd(xmm1, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("660F5D8C1A80000000" , minpd(xmm1, xmmword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("0F5DCA" , minps(xmm1, xmm2));
+ TEST_INSTRUCTION("0F5D8C1A80000000" , minps(xmm1, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("0F5D8C1A80000000" , minps(xmm1, xmmword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("F20F5DCA" , minsd(xmm1, xmm2));
+ TEST_INSTRUCTION("F20F5D8C1A80000000" , minsd(xmm1, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("F20F5D8C1A80000000" , minsd(xmm1, qword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("F30F5DCA" , minss(xmm1, xmm2));
+ TEST_INSTRUCTION("F30F5D8C1A80000000" , minss(xmm1, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("F30F5D8C1A80000000" , minss(xmm1, dword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("660F28CA" , movapd(xmm1, xmm2));
+ TEST_INSTRUCTION("660F288C1A80000000" , movapd(xmm1, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("660F288C1A80000000" , movapd(xmm1, xmmword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("660F299C1180000000" , movapd(ptr(rcx, rdx, 0, 128), xmm3));
+ TEST_INSTRUCTION("660F299C1180000000" , movapd(xmmword_ptr(rcx, rdx, 0, 128), xmm3));
+ TEST_INSTRUCTION("0F28CA" , movaps(xmm1, xmm2));
+ TEST_INSTRUCTION("0F288C1A80000000" , movaps(xmm1, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("0F288C1A80000000" , movaps(xmm1, xmmword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("0F299C1180000000" , movaps(ptr(rcx, rdx, 0, 128), xmm3));
+ TEST_INSTRUCTION("0F299C1180000000" , movaps(xmmword_ptr(rcx, rdx, 0, 128), xmm3));
+ TEST_INSTRUCTION("660F6ECA" , movd(xmm1, edx));
+ TEST_INSTRUCTION("660F6E8C1A80000000" , movd(xmm1, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("660F6E8C1A80000000" , movd(xmm1, dword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("0F6ECA" , movd(mm1, edx));
+ TEST_INSTRUCTION("0F6E8C1A80000000" , movd(mm1, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("0F6E8C1A80000000" , movd(mm1, dword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("660F7ED1" , movd(ecx, xmm2));
+ TEST_INSTRUCTION("0F7ED1" , movd(ecx, mm2));
+ TEST_INSTRUCTION("660F7E9C1180000000" , movd(ptr(rcx, rdx, 0, 128), xmm3));
+ TEST_INSTRUCTION("0F7E9C1180000000" , movd(ptr(rcx, rdx, 0, 128), mm3));
+ TEST_INSTRUCTION("660F7E9C1180000000" , movd(dword_ptr(rcx, rdx, 0, 128), xmm3));
+ TEST_INSTRUCTION("0F7E9C1180000000" , movd(dword_ptr(rcx, rdx, 0, 128), mm3));
+ TEST_INSTRUCTION("F20F12CA" , movddup(xmm1, xmm2));
+ TEST_INSTRUCTION("F20F128C1A80000000" , movddup(xmm1, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("F20F128C1A80000000" , movddup(xmm1, qword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("F20FD6CA" , movdq2q(mm1, xmm2));
+ TEST_INSTRUCTION("660F6FCA" , movdqa(xmm1, xmm2));
+ TEST_INSTRUCTION("660F6F8C1A80000000" , movdqa(xmm1, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("660F6F8C1A80000000" , movdqa(xmm1, xmmword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("660F7F9C1180000000" , movdqa(ptr(rcx, rdx, 0, 128), xmm3));
+ TEST_INSTRUCTION("660F7F9C1180000000" , movdqa(xmmword_ptr(rcx, rdx, 0, 128), xmm3));
+ TEST_INSTRUCTION("F30F6FCA" , movdqu(xmm1, xmm2));
+ TEST_INSTRUCTION("F30F6F8C1A80000000" , movdqu(xmm1, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("F30F6F8C1A80000000" , movdqu(xmm1, xmmword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("F30F7F9C1180000000" , movdqu(ptr(rcx, rdx, 0, 128), xmm3));
+ TEST_INSTRUCTION("F30F7F9C1180000000" , movdqu(xmmword_ptr(rcx, rdx, 0, 128), xmm3));
+ TEST_INSTRUCTION("0F12CA" , movhlps(xmm1, xmm2));
+ TEST_INSTRUCTION("660F179C1180000000" , movhpd(ptr(rcx, rdx, 0, 128), xmm3));
+ TEST_INSTRUCTION("660F179C1180000000" , movhpd(qword_ptr(rcx, rdx, 0, 128), xmm3));
+ TEST_INSTRUCTION("660F168C1A80000000" , movhpd(xmm1, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("660F168C1A80000000" , movhpd(xmm1, qword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("0F179C1180000000" , movhps(ptr(rcx, rdx, 0, 128), xmm3));
+ TEST_INSTRUCTION("0F179C1180000000" , movhps(qword_ptr(rcx, rdx, 0, 128), xmm3));
+ TEST_INSTRUCTION("0F168C1A80000000" , movhps(xmm1, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("0F168C1A80000000" , movhps(xmm1, qword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("0F16CA" , movlhps(xmm1, xmm2));
+ TEST_INSTRUCTION("660F139C1180000000" , movlpd(ptr(rcx, rdx, 0, 128), xmm3));
+ TEST_INSTRUCTION("660F139C1180000000" , movlpd(qword_ptr(rcx, rdx, 0, 128), xmm3));
+ TEST_INSTRUCTION("660F128C1A80000000" , movlpd(xmm1, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("660F128C1A80000000" , movlpd(xmm1, qword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("0F139C1180000000" , movlps(ptr(rcx, rdx, 0, 128), xmm3));
+ TEST_INSTRUCTION("0F139C1180000000" , movlps(qword_ptr(rcx, rdx, 0, 128), xmm3));
+ TEST_INSTRUCTION("0F128C1A80000000" , movlps(xmm1, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("0F128C1A80000000" , movlps(xmm1, qword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("660F50CA" , movmskpd(ecx, xmm2));
+ TEST_INSTRUCTION("0F50CA" , movmskps(ecx, xmm2));
+ TEST_INSTRUCTION("660FE79C1180000000" , movntdq(ptr(rcx, rdx, 0, 128), xmm3));
+ TEST_INSTRUCTION("660FE79C1180000000" , movntdq(xmmword_ptr(rcx, rdx, 0, 128), xmm3));
+ TEST_INSTRUCTION("660F382A8C1A80000000" , movntdqa(xmm1, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("660F382A8C1A80000000" , movntdqa(xmm1, xmmword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("660F2B9C1180000000" , movntpd(ptr(rcx, rdx, 0, 128), xmm3));
+ TEST_INSTRUCTION("660F2B9C1180000000" , movntpd(xmmword_ptr(rcx, rdx, 0, 128), xmm3));
+ TEST_INSTRUCTION("0F2B9C1180000000" , movntps(ptr(rcx, rdx, 0, 128), xmm3));
+ TEST_INSTRUCTION("0F2B9C1180000000" , movntps(xmmword_ptr(rcx, rdx, 0, 128), xmm3));
+ TEST_INSTRUCTION("0FE79C1180000000" , movntq(ptr(rcx, rdx, 0, 128), mm3));
+ TEST_INSTRUCTION("0FE79C1180000000" , movntq(qword_ptr(rcx, rdx, 0, 128), mm3));
+ TEST_INSTRUCTION("F20F2B9C1180000000" , movntsd(ptr(rcx, rdx, 0, 128), xmm3));
+ TEST_INSTRUCTION("F20F2B9C1180000000" , movntsd(qword_ptr(rcx, rdx, 0, 128), xmm3));
+ TEST_INSTRUCTION("F30F2B9C1180000000" , movntss(ptr(rcx, rdx, 0, 128), xmm3));
+ TEST_INSTRUCTION("F30F2B9C1180000000" , movntss(dword_ptr(rcx, rdx, 0, 128), xmm3));
+ TEST_INSTRUCTION("480F6ECA" , movq(mm1, rdx));
+ TEST_INSTRUCTION("0F6FCA" , movq(mm1, mm2));
+ TEST_INSTRUCTION("0F6F8C1A80000000" , movq(mm1, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("0F6F8C1A80000000" , movq(mm1, qword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("66480F7ED1" , movq(rcx, xmm2));
+ TEST_INSTRUCTION("480F7ED1" , movq(rcx, mm2));
+ TEST_INSTRUCTION("660FD69C1180000000" , movq(ptr(rcx, rdx, 0, 128), xmm3));
+ TEST_INSTRUCTION("0F7F9C1180000000" , movq(ptr(rcx, rdx, 0, 128), mm3));
+ TEST_INSTRUCTION("660FD69C1180000000" , movq(qword_ptr(rcx, rdx, 0, 128), xmm3));
+ TEST_INSTRUCTION("0F7F9C1180000000" , movq(qword_ptr(rcx, rdx, 0, 128), mm3));
+ TEST_INSTRUCTION("66480F6ECA" , movq(xmm1, rdx));
+ TEST_INSTRUCTION("F30F7E8C1A80000000" , movq(xmm1, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("F30F7E8C1A80000000" , movq(xmm1, qword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("F30F7ECA" , movq(xmm1, xmm2));
+ TEST_INSTRUCTION("F30FD6CA" , movq2dq(xmm1, mm2));
+ TEST_INSTRUCTION("F20F10CA" , movsd(xmm1, xmm2));
+ TEST_INSTRUCTION("F20F108C1A80000000" , movsd(xmm1, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("F20F108C1A80000000" , movsd(xmm1, qword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("F20F119C1180000000" , movsd(ptr(rcx, rdx, 0, 128), xmm3));
+ TEST_INSTRUCTION("F20F119C1180000000" , movsd(qword_ptr(rcx, rdx, 0, 128), xmm3));
+ TEST_INSTRUCTION("F30F16CA" , movshdup(xmm1, xmm2));
+ TEST_INSTRUCTION("F30F168C1A80000000" , movshdup(xmm1, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("F30F168C1A80000000" , movshdup(xmm1, xmmword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("F30F12CA" , movsldup(xmm1, xmm2));
+ TEST_INSTRUCTION("F30F128C1A80000000" , movsldup(xmm1, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("F30F128C1A80000000" , movsldup(xmm1, xmmword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("F30F10CA" , movss(xmm1, xmm2));
+ TEST_INSTRUCTION("F30F108C1A80000000" , movss(xmm1, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("F30F108C1A80000000" , movss(xmm1, dword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("F30F119C1180000000" , movss(ptr(rcx, rdx, 0, 128), xmm3));
+ TEST_INSTRUCTION("F30F119C1180000000" , movss(dword_ptr(rcx, rdx, 0, 128), xmm3));
+ TEST_INSTRUCTION("660F10CA" , movupd(xmm1, xmm2));
+ TEST_INSTRUCTION("660F108C1A80000000" , movupd(xmm1, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("660F108C1A80000000" , movupd(xmm1, xmmword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("660F119C1180000000" , movupd(ptr(rcx, rdx, 0, 128), xmm3));
+ TEST_INSTRUCTION("660F119C1180000000" , movupd(xmmword_ptr(rcx, rdx, 0, 128), xmm3));
+ TEST_INSTRUCTION("0F10CA" , movups(xmm1, xmm2));
+ TEST_INSTRUCTION("0F108C1A80000000" , movups(xmm1, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("0F108C1A80000000" , movups(xmm1, xmmword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("0F119C1180000000" , movups(ptr(rcx, rdx, 0, 128), xmm3));
+ TEST_INSTRUCTION("0F119C1180000000" , movups(xmmword_ptr(rcx, rdx, 0, 128), xmm3));
+ TEST_INSTRUCTION("660F3A42CA01" , mpsadbw(xmm1, xmm2, 1));
+ TEST_INSTRUCTION("660F3A428C1A8000000001" , mpsadbw(xmm1, ptr(rdx, rbx, 0, 128), 1));
+ TEST_INSTRUCTION("660F3A428C1A8000000001" , mpsadbw(xmm1, xmmword_ptr(rdx, rbx, 0, 128), 1));
+ TEST_INSTRUCTION("660F59CA" , mulpd(xmm1, xmm2));
+ TEST_INSTRUCTION("660F598C1A80000000" , mulpd(xmm1, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("660F598C1A80000000" , mulpd(xmm1, xmmword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("0F59CA" , mulps(xmm1, xmm2));
+ TEST_INSTRUCTION("0F598C1A80000000" , mulps(xmm1, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("0F598C1A80000000" , mulps(xmm1, xmmword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("F20F59CA" , mulsd(xmm1, xmm2));
+ TEST_INSTRUCTION("F20F598C1A80000000" , mulsd(xmm1, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("F20F598C1A80000000" , mulsd(xmm1, qword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("F30F59CA" , mulss(xmm1, xmm2));
+ TEST_INSTRUCTION("F30F598C1A80000000" , mulss(xmm1, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("F30F598C1A80000000" , mulss(xmm1, dword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("660F56CA" , orpd(xmm1, xmm2));
+ TEST_INSTRUCTION("660F568C1A80000000" , orpd(xmm1, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("660F568C1A80000000" , orpd(xmm1, xmmword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("0F56CA" , orps(xmm1, xmm2));
+ TEST_INSTRUCTION("0F568C1A80000000" , orps(xmm1, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("0F568C1A80000000" , orps(xmm1, xmmword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("0F381CCA" , pabsb(mm1, mm2));
+ TEST_INSTRUCTION("0F381C8C1A80000000" , pabsb(mm1, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("0F381C8C1A80000000" , pabsb(mm1, qword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("660F381CCA" , pabsb(xmm1, xmm2));
+ TEST_INSTRUCTION("660F381C8C1A80000000" , pabsb(xmm1, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("660F381C8C1A80000000" , pabsb(xmm1, xmmword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("0F381ECA" , pabsd(mm1, mm2));
+ TEST_INSTRUCTION("0F381E8C1A80000000" , pabsd(mm1, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("0F381E8C1A80000000" , pabsd(mm1, qword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("660F381ECA" , pabsd(xmm1, xmm2));
+ TEST_INSTRUCTION("660F381E8C1A80000000" , pabsd(xmm1, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("660F381E8C1A80000000" , pabsd(xmm1, xmmword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("0F381DCA" , pabsw(mm1, mm2));
+ TEST_INSTRUCTION("0F381D8C1A80000000" , pabsw(mm1, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("0F381D8C1A80000000" , pabsw(mm1, qword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("660F381DCA" , pabsw(xmm1, xmm2));
+ TEST_INSTRUCTION("660F381D8C1A80000000" , pabsw(xmm1, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("660F381D8C1A80000000" , pabsw(xmm1, xmmword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("0F6BCA" , packssdw(mm1, mm2));
+ TEST_INSTRUCTION("0F6B8C1A80000000" , packssdw(mm1, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("0F6B8C1A80000000" , packssdw(mm1, qword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("660F6BCA" , packssdw(xmm1, xmm2));
+ TEST_INSTRUCTION("660F6B8C1A80000000" , packssdw(xmm1, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("660F6B8C1A80000000" , packssdw(xmm1, xmmword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("0F63CA" , packsswb(mm1, mm2));
+ TEST_INSTRUCTION("0F638C1A80000000" , packsswb(mm1, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("0F638C1A80000000" , packsswb(mm1, qword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("660F63CA" , packsswb(xmm1, xmm2));
+ TEST_INSTRUCTION("660F638C1A80000000" , packsswb(xmm1, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("660F638C1A80000000" , packsswb(xmm1, xmmword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("660F382BCA" , packusdw(xmm1, xmm2));
+ TEST_INSTRUCTION("660F382B8C1A80000000" , packusdw(xmm1, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("660F382B8C1A80000000" , packusdw(xmm1, xmmword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("0F67CA" , packuswb(mm1, mm2));
+ TEST_INSTRUCTION("0F678C1A80000000" , packuswb(mm1, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("0F678C1A80000000" , packuswb(mm1, qword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("660F67CA" , packuswb(xmm1, xmm2));
+ TEST_INSTRUCTION("660F678C1A80000000" , packuswb(xmm1, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("660F678C1A80000000" , packuswb(xmm1, xmmword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("0FFCCA" , paddb(mm1, mm2));
+ TEST_INSTRUCTION("0FFC8C1A80000000" , paddb(mm1, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("0FFC8C1A80000000" , paddb(mm1, qword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("660FFCCA" , paddb(xmm1, xmm2));
+ TEST_INSTRUCTION("660FFC8C1A80000000" , paddb(xmm1, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("660FFC8C1A80000000" , paddb(xmm1, xmmword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("0FFECA" , paddd(mm1, mm2));
+ TEST_INSTRUCTION("0FFE8C1A80000000" , paddd(mm1, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("0FFE8C1A80000000" , paddd(mm1, qword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("660FFECA" , paddd(xmm1, xmm2));
+ TEST_INSTRUCTION("660FFE8C1A80000000" , paddd(xmm1, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("660FFE8C1A80000000" , paddd(xmm1, xmmword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("0FD4CA" , paddq(mm1, mm2));
+ TEST_INSTRUCTION("0FD48C1A80000000" , paddq(mm1, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("0FD48C1A80000000" , paddq(mm1, qword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("660FD4CA" , paddq(xmm1, xmm2));
+ TEST_INSTRUCTION("660FD48C1A80000000" , paddq(xmm1, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("660FD48C1A80000000" , paddq(xmm1, xmmword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("0FECCA" , paddsb(mm1, mm2));
+ TEST_INSTRUCTION("0FEC8C1A80000000" , paddsb(mm1, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("0FEC8C1A80000000" , paddsb(mm1, qword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("660FECCA" , paddsb(xmm1, xmm2));
+ TEST_INSTRUCTION("660FEC8C1A80000000" , paddsb(xmm1, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("660FEC8C1A80000000" , paddsb(xmm1, xmmword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("0FEDCA" , paddsw(mm1, mm2));
+ TEST_INSTRUCTION("0FED8C1A80000000" , paddsw(mm1, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("0FED8C1A80000000" , paddsw(mm1, qword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("660FEDCA" , paddsw(xmm1, xmm2));
+ TEST_INSTRUCTION("660FED8C1A80000000" , paddsw(xmm1, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("660FED8C1A80000000" , paddsw(xmm1, xmmword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("0FDCCA" , paddusb(mm1, mm2));
+ TEST_INSTRUCTION("0FDC8C1A80000000" , paddusb(mm1, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("0FDC8C1A80000000" , paddusb(mm1, qword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("660FDCCA" , paddusb(xmm1, xmm2));
+ TEST_INSTRUCTION("660FDC8C1A80000000" , paddusb(xmm1, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("660FDC8C1A80000000" , paddusb(xmm1, xmmword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("0FDDCA" , paddusw(mm1, mm2));
+ TEST_INSTRUCTION("0FDD8C1A80000000" , paddusw(mm1, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("0FDD8C1A80000000" , paddusw(mm1, qword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("660FDDCA" , paddusw(xmm1, xmm2));
+ TEST_INSTRUCTION("660FDD8C1A80000000" , paddusw(xmm1, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("660FDD8C1A80000000" , paddusw(xmm1, xmmword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("0FFDCA" , paddw(mm1, mm2));
+ TEST_INSTRUCTION("0FFD8C1A80000000" , paddw(mm1, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("0FFD8C1A80000000" , paddw(mm1, qword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("660FFDCA" , paddw(xmm1, xmm2));
+ TEST_INSTRUCTION("660FFD8C1A80000000" , paddw(xmm1, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("660FFD8C1A80000000" , paddw(xmm1, xmmword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("0F3A0FCA01" , palignr(mm1, mm2, 1));
+ TEST_INSTRUCTION("0F3A0F8C1A8000000001" , palignr(mm1, ptr(rdx, rbx, 0, 128), 1));
+ TEST_INSTRUCTION("0F3A0F8C1A8000000001" , palignr(mm1, qword_ptr(rdx, rbx, 0, 128), 1));
+ TEST_INSTRUCTION("660F3A0FCA01" , palignr(xmm1, xmm2, 1));
+ TEST_INSTRUCTION("660F3A0F8C1A8000000001" , palignr(xmm1, ptr(rdx, rbx, 0, 128), 1));
+ TEST_INSTRUCTION("660F3A0F8C1A8000000001" , palignr(xmm1, xmmword_ptr(rdx, rbx, 0, 128), 1));
+ TEST_INSTRUCTION("0FDBCA" , pand(mm1, mm2));
+ TEST_INSTRUCTION("0FDB8C1A80000000" , pand(mm1, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("0FDB8C1A80000000" , pand(mm1, qword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("660FDBCA" , pand(xmm1, xmm2));
+ TEST_INSTRUCTION("660FDB8C1A80000000" , pand(xmm1, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("660FDB8C1A80000000" , pand(xmm1, xmmword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("0FDFCA" , pandn(mm1, mm2));
+ TEST_INSTRUCTION("0FDF8C1A80000000" , pandn(mm1, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("0FDF8C1A80000000" , pandn(mm1, qword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("660FDFCA" , pandn(xmm1, xmm2));
+ TEST_INSTRUCTION("660FDF8C1A80000000" , pandn(xmm1, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("660FDF8C1A80000000" , pandn(xmm1, xmmword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("0FE0CA" , pavgb(mm1, mm2));
+ TEST_INSTRUCTION("0FE08C1A80000000" , pavgb(mm1, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("0FE08C1A80000000" , pavgb(mm1, qword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("660FE0CA" , pavgb(xmm1, xmm2));
+ TEST_INSTRUCTION("660FE08C1A80000000" , pavgb(xmm1, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("660FE08C1A80000000" , pavgb(xmm1, xmmword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("0F0FCABF" , pavgusb(mm1, mm2));
+ TEST_INSTRUCTION("0F0F8C1A80000000BF" , pavgusb(mm1, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("0F0F8C1A80000000BF" , pavgusb(mm1, qword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("0FE3CA" , pavgw(mm1, mm2));
+ TEST_INSTRUCTION("0FE38C1A80000000" , pavgw(mm1, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("0FE38C1A80000000" , pavgw(mm1, qword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("660FE3CA" , pavgw(xmm1, xmm2));
+ TEST_INSTRUCTION("660FE38C1A80000000" , pavgw(xmm1, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("660FE38C1A80000000" , pavgw(xmm1, xmmword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("660F3810CA" , pblendvb(xmm1, xmm2, xmm0));
+ TEST_INSTRUCTION("660F38108C1A80000000" , pblendvb(xmm1, ptr(rdx, rbx, 0, 128), xmm0));
+ TEST_INSTRUCTION("660F38108C1A80000000" , pblendvb(xmm1, xmmword_ptr(rdx, rbx, 0, 128), xmm0));
+ TEST_INSTRUCTION("660F3A0ECA01" , pblendw(xmm1, xmm2, 1));
+ TEST_INSTRUCTION("660F3A0E8C1A8000000001" , pblendw(xmm1, ptr(rdx, rbx, 0, 128), 1));
+ TEST_INSTRUCTION("660F3A0E8C1A8000000001" , pblendw(xmm1, xmmword_ptr(rdx, rbx, 0, 128), 1));
+ TEST_INSTRUCTION("660F3A44CA01" , pclmulqdq(xmm1, xmm2, 1));
+ TEST_INSTRUCTION("660F3A448C1A8000000001" , pclmulqdq(xmm1, ptr(rdx, rbx, 0, 128), 1));
+ TEST_INSTRUCTION("660F3A448C1A8000000001" , pclmulqdq(xmm1, xmmword_ptr(rdx, rbx, 0, 128), 1));
+ TEST_INSTRUCTION("0F74CA" , pcmpeqb(mm1, mm2));
+ TEST_INSTRUCTION("0F748C1A80000000" , pcmpeqb(mm1, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("0F748C1A80000000" , pcmpeqb(mm1, qword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("660F74CA" , pcmpeqb(xmm1, xmm2));
+ TEST_INSTRUCTION("660F748C1A80000000" , pcmpeqb(xmm1, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("660F748C1A80000000" , pcmpeqb(xmm1, xmmword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("0F76CA" , pcmpeqd(mm1, mm2));
+ TEST_INSTRUCTION("0F768C1A80000000" , pcmpeqd(mm1, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("0F768C1A80000000" , pcmpeqd(mm1, qword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("660F76CA" , pcmpeqd(xmm1, xmm2));
+ TEST_INSTRUCTION("660F768C1A80000000" , pcmpeqd(xmm1, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("660F768C1A80000000" , pcmpeqd(xmm1, xmmword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("660F3829CA" , pcmpeqq(xmm1, xmm2));
+ TEST_INSTRUCTION("660F38298C1A80000000" , pcmpeqq(xmm1, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("660F38298C1A80000000" , pcmpeqq(xmm1, xmmword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("0F75CA" , pcmpeqw(mm1, mm2));
+ TEST_INSTRUCTION("0F758C1A80000000" , pcmpeqw(mm1, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("0F758C1A80000000" , pcmpeqw(mm1, qword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("660F75CA" , pcmpeqw(xmm1, xmm2));
+ TEST_INSTRUCTION("660F758C1A80000000" , pcmpeqw(xmm1, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("660F758C1A80000000" , pcmpeqw(xmm1, xmmword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("660F3A61CA01" , pcmpestri(xmm1, xmm2, 1, ecx, eax, edx));
+ TEST_INSTRUCTION("660F3A618C1A8000000001" , pcmpestri(xmm1, ptr(rdx, rbx, 0, 128), 1, ecx, eax, edx));
+ TEST_INSTRUCTION("660F3A618C1A8000000001" , pcmpestri(xmm1, xmmword_ptr(rdx, rbx, 0, 128), 1, ecx, eax, edx));
+ TEST_INSTRUCTION("660F3A60CA01" , pcmpestrm(xmm1, xmm2, 1, xmm0, eax, edx));
+ TEST_INSTRUCTION("660F3A608C1A8000000001" , pcmpestrm(xmm1, ptr(rdx, rbx, 0, 128), 1, xmm0, eax, edx));
+ TEST_INSTRUCTION("660F3A608C1A8000000001" , pcmpestrm(xmm1, xmmword_ptr(rdx, rbx, 0, 128), 1, xmm0, eax, edx));
+ TEST_INSTRUCTION("0F64CA" , pcmpgtb(mm1, mm2));
+ TEST_INSTRUCTION("0F648C1A80000000" , pcmpgtb(mm1, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("0F648C1A80000000" , pcmpgtb(mm1, qword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("660F64CA" , pcmpgtb(xmm1, xmm2));
+ TEST_INSTRUCTION("660F648C1A80000000" , pcmpgtb(xmm1, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("660F648C1A80000000" , pcmpgtb(xmm1, xmmword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("0F66CA" , pcmpgtd(mm1, mm2));
+ TEST_INSTRUCTION("0F668C1A80000000" , pcmpgtd(mm1, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("0F668C1A80000000" , pcmpgtd(mm1, qword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("660F66CA" , pcmpgtd(xmm1, xmm2));
+ TEST_INSTRUCTION("660F668C1A80000000" , pcmpgtd(xmm1, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("660F668C1A80000000" , pcmpgtd(xmm1, xmmword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("660F3837CA" , pcmpgtq(xmm1, xmm2));
+ TEST_INSTRUCTION("660F38378C1A80000000" , pcmpgtq(xmm1, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("660F38378C1A80000000" , pcmpgtq(xmm1, xmmword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("0F65CA" , pcmpgtw(mm1, mm2));
+ TEST_INSTRUCTION("0F658C1A80000000" , pcmpgtw(mm1, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("0F658C1A80000000" , pcmpgtw(mm1, qword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("660F65CA" , pcmpgtw(xmm1, xmm2));
+ TEST_INSTRUCTION("660F658C1A80000000" , pcmpgtw(xmm1, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("660F658C1A80000000" , pcmpgtw(xmm1, xmmword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("660F3A63CA01" , pcmpistri(xmm1, xmm2, 1, ecx));
+ TEST_INSTRUCTION("660F3A638C1A8000000001" , pcmpistri(xmm1, ptr(rdx, rbx, 0, 128), 1, ecx));
+ TEST_INSTRUCTION("660F3A638C1A8000000001" , pcmpistri(xmm1, xmmword_ptr(rdx, rbx, 0, 128), 1, ecx));
+ TEST_INSTRUCTION("660F3A62CA01" , pcmpistrm(xmm1, xmm2, 1, xmm0));
+ TEST_INSTRUCTION("660F3A628C1A8000000001" , pcmpistrm(xmm1, ptr(rdx, rbx, 0, 128), 1, xmm0));
+ TEST_INSTRUCTION("660F3A628C1A8000000001" , pcmpistrm(xmm1, xmmword_ptr(rdx, rbx, 0, 128), 1, xmm0));
+ TEST_INSTRUCTION("660F3A14D101" , pextrb(ecx, xmm2, 1));
+ TEST_INSTRUCTION("660F3A149C118000000001" , pextrb(ptr(rcx, rdx, 0, 128), xmm3, 1));
+ TEST_INSTRUCTION("660F3A149C118000000001" , pextrb(byte_ptr(rcx, rdx, 0, 128), xmm3, 1));
+ TEST_INSTRUCTION("660F3A16D101" , pextrd(ecx, xmm2, 1));
+ TEST_INSTRUCTION("660F3A169C118000000001" , pextrd(ptr(rcx, rdx, 0, 128), xmm3, 1));
+ TEST_INSTRUCTION("660F3A169C118000000001" , pextrd(dword_ptr(rcx, rdx, 0, 128), xmm3, 1));
+ TEST_INSTRUCTION("66480F3A16D101" , pextrq(rcx, xmm2, 1));
+ TEST_INSTRUCTION("66480F3A169C118000000001" , pextrq(ptr(rcx, rdx, 0, 128), xmm3, 1));
+ TEST_INSTRUCTION("66480F3A169C118000000001" , pextrq(qword_ptr(rcx, rdx, 0, 128), xmm3, 1));
+ TEST_INSTRUCTION("660FC5CA01" , pextrw(ecx, xmm2, 1));
+ TEST_INSTRUCTION("0FC5CA01" , pextrw(ecx, mm2, 1));
+ TEST_INSTRUCTION("660F3A159C118000000001" , pextrw(ptr(rcx, rdx, 0, 128), xmm3, 1));
+ TEST_INSTRUCTION("660F3A159C118000000001" , pextrw(word_ptr(rcx, rdx, 0, 128), xmm3, 1));
+ TEST_INSTRUCTION("0F0FCA1D" , pf2id(mm1, mm2));
+ TEST_INSTRUCTION("0F0F8C1A800000001D" , pf2id(mm1, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("0F0F8C1A800000001D" , pf2id(mm1, qword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("0F0FCA1C" , pf2iw(mm1, mm2));
+ TEST_INSTRUCTION("0F0F8C1A800000001C" , pf2iw(mm1, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("0F0F8C1A800000001C" , pf2iw(mm1, qword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("0F0FCAAE" , pfacc(mm1, mm2));
+ TEST_INSTRUCTION("0F0F8C1A80000000AE" , pfacc(mm1, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("0F0F8C1A80000000AE" , pfacc(mm1, qword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("0F0FCA9E" , pfadd(mm1, mm2));
+ TEST_INSTRUCTION("0F0F8C1A800000009E" , pfadd(mm1, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("0F0F8C1A800000009E" , pfadd(mm1, qword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("0F0FCAB0" , pfcmpeq(mm1, mm2));
+ TEST_INSTRUCTION("0F0F8C1A80000000B0" , pfcmpeq(mm1, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("0F0F8C1A80000000B0" , pfcmpeq(mm1, qword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("0F0FCA90" , pfcmpge(mm1, mm2));
+ TEST_INSTRUCTION("0F0F8C1A8000000090" , pfcmpge(mm1, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("0F0F8C1A8000000090" , pfcmpge(mm1, qword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("0F0FCAA0" , pfcmpgt(mm1, mm2));
+ TEST_INSTRUCTION("0F0F8C1A80000000A0" , pfcmpgt(mm1, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("0F0F8C1A80000000A0" , pfcmpgt(mm1, qword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("0F0FCAA4" , pfmax(mm1, mm2));
+ TEST_INSTRUCTION("0F0F8C1A80000000A4" , pfmax(mm1, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("0F0F8C1A80000000A4" , pfmax(mm1, qword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("0F0FCA94" , pfmin(mm1, mm2));
+ TEST_INSTRUCTION("0F0F8C1A8000000094" , pfmin(mm1, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("0F0F8C1A8000000094" , pfmin(mm1, qword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("0F0FCAB4" , pfmul(mm1, mm2));
+ TEST_INSTRUCTION("0F0F8C1A80000000B4" , pfmul(mm1, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("0F0F8C1A80000000B4" , pfmul(mm1, qword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("0F0FCA8A" , pfnacc(mm1, mm2));
+ TEST_INSTRUCTION("0F0F8C1A800000008A" , pfnacc(mm1, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("0F0F8C1A800000008A" , pfnacc(mm1, qword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("0F0FCA8E" , pfpnacc(mm1, mm2));
+ TEST_INSTRUCTION("0F0F8C1A800000008E" , pfpnacc(mm1, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("0F0F8C1A800000008E" , pfpnacc(mm1, qword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("0F0FCA96" , pfrcp(mm1, mm2));
+ TEST_INSTRUCTION("0F0F8C1A8000000096" , pfrcp(mm1, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("0F0F8C1A8000000096" , pfrcp(mm1, qword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("0F0FCAA6" , pfrcpit1(mm1, mm2));
+ TEST_INSTRUCTION("0F0F8C1A80000000A6" , pfrcpit1(mm1, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("0F0F8C1A80000000A6" , pfrcpit1(mm1, qword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("0F0FCAB6" , pfrcpit2(mm1, mm2));
+ TEST_INSTRUCTION("0F0F8C1A80000000B6" , pfrcpit2(mm1, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("0F0F8C1A80000000B6" , pfrcpit2(mm1, qword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("0F0FCA86" , pfrcpv(mm1, mm2));
+ TEST_INSTRUCTION("0F0F8C1A8000000086" , pfrcpv(mm1, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("0F0F8C1A8000000086" , pfrcpv(mm1, qword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("0F0FCAA7" , pfrsqit1(mm1, mm2));
+ TEST_INSTRUCTION("0F0F8C1A80000000A7" , pfrsqit1(mm1, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("0F0F8C1A80000000A7" , pfrsqit1(mm1, qword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("0F0FCA97" , pfrsqrt(mm1, mm2));
+ TEST_INSTRUCTION("0F0F8C1A8000000097" , pfrsqrt(mm1, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("0F0F8C1A8000000097" , pfrsqrt(mm1, qword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("0F0FCA87" , pfrsqrtv(mm1, mm2));
+ TEST_INSTRUCTION("0F0F8C1A8000000087" , pfrsqrtv(mm1, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("0F0F8C1A8000000087" , pfrsqrtv(mm1, qword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("0F0FCA9A" , pfsub(mm1, mm2));
+ TEST_INSTRUCTION("0F0F8C1A800000009A" , pfsub(mm1, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("0F0F8C1A800000009A" , pfsub(mm1, qword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("0F0FCAAA" , pfsubr(mm1, mm2));
+ TEST_INSTRUCTION("0F0F8C1A80000000AA" , pfsubr(mm1, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("0F0F8C1A80000000AA" , pfsubr(mm1, qword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("0F3802CA" , phaddd(mm1, mm2));
+ TEST_INSTRUCTION("0F38028C1A80000000" , phaddd(mm1, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("0F38028C1A80000000" , phaddd(mm1, qword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("660F3802CA" , phaddd(xmm1, xmm2));
+ TEST_INSTRUCTION("660F38028C1A80000000" , phaddd(xmm1, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("660F38028C1A80000000" , phaddd(xmm1, xmmword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("0F3803CA" , phaddsw(mm1, mm2));
+ TEST_INSTRUCTION("0F38038C1A80000000" , phaddsw(mm1, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("0F38038C1A80000000" , phaddsw(mm1, qword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("660F3803CA" , phaddsw(xmm1, xmm2));
+ TEST_INSTRUCTION("660F38038C1A80000000" , phaddsw(xmm1, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("660F38038C1A80000000" , phaddsw(xmm1, xmmword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("0F3801CA" , phaddw(mm1, mm2));
+ TEST_INSTRUCTION("0F38018C1A80000000" , phaddw(mm1, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("0F38018C1A80000000" , phaddw(mm1, qword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("660F3801CA" , phaddw(xmm1, xmm2));
+ TEST_INSTRUCTION("660F38018C1A80000000" , phaddw(xmm1, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("660F38018C1A80000000" , phaddw(xmm1, xmmword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("660F3841CA" , phminposuw(xmm1, xmm2));
+ TEST_INSTRUCTION("660F38418C1A80000000" , phminposuw(xmm1, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("660F38418C1A80000000" , phminposuw(xmm1, xmmword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("0F3806CA" , phsubd(mm1, mm2));
+ TEST_INSTRUCTION("0F38068C1A80000000" , phsubd(mm1, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("0F38068C1A80000000" , phsubd(mm1, qword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("660F3806CA" , phsubd(xmm1, xmm2));
+ TEST_INSTRUCTION("660F38068C1A80000000" , phsubd(xmm1, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("660F38068C1A80000000" , phsubd(xmm1, xmmword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("0F3807CA" , phsubsw(mm1, mm2));
+ TEST_INSTRUCTION("0F38078C1A80000000" , phsubsw(mm1, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("0F38078C1A80000000" , phsubsw(mm1, qword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("660F3807CA" , phsubsw(xmm1, xmm2));
+ TEST_INSTRUCTION("660F38078C1A80000000" , phsubsw(xmm1, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("660F38078C1A80000000" , phsubsw(xmm1, xmmword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("0F3805CA" , phsubw(mm1, mm2));
+ TEST_INSTRUCTION("0F38058C1A80000000" , phsubw(mm1, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("0F38058C1A80000000" , phsubw(mm1, qword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("660F3805CA" , phsubw(xmm1, xmm2));
+ TEST_INSTRUCTION("660F38058C1A80000000" , phsubw(xmm1, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("660F38058C1A80000000" , phsubw(xmm1, xmmword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("0F0FCA0D" , pi2fd(mm1, mm2));
+ TEST_INSTRUCTION("0F0F8C1A800000000D" , pi2fd(mm1, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("0F0F8C1A800000000D" , pi2fd(mm1, qword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("0F0FCA0C" , pi2fw(mm1, mm2));
+ TEST_INSTRUCTION("0F0F8C1A800000000C" , pi2fw(mm1, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("0F0F8C1A800000000C" , pi2fw(mm1, qword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("660F3A20CA01" , pinsrb(xmm1, edx, 1));
+ TEST_INSTRUCTION("660F3A208C1A8000000001" , pinsrb(xmm1, ptr(rdx, rbx, 0, 128), 1));
+ TEST_INSTRUCTION("660F3A208C1A8000000001" , pinsrb(xmm1, byte_ptr(rdx, rbx, 0, 128), 1));
+ TEST_INSTRUCTION("660F3A22CA01" , pinsrd(xmm1, edx, 1));
+ TEST_INSTRUCTION("660F3A228C1A8000000001" , pinsrd(xmm1, ptr(rdx, rbx, 0, 128), 1));
+ TEST_INSTRUCTION("660F3A228C1A8000000001" , pinsrd(xmm1, dword_ptr(rdx, rbx, 0, 128), 1));
+ TEST_INSTRUCTION("66480F3A22CA01" , pinsrq(xmm1, rdx, 1));
+ TEST_INSTRUCTION("66480F3A228C1A8000000001" , pinsrq(xmm1, ptr(rdx, rbx, 0, 128), 1));
+ TEST_INSTRUCTION("66480F3A228C1A8000000001" , pinsrq(xmm1, qword_ptr(rdx, rbx, 0, 128), 1));
+ TEST_INSTRUCTION("660FC4CA01" , pinsrw(xmm1, edx, 1));
+ TEST_INSTRUCTION("660FC48C1A8000000001" , pinsrw(xmm1, ptr(rdx, rbx, 0, 128), 1));
+ TEST_INSTRUCTION("660FC48C1A8000000001" , pinsrw(xmm1, word_ptr(rdx, rbx, 0, 128), 1));
+ TEST_INSTRUCTION("0FC4CA01" , pinsrw(mm1, edx, 1));
+ TEST_INSTRUCTION("0FC48C1A8000000001" , pinsrw(mm1, ptr(rdx, rbx, 0, 128), 1));
+ TEST_INSTRUCTION("0FC48C1A8000000001" , pinsrw(mm1, word_ptr(rdx, rbx, 0, 128), 1));
+ TEST_INSTRUCTION("0F3804CA" , pmaddubsw(mm1, mm2));
+ TEST_INSTRUCTION("0F38048C1A80000000" , pmaddubsw(mm1, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("0F38048C1A80000000" , pmaddubsw(mm1, qword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("660F3804CA" , pmaddubsw(xmm1, xmm2));
+ TEST_INSTRUCTION("660F38048C1A80000000" , pmaddubsw(xmm1, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("660F38048C1A80000000" , pmaddubsw(xmm1, xmmword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("0FF5CA" , pmaddwd(mm1, mm2));
+ TEST_INSTRUCTION("0FF58C1A80000000" , pmaddwd(mm1, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("0FF58C1A80000000" , pmaddwd(mm1, qword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("660FF5CA" , pmaddwd(xmm1, xmm2));
+ TEST_INSTRUCTION("660FF58C1A80000000" , pmaddwd(xmm1, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("660FF58C1A80000000" , pmaddwd(xmm1, xmmword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("660F383CCA" , pmaxsb(xmm1, xmm2));
+ TEST_INSTRUCTION("660F383C8C1A80000000" , pmaxsb(xmm1, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("660F383C8C1A80000000" , pmaxsb(xmm1, xmmword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("660F383DCA" , pmaxsd(xmm1, xmm2));
+ TEST_INSTRUCTION("660F383D8C1A80000000" , pmaxsd(xmm1, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("660F383D8C1A80000000" , pmaxsd(xmm1, xmmword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("0FEECA" , pmaxsw(mm1, mm2));
+ TEST_INSTRUCTION("0FEE8C1A80000000" , pmaxsw(mm1, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("0FEE8C1A80000000" , pmaxsw(mm1, qword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("660FEECA" , pmaxsw(xmm1, xmm2));
+ TEST_INSTRUCTION("660FEE8C1A80000000" , pmaxsw(xmm1, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("660FEE8C1A80000000" , pmaxsw(xmm1, xmmword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("0FDECA" , pmaxub(mm1, mm2));
+ TEST_INSTRUCTION("0FDE8C1A80000000" , pmaxub(mm1, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("0FDE8C1A80000000" , pmaxub(mm1, qword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("660FDECA" , pmaxub(xmm1, xmm2));
+ TEST_INSTRUCTION("660FDE8C1A80000000" , pmaxub(xmm1, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("660FDE8C1A80000000" , pmaxub(xmm1, xmmword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("660F383FCA" , pmaxud(xmm1, xmm2));
+ TEST_INSTRUCTION("660F383F8C1A80000000" , pmaxud(xmm1, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("660F383F8C1A80000000" , pmaxud(xmm1, xmmword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("660F383ECA" , pmaxuw(xmm1, xmm2));
+ TEST_INSTRUCTION("660F383E8C1A80000000" , pmaxuw(xmm1, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("660F383E8C1A80000000" , pmaxuw(xmm1, xmmword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("660F3838CA" , pminsb(xmm1, xmm2));
+ TEST_INSTRUCTION("660F38388C1A80000000" , pminsb(xmm1, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("660F38388C1A80000000" , pminsb(xmm1, xmmword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("660F3839CA" , pminsd(xmm1, xmm2));
+ TEST_INSTRUCTION("660F38398C1A80000000" , pminsd(xmm1, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("660F38398C1A80000000" , pminsd(xmm1, xmmword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("0FEACA" , pminsw(mm1, mm2));
+ TEST_INSTRUCTION("0FEA8C1A80000000" , pminsw(mm1, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("0FEA8C1A80000000" , pminsw(mm1, qword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("660FEACA" , pminsw(xmm1, xmm2));
+ TEST_INSTRUCTION("660FEA8C1A80000000" , pminsw(xmm1, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("660FEA8C1A80000000" , pminsw(xmm1, xmmword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("0FDACA" , pminub(mm1, mm2));
+ TEST_INSTRUCTION("0FDA8C1A80000000" , pminub(mm1, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("0FDA8C1A80000000" , pminub(mm1, qword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("660FDACA" , pminub(xmm1, xmm2));
+ TEST_INSTRUCTION("660FDA8C1A80000000" , pminub(xmm1, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("660FDA8C1A80000000" , pminub(xmm1, xmmword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("660F383BCA" , pminud(xmm1, xmm2));
+ TEST_INSTRUCTION("660F383B8C1A80000000" , pminud(xmm1, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("660F383B8C1A80000000" , pminud(xmm1, xmmword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("660F383ACA" , pminuw(xmm1, xmm2));
+ TEST_INSTRUCTION("660F383A8C1A80000000" , pminuw(xmm1, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("660F383A8C1A80000000" , pminuw(xmm1, xmmword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("660FD7CA" , pmovmskb(ecx, xmm2));
+ TEST_INSTRUCTION("0FD7CA" , pmovmskb(ecx, mm2));
+ TEST_INSTRUCTION("660F3821CA" , pmovsxbd(xmm1, xmm2));
+ TEST_INSTRUCTION("660F38218C1A80000000" , pmovsxbd(xmm1, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("660F38218C1A80000000" , pmovsxbd(xmm1, dword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("660F3822CA" , pmovsxbq(xmm1, xmm2));
+ TEST_INSTRUCTION("660F38228C1A80000000" , pmovsxbq(xmm1, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("660F38228C1A80000000" , pmovsxbq(xmm1, word_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("660F3820CA" , pmovsxbw(xmm1, xmm2));
+ TEST_INSTRUCTION("660F38208C1A80000000" , pmovsxbw(xmm1, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("660F38208C1A80000000" , pmovsxbw(xmm1, qword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("660F3825CA" , pmovsxdq(xmm1, xmm2));
+ TEST_INSTRUCTION("660F38258C1A80000000" , pmovsxdq(xmm1, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("660F38258C1A80000000" , pmovsxdq(xmm1, qword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("660F3823CA" , pmovsxwd(xmm1, xmm2));
+ TEST_INSTRUCTION("660F38238C1A80000000" , pmovsxwd(xmm1, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("660F38238C1A80000000" , pmovsxwd(xmm1, qword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("660F3824CA" , pmovsxwq(xmm1, xmm2));
+ TEST_INSTRUCTION("660F38248C1A80000000" , pmovsxwq(xmm1, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("660F38248C1A80000000" , pmovsxwq(xmm1, dword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("660F3831CA" , pmovzxbd(xmm1, xmm2));
+ TEST_INSTRUCTION("660F38318C1A80000000" , pmovzxbd(xmm1, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("660F38318C1A80000000" , pmovzxbd(xmm1, dword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("660F3832CA" , pmovzxbq(xmm1, xmm2));
+ TEST_INSTRUCTION("660F38328C1A80000000" , pmovzxbq(xmm1, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("660F38328C1A80000000" , pmovzxbq(xmm1, word_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("660F3830CA" , pmovzxbw(xmm1, xmm2));
+ TEST_INSTRUCTION("660F38308C1A80000000" , pmovzxbw(xmm1, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("660F38308C1A80000000" , pmovzxbw(xmm1, qword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("660F3835CA" , pmovzxdq(xmm1, xmm2));
+ TEST_INSTRUCTION("660F38358C1A80000000" , pmovzxdq(xmm1, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("660F38358C1A80000000" , pmovzxdq(xmm1, qword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("660F3833CA" , pmovzxwd(xmm1, xmm2));
+ TEST_INSTRUCTION("660F38338C1A80000000" , pmovzxwd(xmm1, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("660F38338C1A80000000" , pmovzxwd(xmm1, qword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("660F3834CA" , pmovzxwq(xmm1, xmm2));
+ TEST_INSTRUCTION("660F38348C1A80000000" , pmovzxwq(xmm1, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("660F38348C1A80000000" , pmovzxwq(xmm1, dword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("660F3828CA" , pmuldq(xmm1, xmm2));
+ TEST_INSTRUCTION("660F38288C1A80000000" , pmuldq(xmm1, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("660F38288C1A80000000" , pmuldq(xmm1, xmmword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("0F380BCA" , pmulhrsw(mm1, mm2));
+ TEST_INSTRUCTION("0F380B8C1A80000000" , pmulhrsw(mm1, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("0F380B8C1A80000000" , pmulhrsw(mm1, qword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("660F380BCA" , pmulhrsw(xmm1, xmm2));
+ TEST_INSTRUCTION("660F380B8C1A80000000" , pmulhrsw(xmm1, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("660F380B8C1A80000000" , pmulhrsw(xmm1, xmmword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("0F0FCAB7" , pmulhrw(mm1, mm2));
+ TEST_INSTRUCTION("0F0F8C1A80000000B7" , pmulhrw(mm1, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("0F0F8C1A80000000B7" , pmulhrw(mm1, qword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("0FE4CA" , pmulhuw(mm1, mm2));
+ TEST_INSTRUCTION("0FE48C1A80000000" , pmulhuw(mm1, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("0FE48C1A80000000" , pmulhuw(mm1, qword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("660FE4CA" , pmulhuw(xmm1, xmm2));
+ TEST_INSTRUCTION("660FE48C1A80000000" , pmulhuw(xmm1, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("660FE48C1A80000000" , pmulhuw(xmm1, xmmword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("0FE5CA" , pmulhw(mm1, mm2));
+ TEST_INSTRUCTION("0FE58C1A80000000" , pmulhw(mm1, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("0FE58C1A80000000" , pmulhw(mm1, qword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("660FE5CA" , pmulhw(xmm1, xmm2));
+ TEST_INSTRUCTION("660FE58C1A80000000" , pmulhw(xmm1, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("660FE58C1A80000000" , pmulhw(xmm1, xmmword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("660F3840CA" , pmulld(xmm1, xmm2));
+ TEST_INSTRUCTION("660F38408C1A80000000" , pmulld(xmm1, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("660F38408C1A80000000" , pmulld(xmm1, xmmword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("0FD5CA" , pmullw(mm1, mm2));
+ TEST_INSTRUCTION("0FD58C1A80000000" , pmullw(mm1, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("0FD58C1A80000000" , pmullw(mm1, qword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("660FD5CA" , pmullw(xmm1, xmm2));
+ TEST_INSTRUCTION("660FD58C1A80000000" , pmullw(xmm1, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("660FD58C1A80000000" , pmullw(xmm1, xmmword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("0FF4CA" , pmuludq(mm1, mm2));
+ TEST_INSTRUCTION("0FF48C1A80000000" , pmuludq(mm1, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("0FF48C1A80000000" , pmuludq(mm1, qword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("660FF4CA" , pmuludq(xmm1, xmm2));
+ TEST_INSTRUCTION("660FF48C1A80000000" , pmuludq(xmm1, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("660FF48C1A80000000" , pmuludq(xmm1, xmmword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("0FEBCA" , por(mm1, mm2));
+ TEST_INSTRUCTION("0FEB8C1A80000000" , por(mm1, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("0FEB8C1A80000000" , por(mm1, qword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("660FEBCA" , por(xmm1, xmm2));
+ TEST_INSTRUCTION("660FEB8C1A80000000" , por(xmm1, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("660FEB8C1A80000000" , por(xmm1, xmmword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("0FF6CA" , psadbw(mm1, mm2));
+ TEST_INSTRUCTION("0FF68C1A80000000" , psadbw(mm1, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("0FF68C1A80000000" , psadbw(mm1, qword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("660FF6CA" , psadbw(xmm1, xmm2));
+ TEST_INSTRUCTION("660FF68C1A80000000" , psadbw(xmm1, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("660FF68C1A80000000" , psadbw(xmm1, xmmword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("0F3800CA" , pshufb(mm1, mm2));
+ TEST_INSTRUCTION("0F38008C1A80000000" , pshufb(mm1, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("0F38008C1A80000000" , pshufb(mm1, qword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("660F3800CA" , pshufb(xmm1, xmm2));
+ TEST_INSTRUCTION("660F38008C1A80000000" , pshufb(xmm1, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("660F38008C1A80000000" , pshufb(xmm1, xmmword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("660F70CA01" , pshufd(xmm1, xmm2, 1));
+ TEST_INSTRUCTION("660F708C1A8000000001" , pshufd(xmm1, ptr(rdx, rbx, 0, 128), 1));
+ TEST_INSTRUCTION("660F708C1A8000000001" , pshufd(xmm1, xmmword_ptr(rdx, rbx, 0, 128), 1));
+ TEST_INSTRUCTION("F30F70CA01" , pshufhw(xmm1, xmm2, 1));
+ TEST_INSTRUCTION("F30F708C1A8000000001" , pshufhw(xmm1, ptr(rdx, rbx, 0, 128), 1));
+ TEST_INSTRUCTION("F30F708C1A8000000001" , pshufhw(xmm1, xmmword_ptr(rdx, rbx, 0, 128), 1));
+ TEST_INSTRUCTION("F20F70CA01" , pshuflw(xmm1, xmm2, 1));
+ TEST_INSTRUCTION("F20F708C1A8000000001" , pshuflw(xmm1, ptr(rdx, rbx, 0, 128), 1));
+ TEST_INSTRUCTION("F20F708C1A8000000001" , pshuflw(xmm1, xmmword_ptr(rdx, rbx, 0, 128), 1));
+ TEST_INSTRUCTION("0F70CA01" , pshufw(mm1, mm2, 1));
+ TEST_INSTRUCTION("0F708C1A8000000001" , pshufw(mm1, ptr(rdx, rbx, 0, 128), 1));
+ TEST_INSTRUCTION("0F708C1A8000000001" , pshufw(mm1, qword_ptr(rdx, rbx, 0, 128), 1));
+ TEST_INSTRUCTION("0F3808CA" , psignb(mm1, mm2));
+ TEST_INSTRUCTION("0F38088C1A80000000" , psignb(mm1, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("0F38088C1A80000000" , psignb(mm1, qword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("660F3808CA" , psignb(xmm1, xmm2));
+ TEST_INSTRUCTION("660F38088C1A80000000" , psignb(xmm1, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("660F38088C1A80000000" , psignb(xmm1, xmmword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("0F380ACA" , psignd(mm1, mm2));
+ TEST_INSTRUCTION("0F380A8C1A80000000" , psignd(mm1, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("0F380A8C1A80000000" , psignd(mm1, qword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("660F380ACA" , psignd(xmm1, xmm2));
+ TEST_INSTRUCTION("660F380A8C1A80000000" , psignd(xmm1, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("660F380A8C1A80000000" , psignd(xmm1, xmmword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("0F3809CA" , psignw(mm1, mm2));
+ TEST_INSTRUCTION("0F38098C1A80000000" , psignw(mm1, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("0F38098C1A80000000" , psignw(mm1, qword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("660F3809CA" , psignw(xmm1, xmm2));
+ TEST_INSTRUCTION("660F38098C1A80000000" , psignw(xmm1, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("660F38098C1A80000000" , psignw(xmm1, xmmword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("0FF2CA" , pslld(mm1, mm2));
+ TEST_INSTRUCTION("0F72F101" , pslld(mm1, 1));
+ TEST_INSTRUCTION("0FF28C1A80000000" , pslld(mm1, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("0FF28C1A80000000" , pslld(mm1, qword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("660FF2CA" , pslld(xmm1, xmm2));
+ TEST_INSTRUCTION("660F72F101" , pslld(xmm1, 1));
+ TEST_INSTRUCTION("660FF28C1A80000000" , pslld(xmm1, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("660FF28C1A80000000" , pslld(xmm1, xmmword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("660F73F901" , pslldq(xmm1, 1));
+ TEST_INSTRUCTION("0FF3CA" , psllq(mm1, mm2));
+ TEST_INSTRUCTION("0F73F101" , psllq(mm1, 1));
+ TEST_INSTRUCTION("0FF38C1A80000000" , psllq(mm1, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("0FF38C1A80000000" , psllq(mm1, qword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("660FF3CA" , psllq(xmm1, xmm2));
+ TEST_INSTRUCTION("660F73F101" , psllq(xmm1, 1));
+ TEST_INSTRUCTION("660FF38C1A80000000" , psllq(xmm1, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("660FF38C1A80000000" , psllq(xmm1, xmmword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("0FF1CA" , psllw(mm1, mm2));
+ TEST_INSTRUCTION("0F71F101" , psllw(mm1, 1));
+ TEST_INSTRUCTION("0FF18C1A80000000" , psllw(mm1, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("0FF18C1A80000000" , psllw(mm1, qword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("660FF1CA" , psllw(xmm1, xmm2));
+ TEST_INSTRUCTION("660F71F101" , psllw(xmm1, 1));
+ TEST_INSTRUCTION("660FF18C1A80000000" , psllw(xmm1, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("660FF18C1A80000000" , psllw(xmm1, xmmword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("0FE2CA" , psrad(mm1, mm2));
+ TEST_INSTRUCTION("0F72E101" , psrad(mm1, 1));
+ TEST_INSTRUCTION("0FE28C1A80000000" , psrad(mm1, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("0FE28C1A80000000" , psrad(mm1, qword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("660FE2CA" , psrad(xmm1, xmm2));
+ TEST_INSTRUCTION("660F72E101" , psrad(xmm1, 1));
+ TEST_INSTRUCTION("660FE28C1A80000000" , psrad(xmm1, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("660FE28C1A80000000" , psrad(xmm1, xmmword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("0FE1CA" , psraw(mm1, mm2));
+ TEST_INSTRUCTION("0F71E101" , psraw(mm1, 1));
+ TEST_INSTRUCTION("0FE18C1A80000000" , psraw(mm1, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("0FE18C1A80000000" , psraw(mm1, qword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("660FE1CA" , psraw(xmm1, xmm2));
+ TEST_INSTRUCTION("660F71E101" , psraw(xmm1, 1));
+ TEST_INSTRUCTION("660FE18C1A80000000" , psraw(xmm1, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("660FE18C1A80000000" , psraw(xmm1, xmmword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("0FD2CA" , psrld(mm1, mm2));
+ TEST_INSTRUCTION("0F72D101" , psrld(mm1, 1));
+ TEST_INSTRUCTION("0FD28C1A80000000" , psrld(mm1, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("0FD28C1A80000000" , psrld(mm1, qword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("660FD2CA" , psrld(xmm1, xmm2));
+ TEST_INSTRUCTION("660F72D101" , psrld(xmm1, 1));
+ TEST_INSTRUCTION("660FD28C1A80000000" , psrld(xmm1, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("660FD28C1A80000000" , psrld(xmm1, xmmword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("660F73D901" , psrldq(xmm1, 1));
+ TEST_INSTRUCTION("0FD3CA" , psrlq(mm1, mm2));
+ TEST_INSTRUCTION("0F73D101" , psrlq(mm1, 1));
+ TEST_INSTRUCTION("0FD38C1A80000000" , psrlq(mm1, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("0FD38C1A80000000" , psrlq(mm1, qword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("660FD3CA" , psrlq(xmm1, xmm2));
+ TEST_INSTRUCTION("660F73D101" , psrlq(xmm1, 1));
+ TEST_INSTRUCTION("660FD38C1A80000000" , psrlq(xmm1, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("660FD38C1A80000000" , psrlq(xmm1, xmmword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("0FD1CA" , psrlw(mm1, mm2));
+ TEST_INSTRUCTION("0F71D101" , psrlw(mm1, 1));
+ TEST_INSTRUCTION("0FD18C1A80000000" , psrlw(mm1, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("0FD18C1A80000000" , psrlw(mm1, qword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("660FD1CA" , psrlw(xmm1, xmm2));
+ TEST_INSTRUCTION("660F71D101" , psrlw(xmm1, 1));
+ TEST_INSTRUCTION("660FD18C1A80000000" , psrlw(xmm1, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("660FD18C1A80000000" , psrlw(xmm1, xmmword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("0FF8CA" , psubb(mm1, mm2));
+ TEST_INSTRUCTION("0FF88C1A80000000" , psubb(mm1, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("0FF88C1A80000000" , psubb(mm1, qword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("660FF8CA" , psubb(xmm1, xmm2));
+ TEST_INSTRUCTION("660FF88C1A80000000" , psubb(xmm1, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("660FF88C1A80000000" , psubb(xmm1, xmmword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("0FFACA" , psubd(mm1, mm2));
+ TEST_INSTRUCTION("0FFA8C1A80000000" , psubd(mm1, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("0FFA8C1A80000000" , psubd(mm1, qword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("660FFACA" , psubd(xmm1, xmm2));
+ TEST_INSTRUCTION("660FFA8C1A80000000" , psubd(xmm1, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("660FFA8C1A80000000" , psubd(xmm1, xmmword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("0FFBCA" , psubq(mm1, mm2));
+ TEST_INSTRUCTION("0FFB8C1A80000000" , psubq(mm1, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("0FFB8C1A80000000" , psubq(mm1, qword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("660FFBCA" , psubq(xmm1, xmm2));
+ TEST_INSTRUCTION("660FFB8C1A80000000" , psubq(xmm1, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("660FFB8C1A80000000" , psubq(xmm1, xmmword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("0FE8CA" , psubsb(mm1, mm2));
+ TEST_INSTRUCTION("0FE88C1A80000000" , psubsb(mm1, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("0FE88C1A80000000" , psubsb(mm1, qword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("660FE8CA" , psubsb(xmm1, xmm2));
+ TEST_INSTRUCTION("660FE88C1A80000000" , psubsb(xmm1, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("660FE88C1A80000000" , psubsb(xmm1, xmmword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("0FE9CA" , psubsw(mm1, mm2));
+ TEST_INSTRUCTION("0FE98C1A80000000" , psubsw(mm1, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("0FE98C1A80000000" , psubsw(mm1, qword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("660FE9CA" , psubsw(xmm1, xmm2));
+ TEST_INSTRUCTION("660FE98C1A80000000" , psubsw(xmm1, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("660FE98C1A80000000" , psubsw(xmm1, xmmword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("0FD8CA" , psubusb(mm1, mm2));
+ TEST_INSTRUCTION("0FD88C1A80000000" , psubusb(mm1, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("0FD88C1A80000000" , psubusb(mm1, qword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("660FD8CA" , psubusb(xmm1, xmm2));
+ TEST_INSTRUCTION("660FD88C1A80000000" , psubusb(xmm1, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("660FD88C1A80000000" , psubusb(xmm1, xmmword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("0FD9CA" , psubusw(mm1, mm2));
+ TEST_INSTRUCTION("0FD98C1A80000000" , psubusw(mm1, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("0FD98C1A80000000" , psubusw(mm1, qword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("660FD9CA" , psubusw(xmm1, xmm2));
+ TEST_INSTRUCTION("660FD98C1A80000000" , psubusw(xmm1, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("660FD98C1A80000000" , psubusw(xmm1, xmmword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("0FF9CA" , psubw(mm1, mm2));
+ TEST_INSTRUCTION("0FF98C1A80000000" , psubw(mm1, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("0FF98C1A80000000" , psubw(mm1, qword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("660FF9CA" , psubw(xmm1, xmm2));
+ TEST_INSTRUCTION("660FF98C1A80000000" , psubw(xmm1, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("660FF98C1A80000000" , psubw(xmm1, xmmword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("0F0FCABB" , pswapd(mm1, mm2));
+ TEST_INSTRUCTION("0F0F8C1A80000000BB" , pswapd(mm1, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("0F0F8C1A80000000BB" , pswapd(mm1, qword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("660F3817CA" , ptest(xmm1, xmm2));
+ TEST_INSTRUCTION("660F38178C1A80000000" , ptest(xmm1, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("660F38178C1A80000000" , ptest(xmm1, xmmword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("0F68CA" , punpckhbw(mm1, mm2));
+ TEST_INSTRUCTION("0F688C1A80000000" , punpckhbw(mm1, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("0F688C1A80000000" , punpckhbw(mm1, qword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("660F68CA" , punpckhbw(xmm1, xmm2));
+ TEST_INSTRUCTION("660F688C1A80000000" , punpckhbw(xmm1, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("660F688C1A80000000" , punpckhbw(xmm1, xmmword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("0F6ACA" , punpckhdq(mm1, mm2));
+ TEST_INSTRUCTION("0F6A8C1A80000000" , punpckhdq(mm1, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("0F6A8C1A80000000" , punpckhdq(mm1, qword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("660F6ACA" , punpckhdq(xmm1, xmm2));
+ TEST_INSTRUCTION("660F6A8C1A80000000" , punpckhdq(xmm1, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("660F6A8C1A80000000" , punpckhdq(xmm1, xmmword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("660F6DCA" , punpckhqdq(xmm1, xmm2));
+ TEST_INSTRUCTION("660F6D8C1A80000000" , punpckhqdq(xmm1, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("660F6D8C1A80000000" , punpckhqdq(xmm1, xmmword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("0F69CA" , punpckhwd(mm1, mm2));
+ TEST_INSTRUCTION("0F698C1A80000000" , punpckhwd(mm1, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("0F698C1A80000000" , punpckhwd(mm1, qword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("660F69CA" , punpckhwd(xmm1, xmm2));
+ TEST_INSTRUCTION("660F698C1A80000000" , punpckhwd(xmm1, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("660F698C1A80000000" , punpckhwd(xmm1, xmmword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("0F60CA" , punpcklbw(mm1, mm2));
+ TEST_INSTRUCTION("0F608C1A80000000" , punpcklbw(mm1, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("0F608C1A80000000" , punpcklbw(mm1, dword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("660F60CA" , punpcklbw(xmm1, xmm2));
+ TEST_INSTRUCTION("660F608C1A80000000" , punpcklbw(xmm1, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("660F608C1A80000000" , punpcklbw(xmm1, xmmword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("0F62CA" , punpckldq(mm1, mm2));
+ TEST_INSTRUCTION("0F628C1A80000000" , punpckldq(mm1, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("0F628C1A80000000" , punpckldq(mm1, dword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("660F62CA" , punpckldq(xmm1, xmm2));
+ TEST_INSTRUCTION("660F628C1A80000000" , punpckldq(xmm1, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("660F628C1A80000000" , punpckldq(xmm1, xmmword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("660F6CCA" , punpcklqdq(xmm1, xmm2));
+ TEST_INSTRUCTION("660F6C8C1A80000000" , punpcklqdq(xmm1, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("660F6C8C1A80000000" , punpcklqdq(xmm1, xmmword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("0F61CA" , punpcklwd(mm1, mm2));
+ TEST_INSTRUCTION("0F618C1A80000000" , punpcklwd(mm1, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("0F618C1A80000000" , punpcklwd(mm1, dword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("660F61CA" , punpcklwd(xmm1, xmm2));
+ TEST_INSTRUCTION("660F618C1A80000000" , punpcklwd(xmm1, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("660F618C1A80000000" , punpcklwd(xmm1, xmmword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("0FEFCA" , pxor(mm1, mm2));
+ TEST_INSTRUCTION("0FEF8C1A80000000" , pxor(mm1, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("0FEF8C1A80000000" , pxor(mm1, qword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("660FEFCA" , pxor(xmm1, xmm2));
+ TEST_INSTRUCTION("660FEF8C1A80000000" , pxor(xmm1, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("660FEF8C1A80000000" , pxor(xmm1, xmmword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("0F53CA" , rcpps(xmm1, xmm2));
+ TEST_INSTRUCTION("0F538C1A80000000" , rcpps(xmm1, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("0F538C1A80000000" , rcpps(xmm1, xmmword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("F30F53CA" , rcpss(xmm1, xmm2));
+ TEST_INSTRUCTION("F30F538C1A80000000" , rcpss(xmm1, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("F30F538C1A80000000" , rcpss(xmm1, dword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("660F3A09CA01" , roundpd(xmm1, xmm2, 1));
+ TEST_INSTRUCTION("660F3A098C1A8000000001" , roundpd(xmm1, ptr(rdx, rbx, 0, 128), 1));
+ TEST_INSTRUCTION("660F3A098C1A8000000001" , roundpd(xmm1, xmmword_ptr(rdx, rbx, 0, 128), 1));
+ TEST_INSTRUCTION("660F3A08CA01" , roundps(xmm1, xmm2, 1));
+ TEST_INSTRUCTION("660F3A088C1A8000000001" , roundps(xmm1, ptr(rdx, rbx, 0, 128), 1));
+ TEST_INSTRUCTION("660F3A088C1A8000000001" , roundps(xmm1, xmmword_ptr(rdx, rbx, 0, 128), 1));
+ TEST_INSTRUCTION("660F3A0BCA01" , roundsd(xmm1, xmm2, 1));
+ TEST_INSTRUCTION("660F3A0B8C1A8000000001" , roundsd(xmm1, ptr(rdx, rbx, 0, 128), 1));
+ TEST_INSTRUCTION("660F3A0B8C1A8000000001" , roundsd(xmm1, qword_ptr(rdx, rbx, 0, 128), 1));
+ TEST_INSTRUCTION("660F3A0ACA01" , roundss(xmm1, xmm2, 1));
+ TEST_INSTRUCTION("660F3A0A8C1A8000000001" , roundss(xmm1, ptr(rdx, rbx, 0, 128), 1));
+ TEST_INSTRUCTION("660F3A0A8C1A8000000001" , roundss(xmm1, dword_ptr(rdx, rbx, 0, 128), 1));
+ TEST_INSTRUCTION("0F52CA" , rsqrtps(xmm1, xmm2));
+ TEST_INSTRUCTION("0F528C1A80000000" , rsqrtps(xmm1, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("0F528C1A80000000" , rsqrtps(xmm1, xmmword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("F30F52CA" , rsqrtss(xmm1, xmm2));
+ TEST_INSTRUCTION("F30F528C1A80000000" , rsqrtss(xmm1, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("F30F528C1A80000000" , rsqrtss(xmm1, dword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("F30F01AC1180000000" , rstorssp(ptr(rcx, rdx, 0, 128)));
+ TEST_INSTRUCTION("F30F01AC1180000000" , rstorssp(qword_ptr(rcx, rdx, 0, 128)));
+ TEST_INSTRUCTION("0F38C9CA" , sha1msg1(xmm1, xmm2));
+ TEST_INSTRUCTION("0F38C98C1A80000000" , sha1msg1(xmm1, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("0F38C98C1A80000000" , sha1msg1(xmm1, xmmword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("0F38CACA" , sha1msg2(xmm1, xmm2));
+ TEST_INSTRUCTION("0F38CA8C1A80000000" , sha1msg2(xmm1, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("0F38CA8C1A80000000" , sha1msg2(xmm1, xmmword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("0F38C8CA" , sha1nexte(xmm1, xmm2));
+ TEST_INSTRUCTION("0F38C88C1A80000000" , sha1nexte(xmm1, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("0F38C88C1A80000000" , sha1nexte(xmm1, xmmword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("0F3ACCCA01" , sha1rnds4(xmm1, xmm2, 1));
+ TEST_INSTRUCTION("0F3ACC8C1A8000000001" , sha1rnds4(xmm1, ptr(rdx, rbx, 0, 128), 1));
+ TEST_INSTRUCTION("0F3ACC8C1A8000000001" , sha1rnds4(xmm1, xmmword_ptr(rdx, rbx, 0, 128), 1));
+ TEST_INSTRUCTION("0F38CCCA" , sha256msg1(xmm1, xmm2));
+ TEST_INSTRUCTION("0F38CC8C1A80000000" , sha256msg1(xmm1, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("0F38CC8C1A80000000" , sha256msg1(xmm1, xmmword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("0F38CDCA" , sha256msg2(xmm1, xmm2));
+ TEST_INSTRUCTION("0F38CD8C1A80000000" , sha256msg2(xmm1, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("0F38CD8C1A80000000" , sha256msg2(xmm1, xmmword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("0F38CBCA" , sha256rnds2(xmm1, xmm2, xmm0));
+ TEST_INSTRUCTION("0F38CB8C1A80000000" , sha256rnds2(xmm1, ptr(rdx, rbx, 0, 128), xmm0));
+ TEST_INSTRUCTION("0F38CB8C1A80000000" , sha256rnds2(xmm1, xmmword_ptr(rdx, rbx, 0, 128), xmm0));
+ TEST_INSTRUCTION("660FC6CA01" , shufpd(xmm1, xmm2, 1));
+ TEST_INSTRUCTION("660FC68C1A8000000001" , shufpd(xmm1, ptr(rdx, rbx, 0, 128), 1));
+ TEST_INSTRUCTION("660FC68C1A8000000001" , shufpd(xmm1, xmmword_ptr(rdx, rbx, 0, 128), 1));
+ TEST_INSTRUCTION("0FC6CA01" , shufps(xmm1, xmm2, 1));
+ TEST_INSTRUCTION("0FC68C1A8000000001" , shufps(xmm1, ptr(rdx, rbx, 0, 128), 1));
+ TEST_INSTRUCTION("0FC68C1A8000000001" , shufps(xmm1, xmmword_ptr(rdx, rbx, 0, 128), 1));
+ TEST_INSTRUCTION("660F51CA" , sqrtpd(xmm1, xmm2));
+ TEST_INSTRUCTION("660F518C1A80000000" , sqrtpd(xmm1, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("660F518C1A80000000" , sqrtpd(xmm1, xmmword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("0F51CA" , sqrtps(xmm1, xmm2));
+ TEST_INSTRUCTION("0F518C1A80000000" , sqrtps(xmm1, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("0F518C1A80000000" , sqrtps(xmm1, xmmword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("F20F51CA" , sqrtsd(xmm1, xmm2));
+ TEST_INSTRUCTION("F20F518C1A80000000" , sqrtsd(xmm1, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("F20F518C1A80000000" , sqrtsd(xmm1, qword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("F30F51CA" , sqrtss(xmm1, xmm2));
+ TEST_INSTRUCTION("F30F518C1A80000000" , sqrtss(xmm1, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("F30F518C1A80000000" , sqrtss(xmm1, dword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("660F5CCA" , subpd(xmm1, xmm2));
+ TEST_INSTRUCTION("660F5C8C1A80000000" , subpd(xmm1, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("660F5C8C1A80000000" , subpd(xmm1, xmmword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("0F5CCA" , subps(xmm1, xmm2));
+ TEST_INSTRUCTION("0F5C8C1A80000000" , subps(xmm1, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("0F5C8C1A80000000" , subps(xmm1, xmmword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("F20F5CCA" , subsd(xmm1, xmm2));
+ TEST_INSTRUCTION("F20F5C8C1A80000000" , subsd(xmm1, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("F20F5C8C1A80000000" , subsd(xmm1, qword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("F30F5CCA" , subss(xmm1, xmm2));
+ TEST_INSTRUCTION("F30F5C8C1A80000000" , subss(xmm1, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("F30F5C8C1A80000000" , subss(xmm1, dword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("660F2ECA" , ucomisd(xmm1, xmm2));
+ TEST_INSTRUCTION("660F2E8C1A80000000" , ucomisd(xmm1, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("660F2E8C1A80000000" , ucomisd(xmm1, qword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("0F2ECA" , ucomiss(xmm1, xmm2));
+ TEST_INSTRUCTION("0F2E8C1A80000000" , ucomiss(xmm1, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("0F2E8C1A80000000" , ucomiss(xmm1, dword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("660F15CA" , unpckhpd(xmm1, xmm2));
+ TEST_INSTRUCTION("660F158C1A80000000" , unpckhpd(xmm1, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("660F158C1A80000000" , unpckhpd(xmm1, xmmword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("0F15CA" , unpckhps(xmm1, xmm2));
+ TEST_INSTRUCTION("0F158C1A80000000" , unpckhps(xmm1, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("0F158C1A80000000" , unpckhps(xmm1, xmmword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("660F14CA" , unpcklpd(xmm1, xmm2));
+ TEST_INSTRUCTION("660F148C1A80000000" , unpcklpd(xmm1, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("660F148C1A80000000" , unpcklpd(xmm1, xmmword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("0F14CA" , unpcklps(xmm1, xmm2));
+ TEST_INSTRUCTION("0F148C1A80000000" , unpcklps(xmm1, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("0F148C1A80000000" , unpcklps(xmm1, xmmword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("660F57CA" , xorpd(xmm1, xmm2));
+ TEST_INSTRUCTION("660F578C1A80000000" , xorpd(xmm1, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("660F578C1A80000000" , xorpd(xmm1, xmmword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("0F57CA" , xorps(xmm1, xmm2));
+ TEST_INSTRUCTION("0F578C1A80000000" , xorps(xmm1, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("0F578C1A80000000" , xorps(xmm1, xmmword_ptr(rdx, rbx, 0, 128)));
+}
+
+static void ASMJIT_NOINLINE testX64AssemblerAVX(AssemblerTester<x86::Assembler>& tester) noexcept {
+ using namespace x86;
+
+ TEST_INSTRUCTION("62F25F489A4C1A08" , v4fmaddps(zmm1, zmm4, zmm5, zmm6, zmm7, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("62F25F489A4C1A08" , v4fmaddps(zmm1, zmm4, zmm5, zmm6, zmm7, xmmword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("62F25F089B4C1A08" , v4fmaddss(xmm1, xmm4, xmm5, xmm6, xmm7, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("62F25F089B4C1A08" , v4fmaddss(xmm1, xmm4, xmm5, xmm6, xmm7, xmmword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("62F25F48AA4C1A08" , v4fnmaddps(zmm1, zmm4, zmm5, zmm6, zmm7, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("62F25F48AA4C1A08" , v4fnmaddps(zmm1, zmm4, zmm5, zmm6, zmm7, xmmword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("62F25F08AB4C1A08" , v4fnmaddss(xmm1, xmm4, xmm5, xmm6, xmm7, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("62F25F08AB4C1A08" , v4fnmaddss(xmm1, xmm4, xmm5, xmm6, xmm7, xmmword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("C5E958CB" , vaddpd(xmm1, xmm2, xmm3));
+ TEST_INSTRUCTION("C5E9588C2B80000000" , vaddpd(xmm1, xmm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C5E9588C2B80000000" , vaddpd(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C5ED58CB" , vaddpd(ymm1, ymm2, ymm3));
+ TEST_INSTRUCTION("C5ED588C2B80000000" , vaddpd(ymm1, ymm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C5ED588C2B80000000" , vaddpd(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F1ED4858CB" , vaddpd(zmm1, zmm2, zmm3));
+ TEST_INSTRUCTION("62F1ED48584C2B02" , vaddpd(zmm1, zmm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F1ED48584C2B02" , vaddpd(zmm1, zmm2, zmmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C5E858CB" , vaddps(xmm1, xmm2, xmm3));
+ TEST_INSTRUCTION("C5E8588C2B80000000" , vaddps(xmm1, xmm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C5E8588C2B80000000" , vaddps(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C5EC58CB" , vaddps(ymm1, ymm2, ymm3));
+ TEST_INSTRUCTION("C5EC588C2B80000000" , vaddps(ymm1, ymm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C5EC588C2B80000000" , vaddps(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F16C4858CB" , vaddps(zmm1, zmm2, zmm3));
+ TEST_INSTRUCTION("62F16C48584C2B02" , vaddps(zmm1, zmm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F16C48584C2B02" , vaddps(zmm1, zmm2, zmmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C5EB58CB" , vaddsd(xmm1, xmm2, xmm3));
+ TEST_INSTRUCTION("C5EB588C2B80000000" , vaddsd(xmm1, xmm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C5EB588C2B80000000" , vaddsd(xmm1, xmm2, qword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C5EA58CB" , vaddss(xmm1, xmm2, xmm3));
+ TEST_INSTRUCTION("C5EA588C2B80000000" , vaddss(xmm1, xmm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C5EA588C2B80000000" , vaddss(xmm1, xmm2, dword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C5E9D0CB" , vaddsubpd(xmm1, xmm2, xmm3));
+ TEST_INSTRUCTION("C5E9D08C2B80000000" , vaddsubpd(xmm1, xmm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C5E9D08C2B80000000" , vaddsubpd(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C5EDD0CB" , vaddsubpd(ymm1, ymm2, ymm3));
+ TEST_INSTRUCTION("C5EDD08C2B80000000" , vaddsubpd(ymm1, ymm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C5EDD08C2B80000000" , vaddsubpd(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C5EBD0CB" , vaddsubps(xmm1, xmm2, xmm3));
+ TEST_INSTRUCTION("C5EBD08C2B80000000" , vaddsubps(xmm1, xmm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C5EBD08C2B80000000" , vaddsubps(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C5EFD0CB" , vaddsubps(ymm1, ymm2, ymm3));
+ TEST_INSTRUCTION("C5EFD08C2B80000000" , vaddsubps(ymm1, ymm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C5EFD08C2B80000000" , vaddsubps(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C4E269DECB" , vaesdec(xmm1, xmm2, xmm3));
+ TEST_INSTRUCTION("C4E269DE8C2B80000000" , vaesdec(xmm1, xmm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C4E269DE8C2B80000000" , vaesdec(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C4E26DDECB" , vaesdec(ymm1, ymm2, ymm3));
+ TEST_INSTRUCTION("C4E26DDE8C2B80000000" , vaesdec(ymm1, ymm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C4E26DDE8C2B80000000" , vaesdec(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F26D48DECB" , vaesdec(zmm1, zmm2, zmm3));
+ TEST_INSTRUCTION("62F26D48DE4C2B02" , vaesdec(zmm1, zmm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F26D48DE4C2B02" , vaesdec(zmm1, zmm2, zmmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C4E269DFCB" , vaesdeclast(xmm1, xmm2, xmm3));
+ TEST_INSTRUCTION("C4E269DF8C2B80000000" , vaesdeclast(xmm1, xmm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C4E269DF8C2B80000000" , vaesdeclast(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C4E26DDFCB" , vaesdeclast(ymm1, ymm2, ymm3));
+ TEST_INSTRUCTION("C4E26DDF8C2B80000000" , vaesdeclast(ymm1, ymm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C4E26DDF8C2B80000000" , vaesdeclast(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F26D48DFCB" , vaesdeclast(zmm1, zmm2, zmm3));
+ TEST_INSTRUCTION("62F26D48DF4C2B02" , vaesdeclast(zmm1, zmm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F26D48DF4C2B02" , vaesdeclast(zmm1, zmm2, zmmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C4E269DCCB" , vaesenc(xmm1, xmm2, xmm3));
+ TEST_INSTRUCTION("C4E269DC8C2B80000000" , vaesenc(xmm1, xmm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C4E269DC8C2B80000000" , vaesenc(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C4E26DDCCB" , vaesenc(ymm1, ymm2, ymm3));
+ TEST_INSTRUCTION("C4E26DDC8C2B80000000" , vaesenc(ymm1, ymm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C4E26DDC8C2B80000000" , vaesenc(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F26D48DCCB" , vaesenc(zmm1, zmm2, zmm3));
+ TEST_INSTRUCTION("62F26D48DC4C2B02" , vaesenc(zmm1, zmm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F26D48DC4C2B02" , vaesenc(zmm1, zmm2, zmmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C4E269DDCB" , vaesenclast(xmm1, xmm2, xmm3));
+ TEST_INSTRUCTION("C4E269DD8C2B80000000" , vaesenclast(xmm1, xmm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C4E269DD8C2B80000000" , vaesenclast(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C4E26DDDCB" , vaesenclast(ymm1, ymm2, ymm3));
+ TEST_INSTRUCTION("C4E26DDD8C2B80000000" , vaesenclast(ymm1, ymm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C4E26DDD8C2B80000000" , vaesenclast(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F26D48DDCB" , vaesenclast(zmm1, zmm2, zmm3));
+ TEST_INSTRUCTION("62F26D48DD4C2B02" , vaesenclast(zmm1, zmm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F26D48DD4C2B02" , vaesenclast(zmm1, zmm2, zmmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C4E279DBCA" , vaesimc(xmm1, xmm2));
+ TEST_INSTRUCTION("C4E279DB8C1A80000000" , vaesimc(xmm1, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("C4E279DB8C1A80000000" , vaesimc(xmm1, xmmword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("C4E379DFCA01" , vaeskeygenassist(xmm1, xmm2, 1));
+ TEST_INSTRUCTION("C4E379DF8C1A8000000001" , vaeskeygenassist(xmm1, ptr(rdx, rbx, 0, 128), 1));
+ TEST_INSTRUCTION("C4E379DF8C1A8000000001" , vaeskeygenassist(xmm1, xmmword_ptr(rdx, rbx, 0, 128), 1));
+ TEST_INSTRUCTION("62F36D0803CB01" , valignd(xmm1, xmm2, xmm3, 1));
+ TEST_INSTRUCTION("62F36D08034C2B0801" , valignd(xmm1, xmm2, ptr(rbx, rbp, 0, 128), 1));
+ TEST_INSTRUCTION("62F36D08034C2B0801" , valignd(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128), 1));
+ TEST_INSTRUCTION("62F36D2803CB01" , valignd(ymm1, ymm2, ymm3, 1));
+ TEST_INSTRUCTION("62F36D28034C2B0401" , valignd(ymm1, ymm2, ptr(rbx, rbp, 0, 128), 1));
+ TEST_INSTRUCTION("62F36D28034C2B0401" , valignd(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128), 1));
+ TEST_INSTRUCTION("62F36D4803CB01" , valignd(zmm1, zmm2, zmm3, 1));
+ TEST_INSTRUCTION("62F36D48034C2B0201" , valignd(zmm1, zmm2, ptr(rbx, rbp, 0, 128), 1));
+ TEST_INSTRUCTION("62F36D48034C2B0201" , valignd(zmm1, zmm2, zmmword_ptr(rbx, rbp, 0, 128), 1));
+ TEST_INSTRUCTION("62F3ED0803CB01" , valignq(xmm1, xmm2, xmm3, 1));
+ TEST_INSTRUCTION("62F3ED08034C2B0801" , valignq(xmm1, xmm2, ptr(rbx, rbp, 0, 128), 1));
+ TEST_INSTRUCTION("62F3ED08034C2B0801" , valignq(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128), 1));
+ TEST_INSTRUCTION("62F3ED2803CB01" , valignq(ymm1, ymm2, ymm3, 1));
+ TEST_INSTRUCTION("62F3ED28034C2B0401" , valignq(ymm1, ymm2, ptr(rbx, rbp, 0, 128), 1));
+ TEST_INSTRUCTION("62F3ED28034C2B0401" , valignq(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128), 1));
+ TEST_INSTRUCTION("62F3ED4803CB01" , valignq(zmm1, zmm2, zmm3, 1));
+ TEST_INSTRUCTION("62F3ED48034C2B0201" , valignq(zmm1, zmm2, ptr(rbx, rbp, 0, 128), 1));
+ TEST_INSTRUCTION("62F3ED48034C2B0201" , valignq(zmm1, zmm2, zmmword_ptr(rbx, rbp, 0, 128), 1));
+ TEST_INSTRUCTION("C5E955CB" , vandnpd(xmm1, xmm2, xmm3));
+ TEST_INSTRUCTION("C5E9558C2B80000000" , vandnpd(xmm1, xmm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C5E9558C2B80000000" , vandnpd(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C5ED55CB" , vandnpd(ymm1, ymm2, ymm3));
+ TEST_INSTRUCTION("C5ED558C2B80000000" , vandnpd(ymm1, ymm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C5ED558C2B80000000" , vandnpd(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F1ED4855CB" , vandnpd(zmm1, zmm2, zmm3));
+ TEST_INSTRUCTION("62F1ED48554C2B02" , vandnpd(zmm1, zmm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F1ED48554C2B02" , vandnpd(zmm1, zmm2, zmmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C5E855CB" , vandnps(xmm1, xmm2, xmm3));
+ TEST_INSTRUCTION("C5E8558C2B80000000" , vandnps(xmm1, xmm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C5E8558C2B80000000" , vandnps(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C5EC55CB" , vandnps(ymm1, ymm2, ymm3));
+ TEST_INSTRUCTION("C5EC558C2B80000000" , vandnps(ymm1, ymm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C5EC558C2B80000000" , vandnps(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F16C4855CB" , vandnps(zmm1, zmm2, zmm3));
+ TEST_INSTRUCTION("62F16C48554C2B02" , vandnps(zmm1, zmm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F16C48554C2B02" , vandnps(zmm1, zmm2, zmmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C5E954CB" , vandpd(xmm1, xmm2, xmm3));
+ TEST_INSTRUCTION("C5E9548C2B80000000" , vandpd(xmm1, xmm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C5E9548C2B80000000" , vandpd(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C5ED54CB" , vandpd(ymm1, ymm2, ymm3));
+ TEST_INSTRUCTION("C5ED548C2B80000000" , vandpd(ymm1, ymm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C5ED548C2B80000000" , vandpd(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F1ED4854CB" , vandpd(zmm1, zmm2, zmm3));
+ TEST_INSTRUCTION("62F1ED48544C2B02" , vandpd(zmm1, zmm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F1ED48544C2B02" , vandpd(zmm1, zmm2, zmmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C5E854CB" , vandps(xmm1, xmm2, xmm3));
+ TEST_INSTRUCTION("C5E8548C2B80000000" , vandps(xmm1, xmm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C5E8548C2B80000000" , vandps(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C5EC54CB" , vandps(ymm1, ymm2, ymm3));
+ TEST_INSTRUCTION("C5EC548C2B80000000" , vandps(ymm1, ymm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C5EC548C2B80000000" , vandps(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F16C4854CB" , vandps(zmm1, zmm2, zmm3));
+ TEST_INSTRUCTION("62F16C48544C2B02" , vandps(zmm1, zmm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F16C48544C2B02" , vandps(zmm1, zmm2, zmmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F2ED0865CB" , vblendmpd(xmm1, xmm2, xmm3));
+ TEST_INSTRUCTION("62F2ED08654C2B08" , vblendmpd(xmm1, xmm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F2ED08654C2B08" , vblendmpd(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F2ED2865CB" , vblendmpd(ymm1, ymm2, ymm3));
+ TEST_INSTRUCTION("62F2ED28654C2B04" , vblendmpd(ymm1, ymm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F2ED28654C2B04" , vblendmpd(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F2ED4865CB" , vblendmpd(zmm1, zmm2, zmm3));
+ TEST_INSTRUCTION("62F2ED48654C2B02" , vblendmpd(zmm1, zmm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F2ED48654C2B02" , vblendmpd(zmm1, zmm2, zmmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F26D0865CB" , vblendmps(xmm1, xmm2, xmm3));
+ TEST_INSTRUCTION("62F26D08654C2B08" , vblendmps(xmm1, xmm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F26D08654C2B08" , vblendmps(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F26D2865CB" , vblendmps(ymm1, ymm2, ymm3));
+ TEST_INSTRUCTION("62F26D28654C2B04" , vblendmps(ymm1, ymm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F26D28654C2B04" , vblendmps(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F26D4865CB" , vblendmps(zmm1, zmm2, zmm3));
+ TEST_INSTRUCTION("62F26D48654C2B02" , vblendmps(zmm1, zmm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F26D48654C2B02" , vblendmps(zmm1, zmm2, zmmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C4E3690DCB01" , vblendpd(xmm1, xmm2, xmm3, 1));
+ TEST_INSTRUCTION("C4E3690D8C2B8000000001" , vblendpd(xmm1, xmm2, ptr(rbx, rbp, 0, 128), 1));
+ TEST_INSTRUCTION("C4E3690D8C2B8000000001" , vblendpd(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128), 1));
+ TEST_INSTRUCTION("C4E36D0DCB01" , vblendpd(ymm1, ymm2, ymm3, 1));
+ TEST_INSTRUCTION("C4E36D0D8C2B8000000001" , vblendpd(ymm1, ymm2, ptr(rbx, rbp, 0, 128), 1));
+ TEST_INSTRUCTION("C4E36D0D8C2B8000000001" , vblendpd(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128), 1));
+ TEST_INSTRUCTION("C4E3690CCB01" , vblendps(xmm1, xmm2, xmm3, 1));
+ TEST_INSTRUCTION("C4E3690C8C2B8000000001" , vblendps(xmm1, xmm2, ptr(rbx, rbp, 0, 128), 1));
+ TEST_INSTRUCTION("C4E3690C8C2B8000000001" , vblendps(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128), 1));
+ TEST_INSTRUCTION("C4E36D0CCB01" , vblendps(ymm1, ymm2, ymm3, 1));
+ TEST_INSTRUCTION("C4E36D0C8C2B8000000001" , vblendps(ymm1, ymm2, ptr(rbx, rbp, 0, 128), 1));
+ TEST_INSTRUCTION("C4E36D0C8C2B8000000001" , vblendps(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128), 1));
+ TEST_INSTRUCTION("C4E3694BCB40" , vblendvpd(xmm1, xmm2, xmm3, xmm4));
+ TEST_INSTRUCTION("C4E3694B8C2B8000000060" , vblendvpd(xmm1, xmm2, ptr(rbx, rbp, 0, 128), xmm6));
+ TEST_INSTRUCTION("C4E3694B8C2B8000000060" , vblendvpd(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128), xmm6));
+ TEST_INSTRUCTION("C4E36D4BCB40" , vblendvpd(ymm1, ymm2, ymm3, ymm4));
+ TEST_INSTRUCTION("C4E36D4B8C2B8000000060" , vblendvpd(ymm1, ymm2, ptr(rbx, rbp, 0, 128), ymm6));
+ TEST_INSTRUCTION("C4E36D4B8C2B8000000060" , vblendvpd(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128), ymm6));
+ TEST_INSTRUCTION("C4E3694ACB40" , vblendvps(xmm1, xmm2, xmm3, xmm4));
+ TEST_INSTRUCTION("C4E3694A8C2B8000000060" , vblendvps(xmm1, xmm2, ptr(rbx, rbp, 0, 128), xmm6));
+ TEST_INSTRUCTION("C4E3694A8C2B8000000060" , vblendvps(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128), xmm6));
+ TEST_INSTRUCTION("C4E36D4ACB40" , vblendvps(ymm1, ymm2, ymm3, ymm4));
+ TEST_INSTRUCTION("C4E36D4A8C2B8000000060" , vblendvps(ymm1, ymm2, ptr(rbx, rbp, 0, 128), ymm6));
+ TEST_INSTRUCTION("C4E36D4A8C2B8000000060" , vblendvps(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128), ymm6));
+ TEST_INSTRUCTION("C4E27D1A8C1A80000000" , vbroadcastf128(ymm1, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("C4E27D1A8C1A80000000" , vbroadcastf128(ymm1, xmmword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("62F27D2819CA" , vbroadcastf32x2(ymm1, xmm2));
+ TEST_INSTRUCTION("62F27D28194C1A10" , vbroadcastf32x2(ymm1, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("62F27D28194C1A10" , vbroadcastf32x2(ymm1, qword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("62F27D4819CA" , vbroadcastf32x2(zmm1, xmm2));
+ TEST_INSTRUCTION("62F27D48194C1A10" , vbroadcastf32x2(zmm1, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("62F27D48194C1A10" , vbroadcastf32x2(zmm1, qword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("62F27D281A4C1A08" , vbroadcastf32x4(ymm1, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("62F27D281A4C1A08" , vbroadcastf32x4(ymm1, xmmword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("62F27D481A4C1A08" , vbroadcastf32x4(zmm1, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("62F27D481A4C1A08" , vbroadcastf32x4(zmm1, xmmword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("62F27D481B4C1A04" , vbroadcastf32x8(zmm1, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("62F27D481B4C1A04" , vbroadcastf32x8(zmm1, ymmword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("62F2FD281A4C1A08" , vbroadcastf64x2(ymm1, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("62F2FD281A4C1A08" , vbroadcastf64x2(ymm1, xmmword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("62F2FD481A4C1A08" , vbroadcastf64x2(zmm1, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("62F2FD481A4C1A08" , vbroadcastf64x2(zmm1, xmmword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("62F2FD481B4C1A04" , vbroadcastf64x4(zmm1, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("62F2FD481B4C1A04" , vbroadcastf64x4(zmm1, ymmword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("C4E27D5A8C1A80000000" , vbroadcasti128(ymm1, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("C4E27D5A8C1A80000000" , vbroadcasti128(ymm1, xmmword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("62F27D0859CA" , vbroadcasti32x2(xmm1, xmm2));
+ TEST_INSTRUCTION("62F27D08594C1A10" , vbroadcasti32x2(xmm1, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("62F27D08594C1A10" , vbroadcasti32x2(xmm1, qword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("62F27D2859CA" , vbroadcasti32x2(ymm1, xmm2));
+ TEST_INSTRUCTION("62F27D28594C1A10" , vbroadcasti32x2(ymm1, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("62F27D28594C1A10" , vbroadcasti32x2(ymm1, qword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("62F27D4859CA" , vbroadcasti32x2(zmm1, xmm2));
+ TEST_INSTRUCTION("62F27D48594C1A10" , vbroadcasti32x2(zmm1, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("62F27D48594C1A10" , vbroadcasti32x2(zmm1, qword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("62F27D285A4C1A08" , vbroadcasti32x4(ymm1, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("62F27D285A4C1A08" , vbroadcasti32x4(ymm1, xmmword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("62F27D485A4C1A08" , vbroadcasti32x4(zmm1, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("62F27D485A4C1A08" , vbroadcasti32x4(zmm1, xmmword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("62F27D485B4C1A04" , vbroadcasti32x8(zmm1, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("62F27D485B4C1A04" , vbroadcasti32x8(zmm1, ymmword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("62F2FD285A4C1A08" , vbroadcasti64x2(ymm1, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("62F2FD285A4C1A08" , vbroadcasti64x2(ymm1, xmmword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("62F2FD485A4C1A08" , vbroadcasti64x2(zmm1, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("62F2FD485A4C1A08" , vbroadcasti64x2(zmm1, xmmword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("62F2FD485B4C1A04" , vbroadcasti64x4(zmm1, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("62F2FD485B4C1A04" , vbroadcasti64x4(zmm1, ymmword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("C4E27D19CA" , vbroadcastsd(ymm1, xmm2));
+ TEST_INSTRUCTION("C4E27D198C1A80000000" , vbroadcastsd(ymm1, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("C4E27D198C1A80000000" , vbroadcastsd(ymm1, qword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("62F2FD4819CA" , vbroadcastsd(zmm1, xmm2));
+ TEST_INSTRUCTION("62F2FD48194C1A10" , vbroadcastsd(zmm1, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("62F2FD48194C1A10" , vbroadcastsd(zmm1, qword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("C4E27918CA" , vbroadcastss(xmm1, xmm2));
+ TEST_INSTRUCTION("C4E279188C1A80000000" , vbroadcastss(xmm1, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("C4E279188C1A80000000" , vbroadcastss(xmm1, dword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("C4E27D18CA" , vbroadcastss(ymm1, xmm2));
+ TEST_INSTRUCTION("C4E27D188C1A80000000" , vbroadcastss(ymm1, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("C4E27D188C1A80000000" , vbroadcastss(ymm1, dword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("62F27D4818CA" , vbroadcastss(zmm1, xmm2));
+ TEST_INSTRUCTION("62F27D48184C1A20" , vbroadcastss(zmm1, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("62F27D48184C1A20" , vbroadcastss(zmm1, dword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("C5E9C2CB01" , vcmppd(xmm1, xmm2, xmm3, 1));
+ TEST_INSTRUCTION("C5E9C28C2B8000000001" , vcmppd(xmm1, xmm2, ptr(rbx, rbp, 0, 128), 1));
+ TEST_INSTRUCTION("C5E9C28C2B8000000001" , vcmppd(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128), 1));
+ TEST_INSTRUCTION("62F1ED08C2CB01" , vcmppd(k1, xmm2, xmm3, 1));
+ TEST_INSTRUCTION("62F1ED08C24C2B0801" , vcmppd(k1, xmm2, ptr(rbx, rbp, 0, 128), 1));
+ TEST_INSTRUCTION("62F1ED08C24C2B0801" , vcmppd(k1, xmm2, xmmword_ptr(rbx, rbp, 0, 128), 1));
+ TEST_INSTRUCTION("C5EDC2CB01" , vcmppd(ymm1, ymm2, ymm3, 1));
+ TEST_INSTRUCTION("C5EDC28C2B8000000001" , vcmppd(ymm1, ymm2, ptr(rbx, rbp, 0, 128), 1));
+ TEST_INSTRUCTION("C5EDC28C2B8000000001" , vcmppd(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128), 1));
+ TEST_INSTRUCTION("62F1ED28C2CB01" , vcmppd(k1, ymm2, ymm3, 1));
+ TEST_INSTRUCTION("62F1ED28C24C2B0401" , vcmppd(k1, ymm2, ptr(rbx, rbp, 0, 128), 1));
+ TEST_INSTRUCTION("62F1ED28C24C2B0401" , vcmppd(k1, ymm2, ymmword_ptr(rbx, rbp, 0, 128), 1));
+ TEST_INSTRUCTION("62F1ED48C2CB01" , vcmppd(k1, zmm2, zmm3, 1));
+ TEST_INSTRUCTION("62F1ED48C24C2B0201" , vcmppd(k1, zmm2, ptr(rbx, rbp, 0, 128), 1));
+ TEST_INSTRUCTION("62F1ED48C24C2B0201" , vcmppd(k1, zmm2, zmmword_ptr(rbx, rbp, 0, 128), 1));
+ TEST_INSTRUCTION("C5E8C2CB01" , vcmpps(xmm1, xmm2, xmm3, 1));
+ TEST_INSTRUCTION("C5E8C28C2B8000000001" , vcmpps(xmm1, xmm2, ptr(rbx, rbp, 0, 128), 1));
+ TEST_INSTRUCTION("C5E8C28C2B8000000001" , vcmpps(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128), 1));
+ TEST_INSTRUCTION("62F16C08C2CB01" , vcmpps(k1, xmm2, xmm3, 1));
+ TEST_INSTRUCTION("62F16C08C24C2B0801" , vcmpps(k1, xmm2, ptr(rbx, rbp, 0, 128), 1));
+ TEST_INSTRUCTION("62F16C08C24C2B0801" , vcmpps(k1, xmm2, xmmword_ptr(rbx, rbp, 0, 128), 1));
+ TEST_INSTRUCTION("C5ECC2CB01" , vcmpps(ymm1, ymm2, ymm3, 1));
+ TEST_INSTRUCTION("C5ECC28C2B8000000001" , vcmpps(ymm1, ymm2, ptr(rbx, rbp, 0, 128), 1));
+ TEST_INSTRUCTION("C5ECC28C2B8000000001" , vcmpps(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128), 1));
+ TEST_INSTRUCTION("62F16C28C2CB01" , vcmpps(k1, ymm2, ymm3, 1));
+ TEST_INSTRUCTION("62F16C28C24C2B0401" , vcmpps(k1, ymm2, ptr(rbx, rbp, 0, 128), 1));
+ TEST_INSTRUCTION("62F16C28C24C2B0401" , vcmpps(k1, ymm2, ymmword_ptr(rbx, rbp, 0, 128), 1));
+ TEST_INSTRUCTION("62F16C48C2CB01" , vcmpps(k1, zmm2, zmm3, 1));
+ TEST_INSTRUCTION("62F16C48C24C2B0201" , vcmpps(k1, zmm2, ptr(rbx, rbp, 0, 128), 1));
+ TEST_INSTRUCTION("62F16C48C24C2B0201" , vcmpps(k1, zmm2, zmmword_ptr(rbx, rbp, 0, 128), 1));
+ TEST_INSTRUCTION("C5EBC2CB01" , vcmpsd(xmm1, xmm2, xmm3, 1));
+ TEST_INSTRUCTION("C5EBC28C2B8000000001" , vcmpsd(xmm1, xmm2, ptr(rbx, rbp, 0, 128), 1));
+ TEST_INSTRUCTION("C5EBC28C2B8000000001" , vcmpsd(xmm1, xmm2, qword_ptr(rbx, rbp, 0, 128), 1));
+ TEST_INSTRUCTION("62F1EF08C2CB01" , vcmpsd(k1, xmm2, xmm3, 1));
+ TEST_INSTRUCTION("62F1EF08C24C2B1001" , vcmpsd(k1, xmm2, ptr(rbx, rbp, 0, 128), 1));
+ TEST_INSTRUCTION("62F1EF08C24C2B1001" , vcmpsd(k1, xmm2, qword_ptr(rbx, rbp, 0, 128), 1));
+ TEST_INSTRUCTION("C5EAC2CB01" , vcmpss(xmm1, xmm2, xmm3, 1));
+ TEST_INSTRUCTION("C5EAC28C2B8000000001" , vcmpss(xmm1, xmm2, ptr(rbx, rbp, 0, 128), 1));
+ TEST_INSTRUCTION("C5EAC28C2B8000000001" , vcmpss(xmm1, xmm2, dword_ptr(rbx, rbp, 0, 128), 1));
+ TEST_INSTRUCTION("62F16E08C2CB01" , vcmpss(k1, xmm2, xmm3, 1));
+ TEST_INSTRUCTION("62F16E08C24C2B2001" , vcmpss(k1, xmm2, ptr(rbx, rbp, 0, 128), 1));
+ TEST_INSTRUCTION("62F16E08C24C2B2001" , vcmpss(k1, xmm2, dword_ptr(rbx, rbp, 0, 128), 1));
+ TEST_INSTRUCTION("C5F92FCA" , vcomisd(xmm1, xmm2));
+ TEST_INSTRUCTION("C5F92F8C1A80000000" , vcomisd(xmm1, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("C5F92F8C1A80000000" , vcomisd(xmm1, qword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("C5F82FCA" , vcomiss(xmm1, xmm2));
+ TEST_INSTRUCTION("C5F82F8C1A80000000" , vcomiss(xmm1, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("C5F82F8C1A80000000" , vcomiss(xmm1, dword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("62F2FD088AD1" , vcompresspd(xmm1, xmm2));
+ TEST_INSTRUCTION("62F2FD088A5C1110" , vcompresspd(ptr(rcx, rdx, 0, 128), xmm3));
+ TEST_INSTRUCTION("62F2FD088A5C1110" , vcompresspd(xmmword_ptr(rcx, rdx, 0, 128), xmm3));
+ TEST_INSTRUCTION("62F2FD288AD1" , vcompresspd(ymm1, ymm2));
+ TEST_INSTRUCTION("62F2FD288A5C1110" , vcompresspd(ptr(rcx, rdx, 0, 128), ymm3));
+ TEST_INSTRUCTION("62F2FD288A5C1110" , vcompresspd(ymmword_ptr(rcx, rdx, 0, 128), ymm3));
+ TEST_INSTRUCTION("62F2FD488AD1" , vcompresspd(zmm1, zmm2));
+ TEST_INSTRUCTION("62F2FD488A5C1110" , vcompresspd(ptr(rcx, rdx, 0, 128), zmm3));
+ TEST_INSTRUCTION("62F2FD488A5C1110" , vcompresspd(zmmword_ptr(rcx, rdx, 0, 128), zmm3));
+ TEST_INSTRUCTION("62F27D088AD1" , vcompressps(xmm1, xmm2));
+ TEST_INSTRUCTION("62F27D088A5C1120" , vcompressps(ptr(rcx, rdx, 0, 128), xmm3));
+ TEST_INSTRUCTION("62F27D088A5C1120" , vcompressps(xmmword_ptr(rcx, rdx, 0, 128), xmm3));
+ TEST_INSTRUCTION("62F27D288AD1" , vcompressps(ymm1, ymm2));
+ TEST_INSTRUCTION("62F27D288A5C1120" , vcompressps(ptr(rcx, rdx, 0, 128), ymm3));
+ TEST_INSTRUCTION("62F27D288A5C1120" , vcompressps(ymmword_ptr(rcx, rdx, 0, 128), ymm3));
+ TEST_INSTRUCTION("62F27D488AD1" , vcompressps(zmm1, zmm2));
+ TEST_INSTRUCTION("62F27D488A5C1120" , vcompressps(ptr(rcx, rdx, 0, 128), zmm3));
+ TEST_INSTRUCTION("62F27D488A5C1120" , vcompressps(zmmword_ptr(rcx, rdx, 0, 128), zmm3));
+ TEST_INSTRUCTION("C5FAE6CA" , vcvtdq2pd(xmm1, xmm2));
+ TEST_INSTRUCTION("C5FAE68C1A80000000" , vcvtdq2pd(xmm1, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("C5FAE68C1A80000000" , vcvtdq2pd(xmm1, qword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("C5FEE6CA" , vcvtdq2pd(ymm1, xmm2));
+ TEST_INSTRUCTION("C5FEE68C1A80000000" , vcvtdq2pd(ymm1, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("C5FEE68C1A80000000" , vcvtdq2pd(ymm1, xmmword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("62F17E48E6CA" , vcvtdq2pd(zmm1, ymm2));
+ TEST_INSTRUCTION("62F17E48E64C1A04" , vcvtdq2pd(zmm1, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("62F17E48E64C1A04" , vcvtdq2pd(zmm1, ymmword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("C5F85BCA" , vcvtdq2ps(xmm1, xmm2));
+ TEST_INSTRUCTION("C5F85B8C1A80000000" , vcvtdq2ps(xmm1, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("C5F85B8C1A80000000" , vcvtdq2ps(xmm1, xmmword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("C5FC5BCA" , vcvtdq2ps(ymm1, ymm2));
+ TEST_INSTRUCTION("C5FC5B8C1A80000000" , vcvtdq2ps(ymm1, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("C5FC5B8C1A80000000" , vcvtdq2ps(ymm1, ymmword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("62F17C485BCA" , vcvtdq2ps(zmm1, zmm2));
+ TEST_INSTRUCTION("62F17C485B4C1A02" , vcvtdq2ps(zmm1, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("62F17C485B4C1A02" , vcvtdq2ps(zmm1, zmmword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("62F26F0872CB" , vcvtne2ps2bf16(xmm1, xmm2, xmm3));
+ TEST_INSTRUCTION("62F26F08724C2B08" , vcvtne2ps2bf16(xmm1, xmm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F26F08724C2B08" , vcvtne2ps2bf16(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F26F2872CB" , vcvtne2ps2bf16(ymm1, ymm2, ymm3));
+ TEST_INSTRUCTION("62F26F28724C2B04" , vcvtne2ps2bf16(ymm1, ymm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F26F28724C2B04" , vcvtne2ps2bf16(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F26F4872CB" , vcvtne2ps2bf16(zmm1, zmm2, zmm3));
+ TEST_INSTRUCTION("62F26F48724C2B02" , vcvtne2ps2bf16(zmm1, zmm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F26F48724C2B02" , vcvtne2ps2bf16(zmm1, zmm2, zmmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F27E0872CA" , vcvtneps2bf16(xmm1, xmm2));
+ TEST_INSTRUCTION("62F27E2872CA" , vcvtneps2bf16(xmm1, ymm2));
+ TEST_INSTRUCTION("62F27E08724C1A08" , vcvtneps2bf16(xmm1, xmmword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("62F27E28724C1A04" , vcvtneps2bf16(xmm1, ymmword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("62F27E4872CA" , vcvtneps2bf16(ymm1, zmm2));
+ TEST_INSTRUCTION("62F27E48724C1A02" , vcvtneps2bf16(ymm1, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("62F27E48724C1A02" , vcvtneps2bf16(ymm1, zmmword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("C5FBE6CA" , vcvtpd2dq(xmm1, xmm2));
+ TEST_INSTRUCTION("C5FFE6CA" , vcvtpd2dq(xmm1, ymm2));
+ TEST_INSTRUCTION("C5FBE68C1A80000000" , vcvtpd2dq(xmm1, xmmword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("C5FFE68C1A80000000" , vcvtpd2dq(xmm1, ymmword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("62F1FF48E6CA" , vcvtpd2dq(ymm1, zmm2));
+ TEST_INSTRUCTION("62F1FF48E64C1A02" , vcvtpd2dq(ymm1, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("62F1FF48E64C1A02" , vcvtpd2dq(ymm1, zmmword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("C5F95ACA" , vcvtpd2ps(xmm1, xmm2));
+ TEST_INSTRUCTION("C5FD5ACA" , vcvtpd2ps(xmm1, ymm2));
+ TEST_INSTRUCTION("C5F95A8C1A80000000" , vcvtpd2ps(xmm1, xmmword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("C5FD5A8C1A80000000" , vcvtpd2ps(xmm1, ymmword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("62F1FD485ACA" , vcvtpd2ps(ymm1, zmm2));
+ TEST_INSTRUCTION("62F1FD485A4C1A02" , vcvtpd2ps(ymm1, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("62F1FD485A4C1A02" , vcvtpd2ps(ymm1, zmmword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("62F1FD087BCA" , vcvtpd2qq(xmm1, xmm2));
+ TEST_INSTRUCTION("62F1FD087B4C1A08" , vcvtpd2qq(xmm1, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("62F1FD087B4C1A08" , vcvtpd2qq(xmm1, xmmword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("62F1FD287BCA" , vcvtpd2qq(ymm1, ymm2));
+ TEST_INSTRUCTION("62F1FD287B4C1A04" , vcvtpd2qq(ymm1, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("62F1FD287B4C1A04" , vcvtpd2qq(ymm1, ymmword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("62F1FD487BCA" , vcvtpd2qq(zmm1, zmm2));
+ TEST_INSTRUCTION("62F1FD487B4C1A02" , vcvtpd2qq(zmm1, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("62F1FD487B4C1A02" , vcvtpd2qq(zmm1, zmmword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("62F1FC0879CA" , vcvtpd2udq(xmm1, xmm2));
+ TEST_INSTRUCTION("62F1FC2879CA" , vcvtpd2udq(xmm1, ymm2));
+ TEST_INSTRUCTION("62F1FC08794C1A08" , vcvtpd2udq(xmm1, xmmword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("62F1FC28794C1A04" , vcvtpd2udq(xmm1, ymmword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("62F1FC4879CA" , vcvtpd2udq(ymm1, zmm2));
+ TEST_INSTRUCTION("62F1FC48794C1A02" , vcvtpd2udq(ymm1, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("62F1FC48794C1A02" , vcvtpd2udq(ymm1, zmmword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("62F1FD0879CA" , vcvtpd2uqq(xmm1, xmm2));
+ TEST_INSTRUCTION("62F1FD08794C1A08" , vcvtpd2uqq(xmm1, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("62F1FD08794C1A08" , vcvtpd2uqq(xmm1, xmmword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("62F1FD2879CA" , vcvtpd2uqq(ymm1, ymm2));
+ TEST_INSTRUCTION("62F1FD28794C1A04" , vcvtpd2uqq(ymm1, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("62F1FD28794C1A04" , vcvtpd2uqq(ymm1, ymmword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("62F1FD4879CA" , vcvtpd2uqq(zmm1, zmm2));
+ TEST_INSTRUCTION("62F1FD48794C1A02" , vcvtpd2uqq(zmm1, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("62F1FD48794C1A02" , vcvtpd2uqq(zmm1, zmmword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("C4E27913CA" , vcvtph2ps(xmm1, xmm2));
+ TEST_INSTRUCTION("C4E279138C1A80000000" , vcvtph2ps(xmm1, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("C4E279138C1A80000000" , vcvtph2ps(xmm1, qword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("C4E27D13CA" , vcvtph2ps(ymm1, xmm2));
+ TEST_INSTRUCTION("C4E27D138C1A80000000" , vcvtph2ps(ymm1, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("C4E27D138C1A80000000" , vcvtph2ps(ymm1, xmmword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("62F27D4813CA" , vcvtph2ps(zmm1, ymm2));
+ TEST_INSTRUCTION("62F27D48134C1A04" , vcvtph2ps(zmm1, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("62F27D48134C1A04" , vcvtph2ps(zmm1, ymmword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("C5F95BCA" , vcvtps2dq(xmm1, xmm2));
+ TEST_INSTRUCTION("C5F95B8C1A80000000" , vcvtps2dq(xmm1, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("C5F95B8C1A80000000" , vcvtps2dq(xmm1, xmmword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("C5FD5BCA" , vcvtps2dq(ymm1, ymm2));
+ TEST_INSTRUCTION("C5FD5B8C1A80000000" , vcvtps2dq(ymm1, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("C5FD5B8C1A80000000" , vcvtps2dq(ymm1, ymmword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("62F17D485BCA" , vcvtps2dq(zmm1, zmm2));
+ TEST_INSTRUCTION("62F17D485B4C1A02" , vcvtps2dq(zmm1, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("62F17D485B4C1A02" , vcvtps2dq(zmm1, zmmword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("C5F85ACA" , vcvtps2pd(xmm1, xmm2));
+ TEST_INSTRUCTION("C5F85A8C1A80000000" , vcvtps2pd(xmm1, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("C5F85A8C1A80000000" , vcvtps2pd(xmm1, qword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("C5FC5ACA" , vcvtps2pd(ymm1, xmm2));
+ TEST_INSTRUCTION("C5FC5A8C1A80000000" , vcvtps2pd(ymm1, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("C5FC5A8C1A80000000" , vcvtps2pd(ymm1, xmmword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("62F17C485ACA" , vcvtps2pd(zmm1, ymm2));
+ TEST_INSTRUCTION("62F17C485A4C1A04" , vcvtps2pd(zmm1, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("62F17C485A4C1A04" , vcvtps2pd(zmm1, ymmword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("C4E3791DD101" , vcvtps2ph(xmm1, xmm2, 1));
+ TEST_INSTRUCTION("C4E3791D9C118000000001" , vcvtps2ph(ptr(rcx, rdx, 0, 128), xmm3, 1));
+ TEST_INSTRUCTION("C4E3791D9C118000000001" , vcvtps2ph(qword_ptr(rcx, rdx, 0, 128), xmm3, 1));
+ TEST_INSTRUCTION("C4E37D1DD101" , vcvtps2ph(xmm1, ymm2, 1));
+ TEST_INSTRUCTION("C4E37D1D9C118000000001" , vcvtps2ph(ptr(rcx, rdx, 0, 128), ymm3, 1));
+ TEST_INSTRUCTION("C4E37D1D9C118000000001" , vcvtps2ph(xmmword_ptr(rcx, rdx, 0, 128), ymm3, 1));
+ TEST_INSTRUCTION("62F37D481DD101" , vcvtps2ph(ymm1, zmm2, 1));
+ TEST_INSTRUCTION("62F37D481D5C110401" , vcvtps2ph(ptr(rcx, rdx, 0, 128), zmm3, 1));
+ TEST_INSTRUCTION("62F37D481D5C110401" , vcvtps2ph(ymmword_ptr(rcx, rdx, 0, 128), zmm3, 1));
+ TEST_INSTRUCTION("62F17D087BCA" , vcvtps2qq(xmm1, xmm2));
+ TEST_INSTRUCTION("62F17D087B4C1A10" , vcvtps2qq(xmm1, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("62F17D087B4C1A10" , vcvtps2qq(xmm1, qword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("62F17D287BCA" , vcvtps2qq(ymm1, xmm2));
+ TEST_INSTRUCTION("62F17D287B4C1A08" , vcvtps2qq(ymm1, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("62F17D287B4C1A08" , vcvtps2qq(ymm1, xmmword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("62F17D487BCA" , vcvtps2qq(zmm1, ymm2));
+ TEST_INSTRUCTION("62F17D487B4C1A04" , vcvtps2qq(zmm1, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("62F17D487B4C1A04" , vcvtps2qq(zmm1, ymmword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("62F17C0879CA" , vcvtps2udq(xmm1, xmm2));
+ TEST_INSTRUCTION("62F17C08794C1A08" , vcvtps2udq(xmm1, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("62F17C08794C1A08" , vcvtps2udq(xmm1, xmmword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("62F17C2879CA" , vcvtps2udq(ymm1, ymm2));
+ TEST_INSTRUCTION("62F17C28794C1A04" , vcvtps2udq(ymm1, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("62F17C28794C1A04" , vcvtps2udq(ymm1, ymmword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("62F17C4879CA" , vcvtps2udq(zmm1, zmm2));
+ TEST_INSTRUCTION("62F17C48794C1A02" , vcvtps2udq(zmm1, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("62F17C48794C1A02" , vcvtps2udq(zmm1, zmmword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("62F17D0879CA" , vcvtps2uqq(xmm1, xmm2));
+ TEST_INSTRUCTION("62F17D08794C1A10" , vcvtps2uqq(xmm1, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("62F17D08794C1A10" , vcvtps2uqq(xmm1, qword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("62F17D2879CA" , vcvtps2uqq(ymm1, xmm2));
+ TEST_INSTRUCTION("62F17D28794C1A08" , vcvtps2uqq(ymm1, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("62F17D28794C1A08" , vcvtps2uqq(ymm1, xmmword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("62F17D4879CA" , vcvtps2uqq(zmm1, ymm2));
+ TEST_INSTRUCTION("62F17D48794C1A04" , vcvtps2uqq(zmm1, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("62F17D48794C1A04" , vcvtps2uqq(zmm1, ymmword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("62F1FE08E6CA" , vcvtqq2pd(xmm1, xmm2));
+ TEST_INSTRUCTION("62F1FE08E64C1A08" , vcvtqq2pd(xmm1, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("62F1FE08E64C1A08" , vcvtqq2pd(xmm1, xmmword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("62F1FE28E6CA" , vcvtqq2pd(ymm1, ymm2));
+ TEST_INSTRUCTION("62F1FE28E64C1A04" , vcvtqq2pd(ymm1, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("62F1FE28E64C1A04" , vcvtqq2pd(ymm1, ymmword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("62F1FE48E6CA" , vcvtqq2pd(zmm1, zmm2));
+ TEST_INSTRUCTION("62F1FE48E64C1A02" , vcvtqq2pd(zmm1, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("62F1FE48E64C1A02" , vcvtqq2pd(zmm1, zmmword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("62F1FC085BCA" , vcvtqq2ps(xmm1, xmm2));
+ TEST_INSTRUCTION("62F1FC285BCA" , vcvtqq2ps(xmm1, ymm2));
+ TEST_INSTRUCTION("62F1FC085B4C1A08" , vcvtqq2ps(xmm1, xmmword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("62F1FC285B4C1A04" , vcvtqq2ps(xmm1, ymmword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("62F1FC485BCA" , vcvtqq2ps(ymm1, zmm2));
+ TEST_INSTRUCTION("62F1FC485B4C1A02" , vcvtqq2ps(ymm1, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("62F1FC485B4C1A02" , vcvtqq2ps(ymm1, zmmword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("C5FB2DCA" , vcvtsd2si(ecx, xmm2));
+ TEST_INSTRUCTION("C5FB2D8C1A80000000" , vcvtsd2si(ecx, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("C5FB2D8C1A80000000" , vcvtsd2si(ecx, qword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("C4E1FB2DCA" , vcvtsd2si(rcx, xmm2));
+ TEST_INSTRUCTION("C4E1FB2D8C1A80000000" , vcvtsd2si(rcx, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("C4E1FB2D8C1A80000000" , vcvtsd2si(rcx, qword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("C5EB5ACB" , vcvtsd2ss(xmm1, xmm2, xmm3));
+ TEST_INSTRUCTION("C5EB5A8C2B80000000" , vcvtsd2ss(xmm1, xmm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C5EB5A8C2B80000000" , vcvtsd2ss(xmm1, xmm2, qword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F17F0879CA" , vcvtsd2usi(ecx, xmm2));
+ TEST_INSTRUCTION("62F17F08794C1A10" , vcvtsd2usi(ecx, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("62F17F08794C1A10" , vcvtsd2usi(ecx, qword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("62F1FF0879CA" , vcvtsd2usi(rcx, xmm2));
+ TEST_INSTRUCTION("62F1FF08794C1A10" , vcvtsd2usi(rcx, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("62F1FF08794C1A10" , vcvtsd2usi(rcx, qword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("C5EB2ACB" , vcvtsi2sd(xmm1, xmm2, ebx));
+ TEST_INSTRUCTION("C4E1EB2ACB" , vcvtsi2sd(xmm1, xmm2, rbx));
+ TEST_INSTRUCTION("C5EB2A8C2B80000000" , vcvtsi2sd(xmm1, xmm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C5EB2A8C2B80000000" , vcvtsi2sd(xmm1, xmm2, dword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C4E1EB2A8C2B80000000" , vcvtsi2sd(xmm1, xmm2, qword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C5EA2ACB" , vcvtsi2ss(xmm1, xmm2, ebx));
+ TEST_INSTRUCTION("C4E1EA2ACB" , vcvtsi2ss(xmm1, xmm2, rbx));
+ TEST_INSTRUCTION("C5EA2A8C2B80000000" , vcvtsi2ss(xmm1, xmm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C5EA2A8C2B80000000" , vcvtsi2ss(xmm1, xmm2, dword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C4E1EA2A8C2B80000000" , vcvtsi2ss(xmm1, xmm2, qword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C5EA5ACB" , vcvtss2sd(xmm1, xmm2, xmm3));
+ TEST_INSTRUCTION("C5EA5A8C2B80000000" , vcvtss2sd(xmm1, xmm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C5EA5A8C2B80000000" , vcvtss2sd(xmm1, xmm2, dword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C5FA2DCA" , vcvtss2si(ecx, xmm2));
+ TEST_INSTRUCTION("C5FA2D8C1A80000000" , vcvtss2si(ecx, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("C5FA2D8C1A80000000" , vcvtss2si(ecx, dword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("C4E1FA2DCA" , vcvtss2si(rcx, xmm2));
+ TEST_INSTRUCTION("C4E1FA2D8C1A80000000" , vcvtss2si(rcx, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("C4E1FA2D8C1A80000000" , vcvtss2si(rcx, dword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("62F17E0879CA" , vcvtss2usi(ecx, xmm2));
+ TEST_INSTRUCTION("62F17E08794C1A20" , vcvtss2usi(ecx, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("62F17E08794C1A20" , vcvtss2usi(ecx, dword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("62F1FE0879CA" , vcvtss2usi(rcx, xmm2));
+ TEST_INSTRUCTION("62F1FE08794C1A20" , vcvtss2usi(rcx, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("62F1FE08794C1A20" , vcvtss2usi(rcx, dword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("C5F9E6CA" , vcvttpd2dq(xmm1, xmm2));
+ TEST_INSTRUCTION("C5FDE6CA" , vcvttpd2dq(xmm1, ymm2));
+ TEST_INSTRUCTION("C5F9E68C1A80000000" , vcvttpd2dq(xmm1, xmmword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("C5FDE68C1A80000000" , vcvttpd2dq(xmm1, ymmword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("62F1FD48E6CA" , vcvttpd2dq(ymm1, zmm2));
+ TEST_INSTRUCTION("62F1FD48E64C1A02" , vcvttpd2dq(ymm1, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("62F1FD48E64C1A02" , vcvttpd2dq(ymm1, zmmword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("62F1FD087ACA" , vcvttpd2qq(xmm1, xmm2));
+ TEST_INSTRUCTION("62F1FD087A4C1A08" , vcvttpd2qq(xmm1, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("62F1FD087A4C1A08" , vcvttpd2qq(xmm1, xmmword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("62F1FD287ACA" , vcvttpd2qq(ymm1, ymm2));
+ TEST_INSTRUCTION("62F1FD287A4C1A04" , vcvttpd2qq(ymm1, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("62F1FD287A4C1A04" , vcvttpd2qq(ymm1, ymmword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("62F1FD487ACA" , vcvttpd2qq(zmm1, zmm2));
+ TEST_INSTRUCTION("62F1FD487A4C1A02" , vcvttpd2qq(zmm1, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("62F1FD487A4C1A02" , vcvttpd2qq(zmm1, zmmword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("62F1FC0878CA" , vcvttpd2udq(xmm1, xmm2));
+ TEST_INSTRUCTION("62F1FC2878CA" , vcvttpd2udq(xmm1, ymm2));
+ TEST_INSTRUCTION("62F1FC08784C1A08" , vcvttpd2udq(xmm1, xmmword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("62F1FC28784C1A04" , vcvttpd2udq(xmm1, ymmword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("62F1FC4878CA" , vcvttpd2udq(ymm1, zmm2));
+ TEST_INSTRUCTION("62F1FC48784C1A02" , vcvttpd2udq(ymm1, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("62F1FC48784C1A02" , vcvttpd2udq(ymm1, zmmword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("62F1FD0878CA" , vcvttpd2uqq(xmm1, xmm2));
+ TEST_INSTRUCTION("62F1FD08784C1A08" , vcvttpd2uqq(xmm1, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("62F1FD08784C1A08" , vcvttpd2uqq(xmm1, xmmword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("62F1FD2878CA" , vcvttpd2uqq(ymm1, ymm2));
+ TEST_INSTRUCTION("62F1FD28784C1A04" , vcvttpd2uqq(ymm1, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("62F1FD28784C1A04" , vcvttpd2uqq(ymm1, ymmword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("62F1FD4878CA" , vcvttpd2uqq(zmm1, zmm2));
+ TEST_INSTRUCTION("62F1FD48784C1A02" , vcvttpd2uqq(zmm1, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("62F1FD48784C1A02" , vcvttpd2uqq(zmm1, zmmword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("C5FA5BCA" , vcvttps2dq(xmm1, xmm2));
+ TEST_INSTRUCTION("C5FA5B8C1A80000000" , vcvttps2dq(xmm1, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("C5FA5B8C1A80000000" , vcvttps2dq(xmm1, xmmword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("C5FE5BCA" , vcvttps2dq(ymm1, ymm2));
+ TEST_INSTRUCTION("C5FE5B8C1A80000000" , vcvttps2dq(ymm1, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("C5FE5B8C1A80000000" , vcvttps2dq(ymm1, ymmword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("62F17E485BCA" , vcvttps2dq(zmm1, zmm2));
+ TEST_INSTRUCTION("62F17E485B4C1A02" , vcvttps2dq(zmm1, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("62F17E485B4C1A02" , vcvttps2dq(zmm1, zmmword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("62F17D087ACA" , vcvttps2qq(xmm1, xmm2));
+ TEST_INSTRUCTION("62F17D087A4C1A10" , vcvttps2qq(xmm1, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("62F17D087A4C1A10" , vcvttps2qq(xmm1, qword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("62F17D287ACA" , vcvttps2qq(ymm1, xmm2));
+ TEST_INSTRUCTION("62F17D287A4C1A08" , vcvttps2qq(ymm1, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("62F17D287A4C1A08" , vcvttps2qq(ymm1, xmmword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("62F17D487ACA" , vcvttps2qq(zmm1, ymm2));
+ TEST_INSTRUCTION("62F17D487A4C1A04" , vcvttps2qq(zmm1, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("62F17D487A4C1A04" , vcvttps2qq(zmm1, ymmword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("62F17C0878CA" , vcvttps2udq(xmm1, xmm2));
+ TEST_INSTRUCTION("62F17C08784C1A08" , vcvttps2udq(xmm1, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("62F17C08784C1A08" , vcvttps2udq(xmm1, xmmword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("62F17C2878CA" , vcvttps2udq(ymm1, ymm2));
+ TEST_INSTRUCTION("62F17C28784C1A04" , vcvttps2udq(ymm1, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("62F17C28784C1A04" , vcvttps2udq(ymm1, ymmword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("62F17C4878CA" , vcvttps2udq(zmm1, zmm2));
+ TEST_INSTRUCTION("62F17C48784C1A02" , vcvttps2udq(zmm1, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("62F17C48784C1A02" , vcvttps2udq(zmm1, zmmword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("62F17D0878CA" , vcvttps2uqq(xmm1, xmm2));
+ TEST_INSTRUCTION("62F17D08784C1A10" , vcvttps2uqq(xmm1, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("62F17D08784C1A10" , vcvttps2uqq(xmm1, qword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("62F17D2878CA" , vcvttps2uqq(ymm1, xmm2));
+ TEST_INSTRUCTION("62F17D28784C1A08" , vcvttps2uqq(ymm1, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("62F17D28784C1A08" , vcvttps2uqq(ymm1, xmmword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("62F17D4878CA" , vcvttps2uqq(zmm1, ymm2));
+ TEST_INSTRUCTION("62F17D48784C1A04" , vcvttps2uqq(zmm1, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("62F17D48784C1A04" , vcvttps2uqq(zmm1, ymmword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("C5FB2CCA" , vcvttsd2si(ecx, xmm2));
+ TEST_INSTRUCTION("C5FB2C8C1A80000000" , vcvttsd2si(ecx, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("C5FB2C8C1A80000000" , vcvttsd2si(ecx, qword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("C4E1FB2CCA" , vcvttsd2si(rcx, xmm2));
+ TEST_INSTRUCTION("C4E1FB2C8C1A80000000" , vcvttsd2si(rcx, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("C4E1FB2C8C1A80000000" , vcvttsd2si(rcx, qword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("62F17F0878CA" , vcvttsd2usi(ecx, xmm2));
+ TEST_INSTRUCTION("62F17F08784C1A10" , vcvttsd2usi(ecx, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("62F17F08784C1A10" , vcvttsd2usi(ecx, qword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("62F1FF0878CA" , vcvttsd2usi(rcx, xmm2));
+ TEST_INSTRUCTION("62F1FF08784C1A10" , vcvttsd2usi(rcx, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("62F1FF08784C1A10" , vcvttsd2usi(rcx, qword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("C5FA2CCA" , vcvttss2si(ecx, xmm2));
+ TEST_INSTRUCTION("C5FA2C8C1A80000000" , vcvttss2si(ecx, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("C5FA2C8C1A80000000" , vcvttss2si(ecx, dword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("C4E1FA2CCA" , vcvttss2si(rcx, xmm2));
+ TEST_INSTRUCTION("C4E1FA2C8C1A80000000" , vcvttss2si(rcx, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("C4E1FA2C8C1A80000000" , vcvttss2si(rcx, dword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("62F17E0878CA" , vcvttss2usi(ecx, xmm2));
+ TEST_INSTRUCTION("62F17E08784C1A20" , vcvttss2usi(ecx, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("62F17E08784C1A20" , vcvttss2usi(ecx, dword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("62F1FE0878CA" , vcvttss2usi(rcx, xmm2));
+ TEST_INSTRUCTION("62F1FE08784C1A20" , vcvttss2usi(rcx, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("62F1FE08784C1A20" , vcvttss2usi(rcx, dword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("62F17E087ACA" , vcvtudq2pd(xmm1, xmm2));
+ TEST_INSTRUCTION("62F17E087A4C1A10" , vcvtudq2pd(xmm1, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("62F17E087A4C1A10" , vcvtudq2pd(xmm1, qword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("62F17E287ACA" , vcvtudq2pd(ymm1, xmm2));
+ TEST_INSTRUCTION("62F17E287A4C1A08" , vcvtudq2pd(ymm1, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("62F17E287A4C1A08" , vcvtudq2pd(ymm1, xmmword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("62F17E487ACA" , vcvtudq2pd(zmm1, ymm2));
+ TEST_INSTRUCTION("62F17E487A4C1A04" , vcvtudq2pd(zmm1, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("62F17E487A4C1A04" , vcvtudq2pd(zmm1, ymmword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("62F17F087ACA" , vcvtudq2ps(xmm1, xmm2));
+ TEST_INSTRUCTION("62F17F087A4C1A08" , vcvtudq2ps(xmm1, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("62F17F087A4C1A08" , vcvtudq2ps(xmm1, xmmword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("62F17F287ACA" , vcvtudq2ps(ymm1, ymm2));
+ TEST_INSTRUCTION("62F17F287A4C1A04" , vcvtudq2ps(ymm1, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("62F17F287A4C1A04" , vcvtudq2ps(ymm1, ymmword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("62F17F487ACA" , vcvtudq2ps(zmm1, zmm2));
+ TEST_INSTRUCTION("62F17F487A4C1A02" , vcvtudq2ps(zmm1, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("62F17F487A4C1A02" , vcvtudq2ps(zmm1, zmmword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("62F1FE087ACA" , vcvtuqq2pd(xmm1, xmm2));
+ TEST_INSTRUCTION("62F1FE087A4C1A08" , vcvtuqq2pd(xmm1, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("62F1FE087A4C1A08" , vcvtuqq2pd(xmm1, xmmword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("62F1FE287ACA" , vcvtuqq2pd(ymm1, ymm2));
+ TEST_INSTRUCTION("62F1FE287A4C1A04" , vcvtuqq2pd(ymm1, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("62F1FE287A4C1A04" , vcvtuqq2pd(ymm1, ymmword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("62F1FE487ACA" , vcvtuqq2pd(zmm1, zmm2));
+ TEST_INSTRUCTION("62F1FE487A4C1A02" , vcvtuqq2pd(zmm1, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("62F1FE487A4C1A02" , vcvtuqq2pd(zmm1, zmmword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("62F1FF087ACA" , vcvtuqq2ps(xmm1, xmm2));
+ TEST_INSTRUCTION("62F1FF287ACA" , vcvtuqq2ps(xmm1, ymm2));
+ TEST_INSTRUCTION("62F1FF087A4C1A08" , vcvtuqq2ps(xmm1, xmmword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("62F1FF287A4C1A04" , vcvtuqq2ps(xmm1, ymmword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("62F1FF487ACA" , vcvtuqq2ps(ymm1, zmm2));
+ TEST_INSTRUCTION("62F1FF487A4C1A02" , vcvtuqq2ps(ymm1, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("62F1FF487A4C1A02" , vcvtuqq2ps(ymm1, zmmword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("62F16F087BCB" , vcvtusi2sd(xmm1, xmm2, ebx));
+ TEST_INSTRUCTION("62F1EF087BCB" , vcvtusi2sd(xmm1, xmm2, rbx));
+ TEST_INSTRUCTION("62F16F087B4C2B20" , vcvtusi2sd(xmm1, xmm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F16F087B4C2B20" , vcvtusi2sd(xmm1, xmm2, dword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F1EF087B4C2B10" , vcvtusi2sd(xmm1, xmm2, qword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F16E087BCB" , vcvtusi2ss(xmm1, xmm2, ebx));
+ TEST_INSTRUCTION("62F1EE087BCB" , vcvtusi2ss(xmm1, xmm2, rbx));
+ TEST_INSTRUCTION("62F16E087B4C2B20" , vcvtusi2ss(xmm1, xmm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F16E087B4C2B20" , vcvtusi2ss(xmm1, xmm2, dword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F1EE087B4C2B10" , vcvtusi2ss(xmm1, xmm2, qword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F36D0842CB01" , vdbpsadbw(xmm1, xmm2, xmm3, 1));
+ TEST_INSTRUCTION("62F36D08424C2B0801" , vdbpsadbw(xmm1, xmm2, ptr(rbx, rbp, 0, 128), 1));
+ TEST_INSTRUCTION("62F36D08424C2B0801" , vdbpsadbw(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128), 1));
+ TEST_INSTRUCTION("62F36D2842CB01" , vdbpsadbw(ymm1, ymm2, ymm3, 1));
+ TEST_INSTRUCTION("62F36D28424C2B0401" , vdbpsadbw(ymm1, ymm2, ptr(rbx, rbp, 0, 128), 1));
+ TEST_INSTRUCTION("62F36D28424C2B0401" , vdbpsadbw(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128), 1));
+ TEST_INSTRUCTION("62F36D4842CB01" , vdbpsadbw(zmm1, zmm2, zmm3, 1));
+ TEST_INSTRUCTION("62F36D48424C2B0201" , vdbpsadbw(zmm1, zmm2, ptr(rbx, rbp, 0, 128), 1));
+ TEST_INSTRUCTION("62F36D48424C2B0201" , vdbpsadbw(zmm1, zmm2, zmmword_ptr(rbx, rbp, 0, 128), 1));
+ TEST_INSTRUCTION("C5E95ECB" , vdivpd(xmm1, xmm2, xmm3));
+ TEST_INSTRUCTION("C5E95E8C2B80000000" , vdivpd(xmm1, xmm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C5E95E8C2B80000000" , vdivpd(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C5ED5ECB" , vdivpd(ymm1, ymm2, ymm3));
+ TEST_INSTRUCTION("C5ED5E8C2B80000000" , vdivpd(ymm1, ymm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C5ED5E8C2B80000000" , vdivpd(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F1ED485ECB" , vdivpd(zmm1, zmm2, zmm3));
+ TEST_INSTRUCTION("62F1ED485E4C2B02" , vdivpd(zmm1, zmm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F1ED485E4C2B02" , vdivpd(zmm1, zmm2, zmmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C5E85ECB" , vdivps(xmm1, xmm2, xmm3));
+ TEST_INSTRUCTION("C5E85E8C2B80000000" , vdivps(xmm1, xmm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C5E85E8C2B80000000" , vdivps(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C5EC5ECB" , vdivps(ymm1, ymm2, ymm3));
+ TEST_INSTRUCTION("C5EC5E8C2B80000000" , vdivps(ymm1, ymm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C5EC5E8C2B80000000" , vdivps(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F16C485ECB" , vdivps(zmm1, zmm2, zmm3));
+ TEST_INSTRUCTION("62F16C485E4C2B02" , vdivps(zmm1, zmm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F16C485E4C2B02" , vdivps(zmm1, zmm2, zmmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C5EB5ECB" , vdivsd(xmm1, xmm2, xmm3));
+ TEST_INSTRUCTION("C5EB5E8C2B80000000" , vdivsd(xmm1, xmm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C5EB5E8C2B80000000" , vdivsd(xmm1, xmm2, qword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C5EA5ECB" , vdivss(xmm1, xmm2, xmm3));
+ TEST_INSTRUCTION("C5EA5E8C2B80000000" , vdivss(xmm1, xmm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C5EA5E8C2B80000000" , vdivss(xmm1, xmm2, dword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F26E0852CB" , vdpbf16ps(xmm1, xmm2, xmm3));
+ TEST_INSTRUCTION("62F26E08524C2B08" , vdpbf16ps(xmm1, xmm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F26E08524C2B08" , vdpbf16ps(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F26E2852CB" , vdpbf16ps(ymm1, ymm2, ymm3));
+ TEST_INSTRUCTION("62F26E28524C2B04" , vdpbf16ps(ymm1, ymm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F26E28524C2B04" , vdpbf16ps(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F26E4852CB" , vdpbf16ps(zmm1, zmm2, zmm3));
+ TEST_INSTRUCTION("62F26E48524C2B02" , vdpbf16ps(zmm1, zmm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F26E48524C2B02" , vdpbf16ps(zmm1, zmm2, zmmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C4E36941CB01" , vdppd(xmm1, xmm2, xmm3, 1));
+ TEST_INSTRUCTION("C4E369418C2B8000000001" , vdppd(xmm1, xmm2, ptr(rbx, rbp, 0, 128), 1));
+ TEST_INSTRUCTION("C4E369418C2B8000000001" , vdppd(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128), 1));
+ TEST_INSTRUCTION("C4E36940CB01" , vdpps(xmm1, xmm2, xmm3, 1));
+ TEST_INSTRUCTION("C4E369408C2B8000000001" , vdpps(xmm1, xmm2, ptr(rbx, rbp, 0, 128), 1));
+ TEST_INSTRUCTION("C4E369408C2B8000000001" , vdpps(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128), 1));
+ TEST_INSTRUCTION("C4E36D40CB01" , vdpps(ymm1, ymm2, ymm3, 1));
+ TEST_INSTRUCTION("C4E36D408C2B8000000001" , vdpps(ymm1, ymm2, ptr(rbx, rbp, 0, 128), 1));
+ TEST_INSTRUCTION("C4E36D408C2B8000000001" , vdpps(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128), 1));
+ TEST_INSTRUCTION("62F2FD48C8CA" , vexp2pd(zmm1, zmm2));
+ TEST_INSTRUCTION("62F2FD48C84C1A02" , vexp2pd(zmm1, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("62F2FD48C84C1A02" , vexp2pd(zmm1, zmmword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("62F27D48C8CA" , vexp2ps(zmm1, zmm2));
+ TEST_INSTRUCTION("62F27D48C84C1A02" , vexp2ps(zmm1, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("62F27D48C84C1A02" , vexp2ps(zmm1, zmmword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("62F2FD0888CA" , vexpandpd(xmm1, xmm2));
+ TEST_INSTRUCTION("62F2FD08884C1A10" , vexpandpd(xmm1, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("62F2FD08884C1A10" , vexpandpd(xmm1, xmmword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("62F2FD2888CA" , vexpandpd(ymm1, ymm2));
+ TEST_INSTRUCTION("62F2FD28884C1A10" , vexpandpd(ymm1, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("62F2FD28884C1A10" , vexpandpd(ymm1, ymmword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("62F2FD4888CA" , vexpandpd(zmm1, zmm2));
+ TEST_INSTRUCTION("62F2FD48884C1A10" , vexpandpd(zmm1, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("62F2FD48884C1A10" , vexpandpd(zmm1, zmmword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("62F27D0888CA" , vexpandps(xmm1, xmm2));
+ TEST_INSTRUCTION("62F27D08884C1A20" , vexpandps(xmm1, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("62F27D08884C1A20" , vexpandps(xmm1, xmmword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("62F27D2888CA" , vexpandps(ymm1, ymm2));
+ TEST_INSTRUCTION("62F27D28884C1A20" , vexpandps(ymm1, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("62F27D28884C1A20" , vexpandps(ymm1, ymmword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("62F27D4888CA" , vexpandps(zmm1, zmm2));
+ TEST_INSTRUCTION("62F27D48884C1A20" , vexpandps(zmm1, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("62F27D48884C1A20" , vexpandps(zmm1, zmmword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("C4E37D19D101" , vextractf128(xmm1, ymm2, 1));
+ TEST_INSTRUCTION("C4E37D199C118000000001" , vextractf128(ptr(rcx, rdx, 0, 128), ymm3, 1));
+ TEST_INSTRUCTION("C4E37D199C118000000001" , vextractf128(xmmword_ptr(rcx, rdx, 0, 128), ymm3, 1));
+ TEST_INSTRUCTION("62F37D2819D101" , vextractf32x4(xmm1, ymm2, 1));
+ TEST_INSTRUCTION("62F37D4819D101" , vextractf32x4(xmm1, zmm2, 1));
+ TEST_INSTRUCTION("62F37D28195C110801" , vextractf32x4(ptr(rcx, rdx, 0, 128), ymm3, 1));
+ TEST_INSTRUCTION("62F37D48195C110801" , vextractf32x4(ptr(rcx, rdx, 0, 128), zmm3, 1));
+ TEST_INSTRUCTION("62F37D28195C110801" , vextractf32x4(xmmword_ptr(rcx, rdx, 0, 128), ymm3, 1));
+ TEST_INSTRUCTION("62F37D48195C110801" , vextractf32x4(xmmword_ptr(rcx, rdx, 0, 128), zmm3, 1));
+ TEST_INSTRUCTION("62F37D481BD101" , vextractf32x8(ymm1, zmm2, 1));
+ TEST_INSTRUCTION("62F37D481B5C110401" , vextractf32x8(ptr(rcx, rdx, 0, 128), zmm3, 1));
+ TEST_INSTRUCTION("62F37D481B5C110401" , vextractf32x8(ymmword_ptr(rcx, rdx, 0, 128), zmm3, 1));
+ TEST_INSTRUCTION("62F3FD2819D101" , vextractf64x2(xmm1, ymm2, 1));
+ TEST_INSTRUCTION("62F3FD4819D101" , vextractf64x2(xmm1, zmm2, 1));
+ TEST_INSTRUCTION("62F3FD28195C110801" , vextractf64x2(ptr(rcx, rdx, 0, 128), ymm3, 1));
+ TEST_INSTRUCTION("62F3FD48195C110801" , vextractf64x2(ptr(rcx, rdx, 0, 128), zmm3, 1));
+ TEST_INSTRUCTION("62F3FD28195C110801" , vextractf64x2(xmmword_ptr(rcx, rdx, 0, 128), ymm3, 1));
+ TEST_INSTRUCTION("62F3FD48195C110801" , vextractf64x2(xmmword_ptr(rcx, rdx, 0, 128), zmm3, 1));
+ TEST_INSTRUCTION("62F3FD481BD101" , vextractf64x4(ymm1, zmm2, 1));
+ TEST_INSTRUCTION("62F3FD481B5C110401" , vextractf64x4(ptr(rcx, rdx, 0, 128), zmm3, 1));
+ TEST_INSTRUCTION("62F3FD481B5C110401" , vextractf64x4(ymmword_ptr(rcx, rdx, 0, 128), zmm3, 1));
+ TEST_INSTRUCTION("C4E37D39D101" , vextracti128(xmm1, ymm2, 1));
+ TEST_INSTRUCTION("C4E37D399C118000000001" , vextracti128(ptr(rcx, rdx, 0, 128), ymm3, 1));
+ TEST_INSTRUCTION("C4E37D399C118000000001" , vextracti128(xmmword_ptr(rcx, rdx, 0, 128), ymm3, 1));
+ TEST_INSTRUCTION("62F37D2839D101" , vextracti32x4(xmm1, ymm2, 1));
+ TEST_INSTRUCTION("62F37D4839D101" , vextracti32x4(xmm1, zmm2, 1));
+ TEST_INSTRUCTION("62F37D28395C110801" , vextracti32x4(ptr(rcx, rdx, 0, 128), ymm3, 1));
+ TEST_INSTRUCTION("62F37D48395C110801" , vextracti32x4(ptr(rcx, rdx, 0, 128), zmm3, 1));
+ TEST_INSTRUCTION("62F37D28395C110801" , vextracti32x4(xmmword_ptr(rcx, rdx, 0, 128), ymm3, 1));
+ TEST_INSTRUCTION("62F37D48395C110801" , vextracti32x4(xmmword_ptr(rcx, rdx, 0, 128), zmm3, 1));
+ TEST_INSTRUCTION("62F37D483BD101" , vextracti32x8(ymm1, zmm2, 1));
+ TEST_INSTRUCTION("62F37D483B5C110401" , vextracti32x8(ptr(rcx, rdx, 0, 128), zmm3, 1));
+ TEST_INSTRUCTION("62F37D483B5C110401" , vextracti32x8(ymmword_ptr(rcx, rdx, 0, 128), zmm3, 1));
+ TEST_INSTRUCTION("62F3FD2839D101" , vextracti64x2(xmm1, ymm2, 1));
+ TEST_INSTRUCTION("62F3FD4839D101" , vextracti64x2(xmm1, zmm2, 1));
+ TEST_INSTRUCTION("62F3FD28395C110801" , vextracti64x2(ptr(rcx, rdx, 0, 128), ymm3, 1));
+ TEST_INSTRUCTION("62F3FD48395C110801" , vextracti64x2(ptr(rcx, rdx, 0, 128), zmm3, 1));
+ TEST_INSTRUCTION("62F3FD28395C110801" , vextracti64x2(xmmword_ptr(rcx, rdx, 0, 128), ymm3, 1));
+ TEST_INSTRUCTION("62F3FD48395C110801" , vextracti64x2(xmmword_ptr(rcx, rdx, 0, 128), zmm3, 1));
+ TEST_INSTRUCTION("62F3FD483BD101" , vextracti64x4(ymm1, zmm2, 1));
+ TEST_INSTRUCTION("62F3FD483B5C110401" , vextracti64x4(ptr(rcx, rdx, 0, 128), zmm3, 1));
+ TEST_INSTRUCTION("62F3FD483B5C110401" , vextracti64x4(ymmword_ptr(rcx, rdx, 0, 128), zmm3, 1));
+ TEST_INSTRUCTION("C4E37917D101" , vextractps(ecx, xmm2, 1));
+ TEST_INSTRUCTION("C4E379179C118000000001" , vextractps(ptr(rcx, rdx, 0, 128), xmm3, 1));
+ TEST_INSTRUCTION("C4E379179C118000000001" , vextractps(dword_ptr(rcx, rdx, 0, 128), xmm3, 1));
+ TEST_INSTRUCTION("62F3ED0854CB01" , vfixupimmpd(xmm1, xmm2, xmm3, 1));
+ TEST_INSTRUCTION("62F3ED08544C2B0801" , vfixupimmpd(xmm1, xmm2, ptr(rbx, rbp, 0, 128), 1));
+ TEST_INSTRUCTION("62F3ED08544C2B0801" , vfixupimmpd(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128), 1));
+ TEST_INSTRUCTION("62F3ED2854CB01" , vfixupimmpd(ymm1, ymm2, ymm3, 1));
+ TEST_INSTRUCTION("62F3ED28544C2B0401" , vfixupimmpd(ymm1, ymm2, ptr(rbx, rbp, 0, 128), 1));
+ TEST_INSTRUCTION("62F3ED28544C2B0401" , vfixupimmpd(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128), 1));
+ TEST_INSTRUCTION("62F3ED4854CB01" , vfixupimmpd(zmm1, zmm2, zmm3, 1));
+ TEST_INSTRUCTION("62F3ED48544C2B0201" , vfixupimmpd(zmm1, zmm2, ptr(rbx, rbp, 0, 128), 1));
+ TEST_INSTRUCTION("62F3ED48544C2B0201" , vfixupimmpd(zmm1, zmm2, zmmword_ptr(rbx, rbp, 0, 128), 1));
+ TEST_INSTRUCTION("62F36D0854CB01" , vfixupimmps(xmm1, xmm2, xmm3, 1));
+ TEST_INSTRUCTION("62F36D08544C2B0801" , vfixupimmps(xmm1, xmm2, ptr(rbx, rbp, 0, 128), 1));
+ TEST_INSTRUCTION("62F36D08544C2B0801" , vfixupimmps(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128), 1));
+ TEST_INSTRUCTION("62F36D2854CB01" , vfixupimmps(ymm1, ymm2, ymm3, 1));
+ TEST_INSTRUCTION("62F36D28544C2B0401" , vfixupimmps(ymm1, ymm2, ptr(rbx, rbp, 0, 128), 1));
+ TEST_INSTRUCTION("62F36D28544C2B0401" , vfixupimmps(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128), 1));
+ TEST_INSTRUCTION("62F36D4854CB01" , vfixupimmps(zmm1, zmm2, zmm3, 1));
+ TEST_INSTRUCTION("62F36D48544C2B0201" , vfixupimmps(zmm1, zmm2, ptr(rbx, rbp, 0, 128), 1));
+ TEST_INSTRUCTION("62F36D48544C2B0201" , vfixupimmps(zmm1, zmm2, zmmword_ptr(rbx, rbp, 0, 128), 1));
+ TEST_INSTRUCTION("62F3ED0855CB01" , vfixupimmsd(xmm1, xmm2, xmm3, 1));
+ TEST_INSTRUCTION("62F3ED08554C2B1001" , vfixupimmsd(xmm1, xmm2, ptr(rbx, rbp, 0, 128), 1));
+ TEST_INSTRUCTION("62F3ED08554C2B1001" , vfixupimmsd(xmm1, xmm2, qword_ptr(rbx, rbp, 0, 128), 1));
+ TEST_INSTRUCTION("62F36D0855CB01" , vfixupimmss(xmm1, xmm2, xmm3, 1));
+ TEST_INSTRUCTION("62F36D08554C2B2001" , vfixupimmss(xmm1, xmm2, ptr(rbx, rbp, 0, 128), 1));
+ TEST_INSTRUCTION("62F36D08554C2B2001" , vfixupimmss(xmm1, xmm2, dword_ptr(rbx, rbp, 0, 128), 1));
+ TEST_INSTRUCTION("C4E2E998CB" , vfmadd132pd(xmm1, xmm2, xmm3));
+ TEST_INSTRUCTION("C4E2E9988C2B80000000" , vfmadd132pd(xmm1, xmm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C4E2E9988C2B80000000" , vfmadd132pd(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C4E2ED98CB" , vfmadd132pd(ymm1, ymm2, ymm3));
+ TEST_INSTRUCTION("C4E2ED988C2B80000000" , vfmadd132pd(ymm1, ymm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C4E2ED988C2B80000000" , vfmadd132pd(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F2ED4898CB" , vfmadd132pd(zmm1, zmm2, zmm3));
+ TEST_INSTRUCTION("62F2ED48984C2B02" , vfmadd132pd(zmm1, zmm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F2ED48984C2B02" , vfmadd132pd(zmm1, zmm2, zmmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C4E26998CB" , vfmadd132ps(xmm1, xmm2, xmm3));
+ TEST_INSTRUCTION("C4E269988C2B80000000" , vfmadd132ps(xmm1, xmm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C4E269988C2B80000000" , vfmadd132ps(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C4E26D98CB" , vfmadd132ps(ymm1, ymm2, ymm3));
+ TEST_INSTRUCTION("C4E26D988C2B80000000" , vfmadd132ps(ymm1, ymm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C4E26D988C2B80000000" , vfmadd132ps(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F26D4898CB" , vfmadd132ps(zmm1, zmm2, zmm3));
+ TEST_INSTRUCTION("62F26D48984C2B02" , vfmadd132ps(zmm1, zmm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F26D48984C2B02" , vfmadd132ps(zmm1, zmm2, zmmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C4E2E999CB" , vfmadd132sd(xmm1, xmm2, xmm3));
+ TEST_INSTRUCTION("C4E2E9998C2B80000000" , vfmadd132sd(xmm1, xmm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C4E2E9998C2B80000000" , vfmadd132sd(xmm1, xmm2, qword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C4E26999CB" , vfmadd132ss(xmm1, xmm2, xmm3));
+ TEST_INSTRUCTION("C4E269998C2B80000000" , vfmadd132ss(xmm1, xmm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C4E269998C2B80000000" , vfmadd132ss(xmm1, xmm2, dword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C4E2E9A8CB" , vfmadd213pd(xmm1, xmm2, xmm3));
+ TEST_INSTRUCTION("C4E2E9A88C2B80000000" , vfmadd213pd(xmm1, xmm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C4E2E9A88C2B80000000" , vfmadd213pd(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C4E2EDA8CB" , vfmadd213pd(ymm1, ymm2, ymm3));
+ TEST_INSTRUCTION("C4E2EDA88C2B80000000" , vfmadd213pd(ymm1, ymm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C4E2EDA88C2B80000000" , vfmadd213pd(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F2ED48A8CB" , vfmadd213pd(zmm1, zmm2, zmm3));
+ TEST_INSTRUCTION("62F2ED48A84C2B02" , vfmadd213pd(zmm1, zmm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F2ED48A84C2B02" , vfmadd213pd(zmm1, zmm2, zmmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C4E269A8CB" , vfmadd213ps(xmm1, xmm2, xmm3));
+ TEST_INSTRUCTION("C4E269A88C2B80000000" , vfmadd213ps(xmm1, xmm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C4E269A88C2B80000000" , vfmadd213ps(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C4E26DA8CB" , vfmadd213ps(ymm1, ymm2, ymm3));
+ TEST_INSTRUCTION("C4E26DA88C2B80000000" , vfmadd213ps(ymm1, ymm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C4E26DA88C2B80000000" , vfmadd213ps(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F26D48A8CB" , vfmadd213ps(zmm1, zmm2, zmm3));
+ TEST_INSTRUCTION("62F26D48A84C2B02" , vfmadd213ps(zmm1, zmm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F26D48A84C2B02" , vfmadd213ps(zmm1, zmm2, zmmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C4E2E9A9CB" , vfmadd213sd(xmm1, xmm2, xmm3));
+ TEST_INSTRUCTION("C4E2E9A98C2B80000000" , vfmadd213sd(xmm1, xmm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C4E2E9A98C2B80000000" , vfmadd213sd(xmm1, xmm2, qword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C4E269A9CB" , vfmadd213ss(xmm1, xmm2, xmm3));
+ TEST_INSTRUCTION("C4E269A98C2B80000000" , vfmadd213ss(xmm1, xmm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C4E269A98C2B80000000" , vfmadd213ss(xmm1, xmm2, dword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C4E2E9B8CB" , vfmadd231pd(xmm1, xmm2, xmm3));
+ TEST_INSTRUCTION("C4E2E9B88C2B80000000" , vfmadd231pd(xmm1, xmm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C4E2E9B88C2B80000000" , vfmadd231pd(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C4E2EDB8CB" , vfmadd231pd(ymm1, ymm2, ymm3));
+ TEST_INSTRUCTION("C4E2EDB88C2B80000000" , vfmadd231pd(ymm1, ymm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C4E2EDB88C2B80000000" , vfmadd231pd(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F2ED48B8CB" , vfmadd231pd(zmm1, zmm2, zmm3));
+ TEST_INSTRUCTION("62F2ED48B84C2B02" , vfmadd231pd(zmm1, zmm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F2ED48B84C2B02" , vfmadd231pd(zmm1, zmm2, zmmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C4E269B8CB" , vfmadd231ps(xmm1, xmm2, xmm3));
+ TEST_INSTRUCTION("C4E269B88C2B80000000" , vfmadd231ps(xmm1, xmm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C4E269B88C2B80000000" , vfmadd231ps(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C4E26DB8CB" , vfmadd231ps(ymm1, ymm2, ymm3));
+ TEST_INSTRUCTION("C4E26DB88C2B80000000" , vfmadd231ps(ymm1, ymm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C4E26DB88C2B80000000" , vfmadd231ps(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F26D48B8CB" , vfmadd231ps(zmm1, zmm2, zmm3));
+ TEST_INSTRUCTION("62F26D48B84C2B02" , vfmadd231ps(zmm1, zmm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F26D48B84C2B02" , vfmadd231ps(zmm1, zmm2, zmmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C4E2E9B9CB" , vfmadd231sd(xmm1, xmm2, xmm3));
+ TEST_INSTRUCTION("C4E2E9B98C2B80000000" , vfmadd231sd(xmm1, xmm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C4E2E9B98C2B80000000" , vfmadd231sd(xmm1, xmm2, qword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C4E269B9CB" , vfmadd231ss(xmm1, xmm2, xmm3));
+ TEST_INSTRUCTION("C4E269B98C2B80000000" , vfmadd231ss(xmm1, xmm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C4E269B98C2B80000000" , vfmadd231ss(xmm1, xmm2, dword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C4E3E969CC30" , vfmaddpd(xmm1, xmm2, xmm3, xmm4));
+ TEST_INSTRUCTION("C4E3E9698C358000000030" , vfmaddpd(xmm1, xmm2, xmm3, ptr(rbp, rsi, 0, 128)));
+ TEST_INSTRUCTION("C4E3E9698C358000000030" , vfmaddpd(xmm1, xmm2, xmm3, xmmword_ptr(rbp, rsi, 0, 128)));
+ TEST_INSTRUCTION("C4E369698C2B8000000060" , vfmaddpd(xmm1, xmm2, ptr(rbx, rbp, 0, 128), xmm6));
+ TEST_INSTRUCTION("C4E369698C2B8000000060" , vfmaddpd(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128), xmm6));
+ TEST_INSTRUCTION("C4E3ED69CC30" , vfmaddpd(ymm1, ymm2, ymm3, ymm4));
+ TEST_INSTRUCTION("C4E3ED698C358000000030" , vfmaddpd(ymm1, ymm2, ymm3, ptr(rbp, rsi, 0, 128)));
+ TEST_INSTRUCTION("C4E3ED698C358000000030" , vfmaddpd(ymm1, ymm2, ymm3, ymmword_ptr(rbp, rsi, 0, 128)));
+ TEST_INSTRUCTION("C4E36D698C2B8000000060" , vfmaddpd(ymm1, ymm2, ptr(rbx, rbp, 0, 128), ymm6));
+ TEST_INSTRUCTION("C4E36D698C2B8000000060" , vfmaddpd(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128), ymm6));
+ TEST_INSTRUCTION("C4E3E968CC30" , vfmaddps(xmm1, xmm2, xmm3, xmm4));
+ TEST_INSTRUCTION("C4E3E9688C358000000030" , vfmaddps(xmm1, xmm2, xmm3, ptr(rbp, rsi, 0, 128)));
+ TEST_INSTRUCTION("C4E3E9688C358000000030" , vfmaddps(xmm1, xmm2, xmm3, xmmword_ptr(rbp, rsi, 0, 128)));
+ TEST_INSTRUCTION("C4E369688C2B8000000060" , vfmaddps(xmm1, xmm2, ptr(rbx, rbp, 0, 128), xmm6));
+ TEST_INSTRUCTION("C4E369688C2B8000000060" , vfmaddps(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128), xmm6));
+ TEST_INSTRUCTION("C4E3ED68CC30" , vfmaddps(ymm1, ymm2, ymm3, ymm4));
+ TEST_INSTRUCTION("C4E3ED688C358000000030" , vfmaddps(ymm1, ymm2, ymm3, ptr(rbp, rsi, 0, 128)));
+ TEST_INSTRUCTION("C4E3ED688C358000000030" , vfmaddps(ymm1, ymm2, ymm3, ymmword_ptr(rbp, rsi, 0, 128)));
+ TEST_INSTRUCTION("C4E36D688C2B8000000060" , vfmaddps(ymm1, ymm2, ptr(rbx, rbp, 0, 128), ymm6));
+ TEST_INSTRUCTION("C4E36D688C2B8000000060" , vfmaddps(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128), ymm6));
+ TEST_INSTRUCTION("C4E3E96BCC30" , vfmaddsd(xmm1, xmm2, xmm3, xmm4));
+ TEST_INSTRUCTION("C4E3E96B8C358000000030" , vfmaddsd(xmm1, xmm2, xmm3, ptr(rbp, rsi, 0, 128)));
+ TEST_INSTRUCTION("C4E3E96B8C358000000030" , vfmaddsd(xmm1, xmm2, xmm3, qword_ptr(rbp, rsi, 0, 128)));
+ TEST_INSTRUCTION("C4E3696B8C2B8000000060" , vfmaddsd(xmm1, xmm2, ptr(rbx, rbp, 0, 128), xmm6));
+ TEST_INSTRUCTION("C4E3696B8C2B8000000060" , vfmaddsd(xmm1, xmm2, qword_ptr(rbx, rbp, 0, 128), xmm6));
+ TEST_INSTRUCTION("C4E3E96ACC30" , vfmaddss(xmm1, xmm2, xmm3, xmm4));
+ TEST_INSTRUCTION("C4E3E96A8C358000000030" , vfmaddss(xmm1, xmm2, xmm3, ptr(rbp, rsi, 0, 128)));
+ TEST_INSTRUCTION("C4E3E96A8C358000000030" , vfmaddss(xmm1, xmm2, xmm3, dword_ptr(rbp, rsi, 0, 128)));
+ TEST_INSTRUCTION("C4E3696A8C2B8000000060" , vfmaddss(xmm1, xmm2, ptr(rbx, rbp, 0, 128), xmm6));
+ TEST_INSTRUCTION("C4E3696A8C2B8000000060" , vfmaddss(xmm1, xmm2, dword_ptr(rbx, rbp, 0, 128), xmm6));
+ TEST_INSTRUCTION("C4E2E996CB" , vfmaddsub132pd(xmm1, xmm2, xmm3));
+ TEST_INSTRUCTION("C4E2E9968C2B80000000" , vfmaddsub132pd(xmm1, xmm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C4E2E9968C2B80000000" , vfmaddsub132pd(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C4E2ED96CB" , vfmaddsub132pd(ymm1, ymm2, ymm3));
+ TEST_INSTRUCTION("C4E2ED968C2B80000000" , vfmaddsub132pd(ymm1, ymm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C4E2ED968C2B80000000" , vfmaddsub132pd(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F2ED4896CB" , vfmaddsub132pd(zmm1, zmm2, zmm3));
+ TEST_INSTRUCTION("62F2ED48964C2B02" , vfmaddsub132pd(zmm1, zmm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F2ED48964C2B02" , vfmaddsub132pd(zmm1, zmm2, zmmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C4E26996CB" , vfmaddsub132ps(xmm1, xmm2, xmm3));
+ TEST_INSTRUCTION("C4E269968C2B80000000" , vfmaddsub132ps(xmm1, xmm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C4E269968C2B80000000" , vfmaddsub132ps(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C4E26D96CB" , vfmaddsub132ps(ymm1, ymm2, ymm3));
+ TEST_INSTRUCTION("C4E26D968C2B80000000" , vfmaddsub132ps(ymm1, ymm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C4E26D968C2B80000000" , vfmaddsub132ps(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F26D4896CB" , vfmaddsub132ps(zmm1, zmm2, zmm3));
+ TEST_INSTRUCTION("62F26D48964C2B02" , vfmaddsub132ps(zmm1, zmm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F26D48964C2B02" , vfmaddsub132ps(zmm1, zmm2, zmmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C4E2E9A6CB" , vfmaddsub213pd(xmm1, xmm2, xmm3));
+ TEST_INSTRUCTION("C4E2E9A68C2B80000000" , vfmaddsub213pd(xmm1, xmm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C4E2E9A68C2B80000000" , vfmaddsub213pd(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C4E2EDA6CB" , vfmaddsub213pd(ymm1, ymm2, ymm3));
+ TEST_INSTRUCTION("C4E2EDA68C2B80000000" , vfmaddsub213pd(ymm1, ymm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C4E2EDA68C2B80000000" , vfmaddsub213pd(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F2ED48A6CB" , vfmaddsub213pd(zmm1, zmm2, zmm3));
+ TEST_INSTRUCTION("62F2ED48A64C2B02" , vfmaddsub213pd(zmm1, zmm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F2ED48A64C2B02" , vfmaddsub213pd(zmm1, zmm2, zmmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C4E269A6CB" , vfmaddsub213ps(xmm1, xmm2, xmm3));
+ TEST_INSTRUCTION("C4E269A68C2B80000000" , vfmaddsub213ps(xmm1, xmm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C4E269A68C2B80000000" , vfmaddsub213ps(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C4E26DA6CB" , vfmaddsub213ps(ymm1, ymm2, ymm3));
+ TEST_INSTRUCTION("C4E26DA68C2B80000000" , vfmaddsub213ps(ymm1, ymm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C4E26DA68C2B80000000" , vfmaddsub213ps(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F26D48A6CB" , vfmaddsub213ps(zmm1, zmm2, zmm3));
+ TEST_INSTRUCTION("62F26D48A64C2B02" , vfmaddsub213ps(zmm1, zmm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F26D48A64C2B02" , vfmaddsub213ps(zmm1, zmm2, zmmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C4E2E9B6CB" , vfmaddsub231pd(xmm1, xmm2, xmm3));
+ TEST_INSTRUCTION("C4E2E9B68C2B80000000" , vfmaddsub231pd(xmm1, xmm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C4E2E9B68C2B80000000" , vfmaddsub231pd(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C4E2EDB6CB" , vfmaddsub231pd(ymm1, ymm2, ymm3));
+ TEST_INSTRUCTION("C4E2EDB68C2B80000000" , vfmaddsub231pd(ymm1, ymm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C4E2EDB68C2B80000000" , vfmaddsub231pd(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F2ED48B6CB" , vfmaddsub231pd(zmm1, zmm2, zmm3));
+ TEST_INSTRUCTION("62F2ED48B64C2B02" , vfmaddsub231pd(zmm1, zmm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F2ED48B64C2B02" , vfmaddsub231pd(zmm1, zmm2, zmmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C4E269B6CB" , vfmaddsub231ps(xmm1, xmm2, xmm3));
+ TEST_INSTRUCTION("C4E269B68C2B80000000" , vfmaddsub231ps(xmm1, xmm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C4E269B68C2B80000000" , vfmaddsub231ps(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C4E26DB6CB" , vfmaddsub231ps(ymm1, ymm2, ymm3));
+ TEST_INSTRUCTION("C4E26DB68C2B80000000" , vfmaddsub231ps(ymm1, ymm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C4E26DB68C2B80000000" , vfmaddsub231ps(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F26D48B6CB" , vfmaddsub231ps(zmm1, zmm2, zmm3));
+ TEST_INSTRUCTION("62F26D48B64C2B02" , vfmaddsub231ps(zmm1, zmm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F26D48B64C2B02" , vfmaddsub231ps(zmm1, zmm2, zmmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C4E3E95DCC30" , vfmaddsubpd(xmm1, xmm2, xmm3, xmm4));
+ TEST_INSTRUCTION("C4E3E95D8C358000000030" , vfmaddsubpd(xmm1, xmm2, xmm3, ptr(rbp, rsi, 0, 128)));
+ TEST_INSTRUCTION("C4E3E95D8C358000000030" , vfmaddsubpd(xmm1, xmm2, xmm3, xmmword_ptr(rbp, rsi, 0, 128)));
+ TEST_INSTRUCTION("C4E3695D8C2B8000000060" , vfmaddsubpd(xmm1, xmm2, ptr(rbx, rbp, 0, 128), xmm6));
+ TEST_INSTRUCTION("C4E3695D8C2B8000000060" , vfmaddsubpd(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128), xmm6));
+ TEST_INSTRUCTION("C4E3ED5DCC30" , vfmaddsubpd(ymm1, ymm2, ymm3, ymm4));
+ TEST_INSTRUCTION("C4E3ED5D8C358000000030" , vfmaddsubpd(ymm1, ymm2, ymm3, ptr(rbp, rsi, 0, 128)));
+ TEST_INSTRUCTION("C4E3ED5D8C358000000030" , vfmaddsubpd(ymm1, ymm2, ymm3, ymmword_ptr(rbp, rsi, 0, 128)));
+ TEST_INSTRUCTION("C4E36D5D8C2B8000000060" , vfmaddsubpd(ymm1, ymm2, ptr(rbx, rbp, 0, 128), ymm6));
+ TEST_INSTRUCTION("C4E36D5D8C2B8000000060" , vfmaddsubpd(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128), ymm6));
+ TEST_INSTRUCTION("C4E3E95CCC30" , vfmaddsubps(xmm1, xmm2, xmm3, xmm4));
+ TEST_INSTRUCTION("C4E3E95C8C358000000030" , vfmaddsubps(xmm1, xmm2, xmm3, ptr(rbp, rsi, 0, 128)));
+ TEST_INSTRUCTION("C4E3E95C8C358000000030" , vfmaddsubps(xmm1, xmm2, xmm3, xmmword_ptr(rbp, rsi, 0, 128)));
+ TEST_INSTRUCTION("C4E3695C8C2B8000000060" , vfmaddsubps(xmm1, xmm2, ptr(rbx, rbp, 0, 128), xmm6));
+ TEST_INSTRUCTION("C4E3695C8C2B8000000060" , vfmaddsubps(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128), xmm6));
+ TEST_INSTRUCTION("C4E3ED5CCC30" , vfmaddsubps(ymm1, ymm2, ymm3, ymm4));
+ TEST_INSTRUCTION("C4E3ED5C8C358000000030" , vfmaddsubps(ymm1, ymm2, ymm3, ptr(rbp, rsi, 0, 128)));
+ TEST_INSTRUCTION("C4E3ED5C8C358000000030" , vfmaddsubps(ymm1, ymm2, ymm3, ymmword_ptr(rbp, rsi, 0, 128)));
+ TEST_INSTRUCTION("C4E36D5C8C2B8000000060" , vfmaddsubps(ymm1, ymm2, ptr(rbx, rbp, 0, 128), ymm6));
+ TEST_INSTRUCTION("C4E36D5C8C2B8000000060" , vfmaddsubps(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128), ymm6));
+ TEST_INSTRUCTION("C4E2E99ACB" , vfmsub132pd(xmm1, xmm2, xmm3));
+ TEST_INSTRUCTION("C4E2E99A8C2B80000000" , vfmsub132pd(xmm1, xmm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C4E2E99A8C2B80000000" , vfmsub132pd(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C4E2ED9ACB" , vfmsub132pd(ymm1, ymm2, ymm3));
+ TEST_INSTRUCTION("C4E2ED9A8C2B80000000" , vfmsub132pd(ymm1, ymm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C4E2ED9A8C2B80000000" , vfmsub132pd(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F2ED489ACB" , vfmsub132pd(zmm1, zmm2, zmm3));
+ TEST_INSTRUCTION("62F2ED489A4C2B02" , vfmsub132pd(zmm1, zmm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F2ED489A4C2B02" , vfmsub132pd(zmm1, zmm2, zmmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C4E2699ACB" , vfmsub132ps(xmm1, xmm2, xmm3));
+ TEST_INSTRUCTION("C4E2699A8C2B80000000" , vfmsub132ps(xmm1, xmm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C4E2699A8C2B80000000" , vfmsub132ps(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C4E26D9ACB" , vfmsub132ps(ymm1, ymm2, ymm3));
+ TEST_INSTRUCTION("C4E26D9A8C2B80000000" , vfmsub132ps(ymm1, ymm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C4E26D9A8C2B80000000" , vfmsub132ps(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F26D489ACB" , vfmsub132ps(zmm1, zmm2, zmm3));
+ TEST_INSTRUCTION("62F26D489A4C2B02" , vfmsub132ps(zmm1, zmm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F26D489A4C2B02" , vfmsub132ps(zmm1, zmm2, zmmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C4E2E99BCB" , vfmsub132sd(xmm1, xmm2, xmm3));
+ TEST_INSTRUCTION("C4E2E99B8C2B80000000" , vfmsub132sd(xmm1, xmm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C4E2E99B8C2B80000000" , vfmsub132sd(xmm1, xmm2, qword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C4E2699BCB" , vfmsub132ss(xmm1, xmm2, xmm3));
+ TEST_INSTRUCTION("C4E2699B8C2B80000000" , vfmsub132ss(xmm1, xmm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C4E2699B8C2B80000000" , vfmsub132ss(xmm1, xmm2, dword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C4E2E9AACB" , vfmsub213pd(xmm1, xmm2, xmm3));
+ TEST_INSTRUCTION("C4E2E9AA8C2B80000000" , vfmsub213pd(xmm1, xmm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C4E2E9AA8C2B80000000" , vfmsub213pd(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C4E2EDAACB" , vfmsub213pd(ymm1, ymm2, ymm3));
+ TEST_INSTRUCTION("C4E2EDAA8C2B80000000" , vfmsub213pd(ymm1, ymm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C4E2EDAA8C2B80000000" , vfmsub213pd(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F2ED48AACB" , vfmsub213pd(zmm1, zmm2, zmm3));
+ TEST_INSTRUCTION("62F2ED48AA4C2B02" , vfmsub213pd(zmm1, zmm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F2ED48AA4C2B02" , vfmsub213pd(zmm1, zmm2, zmmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C4E269AACB" , vfmsub213ps(xmm1, xmm2, xmm3));
+ TEST_INSTRUCTION("C4E269AA8C2B80000000" , vfmsub213ps(xmm1, xmm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C4E269AA8C2B80000000" , vfmsub213ps(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C4E26DAACB" , vfmsub213ps(ymm1, ymm2, ymm3));
+ TEST_INSTRUCTION("C4E26DAA8C2B80000000" , vfmsub213ps(ymm1, ymm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C4E26DAA8C2B80000000" , vfmsub213ps(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F26D48AACB" , vfmsub213ps(zmm1, zmm2, zmm3));
+ TEST_INSTRUCTION("62F26D48AA4C2B02" , vfmsub213ps(zmm1, zmm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F26D48AA4C2B02" , vfmsub213ps(zmm1, zmm2, zmmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C4E2E9ABCB" , vfmsub213sd(xmm1, xmm2, xmm3));
+ TEST_INSTRUCTION("C4E2E9AB8C2B80000000" , vfmsub213sd(xmm1, xmm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C4E2E9AB8C2B80000000" , vfmsub213sd(xmm1, xmm2, qword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C4E269ABCB" , vfmsub213ss(xmm1, xmm2, xmm3));
+ TEST_INSTRUCTION("C4E269AB8C2B80000000" , vfmsub213ss(xmm1, xmm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C4E269AB8C2B80000000" , vfmsub213ss(xmm1, xmm2, dword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C4E2E9BACB" , vfmsub231pd(xmm1, xmm2, xmm3));
+ TEST_INSTRUCTION("C4E2E9BA8C2B80000000" , vfmsub231pd(xmm1, xmm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C4E2E9BA8C2B80000000" , vfmsub231pd(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C4E2EDBACB" , vfmsub231pd(ymm1, ymm2, ymm3));
+ TEST_INSTRUCTION("C4E2EDBA8C2B80000000" , vfmsub231pd(ymm1, ymm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C4E2EDBA8C2B80000000" , vfmsub231pd(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F2ED48BACB" , vfmsub231pd(zmm1, zmm2, zmm3));
+ TEST_INSTRUCTION("62F2ED48BA4C2B02" , vfmsub231pd(zmm1, zmm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F2ED48BA4C2B02" , vfmsub231pd(zmm1, zmm2, zmmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C4E269BACB" , vfmsub231ps(xmm1, xmm2, xmm3));
+ TEST_INSTRUCTION("C4E269BA8C2B80000000" , vfmsub231ps(xmm1, xmm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C4E269BA8C2B80000000" , vfmsub231ps(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C4E26DBACB" , vfmsub231ps(ymm1, ymm2, ymm3));
+ TEST_INSTRUCTION("C4E26DBA8C2B80000000" , vfmsub231ps(ymm1, ymm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C4E26DBA8C2B80000000" , vfmsub231ps(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F26D48BACB" , vfmsub231ps(zmm1, zmm2, zmm3));
+ TEST_INSTRUCTION("62F26D48BA4C2B02" , vfmsub231ps(zmm1, zmm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F26D48BA4C2B02" , vfmsub231ps(zmm1, zmm2, zmmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C4E2E9BBCB" , vfmsub231sd(xmm1, xmm2, xmm3));
+ TEST_INSTRUCTION("C4E2E9BB8C2B80000000" , vfmsub231sd(xmm1, xmm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C4E2E9BB8C2B80000000" , vfmsub231sd(xmm1, xmm2, qword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C4E269BBCB" , vfmsub231ss(xmm1, xmm2, xmm3));
+ TEST_INSTRUCTION("C4E269BB8C2B80000000" , vfmsub231ss(xmm1, xmm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C4E269BB8C2B80000000" , vfmsub231ss(xmm1, xmm2, dword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C4E2E997CB" , vfmsubadd132pd(xmm1, xmm2, xmm3));
+ TEST_INSTRUCTION("C4E2E9978C2B80000000" , vfmsubadd132pd(xmm1, xmm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C4E2E9978C2B80000000" , vfmsubadd132pd(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C4E2ED97CB" , vfmsubadd132pd(ymm1, ymm2, ymm3));
+ TEST_INSTRUCTION("C4E2ED978C2B80000000" , vfmsubadd132pd(ymm1, ymm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C4E2ED978C2B80000000" , vfmsubadd132pd(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F2ED4897CB" , vfmsubadd132pd(zmm1, zmm2, zmm3));
+ TEST_INSTRUCTION("62F2ED48974C2B02" , vfmsubadd132pd(zmm1, zmm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F2ED48974C2B02" , vfmsubadd132pd(zmm1, zmm2, zmmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C4E26997CB" , vfmsubadd132ps(xmm1, xmm2, xmm3));
+ TEST_INSTRUCTION("C4E269978C2B80000000" , vfmsubadd132ps(xmm1, xmm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C4E269978C2B80000000" , vfmsubadd132ps(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C4E26D97CB" , vfmsubadd132ps(ymm1, ymm2, ymm3));
+ TEST_INSTRUCTION("C4E26D978C2B80000000" , vfmsubadd132ps(ymm1, ymm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C4E26D978C2B80000000" , vfmsubadd132ps(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F26D4897CB" , vfmsubadd132ps(zmm1, zmm2, zmm3));
+ TEST_INSTRUCTION("62F26D48974C2B02" , vfmsubadd132ps(zmm1, zmm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F26D48974C2B02" , vfmsubadd132ps(zmm1, zmm2, zmmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C4E2E9A7CB" , vfmsubadd213pd(xmm1, xmm2, xmm3));
+ TEST_INSTRUCTION("C4E2E9A78C2B80000000" , vfmsubadd213pd(xmm1, xmm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C4E2E9A78C2B80000000" , vfmsubadd213pd(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C4E2EDA7CB" , vfmsubadd213pd(ymm1, ymm2, ymm3));
+ TEST_INSTRUCTION("C4E2EDA78C2B80000000" , vfmsubadd213pd(ymm1, ymm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C4E2EDA78C2B80000000" , vfmsubadd213pd(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F2ED48A7CB" , vfmsubadd213pd(zmm1, zmm2, zmm3));
+ TEST_INSTRUCTION("62F2ED48A74C2B02" , vfmsubadd213pd(zmm1, zmm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F2ED48A74C2B02" , vfmsubadd213pd(zmm1, zmm2, zmmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C4E269A7CB" , vfmsubadd213ps(xmm1, xmm2, xmm3));
+ TEST_INSTRUCTION("C4E269A78C2B80000000" , vfmsubadd213ps(xmm1, xmm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C4E269A78C2B80000000" , vfmsubadd213ps(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C4E26DA7CB" , vfmsubadd213ps(ymm1, ymm2, ymm3));
+ TEST_INSTRUCTION("C4E26DA78C2B80000000" , vfmsubadd213ps(ymm1, ymm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C4E26DA78C2B80000000" , vfmsubadd213ps(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F26D48A7CB" , vfmsubadd213ps(zmm1, zmm2, zmm3));
+ TEST_INSTRUCTION("62F26D48A74C2B02" , vfmsubadd213ps(zmm1, zmm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F26D48A74C2B02" , vfmsubadd213ps(zmm1, zmm2, zmmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C4E2E9B7CB" , vfmsubadd231pd(xmm1, xmm2, xmm3));
+ TEST_INSTRUCTION("C4E2E9B78C2B80000000" , vfmsubadd231pd(xmm1, xmm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C4E2E9B78C2B80000000" , vfmsubadd231pd(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C4E2EDB7CB" , vfmsubadd231pd(ymm1, ymm2, ymm3));
+ TEST_INSTRUCTION("C4E2EDB78C2B80000000" , vfmsubadd231pd(ymm1, ymm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C4E2EDB78C2B80000000" , vfmsubadd231pd(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F2ED48B7CB" , vfmsubadd231pd(zmm1, zmm2, zmm3));
+ TEST_INSTRUCTION("62F2ED48B74C2B02" , vfmsubadd231pd(zmm1, zmm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F2ED48B74C2B02" , vfmsubadd231pd(zmm1, zmm2, zmmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C4E269B7CB" , vfmsubadd231ps(xmm1, xmm2, xmm3));
+ TEST_INSTRUCTION("C4E269B78C2B80000000" , vfmsubadd231ps(xmm1, xmm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C4E269B78C2B80000000" , vfmsubadd231ps(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C4E26DB7CB" , vfmsubadd231ps(ymm1, ymm2, ymm3));
+ TEST_INSTRUCTION("C4E26DB78C2B80000000" , vfmsubadd231ps(ymm1, ymm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C4E26DB78C2B80000000" , vfmsubadd231ps(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F26D48B7CB" , vfmsubadd231ps(zmm1, zmm2, zmm3));
+ TEST_INSTRUCTION("62F26D48B74C2B02" , vfmsubadd231ps(zmm1, zmm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F26D48B74C2B02" , vfmsubadd231ps(zmm1, zmm2, zmmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C4E3E95FCC30" , vfmsubaddpd(xmm1, xmm2, xmm3, xmm4));
+ TEST_INSTRUCTION("C4E3E95F8C358000000030" , vfmsubaddpd(xmm1, xmm2, xmm3, ptr(rbp, rsi, 0, 128)));
+ TEST_INSTRUCTION("C4E3E95F8C358000000030" , vfmsubaddpd(xmm1, xmm2, xmm3, xmmword_ptr(rbp, rsi, 0, 128)));
+ TEST_INSTRUCTION("C4E3695F8C2B8000000060" , vfmsubaddpd(xmm1, xmm2, ptr(rbx, rbp, 0, 128), xmm6));
+ TEST_INSTRUCTION("C4E3695F8C2B8000000060" , vfmsubaddpd(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128), xmm6));
+ TEST_INSTRUCTION("C4E3ED5FCC30" , vfmsubaddpd(ymm1, ymm2, ymm3, ymm4));
+ TEST_INSTRUCTION("C4E3ED5F8C358000000030" , vfmsubaddpd(ymm1, ymm2, ymm3, ptr(rbp, rsi, 0, 128)));
+ TEST_INSTRUCTION("C4E3ED5F8C358000000030" , vfmsubaddpd(ymm1, ymm2, ymm3, ymmword_ptr(rbp, rsi, 0, 128)));
+ TEST_INSTRUCTION("C4E36D5F8C2B8000000060" , vfmsubaddpd(ymm1, ymm2, ptr(rbx, rbp, 0, 128), ymm6));
+ TEST_INSTRUCTION("C4E36D5F8C2B8000000060" , vfmsubaddpd(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128), ymm6));
+ TEST_INSTRUCTION("C4E3E95ECC30" , vfmsubaddps(xmm1, xmm2, xmm3, xmm4));
+ TEST_INSTRUCTION("C4E3E95E8C358000000030" , vfmsubaddps(xmm1, xmm2, xmm3, ptr(rbp, rsi, 0, 128)));
+ TEST_INSTRUCTION("C4E3E95E8C358000000030" , vfmsubaddps(xmm1, xmm2, xmm3, xmmword_ptr(rbp, rsi, 0, 128)));
+ TEST_INSTRUCTION("C4E3695E8C2B8000000060" , vfmsubaddps(xmm1, xmm2, ptr(rbx, rbp, 0, 128), xmm6));
+ TEST_INSTRUCTION("C4E3695E8C2B8000000060" , vfmsubaddps(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128), xmm6));
+ TEST_INSTRUCTION("C4E3ED5ECC30" , vfmsubaddps(ymm1, ymm2, ymm3, ymm4));
+ TEST_INSTRUCTION("C4E3ED5E8C358000000030" , vfmsubaddps(ymm1, ymm2, ymm3, ptr(rbp, rsi, 0, 128)));
+ TEST_INSTRUCTION("C4E3ED5E8C358000000030" , vfmsubaddps(ymm1, ymm2, ymm3, ymmword_ptr(rbp, rsi, 0, 128)));
+ TEST_INSTRUCTION("C4E36D5E8C2B8000000060" , vfmsubaddps(ymm1, ymm2, ptr(rbx, rbp, 0, 128), ymm6));
+ TEST_INSTRUCTION("C4E36D5E8C2B8000000060" , vfmsubaddps(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128), ymm6));
+ TEST_INSTRUCTION("C4E3E96DCC30" , vfmsubpd(xmm1, xmm2, xmm3, xmm4));
+ TEST_INSTRUCTION("C4E3E96D8C358000000030" , vfmsubpd(xmm1, xmm2, xmm3, ptr(rbp, rsi, 0, 128)));
+ TEST_INSTRUCTION("C4E3E96D8C358000000030" , vfmsubpd(xmm1, xmm2, xmm3, xmmword_ptr(rbp, rsi, 0, 128)));
+ TEST_INSTRUCTION("C4E3696D8C2B8000000060" , vfmsubpd(xmm1, xmm2, ptr(rbx, rbp, 0, 128), xmm6));
+ TEST_INSTRUCTION("C4E3696D8C2B8000000060" , vfmsubpd(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128), xmm6));
+ TEST_INSTRUCTION("C4E3ED6DCC30" , vfmsubpd(ymm1, ymm2, ymm3, ymm4));
+ TEST_INSTRUCTION("C4E3ED6D8C358000000030" , vfmsubpd(ymm1, ymm2, ymm3, ptr(rbp, rsi, 0, 128)));
+ TEST_INSTRUCTION("C4E3ED6D8C358000000030" , vfmsubpd(ymm1, ymm2, ymm3, ymmword_ptr(rbp, rsi, 0, 128)));
+ TEST_INSTRUCTION("C4E36D6D8C2B8000000060" , vfmsubpd(ymm1, ymm2, ptr(rbx, rbp, 0, 128), ymm6));
+ TEST_INSTRUCTION("C4E36D6D8C2B8000000060" , vfmsubpd(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128), ymm6));
+ TEST_INSTRUCTION("C4E3E96CCC30" , vfmsubps(xmm1, xmm2, xmm3, xmm4));
+ TEST_INSTRUCTION("C4E3E96C8C358000000030" , vfmsubps(xmm1, xmm2, xmm3, ptr(rbp, rsi, 0, 128)));
+ TEST_INSTRUCTION("C4E3E96C8C358000000030" , vfmsubps(xmm1, xmm2, xmm3, xmmword_ptr(rbp, rsi, 0, 128)));
+ TEST_INSTRUCTION("C4E3696C8C2B8000000060" , vfmsubps(xmm1, xmm2, ptr(rbx, rbp, 0, 128), xmm6));
+ TEST_INSTRUCTION("C4E3696C8C2B8000000060" , vfmsubps(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128), xmm6));
+ TEST_INSTRUCTION("C4E3ED6CCC30" , vfmsubps(ymm1, ymm2, ymm3, ymm4));
+ TEST_INSTRUCTION("C4E3ED6C8C358000000030" , vfmsubps(ymm1, ymm2, ymm3, ptr(rbp, rsi, 0, 128)));
+ TEST_INSTRUCTION("C4E3ED6C8C358000000030" , vfmsubps(ymm1, ymm2, ymm3, ymmword_ptr(rbp, rsi, 0, 128)));
+ TEST_INSTRUCTION("C4E36D6C8C2B8000000060" , vfmsubps(ymm1, ymm2, ptr(rbx, rbp, 0, 128), ymm6));
+ TEST_INSTRUCTION("C4E36D6C8C2B8000000060" , vfmsubps(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128), ymm6));
+ TEST_INSTRUCTION("C4E3E96FCC30" , vfmsubsd(xmm1, xmm2, xmm3, xmm4));
+ TEST_INSTRUCTION("C4E3E96F8C358000000030" , vfmsubsd(xmm1, xmm2, xmm3, ptr(rbp, rsi, 0, 128)));
+ TEST_INSTRUCTION("C4E3E96F8C358000000030" , vfmsubsd(xmm1, xmm2, xmm3, qword_ptr(rbp, rsi, 0, 128)));
+ TEST_INSTRUCTION("C4E3696F8C2B8000000060" , vfmsubsd(xmm1, xmm2, ptr(rbx, rbp, 0, 128), xmm6));
+ TEST_INSTRUCTION("C4E3696F8C2B8000000060" , vfmsubsd(xmm1, xmm2, qword_ptr(rbx, rbp, 0, 128), xmm6));
+ TEST_INSTRUCTION("C4E3E96ECC30" , vfmsubss(xmm1, xmm2, xmm3, xmm4));
+ TEST_INSTRUCTION("C4E3E96E8C358000000030" , vfmsubss(xmm1, xmm2, xmm3, ptr(rbp, rsi, 0, 128)));
+ TEST_INSTRUCTION("C4E3E96E8C358000000030" , vfmsubss(xmm1, xmm2, xmm3, dword_ptr(rbp, rsi, 0, 128)));
+ TEST_INSTRUCTION("C4E3696E8C2B8000000060" , vfmsubss(xmm1, xmm2, ptr(rbx, rbp, 0, 128), xmm6));
+ TEST_INSTRUCTION("C4E3696E8C2B8000000060" , vfmsubss(xmm1, xmm2, dword_ptr(rbx, rbp, 0, 128), xmm6));
+ TEST_INSTRUCTION("C4E2E99CCB" , vfnmadd132pd(xmm1, xmm2, xmm3));
+ TEST_INSTRUCTION("C4E2E99C8C2B80000000" , vfnmadd132pd(xmm1, xmm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C4E2E99C8C2B80000000" , vfnmadd132pd(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C4E2ED9CCB" , vfnmadd132pd(ymm1, ymm2, ymm3));
+ TEST_INSTRUCTION("C4E2ED9C8C2B80000000" , vfnmadd132pd(ymm1, ymm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C4E2ED9C8C2B80000000" , vfnmadd132pd(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F2ED489CCB" , vfnmadd132pd(zmm1, zmm2, zmm3));
+ TEST_INSTRUCTION("62F2ED489C4C2B02" , vfnmadd132pd(zmm1, zmm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F2ED489C4C2B02" , vfnmadd132pd(zmm1, zmm2, zmmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C4E2699CCB" , vfnmadd132ps(xmm1, xmm2, xmm3));
+ TEST_INSTRUCTION("C4E2699C8C2B80000000" , vfnmadd132ps(xmm1, xmm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C4E2699C8C2B80000000" , vfnmadd132ps(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C4E26D9CCB" , vfnmadd132ps(ymm1, ymm2, ymm3));
+ TEST_INSTRUCTION("C4E26D9C8C2B80000000" , vfnmadd132ps(ymm1, ymm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C4E26D9C8C2B80000000" , vfnmadd132ps(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F26D489CCB" , vfnmadd132ps(zmm1, zmm2, zmm3));
+ TEST_INSTRUCTION("62F26D489C4C2B02" , vfnmadd132ps(zmm1, zmm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F26D489C4C2B02" , vfnmadd132ps(zmm1, zmm2, zmmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C4E2E99DCB" , vfnmadd132sd(xmm1, xmm2, xmm3));
+ TEST_INSTRUCTION("C4E2E99D8C2B80000000" , vfnmadd132sd(xmm1, xmm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C4E2E99D8C2B80000000" , vfnmadd132sd(xmm1, xmm2, qword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C4E2699DCB" , vfnmadd132ss(xmm1, xmm2, xmm3));
+ TEST_INSTRUCTION("C4E2699D8C2B80000000" , vfnmadd132ss(xmm1, xmm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C4E2699D8C2B80000000" , vfnmadd132ss(xmm1, xmm2, dword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C4E2E9ACCB" , vfnmadd213pd(xmm1, xmm2, xmm3));
+ TEST_INSTRUCTION("C4E2E9AC8C2B80000000" , vfnmadd213pd(xmm1, xmm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C4E2E9AC8C2B80000000" , vfnmadd213pd(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C4E2EDACCB" , vfnmadd213pd(ymm1, ymm2, ymm3));
+ TEST_INSTRUCTION("C4E2EDAC8C2B80000000" , vfnmadd213pd(ymm1, ymm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C4E2EDAC8C2B80000000" , vfnmadd213pd(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F2ED48ACCB" , vfnmadd213pd(zmm1, zmm2, zmm3));
+ TEST_INSTRUCTION("62F2ED48AC4C2B02" , vfnmadd213pd(zmm1, zmm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F2ED48AC4C2B02" , vfnmadd213pd(zmm1, zmm2, zmmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C4E269ACCB" , vfnmadd213ps(xmm1, xmm2, xmm3));
+ TEST_INSTRUCTION("C4E269AC8C2B80000000" , vfnmadd213ps(xmm1, xmm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C4E269AC8C2B80000000" , vfnmadd213ps(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C4E26DACCB" , vfnmadd213ps(ymm1, ymm2, ymm3));
+ TEST_INSTRUCTION("C4E26DAC8C2B80000000" , vfnmadd213ps(ymm1, ymm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C4E26DAC8C2B80000000" , vfnmadd213ps(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F26D48ACCB" , vfnmadd213ps(zmm1, zmm2, zmm3));
+ TEST_INSTRUCTION("62F26D48AC4C2B02" , vfnmadd213ps(zmm1, zmm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F26D48AC4C2B02" , vfnmadd213ps(zmm1, zmm2, zmmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C4E2E9ADCB" , vfnmadd213sd(xmm1, xmm2, xmm3));
+ TEST_INSTRUCTION("C4E2E9AD8C2B80000000" , vfnmadd213sd(xmm1, xmm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C4E2E9AD8C2B80000000" , vfnmadd213sd(xmm1, xmm2, qword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C4E269ADCB" , vfnmadd213ss(xmm1, xmm2, xmm3));
+ TEST_INSTRUCTION("C4E269AD8C2B80000000" , vfnmadd213ss(xmm1, xmm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C4E269AD8C2B80000000" , vfnmadd213ss(xmm1, xmm2, dword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C4E2E9BCCB" , vfnmadd231pd(xmm1, xmm2, xmm3));
+ TEST_INSTRUCTION("C4E2E9BC8C2B80000000" , vfnmadd231pd(xmm1, xmm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C4E2E9BC8C2B80000000" , vfnmadd231pd(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C4E2EDBCCB" , vfnmadd231pd(ymm1, ymm2, ymm3));
+ TEST_INSTRUCTION("C4E2EDBC8C2B80000000" , vfnmadd231pd(ymm1, ymm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C4E2EDBC8C2B80000000" , vfnmadd231pd(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F2ED48BCCB" , vfnmadd231pd(zmm1, zmm2, zmm3));
+ TEST_INSTRUCTION("62F2ED48BC4C2B02" , vfnmadd231pd(zmm1, zmm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F2ED48BC4C2B02" , vfnmadd231pd(zmm1, zmm2, zmmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C4E269BCCB" , vfnmadd231ps(xmm1, xmm2, xmm3));
+ TEST_INSTRUCTION("C4E269BC8C2B80000000" , vfnmadd231ps(xmm1, xmm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C4E269BC8C2B80000000" , vfnmadd231ps(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C4E26DBCCB" , vfnmadd231ps(ymm1, ymm2, ymm3));
+ TEST_INSTRUCTION("C4E26DBC8C2B80000000" , vfnmadd231ps(ymm1, ymm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C4E26DBC8C2B80000000" , vfnmadd231ps(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F26D48BCCB" , vfnmadd231ps(zmm1, zmm2, zmm3));
+ TEST_INSTRUCTION("62F26D48BC4C2B02" , vfnmadd231ps(zmm1, zmm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F26D48BC4C2B02" , vfnmadd231ps(zmm1, zmm2, zmmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C4E2E9BDCB" , vfnmadd231sd(xmm1, xmm2, xmm3));
+ TEST_INSTRUCTION("C4E2E9BD8C2B80000000" , vfnmadd231sd(xmm1, xmm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C4E2E9BD8C2B80000000" , vfnmadd231sd(xmm1, xmm2, qword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C4E269BDCB" , vfnmadd231ss(xmm1, xmm2, xmm3));
+ TEST_INSTRUCTION("C4E269BD8C2B80000000" , vfnmadd231ss(xmm1, xmm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C4E269BD8C2B80000000" , vfnmadd231ss(xmm1, xmm2, dword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C4E3E979CC30" , vfnmaddpd(xmm1, xmm2, xmm3, xmm4));
+ TEST_INSTRUCTION("C4E3E9798C358000000030" , vfnmaddpd(xmm1, xmm2, xmm3, ptr(rbp, rsi, 0, 128)));
+ TEST_INSTRUCTION("C4E3E9798C358000000030" , vfnmaddpd(xmm1, xmm2, xmm3, xmmword_ptr(rbp, rsi, 0, 128)));
+ TEST_INSTRUCTION("C4E369798C2B8000000060" , vfnmaddpd(xmm1, xmm2, ptr(rbx, rbp, 0, 128), xmm6));
+ TEST_INSTRUCTION("C4E369798C2B8000000060" , vfnmaddpd(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128), xmm6));
+ TEST_INSTRUCTION("C4E3ED79CC30" , vfnmaddpd(ymm1, ymm2, ymm3, ymm4));
+ TEST_INSTRUCTION("C4E3ED798C358000000030" , vfnmaddpd(ymm1, ymm2, ymm3, ptr(rbp, rsi, 0, 128)));
+ TEST_INSTRUCTION("C4E3ED798C358000000030" , vfnmaddpd(ymm1, ymm2, ymm3, ymmword_ptr(rbp, rsi, 0, 128)));
+ TEST_INSTRUCTION("C4E36D798C2B8000000060" , vfnmaddpd(ymm1, ymm2, ptr(rbx, rbp, 0, 128), ymm6));
+ TEST_INSTRUCTION("C4E36D798C2B8000000060" , vfnmaddpd(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128), ymm6));
+ TEST_INSTRUCTION("C4E3E978CC30" , vfnmaddps(xmm1, xmm2, xmm3, xmm4));
+ TEST_INSTRUCTION("C4E3E9788C358000000030" , vfnmaddps(xmm1, xmm2, xmm3, ptr(rbp, rsi, 0, 128)));
+ TEST_INSTRUCTION("C4E3E9788C358000000030" , vfnmaddps(xmm1, xmm2, xmm3, xmmword_ptr(rbp, rsi, 0, 128)));
+ TEST_INSTRUCTION("C4E369788C2B8000000060" , vfnmaddps(xmm1, xmm2, ptr(rbx, rbp, 0, 128), xmm6));
+ TEST_INSTRUCTION("C4E369788C2B8000000060" , vfnmaddps(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128), xmm6));
+ TEST_INSTRUCTION("C4E3ED78CC30" , vfnmaddps(ymm1, ymm2, ymm3, ymm4));
+ TEST_INSTRUCTION("C4E3ED788C358000000030" , vfnmaddps(ymm1, ymm2, ymm3, ptr(rbp, rsi, 0, 128)));
+ TEST_INSTRUCTION("C4E3ED788C358000000030" , vfnmaddps(ymm1, ymm2, ymm3, ymmword_ptr(rbp, rsi, 0, 128)));
+ TEST_INSTRUCTION("C4E36D788C2B8000000060" , vfnmaddps(ymm1, ymm2, ptr(rbx, rbp, 0, 128), ymm6));
+ TEST_INSTRUCTION("C4E36D788C2B8000000060" , vfnmaddps(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128), ymm6));
+ TEST_INSTRUCTION("C4E3E97BCC30" , vfnmaddsd(xmm1, xmm2, xmm3, xmm4));
+ TEST_INSTRUCTION("C4E3E97B8C358000000030" , vfnmaddsd(xmm1, xmm2, xmm3, ptr(rbp, rsi, 0, 128)));
+ TEST_INSTRUCTION("C4E3E97B8C358000000030" , vfnmaddsd(xmm1, xmm2, xmm3, qword_ptr(rbp, rsi, 0, 128)));
+ TEST_INSTRUCTION("C4E3697B8C2B8000000060" , vfnmaddsd(xmm1, xmm2, ptr(rbx, rbp, 0, 128), xmm6));
+ TEST_INSTRUCTION("C4E3697B8C2B8000000060" , vfnmaddsd(xmm1, xmm2, qword_ptr(rbx, rbp, 0, 128), xmm6));
+ TEST_INSTRUCTION("C4E3E97ACC30" , vfnmaddss(xmm1, xmm2, xmm3, xmm4));
+ TEST_INSTRUCTION("C4E3E97A8C358000000030" , vfnmaddss(xmm1, xmm2, xmm3, ptr(rbp, rsi, 0, 128)));
+ TEST_INSTRUCTION("C4E3E97A8C358000000030" , vfnmaddss(xmm1, xmm2, xmm3, dword_ptr(rbp, rsi, 0, 128)));
+ TEST_INSTRUCTION("C4E3697A8C2B8000000060" , vfnmaddss(xmm1, xmm2, ptr(rbx, rbp, 0, 128), xmm6));
+ TEST_INSTRUCTION("C4E3697A8C2B8000000060" , vfnmaddss(xmm1, xmm2, dword_ptr(rbx, rbp, 0, 128), xmm6));
+ TEST_INSTRUCTION("C4E2E99ECB" , vfnmsub132pd(xmm1, xmm2, xmm3));
+ TEST_INSTRUCTION("C4E2E99E8C2B80000000" , vfnmsub132pd(xmm1, xmm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C4E2E99E8C2B80000000" , vfnmsub132pd(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C4E2ED9ECB" , vfnmsub132pd(ymm1, ymm2, ymm3));
+ TEST_INSTRUCTION("C4E2ED9E8C2B80000000" , vfnmsub132pd(ymm1, ymm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C4E2ED9E8C2B80000000" , vfnmsub132pd(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F2ED489ECB" , vfnmsub132pd(zmm1, zmm2, zmm3));
+ TEST_INSTRUCTION("62F2ED489E4C2B02" , vfnmsub132pd(zmm1, zmm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F2ED489E4C2B02" , vfnmsub132pd(zmm1, zmm2, zmmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C4E2699ECB" , vfnmsub132ps(xmm1, xmm2, xmm3));
+ TEST_INSTRUCTION("C4E2699E8C2B80000000" , vfnmsub132ps(xmm1, xmm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C4E2699E8C2B80000000" , vfnmsub132ps(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C4E26D9ECB" , vfnmsub132ps(ymm1, ymm2, ymm3));
+ TEST_INSTRUCTION("C4E26D9E8C2B80000000" , vfnmsub132ps(ymm1, ymm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C4E26D9E8C2B80000000" , vfnmsub132ps(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F26D489ECB" , vfnmsub132ps(zmm1, zmm2, zmm3));
+ TEST_INSTRUCTION("62F26D489E4C2B02" , vfnmsub132ps(zmm1, zmm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F26D489E4C2B02" , vfnmsub132ps(zmm1, zmm2, zmmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C4E2E99FCB" , vfnmsub132sd(xmm1, xmm2, xmm3));
+ TEST_INSTRUCTION("C4E2E99F8C2B80000000" , vfnmsub132sd(xmm1, xmm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C4E2E99F8C2B80000000" , vfnmsub132sd(xmm1, xmm2, qword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C4E2699FCB" , vfnmsub132ss(xmm1, xmm2, xmm3));
+ TEST_INSTRUCTION("C4E2699F8C2B80000000" , vfnmsub132ss(xmm1, xmm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C4E2699F8C2B80000000" , vfnmsub132ss(xmm1, xmm2, dword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C4E2E9AECB" , vfnmsub213pd(xmm1, xmm2, xmm3));
+ TEST_INSTRUCTION("C4E2E9AE8C2B80000000" , vfnmsub213pd(xmm1, xmm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C4E2E9AE8C2B80000000" , vfnmsub213pd(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C4E2EDAECB" , vfnmsub213pd(ymm1, ymm2, ymm3));
+ TEST_INSTRUCTION("C4E2EDAE8C2B80000000" , vfnmsub213pd(ymm1, ymm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C4E2EDAE8C2B80000000" , vfnmsub213pd(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F2ED48AECB" , vfnmsub213pd(zmm1, zmm2, zmm3));
+ TEST_INSTRUCTION("62F2ED48AE4C2B02" , vfnmsub213pd(zmm1, zmm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F2ED48AE4C2B02" , vfnmsub213pd(zmm1, zmm2, zmmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C4E269AECB" , vfnmsub213ps(xmm1, xmm2, xmm3));
+ TEST_INSTRUCTION("C4E269AE8C2B80000000" , vfnmsub213ps(xmm1, xmm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C4E269AE8C2B80000000" , vfnmsub213ps(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C4E26DAECB" , vfnmsub213ps(ymm1, ymm2, ymm3));
+ TEST_INSTRUCTION("C4E26DAE8C2B80000000" , vfnmsub213ps(ymm1, ymm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C4E26DAE8C2B80000000" , vfnmsub213ps(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F26D48AECB" , vfnmsub213ps(zmm1, zmm2, zmm3));
+ TEST_INSTRUCTION("62F26D48AE4C2B02" , vfnmsub213ps(zmm1, zmm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F26D48AE4C2B02" , vfnmsub213ps(zmm1, zmm2, zmmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C4E2E9AFCB" , vfnmsub213sd(xmm1, xmm2, xmm3));
+ TEST_INSTRUCTION("C4E2E9AF8C2B80000000" , vfnmsub213sd(xmm1, xmm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C4E2E9AF8C2B80000000" , vfnmsub213sd(xmm1, xmm2, qword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C4E269AFCB" , vfnmsub213ss(xmm1, xmm2, xmm3));
+ TEST_INSTRUCTION("C4E269AF8C2B80000000" , vfnmsub213ss(xmm1, xmm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C4E269AF8C2B80000000" , vfnmsub213ss(xmm1, xmm2, dword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C4E2E9BECB" , vfnmsub231pd(xmm1, xmm2, xmm3));
+ TEST_INSTRUCTION("C4E2E9BE8C2B80000000" , vfnmsub231pd(xmm1, xmm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C4E2E9BE8C2B80000000" , vfnmsub231pd(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C4E2EDBECB" , vfnmsub231pd(ymm1, ymm2, ymm3));
+ TEST_INSTRUCTION("C4E2EDBE8C2B80000000" , vfnmsub231pd(ymm1, ymm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C4E2EDBE8C2B80000000" , vfnmsub231pd(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F2ED48BECB" , vfnmsub231pd(zmm1, zmm2, zmm3));
+ TEST_INSTRUCTION("62F2ED48BE4C2B02" , vfnmsub231pd(zmm1, zmm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F2ED48BE4C2B02" , vfnmsub231pd(zmm1, zmm2, zmmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C4E269BECB" , vfnmsub231ps(xmm1, xmm2, xmm3));
+ TEST_INSTRUCTION("C4E269BE8C2B80000000" , vfnmsub231ps(xmm1, xmm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C4E269BE8C2B80000000" , vfnmsub231ps(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C4E26DBECB" , vfnmsub231ps(ymm1, ymm2, ymm3));
+ TEST_INSTRUCTION("C4E26DBE8C2B80000000" , vfnmsub231ps(ymm1, ymm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C4E26DBE8C2B80000000" , vfnmsub231ps(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F26D48BECB" , vfnmsub231ps(zmm1, zmm2, zmm3));
+ TEST_INSTRUCTION("62F26D48BE4C2B02" , vfnmsub231ps(zmm1, zmm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F26D48BE4C2B02" , vfnmsub231ps(zmm1, zmm2, zmmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C4E2E9BFCB" , vfnmsub231sd(xmm1, xmm2, xmm3));
+ TEST_INSTRUCTION("C4E2E9BF8C2B80000000" , vfnmsub231sd(xmm1, xmm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C4E2E9BF8C2B80000000" , vfnmsub231sd(xmm1, xmm2, qword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C4E269BFCB" , vfnmsub231ss(xmm1, xmm2, xmm3));
+ TEST_INSTRUCTION("C4E269BF8C2B80000000" , vfnmsub231ss(xmm1, xmm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C4E269BF8C2B80000000" , vfnmsub231ss(xmm1, xmm2, dword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C4E3E97DCC30" , vfnmsubpd(xmm1, xmm2, xmm3, xmm4));
+ TEST_INSTRUCTION("C4E3E97D8C358000000030" , vfnmsubpd(xmm1, xmm2, xmm3, ptr(rbp, rsi, 0, 128)));
+ TEST_INSTRUCTION("C4E3E97D8C358000000030" , vfnmsubpd(xmm1, xmm2, xmm3, xmmword_ptr(rbp, rsi, 0, 128)));
+ TEST_INSTRUCTION("C4E3697D8C2B8000000060" , vfnmsubpd(xmm1, xmm2, ptr(rbx, rbp, 0, 128), xmm6));
+ TEST_INSTRUCTION("C4E3697D8C2B8000000060" , vfnmsubpd(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128), xmm6));
+ TEST_INSTRUCTION("C4E3ED7DCC30" , vfnmsubpd(ymm1, ymm2, ymm3, ymm4));
+ TEST_INSTRUCTION("C4E3ED7D8C358000000030" , vfnmsubpd(ymm1, ymm2, ymm3, ptr(rbp, rsi, 0, 128)));
+ TEST_INSTRUCTION("C4E3ED7D8C358000000030" , vfnmsubpd(ymm1, ymm2, ymm3, ymmword_ptr(rbp, rsi, 0, 128)));
+ TEST_INSTRUCTION("C4E36D7D8C2B8000000060" , vfnmsubpd(ymm1, ymm2, ptr(rbx, rbp, 0, 128), ymm6));
+ TEST_INSTRUCTION("C4E36D7D8C2B8000000060" , vfnmsubpd(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128), ymm6));
+ TEST_INSTRUCTION("C4E3E97CCC30" , vfnmsubps(xmm1, xmm2, xmm3, xmm4));
+ TEST_INSTRUCTION("C4E3E97C8C358000000030" , vfnmsubps(xmm1, xmm2, xmm3, ptr(rbp, rsi, 0, 128)));
+ TEST_INSTRUCTION("C4E3E97C8C358000000030" , vfnmsubps(xmm1, xmm2, xmm3, xmmword_ptr(rbp, rsi, 0, 128)));
+ TEST_INSTRUCTION("C4E3697C8C2B8000000060" , vfnmsubps(xmm1, xmm2, ptr(rbx, rbp, 0, 128), xmm6));
+ TEST_INSTRUCTION("C4E3697C8C2B8000000060" , vfnmsubps(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128), xmm6));
+ TEST_INSTRUCTION("C4E3ED7CCC30" , vfnmsubps(ymm1, ymm2, ymm3, ymm4));
+ TEST_INSTRUCTION("C4E3ED7C8C358000000030" , vfnmsubps(ymm1, ymm2, ymm3, ptr(rbp, rsi, 0, 128)));
+ TEST_INSTRUCTION("C4E3ED7C8C358000000030" , vfnmsubps(ymm1, ymm2, ymm3, ymmword_ptr(rbp, rsi, 0, 128)));
+ TEST_INSTRUCTION("C4E36D7C8C2B8000000060" , vfnmsubps(ymm1, ymm2, ptr(rbx, rbp, 0, 128), ymm6));
+ TEST_INSTRUCTION("C4E36D7C8C2B8000000060" , vfnmsubps(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128), ymm6));
+ TEST_INSTRUCTION("C4E3E97FCC30" , vfnmsubsd(xmm1, xmm2, xmm3, xmm4));
+ TEST_INSTRUCTION("C4E3E97F8C358000000030" , vfnmsubsd(xmm1, xmm2, xmm3, ptr(rbp, rsi, 0, 128)));
+ TEST_INSTRUCTION("C4E3E97F8C358000000030" , vfnmsubsd(xmm1, xmm2, xmm3, qword_ptr(rbp, rsi, 0, 128)));
+ TEST_INSTRUCTION("C4E3697F8C2B8000000060" , vfnmsubsd(xmm1, xmm2, ptr(rbx, rbp, 0, 128), xmm6));
+ TEST_INSTRUCTION("C4E3697F8C2B8000000060" , vfnmsubsd(xmm1, xmm2, qword_ptr(rbx, rbp, 0, 128), xmm6));
+ TEST_INSTRUCTION("C4E3E97ECC30" , vfnmsubss(xmm1, xmm2, xmm3, xmm4));
+ TEST_INSTRUCTION("C4E3E97E8C358000000030" , vfnmsubss(xmm1, xmm2, xmm3, ptr(rbp, rsi, 0, 128)));
+ TEST_INSTRUCTION("C4E3E97E8C358000000030" , vfnmsubss(xmm1, xmm2, xmm3, dword_ptr(rbp, rsi, 0, 128)));
+ TEST_INSTRUCTION("C4E3697E8C2B8000000060" , vfnmsubss(xmm1, xmm2, ptr(rbx, rbp, 0, 128), xmm6));
+ TEST_INSTRUCTION("C4E3697E8C2B8000000060" , vfnmsubss(xmm1, xmm2, dword_ptr(rbx, rbp, 0, 128), xmm6));
+ TEST_INSTRUCTION("62F3FD0866CA01" , vfpclasspd(k1, xmm2, 1));
+ TEST_INSTRUCTION("62F3FD2866CA01" , vfpclasspd(k1, ymm2, 1));
+ TEST_INSTRUCTION("62F3FD4866CA01" , vfpclasspd(k1, zmm2, 1));
+ TEST_INSTRUCTION("62F3FD08664C1A0801" , vfpclasspd(k1, xmmword_ptr(rdx, rbx, 0, 128), 1));
+ TEST_INSTRUCTION("62F3FD28664C1A0401" , vfpclasspd(k1, ymmword_ptr(rdx, rbx, 0, 128), 1));
+ TEST_INSTRUCTION("62F3FD48664C1A0201" , vfpclasspd(k1, zmmword_ptr(rdx, rbx, 0, 128), 1));
+ TEST_INSTRUCTION("62F37D0866CA01" , vfpclassps(k1, xmm2, 1));
+ TEST_INSTRUCTION("62F37D2866CA01" , vfpclassps(k1, ymm2, 1));
+ TEST_INSTRUCTION("62F37D4866CA01" , vfpclassps(k1, zmm2, 1));
+ TEST_INSTRUCTION("62F37D08664C1A0801" , vfpclassps(k1, xmmword_ptr(rdx, rbx, 0, 128), 1));
+ TEST_INSTRUCTION("62F37D28664C1A0401" , vfpclassps(k1, ymmword_ptr(rdx, rbx, 0, 128), 1));
+ TEST_INSTRUCTION("62F37D48664C1A0201" , vfpclassps(k1, zmmword_ptr(rdx, rbx, 0, 128), 1));
+ TEST_INSTRUCTION("62F3FD0867CA01" , vfpclasssd(k1, xmm2, 1));
+ TEST_INSTRUCTION("62F3FD08674C1A1001" , vfpclasssd(k1, ptr(rdx, rbx, 0, 128), 1));
+ TEST_INSTRUCTION("62F3FD08674C1A1001" , vfpclasssd(k1, qword_ptr(rdx, rbx, 0, 128), 1));
+ TEST_INSTRUCTION("62F37D0867CA01" , vfpclassss(k1, xmm2, 1));
+ TEST_INSTRUCTION("62F37D08674C1A2001" , vfpclassss(k1, ptr(rdx, rbx, 0, 128), 1));
+ TEST_INSTRUCTION("62F37D08674C1A2001" , vfpclassss(k1, dword_ptr(rdx, rbx, 0, 128), 1));
+ TEST_INSTRUCTION("8FE97881CA" , vfrczpd(xmm1, xmm2));
+ TEST_INSTRUCTION("8FE978818C1A80000000" , vfrczpd(xmm1, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("8FE978818C1A80000000" , vfrczpd(xmm1, xmmword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("8FE97C81CA" , vfrczpd(ymm1, ymm2));
+ TEST_INSTRUCTION("8FE97C818C1A80000000" , vfrczpd(ymm1, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("8FE97C818C1A80000000" , vfrczpd(ymm1, ymmword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("8FE97880CA" , vfrczps(xmm1, xmm2));
+ TEST_INSTRUCTION("8FE978808C1A80000000" , vfrczps(xmm1, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("8FE978808C1A80000000" , vfrczps(xmm1, xmmword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("8FE97C80CA" , vfrczps(ymm1, ymm2));
+ TEST_INSTRUCTION("8FE97C808C1A80000000" , vfrczps(ymm1, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("8FE97C808C1A80000000" , vfrczps(ymm1, ymmword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("8FE97883CA" , vfrczsd(xmm1, xmm2));
+ TEST_INSTRUCTION("8FE978838C1A80000000" , vfrczsd(xmm1, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("8FE978838C1A80000000" , vfrczsd(xmm1, qword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("8FE97882CA" , vfrczss(xmm1, xmm2));
+ TEST_INSTRUCTION("8FE978828C1A80000000" , vfrczss(xmm1, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("8FE978828C1A80000000" , vfrczss(xmm1, dword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("C4E2D9928C1A80000000" , vgatherdpd(xmm1, ptr(rdx, xmm3, 0, 128), xmm4));
+ TEST_INSTRUCTION("C4E2DD928C1A80000000" , vgatherdpd(ymm1, ptr(rdx, xmm3, 0, 128), ymm4));
+ TEST_INSTRUCTION("62F2FD09924C1A10" , k(k1).vgatherdpd(xmm1, ptr(rdx, xmm3, 0, 128)));
+ TEST_INSTRUCTION("62F2FD29924C1A10" , k(k1).vgatherdpd(ymm1, ptr(rdx, xmm3, 0, 128)));
+ TEST_INSTRUCTION("62F2FD49924C1A10" , k(k1).vgatherdpd(zmm1, ptr(rdx, ymm3, 0, 128)));
+ TEST_INSTRUCTION("C4E259928C1A80000000" , vgatherdps(xmm1, ptr(rdx, xmm3, 0, 128), xmm4));
+ TEST_INSTRUCTION("C4E25D928C1A80000000" , vgatherdps(ymm1, ptr(rdx, ymm3, 0, 128), ymm4));
+ TEST_INSTRUCTION("62F27D09924C1A20" , k(k1).vgatherdps(xmm1, ptr(rdx, xmm3, 0, 128)));
+ TEST_INSTRUCTION("62F27D29924C1A20" , k(k1).vgatherdps(ymm1, ptr(rdx, ymm3, 0, 128)));
+ TEST_INSTRUCTION("62F27D49924C1A20" , k(k1).vgatherdps(zmm1, ptr(rdx, zmm3, 0, 128)));
+ TEST_INSTRUCTION("62F2FD49C64C1110" , k(k1).vgatherpf0dpd(ptr(rcx, ymm2, 0, 128)));
+ TEST_INSTRUCTION("62F27D49C64C1120" , k(k1).vgatherpf0dps(ptr(rcx, zmm2, 0, 128)));
+ TEST_INSTRUCTION("62F2FD49C74C1110" , k(k1).vgatherpf0qpd(ptr(rcx, zmm2, 0, 128)));
+ TEST_INSTRUCTION("62F27D49C74C1120" , k(k1).vgatherpf0qps(ptr(rcx, zmm2, 0, 128)));
+ TEST_INSTRUCTION("62F2FD49C6541110" , k(k1).vgatherpf1dpd(ptr(rcx, ymm2, 0, 128)));
+ TEST_INSTRUCTION("62F27D49C6541120" , k(k1).vgatherpf1dps(ptr(rcx, zmm2, 0, 128)));
+ TEST_INSTRUCTION("62F2FD49C7541110" , k(k1).vgatherpf1qpd(ptr(rcx, zmm2, 0, 128)));
+ TEST_INSTRUCTION("62F27D49C7541120" , k(k1).vgatherpf1qps(ptr(rcx, zmm2, 0, 128)));
+ TEST_INSTRUCTION("C4E2D9938C1A80000000" , vgatherqpd(xmm1, ptr(rdx, xmm3, 0, 128), xmm4));
+ TEST_INSTRUCTION("C4E2DD938C1A80000000" , vgatherqpd(ymm1, ptr(rdx, ymm3, 0, 128), ymm4));
+ TEST_INSTRUCTION("62F2FD09934C1A10" , k(k1).vgatherqpd(xmm1, ptr(rdx, xmm3, 0, 128)));
+ TEST_INSTRUCTION("62F2FD29934C1A10" , k(k1).vgatherqpd(ymm1, ptr(rdx, ymm3, 0, 128)));
+ TEST_INSTRUCTION("62F2FD49934C1A10" , k(k1).vgatherqpd(zmm1, ptr(rdx, zmm3, 0, 128)));
+ TEST_INSTRUCTION("C4E259938C1A80000000" , vgatherqps(xmm1, ptr(rdx, xmm3, 0, 128), xmm4));
+ TEST_INSTRUCTION("C4E25D938C1A80000000" , vgatherqps(xmm1, ptr(rdx, ymm3, 0, 128), xmm4));
+ TEST_INSTRUCTION("62F27D09934C1A20" , k(k1).vgatherqps(xmm1, ptr(rdx, xmm3, 0, 128)));
+ TEST_INSTRUCTION("62F27D29934C1A20" , k(k1).vgatherqps(xmm1, ptr(rdx, ymm3, 0, 128)));
+ TEST_INSTRUCTION("62F27D49934C1A20" , k(k1).vgatherqps(ymm1, ptr(rdx, zmm3, 0, 128)));
+ TEST_INSTRUCTION("62F2FD0842CA" , vgetexppd(xmm1, xmm2));
+ TEST_INSTRUCTION("62F2FD08424C1A08" , vgetexppd(xmm1, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("62F2FD08424C1A08" , vgetexppd(xmm1, xmmword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("62F2FD2842CA" , vgetexppd(ymm1, ymm2));
+ TEST_INSTRUCTION("62F2FD28424C1A04" , vgetexppd(ymm1, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("62F2FD28424C1A04" , vgetexppd(ymm1, ymmword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("62F2FD4842CA" , vgetexppd(zmm1, zmm2));
+ TEST_INSTRUCTION("62F2FD48424C1A02" , vgetexppd(zmm1, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("62F2FD48424C1A02" , vgetexppd(zmm1, zmmword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("62F27D0842CA" , vgetexpps(xmm1, xmm2));
+ TEST_INSTRUCTION("62F27D08424C1A08" , vgetexpps(xmm1, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("62F27D08424C1A08" , vgetexpps(xmm1, xmmword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("62F27D2842CA" , vgetexpps(ymm1, ymm2));
+ TEST_INSTRUCTION("62F27D28424C1A04" , vgetexpps(ymm1, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("62F27D28424C1A04" , vgetexpps(ymm1, ymmword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("62F27D4842CA" , vgetexpps(zmm1, zmm2));
+ TEST_INSTRUCTION("62F27D48424C1A02" , vgetexpps(zmm1, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("62F27D48424C1A02" , vgetexpps(zmm1, zmmword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("62F2ED0843CB" , vgetexpsd(xmm1, xmm2, xmm3));
+ TEST_INSTRUCTION("62F2ED08434C2B10" , vgetexpsd(xmm1, xmm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F2ED08434C2B10" , vgetexpsd(xmm1, xmm2, qword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F26D0843CB" , vgetexpss(xmm1, xmm2, xmm3));
+ TEST_INSTRUCTION("62F26D08434C2B20" , vgetexpss(xmm1, xmm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F26D08434C2B20" , vgetexpss(xmm1, xmm2, dword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F3FD0826CA01" , vgetmantpd(xmm1, xmm2, 1));
+ TEST_INSTRUCTION("62F3FD08264C1A0801" , vgetmantpd(xmm1, ptr(rdx, rbx, 0, 128), 1));
+ TEST_INSTRUCTION("62F3FD08264C1A0801" , vgetmantpd(xmm1, xmmword_ptr(rdx, rbx, 0, 128), 1));
+ TEST_INSTRUCTION("62F3FD2826CA01" , vgetmantpd(ymm1, ymm2, 1));
+ TEST_INSTRUCTION("62F3FD28264C1A0401" , vgetmantpd(ymm1, ptr(rdx, rbx, 0, 128), 1));
+ TEST_INSTRUCTION("62F3FD28264C1A0401" , vgetmantpd(ymm1, ymmword_ptr(rdx, rbx, 0, 128), 1));
+ TEST_INSTRUCTION("62F3FD4826CA01" , vgetmantpd(zmm1, zmm2, 1));
+ TEST_INSTRUCTION("62F3FD48264C1A0201" , vgetmantpd(zmm1, ptr(rdx, rbx, 0, 128), 1));
+ TEST_INSTRUCTION("62F3FD48264C1A0201" , vgetmantpd(zmm1, zmmword_ptr(rdx, rbx, 0, 128), 1));
+ TEST_INSTRUCTION("62F37D0826CA01" , vgetmantps(xmm1, xmm2, 1));
+ TEST_INSTRUCTION("62F37D08264C1A0801" , vgetmantps(xmm1, ptr(rdx, rbx, 0, 128), 1));
+ TEST_INSTRUCTION("62F37D08264C1A0801" , vgetmantps(xmm1, xmmword_ptr(rdx, rbx, 0, 128), 1));
+ TEST_INSTRUCTION("62F37D2826CA01" , vgetmantps(ymm1, ymm2, 1));
+ TEST_INSTRUCTION("62F37D28264C1A0401" , vgetmantps(ymm1, ptr(rdx, rbx, 0, 128), 1));
+ TEST_INSTRUCTION("62F37D28264C1A0401" , vgetmantps(ymm1, ymmword_ptr(rdx, rbx, 0, 128), 1));
+ TEST_INSTRUCTION("62F37D4826CA01" , vgetmantps(zmm1, zmm2, 1));
+ TEST_INSTRUCTION("62F37D48264C1A0201" , vgetmantps(zmm1, ptr(rdx, rbx, 0, 128), 1));
+ TEST_INSTRUCTION("62F37D48264C1A0201" , vgetmantps(zmm1, zmmword_ptr(rdx, rbx, 0, 128), 1));
+ TEST_INSTRUCTION("62F3ED0827CB01" , vgetmantsd(xmm1, xmm2, xmm3, 1));
+ TEST_INSTRUCTION("62F3ED08274C2B1001" , vgetmantsd(xmm1, xmm2, ptr(rbx, rbp, 0, 128), 1));
+ TEST_INSTRUCTION("62F3ED08274C2B1001" , vgetmantsd(xmm1, xmm2, qword_ptr(rbx, rbp, 0, 128), 1));
+ TEST_INSTRUCTION("62F36D0827CB01" , vgetmantss(xmm1, xmm2, xmm3, 1));
+ TEST_INSTRUCTION("62F36D08274C2B2001" , vgetmantss(xmm1, xmm2, ptr(rbx, rbp, 0, 128), 1));
+ TEST_INSTRUCTION("62F36D08274C2B2001" , vgetmantss(xmm1, xmm2, dword_ptr(rbx, rbp, 0, 128), 1));
+ TEST_INSTRUCTION("C4E3E9CFCB01" , vgf2p8affineinvqb(xmm1, xmm2, xmm3, 1));
+ TEST_INSTRUCTION("C4E3E9CF8C2B8000000001" , vgf2p8affineinvqb(xmm1, xmm2, ptr(rbx, rbp, 0, 128), 1));
+ TEST_INSTRUCTION("C4E3E9CF8C2B8000000001" , vgf2p8affineinvqb(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128), 1));
+ TEST_INSTRUCTION("C4E3EDCFCB01" , vgf2p8affineinvqb(ymm1, ymm2, ymm3, 1));
+ TEST_INSTRUCTION("C4E3EDCF8C2B8000000001" , vgf2p8affineinvqb(ymm1, ymm2, ptr(rbx, rbp, 0, 128), 1));
+ TEST_INSTRUCTION("C4E3EDCF8C2B8000000001" , vgf2p8affineinvqb(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128), 1));
+ TEST_INSTRUCTION("62F3ED48CFCB01" , vgf2p8affineinvqb(zmm1, zmm2, zmm3, 1));
+ TEST_INSTRUCTION("62F3ED48CF4C2B0201" , vgf2p8affineinvqb(zmm1, zmm2, ptr(rbx, rbp, 0, 128), 1));
+ TEST_INSTRUCTION("62F3ED48CF4C2B0201" , vgf2p8affineinvqb(zmm1, zmm2, zmmword_ptr(rbx, rbp, 0, 128), 1));
+ TEST_INSTRUCTION("C4E3E9CECB01" , vgf2p8affineqb(xmm1, xmm2, xmm3, 1));
+ TEST_INSTRUCTION("C4E3E9CE8C2B8000000001" , vgf2p8affineqb(xmm1, xmm2, ptr(rbx, rbp, 0, 128), 1));
+ TEST_INSTRUCTION("C4E3E9CE8C2B8000000001" , vgf2p8affineqb(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128), 1));
+ TEST_INSTRUCTION("C4E3EDCECB01" , vgf2p8affineqb(ymm1, ymm2, ymm3, 1));
+ TEST_INSTRUCTION("C4E3EDCE8C2B8000000001" , vgf2p8affineqb(ymm1, ymm2, ptr(rbx, rbp, 0, 128), 1));
+ TEST_INSTRUCTION("C4E3EDCE8C2B8000000001" , vgf2p8affineqb(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128), 1));
+ TEST_INSTRUCTION("62F3ED48CECB01" , vgf2p8affineqb(zmm1, zmm2, zmm3, 1));
+ TEST_INSTRUCTION("62F3ED48CE4C2B0201" , vgf2p8affineqb(zmm1, zmm2, ptr(rbx, rbp, 0, 128), 1));
+ TEST_INSTRUCTION("62F3ED48CE4C2B0201" , vgf2p8affineqb(zmm1, zmm2, zmmword_ptr(rbx, rbp, 0, 128), 1));
+ TEST_INSTRUCTION("C4E269CFCB" , vgf2p8mulb(xmm1, xmm2, xmm3));
+ TEST_INSTRUCTION("C4E269CF8C2B80000000" , vgf2p8mulb(xmm1, xmm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C4E269CF8C2B80000000" , vgf2p8mulb(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C4E26DCFCB" , vgf2p8mulb(ymm1, ymm2, ymm3));
+ TEST_INSTRUCTION("C4E26DCF8C2B80000000" , vgf2p8mulb(ymm1, ymm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C4E26DCF8C2B80000000" , vgf2p8mulb(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F26D48CFCB" , vgf2p8mulb(zmm1, zmm2, zmm3));
+ TEST_INSTRUCTION("62F26D48CF4C2B02" , vgf2p8mulb(zmm1, zmm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F26D48CF4C2B02" , vgf2p8mulb(zmm1, zmm2, zmmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C5E97CCB" , vhaddpd(xmm1, xmm2, xmm3));
+ TEST_INSTRUCTION("C5E97C8C2B80000000" , vhaddpd(xmm1, xmm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C5E97C8C2B80000000" , vhaddpd(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C5ED7CCB" , vhaddpd(ymm1, ymm2, ymm3));
+ TEST_INSTRUCTION("C5ED7C8C2B80000000" , vhaddpd(ymm1, ymm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C5ED7C8C2B80000000" , vhaddpd(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C5EB7CCB" , vhaddps(xmm1, xmm2, xmm3));
+ TEST_INSTRUCTION("C5EB7C8C2B80000000" , vhaddps(xmm1, xmm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C5EB7C8C2B80000000" , vhaddps(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C5EF7CCB" , vhaddps(ymm1, ymm2, ymm3));
+ TEST_INSTRUCTION("C5EF7C8C2B80000000" , vhaddps(ymm1, ymm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C5EF7C8C2B80000000" , vhaddps(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C5E97DCB" , vhsubpd(xmm1, xmm2, xmm3));
+ TEST_INSTRUCTION("C5E97D8C2B80000000" , vhsubpd(xmm1, xmm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C5E97D8C2B80000000" , vhsubpd(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C5ED7DCB" , vhsubpd(ymm1, ymm2, ymm3));
+ TEST_INSTRUCTION("C5ED7D8C2B80000000" , vhsubpd(ymm1, ymm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C5ED7D8C2B80000000" , vhsubpd(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C5EB7DCB" , vhsubps(xmm1, xmm2, xmm3));
+ TEST_INSTRUCTION("C5EB7D8C2B80000000" , vhsubps(xmm1, xmm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C5EB7D8C2B80000000" , vhsubps(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C5EF7DCB" , vhsubps(ymm1, ymm2, ymm3));
+ TEST_INSTRUCTION("C5EF7D8C2B80000000" , vhsubps(ymm1, ymm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C5EF7D8C2B80000000" , vhsubps(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C4E36D18CB01" , vinsertf128(ymm1, ymm2, xmm3, 1));
+ TEST_INSTRUCTION("C4E36D188C2B8000000001" , vinsertf128(ymm1, ymm2, ptr(rbx, rbp, 0, 128), 1));
+ TEST_INSTRUCTION("C4E36D188C2B8000000001" , vinsertf128(ymm1, ymm2, xmmword_ptr(rbx, rbp, 0, 128), 1));
+ TEST_INSTRUCTION("62F36D2818CB01" , vinsertf32x4(ymm1, ymm2, xmm3, 1));
+ TEST_INSTRUCTION("62F36D28184C2B0801" , vinsertf32x4(ymm1, ymm2, ptr(rbx, rbp, 0, 128), 1));
+ TEST_INSTRUCTION("62F36D28184C2B0801" , vinsertf32x4(ymm1, ymm2, xmmword_ptr(rbx, rbp, 0, 128), 1));
+ TEST_INSTRUCTION("62F36D4818CB01" , vinsertf32x4(zmm1, zmm2, xmm3, 1));
+ TEST_INSTRUCTION("62F36D48184C2B0801" , vinsertf32x4(zmm1, zmm2, ptr(rbx, rbp, 0, 128), 1));
+ TEST_INSTRUCTION("62F36D48184C2B0801" , vinsertf32x4(zmm1, zmm2, xmmword_ptr(rbx, rbp, 0, 128), 1));
+ TEST_INSTRUCTION("62F36D481ACB01" , vinsertf32x8(zmm1, zmm2, ymm3, 1));
+ TEST_INSTRUCTION("62F36D481A4C2B0401" , vinsertf32x8(zmm1, zmm2, ptr(rbx, rbp, 0, 128), 1));
+ TEST_INSTRUCTION("62F36D481A4C2B0401" , vinsertf32x8(zmm1, zmm2, ymmword_ptr(rbx, rbp, 0, 128), 1));
+ TEST_INSTRUCTION("62F3ED2818CB01" , vinsertf64x2(ymm1, ymm2, xmm3, 1));
+ TEST_INSTRUCTION("62F3ED28184C2B0801" , vinsertf64x2(ymm1, ymm2, ptr(rbx, rbp, 0, 128), 1));
+ TEST_INSTRUCTION("62F3ED28184C2B0801" , vinsertf64x2(ymm1, ymm2, xmmword_ptr(rbx, rbp, 0, 128), 1));
+ TEST_INSTRUCTION("62F3ED4818CB01" , vinsertf64x2(zmm1, zmm2, xmm3, 1));
+ TEST_INSTRUCTION("62F3ED48184C2B0801" , vinsertf64x2(zmm1, zmm2, ptr(rbx, rbp, 0, 128), 1));
+ TEST_INSTRUCTION("62F3ED48184C2B0801" , vinsertf64x2(zmm1, zmm2, xmmword_ptr(rbx, rbp, 0, 128), 1));
+ TEST_INSTRUCTION("62F3ED481ACB01" , vinsertf64x4(zmm1, zmm2, ymm3, 1));
+ TEST_INSTRUCTION("62F3ED481A4C2B0401" , vinsertf64x4(zmm1, zmm2, ptr(rbx, rbp, 0, 128), 1));
+ TEST_INSTRUCTION("62F3ED481A4C2B0401" , vinsertf64x4(zmm1, zmm2, ymmword_ptr(rbx, rbp, 0, 128), 1));
+ TEST_INSTRUCTION("C4E36D38CB01" , vinserti128(ymm1, ymm2, xmm3, 1));
+ TEST_INSTRUCTION("C4E36D388C2B8000000001" , vinserti128(ymm1, ymm2, ptr(rbx, rbp, 0, 128), 1));
+ TEST_INSTRUCTION("C4E36D388C2B8000000001" , vinserti128(ymm1, ymm2, xmmword_ptr(rbx, rbp, 0, 128), 1));
+ TEST_INSTRUCTION("62F36D2838CB01" , vinserti32x4(ymm1, ymm2, xmm3, 1));
+ TEST_INSTRUCTION("62F36D28384C2B0801" , vinserti32x4(ymm1, ymm2, ptr(rbx, rbp, 0, 128), 1));
+ TEST_INSTRUCTION("62F36D28384C2B0801" , vinserti32x4(ymm1, ymm2, xmmword_ptr(rbx, rbp, 0, 128), 1));
+ TEST_INSTRUCTION("62F36D4838CB01" , vinserti32x4(zmm1, zmm2, xmm3, 1));
+ TEST_INSTRUCTION("62F36D48384C2B0801" , vinserti32x4(zmm1, zmm2, ptr(rbx, rbp, 0, 128), 1));
+ TEST_INSTRUCTION("62F36D48384C2B0801" , vinserti32x4(zmm1, zmm2, xmmword_ptr(rbx, rbp, 0, 128), 1));
+ TEST_INSTRUCTION("62F36D483ACB01" , vinserti32x8(zmm1, zmm2, ymm3, 1));
+ TEST_INSTRUCTION("62F36D483A4C2B0401" , vinserti32x8(zmm1, zmm2, ptr(rbx, rbp, 0, 128), 1));
+ TEST_INSTRUCTION("62F36D483A4C2B0401" , vinserti32x8(zmm1, zmm2, ymmword_ptr(rbx, rbp, 0, 128), 1));
+ TEST_INSTRUCTION("62F3ED2838CB01" , vinserti64x2(ymm1, ymm2, xmm3, 1));
+ TEST_INSTRUCTION("62F3ED28384C2B0801" , vinserti64x2(ymm1, ymm2, ptr(rbx, rbp, 0, 128), 1));
+ TEST_INSTRUCTION("62F3ED28384C2B0801" , vinserti64x2(ymm1, ymm2, xmmword_ptr(rbx, rbp, 0, 128), 1));
+ TEST_INSTRUCTION("62F3ED4838CB01" , vinserti64x2(zmm1, zmm2, xmm3, 1));
+ TEST_INSTRUCTION("62F3ED48384C2B0801" , vinserti64x2(zmm1, zmm2, ptr(rbx, rbp, 0, 128), 1));
+ TEST_INSTRUCTION("62F3ED48384C2B0801" , vinserti64x2(zmm1, zmm2, xmmword_ptr(rbx, rbp, 0, 128), 1));
+ TEST_INSTRUCTION("62F3ED483ACB01" , vinserti64x4(zmm1, zmm2, ymm3, 1));
+ TEST_INSTRUCTION("62F3ED483A4C2B0401" , vinserti64x4(zmm1, zmm2, ptr(rbx, rbp, 0, 128), 1));
+ TEST_INSTRUCTION("62F3ED483A4C2B0401" , vinserti64x4(zmm1, zmm2, ymmword_ptr(rbx, rbp, 0, 128), 1));
+ TEST_INSTRUCTION("C4E36921CB01" , vinsertps(xmm1, xmm2, xmm3, 1));
+ TEST_INSTRUCTION("C4E369218C2B8000000001" , vinsertps(xmm1, xmm2, ptr(rbx, rbp, 0, 128), 1));
+ TEST_INSTRUCTION("C4E369218C2B8000000001" , vinsertps(xmm1, xmm2, dword_ptr(rbx, rbp, 0, 128), 1));
+ TEST_INSTRUCTION("C5FBF08C1A80000000" , vlddqu(xmm1, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("C5FBF08C1A80000000" , vlddqu(xmm1, xmmword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("C5FFF08C1A80000000" , vlddqu(ymm1, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("C5FFF08C1A80000000" , vlddqu(ymm1, ymmword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("C5F8AE941180000000" , vldmxcsr(ptr(rcx, rdx, 0, 128)));
+ TEST_INSTRUCTION("C5F8AE941180000000" , vldmxcsr(dword_ptr(rcx, rdx, 0, 128)));
+ TEST_INSTRUCTION("C5F9F7CA" , vmaskmovdqu(xmm1, xmm2, ptr(rdi)));
+ TEST_INSTRUCTION("C5F9F7CA" , vmaskmovdqu(xmm1, xmm2, xmmword_ptr(rdi)));
+ TEST_INSTRUCTION("C4E2612FA41180000000" , vmaskmovpd(ptr(rcx, rdx, 0, 128), xmm3, xmm4));
+ TEST_INSTRUCTION("C4E2612FA41180000000" , vmaskmovpd(xmmword_ptr(rcx, rdx, 0, 128), xmm3, xmm4));
+ TEST_INSTRUCTION("C4E2652FA41180000000" , vmaskmovpd(ptr(rcx, rdx, 0, 128), ymm3, ymm4));
+ TEST_INSTRUCTION("C4E2652FA41180000000" , vmaskmovpd(ymmword_ptr(rcx, rdx, 0, 128), ymm3, ymm4));
+ TEST_INSTRUCTION("C4E2692D8C2B80000000" , vmaskmovpd(xmm1, xmm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C4E2692D8C2B80000000" , vmaskmovpd(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C4E26D2D8C2B80000000" , vmaskmovpd(ymm1, ymm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C4E26D2D8C2B80000000" , vmaskmovpd(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C4E2612EA41180000000" , vmaskmovps(ptr(rcx, rdx, 0, 128), xmm3, xmm4));
+ TEST_INSTRUCTION("C4E2612EA41180000000" , vmaskmovps(xmmword_ptr(rcx, rdx, 0, 128), xmm3, xmm4));
+ TEST_INSTRUCTION("C4E2652EA41180000000" , vmaskmovps(ptr(rcx, rdx, 0, 128), ymm3, ymm4));
+ TEST_INSTRUCTION("C4E2652EA41180000000" , vmaskmovps(ymmword_ptr(rcx, rdx, 0, 128), ymm3, ymm4));
+ TEST_INSTRUCTION("C4E2692C8C2B80000000" , vmaskmovps(xmm1, xmm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C4E2692C8C2B80000000" , vmaskmovps(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C4E26D2C8C2B80000000" , vmaskmovps(ymm1, ymm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C4E26D2C8C2B80000000" , vmaskmovps(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C5E95FCB" , vmaxpd(xmm1, xmm2, xmm3));
+ TEST_INSTRUCTION("C5E95F8C2B80000000" , vmaxpd(xmm1, xmm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C5E95F8C2B80000000" , vmaxpd(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C5ED5FCB" , vmaxpd(ymm1, ymm2, ymm3));
+ TEST_INSTRUCTION("C5ED5F8C2B80000000" , vmaxpd(ymm1, ymm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C5ED5F8C2B80000000" , vmaxpd(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F1ED485FCB" , vmaxpd(zmm1, zmm2, zmm3));
+ TEST_INSTRUCTION("62F1ED485F4C2B02" , vmaxpd(zmm1, zmm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F1ED485F4C2B02" , vmaxpd(zmm1, zmm2, zmmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C5E85FCB" , vmaxps(xmm1, xmm2, xmm3));
+ TEST_INSTRUCTION("C5E85F8C2B80000000" , vmaxps(xmm1, xmm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C5E85F8C2B80000000" , vmaxps(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C5EC5FCB" , vmaxps(ymm1, ymm2, ymm3));
+ TEST_INSTRUCTION("C5EC5F8C2B80000000" , vmaxps(ymm1, ymm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C5EC5F8C2B80000000" , vmaxps(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F16C485FCB" , vmaxps(zmm1, zmm2, zmm3));
+ TEST_INSTRUCTION("62F16C485F4C2B02" , vmaxps(zmm1, zmm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F16C485F4C2B02" , vmaxps(zmm1, zmm2, zmmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C5EB5FCB" , vmaxsd(xmm1, xmm2, xmm3));
+ TEST_INSTRUCTION("C5EB5F8C2B80000000" , vmaxsd(xmm1, xmm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C5EB5F8C2B80000000" , vmaxsd(xmm1, xmm2, qword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C5EA5FCB" , vmaxss(xmm1, xmm2, xmm3));
+ TEST_INSTRUCTION("C5EA5F8C2B80000000" , vmaxss(xmm1, xmm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C5EA5F8C2B80000000" , vmaxss(xmm1, xmm2, dword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C5E95DCB" , vminpd(xmm1, xmm2, xmm3));
+ TEST_INSTRUCTION("C5E95D8C2B80000000" , vminpd(xmm1, xmm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C5E95D8C2B80000000" , vminpd(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C5ED5DCB" , vminpd(ymm1, ymm2, ymm3));
+ TEST_INSTRUCTION("C5ED5D8C2B80000000" , vminpd(ymm1, ymm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C5ED5D8C2B80000000" , vminpd(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F1ED485DCB" , vminpd(zmm1, zmm2, zmm3));
+ TEST_INSTRUCTION("62F1ED485D4C2B02" , vminpd(zmm1, zmm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F1ED485D4C2B02" , vminpd(zmm1, zmm2, zmmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C5E85DCB" , vminps(xmm1, xmm2, xmm3));
+ TEST_INSTRUCTION("C5E85D8C2B80000000" , vminps(xmm1, xmm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C5E85D8C2B80000000" , vminps(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C5EC5DCB" , vminps(ymm1, ymm2, ymm3));
+ TEST_INSTRUCTION("C5EC5D8C2B80000000" , vminps(ymm1, ymm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C5EC5D8C2B80000000" , vminps(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F16C485DCB" , vminps(zmm1, zmm2, zmm3));
+ TEST_INSTRUCTION("62F16C485D4C2B02" , vminps(zmm1, zmm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F16C485D4C2B02" , vminps(zmm1, zmm2, zmmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C5EB5DCB" , vminsd(xmm1, xmm2, xmm3));
+ TEST_INSTRUCTION("C5EB5D8C2B80000000" , vminsd(xmm1, xmm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C5EB5D8C2B80000000" , vminsd(xmm1, xmm2, qword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C5EA5DCB" , vminss(xmm1, xmm2, xmm3));
+ TEST_INSTRUCTION("C5EA5D8C2B80000000" , vminss(xmm1, xmm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C5EA5D8C2B80000000" , vminss(xmm1, xmm2, dword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C5F928CA" , vmovapd(xmm1, xmm2));
+ TEST_INSTRUCTION("C5F9288C1A80000000" , vmovapd(xmm1, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("C5F9288C1A80000000" , vmovapd(xmm1, xmmword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("C5F9299C1180000000" , vmovapd(ptr(rcx, rdx, 0, 128), xmm3));
+ TEST_INSTRUCTION("C5F9299C1180000000" , vmovapd(xmmword_ptr(rcx, rdx, 0, 128), xmm3));
+ TEST_INSTRUCTION("C5FD28CA" , vmovapd(ymm1, ymm2));
+ TEST_INSTRUCTION("C5FD288C1A80000000" , vmovapd(ymm1, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("C5FD288C1A80000000" , vmovapd(ymm1, ymmword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("C5FD299C1180000000" , vmovapd(ptr(rcx, rdx, 0, 128), ymm3));
+ TEST_INSTRUCTION("C5FD299C1180000000" , vmovapd(ymmword_ptr(rcx, rdx, 0, 128), ymm3));
+ TEST_INSTRUCTION("62F1FD4828CA" , vmovapd(zmm1, zmm2));
+ TEST_INSTRUCTION("62F1FD48284C1A02" , vmovapd(zmm1, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("62F1FD48284C1A02" , vmovapd(zmm1, zmmword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("62F1FD48295C1102" , vmovapd(ptr(rcx, rdx, 0, 128), zmm3));
+ TEST_INSTRUCTION("62F1FD48295C1102" , vmovapd(zmmword_ptr(rcx, rdx, 0, 128), zmm3));
+ TEST_INSTRUCTION("C5F828CA" , vmovaps(xmm1, xmm2));
+ TEST_INSTRUCTION("C5F8288C1A80000000" , vmovaps(xmm1, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("C5F8288C1A80000000" , vmovaps(xmm1, xmmword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("C5F8299C1180000000" , vmovaps(ptr(rcx, rdx, 0, 128), xmm3));
+ TEST_INSTRUCTION("C5F8299C1180000000" , vmovaps(xmmword_ptr(rcx, rdx, 0, 128), xmm3));
+ TEST_INSTRUCTION("C5FC28CA" , vmovaps(ymm1, ymm2));
+ TEST_INSTRUCTION("C5FC288C1A80000000" , vmovaps(ymm1, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("C5FC288C1A80000000" , vmovaps(ymm1, ymmword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("C5FC299C1180000000" , vmovaps(ptr(rcx, rdx, 0, 128), ymm3));
+ TEST_INSTRUCTION("C5FC299C1180000000" , vmovaps(ymmword_ptr(rcx, rdx, 0, 128), ymm3));
+ TEST_INSTRUCTION("62F17C4828CA" , vmovaps(zmm1, zmm2));
+ TEST_INSTRUCTION("62F17C48284C1A02" , vmovaps(zmm1, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("62F17C48284C1A02" , vmovaps(zmm1, zmmword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("62F17C48295C1102" , vmovaps(ptr(rcx, rdx, 0, 128), zmm3));
+ TEST_INSTRUCTION("62F17C48295C1102" , vmovaps(zmmword_ptr(rcx, rdx, 0, 128), zmm3));
+ TEST_INSTRUCTION("C5F97ED1" , vmovd(ecx, xmm2));
+ TEST_INSTRUCTION("C5F97E9C1180000000" , vmovd(ptr(rcx, rdx, 0, 128), xmm3));
+ TEST_INSTRUCTION("C5F97E9C1180000000" , vmovd(dword_ptr(rcx, rdx, 0, 128), xmm3));
+ TEST_INSTRUCTION("C5F96ECA" , vmovd(xmm1, edx));
+ TEST_INSTRUCTION("C5F96E8C1A80000000" , vmovd(xmm1, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("C5F96E8C1A80000000" , vmovd(xmm1, dword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("C5FB12CA" , vmovddup(xmm1, xmm2));
+ TEST_INSTRUCTION("C5FB128C1A80000000" , vmovddup(xmm1, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("C5FB128C1A80000000" , vmovddup(xmm1, qword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("C5FF12CA" , vmovddup(ymm1, ymm2));
+ TEST_INSTRUCTION("C5FF128C1A80000000" , vmovddup(ymm1, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("C5FF128C1A80000000" , vmovddup(ymm1, ymmword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("62F1FF4812CA" , vmovddup(zmm1, zmm2));
+ TEST_INSTRUCTION("62F1FF48124C1A02" , vmovddup(zmm1, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("62F1FF48124C1A02" , vmovddup(zmm1, zmmword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("C5F96FCA" , vmovdqa(xmm1, xmm2));
+ TEST_INSTRUCTION("C5F96F8C1A80000000" , vmovdqa(xmm1, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("C5F96F8C1A80000000" , vmovdqa(xmm1, xmmword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("C5F97F9C1180000000" , vmovdqa(ptr(rcx, rdx, 0, 128), xmm3));
+ TEST_INSTRUCTION("C5F97F9C1180000000" , vmovdqa(xmmword_ptr(rcx, rdx, 0, 128), xmm3));
+ TEST_INSTRUCTION("C5FD6FCA" , vmovdqa(ymm1, ymm2));
+ TEST_INSTRUCTION("C5FD6F8C1A80000000" , vmovdqa(ymm1, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("C5FD6F8C1A80000000" , vmovdqa(ymm1, ymmword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("C5FD7F9C1180000000" , vmovdqa(ptr(rcx, rdx, 0, 128), ymm3));
+ TEST_INSTRUCTION("C5FD7F9C1180000000" , vmovdqa(ymmword_ptr(rcx, rdx, 0, 128), ymm3));
+ TEST_INSTRUCTION("62F17D086FCA" , vmovdqa32(xmm1, xmm2));
+ TEST_INSTRUCTION("62F17D086F4C1A08" , vmovdqa32(xmm1, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("62F17D086F4C1A08" , vmovdqa32(xmm1, xmmword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("62F17D087F5C1108" , vmovdqa32(ptr(rcx, rdx, 0, 128), xmm3));
+ TEST_INSTRUCTION("62F17D087F5C1108" , vmovdqa32(xmmword_ptr(rcx, rdx, 0, 128), xmm3));
+ TEST_INSTRUCTION("62F17D286FCA" , vmovdqa32(ymm1, ymm2));
+ TEST_INSTRUCTION("62F17D286F4C1A04" , vmovdqa32(ymm1, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("62F17D286F4C1A04" , vmovdqa32(ymm1, ymmword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("62F17D287F5C1104" , vmovdqa32(ptr(rcx, rdx, 0, 128), ymm3));
+ TEST_INSTRUCTION("62F17D287F5C1104" , vmovdqa32(ymmword_ptr(rcx, rdx, 0, 128), ymm3));
+ TEST_INSTRUCTION("62F17D486FCA" , vmovdqa32(zmm1, zmm2));
+ TEST_INSTRUCTION("62F17D486F4C1A02" , vmovdqa32(zmm1, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("62F17D486F4C1A02" , vmovdqa32(zmm1, zmmword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("62F17D487F5C1102" , vmovdqa32(ptr(rcx, rdx, 0, 128), zmm3));
+ TEST_INSTRUCTION("62F17D487F5C1102" , vmovdqa32(zmmword_ptr(rcx, rdx, 0, 128), zmm3));
+ TEST_INSTRUCTION("62F1FD086FCA" , vmovdqa64(xmm1, xmm2));
+ TEST_INSTRUCTION("62F1FD086F4C1A08" , vmovdqa64(xmm1, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("62F1FD086F4C1A08" , vmovdqa64(xmm1, xmmword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("62F1FD087F5C1108" , vmovdqa64(ptr(rcx, rdx, 0, 128), xmm3));
+ TEST_INSTRUCTION("62F1FD087F5C1108" , vmovdqa64(xmmword_ptr(rcx, rdx, 0, 128), xmm3));
+ TEST_INSTRUCTION("62F1FD286FCA" , vmovdqa64(ymm1, ymm2));
+ TEST_INSTRUCTION("62F1FD286F4C1A04" , vmovdqa64(ymm1, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("62F1FD286F4C1A04" , vmovdqa64(ymm1, ymmword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("62F1FD287F5C1104" , vmovdqa64(ptr(rcx, rdx, 0, 128), ymm3));
+ TEST_INSTRUCTION("62F1FD287F5C1104" , vmovdqa64(ymmword_ptr(rcx, rdx, 0, 128), ymm3));
+ TEST_INSTRUCTION("62F1FD486FCA" , vmovdqa64(zmm1, zmm2));
+ TEST_INSTRUCTION("62F1FD486F4C1A02" , vmovdqa64(zmm1, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("62F1FD486F4C1A02" , vmovdqa64(zmm1, zmmword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("62F1FD487F5C1102" , vmovdqa64(ptr(rcx, rdx, 0, 128), zmm3));
+ TEST_INSTRUCTION("62F1FD487F5C1102" , vmovdqa64(zmmword_ptr(rcx, rdx, 0, 128), zmm3));
+ TEST_INSTRUCTION("C5FA6FCA" , vmovdqu(xmm1, xmm2));
+ TEST_INSTRUCTION("C5FA6F8C1A80000000" , vmovdqu(xmm1, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("C5FA6F8C1A80000000" , vmovdqu(xmm1, xmmword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("C5FA7F9C1180000000" , vmovdqu(ptr(rcx, rdx, 0, 128), xmm3));
+ TEST_INSTRUCTION("C5FA7F9C1180000000" , vmovdqu(xmmword_ptr(rcx, rdx, 0, 128), xmm3));
+ TEST_INSTRUCTION("C5FE6FCA" , vmovdqu(ymm1, ymm2));
+ TEST_INSTRUCTION("C5FE6F8C1A80000000" , vmovdqu(ymm1, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("C5FE6F8C1A80000000" , vmovdqu(ymm1, ymmword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("C5FE7F9C1180000000" , vmovdqu(ptr(rcx, rdx, 0, 128), ymm3));
+ TEST_INSTRUCTION("C5FE7F9C1180000000" , vmovdqu(ymmword_ptr(rcx, rdx, 0, 128), ymm3));
+ TEST_INSTRUCTION("62F1FF086FCA" , vmovdqu16(xmm1, xmm2));
+ TEST_INSTRUCTION("62F1FF086F4C1A08" , vmovdqu16(xmm1, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("62F1FF086F4C1A08" , vmovdqu16(xmm1, xmmword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("62F1FF087F5C1108" , vmovdqu16(ptr(rcx, rdx, 0, 128), xmm3));
+ TEST_INSTRUCTION("62F1FF087F5C1108" , vmovdqu16(xmmword_ptr(rcx, rdx, 0, 128), xmm3));
+ TEST_INSTRUCTION("62F1FF286FCA" , vmovdqu16(ymm1, ymm2));
+ TEST_INSTRUCTION("62F1FF286F4C1A04" , vmovdqu16(ymm1, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("62F1FF286F4C1A04" , vmovdqu16(ymm1, ymmword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("62F1FF287F5C1104" , vmovdqu16(ptr(rcx, rdx, 0, 128), ymm3));
+ TEST_INSTRUCTION("62F1FF287F5C1104" , vmovdqu16(ymmword_ptr(rcx, rdx, 0, 128), ymm3));
+ TEST_INSTRUCTION("62F1FF486FCA" , vmovdqu16(zmm1, zmm2));
+ TEST_INSTRUCTION("62F1FF486F4C1A02" , vmovdqu16(zmm1, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("62F1FF486F4C1A02" , vmovdqu16(zmm1, zmmword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("62F1FF487F5C1102" , vmovdqu16(ptr(rcx, rdx, 0, 128), zmm3));
+ TEST_INSTRUCTION("62F1FF487F5C1102" , vmovdqu16(zmmword_ptr(rcx, rdx, 0, 128), zmm3));
+ TEST_INSTRUCTION("62F17E086FCA" , vmovdqu32(xmm1, xmm2));
+ TEST_INSTRUCTION("62F17E086F4C1A08" , vmovdqu32(xmm1, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("62F17E086F4C1A08" , vmovdqu32(xmm1, xmmword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("62F17E087F5C1108" , vmovdqu32(ptr(rcx, rdx, 0, 128), xmm3));
+ TEST_INSTRUCTION("62F17E087F5C1108" , vmovdqu32(xmmword_ptr(rcx, rdx, 0, 128), xmm3));
+ TEST_INSTRUCTION("62F17E286FCA" , vmovdqu32(ymm1, ymm2));
+ TEST_INSTRUCTION("62F17E286F4C1A04" , vmovdqu32(ymm1, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("62F17E286F4C1A04" , vmovdqu32(ymm1, ymmword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("62F17E287F5C1104" , vmovdqu32(ptr(rcx, rdx, 0, 128), ymm3));
+ TEST_INSTRUCTION("62F17E287F5C1104" , vmovdqu32(ymmword_ptr(rcx, rdx, 0, 128), ymm3));
+ TEST_INSTRUCTION("62F17E486FCA" , vmovdqu32(zmm1, zmm2));
+ TEST_INSTRUCTION("62F17E486F4C1A02" , vmovdqu32(zmm1, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("62F17E486F4C1A02" , vmovdqu32(zmm1, zmmword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("62F17E487F5C1102" , vmovdqu32(ptr(rcx, rdx, 0, 128), zmm3));
+ TEST_INSTRUCTION("62F17E487F5C1102" , vmovdqu32(zmmword_ptr(rcx, rdx, 0, 128), zmm3));
+ TEST_INSTRUCTION("62F1FE086FCA" , vmovdqu64(xmm1, xmm2));
+ TEST_INSTRUCTION("62F1FE086F4C1A08" , vmovdqu64(xmm1, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("62F1FE086F4C1A08" , vmovdqu64(xmm1, xmmword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("62F1FE087F5C1108" , vmovdqu64(ptr(rcx, rdx, 0, 128), xmm3));
+ TEST_INSTRUCTION("62F1FE087F5C1108" , vmovdqu64(xmmword_ptr(rcx, rdx, 0, 128), xmm3));
+ TEST_INSTRUCTION("62F1FE286FCA" , vmovdqu64(ymm1, ymm2));
+ TEST_INSTRUCTION("62F1FE286F4C1A04" , vmovdqu64(ymm1, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("62F1FE286F4C1A04" , vmovdqu64(ymm1, ymmword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("62F1FE287F5C1104" , vmovdqu64(ptr(rcx, rdx, 0, 128), ymm3));
+ TEST_INSTRUCTION("62F1FE287F5C1104" , vmovdqu64(ymmword_ptr(rcx, rdx, 0, 128), ymm3));
+ TEST_INSTRUCTION("62F1FE486FCA" , vmovdqu64(zmm1, zmm2));
+ TEST_INSTRUCTION("62F1FE486F4C1A02" , vmovdqu64(zmm1, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("62F1FE486F4C1A02" , vmovdqu64(zmm1, zmmword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("62F1FE487F5C1102" , vmovdqu64(ptr(rcx, rdx, 0, 128), zmm3));
+ TEST_INSTRUCTION("62F1FE487F5C1102" , vmovdqu64(zmmword_ptr(rcx, rdx, 0, 128), zmm3));
+ TEST_INSTRUCTION("62F17F086FCA" , vmovdqu8(xmm1, xmm2));
+ TEST_INSTRUCTION("62F17F086F4C1A08" , vmovdqu8(xmm1, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("62F17F086F4C1A08" , vmovdqu8(xmm1, xmmword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("62F17F087F5C1108" , vmovdqu8(ptr(rcx, rdx, 0, 128), xmm3));
+ TEST_INSTRUCTION("62F17F087F5C1108" , vmovdqu8(xmmword_ptr(rcx, rdx, 0, 128), xmm3));
+ TEST_INSTRUCTION("62F17F286FCA" , vmovdqu8(ymm1, ymm2));
+ TEST_INSTRUCTION("62F17F286F4C1A04" , vmovdqu8(ymm1, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("62F17F286F4C1A04" , vmovdqu8(ymm1, ymmword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("62F17F287F5C1104" , vmovdqu8(ptr(rcx, rdx, 0, 128), ymm3));
+ TEST_INSTRUCTION("62F17F287F5C1104" , vmovdqu8(ymmword_ptr(rcx, rdx, 0, 128), ymm3));
+ TEST_INSTRUCTION("62F17F486FCA" , vmovdqu8(zmm1, zmm2));
+ TEST_INSTRUCTION("62F17F486F4C1A02" , vmovdqu8(zmm1, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("62F17F486F4C1A02" , vmovdqu8(zmm1, zmmword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("62F17F487F5C1102" , vmovdqu8(ptr(rcx, rdx, 0, 128), zmm3));
+ TEST_INSTRUCTION("62F17F487F5C1102" , vmovdqu8(zmmword_ptr(rcx, rdx, 0, 128), zmm3));
+ TEST_INSTRUCTION("C5E812CB" , vmovhlps(xmm1, xmm2, xmm3));
+ TEST_INSTRUCTION("C5F9179C1180000000" , vmovhpd(ptr(rcx, rdx, 0, 128), xmm3));
+ TEST_INSTRUCTION("C5F9179C1180000000" , vmovhpd(qword_ptr(rcx, rdx, 0, 128), xmm3));
+ TEST_INSTRUCTION("C5E9168C2B80000000" , vmovhpd(xmm1, xmm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C5E9168C2B80000000" , vmovhpd(xmm1, xmm2, qword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C5F8179C1180000000" , vmovhps(ptr(rcx, rdx, 0, 128), xmm3));
+ TEST_INSTRUCTION("C5F8179C1180000000" , vmovhps(qword_ptr(rcx, rdx, 0, 128), xmm3));
+ TEST_INSTRUCTION("C5E8168C2B80000000" , vmovhps(xmm1, xmm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C5E8168C2B80000000" , vmovhps(xmm1, xmm2, qword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C5E816CB" , vmovlhps(xmm1, xmm2, xmm3));
+ TEST_INSTRUCTION("C5F9139C1180000000" , vmovlpd(ptr(rcx, rdx, 0, 128), xmm3));
+ TEST_INSTRUCTION("C5F9139C1180000000" , vmovlpd(qword_ptr(rcx, rdx, 0, 128), xmm3));
+ TEST_INSTRUCTION("C5E9128C2B80000000" , vmovlpd(xmm1, xmm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C5E9128C2B80000000" , vmovlpd(xmm1, xmm2, qword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C5F8139C1180000000" , vmovlps(ptr(rcx, rdx, 0, 128), xmm3));
+ TEST_INSTRUCTION("C5F8139C1180000000" , vmovlps(qword_ptr(rcx, rdx, 0, 128), xmm3));
+ TEST_INSTRUCTION("C5E8128C2B80000000" , vmovlps(xmm1, xmm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C5E8128C2B80000000" , vmovlps(xmm1, xmm2, qword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C5F950CA" , vmovmskpd(ecx, xmm2));
+ TEST_INSTRUCTION("C5FD50CA" , vmovmskpd(ecx, ymm2));
+ TEST_INSTRUCTION("C5F850CA" , vmovmskps(ecx, xmm2));
+ TEST_INSTRUCTION("C5FC50CA" , vmovmskps(ecx, ymm2));
+ TEST_INSTRUCTION("C5F9E79C1180000000" , vmovntdq(ptr(rcx, rdx, 0, 128), xmm3));
+ TEST_INSTRUCTION("C5F9E79C1180000000" , vmovntdq(xmmword_ptr(rcx, rdx, 0, 128), xmm3));
+ TEST_INSTRUCTION("C5FDE79C1180000000" , vmovntdq(ptr(rcx, rdx, 0, 128), ymm3));
+ TEST_INSTRUCTION("C5FDE79C1180000000" , vmovntdq(ymmword_ptr(rcx, rdx, 0, 128), ymm3));
+ TEST_INSTRUCTION("62F17D48E75C1102" , vmovntdq(ptr(rcx, rdx, 0, 128), zmm3));
+ TEST_INSTRUCTION("62F17D48E75C1102" , vmovntdq(zmmword_ptr(rcx, rdx, 0, 128), zmm3));
+ TEST_INSTRUCTION("C4E2792A8C1A80000000" , vmovntdqa(xmm1, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("C4E2792A8C1A80000000" , vmovntdqa(xmm1, xmmword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("C4E27D2A8C1A80000000" , vmovntdqa(ymm1, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("C4E27D2A8C1A80000000" , vmovntdqa(ymm1, ymmword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("62F27D482A4C1A02" , vmovntdqa(zmm1, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("62F27D482A4C1A02" , vmovntdqa(zmm1, zmmword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("C5F92B9C1180000000" , vmovntpd(ptr(rcx, rdx, 0, 128), xmm3));
+ TEST_INSTRUCTION("C5F92B9C1180000000" , vmovntpd(xmmword_ptr(rcx, rdx, 0, 128), xmm3));
+ TEST_INSTRUCTION("C5FD2B9C1180000000" , vmovntpd(ptr(rcx, rdx, 0, 128), ymm3));
+ TEST_INSTRUCTION("C5FD2B9C1180000000" , vmovntpd(ymmword_ptr(rcx, rdx, 0, 128), ymm3));
+ TEST_INSTRUCTION("62F1FD482B5C1102" , vmovntpd(ptr(rcx, rdx, 0, 128), zmm3));
+ TEST_INSTRUCTION("62F1FD482B5C1102" , vmovntpd(zmmword_ptr(rcx, rdx, 0, 128), zmm3));
+ TEST_INSTRUCTION("C5F82B9C1180000000" , vmovntps(ptr(rcx, rdx, 0, 128), xmm3));
+ TEST_INSTRUCTION("C5F82B9C1180000000" , vmovntps(xmmword_ptr(rcx, rdx, 0, 128), xmm3));
+ TEST_INSTRUCTION("C5FC2B9C1180000000" , vmovntps(ptr(rcx, rdx, 0, 128), ymm3));
+ TEST_INSTRUCTION("C5FC2B9C1180000000" , vmovntps(ymmword_ptr(rcx, rdx, 0, 128), ymm3));
+ TEST_INSTRUCTION("62F17C482B5C1102" , vmovntps(ptr(rcx, rdx, 0, 128), zmm3));
+ TEST_INSTRUCTION("62F17C482B5C1102" , vmovntps(zmmword_ptr(rcx, rdx, 0, 128), zmm3));
+ TEST_INSTRUCTION("C4E1F97ED1" , vmovq(rcx, xmm2));
+ TEST_INSTRUCTION("C5F9D69C1180000000" , vmovq(ptr(rcx, rdx, 0, 128), xmm3));
+ TEST_INSTRUCTION("C5F9D69C1180000000" , vmovq(qword_ptr(rcx, rdx, 0, 128), xmm3));
+ TEST_INSTRUCTION("C4E1F96ECA" , vmovq(xmm1, rdx));
+ TEST_INSTRUCTION("C5FA7ECA" , vmovq(xmm1, xmm2));
+ TEST_INSTRUCTION("C5FA7E8C1A80000000" , vmovq(xmm1, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("C5FA7E8C1A80000000" , vmovq(xmm1, qword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("C5FB119C1180000000" , vmovsd(ptr(rcx, rdx, 0, 128), xmm3));
+ TEST_INSTRUCTION("C5FB119C1180000000" , vmovsd(qword_ptr(rcx, rdx, 0, 128), xmm3));
+ TEST_INSTRUCTION("C5FB108C1A80000000" , vmovsd(xmm1, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("C5FB108C1A80000000" , vmovsd(xmm1, qword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("C5EB10CB" , vmovsd(xmm1, xmm2, xmm3));
+ TEST_INSTRUCTION("C5FA16CA" , vmovshdup(xmm1, xmm2));
+ TEST_INSTRUCTION("C5FA168C1A80000000" , vmovshdup(xmm1, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("C5FA168C1A80000000" , vmovshdup(xmm1, xmmword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("C5FE16CA" , vmovshdup(ymm1, ymm2));
+ TEST_INSTRUCTION("C5FE168C1A80000000" , vmovshdup(ymm1, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("C5FE168C1A80000000" , vmovshdup(ymm1, ymmword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("62F17E4816CA" , vmovshdup(zmm1, zmm2));
+ TEST_INSTRUCTION("62F17E48164C1A02" , vmovshdup(zmm1, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("62F17E48164C1A02" , vmovshdup(zmm1, zmmword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("C5FA12CA" , vmovsldup(xmm1, xmm2));
+ TEST_INSTRUCTION("C5FA128C1A80000000" , vmovsldup(xmm1, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("C5FA128C1A80000000" , vmovsldup(xmm1, xmmword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("C5FE12CA" , vmovsldup(ymm1, ymm2));
+ TEST_INSTRUCTION("C5FE128C1A80000000" , vmovsldup(ymm1, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("C5FE128C1A80000000" , vmovsldup(ymm1, ymmword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("62F17E4812CA" , vmovsldup(zmm1, zmm2));
+ TEST_INSTRUCTION("62F17E48124C1A02" , vmovsldup(zmm1, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("62F17E48124C1A02" , vmovsldup(zmm1, zmmword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("C5FA119C1180000000" , vmovss(ptr(rcx, rdx, 0, 128), xmm3));
+ TEST_INSTRUCTION("C5FA119C1180000000" , vmovss(dword_ptr(rcx, rdx, 0, 128), xmm3));
+ TEST_INSTRUCTION("C5FA108C1A80000000" , vmovss(xmm1, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("C5FA108C1A80000000" , vmovss(xmm1, dword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("C5EA10CB" , vmovss(xmm1, xmm2, xmm3));
+ TEST_INSTRUCTION("C5F910CA" , vmovupd(xmm1, xmm2));
+ TEST_INSTRUCTION("C5F9108C1A80000000" , vmovupd(xmm1, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("C5F9108C1A80000000" , vmovupd(xmm1, xmmword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("C5F9119C1180000000" , vmovupd(ptr(rcx, rdx, 0, 128), xmm3));
+ TEST_INSTRUCTION("C5F9119C1180000000" , vmovupd(xmmword_ptr(rcx, rdx, 0, 128), xmm3));
+ TEST_INSTRUCTION("C5FD10CA" , vmovupd(ymm1, ymm2));
+ TEST_INSTRUCTION("C5FD108C1A80000000" , vmovupd(ymm1, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("C5FD108C1A80000000" , vmovupd(ymm1, ymmword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("C5FD119C1180000000" , vmovupd(ptr(rcx, rdx, 0, 128), ymm3));
+ TEST_INSTRUCTION("C5FD119C1180000000" , vmovupd(ymmword_ptr(rcx, rdx, 0, 128), ymm3));
+ TEST_INSTRUCTION("62F1FD4810CA" , vmovupd(zmm1, zmm2));
+ TEST_INSTRUCTION("62F1FD48104C1A02" , vmovupd(zmm1, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("62F1FD48104C1A02" , vmovupd(zmm1, zmmword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("62F1FD48115C1102" , vmovupd(ptr(rcx, rdx, 0, 128), zmm3));
+ TEST_INSTRUCTION("62F1FD48115C1102" , vmovupd(zmmword_ptr(rcx, rdx, 0, 128), zmm3));
+ TEST_INSTRUCTION("C5F810CA" , vmovups(xmm1, xmm2));
+ TEST_INSTRUCTION("C5F8108C1A80000000" , vmovups(xmm1, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("C5F8108C1A80000000" , vmovups(xmm1, xmmword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("C5F8119C1180000000" , vmovups(ptr(rcx, rdx, 0, 128), xmm3));
+ TEST_INSTRUCTION("C5F8119C1180000000" , vmovups(xmmword_ptr(rcx, rdx, 0, 128), xmm3));
+ TEST_INSTRUCTION("C5FC10CA" , vmovups(ymm1, ymm2));
+ TEST_INSTRUCTION("C5FC108C1A80000000" , vmovups(ymm1, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("C5FC108C1A80000000" , vmovups(ymm1, ymmword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("C5FC119C1180000000" , vmovups(ptr(rcx, rdx, 0, 128), ymm3));
+ TEST_INSTRUCTION("C5FC119C1180000000" , vmovups(ymmword_ptr(rcx, rdx, 0, 128), ymm3));
+ TEST_INSTRUCTION("62F17C4810CA" , vmovups(zmm1, zmm2));
+ TEST_INSTRUCTION("62F17C48104C1A02" , vmovups(zmm1, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("62F17C48104C1A02" , vmovups(zmm1, zmmword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("62F17C48115C1102" , vmovups(ptr(rcx, rdx, 0, 128), zmm3));
+ TEST_INSTRUCTION("62F17C48115C1102" , vmovups(zmmword_ptr(rcx, rdx, 0, 128), zmm3));
+ TEST_INSTRUCTION("C4E36942CB01" , vmpsadbw(xmm1, xmm2, xmm3, 1));
+ TEST_INSTRUCTION("C4E369428C2B8000000001" , vmpsadbw(xmm1, xmm2, ptr(rbx, rbp, 0, 128), 1));
+ TEST_INSTRUCTION("C4E369428C2B8000000001" , vmpsadbw(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128), 1));
+ TEST_INSTRUCTION("C4E36D42CB01" , vmpsadbw(ymm1, ymm2, ymm3, 1));
+ TEST_INSTRUCTION("C4E36D428C2B8000000001" , vmpsadbw(ymm1, ymm2, ptr(rbx, rbp, 0, 128), 1));
+ TEST_INSTRUCTION("C4E36D428C2B8000000001" , vmpsadbw(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128), 1));
+ TEST_INSTRUCTION("C5E959CB" , vmulpd(xmm1, xmm2, xmm3));
+ TEST_INSTRUCTION("C5E9598C2B80000000" , vmulpd(xmm1, xmm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C5E9598C2B80000000" , vmulpd(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C5ED59CB" , vmulpd(ymm1, ymm2, ymm3));
+ TEST_INSTRUCTION("C5ED598C2B80000000" , vmulpd(ymm1, ymm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C5ED598C2B80000000" , vmulpd(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F1ED4859CB" , vmulpd(zmm1, zmm2, zmm3));
+ TEST_INSTRUCTION("62F1ED48594C2B02" , vmulpd(zmm1, zmm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F1ED48594C2B02" , vmulpd(zmm1, zmm2, zmmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C5E859CB" , vmulps(xmm1, xmm2, xmm3));
+ TEST_INSTRUCTION("C5E8598C2B80000000" , vmulps(xmm1, xmm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C5E8598C2B80000000" , vmulps(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C5EC59CB" , vmulps(ymm1, ymm2, ymm3));
+ TEST_INSTRUCTION("C5EC598C2B80000000" , vmulps(ymm1, ymm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C5EC598C2B80000000" , vmulps(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F16C4859CB" , vmulps(zmm1, zmm2, zmm3));
+ TEST_INSTRUCTION("62F16C48594C2B02" , vmulps(zmm1, zmm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F16C48594C2B02" , vmulps(zmm1, zmm2, zmmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C5EB59CB" , vmulsd(xmm1, xmm2, xmm3));
+ TEST_INSTRUCTION("C5EB598C2B80000000" , vmulsd(xmm1, xmm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C5EB598C2B80000000" , vmulsd(xmm1, xmm2, qword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C5EA59CB" , vmulss(xmm1, xmm2, xmm3));
+ TEST_INSTRUCTION("C5EA598C2B80000000" , vmulss(xmm1, xmm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C5EA598C2B80000000" , vmulss(xmm1, xmm2, dword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C5E956CB" , vorpd(xmm1, xmm2, xmm3));
+ TEST_INSTRUCTION("C5E9568C2B80000000" , vorpd(xmm1, xmm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C5E9568C2B80000000" , vorpd(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C5ED56CB" , vorpd(ymm1, ymm2, ymm3));
+ TEST_INSTRUCTION("C5ED568C2B80000000" , vorpd(ymm1, ymm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C5ED568C2B80000000" , vorpd(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F1ED4856CB" , vorpd(zmm1, zmm2, zmm3));
+ TEST_INSTRUCTION("62F1ED48564C2B02" , vorpd(zmm1, zmm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F1ED48564C2B02" , vorpd(zmm1, zmm2, zmmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C5E856CB" , vorps(xmm1, xmm2, xmm3));
+ TEST_INSTRUCTION("C5E8568C2B80000000" , vorps(xmm1, xmm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C5E8568C2B80000000" , vorps(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C5EC56CB" , vorps(ymm1, ymm2, ymm3));
+ TEST_INSTRUCTION("C5EC568C2B80000000" , vorps(ymm1, ymm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C5EC568C2B80000000" , vorps(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F16C4856CB" , vorps(zmm1, zmm2, zmm3));
+ TEST_INSTRUCTION("62F16C48564C2B02" , vorps(zmm1, zmm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F16C48564C2B02" , vorps(zmm1, zmm2, zmmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F25F0868D1" , vp2intersectd(k2, k3, xmm4, xmm1));
+ TEST_INSTRUCTION("62F25F0868541108" , vp2intersectd(k2, k3, xmm4, ptr(rcx, rdx, 0, 128)));
+ TEST_INSTRUCTION("62F25F0868541108" , vp2intersectd(k2, k3, xmm4, xmmword_ptr(rcx, rdx, 0, 128)));
+ TEST_INSTRUCTION("62F25F2868D1" , vp2intersectd(k2, k3, ymm4, ymm1));
+ TEST_INSTRUCTION("62F25F2868541104" , vp2intersectd(k2, k3, ymm4, ptr(rcx, rdx, 0, 128)));
+ TEST_INSTRUCTION("62F25F2868541104" , vp2intersectd(k2, k3, ymm4, ymmword_ptr(rcx, rdx, 0, 128)));
+ TEST_INSTRUCTION("62F25F4868D1" , vp2intersectd(k2, k3, zmm4, zmm1));
+ TEST_INSTRUCTION("62F25F4868541102" , vp2intersectd(k2, k3, zmm4, ptr(rcx, rdx, 0, 128)));
+ TEST_INSTRUCTION("62F25F4868541102" , vp2intersectd(k2, k3, zmm4, zmmword_ptr(rcx, rdx, 0, 128)));
+ TEST_INSTRUCTION("62F2DF0868D1" , vp2intersectq(k2, k3, xmm4, xmm1));
+ TEST_INSTRUCTION("62F2DF0868541108" , vp2intersectq(k2, k3, xmm4, ptr(rcx, rdx, 0, 128)));
+ TEST_INSTRUCTION("62F2DF0868541108" , vp2intersectq(k2, k3, xmm4, xmmword_ptr(rcx, rdx, 0, 128)));
+ TEST_INSTRUCTION("62F2DF2868D1" , vp2intersectq(k2, k3, ymm4, ymm1));
+ TEST_INSTRUCTION("62F2DF2868541104" , vp2intersectq(k2, k3, ymm4, ptr(rcx, rdx, 0, 128)));
+ TEST_INSTRUCTION("62F2DF2868541104" , vp2intersectq(k2, k3, ymm4, ymmword_ptr(rcx, rdx, 0, 128)));
+ TEST_INSTRUCTION("62F2DF4868D1" , vp2intersectq(k2, k3, zmm4, zmm1));
+ TEST_INSTRUCTION("62F2DF4868541102" , vp2intersectq(k2, k3, zmm4, ptr(rcx, rdx, 0, 128)));
+ TEST_INSTRUCTION("62F2DF4868541102" , vp2intersectq(k2, k3, zmm4, zmmword_ptr(rcx, rdx, 0, 128)));
+ TEST_INSTRUCTION("62F25F48524C1A08" , vp4dpwssd(zmm1, zmm4, zmm5, zmm6, zmm7, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("62F25F48524C1A08" , vp4dpwssd(zmm1, zmm4, zmm5, zmm6, zmm7, xmmword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("62F25F48534C1A08" , vp4dpwssds(zmm1, zmm4, zmm5, zmm6, zmm7, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("62F25F48534C1A08" , vp4dpwssds(zmm1, zmm4, zmm5, zmm6, zmm7, xmmword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("C4E2791CCA" , vpabsb(xmm1, xmm2));
+ TEST_INSTRUCTION("C4E2791C8C1A80000000" , vpabsb(xmm1, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("C4E2791C8C1A80000000" , vpabsb(xmm1, xmmword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("C4E27D1CCA" , vpabsb(ymm1, ymm2));
+ TEST_INSTRUCTION("C4E27D1C8C1A80000000" , vpabsb(ymm1, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("C4E27D1C8C1A80000000" , vpabsb(ymm1, ymmword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("62F27D481CCA" , vpabsb(zmm1, zmm2));
+ TEST_INSTRUCTION("62F27D481C4C1A02" , vpabsb(zmm1, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("62F27D481C4C1A02" , vpabsb(zmm1, zmmword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("C4E2791ECA" , vpabsd(xmm1, xmm2));
+ TEST_INSTRUCTION("C4E2791E8C1A80000000" , vpabsd(xmm1, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("C4E2791E8C1A80000000" , vpabsd(xmm1, xmmword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("C4E27D1ECA" , vpabsd(ymm1, ymm2));
+ TEST_INSTRUCTION("C4E27D1E8C1A80000000" , vpabsd(ymm1, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("C4E27D1E8C1A80000000" , vpabsd(ymm1, ymmword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("62F27D481ECA" , vpabsd(zmm1, zmm2));
+ TEST_INSTRUCTION("62F27D481E4C1A02" , vpabsd(zmm1, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("62F27D481E4C1A02" , vpabsd(zmm1, zmmword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("62F2FD081FCA" , vpabsq(xmm1, xmm2));
+ TEST_INSTRUCTION("62F2FD081F4C1A08" , vpabsq(xmm1, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("62F2FD081F4C1A08" , vpabsq(xmm1, xmmword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("62F2FD281FCA" , vpabsq(ymm1, ymm2));
+ TEST_INSTRUCTION("62F2FD281F4C1A04" , vpabsq(ymm1, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("62F2FD281F4C1A04" , vpabsq(ymm1, ymmword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("62F2FD481FCA" , vpabsq(zmm1, zmm2));
+ TEST_INSTRUCTION("62F2FD481F4C1A02" , vpabsq(zmm1, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("62F2FD481F4C1A02" , vpabsq(zmm1, zmmword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("C4E2791DCA" , vpabsw(xmm1, xmm2));
+ TEST_INSTRUCTION("C4E2791D8C1A80000000" , vpabsw(xmm1, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("C4E2791D8C1A80000000" , vpabsw(xmm1, xmmword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("C4E27D1DCA" , vpabsw(ymm1, ymm2));
+ TEST_INSTRUCTION("C4E27D1D8C1A80000000" , vpabsw(ymm1, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("C4E27D1D8C1A80000000" , vpabsw(ymm1, ymmword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("62F27D481DCA" , vpabsw(zmm1, zmm2));
+ TEST_INSTRUCTION("62F27D481D4C1A02" , vpabsw(zmm1, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("62F27D481D4C1A02" , vpabsw(zmm1, zmmword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("C5E96BCB" , vpackssdw(xmm1, xmm2, xmm3));
+ TEST_INSTRUCTION("C5E96B8C2B80000000" , vpackssdw(xmm1, xmm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C5E96B8C2B80000000" , vpackssdw(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C5ED6BCB" , vpackssdw(ymm1, ymm2, ymm3));
+ TEST_INSTRUCTION("C5ED6B8C2B80000000" , vpackssdw(ymm1, ymm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C5ED6B8C2B80000000" , vpackssdw(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F16D486BCB" , vpackssdw(zmm1, zmm2, zmm3));
+ TEST_INSTRUCTION("62F16D486B4C2B02" , vpackssdw(zmm1, zmm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F16D486B4C2B02" , vpackssdw(zmm1, zmm2, zmmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C5E963CB" , vpacksswb(xmm1, xmm2, xmm3));
+ TEST_INSTRUCTION("C5E9638C2B80000000" , vpacksswb(xmm1, xmm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C5E9638C2B80000000" , vpacksswb(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C5ED63CB" , vpacksswb(ymm1, ymm2, ymm3));
+ TEST_INSTRUCTION("C5ED638C2B80000000" , vpacksswb(ymm1, ymm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C5ED638C2B80000000" , vpacksswb(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F16D4863CB" , vpacksswb(zmm1, zmm2, zmm3));
+ TEST_INSTRUCTION("62F16D48634C2B02" , vpacksswb(zmm1, zmm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F16D48634C2B02" , vpacksswb(zmm1, zmm2, zmmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C4E2692BCB" , vpackusdw(xmm1, xmm2, xmm3));
+ TEST_INSTRUCTION("C4E2692B8C2B80000000" , vpackusdw(xmm1, xmm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C4E2692B8C2B80000000" , vpackusdw(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C4E26D2BCB" , vpackusdw(ymm1, ymm2, ymm3));
+ TEST_INSTRUCTION("C4E26D2B8C2B80000000" , vpackusdw(ymm1, ymm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C4E26D2B8C2B80000000" , vpackusdw(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F26D482BCB" , vpackusdw(zmm1, zmm2, zmm3));
+ TEST_INSTRUCTION("62F26D482B4C2B02" , vpackusdw(zmm1, zmm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F26D482B4C2B02" , vpackusdw(zmm1, zmm2, zmmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C5E967CB" , vpackuswb(xmm1, xmm2, xmm3));
+ TEST_INSTRUCTION("C5E9678C2B80000000" , vpackuswb(xmm1, xmm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C5E9678C2B80000000" , vpackuswb(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C5ED67CB" , vpackuswb(ymm1, ymm2, ymm3));
+ TEST_INSTRUCTION("C5ED678C2B80000000" , vpackuswb(ymm1, ymm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C5ED678C2B80000000" , vpackuswb(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F16D4867CB" , vpackuswb(zmm1, zmm2, zmm3));
+ TEST_INSTRUCTION("62F16D48674C2B02" , vpackuswb(zmm1, zmm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F16D48674C2B02" , vpackuswb(zmm1, zmm2, zmmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C5E9FCCB" , vpaddb(xmm1, xmm2, xmm3));
+ TEST_INSTRUCTION("C5E9FC8C2B80000000" , vpaddb(xmm1, xmm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C5E9FC8C2B80000000" , vpaddb(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C5EDFCCB" , vpaddb(ymm1, ymm2, ymm3));
+ TEST_INSTRUCTION("C5EDFC8C2B80000000" , vpaddb(ymm1, ymm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C5EDFC8C2B80000000" , vpaddb(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F16D48FCCB" , vpaddb(zmm1, zmm2, zmm3));
+ TEST_INSTRUCTION("62F16D48FC4C2B02" , vpaddb(zmm1, zmm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F16D48FC4C2B02" , vpaddb(zmm1, zmm2, zmmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C5E9FECB" , vpaddd(xmm1, xmm2, xmm3));
+ TEST_INSTRUCTION("C5E9FE8C2B80000000" , vpaddd(xmm1, xmm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C5E9FE8C2B80000000" , vpaddd(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C5EDFECB" , vpaddd(ymm1, ymm2, ymm3));
+ TEST_INSTRUCTION("C5EDFE8C2B80000000" , vpaddd(ymm1, ymm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C5EDFE8C2B80000000" , vpaddd(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F16D48FECB" , vpaddd(zmm1, zmm2, zmm3));
+ TEST_INSTRUCTION("62F16D48FE4C2B02" , vpaddd(zmm1, zmm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F16D48FE4C2B02" , vpaddd(zmm1, zmm2, zmmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C5E9D4CB" , vpaddq(xmm1, xmm2, xmm3));
+ TEST_INSTRUCTION("C5E9D48C2B80000000" , vpaddq(xmm1, xmm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C5E9D48C2B80000000" , vpaddq(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C5EDD4CB" , vpaddq(ymm1, ymm2, ymm3));
+ TEST_INSTRUCTION("C5EDD48C2B80000000" , vpaddq(ymm1, ymm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C5EDD48C2B80000000" , vpaddq(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F1ED48D4CB" , vpaddq(zmm1, zmm2, zmm3));
+ TEST_INSTRUCTION("62F1ED48D44C2B02" , vpaddq(zmm1, zmm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F1ED48D44C2B02" , vpaddq(zmm1, zmm2, zmmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C5E9ECCB" , vpaddsb(xmm1, xmm2, xmm3));
+ TEST_INSTRUCTION("C5E9EC8C2B80000000" , vpaddsb(xmm1, xmm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C5E9EC8C2B80000000" , vpaddsb(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C5EDECCB" , vpaddsb(ymm1, ymm2, ymm3));
+ TEST_INSTRUCTION("C5EDEC8C2B80000000" , vpaddsb(ymm1, ymm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C5EDEC8C2B80000000" , vpaddsb(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F16D48ECCB" , vpaddsb(zmm1, zmm2, zmm3));
+ TEST_INSTRUCTION("62F16D48EC4C2B02" , vpaddsb(zmm1, zmm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F16D48EC4C2B02" , vpaddsb(zmm1, zmm2, zmmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C5E9EDCB" , vpaddsw(xmm1, xmm2, xmm3));
+ TEST_INSTRUCTION("C5E9ED8C2B80000000" , vpaddsw(xmm1, xmm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C5E9ED8C2B80000000" , vpaddsw(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C5EDEDCB" , vpaddsw(ymm1, ymm2, ymm3));
+ TEST_INSTRUCTION("C5EDED8C2B80000000" , vpaddsw(ymm1, ymm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C5EDED8C2B80000000" , vpaddsw(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F16D48EDCB" , vpaddsw(zmm1, zmm2, zmm3));
+ TEST_INSTRUCTION("62F16D48ED4C2B02" , vpaddsw(zmm1, zmm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F16D48ED4C2B02" , vpaddsw(zmm1, zmm2, zmmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C5E9DCCB" , vpaddusb(xmm1, xmm2, xmm3));
+ TEST_INSTRUCTION("C5E9DC8C2B80000000" , vpaddusb(xmm1, xmm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C5E9DC8C2B80000000" , vpaddusb(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C5EDDCCB" , vpaddusb(ymm1, ymm2, ymm3));
+ TEST_INSTRUCTION("C5EDDC8C2B80000000" , vpaddusb(ymm1, ymm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C5EDDC8C2B80000000" , vpaddusb(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F16D48DCCB" , vpaddusb(zmm1, zmm2, zmm3));
+ TEST_INSTRUCTION("62F16D48DC4C2B02" , vpaddusb(zmm1, zmm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F16D48DC4C2B02" , vpaddusb(zmm1, zmm2, zmmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C5E9DDCB" , vpaddusw(xmm1, xmm2, xmm3));
+ TEST_INSTRUCTION("C5E9DD8C2B80000000" , vpaddusw(xmm1, xmm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C5E9DD8C2B80000000" , vpaddusw(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C5EDDDCB" , vpaddusw(ymm1, ymm2, ymm3));
+ TEST_INSTRUCTION("C5EDDD8C2B80000000" , vpaddusw(ymm1, ymm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C5EDDD8C2B80000000" , vpaddusw(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F16D48DDCB" , vpaddusw(zmm1, zmm2, zmm3));
+ TEST_INSTRUCTION("62F16D48DD4C2B02" , vpaddusw(zmm1, zmm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F16D48DD4C2B02" , vpaddusw(zmm1, zmm2, zmmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C5E9FDCB" , vpaddw(xmm1, xmm2, xmm3));
+ TEST_INSTRUCTION("C5E9FD8C2B80000000" , vpaddw(xmm1, xmm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C5E9FD8C2B80000000" , vpaddw(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C5EDFDCB" , vpaddw(ymm1, ymm2, ymm3));
+ TEST_INSTRUCTION("C5EDFD8C2B80000000" , vpaddw(ymm1, ymm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C5EDFD8C2B80000000" , vpaddw(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F16D48FDCB" , vpaddw(zmm1, zmm2, zmm3));
+ TEST_INSTRUCTION("62F16D48FD4C2B02" , vpaddw(zmm1, zmm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F16D48FD4C2B02" , vpaddw(zmm1, zmm2, zmmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C4E3690FCB01" , vpalignr(xmm1, xmm2, xmm3, 1));
+ TEST_INSTRUCTION("C4E3690F8C2B8000000001" , vpalignr(xmm1, xmm2, ptr(rbx, rbp, 0, 128), 1));
+ TEST_INSTRUCTION("C4E3690F8C2B8000000001" , vpalignr(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128), 1));
+ TEST_INSTRUCTION("C4E36D0FCB01" , vpalignr(ymm1, ymm2, ymm3, 1));
+ TEST_INSTRUCTION("C4E36D0F8C2B8000000001" , vpalignr(ymm1, ymm2, ptr(rbx, rbp, 0, 128), 1));
+ TEST_INSTRUCTION("C4E36D0F8C2B8000000001" , vpalignr(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128), 1));
+ TEST_INSTRUCTION("62F36D480FCB01" , vpalignr(zmm1, zmm2, zmm3, 1));
+ TEST_INSTRUCTION("62F36D480F4C2B0201" , vpalignr(zmm1, zmm2, ptr(rbx, rbp, 0, 128), 1));
+ TEST_INSTRUCTION("62F36D480F4C2B0201" , vpalignr(zmm1, zmm2, zmmword_ptr(rbx, rbp, 0, 128), 1));
+ TEST_INSTRUCTION("C5E9DBCB" , vpand(xmm1, xmm2, xmm3));
+ TEST_INSTRUCTION("C5E9DB8C2B80000000" , vpand(xmm1, xmm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C5E9DB8C2B80000000" , vpand(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C5EDDBCB" , vpand(ymm1, ymm2, ymm3));
+ TEST_INSTRUCTION("C5EDDB8C2B80000000" , vpand(ymm1, ymm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C5EDDB8C2B80000000" , vpand(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F16D08DBCB" , vpandd(xmm1, xmm2, xmm3));
+ TEST_INSTRUCTION("62F16D08DB4C2B08" , vpandd(xmm1, xmm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F16D08DB4C2B08" , vpandd(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F16D28DBCB" , vpandd(ymm1, ymm2, ymm3));
+ TEST_INSTRUCTION("62F16D28DB4C2B04" , vpandd(ymm1, ymm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F16D28DB4C2B04" , vpandd(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F16D48DBCB" , vpandd(zmm1, zmm2, zmm3));
+ TEST_INSTRUCTION("62F16D48DB4C2B02" , vpandd(zmm1, zmm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F16D48DB4C2B02" , vpandd(zmm1, zmm2, zmmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C5E9DFCB" , vpandn(xmm1, xmm2, xmm3));
+ TEST_INSTRUCTION("C5E9DF8C2B80000000" , vpandn(xmm1, xmm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C5E9DF8C2B80000000" , vpandn(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C5EDDFCB" , vpandn(ymm1, ymm2, ymm3));
+ TEST_INSTRUCTION("C5EDDF8C2B80000000" , vpandn(ymm1, ymm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C5EDDF8C2B80000000" , vpandn(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F16D08DFCB" , vpandnd(xmm1, xmm2, xmm3));
+ TEST_INSTRUCTION("62F16D08DF4C2B08" , vpandnd(xmm1, xmm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F16D08DF4C2B08" , vpandnd(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F16D28DFCB" , vpandnd(ymm1, ymm2, ymm3));
+ TEST_INSTRUCTION("62F16D28DF4C2B04" , vpandnd(ymm1, ymm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F16D28DF4C2B04" , vpandnd(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F16D48DFCB" , vpandnd(zmm1, zmm2, zmm3));
+ TEST_INSTRUCTION("62F16D48DF4C2B02" , vpandnd(zmm1, zmm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F16D48DF4C2B02" , vpandnd(zmm1, zmm2, zmmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F1ED08DFCB" , vpandnq(xmm1, xmm2, xmm3));
+ TEST_INSTRUCTION("62F1ED08DF4C2B08" , vpandnq(xmm1, xmm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F1ED08DF4C2B08" , vpandnq(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F1ED28DFCB" , vpandnq(ymm1, ymm2, ymm3));
+ TEST_INSTRUCTION("62F1ED28DF4C2B04" , vpandnq(ymm1, ymm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F1ED28DF4C2B04" , vpandnq(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F1ED48DFCB" , vpandnq(zmm1, zmm2, zmm3));
+ TEST_INSTRUCTION("62F1ED48DF4C2B02" , vpandnq(zmm1, zmm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F1ED48DF4C2B02" , vpandnq(zmm1, zmm2, zmmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F1ED08DBCB" , vpandq(xmm1, xmm2, xmm3));
+ TEST_INSTRUCTION("62F1ED08DB4C2B08" , vpandq(xmm1, xmm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F1ED08DB4C2B08" , vpandq(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F1ED28DBCB" , vpandq(ymm1, ymm2, ymm3));
+ TEST_INSTRUCTION("62F1ED28DB4C2B04" , vpandq(ymm1, ymm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F1ED28DB4C2B04" , vpandq(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F1ED48DBCB" , vpandq(zmm1, zmm2, zmm3));
+ TEST_INSTRUCTION("62F1ED48DB4C2B02" , vpandq(zmm1, zmm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F1ED48DB4C2B02" , vpandq(zmm1, zmm2, zmmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C5E9E0CB" , vpavgb(xmm1, xmm2, xmm3));
+ TEST_INSTRUCTION("C5E9E08C2B80000000" , vpavgb(xmm1, xmm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C5E9E08C2B80000000" , vpavgb(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C5EDE0CB" , vpavgb(ymm1, ymm2, ymm3));
+ TEST_INSTRUCTION("C5EDE08C2B80000000" , vpavgb(ymm1, ymm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C5EDE08C2B80000000" , vpavgb(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F16D48E0CB" , vpavgb(zmm1, zmm2, zmm3));
+ TEST_INSTRUCTION("62F16D48E04C2B02" , vpavgb(zmm1, zmm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F16D48E04C2B02" , vpavgb(zmm1, zmm2, zmmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C5E9E3CB" , vpavgw(xmm1, xmm2, xmm3));
+ TEST_INSTRUCTION("C5E9E38C2B80000000" , vpavgw(xmm1, xmm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C5E9E38C2B80000000" , vpavgw(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C5EDE3CB" , vpavgw(ymm1, ymm2, ymm3));
+ TEST_INSTRUCTION("C5EDE38C2B80000000" , vpavgw(ymm1, ymm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C5EDE38C2B80000000" , vpavgw(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F16D48E3CB" , vpavgw(zmm1, zmm2, zmm3));
+ TEST_INSTRUCTION("62F16D48E34C2B02" , vpavgw(zmm1, zmm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F16D48E34C2B02" , vpavgw(zmm1, zmm2, zmmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C4E36902CB01" , vpblendd(xmm1, xmm2, xmm3, 1));
+ TEST_INSTRUCTION("C4E369028C2B8000000001" , vpblendd(xmm1, xmm2, ptr(rbx, rbp, 0, 128), 1));
+ TEST_INSTRUCTION("C4E369028C2B8000000001" , vpblendd(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128), 1));
+ TEST_INSTRUCTION("C4E36D02CB01" , vpblendd(ymm1, ymm2, ymm3, 1));
+ TEST_INSTRUCTION("C4E36D028C2B8000000001" , vpblendd(ymm1, ymm2, ptr(rbx, rbp, 0, 128), 1));
+ TEST_INSTRUCTION("C4E36D028C2B8000000001" , vpblendd(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128), 1));
+ TEST_INSTRUCTION("62F26D0866CB" , vpblendmb(xmm1, xmm2, xmm3));
+ TEST_INSTRUCTION("62F26D08664C2B08" , vpblendmb(xmm1, xmm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F26D08664C2B08" , vpblendmb(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F26D2866CB" , vpblendmb(ymm1, ymm2, ymm3));
+ TEST_INSTRUCTION("62F26D28664C2B04" , vpblendmb(ymm1, ymm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F26D28664C2B04" , vpblendmb(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F26D4866CB" , vpblendmb(zmm1, zmm2, zmm3));
+ TEST_INSTRUCTION("62F26D48664C2B02" , vpblendmb(zmm1, zmm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F26D48664C2B02" , vpblendmb(zmm1, zmm2, zmmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F26D0864CB" , vpblendmd(xmm1, xmm2, xmm3));
+ TEST_INSTRUCTION("62F26D08644C2B08" , vpblendmd(xmm1, xmm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F26D08644C2B08" , vpblendmd(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F26D2864CB" , vpblendmd(ymm1, ymm2, ymm3));
+ TEST_INSTRUCTION("62F26D28644C2B04" , vpblendmd(ymm1, ymm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F26D28644C2B04" , vpblendmd(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F26D4864CB" , vpblendmd(zmm1, zmm2, zmm3));
+ TEST_INSTRUCTION("62F26D48644C2B02" , vpblendmd(zmm1, zmm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F26D48644C2B02" , vpblendmd(zmm1, zmm2, zmmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F2ED0864CB" , vpblendmq(xmm1, xmm2, xmm3));
+ TEST_INSTRUCTION("62F2ED08644C2B08" , vpblendmq(xmm1, xmm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F2ED08644C2B08" , vpblendmq(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F2ED2864CB" , vpblendmq(ymm1, ymm2, ymm3));
+ TEST_INSTRUCTION("62F2ED28644C2B04" , vpblendmq(ymm1, ymm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F2ED28644C2B04" , vpblendmq(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F2ED4864CB" , vpblendmq(zmm1, zmm2, zmm3));
+ TEST_INSTRUCTION("62F2ED48644C2B02" , vpblendmq(zmm1, zmm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F2ED48644C2B02" , vpblendmq(zmm1, zmm2, zmmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F2ED0866CB" , vpblendmw(xmm1, xmm2, xmm3));
+ TEST_INSTRUCTION("62F2ED08664C2B08" , vpblendmw(xmm1, xmm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F2ED08664C2B08" , vpblendmw(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F2ED2866CB" , vpblendmw(ymm1, ymm2, ymm3));
+ TEST_INSTRUCTION("62F2ED28664C2B04" , vpblendmw(ymm1, ymm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F2ED28664C2B04" , vpblendmw(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F2ED4866CB" , vpblendmw(zmm1, zmm2, zmm3));
+ TEST_INSTRUCTION("62F2ED48664C2B02" , vpblendmw(zmm1, zmm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F2ED48664C2B02" , vpblendmw(zmm1, zmm2, zmmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C4E3694CCB40" , vpblendvb(xmm1, xmm2, xmm3, xmm4));
+ TEST_INSTRUCTION("C4E3694C8C2B8000000060" , vpblendvb(xmm1, xmm2, ptr(rbx, rbp, 0, 128), xmm6));
+ TEST_INSTRUCTION("C4E3694C8C2B8000000060" , vpblendvb(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128), xmm6));
+ TEST_INSTRUCTION("C4E36D4CCB40" , vpblendvb(ymm1, ymm2, ymm3, ymm4));
+ TEST_INSTRUCTION("C4E36D4C8C2B8000000060" , vpblendvb(ymm1, ymm2, ptr(rbx, rbp, 0, 128), ymm6));
+ TEST_INSTRUCTION("C4E36D4C8C2B8000000060" , vpblendvb(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128), ymm6));
+ TEST_INSTRUCTION("C4E3690ECB01" , vpblendw(xmm1, xmm2, xmm3, 1));
+ TEST_INSTRUCTION("C4E3690E8C2B8000000001" , vpblendw(xmm1, xmm2, ptr(rbx, rbp, 0, 128), 1));
+ TEST_INSTRUCTION("C4E3690E8C2B8000000001" , vpblendw(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128), 1));
+ TEST_INSTRUCTION("C4E36D0ECB01" , vpblendw(ymm1, ymm2, ymm3, 1));
+ TEST_INSTRUCTION("C4E36D0E8C2B8000000001" , vpblendw(ymm1, ymm2, ptr(rbx, rbp, 0, 128), 1));
+ TEST_INSTRUCTION("C4E36D0E8C2B8000000001" , vpblendw(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128), 1));
+ TEST_INSTRUCTION("62F27D087ACA" , vpbroadcastb(xmm1, edx));
+ TEST_INSTRUCTION("C4E27978CA" , vpbroadcastb(xmm1, xmm2));
+ TEST_INSTRUCTION("C4E279788C1A80000000" , vpbroadcastb(xmm1, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("C4E279788C1A80000000" , vpbroadcastb(xmm1, byte_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("62F27D287ACA" , vpbroadcastb(ymm1, edx));
+ TEST_INSTRUCTION("C4E27D78CA" , vpbroadcastb(ymm1, xmm2));
+ TEST_INSTRUCTION("C4E27D788C1A80000000" , vpbroadcastb(ymm1, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("C4E27D788C1A80000000" , vpbroadcastb(ymm1, byte_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("62F27D487ACA" , vpbroadcastb(zmm1, edx));
+ TEST_INSTRUCTION("62F27D4878CA" , vpbroadcastb(zmm1, xmm2));
+ TEST_INSTRUCTION("62F27D48788C1A80000000" , vpbroadcastb(zmm1, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("62F27D48788C1A80000000" , vpbroadcastb(zmm1, byte_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("62F27D087CCA" , vpbroadcastd(xmm1, edx));
+ TEST_INSTRUCTION("C4E27958CA" , vpbroadcastd(xmm1, xmm2));
+ TEST_INSTRUCTION("C4E279588C1A80000000" , vpbroadcastd(xmm1, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("C4E279588C1A80000000" , vpbroadcastd(xmm1, dword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("62F27D287CCA" , vpbroadcastd(ymm1, edx));
+ TEST_INSTRUCTION("C4E27D58CA" , vpbroadcastd(ymm1, xmm2));
+ TEST_INSTRUCTION("C4E27D588C1A80000000" , vpbroadcastd(ymm1, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("C4E27D588C1A80000000" , vpbroadcastd(ymm1, dword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("62F27D487CCA" , vpbroadcastd(zmm1, edx));
+ TEST_INSTRUCTION("62F27D4858CA" , vpbroadcastd(zmm1, xmm2));
+ TEST_INSTRUCTION("62F27D48584C1A20" , vpbroadcastd(zmm1, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("62F27D48584C1A20" , vpbroadcastd(zmm1, dword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("62F2FE082ACA" , vpbroadcastmb2q(xmm1, k2));
+ TEST_INSTRUCTION("62F2FE282ACA" , vpbroadcastmb2q(ymm1, k2));
+ TEST_INSTRUCTION("62F2FE482ACA" , vpbroadcastmb2q(zmm1, k2));
+ TEST_INSTRUCTION("62F27E083ACA" , vpbroadcastmw2d(xmm1, k2));
+ TEST_INSTRUCTION("62F27E283ACA" , vpbroadcastmw2d(ymm1, k2));
+ TEST_INSTRUCTION("62F27E483ACA" , vpbroadcastmw2d(zmm1, k2));
+ TEST_INSTRUCTION("62F2FD087CCA" , vpbroadcastq(xmm1, rdx));
+ TEST_INSTRUCTION("C4E27959CA" , vpbroadcastq(xmm1, xmm2));
+ TEST_INSTRUCTION("C4E279598C1A80000000" , vpbroadcastq(xmm1, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("C4E279598C1A80000000" , vpbroadcastq(xmm1, qword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("62F2FD287CCA" , vpbroadcastq(ymm1, rdx));
+ TEST_INSTRUCTION("C4E27D59CA" , vpbroadcastq(ymm1, xmm2));
+ TEST_INSTRUCTION("C4E27D598C1A80000000" , vpbroadcastq(ymm1, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("C4E27D598C1A80000000" , vpbroadcastq(ymm1, qword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("62F2FD487CCA" , vpbroadcastq(zmm1, rdx));
+ TEST_INSTRUCTION("62F2FD4859CA" , vpbroadcastq(zmm1, xmm2));
+ TEST_INSTRUCTION("62F2FD48594C1A10" , vpbroadcastq(zmm1, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("62F2FD48594C1A10" , vpbroadcastq(zmm1, qword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("62F27D087BCA" , vpbroadcastw(xmm1, edx));
+ TEST_INSTRUCTION("C4E27979CA" , vpbroadcastw(xmm1, xmm2));
+ TEST_INSTRUCTION("C4E279798C1A80000000" , vpbroadcastw(xmm1, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("C4E279798C1A80000000" , vpbroadcastw(xmm1, word_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("62F27D287BCA" , vpbroadcastw(ymm1, edx));
+ TEST_INSTRUCTION("C4E27D79CA" , vpbroadcastw(ymm1, xmm2));
+ TEST_INSTRUCTION("C4E27D798C1A80000000" , vpbroadcastw(ymm1, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("C4E27D798C1A80000000" , vpbroadcastw(ymm1, word_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("62F27D487BCA" , vpbroadcastw(zmm1, edx));
+ TEST_INSTRUCTION("62F27D4879CA" , vpbroadcastw(zmm1, xmm2));
+ TEST_INSTRUCTION("62F27D48794C1A40" , vpbroadcastw(zmm1, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("62F27D48794C1A40" , vpbroadcastw(zmm1, word_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("C4E36944CB01" , vpclmulqdq(xmm1, xmm2, xmm3, 1));
+ TEST_INSTRUCTION("C4E369448C2B8000000001" , vpclmulqdq(xmm1, xmm2, ptr(rbx, rbp, 0, 128), 1));
+ TEST_INSTRUCTION("C4E369448C2B8000000001" , vpclmulqdq(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128), 1));
+ TEST_INSTRUCTION("C4E36D44CB01" , vpclmulqdq(ymm1, ymm2, ymm3, 1));
+ TEST_INSTRUCTION("C4E36D448C2B8000000001" , vpclmulqdq(ymm1, ymm2, ptr(rbx, rbp, 0, 128), 1));
+ TEST_INSTRUCTION("C4E36D448C2B8000000001" , vpclmulqdq(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128), 1));
+ TEST_INSTRUCTION("62F36D4844CB01" , vpclmulqdq(zmm1, zmm2, zmm3, 1));
+ TEST_INSTRUCTION("62F36D48444C2B0201" , vpclmulqdq(zmm1, zmm2, ptr(rbx, rbp, 0, 128), 1));
+ TEST_INSTRUCTION("62F36D48444C2B0201" , vpclmulqdq(zmm1, zmm2, zmmword_ptr(rbx, rbp, 0, 128), 1));
+ TEST_INSTRUCTION("8FE868A2CB40" , vpcmov(xmm1, xmm2, xmm3, xmm4));
+ TEST_INSTRUCTION("8FE8E8A28C358000000030" , vpcmov(xmm1, xmm2, xmm3, ptr(rbp, rsi, 0, 128)));
+ TEST_INSTRUCTION("8FE8E8A28C358000000030" , vpcmov(xmm1, xmm2, xmm3, xmmword_ptr(rbp, rsi, 0, 128)));
+ TEST_INSTRUCTION("8FE868A28C2B8000000060" , vpcmov(xmm1, xmm2, ptr(rbx, rbp, 0, 128), xmm6));
+ TEST_INSTRUCTION("8FE868A28C2B8000000060" , vpcmov(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128), xmm6));
+ TEST_INSTRUCTION("8FE86CA2CB40" , vpcmov(ymm1, ymm2, ymm3, ymm4));
+ TEST_INSTRUCTION("8FE8ECA28C358000000030" , vpcmov(ymm1, ymm2, ymm3, ptr(rbp, rsi, 0, 128)));
+ TEST_INSTRUCTION("8FE8ECA28C358000000030" , vpcmov(ymm1, ymm2, ymm3, ymmword_ptr(rbp, rsi, 0, 128)));
+ TEST_INSTRUCTION("8FE86CA28C2B8000000060" , vpcmov(ymm1, ymm2, ptr(rbx, rbp, 0, 128), ymm6));
+ TEST_INSTRUCTION("8FE86CA28C2B8000000060" , vpcmov(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128), ymm6));
+ TEST_INSTRUCTION("62F36D083FCB01" , vpcmpb(k1, xmm2, xmm3, 1));
+ TEST_INSTRUCTION("62F36D083F4C2B0801" , vpcmpb(k1, xmm2, ptr(rbx, rbp, 0, 128), 1));
+ TEST_INSTRUCTION("62F36D083F4C2B0801" , vpcmpb(k1, xmm2, xmmword_ptr(rbx, rbp, 0, 128), 1));
+ TEST_INSTRUCTION("62F36D283FCB01" , vpcmpb(k1, ymm2, ymm3, 1));
+ TEST_INSTRUCTION("62F36D283F4C2B0401" , vpcmpb(k1, ymm2, ptr(rbx, rbp, 0, 128), 1));
+ TEST_INSTRUCTION("62F36D283F4C2B0401" , vpcmpb(k1, ymm2, ymmword_ptr(rbx, rbp, 0, 128), 1));
+ TEST_INSTRUCTION("62F36D483FCB01" , vpcmpb(k1, zmm2, zmm3, 1));
+ TEST_INSTRUCTION("62F36D483F4C2B0201" , vpcmpb(k1, zmm2, ptr(rbx, rbp, 0, 128), 1));
+ TEST_INSTRUCTION("62F36D483F4C2B0201" , vpcmpb(k1, zmm2, zmmword_ptr(rbx, rbp, 0, 128), 1));
+ TEST_INSTRUCTION("62F36D081FCB01" , vpcmpd(k1, xmm2, xmm3, 1));
+ TEST_INSTRUCTION("62F36D081F4C2B0801" , vpcmpd(k1, xmm2, ptr(rbx, rbp, 0, 128), 1));
+ TEST_INSTRUCTION("62F36D081F4C2B0801" , vpcmpd(k1, xmm2, xmmword_ptr(rbx, rbp, 0, 128), 1));
+ TEST_INSTRUCTION("62F36D281FCB01" , vpcmpd(k1, ymm2, ymm3, 1));
+ TEST_INSTRUCTION("62F36D281F4C2B0401" , vpcmpd(k1, ymm2, ptr(rbx, rbp, 0, 128), 1));
+ TEST_INSTRUCTION("62F36D281F4C2B0401" , vpcmpd(k1, ymm2, ymmword_ptr(rbx, rbp, 0, 128), 1));
+ TEST_INSTRUCTION("62F36D481FCB01" , vpcmpd(k1, zmm2, zmm3, 1));
+ TEST_INSTRUCTION("62F36D481F4C2B0201" , vpcmpd(k1, zmm2, ptr(rbx, rbp, 0, 128), 1));
+ TEST_INSTRUCTION("62F36D481F4C2B0201" , vpcmpd(k1, zmm2, zmmword_ptr(rbx, rbp, 0, 128), 1));
+ TEST_INSTRUCTION("C5E974CB" , vpcmpeqb(xmm1, xmm2, xmm3));
+ TEST_INSTRUCTION("C5E9748C2B80000000" , vpcmpeqb(xmm1, xmm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C5E9748C2B80000000" , vpcmpeqb(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F16D0874CB" , vpcmpeqb(k1, xmm2, xmm3));
+ TEST_INSTRUCTION("62F16D08744C2B08" , vpcmpeqb(k1, xmm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F16D08744C2B08" , vpcmpeqb(k1, xmm2, xmmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C5ED74CB" , vpcmpeqb(ymm1, ymm2, ymm3));
+ TEST_INSTRUCTION("C5ED748C2B80000000" , vpcmpeqb(ymm1, ymm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C5ED748C2B80000000" , vpcmpeqb(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F16D2874CB" , vpcmpeqb(k1, ymm2, ymm3));
+ TEST_INSTRUCTION("62F16D28744C2B04" , vpcmpeqb(k1, ymm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F16D28744C2B04" , vpcmpeqb(k1, ymm2, ymmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F16D4874CB" , vpcmpeqb(k1, zmm2, zmm3));
+ TEST_INSTRUCTION("62F16D48744C2B02" , vpcmpeqb(k1, zmm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F16D48744C2B02" , vpcmpeqb(k1, zmm2, zmmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C5E976CB" , vpcmpeqd(xmm1, xmm2, xmm3));
+ TEST_INSTRUCTION("C5E9768C2B80000000" , vpcmpeqd(xmm1, xmm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C5E9768C2B80000000" , vpcmpeqd(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F16D0876CB" , vpcmpeqd(k1, xmm2, xmm3));
+ TEST_INSTRUCTION("62F16D08764C2B08" , vpcmpeqd(k1, xmm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F16D08764C2B08" , vpcmpeqd(k1, xmm2, xmmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C5ED76CB" , vpcmpeqd(ymm1, ymm2, ymm3));
+ TEST_INSTRUCTION("C5ED768C2B80000000" , vpcmpeqd(ymm1, ymm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C5ED768C2B80000000" , vpcmpeqd(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F16D2876CB" , vpcmpeqd(k1, ymm2, ymm3));
+ TEST_INSTRUCTION("62F16D28764C2B04" , vpcmpeqd(k1, ymm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F16D28764C2B04" , vpcmpeqd(k1, ymm2, ymmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F16D4876CB" , vpcmpeqd(k1, zmm2, zmm3));
+ TEST_INSTRUCTION("62F16D48764C2B02" , vpcmpeqd(k1, zmm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F16D48764C2B02" , vpcmpeqd(k1, zmm2, zmmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C4E26929CB" , vpcmpeqq(xmm1, xmm2, xmm3));
+ TEST_INSTRUCTION("C4E269298C2B80000000" , vpcmpeqq(xmm1, xmm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C4E269298C2B80000000" , vpcmpeqq(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F2ED0829CB" , vpcmpeqq(k1, xmm2, xmm3));
+ TEST_INSTRUCTION("62F2ED08294C2B08" , vpcmpeqq(k1, xmm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F2ED08294C2B08" , vpcmpeqq(k1, xmm2, xmmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C4E26D29CB" , vpcmpeqq(ymm1, ymm2, ymm3));
+ TEST_INSTRUCTION("C4E26D298C2B80000000" , vpcmpeqq(ymm1, ymm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C4E26D298C2B80000000" , vpcmpeqq(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F2ED2829CB" , vpcmpeqq(k1, ymm2, ymm3));
+ TEST_INSTRUCTION("62F2ED28294C2B04" , vpcmpeqq(k1, ymm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F2ED28294C2B04" , vpcmpeqq(k1, ymm2, ymmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F2ED4829CB" , vpcmpeqq(k1, zmm2, zmm3));
+ TEST_INSTRUCTION("62F2ED48294C2B02" , vpcmpeqq(k1, zmm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F2ED48294C2B02" , vpcmpeqq(k1, zmm2, zmmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C5E975CB" , vpcmpeqw(xmm1, xmm2, xmm3));
+ TEST_INSTRUCTION("C5E9758C2B80000000" , vpcmpeqw(xmm1, xmm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C5E9758C2B80000000" , vpcmpeqw(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F16D0875CB" , vpcmpeqw(k1, xmm2, xmm3));
+ TEST_INSTRUCTION("62F16D08754C2B08" , vpcmpeqw(k1, xmm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F16D08754C2B08" , vpcmpeqw(k1, xmm2, xmmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C5ED75CB" , vpcmpeqw(ymm1, ymm2, ymm3));
+ TEST_INSTRUCTION("C5ED758C2B80000000" , vpcmpeqw(ymm1, ymm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C5ED758C2B80000000" , vpcmpeqw(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F16D2875CB" , vpcmpeqw(k1, ymm2, ymm3));
+ TEST_INSTRUCTION("62F16D28754C2B04" , vpcmpeqw(k1, ymm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F16D28754C2B04" , vpcmpeqw(k1, ymm2, ymmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F16D4875CB" , vpcmpeqw(k1, zmm2, zmm3));
+ TEST_INSTRUCTION("62F16D48754C2B02" , vpcmpeqw(k1, zmm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F16D48754C2B02" , vpcmpeqw(k1, zmm2, zmmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C4E37961CA01" , vpcmpestri(xmm1, xmm2, 1, ecx, eax, edx));
+ TEST_INSTRUCTION("C4E379618C1A8000000001" , vpcmpestri(xmm1, ptr(rdx, rbx, 0, 128), 1, ecx, eax, edx));
+ TEST_INSTRUCTION("C4E379618C1A8000000001" , vpcmpestri(xmm1, xmmword_ptr(rdx, rbx, 0, 128), 1, ecx, eax, edx));
+ TEST_INSTRUCTION("C4E37960CA01" , vpcmpestrm(xmm1, xmm2, 1, xmm0, eax, edx));
+ TEST_INSTRUCTION("C4E379608C1A8000000001" , vpcmpestrm(xmm1, ptr(rdx, rbx, 0, 128), 1, xmm0, eax, edx));
+ TEST_INSTRUCTION("C4E379608C1A8000000001" , vpcmpestrm(xmm1, xmmword_ptr(rdx, rbx, 0, 128), 1, xmm0, eax, edx));
+ TEST_INSTRUCTION("C5E964CB" , vpcmpgtb(xmm1, xmm2, xmm3));
+ TEST_INSTRUCTION("C5E9648C2B80000000" , vpcmpgtb(xmm1, xmm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C5E9648C2B80000000" , vpcmpgtb(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F16D0864CB" , vpcmpgtb(k1, xmm2, xmm3));
+ TEST_INSTRUCTION("62F16D08644C2B08" , vpcmpgtb(k1, xmm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F16D08644C2B08" , vpcmpgtb(k1, xmm2, xmmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C5ED64CB" , vpcmpgtb(ymm1, ymm2, ymm3));
+ TEST_INSTRUCTION("C5ED648C2B80000000" , vpcmpgtb(ymm1, ymm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C5ED648C2B80000000" , vpcmpgtb(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F16D2864CB" , vpcmpgtb(k1, ymm2, ymm3));
+ TEST_INSTRUCTION("62F16D28644C2B04" , vpcmpgtb(k1, ymm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F16D28644C2B04" , vpcmpgtb(k1, ymm2, ymmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F16D4864CB" , vpcmpgtb(k1, zmm2, zmm3));
+ TEST_INSTRUCTION("62F16D48644C2B02" , vpcmpgtb(k1, zmm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F16D48644C2B02" , vpcmpgtb(k1, zmm2, zmmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C5E966CB" , vpcmpgtd(xmm1, xmm2, xmm3));
+ TEST_INSTRUCTION("C5E9668C2B80000000" , vpcmpgtd(xmm1, xmm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C5E9668C2B80000000" , vpcmpgtd(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F16D0866CB" , vpcmpgtd(k1, xmm2, xmm3));
+ TEST_INSTRUCTION("62F16D08664C2B08" , vpcmpgtd(k1, xmm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F16D08664C2B08" , vpcmpgtd(k1, xmm2, xmmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C5ED66CB" , vpcmpgtd(ymm1, ymm2, ymm3));
+ TEST_INSTRUCTION("C5ED668C2B80000000" , vpcmpgtd(ymm1, ymm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C5ED668C2B80000000" , vpcmpgtd(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F16D2866CB" , vpcmpgtd(k1, ymm2, ymm3));
+ TEST_INSTRUCTION("62F16D28664C2B04" , vpcmpgtd(k1, ymm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F16D28664C2B04" , vpcmpgtd(k1, ymm2, ymmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F16D4866CB" , vpcmpgtd(k1, zmm2, zmm3));
+ TEST_INSTRUCTION("62F16D48664C2B02" , vpcmpgtd(k1, zmm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F16D48664C2B02" , vpcmpgtd(k1, zmm2, zmmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C4E26937CB" , vpcmpgtq(xmm1, xmm2, xmm3));
+ TEST_INSTRUCTION("C4E269378C2B80000000" , vpcmpgtq(xmm1, xmm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C4E269378C2B80000000" , vpcmpgtq(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F2ED0837CB" , vpcmpgtq(k1, xmm2, xmm3));
+ TEST_INSTRUCTION("62F2ED08374C2B08" , vpcmpgtq(k1, xmm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F2ED08374C2B08" , vpcmpgtq(k1, xmm2, xmmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C4E26D37CB" , vpcmpgtq(ymm1, ymm2, ymm3));
+ TEST_INSTRUCTION("C4E26D378C2B80000000" , vpcmpgtq(ymm1, ymm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C4E26D378C2B80000000" , vpcmpgtq(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F2ED2837CB" , vpcmpgtq(k1, ymm2, ymm3));
+ TEST_INSTRUCTION("62F2ED28374C2B04" , vpcmpgtq(k1, ymm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F2ED28374C2B04" , vpcmpgtq(k1, ymm2, ymmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F2ED4837CB" , vpcmpgtq(k1, zmm2, zmm3));
+ TEST_INSTRUCTION("62F2ED48374C2B02" , vpcmpgtq(k1, zmm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F2ED48374C2B02" , vpcmpgtq(k1, zmm2, zmmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C5E965CB" , vpcmpgtw(xmm1, xmm2, xmm3));
+ TEST_INSTRUCTION("C5E9658C2B80000000" , vpcmpgtw(xmm1, xmm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C5E9658C2B80000000" , vpcmpgtw(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F16D0865CB" , vpcmpgtw(k1, xmm2, xmm3));
+ TEST_INSTRUCTION("62F16D08654C2B08" , vpcmpgtw(k1, xmm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F16D08654C2B08" , vpcmpgtw(k1, xmm2, xmmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C5ED65CB" , vpcmpgtw(ymm1, ymm2, ymm3));
+ TEST_INSTRUCTION("C5ED658C2B80000000" , vpcmpgtw(ymm1, ymm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C5ED658C2B80000000" , vpcmpgtw(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F16D2865CB" , vpcmpgtw(k1, ymm2, ymm3));
+ TEST_INSTRUCTION("62F16D28654C2B04" , vpcmpgtw(k1, ymm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F16D28654C2B04" , vpcmpgtw(k1, ymm2, ymmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F16D4865CB" , vpcmpgtw(k1, zmm2, zmm3));
+ TEST_INSTRUCTION("62F16D48654C2B02" , vpcmpgtw(k1, zmm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F16D48654C2B02" , vpcmpgtw(k1, zmm2, zmmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C4E37963CA01" , vpcmpistri(xmm1, xmm2, 1, ecx));
+ TEST_INSTRUCTION("C4E379638C1A8000000001" , vpcmpistri(xmm1, ptr(rdx, rbx, 0, 128), 1, ecx));
+ TEST_INSTRUCTION("C4E379638C1A8000000001" , vpcmpistri(xmm1, xmmword_ptr(rdx, rbx, 0, 128), 1, ecx));
+ TEST_INSTRUCTION("C4E37962CA01" , vpcmpistrm(xmm1, xmm2, 1, xmm0));
+ TEST_INSTRUCTION("C4E379628C1A8000000001" , vpcmpistrm(xmm1, ptr(rdx, rbx, 0, 128), 1, xmm0));
+ TEST_INSTRUCTION("C4E379628C1A8000000001" , vpcmpistrm(xmm1, xmmword_ptr(rdx, rbx, 0, 128), 1, xmm0));
+ TEST_INSTRUCTION("62F3ED081FCB01" , vpcmpq(k1, xmm2, xmm3, 1));
+ TEST_INSTRUCTION("62F3ED081F4C2B0801" , vpcmpq(k1, xmm2, ptr(rbx, rbp, 0, 128), 1));
+ TEST_INSTRUCTION("62F3ED081F4C2B0801" , vpcmpq(k1, xmm2, xmmword_ptr(rbx, rbp, 0, 128), 1));
+ TEST_INSTRUCTION("62F3ED281FCB01" , vpcmpq(k1, ymm2, ymm3, 1));
+ TEST_INSTRUCTION("62F3ED281F4C2B0401" , vpcmpq(k1, ymm2, ptr(rbx, rbp, 0, 128), 1));
+ TEST_INSTRUCTION("62F3ED281F4C2B0401" , vpcmpq(k1, ymm2, ymmword_ptr(rbx, rbp, 0, 128), 1));
+ TEST_INSTRUCTION("62F3ED481FCB01" , vpcmpq(k1, zmm2, zmm3, 1));
+ TEST_INSTRUCTION("62F3ED481F4C2B0201" , vpcmpq(k1, zmm2, ptr(rbx, rbp, 0, 128), 1));
+ TEST_INSTRUCTION("62F3ED481F4C2B0201" , vpcmpq(k1, zmm2, zmmword_ptr(rbx, rbp, 0, 128), 1));
+ TEST_INSTRUCTION("62F36D083ECB01" , vpcmpub(k1, xmm2, xmm3, 1));
+ TEST_INSTRUCTION("62F36D083E4C2B0801" , vpcmpub(k1, xmm2, ptr(rbx, rbp, 0, 128), 1));
+ TEST_INSTRUCTION("62F36D083E4C2B0801" , vpcmpub(k1, xmm2, xmmword_ptr(rbx, rbp, 0, 128), 1));
+ TEST_INSTRUCTION("62F36D283ECB01" , vpcmpub(k1, ymm2, ymm3, 1));
+ TEST_INSTRUCTION("62F36D283E4C2B0401" , vpcmpub(k1, ymm2, ptr(rbx, rbp, 0, 128), 1));
+ TEST_INSTRUCTION("62F36D283E4C2B0401" , vpcmpub(k1, ymm2, ymmword_ptr(rbx, rbp, 0, 128), 1));
+ TEST_INSTRUCTION("62F36D483ECB01" , vpcmpub(k1, zmm2, zmm3, 1));
+ TEST_INSTRUCTION("62F36D483E4C2B0201" , vpcmpub(k1, zmm2, ptr(rbx, rbp, 0, 128), 1));
+ TEST_INSTRUCTION("62F36D483E4C2B0201" , vpcmpub(k1, zmm2, zmmword_ptr(rbx, rbp, 0, 128), 1));
+ TEST_INSTRUCTION("62F36D081ECB01" , vpcmpud(k1, xmm2, xmm3, 1));
+ TEST_INSTRUCTION("62F36D081E4C2B0801" , vpcmpud(k1, xmm2, ptr(rbx, rbp, 0, 128), 1));
+ TEST_INSTRUCTION("62F36D081E4C2B0801" , vpcmpud(k1, xmm2, xmmword_ptr(rbx, rbp, 0, 128), 1));
+ TEST_INSTRUCTION("62F36D281ECB01" , vpcmpud(k1, ymm2, ymm3, 1));
+ TEST_INSTRUCTION("62F36D281E4C2B0401" , vpcmpud(k1, ymm2, ptr(rbx, rbp, 0, 128), 1));
+ TEST_INSTRUCTION("62F36D281E4C2B0401" , vpcmpud(k1, ymm2, ymmword_ptr(rbx, rbp, 0, 128), 1));
+ TEST_INSTRUCTION("62F36D481ECB01" , vpcmpud(k1, zmm2, zmm3, 1));
+ TEST_INSTRUCTION("62F36D481E4C2B0201" , vpcmpud(k1, zmm2, ptr(rbx, rbp, 0, 128), 1));
+ TEST_INSTRUCTION("62F36D481E4C2B0201" , vpcmpud(k1, zmm2, zmmword_ptr(rbx, rbp, 0, 128), 1));
+ TEST_INSTRUCTION("62F3ED081ECB01" , vpcmpuq(k1, xmm2, xmm3, 1));
+ TEST_INSTRUCTION("62F3ED081E4C2B0801" , vpcmpuq(k1, xmm2, ptr(rbx, rbp, 0, 128), 1));
+ TEST_INSTRUCTION("62F3ED081E4C2B0801" , vpcmpuq(k1, xmm2, xmmword_ptr(rbx, rbp, 0, 128), 1));
+ TEST_INSTRUCTION("62F3ED281ECB01" , vpcmpuq(k1, ymm2, ymm3, 1));
+ TEST_INSTRUCTION("62F3ED281E4C2B0401" , vpcmpuq(k1, ymm2, ptr(rbx, rbp, 0, 128), 1));
+ TEST_INSTRUCTION("62F3ED281E4C2B0401" , vpcmpuq(k1, ymm2, ymmword_ptr(rbx, rbp, 0, 128), 1));
+ TEST_INSTRUCTION("62F3ED481ECB01" , vpcmpuq(k1, zmm2, zmm3, 1));
+ TEST_INSTRUCTION("62F3ED481E4C2B0201" , vpcmpuq(k1, zmm2, ptr(rbx, rbp, 0, 128), 1));
+ TEST_INSTRUCTION("62F3ED481E4C2B0201" , vpcmpuq(k1, zmm2, zmmword_ptr(rbx, rbp, 0, 128), 1));
+ TEST_INSTRUCTION("62F3ED083ECB01" , vpcmpuw(k1, xmm2, xmm3, 1));
+ TEST_INSTRUCTION("62F3ED083E4C2B0801" , vpcmpuw(k1, xmm2, ptr(rbx, rbp, 0, 128), 1));
+ TEST_INSTRUCTION("62F3ED083E4C2B0801" , vpcmpuw(k1, xmm2, xmmword_ptr(rbx, rbp, 0, 128), 1));
+ TEST_INSTRUCTION("62F3ED283ECB01" , vpcmpuw(k1, ymm2, ymm3, 1));
+ TEST_INSTRUCTION("62F3ED283E4C2B0401" , vpcmpuw(k1, ymm2, ptr(rbx, rbp, 0, 128), 1));
+ TEST_INSTRUCTION("62F3ED283E4C2B0401" , vpcmpuw(k1, ymm2, ymmword_ptr(rbx, rbp, 0, 128), 1));
+ TEST_INSTRUCTION("62F3ED483ECB01" , vpcmpuw(k1, zmm2, zmm3, 1));
+ TEST_INSTRUCTION("62F3ED483E4C2B0201" , vpcmpuw(k1, zmm2, ptr(rbx, rbp, 0, 128), 1));
+ TEST_INSTRUCTION("62F3ED483E4C2B0201" , vpcmpuw(k1, zmm2, zmmword_ptr(rbx, rbp, 0, 128), 1));
+ TEST_INSTRUCTION("62F3ED083FCB01" , vpcmpw(k1, xmm2, xmm3, 1));
+ TEST_INSTRUCTION("62F3ED083F4C2B0801" , vpcmpw(k1, xmm2, ptr(rbx, rbp, 0, 128), 1));
+ TEST_INSTRUCTION("62F3ED083F4C2B0801" , vpcmpw(k1, xmm2, xmmword_ptr(rbx, rbp, 0, 128), 1));
+ TEST_INSTRUCTION("62F3ED283FCB01" , vpcmpw(k1, ymm2, ymm3, 1));
+ TEST_INSTRUCTION("62F3ED283F4C2B0401" , vpcmpw(k1, ymm2, ptr(rbx, rbp, 0, 128), 1));
+ TEST_INSTRUCTION("62F3ED283F4C2B0401" , vpcmpw(k1, ymm2, ymmword_ptr(rbx, rbp, 0, 128), 1));
+ TEST_INSTRUCTION("62F3ED483FCB01" , vpcmpw(k1, zmm2, zmm3, 1));
+ TEST_INSTRUCTION("62F3ED483F4C2B0201" , vpcmpw(k1, zmm2, ptr(rbx, rbp, 0, 128), 1));
+ TEST_INSTRUCTION("62F3ED483F4C2B0201" , vpcmpw(k1, zmm2, zmmword_ptr(rbx, rbp, 0, 128), 1));
+ TEST_INSTRUCTION("8FE868CCCB01" , vpcomb(xmm1, xmm2, xmm3, 1));
+ TEST_INSTRUCTION("8FE868CC8C2B8000000001" , vpcomb(xmm1, xmm2, ptr(rbx, rbp, 0, 128), 1));
+ TEST_INSTRUCTION("8FE868CC8C2B8000000001" , vpcomb(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128), 1));
+ TEST_INSTRUCTION("8FE868CECB01" , vpcomd(xmm1, xmm2, xmm3, 1));
+ TEST_INSTRUCTION("8FE868CE8C2B8000000001" , vpcomd(xmm1, xmm2, ptr(rbx, rbp, 0, 128), 1));
+ TEST_INSTRUCTION("8FE868CE8C2B8000000001" , vpcomd(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128), 1));
+ TEST_INSTRUCTION("62F27D0863D1" , vpcompressb(xmm1, xmm2));
+ TEST_INSTRUCTION("62F27D08639C1180000000" , vpcompressb(ptr(rcx, rdx, 0, 128), xmm3));
+ TEST_INSTRUCTION("62F27D08639C1180000000" , vpcompressb(xmmword_ptr(rcx, rdx, 0, 128), xmm3));
+ TEST_INSTRUCTION("62F27D2863D1" , vpcompressb(ymm1, ymm2));
+ TEST_INSTRUCTION("62F27D28639C1180000000" , vpcompressb(ptr(rcx, rdx, 0, 128), ymm3));
+ TEST_INSTRUCTION("62F27D28639C1180000000" , vpcompressb(ymmword_ptr(rcx, rdx, 0, 128), ymm3));
+ TEST_INSTRUCTION("62F27D4863D1" , vpcompressb(zmm1, zmm2));
+ TEST_INSTRUCTION("62F27D48639C1180000000" , vpcompressb(ptr(rcx, rdx, 0, 128), zmm3));
+ TEST_INSTRUCTION("62F27D48639C1180000000" , vpcompressb(zmmword_ptr(rcx, rdx, 0, 128), zmm3));
+ TEST_INSTRUCTION("62F27D088BD1" , vpcompressd(xmm1, xmm2));
+ TEST_INSTRUCTION("62F27D088B5C1120" , vpcompressd(ptr(rcx, rdx, 0, 128), xmm3));
+ TEST_INSTRUCTION("62F27D088B5C1120" , vpcompressd(xmmword_ptr(rcx, rdx, 0, 128), xmm3));
+ TEST_INSTRUCTION("62F27D288BD1" , vpcompressd(ymm1, ymm2));
+ TEST_INSTRUCTION("62F27D288B5C1120" , vpcompressd(ptr(rcx, rdx, 0, 128), ymm3));
+ TEST_INSTRUCTION("62F27D288B5C1120" , vpcompressd(ymmword_ptr(rcx, rdx, 0, 128), ymm3));
+ TEST_INSTRUCTION("62F27D488BD1" , vpcompressd(zmm1, zmm2));
+ TEST_INSTRUCTION("62F27D488B5C1120" , vpcompressd(ptr(rcx, rdx, 0, 128), zmm3));
+ TEST_INSTRUCTION("62F27D488B5C1120" , vpcompressd(zmmword_ptr(rcx, rdx, 0, 128), zmm3));
+ TEST_INSTRUCTION("62F2FD088BD1" , vpcompressq(xmm1, xmm2));
+ TEST_INSTRUCTION("62F2FD088B5C1110" , vpcompressq(ptr(rcx, rdx, 0, 128), xmm3));
+ TEST_INSTRUCTION("62F2FD088B5C1110" , vpcompressq(xmmword_ptr(rcx, rdx, 0, 128), xmm3));
+ TEST_INSTRUCTION("62F2FD288BD1" , vpcompressq(ymm1, ymm2));
+ TEST_INSTRUCTION("62F2FD288B5C1110" , vpcompressq(ptr(rcx, rdx, 0, 128), ymm3));
+ TEST_INSTRUCTION("62F2FD288B5C1110" , vpcompressq(ymmword_ptr(rcx, rdx, 0, 128), ymm3));
+ TEST_INSTRUCTION("62F2FD488BD1" , vpcompressq(zmm1, zmm2));
+ TEST_INSTRUCTION("62F2FD488B5C1110" , vpcompressq(ptr(rcx, rdx, 0, 128), zmm3));
+ TEST_INSTRUCTION("62F2FD488B5C1110" , vpcompressq(zmmword_ptr(rcx, rdx, 0, 128), zmm3));
+ TEST_INSTRUCTION("62F2FD0863D1" , vpcompressw(xmm1, xmm2));
+ TEST_INSTRUCTION("62F2FD08635C1140" , vpcompressw(ptr(rcx, rdx, 0, 128), xmm3));
+ TEST_INSTRUCTION("62F2FD08635C1140" , vpcompressw(xmmword_ptr(rcx, rdx, 0, 128), xmm3));
+ TEST_INSTRUCTION("62F2FD2863D1" , vpcompressw(ymm1, ymm2));
+ TEST_INSTRUCTION("62F2FD28635C1140" , vpcompressw(ptr(rcx, rdx, 0, 128), ymm3));
+ TEST_INSTRUCTION("62F2FD28635C1140" , vpcompressw(ymmword_ptr(rcx, rdx, 0, 128), ymm3));
+ TEST_INSTRUCTION("62F2FD4863D1" , vpcompressw(zmm1, zmm2));
+ TEST_INSTRUCTION("62F2FD48635C1140" , vpcompressw(ptr(rcx, rdx, 0, 128), zmm3));
+ TEST_INSTRUCTION("62F2FD48635C1140" , vpcompressw(zmmword_ptr(rcx, rdx, 0, 128), zmm3));
+ TEST_INSTRUCTION("8FE868CFCB01" , vpcomq(xmm1, xmm2, xmm3, 1));
+ TEST_INSTRUCTION("8FE868CF8C2B8000000001" , vpcomq(xmm1, xmm2, ptr(rbx, rbp, 0, 128), 1));
+ TEST_INSTRUCTION("8FE868CF8C2B8000000001" , vpcomq(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128), 1));
+ TEST_INSTRUCTION("8FE868ECCB01" , vpcomub(xmm1, xmm2, xmm3, 1));
+ TEST_INSTRUCTION("8FE868EC8C2B8000000001" , vpcomub(xmm1, xmm2, ptr(rbx, rbp, 0, 128), 1));
+ TEST_INSTRUCTION("8FE868EC8C2B8000000001" , vpcomub(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128), 1));
+ TEST_INSTRUCTION("8FE868EECB01" , vpcomud(xmm1, xmm2, xmm3, 1));
+ TEST_INSTRUCTION("8FE868EE8C2B8000000001" , vpcomud(xmm1, xmm2, ptr(rbx, rbp, 0, 128), 1));
+ TEST_INSTRUCTION("8FE868EE8C2B8000000001" , vpcomud(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128), 1));
+ TEST_INSTRUCTION("8FE868EFCB01" , vpcomuq(xmm1, xmm2, xmm3, 1));
+ TEST_INSTRUCTION("8FE868EF8C2B8000000001" , vpcomuq(xmm1, xmm2, ptr(rbx, rbp, 0, 128), 1));
+ TEST_INSTRUCTION("8FE868EF8C2B8000000001" , vpcomuq(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128), 1));
+ TEST_INSTRUCTION("8FE868EDCB01" , vpcomuw(xmm1, xmm2, xmm3, 1));
+ TEST_INSTRUCTION("8FE868ED8C2B8000000001" , vpcomuw(xmm1, xmm2, ptr(rbx, rbp, 0, 128), 1));
+ TEST_INSTRUCTION("8FE868ED8C2B8000000001" , vpcomuw(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128), 1));
+ TEST_INSTRUCTION("8FE868CDCB01" , vpcomw(xmm1, xmm2, xmm3, 1));
+ TEST_INSTRUCTION("8FE868CD8C2B8000000001" , vpcomw(xmm1, xmm2, ptr(rbx, rbp, 0, 128), 1));
+ TEST_INSTRUCTION("8FE868CD8C2B8000000001" , vpcomw(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128), 1));
+ TEST_INSTRUCTION("62F27D08C4CA" , vpconflictd(xmm1, xmm2));
+ TEST_INSTRUCTION("62F27D08C44C1A08" , vpconflictd(xmm1, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("62F27D08C44C1A08" , vpconflictd(xmm1, xmmword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("62F27D28C4CA" , vpconflictd(ymm1, ymm2));
+ TEST_INSTRUCTION("62F27D28C44C1A04" , vpconflictd(ymm1, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("62F27D28C44C1A04" , vpconflictd(ymm1, ymmword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("62F27D48C4CA" , vpconflictd(zmm1, zmm2));
+ TEST_INSTRUCTION("62F27D48C44C1A02" , vpconflictd(zmm1, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("62F27D48C44C1A02" , vpconflictd(zmm1, zmmword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("62F2FD08C4CA" , vpconflictq(xmm1, xmm2));
+ TEST_INSTRUCTION("62F2FD08C44C1A08" , vpconflictq(xmm1, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("62F2FD08C44C1A08" , vpconflictq(xmm1, xmmword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("62F2FD28C4CA" , vpconflictq(ymm1, ymm2));
+ TEST_INSTRUCTION("62F2FD28C44C1A04" , vpconflictq(ymm1, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("62F2FD28C44C1A04" , vpconflictq(ymm1, ymmword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("62F2FD48C4CA" , vpconflictq(zmm1, zmm2));
+ TEST_INSTRUCTION("62F2FD48C44C1A02" , vpconflictq(zmm1, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("62F2FD48C44C1A02" , vpconflictq(zmm1, zmmword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("62F26D0850CB" , vpdpbusd(xmm1, xmm2, xmm3));
+ TEST_INSTRUCTION("62F26D08504C2B08" , vpdpbusd(xmm1, xmm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F26D08504C2B08" , vpdpbusd(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F26D2850CB" , vpdpbusd(ymm1, ymm2, ymm3));
+ TEST_INSTRUCTION("62F26D28504C2B04" , vpdpbusd(ymm1, ymm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F26D28504C2B04" , vpdpbusd(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F26D4850CB" , vpdpbusd(zmm1, zmm2, zmm3));
+ TEST_INSTRUCTION("62F26D48504C2B02" , vpdpbusd(zmm1, zmm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F26D48504C2B02" , vpdpbusd(zmm1, zmm2, zmmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F26D0851CB" , vpdpbusds(xmm1, xmm2, xmm3));
+ TEST_INSTRUCTION("62F26D08514C2B08" , vpdpbusds(xmm1, xmm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F26D08514C2B08" , vpdpbusds(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F26D2851CB" , vpdpbusds(ymm1, ymm2, ymm3));
+ TEST_INSTRUCTION("62F26D28514C2B04" , vpdpbusds(ymm1, ymm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F26D28514C2B04" , vpdpbusds(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F26D4851CB" , vpdpbusds(zmm1, zmm2, zmm3));
+ TEST_INSTRUCTION("62F26D48514C2B02" , vpdpbusds(zmm1, zmm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F26D48514C2B02" , vpdpbusds(zmm1, zmm2, zmmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F26D0852CB" , vpdpwssd(xmm1, xmm2, xmm3));
+ TEST_INSTRUCTION("62F26D08524C2B08" , vpdpwssd(xmm1, xmm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F26D08524C2B08" , vpdpwssd(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F26D2852CB" , vpdpwssd(ymm1, ymm2, ymm3));
+ TEST_INSTRUCTION("62F26D28524C2B04" , vpdpwssd(ymm1, ymm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F26D28524C2B04" , vpdpwssd(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F26D4852CB" , vpdpwssd(zmm1, zmm2, zmm3));
+ TEST_INSTRUCTION("62F26D48524C2B02" , vpdpwssd(zmm1, zmm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F26D48524C2B02" , vpdpwssd(zmm1, zmm2, zmmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F26D0853CB" , vpdpwssds(xmm1, xmm2, xmm3));
+ TEST_INSTRUCTION("62F26D08534C2B08" , vpdpwssds(xmm1, xmm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F26D08534C2B08" , vpdpwssds(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F26D2853CB" , vpdpwssds(ymm1, ymm2, ymm3));
+ TEST_INSTRUCTION("62F26D28534C2B04" , vpdpwssds(ymm1, ymm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F26D28534C2B04" , vpdpwssds(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F26D4853CB" , vpdpwssds(zmm1, zmm2, zmm3));
+ TEST_INSTRUCTION("62F26D48534C2B02" , vpdpwssds(zmm1, zmm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F26D48534C2B02" , vpdpwssds(zmm1, zmm2, zmmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C4E36D06CB01" , vperm2f128(ymm1, ymm2, ymm3, 1));
+ TEST_INSTRUCTION("C4E36D068C2B8000000001" , vperm2f128(ymm1, ymm2, ptr(rbx, rbp, 0, 128), 1));
+ TEST_INSTRUCTION("C4E36D068C2B8000000001" , vperm2f128(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128), 1));
+ TEST_INSTRUCTION("C4E36D46CB01" , vperm2i128(ymm1, ymm2, ymm3, 1));
+ TEST_INSTRUCTION("C4E36D468C2B8000000001" , vperm2i128(ymm1, ymm2, ptr(rbx, rbp, 0, 128), 1));
+ TEST_INSTRUCTION("C4E36D468C2B8000000001" , vperm2i128(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128), 1));
+ TEST_INSTRUCTION("62F26D088DCB" , vpermb(xmm1, xmm2, xmm3));
+ TEST_INSTRUCTION("62F26D088D4C2B08" , vpermb(xmm1, xmm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F26D088D4C2B08" , vpermb(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F26D288DCB" , vpermb(ymm1, ymm2, ymm3));
+ TEST_INSTRUCTION("62F26D288D4C2B04" , vpermb(ymm1, ymm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F26D288D4C2B04" , vpermb(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F26D488DCB" , vpermb(zmm1, zmm2, zmm3));
+ TEST_INSTRUCTION("62F26D488D4C2B02" , vpermb(zmm1, zmm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F26D488D4C2B02" , vpermb(zmm1, zmm2, zmmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C4E26D36CB" , vpermd(ymm1, ymm2, ymm3));
+ TEST_INSTRUCTION("C4E26D368C2B80000000" , vpermd(ymm1, ymm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C4E26D368C2B80000000" , vpermd(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F26D4836CB" , vpermd(zmm1, zmm2, zmm3));
+ TEST_INSTRUCTION("62F26D48364C2B02" , vpermd(zmm1, zmm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F26D48364C2B02" , vpermd(zmm1, zmm2, zmmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F26D0875CB" , vpermi2b(xmm1, xmm2, xmm3));
+ TEST_INSTRUCTION("62F26D08754C2B08" , vpermi2b(xmm1, xmm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F26D08754C2B08" , vpermi2b(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F26D2875CB" , vpermi2b(ymm1, ymm2, ymm3));
+ TEST_INSTRUCTION("62F26D28754C2B04" , vpermi2b(ymm1, ymm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F26D28754C2B04" , vpermi2b(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F26D4875CB" , vpermi2b(zmm1, zmm2, zmm3));
+ TEST_INSTRUCTION("62F26D48754C2B02" , vpermi2b(zmm1, zmm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F26D48754C2B02" , vpermi2b(zmm1, zmm2, zmmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F26D0876CB" , vpermi2d(xmm1, xmm2, xmm3));
+ TEST_INSTRUCTION("62F26D08764C2B08" , vpermi2d(xmm1, xmm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F26D08764C2B08" , vpermi2d(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F26D2876CB" , vpermi2d(ymm1, ymm2, ymm3));
+ TEST_INSTRUCTION("62F26D28764C2B04" , vpermi2d(ymm1, ymm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F26D28764C2B04" , vpermi2d(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F26D4876CB" , vpermi2d(zmm1, zmm2, zmm3));
+ TEST_INSTRUCTION("62F26D48764C2B02" , vpermi2d(zmm1, zmm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F26D48764C2B02" , vpermi2d(zmm1, zmm2, zmmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F2ED0877CB" , vpermi2pd(xmm1, xmm2, xmm3));
+ TEST_INSTRUCTION("62F2ED08774C2B08" , vpermi2pd(xmm1, xmm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F2ED08774C2B08" , vpermi2pd(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F2ED2877CB" , vpermi2pd(ymm1, ymm2, ymm3));
+ TEST_INSTRUCTION("62F2ED28774C2B04" , vpermi2pd(ymm1, ymm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F2ED28774C2B04" , vpermi2pd(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F2ED4877CB" , vpermi2pd(zmm1, zmm2, zmm3));
+ TEST_INSTRUCTION("62F2ED48774C2B02" , vpermi2pd(zmm1, zmm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F2ED48774C2B02" , vpermi2pd(zmm1, zmm2, zmmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F26D0877CB" , vpermi2ps(xmm1, xmm2, xmm3));
+ TEST_INSTRUCTION("62F26D08774C2B08" , vpermi2ps(xmm1, xmm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F26D08774C2B08" , vpermi2ps(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F26D2877CB" , vpermi2ps(ymm1, ymm2, ymm3));
+ TEST_INSTRUCTION("62F26D28774C2B04" , vpermi2ps(ymm1, ymm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F26D28774C2B04" , vpermi2ps(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F26D4877CB" , vpermi2ps(zmm1, zmm2, zmm3));
+ TEST_INSTRUCTION("62F26D48774C2B02" , vpermi2ps(zmm1, zmm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F26D48774C2B02" , vpermi2ps(zmm1, zmm2, zmmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F2ED0876CB" , vpermi2q(xmm1, xmm2, xmm3));
+ TEST_INSTRUCTION("62F2ED08764C2B08" , vpermi2q(xmm1, xmm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F2ED08764C2B08" , vpermi2q(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F2ED2876CB" , vpermi2q(ymm1, ymm2, ymm3));
+ TEST_INSTRUCTION("62F2ED28764C2B04" , vpermi2q(ymm1, ymm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F2ED28764C2B04" , vpermi2q(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F2ED4876CB" , vpermi2q(zmm1, zmm2, zmm3));
+ TEST_INSTRUCTION("62F2ED48764C2B02" , vpermi2q(zmm1, zmm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F2ED48764C2B02" , vpermi2q(zmm1, zmm2, zmmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F2ED0875CB" , vpermi2w(xmm1, xmm2, xmm3));
+ TEST_INSTRUCTION("62F2ED08754C2B08" , vpermi2w(xmm1, xmm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F2ED08754C2B08" , vpermi2w(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F2ED2875CB" , vpermi2w(ymm1, ymm2, ymm3));
+ TEST_INSTRUCTION("62F2ED28754C2B04" , vpermi2w(ymm1, ymm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F2ED28754C2B04" , vpermi2w(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F2ED4875CB" , vpermi2w(zmm1, zmm2, zmm3));
+ TEST_INSTRUCTION("62F2ED48754C2B02" , vpermi2w(zmm1, zmm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F2ED48754C2B02" , vpermi2w(zmm1, zmm2, zmmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C4E36949CB41" , vpermil2pd(xmm1, xmm2, xmm3, xmm4, 1));
+ TEST_INSTRUCTION("C4E369498C2B8000000061" , vpermil2pd(xmm1, xmm2, ptr(rbx, rbp, 0, 128), xmm6, 1));
+ TEST_INSTRUCTION("C4E369498C2B8000000061" , vpermil2pd(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128), xmm6, 1));
+ TEST_INSTRUCTION("C4E3E9498C358000000031" , vpermil2pd(xmm1, xmm2, xmm3, ptr(rbp, rsi, 0, 128), 1));
+ TEST_INSTRUCTION("C4E3E9498C358000000031" , vpermil2pd(xmm1, xmm2, xmm3, xmmword_ptr(rbp, rsi, 0, 128), 1));
+ TEST_INSTRUCTION("C4E36D49CB41" , vpermil2pd(ymm1, ymm2, ymm3, ymm4, 1));
+ TEST_INSTRUCTION("C4E36D498C2B8000000061" , vpermil2pd(ymm1, ymm2, ptr(rbx, rbp, 0, 128), ymm6, 1));
+ TEST_INSTRUCTION("C4E36D498C2B8000000061" , vpermil2pd(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128), ymm6, 1));
+ TEST_INSTRUCTION("C4E3ED498C358000000031" , vpermil2pd(ymm1, ymm2, ymm3, ptr(rbp, rsi, 0, 128), 1));
+ TEST_INSTRUCTION("C4E3ED498C358000000031" , vpermil2pd(ymm1, ymm2, ymm3, ymmword_ptr(rbp, rsi, 0, 128), 1));
+ TEST_INSTRUCTION("C4E36948CB41" , vpermil2ps(xmm1, xmm2, xmm3, xmm4, 1));
+ TEST_INSTRUCTION("C4E369488C2B8000000061" , vpermil2ps(xmm1, xmm2, ptr(rbx, rbp, 0, 128), xmm6, 1));
+ TEST_INSTRUCTION("C4E369488C2B8000000061" , vpermil2ps(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128), xmm6, 1));
+ TEST_INSTRUCTION("C4E3E9488C358000000031" , vpermil2ps(xmm1, xmm2, xmm3, ptr(rbp, rsi, 0, 128), 1));
+ TEST_INSTRUCTION("C4E3E9488C358000000031" , vpermil2ps(xmm1, xmm2, xmm3, xmmword_ptr(rbp, rsi, 0, 128), 1));
+ TEST_INSTRUCTION("C4E36D48CB41" , vpermil2ps(ymm1, ymm2, ymm3, ymm4, 1));
+ TEST_INSTRUCTION("C4E36D488C2B8000000061" , vpermil2ps(ymm1, ymm2, ptr(rbx, rbp, 0, 128), ymm6, 1));
+ TEST_INSTRUCTION("C4E36D488C2B8000000061" , vpermil2ps(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128), ymm6, 1));
+ TEST_INSTRUCTION("C4E3ED488C358000000031" , vpermil2ps(ymm1, ymm2, ymm3, ptr(rbp, rsi, 0, 128), 1));
+ TEST_INSTRUCTION("C4E3ED488C358000000031" , vpermil2ps(ymm1, ymm2, ymm3, ymmword_ptr(rbp, rsi, 0, 128), 1));
+ TEST_INSTRUCTION("C4E2690DCB" , vpermilpd(xmm1, xmm2, xmm3));
+ TEST_INSTRUCTION("C4E37905CA01" , vpermilpd(xmm1, xmm2, 1));
+ TEST_INSTRUCTION("C4E2690D8C2B80000000" , vpermilpd(xmm1, xmm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C4E2690D8C2B80000000" , vpermilpd(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C4E379058C1A8000000001" , vpermilpd(xmm1, ptr(rdx, rbx, 0, 128), 1));
+ TEST_INSTRUCTION("C4E379058C1A8000000001" , vpermilpd(xmm1, xmmword_ptr(rdx, rbx, 0, 128), 1));
+ TEST_INSTRUCTION("C4E26D0DCB" , vpermilpd(ymm1, ymm2, ymm3));
+ TEST_INSTRUCTION("C4E37D05CA01" , vpermilpd(ymm1, ymm2, 1));
+ TEST_INSTRUCTION("C4E26D0D8C2B80000000" , vpermilpd(ymm1, ymm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C4E26D0D8C2B80000000" , vpermilpd(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C4E37D058C1A8000000001" , vpermilpd(ymm1, ptr(rdx, rbx, 0, 128), 1));
+ TEST_INSTRUCTION("C4E37D058C1A8000000001" , vpermilpd(ymm1, ymmword_ptr(rdx, rbx, 0, 128), 1));
+ TEST_INSTRUCTION("62F2ED480DCB" , vpermilpd(zmm1, zmm2, zmm3));
+ TEST_INSTRUCTION("62F3FD4805CA01" , vpermilpd(zmm1, zmm2, 1));
+ TEST_INSTRUCTION("62F2ED480D4C2B02" , vpermilpd(zmm1, zmm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F2ED480D4C2B02" , vpermilpd(zmm1, zmm2, zmmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F3FD48054C1A0201" , vpermilpd(zmm1, ptr(rdx, rbx, 0, 128), 1));
+ TEST_INSTRUCTION("62F3FD48054C1A0201" , vpermilpd(zmm1, zmmword_ptr(rdx, rbx, 0, 128), 1));
+ TEST_INSTRUCTION("C4E2690CCB" , vpermilps(xmm1, xmm2, xmm3));
+ TEST_INSTRUCTION("C4E37904CA01" , vpermilps(xmm1, xmm2, 1));
+ TEST_INSTRUCTION("C4E2690C8C2B80000000" , vpermilps(xmm1, xmm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C4E2690C8C2B80000000" , vpermilps(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C4E379048C1A8000000001" , vpermilps(xmm1, ptr(rdx, rbx, 0, 128), 1));
+ TEST_INSTRUCTION("C4E379048C1A8000000001" , vpermilps(xmm1, xmmword_ptr(rdx, rbx, 0, 128), 1));
+ TEST_INSTRUCTION("C4E26D0CCB" , vpermilps(ymm1, ymm2, ymm3));
+ TEST_INSTRUCTION("C4E37D04CA01" , vpermilps(ymm1, ymm2, 1));
+ TEST_INSTRUCTION("C4E26D0C8C2B80000000" , vpermilps(ymm1, ymm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C4E26D0C8C2B80000000" , vpermilps(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C4E37D048C1A8000000001" , vpermilps(ymm1, ptr(rdx, rbx, 0, 128), 1));
+ TEST_INSTRUCTION("C4E37D048C1A8000000001" , vpermilps(ymm1, ymmword_ptr(rdx, rbx, 0, 128), 1));
+ TEST_INSTRUCTION("62F26D480CCB" , vpermilps(zmm1, zmm2, zmm3));
+ TEST_INSTRUCTION("62F37D4804CA01" , vpermilps(zmm1, zmm2, 1));
+ TEST_INSTRUCTION("62F26D480C4C2B02" , vpermilps(zmm1, zmm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F26D480C4C2B02" , vpermilps(zmm1, zmm2, zmmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F37D48044C1A0201" , vpermilps(zmm1, ptr(rdx, rbx, 0, 128), 1));
+ TEST_INSTRUCTION("62F37D48044C1A0201" , vpermilps(zmm1, zmmword_ptr(rdx, rbx, 0, 128), 1));
+ TEST_INSTRUCTION("C4E3FD01CA01" , vpermpd(ymm1, ymm2, 1));
+ TEST_INSTRUCTION("C4E3FD018C1A8000000001" , vpermpd(ymm1, ptr(rdx, rbx, 0, 128), 1));
+ TEST_INSTRUCTION("C4E3FD018C1A8000000001" , vpermpd(ymm1, ymmword_ptr(rdx, rbx, 0, 128), 1));
+ TEST_INSTRUCTION("62F2ED2816CB" , vpermpd(ymm1, ymm2, ymm3));
+ TEST_INSTRUCTION("62F2ED28164C2B04" , vpermpd(ymm1, ymm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F2ED28164C2B04" , vpermpd(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F2ED4816CB" , vpermpd(zmm1, zmm2, zmm3));
+ TEST_INSTRUCTION("62F3FD4801CA01" , vpermpd(zmm1, zmm2, 1));
+ TEST_INSTRUCTION("62F2ED48164C2B02" , vpermpd(zmm1, zmm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F2ED48164C2B02" , vpermpd(zmm1, zmm2, zmmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F3FD48014C1A0201" , vpermpd(zmm1, ptr(rdx, rbx, 0, 128), 1));
+ TEST_INSTRUCTION("62F3FD48014C1A0201" , vpermpd(zmm1, zmmword_ptr(rdx, rbx, 0, 128), 1));
+ TEST_INSTRUCTION("C4E26D16CB" , vpermps(ymm1, ymm2, ymm3));
+ TEST_INSTRUCTION("C4E26D168C2B80000000" , vpermps(ymm1, ymm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C4E26D168C2B80000000" , vpermps(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F26D4816CB" , vpermps(zmm1, zmm2, zmm3));
+ TEST_INSTRUCTION("62F26D48164C2B02" , vpermps(zmm1, zmm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F26D48164C2B02" , vpermps(zmm1, zmm2, zmmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C4E3FD00CA01" , vpermq(ymm1, ymm2, 1));
+ TEST_INSTRUCTION("C4E3FD008C1A8000000001" , vpermq(ymm1, ptr(rdx, rbx, 0, 128), 1));
+ TEST_INSTRUCTION("C4E3FD008C1A8000000001" , vpermq(ymm1, ymmword_ptr(rdx, rbx, 0, 128), 1));
+ TEST_INSTRUCTION("62F2ED2836CB" , vpermq(ymm1, ymm2, ymm3));
+ TEST_INSTRUCTION("62F2ED28364C2B04" , vpermq(ymm1, ymm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F2ED28364C2B04" , vpermq(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F2ED4836CB" , vpermq(zmm1, zmm2, zmm3));
+ TEST_INSTRUCTION("62F3FD4800CA01" , vpermq(zmm1, zmm2, 1));
+ TEST_INSTRUCTION("62F2ED48364C2B02" , vpermq(zmm1, zmm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F2ED48364C2B02" , vpermq(zmm1, zmm2, zmmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F3FD48004C1A0201" , vpermq(zmm1, ptr(rdx, rbx, 0, 128), 1));
+ TEST_INSTRUCTION("62F3FD48004C1A0201" , vpermq(zmm1, zmmword_ptr(rdx, rbx, 0, 128), 1));
+ TEST_INSTRUCTION("62F26D087DCB" , vpermt2b(xmm1, xmm2, xmm3));
+ TEST_INSTRUCTION("62F26D087D4C2B08" , vpermt2b(xmm1, xmm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F26D087D4C2B08" , vpermt2b(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F26D287DCB" , vpermt2b(ymm1, ymm2, ymm3));
+ TEST_INSTRUCTION("62F26D287D4C2B04" , vpermt2b(ymm1, ymm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F26D287D4C2B04" , vpermt2b(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F26D487DCB" , vpermt2b(zmm1, zmm2, zmm3));
+ TEST_INSTRUCTION("62F26D487D4C2B02" , vpermt2b(zmm1, zmm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F26D487D4C2B02" , vpermt2b(zmm1, zmm2, zmmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F26D087ECB" , vpermt2d(xmm1, xmm2, xmm3));
+ TEST_INSTRUCTION("62F26D087E4C2B08" , vpermt2d(xmm1, xmm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F26D087E4C2B08" , vpermt2d(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F26D287ECB" , vpermt2d(ymm1, ymm2, ymm3));
+ TEST_INSTRUCTION("62F26D287E4C2B04" , vpermt2d(ymm1, ymm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F26D287E4C2B04" , vpermt2d(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F26D487ECB" , vpermt2d(zmm1, zmm2, zmm3));
+ TEST_INSTRUCTION("62F26D487E4C2B02" , vpermt2d(zmm1, zmm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F26D487E4C2B02" , vpermt2d(zmm1, zmm2, zmmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F2ED087FCB" , vpermt2pd(xmm1, xmm2, xmm3));
+ TEST_INSTRUCTION("62F2ED087F4C2B08" , vpermt2pd(xmm1, xmm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F2ED087F4C2B08" , vpermt2pd(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F2ED287FCB" , vpermt2pd(ymm1, ymm2, ymm3));
+ TEST_INSTRUCTION("62F2ED287F4C2B04" , vpermt2pd(ymm1, ymm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F2ED287F4C2B04" , vpermt2pd(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F2ED487FCB" , vpermt2pd(zmm1, zmm2, zmm3));
+ TEST_INSTRUCTION("62F2ED487F4C2B02" , vpermt2pd(zmm1, zmm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F2ED487F4C2B02" , vpermt2pd(zmm1, zmm2, zmmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F26D087FCB" , vpermt2ps(xmm1, xmm2, xmm3));
+ TEST_INSTRUCTION("62F26D087F4C2B08" , vpermt2ps(xmm1, xmm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F26D087F4C2B08" , vpermt2ps(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F26D287FCB" , vpermt2ps(ymm1, ymm2, ymm3));
+ TEST_INSTRUCTION("62F26D287F4C2B04" , vpermt2ps(ymm1, ymm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F26D287F4C2B04" , vpermt2ps(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F26D487FCB" , vpermt2ps(zmm1, zmm2, zmm3));
+ TEST_INSTRUCTION("62F26D487F4C2B02" , vpermt2ps(zmm1, zmm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F26D487F4C2B02" , vpermt2ps(zmm1, zmm2, zmmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F2ED087ECB" , vpermt2q(xmm1, xmm2, xmm3));
+ TEST_INSTRUCTION("62F2ED087E4C2B08" , vpermt2q(xmm1, xmm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F2ED087E4C2B08" , vpermt2q(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F2ED287ECB" , vpermt2q(ymm1, ymm2, ymm3));
+ TEST_INSTRUCTION("62F2ED287E4C2B04" , vpermt2q(ymm1, ymm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F2ED287E4C2B04" , vpermt2q(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F2ED487ECB" , vpermt2q(zmm1, zmm2, zmm3));
+ TEST_INSTRUCTION("62F2ED487E4C2B02" , vpermt2q(zmm1, zmm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F2ED487E4C2B02" , vpermt2q(zmm1, zmm2, zmmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F2ED087DCB" , vpermt2w(xmm1, xmm2, xmm3));
+ TEST_INSTRUCTION("62F2ED087D4C2B08" , vpermt2w(xmm1, xmm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F2ED087D4C2B08" , vpermt2w(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F2ED287DCB" , vpermt2w(ymm1, ymm2, ymm3));
+ TEST_INSTRUCTION("62F2ED287D4C2B04" , vpermt2w(ymm1, ymm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F2ED287D4C2B04" , vpermt2w(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F2ED487DCB" , vpermt2w(zmm1, zmm2, zmm3));
+ TEST_INSTRUCTION("62F2ED487D4C2B02" , vpermt2w(zmm1, zmm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F2ED487D4C2B02" , vpermt2w(zmm1, zmm2, zmmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F2ED088DCB" , vpermw(xmm1, xmm2, xmm3));
+ TEST_INSTRUCTION("62F2ED088D4C2B08" , vpermw(xmm1, xmm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F2ED088D4C2B08" , vpermw(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F2ED288DCB" , vpermw(ymm1, ymm2, ymm3));
+ TEST_INSTRUCTION("62F2ED288D4C2B04" , vpermw(ymm1, ymm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F2ED288D4C2B04" , vpermw(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F2ED488DCB" , vpermw(zmm1, zmm2, zmm3));
+ TEST_INSTRUCTION("62F2ED488D4C2B02" , vpermw(zmm1, zmm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F2ED488D4C2B02" , vpermw(zmm1, zmm2, zmmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F27D0862CA" , vpexpandb(xmm1, xmm2));
+ TEST_INSTRUCTION("62F27D08628C1A80000000" , vpexpandb(xmm1, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("62F27D08628C1A80000000" , vpexpandb(xmm1, xmmword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("62F27D2862CA" , vpexpandb(ymm1, ymm2));
+ TEST_INSTRUCTION("62F27D28628C1A80000000" , vpexpandb(ymm1, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("62F27D28628C1A80000000" , vpexpandb(ymm1, ymmword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("62F27D4862CA" , vpexpandb(zmm1, zmm2));
+ TEST_INSTRUCTION("62F27D48628C1A80000000" , vpexpandb(zmm1, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("62F27D48628C1A80000000" , vpexpandb(zmm1, zmmword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("62F27D0889CA" , vpexpandd(xmm1, xmm2));
+ TEST_INSTRUCTION("62F27D08894C1A20" , vpexpandd(xmm1, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("62F27D08894C1A20" , vpexpandd(xmm1, xmmword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("62F27D2889CA" , vpexpandd(ymm1, ymm2));
+ TEST_INSTRUCTION("62F27D28894C1A20" , vpexpandd(ymm1, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("62F27D28894C1A20" , vpexpandd(ymm1, ymmword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("62F27D4889CA" , vpexpandd(zmm1, zmm2));
+ TEST_INSTRUCTION("62F27D48894C1A20" , vpexpandd(zmm1, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("62F27D48894C1A20" , vpexpandd(zmm1, zmmword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("62F2FD0889CA" , vpexpandq(xmm1, xmm2));
+ TEST_INSTRUCTION("62F2FD08894C1A10" , vpexpandq(xmm1, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("62F2FD08894C1A10" , vpexpandq(xmm1, xmmword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("62F2FD2889CA" , vpexpandq(ymm1, ymm2));
+ TEST_INSTRUCTION("62F2FD28894C1A10" , vpexpandq(ymm1, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("62F2FD28894C1A10" , vpexpandq(ymm1, ymmword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("62F2FD4889CA" , vpexpandq(zmm1, zmm2));
+ TEST_INSTRUCTION("62F2FD48894C1A10" , vpexpandq(zmm1, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("62F2FD48894C1A10" , vpexpandq(zmm1, zmmword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("62F2FD0862CA" , vpexpandw(xmm1, xmm2));
+ TEST_INSTRUCTION("62F2FD08624C1A40" , vpexpandw(xmm1, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("62F2FD08624C1A40" , vpexpandw(xmm1, xmmword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("62F2FD2862CA" , vpexpandw(ymm1, ymm2));
+ TEST_INSTRUCTION("62F2FD28624C1A40" , vpexpandw(ymm1, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("62F2FD28624C1A40" , vpexpandw(ymm1, ymmword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("62F2FD4862CA" , vpexpandw(zmm1, zmm2));
+ TEST_INSTRUCTION("62F2FD48624C1A40" , vpexpandw(zmm1, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("62F2FD48624C1A40" , vpexpandw(zmm1, zmmword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("C4E37914D101" , vpextrb(ecx, xmm2, 1));
+ TEST_INSTRUCTION("C4E379149C118000000001" , vpextrb(ptr(rcx, rdx, 0, 128), xmm3, 1));
+ TEST_INSTRUCTION("C4E379149C118000000001" , vpextrb(byte_ptr(rcx, rdx, 0, 128), xmm3, 1));
+ TEST_INSTRUCTION("C4E37916D101" , vpextrd(ecx, xmm2, 1));
+ TEST_INSTRUCTION("C4E379169C118000000001" , vpextrd(ptr(rcx, rdx, 0, 128), xmm3, 1));
+ TEST_INSTRUCTION("C4E379169C118000000001" , vpextrd(dword_ptr(rcx, rdx, 0, 128), xmm3, 1));
+ TEST_INSTRUCTION("C4E3F916D101" , vpextrq(rcx, xmm2, 1));
+ TEST_INSTRUCTION("C4E3F9169C118000000001" , vpextrq(ptr(rcx, rdx, 0, 128), xmm3, 1));
+ TEST_INSTRUCTION("C4E3F9169C118000000001" , vpextrq(qword_ptr(rcx, rdx, 0, 128), xmm3, 1));
+ TEST_INSTRUCTION("C5F9C5CA01" , vpextrw(ecx, xmm2, 1));
+ TEST_INSTRUCTION("C4E379159C118000000001" , vpextrw(ptr(rcx, rdx, 0, 128), xmm3, 1));
+ TEST_INSTRUCTION("C4E379159C118000000001" , vpextrw(word_ptr(rcx, rdx, 0, 128), xmm3, 1));
+ TEST_INSTRUCTION("C4E259908C1A80000000" , vpgatherdd(xmm1, ptr(rdx, xmm3, 0, 128), xmm4));
+ TEST_INSTRUCTION("C4E25D908C1A80000000" , vpgatherdd(ymm1, ptr(rdx, ymm3, 0, 128), ymm4));
+ TEST_INSTRUCTION("62F27D09904C1A20" , k(k1).vpgatherdd(xmm1, ptr(rdx, xmm3, 0, 128)));
+ TEST_INSTRUCTION("62F27D29904C1A20" , k(k1).vpgatherdd(ymm1, ptr(rdx, ymm3, 0, 128)));
+ TEST_INSTRUCTION("62F27D49904C1A20" , k(k1).vpgatherdd(zmm1, ptr(rdx, zmm3, 0, 128)));
+ TEST_INSTRUCTION("C4E2D9908C1A80000000" , vpgatherdq(xmm1, ptr(rdx, xmm3, 0, 128), xmm4));
+ TEST_INSTRUCTION("C4E2DD908C1A80000000" , vpgatherdq(ymm1, ptr(rdx, xmm3, 0, 128), ymm4));
+ TEST_INSTRUCTION("62F2FD09904C1A10" , k(k1).vpgatherdq(xmm1, ptr(rdx, xmm3, 0, 128)));
+ TEST_INSTRUCTION("62F2FD29904C1A10" , k(k1).vpgatherdq(ymm1, ptr(rdx, xmm3, 0, 128)));
+ TEST_INSTRUCTION("62F2FD49904C1A10" , k(k1).vpgatherdq(zmm1, ptr(rdx, ymm3, 0, 128)));
+ TEST_INSTRUCTION("C4E259918C1A80000000" , vpgatherqd(xmm1, ptr(rdx, xmm3, 0, 128), xmm4));
+ TEST_INSTRUCTION("C4E25D918C1A80000000" , vpgatherqd(xmm1, ptr(rdx, ymm3, 0, 128), xmm4));
+ TEST_INSTRUCTION("62F27D09914C1A20" , k(k1).vpgatherqd(xmm1, ptr(rdx, xmm3, 0, 128)));
+ TEST_INSTRUCTION("62F27D29914C1A20" , k(k1).vpgatherqd(xmm1, ptr(rdx, ymm3, 0, 128)));
+ TEST_INSTRUCTION("62F27D49914C1A20" , k(k1).vpgatherqd(ymm1, ptr(rdx, zmm3, 0, 128)));
+ TEST_INSTRUCTION("C4E2D9918C1A80000000" , vpgatherqq(xmm1, ptr(rdx, xmm3, 0, 128), xmm4));
+ TEST_INSTRUCTION("C4E2DD918C1A80000000" , vpgatherqq(ymm1, ptr(rdx, ymm3, 0, 128), ymm4));
+ TEST_INSTRUCTION("62F2FD09914C1A10" , k(k1).vpgatherqq(xmm1, ptr(rdx, xmm3, 0, 128)));
+ TEST_INSTRUCTION("62F2FD29914C1A10" , k(k1).vpgatherqq(ymm1, ptr(rdx, ymm3, 0, 128)));
+ TEST_INSTRUCTION("62F2FD49914C1A10" , k(k1).vpgatherqq(zmm1, ptr(rdx, zmm3, 0, 128)));
+ TEST_INSTRUCTION("8FE978C2CA" , vphaddbd(xmm1, xmm2));
+ TEST_INSTRUCTION("8FE978C28C1A80000000" , vphaddbd(xmm1, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("8FE978C28C1A80000000" , vphaddbd(xmm1, xmmword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("8FE978C3CA" , vphaddbq(xmm1, xmm2));
+ TEST_INSTRUCTION("8FE978C38C1A80000000" , vphaddbq(xmm1, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("8FE978C38C1A80000000" , vphaddbq(xmm1, xmmword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("8FE978C1CA" , vphaddbw(xmm1, xmm2));
+ TEST_INSTRUCTION("8FE978C18C1A80000000" , vphaddbw(xmm1, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("8FE978C18C1A80000000" , vphaddbw(xmm1, xmmword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("C4E26902CB" , vphaddd(xmm1, xmm2, xmm3));
+ TEST_INSTRUCTION("C4E269028C2B80000000" , vphaddd(xmm1, xmm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C4E269028C2B80000000" , vphaddd(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C4E26D02CB" , vphaddd(ymm1, ymm2, ymm3));
+ TEST_INSTRUCTION("C4E26D028C2B80000000" , vphaddd(ymm1, ymm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C4E26D028C2B80000000" , vphaddd(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("8FE978CBCA" , vphadddq(xmm1, xmm2));
+ TEST_INSTRUCTION("8FE978CB8C1A80000000" , vphadddq(xmm1, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("8FE978CB8C1A80000000" , vphadddq(xmm1, xmmword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("C4E26903CB" , vphaddsw(xmm1, xmm2, xmm3));
+ TEST_INSTRUCTION("C4E269038C2B80000000" , vphaddsw(xmm1, xmm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C4E269038C2B80000000" , vphaddsw(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C4E26D03CB" , vphaddsw(ymm1, ymm2, ymm3));
+ TEST_INSTRUCTION("C4E26D038C2B80000000" , vphaddsw(ymm1, ymm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C4E26D038C2B80000000" , vphaddsw(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("8FE978D2CA" , vphaddubd(xmm1, xmm2));
+ TEST_INSTRUCTION("8FE978D28C1A80000000" , vphaddubd(xmm1, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("8FE978D28C1A80000000" , vphaddubd(xmm1, xmmword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("8FE978D3CA" , vphaddubq(xmm1, xmm2));
+ TEST_INSTRUCTION("8FE978D38C1A80000000" , vphaddubq(xmm1, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("8FE978D38C1A80000000" , vphaddubq(xmm1, xmmword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("8FE978D1CA" , vphaddubw(xmm1, xmm2));
+ TEST_INSTRUCTION("8FE978D18C1A80000000" , vphaddubw(xmm1, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("8FE978D18C1A80000000" , vphaddubw(xmm1, xmmword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("8FE978DBCA" , vphaddudq(xmm1, xmm2));
+ TEST_INSTRUCTION("8FE978DB8C1A80000000" , vphaddudq(xmm1, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("8FE978DB8C1A80000000" , vphaddudq(xmm1, xmmword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("8FE978D6CA" , vphadduwd(xmm1, xmm2));
+ TEST_INSTRUCTION("8FE978D68C1A80000000" , vphadduwd(xmm1, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("8FE978D68C1A80000000" , vphadduwd(xmm1, xmmword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("8FE978D7CA" , vphadduwq(xmm1, xmm2));
+ TEST_INSTRUCTION("8FE978D78C1A80000000" , vphadduwq(xmm1, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("8FE978D78C1A80000000" , vphadduwq(xmm1, xmmword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("C4E26901CB" , vphaddw(xmm1, xmm2, xmm3));
+ TEST_INSTRUCTION("C4E269018C2B80000000" , vphaddw(xmm1, xmm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C4E269018C2B80000000" , vphaddw(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C4E26D01CB" , vphaddw(ymm1, ymm2, ymm3));
+ TEST_INSTRUCTION("C4E26D018C2B80000000" , vphaddw(ymm1, ymm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C4E26D018C2B80000000" , vphaddw(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("8FE978C6CA" , vphaddwd(xmm1, xmm2));
+ TEST_INSTRUCTION("8FE978C68C1A80000000" , vphaddwd(xmm1, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("8FE978C68C1A80000000" , vphaddwd(xmm1, xmmword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("8FE978C7CA" , vphaddwq(xmm1, xmm2));
+ TEST_INSTRUCTION("8FE978C78C1A80000000" , vphaddwq(xmm1, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("8FE978C78C1A80000000" , vphaddwq(xmm1, xmmword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("C4E27941CA" , vphminposuw(xmm1, xmm2));
+ TEST_INSTRUCTION("C4E279418C1A80000000" , vphminposuw(xmm1, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("C4E279418C1A80000000" , vphminposuw(xmm1, xmmword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("8FE978E1CA" , vphsubbw(xmm1, xmm2));
+ TEST_INSTRUCTION("8FE978E18C1A80000000" , vphsubbw(xmm1, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("8FE978E18C1A80000000" , vphsubbw(xmm1, xmmword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("C4E26906CB" , vphsubd(xmm1, xmm2, xmm3));
+ TEST_INSTRUCTION("C4E269068C2B80000000" , vphsubd(xmm1, xmm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C4E269068C2B80000000" , vphsubd(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C4E26D06CB" , vphsubd(ymm1, ymm2, ymm3));
+ TEST_INSTRUCTION("C4E26D068C2B80000000" , vphsubd(ymm1, ymm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C4E26D068C2B80000000" , vphsubd(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("8FE978E3CA" , vphsubdq(xmm1, xmm2));
+ TEST_INSTRUCTION("8FE978E38C1A80000000" , vphsubdq(xmm1, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("8FE978E38C1A80000000" , vphsubdq(xmm1, xmmword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("C4E26907CB" , vphsubsw(xmm1, xmm2, xmm3));
+ TEST_INSTRUCTION("C4E269078C2B80000000" , vphsubsw(xmm1, xmm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C4E269078C2B80000000" , vphsubsw(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C4E26D07CB" , vphsubsw(ymm1, ymm2, ymm3));
+ TEST_INSTRUCTION("C4E26D078C2B80000000" , vphsubsw(ymm1, ymm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C4E26D078C2B80000000" , vphsubsw(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C4E26905CB" , vphsubw(xmm1, xmm2, xmm3));
+ TEST_INSTRUCTION("C4E269058C2B80000000" , vphsubw(xmm1, xmm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C4E269058C2B80000000" , vphsubw(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C4E26D05CB" , vphsubw(ymm1, ymm2, ymm3));
+ TEST_INSTRUCTION("C4E26D058C2B80000000" , vphsubw(ymm1, ymm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C4E26D058C2B80000000" , vphsubw(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("8FE978E2CA" , vphsubwd(xmm1, xmm2));
+ TEST_INSTRUCTION("8FE978E28C1A80000000" , vphsubwd(xmm1, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("8FE978E28C1A80000000" , vphsubwd(xmm1, xmmword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("C4E36920CB01" , vpinsrb(xmm1, xmm2, ebx, 1));
+ TEST_INSTRUCTION("C4E369208C2B8000000001" , vpinsrb(xmm1, xmm2, ptr(rbx, rbp, 0, 128), 1));
+ TEST_INSTRUCTION("C4E369208C2B8000000001" , vpinsrb(xmm1, xmm2, byte_ptr(rbx, rbp, 0, 128), 1));
+ TEST_INSTRUCTION("C4E36922CB01" , vpinsrd(xmm1, xmm2, ebx, 1));
+ TEST_INSTRUCTION("C4E369228C2B8000000001" , vpinsrd(xmm1, xmm2, ptr(rbx, rbp, 0, 128), 1));
+ TEST_INSTRUCTION("C4E369228C2B8000000001" , vpinsrd(xmm1, xmm2, dword_ptr(rbx, rbp, 0, 128), 1));
+ TEST_INSTRUCTION("C4E3E922CB01" , vpinsrq(xmm1, xmm2, rbx, 1));
+ TEST_INSTRUCTION("C4E3E9228C2B8000000001" , vpinsrq(xmm1, xmm2, ptr(rbx, rbp, 0, 128), 1));
+ TEST_INSTRUCTION("C4E3E9228C2B8000000001" , vpinsrq(xmm1, xmm2, qword_ptr(rbx, rbp, 0, 128), 1));
+ TEST_INSTRUCTION("C5E9C4CB01" , vpinsrw(xmm1, xmm2, ebx, 1));
+ TEST_INSTRUCTION("C5E9C48C2B8000000001" , vpinsrw(xmm1, xmm2, ptr(rbx, rbp, 0, 128), 1));
+ TEST_INSTRUCTION("C5E9C48C2B8000000001" , vpinsrw(xmm1, xmm2, word_ptr(rbx, rbp, 0, 128), 1));
+ TEST_INSTRUCTION("62F27D0844CA" , vplzcntd(xmm1, xmm2));
+ TEST_INSTRUCTION("62F27D08444C1A08" , vplzcntd(xmm1, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("62F27D08444C1A08" , vplzcntd(xmm1, xmmword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("62F27D2844CA" , vplzcntd(ymm1, ymm2));
+ TEST_INSTRUCTION("62F27D28444C1A04" , vplzcntd(ymm1, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("62F27D28444C1A04" , vplzcntd(ymm1, ymmword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("62F27D4844CA" , vplzcntd(zmm1, zmm2));
+ TEST_INSTRUCTION("62F27D48444C1A02" , vplzcntd(zmm1, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("62F27D48444C1A02" , vplzcntd(zmm1, zmmword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("62F2FD0844CA" , vplzcntq(xmm1, xmm2));
+ TEST_INSTRUCTION("62F2FD08444C1A08" , vplzcntq(xmm1, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("62F2FD08444C1A08" , vplzcntq(xmm1, xmmword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("62F2FD2844CA" , vplzcntq(ymm1, ymm2));
+ TEST_INSTRUCTION("62F2FD28444C1A04" , vplzcntq(ymm1, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("62F2FD28444C1A04" , vplzcntq(ymm1, ymmword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("62F2FD4844CA" , vplzcntq(zmm1, zmm2));
+ TEST_INSTRUCTION("62F2FD48444C1A02" , vplzcntq(zmm1, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("62F2FD48444C1A02" , vplzcntq(zmm1, zmmword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("8FE8689ECB40" , vpmacsdd(xmm1, xmm2, xmm3, xmm4));
+ TEST_INSTRUCTION("8FE8689E8C2B8000000060" , vpmacsdd(xmm1, xmm2, ptr(rbx, rbp, 0, 128), xmm6));
+ TEST_INSTRUCTION("8FE8689E8C2B8000000060" , vpmacsdd(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128), xmm6));
+ TEST_INSTRUCTION("8FE8689FCB40" , vpmacsdqh(xmm1, xmm2, xmm3, xmm4));
+ TEST_INSTRUCTION("8FE8689F8C2B8000000060" , vpmacsdqh(xmm1, xmm2, ptr(rbx, rbp, 0, 128), xmm6));
+ TEST_INSTRUCTION("8FE8689F8C2B8000000060" , vpmacsdqh(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128), xmm6));
+ TEST_INSTRUCTION("8FE86897CB40" , vpmacsdql(xmm1, xmm2, xmm3, xmm4));
+ TEST_INSTRUCTION("8FE868978C2B8000000060" , vpmacsdql(xmm1, xmm2, ptr(rbx, rbp, 0, 128), xmm6));
+ TEST_INSTRUCTION("8FE868978C2B8000000060" , vpmacsdql(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128), xmm6));
+ TEST_INSTRUCTION("8FE8688ECB40" , vpmacssdd(xmm1, xmm2, xmm3, xmm4));
+ TEST_INSTRUCTION("8FE8688E8C2B8000000060" , vpmacssdd(xmm1, xmm2, ptr(rbx, rbp, 0, 128), xmm6));
+ TEST_INSTRUCTION("8FE8688E8C2B8000000060" , vpmacssdd(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128), xmm6));
+ TEST_INSTRUCTION("8FE8688FCB40" , vpmacssdqh(xmm1, xmm2, xmm3, xmm4));
+ TEST_INSTRUCTION("8FE8688F8C2B8000000060" , vpmacssdqh(xmm1, xmm2, ptr(rbx, rbp, 0, 128), xmm6));
+ TEST_INSTRUCTION("8FE8688F8C2B8000000060" , vpmacssdqh(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128), xmm6));
+ TEST_INSTRUCTION("8FE86887CB40" , vpmacssdql(xmm1, xmm2, xmm3, xmm4));
+ TEST_INSTRUCTION("8FE868878C2B8000000060" , vpmacssdql(xmm1, xmm2, ptr(rbx, rbp, 0, 128), xmm6));
+ TEST_INSTRUCTION("8FE868878C2B8000000060" , vpmacssdql(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128), xmm6));
+ TEST_INSTRUCTION("8FE86886CB40" , vpmacsswd(xmm1, xmm2, xmm3, xmm4));
+ TEST_INSTRUCTION("8FE868868C2B8000000060" , vpmacsswd(xmm1, xmm2, ptr(rbx, rbp, 0, 128), xmm6));
+ TEST_INSTRUCTION("8FE868868C2B8000000060" , vpmacsswd(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128), xmm6));
+ TEST_INSTRUCTION("8FE86885CB40" , vpmacssww(xmm1, xmm2, xmm3, xmm4));
+ TEST_INSTRUCTION("8FE868858C2B8000000060" , vpmacssww(xmm1, xmm2, ptr(rbx, rbp, 0, 128), xmm6));
+ TEST_INSTRUCTION("8FE868858C2B8000000060" , vpmacssww(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128), xmm6));
+ TEST_INSTRUCTION("8FE86896CB40" , vpmacswd(xmm1, xmm2, xmm3, xmm4));
+ TEST_INSTRUCTION("8FE868968C2B8000000060" , vpmacswd(xmm1, xmm2, ptr(rbx, rbp, 0, 128), xmm6));
+ TEST_INSTRUCTION("8FE868968C2B8000000060" , vpmacswd(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128), xmm6));
+ TEST_INSTRUCTION("8FE86895CB40" , vpmacsww(xmm1, xmm2, xmm3, xmm4));
+ TEST_INSTRUCTION("8FE868958C2B8000000060" , vpmacsww(xmm1, xmm2, ptr(rbx, rbp, 0, 128), xmm6));
+ TEST_INSTRUCTION("8FE868958C2B8000000060" , vpmacsww(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128), xmm6));
+ TEST_INSTRUCTION("8FE868A6CB40" , vpmadcsswd(xmm1, xmm2, xmm3, xmm4));
+ TEST_INSTRUCTION("8FE868A68C2B8000000060" , vpmadcsswd(xmm1, xmm2, ptr(rbx, rbp, 0, 128), xmm6));
+ TEST_INSTRUCTION("8FE868A68C2B8000000060" , vpmadcsswd(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128), xmm6));
+ TEST_INSTRUCTION("8FE868B6CB40" , vpmadcswd(xmm1, xmm2, xmm3, xmm4));
+ TEST_INSTRUCTION("8FE868B68C2B8000000060" , vpmadcswd(xmm1, xmm2, ptr(rbx, rbp, 0, 128), xmm6));
+ TEST_INSTRUCTION("8FE868B68C2B8000000060" , vpmadcswd(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128), xmm6));
+ TEST_INSTRUCTION("62F2ED08B5CB" , vpmadd52huq(xmm1, xmm2, xmm3));
+ TEST_INSTRUCTION("62F2ED08B54C2B08" , vpmadd52huq(xmm1, xmm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F2ED08B54C2B08" , vpmadd52huq(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F2ED28B5CB" , vpmadd52huq(ymm1, ymm2, ymm3));
+ TEST_INSTRUCTION("62F2ED28B54C2B04" , vpmadd52huq(ymm1, ymm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F2ED28B54C2B04" , vpmadd52huq(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F2ED48B5CB" , vpmadd52huq(zmm1, zmm2, zmm3));
+ TEST_INSTRUCTION("62F2ED48B54C2B02" , vpmadd52huq(zmm1, zmm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F2ED48B54C2B02" , vpmadd52huq(zmm1, zmm2, zmmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F2ED08B4CB" , vpmadd52luq(xmm1, xmm2, xmm3));
+ TEST_INSTRUCTION("62F2ED08B44C2B08" , vpmadd52luq(xmm1, xmm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F2ED08B44C2B08" , vpmadd52luq(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F2ED28B4CB" , vpmadd52luq(ymm1, ymm2, ymm3));
+ TEST_INSTRUCTION("62F2ED28B44C2B04" , vpmadd52luq(ymm1, ymm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F2ED28B44C2B04" , vpmadd52luq(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F2ED48B4CB" , vpmadd52luq(zmm1, zmm2, zmm3));
+ TEST_INSTRUCTION("62F2ED48B44C2B02" , vpmadd52luq(zmm1, zmm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F2ED48B44C2B02" , vpmadd52luq(zmm1, zmm2, zmmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C4E26904CB" , vpmaddubsw(xmm1, xmm2, xmm3));
+ TEST_INSTRUCTION("C4E269048C2B80000000" , vpmaddubsw(xmm1, xmm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C4E269048C2B80000000" , vpmaddubsw(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C4E26D04CB" , vpmaddubsw(ymm1, ymm2, ymm3));
+ TEST_INSTRUCTION("C4E26D048C2B80000000" , vpmaddubsw(ymm1, ymm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C4E26D048C2B80000000" , vpmaddubsw(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F26D4804CB" , vpmaddubsw(zmm1, zmm2, zmm3));
+ TEST_INSTRUCTION("62F26D48044C2B02" , vpmaddubsw(zmm1, zmm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F26D48044C2B02" , vpmaddubsw(zmm1, zmm2, zmmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C5E9F5CB" , vpmaddwd(xmm1, xmm2, xmm3));
+ TEST_INSTRUCTION("C5E9F58C2B80000000" , vpmaddwd(xmm1, xmm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C5E9F58C2B80000000" , vpmaddwd(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C5EDF5CB" , vpmaddwd(ymm1, ymm2, ymm3));
+ TEST_INSTRUCTION("C5EDF58C2B80000000" , vpmaddwd(ymm1, ymm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C5EDF58C2B80000000" , vpmaddwd(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F16D48F5CB" , vpmaddwd(zmm1, zmm2, zmm3));
+ TEST_INSTRUCTION("62F16D48F54C2B02" , vpmaddwd(zmm1, zmm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F16D48F54C2B02" , vpmaddwd(zmm1, zmm2, zmmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C4E2618EA41180000000" , vpmaskmovd(ptr(rcx, rdx, 0, 128), xmm3, xmm4));
+ TEST_INSTRUCTION("C4E2618EA41180000000" , vpmaskmovd(xmmword_ptr(rcx, rdx, 0, 128), xmm3, xmm4));
+ TEST_INSTRUCTION("C4E2658EA41180000000" , vpmaskmovd(ptr(rcx, rdx, 0, 128), ymm3, ymm4));
+ TEST_INSTRUCTION("C4E2658EA41180000000" , vpmaskmovd(ymmword_ptr(rcx, rdx, 0, 128), ymm3, ymm4));
+ TEST_INSTRUCTION("C4E2698C8C2B80000000" , vpmaskmovd(xmm1, xmm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C4E2698C8C2B80000000" , vpmaskmovd(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C4E26D8C8C2B80000000" , vpmaskmovd(ymm1, ymm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C4E26D8C8C2B80000000" , vpmaskmovd(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C4E2E18EA41180000000" , vpmaskmovq(ptr(rcx, rdx, 0, 128), xmm3, xmm4));
+ TEST_INSTRUCTION("C4E2E18EA41180000000" , vpmaskmovq(xmmword_ptr(rcx, rdx, 0, 128), xmm3, xmm4));
+ TEST_INSTRUCTION("C4E2E58EA41180000000" , vpmaskmovq(ptr(rcx, rdx, 0, 128), ymm3, ymm4));
+ TEST_INSTRUCTION("C4E2E58EA41180000000" , vpmaskmovq(ymmword_ptr(rcx, rdx, 0, 128), ymm3, ymm4));
+ TEST_INSTRUCTION("C4E2E98C8C2B80000000" , vpmaskmovq(xmm1, xmm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C4E2E98C8C2B80000000" , vpmaskmovq(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C4E2ED8C8C2B80000000" , vpmaskmovq(ymm1, ymm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C4E2ED8C8C2B80000000" , vpmaskmovq(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C4E2693CCB" , vpmaxsb(xmm1, xmm2, xmm3));
+ TEST_INSTRUCTION("C4E2693C8C2B80000000" , vpmaxsb(xmm1, xmm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C4E2693C8C2B80000000" , vpmaxsb(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C4E26D3CCB" , vpmaxsb(ymm1, ymm2, ymm3));
+ TEST_INSTRUCTION("C4E26D3C8C2B80000000" , vpmaxsb(ymm1, ymm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C4E26D3C8C2B80000000" , vpmaxsb(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F26D483CCB" , vpmaxsb(zmm1, zmm2, zmm3));
+ TEST_INSTRUCTION("62F26D483C4C2B02" , vpmaxsb(zmm1, zmm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F26D483C4C2B02" , vpmaxsb(zmm1, zmm2, zmmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C4E2693DCB" , vpmaxsd(xmm1, xmm2, xmm3));
+ TEST_INSTRUCTION("C4E2693D8C2B80000000" , vpmaxsd(xmm1, xmm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C4E2693D8C2B80000000" , vpmaxsd(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C4E26D3DCB" , vpmaxsd(ymm1, ymm2, ymm3));
+ TEST_INSTRUCTION("C4E26D3D8C2B80000000" , vpmaxsd(ymm1, ymm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C4E26D3D8C2B80000000" , vpmaxsd(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F26D483DCB" , vpmaxsd(zmm1, zmm2, zmm3));
+ TEST_INSTRUCTION("62F26D483D4C2B02" , vpmaxsd(zmm1, zmm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F26D483D4C2B02" , vpmaxsd(zmm1, zmm2, zmmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F2ED083DCB" , vpmaxsq(xmm1, xmm2, xmm3));
+ TEST_INSTRUCTION("62F2ED083D4C2B08" , vpmaxsq(xmm1, xmm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F2ED083D4C2B08" , vpmaxsq(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F2ED283DCB" , vpmaxsq(ymm1, ymm2, ymm3));
+ TEST_INSTRUCTION("62F2ED283D4C2B04" , vpmaxsq(ymm1, ymm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F2ED283D4C2B04" , vpmaxsq(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F2ED483DCB" , vpmaxsq(zmm1, zmm2, zmm3));
+ TEST_INSTRUCTION("62F2ED483D4C2B02" , vpmaxsq(zmm1, zmm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F2ED483D4C2B02" , vpmaxsq(zmm1, zmm2, zmmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C5E9EECB" , vpmaxsw(xmm1, xmm2, xmm3));
+ TEST_INSTRUCTION("C5E9EE8C2B80000000" , vpmaxsw(xmm1, xmm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C5E9EE8C2B80000000" , vpmaxsw(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C5EDEECB" , vpmaxsw(ymm1, ymm2, ymm3));
+ TEST_INSTRUCTION("C5EDEE8C2B80000000" , vpmaxsw(ymm1, ymm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C5EDEE8C2B80000000" , vpmaxsw(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F16D48EECB" , vpmaxsw(zmm1, zmm2, zmm3));
+ TEST_INSTRUCTION("62F16D48EE4C2B02" , vpmaxsw(zmm1, zmm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F16D48EE4C2B02" , vpmaxsw(zmm1, zmm2, zmmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C5E9DECB" , vpmaxub(xmm1, xmm2, xmm3));
+ TEST_INSTRUCTION("C5E9DE8C2B80000000" , vpmaxub(xmm1, xmm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C5E9DE8C2B80000000" , vpmaxub(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C5EDDECB" , vpmaxub(ymm1, ymm2, ymm3));
+ TEST_INSTRUCTION("C5EDDE8C2B80000000" , vpmaxub(ymm1, ymm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C5EDDE8C2B80000000" , vpmaxub(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F16D48DECB" , vpmaxub(zmm1, zmm2, zmm3));
+ TEST_INSTRUCTION("62F16D48DE4C2B02" , vpmaxub(zmm1, zmm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F16D48DE4C2B02" , vpmaxub(zmm1, zmm2, zmmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C4E2693FCB" , vpmaxud(xmm1, xmm2, xmm3));
+ TEST_INSTRUCTION("C4E2693F8C2B80000000" , vpmaxud(xmm1, xmm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C4E2693F8C2B80000000" , vpmaxud(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C4E26D3FCB" , vpmaxud(ymm1, ymm2, ymm3));
+ TEST_INSTRUCTION("C4E26D3F8C2B80000000" , vpmaxud(ymm1, ymm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C4E26D3F8C2B80000000" , vpmaxud(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F26D483FCB" , vpmaxud(zmm1, zmm2, zmm3));
+ TEST_INSTRUCTION("62F26D483F4C2B02" , vpmaxud(zmm1, zmm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F26D483F4C2B02" , vpmaxud(zmm1, zmm2, zmmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F2ED083FCB" , vpmaxuq(xmm1, xmm2, xmm3));
+ TEST_INSTRUCTION("62F2ED083F4C2B08" , vpmaxuq(xmm1, xmm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F2ED083F4C2B08" , vpmaxuq(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F2ED283FCB" , vpmaxuq(ymm1, ymm2, ymm3));
+ TEST_INSTRUCTION("62F2ED283F4C2B04" , vpmaxuq(ymm1, ymm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F2ED283F4C2B04" , vpmaxuq(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F2ED483FCB" , vpmaxuq(zmm1, zmm2, zmm3));
+ TEST_INSTRUCTION("62F2ED483F4C2B02" , vpmaxuq(zmm1, zmm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F2ED483F4C2B02" , vpmaxuq(zmm1, zmm2, zmmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C4E2693ECB" , vpmaxuw(xmm1, xmm2, xmm3));
+ TEST_INSTRUCTION("C4E2693E8C2B80000000" , vpmaxuw(xmm1, xmm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C4E2693E8C2B80000000" , vpmaxuw(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C4E26D3ECB" , vpmaxuw(ymm1, ymm2, ymm3));
+ TEST_INSTRUCTION("C4E26D3E8C2B80000000" , vpmaxuw(ymm1, ymm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C4E26D3E8C2B80000000" , vpmaxuw(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F26D483ECB" , vpmaxuw(zmm1, zmm2, zmm3));
+ TEST_INSTRUCTION("62F26D483E4C2B02" , vpmaxuw(zmm1, zmm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F26D483E4C2B02" , vpmaxuw(zmm1, zmm2, zmmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C4E26938CB" , vpminsb(xmm1, xmm2, xmm3));
+ TEST_INSTRUCTION("C4E269388C2B80000000" , vpminsb(xmm1, xmm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C4E269388C2B80000000" , vpminsb(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C4E26D38CB" , vpminsb(ymm1, ymm2, ymm3));
+ TEST_INSTRUCTION("C4E26D388C2B80000000" , vpminsb(ymm1, ymm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C4E26D388C2B80000000" , vpminsb(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F26D4838CB" , vpminsb(zmm1, zmm2, zmm3));
+ TEST_INSTRUCTION("62F26D48384C2B02" , vpminsb(zmm1, zmm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F26D48384C2B02" , vpminsb(zmm1, zmm2, zmmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C4E26939CB" , vpminsd(xmm1, xmm2, xmm3));
+ TEST_INSTRUCTION("C4E269398C2B80000000" , vpminsd(xmm1, xmm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C4E269398C2B80000000" , vpminsd(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C4E26D39CB" , vpminsd(ymm1, ymm2, ymm3));
+ TEST_INSTRUCTION("C4E26D398C2B80000000" , vpminsd(ymm1, ymm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C4E26D398C2B80000000" , vpminsd(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F26D4839CB" , vpminsd(zmm1, zmm2, zmm3));
+ TEST_INSTRUCTION("62F26D48394C2B02" , vpminsd(zmm1, zmm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F26D48394C2B02" , vpminsd(zmm1, zmm2, zmmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F2ED0839CB" , vpminsq(xmm1, xmm2, xmm3));
+ TEST_INSTRUCTION("62F2ED08394C2B08" , vpminsq(xmm1, xmm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F2ED08394C2B08" , vpminsq(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F2ED2839CB" , vpminsq(ymm1, ymm2, ymm3));
+ TEST_INSTRUCTION("62F2ED28394C2B04" , vpminsq(ymm1, ymm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F2ED28394C2B04" , vpminsq(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F2ED4839CB" , vpminsq(zmm1, zmm2, zmm3));
+ TEST_INSTRUCTION("62F2ED48394C2B02" , vpminsq(zmm1, zmm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F2ED48394C2B02" , vpminsq(zmm1, zmm2, zmmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C5E9EACB" , vpminsw(xmm1, xmm2, xmm3));
+ TEST_INSTRUCTION("C5E9EA8C2B80000000" , vpminsw(xmm1, xmm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C5E9EA8C2B80000000" , vpminsw(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C5EDEACB" , vpminsw(ymm1, ymm2, ymm3));
+ TEST_INSTRUCTION("C5EDEA8C2B80000000" , vpminsw(ymm1, ymm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C5EDEA8C2B80000000" , vpminsw(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F16D48EACB" , vpminsw(zmm1, zmm2, zmm3));
+ TEST_INSTRUCTION("62F16D48EA4C2B02" , vpminsw(zmm1, zmm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F16D48EA4C2B02" , vpminsw(zmm1, zmm2, zmmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C5E9DACB" , vpminub(xmm1, xmm2, xmm3));
+ TEST_INSTRUCTION("C5E9DA8C2B80000000" , vpminub(xmm1, xmm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C5E9DA8C2B80000000" , vpminub(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C5EDDACB" , vpminub(ymm1, ymm2, ymm3));
+ TEST_INSTRUCTION("C5EDDA8C2B80000000" , vpminub(ymm1, ymm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C5EDDA8C2B80000000" , vpminub(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F16D48DACB" , vpminub(zmm1, zmm2, zmm3));
+ TEST_INSTRUCTION("62F16D48DA4C2B02" , vpminub(zmm1, zmm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F16D48DA4C2B02" , vpminub(zmm1, zmm2, zmmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C4E2693BCB" , vpminud(xmm1, xmm2, xmm3));
+ TEST_INSTRUCTION("C4E2693B8C2B80000000" , vpminud(xmm1, xmm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C4E2693B8C2B80000000" , vpminud(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C4E26D3BCB" , vpminud(ymm1, ymm2, ymm3));
+ TEST_INSTRUCTION("C4E26D3B8C2B80000000" , vpminud(ymm1, ymm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C4E26D3B8C2B80000000" , vpminud(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F26D483BCB" , vpminud(zmm1, zmm2, zmm3));
+ TEST_INSTRUCTION("62F26D483B4C2B02" , vpminud(zmm1, zmm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F26D483B4C2B02" , vpminud(zmm1, zmm2, zmmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F2ED083BCB" , vpminuq(xmm1, xmm2, xmm3));
+ TEST_INSTRUCTION("62F2ED083B4C2B08" , vpminuq(xmm1, xmm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F2ED083B4C2B08" , vpminuq(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F2ED283BCB" , vpminuq(ymm1, ymm2, ymm3));
+ TEST_INSTRUCTION("62F2ED283B4C2B04" , vpminuq(ymm1, ymm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F2ED283B4C2B04" , vpminuq(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F2ED483BCB" , vpminuq(zmm1, zmm2, zmm3));
+ TEST_INSTRUCTION("62F2ED483B4C2B02" , vpminuq(zmm1, zmm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F2ED483B4C2B02" , vpminuq(zmm1, zmm2, zmmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C4E2693ACB" , vpminuw(xmm1, xmm2, xmm3));
+ TEST_INSTRUCTION("C4E2693A8C2B80000000" , vpminuw(xmm1, xmm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C4E2693A8C2B80000000" , vpminuw(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C4E26D3ACB" , vpminuw(ymm1, ymm2, ymm3));
+ TEST_INSTRUCTION("C4E26D3A8C2B80000000" , vpminuw(ymm1, ymm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C4E26D3A8C2B80000000" , vpminuw(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F26D483ACB" , vpminuw(zmm1, zmm2, zmm3));
+ TEST_INSTRUCTION("62F26D483A4C2B02" , vpminuw(zmm1, zmm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F26D483A4C2B02" , vpminuw(zmm1, zmm2, zmmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F27E0829CA" , vpmovb2m(k1, xmm2));
+ TEST_INSTRUCTION("62F27E2829CA" , vpmovb2m(k1, ymm2));
+ TEST_INSTRUCTION("62F27E4829CA" , vpmovb2m(k1, zmm2));
+ TEST_INSTRUCTION("62F27E0839CA" , vpmovd2m(k1, xmm2));
+ TEST_INSTRUCTION("62F27E2839CA" , vpmovd2m(k1, ymm2));
+ TEST_INSTRUCTION("62F27E4839CA" , vpmovd2m(k1, zmm2));
+ TEST_INSTRUCTION("62F27E0831D1" , vpmovdb(xmm1, xmm2));
+ TEST_INSTRUCTION("62F27E08315C1120" , vpmovdb(ptr(rcx, rdx, 0, 128), xmm3));
+ TEST_INSTRUCTION("62F27E08315C1120" , vpmovdb(dword_ptr(rcx, rdx, 0, 128), xmm3));
+ TEST_INSTRUCTION("62F27E2831D1" , vpmovdb(xmm1, ymm2));
+ TEST_INSTRUCTION("62F27E28315C1110" , vpmovdb(ptr(rcx, rdx, 0, 128), ymm3));
+ TEST_INSTRUCTION("62F27E28315C1110" , vpmovdb(qword_ptr(rcx, rdx, 0, 128), ymm3));
+ TEST_INSTRUCTION("62F27E4831D1" , vpmovdb(xmm1, zmm2));
+ TEST_INSTRUCTION("62F27E48315C1108" , vpmovdb(ptr(rcx, rdx, 0, 128), zmm3));
+ TEST_INSTRUCTION("62F27E48315C1108" , vpmovdb(xmmword_ptr(rcx, rdx, 0, 128), zmm3));
+ TEST_INSTRUCTION("62F27E0833D1" , vpmovdw(xmm1, xmm2));
+ TEST_INSTRUCTION("62F27E08335C1110" , vpmovdw(ptr(rcx, rdx, 0, 128), xmm3));
+ TEST_INSTRUCTION("62F27E08335C1110" , vpmovdw(qword_ptr(rcx, rdx, 0, 128), xmm3));
+ TEST_INSTRUCTION("62F27E2833D1" , vpmovdw(xmm1, ymm2));
+ TEST_INSTRUCTION("62F27E28335C1108" , vpmovdw(ptr(rcx, rdx, 0, 128), ymm3));
+ TEST_INSTRUCTION("62F27E28335C1108" , vpmovdw(xmmword_ptr(rcx, rdx, 0, 128), ymm3));
+ TEST_INSTRUCTION("62F27E4833D1" , vpmovdw(ymm1, zmm2));
+ TEST_INSTRUCTION("62F27E48335C1104" , vpmovdw(ptr(rcx, rdx, 0, 128), zmm3));
+ TEST_INSTRUCTION("62F27E48335C1104" , vpmovdw(ymmword_ptr(rcx, rdx, 0, 128), zmm3));
+ TEST_INSTRUCTION("62F27E0828CA" , vpmovm2b(xmm1, k2));
+ TEST_INSTRUCTION("62F27E2828CA" , vpmovm2b(ymm1, k2));
+ TEST_INSTRUCTION("62F27E4828CA" , vpmovm2b(zmm1, k2));
+ TEST_INSTRUCTION("62F27E0838CA" , vpmovm2d(xmm1, k2));
+ TEST_INSTRUCTION("62F27E2838CA" , vpmovm2d(ymm1, k2));
+ TEST_INSTRUCTION("62F27E4838CA" , vpmovm2d(zmm1, k2));
+ TEST_INSTRUCTION("62F2FE0838CA" , vpmovm2q(xmm1, k2));
+ TEST_INSTRUCTION("62F2FE2838CA" , vpmovm2q(ymm1, k2));
+ TEST_INSTRUCTION("62F2FE4838CA" , vpmovm2q(zmm1, k2));
+ TEST_INSTRUCTION("62F2FE0828CA" , vpmovm2w(xmm1, k2));
+ TEST_INSTRUCTION("62F2FE2828CA" , vpmovm2w(ymm1, k2));
+ TEST_INSTRUCTION("62F2FE4828CA" , vpmovm2w(zmm1, k2));
+ TEST_INSTRUCTION("C5F9D7CA" , vpmovmskb(ecx, xmm2));
+ TEST_INSTRUCTION("C5FDD7CA" , vpmovmskb(ecx, ymm2));
+ TEST_INSTRUCTION("62F2FE0839CA" , vpmovq2m(k1, xmm2));
+ TEST_INSTRUCTION("62F2FE2839CA" , vpmovq2m(k1, ymm2));
+ TEST_INSTRUCTION("62F2FE4839CA" , vpmovq2m(k1, zmm2));
+ TEST_INSTRUCTION("62F27E0832D1" , vpmovqb(xmm1, xmm2));
+ TEST_INSTRUCTION("62F27E08325C1140" , vpmovqb(ptr(rcx, rdx, 0, 128), xmm3));
+ TEST_INSTRUCTION("62F27E08325C1140" , vpmovqb(word_ptr(rcx, rdx, 0, 128), xmm3));
+ TEST_INSTRUCTION("62F27E2832D1" , vpmovqb(xmm1, ymm2));
+ TEST_INSTRUCTION("62F27E28325C1120" , vpmovqb(ptr(rcx, rdx, 0, 128), ymm3));
+ TEST_INSTRUCTION("62F27E28325C1120" , vpmovqb(dword_ptr(rcx, rdx, 0, 128), ymm3));
+ TEST_INSTRUCTION("62F27E4832D1" , vpmovqb(xmm1, zmm2));
+ TEST_INSTRUCTION("62F27E48325C1110" , vpmovqb(ptr(rcx, rdx, 0, 128), zmm3));
+ TEST_INSTRUCTION("62F27E48325C1110" , vpmovqb(qword_ptr(rcx, rdx, 0, 128), zmm3));
+ TEST_INSTRUCTION("62F27E0835D1" , vpmovqd(xmm1, xmm2));
+ TEST_INSTRUCTION("62F27E08355C1110" , vpmovqd(ptr(rcx, rdx, 0, 128), xmm3));
+ TEST_INSTRUCTION("62F27E08355C1110" , vpmovqd(qword_ptr(rcx, rdx, 0, 128), xmm3));
+ TEST_INSTRUCTION("62F27E2835D1" , vpmovqd(xmm1, ymm2));
+ TEST_INSTRUCTION("62F27E28355C1108" , vpmovqd(ptr(rcx, rdx, 0, 128), ymm3));
+ TEST_INSTRUCTION("62F27E28355C1108" , vpmovqd(xmmword_ptr(rcx, rdx, 0, 128), ymm3));
+ TEST_INSTRUCTION("62F27E4835D1" , vpmovqd(ymm1, zmm2));
+ TEST_INSTRUCTION("62F27E48355C1104" , vpmovqd(ptr(rcx, rdx, 0, 128), zmm3));
+ TEST_INSTRUCTION("62F27E48355C1104" , vpmovqd(ymmword_ptr(rcx, rdx, 0, 128), zmm3));
+ TEST_INSTRUCTION("62F27E0834D1" , vpmovqw(xmm1, xmm2));
+ TEST_INSTRUCTION("62F27E08345C1120" , vpmovqw(ptr(rcx, rdx, 0, 128), xmm3));
+ TEST_INSTRUCTION("62F27E08345C1120" , vpmovqw(dword_ptr(rcx, rdx, 0, 128), xmm3));
+ TEST_INSTRUCTION("62F27E2834D1" , vpmovqw(xmm1, ymm2));
+ TEST_INSTRUCTION("62F27E28345C1110" , vpmovqw(ptr(rcx, rdx, 0, 128), ymm3));
+ TEST_INSTRUCTION("62F27E28345C1110" , vpmovqw(qword_ptr(rcx, rdx, 0, 128), ymm3));
+ TEST_INSTRUCTION("62F27E4834D1" , vpmovqw(xmm1, zmm2));
+ TEST_INSTRUCTION("62F27E48345C1108" , vpmovqw(ptr(rcx, rdx, 0, 128), zmm3));
+ TEST_INSTRUCTION("62F27E48345C1108" , vpmovqw(xmmword_ptr(rcx, rdx, 0, 128), zmm3));
+ TEST_INSTRUCTION("62F27E0821D1" , vpmovsdb(xmm1, xmm2));
+ TEST_INSTRUCTION("62F27E08215C1120" , vpmovsdb(ptr(rcx, rdx, 0, 128), xmm3));
+ TEST_INSTRUCTION("62F27E08215C1120" , vpmovsdb(dword_ptr(rcx, rdx, 0, 128), xmm3));
+ TEST_INSTRUCTION("62F27E2821D1" , vpmovsdb(xmm1, ymm2));
+ TEST_INSTRUCTION("62F27E28215C1110" , vpmovsdb(ptr(rcx, rdx, 0, 128), ymm3));
+ TEST_INSTRUCTION("62F27E28215C1110" , vpmovsdb(qword_ptr(rcx, rdx, 0, 128), ymm3));
+ TEST_INSTRUCTION("62F27E4821D1" , vpmovsdb(xmm1, zmm2));
+ TEST_INSTRUCTION("62F27E48215C1108" , vpmovsdb(ptr(rcx, rdx, 0, 128), zmm3));
+ TEST_INSTRUCTION("62F27E48215C1108" , vpmovsdb(xmmword_ptr(rcx, rdx, 0, 128), zmm3));
+ TEST_INSTRUCTION("62F27E0823D1" , vpmovsdw(xmm1, xmm2));
+ TEST_INSTRUCTION("62F27E08235C1110" , vpmovsdw(ptr(rcx, rdx, 0, 128), xmm3));
+ TEST_INSTRUCTION("62F27E08235C1110" , vpmovsdw(qword_ptr(rcx, rdx, 0, 128), xmm3));
+ TEST_INSTRUCTION("62F27E2823D1" , vpmovsdw(xmm1, ymm2));
+ TEST_INSTRUCTION("62F27E28235C1108" , vpmovsdw(ptr(rcx, rdx, 0, 128), ymm3));
+ TEST_INSTRUCTION("62F27E28235C1108" , vpmovsdw(xmmword_ptr(rcx, rdx, 0, 128), ymm3));
+ TEST_INSTRUCTION("62F27E4823D1" , vpmovsdw(ymm1, zmm2));
+ TEST_INSTRUCTION("62F27E48235C1104" , vpmovsdw(ptr(rcx, rdx, 0, 128), zmm3));
+ TEST_INSTRUCTION("62F27E48235C1104" , vpmovsdw(ymmword_ptr(rcx, rdx, 0, 128), zmm3));
+ TEST_INSTRUCTION("62F27E0822D1" , vpmovsqb(xmm1, xmm2));
+ TEST_INSTRUCTION("62F27E08225C1140" , vpmovsqb(ptr(rcx, rdx, 0, 128), xmm3));
+ TEST_INSTRUCTION("62F27E08225C1140" , vpmovsqb(word_ptr(rcx, rdx, 0, 128), xmm3));
+ TEST_INSTRUCTION("62F27E2822D1" , vpmovsqb(xmm1, ymm2));
+ TEST_INSTRUCTION("62F27E28225C1120" , vpmovsqb(ptr(rcx, rdx, 0, 128), ymm3));
+ TEST_INSTRUCTION("62F27E28225C1120" , vpmovsqb(dword_ptr(rcx, rdx, 0, 128), ymm3));
+ TEST_INSTRUCTION("62F27E4822D1" , vpmovsqb(xmm1, zmm2));
+ TEST_INSTRUCTION("62F27E48225C1110" , vpmovsqb(ptr(rcx, rdx, 0, 128), zmm3));
+ TEST_INSTRUCTION("62F27E48225C1110" , vpmovsqb(qword_ptr(rcx, rdx, 0, 128), zmm3));
+ TEST_INSTRUCTION("62F27E0825D1" , vpmovsqd(xmm1, xmm2));
+ TEST_INSTRUCTION("62F27E08255C1110" , vpmovsqd(ptr(rcx, rdx, 0, 128), xmm3));
+ TEST_INSTRUCTION("62F27E08255C1110" , vpmovsqd(qword_ptr(rcx, rdx, 0, 128), xmm3));
+ TEST_INSTRUCTION("62F27E2825D1" , vpmovsqd(xmm1, ymm2));
+ TEST_INSTRUCTION("62F27E28255C1108" , vpmovsqd(ptr(rcx, rdx, 0, 128), ymm3));
+ TEST_INSTRUCTION("62F27E28255C1108" , vpmovsqd(xmmword_ptr(rcx, rdx, 0, 128), ymm3));
+ TEST_INSTRUCTION("62F27E4825D1" , vpmovsqd(ymm1, zmm2));
+ TEST_INSTRUCTION("62F27E48255C1104" , vpmovsqd(ptr(rcx, rdx, 0, 128), zmm3));
+ TEST_INSTRUCTION("62F27E48255C1104" , vpmovsqd(ymmword_ptr(rcx, rdx, 0, 128), zmm3));
+ TEST_INSTRUCTION("62F27E0824D1" , vpmovsqw(xmm1, xmm2));
+ TEST_INSTRUCTION("62F27E08245C1120" , vpmovsqw(ptr(rcx, rdx, 0, 128), xmm3));
+ TEST_INSTRUCTION("62F27E08245C1120" , vpmovsqw(dword_ptr(rcx, rdx, 0, 128), xmm3));
+ TEST_INSTRUCTION("62F27E2824D1" , vpmovsqw(xmm1, ymm2));
+ TEST_INSTRUCTION("62F27E28245C1110" , vpmovsqw(ptr(rcx, rdx, 0, 128), ymm3));
+ TEST_INSTRUCTION("62F27E28245C1110" , vpmovsqw(qword_ptr(rcx, rdx, 0, 128), ymm3));
+ TEST_INSTRUCTION("62F27E4824D1" , vpmovsqw(xmm1, zmm2));
+ TEST_INSTRUCTION("62F27E48245C1108" , vpmovsqw(ptr(rcx, rdx, 0, 128), zmm3));
+ TEST_INSTRUCTION("62F27E48245C1108" , vpmovsqw(xmmword_ptr(rcx, rdx, 0, 128), zmm3));
+ TEST_INSTRUCTION("62F27E0820D1" , vpmovswb(xmm1, xmm2));
+ TEST_INSTRUCTION("62F27E08205C1110" , vpmovswb(ptr(rcx, rdx, 0, 128), xmm3));
+ TEST_INSTRUCTION("62F27E08205C1110" , vpmovswb(qword_ptr(rcx, rdx, 0, 128), xmm3));
+ TEST_INSTRUCTION("62F27E2820D1" , vpmovswb(xmm1, ymm2));
+ TEST_INSTRUCTION("62F27E28205C1108" , vpmovswb(ptr(rcx, rdx, 0, 128), ymm3));
+ TEST_INSTRUCTION("62F27E28205C1108" , vpmovswb(xmmword_ptr(rcx, rdx, 0, 128), ymm3));
+ TEST_INSTRUCTION("62F27E4820D1" , vpmovswb(ymm1, zmm2));
+ TEST_INSTRUCTION("62F27E48205C1104" , vpmovswb(ptr(rcx, rdx, 0, 128), zmm3));
+ TEST_INSTRUCTION("62F27E48205C1104" , vpmovswb(ymmword_ptr(rcx, rdx, 0, 128), zmm3));
+ TEST_INSTRUCTION("C4E27921CA" , vpmovsxbd(xmm1, xmm2));
+ TEST_INSTRUCTION("C4E279218C1A80000000" , vpmovsxbd(xmm1, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("C4E279218C1A80000000" , vpmovsxbd(xmm1, dword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("C4E27D21CA" , vpmovsxbd(ymm1, xmm2));
+ TEST_INSTRUCTION("C4E27D218C1A80000000" , vpmovsxbd(ymm1, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("C4E27D218C1A80000000" , vpmovsxbd(ymm1, qword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("62F27D4821CA" , vpmovsxbd(zmm1, xmm2));
+ TEST_INSTRUCTION("62F27D48214C1A08" , vpmovsxbd(zmm1, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("62F27D48214C1A08" , vpmovsxbd(zmm1, xmmword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("C4E27922CA" , vpmovsxbq(xmm1, xmm2));
+ TEST_INSTRUCTION("C4E279228C1A80000000" , vpmovsxbq(xmm1, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("C4E279228C1A80000000" , vpmovsxbq(xmm1, word_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("C4E27D22CA" , vpmovsxbq(ymm1, xmm2));
+ TEST_INSTRUCTION("C4E27D228C1A80000000" , vpmovsxbq(ymm1, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("C4E27D228C1A80000000" , vpmovsxbq(ymm1, dword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("62F27D4822CA" , vpmovsxbq(zmm1, xmm2));
+ TEST_INSTRUCTION("62F27D48224C1A10" , vpmovsxbq(zmm1, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("62F27D48224C1A10" , vpmovsxbq(zmm1, qword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("C4E27920CA" , vpmovsxbw(xmm1, xmm2));
+ TEST_INSTRUCTION("C4E279208C1A80000000" , vpmovsxbw(xmm1, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("C4E279208C1A80000000" , vpmovsxbw(xmm1, qword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("C4E27D20CA" , vpmovsxbw(ymm1, xmm2));
+ TEST_INSTRUCTION("C4E27D208C1A80000000" , vpmovsxbw(ymm1, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("C4E27D208C1A80000000" , vpmovsxbw(ymm1, xmmword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("62F27D4820CA" , vpmovsxbw(zmm1, ymm2));
+ TEST_INSTRUCTION("62F27D48204C1A04" , vpmovsxbw(zmm1, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("62F27D48204C1A04" , vpmovsxbw(zmm1, ymmword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("C4E27925CA" , vpmovsxdq(xmm1, xmm2));
+ TEST_INSTRUCTION("C4E279258C1A80000000" , vpmovsxdq(xmm1, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("C4E279258C1A80000000" , vpmovsxdq(xmm1, qword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("C4E27D25CA" , vpmovsxdq(ymm1, xmm2));
+ TEST_INSTRUCTION("C4E27D258C1A80000000" , vpmovsxdq(ymm1, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("C4E27D258C1A80000000" , vpmovsxdq(ymm1, xmmword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("62F27D4825CA" , vpmovsxdq(zmm1, ymm2));
+ TEST_INSTRUCTION("62F27D48254C1A04" , vpmovsxdq(zmm1, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("62F27D48254C1A04" , vpmovsxdq(zmm1, ymmword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("C4E27923CA" , vpmovsxwd(xmm1, xmm2));
+ TEST_INSTRUCTION("C4E279238C1A80000000" , vpmovsxwd(xmm1, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("C4E279238C1A80000000" , vpmovsxwd(xmm1, qword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("C4E27D23CA" , vpmovsxwd(ymm1, xmm2));
+ TEST_INSTRUCTION("C4E27D238C1A80000000" , vpmovsxwd(ymm1, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("C4E27D238C1A80000000" , vpmovsxwd(ymm1, xmmword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("62F27D4823CA" , vpmovsxwd(zmm1, ymm2));
+ TEST_INSTRUCTION("62F27D48234C1A04" , vpmovsxwd(zmm1, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("62F27D48234C1A04" , vpmovsxwd(zmm1, ymmword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("C4E27924CA" , vpmovsxwq(xmm1, xmm2));
+ TEST_INSTRUCTION("C4E279248C1A80000000" , vpmovsxwq(xmm1, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("C4E279248C1A80000000" , vpmovsxwq(xmm1, dword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("C4E27D24CA" , vpmovsxwq(ymm1, xmm2));
+ TEST_INSTRUCTION("C4E27D248C1A80000000" , vpmovsxwq(ymm1, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("C4E27D248C1A80000000" , vpmovsxwq(ymm1, qword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("62F27D4824CA" , vpmovsxwq(zmm1, xmm2));
+ TEST_INSTRUCTION("62F27D48244C1A08" , vpmovsxwq(zmm1, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("62F27D48244C1A08" , vpmovsxwq(zmm1, xmmword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("62F27E0811D1" , vpmovusdb(xmm1, xmm2));
+ TEST_INSTRUCTION("62F27E08115C1120" , vpmovusdb(ptr(rcx, rdx, 0, 128), xmm3));
+ TEST_INSTRUCTION("62F27E08115C1120" , vpmovusdb(dword_ptr(rcx, rdx, 0, 128), xmm3));
+ TEST_INSTRUCTION("62F27E2811D1" , vpmovusdb(xmm1, ymm2));
+ TEST_INSTRUCTION("62F27E28115C1110" , vpmovusdb(ptr(rcx, rdx, 0, 128), ymm3));
+ TEST_INSTRUCTION("62F27E28115C1110" , vpmovusdb(qword_ptr(rcx, rdx, 0, 128), ymm3));
+ TEST_INSTRUCTION("62F27E4811D1" , vpmovusdb(xmm1, zmm2));
+ TEST_INSTRUCTION("62F27E48115C1108" , vpmovusdb(ptr(rcx, rdx, 0, 128), zmm3));
+ TEST_INSTRUCTION("62F27E48115C1108" , vpmovusdb(xmmword_ptr(rcx, rdx, 0, 128), zmm3));
+ TEST_INSTRUCTION("62F27E0813D1" , vpmovusdw(xmm1, xmm2));
+ TEST_INSTRUCTION("62F27E08135C1110" , vpmovusdw(ptr(rcx, rdx, 0, 128), xmm3));
+ TEST_INSTRUCTION("62F27E08135C1110" , vpmovusdw(qword_ptr(rcx, rdx, 0, 128), xmm3));
+ TEST_INSTRUCTION("62F27E2813D1" , vpmovusdw(xmm1, ymm2));
+ TEST_INSTRUCTION("62F27E28135C1108" , vpmovusdw(ptr(rcx, rdx, 0, 128), ymm3));
+ TEST_INSTRUCTION("62F27E28135C1108" , vpmovusdw(xmmword_ptr(rcx, rdx, 0, 128), ymm3));
+ TEST_INSTRUCTION("62F27E4813D1" , vpmovusdw(ymm1, zmm2));
+ TEST_INSTRUCTION("62F27E48135C1104" , vpmovusdw(ptr(rcx, rdx, 0, 128), zmm3));
+ TEST_INSTRUCTION("62F27E48135C1104" , vpmovusdw(ymmword_ptr(rcx, rdx, 0, 128), zmm3));
+ TEST_INSTRUCTION("62F27E0812D1" , vpmovusqb(xmm1, xmm2));
+ TEST_INSTRUCTION("62F27E08125C1140" , vpmovusqb(ptr(rcx, rdx, 0, 128), xmm3));
+ TEST_INSTRUCTION("62F27E08125C1140" , vpmovusqb(word_ptr(rcx, rdx, 0, 128), xmm3));
+ TEST_INSTRUCTION("62F27E2812D1" , vpmovusqb(xmm1, ymm2));
+ TEST_INSTRUCTION("62F27E28125C1120" , vpmovusqb(ptr(rcx, rdx, 0, 128), ymm3));
+ TEST_INSTRUCTION("62F27E28125C1120" , vpmovusqb(dword_ptr(rcx, rdx, 0, 128), ymm3));
+ TEST_INSTRUCTION("62F27E4812D1" , vpmovusqb(xmm1, zmm2));
+ TEST_INSTRUCTION("62F27E48125C1110" , vpmovusqb(ptr(rcx, rdx, 0, 128), zmm3));
+ TEST_INSTRUCTION("62F27E48125C1110" , vpmovusqb(qword_ptr(rcx, rdx, 0, 128), zmm3));
+ TEST_INSTRUCTION("62F27E0815D1" , vpmovusqd(xmm1, xmm2));
+ TEST_INSTRUCTION("62F27E08155C1110" , vpmovusqd(ptr(rcx, rdx, 0, 128), xmm3));
+ TEST_INSTRUCTION("62F27E08155C1110" , vpmovusqd(qword_ptr(rcx, rdx, 0, 128), xmm3));
+ TEST_INSTRUCTION("62F27E2815D1" , vpmovusqd(xmm1, ymm2));
+ TEST_INSTRUCTION("62F27E28155C1108" , vpmovusqd(ptr(rcx, rdx, 0, 128), ymm3));
+ TEST_INSTRUCTION("62F27E28155C1108" , vpmovusqd(xmmword_ptr(rcx, rdx, 0, 128), ymm3));
+ TEST_INSTRUCTION("62F27E4815D1" , vpmovusqd(ymm1, zmm2));
+ TEST_INSTRUCTION("62F27E48155C1104" , vpmovusqd(ptr(rcx, rdx, 0, 128), zmm3));
+ TEST_INSTRUCTION("62F27E48155C1104" , vpmovusqd(ymmword_ptr(rcx, rdx, 0, 128), zmm3));
+ TEST_INSTRUCTION("62F27E0814D1" , vpmovusqw(xmm1, xmm2));
+ TEST_INSTRUCTION("62F27E08145C1120" , vpmovusqw(ptr(rcx, rdx, 0, 128), xmm3));
+ TEST_INSTRUCTION("62F27E08145C1120" , vpmovusqw(dword_ptr(rcx, rdx, 0, 128), xmm3));
+ TEST_INSTRUCTION("62F27E2814D1" , vpmovusqw(xmm1, ymm2));
+ TEST_INSTRUCTION("62F27E28145C1110" , vpmovusqw(ptr(rcx, rdx, 0, 128), ymm3));
+ TEST_INSTRUCTION("62F27E28145C1110" , vpmovusqw(qword_ptr(rcx, rdx, 0, 128), ymm3));
+ TEST_INSTRUCTION("62F27E4814D1" , vpmovusqw(xmm1, zmm2));
+ TEST_INSTRUCTION("62F27E48145C1108" , vpmovusqw(ptr(rcx, rdx, 0, 128), zmm3));
+ TEST_INSTRUCTION("62F27E48145C1108" , vpmovusqw(xmmword_ptr(rcx, rdx, 0, 128), zmm3));
+ TEST_INSTRUCTION("62F27E0810D1" , vpmovuswb(xmm1, xmm2));
+ TEST_INSTRUCTION("62F27E08105C1110" , vpmovuswb(ptr(rcx, rdx, 0, 128), xmm3));
+ TEST_INSTRUCTION("62F27E08105C1110" , vpmovuswb(qword_ptr(rcx, rdx, 0, 128), xmm3));
+ TEST_INSTRUCTION("62F27E2810D1" , vpmovuswb(xmm1, ymm2));
+ TEST_INSTRUCTION("62F27E28105C1108" , vpmovuswb(ptr(rcx, rdx, 0, 128), ymm3));
+ TEST_INSTRUCTION("62F27E28105C1108" , vpmovuswb(xmmword_ptr(rcx, rdx, 0, 128), ymm3));
+ TEST_INSTRUCTION("62F27E4810D1" , vpmovuswb(ymm1, zmm2));
+ TEST_INSTRUCTION("62F27E48105C1104" , vpmovuswb(ptr(rcx, rdx, 0, 128), zmm3));
+ TEST_INSTRUCTION("62F27E48105C1104" , vpmovuswb(ymmword_ptr(rcx, rdx, 0, 128), zmm3));
+ TEST_INSTRUCTION("62F2FE0829CA" , vpmovw2m(k1, xmm2));
+ TEST_INSTRUCTION("62F2FE2829CA" , vpmovw2m(k1, ymm2));
+ TEST_INSTRUCTION("62F2FE4829CA" , vpmovw2m(k1, zmm2));
+ TEST_INSTRUCTION("62F27E0830D1" , vpmovwb(xmm1, xmm2));
+ TEST_INSTRUCTION("62F27E08305C1110" , vpmovwb(ptr(rcx, rdx, 0, 128), xmm3));
+ TEST_INSTRUCTION("62F27E08305C1110" , vpmovwb(qword_ptr(rcx, rdx, 0, 128), xmm3));
+ TEST_INSTRUCTION("62F27E2830D1" , vpmovwb(xmm1, ymm2));
+ TEST_INSTRUCTION("62F27E28305C1108" , vpmovwb(ptr(rcx, rdx, 0, 128), ymm3));
+ TEST_INSTRUCTION("62F27E28305C1108" , vpmovwb(xmmword_ptr(rcx, rdx, 0, 128), ymm3));
+ TEST_INSTRUCTION("62F27E4830D1" , vpmovwb(ymm1, zmm2));
+ TEST_INSTRUCTION("62F27E48305C1104" , vpmovwb(ptr(rcx, rdx, 0, 128), zmm3));
+ TEST_INSTRUCTION("62F27E48305C1104" , vpmovwb(ymmword_ptr(rcx, rdx, 0, 128), zmm3));
+ TEST_INSTRUCTION("C4E27931CA" , vpmovzxbd(xmm1, xmm2));
+ TEST_INSTRUCTION("C4E279318C1A80000000" , vpmovzxbd(xmm1, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("C4E279318C1A80000000" , vpmovzxbd(xmm1, dword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("C4E27D31CA" , vpmovzxbd(ymm1, xmm2));
+ TEST_INSTRUCTION("C4E27D318C1A80000000" , vpmovzxbd(ymm1, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("C4E27D318C1A80000000" , vpmovzxbd(ymm1, qword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("62F27D4831CA" , vpmovzxbd(zmm1, xmm2));
+ TEST_INSTRUCTION("62F27D48314C1A08" , vpmovzxbd(zmm1, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("62F27D48314C1A08" , vpmovzxbd(zmm1, xmmword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("C4E27932CA" , vpmovzxbq(xmm1, xmm2));
+ TEST_INSTRUCTION("C4E279328C1A80000000" , vpmovzxbq(xmm1, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("C4E279328C1A80000000" , vpmovzxbq(xmm1, word_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("C4E27D32CA" , vpmovzxbq(ymm1, xmm2));
+ TEST_INSTRUCTION("C4E27D328C1A80000000" , vpmovzxbq(ymm1, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("C4E27D328C1A80000000" , vpmovzxbq(ymm1, dword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("62F27D4832CA" , vpmovzxbq(zmm1, xmm2));
+ TEST_INSTRUCTION("62F27D48324C1A10" , vpmovzxbq(zmm1, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("62F27D48324C1A10" , vpmovzxbq(zmm1, qword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("C4E27930CA" , vpmovzxbw(xmm1, xmm2));
+ TEST_INSTRUCTION("C4E279308C1A80000000" , vpmovzxbw(xmm1, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("C4E279308C1A80000000" , vpmovzxbw(xmm1, qword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("C4E27D30CA" , vpmovzxbw(ymm1, xmm2));
+ TEST_INSTRUCTION("C4E27D308C1A80000000" , vpmovzxbw(ymm1, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("C4E27D308C1A80000000" , vpmovzxbw(ymm1, xmmword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("62F27D4830CA" , vpmovzxbw(zmm1, ymm2));
+ TEST_INSTRUCTION("62F27D48304C1A04" , vpmovzxbw(zmm1, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("62F27D48304C1A04" , vpmovzxbw(zmm1, ymmword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("C4E27935CA" , vpmovzxdq(xmm1, xmm2));
+ TEST_INSTRUCTION("C4E279358C1A80000000" , vpmovzxdq(xmm1, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("C4E279358C1A80000000" , vpmovzxdq(xmm1, qword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("C4E27D35CA" , vpmovzxdq(ymm1, xmm2));
+ TEST_INSTRUCTION("C4E27D358C1A80000000" , vpmovzxdq(ymm1, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("C4E27D358C1A80000000" , vpmovzxdq(ymm1, xmmword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("62F27D4835CA" , vpmovzxdq(zmm1, ymm2));
+ TEST_INSTRUCTION("62F27D48354C1A04" , vpmovzxdq(zmm1, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("62F27D48354C1A04" , vpmovzxdq(zmm1, ymmword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("C4E27933CA" , vpmovzxwd(xmm1, xmm2));
+ TEST_INSTRUCTION("C4E279338C1A80000000" , vpmovzxwd(xmm1, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("C4E279338C1A80000000" , vpmovzxwd(xmm1, qword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("C4E27D33CA" , vpmovzxwd(ymm1, xmm2));
+ TEST_INSTRUCTION("C4E27D338C1A80000000" , vpmovzxwd(ymm1, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("C4E27D338C1A80000000" , vpmovzxwd(ymm1, xmmword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("62F27D4833CA" , vpmovzxwd(zmm1, ymm2));
+ TEST_INSTRUCTION("62F27D48334C1A04" , vpmovzxwd(zmm1, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("62F27D48334C1A04" , vpmovzxwd(zmm1, ymmword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("C4E27934CA" , vpmovzxwq(xmm1, xmm2));
+ TEST_INSTRUCTION("C4E279348C1A80000000" , vpmovzxwq(xmm1, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("C4E279348C1A80000000" , vpmovzxwq(xmm1, dword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("C4E27D34CA" , vpmovzxwq(ymm1, xmm2));
+ TEST_INSTRUCTION("C4E27D348C1A80000000" , vpmovzxwq(ymm1, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("C4E27D348C1A80000000" , vpmovzxwq(ymm1, qword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("62F27D4834CA" , vpmovzxwq(zmm1, xmm2));
+ TEST_INSTRUCTION("62F27D48344C1A08" , vpmovzxwq(zmm1, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("62F27D48344C1A08" , vpmovzxwq(zmm1, xmmword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("C4E26928CB" , vpmuldq(xmm1, xmm2, xmm3));
+ TEST_INSTRUCTION("C4E269288C2B80000000" , vpmuldq(xmm1, xmm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C4E269288C2B80000000" , vpmuldq(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C4E26D28CB" , vpmuldq(ymm1, ymm2, ymm3));
+ TEST_INSTRUCTION("C4E26D288C2B80000000" , vpmuldq(ymm1, ymm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C4E26D288C2B80000000" , vpmuldq(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F2ED4828CB" , vpmuldq(zmm1, zmm2, zmm3));
+ TEST_INSTRUCTION("62F2ED48284C2B02" , vpmuldq(zmm1, zmm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F2ED48284C2B02" , vpmuldq(zmm1, zmm2, zmmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C4E2690BCB" , vpmulhrsw(xmm1, xmm2, xmm3));
+ TEST_INSTRUCTION("C4E2690B8C2B80000000" , vpmulhrsw(xmm1, xmm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C4E2690B8C2B80000000" , vpmulhrsw(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C4E26D0BCB" , vpmulhrsw(ymm1, ymm2, ymm3));
+ TEST_INSTRUCTION("C4E26D0B8C2B80000000" , vpmulhrsw(ymm1, ymm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C4E26D0B8C2B80000000" , vpmulhrsw(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F26D480BCB" , vpmulhrsw(zmm1, zmm2, zmm3));
+ TEST_INSTRUCTION("62F26D480B4C2B02" , vpmulhrsw(zmm1, zmm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F26D480B4C2B02" , vpmulhrsw(zmm1, zmm2, zmmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C5E9E4CB" , vpmulhuw(xmm1, xmm2, xmm3));
+ TEST_INSTRUCTION("C5E9E48C2B80000000" , vpmulhuw(xmm1, xmm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C5E9E48C2B80000000" , vpmulhuw(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C5EDE4CB" , vpmulhuw(ymm1, ymm2, ymm3));
+ TEST_INSTRUCTION("C5EDE48C2B80000000" , vpmulhuw(ymm1, ymm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C5EDE48C2B80000000" , vpmulhuw(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F16D48E4CB" , vpmulhuw(zmm1, zmm2, zmm3));
+ TEST_INSTRUCTION("62F16D48E44C2B02" , vpmulhuw(zmm1, zmm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F16D48E44C2B02" , vpmulhuw(zmm1, zmm2, zmmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C5E9E5CB" , vpmulhw(xmm1, xmm2, xmm3));
+ TEST_INSTRUCTION("C5E9E58C2B80000000" , vpmulhw(xmm1, xmm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C5E9E58C2B80000000" , vpmulhw(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C5EDE5CB" , vpmulhw(ymm1, ymm2, ymm3));
+ TEST_INSTRUCTION("C5EDE58C2B80000000" , vpmulhw(ymm1, ymm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C5EDE58C2B80000000" , vpmulhw(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F16D48E5CB" , vpmulhw(zmm1, zmm2, zmm3));
+ TEST_INSTRUCTION("62F16D48E54C2B02" , vpmulhw(zmm1, zmm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F16D48E54C2B02" , vpmulhw(zmm1, zmm2, zmmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C4E26940CB" , vpmulld(xmm1, xmm2, xmm3));
+ TEST_INSTRUCTION("C4E269408C2B80000000" , vpmulld(xmm1, xmm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C4E269408C2B80000000" , vpmulld(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C4E26D40CB" , vpmulld(ymm1, ymm2, ymm3));
+ TEST_INSTRUCTION("C4E26D408C2B80000000" , vpmulld(ymm1, ymm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C4E26D408C2B80000000" , vpmulld(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F26D4840CB" , vpmulld(zmm1, zmm2, zmm3));
+ TEST_INSTRUCTION("62F26D48404C2B02" , vpmulld(zmm1, zmm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F26D48404C2B02" , vpmulld(zmm1, zmm2, zmmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F2ED0840CB" , vpmullq(xmm1, xmm2, xmm3));
+ TEST_INSTRUCTION("62F2ED08404C2B08" , vpmullq(xmm1, xmm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F2ED08404C2B08" , vpmullq(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F2ED2840CB" , vpmullq(ymm1, ymm2, ymm3));
+ TEST_INSTRUCTION("62F2ED28404C2B04" , vpmullq(ymm1, ymm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F2ED28404C2B04" , vpmullq(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F2ED4840CB" , vpmullq(zmm1, zmm2, zmm3));
+ TEST_INSTRUCTION("62F2ED48404C2B02" , vpmullq(zmm1, zmm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F2ED48404C2B02" , vpmullq(zmm1, zmm2, zmmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C5E9D5CB" , vpmullw(xmm1, xmm2, xmm3));
+ TEST_INSTRUCTION("C5E9D58C2B80000000" , vpmullw(xmm1, xmm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C5E9D58C2B80000000" , vpmullw(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C5EDD5CB" , vpmullw(ymm1, ymm2, ymm3));
+ TEST_INSTRUCTION("C5EDD58C2B80000000" , vpmullw(ymm1, ymm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C5EDD58C2B80000000" , vpmullw(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F16D48D5CB" , vpmullw(zmm1, zmm2, zmm3));
+ TEST_INSTRUCTION("62F16D48D54C2B02" , vpmullw(zmm1, zmm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F16D48D54C2B02" , vpmullw(zmm1, zmm2, zmmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F2ED0883CB" , vpmultishiftqb(xmm1, xmm2, xmm3));
+ TEST_INSTRUCTION("62F2ED08834C2B08" , vpmultishiftqb(xmm1, xmm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F2ED08834C2B08" , vpmultishiftqb(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F2ED2883CB" , vpmultishiftqb(ymm1, ymm2, ymm3));
+ TEST_INSTRUCTION("62F2ED28834C2B04" , vpmultishiftqb(ymm1, ymm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F2ED28834C2B04" , vpmultishiftqb(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F2ED4883CB" , vpmultishiftqb(zmm1, zmm2, zmm3));
+ TEST_INSTRUCTION("62F2ED48834C2B02" , vpmultishiftqb(zmm1, zmm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F2ED48834C2B02" , vpmultishiftqb(zmm1, zmm2, zmmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C5E9F4CB" , vpmuludq(xmm1, xmm2, xmm3));
+ TEST_INSTRUCTION("C5E9F48C2B80000000" , vpmuludq(xmm1, xmm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C5E9F48C2B80000000" , vpmuludq(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C5EDF4CB" , vpmuludq(ymm1, ymm2, ymm3));
+ TEST_INSTRUCTION("C5EDF48C2B80000000" , vpmuludq(ymm1, ymm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C5EDF48C2B80000000" , vpmuludq(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F1ED48F4CB" , vpmuludq(zmm1, zmm2, zmm3));
+ TEST_INSTRUCTION("62F1ED48F44C2B02" , vpmuludq(zmm1, zmm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F1ED48F44C2B02" , vpmuludq(zmm1, zmm2, zmmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F27D0854CA" , vpopcntb(xmm1, xmm2));
+ TEST_INSTRUCTION("62F27D08544C1A08" , vpopcntb(xmm1, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("62F27D08544C1A08" , vpopcntb(xmm1, xmmword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("62F27D2854CA" , vpopcntb(ymm1, ymm2));
+ TEST_INSTRUCTION("62F27D28544C1A04" , vpopcntb(ymm1, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("62F27D28544C1A04" , vpopcntb(ymm1, ymmword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("62F27D4854CA" , vpopcntb(zmm1, zmm2));
+ TEST_INSTRUCTION("62F27D48544C1A02" , vpopcntb(zmm1, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("62F27D48544C1A02" , vpopcntb(zmm1, zmmword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("62F27D0855CA" , vpopcntd(xmm1, xmm2));
+ TEST_INSTRUCTION("62F27D08554C1A08" , vpopcntd(xmm1, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("62F27D08554C1A08" , vpopcntd(xmm1, xmmword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("62F27D2855CA" , vpopcntd(ymm1, ymm2));
+ TEST_INSTRUCTION("62F27D28554C1A04" , vpopcntd(ymm1, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("62F27D28554C1A04" , vpopcntd(ymm1, ymmword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("62F27D4855CA" , vpopcntd(zmm1, zmm2));
+ TEST_INSTRUCTION("62F27D48554C1A02" , vpopcntd(zmm1, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("62F27D48554C1A02" , vpopcntd(zmm1, zmmword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("62F2FD0855CA" , vpopcntq(xmm1, xmm2));
+ TEST_INSTRUCTION("62F2FD08554C1A08" , vpopcntq(xmm1, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("62F2FD08554C1A08" , vpopcntq(xmm1, xmmword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("62F2FD2855CA" , vpopcntq(ymm1, ymm2));
+ TEST_INSTRUCTION("62F2FD28554C1A04" , vpopcntq(ymm1, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("62F2FD28554C1A04" , vpopcntq(ymm1, ymmword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("62F2FD4855CA" , vpopcntq(zmm1, zmm2));
+ TEST_INSTRUCTION("62F2FD48554C1A02" , vpopcntq(zmm1, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("62F2FD48554C1A02" , vpopcntq(zmm1, zmmword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("62F2FD0854CA" , vpopcntw(xmm1, xmm2));
+ TEST_INSTRUCTION("62F2FD08544C1A08" , vpopcntw(xmm1, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("62F2FD08544C1A08" , vpopcntw(xmm1, xmmword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("62F2FD2854CA" , vpopcntw(ymm1, ymm2));
+ TEST_INSTRUCTION("62F2FD28544C1A04" , vpopcntw(ymm1, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("62F2FD28544C1A04" , vpopcntw(ymm1, ymmword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("62F2FD4854CA" , vpopcntw(zmm1, zmm2));
+ TEST_INSTRUCTION("62F2FD48544C1A02" , vpopcntw(zmm1, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("62F2FD48544C1A02" , vpopcntw(zmm1, zmmword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("C5E9EBCB" , vpor(xmm1, xmm2, xmm3));
+ TEST_INSTRUCTION("C5E9EB8C2B80000000" , vpor(xmm1, xmm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C5E9EB8C2B80000000" , vpor(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C5EDEBCB" , vpor(ymm1, ymm2, ymm3));
+ TEST_INSTRUCTION("C5EDEB8C2B80000000" , vpor(ymm1, ymm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C5EDEB8C2B80000000" , vpor(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F16D08EBCB" , vpord(xmm1, xmm2, xmm3));
+ TEST_INSTRUCTION("62F16D08EB4C2B08" , vpord(xmm1, xmm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F16D08EB4C2B08" , vpord(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F16D28EBCB" , vpord(ymm1, ymm2, ymm3));
+ TEST_INSTRUCTION("62F16D28EB4C2B04" , vpord(ymm1, ymm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F16D28EB4C2B04" , vpord(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F16D48EBCB" , vpord(zmm1, zmm2, zmm3));
+ TEST_INSTRUCTION("62F16D48EB4C2B02" , vpord(zmm1, zmm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F16D48EB4C2B02" , vpord(zmm1, zmm2, zmmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F1ED08EBCB" , vporq(xmm1, xmm2, xmm3));
+ TEST_INSTRUCTION("62F1ED08EB4C2B08" , vporq(xmm1, xmm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F1ED08EB4C2B08" , vporq(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F1ED28EBCB" , vporq(ymm1, ymm2, ymm3));
+ TEST_INSTRUCTION("62F1ED28EB4C2B04" , vporq(ymm1, ymm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F1ED28EB4C2B04" , vporq(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F1ED48EBCB" , vporq(zmm1, zmm2, zmm3));
+ TEST_INSTRUCTION("62F1ED48EB4C2B02" , vporq(zmm1, zmm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F1ED48EB4C2B02" , vporq(zmm1, zmm2, zmmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("8FE868A3CB40" , vpperm(xmm1, xmm2, xmm3, xmm4));
+ TEST_INSTRUCTION("8FE8E8A38C358000000030" , vpperm(xmm1, xmm2, xmm3, ptr(rbp, rsi, 0, 128)));
+ TEST_INSTRUCTION("8FE8E8A38C358000000030" , vpperm(xmm1, xmm2, xmm3, xmmword_ptr(rbp, rsi, 0, 128)));
+ TEST_INSTRUCTION("8FE868A38C2B8000000060" , vpperm(xmm1, xmm2, ptr(rbx, rbp, 0, 128), xmm6));
+ TEST_INSTRUCTION("8FE868A38C2B8000000060" , vpperm(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128), xmm6));
+ TEST_INSTRUCTION("62F1750872CA01" , vprold(xmm1, xmm2, 1));
+ TEST_INSTRUCTION("62F17508724C1A0801" , vprold(xmm1, ptr(rdx, rbx, 0, 128), 1));
+ TEST_INSTRUCTION("62F17508724C1A0801" , vprold(xmm1, xmmword_ptr(rdx, rbx, 0, 128), 1));
+ TEST_INSTRUCTION("62F1752872CA01" , vprold(ymm1, ymm2, 1));
+ TEST_INSTRUCTION("62F17528724C1A0401" , vprold(ymm1, ptr(rdx, rbx, 0, 128), 1));
+ TEST_INSTRUCTION("62F17528724C1A0401" , vprold(ymm1, ymmword_ptr(rdx, rbx, 0, 128), 1));
+ TEST_INSTRUCTION("62F1754872CA01" , vprold(zmm1, zmm2, 1));
+ TEST_INSTRUCTION("62F17548724C1A0201" , vprold(zmm1, ptr(rdx, rbx, 0, 128), 1));
+ TEST_INSTRUCTION("62F17548724C1A0201" , vprold(zmm1, zmmword_ptr(rdx, rbx, 0, 128), 1));
+ TEST_INSTRUCTION("62F1F50872CA01" , vprolq(xmm1, xmm2, 1));
+ TEST_INSTRUCTION("62F1F508724C1A0801" , vprolq(xmm1, ptr(rdx, rbx, 0, 128), 1));
+ TEST_INSTRUCTION("62F1F508724C1A0801" , vprolq(xmm1, xmmword_ptr(rdx, rbx, 0, 128), 1));
+ TEST_INSTRUCTION("62F1F52872CA01" , vprolq(ymm1, ymm2, 1));
+ TEST_INSTRUCTION("62F1F528724C1A0401" , vprolq(ymm1, ptr(rdx, rbx, 0, 128), 1));
+ TEST_INSTRUCTION("62F1F528724C1A0401" , vprolq(ymm1, ymmword_ptr(rdx, rbx, 0, 128), 1));
+ TEST_INSTRUCTION("62F1F54872CA01" , vprolq(zmm1, zmm2, 1));
+ TEST_INSTRUCTION("62F1F548724C1A0201" , vprolq(zmm1, ptr(rdx, rbx, 0, 128), 1));
+ TEST_INSTRUCTION("62F1F548724C1A0201" , vprolq(zmm1, zmmword_ptr(rdx, rbx, 0, 128), 1));
+ TEST_INSTRUCTION("62F26D0815CB" , vprolvd(xmm1, xmm2, xmm3));
+ TEST_INSTRUCTION("62F26D08154C2B08" , vprolvd(xmm1, xmm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F26D08154C2B08" , vprolvd(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F26D2815CB" , vprolvd(ymm1, ymm2, ymm3));
+ TEST_INSTRUCTION("62F26D28154C2B04" , vprolvd(ymm1, ymm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F26D28154C2B04" , vprolvd(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F26D4815CB" , vprolvd(zmm1, zmm2, zmm3));
+ TEST_INSTRUCTION("62F26D48154C2B02" , vprolvd(zmm1, zmm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F26D48154C2B02" , vprolvd(zmm1, zmm2, zmmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F2ED0815CB" , vprolvq(xmm1, xmm2, xmm3));
+ TEST_INSTRUCTION("62F2ED08154C2B08" , vprolvq(xmm1, xmm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F2ED08154C2B08" , vprolvq(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F2ED2815CB" , vprolvq(ymm1, ymm2, ymm3));
+ TEST_INSTRUCTION("62F2ED28154C2B04" , vprolvq(ymm1, ymm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F2ED28154C2B04" , vprolvq(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F2ED4815CB" , vprolvq(zmm1, zmm2, zmm3));
+ TEST_INSTRUCTION("62F2ED48154C2B02" , vprolvq(zmm1, zmm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F2ED48154C2B02" , vprolvq(zmm1, zmm2, zmmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F1750872C201" , vprord(xmm1, xmm2, 1));
+ TEST_INSTRUCTION("62F1750872441A0801" , vprord(xmm1, ptr(rdx, rbx, 0, 128), 1));
+ TEST_INSTRUCTION("62F1750872441A0801" , vprord(xmm1, xmmword_ptr(rdx, rbx, 0, 128), 1));
+ TEST_INSTRUCTION("62F1752872C201" , vprord(ymm1, ymm2, 1));
+ TEST_INSTRUCTION("62F1752872441A0401" , vprord(ymm1, ptr(rdx, rbx, 0, 128), 1));
+ TEST_INSTRUCTION("62F1752872441A0401" , vprord(ymm1, ymmword_ptr(rdx, rbx, 0, 128), 1));
+ TEST_INSTRUCTION("62F1754872C201" , vprord(zmm1, zmm2, 1));
+ TEST_INSTRUCTION("62F1754872441A0201" , vprord(zmm1, ptr(rdx, rbx, 0, 128), 1));
+ TEST_INSTRUCTION("62F1754872441A0201" , vprord(zmm1, zmmword_ptr(rdx, rbx, 0, 128), 1));
+ TEST_INSTRUCTION("62F1F50872C201" , vprorq(xmm1, xmm2, 1));
+ TEST_INSTRUCTION("62F1F50872441A0801" , vprorq(xmm1, ptr(rdx, rbx, 0, 128), 1));
+ TEST_INSTRUCTION("62F1F50872441A0801" , vprorq(xmm1, xmmword_ptr(rdx, rbx, 0, 128), 1));
+ TEST_INSTRUCTION("62F1F52872C201" , vprorq(ymm1, ymm2, 1));
+ TEST_INSTRUCTION("62F1F52872441A0401" , vprorq(ymm1, ptr(rdx, rbx, 0, 128), 1));
+ TEST_INSTRUCTION("62F1F52872441A0401" , vprorq(ymm1, ymmword_ptr(rdx, rbx, 0, 128), 1));
+ TEST_INSTRUCTION("62F1F54872C201" , vprorq(zmm1, zmm2, 1));
+ TEST_INSTRUCTION("62F1F54872441A0201" , vprorq(zmm1, ptr(rdx, rbx, 0, 128), 1));
+ TEST_INSTRUCTION("62F1F54872441A0201" , vprorq(zmm1, zmmword_ptr(rdx, rbx, 0, 128), 1));
+ TEST_INSTRUCTION("62F26D0814CB" , vprorvd(xmm1, xmm2, xmm3));
+ TEST_INSTRUCTION("62F26D08144C2B08" , vprorvd(xmm1, xmm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F26D08144C2B08" , vprorvd(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F26D2814CB" , vprorvd(ymm1, ymm2, ymm3));
+ TEST_INSTRUCTION("62F26D28144C2B04" , vprorvd(ymm1, ymm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F26D28144C2B04" , vprorvd(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F26D4814CB" , vprorvd(zmm1, zmm2, zmm3));
+ TEST_INSTRUCTION("62F26D48144C2B02" , vprorvd(zmm1, zmm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F26D48144C2B02" , vprorvd(zmm1, zmm2, zmmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F2ED0814CB" , vprorvq(xmm1, xmm2, xmm3));
+ TEST_INSTRUCTION("62F2ED08144C2B08" , vprorvq(xmm1, xmm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F2ED08144C2B08" , vprorvq(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F2ED2814CB" , vprorvq(ymm1, ymm2, ymm3));
+ TEST_INSTRUCTION("62F2ED28144C2B04" , vprorvq(ymm1, ymm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F2ED28144C2B04" , vprorvq(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F2ED4814CB" , vprorvq(zmm1, zmm2, zmm3));
+ TEST_INSTRUCTION("62F2ED48144C2B02" , vprorvq(zmm1, zmm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F2ED48144C2B02" , vprorvq(zmm1, zmm2, zmmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("8FE96090CA" , vprotb(xmm1, xmm2, xmm3));
+ TEST_INSTRUCTION("8FE878C0CA01" , vprotb(xmm1, xmm2, 1));
+ TEST_INSTRUCTION("8FE9E8908C2B80000000" , vprotb(xmm1, xmm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("8FE9E8908C2B80000000" , vprotb(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("8FE958908C1A80000000" , vprotb(xmm1, ptr(rdx, rbx, 0, 128), xmm4));
+ TEST_INSTRUCTION("8FE878C08C1A8000000001" , vprotb(xmm1, ptr(rdx, rbx, 0, 128), 1));
+ TEST_INSTRUCTION("8FE958908C1A80000000" , vprotb(xmm1, xmmword_ptr(rdx, rbx, 0, 128), xmm4));
+ TEST_INSTRUCTION("8FE878C08C1A8000000001" , vprotb(xmm1, xmmword_ptr(rdx, rbx, 0, 128), 1));
+ TEST_INSTRUCTION("8FE96092CA" , vprotd(xmm1, xmm2, xmm3));
+ TEST_INSTRUCTION("8FE878C2CA01" , vprotd(xmm1, xmm2, 1));
+ TEST_INSTRUCTION("8FE9E8928C2B80000000" , vprotd(xmm1, xmm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("8FE9E8928C2B80000000" , vprotd(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("8FE958928C1A80000000" , vprotd(xmm1, ptr(rdx, rbx, 0, 128), xmm4));
+ TEST_INSTRUCTION("8FE878C28C1A8000000001" , vprotd(xmm1, ptr(rdx, rbx, 0, 128), 1));
+ TEST_INSTRUCTION("8FE958928C1A80000000" , vprotd(xmm1, xmmword_ptr(rdx, rbx, 0, 128), xmm4));
+ TEST_INSTRUCTION("8FE878C28C1A8000000001" , vprotd(xmm1, xmmword_ptr(rdx, rbx, 0, 128), 1));
+ TEST_INSTRUCTION("8FE96093CA" , vprotq(xmm1, xmm2, xmm3));
+ TEST_INSTRUCTION("8FE878C3CA01" , vprotq(xmm1, xmm2, 1));
+ TEST_INSTRUCTION("8FE9E8938C2B80000000" , vprotq(xmm1, xmm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("8FE9E8938C2B80000000" , vprotq(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("8FE958938C1A80000000" , vprotq(xmm1, ptr(rdx, rbx, 0, 128), xmm4));
+ TEST_INSTRUCTION("8FE878C38C1A8000000001" , vprotq(xmm1, ptr(rdx, rbx, 0, 128), 1));
+ TEST_INSTRUCTION("8FE958938C1A80000000" , vprotq(xmm1, xmmword_ptr(rdx, rbx, 0, 128), xmm4));
+ TEST_INSTRUCTION("8FE878C38C1A8000000001" , vprotq(xmm1, xmmword_ptr(rdx, rbx, 0, 128), 1));
+ TEST_INSTRUCTION("8FE96091CA" , vprotw(xmm1, xmm2, xmm3));
+ TEST_INSTRUCTION("8FE878C1CA01" , vprotw(xmm1, xmm2, 1));
+ TEST_INSTRUCTION("8FE9E8918C2B80000000" , vprotw(xmm1, xmm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("8FE9E8918C2B80000000" , vprotw(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("8FE958918C1A80000000" , vprotw(xmm1, ptr(rdx, rbx, 0, 128), xmm4));
+ TEST_INSTRUCTION("8FE878C18C1A8000000001" , vprotw(xmm1, ptr(rdx, rbx, 0, 128), 1));
+ TEST_INSTRUCTION("8FE958918C1A80000000" , vprotw(xmm1, xmmword_ptr(rdx, rbx, 0, 128), xmm4));
+ TEST_INSTRUCTION("8FE878C18C1A8000000001" , vprotw(xmm1, xmmword_ptr(rdx, rbx, 0, 128), 1));
+ TEST_INSTRUCTION("C5E9F6CB" , vpsadbw(xmm1, xmm2, xmm3));
+ TEST_INSTRUCTION("C5E9F68C2B80000000" , vpsadbw(xmm1, xmm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C5E9F68C2B80000000" , vpsadbw(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C5EDF6CB" , vpsadbw(ymm1, ymm2, ymm3));
+ TEST_INSTRUCTION("C5EDF68C2B80000000" , vpsadbw(ymm1, ymm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C5EDF68C2B80000000" , vpsadbw(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F16D48F6CB" , vpsadbw(zmm1, zmm2, zmm3));
+ TEST_INSTRUCTION("62F16D48F64C2B02" , vpsadbw(zmm1, zmm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F16D48F64C2B02" , vpsadbw(zmm1, zmm2, zmmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F27D09A05C1120" , k(k1).vpscatterdd(ptr(rcx, xmm2, 0, 128), xmm3));
+ TEST_INSTRUCTION("62F27D29A05C1120" , k(k1).vpscatterdd(ptr(rcx, ymm2, 0, 128), ymm3));
+ TEST_INSTRUCTION("62F27D49A05C1120" , k(k1).vpscatterdd(ptr(rcx, zmm2, 0, 128), zmm3));
+ TEST_INSTRUCTION("62F2FD09A05C1110" , k(k1).vpscatterdq(ptr(rcx, xmm2, 0, 128), xmm3));
+ TEST_INSTRUCTION("62F2FD29A05C1110" , k(k1).vpscatterdq(ptr(rcx, xmm2, 0, 128), ymm3));
+ TEST_INSTRUCTION("62F2FD49A05C1110" , k(k1).vpscatterdq(ptr(rcx, ymm2, 0, 128), zmm3));
+ TEST_INSTRUCTION("62F27D09A15C1120" , k(k1).vpscatterqd(ptr(rcx, xmm2, 0, 128), xmm3));
+ TEST_INSTRUCTION("62F27D29A15C1120" , k(k1).vpscatterqd(ptr(rcx, ymm2, 0, 128), xmm3));
+ TEST_INSTRUCTION("62F27D49A15C1120" , k(k1).vpscatterqd(ptr(rcx, zmm2, 0, 128), ymm3));
+ TEST_INSTRUCTION("62F2FD09A15C1110" , k(k1).vpscatterqq(ptr(rcx, xmm2, 0, 128), xmm3));
+ TEST_INSTRUCTION("62F2FD29A15C1110" , k(k1).vpscatterqq(ptr(rcx, ymm2, 0, 128), ymm3));
+ TEST_INSTRUCTION("62F2FD49A15C1110" , k(k1).vpscatterqq(ptr(rcx, zmm2, 0, 128), zmm3));
+ TEST_INSTRUCTION("8FE96098CA" , vpshab(xmm1, xmm2, xmm3));
+ TEST_INSTRUCTION("8FE9E8988C2B80000000" , vpshab(xmm1, xmm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("8FE9E8988C2B80000000" , vpshab(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("8FE958988C1A80000000" , vpshab(xmm1, ptr(rdx, rbx, 0, 128), xmm4));
+ TEST_INSTRUCTION("8FE958988C1A80000000" , vpshab(xmm1, xmmword_ptr(rdx, rbx, 0, 128), xmm4));
+ TEST_INSTRUCTION("8FE9609ACA" , vpshad(xmm1, xmm2, xmm3));
+ TEST_INSTRUCTION("8FE9E89A8C2B80000000" , vpshad(xmm1, xmm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("8FE9E89A8C2B80000000" , vpshad(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("8FE9589A8C1A80000000" , vpshad(xmm1, ptr(rdx, rbx, 0, 128), xmm4));
+ TEST_INSTRUCTION("8FE9589A8C1A80000000" , vpshad(xmm1, xmmword_ptr(rdx, rbx, 0, 128), xmm4));
+ TEST_INSTRUCTION("8FE9609BCA" , vpshaq(xmm1, xmm2, xmm3));
+ TEST_INSTRUCTION("8FE9E89B8C2B80000000" , vpshaq(xmm1, xmm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("8FE9E89B8C2B80000000" , vpshaq(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("8FE9589B8C1A80000000" , vpshaq(xmm1, ptr(rdx, rbx, 0, 128), xmm4));
+ TEST_INSTRUCTION("8FE9589B8C1A80000000" , vpshaq(xmm1, xmmword_ptr(rdx, rbx, 0, 128), xmm4));
+ TEST_INSTRUCTION("8FE96099CA" , vpshaw(xmm1, xmm2, xmm3));
+ TEST_INSTRUCTION("8FE9E8998C2B80000000" , vpshaw(xmm1, xmm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("8FE9E8998C2B80000000" , vpshaw(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("8FE958998C1A80000000" , vpshaw(xmm1, ptr(rdx, rbx, 0, 128), xmm4));
+ TEST_INSTRUCTION("8FE958998C1A80000000" , vpshaw(xmm1, xmmword_ptr(rdx, rbx, 0, 128), xmm4));
+ TEST_INSTRUCTION("8FE96094CA" , vpshlb(xmm1, xmm2, xmm3));
+ TEST_INSTRUCTION("8FE9E8948C2B80000000" , vpshlb(xmm1, xmm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("8FE9E8948C2B80000000" , vpshlb(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("8FE958948C1A80000000" , vpshlb(xmm1, ptr(rdx, rbx, 0, 128), xmm4));
+ TEST_INSTRUCTION("8FE958948C1A80000000" , vpshlb(xmm1, xmmword_ptr(rdx, rbx, 0, 128), xmm4));
+ TEST_INSTRUCTION("8FE96096CA" , vpshld(xmm1, xmm2, xmm3));
+ TEST_INSTRUCTION("8FE9E8968C2B80000000" , vpshld(xmm1, xmm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("8FE9E8968C2B80000000" , vpshld(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("8FE958968C1A80000000" , vpshld(xmm1, ptr(rdx, rbx, 0, 128), xmm4));
+ TEST_INSTRUCTION("8FE958968C1A80000000" , vpshld(xmm1, xmmword_ptr(rdx, rbx, 0, 128), xmm4));
+ TEST_INSTRUCTION("62F36D0871CB01" , vpshldd(xmm1, xmm2, xmm3, 1));
+ TEST_INSTRUCTION("62F36D08714C2B0801" , vpshldd(xmm1, xmm2, ptr(rbx, rbp, 0, 128), 1));
+ TEST_INSTRUCTION("62F36D08714C2B0801" , vpshldd(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128), 1));
+ TEST_INSTRUCTION("62F36D2871CB01" , vpshldd(ymm1, ymm2, ymm3, 1));
+ TEST_INSTRUCTION("62F36D28714C2B0401" , vpshldd(ymm1, ymm2, ptr(rbx, rbp, 0, 128), 1));
+ TEST_INSTRUCTION("62F36D28714C2B0401" , vpshldd(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128), 1));
+ TEST_INSTRUCTION("62F36D4871CB01" , vpshldd(zmm1, zmm2, zmm3, 1));
+ TEST_INSTRUCTION("62F36D48714C2B0201" , vpshldd(zmm1, zmm2, ptr(rbx, rbp, 0, 128), 1));
+ TEST_INSTRUCTION("62F36D48714C2B0201" , vpshldd(zmm1, zmm2, zmmword_ptr(rbx, rbp, 0, 128), 1));
+ TEST_INSTRUCTION("62F3ED0871CB01" , vpshldq(xmm1, xmm2, xmm3, 1));
+ TEST_INSTRUCTION("62F3ED08714C2B0801" , vpshldq(xmm1, xmm2, ptr(rbx, rbp, 0, 128), 1));
+ TEST_INSTRUCTION("62F3ED08714C2B0801" , vpshldq(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128), 1));
+ TEST_INSTRUCTION("62F3ED2871CB01" , vpshldq(ymm1, ymm2, ymm3, 1));
+ TEST_INSTRUCTION("62F3ED28714C2B0401" , vpshldq(ymm1, ymm2, ptr(rbx, rbp, 0, 128), 1));
+ TEST_INSTRUCTION("62F3ED28714C2B0401" , vpshldq(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128), 1));
+ TEST_INSTRUCTION("62F3ED4871CB01" , vpshldq(zmm1, zmm2, zmm3, 1));
+ TEST_INSTRUCTION("62F3ED48714C2B0201" , vpshldq(zmm1, zmm2, ptr(rbx, rbp, 0, 128), 1));
+ TEST_INSTRUCTION("62F3ED48714C2B0201" , vpshldq(zmm1, zmm2, zmmword_ptr(rbx, rbp, 0, 128), 1));
+ TEST_INSTRUCTION("62F26D0871CB" , vpshldvd(xmm1, xmm2, xmm3));
+ TEST_INSTRUCTION("62F26D08714C2B08" , vpshldvd(xmm1, xmm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F26D08714C2B08" , vpshldvd(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F26D2871CB" , vpshldvd(ymm1, ymm2, ymm3));
+ TEST_INSTRUCTION("62F26D28714C2B04" , vpshldvd(ymm1, ymm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F26D28714C2B04" , vpshldvd(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F26D4871CB" , vpshldvd(zmm1, zmm2, zmm3));
+ TEST_INSTRUCTION("62F26D48714C2B02" , vpshldvd(zmm1, zmm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F26D48714C2B02" , vpshldvd(zmm1, zmm2, zmmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F2ED0871CB" , vpshldvq(xmm1, xmm2, xmm3));
+ TEST_INSTRUCTION("62F2ED08714C2B08" , vpshldvq(xmm1, xmm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F2ED08714C2B08" , vpshldvq(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F2ED2871CB" , vpshldvq(ymm1, ymm2, ymm3));
+ TEST_INSTRUCTION("62F2ED28714C2B04" , vpshldvq(ymm1, ymm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F2ED28714C2B04" , vpshldvq(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F2ED4871CB" , vpshldvq(zmm1, zmm2, zmm3));
+ TEST_INSTRUCTION("62F2ED48714C2B02" , vpshldvq(zmm1, zmm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F2ED48714C2B02" , vpshldvq(zmm1, zmm2, zmmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F2ED0870CB" , vpshldvw(xmm1, xmm2, xmm3));
+ TEST_INSTRUCTION("62F2ED08704C2B08" , vpshldvw(xmm1, xmm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F2ED08704C2B08" , vpshldvw(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F2ED2870CB" , vpshldvw(ymm1, ymm2, ymm3));
+ TEST_INSTRUCTION("62F2ED28704C2B04" , vpshldvw(ymm1, ymm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F2ED28704C2B04" , vpshldvw(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F2ED4870CB" , vpshldvw(zmm1, zmm2, zmm3));
+ TEST_INSTRUCTION("62F2ED48704C2B02" , vpshldvw(zmm1, zmm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F2ED48704C2B02" , vpshldvw(zmm1, zmm2, zmmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F3ED0870CB01" , vpshldw(xmm1, xmm2, xmm3, 1));
+ TEST_INSTRUCTION("62F3ED08704C2B0801" , vpshldw(xmm1, xmm2, ptr(rbx, rbp, 0, 128), 1));
+ TEST_INSTRUCTION("62F3ED08704C2B0801" , vpshldw(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128), 1));
+ TEST_INSTRUCTION("62F3ED2870CB01" , vpshldw(ymm1, ymm2, ymm3, 1));
+ TEST_INSTRUCTION("62F3ED28704C2B0401" , vpshldw(ymm1, ymm2, ptr(rbx, rbp, 0, 128), 1));
+ TEST_INSTRUCTION("62F3ED28704C2B0401" , vpshldw(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128), 1));
+ TEST_INSTRUCTION("62F3ED4870CB01" , vpshldw(zmm1, zmm2, zmm3, 1));
+ TEST_INSTRUCTION("62F3ED48704C2B0201" , vpshldw(zmm1, zmm2, ptr(rbx, rbp, 0, 128), 1));
+ TEST_INSTRUCTION("62F3ED48704C2B0201" , vpshldw(zmm1, zmm2, zmmword_ptr(rbx, rbp, 0, 128), 1));
+ TEST_INSTRUCTION("8FE96097CA" , vpshlq(xmm1, xmm2, xmm3));
+ TEST_INSTRUCTION("8FE9E8978C2B80000000" , vpshlq(xmm1, xmm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("8FE9E8978C2B80000000" , vpshlq(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("8FE958978C1A80000000" , vpshlq(xmm1, ptr(rdx, rbx, 0, 128), xmm4));
+ TEST_INSTRUCTION("8FE958978C1A80000000" , vpshlq(xmm1, xmmword_ptr(rdx, rbx, 0, 128), xmm4));
+ TEST_INSTRUCTION("8FE96095CA" , vpshlw(xmm1, xmm2, xmm3));
+ TEST_INSTRUCTION("8FE9E8958C2B80000000" , vpshlw(xmm1, xmm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("8FE9E8958C2B80000000" , vpshlw(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("8FE958958C1A80000000" , vpshlw(xmm1, ptr(rdx, rbx, 0, 128), xmm4));
+ TEST_INSTRUCTION("8FE958958C1A80000000" , vpshlw(xmm1, xmmword_ptr(rdx, rbx, 0, 128), xmm4));
+ TEST_INSTRUCTION("62F36D0873CB01" , vpshrdd(xmm1, xmm2, xmm3, 1));
+ TEST_INSTRUCTION("62F36D08734C2B0801" , vpshrdd(xmm1, xmm2, ptr(rbx, rbp, 0, 128), 1));
+ TEST_INSTRUCTION("62F36D08734C2B0801" , vpshrdd(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128), 1));
+ TEST_INSTRUCTION("62F36D2873CB01" , vpshrdd(ymm1, ymm2, ymm3, 1));
+ TEST_INSTRUCTION("62F36D28734C2B0401" , vpshrdd(ymm1, ymm2, ptr(rbx, rbp, 0, 128), 1));
+ TEST_INSTRUCTION("62F36D28734C2B0401" , vpshrdd(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128), 1));
+ TEST_INSTRUCTION("62F36D4873CB01" , vpshrdd(zmm1, zmm2, zmm3, 1));
+ TEST_INSTRUCTION("62F36D48734C2B0201" , vpshrdd(zmm1, zmm2, ptr(rbx, rbp, 0, 128), 1));
+ TEST_INSTRUCTION("62F36D48734C2B0201" , vpshrdd(zmm1, zmm2, zmmword_ptr(rbx, rbp, 0, 128), 1));
+ TEST_INSTRUCTION("62F3ED0873CB01" , vpshrdq(xmm1, xmm2, xmm3, 1));
+ TEST_INSTRUCTION("62F3ED08734C2B0801" , vpshrdq(xmm1, xmm2, ptr(rbx, rbp, 0, 128), 1));
+ TEST_INSTRUCTION("62F3ED08734C2B0801" , vpshrdq(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128), 1));
+ TEST_INSTRUCTION("62F3ED2873CB01" , vpshrdq(ymm1, ymm2, ymm3, 1));
+ TEST_INSTRUCTION("62F3ED28734C2B0401" , vpshrdq(ymm1, ymm2, ptr(rbx, rbp, 0, 128), 1));
+ TEST_INSTRUCTION("62F3ED28734C2B0401" , vpshrdq(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128), 1));
+ TEST_INSTRUCTION("62F3ED4873CB01" , vpshrdq(zmm1, zmm2, zmm3, 1));
+ TEST_INSTRUCTION("62F3ED48734C2B0201" , vpshrdq(zmm1, zmm2, ptr(rbx, rbp, 0, 128), 1));
+ TEST_INSTRUCTION("62F3ED48734C2B0201" , vpshrdq(zmm1, zmm2, zmmword_ptr(rbx, rbp, 0, 128), 1));
+ TEST_INSTRUCTION("62F26D0873CB" , vpshrdvd(xmm1, xmm2, xmm3));
+ TEST_INSTRUCTION("62F26D08734C2B08" , vpshrdvd(xmm1, xmm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F26D08734C2B08" , vpshrdvd(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F26D2873CB" , vpshrdvd(ymm1, ymm2, ymm3));
+ TEST_INSTRUCTION("62F26D28734C2B04" , vpshrdvd(ymm1, ymm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F26D28734C2B04" , vpshrdvd(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F26D4873CB" , vpshrdvd(zmm1, zmm2, zmm3));
+ TEST_INSTRUCTION("62F26D48734C2B02" , vpshrdvd(zmm1, zmm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F26D48734C2B02" , vpshrdvd(zmm1, zmm2, zmmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F2ED0873CB" , vpshrdvq(xmm1, xmm2, xmm3));
+ TEST_INSTRUCTION("62F2ED08734C2B08" , vpshrdvq(xmm1, xmm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F2ED08734C2B08" , vpshrdvq(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F2ED2873CB" , vpshrdvq(ymm1, ymm2, ymm3));
+ TEST_INSTRUCTION("62F2ED28734C2B04" , vpshrdvq(ymm1, ymm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F2ED28734C2B04" , vpshrdvq(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F2ED4873CB" , vpshrdvq(zmm1, zmm2, zmm3));
+ TEST_INSTRUCTION("62F2ED48734C2B02" , vpshrdvq(zmm1, zmm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F2ED48734C2B02" , vpshrdvq(zmm1, zmm2, zmmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F2ED0872CB" , vpshrdvw(xmm1, xmm2, xmm3));
+ TEST_INSTRUCTION("62F2ED08724C2B08" , vpshrdvw(xmm1, xmm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F2ED08724C2B08" , vpshrdvw(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F2ED2872CB" , vpshrdvw(ymm1, ymm2, ymm3));
+ TEST_INSTRUCTION("62F2ED28724C2B04" , vpshrdvw(ymm1, ymm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F2ED28724C2B04" , vpshrdvw(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F2ED4872CB" , vpshrdvw(zmm1, zmm2, zmm3));
+ TEST_INSTRUCTION("62F2ED48724C2B02" , vpshrdvw(zmm1, zmm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F2ED48724C2B02" , vpshrdvw(zmm1, zmm2, zmmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F3ED0872CB01" , vpshrdw(xmm1, xmm2, xmm3, 1));
+ TEST_INSTRUCTION("62F3ED08724C2B0801" , vpshrdw(xmm1, xmm2, ptr(rbx, rbp, 0, 128), 1));
+ TEST_INSTRUCTION("62F3ED08724C2B0801" , vpshrdw(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128), 1));
+ TEST_INSTRUCTION("62F3ED2872CB01" , vpshrdw(ymm1, ymm2, ymm3, 1));
+ TEST_INSTRUCTION("62F3ED28724C2B0401" , vpshrdw(ymm1, ymm2, ptr(rbx, rbp, 0, 128), 1));
+ TEST_INSTRUCTION("62F3ED28724C2B0401" , vpshrdw(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128), 1));
+ TEST_INSTRUCTION("62F3ED4872CB01" , vpshrdw(zmm1, zmm2, zmm3, 1));
+ TEST_INSTRUCTION("62F3ED48724C2B0201" , vpshrdw(zmm1, zmm2, ptr(rbx, rbp, 0, 128), 1));
+ TEST_INSTRUCTION("62F3ED48724C2B0201" , vpshrdw(zmm1, zmm2, zmmword_ptr(rbx, rbp, 0, 128), 1));
+ TEST_INSTRUCTION("C4E26900CB" , vpshufb(xmm1, xmm2, xmm3));
+ TEST_INSTRUCTION("C4E269008C2B80000000" , vpshufb(xmm1, xmm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C4E269008C2B80000000" , vpshufb(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C4E26D00CB" , vpshufb(ymm1, ymm2, ymm3));
+ TEST_INSTRUCTION("C4E26D008C2B80000000" , vpshufb(ymm1, ymm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C4E26D008C2B80000000" , vpshufb(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F26D4800CB" , vpshufb(zmm1, zmm2, zmm3));
+ TEST_INSTRUCTION("62F26D48004C2B02" , vpshufb(zmm1, zmm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F26D48004C2B02" , vpshufb(zmm1, zmm2, zmmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F26D088FCB" , vpshufbitqmb(k1, xmm2, xmm3));
+ TEST_INSTRUCTION("62F26D088F4C2B08" , vpshufbitqmb(k1, xmm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F26D088F4C2B08" , vpshufbitqmb(k1, xmm2, xmmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F26D288FCB" , vpshufbitqmb(k1, ymm2, ymm3));
+ TEST_INSTRUCTION("62F26D288F4C2B04" , vpshufbitqmb(k1, ymm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F26D288F4C2B04" , vpshufbitqmb(k1, ymm2, ymmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F26D488FCB" , vpshufbitqmb(k1, zmm2, zmm3));
+ TEST_INSTRUCTION("62F26D488F4C2B02" , vpshufbitqmb(k1, zmm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F26D488F4C2B02" , vpshufbitqmb(k1, zmm2, zmmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C5F970CA01" , vpshufd(xmm1, xmm2, 1));
+ TEST_INSTRUCTION("C5F9708C1A8000000001" , vpshufd(xmm1, ptr(rdx, rbx, 0, 128), 1));
+ TEST_INSTRUCTION("C5F9708C1A8000000001" , vpshufd(xmm1, xmmword_ptr(rdx, rbx, 0, 128), 1));
+ TEST_INSTRUCTION("C5FD70CA01" , vpshufd(ymm1, ymm2, 1));
+ TEST_INSTRUCTION("C5FD708C1A8000000001" , vpshufd(ymm1, ptr(rdx, rbx, 0, 128), 1));
+ TEST_INSTRUCTION("C5FD708C1A8000000001" , vpshufd(ymm1, ymmword_ptr(rdx, rbx, 0, 128), 1));
+ TEST_INSTRUCTION("62F17D4870CA01" , vpshufd(zmm1, zmm2, 1));
+ TEST_INSTRUCTION("62F17D48704C1A0201" , vpshufd(zmm1, ptr(rdx, rbx, 0, 128), 1));
+ TEST_INSTRUCTION("62F17D48704C1A0201" , vpshufd(zmm1, zmmword_ptr(rdx, rbx, 0, 128), 1));
+ TEST_INSTRUCTION("C5FA70CA01" , vpshufhw(xmm1, xmm2, 1));
+ TEST_INSTRUCTION("C5FA708C1A8000000001" , vpshufhw(xmm1, ptr(rdx, rbx, 0, 128), 1));
+ TEST_INSTRUCTION("C5FA708C1A8000000001" , vpshufhw(xmm1, xmmword_ptr(rdx, rbx, 0, 128), 1));
+ TEST_INSTRUCTION("C5FE70CA01" , vpshufhw(ymm1, ymm2, 1));
+ TEST_INSTRUCTION("C5FE708C1A8000000001" , vpshufhw(ymm1, ptr(rdx, rbx, 0, 128), 1));
+ TEST_INSTRUCTION("C5FE708C1A8000000001" , vpshufhw(ymm1, ymmword_ptr(rdx, rbx, 0, 128), 1));
+ TEST_INSTRUCTION("62F17E4870CA01" , vpshufhw(zmm1, zmm2, 1));
+ TEST_INSTRUCTION("62F17E48704C1A0201" , vpshufhw(zmm1, ptr(rdx, rbx, 0, 128), 1));
+ TEST_INSTRUCTION("62F17E48704C1A0201" , vpshufhw(zmm1, zmmword_ptr(rdx, rbx, 0, 128), 1));
+ TEST_INSTRUCTION("C5FB70CA01" , vpshuflw(xmm1, xmm2, 1));
+ TEST_INSTRUCTION("C5FB708C1A8000000001" , vpshuflw(xmm1, ptr(rdx, rbx, 0, 128), 1));
+ TEST_INSTRUCTION("C5FB708C1A8000000001" , vpshuflw(xmm1, xmmword_ptr(rdx, rbx, 0, 128), 1));
+ TEST_INSTRUCTION("C5FF70CA01" , vpshuflw(ymm1, ymm2, 1));
+ TEST_INSTRUCTION("C5FF708C1A8000000001" , vpshuflw(ymm1, ptr(rdx, rbx, 0, 128), 1));
+ TEST_INSTRUCTION("C5FF708C1A8000000001" , vpshuflw(ymm1, ymmword_ptr(rdx, rbx, 0, 128), 1));
+ TEST_INSTRUCTION("62F17F4870CA01" , vpshuflw(zmm1, zmm2, 1));
+ TEST_INSTRUCTION("62F17F48704C1A0201" , vpshuflw(zmm1, ptr(rdx, rbx, 0, 128), 1));
+ TEST_INSTRUCTION("62F17F48704C1A0201" , vpshuflw(zmm1, zmmword_ptr(rdx, rbx, 0, 128), 1));
+ TEST_INSTRUCTION("C4E26908CB" , vpsignb(xmm1, xmm2, xmm3));
+ TEST_INSTRUCTION("C4E269088C2B80000000" , vpsignb(xmm1, xmm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C4E269088C2B80000000" , vpsignb(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C4E26D08CB" , vpsignb(ymm1, ymm2, ymm3));
+ TEST_INSTRUCTION("C4E26D088C2B80000000" , vpsignb(ymm1, ymm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C4E26D088C2B80000000" , vpsignb(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C4E2690ACB" , vpsignd(xmm1, xmm2, xmm3));
+ TEST_INSTRUCTION("C4E2690A8C2B80000000" , vpsignd(xmm1, xmm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C4E2690A8C2B80000000" , vpsignd(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C4E26D0ACB" , vpsignd(ymm1, ymm2, ymm3));
+ TEST_INSTRUCTION("C4E26D0A8C2B80000000" , vpsignd(ymm1, ymm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C4E26D0A8C2B80000000" , vpsignd(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C4E26909CB" , vpsignw(xmm1, xmm2, xmm3));
+ TEST_INSTRUCTION("C4E269098C2B80000000" , vpsignw(xmm1, xmm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C4E269098C2B80000000" , vpsignw(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C4E26D09CB" , vpsignw(ymm1, ymm2, ymm3));
+ TEST_INSTRUCTION("C4E26D098C2B80000000" , vpsignw(ymm1, ymm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C4E26D098C2B80000000" , vpsignw(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C5E9F2CB" , vpslld(xmm1, xmm2, xmm3));
+ TEST_INSTRUCTION("C5F172F201" , vpslld(xmm1, xmm2, 1));
+ TEST_INSTRUCTION("C5E9F28C2B80000000" , vpslld(xmm1, xmm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C5E9F28C2B80000000" , vpslld(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C5EDF2CB" , vpslld(ymm1, ymm2, xmm3));
+ TEST_INSTRUCTION("C5F572F201" , vpslld(ymm1, ymm2, 1));
+ TEST_INSTRUCTION("C5EDF28C2B80000000" , vpslld(ymm1, ymm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C5EDF28C2B80000000" , vpslld(ymm1, ymm2, xmmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F1750872741A0801" , vpslld(xmm1, ptr(rdx, rbx, 0, 128), 1));
+ TEST_INSTRUCTION("62F1750872741A0801" , vpslld(xmm1, xmmword_ptr(rdx, rbx, 0, 128), 1));
+ TEST_INSTRUCTION("62F1752872741A0401" , vpslld(ymm1, ptr(rdx, rbx, 0, 128), 1));
+ TEST_INSTRUCTION("62F1752872741A0401" , vpslld(ymm1, ymmword_ptr(rdx, rbx, 0, 128), 1));
+ TEST_INSTRUCTION("62F16D48F2CB" , vpslld(zmm1, zmm2, xmm3));
+ TEST_INSTRUCTION("62F1754872F201" , vpslld(zmm1, zmm2, 1));
+ TEST_INSTRUCTION("62F16D48F24C2B08" , vpslld(zmm1, zmm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F16D48F24C2B08" , vpslld(zmm1, zmm2, xmmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F1754872741A0201" , vpslld(zmm1, ptr(rdx, rbx, 0, 128), 1));
+ TEST_INSTRUCTION("62F1754872741A0201" , vpslld(zmm1, zmmword_ptr(rdx, rbx, 0, 128), 1));
+ TEST_INSTRUCTION("C5F173FA01" , vpslldq(xmm1, xmm2, 1));
+ TEST_INSTRUCTION("62F17508737C1A0801" , vpslldq(xmm1, ptr(rdx, rbx, 0, 128), 1));
+ TEST_INSTRUCTION("62F17508737C1A0801" , vpslldq(xmm1, xmmword_ptr(rdx, rbx, 0, 128), 1));
+ TEST_INSTRUCTION("C5F573FA01" , vpslldq(ymm1, ymm2, 1));
+ TEST_INSTRUCTION("62F17528737C1A0401" , vpslldq(ymm1, ptr(rdx, rbx, 0, 128), 1));
+ TEST_INSTRUCTION("62F17528737C1A0401" , vpslldq(ymm1, ymmword_ptr(rdx, rbx, 0, 128), 1));
+ TEST_INSTRUCTION("62F1754873FA01" , vpslldq(zmm1, zmm2, 1));
+ TEST_INSTRUCTION("62F17548737C1A0201" , vpslldq(zmm1, ptr(rdx, rbx, 0, 128), 1));
+ TEST_INSTRUCTION("62F17548737C1A0201" , vpslldq(zmm1, zmmword_ptr(rdx, rbx, 0, 128), 1));
+ TEST_INSTRUCTION("C5E9F3CB" , vpsllq(xmm1, xmm2, xmm3));
+ TEST_INSTRUCTION("C5F173F201" , vpsllq(xmm1, xmm2, 1));
+ TEST_INSTRUCTION("C5E9F38C2B80000000" , vpsllq(xmm1, xmm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C5E9F38C2B80000000" , vpsllq(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C5EDF3CB" , vpsllq(ymm1, ymm2, xmm3));
+ TEST_INSTRUCTION("C5F573F201" , vpsllq(ymm1, ymm2, 1));
+ TEST_INSTRUCTION("C5EDF38C2B80000000" , vpsllq(ymm1, ymm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C5EDF38C2B80000000" , vpsllq(ymm1, ymm2, xmmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F1F50873741A0801" , vpsllq(xmm1, ptr(rdx, rbx, 0, 128), 1));
+ TEST_INSTRUCTION("62F1F50873741A0801" , vpsllq(xmm1, xmmword_ptr(rdx, rbx, 0, 128), 1));
+ TEST_INSTRUCTION("62F1F52873741A0401" , vpsllq(ymm1, ptr(rdx, rbx, 0, 128), 1));
+ TEST_INSTRUCTION("62F1F52873741A0401" , vpsllq(ymm1, ymmword_ptr(rdx, rbx, 0, 128), 1));
+ TEST_INSTRUCTION("62F1ED48F3CB" , vpsllq(zmm1, zmm2, xmm3));
+ TEST_INSTRUCTION("62F1F54873F201" , vpsllq(zmm1, zmm2, 1));
+ TEST_INSTRUCTION("62F1ED48F34C2B08" , vpsllq(zmm1, zmm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F1ED48F34C2B08" , vpsllq(zmm1, zmm2, xmmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F1F54873741A0201" , vpsllq(zmm1, ptr(rdx, rbx, 0, 128), 1));
+ TEST_INSTRUCTION("62F1F54873741A0201" , vpsllq(zmm1, zmmword_ptr(rdx, rbx, 0, 128), 1));
+ TEST_INSTRUCTION("C4E26947CB" , vpsllvd(xmm1, xmm2, xmm3));
+ TEST_INSTRUCTION("C4E269478C2B80000000" , vpsllvd(xmm1, xmm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C4E269478C2B80000000" , vpsllvd(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C4E26D47CB" , vpsllvd(ymm1, ymm2, ymm3));
+ TEST_INSTRUCTION("C4E26D478C2B80000000" , vpsllvd(ymm1, ymm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C4E26D478C2B80000000" , vpsllvd(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F26D4847CB" , vpsllvd(zmm1, zmm2, zmm3));
+ TEST_INSTRUCTION("62F26D48474C2B02" , vpsllvd(zmm1, zmm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F26D48474C2B02" , vpsllvd(zmm1, zmm2, zmmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C4E2E947CB" , vpsllvq(xmm1, xmm2, xmm3));
+ TEST_INSTRUCTION("C4E2E9478C2B80000000" , vpsllvq(xmm1, xmm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C4E2E9478C2B80000000" , vpsllvq(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C4E2ED47CB" , vpsllvq(ymm1, ymm2, ymm3));
+ TEST_INSTRUCTION("C4E2ED478C2B80000000" , vpsllvq(ymm1, ymm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C4E2ED478C2B80000000" , vpsllvq(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F2ED4847CB" , vpsllvq(zmm1, zmm2, zmm3));
+ TEST_INSTRUCTION("62F2ED48474C2B02" , vpsllvq(zmm1, zmm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F2ED48474C2B02" , vpsllvq(zmm1, zmm2, zmmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F2ED0812CB" , vpsllvw(xmm1, xmm2, xmm3));
+ TEST_INSTRUCTION("62F2ED08124C2B08" , vpsllvw(xmm1, xmm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F2ED08124C2B08" , vpsllvw(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F2ED2812CB" , vpsllvw(ymm1, ymm2, ymm3));
+ TEST_INSTRUCTION("62F2ED28124C2B04" , vpsllvw(ymm1, ymm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F2ED28124C2B04" , vpsllvw(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F2ED4812CB" , vpsllvw(zmm1, zmm2, zmm3));
+ TEST_INSTRUCTION("62F2ED48124C2B02" , vpsllvw(zmm1, zmm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F2ED48124C2B02" , vpsllvw(zmm1, zmm2, zmmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C5E9F1CB" , vpsllw(xmm1, xmm2, xmm3));
+ TEST_INSTRUCTION("C5F171F201" , vpsllw(xmm1, xmm2, 1));
+ TEST_INSTRUCTION("C5E9F18C2B80000000" , vpsllw(xmm1, xmm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C5E9F18C2B80000000" , vpsllw(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C5EDF1CB" , vpsllw(ymm1, ymm2, xmm3));
+ TEST_INSTRUCTION("C5F571F201" , vpsllw(ymm1, ymm2, 1));
+ TEST_INSTRUCTION("C5EDF18C2B80000000" , vpsllw(ymm1, ymm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C5EDF18C2B80000000" , vpsllw(ymm1, ymm2, xmmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F1750871741A0801" , vpsllw(xmm1, ptr(rdx, rbx, 0, 128), 1));
+ TEST_INSTRUCTION("62F1750871741A0801" , vpsllw(xmm1, xmmword_ptr(rdx, rbx, 0, 128), 1));
+ TEST_INSTRUCTION("62F1752871741A0401" , vpsllw(ymm1, ptr(rdx, rbx, 0, 128), 1));
+ TEST_INSTRUCTION("62F1752871741A0401" , vpsllw(ymm1, ymmword_ptr(rdx, rbx, 0, 128), 1));
+ TEST_INSTRUCTION("62F16D48F1CB" , vpsllw(zmm1, zmm2, xmm3));
+ TEST_INSTRUCTION("62F1754871F201" , vpsllw(zmm1, zmm2, 1));
+ TEST_INSTRUCTION("62F16D48F14C2B08" , vpsllw(zmm1, zmm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F16D48F14C2B08" , vpsllw(zmm1, zmm2, xmmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F1754871741A0201" , vpsllw(zmm1, ptr(rdx, rbx, 0, 128), 1));
+ TEST_INSTRUCTION("62F1754871741A0201" , vpsllw(zmm1, zmmword_ptr(rdx, rbx, 0, 128), 1));
+ TEST_INSTRUCTION("C5E9E2CB" , vpsrad(xmm1, xmm2, xmm3));
+ TEST_INSTRUCTION("C5F172E201" , vpsrad(xmm1, xmm2, 1));
+ TEST_INSTRUCTION("C5E9E28C2B80000000" , vpsrad(xmm1, xmm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C5E9E28C2B80000000" , vpsrad(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C5EDE2CB" , vpsrad(ymm1, ymm2, xmm3));
+ TEST_INSTRUCTION("C5F572E201" , vpsrad(ymm1, ymm2, 1));
+ TEST_INSTRUCTION("C5EDE28C2B80000000" , vpsrad(ymm1, ymm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C5EDE28C2B80000000" , vpsrad(ymm1, ymm2, xmmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F1750872641A0801" , vpsrad(xmm1, ptr(rdx, rbx, 0, 128), 1));
+ TEST_INSTRUCTION("62F1750872641A0801" , vpsrad(xmm1, xmmword_ptr(rdx, rbx, 0, 128), 1));
+ TEST_INSTRUCTION("62F1752872641A0401" , vpsrad(ymm1, ptr(rdx, rbx, 0, 128), 1));
+ TEST_INSTRUCTION("62F1752872641A0401" , vpsrad(ymm1, ymmword_ptr(rdx, rbx, 0, 128), 1));
+ TEST_INSTRUCTION("62F16D48E2CB" , vpsrad(zmm1, zmm2, xmm3));
+ TEST_INSTRUCTION("62F1754872E201" , vpsrad(zmm1, zmm2, 1));
+ TEST_INSTRUCTION("62F16D48E24C2B08" , vpsrad(zmm1, zmm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F16D48E24C2B08" , vpsrad(zmm1, zmm2, xmmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F1754872641A0201" , vpsrad(zmm1, ptr(rdx, rbx, 0, 128), 1));
+ TEST_INSTRUCTION("62F1754872641A0201" , vpsrad(zmm1, zmmword_ptr(rdx, rbx, 0, 128), 1));
+ TEST_INSTRUCTION("62F1ED08E2CB" , vpsraq(xmm1, xmm2, xmm3));
+ TEST_INSTRUCTION("62F1F50872E201" , vpsraq(xmm1, xmm2, 1));
+ TEST_INSTRUCTION("62F1ED08E24C2B08" , vpsraq(xmm1, xmm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F1ED08E24C2B08" , vpsraq(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F1F50872641A0801" , vpsraq(xmm1, ptr(rdx, rbx, 0, 128), 1));
+ TEST_INSTRUCTION("62F1F50872641A0801" , vpsraq(xmm1, xmmword_ptr(rdx, rbx, 0, 128), 1));
+ TEST_INSTRUCTION("62F1ED28E2CB" , vpsraq(ymm1, ymm2, xmm3));
+ TEST_INSTRUCTION("62F1F52872E201" , vpsraq(ymm1, ymm2, 1));
+ TEST_INSTRUCTION("62F1ED28E24C2B08" , vpsraq(ymm1, ymm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F1ED28E24C2B08" , vpsraq(ymm1, ymm2, xmmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F1F52872641A0401" , vpsraq(ymm1, ptr(rdx, rbx, 0, 128), 1));
+ TEST_INSTRUCTION("62F1F52872641A0401" , vpsraq(ymm1, ymmword_ptr(rdx, rbx, 0, 128), 1));
+ TEST_INSTRUCTION("62F1ED48E2CB" , vpsraq(zmm1, zmm2, xmm3));
+ TEST_INSTRUCTION("62F1F54872E201" , vpsraq(zmm1, zmm2, 1));
+ TEST_INSTRUCTION("62F1ED48E24C2B08" , vpsraq(zmm1, zmm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F1ED48E24C2B08" , vpsraq(zmm1, zmm2, xmmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F1F54872641A0201" , vpsraq(zmm1, ptr(rdx, rbx, 0, 128), 1));
+ TEST_INSTRUCTION("62F1F54872641A0201" , vpsraq(zmm1, zmmword_ptr(rdx, rbx, 0, 128), 1));
+ TEST_INSTRUCTION("C4E26946CB" , vpsravd(xmm1, xmm2, xmm3));
+ TEST_INSTRUCTION("C4E269468C2B80000000" , vpsravd(xmm1, xmm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C4E269468C2B80000000" , vpsravd(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C4E26D46CB" , vpsravd(ymm1, ymm2, ymm3));
+ TEST_INSTRUCTION("C4E26D468C2B80000000" , vpsravd(ymm1, ymm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C4E26D468C2B80000000" , vpsravd(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F26D4846CB" , vpsravd(zmm1, zmm2, zmm3));
+ TEST_INSTRUCTION("62F26D48464C2B02" , vpsravd(zmm1, zmm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F26D48464C2B02" , vpsravd(zmm1, zmm2, zmmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F2ED0846CB" , vpsravq(xmm1, xmm2, xmm3));
+ TEST_INSTRUCTION("62F2ED08464C2B08" , vpsravq(xmm1, xmm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F2ED08464C2B08" , vpsravq(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F2ED2846CB" , vpsravq(ymm1, ymm2, ymm3));
+ TEST_INSTRUCTION("62F2ED28464C2B04" , vpsravq(ymm1, ymm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F2ED28464C2B04" , vpsravq(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F2ED4846CB" , vpsravq(zmm1, zmm2, zmm3));
+ TEST_INSTRUCTION("62F2ED48464C2B02" , vpsravq(zmm1, zmm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F2ED48464C2B02" , vpsravq(zmm1, zmm2, zmmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F2ED0811CB" , vpsravw(xmm1, xmm2, xmm3));
+ TEST_INSTRUCTION("62F2ED08114C2B08" , vpsravw(xmm1, xmm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F2ED08114C2B08" , vpsravw(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F2ED2811CB" , vpsravw(ymm1, ymm2, ymm3));
+ TEST_INSTRUCTION("62F2ED28114C2B04" , vpsravw(ymm1, ymm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F2ED28114C2B04" , vpsravw(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F2ED4811CB" , vpsravw(zmm1, zmm2, zmm3));
+ TEST_INSTRUCTION("62F2ED48114C2B02" , vpsravw(zmm1, zmm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F2ED48114C2B02" , vpsravw(zmm1, zmm2, zmmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C5E9E1CB" , vpsraw(xmm1, xmm2, xmm3));
+ TEST_INSTRUCTION("C5F171E201" , vpsraw(xmm1, xmm2, 1));
+ TEST_INSTRUCTION("C5E9E18C2B80000000" , vpsraw(xmm1, xmm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C5E9E18C2B80000000" , vpsraw(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C5EDE1CB" , vpsraw(ymm1, ymm2, xmm3));
+ TEST_INSTRUCTION("C5F571E201" , vpsraw(ymm1, ymm2, 1));
+ TEST_INSTRUCTION("C5EDE18C2B80000000" , vpsraw(ymm1, ymm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C5EDE18C2B80000000" , vpsraw(ymm1, ymm2, xmmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F1750871641A0801" , vpsraw(xmm1, ptr(rdx, rbx, 0, 128), 1));
+ TEST_INSTRUCTION("62F1750871641A0801" , vpsraw(xmm1, xmmword_ptr(rdx, rbx, 0, 128), 1));
+ TEST_INSTRUCTION("62F1752871641A0401" , vpsraw(ymm1, ptr(rdx, rbx, 0, 128), 1));
+ TEST_INSTRUCTION("62F1752871641A0401" , vpsraw(ymm1, ymmword_ptr(rdx, rbx, 0, 128), 1));
+ TEST_INSTRUCTION("62F16D48E1CB" , vpsraw(zmm1, zmm2, xmm3));
+ TEST_INSTRUCTION("62F1754871E201" , vpsraw(zmm1, zmm2, 1));
+ TEST_INSTRUCTION("62F16D48E14C2B08" , vpsraw(zmm1, zmm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F16D48E14C2B08" , vpsraw(zmm1, zmm2, xmmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F1754871641A0201" , vpsraw(zmm1, ptr(rdx, rbx, 0, 128), 1));
+ TEST_INSTRUCTION("62F1754871641A0201" , vpsraw(zmm1, zmmword_ptr(rdx, rbx, 0, 128), 1));
+ TEST_INSTRUCTION("C5E9D2CB" , vpsrld(xmm1, xmm2, xmm3));
+ TEST_INSTRUCTION("C5F172D201" , vpsrld(xmm1, xmm2, 1));
+ TEST_INSTRUCTION("C5E9D28C2B80000000" , vpsrld(xmm1, xmm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C5E9D28C2B80000000" , vpsrld(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C5EDD2CB" , vpsrld(ymm1, ymm2, xmm3));
+ TEST_INSTRUCTION("C5F572D201" , vpsrld(ymm1, ymm2, 1));
+ TEST_INSTRUCTION("C5EDD28C2B80000000" , vpsrld(ymm1, ymm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C5EDD28C2B80000000" , vpsrld(ymm1, ymm2, xmmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F1750872541A0801" , vpsrld(xmm1, ptr(rdx, rbx, 0, 128), 1));
+ TEST_INSTRUCTION("62F1750872541A0801" , vpsrld(xmm1, xmmword_ptr(rdx, rbx, 0, 128), 1));
+ TEST_INSTRUCTION("62F1752872541A0401" , vpsrld(ymm1, ptr(rdx, rbx, 0, 128), 1));
+ TEST_INSTRUCTION("62F1752872541A0401" , vpsrld(ymm1, ymmword_ptr(rdx, rbx, 0, 128), 1));
+ TEST_INSTRUCTION("62F16D48D2CB" , vpsrld(zmm1, zmm2, xmm3));
+ TEST_INSTRUCTION("62F1754872D201" , vpsrld(zmm1, zmm2, 1));
+ TEST_INSTRUCTION("62F16D48D24C2B08" , vpsrld(zmm1, zmm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F16D48D24C2B08" , vpsrld(zmm1, zmm2, xmmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F1754872541A0201" , vpsrld(zmm1, ptr(rdx, rbx, 0, 128), 1));
+ TEST_INSTRUCTION("62F1754872541A0201" , vpsrld(zmm1, zmmword_ptr(rdx, rbx, 0, 128), 1));
+ TEST_INSTRUCTION("C5F173DA01" , vpsrldq(xmm1, xmm2, 1));
+ TEST_INSTRUCTION("62F17508735C1A0801" , vpsrldq(xmm1, ptr(rdx, rbx, 0, 128), 1));
+ TEST_INSTRUCTION("62F17508735C1A0801" , vpsrldq(xmm1, xmmword_ptr(rdx, rbx, 0, 128), 1));
+ TEST_INSTRUCTION("C5F573DA01" , vpsrldq(ymm1, ymm2, 1));
+ TEST_INSTRUCTION("62F17528735C1A0401" , vpsrldq(ymm1, ptr(rdx, rbx, 0, 128), 1));
+ TEST_INSTRUCTION("62F17528735C1A0401" , vpsrldq(ymm1, ymmword_ptr(rdx, rbx, 0, 128), 1));
+ TEST_INSTRUCTION("62F1754873DA01" , vpsrldq(zmm1, zmm2, 1));
+ TEST_INSTRUCTION("62F17548735C1A0201" , vpsrldq(zmm1, ptr(rdx, rbx, 0, 128), 1));
+ TEST_INSTRUCTION("62F17548735C1A0201" , vpsrldq(zmm1, zmmword_ptr(rdx, rbx, 0, 128), 1));
+ TEST_INSTRUCTION("C5E9D3CB" , vpsrlq(xmm1, xmm2, xmm3));
+ TEST_INSTRUCTION("C5F173D201" , vpsrlq(xmm1, xmm2, 1));
+ TEST_INSTRUCTION("C5E9D38C2B80000000" , vpsrlq(xmm1, xmm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C5E9D38C2B80000000" , vpsrlq(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C5EDD3CB" , vpsrlq(ymm1, ymm2, xmm3));
+ TEST_INSTRUCTION("C5F573D201" , vpsrlq(ymm1, ymm2, 1));
+ TEST_INSTRUCTION("C5EDD38C2B80000000" , vpsrlq(ymm1, ymm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C5EDD38C2B80000000" , vpsrlq(ymm1, ymm2, xmmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F1F50873541A0801" , vpsrlq(xmm1, ptr(rdx, rbx, 0, 128), 1));
+ TEST_INSTRUCTION("62F1F50873541A0801" , vpsrlq(xmm1, xmmword_ptr(rdx, rbx, 0, 128), 1));
+ TEST_INSTRUCTION("62F1F52873541A0401" , vpsrlq(ymm1, ptr(rdx, rbx, 0, 128), 1));
+ TEST_INSTRUCTION("62F1F52873541A0401" , vpsrlq(ymm1, ymmword_ptr(rdx, rbx, 0, 128), 1));
+ TEST_INSTRUCTION("62F1ED48D3CB" , vpsrlq(zmm1, zmm2, xmm3));
+ TEST_INSTRUCTION("62F1F54873D201" , vpsrlq(zmm1, zmm2, 1));
+ TEST_INSTRUCTION("62F1ED48D34C2B08" , vpsrlq(zmm1, zmm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F1ED48D34C2B08" , vpsrlq(zmm1, zmm2, xmmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F1F54873541A0201" , vpsrlq(zmm1, ptr(rdx, rbx, 0, 128), 1));
+ TEST_INSTRUCTION("62F1F54873541A0201" , vpsrlq(zmm1, zmmword_ptr(rdx, rbx, 0, 128), 1));
+ TEST_INSTRUCTION("C4E26945CB" , vpsrlvd(xmm1, xmm2, xmm3));
+ TEST_INSTRUCTION("C4E269458C2B80000000" , vpsrlvd(xmm1, xmm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C4E269458C2B80000000" , vpsrlvd(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C4E26D45CB" , vpsrlvd(ymm1, ymm2, ymm3));
+ TEST_INSTRUCTION("C4E26D458C2B80000000" , vpsrlvd(ymm1, ymm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C4E26D458C2B80000000" , vpsrlvd(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F26D4845CB" , vpsrlvd(zmm1, zmm2, zmm3));
+ TEST_INSTRUCTION("62F26D48454C2B02" , vpsrlvd(zmm1, zmm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F26D48454C2B02" , vpsrlvd(zmm1, zmm2, zmmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C4E2E945CB" , vpsrlvq(xmm1, xmm2, xmm3));
+ TEST_INSTRUCTION("C4E2E9458C2B80000000" , vpsrlvq(xmm1, xmm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C4E2E9458C2B80000000" , vpsrlvq(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C4E2ED45CB" , vpsrlvq(ymm1, ymm2, ymm3));
+ TEST_INSTRUCTION("C4E2ED458C2B80000000" , vpsrlvq(ymm1, ymm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C4E2ED458C2B80000000" , vpsrlvq(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F2ED4845CB" , vpsrlvq(zmm1, zmm2, zmm3));
+ TEST_INSTRUCTION("62F2ED48454C2B02" , vpsrlvq(zmm1, zmm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F2ED48454C2B02" , vpsrlvq(zmm1, zmm2, zmmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F2ED0810CB" , vpsrlvw(xmm1, xmm2, xmm3));
+ TEST_INSTRUCTION("62F2ED08104C2B08" , vpsrlvw(xmm1, xmm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F2ED08104C2B08" , vpsrlvw(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F2ED2810CB" , vpsrlvw(ymm1, ymm2, ymm3));
+ TEST_INSTRUCTION("62F2ED28104C2B04" , vpsrlvw(ymm1, ymm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F2ED28104C2B04" , vpsrlvw(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F2ED4810CB" , vpsrlvw(zmm1, zmm2, zmm3));
+ TEST_INSTRUCTION("62F2ED48104C2B02" , vpsrlvw(zmm1, zmm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F2ED48104C2B02" , vpsrlvw(zmm1, zmm2, zmmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C5E9D1CB" , vpsrlw(xmm1, xmm2, xmm3));
+ TEST_INSTRUCTION("C5F171D201" , vpsrlw(xmm1, xmm2, 1));
+ TEST_INSTRUCTION("C5E9D18C2B80000000" , vpsrlw(xmm1, xmm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C5E9D18C2B80000000" , vpsrlw(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C5EDD1CB" , vpsrlw(ymm1, ymm2, xmm3));
+ TEST_INSTRUCTION("C5F571D201" , vpsrlw(ymm1, ymm2, 1));
+ TEST_INSTRUCTION("C5EDD18C2B80000000" , vpsrlw(ymm1, ymm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C5EDD18C2B80000000" , vpsrlw(ymm1, ymm2, xmmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F1750871541A0801" , vpsrlw(xmm1, ptr(rdx, rbx, 0, 128), 1));
+ TEST_INSTRUCTION("62F1750871541A0801" , vpsrlw(xmm1, xmmword_ptr(rdx, rbx, 0, 128), 1));
+ TEST_INSTRUCTION("62F1752871541A0401" , vpsrlw(ymm1, ptr(rdx, rbx, 0, 128), 1));
+ TEST_INSTRUCTION("62F1752871541A0401" , vpsrlw(ymm1, ymmword_ptr(rdx, rbx, 0, 128), 1));
+ TEST_INSTRUCTION("62F16D48D1CB" , vpsrlw(zmm1, zmm2, xmm3));
+ TEST_INSTRUCTION("62F1754871D201" , vpsrlw(zmm1, zmm2, 1));
+ TEST_INSTRUCTION("62F16D48D14C2B08" , vpsrlw(zmm1, zmm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F16D48D14C2B08" , vpsrlw(zmm1, zmm2, xmmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F1754871541A0201" , vpsrlw(zmm1, ptr(rdx, rbx, 0, 128), 1));
+ TEST_INSTRUCTION("62F1754871541A0201" , vpsrlw(zmm1, zmmword_ptr(rdx, rbx, 0, 128), 1));
+ TEST_INSTRUCTION("C5E9F8CB" , vpsubb(xmm1, xmm2, xmm3));
+ TEST_INSTRUCTION("C5E9F88C2B80000000" , vpsubb(xmm1, xmm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C5E9F88C2B80000000" , vpsubb(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C5EDF8CB" , vpsubb(ymm1, ymm2, ymm3));
+ TEST_INSTRUCTION("C5EDF88C2B80000000" , vpsubb(ymm1, ymm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C5EDF88C2B80000000" , vpsubb(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F16D48F8CB" , vpsubb(zmm1, zmm2, zmm3));
+ TEST_INSTRUCTION("62F16D48F84C2B02" , vpsubb(zmm1, zmm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F16D48F84C2B02" , vpsubb(zmm1, zmm2, zmmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C5E9FACB" , vpsubd(xmm1, xmm2, xmm3));
+ TEST_INSTRUCTION("C5E9FA8C2B80000000" , vpsubd(xmm1, xmm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C5E9FA8C2B80000000" , vpsubd(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C5EDFACB" , vpsubd(ymm1, ymm2, ymm3));
+ TEST_INSTRUCTION("C5EDFA8C2B80000000" , vpsubd(ymm1, ymm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C5EDFA8C2B80000000" , vpsubd(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F16D48FACB" , vpsubd(zmm1, zmm2, zmm3));
+ TEST_INSTRUCTION("62F16D48FA4C2B02" , vpsubd(zmm1, zmm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F16D48FA4C2B02" , vpsubd(zmm1, zmm2, zmmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C5E9FBCB" , vpsubq(xmm1, xmm2, xmm3));
+ TEST_INSTRUCTION("C5E9FB8C2B80000000" , vpsubq(xmm1, xmm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C5E9FB8C2B80000000" , vpsubq(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C5EDFBCB" , vpsubq(ymm1, ymm2, ymm3));
+ TEST_INSTRUCTION("C5EDFB8C2B80000000" , vpsubq(ymm1, ymm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C5EDFB8C2B80000000" , vpsubq(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F1ED48FBCB" , vpsubq(zmm1, zmm2, zmm3));
+ TEST_INSTRUCTION("62F1ED48FB4C2B02" , vpsubq(zmm1, zmm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F1ED48FB4C2B02" , vpsubq(zmm1, zmm2, zmmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C5E9E8CB" , vpsubsb(xmm1, xmm2, xmm3));
+ TEST_INSTRUCTION("C5E9E88C2B80000000" , vpsubsb(xmm1, xmm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C5E9E88C2B80000000" , vpsubsb(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C5EDE8CB" , vpsubsb(ymm1, ymm2, ymm3));
+ TEST_INSTRUCTION("C5EDE88C2B80000000" , vpsubsb(ymm1, ymm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C5EDE88C2B80000000" , vpsubsb(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F16D48E8CB" , vpsubsb(zmm1, zmm2, zmm3));
+ TEST_INSTRUCTION("62F16D48E84C2B02" , vpsubsb(zmm1, zmm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F16D48E84C2B02" , vpsubsb(zmm1, zmm2, zmmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C5E9E9CB" , vpsubsw(xmm1, xmm2, xmm3));
+ TEST_INSTRUCTION("C5E9E98C2B80000000" , vpsubsw(xmm1, xmm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C5E9E98C2B80000000" , vpsubsw(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C5EDE9CB" , vpsubsw(ymm1, ymm2, ymm3));
+ TEST_INSTRUCTION("C5EDE98C2B80000000" , vpsubsw(ymm1, ymm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C5EDE98C2B80000000" , vpsubsw(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F16D48E9CB" , vpsubsw(zmm1, zmm2, zmm3));
+ TEST_INSTRUCTION("62F16D48E94C2B02" , vpsubsw(zmm1, zmm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F16D48E94C2B02" , vpsubsw(zmm1, zmm2, zmmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C5E9D8CB" , vpsubusb(xmm1, xmm2, xmm3));
+ TEST_INSTRUCTION("C5E9D88C2B80000000" , vpsubusb(xmm1, xmm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C5E9D88C2B80000000" , vpsubusb(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C5EDD8CB" , vpsubusb(ymm1, ymm2, ymm3));
+ TEST_INSTRUCTION("C5EDD88C2B80000000" , vpsubusb(ymm1, ymm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C5EDD88C2B80000000" , vpsubusb(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F16D48D8CB" , vpsubusb(zmm1, zmm2, zmm3));
+ TEST_INSTRUCTION("62F16D48D84C2B02" , vpsubusb(zmm1, zmm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F16D48D84C2B02" , vpsubusb(zmm1, zmm2, zmmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C5E9D9CB" , vpsubusw(xmm1, xmm2, xmm3));
+ TEST_INSTRUCTION("C5E9D98C2B80000000" , vpsubusw(xmm1, xmm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C5E9D98C2B80000000" , vpsubusw(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C5EDD9CB" , vpsubusw(ymm1, ymm2, ymm3));
+ TEST_INSTRUCTION("C5EDD98C2B80000000" , vpsubusw(ymm1, ymm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C5EDD98C2B80000000" , vpsubusw(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F16D48D9CB" , vpsubusw(zmm1, zmm2, zmm3));
+ TEST_INSTRUCTION("62F16D48D94C2B02" , vpsubusw(zmm1, zmm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F16D48D94C2B02" , vpsubusw(zmm1, zmm2, zmmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C5E9F9CB" , vpsubw(xmm1, xmm2, xmm3));
+ TEST_INSTRUCTION("C5E9F98C2B80000000" , vpsubw(xmm1, xmm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C5E9F98C2B80000000" , vpsubw(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C5EDF9CB" , vpsubw(ymm1, ymm2, ymm3));
+ TEST_INSTRUCTION("C5EDF98C2B80000000" , vpsubw(ymm1, ymm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C5EDF98C2B80000000" , vpsubw(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F16D48F9CB" , vpsubw(zmm1, zmm2, zmm3));
+ TEST_INSTRUCTION("62F16D48F94C2B02" , vpsubw(zmm1, zmm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F16D48F94C2B02" , vpsubw(zmm1, zmm2, zmmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F36D0825CB01" , vpternlogd(xmm1, xmm2, xmm3, 1));
+ TEST_INSTRUCTION("62F36D08254C2B0801" , vpternlogd(xmm1, xmm2, ptr(rbx, rbp, 0, 128), 1));
+ TEST_INSTRUCTION("62F36D08254C2B0801" , vpternlogd(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128), 1));
+ TEST_INSTRUCTION("62F36D2825CB01" , vpternlogd(ymm1, ymm2, ymm3, 1));
+ TEST_INSTRUCTION("62F36D28254C2B0401" , vpternlogd(ymm1, ymm2, ptr(rbx, rbp, 0, 128), 1));
+ TEST_INSTRUCTION("62F36D28254C2B0401" , vpternlogd(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128), 1));
+ TEST_INSTRUCTION("62F36D4825CB01" , vpternlogd(zmm1, zmm2, zmm3, 1));
+ TEST_INSTRUCTION("62F36D48254C2B0201" , vpternlogd(zmm1, zmm2, ptr(rbx, rbp, 0, 128), 1));
+ TEST_INSTRUCTION("62F36D48254C2B0201" , vpternlogd(zmm1, zmm2, zmmword_ptr(rbx, rbp, 0, 128), 1));
+ TEST_INSTRUCTION("62F3ED0825CB01" , vpternlogq(xmm1, xmm2, xmm3, 1));
+ TEST_INSTRUCTION("62F3ED08254C2B0801" , vpternlogq(xmm1, xmm2, ptr(rbx, rbp, 0, 128), 1));
+ TEST_INSTRUCTION("62F3ED08254C2B0801" , vpternlogq(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128), 1));
+ TEST_INSTRUCTION("62F3ED2825CB01" , vpternlogq(ymm1, ymm2, ymm3, 1));
+ TEST_INSTRUCTION("62F3ED28254C2B0401" , vpternlogq(ymm1, ymm2, ptr(rbx, rbp, 0, 128), 1));
+ TEST_INSTRUCTION("62F3ED28254C2B0401" , vpternlogq(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128), 1));
+ TEST_INSTRUCTION("62F3ED4825CB01" , vpternlogq(zmm1, zmm2, zmm3, 1));
+ TEST_INSTRUCTION("62F3ED48254C2B0201" , vpternlogq(zmm1, zmm2, ptr(rbx, rbp, 0, 128), 1));
+ TEST_INSTRUCTION("62F3ED48254C2B0201" , vpternlogq(zmm1, zmm2, zmmword_ptr(rbx, rbp, 0, 128), 1));
+ TEST_INSTRUCTION("C4E27917CA" , vptest(xmm1, xmm2));
+ TEST_INSTRUCTION("C4E279178C1A80000000" , vptest(xmm1, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("C4E279178C1A80000000" , vptest(xmm1, xmmword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("C4E27D17CA" , vptest(ymm1, ymm2));
+ TEST_INSTRUCTION("C4E27D178C1A80000000" , vptest(ymm1, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("C4E27D178C1A80000000" , vptest(ymm1, ymmword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("62F26D0826CB" , vptestmb(k1, xmm2, xmm3));
+ TEST_INSTRUCTION("62F26D08264C2B08" , vptestmb(k1, xmm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F26D08264C2B08" , vptestmb(k1, xmm2, xmmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F26D2826CB" , vptestmb(k1, ymm2, ymm3));
+ TEST_INSTRUCTION("62F26D28264C2B04" , vptestmb(k1, ymm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F26D28264C2B04" , vptestmb(k1, ymm2, ymmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F26D4826CB" , vptestmb(k1, zmm2, zmm3));
+ TEST_INSTRUCTION("62F26D48264C2B02" , vptestmb(k1, zmm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F26D48264C2B02" , vptestmb(k1, zmm2, zmmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F26D0827CB" , vptestmd(k1, xmm2, xmm3));
+ TEST_INSTRUCTION("62F26D08274C2B08" , vptestmd(k1, xmm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F26D08274C2B08" , vptestmd(k1, xmm2, xmmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F26D2827CB" , vptestmd(k1, ymm2, ymm3));
+ TEST_INSTRUCTION("62F26D28274C2B04" , vptestmd(k1, ymm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F26D28274C2B04" , vptestmd(k1, ymm2, ymmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F26D4827CB" , vptestmd(k1, zmm2, zmm3));
+ TEST_INSTRUCTION("62F26D48274C2B02" , vptestmd(k1, zmm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F26D48274C2B02" , vptestmd(k1, zmm2, zmmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F2ED0827CB" , vptestmq(k1, xmm2, xmm3));
+ TEST_INSTRUCTION("62F2ED08274C2B08" , vptestmq(k1, xmm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F2ED08274C2B08" , vptestmq(k1, xmm2, xmmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F2ED2827CB" , vptestmq(k1, ymm2, ymm3));
+ TEST_INSTRUCTION("62F2ED28274C2B04" , vptestmq(k1, ymm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F2ED28274C2B04" , vptestmq(k1, ymm2, ymmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F2ED4827CB" , vptestmq(k1, zmm2, zmm3));
+ TEST_INSTRUCTION("62F2ED48274C2B02" , vptestmq(k1, zmm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F2ED48274C2B02" , vptestmq(k1, zmm2, zmmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F2ED0826CB" , vptestmw(k1, xmm2, xmm3));
+ TEST_INSTRUCTION("62F2ED08264C2B08" , vptestmw(k1, xmm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F2ED08264C2B08" , vptestmw(k1, xmm2, xmmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F2ED2826CB" , vptestmw(k1, ymm2, ymm3));
+ TEST_INSTRUCTION("62F2ED28264C2B04" , vptestmw(k1, ymm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F2ED28264C2B04" , vptestmw(k1, ymm2, ymmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F2ED4826CB" , vptestmw(k1, zmm2, zmm3));
+ TEST_INSTRUCTION("62F2ED48264C2B02" , vptestmw(k1, zmm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F2ED48264C2B02" , vptestmw(k1, zmm2, zmmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F26E0826CB" , vptestnmb(k1, xmm2, xmm3));
+ TEST_INSTRUCTION("62F26E08264C2B08" , vptestnmb(k1, xmm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F26E08264C2B08" , vptestnmb(k1, xmm2, xmmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F26E2826CB" , vptestnmb(k1, ymm2, ymm3));
+ TEST_INSTRUCTION("62F26E28264C2B04" , vptestnmb(k1, ymm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F26E28264C2B04" , vptestnmb(k1, ymm2, ymmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F26E4826CB" , vptestnmb(k1, zmm2, zmm3));
+ TEST_INSTRUCTION("62F26E48264C2B02" , vptestnmb(k1, zmm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F26E48264C2B02" , vptestnmb(k1, zmm2, zmmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F26E0827CB" , vptestnmd(k1, xmm2, xmm3));
+ TEST_INSTRUCTION("62F26E08274C2B08" , vptestnmd(k1, xmm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F26E08274C2B08" , vptestnmd(k1, xmm2, xmmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F26E2827CB" , vptestnmd(k1, ymm2, ymm3));
+ TEST_INSTRUCTION("62F26E28274C2B04" , vptestnmd(k1, ymm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F26E28274C2B04" , vptestnmd(k1, ymm2, ymmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F26E4827CB" , vptestnmd(k1, zmm2, zmm3));
+ TEST_INSTRUCTION("62F26E48274C2B02" , vptestnmd(k1, zmm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F26E48274C2B02" , vptestnmd(k1, zmm2, zmmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F2EE0827CB" , vptestnmq(k1, xmm2, xmm3));
+ TEST_INSTRUCTION("62F2EE08274C2B08" , vptestnmq(k1, xmm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F2EE08274C2B08" , vptestnmq(k1, xmm2, xmmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F2EE2827CB" , vptestnmq(k1, ymm2, ymm3));
+ TEST_INSTRUCTION("62F2EE28274C2B04" , vptestnmq(k1, ymm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F2EE28274C2B04" , vptestnmq(k1, ymm2, ymmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F2EE4827CB" , vptestnmq(k1, zmm2, zmm3));
+ TEST_INSTRUCTION("62F2EE48274C2B02" , vptestnmq(k1, zmm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F2EE48274C2B02" , vptestnmq(k1, zmm2, zmmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F2EE0826CB" , vptestnmw(k1, xmm2, xmm3));
+ TEST_INSTRUCTION("62F2EE08264C2B08" , vptestnmw(k1, xmm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F2EE08264C2B08" , vptestnmw(k1, xmm2, xmmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F2EE2826CB" , vptestnmw(k1, ymm2, ymm3));
+ TEST_INSTRUCTION("62F2EE28264C2B04" , vptestnmw(k1, ymm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F2EE28264C2B04" , vptestnmw(k1, ymm2, ymmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F2EE4826CB" , vptestnmw(k1, zmm2, zmm3));
+ TEST_INSTRUCTION("62F2EE48264C2B02" , vptestnmw(k1, zmm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F2EE48264C2B02" , vptestnmw(k1, zmm2, zmmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C5E968CB" , vpunpckhbw(xmm1, xmm2, xmm3));
+ TEST_INSTRUCTION("C5E9688C2B80000000" , vpunpckhbw(xmm1, xmm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C5E9688C2B80000000" , vpunpckhbw(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C5ED68CB" , vpunpckhbw(ymm1, ymm2, ymm3));
+ TEST_INSTRUCTION("C5ED688C2B80000000" , vpunpckhbw(ymm1, ymm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C5ED688C2B80000000" , vpunpckhbw(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F16D4868CB" , vpunpckhbw(zmm1, zmm2, zmm3));
+ TEST_INSTRUCTION("62F16D48684C2B02" , vpunpckhbw(zmm1, zmm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F16D48684C2B02" , vpunpckhbw(zmm1, zmm2, zmmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C5E96ACB" , vpunpckhdq(xmm1, xmm2, xmm3));
+ TEST_INSTRUCTION("C5E96A8C2B80000000" , vpunpckhdq(xmm1, xmm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C5E96A8C2B80000000" , vpunpckhdq(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C5ED6ACB" , vpunpckhdq(ymm1, ymm2, ymm3));
+ TEST_INSTRUCTION("C5ED6A8C2B80000000" , vpunpckhdq(ymm1, ymm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C5ED6A8C2B80000000" , vpunpckhdq(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F16D486ACB" , vpunpckhdq(zmm1, zmm2, zmm3));
+ TEST_INSTRUCTION("62F16D486A4C2B02" , vpunpckhdq(zmm1, zmm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F16D486A4C2B02" , vpunpckhdq(zmm1, zmm2, zmmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C5E96DCB" , vpunpckhqdq(xmm1, xmm2, xmm3));
+ TEST_INSTRUCTION("C5E96D8C2B80000000" , vpunpckhqdq(xmm1, xmm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C5E96D8C2B80000000" , vpunpckhqdq(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C5ED6DCB" , vpunpckhqdq(ymm1, ymm2, ymm3));
+ TEST_INSTRUCTION("C5ED6D8C2B80000000" , vpunpckhqdq(ymm1, ymm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C5ED6D8C2B80000000" , vpunpckhqdq(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F1ED486DCB" , vpunpckhqdq(zmm1, zmm2, zmm3));
+ TEST_INSTRUCTION("62F1ED486D4C2B02" , vpunpckhqdq(zmm1, zmm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F1ED486D4C2B02" , vpunpckhqdq(zmm1, zmm2, zmmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C5E969CB" , vpunpckhwd(xmm1, xmm2, xmm3));
+ TEST_INSTRUCTION("C5E9698C2B80000000" , vpunpckhwd(xmm1, xmm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C5E9698C2B80000000" , vpunpckhwd(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C5ED69CB" , vpunpckhwd(ymm1, ymm2, ymm3));
+ TEST_INSTRUCTION("C5ED698C2B80000000" , vpunpckhwd(ymm1, ymm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C5ED698C2B80000000" , vpunpckhwd(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F16D4869CB" , vpunpckhwd(zmm1, zmm2, zmm3));
+ TEST_INSTRUCTION("62F16D48694C2B02" , vpunpckhwd(zmm1, zmm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F16D48694C2B02" , vpunpckhwd(zmm1, zmm2, zmmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C5E960CB" , vpunpcklbw(xmm1, xmm2, xmm3));
+ TEST_INSTRUCTION("C5E9608C2B80000000" , vpunpcklbw(xmm1, xmm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C5E9608C2B80000000" , vpunpcklbw(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C5ED60CB" , vpunpcklbw(ymm1, ymm2, ymm3));
+ TEST_INSTRUCTION("C5ED608C2B80000000" , vpunpcklbw(ymm1, ymm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C5ED608C2B80000000" , vpunpcklbw(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F16D4860CB" , vpunpcklbw(zmm1, zmm2, zmm3));
+ TEST_INSTRUCTION("62F16D48604C2B02" , vpunpcklbw(zmm1, zmm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F16D48604C2B02" , vpunpcklbw(zmm1, zmm2, zmmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C5E962CB" , vpunpckldq(xmm1, xmm2, xmm3));
+ TEST_INSTRUCTION("C5E9628C2B80000000" , vpunpckldq(xmm1, xmm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C5E9628C2B80000000" , vpunpckldq(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C5ED62CB" , vpunpckldq(ymm1, ymm2, ymm3));
+ TEST_INSTRUCTION("C5ED628C2B80000000" , vpunpckldq(ymm1, ymm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C5ED628C2B80000000" , vpunpckldq(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F16D4862CB" , vpunpckldq(zmm1, zmm2, zmm3));
+ TEST_INSTRUCTION("62F16D48624C2B02" , vpunpckldq(zmm1, zmm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F16D48624C2B02" , vpunpckldq(zmm1, zmm2, zmmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C5E96CCB" , vpunpcklqdq(xmm1, xmm2, xmm3));
+ TEST_INSTRUCTION("C5E96C8C2B80000000" , vpunpcklqdq(xmm1, xmm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C5E96C8C2B80000000" , vpunpcklqdq(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C5ED6CCB" , vpunpcklqdq(ymm1, ymm2, ymm3));
+ TEST_INSTRUCTION("C5ED6C8C2B80000000" , vpunpcklqdq(ymm1, ymm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C5ED6C8C2B80000000" , vpunpcklqdq(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F1ED486CCB" , vpunpcklqdq(zmm1, zmm2, zmm3));
+ TEST_INSTRUCTION("62F1ED486C4C2B02" , vpunpcklqdq(zmm1, zmm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F1ED486C4C2B02" , vpunpcklqdq(zmm1, zmm2, zmmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C5E961CB" , vpunpcklwd(xmm1, xmm2, xmm3));
+ TEST_INSTRUCTION("C5E9618C2B80000000" , vpunpcklwd(xmm1, xmm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C5E9618C2B80000000" , vpunpcklwd(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C5ED61CB" , vpunpcklwd(ymm1, ymm2, ymm3));
+ TEST_INSTRUCTION("C5ED618C2B80000000" , vpunpcklwd(ymm1, ymm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C5ED618C2B80000000" , vpunpcklwd(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F16D4861CB" , vpunpcklwd(zmm1, zmm2, zmm3));
+ TEST_INSTRUCTION("62F16D48614C2B02" , vpunpcklwd(zmm1, zmm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F16D48614C2B02" , vpunpcklwd(zmm1, zmm2, zmmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C5E9EFCB" , vpxor(xmm1, xmm2, xmm3));
+ TEST_INSTRUCTION("C5E9EF8C2B80000000" , vpxor(xmm1, xmm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C5E9EF8C2B80000000" , vpxor(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C5EDEFCB" , vpxor(ymm1, ymm2, ymm3));
+ TEST_INSTRUCTION("C5EDEF8C2B80000000" , vpxor(ymm1, ymm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C5EDEF8C2B80000000" , vpxor(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F16D08EFCB" , vpxord(xmm1, xmm2, xmm3));
+ TEST_INSTRUCTION("62F16D08EF4C2B08" , vpxord(xmm1, xmm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F16D08EF4C2B08" , vpxord(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F16D28EFCB" , vpxord(ymm1, ymm2, ymm3));
+ TEST_INSTRUCTION("62F16D28EF4C2B04" , vpxord(ymm1, ymm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F16D28EF4C2B04" , vpxord(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F16D48EFCB" , vpxord(zmm1, zmm2, zmm3));
+ TEST_INSTRUCTION("62F16D48EF4C2B02" , vpxord(zmm1, zmm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F16D48EF4C2B02" , vpxord(zmm1, zmm2, zmmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F1ED08EFCB" , vpxorq(xmm1, xmm2, xmm3));
+ TEST_INSTRUCTION("62F1ED08EF4C2B08" , vpxorq(xmm1, xmm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F1ED08EF4C2B08" , vpxorq(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F1ED28EFCB" , vpxorq(ymm1, ymm2, ymm3));
+ TEST_INSTRUCTION("62F1ED28EF4C2B04" , vpxorq(ymm1, ymm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F1ED28EF4C2B04" , vpxorq(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F1ED48EFCB" , vpxorq(zmm1, zmm2, zmm3));
+ TEST_INSTRUCTION("62F1ED48EF4C2B02" , vpxorq(zmm1, zmm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F1ED48EF4C2B02" , vpxorq(zmm1, zmm2, zmmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F3ED0850CB01" , vrangepd(xmm1, xmm2, xmm3, 1));
+ TEST_INSTRUCTION("62F3ED08504C2B0801" , vrangepd(xmm1, xmm2, ptr(rbx, rbp, 0, 128), 1));
+ TEST_INSTRUCTION("62F3ED08504C2B0801" , vrangepd(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128), 1));
+ TEST_INSTRUCTION("62F3ED2850CB01" , vrangepd(ymm1, ymm2, ymm3, 1));
+ TEST_INSTRUCTION("62F3ED28504C2B0401" , vrangepd(ymm1, ymm2, ptr(rbx, rbp, 0, 128), 1));
+ TEST_INSTRUCTION("62F3ED28504C2B0401" , vrangepd(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128), 1));
+ TEST_INSTRUCTION("62F3ED4850CB01" , vrangepd(zmm1, zmm2, zmm3, 1));
+ TEST_INSTRUCTION("62F3ED48504C2B0201" , vrangepd(zmm1, zmm2, ptr(rbx, rbp, 0, 128), 1));
+ TEST_INSTRUCTION("62F3ED48504C2B0201" , vrangepd(zmm1, zmm2, zmmword_ptr(rbx, rbp, 0, 128), 1));
+ TEST_INSTRUCTION("62F36D0850CB01" , vrangeps(xmm1, xmm2, xmm3, 1));
+ TEST_INSTRUCTION("62F36D08504C2B0801" , vrangeps(xmm1, xmm2, ptr(rbx, rbp, 0, 128), 1));
+ TEST_INSTRUCTION("62F36D08504C2B0801" , vrangeps(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128), 1));
+ TEST_INSTRUCTION("62F36D2850CB01" , vrangeps(ymm1, ymm2, ymm3, 1));
+ TEST_INSTRUCTION("62F36D28504C2B0401" , vrangeps(ymm1, ymm2, ptr(rbx, rbp, 0, 128), 1));
+ TEST_INSTRUCTION("62F36D28504C2B0401" , vrangeps(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128), 1));
+ TEST_INSTRUCTION("62F36D4850CB01" , vrangeps(zmm1, zmm2, zmm3, 1));
+ TEST_INSTRUCTION("62F36D48504C2B0201" , vrangeps(zmm1, zmm2, ptr(rbx, rbp, 0, 128), 1));
+ TEST_INSTRUCTION("62F36D48504C2B0201" , vrangeps(zmm1, zmm2, zmmword_ptr(rbx, rbp, 0, 128), 1));
+ TEST_INSTRUCTION("62F3ED0851CB01" , vrangesd(xmm1, xmm2, xmm3, 1));
+ TEST_INSTRUCTION("62F3ED08514C2B1001" , vrangesd(xmm1, xmm2, ptr(rbx, rbp, 0, 128), 1));
+ TEST_INSTRUCTION("62F3ED08514C2B1001" , vrangesd(xmm1, xmm2, qword_ptr(rbx, rbp, 0, 128), 1));
+ TEST_INSTRUCTION("62F36D0851CB01" , vrangess(xmm1, xmm2, xmm3, 1));
+ TEST_INSTRUCTION("62F36D08514C2B2001" , vrangess(xmm1, xmm2, ptr(rbx, rbp, 0, 128), 1));
+ TEST_INSTRUCTION("62F36D08514C2B2001" , vrangess(xmm1, xmm2, dword_ptr(rbx, rbp, 0, 128), 1));
+ TEST_INSTRUCTION("62F2FD084CCA" , vrcp14pd(xmm1, xmm2));
+ TEST_INSTRUCTION("62F2FD084C4C1A08" , vrcp14pd(xmm1, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("62F2FD084C4C1A08" , vrcp14pd(xmm1, xmmword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("62F2FD284CCA" , vrcp14pd(ymm1, ymm2));
+ TEST_INSTRUCTION("62F2FD284C4C1A04" , vrcp14pd(ymm1, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("62F2FD284C4C1A04" , vrcp14pd(ymm1, ymmword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("62F2FD484CCA" , vrcp14pd(zmm1, zmm2));
+ TEST_INSTRUCTION("62F2FD484C4C1A02" , vrcp14pd(zmm1, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("62F2FD484C4C1A02" , vrcp14pd(zmm1, zmmword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("62F27D084CCA" , vrcp14ps(xmm1, xmm2));
+ TEST_INSTRUCTION("62F27D084C4C1A08" , vrcp14ps(xmm1, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("62F27D084C4C1A08" , vrcp14ps(xmm1, xmmword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("62F27D284CCA" , vrcp14ps(ymm1, ymm2));
+ TEST_INSTRUCTION("62F27D284C4C1A04" , vrcp14ps(ymm1, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("62F27D284C4C1A04" , vrcp14ps(ymm1, ymmword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("62F27D484CCA" , vrcp14ps(zmm1, zmm2));
+ TEST_INSTRUCTION("62F27D484C4C1A02" , vrcp14ps(zmm1, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("62F27D484C4C1A02" , vrcp14ps(zmm1, zmmword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("62F2ED084DCB" , vrcp14sd(xmm1, xmm2, xmm3));
+ TEST_INSTRUCTION("62F2ED084D4C2B10" , vrcp14sd(xmm1, xmm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F2ED084D4C2B10" , vrcp14sd(xmm1, xmm2, qword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F26D084DCB" , vrcp14ss(xmm1, xmm2, xmm3));
+ TEST_INSTRUCTION("62F26D084D4C2B20" , vrcp14ss(xmm1, xmm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F26D084D4C2B20" , vrcp14ss(xmm1, xmm2, dword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F2FD48CACA" , vrcp28pd(zmm1, zmm2));
+ TEST_INSTRUCTION("62F2FD48CA4C1A02" , vrcp28pd(zmm1, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("62F2FD48CA4C1A02" , vrcp28pd(zmm1, zmmword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("62F27D48CACA" , vrcp28ps(zmm1, zmm2));
+ TEST_INSTRUCTION("62F27D48CA4C1A02" , vrcp28ps(zmm1, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("62F27D48CA4C1A02" , vrcp28ps(zmm1, zmmword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("62F2ED08CBCB" , vrcp28sd(xmm1, xmm2, xmm3));
+ TEST_INSTRUCTION("62F2ED08CB4C2B10" , vrcp28sd(xmm1, xmm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F2ED08CB4C2B10" , vrcp28sd(xmm1, xmm2, qword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F26D08CBCB" , vrcp28ss(xmm1, xmm2, xmm3));
+ TEST_INSTRUCTION("62F26D08CB4C2B20" , vrcp28ss(xmm1, xmm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F26D08CB4C2B20" , vrcp28ss(xmm1, xmm2, dword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C5F853CA" , vrcpps(xmm1, xmm2));
+ TEST_INSTRUCTION("C5F8538C1A80000000" , vrcpps(xmm1, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("C5F8538C1A80000000" , vrcpps(xmm1, xmmword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("C5FC53CA" , vrcpps(ymm1, ymm2));
+ TEST_INSTRUCTION("C5FC538C1A80000000" , vrcpps(ymm1, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("C5FC538C1A80000000" , vrcpps(ymm1, ymmword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("C5EA53CB" , vrcpss(xmm1, xmm2, xmm3));
+ TEST_INSTRUCTION("C5EA538C2B80000000" , vrcpss(xmm1, xmm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C5EA538C2B80000000" , vrcpss(xmm1, xmm2, dword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F3FD0856CA01" , vreducepd(xmm1, xmm2, 1));
+ TEST_INSTRUCTION("62F3FD08564C1A0801" , vreducepd(xmm1, ptr(rdx, rbx, 0, 128), 1));
+ TEST_INSTRUCTION("62F3FD08564C1A0801" , vreducepd(xmm1, xmmword_ptr(rdx, rbx, 0, 128), 1));
+ TEST_INSTRUCTION("62F3FD2856CA01" , vreducepd(ymm1, ymm2, 1));
+ TEST_INSTRUCTION("62F3FD28564C1A0401" , vreducepd(ymm1, ptr(rdx, rbx, 0, 128), 1));
+ TEST_INSTRUCTION("62F3FD28564C1A0401" , vreducepd(ymm1, ymmword_ptr(rdx, rbx, 0, 128), 1));
+ TEST_INSTRUCTION("62F3FD4856CA01" , vreducepd(zmm1, zmm2, 1));
+ TEST_INSTRUCTION("62F3FD48564C1A0201" , vreducepd(zmm1, ptr(rdx, rbx, 0, 128), 1));
+ TEST_INSTRUCTION("62F3FD48564C1A0201" , vreducepd(zmm1, zmmword_ptr(rdx, rbx, 0, 128), 1));
+ TEST_INSTRUCTION("62F37D0856CA01" , vreduceps(xmm1, xmm2, 1));
+ TEST_INSTRUCTION("62F37D08564C1A0801" , vreduceps(xmm1, ptr(rdx, rbx, 0, 128), 1));
+ TEST_INSTRUCTION("62F37D08564C1A0801" , vreduceps(xmm1, xmmword_ptr(rdx, rbx, 0, 128), 1));
+ TEST_INSTRUCTION("62F37D2856CA01" , vreduceps(ymm1, ymm2, 1));
+ TEST_INSTRUCTION("62F37D28564C1A0401" , vreduceps(ymm1, ptr(rdx, rbx, 0, 128), 1));
+ TEST_INSTRUCTION("62F37D28564C1A0401" , vreduceps(ymm1, ymmword_ptr(rdx, rbx, 0, 128), 1));
+ TEST_INSTRUCTION("62F37D4856CA01" , vreduceps(zmm1, zmm2, 1));
+ TEST_INSTRUCTION("62F37D48564C1A0201" , vreduceps(zmm1, ptr(rdx, rbx, 0, 128), 1));
+ TEST_INSTRUCTION("62F37D48564C1A0201" , vreduceps(zmm1, zmmword_ptr(rdx, rbx, 0, 128), 1));
+ TEST_INSTRUCTION("62F3ED0857CB01" , vreducesd(xmm1, xmm2, xmm3, 1));
+ TEST_INSTRUCTION("62F3ED08574C2B1001" , vreducesd(xmm1, xmm2, ptr(rbx, rbp, 0, 128), 1));
+ TEST_INSTRUCTION("62F3ED08574C2B1001" , vreducesd(xmm1, xmm2, qword_ptr(rbx, rbp, 0, 128), 1));
+ TEST_INSTRUCTION("62F36D0857CB01" , vreducess(xmm1, xmm2, xmm3, 1));
+ TEST_INSTRUCTION("62F36D08574C2B2001" , vreducess(xmm1, xmm2, ptr(rbx, rbp, 0, 128), 1));
+ TEST_INSTRUCTION("62F36D08574C2B2001" , vreducess(xmm1, xmm2, dword_ptr(rbx, rbp, 0, 128), 1));
+ TEST_INSTRUCTION("62F3FD0809CA01" , vrndscalepd(xmm1, xmm2, 1));
+ TEST_INSTRUCTION("62F3FD08094C1A0801" , vrndscalepd(xmm1, ptr(rdx, rbx, 0, 128), 1));
+ TEST_INSTRUCTION("62F3FD08094C1A0801" , vrndscalepd(xmm1, xmmword_ptr(rdx, rbx, 0, 128), 1));
+ TEST_INSTRUCTION("62F3FD2809CA01" , vrndscalepd(ymm1, ymm2, 1));
+ TEST_INSTRUCTION("62F3FD28094C1A0401" , vrndscalepd(ymm1, ptr(rdx, rbx, 0, 128), 1));
+ TEST_INSTRUCTION("62F3FD28094C1A0401" , vrndscalepd(ymm1, ymmword_ptr(rdx, rbx, 0, 128), 1));
+ TEST_INSTRUCTION("62F3FD4809CA01" , vrndscalepd(zmm1, zmm2, 1));
+ TEST_INSTRUCTION("62F3FD48094C1A0201" , vrndscalepd(zmm1, ptr(rdx, rbx, 0, 128), 1));
+ TEST_INSTRUCTION("62F3FD48094C1A0201" , vrndscalepd(zmm1, zmmword_ptr(rdx, rbx, 0, 128), 1));
+ TEST_INSTRUCTION("62F37D0808CA01" , vrndscaleps(xmm1, xmm2, 1));
+ TEST_INSTRUCTION("62F37D08084C1A0801" , vrndscaleps(xmm1, ptr(rdx, rbx, 0, 128), 1));
+ TEST_INSTRUCTION("62F37D08084C1A0801" , vrndscaleps(xmm1, xmmword_ptr(rdx, rbx, 0, 128), 1));
+ TEST_INSTRUCTION("62F37D2808CA01" , vrndscaleps(ymm1, ymm2, 1));
+ TEST_INSTRUCTION("62F37D28084C1A0401" , vrndscaleps(ymm1, ptr(rdx, rbx, 0, 128), 1));
+ TEST_INSTRUCTION("62F37D28084C1A0401" , vrndscaleps(ymm1, ymmword_ptr(rdx, rbx, 0, 128), 1));
+ TEST_INSTRUCTION("62F37D4808CA01" , vrndscaleps(zmm1, zmm2, 1));
+ TEST_INSTRUCTION("62F37D48084C1A0201" , vrndscaleps(zmm1, ptr(rdx, rbx, 0, 128), 1));
+ TEST_INSTRUCTION("62F37D48084C1A0201" , vrndscaleps(zmm1, zmmword_ptr(rdx, rbx, 0, 128), 1));
+ TEST_INSTRUCTION("62F3ED080BCB01" , vrndscalesd(xmm1, xmm2, xmm3, 1));
+ TEST_INSTRUCTION("62F3ED080B4C2B1001" , vrndscalesd(xmm1, xmm2, ptr(rbx, rbp, 0, 128), 1));
+ TEST_INSTRUCTION("62F3ED080B4C2B1001" , vrndscalesd(xmm1, xmm2, qword_ptr(rbx, rbp, 0, 128), 1));
+ TEST_INSTRUCTION("62F36D080ACB01" , vrndscaless(xmm1, xmm2, xmm3, 1));
+ TEST_INSTRUCTION("62F36D080A4C2B2001" , vrndscaless(xmm1, xmm2, ptr(rbx, rbp, 0, 128), 1));
+ TEST_INSTRUCTION("62F36D080A4C2B2001" , vrndscaless(xmm1, xmm2, dword_ptr(rbx, rbp, 0, 128), 1));
+ TEST_INSTRUCTION("C4E37909CA01" , vroundpd(xmm1, xmm2, 1));
+ TEST_INSTRUCTION("C4E379098C1A8000000001" , vroundpd(xmm1, ptr(rdx, rbx, 0, 128), 1));
+ TEST_INSTRUCTION("C4E379098C1A8000000001" , vroundpd(xmm1, xmmword_ptr(rdx, rbx, 0, 128), 1));
+ TEST_INSTRUCTION("C4E37D09CA01" , vroundpd(ymm1, ymm2, 1));
+ TEST_INSTRUCTION("C4E37D098C1A8000000001" , vroundpd(ymm1, ptr(rdx, rbx, 0, 128), 1));
+ TEST_INSTRUCTION("C4E37D098C1A8000000001" , vroundpd(ymm1, ymmword_ptr(rdx, rbx, 0, 128), 1));
+ TEST_INSTRUCTION("C4E37908CA01" , vroundps(xmm1, xmm2, 1));
+ TEST_INSTRUCTION("C4E379088C1A8000000001" , vroundps(xmm1, ptr(rdx, rbx, 0, 128), 1));
+ TEST_INSTRUCTION("C4E379088C1A8000000001" , vroundps(xmm1, xmmword_ptr(rdx, rbx, 0, 128), 1));
+ TEST_INSTRUCTION("C4E37D08CA01" , vroundps(ymm1, ymm2, 1));
+ TEST_INSTRUCTION("C4E37D088C1A8000000001" , vroundps(ymm1, ptr(rdx, rbx, 0, 128), 1));
+ TEST_INSTRUCTION("C4E37D088C1A8000000001" , vroundps(ymm1, ymmword_ptr(rdx, rbx, 0, 128), 1));
+ TEST_INSTRUCTION("C4E3690BCB01" , vroundsd(xmm1, xmm2, xmm3, 1));
+ TEST_INSTRUCTION("C4E3690B8C2B8000000001" , vroundsd(xmm1, xmm2, ptr(rbx, rbp, 0, 128), 1));
+ TEST_INSTRUCTION("C4E3690B8C2B8000000001" , vroundsd(xmm1, xmm2, qword_ptr(rbx, rbp, 0, 128), 1));
+ TEST_INSTRUCTION("C4E3690ACB01" , vroundss(xmm1, xmm2, xmm3, 1));
+ TEST_INSTRUCTION("C4E3690A8C2B8000000001" , vroundss(xmm1, xmm2, ptr(rbx, rbp, 0, 128), 1));
+ TEST_INSTRUCTION("C4E3690A8C2B8000000001" , vroundss(xmm1, xmm2, dword_ptr(rbx, rbp, 0, 128), 1));
+ TEST_INSTRUCTION("62F2FD084ECA" , vrsqrt14pd(xmm1, xmm2));
+ TEST_INSTRUCTION("62F2FD084E4C1A08" , vrsqrt14pd(xmm1, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("62F2FD084E4C1A08" , vrsqrt14pd(xmm1, xmmword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("62F2FD284ECA" , vrsqrt14pd(ymm1, ymm2));
+ TEST_INSTRUCTION("62F2FD284E4C1A04" , vrsqrt14pd(ymm1, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("62F2FD284E4C1A04" , vrsqrt14pd(ymm1, ymmword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("62F2FD484ECA" , vrsqrt14pd(zmm1, zmm2));
+ TEST_INSTRUCTION("62F2FD484E4C1A02" , vrsqrt14pd(zmm1, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("62F2FD484E4C1A02" , vrsqrt14pd(zmm1, zmmword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("62F27D084ECA" , vrsqrt14ps(xmm1, xmm2));
+ TEST_INSTRUCTION("62F27D084E4C1A08" , vrsqrt14ps(xmm1, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("62F27D084E4C1A08" , vrsqrt14ps(xmm1, xmmword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("62F27D284ECA" , vrsqrt14ps(ymm1, ymm2));
+ TEST_INSTRUCTION("62F27D284E4C1A04" , vrsqrt14ps(ymm1, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("62F27D284E4C1A04" , vrsqrt14ps(ymm1, ymmword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("62F27D484ECA" , vrsqrt14ps(zmm1, zmm2));
+ TEST_INSTRUCTION("62F27D484E4C1A02" , vrsqrt14ps(zmm1, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("62F27D484E4C1A02" , vrsqrt14ps(zmm1, zmmword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("62F2ED084FCB" , vrsqrt14sd(xmm1, xmm2, xmm3));
+ TEST_INSTRUCTION("62F2ED084F4C2B10" , vrsqrt14sd(xmm1, xmm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F2ED084F4C2B10" , vrsqrt14sd(xmm1, xmm2, qword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F26D084FCB" , vrsqrt14ss(xmm1, xmm2, xmm3));
+ TEST_INSTRUCTION("62F26D084F4C2B20" , vrsqrt14ss(xmm1, xmm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F26D084F4C2B20" , vrsqrt14ss(xmm1, xmm2, dword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F2FD48CCCA" , vrsqrt28pd(zmm1, zmm2));
+ TEST_INSTRUCTION("62F2FD48CC4C1A02" , vrsqrt28pd(zmm1, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("62F2FD48CC4C1A02" , vrsqrt28pd(zmm1, zmmword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("62F27D48CCCA" , vrsqrt28ps(zmm1, zmm2));
+ TEST_INSTRUCTION("62F27D48CC4C1A02" , vrsqrt28ps(zmm1, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("62F27D48CC4C1A02" , vrsqrt28ps(zmm1, zmmword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("62F2ED08CDCB" , vrsqrt28sd(xmm1, xmm2, xmm3));
+ TEST_INSTRUCTION("62F2ED08CD4C2B10" , vrsqrt28sd(xmm1, xmm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F2ED08CD4C2B10" , vrsqrt28sd(xmm1, xmm2, qword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F26D08CDCB" , vrsqrt28ss(xmm1, xmm2, xmm3));
+ TEST_INSTRUCTION("62F26D08CD4C2B20" , vrsqrt28ss(xmm1, xmm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F26D08CD4C2B20" , vrsqrt28ss(xmm1, xmm2, dword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C5F852CA" , vrsqrtps(xmm1, xmm2));
+ TEST_INSTRUCTION("C5F8528C1A80000000" , vrsqrtps(xmm1, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("C5F8528C1A80000000" , vrsqrtps(xmm1, xmmword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("C5FC52CA" , vrsqrtps(ymm1, ymm2));
+ TEST_INSTRUCTION("C5FC528C1A80000000" , vrsqrtps(ymm1, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("C5FC528C1A80000000" , vrsqrtps(ymm1, ymmword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("C5EA52CB" , vrsqrtss(xmm1, xmm2, xmm3));
+ TEST_INSTRUCTION("C5EA528C2B80000000" , vrsqrtss(xmm1, xmm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C5EA528C2B80000000" , vrsqrtss(xmm1, xmm2, dword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F2ED082CCB" , vscalefpd(xmm1, xmm2, xmm3));
+ TEST_INSTRUCTION("62F2ED082C4C2B08" , vscalefpd(xmm1, xmm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F2ED082C4C2B08" , vscalefpd(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F2ED282CCB" , vscalefpd(ymm1, ymm2, ymm3));
+ TEST_INSTRUCTION("62F2ED282C4C2B04" , vscalefpd(ymm1, ymm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F2ED282C4C2B04" , vscalefpd(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F2ED482CCB" , vscalefpd(zmm1, zmm2, zmm3));
+ TEST_INSTRUCTION("62F2ED482C4C2B02" , vscalefpd(zmm1, zmm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F2ED482C4C2B02" , vscalefpd(zmm1, zmm2, zmmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F26D082CCB" , vscalefps(xmm1, xmm2, xmm3));
+ TEST_INSTRUCTION("62F26D082C4C2B08" , vscalefps(xmm1, xmm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F26D082C4C2B08" , vscalefps(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F26D282CCB" , vscalefps(ymm1, ymm2, ymm3));
+ TEST_INSTRUCTION("62F26D282C4C2B04" , vscalefps(ymm1, ymm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F26D282C4C2B04" , vscalefps(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F26D482CCB" , vscalefps(zmm1, zmm2, zmm3));
+ TEST_INSTRUCTION("62F26D482C4C2B02" , vscalefps(zmm1, zmm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F26D482C4C2B02" , vscalefps(zmm1, zmm2, zmmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F2ED082DCB" , vscalefsd(xmm1, xmm2, xmm3));
+ TEST_INSTRUCTION("62F2ED082D4C2B10" , vscalefsd(xmm1, xmm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F2ED082D4C2B10" , vscalefsd(xmm1, xmm2, qword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F26D082DCB" , vscalefss(xmm1, xmm2, xmm3));
+ TEST_INSTRUCTION("62F26D082D4C2B20" , vscalefss(xmm1, xmm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F26D082D4C2B20" , vscalefss(xmm1, xmm2, dword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F2FD09A25C1110" , k(k1).vscatterdpd(ptr(rcx, xmm2, 0, 128), xmm3));
+ TEST_INSTRUCTION("62F2FD29A25C1110" , k(k1).vscatterdpd(ptr(rcx, xmm2, 0, 128), ymm3));
+ TEST_INSTRUCTION("62F2FD49A25C1110" , k(k1).vscatterdpd(ptr(rcx, ymm2, 0, 128), zmm3));
+ TEST_INSTRUCTION("62F27D09A25C1120" , k(k1).vscatterdps(ptr(rcx, xmm2, 0, 128), xmm3));
+ TEST_INSTRUCTION("62F27D29A25C1120" , k(k1).vscatterdps(ptr(rcx, ymm2, 0, 128), ymm3));
+ TEST_INSTRUCTION("62F27D49A25C1120" , k(k1).vscatterdps(ptr(rcx, zmm2, 0, 128), zmm3));
+ TEST_INSTRUCTION("62F2FD49C66C1110" , k(k1).vscatterpf0dpd(ptr(rcx, ymm2, 0, 128)));
+ TEST_INSTRUCTION("62F27D49C66C1120" , k(k1).vscatterpf0dps(ptr(rcx, zmm2, 0, 128)));
+ TEST_INSTRUCTION("62F2FD49C76C1110" , k(k1).vscatterpf0qpd(ptr(rcx, zmm2, 0, 128)));
+ TEST_INSTRUCTION("62F27D49C76C1120" , k(k1).vscatterpf0qps(ptr(rcx, zmm2, 0, 128)));
+ TEST_INSTRUCTION("62F2FD49C6741110" , k(k1).vscatterpf1dpd(ptr(rcx, ymm2, 0, 128)));
+ TEST_INSTRUCTION("62F27D49C6741120" , k(k1).vscatterpf1dps(ptr(rcx, zmm2, 0, 128)));
+ TEST_INSTRUCTION("62F2FD49C7741110" , k(k1).vscatterpf1qpd(ptr(rcx, zmm2, 0, 128)));
+ TEST_INSTRUCTION("62F27D49C7741120" , k(k1).vscatterpf1qps(ptr(rcx, zmm2, 0, 128)));
+ TEST_INSTRUCTION("62F2FD09A35C1110" , k(k1).vscatterqpd(ptr(rcx, xmm2, 0, 128), xmm3));
+ TEST_INSTRUCTION("62F2FD29A35C1110" , k(k1).vscatterqpd(ptr(rcx, ymm2, 0, 128), ymm3));
+ TEST_INSTRUCTION("62F2FD49A35C1110" , k(k1).vscatterqpd(ptr(rcx, zmm2, 0, 128), zmm3));
+ TEST_INSTRUCTION("62F27D09A35C1120" , k(k1).vscatterqps(ptr(rcx, xmm2, 0, 128), xmm3));
+ TEST_INSTRUCTION("62F27D29A35C1120" , k(k1).vscatterqps(ptr(rcx, ymm2, 0, 128), xmm3));
+ TEST_INSTRUCTION("62F27D49A35C1120" , k(k1).vscatterqps(ptr(rcx, zmm2, 0, 128), ymm3));
+ TEST_INSTRUCTION("62F36D2823CB01" , vshuff32x4(ymm1, ymm2, ymm3, 1));
+ TEST_INSTRUCTION("62F36D28234C2B0401" , vshuff32x4(ymm1, ymm2, ptr(rbx, rbp, 0, 128), 1));
+ TEST_INSTRUCTION("62F36D28234C2B0401" , vshuff32x4(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128), 1));
+ TEST_INSTRUCTION("62F36D4823CB01" , vshuff32x4(zmm1, zmm2, zmm3, 1));
+ TEST_INSTRUCTION("62F36D48234C2B0201" , vshuff32x4(zmm1, zmm2, ptr(rbx, rbp, 0, 128), 1));
+ TEST_INSTRUCTION("62F36D48234C2B0201" , vshuff32x4(zmm1, zmm2, zmmword_ptr(rbx, rbp, 0, 128), 1));
+ TEST_INSTRUCTION("62F3ED2823CB01" , vshuff64x2(ymm1, ymm2, ymm3, 1));
+ TEST_INSTRUCTION("62F3ED28234C2B0401" , vshuff64x2(ymm1, ymm2, ptr(rbx, rbp, 0, 128), 1));
+ TEST_INSTRUCTION("62F3ED28234C2B0401" , vshuff64x2(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128), 1));
+ TEST_INSTRUCTION("62F3ED4823CB01" , vshuff64x2(zmm1, zmm2, zmm3, 1));
+ TEST_INSTRUCTION("62F3ED48234C2B0201" , vshuff64x2(zmm1, zmm2, ptr(rbx, rbp, 0, 128), 1));
+ TEST_INSTRUCTION("62F3ED48234C2B0201" , vshuff64x2(zmm1, zmm2, zmmword_ptr(rbx, rbp, 0, 128), 1));
+ TEST_INSTRUCTION("62F36D2843CB01" , vshufi32x4(ymm1, ymm2, ymm3, 1));
+ TEST_INSTRUCTION("62F36D28434C2B0401" , vshufi32x4(ymm1, ymm2, ptr(rbx, rbp, 0, 128), 1));
+ TEST_INSTRUCTION("62F36D28434C2B0401" , vshufi32x4(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128), 1));
+ TEST_INSTRUCTION("62F36D4843CB01" , vshufi32x4(zmm1, zmm2, zmm3, 1));
+ TEST_INSTRUCTION("62F36D48434C2B0201" , vshufi32x4(zmm1, zmm2, ptr(rbx, rbp, 0, 128), 1));
+ TEST_INSTRUCTION("62F36D48434C2B0201" , vshufi32x4(zmm1, zmm2, zmmword_ptr(rbx, rbp, 0, 128), 1));
+ TEST_INSTRUCTION("62F3ED2843CB01" , vshufi64x2(ymm1, ymm2, ymm3, 1));
+ TEST_INSTRUCTION("62F3ED28434C2B0401" , vshufi64x2(ymm1, ymm2, ptr(rbx, rbp, 0, 128), 1));
+ TEST_INSTRUCTION("62F3ED28434C2B0401" , vshufi64x2(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128), 1));
+ TEST_INSTRUCTION("62F3ED4843CB01" , vshufi64x2(zmm1, zmm2, zmm3, 1));
+ TEST_INSTRUCTION("62F3ED48434C2B0201" , vshufi64x2(zmm1, zmm2, ptr(rbx, rbp, 0, 128), 1));
+ TEST_INSTRUCTION("62F3ED48434C2B0201" , vshufi64x2(zmm1, zmm2, zmmword_ptr(rbx, rbp, 0, 128), 1));
+ TEST_INSTRUCTION("C5E9C6CB01" , vshufpd(xmm1, xmm2, xmm3, 1));
+ TEST_INSTRUCTION("C5E9C68C2B8000000001" , vshufpd(xmm1, xmm2, ptr(rbx, rbp, 0, 128), 1));
+ TEST_INSTRUCTION("C5E9C68C2B8000000001" , vshufpd(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128), 1));
+ TEST_INSTRUCTION("C5EDC6CB01" , vshufpd(ymm1, ymm2, ymm3, 1));
+ TEST_INSTRUCTION("C5EDC68C2B8000000001" , vshufpd(ymm1, ymm2, ptr(rbx, rbp, 0, 128), 1));
+ TEST_INSTRUCTION("C5EDC68C2B8000000001" , vshufpd(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128), 1));
+ TEST_INSTRUCTION("62F1ED48C6CB01" , vshufpd(zmm1, zmm2, zmm3, 1));
+ TEST_INSTRUCTION("62F1ED48C64C2B0201" , vshufpd(zmm1, zmm2, ptr(rbx, rbp, 0, 128), 1));
+ TEST_INSTRUCTION("62F1ED48C64C2B0201" , vshufpd(zmm1, zmm2, zmmword_ptr(rbx, rbp, 0, 128), 1));
+ TEST_INSTRUCTION("C5E8C6CB01" , vshufps(xmm1, xmm2, xmm3, 1));
+ TEST_INSTRUCTION("C5E8C68C2B8000000001" , vshufps(xmm1, xmm2, ptr(rbx, rbp, 0, 128), 1));
+ TEST_INSTRUCTION("C5E8C68C2B8000000001" , vshufps(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128), 1));
+ TEST_INSTRUCTION("C5ECC6CB01" , vshufps(ymm1, ymm2, ymm3, 1));
+ TEST_INSTRUCTION("C5ECC68C2B8000000001" , vshufps(ymm1, ymm2, ptr(rbx, rbp, 0, 128), 1));
+ TEST_INSTRUCTION("C5ECC68C2B8000000001" , vshufps(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128), 1));
+ TEST_INSTRUCTION("62F16C48C6CB01" , vshufps(zmm1, zmm2, zmm3, 1));
+ TEST_INSTRUCTION("62F16C48C64C2B0201" , vshufps(zmm1, zmm2, ptr(rbx, rbp, 0, 128), 1));
+ TEST_INSTRUCTION("62F16C48C64C2B0201" , vshufps(zmm1, zmm2, zmmword_ptr(rbx, rbp, 0, 128), 1));
+ TEST_INSTRUCTION("C5F951CA" , vsqrtpd(xmm1, xmm2));
+ TEST_INSTRUCTION("C5F9518C1A80000000" , vsqrtpd(xmm1, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("C5F9518C1A80000000" , vsqrtpd(xmm1, xmmword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("C5FD51CA" , vsqrtpd(ymm1, ymm2));
+ TEST_INSTRUCTION("C5FD518C1A80000000" , vsqrtpd(ymm1, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("C5FD518C1A80000000" , vsqrtpd(ymm1, ymmword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("62F1FD4851CA" , vsqrtpd(zmm1, zmm2));
+ TEST_INSTRUCTION("62F1FD48514C1A02" , vsqrtpd(zmm1, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("62F1FD48514C1A02" , vsqrtpd(zmm1, zmmword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("C5F851CA" , vsqrtps(xmm1, xmm2));
+ TEST_INSTRUCTION("C5F8518C1A80000000" , vsqrtps(xmm1, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("C5F8518C1A80000000" , vsqrtps(xmm1, xmmword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("C5FC51CA" , vsqrtps(ymm1, ymm2));
+ TEST_INSTRUCTION("C5FC518C1A80000000" , vsqrtps(ymm1, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("C5FC518C1A80000000" , vsqrtps(ymm1, ymmword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("62F17C4851CA" , vsqrtps(zmm1, zmm2));
+ TEST_INSTRUCTION("62F17C48514C1A02" , vsqrtps(zmm1, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("62F17C48514C1A02" , vsqrtps(zmm1, zmmword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("C5EB51CB" , vsqrtsd(xmm1, xmm2, xmm3));
+ TEST_INSTRUCTION("C5EB518C2B80000000" , vsqrtsd(xmm1, xmm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C5EB518C2B80000000" , vsqrtsd(xmm1, xmm2, qword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C5EA51CB" , vsqrtss(xmm1, xmm2, xmm3));
+ TEST_INSTRUCTION("C5EA518C2B80000000" , vsqrtss(xmm1, xmm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C5EA518C2B80000000" , vsqrtss(xmm1, xmm2, dword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C5F8AE9C1180000000" , vstmxcsr(ptr(rcx, rdx, 0, 128)));
+ TEST_INSTRUCTION("C5F8AE9C1180000000" , vstmxcsr(dword_ptr(rcx, rdx, 0, 128)));
+ TEST_INSTRUCTION("C5E95CCB" , vsubpd(xmm1, xmm2, xmm3));
+ TEST_INSTRUCTION("C5E95C8C2B80000000" , vsubpd(xmm1, xmm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C5E95C8C2B80000000" , vsubpd(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C5ED5CCB" , vsubpd(ymm1, ymm2, ymm3));
+ TEST_INSTRUCTION("C5ED5C8C2B80000000" , vsubpd(ymm1, ymm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C5ED5C8C2B80000000" , vsubpd(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F1ED485CCB" , vsubpd(zmm1, zmm2, zmm3));
+ TEST_INSTRUCTION("62F1ED485C4C2B02" , vsubpd(zmm1, zmm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F1ED485C4C2B02" , vsubpd(zmm1, zmm2, zmmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C5E85CCB" , vsubps(xmm1, xmm2, xmm3));
+ TEST_INSTRUCTION("C5E85C8C2B80000000" , vsubps(xmm1, xmm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C5E85C8C2B80000000" , vsubps(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C5EC5CCB" , vsubps(ymm1, ymm2, ymm3));
+ TEST_INSTRUCTION("C5EC5C8C2B80000000" , vsubps(ymm1, ymm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C5EC5C8C2B80000000" , vsubps(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F16C485CCB" , vsubps(zmm1, zmm2, zmm3));
+ TEST_INSTRUCTION("62F16C485C4C2B02" , vsubps(zmm1, zmm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F16C485C4C2B02" , vsubps(zmm1, zmm2, zmmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C5EB5CCB" , vsubsd(xmm1, xmm2, xmm3));
+ TEST_INSTRUCTION("C5EB5C8C2B80000000" , vsubsd(xmm1, xmm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C5EB5C8C2B80000000" , vsubsd(xmm1, xmm2, qword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C5EA5CCB" , vsubss(xmm1, xmm2, xmm3));
+ TEST_INSTRUCTION("C5EA5C8C2B80000000" , vsubss(xmm1, xmm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C5EA5C8C2B80000000" , vsubss(xmm1, xmm2, dword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C4E2790FCA" , vtestpd(xmm1, xmm2));
+ TEST_INSTRUCTION("C4E2790F8C1A80000000" , vtestpd(xmm1, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("C4E2790F8C1A80000000" , vtestpd(xmm1, xmmword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("C4E27D0FCA" , vtestpd(ymm1, ymm2));
+ TEST_INSTRUCTION("C4E27D0F8C1A80000000" , vtestpd(ymm1, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("C4E27D0F8C1A80000000" , vtestpd(ymm1, ymmword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("C4E2790ECA" , vtestps(xmm1, xmm2));
+ TEST_INSTRUCTION("C4E2790E8C1A80000000" , vtestps(xmm1, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("C4E2790E8C1A80000000" , vtestps(xmm1, xmmword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("C4E27D0ECA" , vtestps(ymm1, ymm2));
+ TEST_INSTRUCTION("C4E27D0E8C1A80000000" , vtestps(ymm1, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("C4E27D0E8C1A80000000" , vtestps(ymm1, ymmword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("C5F92ECA" , vucomisd(xmm1, xmm2));
+ TEST_INSTRUCTION("C5F92E8C1A80000000" , vucomisd(xmm1, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("C5F92E8C1A80000000" , vucomisd(xmm1, qword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("C5F82ECA" , vucomiss(xmm1, xmm2));
+ TEST_INSTRUCTION("C5F82E8C1A80000000" , vucomiss(xmm1, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("C5F82E8C1A80000000" , vucomiss(xmm1, dword_ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("C5E915CB" , vunpckhpd(xmm1, xmm2, xmm3));
+ TEST_INSTRUCTION("C5E9158C2B80000000" , vunpckhpd(xmm1, xmm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C5E9158C2B80000000" , vunpckhpd(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C5ED15CB" , vunpckhpd(ymm1, ymm2, ymm3));
+ TEST_INSTRUCTION("C5ED158C2B80000000" , vunpckhpd(ymm1, ymm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C5ED158C2B80000000" , vunpckhpd(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F1ED4815CB" , vunpckhpd(zmm1, zmm2, zmm3));
+ TEST_INSTRUCTION("62F1ED48154C2B02" , vunpckhpd(zmm1, zmm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F1ED48154C2B02" , vunpckhpd(zmm1, zmm2, zmmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C5E815CB" , vunpckhps(xmm1, xmm2, xmm3));
+ TEST_INSTRUCTION("C5E8158C2B80000000" , vunpckhps(xmm1, xmm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C5E8158C2B80000000" , vunpckhps(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C5EC15CB" , vunpckhps(ymm1, ymm2, ymm3));
+ TEST_INSTRUCTION("C5EC158C2B80000000" , vunpckhps(ymm1, ymm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C5EC158C2B80000000" , vunpckhps(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F16C4815CB" , vunpckhps(zmm1, zmm2, zmm3));
+ TEST_INSTRUCTION("62F16C48154C2B02" , vunpckhps(zmm1, zmm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F16C48154C2B02" , vunpckhps(zmm1, zmm2, zmmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C5E914CB" , vunpcklpd(xmm1, xmm2, xmm3));
+ TEST_INSTRUCTION("C5E9148C2B80000000" , vunpcklpd(xmm1, xmm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C5E9148C2B80000000" , vunpcklpd(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C5ED14CB" , vunpcklpd(ymm1, ymm2, ymm3));
+ TEST_INSTRUCTION("C5ED148C2B80000000" , vunpcklpd(ymm1, ymm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C5ED148C2B80000000" , vunpcklpd(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F1ED4814CB" , vunpcklpd(zmm1, zmm2, zmm3));
+ TEST_INSTRUCTION("62F1ED48144C2B02" , vunpcklpd(zmm1, zmm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F1ED48144C2B02" , vunpcklpd(zmm1, zmm2, zmmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C5E814CB" , vunpcklps(xmm1, xmm2, xmm3));
+ TEST_INSTRUCTION("C5E8148C2B80000000" , vunpcklps(xmm1, xmm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C5E8148C2B80000000" , vunpcklps(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C5EC14CB" , vunpcklps(ymm1, ymm2, ymm3));
+ TEST_INSTRUCTION("C5EC148C2B80000000" , vunpcklps(ymm1, ymm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C5EC148C2B80000000" , vunpcklps(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F16C4814CB" , vunpcklps(zmm1, zmm2, zmm3));
+ TEST_INSTRUCTION("62F16C48144C2B02" , vunpcklps(zmm1, zmm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F16C48144C2B02" , vunpcklps(zmm1, zmm2, zmmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C5E957CB" , vxorpd(xmm1, xmm2, xmm3));
+ TEST_INSTRUCTION("C5E9578C2B80000000" , vxorpd(xmm1, xmm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C5E9578C2B80000000" , vxorpd(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C5ED57CB" , vxorpd(ymm1, ymm2, ymm3));
+ TEST_INSTRUCTION("C5ED578C2B80000000" , vxorpd(ymm1, ymm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C5ED578C2B80000000" , vxorpd(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F1ED4857CB" , vxorpd(zmm1, zmm2, zmm3));
+ TEST_INSTRUCTION("62F1ED48574C2B02" , vxorpd(zmm1, zmm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F1ED48574C2B02" , vxorpd(zmm1, zmm2, zmmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C5E857CB" , vxorps(xmm1, xmm2, xmm3));
+ TEST_INSTRUCTION("C5E8578C2B80000000" , vxorps(xmm1, xmm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C5E8578C2B80000000" , vxorps(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C5EC57CB" , vxorps(ymm1, ymm2, ymm3));
+ TEST_INSTRUCTION("C5EC578C2B80000000" , vxorps(ymm1, ymm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C5EC578C2B80000000" , vxorps(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F16C4857CB" , vxorps(zmm1, zmm2, zmm3));
+ TEST_INSTRUCTION("62F16C48574C2B02" , vxorps(zmm1, zmm2, ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("62F16C48574C2B02" , vxorps(zmm1, zmm2, zmmword_ptr(rbx, rbp, 0, 128)));
+ TEST_INSTRUCTION("C5FC77" , vzeroall());
+ TEST_INSTRUCTION("C5F877" , vzeroupper());
+}
+
+static void ASMJIT_NOINLINE testX64AssemblerAVX512_FP16(AssemblerTester<x86::Assembler>& tester) noexcept {
+ using namespace x86;
+
+ TEST_INSTRUCTION("62F5560810F4" , vmovsh(xmm6, xmm5, xmm4));
+ TEST_INSTRUCTION("62F57E0F10B4F400000010" , k(k7).vmovsh(xmm6, word_ptr(rsp, rsi, 3, 268435456)));
+ TEST_INSTRUCTION("62F57E081031" , vmovsh(xmm6, word_ptr(rcx)));
+ TEST_INSTRUCTION("62F57E0810717F" , vmovsh(xmm6, word_ptr(rcx, 254)));
+ TEST_INSTRUCTION("62F57E8F107280" , k(k7).z().vmovsh(xmm6, word_ptr(rdx, -256)));
+ TEST_INSTRUCTION("62F57E0F11B4F400000010" , k(k7).vmovsh(word_ptr(rsp, rsi, 3, 268435456), xmm6));
+ TEST_INSTRUCTION("62F57E081131" , vmovsh(word_ptr(rcx), xmm6));
+ TEST_INSTRUCTION("62F57E0811717F" , vmovsh(word_ptr(rcx, 254), xmm6));
+ TEST_INSTRUCTION("62F57E0F117280" , k(k7).vmovsh(word_ptr(rdx, -256), xmm6));
+ TEST_INSTRUCTION("62F57D086EF2" , vmovw(xmm6, edx));
+ TEST_INSTRUCTION("62F57D087EF2" , vmovw(edx, xmm6));
+ TEST_INSTRUCTION("62F57D086EB4F400000010" , vmovw(xmm6, word_ptr(rsp, rsi, 3, 268435456)));
+ TEST_INSTRUCTION("62F57D086E31" , vmovw(xmm6, word_ptr(rcx)));
+ TEST_INSTRUCTION("62F57D086E717F" , vmovw(xmm6, word_ptr(rcx, 254)));
+ TEST_INSTRUCTION("62F57D086E717F" , vmovw(xmm6, word_ptr(rcx, 254)));
+ TEST_INSTRUCTION("62F57D086E7280" , vmovw(xmm6, word_ptr(rdx, -256)));
+ TEST_INSTRUCTION("62F57D087EB4F400000010" , vmovw(word_ptr(rsp, esi, 3, 268435456), xmm6));
+ TEST_INSTRUCTION("62F57D087E31" , vmovw(word_ptr(rcx), xmm6));
+ TEST_INSTRUCTION("62F57D087E717F" , vmovw(word_ptr(rcx, 254), xmm6));
+ TEST_INSTRUCTION("62F57D087E7280" , vmovw(word_ptr(rdx, -256), xmm6));
+}
+
+// Tests generated from 'llvm/test/MC/X86/intel-syntax-avx512.s' file.
+static void ASMJIT_NOINLINE testX64AssemblerAVX512_LLVM(AssemblerTester<x86::Assembler>& tester) noexcept {
+ using namespace x86;
+
+ TEST_INSTRUCTION("62F174485808" , vaddps(zmm1, zmm1, zmmword_ptr(rax)));
+ TEST_INSTRUCTION("62F1F54858CA" , vaddpd(zmm1, zmm1, zmm2));
+ TEST_INSTRUCTION("62F1F54D58CA" , k(k5).vaddpd(zmm1, zmm1, zmm2));
+ TEST_INSTRUCTION("62F1F5CD58CA" , k(k5).z().vaddpd(zmm1, zmm1, zmm2));
+ TEST_INSTRUCTION("62F1F5CD58CA" , k(k5).z().vaddpd(zmm1, zmm1, zmm2));
+ TEST_INSTRUCTION("62F1F51858CA" , rn_sae().vaddpd(zmm1, zmm1, zmm2));
+ TEST_INSTRUCTION("62F1F55858CA" , ru_sae().vaddpd(zmm1, zmm1, zmm2));
+ TEST_INSTRUCTION("62F1F53858CA" , rd_sae().vaddpd(zmm1, zmm1, zmm2));
+ TEST_INSTRUCTION("62F1F57858CA" , rz_sae().vaddpd(zmm1, zmm1, zmm2));
+ TEST_INSTRUCTION("62919D48C2D2AB" , vcmppd(k2, zmm12, zmm26, 171));
+ TEST_INSTRUCTION("62919D4BC2D2AB" , k(k3).vcmppd(k2, zmm12, zmm26, 171));
+ TEST_INSTRUCTION("62919D18C2D2AB" , sae().vcmppd(k2, zmm12, zmm26, 171));
+ TEST_INSTRUCTION("62919D48C2D27B" , vcmppd(k2, zmm12, zmm26, 123));
+ TEST_INSTRUCTION("62919D18C2D27B" , sae().vcmppd(k2, zmm12, zmm26, 123));
+ TEST_INSTRUCTION("62F19D48C2117B" , vcmppd(k2, zmm12, zmmword_ptr(rcx), 123));
+ TEST_INSTRUCTION("62B19D48C294F0230100007B" , vcmppd(k2, zmm12, zmmword_ptr(rax, r14, 3, 291), 123));
+ TEST_INSTRUCTION("62F19D58C2117B" , vcmppd(k2, zmm12, qword_ptr(rcx)._1to8(), 123));
+ TEST_INSTRUCTION("62F19D48C2527F7B" , vcmppd(k2, zmm12, zmmword_ptr(rdx, 8128), 123));
+ TEST_INSTRUCTION("62F19D48C292002000007B" , vcmppd(k2, zmm12, zmmword_ptr(rdx, 8192), 123));
+ TEST_INSTRUCTION("62F19D48C252807B" , vcmppd(k2, zmm12, zmmword_ptr(rdx, -8192), 123));
+ TEST_INSTRUCTION("62F19D48C292C0DFFFFF7B" , vcmppd(k2, zmm12, zmmword_ptr(rdx, -8256), 123));
+ TEST_INSTRUCTION("62F19D58C2527F7B" , vcmppd(k2, zmm12, qword_ptr(rdx, 1016)._1to8(), 123));
+ TEST_INSTRUCTION("62F19D58C292000400007B" , vcmppd(k2, zmm12, qword_ptr(rdx, 1024)._1to8(), 123));
+ TEST_INSTRUCTION("62F19D58C252807B" , vcmppd(k2, zmm12, qword_ptr(rdx, -1024)._1to8(), 123));
+ TEST_INSTRUCTION("62F19D58C292F8FBFFFF7B" , vcmppd(k2, zmm12, qword_ptr(rdx, -1032)._1to8(), 123));
+ TEST_INSTRUCTION("62B17440C2D6AB" , vcmpps(k2, zmm17, zmm22, 171));
+ TEST_INSTRUCTION("62B17443C2D6AB" , k(k3).vcmpps(k2, zmm17, zmm22, 171));
+ TEST_INSTRUCTION("62B17410C2D6AB" , sae().vcmpps(k2, zmm17, zmm22, 171));
+ TEST_INSTRUCTION("62B17440C2D67B" , vcmpps(k2, zmm17, zmm22, 123));
+ TEST_INSTRUCTION("62B17410C2D67B" , sae().vcmpps(k2, zmm17, zmm22, 123));
+ TEST_INSTRUCTION("62F17440C2117B" , vcmpps(k2, zmm17, zmmword_ptr(rcx), 123));
+ TEST_INSTRUCTION("62B17440C294F0230100007B" , vcmpps(k2, zmm17, zmmword_ptr(rax, r14, 3, 291), 123));
+ TEST_INSTRUCTION("62F17450C2117B" , vcmpps(k2, zmm17, dword_ptr(rcx)._1to16(), 123));
+ TEST_INSTRUCTION("62F17440C2527F7B" , vcmpps(k2, zmm17, zmmword_ptr(rdx, 8128), 123));
+ TEST_INSTRUCTION("62F17440C292002000007B" , vcmpps(k2, zmm17, zmmword_ptr(rdx, 8192), 123));
+ TEST_INSTRUCTION("62F17440C252807B" , vcmpps(k2, zmm17, zmmword_ptr(rdx, -8192), 123));
+ TEST_INSTRUCTION("62F17440C292C0DFFFFF7B" , vcmpps(k2, zmm17, zmmword_ptr(rdx, -8256), 123));
+ TEST_INSTRUCTION("62F17450C2527F7B" , vcmpps(k2, zmm17, dword_ptr(rdx, 508)._1to16(), 123));
+ TEST_INSTRUCTION("62F17450C292000200007B" , vcmpps(k2, zmm17, dword_ptr(rdx, 512)._1to16(), 123));
+ TEST_INSTRUCTION("62F17450C252807B" , vcmpps(k2, zmm17, dword_ptr(rdx, -512)._1to16(), 123));
+ TEST_INSTRUCTION("62F17450C292FCFDFFFF7B" , vcmpps(k2, zmm17, dword_ptr(rdx, -516)._1to16(), 123));
+ TEST_INSTRUCTION("62136D0055FCAB" , vfixupimmss(xmm15, xmm18, xmm28, 171));
+ TEST_INSTRUCTION("62136D0555FCAB" , k(k5).vfixupimmss(xmm15, xmm18, xmm28, 171));
+ TEST_INSTRUCTION("62136D8555FCAB" , k(k5).z().vfixupimmss(xmm15, xmm18, xmm28, 171));
+ TEST_INSTRUCTION("62136D1055FCAB" , sae().vfixupimmss(xmm15, xmm18, xmm28, 171));
+ TEST_INSTRUCTION("62136D0055FC7B" , vfixupimmss(xmm15, xmm18, xmm28, 123));
+ TEST_INSTRUCTION("62136D1055FC7B" , sae().vfixupimmss(xmm15, xmm18, xmm28, 123));
+ TEST_INSTRUCTION("62736D0055397B" , vfixupimmss(xmm15, xmm18, dword_ptr(rcx), 123));
+ TEST_INSTRUCTION("62336D0055BCF0230100007B" , vfixupimmss(xmm15, xmm18, dword_ptr(rax, r14, 3, 291), 123));
+ TEST_INSTRUCTION("62736D00557A7F7B" , vfixupimmss(xmm15, xmm18, dword_ptr(rdx, 508), 123));
+ TEST_INSTRUCTION("62736D0055BA000200007B" , vfixupimmss(xmm15, xmm18, dword_ptr(rdx, 512), 123));
+ TEST_INSTRUCTION("62736D00557A807B" , vfixupimmss(xmm15, xmm18, dword_ptr(rdx, -512), 123));
+ TEST_INSTRUCTION("62736D0055BAFCFDFFFF7B" , vfixupimmss(xmm15, xmm18, dword_ptr(rdx, -516), 123));
+ TEST_INSTRUCTION("6273AD0055EDAB" , vfixupimmsd(xmm13, xmm26, xmm5, 171));
+ TEST_INSTRUCTION("6273AD0655EDAB" , k(k6).vfixupimmsd(xmm13, xmm26, xmm5, 171));
+ TEST_INSTRUCTION("6273AD8655EDAB" , k(k6).z().vfixupimmsd(xmm13, xmm26, xmm5, 171));
+ TEST_INSTRUCTION("6273AD1055EDAB" , sae().vfixupimmsd(xmm13, xmm26, xmm5, 171));
+ TEST_INSTRUCTION("6273AD0055ED7B" , vfixupimmsd(xmm13, xmm26, xmm5, 123));
+ TEST_INSTRUCTION("6273AD1055ED7B" , sae().vfixupimmsd(xmm13, xmm26, xmm5, 123));
+ TEST_INSTRUCTION("6273AD0055297B" , vfixupimmsd(xmm13, xmm26, qword_ptr(rcx), 123));
+ TEST_INSTRUCTION("6233AD0055ACF0230100007B" , vfixupimmsd(xmm13, xmm26, qword_ptr(rax, r14, 3, 291), 123));
+ TEST_INSTRUCTION("6273AD00556A7F7B" , vfixupimmsd(xmm13, xmm26, qword_ptr(rdx, 1016), 123));
+ TEST_INSTRUCTION("6273AD0055AA000400007B" , vfixupimmsd(xmm13, xmm26, qword_ptr(rdx, 1024), 123));
+ TEST_INSTRUCTION("6273AD00556A807B" , vfixupimmsd(xmm13, xmm26, qword_ptr(rdx, -1024), 123));
+ TEST_INSTRUCTION("6273AD0055AAF8FBFFFF7B" , vfixupimmsd(xmm13, xmm26, qword_ptr(rdx, -1032), 123));
+ TEST_INSTRUCTION("62E1FD082F39" , vcomisd(xmm23, qword_ptr(rcx)));
+ TEST_INSTRUCTION("62E17C082F01" , vcomiss(xmm16, dword_ptr(rcx)));
+ TEST_INSTRUCTION("62717E0A1129" , k(k2).vmovss(dword_ptr(rcx), xmm13));
+ TEST_INSTRUCTION("C4217A11ACF034120000" , vmovss(dword_ptr(rax, r14, 3, 4660), xmm13));
+ TEST_INSTRUCTION("C57A11AAFC010000" , vmovss(dword_ptr(rdx, 508), xmm13));
+ TEST_INSTRUCTION("C57A11AA00020000" , vmovss(dword_ptr(rdx, 512), xmm13));
+ TEST_INSTRUCTION("C57A11AA00FEFFFF" , vmovss(dword_ptr(rdx, -512), xmm13));
+ TEST_INSTRUCTION("C57A11AAFCFDFFFF" , vmovss(dword_ptr(rdx, -516), xmm13));
+ TEST_INSTRUCTION("C5FA11AAFC010000" , vmovss(dword_ptr(rdx, 508), xmm5));
+ TEST_INSTRUCTION("C5FA11AA00020000" , vmovss(dword_ptr(rdx, 512), xmm5));
+ TEST_INSTRUCTION("C5FA11AA00FEFFFF" , vmovss(dword_ptr(rdx, -512), xmm5));
+ TEST_INSTRUCTION("C5FA11AAFCFDFFFF" , vmovss(dword_ptr(rdx, -516), xmm5));
+ TEST_INSTRUCTION("C57A1129" , vmovss(dword_ptr(rcx), xmm13));
+ TEST_INSTRUCTION("C5FA1011" , vmovss(xmm2, dword_ptr(rcx)));
+ TEST_INSTRUCTION("62F17E0C1011" , k(k4).vmovss(xmm2, dword_ptr(rcx)));
+ TEST_INSTRUCTION("62F17E8C1011" , k(k4).z().vmovss(xmm2, dword_ptr(rcx)));
+ TEST_INSTRUCTION("6261FF081009" , vmovsd(xmm25, qword_ptr(rcx)));
+ TEST_INSTRUCTION("6261FF0B1009" , k(k3).vmovsd(xmm25, qword_ptr(rcx)));
+ TEST_INSTRUCTION("6261FF8B1009" , k(k3).z().vmovsd(xmm25, qword_ptr(rcx)));
+ TEST_INSTRUCTION("6221FF08108CF023010000" , vmovsd(xmm25, qword_ptr(rax, r14, 3, 291)));
+ TEST_INSTRUCTION("6261FF08104A7F" , vmovsd(xmm25, qword_ptr(rdx, 1016)));
+ TEST_INSTRUCTION("6261FF08108A00040000" , vmovsd(xmm25, qword_ptr(rdx, 1024)));
+ TEST_INSTRUCTION("6261FF08104A80" , vmovsd(xmm25, qword_ptr(rdx, -1024)));
+ TEST_INSTRUCTION("6261FF08108AF8FBFFFF" , vmovsd(xmm25, qword_ptr(rdx, -1032)));
+ TEST_INSTRUCTION("6271A54058C6" , vaddpd(zmm8, zmm27, zmm6));
+ TEST_INSTRUCTION("6271A54758C6" , k(k7).vaddpd(zmm8, zmm27, zmm6));
+ TEST_INSTRUCTION("6271A5C758C6" , k(k7).z().vaddpd(zmm8, zmm27, zmm6));
+ TEST_INSTRUCTION("6271A51058C6" , rn_sae().vaddpd(zmm8, zmm27, zmm6));
+ TEST_INSTRUCTION("6271A55058C6" , ru_sae().vaddpd(zmm8, zmm27, zmm6));
+ TEST_INSTRUCTION("6271A53058C6" , rd_sae().vaddpd(zmm8, zmm27, zmm6));
+ TEST_INSTRUCTION("6271A57058C6" , rz_sae().vaddpd(zmm8, zmm27, zmm6));
+ TEST_INSTRUCTION("6271A5405801" , vaddpd(zmm8, zmm27, zmmword_ptr(rcx)));
+ TEST_INSTRUCTION("6231A5405884F023010000" , vaddpd(zmm8, zmm27, zmmword_ptr(rax, r14, 3, 291)));
+ TEST_INSTRUCTION("6271A5505801" , vaddpd(zmm8, zmm27, qword_ptr(rcx)._1to8()));
+ TEST_INSTRUCTION("6271A54058427F" , vaddpd(zmm8, zmm27, zmmword_ptr(rdx, 8128)));
+ TEST_INSTRUCTION("6271A540588200200000" , vaddpd(zmm8, zmm27, zmmword_ptr(rdx, 8192)));
+ TEST_INSTRUCTION("6271A540584280" , vaddpd(zmm8, zmm27, zmmword_ptr(rdx, -8192)));
+ TEST_INSTRUCTION("6271A5405882C0DFFFFF" , vaddpd(zmm8, zmm27, zmmword_ptr(rdx, -8256)));
+ TEST_INSTRUCTION("6271A55058427F" , vaddpd(zmm8, zmm27, qword_ptr(rdx, 1016)._1to8()));
+ TEST_INSTRUCTION("6271A550588200040000" , vaddpd(zmm8, zmm27, qword_ptr(rdx, 1024)._1to8()));
+ TEST_INSTRUCTION("6271A550584280" , vaddpd(zmm8, zmm27, qword_ptr(rdx, -1024)._1to8()));
+ TEST_INSTRUCTION("6271A5505882F8FBFFFF" , vaddpd(zmm8, zmm27, qword_ptr(rdx, -1032)._1to8()));
+ TEST_INSTRUCTION("62E1144858D2" , vaddps(zmm18, zmm13, zmm2));
+ TEST_INSTRUCTION("62E1144C58D2" , k(k4).vaddps(zmm18, zmm13, zmm2));
+ TEST_INSTRUCTION("62E114CC58D2" , k(k4).z().vaddps(zmm18, zmm13, zmm2));
+ TEST_INSTRUCTION("62E1141858D2" , rn_sae().vaddps(zmm18, zmm13, zmm2));
+ TEST_INSTRUCTION("62E1145858D2" , ru_sae().vaddps(zmm18, zmm13, zmm2));
+ TEST_INSTRUCTION("62E1143858D2" , rd_sae().vaddps(zmm18, zmm13, zmm2));
+ TEST_INSTRUCTION("62E1147858D2" , rz_sae().vaddps(zmm18, zmm13, zmm2));
+ TEST_INSTRUCTION("62E114485811" , vaddps(zmm18, zmm13, zmmword_ptr(rcx)));
+ TEST_INSTRUCTION("62A114485894F023010000" , vaddps(zmm18, zmm13, zmmword_ptr(rax, r14, 3, 291)));
+ TEST_INSTRUCTION("62E114585811" , vaddps(zmm18, zmm13, dword_ptr(rcx)._1to16()));
+ TEST_INSTRUCTION("62E1144858527F" , vaddps(zmm18, zmm13, zmmword_ptr(rdx, 8128)));
+ TEST_INSTRUCTION("62E11448589200200000" , vaddps(zmm18, zmm13, zmmword_ptr(rdx, 8192)));
+ TEST_INSTRUCTION("62E11448585280" , vaddps(zmm18, zmm13, zmmword_ptr(rdx, -8192)));
+ TEST_INSTRUCTION("62E114485892C0DFFFFF" , vaddps(zmm18, zmm13, zmmword_ptr(rdx, -8256)));
+ TEST_INSTRUCTION("62E1145858527F" , vaddps(zmm18, zmm13, dword_ptr(rdx, 508)._1to16()));
+ TEST_INSTRUCTION("62E11458589200020000" , vaddps(zmm18, zmm13, dword_ptr(rdx, 512)._1to16()));
+ TEST_INSTRUCTION("62E11458585280" , vaddps(zmm18, zmm13, dword_ptr(rdx, -512)._1to16()));
+ TEST_INSTRUCTION("62E114585892FCFDFFFF" , vaddps(zmm18, zmm13, dword_ptr(rdx, -516)._1to16()));
+ TEST_INSTRUCTION("62D1F70058D8" , vaddsd(xmm3, xmm17, xmm8));
+ TEST_INSTRUCTION("62D1F70358D8" , k(k3).vaddsd(xmm3, xmm17, xmm8));
+ TEST_INSTRUCTION("62D1F78358D8" , k(k3).z().vaddsd(xmm3, xmm17, xmm8));
+ TEST_INSTRUCTION("62D1F71058D8" , rn_sae().vaddsd(xmm3, xmm17, xmm8));
+ TEST_INSTRUCTION("62D1F75058D8" , ru_sae().vaddsd(xmm3, xmm17, xmm8));
+ TEST_INSTRUCTION("62D1F73058D8" , rd_sae().vaddsd(xmm3, xmm17, xmm8));
+ TEST_INSTRUCTION("62D1F77058D8" , rz_sae().vaddsd(xmm3, xmm17, xmm8));
+ TEST_INSTRUCTION("62F1F7005819" , vaddsd(xmm3, xmm17, qword_ptr(rcx)));
+ TEST_INSTRUCTION("62B1F700589CF023010000" , vaddsd(xmm3, xmm17, qword_ptr(rax, r14, 3, 291)));
+ TEST_INSTRUCTION("62F1F700585A7F" , vaddsd(xmm3, xmm17, qword_ptr(rdx, 1016)));
+ TEST_INSTRUCTION("62F1F700589A00040000" , vaddsd(xmm3, xmm17, qword_ptr(rdx, 1024)));
+ TEST_INSTRUCTION("62F1F700585A80" , vaddsd(xmm3, xmm17, qword_ptr(rdx, -1024)));
+ TEST_INSTRUCTION("62F1F700589AF8FBFFFF" , vaddsd(xmm3, xmm17, qword_ptr(rdx, -1032)));
+ TEST_INSTRUCTION("62B1560858FB" , vaddss(xmm7, xmm5, xmm19));
+ TEST_INSTRUCTION("62B1560A58FB" , k(k2).vaddss(xmm7, xmm5, xmm19));
+ TEST_INSTRUCTION("62B1568A58FB" , k(k2).z().vaddss(xmm7, xmm5, xmm19));
+ TEST_INSTRUCTION("62B1561858FB" , rn_sae().vaddss(xmm7, xmm5, xmm19));
+ TEST_INSTRUCTION("62B1565858FB" , ru_sae().vaddss(xmm7, xmm5, xmm19));
+ TEST_INSTRUCTION("62B1563858FB" , rd_sae().vaddss(xmm7, xmm5, xmm19));
+ TEST_INSTRUCTION("62B1567858FB" , rz_sae().vaddss(xmm7, xmm5, xmm19));
+ TEST_INSTRUCTION("C5D25839" , vaddss(xmm7, xmm5, dword_ptr(rcx)));
+ TEST_INSTRUCTION("C4A15258BCF023010000" , vaddss(xmm7, xmm5, dword_ptr(rax, r14, 3, 291)));
+ TEST_INSTRUCTION("C5D258BAFC010000" , vaddss(xmm7, xmm5, dword_ptr(rdx, 508)));
+ TEST_INSTRUCTION("C5D258BA00020000" , vaddss(xmm7, xmm5, dword_ptr(rdx, 512)));
+ TEST_INSTRUCTION("C5D258BA00FEFFFF" , vaddss(xmm7, xmm5, dword_ptr(rdx, -512)));
+ TEST_INSTRUCTION("C5D258BAFCFDFFFF" , vaddss(xmm7, xmm5, dword_ptr(rdx, -516)));
+ TEST_INSTRUCTION("62136D4003CAAB" , valignd(zmm9, zmm18, zmm26, 171));
+ TEST_INSTRUCTION("62136D4403CAAB" , k(k4).valignd(zmm9, zmm18, zmm26, 171));
+ TEST_INSTRUCTION("62136DC403CAAB" , k(k4).z().valignd(zmm9, zmm18, zmm26, 171));
+ TEST_INSTRUCTION("62136D4003CA7B" , valignd(zmm9, zmm18, zmm26, 123));
+ TEST_INSTRUCTION("62736D4003097B" , valignd(zmm9, zmm18, zmmword_ptr(rcx), 123));
+ TEST_INSTRUCTION("62336D40038CF0230100007B" , valignd(zmm9, zmm18, zmmword_ptr(rax, r14, 3, 291), 123));
+ TEST_INSTRUCTION("62736D5003097B" , valignd(zmm9, zmm18, dword_ptr(rcx)._1to16(), 123));
+ TEST_INSTRUCTION("62736D40034A7F7B" , valignd(zmm9, zmm18, zmmword_ptr(rdx, 8128), 123));
+ TEST_INSTRUCTION("62736D40038A002000007B" , valignd(zmm9, zmm18, zmmword_ptr(rdx, 8192), 123));
+ TEST_INSTRUCTION("62736D40034A807B" , valignd(zmm9, zmm18, zmmword_ptr(rdx, -8192), 123));
+ TEST_INSTRUCTION("62736D40038AC0DFFFFF7B" , valignd(zmm9, zmm18, zmmword_ptr(rdx, -8256), 123));
+ TEST_INSTRUCTION("62736D50034A7F7B" , valignd(zmm9, zmm18, dword_ptr(rdx, 508)._1to16(), 123));
+ TEST_INSTRUCTION("62736D50038A000200007B" , valignd(zmm9, zmm18, dword_ptr(rdx, 512)._1to16(), 123));
+ TEST_INSTRUCTION("62736D50034A807B" , valignd(zmm9, zmm18, dword_ptr(rdx, -512)._1to16(), 123));
+ TEST_INSTRUCTION("62736D50038AFCFDFFFF7B" , valignd(zmm9, zmm18, dword_ptr(rdx, -516)._1to16(), 123));
+ TEST_INSTRUCTION("62529D4065C4" , vblendmpd(zmm8, zmm28, zmm12));
+ TEST_INSTRUCTION("62529D4165C4" , k(k1).vblendmpd(zmm8, zmm28, zmm12));
+ TEST_INSTRUCTION("62529DC165C4" , k(k1).z().vblendmpd(zmm8, zmm28, zmm12));
+ TEST_INSTRUCTION("62729D406501" , vblendmpd(zmm8, zmm28, zmmword_ptr(rcx)));
+ TEST_INSTRUCTION("62329D406584F023010000" , vblendmpd(zmm8, zmm28, zmmword_ptr(rax, r14, 3, 291)));
+ TEST_INSTRUCTION("62729D506501" , vblendmpd(zmm8, zmm28, qword_ptr(rcx)._1to8()));
+ TEST_INSTRUCTION("62729D4065427F" , vblendmpd(zmm8, zmm28, zmmword_ptr(rdx, 8128)));
+ TEST_INSTRUCTION("62729D40658200200000" , vblendmpd(zmm8, zmm28, zmmword_ptr(rdx, 8192)));
+ TEST_INSTRUCTION("62729D40654280" , vblendmpd(zmm8, zmm28, zmmword_ptr(rdx, -8192)));
+ TEST_INSTRUCTION("62729D406582C0DFFFFF" , vblendmpd(zmm8, zmm28, zmmword_ptr(rdx, -8256)));
+ TEST_INSTRUCTION("62729D5065427F" , vblendmpd(zmm8, zmm28, qword_ptr(rdx, 1016)._1to8()));
+ TEST_INSTRUCTION("62729D50658200040000" , vblendmpd(zmm8, zmm28, qword_ptr(rdx, 1024)._1to8()));
+ TEST_INSTRUCTION("62729D50654280" , vblendmpd(zmm8, zmm28, qword_ptr(rdx, -1024)._1to8()));
+ TEST_INSTRUCTION("62729D506582F8FBFFFF" , vblendmpd(zmm8, zmm28, qword_ptr(rdx, -1032)._1to8()));
+ TEST_INSTRUCTION("62721D4065FC" , vblendmps(zmm15, zmm28, zmm4));
+ TEST_INSTRUCTION("62721D4365FC" , k(k3).vblendmps(zmm15, zmm28, zmm4));
+ TEST_INSTRUCTION("62721DC365FC" , k(k3).z().vblendmps(zmm15, zmm28, zmm4));
+ TEST_INSTRUCTION("62721D406539" , vblendmps(zmm15, zmm28, zmmword_ptr(rcx)));
+ TEST_INSTRUCTION("62321D4065BCF023010000" , vblendmps(zmm15, zmm28, zmmword_ptr(rax, r14, 3, 291)));
+ TEST_INSTRUCTION("62721D506539" , vblendmps(zmm15, zmm28, dword_ptr(rcx)._1to16()));
+ TEST_INSTRUCTION("62721D40657A7F" , vblendmps(zmm15, zmm28, zmmword_ptr(rdx, 8128)));
+ TEST_INSTRUCTION("62721D4065BA00200000" , vblendmps(zmm15, zmm28, zmmword_ptr(rdx, 8192)));
+ TEST_INSTRUCTION("62721D40657A80" , vblendmps(zmm15, zmm28, zmmword_ptr(rdx, -8192)));
+ TEST_INSTRUCTION("62721D4065BAC0DFFFFF" , vblendmps(zmm15, zmm28, zmmword_ptr(rdx, -8256)));
+ TEST_INSTRUCTION("62721D50657A7F" , vblendmps(zmm15, zmm28, dword_ptr(rdx, 508)._1to16()));
+ TEST_INSTRUCTION("62721D5065BA00020000" , vblendmps(zmm15, zmm28, dword_ptr(rdx, 512)._1to16()));
+ TEST_INSTRUCTION("62721D50657A80" , vblendmps(zmm15, zmm28, dword_ptr(rdx, -512)._1to16()));
+ TEST_INSTRUCTION("62721D5065BAFCFDFFFF" , vblendmps(zmm15, zmm28, dword_ptr(rdx, -516)._1to16()));
+ TEST_INSTRUCTION("62F27D481A19" , vbroadcastf32x4(zmm3, xmmword_ptr(rcx)));
+ TEST_INSTRUCTION("62F27D4F1A19" , k(k7).vbroadcastf32x4(zmm3, xmmword_ptr(rcx)));
+ TEST_INSTRUCTION("62F27DCF1A19" , k(k7).z().vbroadcastf32x4(zmm3, xmmword_ptr(rcx)));
+ TEST_INSTRUCTION("62B27D481A9CF023010000" , vbroadcastf32x4(zmm3, xmmword_ptr(rax, r14, 3, 291)));
+ TEST_INSTRUCTION("62F27D481A5A7F" , vbroadcastf32x4(zmm3, xmmword_ptr(rdx, 2032)));
+ TEST_INSTRUCTION("62F27D481A9A00080000" , vbroadcastf32x4(zmm3, xmmword_ptr(rdx, 2048)));
+ TEST_INSTRUCTION("62F27D481A5A80" , vbroadcastf32x4(zmm3, xmmword_ptr(rdx, -2048)));
+ TEST_INSTRUCTION("62F27D481A9AF0F7FFFF" , vbroadcastf32x4(zmm3, xmmword_ptr(rdx, -2064)));
+ TEST_INSTRUCTION("6262FD481B09" , vbroadcastf64x4(zmm25, ymmword_ptr(rcx)));
+ TEST_INSTRUCTION("6262FD4E1B09" , k(k6).vbroadcastf64x4(zmm25, ymmword_ptr(rcx)));
+ TEST_INSTRUCTION("6262FDCE1B09" , k(k6).z().vbroadcastf64x4(zmm25, ymmword_ptr(rcx)));
+ TEST_INSTRUCTION("6222FD481B8CF023010000" , vbroadcastf64x4(zmm25, ymmword_ptr(rax, r14, 3, 291)));
+ TEST_INSTRUCTION("6262FD481B4A7F" , vbroadcastf64x4(zmm25, ymmword_ptr(rdx, 4064)));
+ TEST_INSTRUCTION("6262FD481B8A00100000" , vbroadcastf64x4(zmm25, ymmword_ptr(rdx, 4096)));
+ TEST_INSTRUCTION("6262FD481B4A80" , vbroadcastf64x4(zmm25, ymmword_ptr(rdx, -4096)));
+ TEST_INSTRUCTION("6262FD481B8AE0EFFFFF" , vbroadcastf64x4(zmm25, ymmword_ptr(rdx, -4128)));
+ TEST_INSTRUCTION("62627D485A31" , vbroadcasti32x4(zmm30, xmmword_ptr(rcx)));
+ TEST_INSTRUCTION("62627D4B5A31" , k(k3).vbroadcasti32x4(zmm30, xmmword_ptr(rcx)));
+ TEST_INSTRUCTION("62627DCB5A31" , k(k3).z().vbroadcasti32x4(zmm30, xmmword_ptr(rcx)));
+ TEST_INSTRUCTION("62227D485AB4F023010000" , vbroadcasti32x4(zmm30, xmmword_ptr(rax, r14, 3, 291)));
+ TEST_INSTRUCTION("62627D485A727F" , vbroadcasti32x4(zmm30, xmmword_ptr(rdx, 2032)));
+ TEST_INSTRUCTION("62627D485AB200080000" , vbroadcasti32x4(zmm30, xmmword_ptr(rdx, 2048)));
+ TEST_INSTRUCTION("62627D485A7280" , vbroadcasti32x4(zmm30, xmmword_ptr(rdx, -2048)));
+ TEST_INSTRUCTION("62627D485AB2F0F7FFFF" , vbroadcasti32x4(zmm30, xmmword_ptr(rdx, -2064)));
+ TEST_INSTRUCTION("6272FD485B29" , vbroadcasti64x4(zmm13, ymmword_ptr(rcx)));
+ TEST_INSTRUCTION("6272FD4C5B29" , k(k4).vbroadcasti64x4(zmm13, ymmword_ptr(rcx)));
+ TEST_INSTRUCTION("6272FDCC5B29" , k(k4).z().vbroadcasti64x4(zmm13, ymmword_ptr(rcx)));
+ TEST_INSTRUCTION("6232FD485BACF023010000" , vbroadcasti64x4(zmm13, ymmword_ptr(rax, r14, 3, 291)));
+ TEST_INSTRUCTION("6272FD485B6A7F" , vbroadcasti64x4(zmm13, ymmword_ptr(rdx, 4064)));
+ TEST_INSTRUCTION("6272FD485BAA00100000" , vbroadcasti64x4(zmm13, ymmword_ptr(rdx, 4096)));
+ TEST_INSTRUCTION("6272FD485B6A80" , vbroadcasti64x4(zmm13, ymmword_ptr(rdx, -4096)));
+ TEST_INSTRUCTION("6272FD485BAAE0EFFFFF" , vbroadcasti64x4(zmm13, ymmword_ptr(rdx, -4128)));
+ TEST_INSTRUCTION("6262FD481931" , vbroadcastsd(zmm30, qword_ptr(rcx)));
+ TEST_INSTRUCTION("6262FD4C1931" , k(k4).vbroadcastsd(zmm30, qword_ptr(rcx)));
+ TEST_INSTRUCTION("6262FDCC1931" , k(k4).z().vbroadcastsd(zmm30, qword_ptr(rcx)));
+ TEST_INSTRUCTION("6222FD4819B4F023010000" , vbroadcastsd(zmm30, qword_ptr(rax, r14, 3, 291)));
+ TEST_INSTRUCTION("6262FD4819727F" , vbroadcastsd(zmm30, qword_ptr(rdx, 1016)));
+ TEST_INSTRUCTION("6262FD4819B200040000" , vbroadcastsd(zmm30, qword_ptr(rdx, 1024)));
+ TEST_INSTRUCTION("6262FD48197280" , vbroadcastsd(zmm30, qword_ptr(rdx, -1024)));
+ TEST_INSTRUCTION("6262FD4819B2F8FBFFFF" , vbroadcastsd(zmm30, qword_ptr(rdx, -1032)));
+ TEST_INSTRUCTION("62A2FD4819EE" , vbroadcastsd(zmm21, xmm22));
+ TEST_INSTRUCTION("62A2FD4F19EE" , k(k7).vbroadcastsd(zmm21, xmm22));
+ TEST_INSTRUCTION("62A2FDCF19EE" , k(k7).z().vbroadcastsd(zmm21, xmm22));
+ TEST_INSTRUCTION("62F27D481819" , vbroadcastss(zmm3, dword_ptr(rcx)));
+ TEST_INSTRUCTION("62F27D4C1819" , k(k4).vbroadcastss(zmm3, dword_ptr(rcx)));
+ TEST_INSTRUCTION("62F27DCC1819" , k(k4).z().vbroadcastss(zmm3, dword_ptr(rcx)));
+ TEST_INSTRUCTION("62B27D48189CF023010000" , vbroadcastss(zmm3, dword_ptr(rax, r14, 3, 291)));
+ TEST_INSTRUCTION("62F27D48185A7F" , vbroadcastss(zmm3, dword_ptr(rdx, 508)));
+ TEST_INSTRUCTION("62F27D48189A00020000" , vbroadcastss(zmm3, dword_ptr(rdx, 512)));
+ TEST_INSTRUCTION("62F27D48185A80" , vbroadcastss(zmm3, dword_ptr(rdx, -512)));
+ TEST_INSTRUCTION("62F27D48189AFCFDFFFF" , vbroadcastss(zmm3, dword_ptr(rdx, -516)));
+ TEST_INSTRUCTION("62A27D4818D2" , vbroadcastss(zmm18, xmm18));
+ TEST_INSTRUCTION("62A27D4A18D2" , k(k2).vbroadcastss(zmm18, xmm18));
+ TEST_INSTRUCTION("62A27DCA18D2" , k(k2).z().vbroadcastss(zmm18, xmm18));
+ TEST_INSTRUCTION("62919D48C2D2AB" , vcmppd(k2, zmm12, zmm26, 171));
+ TEST_INSTRUCTION("62919D4BC2D2AB" , k(k3).vcmppd(k2, zmm12, zmm26, 171));
+ TEST_INSTRUCTION("62919D18C2D2AB" , sae().vcmppd(k2, zmm12, zmm26, 171));
+ TEST_INSTRUCTION("62919D48C2D27B" , vcmppd(k2, zmm12, zmm26, 123));
+ TEST_INSTRUCTION("62919D18C2D27B" , sae().vcmppd(k2, zmm12, zmm26, 123));
+ TEST_INSTRUCTION("62F19D48C2117B" , vcmppd(k2, zmm12, zmmword_ptr(rcx), 123));
+ TEST_INSTRUCTION("62B19D48C294F0230100007B" , vcmppd(k2, zmm12, zmmword_ptr(rax, r14, 3, 291), 123));
+ TEST_INSTRUCTION("62F19D58C2117B" , vcmppd(k2, zmm12, qword_ptr(rcx)._1to8(), 123));
+ TEST_INSTRUCTION("62F19D48C2527F7B" , vcmppd(k2, zmm12, zmmword_ptr(rdx, 8128), 123));
+ TEST_INSTRUCTION("62F19D48C292002000007B" , vcmppd(k2, zmm12, zmmword_ptr(rdx, 8192), 123));
+ TEST_INSTRUCTION("62F19D48C252807B" , vcmppd(k2, zmm12, zmmword_ptr(rdx, -8192), 123));
+ TEST_INSTRUCTION("62F19D48C292C0DFFFFF7B" , vcmppd(k2, zmm12, zmmword_ptr(rdx, -8256), 123));
+ TEST_INSTRUCTION("62F19D58C2527F7B" , vcmppd(k2, zmm12, qword_ptr(rdx, 1016)._1to8(), 123));
+ TEST_INSTRUCTION("62F19D58C292000400007B" , vcmppd(k2, zmm12, qword_ptr(rdx, 1024)._1to8(), 123));
+ TEST_INSTRUCTION("62F19D58C252807B" , vcmppd(k2, zmm12, qword_ptr(rdx, -1024)._1to8(), 123));
+ TEST_INSTRUCTION("62F19D58C292F8FBFFFF7B" , vcmppd(k2, zmm12, qword_ptr(rdx, -1032)._1to8(), 123));
+ TEST_INSTRUCTION("62B17440C2D6AB" , vcmpps(k2, zmm17, zmm22, 171));
+ TEST_INSTRUCTION("62B17443C2D6AB" , k(k3).vcmpps(k2, zmm17, zmm22, 171));
+ TEST_INSTRUCTION("62B17410C2D6AB" , sae().vcmpps(k2, zmm17, zmm22, 171));
+ TEST_INSTRUCTION("62B17440C2D67B" , vcmpps(k2, zmm17, zmm22, 123));
+ TEST_INSTRUCTION("62B17410C2D67B" , sae().vcmpps(k2, zmm17, zmm22, 123));
+ TEST_INSTRUCTION("62F17440C2117B" , vcmpps(k2, zmm17, zmmword_ptr(rcx), 123));
+ TEST_INSTRUCTION("62B17440C294F0230100007B" , vcmpps(k2, zmm17, zmmword_ptr(rax, r14, 3, 291), 123));
+ TEST_INSTRUCTION("62F17450C2117B" , vcmpps(k2, zmm17, dword_ptr(rcx)._1to16(), 123));
+ TEST_INSTRUCTION("62F17440C2527F7B" , vcmpps(k2, zmm17, zmmword_ptr(rdx, 8128), 123));
+ TEST_INSTRUCTION("62F17440C292002000007B" , vcmpps(k2, zmm17, zmmword_ptr(rdx, 8192), 123));
+ TEST_INSTRUCTION("62F17440C252807B" , vcmpps(k2, zmm17, zmmword_ptr(rdx, -8192), 123));
+ TEST_INSTRUCTION("62F17440C292C0DFFFFF7B" , vcmpps(k2, zmm17, zmmword_ptr(rdx, -8256), 123));
+ TEST_INSTRUCTION("62F17450C2527F7B" , vcmpps(k2, zmm17, dword_ptr(rdx, 508)._1to16(), 123));
+ TEST_INSTRUCTION("62F17450C292000200007B" , vcmpps(k2, zmm17, dword_ptr(rdx, 512)._1to16(), 123));
+ TEST_INSTRUCTION("62F17450C252807B" , vcmpps(k2, zmm17, dword_ptr(rdx, -512)._1to16(), 123));
+ TEST_INSTRUCTION("62F17450C292FCFDFFFF7B" , vcmpps(k2, zmm17, dword_ptr(rdx, -516)._1to16(), 123));
+ TEST_INSTRUCTION("62F1E700C2ECAB" , vcmpsd(k5, xmm19, xmm4, 171));
+ TEST_INSTRUCTION("62F1E701C2ECAB" , k(k1).vcmpsd(k5, xmm19, xmm4, 171));
+ TEST_INSTRUCTION("62F1E710C2ECAB" , sae().vcmpsd(k5, xmm19, xmm4, 171));
+ TEST_INSTRUCTION("62F1E700C2EC7B" , vcmpsd(k5, xmm19, xmm4, 123));
+ TEST_INSTRUCTION("62F1E710C2EC7B" , sae().vcmpsd(k5, xmm19, xmm4, 123));
+ TEST_INSTRUCTION("62F1E700C2297B" , vcmpsd(k5, xmm19, qword_ptr(rcx), 123));
+ TEST_INSTRUCTION("62B1E700C2ACF0230100007B" , vcmpsd(k5, xmm19, qword_ptr(rax, r14, 3, 291), 123));
+ TEST_INSTRUCTION("62F1E700C26A7F7B" , vcmpsd(k5, xmm19, qword_ptr(rdx, 1016), 123));
+ TEST_INSTRUCTION("62F1E700C2AA000400007B" , vcmpsd(k5, xmm19, qword_ptr(rdx, 1024), 123));
+ TEST_INSTRUCTION("62F1E700C26A807B" , vcmpsd(k5, xmm19, qword_ptr(rdx, -1024), 123));
+ TEST_INSTRUCTION("62F1E700C2AAF8FBFFFF7B" , vcmpsd(k5, xmm19, qword_ptr(rdx, -1032), 123));
+ TEST_INSTRUCTION("62D10608C2E4AB" , vcmpss(k4, xmm15, xmm12, 171));
+ TEST_INSTRUCTION("62D1060DC2E4AB" , k(k5).vcmpss(k4, xmm15, xmm12, 171));
+ TEST_INSTRUCTION("62D10618C2E4AB" , sae().vcmpss(k4, xmm15, xmm12, 171));
+ TEST_INSTRUCTION("62D10608C2E47B" , vcmpss(k4, xmm15, xmm12, 123));
+ TEST_INSTRUCTION("62D10618C2E47B" , sae().vcmpss(k4, xmm15, xmm12, 123));
+ TEST_INSTRUCTION("62F10608C2217B" , vcmpss(k4, xmm15, dword_ptr(rcx), 123));
+ TEST_INSTRUCTION("62B10608C2A4F0230100007B" , vcmpss(k4, xmm15, dword_ptr(rax, r14, 3, 291), 123));
+ TEST_INSTRUCTION("62F10608C2627F7B" , vcmpss(k4, xmm15, dword_ptr(rdx, 508), 123));
+ TEST_INSTRUCTION("62F10608C2A2000200007B" , vcmpss(k4, xmm15, dword_ptr(rdx, 512), 123));
+ TEST_INSTRUCTION("62F10608C262807B" , vcmpss(k4, xmm15, dword_ptr(rdx, -512), 123));
+ TEST_INSTRUCTION("62F10608C2A2FCFDFFFF7B" , vcmpss(k4, xmm15, dword_ptr(rdx, -516), 123));
+ TEST_INSTRUCTION("62A1FD082FFD" , vcomisd(xmm23, xmm21));
+ TEST_INSTRUCTION("62A1FD182FFD" , sae().vcomisd(xmm23, xmm21));
+ TEST_INSTRUCTION("62E1FD082F39" , vcomisd(xmm23, qword_ptr(rcx)));
+ TEST_INSTRUCTION("62A1FD082FBCF023010000" , vcomisd(xmm23, qword_ptr(rax, r14, 3, 291)));
+ TEST_INSTRUCTION("62E1FD082F7A7F" , vcomisd(xmm23, qword_ptr(rdx, 1016)));
+ TEST_INSTRUCTION("62E1FD082FBA00040000" , vcomisd(xmm23, qword_ptr(rdx, 1024)));
+ TEST_INSTRUCTION("62E1FD082F7A80" , vcomisd(xmm23, qword_ptr(rdx, -1024)));
+ TEST_INSTRUCTION("62E1FD082FBAF8FBFFFF" , vcomisd(xmm23, qword_ptr(rdx, -1032)));
+ TEST_INSTRUCTION("62117C082FF4" , vcomiss(xmm14, xmm28));
+ TEST_INSTRUCTION("62117C182FF4" , sae().vcomiss(xmm14, xmm28));
+ TEST_INSTRUCTION("C5782F31" , vcomiss(xmm14, dword_ptr(rcx)));
+ TEST_INSTRUCTION("C421782FB4F023010000" , vcomiss(xmm14, dword_ptr(rax, r14, 3, 291)));
+ TEST_INSTRUCTION("C5782FB2FC010000" , vcomiss(xmm14, dword_ptr(rdx, 508)));
+ TEST_INSTRUCTION("C5782FB200020000" , vcomiss(xmm14, dword_ptr(rdx, 512)));
+ TEST_INSTRUCTION("C5782FB200FEFFFF" , vcomiss(xmm14, dword_ptr(rdx, -512)));
+ TEST_INSTRUCTION("C5782FB2FCFDFFFF" , vcomiss(xmm14, dword_ptr(rdx, -516)));
+ TEST_INSTRUCTION("6272FD488A09" , vcompresspd(zmmword_ptr(rcx), zmm9));
+ TEST_INSTRUCTION("6272FD4C8A09" , k(k4).vcompresspd(zmmword_ptr(rcx), zmm9));
+ TEST_INSTRUCTION("6232FD488A8CF023010000" , vcompresspd(zmmword_ptr(rax, r14, 3, 291), zmm9));
+ TEST_INSTRUCTION("6272FD488A4A7F" , vcompresspd(zmmword_ptr(rdx, 1016), zmm9));
+ TEST_INSTRUCTION("6272FD488A8A00040000" , vcompresspd(zmmword_ptr(rdx, 1024), zmm9));
+ TEST_INSTRUCTION("6272FD488A4A80" , vcompresspd(zmmword_ptr(rdx, -1024), zmm9));
+ TEST_INSTRUCTION("6272FD488A8AF8FBFFFF" , vcompresspd(zmmword_ptr(rdx, -1032), zmm9));
+ TEST_INSTRUCTION("62D2FD488AE0" , vcompresspd(zmm8, zmm4));
+ TEST_INSTRUCTION("62D2FD4E8AE0" , k(k6).vcompresspd(zmm8, zmm4));
+ TEST_INSTRUCTION("62D2FDCE8AE0" , k(k6).z().vcompresspd(zmm8, zmm4));
+ TEST_INSTRUCTION("62727D488A11" , vcompressps(zmmword_ptr(rcx), zmm10));
+ TEST_INSTRUCTION("62727D4F8A11" , k(k7).vcompressps(zmmword_ptr(rcx), zmm10));
+ TEST_INSTRUCTION("62327D488A94F023010000" , vcompressps(zmmword_ptr(rax, r14, 3, 291), zmm10));
+ TEST_INSTRUCTION("62727D488A527F" , vcompressps(zmmword_ptr(rdx, 508), zmm10));
+ TEST_INSTRUCTION("62727D488A9200020000" , vcompressps(zmmword_ptr(rdx, 512), zmm10));
+ TEST_INSTRUCTION("62727D488A5280" , vcompressps(zmmword_ptr(rdx, -512), zmm10));
+ TEST_INSTRUCTION("62727D488A92FCFDFFFF" , vcompressps(zmmword_ptr(rdx, -516), zmm10));
+ TEST_INSTRUCTION("62727D488AF4" , vcompressps(zmm4, zmm14));
+ TEST_INSTRUCTION("62727D4A8AF4" , k(k2).vcompressps(zmm4, zmm14));
+ TEST_INSTRUCTION("62727DCA8AF4" , k(k2).z().vcompressps(zmm4, zmm14));
+ TEST_INSTRUCTION("62817E48E6F0" , vcvtdq2pd(zmm22, ymm24));
+ TEST_INSTRUCTION("62817E4CE6F0" , k(k4).vcvtdq2pd(zmm22, ymm24));
+ TEST_INSTRUCTION("62817ECCE6F0" , k(k4).z().vcvtdq2pd(zmm22, ymm24));
+ TEST_INSTRUCTION("62E17E48E631" , vcvtdq2pd(zmm22, ymmword_ptr(rcx)));
+ TEST_INSTRUCTION("62A17E48E6B4F023010000" , vcvtdq2pd(zmm22, ymmword_ptr(rax, r14, 3, 291)));
+ TEST_INSTRUCTION("62E17E58E631" , vcvtdq2pd(zmm22, dword_ptr(rcx)._1to8()));
+ TEST_INSTRUCTION("62E17E48E6727F" , vcvtdq2pd(zmm22, ymmword_ptr(rdx, 4064)));
+ TEST_INSTRUCTION("62E17E48E6B200100000" , vcvtdq2pd(zmm22, ymmword_ptr(rdx, 4096)));
+ TEST_INSTRUCTION("62E17E48E67280" , vcvtdq2pd(zmm22, ymmword_ptr(rdx, -4096)));
+ TEST_INSTRUCTION("62E17E48E6B2E0EFFFFF" , vcvtdq2pd(zmm22, ymmword_ptr(rdx, -4128)));
+ TEST_INSTRUCTION("62E17E58E6727F" , vcvtdq2pd(zmm22, dword_ptr(rdx, 508)._1to8()));
+ TEST_INSTRUCTION("62E17E58E6B200020000" , vcvtdq2pd(zmm22, dword_ptr(rdx, 512)._1to8()));
+ TEST_INSTRUCTION("62E17E58E67280" , vcvtdq2pd(zmm22, dword_ptr(rdx, -512)._1to8()));
+ TEST_INSTRUCTION("62E17E58E6B2FCFDFFFF" , vcvtdq2pd(zmm22, dword_ptr(rdx, -516)._1to8()));
+ TEST_INSTRUCTION("62917C485BF9" , vcvtdq2ps(zmm7, zmm25));
+ TEST_INSTRUCTION("62917C4D5BF9" , k(k5).vcvtdq2ps(zmm7, zmm25));
+ TEST_INSTRUCTION("62917CCD5BF9" , k(k5).z().vcvtdq2ps(zmm7, zmm25));
+ TEST_INSTRUCTION("62917C185BF9" , rn_sae().vcvtdq2ps(zmm7, zmm25));
+ TEST_INSTRUCTION("62917C585BF9" , ru_sae().vcvtdq2ps(zmm7, zmm25));
+ TEST_INSTRUCTION("62917C385BF9" , rd_sae().vcvtdq2ps(zmm7, zmm25));
+ TEST_INSTRUCTION("62917C785BF9" , rz_sae().vcvtdq2ps(zmm7, zmm25));
+ TEST_INSTRUCTION("62F17C485B39" , vcvtdq2ps(zmm7, zmmword_ptr(rcx)));
+ TEST_INSTRUCTION("62B17C485BBCF023010000" , vcvtdq2ps(zmm7, zmmword_ptr(rax, r14, 3, 291)));
+ TEST_INSTRUCTION("62F17C585B39" , vcvtdq2ps(zmm7, dword_ptr(rcx)._1to16()));
+ TEST_INSTRUCTION("62F17C485B7A7F" , vcvtdq2ps(zmm7, zmmword_ptr(rdx, 8128)));
+ TEST_INSTRUCTION("62F17C485BBA00200000" , vcvtdq2ps(zmm7, zmmword_ptr(rdx, 8192)));
+ TEST_INSTRUCTION("62F17C485B7A80" , vcvtdq2ps(zmm7, zmmword_ptr(rdx, -8192)));
+ TEST_INSTRUCTION("62F17C485BBAC0DFFFFF" , vcvtdq2ps(zmm7, zmmword_ptr(rdx, -8256)));
+ TEST_INSTRUCTION("62F17C585B7A7F" , vcvtdq2ps(zmm7, dword_ptr(rdx, 508)._1to16()));
+ TEST_INSTRUCTION("62F17C585BBA00020000" , vcvtdq2ps(zmm7, dword_ptr(rdx, 512)._1to16()));
+ TEST_INSTRUCTION("62F17C585B7A80" , vcvtdq2ps(zmm7, dword_ptr(rdx, -512)._1to16()));
+ TEST_INSTRUCTION("62F17C585BBAFCFDFFFF" , vcvtdq2ps(zmm7, dword_ptr(rdx, -516)._1to16()));
+ TEST_INSTRUCTION("6241FF48E6C7" , vcvtpd2dq(ymm24, zmm15));
+ TEST_INSTRUCTION("6241FF4BE6C7" , k(k3).vcvtpd2dq(ymm24, zmm15));
+ TEST_INSTRUCTION("6241FFCBE6C7" , k(k3).z().vcvtpd2dq(ymm24, zmm15));
+ TEST_INSTRUCTION("6241FF18E6C7" , rn_sae().vcvtpd2dq(ymm24, zmm15));
+ TEST_INSTRUCTION("6241FF58E6C7" , ru_sae().vcvtpd2dq(ymm24, zmm15));
+ TEST_INSTRUCTION("6241FF38E6C7" , rd_sae().vcvtpd2dq(ymm24, zmm15));
+ TEST_INSTRUCTION("6241FF78E6C7" , rz_sae().vcvtpd2dq(ymm24, zmm15));
+ TEST_INSTRUCTION("6261FF48E601" , vcvtpd2dq(ymm24, zmmword_ptr(rcx)));
+ TEST_INSTRUCTION("6221FF48E684F023010000" , vcvtpd2dq(ymm24, zmmword_ptr(rax, r14, 3, 291)));
+ TEST_INSTRUCTION("6261FF58E601" , vcvtpd2dq(ymm24, qword_ptr(rcx)._1to8()));
+ TEST_INSTRUCTION("6261FF48E6427F" , vcvtpd2dq(ymm24, zmmword_ptr(rdx, 8128)));
+ TEST_INSTRUCTION("6261FF48E68200200000" , vcvtpd2dq(ymm24, zmmword_ptr(rdx, 8192)));
+ TEST_INSTRUCTION("6261FF48E64280" , vcvtpd2dq(ymm24, zmmword_ptr(rdx, -8192)));
+ TEST_INSTRUCTION("6261FF48E682C0DFFFFF" , vcvtpd2dq(ymm24, zmmword_ptr(rdx, -8256)));
+ TEST_INSTRUCTION("6261FF58E6427F" , vcvtpd2dq(ymm24, qword_ptr(rdx, 1016)._1to8()));
+ TEST_INSTRUCTION("6261FF58E68200040000" , vcvtpd2dq(ymm24, qword_ptr(rdx, 1024)._1to8()));
+ TEST_INSTRUCTION("6261FF58E64280" , vcvtpd2dq(ymm24, qword_ptr(rdx, -1024)._1to8()));
+ TEST_INSTRUCTION("6261FF58E682F8FBFFFF" , vcvtpd2dq(ymm24, qword_ptr(rdx, -1032)._1to8()));
+ TEST_INSTRUCTION("62B1FD485AEF" , vcvtpd2ps(ymm5, zmm23));
+ TEST_INSTRUCTION("62B1FD4D5AEF" , k(k5).vcvtpd2ps(ymm5, zmm23));
+ TEST_INSTRUCTION("62B1FDCD5AEF" , k(k5).z().vcvtpd2ps(ymm5, zmm23));
+ TEST_INSTRUCTION("62B1FD185AEF" , rn_sae().vcvtpd2ps(ymm5, zmm23));
+ TEST_INSTRUCTION("62B1FD585AEF" , ru_sae().vcvtpd2ps(ymm5, zmm23));
+ TEST_INSTRUCTION("62B1FD385AEF" , rd_sae().vcvtpd2ps(ymm5, zmm23));
+ TEST_INSTRUCTION("62B1FD785AEF" , rz_sae().vcvtpd2ps(ymm5, zmm23));
+ TEST_INSTRUCTION("62F1FD485A29" , vcvtpd2ps(ymm5, zmmword_ptr(rcx)));
+ TEST_INSTRUCTION("62B1FD485AACF023010000" , vcvtpd2ps(ymm5, zmmword_ptr(rax, r14, 3, 291)));
+ TEST_INSTRUCTION("62F1FD585A29" , vcvtpd2ps(ymm5, qword_ptr(rcx)._1to8()));
+ TEST_INSTRUCTION("62F1FD485A6A7F" , vcvtpd2ps(ymm5, zmmword_ptr(rdx, 8128)));
+ TEST_INSTRUCTION("62F1FD485AAA00200000" , vcvtpd2ps(ymm5, zmmword_ptr(rdx, 8192)));
+ TEST_INSTRUCTION("62F1FD485A6A80" , vcvtpd2ps(ymm5, zmmword_ptr(rdx, -8192)));
+ TEST_INSTRUCTION("62F1FD485AAAC0DFFFFF" , vcvtpd2ps(ymm5, zmmword_ptr(rdx, -8256)));
+ TEST_INSTRUCTION("62F1FD585A6A7F" , vcvtpd2ps(ymm5, qword_ptr(rdx, 1016)._1to8()));
+ TEST_INSTRUCTION("62F1FD585AAA00040000" , vcvtpd2ps(ymm5, qword_ptr(rdx, 1024)._1to8()));
+ TEST_INSTRUCTION("62F1FD585A6A80" , vcvtpd2ps(ymm5, qword_ptr(rdx, -1024)._1to8()));
+ TEST_INSTRUCTION("62F1FD585AAAF8FBFFFF" , vcvtpd2ps(ymm5, qword_ptr(rdx, -1032)._1to8()));
+ TEST_INSTRUCTION("6231FC4879FB" , vcvtpd2udq(ymm15, zmm19));
+ TEST_INSTRUCTION("6231FC4F79FB" , k(k7).vcvtpd2udq(ymm15, zmm19));
+ TEST_INSTRUCTION("6231FCCF79FB" , k(k7).z().vcvtpd2udq(ymm15, zmm19));
+ TEST_INSTRUCTION("6231FC1879FB" , rn_sae().vcvtpd2udq(ymm15, zmm19));
+ TEST_INSTRUCTION("6231FC5879FB" , ru_sae().vcvtpd2udq(ymm15, zmm19));
+ TEST_INSTRUCTION("6231FC3879FB" , rd_sae().vcvtpd2udq(ymm15, zmm19));
+ TEST_INSTRUCTION("6231FC7879FB" , rz_sae().vcvtpd2udq(ymm15, zmm19));
+ TEST_INSTRUCTION("6271FC487939" , vcvtpd2udq(ymm15, zmmword_ptr(rcx)));
+ TEST_INSTRUCTION("6231FC4879BCF023010000" , vcvtpd2udq(ymm15, zmmword_ptr(rax, r14, 3, 291)));
+ TEST_INSTRUCTION("6271FC587939" , vcvtpd2udq(ymm15, qword_ptr(rcx)._1to8()));
+ TEST_INSTRUCTION("6271FC48797A7F" , vcvtpd2udq(ymm15, zmmword_ptr(rdx, 8128)));
+ TEST_INSTRUCTION("6271FC4879BA00200000" , vcvtpd2udq(ymm15, zmmword_ptr(rdx, 8192)));
+ TEST_INSTRUCTION("6271FC48797A80" , vcvtpd2udq(ymm15, zmmword_ptr(rdx, -8192)));
+ TEST_INSTRUCTION("6271FC4879BAC0DFFFFF" , vcvtpd2udq(ymm15, zmmword_ptr(rdx, -8256)));
+ TEST_INSTRUCTION("6271FC58797A7F" , vcvtpd2udq(ymm15, qword_ptr(rdx, 1016)._1to8()));
+ TEST_INSTRUCTION("6271FC5879BA00040000" , vcvtpd2udq(ymm15, qword_ptr(rdx, 1024)._1to8()));
+ TEST_INSTRUCTION("6271FC58797A80" , vcvtpd2udq(ymm15, qword_ptr(rdx, -1024)._1to8()));
+ TEST_INSTRUCTION("6271FC5879BAF8FBFFFF" , vcvtpd2udq(ymm15, qword_ptr(rdx, -1032)._1to8()));
+ TEST_INSTRUCTION("62127D4813EB" , vcvtph2ps(zmm13, ymm27));
+ TEST_INSTRUCTION("62127D4B13EB" , k(k3).vcvtph2ps(zmm13, ymm27));
+ TEST_INSTRUCTION("62127DCB13EB" , k(k3).z().vcvtph2ps(zmm13, ymm27));
+ TEST_INSTRUCTION("62127D1813EB" , sae().vcvtph2ps(zmm13, ymm27));
+ TEST_INSTRUCTION("62727D481329" , vcvtph2ps(zmm13, ymmword_ptr(rcx)));
+ TEST_INSTRUCTION("62327D4813ACF023010000" , vcvtph2ps(zmm13, ymmword_ptr(rax, r14, 3, 291)));
+ TEST_INSTRUCTION("62727D48136A7F" , vcvtph2ps(zmm13, ymmword_ptr(rdx, 4064)));
+ TEST_INSTRUCTION("62727D4813AA00100000" , vcvtph2ps(zmm13, ymmword_ptr(rdx, 4096)));
+ TEST_INSTRUCTION("62727D48136A80" , vcvtph2ps(zmm13, ymmword_ptr(rdx, -4096)));
+ TEST_INSTRUCTION("62727D4813AAE0EFFFFF" , vcvtph2ps(zmm13, ymmword_ptr(rdx, -4128)));
+ TEST_INSTRUCTION("62117D485BE0" , vcvtps2dq(zmm12, zmm24));
+ TEST_INSTRUCTION("62117D4C5BE0" , k(k4).vcvtps2dq(zmm12, zmm24));
+ TEST_INSTRUCTION("62117DCC5BE0" , k(k4).z().vcvtps2dq(zmm12, zmm24));
+ TEST_INSTRUCTION("62117D185BE0" , rn_sae().vcvtps2dq(zmm12, zmm24));
+ TEST_INSTRUCTION("62117D585BE0" , ru_sae().vcvtps2dq(zmm12, zmm24));
+ TEST_INSTRUCTION("62117D385BE0" , rd_sae().vcvtps2dq(zmm12, zmm24));
+ TEST_INSTRUCTION("62117D785BE0" , rz_sae().vcvtps2dq(zmm12, zmm24));
+ TEST_INSTRUCTION("62717D485B21" , vcvtps2dq(zmm12, zmmword_ptr(rcx)));
+ TEST_INSTRUCTION("62317D485BA4F023010000" , vcvtps2dq(zmm12, zmmword_ptr(rax, r14, 3, 291)));
+ TEST_INSTRUCTION("62717D585B21" , vcvtps2dq(zmm12, dword_ptr(rcx)._1to16()));
+ TEST_INSTRUCTION("62717D485B627F" , vcvtps2dq(zmm12, zmmword_ptr(rdx, 8128)));
+ TEST_INSTRUCTION("62717D485BA200200000" , vcvtps2dq(zmm12, zmmword_ptr(rdx, 8192)));
+ TEST_INSTRUCTION("62717D485B6280" , vcvtps2dq(zmm12, zmmword_ptr(rdx, -8192)));
+ TEST_INSTRUCTION("62717D485BA2C0DFFFFF" , vcvtps2dq(zmm12, zmmword_ptr(rdx, -8256)));
+ TEST_INSTRUCTION("62717D585B627F" , vcvtps2dq(zmm12, dword_ptr(rdx, 508)._1to16()));
+ TEST_INSTRUCTION("62717D585BA200020000" , vcvtps2dq(zmm12, dword_ptr(rdx, 512)._1to16()));
+ TEST_INSTRUCTION("62717D585B6280" , vcvtps2dq(zmm12, dword_ptr(rdx, -512)._1to16()));
+ TEST_INSTRUCTION("62717D585BA2FCFDFFFF" , vcvtps2dq(zmm12, dword_ptr(rdx, -516)._1to16()));
+ TEST_INSTRUCTION("62717C485AEE" , vcvtps2pd(zmm13, ymm6));
+ TEST_INSTRUCTION("62717C4B5AEE" , k(k3).vcvtps2pd(zmm13, ymm6));
+ TEST_INSTRUCTION("62717CCB5AEE" , k(k3).z().vcvtps2pd(zmm13, ymm6));
+ TEST_INSTRUCTION("62717C185AEE" , sae().vcvtps2pd(zmm13, ymm6));
+ TEST_INSTRUCTION("62717C485A29" , vcvtps2pd(zmm13, ymmword_ptr(rcx)));
+ TEST_INSTRUCTION("62317C485AACF023010000" , vcvtps2pd(zmm13, ymmword_ptr(rax, r14, 3, 291)));
+ TEST_INSTRUCTION("62717C585A29" , vcvtps2pd(zmm13, dword_ptr(rcx)._1to8()));
+ TEST_INSTRUCTION("62717C485A6A7F" , vcvtps2pd(zmm13, ymmword_ptr(rdx, 4064)));
+ TEST_INSTRUCTION("62717C485AAA00100000" , vcvtps2pd(zmm13, ymmword_ptr(rdx, 4096)));
+ TEST_INSTRUCTION("62717C485A6A80" , vcvtps2pd(zmm13, ymmword_ptr(rdx, -4096)));
+ TEST_INSTRUCTION("62717C485AAAE0EFFFFF" , vcvtps2pd(zmm13, ymmword_ptr(rdx, -4128)));
+ TEST_INSTRUCTION("62717C585A6A7F" , vcvtps2pd(zmm13, dword_ptr(rdx, 508)._1to8()));
+ TEST_INSTRUCTION("62717C585AAA00020000" , vcvtps2pd(zmm13, dword_ptr(rdx, 512)._1to8()));
+ TEST_INSTRUCTION("62717C585A6A80" , vcvtps2pd(zmm13, dword_ptr(rdx, -512)._1to8()));
+ TEST_INSTRUCTION("62717C585AAAFCFDFFFF" , vcvtps2pd(zmm13, dword_ptr(rdx, -516)._1to8()));
+ TEST_INSTRUCTION("62537D481DF3AB" , vcvtps2ph(ymm11, zmm14, 171));
+ TEST_INSTRUCTION("62537D4E1DF3AB" , k(k6).vcvtps2ph(ymm11, zmm14, 171));
+ TEST_INSTRUCTION("62537DCE1DF3AB" , k(k6).z().vcvtps2ph(ymm11, zmm14, 171));
+ TEST_INSTRUCTION("62537D181DF3AB" , sae().vcvtps2ph(ymm11, zmm14, 171));
+ TEST_INSTRUCTION("62537D481DF37B" , vcvtps2ph(ymm11, zmm14, 123));
+ TEST_INSTRUCTION("62537D181DF37B" , sae().vcvtps2ph(ymm11, zmm14, 123));
+ TEST_INSTRUCTION("62117C4879E2" , vcvtps2udq(zmm12, zmm26));
+ TEST_INSTRUCTION("62117C4C79E2" , k(k4).vcvtps2udq(zmm12, zmm26));
+ TEST_INSTRUCTION("62117CCC79E2" , k(k4).z().vcvtps2udq(zmm12, zmm26));
+ TEST_INSTRUCTION("62117C1879E2" , rn_sae().vcvtps2udq(zmm12, zmm26));
+ TEST_INSTRUCTION("62117C5879E2" , ru_sae().vcvtps2udq(zmm12, zmm26));
+ TEST_INSTRUCTION("62117C3879E2" , rd_sae().vcvtps2udq(zmm12, zmm26));
+ TEST_INSTRUCTION("62117C7879E2" , rz_sae().vcvtps2udq(zmm12, zmm26));
+ TEST_INSTRUCTION("62717C487921" , vcvtps2udq(zmm12, zmmword_ptr(rcx)));
+ TEST_INSTRUCTION("62317C4879A4F023010000" , vcvtps2udq(zmm12, zmmword_ptr(rax, r14, 3, 291)));
+ TEST_INSTRUCTION("62717C587921" , vcvtps2udq(zmm12, dword_ptr(rcx)._1to16()));
+ TEST_INSTRUCTION("62717C4879627F" , vcvtps2udq(zmm12, zmmword_ptr(rdx, 8128)));
+ TEST_INSTRUCTION("62717C4879A200200000" , vcvtps2udq(zmm12, zmmword_ptr(rdx, 8192)));
+ TEST_INSTRUCTION("62717C48796280" , vcvtps2udq(zmm12, zmmword_ptr(rdx, -8192)));
+ TEST_INSTRUCTION("62717C4879A2C0DFFFFF" , vcvtps2udq(zmm12, zmmword_ptr(rdx, -8256)));
+ TEST_INSTRUCTION("62717C5879627F" , vcvtps2udq(zmm12, dword_ptr(rdx, 508)._1to16()));
+ TEST_INSTRUCTION("62717C5879A200020000" , vcvtps2udq(zmm12, dword_ptr(rdx, 512)._1to16()));
+ TEST_INSTRUCTION("62717C58796280" , vcvtps2udq(zmm12, dword_ptr(rdx, -512)._1to16()));
+ TEST_INSTRUCTION("62717C5879A2FCFDFFFF" , vcvtps2udq(zmm12, dword_ptr(rdx, -516)._1to16()));
+ TEST_INSTRUCTION("62F17F182DC7" , rn_sae().vcvtsd2si(eax, xmm7));
+ TEST_INSTRUCTION("62F17F582DC7" , ru_sae().vcvtsd2si(eax, xmm7));
+ TEST_INSTRUCTION("62F17F382DC7" , rd_sae().vcvtsd2si(eax, xmm7));
+ TEST_INSTRUCTION("62F17F782DC7" , rz_sae().vcvtsd2si(eax, xmm7));
+ TEST_INSTRUCTION("62F17F182DEF" , rn_sae().vcvtsd2si(ebp, xmm7));
+ TEST_INSTRUCTION("62F17F582DEF" , ru_sae().vcvtsd2si(ebp, xmm7));
+ TEST_INSTRUCTION("62F17F382DEF" , rd_sae().vcvtsd2si(ebp, xmm7));
+ TEST_INSTRUCTION("62F17F782DEF" , rz_sae().vcvtsd2si(ebp, xmm7));
+ TEST_INSTRUCTION("62717F182DEF" , rn_sae().vcvtsd2si(r13d, xmm7));
+ TEST_INSTRUCTION("62717F582DEF" , ru_sae().vcvtsd2si(r13d, xmm7));
+ TEST_INSTRUCTION("62717F382DEF" , rd_sae().vcvtsd2si(r13d, xmm7));
+ TEST_INSTRUCTION("62717F782DEF" , rz_sae().vcvtsd2si(r13d, xmm7));
+ TEST_INSTRUCTION("62D1FF182DC2" , rn_sae().vcvtsd2si(rax, xmm10));
+ TEST_INSTRUCTION("62D1FF582DC2" , ru_sae().vcvtsd2si(rax, xmm10));
+ TEST_INSTRUCTION("62D1FF382DC2" , rd_sae().vcvtsd2si(rax, xmm10));
+ TEST_INSTRUCTION("62D1FF782DC2" , rz_sae().vcvtsd2si(rax, xmm10));
+ TEST_INSTRUCTION("6251FF182DC2" , rn_sae().vcvtsd2si(r8, xmm10));
+ TEST_INSTRUCTION("6251FF582DC2" , ru_sae().vcvtsd2si(r8, xmm10));
+ TEST_INSTRUCTION("6251FF382DC2" , rd_sae().vcvtsd2si(r8, xmm10));
+ TEST_INSTRUCTION("6251FF782DC2" , rz_sae().vcvtsd2si(r8, xmm10));
+ TEST_INSTRUCTION("62C1B7085ACC" , vcvtsd2ss(xmm17, xmm9, xmm12));
+ TEST_INSTRUCTION("62C1B70E5ACC" , k(k6).vcvtsd2ss(xmm17, xmm9, xmm12));
+ TEST_INSTRUCTION("62C1B78E5ACC" , k(k6).z().vcvtsd2ss(xmm17, xmm9, xmm12));
+ TEST_INSTRUCTION("62C1B7185ACC" , rn_sae().vcvtsd2ss(xmm17, xmm9, xmm12));
+ TEST_INSTRUCTION("62C1B7585ACC" , ru_sae().vcvtsd2ss(xmm17, xmm9, xmm12));
+ TEST_INSTRUCTION("62C1B7385ACC" , rd_sae().vcvtsd2ss(xmm17, xmm9, xmm12));
+ TEST_INSTRUCTION("62C1B7785ACC" , rz_sae().vcvtsd2ss(xmm17, xmm9, xmm12));
+ TEST_INSTRUCTION("62E1B7085A09" , vcvtsd2ss(xmm17, xmm9, qword_ptr(rcx)));
+ TEST_INSTRUCTION("62A1B7085A8CF023010000" , vcvtsd2ss(xmm17, xmm9, qword_ptr(rax, r14, 3, 291)));
+ TEST_INSTRUCTION("62E1B7085A4A7F" , vcvtsd2ss(xmm17, xmm9, qword_ptr(rdx, 1016)));
+ TEST_INSTRUCTION("62E1B7085A8A00040000" , vcvtsd2ss(xmm17, xmm9, qword_ptr(rdx, 1024)));
+ TEST_INSTRUCTION("62E1B7085A4A80" , vcvtsd2ss(xmm17, xmm9, qword_ptr(rdx, -1024)));
+ TEST_INSTRUCTION("62E1B7085A8AF8FBFFFF" , vcvtsd2ss(xmm17, xmm9, qword_ptr(rdx, -1032)));
+ TEST_INSTRUCTION("C5AB2AF8" , vcvtsi2sd(xmm7, xmm10, eax));
+ TEST_INSTRUCTION("C5AB2AFD" , vcvtsi2sd(xmm7, xmm10, ebp));
+ TEST_INSTRUCTION("C4C12B2AFD" , vcvtsi2sd(xmm7, xmm10, r13d));
+ TEST_INSTRUCTION("C5AB2A39" , vcvtsi2sd(xmm7, xmm10, dword_ptr(rcx)));
+ TEST_INSTRUCTION("C4A12B2ABCF023010000" , vcvtsi2sd(xmm7, xmm10, dword_ptr(rax, r14, 3, 291)));
+ TEST_INSTRUCTION("C5AB2ABAFC010000" , vcvtsi2sd(xmm7, xmm10, dword_ptr(rdx, 508)));
+ TEST_INSTRUCTION("C5AB2ABA00020000" , vcvtsi2sd(xmm7, xmm10, dword_ptr(rdx, 512)));
+ TEST_INSTRUCTION("C5AB2ABA00FEFFFF" , vcvtsi2sd(xmm7, xmm10, dword_ptr(rdx, -512)));
+ TEST_INSTRUCTION("C5AB2ABAFCFDFFFF" , vcvtsi2sd(xmm7, xmm10, dword_ptr(rdx, -516)));
+ TEST_INSTRUCTION("62619F082AE8" , vcvtsi2sd(xmm29, xmm12, rax));
+ TEST_INSTRUCTION("62619F182AE8" , rn_sae().vcvtsi2sd(xmm29, xmm12, rax));
+ TEST_INSTRUCTION("62619F582AE8" , ru_sae().vcvtsi2sd(xmm29, xmm12, rax));
+ TEST_INSTRUCTION("62619F382AE8" , rd_sae().vcvtsi2sd(xmm29, xmm12, rax));
+ TEST_INSTRUCTION("62619F782AE8" , rz_sae().vcvtsi2sd(xmm29, xmm12, rax));
+ TEST_INSTRUCTION("62419F082AE8" , vcvtsi2sd(xmm29, xmm12, r8));
+ TEST_INSTRUCTION("62419F182AE8" , rn_sae().vcvtsi2sd(xmm29, xmm12, r8));
+ TEST_INSTRUCTION("62419F582AE8" , ru_sae().vcvtsi2sd(xmm29, xmm12, r8));
+ TEST_INSTRUCTION("62419F382AE8" , rd_sae().vcvtsi2sd(xmm29, xmm12, r8));
+ TEST_INSTRUCTION("62419F782AE8" , rz_sae().vcvtsi2sd(xmm29, xmm12, r8));
+ TEST_INSTRUCTION("62619F082A29" , vcvtsi2sd(xmm29, xmm12, qword_ptr(rcx)));
+ TEST_INSTRUCTION("62219F082AACF023010000" , vcvtsi2sd(xmm29, xmm12, qword_ptr(rax, r14, 3, 291)));
+ TEST_INSTRUCTION("62619F082A6A7F" , vcvtsi2sd(xmm29, xmm12, qword_ptr(rdx, 1016)));
+ TEST_INSTRUCTION("62619F082AAA00040000" , vcvtsi2sd(xmm29, xmm12, qword_ptr(rdx, 1024)));
+ TEST_INSTRUCTION("62619F082A6A80" , vcvtsi2sd(xmm29, xmm12, qword_ptr(rdx, -1024)));
+ TEST_INSTRUCTION("62619F082AAAF8FBFFFF" , vcvtsi2sd(xmm29, xmm12, qword_ptr(rdx, -1032)));
+ TEST_INSTRUCTION("C52A2AF8" , vcvtsi2ss(xmm15, xmm10, eax));
+ TEST_INSTRUCTION("62712E182AF8" , rn_sae().vcvtsi2ss(xmm15, xmm10, eax));
+ TEST_INSTRUCTION("62712E582AF8" , ru_sae().vcvtsi2ss(xmm15, xmm10, eax));
+ TEST_INSTRUCTION("62712E382AF8" , rd_sae().vcvtsi2ss(xmm15, xmm10, eax));
+ TEST_INSTRUCTION("62712E782AF8" , rz_sae().vcvtsi2ss(xmm15, xmm10, eax));
+ TEST_INSTRUCTION("C52A2AFD" , vcvtsi2ss(xmm15, xmm10, ebp));
+ TEST_INSTRUCTION("62712E182AFD" , rn_sae().vcvtsi2ss(xmm15, xmm10, ebp));
+ TEST_INSTRUCTION("62712E582AFD" , ru_sae().vcvtsi2ss(xmm15, xmm10, ebp));
+ TEST_INSTRUCTION("62712E382AFD" , rd_sae().vcvtsi2ss(xmm15, xmm10, ebp));
+ TEST_INSTRUCTION("62712E782AFD" , rz_sae().vcvtsi2ss(xmm15, xmm10, ebp));
+ TEST_INSTRUCTION("C4412A2AFD" , vcvtsi2ss(xmm15, xmm10, r13d));
+ TEST_INSTRUCTION("62512E182AFD" , rn_sae().vcvtsi2ss(xmm15, xmm10, r13d));
+ TEST_INSTRUCTION("62512E582AFD" , ru_sae().vcvtsi2ss(xmm15, xmm10, r13d));
+ TEST_INSTRUCTION("62512E382AFD" , rd_sae().vcvtsi2ss(xmm15, xmm10, r13d));
+ TEST_INSTRUCTION("62512E782AFD" , rz_sae().vcvtsi2ss(xmm15, xmm10, r13d));
+ TEST_INSTRUCTION("C52A2A39" , vcvtsi2ss(xmm15, xmm10, dword_ptr(rcx)));
+ TEST_INSTRUCTION("C4212A2ABCF023010000" , vcvtsi2ss(xmm15, xmm10, dword_ptr(rax, r14, 3, 291)));
+ TEST_INSTRUCTION("C52A2ABAFC010000" , vcvtsi2ss(xmm15, xmm10, dword_ptr(rdx, 508)));
+ TEST_INSTRUCTION("C52A2ABA00020000" , vcvtsi2ss(xmm15, xmm10, dword_ptr(rdx, 512)));
+ TEST_INSTRUCTION("C52A2ABA00FEFFFF" , vcvtsi2ss(xmm15, xmm10, dword_ptr(rdx, -512)));
+ TEST_INSTRUCTION("C52A2ABAFCFDFFFF" , vcvtsi2ss(xmm15, xmm10, dword_ptr(rdx, -516)));
+ TEST_INSTRUCTION("62E1AE082AC0" , vcvtsi2ss(xmm16, xmm10, rax));
+ TEST_INSTRUCTION("62E1AE182AC0" , rn_sae().vcvtsi2ss(xmm16, xmm10, rax));
+ TEST_INSTRUCTION("62E1AE582AC0" , ru_sae().vcvtsi2ss(xmm16, xmm10, rax));
+ TEST_INSTRUCTION("62E1AE382AC0" , rd_sae().vcvtsi2ss(xmm16, xmm10, rax));
+ TEST_INSTRUCTION("62E1AE782AC0" , rz_sae().vcvtsi2ss(xmm16, xmm10, rax));
+ TEST_INSTRUCTION("62C1AE082AC0" , vcvtsi2ss(xmm16, xmm10, r8));
+ TEST_INSTRUCTION("62C1AE182AC0" , rn_sae().vcvtsi2ss(xmm16, xmm10, r8));
+ TEST_INSTRUCTION("62C1AE582AC0" , ru_sae().vcvtsi2ss(xmm16, xmm10, r8));
+ TEST_INSTRUCTION("62C1AE382AC0" , rd_sae().vcvtsi2ss(xmm16, xmm10, r8));
+ TEST_INSTRUCTION("62C1AE782AC0" , rz_sae().vcvtsi2ss(xmm16, xmm10, r8));
+ TEST_INSTRUCTION("62E1AE082A01" , vcvtsi2ss(xmm16, xmm10, qword_ptr(rcx)));
+ TEST_INSTRUCTION("62A1AE082A84F023010000" , vcvtsi2ss(xmm16, xmm10, qword_ptr(rax, r14, 3, 291)));
+ TEST_INSTRUCTION("62E1AE082A427F" , vcvtsi2ss(xmm16, xmm10, qword_ptr(rdx, 1016)));
+ TEST_INSTRUCTION("62E1AE082A8200040000" , vcvtsi2ss(xmm16, xmm10, qword_ptr(rdx, 1024)));
+ TEST_INSTRUCTION("62E1AE082A4280" , vcvtsi2ss(xmm16, xmm10, qword_ptr(rdx, -1024)));
+ TEST_INSTRUCTION("62E1AE082A82F8FBFFFF" , vcvtsi2ss(xmm16, xmm10, qword_ptr(rdx, -1032)));
+ TEST_INSTRUCTION("62614E085AE6" , vcvtss2sd(xmm28, xmm6, xmm6));
+ TEST_INSTRUCTION("62614E0B5AE6" , k(k3).vcvtss2sd(xmm28, xmm6, xmm6));
+ TEST_INSTRUCTION("62614E8B5AE6" , k(k3).z().vcvtss2sd(xmm28, xmm6, xmm6));
+ TEST_INSTRUCTION("62614E185AE6" , sae().vcvtss2sd(xmm28, xmm6, xmm6));
+ TEST_INSTRUCTION("62614E085A21" , vcvtss2sd(xmm28, xmm6, dword_ptr(rcx)));
+ TEST_INSTRUCTION("62214E085AA4F023010000" , vcvtss2sd(xmm28, xmm6, dword_ptr(rax, r14, 3, 291)));
+ TEST_INSTRUCTION("62614E085A627F" , vcvtss2sd(xmm28, xmm6, dword_ptr(rdx, 508)));
+ TEST_INSTRUCTION("62614E085AA200020000" , vcvtss2sd(xmm28, xmm6, dword_ptr(rdx, 512)));
+ TEST_INSTRUCTION("62614E085A6280" , vcvtss2sd(xmm28, xmm6, dword_ptr(rdx, -512)));
+ TEST_INSTRUCTION("62614E085AA2FCFDFFFF" , vcvtss2sd(xmm28, xmm6, dword_ptr(rdx, -516)));
+ TEST_INSTRUCTION("62B17E182DC6" , rn_sae().vcvtss2si(eax, xmm22));
+ TEST_INSTRUCTION("62B17E582DC6" , ru_sae().vcvtss2si(eax, xmm22));
+ TEST_INSTRUCTION("62B17E382DC6" , rd_sae().vcvtss2si(eax, xmm22));
+ TEST_INSTRUCTION("62B17E782DC6" , rz_sae().vcvtss2si(eax, xmm22));
+ TEST_INSTRUCTION("62B17E182DEE" , rn_sae().vcvtss2si(ebp, xmm22));
+ TEST_INSTRUCTION("62B17E582DEE" , ru_sae().vcvtss2si(ebp, xmm22));
+ TEST_INSTRUCTION("62B17E382DEE" , rd_sae().vcvtss2si(ebp, xmm22));
+ TEST_INSTRUCTION("62B17E782DEE" , rz_sae().vcvtss2si(ebp, xmm22));
+ TEST_INSTRUCTION("62317E182DEE" , rn_sae().vcvtss2si(r13d, xmm22));
+ TEST_INSTRUCTION("62317E582DEE" , ru_sae().vcvtss2si(r13d, xmm22));
+ TEST_INSTRUCTION("62317E382DEE" , rd_sae().vcvtss2si(r13d, xmm22));
+ TEST_INSTRUCTION("62317E782DEE" , rz_sae().vcvtss2si(r13d, xmm22));
+ TEST_INSTRUCTION("6291FE182DC5" , rn_sae().vcvtss2si(rax, xmm29));
+ TEST_INSTRUCTION("6291FE582DC5" , ru_sae().vcvtss2si(rax, xmm29));
+ TEST_INSTRUCTION("6291FE382DC5" , rd_sae().vcvtss2si(rax, xmm29));
+ TEST_INSTRUCTION("6291FE782DC5" , rz_sae().vcvtss2si(rax, xmm29));
+ TEST_INSTRUCTION("6211FE182DC5" , rn_sae().vcvtss2si(r8, xmm29));
+ TEST_INSTRUCTION("6211FE582DC5" , ru_sae().vcvtss2si(r8, xmm29));
+ TEST_INSTRUCTION("6211FE382DC5" , rd_sae().vcvtss2si(r8, xmm29));
+ TEST_INSTRUCTION("6211FE782DC5" , rz_sae().vcvtss2si(r8, xmm29));
+ TEST_INSTRUCTION("6241FD48E6D9" , vcvttpd2dq(ymm27, zmm9));
+ TEST_INSTRUCTION("6241FD4DE6D9" , k(k5).vcvttpd2dq(ymm27, zmm9));
+ TEST_INSTRUCTION("6241FDCDE6D9" , k(k5).z().vcvttpd2dq(ymm27, zmm9));
+ TEST_INSTRUCTION("6241FD18E6D9" , sae().vcvttpd2dq(ymm27, zmm9));
+ TEST_INSTRUCTION("6261FD48E619" , vcvttpd2dq(ymm27, zmmword_ptr(rcx)));
+ TEST_INSTRUCTION("6221FD48E69CF023010000" , vcvttpd2dq(ymm27, zmmword_ptr(rax, r14, 3, 291)));
+ TEST_INSTRUCTION("6261FD58E619" , vcvttpd2dq(ymm27, qword_ptr(rcx)._1to8()));
+ TEST_INSTRUCTION("6261FD48E65A7F" , vcvttpd2dq(ymm27, zmmword_ptr(rdx, 8128)));
+ TEST_INSTRUCTION("6261FD48E69A00200000" , vcvttpd2dq(ymm27, zmmword_ptr(rdx, 8192)));
+ TEST_INSTRUCTION("6261FD48E65A80" , vcvttpd2dq(ymm27, zmmword_ptr(rdx, -8192)));
+ TEST_INSTRUCTION("6261FD48E69AC0DFFFFF" , vcvttpd2dq(ymm27, zmmword_ptr(rdx, -8256)));
+ TEST_INSTRUCTION("6261FD58E65A7F" , vcvttpd2dq(ymm27, qword_ptr(rdx, 1016)._1to8()));
+ TEST_INSTRUCTION("6261FD58E69A00040000" , vcvttpd2dq(ymm27, qword_ptr(rdx, 1024)._1to8()));
+ TEST_INSTRUCTION("6261FD58E65A80" , vcvttpd2dq(ymm27, qword_ptr(rdx, -1024)._1to8()));
+ TEST_INSTRUCTION("6261FD58E69AF8FBFFFF" , vcvttpd2dq(ymm27, qword_ptr(rdx, -1032)._1to8()));
+ TEST_INSTRUCTION("62117E485BF1" , vcvttps2dq(zmm14, zmm25));
+ TEST_INSTRUCTION("62117E4B5BF1" , k(k3).vcvttps2dq(zmm14, zmm25));
+ TEST_INSTRUCTION("62117ECB5BF1" , k(k3).z().vcvttps2dq(zmm14, zmm25));
+ TEST_INSTRUCTION("62117E185BF1" , sae().vcvttps2dq(zmm14, zmm25));
+ TEST_INSTRUCTION("62717E485B31" , vcvttps2dq(zmm14, zmmword_ptr(rcx)));
+ TEST_INSTRUCTION("62317E485BB4F023010000" , vcvttps2dq(zmm14, zmmword_ptr(rax, r14, 3, 291)));
+ TEST_INSTRUCTION("62717E585B31" , vcvttps2dq(zmm14, dword_ptr(rcx)._1to16()));
+ TEST_INSTRUCTION("62717E485B727F" , vcvttps2dq(zmm14, zmmword_ptr(rdx, 8128)));
+ TEST_INSTRUCTION("62717E485BB200200000" , vcvttps2dq(zmm14, zmmword_ptr(rdx, 8192)));
+ TEST_INSTRUCTION("62717E485B7280" , vcvttps2dq(zmm14, zmmword_ptr(rdx, -8192)));
+ TEST_INSTRUCTION("62717E485BB2C0DFFFFF" , vcvttps2dq(zmm14, zmmword_ptr(rdx, -8256)));
+ TEST_INSTRUCTION("62717E585B727F" , vcvttps2dq(zmm14, dword_ptr(rdx, 508)._1to16()));
+ TEST_INSTRUCTION("62717E585BB200020000" , vcvttps2dq(zmm14, dword_ptr(rdx, 512)._1to16()));
+ TEST_INSTRUCTION("62717E585B7280" , vcvttps2dq(zmm14, dword_ptr(rdx, -512)._1to16()));
+ TEST_INSTRUCTION("62717E585BB2FCFDFFFF" , vcvttps2dq(zmm14, dword_ptr(rdx, -516)._1to16()));
+ TEST_INSTRUCTION("62F17F182CC3" , sae().vcvttsd2si(eax, xmm3));
+ TEST_INSTRUCTION("62F17F182CEB" , sae().vcvttsd2si(ebp, xmm3));
+ TEST_INSTRUCTION("62717F182CEB" , sae().vcvttsd2si(r13d, xmm3));
+ TEST_INSTRUCTION("62F1FF182CC1" , sae().vcvttsd2si(rax, xmm1));
+ TEST_INSTRUCTION("6271FF182CC1" , sae().vcvttsd2si(r8, xmm1));
+ TEST_INSTRUCTION("62D17E182CC6" , sae().vcvttss2si(eax, xmm14));
+ TEST_INSTRUCTION("62D17E182CEE" , sae().vcvttss2si(ebp, xmm14));
+ TEST_INSTRUCTION("62517E182CEE" , sae().vcvttss2si(r13d, xmm14));
+ TEST_INSTRUCTION("62B1FE182CC5" , sae().vcvttss2si(rax, xmm21));
+ TEST_INSTRUCTION("6231FE182CC5" , sae().vcvttss2si(r8, xmm21));
+ TEST_INSTRUCTION("62C17E487AD6" , vcvtudq2pd(zmm18, ymm14));
+ TEST_INSTRUCTION("62C17E4B7AD6" , k(k3).vcvtudq2pd(zmm18, ymm14));
+ TEST_INSTRUCTION("62C17ECB7AD6" , k(k3).z().vcvtudq2pd(zmm18, ymm14));
+ TEST_INSTRUCTION("62E17E487A11" , vcvtudq2pd(zmm18, ymmword_ptr(rcx)));
+ TEST_INSTRUCTION("62A17E487A94F023010000" , vcvtudq2pd(zmm18, ymmword_ptr(rax, r14, 3, 291)));
+ TEST_INSTRUCTION("62E17E587A11" , vcvtudq2pd(zmm18, dword_ptr(rcx)._1to8()));
+ TEST_INSTRUCTION("62E17E487A527F" , vcvtudq2pd(zmm18, ymmword_ptr(rdx, 4064)));
+ TEST_INSTRUCTION("62E17E487A9200100000" , vcvtudq2pd(zmm18, ymmword_ptr(rdx, 4096)));
+ TEST_INSTRUCTION("62E17E487A5280" , vcvtudq2pd(zmm18, ymmword_ptr(rdx, -4096)));
+ TEST_INSTRUCTION("62E17E487A92E0EFFFFF" , vcvtudq2pd(zmm18, ymmword_ptr(rdx, -4128)));
+ TEST_INSTRUCTION("62E17E587A527F" , vcvtudq2pd(zmm18, dword_ptr(rdx, 508)._1to8()));
+ TEST_INSTRUCTION("62E17E587A9200020000" , vcvtudq2pd(zmm18, dword_ptr(rdx, 512)._1to8()));
+ TEST_INSTRUCTION("62E17E587A5280" , vcvtudq2pd(zmm18, dword_ptr(rdx, -512)._1to8()));
+ TEST_INSTRUCTION("62E17E587A92FCFDFFFF" , vcvtudq2pd(zmm18, dword_ptr(rdx, -516)._1to8()));
+ TEST_INSTRUCTION("62E17F487AD7" , vcvtudq2ps(zmm18, zmm7));
+ TEST_INSTRUCTION("62E17F4A7AD7" , k(k2).vcvtudq2ps(zmm18, zmm7));
+ TEST_INSTRUCTION("62E17FCA7AD7" , k(k2).z().vcvtudq2ps(zmm18, zmm7));
+ TEST_INSTRUCTION("62E17F187AD7" , rn_sae().vcvtudq2ps(zmm18, zmm7));
+ TEST_INSTRUCTION("62E17F587AD7" , ru_sae().vcvtudq2ps(zmm18, zmm7));
+ TEST_INSTRUCTION("62E17F387AD7" , rd_sae().vcvtudq2ps(zmm18, zmm7));
+ TEST_INSTRUCTION("62E17F787AD7" , rz_sae().vcvtudq2ps(zmm18, zmm7));
+ TEST_INSTRUCTION("62E17F487A11" , vcvtudq2ps(zmm18, zmmword_ptr(rcx)));
+ TEST_INSTRUCTION("62A17F487A94F023010000" , vcvtudq2ps(zmm18, zmmword_ptr(rax, r14, 3, 291)));
+ TEST_INSTRUCTION("62E17F587A11" , vcvtudq2ps(zmm18, dword_ptr(rcx)._1to16()));
+ TEST_INSTRUCTION("62E17F487A527F" , vcvtudq2ps(zmm18, zmmword_ptr(rdx, 8128)));
+ TEST_INSTRUCTION("62E17F487A9200200000" , vcvtudq2ps(zmm18, zmmword_ptr(rdx, 8192)));
+ TEST_INSTRUCTION("62E17F487A5280" , vcvtudq2ps(zmm18, zmmword_ptr(rdx, -8192)));
+ TEST_INSTRUCTION("62E17F487A92C0DFFFFF" , vcvtudq2ps(zmm18, zmmword_ptr(rdx, -8256)));
+ TEST_INSTRUCTION("62E17F587A527F" , vcvtudq2ps(zmm18, dword_ptr(rdx, 508)._1to16()));
+ TEST_INSTRUCTION("62E17F587A9200020000" , vcvtudq2ps(zmm18, dword_ptr(rdx, 512)._1to16()));
+ TEST_INSTRUCTION("62E17F587A5280" , vcvtudq2ps(zmm18, dword_ptr(rdx, -512)._1to16()));
+ TEST_INSTRUCTION("62E17F587A92FCFDFFFF" , vcvtudq2ps(zmm18, dword_ptr(rdx, -516)._1to16()));
+ TEST_INSTRUCTION("62C1CD485ED3" , vdivpd(zmm18, zmm6, zmm11));
+ TEST_INSTRUCTION("62C1CD4C5ED3" , k(k4).vdivpd(zmm18, zmm6, zmm11));
+ TEST_INSTRUCTION("62C1CDCC5ED3" , k(k4).z().vdivpd(zmm18, zmm6, zmm11));
+ TEST_INSTRUCTION("62C1CD185ED3" , rn_sae().vdivpd(zmm18, zmm6, zmm11));
+ TEST_INSTRUCTION("62C1CD585ED3" , ru_sae().vdivpd(zmm18, zmm6, zmm11));
+ TEST_INSTRUCTION("62C1CD385ED3" , rd_sae().vdivpd(zmm18, zmm6, zmm11));
+ TEST_INSTRUCTION("62C1CD785ED3" , rz_sae().vdivpd(zmm18, zmm6, zmm11));
+ TEST_INSTRUCTION("62E1CD485E11" , vdivpd(zmm18, zmm6, zmmword_ptr(rcx)));
+ TEST_INSTRUCTION("62A1CD485E94F023010000" , vdivpd(zmm18, zmm6, zmmword_ptr(rax, r14, 3, 291)));
+ TEST_INSTRUCTION("62E1CD585E11" , vdivpd(zmm18, zmm6, qword_ptr(rcx)._1to8()));
+ TEST_INSTRUCTION("62E1CD485E527F" , vdivpd(zmm18, zmm6, zmmword_ptr(rdx, 8128)));
+ TEST_INSTRUCTION("62E1CD485E9200200000" , vdivpd(zmm18, zmm6, zmmword_ptr(rdx, 8192)));
+ TEST_INSTRUCTION("62E1CD485E5280" , vdivpd(zmm18, zmm6, zmmword_ptr(rdx, -8192)));
+ TEST_INSTRUCTION("62E1CD485E92C0DFFFFF" , vdivpd(zmm18, zmm6, zmmword_ptr(rdx, -8256)));
+ TEST_INSTRUCTION("62E1CD585E527F" , vdivpd(zmm18, zmm6, qword_ptr(rdx, 1016)._1to8()));
+ TEST_INSTRUCTION("62E1CD585E9200040000" , vdivpd(zmm18, zmm6, qword_ptr(rdx, 1024)._1to8()));
+ TEST_INSTRUCTION("62E1CD585E5280" , vdivpd(zmm18, zmm6, qword_ptr(rdx, -1024)._1to8()));
+ TEST_INSTRUCTION("62E1CD585E92F8FBFFFF" , vdivpd(zmm18, zmm6, qword_ptr(rdx, -1032)._1to8()));
+ TEST_INSTRUCTION("628144405EFC" , vdivps(zmm23, zmm23, zmm28));
+ TEST_INSTRUCTION("628144425EFC" , k(k2).vdivps(zmm23, zmm23, zmm28));
+ TEST_INSTRUCTION("628144C25EFC" , k(k2).z().vdivps(zmm23, zmm23, zmm28));
+ TEST_INSTRUCTION("628144105EFC" , rn_sae().vdivps(zmm23, zmm23, zmm28));
+ TEST_INSTRUCTION("628144505EFC" , ru_sae().vdivps(zmm23, zmm23, zmm28));
+ TEST_INSTRUCTION("628144305EFC" , rd_sae().vdivps(zmm23, zmm23, zmm28));
+ TEST_INSTRUCTION("628144705EFC" , rz_sae().vdivps(zmm23, zmm23, zmm28));
+ TEST_INSTRUCTION("62E144405E39" , vdivps(zmm23, zmm23, zmmword_ptr(rcx)));
+ TEST_INSTRUCTION("62A144405EBCF023010000" , vdivps(zmm23, zmm23, zmmword_ptr(rax, r14, 3, 291)));
+ TEST_INSTRUCTION("62E144505E39" , vdivps(zmm23, zmm23, dword_ptr(rcx)._1to16()));
+ TEST_INSTRUCTION("62E144405E7A7F" , vdivps(zmm23, zmm23, zmmword_ptr(rdx, 8128)));
+ TEST_INSTRUCTION("62E144405EBA00200000" , vdivps(zmm23, zmm23, zmmword_ptr(rdx, 8192)));
+ TEST_INSTRUCTION("62E144405E7A80" , vdivps(zmm23, zmm23, zmmword_ptr(rdx, -8192)));
+ TEST_INSTRUCTION("62E144405EBAC0DFFFFF" , vdivps(zmm23, zmm23, zmmword_ptr(rdx, -8256)));
+ TEST_INSTRUCTION("62E144505E7A7F" , vdivps(zmm23, zmm23, dword_ptr(rdx, 508)._1to16()));
+ TEST_INSTRUCTION("62E144505EBA00020000" , vdivps(zmm23, zmm23, dword_ptr(rdx, 512)._1to16()));
+ TEST_INSTRUCTION("62E144505E7A80" , vdivps(zmm23, zmm23, dword_ptr(rdx, -512)._1to16()));
+ TEST_INSTRUCTION("62E144505EBAFCFDFFFF" , vdivps(zmm23, zmm23, dword_ptr(rdx, -516)._1to16()));
+ TEST_INSTRUCTION("622197085EEE" , vdivsd(xmm29, xmm13, xmm22));
+ TEST_INSTRUCTION("6221970B5EEE" , k(k3).vdivsd(xmm29, xmm13, xmm22));
+ TEST_INSTRUCTION("6221978B5EEE" , k(k3).z().vdivsd(xmm29, xmm13, xmm22));
+ TEST_INSTRUCTION("622197185EEE" , rn_sae().vdivsd(xmm29, xmm13, xmm22));
+ TEST_INSTRUCTION("622197585EEE" , ru_sae().vdivsd(xmm29, xmm13, xmm22));
+ TEST_INSTRUCTION("622197385EEE" , rd_sae().vdivsd(xmm29, xmm13, xmm22));
+ TEST_INSTRUCTION("622197785EEE" , rz_sae().vdivsd(xmm29, xmm13, xmm22));
+ TEST_INSTRUCTION("626197085E29" , vdivsd(xmm29, xmm13, qword_ptr(rcx)));
+ TEST_INSTRUCTION("622197085EACF023010000" , vdivsd(xmm29, xmm13, qword_ptr(rax, r14, 3, 291)));
+ TEST_INSTRUCTION("626197085E6A7F" , vdivsd(xmm29, xmm13, qword_ptr(rdx, 1016)));
+ TEST_INSTRUCTION("626197085EAA00040000" , vdivsd(xmm29, xmm13, qword_ptr(rdx, 1024)));
+ TEST_INSTRUCTION("626197085E6A80" , vdivsd(xmm29, xmm13, qword_ptr(rdx, -1024)));
+ TEST_INSTRUCTION("626197085EAAF8FBFFFF" , vdivsd(xmm29, xmm13, qword_ptr(rdx, -1032)));
+ TEST_INSTRUCTION("62A14E085EE9" , vdivss(xmm21, xmm6, xmm17));
+ TEST_INSTRUCTION("62A14E0D5EE9" , k(k5).vdivss(xmm21, xmm6, xmm17));
+ TEST_INSTRUCTION("62A14E8D5EE9" , k(k5).z().vdivss(xmm21, xmm6, xmm17));
+ TEST_INSTRUCTION("62A14E185EE9" , rn_sae().vdivss(xmm21, xmm6, xmm17));
+ TEST_INSTRUCTION("62A14E585EE9" , ru_sae().vdivss(xmm21, xmm6, xmm17));
+ TEST_INSTRUCTION("62A14E385EE9" , rd_sae().vdivss(xmm21, xmm6, xmm17));
+ TEST_INSTRUCTION("62A14E785EE9" , rz_sae().vdivss(xmm21, xmm6, xmm17));
+ TEST_INSTRUCTION("62E14E085E29" , vdivss(xmm21, xmm6, dword_ptr(rcx)));
+ TEST_INSTRUCTION("62A14E085EACF023010000" , vdivss(xmm21, xmm6, dword_ptr(rax, r14, 3, 291)));
+ TEST_INSTRUCTION("62E14E085E6A7F" , vdivss(xmm21, xmm6, dword_ptr(rdx, 508)));
+ TEST_INSTRUCTION("62E14E085EAA00020000" , vdivss(xmm21, xmm6, dword_ptr(rdx, 512)));
+ TEST_INSTRUCTION("62E14E085E6A80" , vdivss(xmm21, xmm6, dword_ptr(rdx, -512)));
+ TEST_INSTRUCTION("62E14E085EAAFCFDFFFF" , vdivss(xmm21, xmm6, dword_ptr(rdx, -516)));
+ TEST_INSTRUCTION("6262FD488801" , vexpandpd(zmm24, zmmword_ptr(rcx)));
+ TEST_INSTRUCTION("6262FD4C8801" , k(k4).vexpandpd(zmm24, zmmword_ptr(rcx)));
+ TEST_INSTRUCTION("6262FDCC8801" , k(k4).z().vexpandpd(zmm24, zmmword_ptr(rcx)));
+ TEST_INSTRUCTION("6222FD488884F023010000" , vexpandpd(zmm24, zmmword_ptr(rax, r14, 3, 291)));
+ TEST_INSTRUCTION("6262FD4888427F" , vexpandpd(zmm24, zmmword_ptr(rdx, 1016)));
+ TEST_INSTRUCTION("6262FD48888200040000" , vexpandpd(zmm24, zmmword_ptr(rdx, 1024)));
+ TEST_INSTRUCTION("6262FD48884280" , vexpandpd(zmm24, zmmword_ptr(rdx, -1024)));
+ TEST_INSTRUCTION("6262FD488882F8FBFFFF" , vexpandpd(zmm24, zmmword_ptr(rdx, -1032)));
+ TEST_INSTRUCTION("62C2FD4888FF" , vexpandpd(zmm23, zmm15));
+ TEST_INSTRUCTION("62C2FD4D88FF" , k(k5).vexpandpd(zmm23, zmm15));
+ TEST_INSTRUCTION("62C2FDCD88FF" , k(k5).z().vexpandpd(zmm23, zmm15));
+ TEST_INSTRUCTION("62F27D488821" , vexpandps(zmm4, zmmword_ptr(rcx)));
+ TEST_INSTRUCTION("62F27D4E8821" , k(k6).vexpandps(zmm4, zmmword_ptr(rcx)));
+ TEST_INSTRUCTION("62F27DCE8821" , k(k6).z().vexpandps(zmm4, zmmword_ptr(rcx)));
+ TEST_INSTRUCTION("62B27D4888A4F023010000" , vexpandps(zmm4, zmmword_ptr(rax, r14, 3, 291)));
+ TEST_INSTRUCTION("62F27D4888627F" , vexpandps(zmm4, zmmword_ptr(rdx, 508)));
+ TEST_INSTRUCTION("62F27D4888A200020000" , vexpandps(zmm4, zmmword_ptr(rdx, 512)));
+ TEST_INSTRUCTION("62F27D48886280" , vexpandps(zmm4, zmmword_ptr(rdx, -512)));
+ TEST_INSTRUCTION("62F27D4888A2FCFDFFFF" , vexpandps(zmm4, zmmword_ptr(rdx, -516)));
+ TEST_INSTRUCTION("62527D4888F1" , vexpandps(zmm14, zmm9));
+ TEST_INSTRUCTION("62527D4A88F1" , k(k2).vexpandps(zmm14, zmm9));
+ TEST_INSTRUCTION("62527DCA88F1" , k(k2).z().vexpandps(zmm14, zmm9));
+ TEST_INSTRUCTION("62C37D4819EFAB" , vextractf32x4(xmm15, zmm21, 171));
+ TEST_INSTRUCTION("62C37D4919EFAB" , k(k1).vextractf32x4(xmm15, zmm21, 171));
+ TEST_INSTRUCTION("62C37DC919EFAB" , k(k1).z().vextractf32x4(xmm15, zmm21, 171));
+ TEST_INSTRUCTION("62C37D4819EF7B" , vextractf32x4(xmm15, zmm21, 123));
+ TEST_INSTRUCTION("6243FD481BC3AB" , vextractf64x4(ymm11, zmm24, 171));
+ TEST_INSTRUCTION("6243FD4D1BC3AB" , k(k5).vextractf64x4(ymm11, zmm24, 171));
+ TEST_INSTRUCTION("6243FDCD1BC3AB" , k(k5).z().vextractf64x4(ymm11, zmm24, 171));
+ TEST_INSTRUCTION("6243FD481BC37B" , vextractf64x4(ymm11, zmm24, 123));
+ TEST_INSTRUCTION("62C37D4839C5AB" , vextracti32x4(xmm13, zmm16, 171));
+ TEST_INSTRUCTION("62C37D4D39C5AB" , k(k5).vextracti32x4(xmm13, zmm16, 171));
+ TEST_INSTRUCTION("62C37DCD39C5AB" , k(k5).z().vextracti32x4(xmm13, zmm16, 171));
+ TEST_INSTRUCTION("62C37D4839C57B" , vextracti32x4(xmm13, zmm16, 123));
+ TEST_INSTRUCTION("62C3FD483BC5AB" , vextracti64x4(ymm13, zmm16, 171));
+ TEST_INSTRUCTION("62C3FD4B3BC5AB" , k(k3).vextracti64x4(ymm13, zmm16, 171));
+ TEST_INSTRUCTION("62C3FDCB3BC5AB" , k(k3).z().vextracti64x4(ymm13, zmm16, 171));
+ TEST_INSTRUCTION("62C3FD483BC57B" , vextracti64x4(ymm13, zmm16, 123));
+ TEST_INSTRUCTION("62637D0817C0AB" , vextractps(eax, xmm24, 171));
+ TEST_INSTRUCTION("62637D0817C07B" , vextractps(eax, xmm24, 123));
+ TEST_INSTRUCTION("62437D0817C07B" , vextractps(r8d, xmm24, 123));
+ TEST_INSTRUCTION("62637D0817017B" , vextractps(dword_ptr(rcx), xmm24, 123));
+ TEST_INSTRUCTION("62237D081784F0230100007B" , vextractps(dword_ptr(rax, r14, 3, 291), xmm24, 123));
+ TEST_INSTRUCTION("62637D0817427F7B" , vextractps(dword_ptr(rdx, 508), xmm24, 123));
+ TEST_INSTRUCTION("62637D081782000200007B" , vextractps(dword_ptr(rdx, 512), xmm24, 123));
+ TEST_INSTRUCTION("62637D081742807B" , vextractps(dword_ptr(rdx, -512), xmm24, 123));
+ TEST_INSTRUCTION("62637D081782FCFDFFFF7B" , vextractps(dword_ptr(rdx, -516), xmm24, 123));
+ TEST_INSTRUCTION("6222FD4098D5" , vfmadd132pd(zmm26, zmm16, zmm21));
+ TEST_INSTRUCTION("6222FD4598D5" , k(k5).vfmadd132pd(zmm26, zmm16, zmm21));
+ TEST_INSTRUCTION("6222FDC598D5" , k(k5).z().vfmadd132pd(zmm26, zmm16, zmm21));
+ TEST_INSTRUCTION("6222FD1098D5" , rn_sae().vfmadd132pd(zmm26, zmm16, zmm21));
+ TEST_INSTRUCTION("6222FD5098D5" , ru_sae().vfmadd132pd(zmm26, zmm16, zmm21));
+ TEST_INSTRUCTION("6222FD3098D5" , rd_sae().vfmadd132pd(zmm26, zmm16, zmm21));
+ TEST_INSTRUCTION("6222FD7098D5" , rz_sae().vfmadd132pd(zmm26, zmm16, zmm21));
+ TEST_INSTRUCTION("6262FD409811" , vfmadd132pd(zmm26, zmm16, zmmword_ptr(rcx)));
+ TEST_INSTRUCTION("6222FD409894F023010000" , vfmadd132pd(zmm26, zmm16, zmmword_ptr(rax, r14, 3, 291)));
+ TEST_INSTRUCTION("6262FD509811" , vfmadd132pd(zmm26, zmm16, qword_ptr(rcx)._1to8()));
+ TEST_INSTRUCTION("6262FD4098527F" , vfmadd132pd(zmm26, zmm16, zmmword_ptr(rdx, 8128)));
+ TEST_INSTRUCTION("6262FD40989200200000" , vfmadd132pd(zmm26, zmm16, zmmword_ptr(rdx, 8192)));
+ TEST_INSTRUCTION("6262FD40985280" , vfmadd132pd(zmm26, zmm16, zmmword_ptr(rdx, -8192)));
+ TEST_INSTRUCTION("6262FD409892C0DFFFFF" , vfmadd132pd(zmm26, zmm16, zmmword_ptr(rdx, -8256)));
+ TEST_INSTRUCTION("6262FD5098527F" , vfmadd132pd(zmm26, zmm16, qword_ptr(rdx, 1016)._1to8()));
+ TEST_INSTRUCTION("6262FD50989200040000" , vfmadd132pd(zmm26, zmm16, qword_ptr(rdx, 1024)._1to8()));
+ TEST_INSTRUCTION("6262FD50985280" , vfmadd132pd(zmm26, zmm16, qword_ptr(rdx, -1024)._1to8()));
+ TEST_INSTRUCTION("6262FD509892F8FBFFFF" , vfmadd132pd(zmm26, zmm16, qword_ptr(rdx, -1032)._1to8()));
+ TEST_INSTRUCTION("62925D4098C9" , vfmadd132ps(zmm1, zmm20, zmm25));
+ TEST_INSTRUCTION("62925D4198C9" , k(k1).vfmadd132ps(zmm1, zmm20, zmm25));
+ TEST_INSTRUCTION("62925DC198C9" , k(k1).z().vfmadd132ps(zmm1, zmm20, zmm25));
+ TEST_INSTRUCTION("62925D1098C9" , rn_sae().vfmadd132ps(zmm1, zmm20, zmm25));
+ TEST_INSTRUCTION("62925D5098C9" , ru_sae().vfmadd132ps(zmm1, zmm20, zmm25));
+ TEST_INSTRUCTION("62925D3098C9" , rd_sae().vfmadd132ps(zmm1, zmm20, zmm25));
+ TEST_INSTRUCTION("62925D7098C9" , rz_sae().vfmadd132ps(zmm1, zmm20, zmm25));
+ TEST_INSTRUCTION("62F25D409809" , vfmadd132ps(zmm1, zmm20, zmmword_ptr(rcx)));
+ TEST_INSTRUCTION("62B25D40988CF023010000" , vfmadd132ps(zmm1, zmm20, zmmword_ptr(rax, r14, 3, 291)));
+ TEST_INSTRUCTION("62F25D509809" , vfmadd132ps(zmm1, zmm20, dword_ptr(rcx)._1to16()));
+ TEST_INSTRUCTION("62F25D40984A7F" , vfmadd132ps(zmm1, zmm20, zmmword_ptr(rdx, 8128)));
+ TEST_INSTRUCTION("62F25D40988A00200000" , vfmadd132ps(zmm1, zmm20, zmmword_ptr(rdx, 8192)));
+ TEST_INSTRUCTION("62F25D40984A80" , vfmadd132ps(zmm1, zmm20, zmmword_ptr(rdx, -8192)));
+ TEST_INSTRUCTION("62F25D40988AC0DFFFFF" , vfmadd132ps(zmm1, zmm20, zmmword_ptr(rdx, -8256)));
+ TEST_INSTRUCTION("62F25D50984A7F" , vfmadd132ps(zmm1, zmm20, dword_ptr(rdx, 508)._1to16()));
+ TEST_INSTRUCTION("62F25D50988A00020000" , vfmadd132ps(zmm1, zmm20, dword_ptr(rdx, 512)._1to16()));
+ TEST_INSTRUCTION("62F25D50984A80" , vfmadd132ps(zmm1, zmm20, dword_ptr(rdx, -512)._1to16()));
+ TEST_INSTRUCTION("62F25D50988AFCFDFFFF" , vfmadd132ps(zmm1, zmm20, dword_ptr(rdx, -516)._1to16()));
+ TEST_INSTRUCTION("6262F50099E3" , vfmadd132sd(xmm28, xmm17, xmm3));
+ TEST_INSTRUCTION("6262F50299E3" , k(k2).vfmadd132sd(xmm28, xmm17, xmm3));
+ TEST_INSTRUCTION("6262F58299E3" , k(k2).z().vfmadd132sd(xmm28, xmm17, xmm3));
+ TEST_INSTRUCTION("6262F51099E3" , rn_sae().vfmadd132sd(xmm28, xmm17, xmm3));
+ TEST_INSTRUCTION("6262F55099E3" , ru_sae().vfmadd132sd(xmm28, xmm17, xmm3));
+ TEST_INSTRUCTION("6262F53099E3" , rd_sae().vfmadd132sd(xmm28, xmm17, xmm3));
+ TEST_INSTRUCTION("6262F57099E3" , rz_sae().vfmadd132sd(xmm28, xmm17, xmm3));
+ TEST_INSTRUCTION("6262F5009921" , vfmadd132sd(xmm28, xmm17, qword_ptr(rcx)));
+ TEST_INSTRUCTION("6222F50099A4F023010000" , vfmadd132sd(xmm28, xmm17, qword_ptr(rax, r14, 3, 291)));
+ TEST_INSTRUCTION("6262F50099627F" , vfmadd132sd(xmm28, xmm17, qword_ptr(rdx, 1016)));
+ TEST_INSTRUCTION("6262F50099A200040000" , vfmadd132sd(xmm28, xmm17, qword_ptr(rdx, 1024)));
+ TEST_INSTRUCTION("6262F500996280" , vfmadd132sd(xmm28, xmm17, qword_ptr(rdx, -1024)));
+ TEST_INSTRUCTION("6262F50099A2F8FBFFFF" , vfmadd132sd(xmm28, xmm17, qword_ptr(rdx, -1032)));
+ TEST_INSTRUCTION("6222750099F6" , vfmadd132ss(xmm30, xmm17, xmm22));
+ TEST_INSTRUCTION("6222750399F6" , k(k3).vfmadd132ss(xmm30, xmm17, xmm22));
+ TEST_INSTRUCTION("6222758399F6" , k(k3).z().vfmadd132ss(xmm30, xmm17, xmm22));
+ TEST_INSTRUCTION("6222751099F6" , rn_sae().vfmadd132ss(xmm30, xmm17, xmm22));
+ TEST_INSTRUCTION("6222755099F6" , ru_sae().vfmadd132ss(xmm30, xmm17, xmm22));
+ TEST_INSTRUCTION("6222753099F6" , rd_sae().vfmadd132ss(xmm30, xmm17, xmm22));
+ TEST_INSTRUCTION("6222757099F6" , rz_sae().vfmadd132ss(xmm30, xmm17, xmm22));
+ TEST_INSTRUCTION("626275009931" , vfmadd132ss(xmm30, xmm17, dword_ptr(rcx)));
+ TEST_INSTRUCTION("6222750099B4F023010000" , vfmadd132ss(xmm30, xmm17, dword_ptr(rax, r14, 3, 291)));
+ TEST_INSTRUCTION("6262750099727F" , vfmadd132ss(xmm30, xmm17, dword_ptr(rdx, 508)));
+ TEST_INSTRUCTION("6262750099B200020000" , vfmadd132ss(xmm30, xmm17, dword_ptr(rdx, 512)));
+ TEST_INSTRUCTION("62627500997280" , vfmadd132ss(xmm30, xmm17, dword_ptr(rdx, -512)));
+ TEST_INSTRUCTION("6262750099B2FCFDFFFF" , vfmadd132ss(xmm30, xmm17, dword_ptr(rdx, -516)));
+ TEST_INSTRUCTION("6282FD40A8D1" , vfmadd213pd(zmm18, zmm16, zmm25));
+ TEST_INSTRUCTION("6282FD43A8D1" , k(k3).vfmadd213pd(zmm18, zmm16, zmm25));
+ TEST_INSTRUCTION("6282FDC3A8D1" , k(k3).z().vfmadd213pd(zmm18, zmm16, zmm25));
+ TEST_INSTRUCTION("6282FD10A8D1" , rn_sae().vfmadd213pd(zmm18, zmm16, zmm25));
+ TEST_INSTRUCTION("6282FD50A8D1" , ru_sae().vfmadd213pd(zmm18, zmm16, zmm25));
+ TEST_INSTRUCTION("6282FD30A8D1" , rd_sae().vfmadd213pd(zmm18, zmm16, zmm25));
+ TEST_INSTRUCTION("6282FD70A8D1" , rz_sae().vfmadd213pd(zmm18, zmm16, zmm25));
+ TEST_INSTRUCTION("62E2FD40A811" , vfmadd213pd(zmm18, zmm16, zmmword_ptr(rcx)));
+ TEST_INSTRUCTION("62A2FD40A894F023010000" , vfmadd213pd(zmm18, zmm16, zmmword_ptr(rax, r14, 3, 291)));
+ TEST_INSTRUCTION("62E2FD50A811" , vfmadd213pd(zmm18, zmm16, qword_ptr(rcx)._1to8()));
+ TEST_INSTRUCTION("62E2FD40A8527F" , vfmadd213pd(zmm18, zmm16, zmmword_ptr(rdx, 8128)));
+ TEST_INSTRUCTION("62E2FD40A89200200000" , vfmadd213pd(zmm18, zmm16, zmmword_ptr(rdx, 8192)));
+ TEST_INSTRUCTION("62E2FD40A85280" , vfmadd213pd(zmm18, zmm16, zmmword_ptr(rdx, -8192)));
+ TEST_INSTRUCTION("62E2FD40A892C0DFFFFF" , vfmadd213pd(zmm18, zmm16, zmmword_ptr(rdx, -8256)));
+ TEST_INSTRUCTION("62E2FD50A8527F" , vfmadd213pd(zmm18, zmm16, qword_ptr(rdx, 1016)._1to8()));
+ TEST_INSTRUCTION("62E2FD50A89200040000" , vfmadd213pd(zmm18, zmm16, qword_ptr(rdx, 1024)._1to8()));
+ TEST_INSTRUCTION("62E2FD50A85280" , vfmadd213pd(zmm18, zmm16, qword_ptr(rdx, -1024)._1to8()));
+ TEST_INSTRUCTION("62E2FD50A892F8FBFFFF" , vfmadd213pd(zmm18, zmm16, qword_ptr(rdx, -1032)._1to8()));
+ TEST_INSTRUCTION("62C26540A8E6" , vfmadd213ps(zmm20, zmm19, zmm14));
+ TEST_INSTRUCTION("62C26544A8E6" , k(k4).vfmadd213ps(zmm20, zmm19, zmm14));
+ TEST_INSTRUCTION("62C265C4A8E6" , k(k4).z().vfmadd213ps(zmm20, zmm19, zmm14));
+ TEST_INSTRUCTION("62C26510A8E6" , rn_sae().vfmadd213ps(zmm20, zmm19, zmm14));
+ TEST_INSTRUCTION("62C26550A8E6" , ru_sae().vfmadd213ps(zmm20, zmm19, zmm14));
+ TEST_INSTRUCTION("62C26530A8E6" , rd_sae().vfmadd213ps(zmm20, zmm19, zmm14));
+ TEST_INSTRUCTION("62C26570A8E6" , rz_sae().vfmadd213ps(zmm20, zmm19, zmm14));
+ TEST_INSTRUCTION("62E26540A821" , vfmadd213ps(zmm20, zmm19, zmmword_ptr(rcx)));
+ TEST_INSTRUCTION("62A26540A8A4F023010000" , vfmadd213ps(zmm20, zmm19, zmmword_ptr(rax, r14, 3, 291)));
+ TEST_INSTRUCTION("62E26550A821" , vfmadd213ps(zmm20, zmm19, dword_ptr(rcx)._1to16()));
+ TEST_INSTRUCTION("62E26540A8627F" , vfmadd213ps(zmm20, zmm19, zmmword_ptr(rdx, 8128)));
+ TEST_INSTRUCTION("62E26540A8A200200000" , vfmadd213ps(zmm20, zmm19, zmmword_ptr(rdx, 8192)));
+ TEST_INSTRUCTION("62E26540A86280" , vfmadd213ps(zmm20, zmm19, zmmword_ptr(rdx, -8192)));
+ TEST_INSTRUCTION("62E26540A8A2C0DFFFFF" , vfmadd213ps(zmm20, zmm19, zmmword_ptr(rdx, -8256)));
+ TEST_INSTRUCTION("62E26550A8627F" , vfmadd213ps(zmm20, zmm19, dword_ptr(rdx, 508)._1to16()));
+ TEST_INSTRUCTION("62E26550A8A200020000" , vfmadd213ps(zmm20, zmm19, dword_ptr(rdx, 512)._1to16()));
+ TEST_INSTRUCTION("62E26550A86280" , vfmadd213ps(zmm20, zmm19, dword_ptr(rdx, -512)._1to16()));
+ TEST_INSTRUCTION("62E26550A8A2FCFDFFFF" , vfmadd213ps(zmm20, zmm19, dword_ptr(rdx, -516)._1to16()));
+ TEST_INSTRUCTION("6242AD00A9C5" , vfmadd213sd(xmm24, xmm26, xmm13));
+ TEST_INSTRUCTION("6242AD03A9C5" , k(k3).vfmadd213sd(xmm24, xmm26, xmm13));
+ TEST_INSTRUCTION("6242AD83A9C5" , k(k3).z().vfmadd213sd(xmm24, xmm26, xmm13));
+ TEST_INSTRUCTION("6242AD10A9C5" , rn_sae().vfmadd213sd(xmm24, xmm26, xmm13));
+ TEST_INSTRUCTION("6242AD50A9C5" , ru_sae().vfmadd213sd(xmm24, xmm26, xmm13));
+ TEST_INSTRUCTION("6242AD30A9C5" , rd_sae().vfmadd213sd(xmm24, xmm26, xmm13));
+ TEST_INSTRUCTION("6242AD70A9C5" , rz_sae().vfmadd213sd(xmm24, xmm26, xmm13));
+ TEST_INSTRUCTION("6262AD00A901" , vfmadd213sd(xmm24, xmm26, qword_ptr(rcx)));
+ TEST_INSTRUCTION("6222AD00A984F023010000" , vfmadd213sd(xmm24, xmm26, qword_ptr(rax, r14, 3, 291)));
+ TEST_INSTRUCTION("6262AD00A9427F" , vfmadd213sd(xmm24, xmm26, qword_ptr(rdx, 1016)));
+ TEST_INSTRUCTION("6262AD00A98200040000" , vfmadd213sd(xmm24, xmm26, qword_ptr(rdx, 1024)));
+ TEST_INSTRUCTION("6262AD00A94280" , vfmadd213sd(xmm24, xmm26, qword_ptr(rdx, -1024)));
+ TEST_INSTRUCTION("6262AD00A982F8FBFFFF" , vfmadd213sd(xmm24, xmm26, qword_ptr(rdx, -1032)));
+ TEST_INSTRUCTION("62224D00A9F0" , vfmadd213ss(xmm30, xmm22, xmm16));
+ TEST_INSTRUCTION("62224D01A9F0" , k(k1).vfmadd213ss(xmm30, xmm22, xmm16));
+ TEST_INSTRUCTION("62224D81A9F0" , k(k1).z().vfmadd213ss(xmm30, xmm22, xmm16));
+ TEST_INSTRUCTION("62224D10A9F0" , rn_sae().vfmadd213ss(xmm30, xmm22, xmm16));
+ TEST_INSTRUCTION("62224D50A9F0" , ru_sae().vfmadd213ss(xmm30, xmm22, xmm16));
+ TEST_INSTRUCTION("62224D30A9F0" , rd_sae().vfmadd213ss(xmm30, xmm22, xmm16));
+ TEST_INSTRUCTION("62224D70A9F0" , rz_sae().vfmadd213ss(xmm30, xmm22, xmm16));
+ TEST_INSTRUCTION("62624D00A931" , vfmadd213ss(xmm30, xmm22, dword_ptr(rcx)));
+ TEST_INSTRUCTION("62224D00A9B4F023010000" , vfmadd213ss(xmm30, xmm22, dword_ptr(rax, r14, 3, 291)));
+ TEST_INSTRUCTION("62624D00A9727F" , vfmadd213ss(xmm30, xmm22, dword_ptr(rdx, 508)));
+ TEST_INSTRUCTION("62624D00A9B200020000" , vfmadd213ss(xmm30, xmm22, dword_ptr(rdx, 512)));
+ TEST_INSTRUCTION("62624D00A97280" , vfmadd213ss(xmm30, xmm22, dword_ptr(rdx, -512)));
+ TEST_INSTRUCTION("62624D00A9B2FCFDFFFF" , vfmadd213ss(xmm30, xmm22, dword_ptr(rdx, -516)));
+ TEST_INSTRUCTION("6242CD48B8F1" , vfmadd231pd(zmm30, zmm6, zmm9));
+ TEST_INSTRUCTION("6242CD4CB8F1" , k(k4).vfmadd231pd(zmm30, zmm6, zmm9));
+ TEST_INSTRUCTION("6242CDCCB8F1" , k(k4).z().vfmadd231pd(zmm30, zmm6, zmm9));
+ TEST_INSTRUCTION("6242CD18B8F1" , rn_sae().vfmadd231pd(zmm30, zmm6, zmm9));
+ TEST_INSTRUCTION("6242CD58B8F1" , ru_sae().vfmadd231pd(zmm30, zmm6, zmm9));
+ TEST_INSTRUCTION("6242CD38B8F1" , rd_sae().vfmadd231pd(zmm30, zmm6, zmm9));
+ TEST_INSTRUCTION("6242CD78B8F1" , rz_sae().vfmadd231pd(zmm30, zmm6, zmm9));
+ TEST_INSTRUCTION("6262CD48B831" , vfmadd231pd(zmm30, zmm6, zmmword_ptr(rcx)));
+ TEST_INSTRUCTION("6222CD48B8B4F023010000" , vfmadd231pd(zmm30, zmm6, zmmword_ptr(rax, r14, 3, 291)));
+ TEST_INSTRUCTION("6262CD58B831" , vfmadd231pd(zmm30, zmm6, qword_ptr(rcx)._1to8()));
+ TEST_INSTRUCTION("6262CD48B8727F" , vfmadd231pd(zmm30, zmm6, zmmword_ptr(rdx, 8128)));
+ TEST_INSTRUCTION("6262CD48B8B200200000" , vfmadd231pd(zmm30, zmm6, zmmword_ptr(rdx, 8192)));
+ TEST_INSTRUCTION("6262CD48B87280" , vfmadd231pd(zmm30, zmm6, zmmword_ptr(rdx, -8192)));
+ TEST_INSTRUCTION("6262CD48B8B2C0DFFFFF" , vfmadd231pd(zmm30, zmm6, zmmword_ptr(rdx, -8256)));
+ TEST_INSTRUCTION("6262CD58B8727F" , vfmadd231pd(zmm30, zmm6, qword_ptr(rdx, 1016)._1to8()));
+ TEST_INSTRUCTION("6262CD58B8B200040000" , vfmadd231pd(zmm30, zmm6, qword_ptr(rdx, 1024)._1to8()));
+ TEST_INSTRUCTION("6262CD58B87280" , vfmadd231pd(zmm30, zmm6, qword_ptr(rdx, -1024)._1to8()));
+ TEST_INSTRUCTION("6262CD58B8B2F8FBFFFF" , vfmadd231pd(zmm30, zmm6, qword_ptr(rdx, -1032)._1to8()));
+ TEST_INSTRUCTION("62021D40B8D9" , vfmadd231ps(zmm27, zmm28, zmm25));
+ TEST_INSTRUCTION("62021D43B8D9" , k(k3).vfmadd231ps(zmm27, zmm28, zmm25));
+ TEST_INSTRUCTION("62021DC3B8D9" , k(k3).z().vfmadd231ps(zmm27, zmm28, zmm25));
+ TEST_INSTRUCTION("62021D10B8D9" , rn_sae().vfmadd231ps(zmm27, zmm28, zmm25));
+ TEST_INSTRUCTION("62021D50B8D9" , ru_sae().vfmadd231ps(zmm27, zmm28, zmm25));
+ TEST_INSTRUCTION("62021D30B8D9" , rd_sae().vfmadd231ps(zmm27, zmm28, zmm25));
+ TEST_INSTRUCTION("62021D70B8D9" , rz_sae().vfmadd231ps(zmm27, zmm28, zmm25));
+ TEST_INSTRUCTION("62621D40B819" , vfmadd231ps(zmm27, zmm28, zmmword_ptr(rcx)));
+ TEST_INSTRUCTION("62221D40B89CF023010000" , vfmadd231ps(zmm27, zmm28, zmmword_ptr(rax, r14, 3, 291)));
+ TEST_INSTRUCTION("62621D50B819" , vfmadd231ps(zmm27, zmm28, dword_ptr(rcx)._1to16()));
+ TEST_INSTRUCTION("62621D40B85A7F" , vfmadd231ps(zmm27, zmm28, zmmword_ptr(rdx, 8128)));
+ TEST_INSTRUCTION("62621D40B89A00200000" , vfmadd231ps(zmm27, zmm28, zmmword_ptr(rdx, 8192)));
+ TEST_INSTRUCTION("62621D40B85A80" , vfmadd231ps(zmm27, zmm28, zmmword_ptr(rdx, -8192)));
+ TEST_INSTRUCTION("62621D40B89AC0DFFFFF" , vfmadd231ps(zmm27, zmm28, zmmword_ptr(rdx, -8256)));
+ TEST_INSTRUCTION("62621D50B85A7F" , vfmadd231ps(zmm27, zmm28, dword_ptr(rdx, 508)._1to16()));
+ TEST_INSTRUCTION("62621D50B89A00020000" , vfmadd231ps(zmm27, zmm28, dword_ptr(rdx, 512)._1to16()));
+ TEST_INSTRUCTION("62621D50B85A80" , vfmadd231ps(zmm27, zmm28, dword_ptr(rdx, -512)._1to16()));
+ TEST_INSTRUCTION("62621D50B89AFCFDFFFF" , vfmadd231ps(zmm27, zmm28, dword_ptr(rdx, -516)._1to16()));
+ TEST_INSTRUCTION("C4C2F1B9E6" , vfmadd231sd(xmm4, xmm1, xmm14));
+ TEST_INSTRUCTION("62D2F509B9E6" , k(k1).vfmadd231sd(xmm4, xmm1, xmm14));
+ TEST_INSTRUCTION("62D2F589B9E6" , k(k1).z().vfmadd231sd(xmm4, xmm1, xmm14));
+ TEST_INSTRUCTION("62D2F518B9E6" , rn_sae().vfmadd231sd(xmm4, xmm1, xmm14));
+ TEST_INSTRUCTION("62D2F558B9E6" , ru_sae().vfmadd231sd(xmm4, xmm1, xmm14));
+ TEST_INSTRUCTION("62D2F538B9E6" , rd_sae().vfmadd231sd(xmm4, xmm1, xmm14));
+ TEST_INSTRUCTION("62D2F578B9E6" , rz_sae().vfmadd231sd(xmm4, xmm1, xmm14));
+ TEST_INSTRUCTION("C4E2F1B921" , vfmadd231sd(xmm4, xmm1, qword_ptr(rcx)));
+ TEST_INSTRUCTION("C4A2F1B9A4F023010000" , vfmadd231sd(xmm4, xmm1, qword_ptr(rax, r14, 3, 291)));
+ TEST_INSTRUCTION("C4E2F1B9A2F8030000" , vfmadd231sd(xmm4, xmm1, qword_ptr(rdx, 1016)));
+ TEST_INSTRUCTION("C4E2F1B9A200040000" , vfmadd231sd(xmm4, xmm1, qword_ptr(rdx, 1024)));
+ TEST_INSTRUCTION("C4E2F1B9A200FCFFFF" , vfmadd231sd(xmm4, xmm1, qword_ptr(rdx, -1024)));
+ TEST_INSTRUCTION("C4E2F1B9A2F8FBFFFF" , vfmadd231sd(xmm4, xmm1, qword_ptr(rdx, -1032)));
+ TEST_INSTRUCTION("62420508B9EA" , vfmadd231ss(xmm29, xmm15, xmm10));
+ TEST_INSTRUCTION("6242050CB9EA" , k(k4).vfmadd231ss(xmm29, xmm15, xmm10));
+ TEST_INSTRUCTION("6242058CB9EA" , k(k4).z().vfmadd231ss(xmm29, xmm15, xmm10));
+ TEST_INSTRUCTION("62420518B9EA" , rn_sae().vfmadd231ss(xmm29, xmm15, xmm10));
+ TEST_INSTRUCTION("62420558B9EA" , ru_sae().vfmadd231ss(xmm29, xmm15, xmm10));
+ TEST_INSTRUCTION("62420538B9EA" , rd_sae().vfmadd231ss(xmm29, xmm15, xmm10));
+ TEST_INSTRUCTION("62420578B9EA" , rz_sae().vfmadd231ss(xmm29, xmm15, xmm10));
+ TEST_INSTRUCTION("62620508B929" , vfmadd231ss(xmm29, xmm15, dword_ptr(rcx)));
+ TEST_INSTRUCTION("62220508B9ACF023010000" , vfmadd231ss(xmm29, xmm15, dword_ptr(rax, r14, 3, 291)));
+ TEST_INSTRUCTION("62620508B96A7F" , vfmadd231ss(xmm29, xmm15, dword_ptr(rdx, 508)));
+ TEST_INSTRUCTION("62620508B9AA00020000" , vfmadd231ss(xmm29, xmm15, dword_ptr(rdx, 512)));
+ TEST_INSTRUCTION("62620508B96A80" , vfmadd231ss(xmm29, xmm15, dword_ptr(rdx, -512)));
+ TEST_INSTRUCTION("62620508B9AAFCFDFFFF" , vfmadd231ss(xmm29, xmm15, dword_ptr(rdx, -516)));
+ TEST_INSTRUCTION("62A2B54096E5" , vfmaddsub132pd(zmm20, zmm25, zmm21));
+ TEST_INSTRUCTION("62A2B54296E5" , k(k2).vfmaddsub132pd(zmm20, zmm25, zmm21));
+ TEST_INSTRUCTION("62A2B5C296E5" , k(k2).z().vfmaddsub132pd(zmm20, zmm25, zmm21));
+ TEST_INSTRUCTION("62A2B51096E5" , rn_sae().vfmaddsub132pd(zmm20, zmm25, zmm21));
+ TEST_INSTRUCTION("62A2B55096E5" , ru_sae().vfmaddsub132pd(zmm20, zmm25, zmm21));
+ TEST_INSTRUCTION("62A2B53096E5" , rd_sae().vfmaddsub132pd(zmm20, zmm25, zmm21));
+ TEST_INSTRUCTION("62A2B57096E5" , rz_sae().vfmaddsub132pd(zmm20, zmm25, zmm21));
+ TEST_INSTRUCTION("62E2B5409621" , vfmaddsub132pd(zmm20, zmm25, zmmword_ptr(rcx)));
+ TEST_INSTRUCTION("62A2B54096A4F023010000" , vfmaddsub132pd(zmm20, zmm25, zmmword_ptr(rax, r14, 3, 291)));
+ TEST_INSTRUCTION("62E2B5509621" , vfmaddsub132pd(zmm20, zmm25, qword_ptr(rcx)._1to8()));
+ TEST_INSTRUCTION("62E2B54096627F" , vfmaddsub132pd(zmm20, zmm25, zmmword_ptr(rdx, 8128)));
+ TEST_INSTRUCTION("62E2B54096A200200000" , vfmaddsub132pd(zmm20, zmm25, zmmword_ptr(rdx, 8192)));
+ TEST_INSTRUCTION("62E2B540966280" , vfmaddsub132pd(zmm20, zmm25, zmmword_ptr(rdx, -8192)));
+ TEST_INSTRUCTION("62E2B54096A2C0DFFFFF" , vfmaddsub132pd(zmm20, zmm25, zmmword_ptr(rdx, -8256)));
+ TEST_INSTRUCTION("62E2B55096627F" , vfmaddsub132pd(zmm20, zmm25, qword_ptr(rdx, 1016)._1to8()));
+ TEST_INSTRUCTION("62E2B55096A200040000" , vfmaddsub132pd(zmm20, zmm25, qword_ptr(rdx, 1024)._1to8()));
+ TEST_INSTRUCTION("62E2B550966280" , vfmaddsub132pd(zmm20, zmm25, qword_ptr(rdx, -1024)._1to8()));
+ TEST_INSTRUCTION("62E2B55096A2F8FBFFFF" , vfmaddsub132pd(zmm20, zmm25, qword_ptr(rdx, -1032)._1to8()));
+ TEST_INSTRUCTION("6232354896D4" , vfmaddsub132ps(zmm10, zmm9, zmm20));
+ TEST_INSTRUCTION("6232354B96D4" , k(k3).vfmaddsub132ps(zmm10, zmm9, zmm20));
+ TEST_INSTRUCTION("623235CB96D4" , k(k3).z().vfmaddsub132ps(zmm10, zmm9, zmm20));
+ TEST_INSTRUCTION("6232351896D4" , rn_sae().vfmaddsub132ps(zmm10, zmm9, zmm20));
+ TEST_INSTRUCTION("6232355896D4" , ru_sae().vfmaddsub132ps(zmm10, zmm9, zmm20));
+ TEST_INSTRUCTION("6232353896D4" , rd_sae().vfmaddsub132ps(zmm10, zmm9, zmm20));
+ TEST_INSTRUCTION("6232357896D4" , rz_sae().vfmaddsub132ps(zmm10, zmm9, zmm20));
+ TEST_INSTRUCTION("627235489611" , vfmaddsub132ps(zmm10, zmm9, zmmword_ptr(rcx)));
+ TEST_INSTRUCTION("623235489694F023010000" , vfmaddsub132ps(zmm10, zmm9, zmmword_ptr(rax, r14, 3, 291)));
+ TEST_INSTRUCTION("627235589611" , vfmaddsub132ps(zmm10, zmm9, dword_ptr(rcx)._1to16()));
+ TEST_INSTRUCTION("6272354896527F" , vfmaddsub132ps(zmm10, zmm9, zmmword_ptr(rdx, 8128)));
+ TEST_INSTRUCTION("62723548969200200000" , vfmaddsub132ps(zmm10, zmm9, zmmword_ptr(rdx, 8192)));
+ TEST_INSTRUCTION("62723548965280" , vfmaddsub132ps(zmm10, zmm9, zmmword_ptr(rdx, -8192)));
+ TEST_INSTRUCTION("627235489692C0DFFFFF" , vfmaddsub132ps(zmm10, zmm9, zmmword_ptr(rdx, -8256)));
+ TEST_INSTRUCTION("6272355896527F" , vfmaddsub132ps(zmm10, zmm9, dword_ptr(rdx, 508)._1to16()));
+ TEST_INSTRUCTION("62723558969200020000" , vfmaddsub132ps(zmm10, zmm9, dword_ptr(rdx, 512)._1to16()));
+ TEST_INSTRUCTION("62723558965280" , vfmaddsub132ps(zmm10, zmm9, dword_ptr(rdx, -512)._1to16()));
+ TEST_INSTRUCTION("627235589692FCFDFFFF" , vfmaddsub132ps(zmm10, zmm9, dword_ptr(rdx, -516)._1to16()));
+ TEST_INSTRUCTION("6242CD48A6D2" , vfmaddsub213pd(zmm26, zmm6, zmm10));
+ TEST_INSTRUCTION("6242CD4EA6D2" , k(k6).vfmaddsub213pd(zmm26, zmm6, zmm10));
+ TEST_INSTRUCTION("6242CDCEA6D2" , k(k6).z().vfmaddsub213pd(zmm26, zmm6, zmm10));
+ TEST_INSTRUCTION("6242CD18A6D2" , rn_sae().vfmaddsub213pd(zmm26, zmm6, zmm10));
+ TEST_INSTRUCTION("6242CD58A6D2" , ru_sae().vfmaddsub213pd(zmm26, zmm6, zmm10));
+ TEST_INSTRUCTION("6242CD38A6D2" , rd_sae().vfmaddsub213pd(zmm26, zmm6, zmm10));
+ TEST_INSTRUCTION("6242CD78A6D2" , rz_sae().vfmaddsub213pd(zmm26, zmm6, zmm10));
+ TEST_INSTRUCTION("6262CD48A611" , vfmaddsub213pd(zmm26, zmm6, zmmword_ptr(rcx)));
+ TEST_INSTRUCTION("6222CD48A694F023010000" , vfmaddsub213pd(zmm26, zmm6, zmmword_ptr(rax, r14, 3, 291)));
+ TEST_INSTRUCTION("6262CD58A611" , vfmaddsub213pd(zmm26, zmm6, qword_ptr(rcx)._1to8()));
+ TEST_INSTRUCTION("6262CD48A6527F" , vfmaddsub213pd(zmm26, zmm6, zmmword_ptr(rdx, 8128)));
+ TEST_INSTRUCTION("6262CD48A69200200000" , vfmaddsub213pd(zmm26, zmm6, zmmword_ptr(rdx, 8192)));
+ TEST_INSTRUCTION("6262CD48A65280" , vfmaddsub213pd(zmm26, zmm6, zmmword_ptr(rdx, -8192)));
+ TEST_INSTRUCTION("6262CD48A692C0DFFFFF" , vfmaddsub213pd(zmm26, zmm6, zmmword_ptr(rdx, -8256)));
+ TEST_INSTRUCTION("6262CD58A6527F" , vfmaddsub213pd(zmm26, zmm6, qword_ptr(rdx, 1016)._1to8()));
+ TEST_INSTRUCTION("6262CD58A69200040000" , vfmaddsub213pd(zmm26, zmm6, qword_ptr(rdx, 1024)._1to8()));
+ TEST_INSTRUCTION("6262CD58A65280" , vfmaddsub213pd(zmm26, zmm6, qword_ptr(rdx, -1024)._1to8()));
+ TEST_INSTRUCTION("6262CD58A692F8FBFFFF" , vfmaddsub213pd(zmm26, zmm6, qword_ptr(rdx, -1032)._1to8()));
+ TEST_INSTRUCTION("62823D40A6CC" , vfmaddsub213ps(zmm17, zmm24, zmm28));
+ TEST_INSTRUCTION("62823D46A6CC" , k(k6).vfmaddsub213ps(zmm17, zmm24, zmm28));
+ TEST_INSTRUCTION("62823DC6A6CC" , k(k6).z().vfmaddsub213ps(zmm17, zmm24, zmm28));
+ TEST_INSTRUCTION("62823D10A6CC" , rn_sae().vfmaddsub213ps(zmm17, zmm24, zmm28));
+ TEST_INSTRUCTION("62823D50A6CC" , ru_sae().vfmaddsub213ps(zmm17, zmm24, zmm28));
+ TEST_INSTRUCTION("62823D30A6CC" , rd_sae().vfmaddsub213ps(zmm17, zmm24, zmm28));
+ TEST_INSTRUCTION("62823D70A6CC" , rz_sae().vfmaddsub213ps(zmm17, zmm24, zmm28));
+ TEST_INSTRUCTION("62E23D40A609" , vfmaddsub213ps(zmm17, zmm24, zmmword_ptr(rcx)));
+ TEST_INSTRUCTION("62A23D40A68CF023010000" , vfmaddsub213ps(zmm17, zmm24, zmmword_ptr(rax, r14, 3, 291)));
+ TEST_INSTRUCTION("62E23D50A609" , vfmaddsub213ps(zmm17, zmm24, dword_ptr(rcx)._1to16()));
+ TEST_INSTRUCTION("62E23D40A64A7F" , vfmaddsub213ps(zmm17, zmm24, zmmword_ptr(rdx, 8128)));
+ TEST_INSTRUCTION("62E23D40A68A00200000" , vfmaddsub213ps(zmm17, zmm24, zmmword_ptr(rdx, 8192)));
+ TEST_INSTRUCTION("62E23D40A64A80" , vfmaddsub213ps(zmm17, zmm24, zmmword_ptr(rdx, -8192)));
+ TEST_INSTRUCTION("62E23D40A68AC0DFFFFF" , vfmaddsub213ps(zmm17, zmm24, zmmword_ptr(rdx, -8256)));
+ TEST_INSTRUCTION("62E23D50A64A7F" , vfmaddsub213ps(zmm17, zmm24, dword_ptr(rdx, 508)._1to16()));
+ TEST_INSTRUCTION("62E23D50A68A00020000" , vfmaddsub213ps(zmm17, zmm24, dword_ptr(rdx, 512)._1to16()));
+ TEST_INSTRUCTION("62E23D50A64A80" , vfmaddsub213ps(zmm17, zmm24, dword_ptr(rdx, -512)._1to16()));
+ TEST_INSTRUCTION("62E23D50A68AFCFDFFFF" , vfmaddsub213ps(zmm17, zmm24, dword_ptr(rdx, -516)._1to16()));
+ TEST_INSTRUCTION("6212A540B6C8" , vfmaddsub231pd(zmm9, zmm27, zmm24));
+ TEST_INSTRUCTION("6212A547B6C8" , k(k7).vfmaddsub231pd(zmm9, zmm27, zmm24));
+ TEST_INSTRUCTION("6212A5C7B6C8" , k(k7).z().vfmaddsub231pd(zmm9, zmm27, zmm24));
+ TEST_INSTRUCTION("6212A510B6C8" , rn_sae().vfmaddsub231pd(zmm9, zmm27, zmm24));
+ TEST_INSTRUCTION("6212A550B6C8" , ru_sae().vfmaddsub231pd(zmm9, zmm27, zmm24));
+ TEST_INSTRUCTION("6212A530B6C8" , rd_sae().vfmaddsub231pd(zmm9, zmm27, zmm24));
+ TEST_INSTRUCTION("6212A570B6C8" , rz_sae().vfmaddsub231pd(zmm9, zmm27, zmm24));
+ TEST_INSTRUCTION("6272A540B609" , vfmaddsub231pd(zmm9, zmm27, zmmword_ptr(rcx)));
+ TEST_INSTRUCTION("6232A540B68CF023010000" , vfmaddsub231pd(zmm9, zmm27, zmmword_ptr(rax, r14, 3, 291)));
+ TEST_INSTRUCTION("6272A550B609" , vfmaddsub231pd(zmm9, zmm27, qword_ptr(rcx)._1to8()));
+ TEST_INSTRUCTION("6272A540B64A7F" , vfmaddsub231pd(zmm9, zmm27, zmmword_ptr(rdx, 8128)));
+ TEST_INSTRUCTION("6272A540B68A00200000" , vfmaddsub231pd(zmm9, zmm27, zmmword_ptr(rdx, 8192)));
+ TEST_INSTRUCTION("6272A540B64A80" , vfmaddsub231pd(zmm9, zmm27, zmmword_ptr(rdx, -8192)));
+ TEST_INSTRUCTION("6272A540B68AC0DFFFFF" , vfmaddsub231pd(zmm9, zmm27, zmmword_ptr(rdx, -8256)));
+ TEST_INSTRUCTION("6272A550B64A7F" , vfmaddsub231pd(zmm9, zmm27, qword_ptr(rdx, 1016)._1to8()));
+ TEST_INSTRUCTION("6272A550B68A00040000" , vfmaddsub231pd(zmm9, zmm27, qword_ptr(rdx, 1024)._1to8()));
+ TEST_INSTRUCTION("6272A550B64A80" , vfmaddsub231pd(zmm9, zmm27, qword_ptr(rdx, -1024)._1to8()));
+ TEST_INSTRUCTION("6272A550B68AF8FBFFFF" , vfmaddsub231pd(zmm9, zmm27, qword_ptr(rdx, -1032)._1to8()));
+ TEST_INSTRUCTION("62325540B6FB" , vfmaddsub231ps(zmm15, zmm21, zmm19));
+ TEST_INSTRUCTION("62325546B6FB" , k(k6).vfmaddsub231ps(zmm15, zmm21, zmm19));
+ TEST_INSTRUCTION("623255C6B6FB" , k(k6).z().vfmaddsub231ps(zmm15, zmm21, zmm19));
+ TEST_INSTRUCTION("62325510B6FB" , rn_sae().vfmaddsub231ps(zmm15, zmm21, zmm19));
+ TEST_INSTRUCTION("62325550B6FB" , ru_sae().vfmaddsub231ps(zmm15, zmm21, zmm19));
+ TEST_INSTRUCTION("62325530B6FB" , rd_sae().vfmaddsub231ps(zmm15, zmm21, zmm19));
+ TEST_INSTRUCTION("62325570B6FB" , rz_sae().vfmaddsub231ps(zmm15, zmm21, zmm19));
+ TEST_INSTRUCTION("62725540B639" , vfmaddsub231ps(zmm15, zmm21, zmmword_ptr(rcx)));
+ TEST_INSTRUCTION("62325540B6BCF023010000" , vfmaddsub231ps(zmm15, zmm21, zmmword_ptr(rax, r14, 3, 291)));
+ TEST_INSTRUCTION("62725550B639" , vfmaddsub231ps(zmm15, zmm21, dword_ptr(rcx)._1to16()));
+ TEST_INSTRUCTION("62725540B67A7F" , vfmaddsub231ps(zmm15, zmm21, zmmword_ptr(rdx, 8128)));
+ TEST_INSTRUCTION("62725540B6BA00200000" , vfmaddsub231ps(zmm15, zmm21, zmmword_ptr(rdx, 8192)));
+ TEST_INSTRUCTION("62725540B67A80" , vfmaddsub231ps(zmm15, zmm21, zmmword_ptr(rdx, -8192)));
+ TEST_INSTRUCTION("62725540B6BAC0DFFFFF" , vfmaddsub231ps(zmm15, zmm21, zmmword_ptr(rdx, -8256)));
+ TEST_INSTRUCTION("62725550B67A7F" , vfmaddsub231ps(zmm15, zmm21, dword_ptr(rdx, 508)._1to16()));
+ TEST_INSTRUCTION("62725550B6BA00020000" , vfmaddsub231ps(zmm15, zmm21, dword_ptr(rdx, 512)._1to16()));
+ TEST_INSTRUCTION("62725550B67A80" , vfmaddsub231ps(zmm15, zmm21, dword_ptr(rdx, -512)._1to16()));
+ TEST_INSTRUCTION("62725550B6BAFCFDFFFF" , vfmaddsub231ps(zmm15, zmm21, dword_ptr(rdx, -516)._1to16()));
+ TEST_INSTRUCTION("62829D489AF3" , vfmsub132pd(zmm22, zmm12, zmm27));
+ TEST_INSTRUCTION("62829D4A9AF3" , k(k2).vfmsub132pd(zmm22, zmm12, zmm27));
+ TEST_INSTRUCTION("62829DCA9AF3" , k(k2).z().vfmsub132pd(zmm22, zmm12, zmm27));
+ TEST_INSTRUCTION("62829D189AF3" , rn_sae().vfmsub132pd(zmm22, zmm12, zmm27));
+ TEST_INSTRUCTION("62829D589AF3" , ru_sae().vfmsub132pd(zmm22, zmm12, zmm27));
+ TEST_INSTRUCTION("62829D389AF3" , rd_sae().vfmsub132pd(zmm22, zmm12, zmm27));
+ TEST_INSTRUCTION("62829D789AF3" , rz_sae().vfmsub132pd(zmm22, zmm12, zmm27));
+ TEST_INSTRUCTION("62E29D489A31" , vfmsub132pd(zmm22, zmm12, zmmword_ptr(rcx)));
+ TEST_INSTRUCTION("62A29D489AB4F023010000" , vfmsub132pd(zmm22, zmm12, zmmword_ptr(rax, r14, 3, 291)));
+ TEST_INSTRUCTION("62E29D589A31" , vfmsub132pd(zmm22, zmm12, qword_ptr(rcx)._1to8()));
+ TEST_INSTRUCTION("62E29D489A727F" , vfmsub132pd(zmm22, zmm12, zmmword_ptr(rdx, 8128)));
+ TEST_INSTRUCTION("62E29D489AB200200000" , vfmsub132pd(zmm22, zmm12, zmmword_ptr(rdx, 8192)));
+ TEST_INSTRUCTION("62E29D489A7280" , vfmsub132pd(zmm22, zmm12, zmmword_ptr(rdx, -8192)));
+ TEST_INSTRUCTION("62E29D489AB2C0DFFFFF" , vfmsub132pd(zmm22, zmm12, zmmword_ptr(rdx, -8256)));
+ TEST_INSTRUCTION("62E29D589A727F" , vfmsub132pd(zmm22, zmm12, qword_ptr(rdx, 1016)._1to8()));
+ TEST_INSTRUCTION("62E29D589AB200040000" , vfmsub132pd(zmm22, zmm12, qword_ptr(rdx, 1024)._1to8()));
+ TEST_INSTRUCTION("62E29D589A7280" , vfmsub132pd(zmm22, zmm12, qword_ptr(rdx, -1024)._1to8()));
+ TEST_INSTRUCTION("62E29D589AB2F8FBFFFF" , vfmsub132pd(zmm22, zmm12, qword_ptr(rdx, -1032)._1to8()));
+ TEST_INSTRUCTION("62B215489AC8" , vfmsub132ps(zmm1, zmm13, zmm16));
+ TEST_INSTRUCTION("62B2154C9AC8" , k(k4).vfmsub132ps(zmm1, zmm13, zmm16));
+ TEST_INSTRUCTION("62B215CC9AC8" , k(k4).z().vfmsub132ps(zmm1, zmm13, zmm16));
+ TEST_INSTRUCTION("62B215189AC8" , rn_sae().vfmsub132ps(zmm1, zmm13, zmm16));
+ TEST_INSTRUCTION("62B215589AC8" , ru_sae().vfmsub132ps(zmm1, zmm13, zmm16));
+ TEST_INSTRUCTION("62B215389AC8" , rd_sae().vfmsub132ps(zmm1, zmm13, zmm16));
+ TEST_INSTRUCTION("62B215789AC8" , rz_sae().vfmsub132ps(zmm1, zmm13, zmm16));
+ TEST_INSTRUCTION("62F215489A09" , vfmsub132ps(zmm1, zmm13, zmmword_ptr(rcx)));
+ TEST_INSTRUCTION("62B215489A8CF023010000" , vfmsub132ps(zmm1, zmm13, zmmword_ptr(rax, r14, 3, 291)));
+ TEST_INSTRUCTION("62F215589A09" , vfmsub132ps(zmm1, zmm13, dword_ptr(rcx)._1to16()));
+ TEST_INSTRUCTION("62F215489A4A7F" , vfmsub132ps(zmm1, zmm13, zmmword_ptr(rdx, 8128)));
+ TEST_INSTRUCTION("62F215489A8A00200000" , vfmsub132ps(zmm1, zmm13, zmmword_ptr(rdx, 8192)));
+ TEST_INSTRUCTION("62F215489A4A80" , vfmsub132ps(zmm1, zmm13, zmmword_ptr(rdx, -8192)));
+ TEST_INSTRUCTION("62F215489A8AC0DFFFFF" , vfmsub132ps(zmm1, zmm13, zmmword_ptr(rdx, -8256)));
+ TEST_INSTRUCTION("62F215589A4A7F" , vfmsub132ps(zmm1, zmm13, dword_ptr(rdx, 508)._1to16()));
+ TEST_INSTRUCTION("62F215589A8A00020000" , vfmsub132ps(zmm1, zmm13, dword_ptr(rdx, 512)._1to16()));
+ TEST_INSTRUCTION("62F215589A4A80" , vfmsub132ps(zmm1, zmm13, dword_ptr(rdx, -512)._1to16()));
+ TEST_INSTRUCTION("62F215589A8AFCFDFFFF" , vfmsub132ps(zmm1, zmm13, dword_ptr(rdx, -516)._1to16()));
+ TEST_INSTRUCTION("6212BD089BE3" , vfmsub132sd(xmm12, xmm8, xmm27));
+ TEST_INSTRUCTION("6212BD0B9BE3" , k(k3).vfmsub132sd(xmm12, xmm8, xmm27));
+ TEST_INSTRUCTION("6212BD8B9BE3" , k(k3).z().vfmsub132sd(xmm12, xmm8, xmm27));
+ TEST_INSTRUCTION("6212BD189BE3" , rn_sae().vfmsub132sd(xmm12, xmm8, xmm27));
+ TEST_INSTRUCTION("6212BD589BE3" , ru_sae().vfmsub132sd(xmm12, xmm8, xmm27));
+ TEST_INSTRUCTION("6212BD389BE3" , rd_sae().vfmsub132sd(xmm12, xmm8, xmm27));
+ TEST_INSTRUCTION("6212BD789BE3" , rz_sae().vfmsub132sd(xmm12, xmm8, xmm27));
+ TEST_INSTRUCTION("C462B99B21" , vfmsub132sd(xmm12, xmm8, qword_ptr(rcx)));
+ TEST_INSTRUCTION("C422B99BA4F023010000" , vfmsub132sd(xmm12, xmm8, qword_ptr(rax, r14, 3, 291)));
+ TEST_INSTRUCTION("C462B99BA2F8030000" , vfmsub132sd(xmm12, xmm8, qword_ptr(rdx, 1016)));
+ TEST_INSTRUCTION("C462B99BA200040000" , vfmsub132sd(xmm12, xmm8, qword_ptr(rdx, 1024)));
+ TEST_INSTRUCTION("C462B99BA200FCFFFF" , vfmsub132sd(xmm12, xmm8, qword_ptr(rdx, -1024)));
+ TEST_INSTRUCTION("C462B99BA2F8FBFFFF" , vfmsub132sd(xmm12, xmm8, qword_ptr(rdx, -1032)));
+ TEST_INSTRUCTION("62024D009BF3" , vfmsub132ss(xmm30, xmm22, xmm27));
+ TEST_INSTRUCTION("62024D039BF3" , k(k3).vfmsub132ss(xmm30, xmm22, xmm27));
+ TEST_INSTRUCTION("62024D839BF3" , k(k3).z().vfmsub132ss(xmm30, xmm22, xmm27));
+ TEST_INSTRUCTION("62024D109BF3" , rn_sae().vfmsub132ss(xmm30, xmm22, xmm27));
+ TEST_INSTRUCTION("62024D509BF3" , ru_sae().vfmsub132ss(xmm30, xmm22, xmm27));
+ TEST_INSTRUCTION("62024D309BF3" , rd_sae().vfmsub132ss(xmm30, xmm22, xmm27));
+ TEST_INSTRUCTION("62024D709BF3" , rz_sae().vfmsub132ss(xmm30, xmm22, xmm27));
+ TEST_INSTRUCTION("62624D009B31" , vfmsub132ss(xmm30, xmm22, dword_ptr(rcx)));
+ TEST_INSTRUCTION("62224D009BB4F023010000" , vfmsub132ss(xmm30, xmm22, dword_ptr(rax, r14, 3, 291)));
+ TEST_INSTRUCTION("62624D009B727F" , vfmsub132ss(xmm30, xmm22, dword_ptr(rdx, 508)));
+ TEST_INSTRUCTION("62624D009BB200020000" , vfmsub132ss(xmm30, xmm22, dword_ptr(rdx, 512)));
+ TEST_INSTRUCTION("62624D009B7280" , vfmsub132ss(xmm30, xmm22, dword_ptr(rdx, -512)));
+ TEST_INSTRUCTION("62624D009BB2FCFDFFFF" , vfmsub132ss(xmm30, xmm22, dword_ptr(rdx, -516)));
+ TEST_INSTRUCTION("62F2AD48AAEC" , vfmsub213pd(zmm5, zmm10, zmm4));
+ TEST_INSTRUCTION("62F2AD49AAEC" , k(k1).vfmsub213pd(zmm5, zmm10, zmm4));
+ TEST_INSTRUCTION("62F2ADC9AAEC" , k(k1).z().vfmsub213pd(zmm5, zmm10, zmm4));
+ TEST_INSTRUCTION("62F2AD18AAEC" , rn_sae().vfmsub213pd(zmm5, zmm10, zmm4));
+ TEST_INSTRUCTION("62F2AD58AAEC" , ru_sae().vfmsub213pd(zmm5, zmm10, zmm4));
+ TEST_INSTRUCTION("62F2AD38AAEC" , rd_sae().vfmsub213pd(zmm5, zmm10, zmm4));
+ TEST_INSTRUCTION("62F2AD78AAEC" , rz_sae().vfmsub213pd(zmm5, zmm10, zmm4));
+ TEST_INSTRUCTION("62F2AD48AA29" , vfmsub213pd(zmm5, zmm10, zmmword_ptr(rcx)));
+ TEST_INSTRUCTION("62B2AD48AAACF023010000" , vfmsub213pd(zmm5, zmm10, zmmword_ptr(rax, r14, 3, 291)));
+ TEST_INSTRUCTION("62F2AD58AA29" , vfmsub213pd(zmm5, zmm10, qword_ptr(rcx)._1to8()));
+ TEST_INSTRUCTION("62F2AD48AA6A7F" , vfmsub213pd(zmm5, zmm10, zmmword_ptr(rdx, 8128)));
+ TEST_INSTRUCTION("62F2AD48AAAA00200000" , vfmsub213pd(zmm5, zmm10, zmmword_ptr(rdx, 8192)));
+ TEST_INSTRUCTION("62F2AD48AA6A80" , vfmsub213pd(zmm5, zmm10, zmmword_ptr(rdx, -8192)));
+ TEST_INSTRUCTION("62F2AD48AAAAC0DFFFFF" , vfmsub213pd(zmm5, zmm10, zmmword_ptr(rdx, -8256)));
+ TEST_INSTRUCTION("62F2AD58AA6A7F" , vfmsub213pd(zmm5, zmm10, qword_ptr(rdx, 1016)._1to8()));
+ TEST_INSTRUCTION("62F2AD58AAAA00040000" , vfmsub213pd(zmm5, zmm10, qword_ptr(rdx, 1024)._1to8()));
+ TEST_INSTRUCTION("62F2AD58AA6A80" , vfmsub213pd(zmm5, zmm10, qword_ptr(rdx, -1024)._1to8()));
+ TEST_INSTRUCTION("62F2AD58AAAAF8FBFFFF" , vfmsub213pd(zmm5, zmm10, qword_ptr(rdx, -1032)._1to8()));
+ TEST_INSTRUCTION("62C24D40AAF2" , vfmsub213ps(zmm22, zmm22, zmm10));
+ TEST_INSTRUCTION("62C24D46AAF2" , k(k6).vfmsub213ps(zmm22, zmm22, zmm10));
+ TEST_INSTRUCTION("62C24DC6AAF2" , k(k6).z().vfmsub213ps(zmm22, zmm22, zmm10));
+ TEST_INSTRUCTION("62C24D10AAF2" , rn_sae().vfmsub213ps(zmm22, zmm22, zmm10));
+ TEST_INSTRUCTION("62C24D50AAF2" , ru_sae().vfmsub213ps(zmm22, zmm22, zmm10));
+ TEST_INSTRUCTION("62C24D30AAF2" , rd_sae().vfmsub213ps(zmm22, zmm22, zmm10));
+ TEST_INSTRUCTION("62C24D70AAF2" , rz_sae().vfmsub213ps(zmm22, zmm22, zmm10));
+ TEST_INSTRUCTION("62E24D40AA31" , vfmsub213ps(zmm22, zmm22, zmmword_ptr(rcx)));
+ TEST_INSTRUCTION("62A24D40AAB4F023010000" , vfmsub213ps(zmm22, zmm22, zmmword_ptr(rax, r14, 3, 291)));
+ TEST_INSTRUCTION("62E24D50AA31" , vfmsub213ps(zmm22, zmm22, dword_ptr(rcx)._1to16()));
+ TEST_INSTRUCTION("62E24D40AA727F" , vfmsub213ps(zmm22, zmm22, zmmword_ptr(rdx, 8128)));
+ TEST_INSTRUCTION("62E24D40AAB200200000" , vfmsub213ps(zmm22, zmm22, zmmword_ptr(rdx, 8192)));
+ TEST_INSTRUCTION("62E24D40AA7280" , vfmsub213ps(zmm22, zmm22, zmmword_ptr(rdx, -8192)));
+ TEST_INSTRUCTION("62E24D40AAB2C0DFFFFF" , vfmsub213ps(zmm22, zmm22, zmmword_ptr(rdx, -8256)));
+ TEST_INSTRUCTION("62E24D50AA727F" , vfmsub213ps(zmm22, zmm22, dword_ptr(rdx, 508)._1to16()));
+ TEST_INSTRUCTION("62E24D50AAB200020000" , vfmsub213ps(zmm22, zmm22, dword_ptr(rdx, 512)._1to16()));
+ TEST_INSTRUCTION("62E24D50AA7280" , vfmsub213ps(zmm22, zmm22, dword_ptr(rdx, -512)._1to16()));
+ TEST_INSTRUCTION("62E24D50AAB2FCFDFFFF" , vfmsub213ps(zmm22, zmm22, dword_ptr(rdx, -516)._1to16()));
+ TEST_INSTRUCTION("C4C2B9ABF4" , vfmsub213sd(xmm6, xmm8, xmm12));
+ TEST_INSTRUCTION("62D2BD09ABF4" , k(k1).vfmsub213sd(xmm6, xmm8, xmm12));
+ TEST_INSTRUCTION("62D2BD89ABF4" , k(k1).z().vfmsub213sd(xmm6, xmm8, xmm12));
+ TEST_INSTRUCTION("62D2BD18ABF4" , rn_sae().vfmsub213sd(xmm6, xmm8, xmm12));
+ TEST_INSTRUCTION("62D2BD58ABF4" , ru_sae().vfmsub213sd(xmm6, xmm8, xmm12));
+ TEST_INSTRUCTION("62D2BD38ABF4" , rd_sae().vfmsub213sd(xmm6, xmm8, xmm12));
+ TEST_INSTRUCTION("62D2BD78ABF4" , rz_sae().vfmsub213sd(xmm6, xmm8, xmm12));
+ TEST_INSTRUCTION("C4E2B9AB31" , vfmsub213sd(xmm6, xmm8, qword_ptr(rcx)));
+ TEST_INSTRUCTION("C4A2B9ABB4F023010000" , vfmsub213sd(xmm6, xmm8, qword_ptr(rax, r14, 3, 291)));
+ TEST_INSTRUCTION("C4E2B9ABB2F8030000" , vfmsub213sd(xmm6, xmm8, qword_ptr(rdx, 1016)));
+ TEST_INSTRUCTION("C4E2B9ABB200040000" , vfmsub213sd(xmm6, xmm8, qword_ptr(rdx, 1024)));
+ TEST_INSTRUCTION("C4E2B9ABB200FCFFFF" , vfmsub213sd(xmm6, xmm8, qword_ptr(rdx, -1024)));
+ TEST_INSTRUCTION("C4E2B9ABB2F8FBFFFF" , vfmsub213sd(xmm6, xmm8, qword_ptr(rdx, -1032)));
+ TEST_INSTRUCTION("62021508ABF2" , vfmsub213ss(xmm30, xmm13, xmm26));
+ TEST_INSTRUCTION("62021509ABF2" , k(k1).vfmsub213ss(xmm30, xmm13, xmm26));
+ TEST_INSTRUCTION("62021589ABF2" , k(k1).z().vfmsub213ss(xmm30, xmm13, xmm26));
+ TEST_INSTRUCTION("62021518ABF2" , rn_sae().vfmsub213ss(xmm30, xmm13, xmm26));
+ TEST_INSTRUCTION("62021558ABF2" , ru_sae().vfmsub213ss(xmm30, xmm13, xmm26));
+ TEST_INSTRUCTION("62021538ABF2" , rd_sae().vfmsub213ss(xmm30, xmm13, xmm26));
+ TEST_INSTRUCTION("62021578ABF2" , rz_sae().vfmsub213ss(xmm30, xmm13, xmm26));
+ TEST_INSTRUCTION("62621508AB31" , vfmsub213ss(xmm30, xmm13, dword_ptr(rcx)));
+ TEST_INSTRUCTION("62221508ABB4F023010000" , vfmsub213ss(xmm30, xmm13, dword_ptr(rax, r14, 3, 291)));
+ TEST_INSTRUCTION("62621508AB727F" , vfmsub213ss(xmm30, xmm13, dword_ptr(rdx, 508)));
+ TEST_INSTRUCTION("62621508ABB200020000" , vfmsub213ss(xmm30, xmm13, dword_ptr(rdx, 512)));
+ TEST_INSTRUCTION("62621508AB7280" , vfmsub213ss(xmm30, xmm13, dword_ptr(rdx, -512)));
+ TEST_INSTRUCTION("62621508ABB2FCFDFFFF" , vfmsub213ss(xmm30, xmm13, dword_ptr(rdx, -516)));
+ TEST_INSTRUCTION("62D29D48BAEB" , vfmsub231pd(zmm5, zmm12, zmm11));
+ TEST_INSTRUCTION("62D29D4ABAEB" , k(k2).vfmsub231pd(zmm5, zmm12, zmm11));
+ TEST_INSTRUCTION("62D29DCABAEB" , k(k2).z().vfmsub231pd(zmm5, zmm12, zmm11));
+ TEST_INSTRUCTION("62D29D18BAEB" , rn_sae().vfmsub231pd(zmm5, zmm12, zmm11));
+ TEST_INSTRUCTION("62D29D58BAEB" , ru_sae().vfmsub231pd(zmm5, zmm12, zmm11));
+ TEST_INSTRUCTION("62D29D38BAEB" , rd_sae().vfmsub231pd(zmm5, zmm12, zmm11));
+ TEST_INSTRUCTION("62D29D78BAEB" , rz_sae().vfmsub231pd(zmm5, zmm12, zmm11));
+ TEST_INSTRUCTION("62F29D48BA29" , vfmsub231pd(zmm5, zmm12, zmmword_ptr(rcx)));
+ TEST_INSTRUCTION("62B29D48BAACF023010000" , vfmsub231pd(zmm5, zmm12, zmmword_ptr(rax, r14, 3, 291)));
+ TEST_INSTRUCTION("62F29D58BA29" , vfmsub231pd(zmm5, zmm12, qword_ptr(rcx)._1to8()));
+ TEST_INSTRUCTION("62F29D48BA6A7F" , vfmsub231pd(zmm5, zmm12, zmmword_ptr(rdx, 8128)));
+ TEST_INSTRUCTION("62F29D48BAAA00200000" , vfmsub231pd(zmm5, zmm12, zmmword_ptr(rdx, 8192)));
+ TEST_INSTRUCTION("62F29D48BA6A80" , vfmsub231pd(zmm5, zmm12, zmmword_ptr(rdx, -8192)));
+ TEST_INSTRUCTION("62F29D48BAAAC0DFFFFF" , vfmsub231pd(zmm5, zmm12, zmmword_ptr(rdx, -8256)));
+ TEST_INSTRUCTION("62F29D58BA6A7F" , vfmsub231pd(zmm5, zmm12, qword_ptr(rdx, 1016)._1to8()));
+ TEST_INSTRUCTION("62F29D58BAAA00040000" , vfmsub231pd(zmm5, zmm12, qword_ptr(rdx, 1024)._1to8()));
+ TEST_INSTRUCTION("62F29D58BA6A80" , vfmsub231pd(zmm5, zmm12, qword_ptr(rdx, -1024)._1to8()));
+ TEST_INSTRUCTION("62F29D58BAAAF8FBFFFF" , vfmsub231pd(zmm5, zmm12, qword_ptr(rdx, -1032)._1to8()));
+ TEST_INSTRUCTION("62925540BAF3" , vfmsub231ps(zmm6, zmm21, zmm27));
+ TEST_INSTRUCTION("62925543BAF3" , k(k3).vfmsub231ps(zmm6, zmm21, zmm27));
+ TEST_INSTRUCTION("629255C3BAF3" , k(k3).z().vfmsub231ps(zmm6, zmm21, zmm27));
+ TEST_INSTRUCTION("62925510BAF3" , rn_sae().vfmsub231ps(zmm6, zmm21, zmm27));
+ TEST_INSTRUCTION("62925550BAF3" , ru_sae().vfmsub231ps(zmm6, zmm21, zmm27));
+ TEST_INSTRUCTION("62925530BAF3" , rd_sae().vfmsub231ps(zmm6, zmm21, zmm27));
+ TEST_INSTRUCTION("62925570BAF3" , rz_sae().vfmsub231ps(zmm6, zmm21, zmm27));
+ TEST_INSTRUCTION("62F25540BA31" , vfmsub231ps(zmm6, zmm21, zmmword_ptr(rcx)));
+ TEST_INSTRUCTION("62B25540BAB4F023010000" , vfmsub231ps(zmm6, zmm21, zmmword_ptr(rax, r14, 3, 291)));
+ TEST_INSTRUCTION("62F25550BA31" , vfmsub231ps(zmm6, zmm21, dword_ptr(rcx)._1to16()));
+ TEST_INSTRUCTION("62F25540BA727F" , vfmsub231ps(zmm6, zmm21, zmmword_ptr(rdx, 8128)));
+ TEST_INSTRUCTION("62F25540BAB200200000" , vfmsub231ps(zmm6, zmm21, zmmword_ptr(rdx, 8192)));
+ TEST_INSTRUCTION("62F25540BA7280" , vfmsub231ps(zmm6, zmm21, zmmword_ptr(rdx, -8192)));
+ TEST_INSTRUCTION("62F25540BAB2C0DFFFFF" , vfmsub231ps(zmm6, zmm21, zmmword_ptr(rdx, -8256)));
+ TEST_INSTRUCTION("62F25550BA727F" , vfmsub231ps(zmm6, zmm21, dword_ptr(rdx, 508)._1to16()));
+ TEST_INSTRUCTION("62F25550BAB200020000" , vfmsub231ps(zmm6, zmm21, dword_ptr(rdx, 512)._1to16()));
+ TEST_INSTRUCTION("62F25550BA7280" , vfmsub231ps(zmm6, zmm21, dword_ptr(rdx, -512)._1to16()));
+ TEST_INSTRUCTION("62F25550BAB2FCFDFFFF" , vfmsub231ps(zmm6, zmm21, dword_ptr(rdx, -516)._1to16()));
+ TEST_INSTRUCTION("C4E2A1BBDE" , vfmsub231sd(xmm3, xmm11, xmm6));
+ TEST_INSTRUCTION("62F2A50FBBDE" , k(k7).vfmsub231sd(xmm3, xmm11, xmm6));
+ TEST_INSTRUCTION("62F2A58FBBDE" , k(k7).z().vfmsub231sd(xmm3, xmm11, xmm6));
+ TEST_INSTRUCTION("62F2A518BBDE" , rn_sae().vfmsub231sd(xmm3, xmm11, xmm6));
+ TEST_INSTRUCTION("62F2A558BBDE" , ru_sae().vfmsub231sd(xmm3, xmm11, xmm6));
+ TEST_INSTRUCTION("62F2A538BBDE" , rd_sae().vfmsub231sd(xmm3, xmm11, xmm6));
+ TEST_INSTRUCTION("62F2A578BBDE" , rz_sae().vfmsub231sd(xmm3, xmm11, xmm6));
+ TEST_INSTRUCTION("C4E2A1BB19" , vfmsub231sd(xmm3, xmm11, qword_ptr(rcx)));
+ TEST_INSTRUCTION("C4A2A1BB9CF023010000" , vfmsub231sd(xmm3, xmm11, qword_ptr(rax, r14, 3, 291)));
+ TEST_INSTRUCTION("C4E2A1BB9AF8030000" , vfmsub231sd(xmm3, xmm11, qword_ptr(rdx, 1016)));
+ TEST_INSTRUCTION("C4E2A1BB9A00040000" , vfmsub231sd(xmm3, xmm11, qword_ptr(rdx, 1024)));
+ TEST_INSTRUCTION("C4E2A1BB9A00FCFFFF" , vfmsub231sd(xmm3, xmm11, qword_ptr(rdx, -1024)));
+ TEST_INSTRUCTION("C4E2A1BB9AF8FBFFFF" , vfmsub231sd(xmm3, xmm11, qword_ptr(rdx, -1032)));
+ TEST_INSTRUCTION("62626508BBED" , vfmsub231ss(xmm29, xmm3, xmm5));
+ TEST_INSTRUCTION("6262650EBBED" , k(k6).vfmsub231ss(xmm29, xmm3, xmm5));
+ TEST_INSTRUCTION("6262658EBBED" , k(k6).z().vfmsub231ss(xmm29, xmm3, xmm5));
+ TEST_INSTRUCTION("62626518BBED" , rn_sae().vfmsub231ss(xmm29, xmm3, xmm5));
+ TEST_INSTRUCTION("62626558BBED" , ru_sae().vfmsub231ss(xmm29, xmm3, xmm5));
+ TEST_INSTRUCTION("62626538BBED" , rd_sae().vfmsub231ss(xmm29, xmm3, xmm5));
+ TEST_INSTRUCTION("62626578BBED" , rz_sae().vfmsub231ss(xmm29, xmm3, xmm5));
+ TEST_INSTRUCTION("62626508BB29" , vfmsub231ss(xmm29, xmm3, dword_ptr(rcx)));
+ TEST_INSTRUCTION("62226508BBACF023010000" , vfmsub231ss(xmm29, xmm3, dword_ptr(rax, r14, 3, 291)));
+ TEST_INSTRUCTION("62626508BB6A7F" , vfmsub231ss(xmm29, xmm3, dword_ptr(rdx, 508)));
+ TEST_INSTRUCTION("62626508BBAA00020000" , vfmsub231ss(xmm29, xmm3, dword_ptr(rdx, 512)));
+ TEST_INSTRUCTION("62626508BB6A80" , vfmsub231ss(xmm29, xmm3, dword_ptr(rdx, -512)));
+ TEST_INSTRUCTION("62626508BBAAFCFDFFFF" , vfmsub231ss(xmm29, xmm3, dword_ptr(rdx, -516)));
+ TEST_INSTRUCTION("62A29D4097EA" , vfmsubadd132pd(zmm21, zmm28, zmm18));
+ TEST_INSTRUCTION("62A29D4797EA" , k(k7).vfmsubadd132pd(zmm21, zmm28, zmm18));
+ TEST_INSTRUCTION("62A29DC797EA" , k(k7).z().vfmsubadd132pd(zmm21, zmm28, zmm18));
+ TEST_INSTRUCTION("62A29D1097EA" , rn_sae().vfmsubadd132pd(zmm21, zmm28, zmm18));
+ TEST_INSTRUCTION("62A29D5097EA" , ru_sae().vfmsubadd132pd(zmm21, zmm28, zmm18));
+ TEST_INSTRUCTION("62A29D3097EA" , rd_sae().vfmsubadd132pd(zmm21, zmm28, zmm18));
+ TEST_INSTRUCTION("62A29D7097EA" , rz_sae().vfmsubadd132pd(zmm21, zmm28, zmm18));
+ TEST_INSTRUCTION("62E29D409729" , vfmsubadd132pd(zmm21, zmm28, zmmword_ptr(rcx)));
+ TEST_INSTRUCTION("62A29D4097ACF023010000" , vfmsubadd132pd(zmm21, zmm28, zmmword_ptr(rax, r14, 3, 291)));
+ TEST_INSTRUCTION("62E29D509729" , vfmsubadd132pd(zmm21, zmm28, qword_ptr(rcx)._1to8()));
+ TEST_INSTRUCTION("62E29D40976A7F" , vfmsubadd132pd(zmm21, zmm28, zmmword_ptr(rdx, 8128)));
+ TEST_INSTRUCTION("62E29D4097AA00200000" , vfmsubadd132pd(zmm21, zmm28, zmmword_ptr(rdx, 8192)));
+ TEST_INSTRUCTION("62E29D40976A80" , vfmsubadd132pd(zmm21, zmm28, zmmword_ptr(rdx, -8192)));
+ TEST_INSTRUCTION("62E29D4097AAC0DFFFFF" , vfmsubadd132pd(zmm21, zmm28, zmmword_ptr(rdx, -8256)));
+ TEST_INSTRUCTION("62E29D50976A7F" , vfmsubadd132pd(zmm21, zmm28, qword_ptr(rdx, 1016)._1to8()));
+ TEST_INSTRUCTION("62E29D5097AA00040000" , vfmsubadd132pd(zmm21, zmm28, qword_ptr(rdx, 1024)._1to8()));
+ TEST_INSTRUCTION("62E29D50976A80" , vfmsubadd132pd(zmm21, zmm28, qword_ptr(rdx, -1024)._1to8()));
+ TEST_INSTRUCTION("62E29D5097AAF8FBFFFF" , vfmsubadd132pd(zmm21, zmm28, qword_ptr(rdx, -1032)._1to8()));
+ TEST_INSTRUCTION("62B2154897D5" , vfmsubadd132ps(zmm2, zmm13, zmm21));
+ TEST_INSTRUCTION("62B2154F97D5" , k(k7).vfmsubadd132ps(zmm2, zmm13, zmm21));
+ TEST_INSTRUCTION("62B215CF97D5" , k(k7).z().vfmsubadd132ps(zmm2, zmm13, zmm21));
+ TEST_INSTRUCTION("62B2151897D5" , rn_sae().vfmsubadd132ps(zmm2, zmm13, zmm21));
+ TEST_INSTRUCTION("62B2155897D5" , ru_sae().vfmsubadd132ps(zmm2, zmm13, zmm21));
+ TEST_INSTRUCTION("62B2153897D5" , rd_sae().vfmsubadd132ps(zmm2, zmm13, zmm21));
+ TEST_INSTRUCTION("62B2157897D5" , rz_sae().vfmsubadd132ps(zmm2, zmm13, zmm21));
+ TEST_INSTRUCTION("62F215489711" , vfmsubadd132ps(zmm2, zmm13, zmmword_ptr(rcx)));
+ TEST_INSTRUCTION("62B215489794F023010000" , vfmsubadd132ps(zmm2, zmm13, zmmword_ptr(rax, r14, 3, 291)));
+ TEST_INSTRUCTION("62F215589711" , vfmsubadd132ps(zmm2, zmm13, dword_ptr(rcx)._1to16()));
+ TEST_INSTRUCTION("62F2154897527F" , vfmsubadd132ps(zmm2, zmm13, zmmword_ptr(rdx, 8128)));
+ TEST_INSTRUCTION("62F21548979200200000" , vfmsubadd132ps(zmm2, zmm13, zmmword_ptr(rdx, 8192)));
+ TEST_INSTRUCTION("62F21548975280" , vfmsubadd132ps(zmm2, zmm13, zmmword_ptr(rdx, -8192)));
+ TEST_INSTRUCTION("62F215489792C0DFFFFF" , vfmsubadd132ps(zmm2, zmm13, zmmword_ptr(rdx, -8256)));
+ TEST_INSTRUCTION("62F2155897527F" , vfmsubadd132ps(zmm2, zmm13, dword_ptr(rdx, 508)._1to16()));
+ TEST_INSTRUCTION("62F21558979200020000" , vfmsubadd132ps(zmm2, zmm13, dword_ptr(rdx, 512)._1to16()));
+ TEST_INSTRUCTION("62F21558975280" , vfmsubadd132ps(zmm2, zmm13, dword_ptr(rdx, -512)._1to16()));
+ TEST_INSTRUCTION("62F215589792FCFDFFFF" , vfmsubadd132ps(zmm2, zmm13, dword_ptr(rdx, -516)._1to16()));
+ TEST_INSTRUCTION("62F2C540A7D2" , vfmsubadd213pd(zmm2, zmm23, zmm2));
+ TEST_INSTRUCTION("62F2C546A7D2" , k(k6).vfmsubadd213pd(zmm2, zmm23, zmm2));
+ TEST_INSTRUCTION("62F2C5C6A7D2" , k(k6).z().vfmsubadd213pd(zmm2, zmm23, zmm2));
+ TEST_INSTRUCTION("62F2C510A7D2" , rn_sae().vfmsubadd213pd(zmm2, zmm23, zmm2));
+ TEST_INSTRUCTION("62F2C550A7D2" , ru_sae().vfmsubadd213pd(zmm2, zmm23, zmm2));
+ TEST_INSTRUCTION("62F2C530A7D2" , rd_sae().vfmsubadd213pd(zmm2, zmm23, zmm2));
+ TEST_INSTRUCTION("62F2C570A7D2" , rz_sae().vfmsubadd213pd(zmm2, zmm23, zmm2));
+ TEST_INSTRUCTION("62F2C540A711" , vfmsubadd213pd(zmm2, zmm23, zmmword_ptr(rcx)));
+ TEST_INSTRUCTION("62B2C540A794F023010000" , vfmsubadd213pd(zmm2, zmm23, zmmword_ptr(rax, r14, 3, 291)));
+ TEST_INSTRUCTION("62F2C550A711" , vfmsubadd213pd(zmm2, zmm23, qword_ptr(rcx)._1to8()));
+ TEST_INSTRUCTION("62F2C540A7527F" , vfmsubadd213pd(zmm2, zmm23, zmmword_ptr(rdx, 8128)));
+ TEST_INSTRUCTION("62F2C540A79200200000" , vfmsubadd213pd(zmm2, zmm23, zmmword_ptr(rdx, 8192)));
+ TEST_INSTRUCTION("62F2C540A75280" , vfmsubadd213pd(zmm2, zmm23, zmmword_ptr(rdx, -8192)));
+ TEST_INSTRUCTION("62F2C540A792C0DFFFFF" , vfmsubadd213pd(zmm2, zmm23, zmmword_ptr(rdx, -8256)));
+ TEST_INSTRUCTION("62F2C550A7527F" , vfmsubadd213pd(zmm2, zmm23, qword_ptr(rdx, 1016)._1to8()));
+ TEST_INSTRUCTION("62F2C550A79200040000" , vfmsubadd213pd(zmm2, zmm23, qword_ptr(rdx, 1024)._1to8()));
+ TEST_INSTRUCTION("62F2C550A75280" , vfmsubadd213pd(zmm2, zmm23, qword_ptr(rdx, -1024)._1to8()));
+ TEST_INSTRUCTION("62F2C550A792F8FBFFFF" , vfmsubadd213pd(zmm2, zmm23, qword_ptr(rdx, -1032)._1to8()));
+ TEST_INSTRUCTION("62C21D48A7F6" , vfmsubadd213ps(zmm22, zmm12, zmm14));
+ TEST_INSTRUCTION("62C21D4EA7F6" , k(k6).vfmsubadd213ps(zmm22, zmm12, zmm14));
+ TEST_INSTRUCTION("62C21DCEA7F6" , k(k6).z().vfmsubadd213ps(zmm22, zmm12, zmm14));
+ TEST_INSTRUCTION("62C21D18A7F6" , rn_sae().vfmsubadd213ps(zmm22, zmm12, zmm14));
+ TEST_INSTRUCTION("62C21D58A7F6" , ru_sae().vfmsubadd213ps(zmm22, zmm12, zmm14));
+ TEST_INSTRUCTION("62C21D38A7F6" , rd_sae().vfmsubadd213ps(zmm22, zmm12, zmm14));
+ TEST_INSTRUCTION("62C21D78A7F6" , rz_sae().vfmsubadd213ps(zmm22, zmm12, zmm14));
+ TEST_INSTRUCTION("62E21D48A731" , vfmsubadd213ps(zmm22, zmm12, zmmword_ptr(rcx)));
+ TEST_INSTRUCTION("62A21D48A7B4F023010000" , vfmsubadd213ps(zmm22, zmm12, zmmword_ptr(rax, r14, 3, 291)));
+ TEST_INSTRUCTION("62E21D58A731" , vfmsubadd213ps(zmm22, zmm12, dword_ptr(rcx)._1to16()));
+ TEST_INSTRUCTION("62E21D48A7727F" , vfmsubadd213ps(zmm22, zmm12, zmmword_ptr(rdx, 8128)));
+ TEST_INSTRUCTION("62E21D48A7B200200000" , vfmsubadd213ps(zmm22, zmm12, zmmword_ptr(rdx, 8192)));
+ TEST_INSTRUCTION("62E21D48A77280" , vfmsubadd213ps(zmm22, zmm12, zmmword_ptr(rdx, -8192)));
+ TEST_INSTRUCTION("62E21D48A7B2C0DFFFFF" , vfmsubadd213ps(zmm22, zmm12, zmmword_ptr(rdx, -8256)));
+ TEST_INSTRUCTION("62E21D58A7727F" , vfmsubadd213ps(zmm22, zmm12, dword_ptr(rdx, 508)._1to16()));
+ TEST_INSTRUCTION("62E21D58A7B200020000" , vfmsubadd213ps(zmm22, zmm12, dword_ptr(rdx, 512)._1to16()));
+ TEST_INSTRUCTION("62E21D58A77280" , vfmsubadd213ps(zmm22, zmm12, dword_ptr(rdx, -512)._1to16()));
+ TEST_INSTRUCTION("62E21D58A7B2FCFDFFFF" , vfmsubadd213ps(zmm22, zmm12, dword_ptr(rdx, -516)._1to16()));
+ TEST_INSTRUCTION("62A2A540B7C5" , vfmsubadd231pd(zmm16, zmm27, zmm21));
+ TEST_INSTRUCTION("62A2A542B7C5" , k(k2).vfmsubadd231pd(zmm16, zmm27, zmm21));
+ TEST_INSTRUCTION("62A2A5C2B7C5" , k(k2).z().vfmsubadd231pd(zmm16, zmm27, zmm21));
+ TEST_INSTRUCTION("62A2A510B7C5" , rn_sae().vfmsubadd231pd(zmm16, zmm27, zmm21));
+ TEST_INSTRUCTION("62A2A550B7C5" , ru_sae().vfmsubadd231pd(zmm16, zmm27, zmm21));
+ TEST_INSTRUCTION("62A2A530B7C5" , rd_sae().vfmsubadd231pd(zmm16, zmm27, zmm21));
+ TEST_INSTRUCTION("62A2A570B7C5" , rz_sae().vfmsubadd231pd(zmm16, zmm27, zmm21));
+ TEST_INSTRUCTION("62E2A540B701" , vfmsubadd231pd(zmm16, zmm27, zmmword_ptr(rcx)));
+ TEST_INSTRUCTION("62A2A540B784F023010000" , vfmsubadd231pd(zmm16, zmm27, zmmword_ptr(rax, r14, 3, 291)));
+ TEST_INSTRUCTION("62E2A550B701" , vfmsubadd231pd(zmm16, zmm27, qword_ptr(rcx)._1to8()));
+ TEST_INSTRUCTION("62E2A540B7427F" , vfmsubadd231pd(zmm16, zmm27, zmmword_ptr(rdx, 8128)));
+ TEST_INSTRUCTION("62E2A540B78200200000" , vfmsubadd231pd(zmm16, zmm27, zmmword_ptr(rdx, 8192)));
+ TEST_INSTRUCTION("62E2A540B74280" , vfmsubadd231pd(zmm16, zmm27, zmmword_ptr(rdx, -8192)));
+ TEST_INSTRUCTION("62E2A540B782C0DFFFFF" , vfmsubadd231pd(zmm16, zmm27, zmmword_ptr(rdx, -8256)));
+ TEST_INSTRUCTION("62E2A550B7427F" , vfmsubadd231pd(zmm16, zmm27, qword_ptr(rdx, 1016)._1to8()));
+ TEST_INSTRUCTION("62E2A550B78200040000" , vfmsubadd231pd(zmm16, zmm27, qword_ptr(rdx, 1024)._1to8()));
+ TEST_INSTRUCTION("62E2A550B74280" , vfmsubadd231pd(zmm16, zmm27, qword_ptr(rdx, -1024)._1to8()));
+ TEST_INSTRUCTION("62E2A550B782F8FBFFFF" , vfmsubadd231pd(zmm16, zmm27, qword_ptr(rdx, -1032)._1to8()));
+ TEST_INSTRUCTION("62726540B7C1" , vfmsubadd231ps(zmm8, zmm19, zmm1));
+ TEST_INSTRUCTION("62726542B7C1" , k(k2).vfmsubadd231ps(zmm8, zmm19, zmm1));
+ TEST_INSTRUCTION("627265C2B7C1" , k(k2).z().vfmsubadd231ps(zmm8, zmm19, zmm1));
+ TEST_INSTRUCTION("62726510B7C1" , rn_sae().vfmsubadd231ps(zmm8, zmm19, zmm1));
+ TEST_INSTRUCTION("62726550B7C1" , ru_sae().vfmsubadd231ps(zmm8, zmm19, zmm1));
+ TEST_INSTRUCTION("62726530B7C1" , rd_sae().vfmsubadd231ps(zmm8, zmm19, zmm1));
+ TEST_INSTRUCTION("62726570B7C1" , rz_sae().vfmsubadd231ps(zmm8, zmm19, zmm1));
+ TEST_INSTRUCTION("62726540B701" , vfmsubadd231ps(zmm8, zmm19, zmmword_ptr(rcx)));
+ TEST_INSTRUCTION("62326540B784F023010000" , vfmsubadd231ps(zmm8, zmm19, zmmword_ptr(rax, r14, 3, 291)));
+ TEST_INSTRUCTION("62726550B701" , vfmsubadd231ps(zmm8, zmm19, dword_ptr(rcx)._1to16()));
+ TEST_INSTRUCTION("62726540B7427F" , vfmsubadd231ps(zmm8, zmm19, zmmword_ptr(rdx, 8128)));
+ TEST_INSTRUCTION("62726540B78200200000" , vfmsubadd231ps(zmm8, zmm19, zmmword_ptr(rdx, 8192)));
+ TEST_INSTRUCTION("62726540B74280" , vfmsubadd231ps(zmm8, zmm19, zmmword_ptr(rdx, -8192)));
+ TEST_INSTRUCTION("62726540B782C0DFFFFF" , vfmsubadd231ps(zmm8, zmm19, zmmword_ptr(rdx, -8256)));
+ TEST_INSTRUCTION("62726550B7427F" , vfmsubadd231ps(zmm8, zmm19, dword_ptr(rdx, 508)._1to16()));
+ TEST_INSTRUCTION("62726550B78200020000" , vfmsubadd231ps(zmm8, zmm19, dword_ptr(rdx, 512)._1to16()));
+ TEST_INSTRUCTION("62726550B74280" , vfmsubadd231ps(zmm8, zmm19, dword_ptr(rdx, -512)._1to16()));
+ TEST_INSTRUCTION("62726550B782FCFDFFFF" , vfmsubadd231ps(zmm8, zmm19, dword_ptr(rdx, -516)._1to16()));
+ TEST_INSTRUCTION("62728D489CE1" , vfnmadd132pd(zmm12, zmm14, zmm1));
+ TEST_INSTRUCTION("62728D4F9CE1" , k(k7).vfnmadd132pd(zmm12, zmm14, zmm1));
+ TEST_INSTRUCTION("62728DCF9CE1" , k(k7).z().vfnmadd132pd(zmm12, zmm14, zmm1));
+ TEST_INSTRUCTION("62728D189CE1" , rn_sae().vfnmadd132pd(zmm12, zmm14, zmm1));
+ TEST_INSTRUCTION("62728D589CE1" , ru_sae().vfnmadd132pd(zmm12, zmm14, zmm1));
+ TEST_INSTRUCTION("62728D389CE1" , rd_sae().vfnmadd132pd(zmm12, zmm14, zmm1));
+ TEST_INSTRUCTION("62728D789CE1" , rz_sae().vfnmadd132pd(zmm12, zmm14, zmm1));
+ TEST_INSTRUCTION("62728D489C21" , vfnmadd132pd(zmm12, zmm14, zmmword_ptr(rcx)));
+ TEST_INSTRUCTION("62328D489CA4F023010000" , vfnmadd132pd(zmm12, zmm14, zmmword_ptr(rax, r14, 3, 291)));
+ TEST_INSTRUCTION("62728D589C21" , vfnmadd132pd(zmm12, zmm14, qword_ptr(rcx)._1to8()));
+ TEST_INSTRUCTION("62728D489C627F" , vfnmadd132pd(zmm12, zmm14, zmmword_ptr(rdx, 8128)));
+ TEST_INSTRUCTION("62728D489CA200200000" , vfnmadd132pd(zmm12, zmm14, zmmword_ptr(rdx, 8192)));
+ TEST_INSTRUCTION("62728D489C6280" , vfnmadd132pd(zmm12, zmm14, zmmword_ptr(rdx, -8192)));
+ TEST_INSTRUCTION("62728D489CA2C0DFFFFF" , vfnmadd132pd(zmm12, zmm14, zmmword_ptr(rdx, -8256)));
+ TEST_INSTRUCTION("62728D589C627F" , vfnmadd132pd(zmm12, zmm14, qword_ptr(rdx, 1016)._1to8()));
+ TEST_INSTRUCTION("62728D589CA200040000" , vfnmadd132pd(zmm12, zmm14, qword_ptr(rdx, 1024)._1to8()));
+ TEST_INSTRUCTION("62728D589C6280" , vfnmadd132pd(zmm12, zmm14, qword_ptr(rdx, -1024)._1to8()));
+ TEST_INSTRUCTION("62728D589CA2F8FBFFFF" , vfnmadd132pd(zmm12, zmm14, qword_ptr(rdx, -1032)._1to8()));
+ TEST_INSTRUCTION("62C27D409CEA" , vfnmadd132ps(zmm21, zmm16, zmm10));
+ TEST_INSTRUCTION("62C27D459CEA" , k(k5).vfnmadd132ps(zmm21, zmm16, zmm10));
+ TEST_INSTRUCTION("62C27DC59CEA" , k(k5).z().vfnmadd132ps(zmm21, zmm16, zmm10));
+ TEST_INSTRUCTION("62C27D109CEA" , rn_sae().vfnmadd132ps(zmm21, zmm16, zmm10));
+ TEST_INSTRUCTION("62C27D509CEA" , ru_sae().vfnmadd132ps(zmm21, zmm16, zmm10));
+ TEST_INSTRUCTION("62C27D309CEA" , rd_sae().vfnmadd132ps(zmm21, zmm16, zmm10));
+ TEST_INSTRUCTION("62C27D709CEA" , rz_sae().vfnmadd132ps(zmm21, zmm16, zmm10));
+ TEST_INSTRUCTION("62E27D409C29" , vfnmadd132ps(zmm21, zmm16, zmmword_ptr(rcx)));
+ TEST_INSTRUCTION("62A27D409CACF023010000" , vfnmadd132ps(zmm21, zmm16, zmmword_ptr(rax, r14, 3, 291)));
+ TEST_INSTRUCTION("62E27D509C29" , vfnmadd132ps(zmm21, zmm16, dword_ptr(rcx)._1to16()));
+ TEST_INSTRUCTION("62E27D409C6A7F" , vfnmadd132ps(zmm21, zmm16, zmmword_ptr(rdx, 8128)));
+ TEST_INSTRUCTION("62E27D409CAA00200000" , vfnmadd132ps(zmm21, zmm16, zmmword_ptr(rdx, 8192)));
+ TEST_INSTRUCTION("62E27D409C6A80" , vfnmadd132ps(zmm21, zmm16, zmmword_ptr(rdx, -8192)));
+ TEST_INSTRUCTION("62E27D409CAAC0DFFFFF" , vfnmadd132ps(zmm21, zmm16, zmmword_ptr(rdx, -8256)));
+ TEST_INSTRUCTION("62E27D509C6A7F" , vfnmadd132ps(zmm21, zmm16, dword_ptr(rdx, 508)._1to16()));
+ TEST_INSTRUCTION("62E27D509CAA00020000" , vfnmadd132ps(zmm21, zmm16, dword_ptr(rdx, 512)._1to16()));
+ TEST_INSTRUCTION("62E27D509C6A80" , vfnmadd132ps(zmm21, zmm16, dword_ptr(rdx, -512)._1to16()));
+ TEST_INSTRUCTION("62E27D509CAAFCFDFFFF" , vfnmadd132ps(zmm21, zmm16, dword_ptr(rdx, -516)._1to16()));
+ TEST_INSTRUCTION("62C2E5089DDB" , vfnmadd132sd(xmm19, xmm3, xmm11));
+ TEST_INSTRUCTION("62C2E50A9DDB" , k(k2).vfnmadd132sd(xmm19, xmm3, xmm11));
+ TEST_INSTRUCTION("62C2E58A9DDB" , k(k2).z().vfnmadd132sd(xmm19, xmm3, xmm11));
+ TEST_INSTRUCTION("62C2E5189DDB" , rn_sae().vfnmadd132sd(xmm19, xmm3, xmm11));
+ TEST_INSTRUCTION("62C2E5589DDB" , ru_sae().vfnmadd132sd(xmm19, xmm3, xmm11));
+ TEST_INSTRUCTION("62C2E5389DDB" , rd_sae().vfnmadd132sd(xmm19, xmm3, xmm11));
+ TEST_INSTRUCTION("62C2E5789DDB" , rz_sae().vfnmadd132sd(xmm19, xmm3, xmm11));
+ TEST_INSTRUCTION("62E2E5089D19" , vfnmadd132sd(xmm19, xmm3, qword_ptr(rcx)));
+ TEST_INSTRUCTION("62A2E5089D9CF023010000" , vfnmadd132sd(xmm19, xmm3, qword_ptr(rax, r14, 3, 291)));
+ TEST_INSTRUCTION("62E2E5089D5A7F" , vfnmadd132sd(xmm19, xmm3, qword_ptr(rdx, 1016)));
+ TEST_INSTRUCTION("62E2E5089D9A00040000" , vfnmadd132sd(xmm19, xmm3, qword_ptr(rdx, 1024)));
+ TEST_INSTRUCTION("62E2E5089D5A80" , vfnmadd132sd(xmm19, xmm3, qword_ptr(rdx, -1024)));
+ TEST_INSTRUCTION("62E2E5089D9AF8FBFFFF" , vfnmadd132sd(xmm19, xmm3, qword_ptr(rdx, -1032)));
+ TEST_INSTRUCTION("622275089DCF" , vfnmadd132ss(xmm25, xmm1, xmm23));
+ TEST_INSTRUCTION("6222750B9DCF" , k(k3).vfnmadd132ss(xmm25, xmm1, xmm23));
+ TEST_INSTRUCTION("6222758B9DCF" , k(k3).z().vfnmadd132ss(xmm25, xmm1, xmm23));
+ TEST_INSTRUCTION("622275189DCF" , rn_sae().vfnmadd132ss(xmm25, xmm1, xmm23));
+ TEST_INSTRUCTION("622275589DCF" , ru_sae().vfnmadd132ss(xmm25, xmm1, xmm23));
+ TEST_INSTRUCTION("622275389DCF" , rd_sae().vfnmadd132ss(xmm25, xmm1, xmm23));
+ TEST_INSTRUCTION("622275789DCF" , rz_sae().vfnmadd132ss(xmm25, xmm1, xmm23));
+ TEST_INSTRUCTION("626275089D09" , vfnmadd132ss(xmm25, xmm1, dword_ptr(rcx)));
+ TEST_INSTRUCTION("622275089D8CF023010000" , vfnmadd132ss(xmm25, xmm1, dword_ptr(rax, r14, 3, 291)));
+ TEST_INSTRUCTION("626275089D4A7F" , vfnmadd132ss(xmm25, xmm1, dword_ptr(rdx, 508)));
+ TEST_INSTRUCTION("626275089D8A00020000" , vfnmadd132ss(xmm25, xmm1, dword_ptr(rdx, 512)));
+ TEST_INSTRUCTION("626275089D4A80" , vfnmadd132ss(xmm25, xmm1, dword_ptr(rdx, -512)));
+ TEST_INSTRUCTION("626275089D8AFCFDFFFF" , vfnmadd132ss(xmm25, xmm1, dword_ptr(rdx, -516)));
+ TEST_INSTRUCTION("62C2FD40ACC9" , vfnmadd213pd(zmm17, zmm16, zmm9));
+ TEST_INSTRUCTION("62C2FD44ACC9" , k(k4).vfnmadd213pd(zmm17, zmm16, zmm9));
+ TEST_INSTRUCTION("62C2FDC4ACC9" , k(k4).z().vfnmadd213pd(zmm17, zmm16, zmm9));
+ TEST_INSTRUCTION("62C2FD10ACC9" , rn_sae().vfnmadd213pd(zmm17, zmm16, zmm9));
+ TEST_INSTRUCTION("62C2FD50ACC9" , ru_sae().vfnmadd213pd(zmm17, zmm16, zmm9));
+ TEST_INSTRUCTION("62C2FD30ACC9" , rd_sae().vfnmadd213pd(zmm17, zmm16, zmm9));
+ TEST_INSTRUCTION("62C2FD70ACC9" , rz_sae().vfnmadd213pd(zmm17, zmm16, zmm9));
+ TEST_INSTRUCTION("62E2FD40AC09" , vfnmadd213pd(zmm17, zmm16, zmmword_ptr(rcx)));
+ TEST_INSTRUCTION("62A2FD40AC8CF023010000" , vfnmadd213pd(zmm17, zmm16, zmmword_ptr(rax, r14, 3, 291)));
+ TEST_INSTRUCTION("62E2FD50AC09" , vfnmadd213pd(zmm17, zmm16, qword_ptr(rcx)._1to8()));
+ TEST_INSTRUCTION("62E2FD40AC4A7F" , vfnmadd213pd(zmm17, zmm16, zmmword_ptr(rdx, 8128)));
+ TEST_INSTRUCTION("62E2FD40AC8A00200000" , vfnmadd213pd(zmm17, zmm16, zmmword_ptr(rdx, 8192)));
+ TEST_INSTRUCTION("62E2FD40AC4A80" , vfnmadd213pd(zmm17, zmm16, zmmword_ptr(rdx, -8192)));
+ TEST_INSTRUCTION("62E2FD40AC8AC0DFFFFF" , vfnmadd213pd(zmm17, zmm16, zmmword_ptr(rdx, -8256)));
+ TEST_INSTRUCTION("62E2FD50AC4A7F" , vfnmadd213pd(zmm17, zmm16, qword_ptr(rdx, 1016)._1to8()));
+ TEST_INSTRUCTION("62E2FD50AC8A00040000" , vfnmadd213pd(zmm17, zmm16, qword_ptr(rdx, 1024)._1to8()));
+ TEST_INSTRUCTION("62E2FD50AC4A80" , vfnmadd213pd(zmm17, zmm16, qword_ptr(rdx, -1024)._1to8()));
+ TEST_INSTRUCTION("62E2FD50AC8AF8FBFFFF" , vfnmadd213pd(zmm17, zmm16, qword_ptr(rdx, -1032)._1to8()));
+ TEST_INSTRUCTION("62622D48ACD6" , vfnmadd213ps(zmm26, zmm10, zmm6));
+ TEST_INSTRUCTION("62622D4EACD6" , k(k6).vfnmadd213ps(zmm26, zmm10, zmm6));
+ TEST_INSTRUCTION("62622DCEACD6" , k(k6).z().vfnmadd213ps(zmm26, zmm10, zmm6));
+ TEST_INSTRUCTION("62622D18ACD6" , rn_sae().vfnmadd213ps(zmm26, zmm10, zmm6));
+ TEST_INSTRUCTION("62622D58ACD6" , ru_sae().vfnmadd213ps(zmm26, zmm10, zmm6));
+ TEST_INSTRUCTION("62622D38ACD6" , rd_sae().vfnmadd213ps(zmm26, zmm10, zmm6));
+ TEST_INSTRUCTION("62622D78ACD6" , rz_sae().vfnmadd213ps(zmm26, zmm10, zmm6));
+ TEST_INSTRUCTION("62622D48AC11" , vfnmadd213ps(zmm26, zmm10, zmmword_ptr(rcx)));
+ TEST_INSTRUCTION("62222D48AC94F023010000" , vfnmadd213ps(zmm26, zmm10, zmmword_ptr(rax, r14, 3, 291)));
+ TEST_INSTRUCTION("62622D58AC11" , vfnmadd213ps(zmm26, zmm10, dword_ptr(rcx)._1to16()));
+ TEST_INSTRUCTION("62622D48AC527F" , vfnmadd213ps(zmm26, zmm10, zmmword_ptr(rdx, 8128)));
+ TEST_INSTRUCTION("62622D48AC9200200000" , vfnmadd213ps(zmm26, zmm10, zmmword_ptr(rdx, 8192)));
+ TEST_INSTRUCTION("62622D48AC5280" , vfnmadd213ps(zmm26, zmm10, zmmword_ptr(rdx, -8192)));
+ TEST_INSTRUCTION("62622D48AC92C0DFFFFF" , vfnmadd213ps(zmm26, zmm10, zmmword_ptr(rdx, -8256)));
+ TEST_INSTRUCTION("62622D58AC527F" , vfnmadd213ps(zmm26, zmm10, dword_ptr(rdx, 508)._1to16()));
+ TEST_INSTRUCTION("62622D58AC9200020000" , vfnmadd213ps(zmm26, zmm10, dword_ptr(rdx, 512)._1to16()));
+ TEST_INSTRUCTION("62622D58AC5280" , vfnmadd213ps(zmm26, zmm10, dword_ptr(rdx, -512)._1to16()));
+ TEST_INSTRUCTION("62622D58AC92FCFDFFFF" , vfnmadd213ps(zmm26, zmm10, dword_ptr(rdx, -516)._1to16()));
+ TEST_INSTRUCTION("6272A500ADEA" , vfnmadd213sd(xmm13, xmm27, xmm2));
+ TEST_INSTRUCTION("6272A507ADEA" , k(k7).vfnmadd213sd(xmm13, xmm27, xmm2));
+ TEST_INSTRUCTION("6272A587ADEA" , k(k7).z().vfnmadd213sd(xmm13, xmm27, xmm2));
+ TEST_INSTRUCTION("6272A510ADEA" , rn_sae().vfnmadd213sd(xmm13, xmm27, xmm2));
+ TEST_INSTRUCTION("6272A550ADEA" , ru_sae().vfnmadd213sd(xmm13, xmm27, xmm2));
+ TEST_INSTRUCTION("6272A530ADEA" , rd_sae().vfnmadd213sd(xmm13, xmm27, xmm2));
+ TEST_INSTRUCTION("6272A570ADEA" , rz_sae().vfnmadd213sd(xmm13, xmm27, xmm2));
+ TEST_INSTRUCTION("6272A500AD29" , vfnmadd213sd(xmm13, xmm27, qword_ptr(rcx)));
+ TEST_INSTRUCTION("6232A500ADACF023010000" , vfnmadd213sd(xmm13, xmm27, qword_ptr(rax, r14, 3, 291)));
+ TEST_INSTRUCTION("6272A500AD6A7F" , vfnmadd213sd(xmm13, xmm27, qword_ptr(rdx, 1016)));
+ TEST_INSTRUCTION("6272A500ADAA00040000" , vfnmadd213sd(xmm13, xmm27, qword_ptr(rdx, 1024)));
+ TEST_INSTRUCTION("6272A500AD6A80" , vfnmadd213sd(xmm13, xmm27, qword_ptr(rdx, -1024)));
+ TEST_INSTRUCTION("6272A500ADAAF8FBFFFF" , vfnmadd213sd(xmm13, xmm27, qword_ptr(rdx, -1032)));
+ TEST_INSTRUCTION("62024508ADEC" , vfnmadd213ss(xmm29, xmm7, xmm28));
+ TEST_INSTRUCTION("6202450AADEC" , k(k2).vfnmadd213ss(xmm29, xmm7, xmm28));
+ TEST_INSTRUCTION("6202458AADEC" , k(k2).z().vfnmadd213ss(xmm29, xmm7, xmm28));
+ TEST_INSTRUCTION("62024518ADEC" , rn_sae().vfnmadd213ss(xmm29, xmm7, xmm28));
+ TEST_INSTRUCTION("62024558ADEC" , ru_sae().vfnmadd213ss(xmm29, xmm7, xmm28));
+ TEST_INSTRUCTION("62024538ADEC" , rd_sae().vfnmadd213ss(xmm29, xmm7, xmm28));
+ TEST_INSTRUCTION("62024578ADEC" , rz_sae().vfnmadd213ss(xmm29, xmm7, xmm28));
+ TEST_INSTRUCTION("62624508AD29" , vfnmadd213ss(xmm29, xmm7, dword_ptr(rcx)));
+ TEST_INSTRUCTION("62224508ADACF023010000" , vfnmadd213ss(xmm29, xmm7, dword_ptr(rax, r14, 3, 291)));
+ TEST_INSTRUCTION("62624508AD6A7F" , vfnmadd213ss(xmm29, xmm7, dword_ptr(rdx, 508)));
+ TEST_INSTRUCTION("62624508ADAA00020000" , vfnmadd213ss(xmm29, xmm7, dword_ptr(rdx, 512)));
+ TEST_INSTRUCTION("62624508AD6A80" , vfnmadd213ss(xmm29, xmm7, dword_ptr(rdx, -512)));
+ TEST_INSTRUCTION("62624508ADAAFCFDFFFF" , vfnmadd213ss(xmm29, xmm7, dword_ptr(rdx, -516)));
+ TEST_INSTRUCTION("6232A548BCE0" , vfnmadd231pd(zmm12, zmm11, zmm16));
+ TEST_INSTRUCTION("6232A54EBCE0" , k(k6).vfnmadd231pd(zmm12, zmm11, zmm16));
+ TEST_INSTRUCTION("6232A5CEBCE0" , k(k6).z().vfnmadd231pd(zmm12, zmm11, zmm16));
+ TEST_INSTRUCTION("6232A518BCE0" , rn_sae().vfnmadd231pd(zmm12, zmm11, zmm16));
+ TEST_INSTRUCTION("6232A558BCE0" , ru_sae().vfnmadd231pd(zmm12, zmm11, zmm16));
+ TEST_INSTRUCTION("6232A538BCE0" , rd_sae().vfnmadd231pd(zmm12, zmm11, zmm16));
+ TEST_INSTRUCTION("6232A578BCE0" , rz_sae().vfnmadd231pd(zmm12, zmm11, zmm16));
+ TEST_INSTRUCTION("6272A548BC21" , vfnmadd231pd(zmm12, zmm11, zmmword_ptr(rcx)));
+ TEST_INSTRUCTION("6232A548BCA4F023010000" , vfnmadd231pd(zmm12, zmm11, zmmword_ptr(rax, r14, 3, 291)));
+ TEST_INSTRUCTION("6272A558BC21" , vfnmadd231pd(zmm12, zmm11, qword_ptr(rcx)._1to8()));
+ TEST_INSTRUCTION("6272A548BC627F" , vfnmadd231pd(zmm12, zmm11, zmmword_ptr(rdx, 8128)));
+ TEST_INSTRUCTION("6272A548BCA200200000" , vfnmadd231pd(zmm12, zmm11, zmmword_ptr(rdx, 8192)));
+ TEST_INSTRUCTION("6272A548BC6280" , vfnmadd231pd(zmm12, zmm11, zmmword_ptr(rdx, -8192)));
+ TEST_INSTRUCTION("6272A548BCA2C0DFFFFF" , vfnmadd231pd(zmm12, zmm11, zmmword_ptr(rdx, -8256)));
+ TEST_INSTRUCTION("6272A558BC627F" , vfnmadd231pd(zmm12, zmm11, qword_ptr(rdx, 1016)._1to8()));
+ TEST_INSTRUCTION("6272A558BCA200040000" , vfnmadd231pd(zmm12, zmm11, qword_ptr(rdx, 1024)._1to8()));
+ TEST_INSTRUCTION("6272A558BC6280" , vfnmadd231pd(zmm12, zmm11, qword_ptr(rdx, -1024)._1to8()));
+ TEST_INSTRUCTION("6272A558BCA2F8FBFFFF" , vfnmadd231pd(zmm12, zmm11, qword_ptr(rdx, -1032)._1to8()));
+ TEST_INSTRUCTION("62124548BCF0" , vfnmadd231ps(zmm14, zmm7, zmm24));
+ TEST_INSTRUCTION("6212454DBCF0" , k(k5).vfnmadd231ps(zmm14, zmm7, zmm24));
+ TEST_INSTRUCTION("621245CDBCF0" , k(k5).z().vfnmadd231ps(zmm14, zmm7, zmm24));
+ TEST_INSTRUCTION("62124518BCF0" , rn_sae().vfnmadd231ps(zmm14, zmm7, zmm24));
+ TEST_INSTRUCTION("62124558BCF0" , ru_sae().vfnmadd231ps(zmm14, zmm7, zmm24));
+ TEST_INSTRUCTION("62124538BCF0" , rd_sae().vfnmadd231ps(zmm14, zmm7, zmm24));
+ TEST_INSTRUCTION("62124578BCF0" , rz_sae().vfnmadd231ps(zmm14, zmm7, zmm24));
+ TEST_INSTRUCTION("62724548BC31" , vfnmadd231ps(zmm14, zmm7, zmmword_ptr(rcx)));
+ TEST_INSTRUCTION("62324548BCB4F023010000" , vfnmadd231ps(zmm14, zmm7, zmmword_ptr(rax, r14, 3, 291)));
+ TEST_INSTRUCTION("62724558BC31" , vfnmadd231ps(zmm14, zmm7, dword_ptr(rcx)._1to16()));
+ TEST_INSTRUCTION("62724548BC727F" , vfnmadd231ps(zmm14, zmm7, zmmword_ptr(rdx, 8128)));
+ TEST_INSTRUCTION("62724548BCB200200000" , vfnmadd231ps(zmm14, zmm7, zmmword_ptr(rdx, 8192)));
+ TEST_INSTRUCTION("62724548BC7280" , vfnmadd231ps(zmm14, zmm7, zmmword_ptr(rdx, -8192)));
+ TEST_INSTRUCTION("62724548BCB2C0DFFFFF" , vfnmadd231ps(zmm14, zmm7, zmmword_ptr(rdx, -8256)));
+ TEST_INSTRUCTION("62724558BC727F" , vfnmadd231ps(zmm14, zmm7, dword_ptr(rdx, 508)._1to16()));
+ TEST_INSTRUCTION("62724558BCB200020000" , vfnmadd231ps(zmm14, zmm7, dword_ptr(rdx, 512)._1to16()));
+ TEST_INSTRUCTION("62724558BC7280" , vfnmadd231ps(zmm14, zmm7, dword_ptr(rdx, -512)._1to16()));
+ TEST_INSTRUCTION("62724558BCB2FCFDFFFF" , vfnmadd231ps(zmm14, zmm7, dword_ptr(rdx, -516)._1to16()));
+ TEST_INSTRUCTION("62B2A508BDF2" , vfnmadd231sd(xmm6, xmm11, xmm18));
+ TEST_INSTRUCTION("62B2A50BBDF2" , k(k3).vfnmadd231sd(xmm6, xmm11, xmm18));
+ TEST_INSTRUCTION("62B2A58BBDF2" , k(k3).z().vfnmadd231sd(xmm6, xmm11, xmm18));
+ TEST_INSTRUCTION("62B2A518BDF2" , rn_sae().vfnmadd231sd(xmm6, xmm11, xmm18));
+ TEST_INSTRUCTION("62B2A558BDF2" , ru_sae().vfnmadd231sd(xmm6, xmm11, xmm18));
+ TEST_INSTRUCTION("62B2A538BDF2" , rd_sae().vfnmadd231sd(xmm6, xmm11, xmm18));
+ TEST_INSTRUCTION("62B2A578BDF2" , rz_sae().vfnmadd231sd(xmm6, xmm11, xmm18));
+ TEST_INSTRUCTION("C4E2A1BD31" , vfnmadd231sd(xmm6, xmm11, qword_ptr(rcx)));
+ TEST_INSTRUCTION("C4A2A1BDB4F023010000" , vfnmadd231sd(xmm6, xmm11, qword_ptr(rax, r14, 3, 291)));
+ TEST_INSTRUCTION("C4E2A1BDB2F8030000" , vfnmadd231sd(xmm6, xmm11, qword_ptr(rdx, 1016)));
+ TEST_INSTRUCTION("C4E2A1BDB200040000" , vfnmadd231sd(xmm6, xmm11, qword_ptr(rdx, 1024)));
+ TEST_INSTRUCTION("C4E2A1BDB200FCFFFF" , vfnmadd231sd(xmm6, xmm11, qword_ptr(rdx, -1024)));
+ TEST_INSTRUCTION("C4E2A1BDB2F8FBFFFF" , vfnmadd231sd(xmm6, xmm11, qword_ptr(rdx, -1032)));
+ TEST_INSTRUCTION("62226D08BDD9" , vfnmadd231ss(xmm27, xmm2, xmm17));
+ TEST_INSTRUCTION("62226D09BDD9" , k(k1).vfnmadd231ss(xmm27, xmm2, xmm17));
+ TEST_INSTRUCTION("62226D89BDD9" , k(k1).z().vfnmadd231ss(xmm27, xmm2, xmm17));
+ TEST_INSTRUCTION("62226D18BDD9" , rn_sae().vfnmadd231ss(xmm27, xmm2, xmm17));
+ TEST_INSTRUCTION("62226D58BDD9" , ru_sae().vfnmadd231ss(xmm27, xmm2, xmm17));
+ TEST_INSTRUCTION("62226D38BDD9" , rd_sae().vfnmadd231ss(xmm27, xmm2, xmm17));
+ TEST_INSTRUCTION("62226D78BDD9" , rz_sae().vfnmadd231ss(xmm27, xmm2, xmm17));
+ TEST_INSTRUCTION("62626D08BD19" , vfnmadd231ss(xmm27, xmm2, dword_ptr(rcx)));
+ TEST_INSTRUCTION("62226D08BD9CF023010000" , vfnmadd231ss(xmm27, xmm2, dword_ptr(rax, r14, 3, 291)));
+ TEST_INSTRUCTION("62626D08BD5A7F" , vfnmadd231ss(xmm27, xmm2, dword_ptr(rdx, 508)));
+ TEST_INSTRUCTION("62626D08BD9A00020000" , vfnmadd231ss(xmm27, xmm2, dword_ptr(rdx, 512)));
+ TEST_INSTRUCTION("62626D08BD5A80" , vfnmadd231ss(xmm27, xmm2, dword_ptr(rdx, -512)));
+ TEST_INSTRUCTION("62626D08BD9AFCFDFFFF" , vfnmadd231ss(xmm27, xmm2, dword_ptr(rdx, -516)));
+ TEST_INSTRUCTION("6262D5489EE6" , vfnmsub132pd(zmm28, zmm5, zmm6));
+ TEST_INSTRUCTION("6262D54A9EE6" , k(k2).vfnmsub132pd(zmm28, zmm5, zmm6));
+ TEST_INSTRUCTION("6262D5CA9EE6" , k(k2).z().vfnmsub132pd(zmm28, zmm5, zmm6));
+ TEST_INSTRUCTION("6262D5189EE6" , rn_sae().vfnmsub132pd(zmm28, zmm5, zmm6));
+ TEST_INSTRUCTION("6262D5589EE6" , ru_sae().vfnmsub132pd(zmm28, zmm5, zmm6));
+ TEST_INSTRUCTION("6262D5389EE6" , rd_sae().vfnmsub132pd(zmm28, zmm5, zmm6));
+ TEST_INSTRUCTION("6262D5789EE6" , rz_sae().vfnmsub132pd(zmm28, zmm5, zmm6));
+ TEST_INSTRUCTION("6262D5489E21" , vfnmsub132pd(zmm28, zmm5, zmmword_ptr(rcx)));
+ TEST_INSTRUCTION("6222D5489EA4F023010000" , vfnmsub132pd(zmm28, zmm5, zmmword_ptr(rax, r14, 3, 291)));
+ TEST_INSTRUCTION("6262D5589E21" , vfnmsub132pd(zmm28, zmm5, qword_ptr(rcx)._1to8()));
+ TEST_INSTRUCTION("6262D5489E627F" , vfnmsub132pd(zmm28, zmm5, zmmword_ptr(rdx, 8128)));
+ TEST_INSTRUCTION("6262D5489EA200200000" , vfnmsub132pd(zmm28, zmm5, zmmword_ptr(rdx, 8192)));
+ TEST_INSTRUCTION("6262D5489E6280" , vfnmsub132pd(zmm28, zmm5, zmmword_ptr(rdx, -8192)));
+ TEST_INSTRUCTION("6262D5489EA2C0DFFFFF" , vfnmsub132pd(zmm28, zmm5, zmmword_ptr(rdx, -8256)));
+ TEST_INSTRUCTION("6262D5589E627F" , vfnmsub132pd(zmm28, zmm5, qword_ptr(rdx, 1016)._1to8()));
+ TEST_INSTRUCTION("6262D5589EA200040000" , vfnmsub132pd(zmm28, zmm5, qword_ptr(rdx, 1024)._1to8()));
+ TEST_INSTRUCTION("6262D5589E6280" , vfnmsub132pd(zmm28, zmm5, qword_ptr(rdx, -1024)._1to8()));
+ TEST_INSTRUCTION("6262D5589EA2F8FBFFFF" , vfnmsub132pd(zmm28, zmm5, qword_ptr(rdx, -1032)._1to8()));
+ TEST_INSTRUCTION("62F26D409EE6" , vfnmsub132ps(zmm4, zmm18, zmm6));
+ TEST_INSTRUCTION("62F26D429EE6" , k(k2).vfnmsub132ps(zmm4, zmm18, zmm6));
+ TEST_INSTRUCTION("62F26DC29EE6" , k(k2).z().vfnmsub132ps(zmm4, zmm18, zmm6));
+ TEST_INSTRUCTION("62F26D109EE6" , rn_sae().vfnmsub132ps(zmm4, zmm18, zmm6));
+ TEST_INSTRUCTION("62F26D509EE6" , ru_sae().vfnmsub132ps(zmm4, zmm18, zmm6));
+ TEST_INSTRUCTION("62F26D309EE6" , rd_sae().vfnmsub132ps(zmm4, zmm18, zmm6));
+ TEST_INSTRUCTION("62F26D709EE6" , rz_sae().vfnmsub132ps(zmm4, zmm18, zmm6));
+ TEST_INSTRUCTION("62F26D409E21" , vfnmsub132ps(zmm4, zmm18, zmmword_ptr(rcx)));
+ TEST_INSTRUCTION("62B26D409EA4F023010000" , vfnmsub132ps(zmm4, zmm18, zmmword_ptr(rax, r14, 3, 291)));
+ TEST_INSTRUCTION("62F26D509E21" , vfnmsub132ps(zmm4, zmm18, dword_ptr(rcx)._1to16()));
+ TEST_INSTRUCTION("62F26D409E627F" , vfnmsub132ps(zmm4, zmm18, zmmword_ptr(rdx, 8128)));
+ TEST_INSTRUCTION("62F26D409EA200200000" , vfnmsub132ps(zmm4, zmm18, zmmword_ptr(rdx, 8192)));
+ TEST_INSTRUCTION("62F26D409E6280" , vfnmsub132ps(zmm4, zmm18, zmmword_ptr(rdx, -8192)));
+ TEST_INSTRUCTION("62F26D409EA2C0DFFFFF" , vfnmsub132ps(zmm4, zmm18, zmmword_ptr(rdx, -8256)));
+ TEST_INSTRUCTION("62F26D509E627F" , vfnmsub132ps(zmm4, zmm18, dword_ptr(rdx, 508)._1to16()));
+ TEST_INSTRUCTION("62F26D509EA200020000" , vfnmsub132ps(zmm4, zmm18, dword_ptr(rdx, 512)._1to16()));
+ TEST_INSTRUCTION("62F26D509E6280" , vfnmsub132ps(zmm4, zmm18, dword_ptr(rdx, -512)._1to16()));
+ TEST_INSTRUCTION("62F26D509EA2FCFDFFFF" , vfnmsub132ps(zmm4, zmm18, dword_ptr(rdx, -516)._1to16()));
+ TEST_INSTRUCTION("6242A5089FD5" , vfnmsub132sd(xmm26, xmm11, xmm13));
+ TEST_INSTRUCTION("6242A50E9FD5" , k(k6).vfnmsub132sd(xmm26, xmm11, xmm13));
+ TEST_INSTRUCTION("6242A58E9FD5" , k(k6).z().vfnmsub132sd(xmm26, xmm11, xmm13));
+ TEST_INSTRUCTION("6242A5189FD5" , rn_sae().vfnmsub132sd(xmm26, xmm11, xmm13));
+ TEST_INSTRUCTION("6242A5589FD5" , ru_sae().vfnmsub132sd(xmm26, xmm11, xmm13));
+ TEST_INSTRUCTION("6242A5389FD5" , rd_sae().vfnmsub132sd(xmm26, xmm11, xmm13));
+ TEST_INSTRUCTION("6242A5789FD5" , rz_sae().vfnmsub132sd(xmm26, xmm11, xmm13));
+ TEST_INSTRUCTION("6262A5089F11" , vfnmsub132sd(xmm26, xmm11, qword_ptr(rcx)));
+ TEST_INSTRUCTION("6222A5089F94F023010000" , vfnmsub132sd(xmm26, xmm11, qword_ptr(rax, r14, 3, 291)));
+ TEST_INSTRUCTION("6262A5089F527F" , vfnmsub132sd(xmm26, xmm11, qword_ptr(rdx, 1016)));
+ TEST_INSTRUCTION("6262A5089F9200040000" , vfnmsub132sd(xmm26, xmm11, qword_ptr(rdx, 1024)));
+ TEST_INSTRUCTION("6262A5089F5280" , vfnmsub132sd(xmm26, xmm11, qword_ptr(rdx, -1024)));
+ TEST_INSTRUCTION("6262A5089F92F8FBFFFF" , vfnmsub132sd(xmm26, xmm11, qword_ptr(rdx, -1032)));
+ TEST_INSTRUCTION("62824D009FF8" , vfnmsub132ss(xmm23, xmm22, xmm24));
+ TEST_INSTRUCTION("62824D069FF8" , k(k6).vfnmsub132ss(xmm23, xmm22, xmm24));
+ TEST_INSTRUCTION("62824D869FF8" , k(k6).z().vfnmsub132ss(xmm23, xmm22, xmm24));
+ TEST_INSTRUCTION("62824D109FF8" , rn_sae().vfnmsub132ss(xmm23, xmm22, xmm24));
+ TEST_INSTRUCTION("62824D509FF8" , ru_sae().vfnmsub132ss(xmm23, xmm22, xmm24));
+ TEST_INSTRUCTION("62824D309FF8" , rd_sae().vfnmsub132ss(xmm23, xmm22, xmm24));
+ TEST_INSTRUCTION("62824D709FF8" , rz_sae().vfnmsub132ss(xmm23, xmm22, xmm24));
+ TEST_INSTRUCTION("62E24D009F39" , vfnmsub132ss(xmm23, xmm22, dword_ptr(rcx)));
+ TEST_INSTRUCTION("62A24D009FBCF023010000" , vfnmsub132ss(xmm23, xmm22, dword_ptr(rax, r14, 3, 291)));
+ TEST_INSTRUCTION("62E24D009F7A7F" , vfnmsub132ss(xmm23, xmm22, dword_ptr(rdx, 508)));
+ TEST_INSTRUCTION("62E24D009FBA00020000" , vfnmsub132ss(xmm23, xmm22, dword_ptr(rdx, 512)));
+ TEST_INSTRUCTION("62E24D009F7A80" , vfnmsub132ss(xmm23, xmm22, dword_ptr(rdx, -512)));
+ TEST_INSTRUCTION("62E24D009FBAFCFDFFFF" , vfnmsub132ss(xmm23, xmm22, dword_ptr(rdx, -516)));
+ TEST_INSTRUCTION("62C2ED40AEFB" , vfnmsub213pd(zmm23, zmm18, zmm11));
+ TEST_INSTRUCTION("62C2ED42AEFB" , k(k2).vfnmsub213pd(zmm23, zmm18, zmm11));
+ TEST_INSTRUCTION("62C2EDC2AEFB" , k(k2).z().vfnmsub213pd(zmm23, zmm18, zmm11));
+ TEST_INSTRUCTION("62C2ED10AEFB" , rn_sae().vfnmsub213pd(zmm23, zmm18, zmm11));
+ TEST_INSTRUCTION("62C2ED50AEFB" , ru_sae().vfnmsub213pd(zmm23, zmm18, zmm11));
+ TEST_INSTRUCTION("62C2ED30AEFB" , rd_sae().vfnmsub213pd(zmm23, zmm18, zmm11));
+ TEST_INSTRUCTION("62C2ED70AEFB" , rz_sae().vfnmsub213pd(zmm23, zmm18, zmm11));
+ TEST_INSTRUCTION("62E2ED40AE39" , vfnmsub213pd(zmm23, zmm18, zmmword_ptr(rcx)));
+ TEST_INSTRUCTION("62A2ED40AEBCF023010000" , vfnmsub213pd(zmm23, zmm18, zmmword_ptr(rax, r14, 3, 291)));
+ TEST_INSTRUCTION("62E2ED50AE39" , vfnmsub213pd(zmm23, zmm18, qword_ptr(rcx)._1to8()));
+ TEST_INSTRUCTION("62E2ED40AE7A7F" , vfnmsub213pd(zmm23, zmm18, zmmword_ptr(rdx, 8128)));
+ TEST_INSTRUCTION("62E2ED40AEBA00200000" , vfnmsub213pd(zmm23, zmm18, zmmword_ptr(rdx, 8192)));
+ TEST_INSTRUCTION("62E2ED40AE7A80" , vfnmsub213pd(zmm23, zmm18, zmmword_ptr(rdx, -8192)));
+ TEST_INSTRUCTION("62E2ED40AEBAC0DFFFFF" , vfnmsub213pd(zmm23, zmm18, zmmword_ptr(rdx, -8256)));
+ TEST_INSTRUCTION("62E2ED50AE7A7F" , vfnmsub213pd(zmm23, zmm18, qword_ptr(rdx, 1016)._1to8()));
+ TEST_INSTRUCTION("62E2ED50AEBA00040000" , vfnmsub213pd(zmm23, zmm18, qword_ptr(rdx, 1024)._1to8()));
+ TEST_INSTRUCTION("62E2ED50AE7A80" , vfnmsub213pd(zmm23, zmm18, qword_ptr(rdx, -1024)._1to8()));
+ TEST_INSTRUCTION("62E2ED50AEBAF8FBFFFF" , vfnmsub213pd(zmm23, zmm18, qword_ptr(rdx, -1032)._1to8()));
+ TEST_INSTRUCTION("62E21548AEEA" , vfnmsub213ps(zmm21, zmm13, zmm2));
+ TEST_INSTRUCTION("62E2154BAEEA" , k(k3).vfnmsub213ps(zmm21, zmm13, zmm2));
+ TEST_INSTRUCTION("62E215CBAEEA" , k(k3).z().vfnmsub213ps(zmm21, zmm13, zmm2));
+ TEST_INSTRUCTION("62E21518AEEA" , rn_sae().vfnmsub213ps(zmm21, zmm13, zmm2));
+ TEST_INSTRUCTION("62E21558AEEA" , ru_sae().vfnmsub213ps(zmm21, zmm13, zmm2));
+ TEST_INSTRUCTION("62E21538AEEA" , rd_sae().vfnmsub213ps(zmm21, zmm13, zmm2));
+ TEST_INSTRUCTION("62E21578AEEA" , rz_sae().vfnmsub213ps(zmm21, zmm13, zmm2));
+ TEST_INSTRUCTION("62E21548AE29" , vfnmsub213ps(zmm21, zmm13, zmmword_ptr(rcx)));
+ TEST_INSTRUCTION("62A21548AEACF023010000" , vfnmsub213ps(zmm21, zmm13, zmmword_ptr(rax, r14, 3, 291)));
+ TEST_INSTRUCTION("62E21558AE29" , vfnmsub213ps(zmm21, zmm13, dword_ptr(rcx)._1to16()));
+ TEST_INSTRUCTION("62E21548AE6A7F" , vfnmsub213ps(zmm21, zmm13, zmmword_ptr(rdx, 8128)));
+ TEST_INSTRUCTION("62E21548AEAA00200000" , vfnmsub213ps(zmm21, zmm13, zmmword_ptr(rdx, 8192)));
+ TEST_INSTRUCTION("62E21548AE6A80" , vfnmsub213ps(zmm21, zmm13, zmmword_ptr(rdx, -8192)));
+ TEST_INSTRUCTION("62E21548AEAAC0DFFFFF" , vfnmsub213ps(zmm21, zmm13, zmmword_ptr(rdx, -8256)));
+ TEST_INSTRUCTION("62E21558AE6A7F" , vfnmsub213ps(zmm21, zmm13, dword_ptr(rdx, 508)._1to16()));
+ TEST_INSTRUCTION("62E21558AEAA00020000" , vfnmsub213ps(zmm21, zmm13, dword_ptr(rdx, 512)._1to16()));
+ TEST_INSTRUCTION("62E21558AE6A80" , vfnmsub213ps(zmm21, zmm13, dword_ptr(rdx, -512)._1to16()));
+ TEST_INSTRUCTION("62E21558AEAAFCFDFFFF" , vfnmsub213ps(zmm21, zmm13, dword_ptr(rdx, -516)._1to16()));
+ TEST_INSTRUCTION("6202C500AFEC" , vfnmsub213sd(xmm29, xmm23, xmm28));
+ TEST_INSTRUCTION("6202C503AFEC" , k(k3).vfnmsub213sd(xmm29, xmm23, xmm28));
+ TEST_INSTRUCTION("6202C583AFEC" , k(k3).z().vfnmsub213sd(xmm29, xmm23, xmm28));
+ TEST_INSTRUCTION("6202C510AFEC" , rn_sae().vfnmsub213sd(xmm29, xmm23, xmm28));
+ TEST_INSTRUCTION("6202C550AFEC" , ru_sae().vfnmsub213sd(xmm29, xmm23, xmm28));
+ TEST_INSTRUCTION("6202C530AFEC" , rd_sae().vfnmsub213sd(xmm29, xmm23, xmm28));
+ TEST_INSTRUCTION("6202C570AFEC" , rz_sae().vfnmsub213sd(xmm29, xmm23, xmm28));
+ TEST_INSTRUCTION("6262C500AF29" , vfnmsub213sd(xmm29, xmm23, qword_ptr(rcx)));
+ TEST_INSTRUCTION("6222C500AFACF023010000" , vfnmsub213sd(xmm29, xmm23, qword_ptr(rax, r14, 3, 291)));
+ TEST_INSTRUCTION("6262C500AF6A7F" , vfnmsub213sd(xmm29, xmm23, qword_ptr(rdx, 1016)));
+ TEST_INSTRUCTION("6262C500AFAA00040000" , vfnmsub213sd(xmm29, xmm23, qword_ptr(rdx, 1024)));
+ TEST_INSTRUCTION("6262C500AF6A80" , vfnmsub213sd(xmm29, xmm23, qword_ptr(rdx, -1024)));
+ TEST_INSTRUCTION("6262C500AFAAF8FBFFFF" , vfnmsub213sd(xmm29, xmm23, qword_ptr(rdx, -1032)));
+ TEST_INSTRUCTION("62521D00AFF4" , vfnmsub213ss(xmm14, xmm28, xmm12));
+ TEST_INSTRUCTION("62521D04AFF4" , k(k4).vfnmsub213ss(xmm14, xmm28, xmm12));
+ TEST_INSTRUCTION("62521D84AFF4" , k(k4).z().vfnmsub213ss(xmm14, xmm28, xmm12));
+ TEST_INSTRUCTION("62521D10AFF4" , rn_sae().vfnmsub213ss(xmm14, xmm28, xmm12));
+ TEST_INSTRUCTION("62521D50AFF4" , ru_sae().vfnmsub213ss(xmm14, xmm28, xmm12));
+ TEST_INSTRUCTION("62521D30AFF4" , rd_sae().vfnmsub213ss(xmm14, xmm28, xmm12));
+ TEST_INSTRUCTION("62521D70AFF4" , rz_sae().vfnmsub213ss(xmm14, xmm28, xmm12));
+ TEST_INSTRUCTION("62721D00AF31" , vfnmsub213ss(xmm14, xmm28, dword_ptr(rcx)));
+ TEST_INSTRUCTION("62321D00AFB4F023010000" , vfnmsub213ss(xmm14, xmm28, dword_ptr(rax, r14, 3, 291)));
+ TEST_INSTRUCTION("62721D00AF727F" , vfnmsub213ss(xmm14, xmm28, dword_ptr(rdx, 508)));
+ TEST_INSTRUCTION("62721D00AFB200020000" , vfnmsub213ss(xmm14, xmm28, dword_ptr(rdx, 512)));
+ TEST_INSTRUCTION("62721D00AF7280" , vfnmsub213ss(xmm14, xmm28, dword_ptr(rdx, -512)));
+ TEST_INSTRUCTION("62721D00AFB2FCFDFFFF" , vfnmsub213ss(xmm14, xmm28, dword_ptr(rdx, -516)));
+ TEST_INSTRUCTION("6202DD48BEE8" , vfnmsub231pd(zmm29, zmm4, zmm24));
+ TEST_INSTRUCTION("6202DD4FBEE8" , k(k7).vfnmsub231pd(zmm29, zmm4, zmm24));
+ TEST_INSTRUCTION("6202DDCFBEE8" , k(k7).z().vfnmsub231pd(zmm29, zmm4, zmm24));
+ TEST_INSTRUCTION("6202DD18BEE8" , rn_sae().vfnmsub231pd(zmm29, zmm4, zmm24));
+ TEST_INSTRUCTION("6202DD58BEE8" , ru_sae().vfnmsub231pd(zmm29, zmm4, zmm24));
+ TEST_INSTRUCTION("6202DD38BEE8" , rd_sae().vfnmsub231pd(zmm29, zmm4, zmm24));
+ TEST_INSTRUCTION("6202DD78BEE8" , rz_sae().vfnmsub231pd(zmm29, zmm4, zmm24));
+ TEST_INSTRUCTION("6262DD48BE29" , vfnmsub231pd(zmm29, zmm4, zmmword_ptr(rcx)));
+ TEST_INSTRUCTION("6222DD48BEACF023010000" , vfnmsub231pd(zmm29, zmm4, zmmword_ptr(rax, r14, 3, 291)));
+ TEST_INSTRUCTION("6262DD58BE29" , vfnmsub231pd(zmm29, zmm4, qword_ptr(rcx)._1to8()));
+ TEST_INSTRUCTION("6262DD48BE6A7F" , vfnmsub231pd(zmm29, zmm4, zmmword_ptr(rdx, 8128)));
+ TEST_INSTRUCTION("6262DD48BEAA00200000" , vfnmsub231pd(zmm29, zmm4, zmmword_ptr(rdx, 8192)));
+ TEST_INSTRUCTION("6262DD48BE6A80" , vfnmsub231pd(zmm29, zmm4, zmmword_ptr(rdx, -8192)));
+ TEST_INSTRUCTION("6262DD48BEAAC0DFFFFF" , vfnmsub231pd(zmm29, zmm4, zmmword_ptr(rdx, -8256)));
+ TEST_INSTRUCTION("6262DD58BE6A7F" , vfnmsub231pd(zmm29, zmm4, qword_ptr(rdx, 1016)._1to8()));
+ TEST_INSTRUCTION("6262DD58BEAA00040000" , vfnmsub231pd(zmm29, zmm4, qword_ptr(rdx, 1024)._1to8()));
+ TEST_INSTRUCTION("6262DD58BE6A80" , vfnmsub231pd(zmm29, zmm4, qword_ptr(rdx, -1024)._1to8()));
+ TEST_INSTRUCTION("6262DD58BEAAF8FBFFFF" , vfnmsub231pd(zmm29, zmm4, qword_ptr(rdx, -1032)._1to8()));
+ TEST_INSTRUCTION("62524D48BEC5" , vfnmsub231ps(zmm8, zmm6, zmm13));
+ TEST_INSTRUCTION("62524D4ABEC5" , k(k2).vfnmsub231ps(zmm8, zmm6, zmm13));
+ TEST_INSTRUCTION("62524DCABEC5" , k(k2).z().vfnmsub231ps(zmm8, zmm6, zmm13));
+ TEST_INSTRUCTION("62524D18BEC5" , rn_sae().vfnmsub231ps(zmm8, zmm6, zmm13));
+ TEST_INSTRUCTION("62524D58BEC5" , ru_sae().vfnmsub231ps(zmm8, zmm6, zmm13));
+ TEST_INSTRUCTION("62524D38BEC5" , rd_sae().vfnmsub231ps(zmm8, zmm6, zmm13));
+ TEST_INSTRUCTION("62524D78BEC5" , rz_sae().vfnmsub231ps(zmm8, zmm6, zmm13));
+ TEST_INSTRUCTION("62724D48BE01" , vfnmsub231ps(zmm8, zmm6, zmmword_ptr(rcx)));
+ TEST_INSTRUCTION("62324D48BE84F023010000" , vfnmsub231ps(zmm8, zmm6, zmmword_ptr(rax, r14, 3, 291)));
+ TEST_INSTRUCTION("62724D58BE01" , vfnmsub231ps(zmm8, zmm6, dword_ptr(rcx)._1to16()));
+ TEST_INSTRUCTION("62724D48BE427F" , vfnmsub231ps(zmm8, zmm6, zmmword_ptr(rdx, 8128)));
+ TEST_INSTRUCTION("62724D48BE8200200000" , vfnmsub231ps(zmm8, zmm6, zmmword_ptr(rdx, 8192)));
+ TEST_INSTRUCTION("62724D48BE4280" , vfnmsub231ps(zmm8, zmm6, zmmword_ptr(rdx, -8192)));
+ TEST_INSTRUCTION("62724D48BE82C0DFFFFF" , vfnmsub231ps(zmm8, zmm6, zmmword_ptr(rdx, -8256)));
+ TEST_INSTRUCTION("62724D58BE427F" , vfnmsub231ps(zmm8, zmm6, dword_ptr(rdx, 508)._1to16()));
+ TEST_INSTRUCTION("62724D58BE8200020000" , vfnmsub231ps(zmm8, zmm6, dword_ptr(rdx, 512)._1to16()));
+ TEST_INSTRUCTION("62724D58BE4280" , vfnmsub231ps(zmm8, zmm6, dword_ptr(rdx, -512)._1to16()));
+ TEST_INSTRUCTION("62724D58BE82FCFDFFFF" , vfnmsub231ps(zmm8, zmm6, dword_ptr(rdx, -516)._1to16()));
+ TEST_INSTRUCTION("62D2DD00BFF6" , vfnmsub231sd(xmm6, xmm20, xmm14));
+ TEST_INSTRUCTION("62D2DD01BFF6" , k(k1).vfnmsub231sd(xmm6, xmm20, xmm14));
+ TEST_INSTRUCTION("62D2DD81BFF6" , k(k1).z().vfnmsub231sd(xmm6, xmm20, xmm14));
+ TEST_INSTRUCTION("62D2DD10BFF6" , rn_sae().vfnmsub231sd(xmm6, xmm20, xmm14));
+ TEST_INSTRUCTION("62D2DD50BFF6" , ru_sae().vfnmsub231sd(xmm6, xmm20, xmm14));
+ TEST_INSTRUCTION("62D2DD30BFF6" , rd_sae().vfnmsub231sd(xmm6, xmm20, xmm14));
+ TEST_INSTRUCTION("62D2DD70BFF6" , rz_sae().vfnmsub231sd(xmm6, xmm20, xmm14));
+ TEST_INSTRUCTION("62F2DD00BF31" , vfnmsub231sd(xmm6, xmm20, qword_ptr(rcx)));
+ TEST_INSTRUCTION("62B2DD00BFB4F023010000" , vfnmsub231sd(xmm6, xmm20, qword_ptr(rax, r14, 3, 291)));
+ TEST_INSTRUCTION("62F2DD00BF727F" , vfnmsub231sd(xmm6, xmm20, qword_ptr(rdx, 1016)));
+ TEST_INSTRUCTION("62F2DD00BFB200040000" , vfnmsub231sd(xmm6, xmm20, qword_ptr(rdx, 1024)));
+ TEST_INSTRUCTION("62F2DD00BF7280" , vfnmsub231sd(xmm6, xmm20, qword_ptr(rdx, -1024)));
+ TEST_INSTRUCTION("62F2DD00BFB2F8FBFFFF" , vfnmsub231sd(xmm6, xmm20, qword_ptr(rdx, -1032)));
+ TEST_INSTRUCTION("62421508BFD2" , vfnmsub231ss(xmm26, xmm13, xmm10));
+ TEST_INSTRUCTION("6242150CBFD2" , k(k4).vfnmsub231ss(xmm26, xmm13, xmm10));
+ TEST_INSTRUCTION("6242158CBFD2" , k(k4).z().vfnmsub231ss(xmm26, xmm13, xmm10));
+ TEST_INSTRUCTION("62421518BFD2" , rn_sae().vfnmsub231ss(xmm26, xmm13, xmm10));
+ TEST_INSTRUCTION("62421558BFD2" , ru_sae().vfnmsub231ss(xmm26, xmm13, xmm10));
+ TEST_INSTRUCTION("62421538BFD2" , rd_sae().vfnmsub231ss(xmm26, xmm13, xmm10));
+ TEST_INSTRUCTION("62421578BFD2" , rz_sae().vfnmsub231ss(xmm26, xmm13, xmm10));
+ TEST_INSTRUCTION("62621508BF11" , vfnmsub231ss(xmm26, xmm13, dword_ptr(rcx)));
+ TEST_INSTRUCTION("62221508BF94F023010000" , vfnmsub231ss(xmm26, xmm13, dword_ptr(rax, r14, 3, 291)));
+ TEST_INSTRUCTION("62621508BF527F" , vfnmsub231ss(xmm26, xmm13, dword_ptr(rdx, 508)));
+ TEST_INSTRUCTION("62621508BF9200020000" , vfnmsub231ss(xmm26, xmm13, dword_ptr(rdx, 512)));
+ TEST_INSTRUCTION("62621508BF5280" , vfnmsub231ss(xmm26, xmm13, dword_ptr(rdx, -512)));
+ TEST_INSTRUCTION("62621508BF92FCFDFFFF" , vfnmsub231ss(xmm26, xmm13, dword_ptr(rdx, -516)));
+ TEST_INSTRUCTION("6212FD4842F1" , vgetexppd(zmm14, zmm25));
+ TEST_INSTRUCTION("6212FD4D42F1" , k(k5).vgetexppd(zmm14, zmm25));
+ TEST_INSTRUCTION("6212FDCD42F1" , k(k5).z().vgetexppd(zmm14, zmm25));
+ TEST_INSTRUCTION("6212FD1842F1" , sae().vgetexppd(zmm14, zmm25));
+ TEST_INSTRUCTION("6272FD484231" , vgetexppd(zmm14, zmmword_ptr(rcx)));
+ TEST_INSTRUCTION("6232FD4842B4F023010000" , vgetexppd(zmm14, zmmword_ptr(rax, r14, 3, 291)));
+ TEST_INSTRUCTION("6272FD584231" , vgetexppd(zmm14, qword_ptr(rcx)._1to8()));
+ TEST_INSTRUCTION("6272FD4842727F" , vgetexppd(zmm14, zmmword_ptr(rdx, 8128)));
+ TEST_INSTRUCTION("6272FD4842B200200000" , vgetexppd(zmm14, zmmword_ptr(rdx, 8192)));
+ TEST_INSTRUCTION("6272FD48427280" , vgetexppd(zmm14, zmmword_ptr(rdx, -8192)));
+ TEST_INSTRUCTION("6272FD4842B2C0DFFFFF" , vgetexppd(zmm14, zmmword_ptr(rdx, -8256)));
+ TEST_INSTRUCTION("6272FD5842727F" , vgetexppd(zmm14, qword_ptr(rdx, 1016)._1to8()));
+ TEST_INSTRUCTION("6272FD5842B200040000" , vgetexppd(zmm14, qword_ptr(rdx, 1024)._1to8()));
+ TEST_INSTRUCTION("6272FD58427280" , vgetexppd(zmm14, qword_ptr(rdx, -1024)._1to8()));
+ TEST_INSTRUCTION("6272FD5842B2F8FBFFFF" , vgetexppd(zmm14, qword_ptr(rdx, -1032)._1to8()));
+ TEST_INSTRUCTION("62F27D4842CE" , vgetexpps(zmm1, zmm6));
+ TEST_INSTRUCTION("62F27D4B42CE" , k(k3).vgetexpps(zmm1, zmm6));
+ TEST_INSTRUCTION("62F27DCB42CE" , k(k3).z().vgetexpps(zmm1, zmm6));
+ TEST_INSTRUCTION("62F27D1842CE" , sae().vgetexpps(zmm1, zmm6));
+ TEST_INSTRUCTION("62F27D484209" , vgetexpps(zmm1, zmmword_ptr(rcx)));
+ TEST_INSTRUCTION("62B27D48428CF023010000" , vgetexpps(zmm1, zmmword_ptr(rax, r14, 3, 291)));
+ TEST_INSTRUCTION("62F27D584209" , vgetexpps(zmm1, dword_ptr(rcx)._1to16()));
+ TEST_INSTRUCTION("62F27D48424A7F" , vgetexpps(zmm1, zmmword_ptr(rdx, 8128)));
+ TEST_INSTRUCTION("62F27D48428A00200000" , vgetexpps(zmm1, zmmword_ptr(rdx, 8192)));
+ TEST_INSTRUCTION("62F27D48424A80" , vgetexpps(zmm1, zmmword_ptr(rdx, -8192)));
+ TEST_INSTRUCTION("62F27D48428AC0DFFFFF" , vgetexpps(zmm1, zmmword_ptr(rdx, -8256)));
+ TEST_INSTRUCTION("62F27D58424A7F" , vgetexpps(zmm1, dword_ptr(rdx, 508)._1to16()));
+ TEST_INSTRUCTION("62F27D58428A00020000" , vgetexpps(zmm1, dword_ptr(rdx, 512)._1to16()));
+ TEST_INSTRUCTION("62F27D58424A80" , vgetexpps(zmm1, dword_ptr(rdx, -512)._1to16()));
+ TEST_INSTRUCTION("62F27D58428AFCFDFFFF" , vgetexpps(zmm1, dword_ptr(rdx, -516)._1to16()));
+ TEST_INSTRUCTION("62F2C50843D2" , vgetexpsd(xmm2, xmm7, xmm2));
+ TEST_INSTRUCTION("62F2C50D43D2" , k(k5).vgetexpsd(xmm2, xmm7, xmm2));
+ TEST_INSTRUCTION("62F2C58D43D2" , k(k5).z().vgetexpsd(xmm2, xmm7, xmm2));
+ TEST_INSTRUCTION("62F2C51843D2" , sae().vgetexpsd(xmm2, xmm7, xmm2));
+ TEST_INSTRUCTION("62F2C5084311" , vgetexpsd(xmm2, xmm7, qword_ptr(rcx)));
+ TEST_INSTRUCTION("62B2C5084394F023010000" , vgetexpsd(xmm2, xmm7, qword_ptr(rax, r14, 3, 291)));
+ TEST_INSTRUCTION("62F2C50843527F" , vgetexpsd(xmm2, xmm7, qword_ptr(rdx, 1016)));
+ TEST_INSTRUCTION("62F2C508439200040000" , vgetexpsd(xmm2, xmm7, qword_ptr(rdx, 1024)));
+ TEST_INSTRUCTION("62F2C508435280" , vgetexpsd(xmm2, xmm7, qword_ptr(rdx, -1024)));
+ TEST_INSTRUCTION("62F2C5084392F8FBFFFF" , vgetexpsd(xmm2, xmm7, qword_ptr(rdx, -1032)));
+ TEST_INSTRUCTION("6282750843E2" , vgetexpss(xmm20, xmm1, xmm26));
+ TEST_INSTRUCTION("6282750F43E2" , k(k7).vgetexpss(xmm20, xmm1, xmm26));
+ TEST_INSTRUCTION("6282758F43E2" , k(k7).z().vgetexpss(xmm20, xmm1, xmm26));
+ TEST_INSTRUCTION("6282751843E2" , sae().vgetexpss(xmm20, xmm1, xmm26));
+ TEST_INSTRUCTION("62E275084321" , vgetexpss(xmm20, xmm1, dword_ptr(rcx)));
+ TEST_INSTRUCTION("62A2750843A4F023010000" , vgetexpss(xmm20, xmm1, dword_ptr(rax, r14, 3, 291)));
+ TEST_INSTRUCTION("62E2750843627F" , vgetexpss(xmm20, xmm1, dword_ptr(rdx, 508)));
+ TEST_INSTRUCTION("62E2750843A200020000" , vgetexpss(xmm20, xmm1, dword_ptr(rdx, 512)));
+ TEST_INSTRUCTION("62E27508436280" , vgetexpss(xmm20, xmm1, dword_ptr(rdx, -512)));
+ TEST_INSTRUCTION("62E2750843A2FCFDFFFF" , vgetexpss(xmm20, xmm1, dword_ptr(rdx, -516)));
+ TEST_INSTRUCTION("6293FD4826D2AB" , vgetmantpd(zmm2, zmm26, 171));
+ TEST_INSTRUCTION("6293FD4F26D2AB" , k(k7).vgetmantpd(zmm2, zmm26, 171));
+ TEST_INSTRUCTION("6293FDCF26D2AB" , k(k7).z().vgetmantpd(zmm2, zmm26, 171));
+ TEST_INSTRUCTION("6293FD1826D2AB" , sae().vgetmantpd(zmm2, zmm26, 171));
+ TEST_INSTRUCTION("6293FD4826D27B" , vgetmantpd(zmm2, zmm26, 123));
+ TEST_INSTRUCTION("6293FD1826D27B" , sae().vgetmantpd(zmm2, zmm26, 123));
+ TEST_INSTRUCTION("62F3FD4826117B" , vgetmantpd(zmm2, zmmword_ptr(rcx), 123));
+ TEST_INSTRUCTION("62B3FD482694F0230100007B" , vgetmantpd(zmm2, zmmword_ptr(rax, r14, 3, 291), 123));
+ TEST_INSTRUCTION("62F3FD5826117B" , vgetmantpd(zmm2, qword_ptr(rcx)._1to8(), 123));
+ TEST_INSTRUCTION("62F3FD4826527F7B" , vgetmantpd(zmm2, zmmword_ptr(rdx, 8128), 123));
+ TEST_INSTRUCTION("62F3FD482692002000007B" , vgetmantpd(zmm2, zmmword_ptr(rdx, 8192), 123));
+ TEST_INSTRUCTION("62F3FD482652807B" , vgetmantpd(zmm2, zmmword_ptr(rdx, -8192), 123));
+ TEST_INSTRUCTION("62F3FD482692C0DFFFFF7B" , vgetmantpd(zmm2, zmmword_ptr(rdx, -8256), 123));
+ TEST_INSTRUCTION("62F3FD5826527F7B" , vgetmantpd(zmm2, qword_ptr(rdx, 1016)._1to8(), 123));
+ TEST_INSTRUCTION("62F3FD582692000400007B" , vgetmantpd(zmm2, qword_ptr(rdx, 1024)._1to8(), 123));
+ TEST_INSTRUCTION("62F3FD582652807B" , vgetmantpd(zmm2, qword_ptr(rdx, -1024)._1to8(), 123));
+ TEST_INSTRUCTION("62F3FD582692F8FBFFFF7B" , vgetmantpd(zmm2, qword_ptr(rdx, -1032)._1to8(), 123));
+ TEST_INSTRUCTION("62837D4826F4AB" , vgetmantps(zmm22, zmm28, 171));
+ TEST_INSTRUCTION("62837D4B26F4AB" , k(k3).vgetmantps(zmm22, zmm28, 171));
+ TEST_INSTRUCTION("62837DCB26F4AB" , k(k3).z().vgetmantps(zmm22, zmm28, 171));
+ TEST_INSTRUCTION("62837D1826F4AB" , sae().vgetmantps(zmm22, zmm28, 171));
+ TEST_INSTRUCTION("62837D4826F47B" , vgetmantps(zmm22, zmm28, 123));
+ TEST_INSTRUCTION("62837D1826F47B" , sae().vgetmantps(zmm22, zmm28, 123));
+ TEST_INSTRUCTION("62E37D4826317B" , vgetmantps(zmm22, zmmword_ptr(rcx), 123));
+ TEST_INSTRUCTION("62A37D4826B4F0230100007B" , vgetmantps(zmm22, zmmword_ptr(rax, r14, 3, 291), 123));
+ TEST_INSTRUCTION("62E37D5826317B" , vgetmantps(zmm22, dword_ptr(rcx)._1to16(), 123));
+ TEST_INSTRUCTION("62E37D4826727F7B" , vgetmantps(zmm22, zmmword_ptr(rdx, 8128), 123));
+ TEST_INSTRUCTION("62E37D4826B2002000007B" , vgetmantps(zmm22, zmmword_ptr(rdx, 8192), 123));
+ TEST_INSTRUCTION("62E37D482672807B" , vgetmantps(zmm22, zmmword_ptr(rdx, -8192), 123));
+ TEST_INSTRUCTION("62E37D4826B2C0DFFFFF7B" , vgetmantps(zmm22, zmmword_ptr(rdx, -8256), 123));
+ TEST_INSTRUCTION("62E37D5826727F7B" , vgetmantps(zmm22, dword_ptr(rdx, 508)._1to16(), 123));
+ TEST_INSTRUCTION("62E37D5826B2000200007B" , vgetmantps(zmm22, dword_ptr(rdx, 512)._1to16(), 123));
+ TEST_INSTRUCTION("62E37D582672807B" , vgetmantps(zmm22, dword_ptr(rdx, -512)._1to16(), 123));
+ TEST_INSTRUCTION("62E37D5826B2FCFDFFFF7B" , vgetmantps(zmm22, dword_ptr(rdx, -516)._1to16(), 123));
+ TEST_INSTRUCTION("62D3A50027D8AB" , vgetmantsd(xmm3, xmm27, xmm8, 171));
+ TEST_INSTRUCTION("62D3A50627D8AB" , k(k6).vgetmantsd(xmm3, xmm27, xmm8, 171));
+ TEST_INSTRUCTION("62D3A58627D8AB" , k(k6).z().vgetmantsd(xmm3, xmm27, xmm8, 171));
+ TEST_INSTRUCTION("62D3A51027D8AB" , sae().vgetmantsd(xmm3, xmm27, xmm8, 171));
+ TEST_INSTRUCTION("62D3A50027D87B" , vgetmantsd(xmm3, xmm27, xmm8, 123));
+ TEST_INSTRUCTION("62D3A51027D87B" , sae().vgetmantsd(xmm3, xmm27, xmm8, 123));
+ TEST_INSTRUCTION("62F3A50027197B" , vgetmantsd(xmm3, xmm27, qword_ptr(rcx), 123));
+ TEST_INSTRUCTION("62B3A500279CF0230100007B" , vgetmantsd(xmm3, xmm27, qword_ptr(rax, r14, 3, 291), 123));
+ TEST_INSTRUCTION("62F3A500275A7F7B" , vgetmantsd(xmm3, xmm27, qword_ptr(rdx, 1016), 123));
+ TEST_INSTRUCTION("62F3A500279A000400007B" , vgetmantsd(xmm3, xmm27, qword_ptr(rdx, 1024), 123));
+ TEST_INSTRUCTION("62F3A500275A807B" , vgetmantsd(xmm3, xmm27, qword_ptr(rdx, -1024), 123));
+ TEST_INSTRUCTION("62F3A500279AF8FBFFFF7B" , vgetmantsd(xmm3, xmm27, qword_ptr(rdx, -1032), 123));
+ TEST_INSTRUCTION("62D36D0827DCAB" , vgetmantss(xmm3, xmm2, xmm12, 171));
+ TEST_INSTRUCTION("62D36D0F27DCAB" , k(k7).vgetmantss(xmm3, xmm2, xmm12, 171));
+ TEST_INSTRUCTION("62D36D8F27DCAB" , k(k7).z().vgetmantss(xmm3, xmm2, xmm12, 171));
+ TEST_INSTRUCTION("62D36D1827DCAB" , sae().vgetmantss(xmm3, xmm2, xmm12, 171));
+ TEST_INSTRUCTION("62D36D0827DC7B" , vgetmantss(xmm3, xmm2, xmm12, 123));
+ TEST_INSTRUCTION("62D36D1827DC7B" , sae().vgetmantss(xmm3, xmm2, xmm12, 123));
+ TEST_INSTRUCTION("62F36D0827197B" , vgetmantss(xmm3, xmm2, dword_ptr(rcx), 123));
+ TEST_INSTRUCTION("62B36D08279CF0230100007B" , vgetmantss(xmm3, xmm2, dword_ptr(rax, r14, 3, 291), 123));
+ TEST_INSTRUCTION("62F36D08275A7F7B" , vgetmantss(xmm3, xmm2, dword_ptr(rdx, 508), 123));
+ TEST_INSTRUCTION("62F36D08279A000200007B" , vgetmantss(xmm3, xmm2, dword_ptr(rdx, 512), 123));
+ TEST_INSTRUCTION("62F36D08275A807B" , vgetmantss(xmm3, xmm2, dword_ptr(rdx, -512), 123));
+ TEST_INSTRUCTION("62F36D08279AFCFDFFFF7B" , vgetmantss(xmm3, xmm2, dword_ptr(rdx, -516), 123));
+ TEST_INSTRUCTION("62732D4018DBAB" , vinsertf32x4(zmm11, zmm26, xmm3, 171));
+ TEST_INSTRUCTION("62732D4118DBAB" , k(k1).vinsertf32x4(zmm11, zmm26, xmm3, 171));
+ TEST_INSTRUCTION("62732DC118DBAB" , k(k1).z().vinsertf32x4(zmm11, zmm26, xmm3, 171));
+ TEST_INSTRUCTION("62732D4018DB7B" , vinsertf32x4(zmm11, zmm26, xmm3, 123));
+ TEST_INSTRUCTION("62732D4018197B" , vinsertf32x4(zmm11, zmm26, xmmword_ptr(rcx), 123));
+ TEST_INSTRUCTION("62332D40189CF0230100007B" , vinsertf32x4(zmm11, zmm26, xmmword_ptr(rax, r14, 3, 291), 123));
+ TEST_INSTRUCTION("62732D40185A7F7B" , vinsertf32x4(zmm11, zmm26, xmmword_ptr(rdx, 2032), 123));
+ TEST_INSTRUCTION("62732D40189A000800007B" , vinsertf32x4(zmm11, zmm26, xmmword_ptr(rdx, 2048), 123));
+ TEST_INSTRUCTION("62732D40185A807B" , vinsertf32x4(zmm11, zmm26, xmmword_ptr(rdx, -2048), 123));
+ TEST_INSTRUCTION("62732D40189AF0F7FFFF7B" , vinsertf32x4(zmm11, zmm26, xmmword_ptr(rdx, -2064), 123));
+ TEST_INSTRUCTION("62F3D5481ACFAB" , vinsertf64x4(zmm1, zmm5, ymm7, 171));
+ TEST_INSTRUCTION("62F3D5491ACFAB" , k(k1).vinsertf64x4(zmm1, zmm5, ymm7, 171));
+ TEST_INSTRUCTION("62F3D5C91ACFAB" , k(k1).z().vinsertf64x4(zmm1, zmm5, ymm7, 171));
+ TEST_INSTRUCTION("62F3D5481ACF7B" , vinsertf64x4(zmm1, zmm5, ymm7, 123));
+ TEST_INSTRUCTION("62F3D5481A097B" , vinsertf64x4(zmm1, zmm5, ymmword_ptr(rcx), 123));
+ TEST_INSTRUCTION("62B3D5481A8CF0230100007B" , vinsertf64x4(zmm1, zmm5, ymmword_ptr(rax, r14, 3, 291), 123));
+ TEST_INSTRUCTION("62F3D5481A4A7F7B" , vinsertf64x4(zmm1, zmm5, ymmword_ptr(rdx, 4064), 123));
+ TEST_INSTRUCTION("62F3D5481A8A001000007B" , vinsertf64x4(zmm1, zmm5, ymmword_ptr(rdx, 4096), 123));
+ TEST_INSTRUCTION("62F3D5481A4A807B" , vinsertf64x4(zmm1, zmm5, ymmword_ptr(rdx, -4096), 123));
+ TEST_INSTRUCTION("62F3D5481A8AE0EFFFFF7B" , vinsertf64x4(zmm1, zmm5, ymmword_ptr(rdx, -4128), 123));
+ TEST_INSTRUCTION("62C3154838CAAB" , vinserti32x4(zmm17, zmm13, xmm10, 171));
+ TEST_INSTRUCTION("62C3154E38CAAB" , k(k6).vinserti32x4(zmm17, zmm13, xmm10, 171));
+ TEST_INSTRUCTION("62C315CE38CAAB" , k(k6).z().vinserti32x4(zmm17, zmm13, xmm10, 171));
+ TEST_INSTRUCTION("62C3154838CA7B" , vinserti32x4(zmm17, zmm13, xmm10, 123));
+ TEST_INSTRUCTION("62E3154838097B" , vinserti32x4(zmm17, zmm13, xmmword_ptr(rcx), 123));
+ TEST_INSTRUCTION("62A31548388CF0230100007B" , vinserti32x4(zmm17, zmm13, xmmword_ptr(rax, r14, 3, 291), 123));
+ TEST_INSTRUCTION("62E31548384A7F7B" , vinserti32x4(zmm17, zmm13, xmmword_ptr(rdx, 2032), 123));
+ TEST_INSTRUCTION("62E31548388A000800007B" , vinserti32x4(zmm17, zmm13, xmmword_ptr(rdx, 2048), 123));
+ TEST_INSTRUCTION("62E31548384A807B" , vinserti32x4(zmm17, zmm13, xmmword_ptr(rdx, -2048), 123));
+ TEST_INSTRUCTION("62E31548388AF0F7FFFF7B" , vinserti32x4(zmm17, zmm13, xmmword_ptr(rdx, -2064), 123));
+ TEST_INSTRUCTION("62F3B5403AE4AB" , vinserti64x4(zmm4, zmm25, ymm4, 171));
+ TEST_INSTRUCTION("62F3B5413AE4AB" , k(k1).vinserti64x4(zmm4, zmm25, ymm4, 171));
+ TEST_INSTRUCTION("62F3B5C13AE4AB" , k(k1).z().vinserti64x4(zmm4, zmm25, ymm4, 171));
+ TEST_INSTRUCTION("62F3B5403AE47B" , vinserti64x4(zmm4, zmm25, ymm4, 123));
+ TEST_INSTRUCTION("62F3B5403A217B" , vinserti64x4(zmm4, zmm25, ymmword_ptr(rcx), 123));
+ TEST_INSTRUCTION("62B3B5403AA4F0230100007B" , vinserti64x4(zmm4, zmm25, ymmword_ptr(rax, r14, 3, 291), 123));
+ TEST_INSTRUCTION("62F3B5403A627F7B" , vinserti64x4(zmm4, zmm25, ymmword_ptr(rdx, 4064), 123));
+ TEST_INSTRUCTION("62F3B5403AA2001000007B" , vinserti64x4(zmm4, zmm25, ymmword_ptr(rdx, 4096), 123));
+ TEST_INSTRUCTION("62F3B5403A62807B" , vinserti64x4(zmm4, zmm25, ymmword_ptr(rdx, -4096), 123));
+ TEST_INSTRUCTION("62F3B5403AA2E0EFFFFF7B" , vinserti64x4(zmm4, zmm25, ymmword_ptr(rdx, -4128), 123));
+ TEST_INSTRUCTION("6263750021F5AB" , vinsertps(xmm30, xmm17, xmm5, 171));
+ TEST_INSTRUCTION("6263750021F57B" , vinsertps(xmm30, xmm17, xmm5, 123));
+ TEST_INSTRUCTION("6263750021317B" , vinsertps(xmm30, xmm17, dword_ptr(rcx), 123));
+ TEST_INSTRUCTION("6223750021B4F0230100007B" , vinsertps(xmm30, xmm17, dword_ptr(rax, r14, 3, 291), 123));
+ TEST_INSTRUCTION("6263750021727F7B" , vinsertps(xmm30, xmm17, dword_ptr(rdx, 508), 123));
+ TEST_INSTRUCTION("6263750021B2000200007B" , vinsertps(xmm30, xmm17, dword_ptr(rdx, 512), 123));
+ TEST_INSTRUCTION("626375002172807B" , vinsertps(xmm30, xmm17, dword_ptr(rdx, -512), 123));
+ TEST_INSTRUCTION("6263750021B2FCFDFFFF7B" , vinsertps(xmm30, xmm17, dword_ptr(rdx, -516), 123));
+ TEST_INSTRUCTION("62219D405FF4" , vmaxpd(zmm30, zmm28, zmm20));
+ TEST_INSTRUCTION("62219D415FF4" , k(k1).vmaxpd(zmm30, zmm28, zmm20));
+ TEST_INSTRUCTION("62219DC15FF4" , k(k1).z().vmaxpd(zmm30, zmm28, zmm20));
+ TEST_INSTRUCTION("62219D105FF4" , sae().vmaxpd(zmm30, zmm28, zmm20));
+ TEST_INSTRUCTION("62619D405F31" , vmaxpd(zmm30, zmm28, zmmword_ptr(rcx)));
+ TEST_INSTRUCTION("62219D405FB4F023010000" , vmaxpd(zmm30, zmm28, zmmword_ptr(rax, r14, 3, 291)));
+ TEST_INSTRUCTION("62619D505F31" , vmaxpd(zmm30, zmm28, qword_ptr(rcx)._1to8()));
+ TEST_INSTRUCTION("62619D405F727F" , vmaxpd(zmm30, zmm28, zmmword_ptr(rdx, 8128)));
+ TEST_INSTRUCTION("62619D405FB200200000" , vmaxpd(zmm30, zmm28, zmmword_ptr(rdx, 8192)));
+ TEST_INSTRUCTION("62619D405F7280" , vmaxpd(zmm30, zmm28, zmmword_ptr(rdx, -8192)));
+ TEST_INSTRUCTION("62619D405FB2C0DFFFFF" , vmaxpd(zmm30, zmm28, zmmword_ptr(rdx, -8256)));
+ TEST_INSTRUCTION("62619D505F727F" , vmaxpd(zmm30, zmm28, qword_ptr(rdx, 1016)._1to8()));
+ TEST_INSTRUCTION("62619D505FB200040000" , vmaxpd(zmm30, zmm28, qword_ptr(rdx, 1024)._1to8()));
+ TEST_INSTRUCTION("62619D505F7280" , vmaxpd(zmm30, zmm28, qword_ptr(rdx, -1024)._1to8()));
+ TEST_INSTRUCTION("62619D505FB2F8FBFFFF" , vmaxpd(zmm30, zmm28, qword_ptr(rdx, -1032)._1to8()));
+ TEST_INSTRUCTION("62214C485FCC" , vmaxps(zmm25, zmm6, zmm20));
+ TEST_INSTRUCTION("62214C495FCC" , k(k1).vmaxps(zmm25, zmm6, zmm20));
+ TEST_INSTRUCTION("62214CC95FCC" , k(k1).z().vmaxps(zmm25, zmm6, zmm20));
+ TEST_INSTRUCTION("62214C185FCC" , sae().vmaxps(zmm25, zmm6, zmm20));
+ TEST_INSTRUCTION("62614C485F09" , vmaxps(zmm25, zmm6, zmmword_ptr(rcx)));
+ TEST_INSTRUCTION("62214C485F8CF023010000" , vmaxps(zmm25, zmm6, zmmword_ptr(rax, r14, 3, 291)));
+ TEST_INSTRUCTION("62614C585F09" , vmaxps(zmm25, zmm6, dword_ptr(rcx)._1to16()));
+ TEST_INSTRUCTION("62614C485F4A7F" , vmaxps(zmm25, zmm6, zmmword_ptr(rdx, 8128)));
+ TEST_INSTRUCTION("62614C485F8A00200000" , vmaxps(zmm25, zmm6, zmmword_ptr(rdx, 8192)));
+ TEST_INSTRUCTION("62614C485F4A80" , vmaxps(zmm25, zmm6, zmmword_ptr(rdx, -8192)));
+ TEST_INSTRUCTION("62614C485F8AC0DFFFFF" , vmaxps(zmm25, zmm6, zmmword_ptr(rdx, -8256)));
+ TEST_INSTRUCTION("62614C585F4A7F" , vmaxps(zmm25, zmm6, dword_ptr(rdx, 508)._1to16()));
+ TEST_INSTRUCTION("62614C585F8A00020000" , vmaxps(zmm25, zmm6, dword_ptr(rdx, 512)._1to16()));
+ TEST_INSTRUCTION("62614C585F4A80" , vmaxps(zmm25, zmm6, dword_ptr(rdx, -512)._1to16()));
+ TEST_INSTRUCTION("62614C585F8AFCFDFFFF" , vmaxps(zmm25, zmm6, dword_ptr(rdx, -516)._1to16()));
+ TEST_INSTRUCTION("6281E7005FE1" , vmaxsd(xmm20, xmm19, xmm25));
+ TEST_INSTRUCTION("6281E7035FE1" , k(k3).vmaxsd(xmm20, xmm19, xmm25));
+ TEST_INSTRUCTION("6281E7835FE1" , k(k3).z().vmaxsd(xmm20, xmm19, xmm25));
+ TEST_INSTRUCTION("6281E7105FE1" , sae().vmaxsd(xmm20, xmm19, xmm25));
+ TEST_INSTRUCTION("62E1E7005F21" , vmaxsd(xmm20, xmm19, qword_ptr(rcx)));
+ TEST_INSTRUCTION("62A1E7005FA4F023010000" , vmaxsd(xmm20, xmm19, qword_ptr(rax, r14, 3, 291)));
+ TEST_INSTRUCTION("62E1E7005F627F" , vmaxsd(xmm20, xmm19, qword_ptr(rdx, 1016)));
+ TEST_INSTRUCTION("62E1E7005FA200040000" , vmaxsd(xmm20, xmm19, qword_ptr(rdx, 1024)));
+ TEST_INSTRUCTION("62E1E7005F6280" , vmaxsd(xmm20, xmm19, qword_ptr(rdx, -1024)));
+ TEST_INSTRUCTION("62E1E7005FA2F8FBFFFF" , vmaxsd(xmm20, xmm19, qword_ptr(rdx, -1032)));
+ TEST_INSTRUCTION("C55A5FC6" , vmaxss(xmm8, xmm4, xmm6));
+ TEST_INSTRUCTION("62715E0C5FC6" , k(k4).vmaxss(xmm8, xmm4, xmm6));
+ TEST_INSTRUCTION("62715E8C5FC6" , k(k4).z().vmaxss(xmm8, xmm4, xmm6));
+ TEST_INSTRUCTION("62715E185FC6" , sae().vmaxss(xmm8, xmm4, xmm6));
+ TEST_INSTRUCTION("C55A5F01" , vmaxss(xmm8, xmm4, dword_ptr(rcx)));
+ TEST_INSTRUCTION("C4215A5F84F023010000" , vmaxss(xmm8, xmm4, dword_ptr(rax, r14, 3, 291)));
+ TEST_INSTRUCTION("C55A5F82FC010000" , vmaxss(xmm8, xmm4, dword_ptr(rdx, 508)));
+ TEST_INSTRUCTION("C55A5F8200020000" , vmaxss(xmm8, xmm4, dword_ptr(rdx, 512)));
+ TEST_INSTRUCTION("C55A5F8200FEFFFF" , vmaxss(xmm8, xmm4, dword_ptr(rdx, -512)));
+ TEST_INSTRUCTION("C55A5F82FCFDFFFF" , vmaxss(xmm8, xmm4, dword_ptr(rdx, -516)));
+ TEST_INSTRUCTION("62B1CD485DF6" , vminpd(zmm6, zmm6, zmm22));
+ TEST_INSTRUCTION("62B1CD4F5DF6" , k(k7).vminpd(zmm6, zmm6, zmm22));
+ TEST_INSTRUCTION("62B1CDCF5DF6" , k(k7).z().vminpd(zmm6, zmm6, zmm22));
+ TEST_INSTRUCTION("62B1CD185DF6" , sae().vminpd(zmm6, zmm6, zmm22));
+ TEST_INSTRUCTION("62F1CD485D31" , vminpd(zmm6, zmm6, zmmword_ptr(rcx)));
+ TEST_INSTRUCTION("62B1CD485DB4F023010000" , vminpd(zmm6, zmm6, zmmword_ptr(rax, r14, 3, 291)));
+ TEST_INSTRUCTION("62F1CD585D31" , vminpd(zmm6, zmm6, qword_ptr(rcx)._1to8()));
+ TEST_INSTRUCTION("62F1CD485D727F" , vminpd(zmm6, zmm6, zmmword_ptr(rdx, 8128)));
+ TEST_INSTRUCTION("62F1CD485DB200200000" , vminpd(zmm6, zmm6, zmmword_ptr(rdx, 8192)));
+ TEST_INSTRUCTION("62F1CD485D7280" , vminpd(zmm6, zmm6, zmmword_ptr(rdx, -8192)));
+ TEST_INSTRUCTION("62F1CD485DB2C0DFFFFF" , vminpd(zmm6, zmm6, zmmword_ptr(rdx, -8256)));
+ TEST_INSTRUCTION("62F1CD585D727F" , vminpd(zmm6, zmm6, qword_ptr(rdx, 1016)._1to8()));
+ TEST_INSTRUCTION("62F1CD585DB200040000" , vminpd(zmm6, zmm6, qword_ptr(rdx, 1024)._1to8()));
+ TEST_INSTRUCTION("62F1CD585D7280" , vminpd(zmm6, zmm6, qword_ptr(rdx, -1024)._1to8()));
+ TEST_INSTRUCTION("62F1CD585DB2F8FBFFFF" , vminpd(zmm6, zmm6, qword_ptr(rdx, -1032)._1to8()));
+ TEST_INSTRUCTION("62F164485DDF" , vminps(zmm3, zmm3, zmm7));
+ TEST_INSTRUCTION("62F1644B5DDF" , k(k3).vminps(zmm3, zmm3, zmm7));
+ TEST_INSTRUCTION("62F164CB5DDF" , k(k3).z().vminps(zmm3, zmm3, zmm7));
+ TEST_INSTRUCTION("62F164185DDF" , sae().vminps(zmm3, zmm3, zmm7));
+ TEST_INSTRUCTION("62F164485D19" , vminps(zmm3, zmm3, zmmword_ptr(rcx)));
+ TEST_INSTRUCTION("62B164485D9CF023010000" , vminps(zmm3, zmm3, zmmword_ptr(rax, r14, 3, 291)));
+ TEST_INSTRUCTION("62F164585D19" , vminps(zmm3, zmm3, dword_ptr(rcx)._1to16()));
+ TEST_INSTRUCTION("62F164485D5A7F" , vminps(zmm3, zmm3, zmmword_ptr(rdx, 8128)));
+ TEST_INSTRUCTION("62F164485D9A00200000" , vminps(zmm3, zmm3, zmmword_ptr(rdx, 8192)));
+ TEST_INSTRUCTION("62F164485D5A80" , vminps(zmm3, zmm3, zmmword_ptr(rdx, -8192)));
+ TEST_INSTRUCTION("62F164485D9AC0DFFFFF" , vminps(zmm3, zmm3, zmmword_ptr(rdx, -8256)));
+ TEST_INSTRUCTION("62F164585D5A7F" , vminps(zmm3, zmm3, dword_ptr(rdx, 508)._1to16()));
+ TEST_INSTRUCTION("62F164585D9A00020000" , vminps(zmm3, zmm3, dword_ptr(rdx, 512)._1to16()));
+ TEST_INSTRUCTION("62F164585D5A80" , vminps(zmm3, zmm3, dword_ptr(rdx, -512)._1to16()));
+ TEST_INSTRUCTION("62F164585D9AFCFDFFFF" , vminps(zmm3, zmm3, dword_ptr(rdx, -516)._1to16()));
+ TEST_INSTRUCTION("6291B7005DEA" , vminsd(xmm5, xmm25, xmm26));
+ TEST_INSTRUCTION("6291B7035DEA" , k(k3).vminsd(xmm5, xmm25, xmm26));
+ TEST_INSTRUCTION("6291B7835DEA" , k(k3).z().vminsd(xmm5, xmm25, xmm26));
+ TEST_INSTRUCTION("6291B7105DEA" , sae().vminsd(xmm5, xmm25, xmm26));
+ TEST_INSTRUCTION("62F1B7005D29" , vminsd(xmm5, xmm25, qword_ptr(rcx)));
+ TEST_INSTRUCTION("62B1B7005DACF023010000" , vminsd(xmm5, xmm25, qword_ptr(rax, r14, 3, 291)));
+ TEST_INSTRUCTION("62F1B7005D6A7F" , vminsd(xmm5, xmm25, qword_ptr(rdx, 1016)));
+ TEST_INSTRUCTION("62F1B7005DAA00040000" , vminsd(xmm5, xmm25, qword_ptr(rdx, 1024)));
+ TEST_INSTRUCTION("62F1B7005D6A80" , vminsd(xmm5, xmm25, qword_ptr(rdx, -1024)));
+ TEST_INSTRUCTION("62F1B7005DAAF8FBFFFF" , vminsd(xmm5, xmm25, qword_ptr(rdx, -1032)));
+ TEST_INSTRUCTION("623176005DD3" , vminss(xmm10, xmm17, xmm19));
+ TEST_INSTRUCTION("623176055DD3" , k(k5).vminss(xmm10, xmm17, xmm19));
+ TEST_INSTRUCTION("623176855DD3" , k(k5).z().vminss(xmm10, xmm17, xmm19));
+ TEST_INSTRUCTION("623176105DD3" , sae().vminss(xmm10, xmm17, xmm19));
+ TEST_INSTRUCTION("627176005D11" , vminss(xmm10, xmm17, dword_ptr(rcx)));
+ TEST_INSTRUCTION("623176005D94F023010000" , vminss(xmm10, xmm17, dword_ptr(rax, r14, 3, 291)));
+ TEST_INSTRUCTION("627176005D527F" , vminss(xmm10, xmm17, dword_ptr(rdx, 508)));
+ TEST_INSTRUCTION("627176005D9200020000" , vminss(xmm10, xmm17, dword_ptr(rdx, 512)));
+ TEST_INSTRUCTION("627176005D5280" , vminss(xmm10, xmm17, dword_ptr(rdx, -512)));
+ TEST_INSTRUCTION("627176005D92FCFDFFFF" , vminss(xmm10, xmm17, dword_ptr(rdx, -516)));
+ TEST_INSTRUCTION("62D1FD4828FE" , vmovapd(zmm7, zmm14));
+ TEST_INSTRUCTION("62D1FD4D28FE" , k(k5).vmovapd(zmm7, zmm14));
+ TEST_INSTRUCTION("62D1FDCD28FE" , k(k5).z().vmovapd(zmm7, zmm14));
+ TEST_INSTRUCTION("62F1FD482839" , vmovapd(zmm7, zmmword_ptr(rcx)));
+ TEST_INSTRUCTION("62B1FD4828BCF023010000" , vmovapd(zmm7, zmmword_ptr(rax, r14, 3, 291)));
+ TEST_INSTRUCTION("62F1FD48287A7F" , vmovapd(zmm7, zmmword_ptr(rdx, 8128)));
+ TEST_INSTRUCTION("62F1FD4828BA00200000" , vmovapd(zmm7, zmmword_ptr(rdx, 8192)));
+ TEST_INSTRUCTION("62F1FD48287A80" , vmovapd(zmm7, zmmword_ptr(rdx, -8192)));
+ TEST_INSTRUCTION("62F1FD4828BAC0DFFFFF" , vmovapd(zmm7, zmmword_ptr(rdx, -8256)));
+ TEST_INSTRUCTION("62D17C4828E9" , vmovaps(zmm5, zmm9));
+ TEST_INSTRUCTION("62D17C4928E9" , k(k1).vmovaps(zmm5, zmm9));
+ TEST_INSTRUCTION("62D17CC928E9" , k(k1).z().vmovaps(zmm5, zmm9));
+ TEST_INSTRUCTION("62F17C482829" , vmovaps(zmm5, zmmword_ptr(rcx)));
+ TEST_INSTRUCTION("62B17C4828ACF023010000" , vmovaps(zmm5, zmmword_ptr(rax, r14, 3, 291)));
+ TEST_INSTRUCTION("62F17C48286A7F" , vmovaps(zmm5, zmmword_ptr(rdx, 8128)));
+ TEST_INSTRUCTION("62F17C4828AA00200000" , vmovaps(zmm5, zmmword_ptr(rdx, 8192)));
+ TEST_INSTRUCTION("62F17C48286A80" , vmovaps(zmm5, zmmword_ptr(rdx, -8192)));
+ TEST_INSTRUCTION("62F17C4828AAC0DFFFFF" , vmovaps(zmm5, zmmword_ptr(rdx, -8256)));
+ TEST_INSTRUCTION("62617D086ED0" , vmovd(xmm26, eax));
+ TEST_INSTRUCTION("62617D086ED5" , vmovd(xmm26, ebp));
+ TEST_INSTRUCTION("62417D086ED5" , vmovd(xmm26, r13d));
+ TEST_INSTRUCTION("62617D086E11" , vmovd(xmm26, dword_ptr(rcx)));
+ TEST_INSTRUCTION("62217D086E94F023010000" , vmovd(xmm26, dword_ptr(rax, r14, 3, 291)));
+ TEST_INSTRUCTION("62617D086E527F" , vmovd(xmm26, dword_ptr(rdx, 508)));
+ TEST_INSTRUCTION("62617D086E9200020000" , vmovd(xmm26, dword_ptr(rdx, 512)));
+ TEST_INSTRUCTION("62617D086E5280" , vmovd(xmm26, dword_ptr(rdx, -512)));
+ TEST_INSTRUCTION("62617D086E92FCFDFFFF" , vmovd(xmm26, dword_ptr(rdx, -516)));
+ TEST_INSTRUCTION("C5F97E29" , vmovd(dword_ptr(rcx), xmm5));
+ TEST_INSTRUCTION("C4A1797EACF023010000" , vmovd(dword_ptr(rax, r14, 3, 291), xmm5));
+ TEST_INSTRUCTION("C5F97EAAFC010000" , vmovd(dword_ptr(rdx, 508), xmm5));
+ TEST_INSTRUCTION("C5F97EAA00020000" , vmovd(dword_ptr(rdx, 512), xmm5));
+ TEST_INSTRUCTION("C5F97EAA00FEFFFF" , vmovd(dword_ptr(rdx, -512), xmm5));
+ TEST_INSTRUCTION("C5F97EAAFCFDFFFF" , vmovd(dword_ptr(rdx, -516), xmm5));
+ TEST_INSTRUCTION("6291FF4812ED" , vmovddup(zmm5, zmm29));
+ TEST_INSTRUCTION("6291FF4C12ED" , k(k4).vmovddup(zmm5, zmm29));
+ TEST_INSTRUCTION("6291FFCC12ED" , k(k4).z().vmovddup(zmm5, zmm29));
+ TEST_INSTRUCTION("62F1FF481229" , vmovddup(zmm5, zmmword_ptr(rcx)));
+ TEST_INSTRUCTION("62B1FF4812ACF023010000" , vmovddup(zmm5, zmmword_ptr(rax, r14, 3, 291)));
+ TEST_INSTRUCTION("62F1FF48126A7F" , vmovddup(zmm5, zmmword_ptr(rdx, 8128)));
+ TEST_INSTRUCTION("62F1FF4812AA00200000" , vmovddup(zmm5, zmmword_ptr(rdx, 8192)));
+ TEST_INSTRUCTION("62F1FF48126A80" , vmovddup(zmm5, zmmword_ptr(rdx, -8192)));
+ TEST_INSTRUCTION("62F1FF4812AAC0DFFFFF" , vmovddup(zmm5, zmmword_ptr(rdx, -8256)));
+ TEST_INSTRUCTION("62A17D486FF2" , vmovdqa32(zmm22, zmm18));
+ TEST_INSTRUCTION("62A17D4E6FF2" , k(k6).vmovdqa32(zmm22, zmm18));
+ TEST_INSTRUCTION("62A17DCE6FF2" , k(k6).z().vmovdqa32(zmm22, zmm18));
+ TEST_INSTRUCTION("62E17D486F31" , vmovdqa32(zmm22, zmmword_ptr(rcx)));
+ TEST_INSTRUCTION("62A17D486FB4F023010000" , vmovdqa32(zmm22, zmmword_ptr(rax, r14, 3, 291)));
+ TEST_INSTRUCTION("62E17D486F727F" , vmovdqa32(zmm22, zmmword_ptr(rdx, 8128)));
+ TEST_INSTRUCTION("62E17D486FB200200000" , vmovdqa32(zmm22, zmmword_ptr(rdx, 8192)));
+ TEST_INSTRUCTION("62E17D486F7280" , vmovdqa32(zmm22, zmmword_ptr(rdx, -8192)));
+ TEST_INSTRUCTION("62E17D486FB2C0DFFFFF" , vmovdqa32(zmm22, zmmword_ptr(rdx, -8256)));
+ TEST_INSTRUCTION("62C1FD486FF4" , vmovdqa64(zmm22, zmm12));
+ TEST_INSTRUCTION("62C1FD4D6FF4" , k(k5).vmovdqa64(zmm22, zmm12));
+ TEST_INSTRUCTION("62C1FDCD6FF4" , k(k5).z().vmovdqa64(zmm22, zmm12));
+ TEST_INSTRUCTION("62E1FD486F31" , vmovdqa64(zmm22, zmmword_ptr(rcx)));
+ TEST_INSTRUCTION("62A1FD486FB4F023010000" , vmovdqa64(zmm22, zmmword_ptr(rax, r14, 3, 291)));
+ TEST_INSTRUCTION("62E1FD486F727F" , vmovdqa64(zmm22, zmmword_ptr(rdx, 8128)));
+ TEST_INSTRUCTION("62E1FD486FB200200000" , vmovdqa64(zmm22, zmmword_ptr(rdx, 8192)));
+ TEST_INSTRUCTION("62E1FD486F7280" , vmovdqa64(zmm22, zmmword_ptr(rdx, -8192)));
+ TEST_INSTRUCTION("62E1FD486FB2C0DFFFFF" , vmovdqa64(zmm22, zmmword_ptr(rdx, -8256)));
+ TEST_INSTRUCTION("62917E486FE8" , vmovdqu32(zmm5, zmm24));
+ TEST_INSTRUCTION("62917E4D6FE8" , k(k5).vmovdqu32(zmm5, zmm24));
+ TEST_INSTRUCTION("62917ECD6FE8" , k(k5).z().vmovdqu32(zmm5, zmm24));
+ TEST_INSTRUCTION("62F17E486F29" , vmovdqu32(zmm5, zmmword_ptr(rcx)));
+ TEST_INSTRUCTION("62B17E486FACF023010000" , vmovdqu32(zmm5, zmmword_ptr(rax, r14, 3, 291)));
+ TEST_INSTRUCTION("62F17E486F6A7F" , vmovdqu32(zmm5, zmmword_ptr(rdx, 8128)));
+ TEST_INSTRUCTION("62F17E486FAA00200000" , vmovdqu32(zmm5, zmmword_ptr(rdx, 8192)));
+ TEST_INSTRUCTION("62F17E486F6A80" , vmovdqu32(zmm5, zmmword_ptr(rdx, -8192)));
+ TEST_INSTRUCTION("62F17E486FAAC0DFFFFF" , vmovdqu32(zmm5, zmmword_ptr(rdx, -8256)));
+ TEST_INSTRUCTION("62D1FE486FF7" , vmovdqu64(zmm6, zmm15));
+ TEST_INSTRUCTION("62D1FE4B6FF7" , k(k3).vmovdqu64(zmm6, zmm15));
+ TEST_INSTRUCTION("62D1FECB6FF7" , k(k3).z().vmovdqu64(zmm6, zmm15));
+ TEST_INSTRUCTION("62F1FE486F31" , vmovdqu64(zmm6, zmmword_ptr(rcx)));
+ TEST_INSTRUCTION("62B1FE486FB4F023010000" , vmovdqu64(zmm6, zmmword_ptr(rax, r14, 3, 291)));
+ TEST_INSTRUCTION("62F1FE486F727F" , vmovdqu64(zmm6, zmmword_ptr(rdx, 8128)));
+ TEST_INSTRUCTION("62F1FE486FB200200000" , vmovdqu64(zmm6, zmmword_ptr(rdx, 8192)));
+ TEST_INSTRUCTION("62F1FE486F7280" , vmovdqu64(zmm6, zmmword_ptr(rdx, -8192)));
+ TEST_INSTRUCTION("62F1FE486FB2C0DFFFFF" , vmovdqu64(zmm6, zmmword_ptr(rdx, -8256)));
+ TEST_INSTRUCTION("62A1740812D7" , vmovhlps(xmm18, xmm1, xmm23));
+ TEST_INSTRUCTION("62E19D001619" , vmovhpd(xmm19, xmm28, qword_ptr(rcx)));
+ TEST_INSTRUCTION("62A19D00169CF023010000" , vmovhpd(xmm19, xmm28, qword_ptr(rax, r14, 3, 291)));
+ TEST_INSTRUCTION("62E19D00165A7F" , vmovhpd(xmm19, xmm28, qword_ptr(rdx, 1016)));
+ TEST_INSTRUCTION("62E19D00169A00040000" , vmovhpd(xmm19, xmm28, qword_ptr(rdx, 1024)));
+ TEST_INSTRUCTION("62E19D00165A80" , vmovhpd(xmm19, xmm28, qword_ptr(rdx, -1024)));
+ TEST_INSTRUCTION("62E19D00169AF8FBFFFF" , vmovhpd(xmm19, xmm28, qword_ptr(rdx, -1032)));
+ TEST_INSTRUCTION("C5791739" , vmovhpd(qword_ptr(rcx), xmm15));
+ TEST_INSTRUCTION("C4217917BCF023010000" , vmovhpd(qword_ptr(rax, r14, 3, 291), xmm15));
+ TEST_INSTRUCTION("C57917BAF8030000" , vmovhpd(qword_ptr(rdx, 1016), xmm15));
+ TEST_INSTRUCTION("C57917BA00040000" , vmovhpd(qword_ptr(rdx, 1024), xmm15));
+ TEST_INSTRUCTION("C57917BA00FCFFFF" , vmovhpd(qword_ptr(rdx, -1024), xmm15));
+ TEST_INSTRUCTION("C57917BAF8FBFFFF" , vmovhpd(qword_ptr(rdx, -1032), xmm15));
+ TEST_INSTRUCTION("62E174001621" , vmovhps(xmm20, xmm17, qword_ptr(rcx)));
+ TEST_INSTRUCTION("62A1740016A4F023010000" , vmovhps(xmm20, xmm17, qword_ptr(rax, r14, 3, 291)));
+ TEST_INSTRUCTION("62E1740016627F" , vmovhps(xmm20, xmm17, qword_ptr(rdx, 1016)));
+ TEST_INSTRUCTION("62E1740016A200040000" , vmovhps(xmm20, xmm17, qword_ptr(rdx, 1024)));
+ TEST_INSTRUCTION("62E17400166280" , vmovhps(xmm20, xmm17, qword_ptr(rdx, -1024)));
+ TEST_INSTRUCTION("62E1740016A2F8FBFFFF" , vmovhps(xmm20, xmm17, qword_ptr(rdx, -1032)));
+ TEST_INSTRUCTION("62E17C081711" , vmovhps(qword_ptr(rcx), xmm18));
+ TEST_INSTRUCTION("62A17C081794F023010000" , vmovhps(qword_ptr(rax, r14, 3, 291), xmm18));
+ TEST_INSTRUCTION("62E17C0817527F" , vmovhps(qword_ptr(rdx, 1016), xmm18));
+ TEST_INSTRUCTION("62E17C08179200040000" , vmovhps(qword_ptr(rdx, 1024), xmm18));
+ TEST_INSTRUCTION("62E17C08175280" , vmovhps(qword_ptr(rdx, -1024), xmm18));
+ TEST_INSTRUCTION("62E17C081792F8FBFFFF" , vmovhps(qword_ptr(rdx, -1032), xmm18));
+ TEST_INSTRUCTION("6211140816EC" , vmovlhps(xmm13, xmm13, xmm28));
+ TEST_INSTRUCTION("6261CD081229" , vmovlpd(xmm29, xmm6, qword_ptr(rcx)));
+ TEST_INSTRUCTION("6221CD0812ACF023010000" , vmovlpd(xmm29, xmm6, qword_ptr(rax, r14, 3, 291)));
+ TEST_INSTRUCTION("6261CD08126A7F" , vmovlpd(xmm29, xmm6, qword_ptr(rdx, 1016)));
+ TEST_INSTRUCTION("6261CD0812AA00040000" , vmovlpd(xmm29, xmm6, qword_ptr(rdx, 1024)));
+ TEST_INSTRUCTION("6261CD08126A80" , vmovlpd(xmm29, xmm6, qword_ptr(rdx, -1024)));
+ TEST_INSTRUCTION("6261CD0812AAF8FBFFFF" , vmovlpd(xmm29, xmm6, qword_ptr(rdx, -1032)));
+ TEST_INSTRUCTION("C5791339" , vmovlpd(qword_ptr(rcx), xmm15));
+ TEST_INSTRUCTION("C4217913BCF023010000" , vmovlpd(qword_ptr(rax, r14, 3, 291), xmm15));
+ TEST_INSTRUCTION("C57913BAF8030000" , vmovlpd(qword_ptr(rdx, 1016), xmm15));
+ TEST_INSTRUCTION("C57913BA00040000" , vmovlpd(qword_ptr(rdx, 1024), xmm15));
+ TEST_INSTRUCTION("C57913BA00FCFFFF" , vmovlpd(qword_ptr(rdx, -1024), xmm15));
+ TEST_INSTRUCTION("C57913BAF8FBFFFF" , vmovlpd(qword_ptr(rdx, -1032), xmm15));
+ TEST_INSTRUCTION("62F15C001239" , vmovlps(xmm7, xmm20, qword_ptr(rcx)));
+ TEST_INSTRUCTION("62B15C0012BCF023010000" , vmovlps(xmm7, xmm20, qword_ptr(rax, r14, 3, 291)));
+ TEST_INSTRUCTION("62F15C00127A7F" , vmovlps(xmm7, xmm20, qword_ptr(rdx, 1016)));
+ TEST_INSTRUCTION("62F15C0012BA00040000" , vmovlps(xmm7, xmm20, qword_ptr(rdx, 1024)));
+ TEST_INSTRUCTION("62F15C00127A80" , vmovlps(xmm7, xmm20, qword_ptr(rdx, -1024)));
+ TEST_INSTRUCTION("62F15C0012BAF8FBFFFF" , vmovlps(xmm7, xmm20, qword_ptr(rdx, -1032)));
+ TEST_INSTRUCTION("62617C081319" , vmovlps(qword_ptr(rcx), xmm27));
+ TEST_INSTRUCTION("62217C08139CF023010000" , vmovlps(qword_ptr(rax, r14, 3, 291), xmm27));
+ TEST_INSTRUCTION("62617C08135A7F" , vmovlps(qword_ptr(rdx, 1016), xmm27));
+ TEST_INSTRUCTION("62617C08139A00040000" , vmovlps(qword_ptr(rdx, 1024), xmm27));
+ TEST_INSTRUCTION("62617C08135A80" , vmovlps(qword_ptr(rdx, -1024), xmm27));
+ TEST_INSTRUCTION("62617C08139AF8FBFFFF" , vmovlps(qword_ptr(rdx, -1032), xmm27));
+ TEST_INSTRUCTION("62617D48E701" , vmovntdq(zmmword_ptr(rcx), zmm24));
+ TEST_INSTRUCTION("62217D48E784F023010000" , vmovntdq(zmmword_ptr(rax, r14, 3, 291), zmm24));
+ TEST_INSTRUCTION("62617D48E7427F" , vmovntdq(zmmword_ptr(rdx, 8128), zmm24));
+ TEST_INSTRUCTION("62617D48E78200200000" , vmovntdq(zmmword_ptr(rdx, 8192), zmm24));
+ TEST_INSTRUCTION("62617D48E74280" , vmovntdq(zmmword_ptr(rdx, -8192), zmm24));
+ TEST_INSTRUCTION("62617D48E782C0DFFFFF" , vmovntdq(zmmword_ptr(rdx, -8256), zmm24));
+ TEST_INSTRUCTION("62E27D482A09" , vmovntdqa(zmm17, zmmword_ptr(rcx)));
+ TEST_INSTRUCTION("62A27D482A8CF023010000" , vmovntdqa(zmm17, zmmword_ptr(rax, r14, 3, 291)));
+ TEST_INSTRUCTION("62E27D482A4A7F" , vmovntdqa(zmm17, zmmword_ptr(rdx, 8128)));
+ TEST_INSTRUCTION("62E27D482A8A00200000" , vmovntdqa(zmm17, zmmword_ptr(rdx, 8192)));
+ TEST_INSTRUCTION("62E27D482A4A80" , vmovntdqa(zmm17, zmmword_ptr(rdx, -8192)));
+ TEST_INSTRUCTION("62E27D482A8AC0DFFFFF" , vmovntdqa(zmm17, zmmword_ptr(rdx, -8256)));
+ TEST_INSTRUCTION("62E1FD482B09" , vmovntpd(zmmword_ptr(rcx), zmm17));
+ TEST_INSTRUCTION("62A1FD482B8CF023010000" , vmovntpd(zmmword_ptr(rax, r14, 3, 291), zmm17));
+ TEST_INSTRUCTION("62E1FD482B4A7F" , vmovntpd(zmmword_ptr(rdx, 8128), zmm17));
+ TEST_INSTRUCTION("62E1FD482B8A00200000" , vmovntpd(zmmword_ptr(rdx, 8192), zmm17));
+ TEST_INSTRUCTION("62E1FD482B4A80" , vmovntpd(zmmword_ptr(rdx, -8192), zmm17));
+ TEST_INSTRUCTION("62E1FD482B8AC0DFFFFF" , vmovntpd(zmmword_ptr(rdx, -8256), zmm17));
+ TEST_INSTRUCTION("62F17C482B29" , vmovntps(zmmword_ptr(rcx), zmm5));
+ TEST_INSTRUCTION("62B17C482BACF023010000" , vmovntps(zmmword_ptr(rax, r14, 3, 291), zmm5));
+ TEST_INSTRUCTION("62F17C482B6A7F" , vmovntps(zmmword_ptr(rdx, 8128), zmm5));
+ TEST_INSTRUCTION("62F17C482BAA00200000" , vmovntps(zmmword_ptr(rdx, 8192), zmm5));
+ TEST_INSTRUCTION("62F17C482B6A80" , vmovntps(zmmword_ptr(rdx, -8192), zmm5));
+ TEST_INSTRUCTION("62F17C482BAAC0DFFFFF" , vmovntps(zmmword_ptr(rdx, -8256), zmm5));
+ TEST_INSTRUCTION("6261FF081009" , vmovsd(xmm25, qword_ptr(rcx)));
+ TEST_INSTRUCTION("6261FF0B1009" , k(k3).vmovsd(xmm25, qword_ptr(rcx)));
+ TEST_INSTRUCTION("6261FF8B1009" , k(k3).z().vmovsd(xmm25, qword_ptr(rcx)));
+ TEST_INSTRUCTION("6221FF08108CF023010000" , vmovsd(xmm25, qword_ptr(rax, r14, 3, 291)));
+ TEST_INSTRUCTION("6261FF08104A7F" , vmovsd(xmm25, qword_ptr(rdx, 1016)));
+ TEST_INSTRUCTION("6261FF08108A00040000" , vmovsd(xmm25, qword_ptr(rdx, 1024)));
+ TEST_INSTRUCTION("6261FF08104A80" , vmovsd(xmm25, qword_ptr(rdx, -1024)));
+ TEST_INSTRUCTION("6261FF08108AF8FBFFFF" , vmovsd(xmm25, qword_ptr(rdx, -1032)));
+ TEST_INSTRUCTION("6261FF081109" , vmovsd(qword_ptr(rcx), xmm25));
+ TEST_INSTRUCTION("6261FF0A1109" , k(k2).vmovsd(qword_ptr(rcx), xmm25));
+ TEST_INSTRUCTION("6221FF08118CF023010000" , vmovsd(qword_ptr(rax, r14, 3, 291), xmm25));
+ TEST_INSTRUCTION("6261FF08114A7F" , vmovsd(qword_ptr(rdx, 1016), xmm25));
+ TEST_INSTRUCTION("6261FF08118A00040000" , vmovsd(qword_ptr(rdx, 1024), xmm25));
+ TEST_INSTRUCTION("6261FF08114A80" , vmovsd(qword_ptr(rdx, -1024), xmm25));
+ TEST_INSTRUCTION("6261FF08118AF8FBFFFF" , vmovsd(qword_ptr(rdx, -1032), xmm25));
+ TEST_INSTRUCTION("6221E70810DB" , vmovsd(xmm27, xmm3, xmm19));
+ TEST_INSTRUCTION("6221E70B10DB" , k(k3).vmovsd(xmm27, xmm3, xmm19));
+ TEST_INSTRUCTION("6221E78B10DB" , k(k3).z().vmovsd(xmm27, xmm3, xmm19));
+ TEST_INSTRUCTION("62817E4816C3" , vmovshdup(zmm16, zmm27));
+ TEST_INSTRUCTION("62817E4C16C3" , k(k4).vmovshdup(zmm16, zmm27));
+ TEST_INSTRUCTION("62817ECC16C3" , k(k4).z().vmovshdup(zmm16, zmm27));
+ TEST_INSTRUCTION("62E17E481601" , vmovshdup(zmm16, zmmword_ptr(rcx)));
+ TEST_INSTRUCTION("62A17E481684F023010000" , vmovshdup(zmm16, zmmword_ptr(rax, r14, 3, 291)));
+ TEST_INSTRUCTION("62E17E4816427F" , vmovshdup(zmm16, zmmword_ptr(rdx, 8128)));
+ TEST_INSTRUCTION("62E17E48168200200000" , vmovshdup(zmm16, zmmword_ptr(rdx, 8192)));
+ TEST_INSTRUCTION("62E17E48164280" , vmovshdup(zmm16, zmmword_ptr(rdx, -8192)));
+ TEST_INSTRUCTION("62E17E481682C0DFFFFF" , vmovshdup(zmm16, zmmword_ptr(rdx, -8256)));
+ TEST_INSTRUCTION("62517E4812EE" , vmovsldup(zmm13, zmm14));
+ TEST_INSTRUCTION("62517E4E12EE" , k(k6).vmovsldup(zmm13, zmm14));
+ TEST_INSTRUCTION("62517ECE12EE" , k(k6).z().vmovsldup(zmm13, zmm14));
+ TEST_INSTRUCTION("62717E481229" , vmovsldup(zmm13, zmmword_ptr(rcx)));
+ TEST_INSTRUCTION("62317E4812ACF023010000" , vmovsldup(zmm13, zmmword_ptr(rax, r14, 3, 291)));
+ TEST_INSTRUCTION("62717E48126A7F" , vmovsldup(zmm13, zmmword_ptr(rdx, 8128)));
+ TEST_INSTRUCTION("62717E4812AA00200000" , vmovsldup(zmm13, zmmword_ptr(rdx, 8192)));
+ TEST_INSTRUCTION("62717E48126A80" , vmovsldup(zmm13, zmmword_ptr(rdx, -8192)));
+ TEST_INSTRUCTION("62717E4812AAC0DFFFFF" , vmovsldup(zmm13, zmmword_ptr(rdx, -8256)));
+ TEST_INSTRUCTION("C5FA1011" , vmovss(xmm2, dword_ptr(rcx)));
+ TEST_INSTRUCTION("62F17E0C1011" , k(k4).vmovss(xmm2, dword_ptr(rcx)));
+ TEST_INSTRUCTION("62F17E8C1011" , k(k4).z().vmovss(xmm2, dword_ptr(rcx)));
+ TEST_INSTRUCTION("C4A17A1094F023010000" , vmovss(xmm2, dword_ptr(rax, r14, 3, 291)));
+ TEST_INSTRUCTION("C5FA1092FC010000" , vmovss(xmm2, dword_ptr(rdx, 508)));
+ TEST_INSTRUCTION("C5FA109200020000" , vmovss(xmm2, dword_ptr(rdx, 512)));
+ TEST_INSTRUCTION("C5FA109200FEFFFF" , vmovss(xmm2, dword_ptr(rdx, -512)));
+ TEST_INSTRUCTION("C5FA1092FCFDFFFF" , vmovss(xmm2, dword_ptr(rdx, -516)));
+ TEST_INSTRUCTION("C5FA1129" , vmovss(dword_ptr(rcx), xmm5));
+ TEST_INSTRUCTION("62F17E0E1129" , k(k6).vmovss(dword_ptr(rcx), xmm5));
+ TEST_INSTRUCTION("C4A17A11ACF023010000" , vmovss(dword_ptr(rax, r14, 3, 291), xmm5));
+ TEST_INSTRUCTION("C5FA11AAFC010000" , vmovss(dword_ptr(rdx, 508), xmm5));
+ TEST_INSTRUCTION("C5FA11AA00020000" , vmovss(dword_ptr(rdx, 512), xmm5));
+ TEST_INSTRUCTION("C5FA11AA00FEFFFF" , vmovss(dword_ptr(rdx, -512), xmm5));
+ TEST_INSTRUCTION("C5FA11AAFCFDFFFF" , vmovss(dword_ptr(rdx, -516), xmm5));
+ TEST_INSTRUCTION("6201360810E2" , vmovss(xmm28, xmm9, xmm26));
+ TEST_INSTRUCTION("6201360C10E2" , k(k4).vmovss(xmm28, xmm9, xmm26));
+ TEST_INSTRUCTION("6201368C10E2" , k(k4).z().vmovss(xmm28, xmm9, xmm26));
+ TEST_INSTRUCTION("6241FD4810D9" , vmovupd(zmm27, zmm9));
+ TEST_INSTRUCTION("6241FD4A10D9" , k(k2).vmovupd(zmm27, zmm9));
+ TEST_INSTRUCTION("6241FDCA10D9" , k(k2).z().vmovupd(zmm27, zmm9));
+ TEST_INSTRUCTION("6261FD481019" , vmovupd(zmm27, zmmword_ptr(rcx)));
+ TEST_INSTRUCTION("6221FD48109CF023010000" , vmovupd(zmm27, zmmword_ptr(rax, r14, 3, 291)));
+ TEST_INSTRUCTION("6261FD48105A7F" , vmovupd(zmm27, zmmword_ptr(rdx, 8128)));
+ TEST_INSTRUCTION("6261FD48109A00200000" , vmovupd(zmm27, zmmword_ptr(rdx, 8192)));
+ TEST_INSTRUCTION("6261FD48105A80" , vmovupd(zmm27, zmmword_ptr(rdx, -8192)));
+ TEST_INSTRUCTION("6261FD48109AC0DFFFFF" , vmovupd(zmm27, zmmword_ptr(rdx, -8256)));
+ TEST_INSTRUCTION("62A17C4810F6" , vmovups(zmm22, zmm22));
+ TEST_INSTRUCTION("62A17C4B10F6" , k(k3).vmovups(zmm22, zmm22));
+ TEST_INSTRUCTION("62A17CCB10F6" , k(k3).z().vmovups(zmm22, zmm22));
+ TEST_INSTRUCTION("62E17C481031" , vmovups(zmm22, zmmword_ptr(rcx)));
+ TEST_INSTRUCTION("62A17C4810B4F023010000" , vmovups(zmm22, zmmword_ptr(rax, r14, 3, 291)));
+ TEST_INSTRUCTION("62E17C4810727F" , vmovups(zmm22, zmmword_ptr(rdx, 8128)));
+ TEST_INSTRUCTION("62E17C4810B200200000" , vmovups(zmm22, zmmword_ptr(rdx, 8192)));
+ TEST_INSTRUCTION("62E17C48107280" , vmovups(zmm22, zmmword_ptr(rdx, -8192)));
+ TEST_INSTRUCTION("62E17C4810B2C0DFFFFF" , vmovups(zmm22, zmmword_ptr(rdx, -8256)));
+ TEST_INSTRUCTION("6221DD4859C7" , vmulpd(zmm24, zmm4, zmm23));
+ TEST_INSTRUCTION("6221DD4E59C7" , k(k6).vmulpd(zmm24, zmm4, zmm23));
+ TEST_INSTRUCTION("6221DDCE59C7" , k(k6).z().vmulpd(zmm24, zmm4, zmm23));
+ TEST_INSTRUCTION("6221DD1859C7" , rn_sae().vmulpd(zmm24, zmm4, zmm23));
+ TEST_INSTRUCTION("6221DD5859C7" , ru_sae().vmulpd(zmm24, zmm4, zmm23));
+ TEST_INSTRUCTION("6221DD3859C7" , rd_sae().vmulpd(zmm24, zmm4, zmm23));
+ TEST_INSTRUCTION("6221DD7859C7" , rz_sae().vmulpd(zmm24, zmm4, zmm23));
+ TEST_INSTRUCTION("6261DD485901" , vmulpd(zmm24, zmm4, zmmword_ptr(rcx)));
+ TEST_INSTRUCTION("6221DD485984F023010000" , vmulpd(zmm24, zmm4, zmmword_ptr(rax, r14, 3, 291)));
+ TEST_INSTRUCTION("6261DD585901" , vmulpd(zmm24, zmm4, qword_ptr(rcx)._1to8()));
+ TEST_INSTRUCTION("6261DD4859427F" , vmulpd(zmm24, zmm4, zmmword_ptr(rdx, 8128)));
+ TEST_INSTRUCTION("6261DD48598200200000" , vmulpd(zmm24, zmm4, zmmword_ptr(rdx, 8192)));
+ TEST_INSTRUCTION("6261DD48594280" , vmulpd(zmm24, zmm4, zmmword_ptr(rdx, -8192)));
+ TEST_INSTRUCTION("6261DD485982C0DFFFFF" , vmulpd(zmm24, zmm4, zmmword_ptr(rdx, -8256)));
+ TEST_INSTRUCTION("6261DD5859427F" , vmulpd(zmm24, zmm4, qword_ptr(rdx, 1016)._1to8()));
+ TEST_INSTRUCTION("6261DD58598200040000" , vmulpd(zmm24, zmm4, qword_ptr(rdx, 1024)._1to8()));
+ TEST_INSTRUCTION("6261DD58594280" , vmulpd(zmm24, zmm4, qword_ptr(rdx, -1024)._1to8()));
+ TEST_INSTRUCTION("6261DD585982F8FBFFFF" , vmulpd(zmm24, zmm4, qword_ptr(rdx, -1032)._1to8()));
+ TEST_INSTRUCTION("62914C4859D8" , vmulps(zmm3, zmm6, zmm24));
+ TEST_INSTRUCTION("62914C4C59D8" , k(k4).vmulps(zmm3, zmm6, zmm24));
+ TEST_INSTRUCTION("62914CCC59D8" , k(k4).z().vmulps(zmm3, zmm6, zmm24));
+ TEST_INSTRUCTION("62914C1859D8" , rn_sae().vmulps(zmm3, zmm6, zmm24));
+ TEST_INSTRUCTION("62914C5859D8" , ru_sae().vmulps(zmm3, zmm6, zmm24));
+ TEST_INSTRUCTION("62914C3859D8" , rd_sae().vmulps(zmm3, zmm6, zmm24));
+ TEST_INSTRUCTION("62914C7859D8" , rz_sae().vmulps(zmm3, zmm6, zmm24));
+ TEST_INSTRUCTION("62F14C485919" , vmulps(zmm3, zmm6, zmmword_ptr(rcx)));
+ TEST_INSTRUCTION("62B14C48599CF023010000" , vmulps(zmm3, zmm6, zmmword_ptr(rax, r14, 3, 291)));
+ TEST_INSTRUCTION("62F14C585919" , vmulps(zmm3, zmm6, dword_ptr(rcx)._1to16()));
+ TEST_INSTRUCTION("62F14C48595A7F" , vmulps(zmm3, zmm6, zmmword_ptr(rdx, 8128)));
+ TEST_INSTRUCTION("62F14C48599A00200000" , vmulps(zmm3, zmm6, zmmword_ptr(rdx, 8192)));
+ TEST_INSTRUCTION("62F14C48595A80" , vmulps(zmm3, zmm6, zmmword_ptr(rdx, -8192)));
+ TEST_INSTRUCTION("62F14C48599AC0DFFFFF" , vmulps(zmm3, zmm6, zmmword_ptr(rdx, -8256)));
+ TEST_INSTRUCTION("62F14C58595A7F" , vmulps(zmm3, zmm6, dword_ptr(rdx, 508)._1to16()));
+ TEST_INSTRUCTION("62F14C58599A00020000" , vmulps(zmm3, zmm6, dword_ptr(rdx, 512)._1to16()));
+ TEST_INSTRUCTION("62F14C58595A80" , vmulps(zmm3, zmm6, dword_ptr(rdx, -512)._1to16()));
+ TEST_INSTRUCTION("62F14C58599AFCFDFFFF" , vmulps(zmm3, zmm6, dword_ptr(rdx, -516)._1to16()));
+ TEST_INSTRUCTION("6231DF0859EA" , vmulsd(xmm13, xmm4, xmm18));
+ TEST_INSTRUCTION("6231DF0A59EA" , k(k2).vmulsd(xmm13, xmm4, xmm18));
+ TEST_INSTRUCTION("6231DF8A59EA" , k(k2).z().vmulsd(xmm13, xmm4, xmm18));
+ TEST_INSTRUCTION("6231DF1859EA" , rn_sae().vmulsd(xmm13, xmm4, xmm18));
+ TEST_INSTRUCTION("6231DF5859EA" , ru_sae().vmulsd(xmm13, xmm4, xmm18));
+ TEST_INSTRUCTION("6231DF3859EA" , rd_sae().vmulsd(xmm13, xmm4, xmm18));
+ TEST_INSTRUCTION("6231DF7859EA" , rz_sae().vmulsd(xmm13, xmm4, xmm18));
+ TEST_INSTRUCTION("C55B5929" , vmulsd(xmm13, xmm4, qword_ptr(rcx)));
+ TEST_INSTRUCTION("C4215B59ACF023010000" , vmulsd(xmm13, xmm4, qword_ptr(rax, r14, 3, 291)));
+ TEST_INSTRUCTION("C55B59AAF8030000" , vmulsd(xmm13, xmm4, qword_ptr(rdx, 1016)));
+ TEST_INSTRUCTION("C55B59AA00040000" , vmulsd(xmm13, xmm4, qword_ptr(rdx, 1024)));
+ TEST_INSTRUCTION("C55B59AA00FCFFFF" , vmulsd(xmm13, xmm4, qword_ptr(rdx, -1024)));
+ TEST_INSTRUCTION("C55B59AAF8FBFFFF" , vmulsd(xmm13, xmm4, qword_ptr(rdx, -1032)));
+ TEST_INSTRUCTION("62C12E0859F6" , vmulss(xmm22, xmm10, xmm14));
+ TEST_INSTRUCTION("62C12E0C59F6" , k(k4).vmulss(xmm22, xmm10, xmm14));
+ TEST_INSTRUCTION("62C12E8C59F6" , k(k4).z().vmulss(xmm22, xmm10, xmm14));
+ TEST_INSTRUCTION("62C12E1859F6" , rn_sae().vmulss(xmm22, xmm10, xmm14));
+ TEST_INSTRUCTION("62C12E5859F6" , ru_sae().vmulss(xmm22, xmm10, xmm14));
+ TEST_INSTRUCTION("62C12E3859F6" , rd_sae().vmulss(xmm22, xmm10, xmm14));
+ TEST_INSTRUCTION("62C12E7859F6" , rz_sae().vmulss(xmm22, xmm10, xmm14));
+ TEST_INSTRUCTION("62E12E085931" , vmulss(xmm22, xmm10, dword_ptr(rcx)));
+ TEST_INSTRUCTION("62A12E0859B4F023010000" , vmulss(xmm22, xmm10, dword_ptr(rax, r14, 3, 291)));
+ TEST_INSTRUCTION("62E12E0859727F" , vmulss(xmm22, xmm10, dword_ptr(rdx, 508)));
+ TEST_INSTRUCTION("62E12E0859B200020000" , vmulss(xmm22, xmm10, dword_ptr(rdx, 512)));
+ TEST_INSTRUCTION("62E12E08597280" , vmulss(xmm22, xmm10, dword_ptr(rdx, -512)));
+ TEST_INSTRUCTION("62E12E0859B2FCFDFFFF" , vmulss(xmm22, xmm10, dword_ptr(rdx, -516)));
+ TEST_INSTRUCTION("62527D481EFE" , vpabsd(zmm15, zmm14));
+ TEST_INSTRUCTION("62527D4E1EFE" , k(k6).vpabsd(zmm15, zmm14));
+ TEST_INSTRUCTION("62527DCE1EFE" , k(k6).z().vpabsd(zmm15, zmm14));
+ TEST_INSTRUCTION("62727D481E39" , vpabsd(zmm15, zmmword_ptr(rcx)));
+ TEST_INSTRUCTION("62327D481EBCF023010000" , vpabsd(zmm15, zmmword_ptr(rax, r14, 3, 291)));
+ TEST_INSTRUCTION("62727D581E39" , vpabsd(zmm15, dword_ptr(rcx)._1to16()));
+ TEST_INSTRUCTION("62727D481E7A7F" , vpabsd(zmm15, zmmword_ptr(rdx, 8128)));
+ TEST_INSTRUCTION("62727D481EBA00200000" , vpabsd(zmm15, zmmword_ptr(rdx, 8192)));
+ TEST_INSTRUCTION("62727D481E7A80" , vpabsd(zmm15, zmmword_ptr(rdx, -8192)));
+ TEST_INSTRUCTION("62727D481EBAC0DFFFFF" , vpabsd(zmm15, zmmword_ptr(rdx, -8256)));
+ TEST_INSTRUCTION("62727D581E7A7F" , vpabsd(zmm15, dword_ptr(rdx, 508)._1to16()));
+ TEST_INSTRUCTION("62727D581EBA00020000" , vpabsd(zmm15, dword_ptr(rdx, 512)._1to16()));
+ TEST_INSTRUCTION("62727D581E7A80" , vpabsd(zmm15, dword_ptr(rdx, -512)._1to16()));
+ TEST_INSTRUCTION("62727D581EBAFCFDFFFF" , vpabsd(zmm15, dword_ptr(rdx, -516)._1to16()));
+ TEST_INSTRUCTION("6292FD481FE8" , vpabsq(zmm5, zmm24));
+ TEST_INSTRUCTION("6292FD4E1FE8" , k(k6).vpabsq(zmm5, zmm24));
+ TEST_INSTRUCTION("6292FDCE1FE8" , k(k6).z().vpabsq(zmm5, zmm24));
+ TEST_INSTRUCTION("62F2FD481F29" , vpabsq(zmm5, zmmword_ptr(rcx)));
+ TEST_INSTRUCTION("62B2FD481FACF023010000" , vpabsq(zmm5, zmmword_ptr(rax, r14, 3, 291)));
+ TEST_INSTRUCTION("62F2FD581F29" , vpabsq(zmm5, qword_ptr(rcx)._1to8()));
+ TEST_INSTRUCTION("62F2FD481F6A7F" , vpabsq(zmm5, zmmword_ptr(rdx, 8128)));
+ TEST_INSTRUCTION("62F2FD481FAA00200000" , vpabsq(zmm5, zmmword_ptr(rdx, 8192)));
+ TEST_INSTRUCTION("62F2FD481F6A80" , vpabsq(zmm5, zmmword_ptr(rdx, -8192)));
+ TEST_INSTRUCTION("62F2FD481FAAC0DFFFFF" , vpabsq(zmm5, zmmword_ptr(rdx, -8256)));
+ TEST_INSTRUCTION("62F2FD581F6A7F" , vpabsq(zmm5, qword_ptr(rdx, 1016)._1to8()));
+ TEST_INSTRUCTION("62F2FD581FAA00040000" , vpabsq(zmm5, qword_ptr(rdx, 1024)._1to8()));
+ TEST_INSTRUCTION("62F2FD581F6A80" , vpabsq(zmm5, qword_ptr(rdx, -1024)._1to8()));
+ TEST_INSTRUCTION("62F2FD581FAAF8FBFFFF" , vpabsq(zmm5, qword_ptr(rdx, -1032)._1to8()));
+ TEST_INSTRUCTION("62215548FED4" , vpaddd(zmm26, zmm5, zmm20));
+ TEST_INSTRUCTION("62215549FED4" , k(k1).vpaddd(zmm26, zmm5, zmm20));
+ TEST_INSTRUCTION("622155C9FED4" , k(k1).z().vpaddd(zmm26, zmm5, zmm20));
+ TEST_INSTRUCTION("62615548FE11" , vpaddd(zmm26, zmm5, zmmword_ptr(rcx)));
+ TEST_INSTRUCTION("62215548FE94F023010000" , vpaddd(zmm26, zmm5, zmmword_ptr(rax, r14, 3, 291)));
+ TEST_INSTRUCTION("62615558FE11" , vpaddd(zmm26, zmm5, dword_ptr(rcx)._1to16()));
+ TEST_INSTRUCTION("62615548FE527F" , vpaddd(zmm26, zmm5, zmmword_ptr(rdx, 8128)));
+ TEST_INSTRUCTION("62615548FE9200200000" , vpaddd(zmm26, zmm5, zmmword_ptr(rdx, 8192)));
+ TEST_INSTRUCTION("62615548FE5280" , vpaddd(zmm26, zmm5, zmmword_ptr(rdx, -8192)));
+ TEST_INSTRUCTION("62615548FE92C0DFFFFF" , vpaddd(zmm26, zmm5, zmmword_ptr(rdx, -8256)));
+ TEST_INSTRUCTION("62615558FE527F" , vpaddd(zmm26, zmm5, dword_ptr(rdx, 508)._1to16()));
+ TEST_INSTRUCTION("62615558FE9200020000" , vpaddd(zmm26, zmm5, dword_ptr(rdx, 512)._1to16()));
+ TEST_INSTRUCTION("62615558FE5280" , vpaddd(zmm26, zmm5, dword_ptr(rdx, -512)._1to16()));
+ TEST_INSTRUCTION("62615558FE92FCFDFFFF" , vpaddd(zmm26, zmm5, dword_ptr(rdx, -516)._1to16()));
+ TEST_INSTRUCTION("6251B540D4C6" , vpaddq(zmm8, zmm25, zmm14));
+ TEST_INSTRUCTION("6251B543D4C6" , k(k3).vpaddq(zmm8, zmm25, zmm14));
+ TEST_INSTRUCTION("6251B5C3D4C6" , k(k3).z().vpaddq(zmm8, zmm25, zmm14));
+ TEST_INSTRUCTION("6271B540D401" , vpaddq(zmm8, zmm25, zmmword_ptr(rcx)));
+ TEST_INSTRUCTION("6231B540D484F023010000" , vpaddq(zmm8, zmm25, zmmword_ptr(rax, r14, 3, 291)));
+ TEST_INSTRUCTION("6271B550D401" , vpaddq(zmm8, zmm25, qword_ptr(rcx)._1to8()));
+ TEST_INSTRUCTION("6271B540D4427F" , vpaddq(zmm8, zmm25, zmmword_ptr(rdx, 8128)));
+ TEST_INSTRUCTION("6271B540D48200200000" , vpaddq(zmm8, zmm25, zmmword_ptr(rdx, 8192)));
+ TEST_INSTRUCTION("6271B540D44280" , vpaddq(zmm8, zmm25, zmmword_ptr(rdx, -8192)));
+ TEST_INSTRUCTION("6271B540D482C0DFFFFF" , vpaddq(zmm8, zmm25, zmmword_ptr(rdx, -8256)));
+ TEST_INSTRUCTION("6271B550D4427F" , vpaddq(zmm8, zmm25, qword_ptr(rdx, 1016)._1to8()));
+ TEST_INSTRUCTION("6271B550D48200040000" , vpaddq(zmm8, zmm25, qword_ptr(rdx, 1024)._1to8()));
+ TEST_INSTRUCTION("6271B550D44280" , vpaddq(zmm8, zmm25, qword_ptr(rdx, -1024)._1to8()));
+ TEST_INSTRUCTION("6271B550D482F8FBFFFF" , vpaddq(zmm8, zmm25, qword_ptr(rdx, -1032)._1to8()));
+ TEST_INSTRUCTION("62814D40DBD9" , vpandd(zmm19, zmm22, zmm25));
+ TEST_INSTRUCTION("62814D41DBD9" , k(k1).vpandd(zmm19, zmm22, zmm25));
+ TEST_INSTRUCTION("62814DC1DBD9" , k(k1).z().vpandd(zmm19, zmm22, zmm25));
+ TEST_INSTRUCTION("62E14D40DB19" , vpandd(zmm19, zmm22, zmmword_ptr(rcx)));
+ TEST_INSTRUCTION("62A14D40DB9CF023010000" , vpandd(zmm19, zmm22, zmmword_ptr(rax, r14, 3, 291)));
+ TEST_INSTRUCTION("62E14D50DB19" , vpandd(zmm19, zmm22, dword_ptr(rcx)._1to16()));
+ TEST_INSTRUCTION("62E14D40DB5A7F" , vpandd(zmm19, zmm22, zmmword_ptr(rdx, 8128)));
+ TEST_INSTRUCTION("62E14D40DB9A00200000" , vpandd(zmm19, zmm22, zmmword_ptr(rdx, 8192)));
+ TEST_INSTRUCTION("62E14D40DB5A80" , vpandd(zmm19, zmm22, zmmword_ptr(rdx, -8192)));
+ TEST_INSTRUCTION("62E14D40DB9AC0DFFFFF" , vpandd(zmm19, zmm22, zmmword_ptr(rdx, -8256)));
+ TEST_INSTRUCTION("62E14D50DB5A7F" , vpandd(zmm19, zmm22, dword_ptr(rdx, 508)._1to16()));
+ TEST_INSTRUCTION("62E14D50DB9A00020000" , vpandd(zmm19, zmm22, dword_ptr(rdx, 512)._1to16()));
+ TEST_INSTRUCTION("62E14D50DB5A80" , vpandd(zmm19, zmm22, dword_ptr(rdx, -512)._1to16()));
+ TEST_INSTRUCTION("62E14D50DB9AFCFDFFFF" , vpandd(zmm19, zmm22, dword_ptr(rdx, -516)._1to16()));
+ TEST_INSTRUCTION("62411D40DFF7" , vpandnd(zmm30, zmm28, zmm15));
+ TEST_INSTRUCTION("62411D43DFF7" , k(k3).vpandnd(zmm30, zmm28, zmm15));
+ TEST_INSTRUCTION("62411DC3DFF7" , k(k3).z().vpandnd(zmm30, zmm28, zmm15));
+ TEST_INSTRUCTION("62611D40DF31" , vpandnd(zmm30, zmm28, zmmword_ptr(rcx)));
+ TEST_INSTRUCTION("62211D40DFB4F023010000" , vpandnd(zmm30, zmm28, zmmword_ptr(rax, r14, 3, 291)));
+ TEST_INSTRUCTION("62611D50DF31" , vpandnd(zmm30, zmm28, dword_ptr(rcx)._1to16()));
+ TEST_INSTRUCTION("62611D40DF727F" , vpandnd(zmm30, zmm28, zmmword_ptr(rdx, 8128)));
+ TEST_INSTRUCTION("62611D40DFB200200000" , vpandnd(zmm30, zmm28, zmmword_ptr(rdx, 8192)));
+ TEST_INSTRUCTION("62611D40DF7280" , vpandnd(zmm30, zmm28, zmmword_ptr(rdx, -8192)));
+ TEST_INSTRUCTION("62611D40DFB2C0DFFFFF" , vpandnd(zmm30, zmm28, zmmword_ptr(rdx, -8256)));
+ TEST_INSTRUCTION("62611D50DF727F" , vpandnd(zmm30, zmm28, dword_ptr(rdx, 508)._1to16()));
+ TEST_INSTRUCTION("62611D50DFB200020000" , vpandnd(zmm30, zmm28, dword_ptr(rdx, 512)._1to16()));
+ TEST_INSTRUCTION("62611D50DF7280" , vpandnd(zmm30, zmm28, dword_ptr(rdx, -512)._1to16()));
+ TEST_INSTRUCTION("62611D50DFB2FCFDFFFF" , vpandnd(zmm30, zmm28, dword_ptr(rdx, -516)._1to16()));
+ TEST_INSTRUCTION("62A1C548DFE3" , vpandnq(zmm20, zmm7, zmm19));
+ TEST_INSTRUCTION("62A1C54DDFE3" , k(k5).vpandnq(zmm20, zmm7, zmm19));
+ TEST_INSTRUCTION("62A1C5CDDFE3" , k(k5).z().vpandnq(zmm20, zmm7, zmm19));
+ TEST_INSTRUCTION("62E1C548DF21" , vpandnq(zmm20, zmm7, zmmword_ptr(rcx)));
+ TEST_INSTRUCTION("62A1C548DFA4F023010000" , vpandnq(zmm20, zmm7, zmmword_ptr(rax, r14, 3, 291)));
+ TEST_INSTRUCTION("62E1C558DF21" , vpandnq(zmm20, zmm7, qword_ptr(rcx)._1to8()));
+ TEST_INSTRUCTION("62E1C548DF627F" , vpandnq(zmm20, zmm7, zmmword_ptr(rdx, 8128)));
+ TEST_INSTRUCTION("62E1C548DFA200200000" , vpandnq(zmm20, zmm7, zmmword_ptr(rdx, 8192)));
+ TEST_INSTRUCTION("62E1C548DF6280" , vpandnq(zmm20, zmm7, zmmword_ptr(rdx, -8192)));
+ TEST_INSTRUCTION("62E1C548DFA2C0DFFFFF" , vpandnq(zmm20, zmm7, zmmword_ptr(rdx, -8256)));
+ TEST_INSTRUCTION("62E1C558DF627F" , vpandnq(zmm20, zmm7, qword_ptr(rdx, 1016)._1to8()));
+ TEST_INSTRUCTION("62E1C558DFA200040000" , vpandnq(zmm20, zmm7, qword_ptr(rdx, 1024)._1to8()));
+ TEST_INSTRUCTION("62E1C558DF6280" , vpandnq(zmm20, zmm7, qword_ptr(rdx, -1024)._1to8()));
+ TEST_INSTRUCTION("62E1C558DFA2F8FBFFFF" , vpandnq(zmm20, zmm7, qword_ptr(rdx, -1032)._1to8()));
+ TEST_INSTRUCTION("6281DD48DBCA" , vpandq(zmm17, zmm4, zmm26));
+ TEST_INSTRUCTION("6281DD4FDBCA" , k(k7).vpandq(zmm17, zmm4, zmm26));
+ TEST_INSTRUCTION("6281DDCFDBCA" , k(k7).z().vpandq(zmm17, zmm4, zmm26));
+ TEST_INSTRUCTION("62E1DD48DB09" , vpandq(zmm17, zmm4, zmmword_ptr(rcx)));
+ TEST_INSTRUCTION("62A1DD48DB8CF023010000" , vpandq(zmm17, zmm4, zmmword_ptr(rax, r14, 3, 291)));
+ TEST_INSTRUCTION("62E1DD58DB09" , vpandq(zmm17, zmm4, qword_ptr(rcx)._1to8()));
+ TEST_INSTRUCTION("62E1DD48DB4A7F" , vpandq(zmm17, zmm4, zmmword_ptr(rdx, 8128)));
+ TEST_INSTRUCTION("62E1DD48DB8A00200000" , vpandq(zmm17, zmm4, zmmword_ptr(rdx, 8192)));
+ TEST_INSTRUCTION("62E1DD48DB4A80" , vpandq(zmm17, zmm4, zmmword_ptr(rdx, -8192)));
+ TEST_INSTRUCTION("62E1DD48DB8AC0DFFFFF" , vpandq(zmm17, zmm4, zmmword_ptr(rdx, -8256)));
+ TEST_INSTRUCTION("62E1DD58DB4A7F" , vpandq(zmm17, zmm4, qword_ptr(rdx, 1016)._1to8()));
+ TEST_INSTRUCTION("62E1DD58DB8A00040000" , vpandq(zmm17, zmm4, qword_ptr(rdx, 1024)._1to8()));
+ TEST_INSTRUCTION("62E1DD58DB4A80" , vpandq(zmm17, zmm4, qword_ptr(rdx, -1024)._1to8()));
+ TEST_INSTRUCTION("62E1DD58DB8AF8FBFFFF" , vpandq(zmm17, zmm4, qword_ptr(rdx, -1032)._1to8()));
+ TEST_INSTRUCTION("62D2354064EB" , vpblendmd(zmm5, zmm25, zmm11));
+ TEST_INSTRUCTION("62D2354364EB" , k(k3).vpblendmd(zmm5, zmm25, zmm11));
+ TEST_INSTRUCTION("62D235C364EB" , k(k3).z().vpblendmd(zmm5, zmm25, zmm11));
+ TEST_INSTRUCTION("62F235406429" , vpblendmd(zmm5, zmm25, zmmword_ptr(rcx)));
+ TEST_INSTRUCTION("62B2354064ACF023010000" , vpblendmd(zmm5, zmm25, zmmword_ptr(rax, r14, 3, 291)));
+ TEST_INSTRUCTION("62F235506429" , vpblendmd(zmm5, zmm25, dword_ptr(rcx)._1to16()));
+ TEST_INSTRUCTION("62F23540646A7F" , vpblendmd(zmm5, zmm25, zmmword_ptr(rdx, 8128)));
+ TEST_INSTRUCTION("62F2354064AA00200000" , vpblendmd(zmm5, zmm25, zmmword_ptr(rdx, 8192)));
+ TEST_INSTRUCTION("62F23540646A80" , vpblendmd(zmm5, zmm25, zmmword_ptr(rdx, -8192)));
+ TEST_INSTRUCTION("62F2354064AAC0DFFFFF" , vpblendmd(zmm5, zmm25, zmmword_ptr(rdx, -8256)));
+ TEST_INSTRUCTION("62F23550646A7F" , vpblendmd(zmm5, zmm25, dword_ptr(rdx, 508)._1to16()));
+ TEST_INSTRUCTION("62F2355064AA00020000" , vpblendmd(zmm5, zmm25, dword_ptr(rdx, 512)._1to16()));
+ TEST_INSTRUCTION("62F23550646A80" , vpblendmd(zmm5, zmm25, dword_ptr(rdx, -512)._1to16()));
+ TEST_INSTRUCTION("62F2355064AAFCFDFFFF" , vpblendmd(zmm5, zmm25, dword_ptr(rdx, -516)._1to16()));
+ TEST_INSTRUCTION("62627D485811" , vpbroadcastd(zmm26, dword_ptr(rcx)));
+ TEST_INSTRUCTION("62627D4A5811" , k(k2).vpbroadcastd(zmm26, dword_ptr(rcx)));
+ TEST_INSTRUCTION("62627DCA5811" , k(k2).z().vpbroadcastd(zmm26, dword_ptr(rcx)));
+ TEST_INSTRUCTION("62227D485894F023010000" , vpbroadcastd(zmm26, dword_ptr(rax, r14, 3, 291)));
+ TEST_INSTRUCTION("62627D4858527F" , vpbroadcastd(zmm26, dword_ptr(rdx, 508)));
+ TEST_INSTRUCTION("62627D48589200020000" , vpbroadcastd(zmm26, dword_ptr(rdx, 512)));
+ TEST_INSTRUCTION("62627D48585280" , vpbroadcastd(zmm26, dword_ptr(rdx, -512)));
+ TEST_INSTRUCTION("62627D485892FCFDFFFF" , vpbroadcastd(zmm26, dword_ptr(rdx, -516)));
+ TEST_INSTRUCTION("62327D4858D6" , vpbroadcastd(zmm10, xmm22));
+ TEST_INSTRUCTION("62327D4F58D6" , k(k7).vpbroadcastd(zmm10, xmm22));
+ TEST_INSTRUCTION("62327DCF58D6" , k(k7).z().vpbroadcastd(zmm10, xmm22));
+ TEST_INSTRUCTION("62727D487CD8" , vpbroadcastd(zmm11, eax));
+ TEST_INSTRUCTION("62727D4E7CD8" , k(k6).vpbroadcastd(zmm11, eax));
+ TEST_INSTRUCTION("62727DCE7CD8" , k(k6).z().vpbroadcastd(zmm11, eax));
+ TEST_INSTRUCTION("62727D487CDD" , vpbroadcastd(zmm11, ebp));
+ TEST_INSTRUCTION("62527D487CDD" , vpbroadcastd(zmm11, r13d));
+ TEST_INSTRUCTION("6262FD485909" , vpbroadcastq(zmm25, qword_ptr(rcx)));
+ TEST_INSTRUCTION("6262FD4A5909" , k(k2).vpbroadcastq(zmm25, qword_ptr(rcx)));
+ TEST_INSTRUCTION("6262FDCA5909" , k(k2).z().vpbroadcastq(zmm25, qword_ptr(rcx)));
+ TEST_INSTRUCTION("6222FD48598CF023010000" , vpbroadcastq(zmm25, qword_ptr(rax, r14, 3, 291)));
+ TEST_INSTRUCTION("6262FD48594A7F" , vpbroadcastq(zmm25, qword_ptr(rdx, 1016)));
+ TEST_INSTRUCTION("6262FD48598A00040000" , vpbroadcastq(zmm25, qword_ptr(rdx, 1024)));
+ TEST_INSTRUCTION("6262FD48594A80" , vpbroadcastq(zmm25, qword_ptr(rdx, -1024)));
+ TEST_INSTRUCTION("6262FD48598AF8FBFFFF" , vpbroadcastq(zmm25, qword_ptr(rdx, -1032)));
+ TEST_INSTRUCTION("62F2FD4859DD" , vpbroadcastq(zmm3, xmm5));
+ TEST_INSTRUCTION("62F2FD4D59DD" , k(k5).vpbroadcastq(zmm3, xmm5));
+ TEST_INSTRUCTION("62F2FDCD59DD" , k(k5).z().vpbroadcastq(zmm3, xmm5));
+ TEST_INSTRUCTION("62F2FD487CC8" , vpbroadcastq(zmm1, rax));
+ TEST_INSTRUCTION("62F2FD4E7CC8" , k(k6).vpbroadcastq(zmm1, rax));
+ TEST_INSTRUCTION("62F2FDCE7CC8" , k(k6).z().vpbroadcastq(zmm1, rax));
+ TEST_INSTRUCTION("62D2FD487CC8" , vpbroadcastq(zmm1, r8));
+ TEST_INSTRUCTION("62D335401FEAAB" , vpcmpd(k5, zmm25, zmm10, 171));
+ TEST_INSTRUCTION("62D335431FEAAB" , k(k3).vpcmpd(k5, zmm25, zmm10, 171));
+ TEST_INSTRUCTION("62D335401FEA7B" , vpcmpd(k5, zmm25, zmm10, 123));
+ TEST_INSTRUCTION("62F335401F297B" , vpcmpd(k5, zmm25, zmmword_ptr(rcx), 123));
+ TEST_INSTRUCTION("62B335401FACF0230100007B" , vpcmpd(k5, zmm25, zmmword_ptr(rax, r14, 3, 291), 123));
+ TEST_INSTRUCTION("62F335501F297B" , vpcmpd(k5, zmm25, dword_ptr(rcx)._1to16(), 123));
+ TEST_INSTRUCTION("62F335401F6A7F7B" , vpcmpd(k5, zmm25, zmmword_ptr(rdx, 8128), 123));
+ TEST_INSTRUCTION("62F335401FAA002000007B" , vpcmpd(k5, zmm25, zmmword_ptr(rdx, 8192), 123));
+ TEST_INSTRUCTION("62F335401F6A807B" , vpcmpd(k5, zmm25, zmmword_ptr(rdx, -8192), 123));
+ TEST_INSTRUCTION("62F335401FAAC0DFFFFF7B" , vpcmpd(k5, zmm25, zmmword_ptr(rdx, -8256), 123));
+ TEST_INSTRUCTION("62F335501F6A7F7B" , vpcmpd(k5, zmm25, dword_ptr(rdx, 508)._1to16(), 123));
+ TEST_INSTRUCTION("62F335501FAA000200007B" , vpcmpd(k5, zmm25, dword_ptr(rdx, 512)._1to16(), 123));
+ TEST_INSTRUCTION("62F335501F6A807B" , vpcmpd(k5, zmm25, dword_ptr(rdx, -512)._1to16(), 123));
+ TEST_INSTRUCTION("62F335501FAAFCFDFFFF7B" , vpcmpd(k5, zmm25, dword_ptr(rdx, -516)._1to16(), 123));
+ TEST_INSTRUCTION("62D16D4876EA" , vpcmpeqd(k5, zmm2, zmm10));
+ TEST_INSTRUCTION("62D16D4F76EA" , k(k7).vpcmpeqd(k5, zmm2, zmm10));
+ TEST_INSTRUCTION("62F16D487629" , vpcmpeqd(k5, zmm2, zmmword_ptr(rcx)));
+ TEST_INSTRUCTION("62B16D4876ACF023010000" , vpcmpeqd(k5, zmm2, zmmword_ptr(rax, r14, 3, 291)));
+ TEST_INSTRUCTION("62F16D587629" , vpcmpeqd(k5, zmm2, dword_ptr(rcx)._1to16()));
+ TEST_INSTRUCTION("62F16D48766A7F" , vpcmpeqd(k5, zmm2, zmmword_ptr(rdx, 8128)));
+ TEST_INSTRUCTION("62F16D4876AA00200000" , vpcmpeqd(k5, zmm2, zmmword_ptr(rdx, 8192)));
+ TEST_INSTRUCTION("62F16D48766A80" , vpcmpeqd(k5, zmm2, zmmword_ptr(rdx, -8192)));
+ TEST_INSTRUCTION("62F16D4876AAC0DFFFFF" , vpcmpeqd(k5, zmm2, zmmword_ptr(rdx, -8256)));
+ TEST_INSTRUCTION("62F16D58766A7F" , vpcmpeqd(k5, zmm2, dword_ptr(rdx, 508)._1to16()));
+ TEST_INSTRUCTION("62F16D5876AA00020000" , vpcmpeqd(k5, zmm2, dword_ptr(rdx, 512)._1to16()));
+ TEST_INSTRUCTION("62F16D58766A80" , vpcmpeqd(k5, zmm2, dword_ptr(rdx, -512)._1to16()));
+ TEST_INSTRUCTION("62F16D5876AAFCFDFFFF" , vpcmpeqd(k5, zmm2, dword_ptr(rdx, -516)._1to16()));
+ TEST_INSTRUCTION("62F2CD4029DA" , vpcmpeqq(k3, zmm22, zmm2));
+ TEST_INSTRUCTION("62F2CD4629DA" , k(k6).vpcmpeqq(k3, zmm22, zmm2));
+ TEST_INSTRUCTION("62F2CD402919" , vpcmpeqq(k3, zmm22, zmmword_ptr(rcx)));
+ TEST_INSTRUCTION("62B2CD40299CF023010000" , vpcmpeqq(k3, zmm22, zmmword_ptr(rax, r14, 3, 291)));
+ TEST_INSTRUCTION("62F2CD502919" , vpcmpeqq(k3, zmm22, qword_ptr(rcx)._1to8()));
+ TEST_INSTRUCTION("62F2CD40295A7F" , vpcmpeqq(k3, zmm22, zmmword_ptr(rdx, 8128)));
+ TEST_INSTRUCTION("62F2CD40299A00200000" , vpcmpeqq(k3, zmm22, zmmword_ptr(rdx, 8192)));
+ TEST_INSTRUCTION("62F2CD40295A80" , vpcmpeqq(k3, zmm22, zmmword_ptr(rdx, -8192)));
+ TEST_INSTRUCTION("62F2CD40299AC0DFFFFF" , vpcmpeqq(k3, zmm22, zmmword_ptr(rdx, -8256)));
+ TEST_INSTRUCTION("62F2CD50295A7F" , vpcmpeqq(k3, zmm22, qword_ptr(rdx, 1016)._1to8()));
+ TEST_INSTRUCTION("62F2CD50299A00040000" , vpcmpeqq(k3, zmm22, qword_ptr(rdx, 1024)._1to8()));
+ TEST_INSTRUCTION("62F2CD50295A80" , vpcmpeqq(k3, zmm22, qword_ptr(rdx, -1024)._1to8()));
+ TEST_INSTRUCTION("62F2CD50299AF8FBFFFF" , vpcmpeqq(k3, zmm22, qword_ptr(rdx, -1032)._1to8()));
+ TEST_INSTRUCTION("62D1554066E8" , vpcmpgtd(k5, zmm21, zmm8));
+ TEST_INSTRUCTION("62D1554566E8" , k(k5).vpcmpgtd(k5, zmm21, zmm8));
+ TEST_INSTRUCTION("62F155406629" , vpcmpgtd(k5, zmm21, zmmword_ptr(rcx)));
+ TEST_INSTRUCTION("62B1554066ACF023010000" , vpcmpgtd(k5, zmm21, zmmword_ptr(rax, r14, 3, 291)));
+ TEST_INSTRUCTION("62F155506629" , vpcmpgtd(k5, zmm21, dword_ptr(rcx)._1to16()));
+ TEST_INSTRUCTION("62F15540666A7F" , vpcmpgtd(k5, zmm21, zmmword_ptr(rdx, 8128)));
+ TEST_INSTRUCTION("62F1554066AA00200000" , vpcmpgtd(k5, zmm21, zmmword_ptr(rdx, 8192)));
+ TEST_INSTRUCTION("62F15540666A80" , vpcmpgtd(k5, zmm21, zmmword_ptr(rdx, -8192)));
+ TEST_INSTRUCTION("62F1554066AAC0DFFFFF" , vpcmpgtd(k5, zmm21, zmmword_ptr(rdx, -8256)));
+ TEST_INSTRUCTION("62F15550666A7F" , vpcmpgtd(k5, zmm21, dword_ptr(rdx, 508)._1to16()));
+ TEST_INSTRUCTION("62F1555066AA00020000" , vpcmpgtd(k5, zmm21, dword_ptr(rdx, 512)._1to16()));
+ TEST_INSTRUCTION("62F15550666A80" , vpcmpgtd(k5, zmm21, dword_ptr(rdx, -512)._1to16()));
+ TEST_INSTRUCTION("62F1555066AAFCFDFFFF" , vpcmpgtd(k5, zmm21, dword_ptr(rdx, -516)._1to16()));
+ TEST_INSTRUCTION("62B2DD4037D1" , vpcmpgtq(k2, zmm20, zmm17));
+ TEST_INSTRUCTION("62B2DD4337D1" , k(k3).vpcmpgtq(k2, zmm20, zmm17));
+ TEST_INSTRUCTION("62F2DD403711" , vpcmpgtq(k2, zmm20, zmmword_ptr(rcx)));
+ TEST_INSTRUCTION("62B2DD403794F023010000" , vpcmpgtq(k2, zmm20, zmmword_ptr(rax, r14, 3, 291)));
+ TEST_INSTRUCTION("62F2DD503711" , vpcmpgtq(k2, zmm20, qword_ptr(rcx)._1to8()));
+ TEST_INSTRUCTION("62F2DD4037527F" , vpcmpgtq(k2, zmm20, zmmword_ptr(rdx, 8128)));
+ TEST_INSTRUCTION("62F2DD40379200200000" , vpcmpgtq(k2, zmm20, zmmword_ptr(rdx, 8192)));
+ TEST_INSTRUCTION("62F2DD40375280" , vpcmpgtq(k2, zmm20, zmmword_ptr(rdx, -8192)));
+ TEST_INSTRUCTION("62F2DD403792C0DFFFFF" , vpcmpgtq(k2, zmm20, zmmword_ptr(rdx, -8256)));
+ TEST_INSTRUCTION("62F2DD5037527F" , vpcmpgtq(k2, zmm20, qword_ptr(rdx, 1016)._1to8()));
+ TEST_INSTRUCTION("62F2DD50379200040000" , vpcmpgtq(k2, zmm20, qword_ptr(rdx, 1024)._1to8()));
+ TEST_INSTRUCTION("62F2DD50375280" , vpcmpgtq(k2, zmm20, qword_ptr(rdx, -1024)._1to8()));
+ TEST_INSTRUCTION("62F2DD503792F8FBFFFF" , vpcmpgtq(k2, zmm20, qword_ptr(rdx, -1032)._1to8()));
+ TEST_INSTRUCTION("62939D401FECAB" , vpcmpq(k5, zmm28, zmm28, 171));
+ TEST_INSTRUCTION("62939D431FECAB" , k(k3).vpcmpq(k5, zmm28, zmm28, 171));
+ TEST_INSTRUCTION("62939D401FEC7B" , vpcmpq(k5, zmm28, zmm28, 123));
+ TEST_INSTRUCTION("62F39D401F297B" , vpcmpq(k5, zmm28, zmmword_ptr(rcx), 123));
+ TEST_INSTRUCTION("62B39D401FACF0230100007B" , vpcmpq(k5, zmm28, zmmword_ptr(rax, r14, 3, 291), 123));
+ TEST_INSTRUCTION("62F39D501F297B" , vpcmpq(k5, zmm28, qword_ptr(rcx)._1to8(), 123));
+ TEST_INSTRUCTION("62F39D401F6A7F7B" , vpcmpq(k5, zmm28, zmmword_ptr(rdx, 8128), 123));
+ TEST_INSTRUCTION("62F39D401FAA002000007B" , vpcmpq(k5, zmm28, zmmword_ptr(rdx, 8192), 123));
+ TEST_INSTRUCTION("62F39D401F6A807B" , vpcmpq(k5, zmm28, zmmword_ptr(rdx, -8192), 123));
+ TEST_INSTRUCTION("62F39D401FAAC0DFFFFF7B" , vpcmpq(k5, zmm28, zmmword_ptr(rdx, -8256), 123));
+ TEST_INSTRUCTION("62F39D501F6A7F7B" , vpcmpq(k5, zmm28, qword_ptr(rdx, 1016)._1to8(), 123));
+ TEST_INSTRUCTION("62F39D501FAA000400007B" , vpcmpq(k5, zmm28, qword_ptr(rdx, 1024)._1to8(), 123));
+ TEST_INSTRUCTION("62F39D501F6A807B" , vpcmpq(k5, zmm28, qword_ptr(rdx, -1024)._1to8(), 123));
+ TEST_INSTRUCTION("62F39D501FAAF8FBFFFF7B" , vpcmpq(k5, zmm28, qword_ptr(rdx, -1032)._1to8(), 123));
+ TEST_INSTRUCTION("62F335401ED7AB" , vpcmpud(k2, zmm25, zmm7, 171));
+ TEST_INSTRUCTION("62F335411ED7AB" , k(k1).vpcmpud(k2, zmm25, zmm7, 171));
+ TEST_INSTRUCTION("62F335401ED77B" , vpcmpud(k2, zmm25, zmm7, 123));
+ TEST_INSTRUCTION("62F335401E117B" , vpcmpud(k2, zmm25, zmmword_ptr(rcx), 123));
+ TEST_INSTRUCTION("62B335401E94F0230100007B" , vpcmpud(k2, zmm25, zmmword_ptr(rax, r14, 3, 291), 123));
+ TEST_INSTRUCTION("62F335501E117B" , vpcmpud(k2, zmm25, dword_ptr(rcx)._1to16(), 123));
+ TEST_INSTRUCTION("62F335401E527F7B" , vpcmpud(k2, zmm25, zmmword_ptr(rdx, 8128), 123));
+ TEST_INSTRUCTION("62F335401E92002000007B" , vpcmpud(k2, zmm25, zmmword_ptr(rdx, 8192), 123));
+ TEST_INSTRUCTION("62F335401E52807B" , vpcmpud(k2, zmm25, zmmword_ptr(rdx, -8192), 123));
+ TEST_INSTRUCTION("62F335401E92C0DFFFFF7B" , vpcmpud(k2, zmm25, zmmword_ptr(rdx, -8256), 123));
+ TEST_INSTRUCTION("62F335501E527F7B" , vpcmpud(k2, zmm25, dword_ptr(rdx, 508)._1to16(), 123));
+ TEST_INSTRUCTION("62F335501E92000200007B" , vpcmpud(k2, zmm25, dword_ptr(rdx, 512)._1to16(), 123));
+ TEST_INSTRUCTION("62F335501E52807B" , vpcmpud(k2, zmm25, dword_ptr(rdx, -512)._1to16(), 123));
+ TEST_INSTRUCTION("62F335501E92FCFDFFFF7B" , vpcmpud(k2, zmm25, dword_ptr(rdx, -516)._1to16(), 123));
+ TEST_INSTRUCTION("62D38D481ED8AB" , vpcmpuq(k3, zmm14, zmm8, 171));
+ TEST_INSTRUCTION("62D38D4A1ED8AB" , k(k2).vpcmpuq(k3, zmm14, zmm8, 171));
+ TEST_INSTRUCTION("62D38D481ED87B" , vpcmpuq(k3, zmm14, zmm8, 123));
+ TEST_INSTRUCTION("62F38D481E197B" , vpcmpuq(k3, zmm14, zmmword_ptr(rcx), 123));
+ TEST_INSTRUCTION("62B38D481E9CF0230100007B" , vpcmpuq(k3, zmm14, zmmword_ptr(rax, r14, 3, 291), 123));
+ TEST_INSTRUCTION("62F38D581E197B" , vpcmpuq(k3, zmm14, qword_ptr(rcx)._1to8(), 123));
+ TEST_INSTRUCTION("62F38D481E5A7F7B" , vpcmpuq(k3, zmm14, zmmword_ptr(rdx, 8128), 123));
+ TEST_INSTRUCTION("62F38D481E9A002000007B" , vpcmpuq(k3, zmm14, zmmword_ptr(rdx, 8192), 123));
+ TEST_INSTRUCTION("62F38D481E5A807B" , vpcmpuq(k3, zmm14, zmmword_ptr(rdx, -8192), 123));
+ TEST_INSTRUCTION("62F38D481E9AC0DFFFFF7B" , vpcmpuq(k3, zmm14, zmmword_ptr(rdx, -8256), 123));
+ TEST_INSTRUCTION("62F38D581E5A7F7B" , vpcmpuq(k3, zmm14, qword_ptr(rdx, 1016)._1to8(), 123));
+ TEST_INSTRUCTION("62F38D581E9A000400007B" , vpcmpuq(k3, zmm14, qword_ptr(rdx, 1024)._1to8(), 123));
+ TEST_INSTRUCTION("62F38D581E5A807B" , vpcmpuq(k3, zmm14, qword_ptr(rdx, -1024)._1to8(), 123));
+ TEST_INSTRUCTION("62F38D581E9AF8FBFFFF7B" , vpcmpuq(k3, zmm14, qword_ptr(rdx, -1032)._1to8(), 123));
+ TEST_INSTRUCTION("62228D4864D9" , vpblendmq(zmm27, zmm14, zmm17));
+ TEST_INSTRUCTION("62228D4D64D9" , k(k5).vpblendmq(zmm27, zmm14, zmm17));
+ TEST_INSTRUCTION("62228DCD64D9" , k(k5).z().vpblendmq(zmm27, zmm14, zmm17));
+ TEST_INSTRUCTION("62628D486419" , vpblendmq(zmm27, zmm14, zmmword_ptr(rcx)));
+ TEST_INSTRUCTION("62228D48649CF023010000" , vpblendmq(zmm27, zmm14, zmmword_ptr(rax, r14, 3, 291)));
+ TEST_INSTRUCTION("62628D586419" , vpblendmq(zmm27, zmm14, qword_ptr(rcx)._1to8()));
+ TEST_INSTRUCTION("62628D48645A7F" , vpblendmq(zmm27, zmm14, zmmword_ptr(rdx, 8128)));
+ TEST_INSTRUCTION("62628D48649A00200000" , vpblendmq(zmm27, zmm14, zmmword_ptr(rdx, 8192)));
+ TEST_INSTRUCTION("62628D48645A80" , vpblendmq(zmm27, zmm14, zmmword_ptr(rdx, -8192)));
+ TEST_INSTRUCTION("62628D48649AC0DFFFFF" , vpblendmq(zmm27, zmm14, zmmword_ptr(rdx, -8256)));
+ TEST_INSTRUCTION("62628D58645A7F" , vpblendmq(zmm27, zmm14, qword_ptr(rdx, 1016)._1to8()));
+ TEST_INSTRUCTION("62628D58649A00040000" , vpblendmq(zmm27, zmm14, qword_ptr(rdx, 1024)._1to8()));
+ TEST_INSTRUCTION("62628D58645A80" , vpblendmq(zmm27, zmm14, qword_ptr(rdx, -1024)._1to8()));
+ TEST_INSTRUCTION("62628D58649AF8FBFFFF" , vpblendmq(zmm27, zmm14, qword_ptr(rdx, -1032)._1to8()));
+ TEST_INSTRUCTION("62E27D488B39" , vpcompressd(zmmword_ptr(rcx), zmm23));
+ TEST_INSTRUCTION("62E27D4F8B39" , k(k7).vpcompressd(zmmword_ptr(rcx), zmm23));
+ TEST_INSTRUCTION("62A27D488BBCF023010000" , vpcompressd(zmmword_ptr(rax, r14, 3, 291), zmm23));
+ TEST_INSTRUCTION("62E27D488B7A7F" , vpcompressd(zmmword_ptr(rdx, 508), zmm23));
+ TEST_INSTRUCTION("62E27D488BBA00020000" , vpcompressd(zmmword_ptr(rdx, 512), zmm23));
+ TEST_INSTRUCTION("62E27D488B7A80" , vpcompressd(zmmword_ptr(rdx, -512), zmm23));
+ TEST_INSTRUCTION("62E27D488BBAFCFDFFFF" , vpcompressd(zmmword_ptr(rdx, -516), zmm23));
+ TEST_INSTRUCTION("62A27D488BD0" , vpcompressd(zmm16, zmm18));
+ TEST_INSTRUCTION("62A27D4A8BD0" , k(k2).vpcompressd(zmm16, zmm18));
+ TEST_INSTRUCTION("62A27DCA8BD0" , k(k2).z().vpcompressd(zmm16, zmm18));
+ TEST_INSTRUCTION("62C21D4036F1" , vpermd(zmm22, zmm28, zmm9));
+ TEST_INSTRUCTION("62C21D4136F1" , k(k1).vpermd(zmm22, zmm28, zmm9));
+ TEST_INSTRUCTION("62C21DC136F1" , k(k1).z().vpermd(zmm22, zmm28, zmm9));
+ TEST_INSTRUCTION("62E21D403631" , vpermd(zmm22, zmm28, zmmword_ptr(rcx)));
+ TEST_INSTRUCTION("62A21D4036B4F023010000" , vpermd(zmm22, zmm28, zmmword_ptr(rax, r14, 3, 291)));
+ TEST_INSTRUCTION("62E21D503631" , vpermd(zmm22, zmm28, dword_ptr(rcx)._1to16()));
+ TEST_INSTRUCTION("62E21D4036727F" , vpermd(zmm22, zmm28, zmmword_ptr(rdx, 8128)));
+ TEST_INSTRUCTION("62E21D4036B200200000" , vpermd(zmm22, zmm28, zmmword_ptr(rdx, 8192)));
+ TEST_INSTRUCTION("62E21D40367280" , vpermd(zmm22, zmm28, zmmword_ptr(rdx, -8192)));
+ TEST_INSTRUCTION("62E21D4036B2C0DFFFFF" , vpermd(zmm22, zmm28, zmmword_ptr(rdx, -8256)));
+ TEST_INSTRUCTION("62E21D5036727F" , vpermd(zmm22, zmm28, dword_ptr(rdx, 508)._1to16()));
+ TEST_INSTRUCTION("62E21D5036B200020000" , vpermd(zmm22, zmm28, dword_ptr(rdx, 512)._1to16()));
+ TEST_INSTRUCTION("62E21D50367280" , vpermd(zmm22, zmm28, dword_ptr(rdx, -512)._1to16()));
+ TEST_INSTRUCTION("62E21D5036B2FCFDFFFF" , vpermd(zmm22, zmm28, dword_ptr(rdx, -516)._1to16()));
+ TEST_INSTRUCTION("62E3FD4805DCAB" , vpermilpd(zmm19, zmm4, 171));
+ TEST_INSTRUCTION("62E3FD4905DCAB" , k(k1).vpermilpd(zmm19, zmm4, 171));
+ TEST_INSTRUCTION("62E3FDC905DCAB" , k(k1).z().vpermilpd(zmm19, zmm4, 171));
+ TEST_INSTRUCTION("62E3FD4805DC7B" , vpermilpd(zmm19, zmm4, 123));
+ TEST_INSTRUCTION("62E3FD4805197B" , vpermilpd(zmm19, zmmword_ptr(rcx), 123));
+ TEST_INSTRUCTION("62A3FD48059CF0230100007B" , vpermilpd(zmm19, zmmword_ptr(rax, r14, 3, 291), 123));
+ TEST_INSTRUCTION("62E3FD5805197B" , vpermilpd(zmm19, qword_ptr(rcx)._1to8(), 123));
+ TEST_INSTRUCTION("62E3FD48055A7F7B" , vpermilpd(zmm19, zmmword_ptr(rdx, 8128), 123));
+ TEST_INSTRUCTION("62E3FD48059A002000007B" , vpermilpd(zmm19, zmmword_ptr(rdx, 8192), 123));
+ TEST_INSTRUCTION("62E3FD48055A807B" , vpermilpd(zmm19, zmmword_ptr(rdx, -8192), 123));
+ TEST_INSTRUCTION("62E3FD48059AC0DFFFFF7B" , vpermilpd(zmm19, zmmword_ptr(rdx, -8256), 123));
+ TEST_INSTRUCTION("62E3FD58055A7F7B" , vpermilpd(zmm19, qword_ptr(rdx, 1016)._1to8(), 123));
+ TEST_INSTRUCTION("62E3FD58059A000400007B" , vpermilpd(zmm19, qword_ptr(rdx, 1024)._1to8(), 123));
+ TEST_INSTRUCTION("62E3FD58055A807B" , vpermilpd(zmm19, qword_ptr(rdx, -1024)._1to8(), 123));
+ TEST_INSTRUCTION("62E3FD58059AF8FBFFFF7B" , vpermilpd(zmm19, qword_ptr(rdx, -1032)._1to8(), 123));
+ TEST_INSTRUCTION("62B2AD400DCD" , vpermilpd(zmm1, zmm26, zmm21));
+ TEST_INSTRUCTION("62B2AD420DCD" , k(k2).vpermilpd(zmm1, zmm26, zmm21));
+ TEST_INSTRUCTION("62B2ADC20DCD" , k(k2).z().vpermilpd(zmm1, zmm26, zmm21));
+ TEST_INSTRUCTION("62F2AD400D09" , vpermilpd(zmm1, zmm26, zmmword_ptr(rcx)));
+ TEST_INSTRUCTION("62B2AD400D8CF023010000" , vpermilpd(zmm1, zmm26, zmmword_ptr(rax, r14, 3, 291)));
+ TEST_INSTRUCTION("62F2AD500D09" , vpermilpd(zmm1, zmm26, qword_ptr(rcx)._1to8()));
+ TEST_INSTRUCTION("62F2AD400D4A7F" , vpermilpd(zmm1, zmm26, zmmword_ptr(rdx, 8128)));
+ TEST_INSTRUCTION("62F2AD400D8A00200000" , vpermilpd(zmm1, zmm26, zmmword_ptr(rdx, 8192)));
+ TEST_INSTRUCTION("62F2AD400D4A80" , vpermilpd(zmm1, zmm26, zmmword_ptr(rdx, -8192)));
+ TEST_INSTRUCTION("62F2AD400D8AC0DFFFFF" , vpermilpd(zmm1, zmm26, zmmword_ptr(rdx, -8256)));
+ TEST_INSTRUCTION("62F2AD500D4A7F" , vpermilpd(zmm1, zmm26, qword_ptr(rdx, 1016)._1to8()));
+ TEST_INSTRUCTION("62F2AD500D8A00040000" , vpermilpd(zmm1, zmm26, qword_ptr(rdx, 1024)._1to8()));
+ TEST_INSTRUCTION("62F2AD500D4A80" , vpermilpd(zmm1, zmm26, qword_ptr(rdx, -1024)._1to8()));
+ TEST_INSTRUCTION("62F2AD500D8AF8FBFFFF" , vpermilpd(zmm1, zmm26, qword_ptr(rdx, -1032)._1to8()));
+ TEST_INSTRUCTION("62B37D4804D6AB" , vpermilps(zmm2, zmm22, 171));
+ TEST_INSTRUCTION("62B37D4A04D6AB" , k(k2).vpermilps(zmm2, zmm22, 171));
+ TEST_INSTRUCTION("62B37DCA04D6AB" , k(k2).z().vpermilps(zmm2, zmm22, 171));
+ TEST_INSTRUCTION("62B37D4804D67B" , vpermilps(zmm2, zmm22, 123));
+ TEST_INSTRUCTION("62F37D4804117B" , vpermilps(zmm2, zmmword_ptr(rcx), 123));
+ TEST_INSTRUCTION("62B37D480494F0230100007B" , vpermilps(zmm2, zmmword_ptr(rax, r14, 3, 291), 123));
+ TEST_INSTRUCTION("62F37D5804117B" , vpermilps(zmm2, dword_ptr(rcx)._1to16(), 123));
+ TEST_INSTRUCTION("62F37D4804527F7B" , vpermilps(zmm2, zmmword_ptr(rdx, 8128), 123));
+ TEST_INSTRUCTION("62F37D480492002000007B" , vpermilps(zmm2, zmmword_ptr(rdx, 8192), 123));
+ TEST_INSTRUCTION("62F37D480452807B" , vpermilps(zmm2, zmmword_ptr(rdx, -8192), 123));
+ TEST_INSTRUCTION("62F37D480492C0DFFFFF7B" , vpermilps(zmm2, zmmword_ptr(rdx, -8256), 123));
+ TEST_INSTRUCTION("62F37D5804527F7B" , vpermilps(zmm2, dword_ptr(rdx, 508)._1to16(), 123));
+ TEST_INSTRUCTION("62F37D580492000200007B" , vpermilps(zmm2, dword_ptr(rdx, 512)._1to16(), 123));
+ TEST_INSTRUCTION("62F37D580452807B" , vpermilps(zmm2, dword_ptr(rdx, -512)._1to16(), 123));
+ TEST_INSTRUCTION("62F37D580492FCFDFFFF7B" , vpermilps(zmm2, dword_ptr(rdx, -516)._1to16(), 123));
+ TEST_INSTRUCTION("62725D400CEA" , vpermilps(zmm13, zmm20, zmm2));
+ TEST_INSTRUCTION("62725D410CEA" , k(k1).vpermilps(zmm13, zmm20, zmm2));
+ TEST_INSTRUCTION("62725DC10CEA" , k(k1).z().vpermilps(zmm13, zmm20, zmm2));
+ TEST_INSTRUCTION("62725D400C29" , vpermilps(zmm13, zmm20, zmmword_ptr(rcx)));
+ TEST_INSTRUCTION("62325D400CACF023010000" , vpermilps(zmm13, zmm20, zmmword_ptr(rax, r14, 3, 291)));
+ TEST_INSTRUCTION("62725D500C29" , vpermilps(zmm13, zmm20, dword_ptr(rcx)._1to16()));
+ TEST_INSTRUCTION("62725D400C6A7F" , vpermilps(zmm13, zmm20, zmmword_ptr(rdx, 8128)));
+ TEST_INSTRUCTION("62725D400CAA00200000" , vpermilps(zmm13, zmm20, zmmword_ptr(rdx, 8192)));
+ TEST_INSTRUCTION("62725D400C6A80" , vpermilps(zmm13, zmm20, zmmword_ptr(rdx, -8192)));
+ TEST_INSTRUCTION("62725D400CAAC0DFFFFF" , vpermilps(zmm13, zmm20, zmmword_ptr(rdx, -8256)));
+ TEST_INSTRUCTION("62725D500C6A7F" , vpermilps(zmm13, zmm20, dword_ptr(rdx, 508)._1to16()));
+ TEST_INSTRUCTION("62725D500CAA00020000" , vpermilps(zmm13, zmm20, dword_ptr(rdx, 512)._1to16()));
+ TEST_INSTRUCTION("62725D500C6A80" , vpermilps(zmm13, zmm20, dword_ptr(rdx, -512)._1to16()));
+ TEST_INSTRUCTION("62725D500CAAFCFDFFFF" , vpermilps(zmm13, zmm20, dword_ptr(rdx, -516)._1to16()));
+ TEST_INSTRUCTION("6293FD4801DBAB" , vpermpd(zmm3, zmm27, 171));
+ TEST_INSTRUCTION("6293FD4A01DBAB" , k(k2).vpermpd(zmm3, zmm27, 171));
+ TEST_INSTRUCTION("6293FDCA01DBAB" , k(k2).z().vpermpd(zmm3, zmm27, 171));
+ TEST_INSTRUCTION("6293FD4801DB7B" , vpermpd(zmm3, zmm27, 123));
+ TEST_INSTRUCTION("62F3FD4801197B" , vpermpd(zmm3, zmmword_ptr(rcx), 123));
+ TEST_INSTRUCTION("62B3FD48019CF0230100007B" , vpermpd(zmm3, zmmword_ptr(rax, r14, 3, 291), 123));
+ TEST_INSTRUCTION("62F3FD5801197B" , vpermpd(zmm3, qword_ptr(rcx)._1to8(), 123));
+ TEST_INSTRUCTION("62F3FD48015A7F7B" , vpermpd(zmm3, zmmword_ptr(rdx, 8128), 123));
+ TEST_INSTRUCTION("62F3FD48019A002000007B" , vpermpd(zmm3, zmmword_ptr(rdx, 8192), 123));
+ TEST_INSTRUCTION("62F3FD48015A807B" , vpermpd(zmm3, zmmword_ptr(rdx, -8192), 123));
+ TEST_INSTRUCTION("62F3FD48019AC0DFFFFF7B" , vpermpd(zmm3, zmmword_ptr(rdx, -8256), 123));
+ TEST_INSTRUCTION("62F3FD58015A7F7B" , vpermpd(zmm3, qword_ptr(rdx, 1016)._1to8(), 123));
+ TEST_INSTRUCTION("62F3FD58019A000400007B" , vpermpd(zmm3, qword_ptr(rdx, 1024)._1to8(), 123));
+ TEST_INSTRUCTION("62F3FD58015A807B" , vpermpd(zmm3, qword_ptr(rdx, -1024)._1to8(), 123));
+ TEST_INSTRUCTION("62F3FD58019AF8FBFFFF7B" , vpermpd(zmm3, qword_ptr(rdx, -1032)._1to8(), 123));
+ TEST_INSTRUCTION("62926D4816E0" , vpermps(zmm4, zmm2, zmm24));
+ TEST_INSTRUCTION("62926D4C16E0" , k(k4).vpermps(zmm4, zmm2, zmm24));
+ TEST_INSTRUCTION("62926DCC16E0" , k(k4).z().vpermps(zmm4, zmm2, zmm24));
+ TEST_INSTRUCTION("62F26D481621" , vpermps(zmm4, zmm2, zmmword_ptr(rcx)));
+ TEST_INSTRUCTION("62B26D4816A4F023010000" , vpermps(zmm4, zmm2, zmmword_ptr(rax, r14, 3, 291)));
+ TEST_INSTRUCTION("62F26D581621" , vpermps(zmm4, zmm2, dword_ptr(rcx)._1to16()));
+ TEST_INSTRUCTION("62F26D4816627F" , vpermps(zmm4, zmm2, zmmword_ptr(rdx, 8128)));
+ TEST_INSTRUCTION("62F26D4816A200200000" , vpermps(zmm4, zmm2, zmmword_ptr(rdx, 8192)));
+ TEST_INSTRUCTION("62F26D48166280" , vpermps(zmm4, zmm2, zmmword_ptr(rdx, -8192)));
+ TEST_INSTRUCTION("62F26D4816A2C0DFFFFF" , vpermps(zmm4, zmm2, zmmword_ptr(rdx, -8256)));
+ TEST_INSTRUCTION("62F26D5816627F" , vpermps(zmm4, zmm2, dword_ptr(rdx, 508)._1to16()));
+ TEST_INSTRUCTION("62F26D5816A200020000" , vpermps(zmm4, zmm2, dword_ptr(rdx, 512)._1to16()));
+ TEST_INSTRUCTION("62F26D58166280" , vpermps(zmm4, zmm2, dword_ptr(rdx, -512)._1to16()));
+ TEST_INSTRUCTION("62F26D5816A2FCFDFFFF" , vpermps(zmm4, zmm2, dword_ptr(rdx, -516)._1to16()));
+ TEST_INSTRUCTION("6263FD4800CCAB" , vpermq(zmm25, zmm4, 171));
+ TEST_INSTRUCTION("6263FD4E00CCAB" , k(k6).vpermq(zmm25, zmm4, 171));
+ TEST_INSTRUCTION("6263FDCE00CCAB" , k(k6).z().vpermq(zmm25, zmm4, 171));
+ TEST_INSTRUCTION("6263FD4800CC7B" , vpermq(zmm25, zmm4, 123));
+ TEST_INSTRUCTION("6263FD4800097B" , vpermq(zmm25, zmmword_ptr(rcx), 123));
+ TEST_INSTRUCTION("6223FD48008CF0230100007B" , vpermq(zmm25, zmmword_ptr(rax, r14, 3, 291), 123));
+ TEST_INSTRUCTION("6263FD5800097B" , vpermq(zmm25, qword_ptr(rcx)._1to8(), 123));
+ TEST_INSTRUCTION("6263FD48004A7F7B" , vpermq(zmm25, zmmword_ptr(rdx, 8128), 123));
+ TEST_INSTRUCTION("6263FD48008A002000007B" , vpermq(zmm25, zmmword_ptr(rdx, 8192), 123));
+ TEST_INSTRUCTION("6263FD48004A807B" , vpermq(zmm25, zmmword_ptr(rdx, -8192), 123));
+ TEST_INSTRUCTION("6263FD48008AC0DFFFFF7B" , vpermq(zmm25, zmmword_ptr(rdx, -8256), 123));
+ TEST_INSTRUCTION("6263FD58004A7F7B" , vpermq(zmm25, qword_ptr(rdx, 1016)._1to8(), 123));
+ TEST_INSTRUCTION("6263FD58008A000400007B" , vpermq(zmm25, qword_ptr(rdx, 1024)._1to8(), 123));
+ TEST_INSTRUCTION("6263FD58004A807B" , vpermq(zmm25, qword_ptr(rdx, -1024)._1to8(), 123));
+ TEST_INSTRUCTION("6263FD58008AF8FBFFFF7B" , vpermq(zmm25, qword_ptr(rdx, -1032)._1to8(), 123));
+ TEST_INSTRUCTION("62F27D488909" , vpexpandd(zmm1, zmmword_ptr(rcx)));
+ TEST_INSTRUCTION("62F27D4F8909" , k(k7).vpexpandd(zmm1, zmmword_ptr(rcx)));
+ TEST_INSTRUCTION("62F27DCF8909" , k(k7).z().vpexpandd(zmm1, zmmword_ptr(rcx)));
+ TEST_INSTRUCTION("62B27D48898CF023010000" , vpexpandd(zmm1, zmmword_ptr(rax, r14, 3, 291)));
+ TEST_INSTRUCTION("62F27D48894A7F" , vpexpandd(zmm1, zmmword_ptr(rdx, 508)));
+ TEST_INSTRUCTION("62F27D48898A00020000" , vpexpandd(zmm1, zmmword_ptr(rdx, 512)));
+ TEST_INSTRUCTION("62F27D48894A80" , vpexpandd(zmm1, zmmword_ptr(rdx, -512)));
+ TEST_INSTRUCTION("62F27D48898AFCFDFFFF" , vpexpandd(zmm1, zmmword_ptr(rdx, -516)));
+ TEST_INSTRUCTION("62827D4889D9" , vpexpandd(zmm19, zmm25));
+ TEST_INSTRUCTION("62827D4D89D9" , k(k5).vpexpandd(zmm19, zmm25));
+ TEST_INSTRUCTION("62827DCD89D9" , k(k5).z().vpexpandd(zmm19, zmm25));
+ TEST_INSTRUCTION("6262FD488901" , vpexpandq(zmm24, zmmword_ptr(rcx)));
+ TEST_INSTRUCTION("6262FD4F8901" , k(k7).vpexpandq(zmm24, zmmword_ptr(rcx)));
+ TEST_INSTRUCTION("6262FDCF8901" , k(k7).z().vpexpandq(zmm24, zmmword_ptr(rcx)));
+ TEST_INSTRUCTION("6222FD488984F023010000" , vpexpandq(zmm24, zmmword_ptr(rax, r14, 3, 291)));
+ TEST_INSTRUCTION("6262FD4889427F" , vpexpandq(zmm24, zmmword_ptr(rdx, 1016)));
+ TEST_INSTRUCTION("6262FD48898200040000" , vpexpandq(zmm24, zmmword_ptr(rdx, 1024)));
+ TEST_INSTRUCTION("6262FD48894280" , vpexpandq(zmm24, zmmword_ptr(rdx, -1024)));
+ TEST_INSTRUCTION("6262FD488982F8FBFFFF" , vpexpandq(zmm24, zmmword_ptr(rdx, -1032)));
+ TEST_INSTRUCTION("6252FD4889F8" , vpexpandq(zmm15, zmm8));
+ TEST_INSTRUCTION("6252FD4F89F8" , k(k7).vpexpandq(zmm15, zmm8));
+ TEST_INSTRUCTION("6252FDCF89F8" , k(k7).z().vpexpandq(zmm15, zmm8));
+ TEST_INSTRUCTION("62B23D483DF0" , vpmaxsd(zmm6, zmm8, zmm16));
+ TEST_INSTRUCTION("62B23D4B3DF0" , k(k3).vpmaxsd(zmm6, zmm8, zmm16));
+ TEST_INSTRUCTION("62B23DCB3DF0" , k(k3).z().vpmaxsd(zmm6, zmm8, zmm16));
+ TEST_INSTRUCTION("62F23D483D31" , vpmaxsd(zmm6, zmm8, zmmword_ptr(rcx)));
+ TEST_INSTRUCTION("62B23D483DB4F023010000" , vpmaxsd(zmm6, zmm8, zmmword_ptr(rax, r14, 3, 291)));
+ TEST_INSTRUCTION("62F23D583D31" , vpmaxsd(zmm6, zmm8, dword_ptr(rcx)._1to16()));
+ TEST_INSTRUCTION("62F23D483D727F" , vpmaxsd(zmm6, zmm8, zmmword_ptr(rdx, 8128)));
+ TEST_INSTRUCTION("62F23D483DB200200000" , vpmaxsd(zmm6, zmm8, zmmword_ptr(rdx, 8192)));
+ TEST_INSTRUCTION("62F23D483D7280" , vpmaxsd(zmm6, zmm8, zmmword_ptr(rdx, -8192)));
+ TEST_INSTRUCTION("62F23D483DB2C0DFFFFF" , vpmaxsd(zmm6, zmm8, zmmword_ptr(rdx, -8256)));
+ TEST_INSTRUCTION("62F23D583D727F" , vpmaxsd(zmm6, zmm8, dword_ptr(rdx, 508)._1to16()));
+ TEST_INSTRUCTION("62F23D583DB200020000" , vpmaxsd(zmm6, zmm8, dword_ptr(rdx, 512)._1to16()));
+ TEST_INSTRUCTION("62F23D583D7280" , vpmaxsd(zmm6, zmm8, dword_ptr(rdx, -512)._1to16()));
+ TEST_INSTRUCTION("62F23D583DB2FCFDFFFF" , vpmaxsd(zmm6, zmm8, dword_ptr(rdx, -516)._1to16()));
+ TEST_INSTRUCTION("62F2CD483DF1" , vpmaxsq(zmm6, zmm6, zmm1));
+ TEST_INSTRUCTION("62F2CD4F3DF1" , k(k7).vpmaxsq(zmm6, zmm6, zmm1));
+ TEST_INSTRUCTION("62F2CDCF3DF1" , k(k7).z().vpmaxsq(zmm6, zmm6, zmm1));
+ TEST_INSTRUCTION("62F2CD483D31" , vpmaxsq(zmm6, zmm6, zmmword_ptr(rcx)));
+ TEST_INSTRUCTION("62B2CD483DB4F023010000" , vpmaxsq(zmm6, zmm6, zmmword_ptr(rax, r14, 3, 291)));
+ TEST_INSTRUCTION("62F2CD583D31" , vpmaxsq(zmm6, zmm6, qword_ptr(rcx)._1to8()));
+ TEST_INSTRUCTION("62F2CD483D727F" , vpmaxsq(zmm6, zmm6, zmmword_ptr(rdx, 8128)));
+ TEST_INSTRUCTION("62F2CD483DB200200000" , vpmaxsq(zmm6, zmm6, zmmword_ptr(rdx, 8192)));
+ TEST_INSTRUCTION("62F2CD483D7280" , vpmaxsq(zmm6, zmm6, zmmword_ptr(rdx, -8192)));
+ TEST_INSTRUCTION("62F2CD483DB2C0DFFFFF" , vpmaxsq(zmm6, zmm6, zmmword_ptr(rdx, -8256)));
+ TEST_INSTRUCTION("62F2CD583D727F" , vpmaxsq(zmm6, zmm6, qword_ptr(rdx, 1016)._1to8()));
+ TEST_INSTRUCTION("62F2CD583DB200040000" , vpmaxsq(zmm6, zmm6, qword_ptr(rdx, 1024)._1to8()));
+ TEST_INSTRUCTION("62F2CD583D7280" , vpmaxsq(zmm6, zmm6, qword_ptr(rdx, -1024)._1to8()));
+ TEST_INSTRUCTION("62F2CD583DB2F8FBFFFF" , vpmaxsq(zmm6, zmm6, qword_ptr(rdx, -1032)._1to8()));
+ TEST_INSTRUCTION("628245483FC9" , vpmaxud(zmm17, zmm7, zmm25));
+ TEST_INSTRUCTION("6282454D3FC9" , k(k5).vpmaxud(zmm17, zmm7, zmm25));
+ TEST_INSTRUCTION("628245CD3FC9" , k(k5).z().vpmaxud(zmm17, zmm7, zmm25));
+ TEST_INSTRUCTION("62E245483F09" , vpmaxud(zmm17, zmm7, zmmword_ptr(rcx)));
+ TEST_INSTRUCTION("62A245483F8CF023010000" , vpmaxud(zmm17, zmm7, zmmword_ptr(rax, r14, 3, 291)));
+ TEST_INSTRUCTION("62E245583F09" , vpmaxud(zmm17, zmm7, dword_ptr(rcx)._1to16()));
+ TEST_INSTRUCTION("62E245483F4A7F" , vpmaxud(zmm17, zmm7, zmmword_ptr(rdx, 8128)));
+ TEST_INSTRUCTION("62E245483F8A00200000" , vpmaxud(zmm17, zmm7, zmmword_ptr(rdx, 8192)));
+ TEST_INSTRUCTION("62E245483F4A80" , vpmaxud(zmm17, zmm7, zmmword_ptr(rdx, -8192)));
+ TEST_INSTRUCTION("62E245483F8AC0DFFFFF" , vpmaxud(zmm17, zmm7, zmmword_ptr(rdx, -8256)));
+ TEST_INSTRUCTION("62E245583F4A7F" , vpmaxud(zmm17, zmm7, dword_ptr(rdx, 508)._1to16()));
+ TEST_INSTRUCTION("62E245583F8A00020000" , vpmaxud(zmm17, zmm7, dword_ptr(rdx, 512)._1to16()));
+ TEST_INSTRUCTION("62E245583F4A80" , vpmaxud(zmm17, zmm7, dword_ptr(rdx, -512)._1to16()));
+ TEST_INSTRUCTION("62E245583F8AFCFDFFFF" , vpmaxud(zmm17, zmm7, dword_ptr(rdx, -516)._1to16()));
+ TEST_INSTRUCTION("6202CD403FF1" , vpmaxuq(zmm30, zmm22, zmm25));
+ TEST_INSTRUCTION("6202CD413FF1" , k(k1).vpmaxuq(zmm30, zmm22, zmm25));
+ TEST_INSTRUCTION("6202CDC13FF1" , k(k1).z().vpmaxuq(zmm30, zmm22, zmm25));
+ TEST_INSTRUCTION("6262CD403F31" , vpmaxuq(zmm30, zmm22, zmmword_ptr(rcx)));
+ TEST_INSTRUCTION("6222CD403FB4F023010000" , vpmaxuq(zmm30, zmm22, zmmword_ptr(rax, r14, 3, 291)));
+ TEST_INSTRUCTION("6262CD503F31" , vpmaxuq(zmm30, zmm22, qword_ptr(rcx)._1to8()));
+ TEST_INSTRUCTION("6262CD403F727F" , vpmaxuq(zmm30, zmm22, zmmword_ptr(rdx, 8128)));
+ TEST_INSTRUCTION("6262CD403FB200200000" , vpmaxuq(zmm30, zmm22, zmmword_ptr(rdx, 8192)));
+ TEST_INSTRUCTION("6262CD403F7280" , vpmaxuq(zmm30, zmm22, zmmword_ptr(rdx, -8192)));
+ TEST_INSTRUCTION("6262CD403FB2C0DFFFFF" , vpmaxuq(zmm30, zmm22, zmmword_ptr(rdx, -8256)));
+ TEST_INSTRUCTION("6262CD503F727F" , vpmaxuq(zmm30, zmm22, qword_ptr(rdx, 1016)._1to8()));
+ TEST_INSTRUCTION("6262CD503FB200040000" , vpmaxuq(zmm30, zmm22, qword_ptr(rdx, 1024)._1to8()));
+ TEST_INSTRUCTION("6262CD503F7280" , vpmaxuq(zmm30, zmm22, qword_ptr(rdx, -1024)._1to8()));
+ TEST_INSTRUCTION("6262CD503FB2F8FBFFFF" , vpmaxuq(zmm30, zmm22, qword_ptr(rdx, -1032)._1to8()));
+ TEST_INSTRUCTION("62927D4039D0" , vpminsd(zmm2, zmm16, zmm24));
+ TEST_INSTRUCTION("62927D4339D0" , k(k3).vpminsd(zmm2, zmm16, zmm24));
+ TEST_INSTRUCTION("62927DC339D0" , k(k3).z().vpminsd(zmm2, zmm16, zmm24));
+ TEST_INSTRUCTION("62F27D403911" , vpminsd(zmm2, zmm16, zmmword_ptr(rcx)));
+ TEST_INSTRUCTION("62B27D403994F023010000" , vpminsd(zmm2, zmm16, zmmword_ptr(rax, r14, 3, 291)));
+ TEST_INSTRUCTION("62F27D503911" , vpminsd(zmm2, zmm16, dword_ptr(rcx)._1to16()));
+ TEST_INSTRUCTION("62F27D4039527F" , vpminsd(zmm2, zmm16, zmmword_ptr(rdx, 8128)));
+ TEST_INSTRUCTION("62F27D40399200200000" , vpminsd(zmm2, zmm16, zmmword_ptr(rdx, 8192)));
+ TEST_INSTRUCTION("62F27D40395280" , vpminsd(zmm2, zmm16, zmmword_ptr(rdx, -8192)));
+ TEST_INSTRUCTION("62F27D403992C0DFFFFF" , vpminsd(zmm2, zmm16, zmmword_ptr(rdx, -8256)));
+ TEST_INSTRUCTION("62F27D5039527F" , vpminsd(zmm2, zmm16, dword_ptr(rdx, 508)._1to16()));
+ TEST_INSTRUCTION("62F27D50399200020000" , vpminsd(zmm2, zmm16, dword_ptr(rdx, 512)._1to16()));
+ TEST_INSTRUCTION("62F27D50395280" , vpminsd(zmm2, zmm16, dword_ptr(rdx, -512)._1to16()));
+ TEST_INSTRUCTION("62F27D503992FCFDFFFF" , vpminsd(zmm2, zmm16, dword_ptr(rdx, -516)._1to16()));
+ TEST_INSTRUCTION("62A2FD4039E1" , vpminsq(zmm20, zmm16, zmm17));
+ TEST_INSTRUCTION("62A2FD4639E1" , k(k6).vpminsq(zmm20, zmm16, zmm17));
+ TEST_INSTRUCTION("62A2FDC639E1" , k(k6).z().vpminsq(zmm20, zmm16, zmm17));
+ TEST_INSTRUCTION("62E2FD403921" , vpminsq(zmm20, zmm16, zmmword_ptr(rcx)));
+ TEST_INSTRUCTION("62A2FD4039A4F023010000" , vpminsq(zmm20, zmm16, zmmword_ptr(rax, r14, 3, 291)));
+ TEST_INSTRUCTION("62E2FD503921" , vpminsq(zmm20, zmm16, qword_ptr(rcx)._1to8()));
+ TEST_INSTRUCTION("62E2FD4039627F" , vpminsq(zmm20, zmm16, zmmword_ptr(rdx, 8128)));
+ TEST_INSTRUCTION("62E2FD4039A200200000" , vpminsq(zmm20, zmm16, zmmword_ptr(rdx, 8192)));
+ TEST_INSTRUCTION("62E2FD40396280" , vpminsq(zmm20, zmm16, zmmword_ptr(rdx, -8192)));
+ TEST_INSTRUCTION("62E2FD4039A2C0DFFFFF" , vpminsq(zmm20, zmm16, zmmword_ptr(rdx, -8256)));
+ TEST_INSTRUCTION("62E2FD5039627F" , vpminsq(zmm20, zmm16, qword_ptr(rdx, 1016)._1to8()));
+ TEST_INSTRUCTION("62E2FD5039A200040000" , vpminsq(zmm20, zmm16, qword_ptr(rdx, 1024)._1to8()));
+ TEST_INSTRUCTION("62E2FD50396280" , vpminsq(zmm20, zmm16, qword_ptr(rdx, -1024)._1to8()));
+ TEST_INSTRUCTION("62E2FD5039A2F8FBFFFF" , vpminsq(zmm20, zmm16, qword_ptr(rdx, -1032)._1to8()));
+ TEST_INSTRUCTION("62B245403BDC" , vpminud(zmm3, zmm23, zmm20));
+ TEST_INSTRUCTION("62B245433BDC" , k(k3).vpminud(zmm3, zmm23, zmm20));
+ TEST_INSTRUCTION("62B245C33BDC" , k(k3).z().vpminud(zmm3, zmm23, zmm20));
+ TEST_INSTRUCTION("62F245403B19" , vpminud(zmm3, zmm23, zmmword_ptr(rcx)));
+ TEST_INSTRUCTION("62B245403B9CF023010000" , vpminud(zmm3, zmm23, zmmword_ptr(rax, r14, 3, 291)));
+ TEST_INSTRUCTION("62F245503B19" , vpminud(zmm3, zmm23, dword_ptr(rcx)._1to16()));
+ TEST_INSTRUCTION("62F245403B5A7F" , vpminud(zmm3, zmm23, zmmword_ptr(rdx, 8128)));
+ TEST_INSTRUCTION("62F245403B9A00200000" , vpminud(zmm3, zmm23, zmmword_ptr(rdx, 8192)));
+ TEST_INSTRUCTION("62F245403B5A80" , vpminud(zmm3, zmm23, zmmword_ptr(rdx, -8192)));
+ TEST_INSTRUCTION("62F245403B9AC0DFFFFF" , vpminud(zmm3, zmm23, zmmword_ptr(rdx, -8256)));
+ TEST_INSTRUCTION("62F245503B5A7F" , vpminud(zmm3, zmm23, dword_ptr(rdx, 508)._1to16()));
+ TEST_INSTRUCTION("62F245503B9A00020000" , vpminud(zmm3, zmm23, dword_ptr(rdx, 512)._1to16()));
+ TEST_INSTRUCTION("62F245503B5A80" , vpminud(zmm3, zmm23, dword_ptr(rdx, -512)._1to16()));
+ TEST_INSTRUCTION("62F245503B9AFCFDFFFF" , vpminud(zmm3, zmm23, dword_ptr(rdx, -516)._1to16()));
+ TEST_INSTRUCTION("6272AD403BDF" , vpminuq(zmm11, zmm26, zmm7));
+ TEST_INSTRUCTION("6272AD453BDF" , k(k5).vpminuq(zmm11, zmm26, zmm7));
+ TEST_INSTRUCTION("6272ADC53BDF" , k(k5).z().vpminuq(zmm11, zmm26, zmm7));
+ TEST_INSTRUCTION("6272AD403B19" , vpminuq(zmm11, zmm26, zmmword_ptr(rcx)));
+ TEST_INSTRUCTION("6232AD403B9CF023010000" , vpminuq(zmm11, zmm26, zmmword_ptr(rax, r14, 3, 291)));
+ TEST_INSTRUCTION("6272AD503B19" , vpminuq(zmm11, zmm26, qword_ptr(rcx)._1to8()));
+ TEST_INSTRUCTION("6272AD403B5A7F" , vpminuq(zmm11, zmm26, zmmword_ptr(rdx, 8128)));
+ TEST_INSTRUCTION("6272AD403B9A00200000" , vpminuq(zmm11, zmm26, zmmword_ptr(rdx, 8192)));
+ TEST_INSTRUCTION("6272AD403B5A80" , vpminuq(zmm11, zmm26, zmmword_ptr(rdx, -8192)));
+ TEST_INSTRUCTION("6272AD403B9AC0DFFFFF" , vpminuq(zmm11, zmm26, zmmword_ptr(rdx, -8256)));
+ TEST_INSTRUCTION("6272AD503B5A7F" , vpminuq(zmm11, zmm26, qword_ptr(rdx, 1016)._1to8()));
+ TEST_INSTRUCTION("6272AD503B9A00040000" , vpminuq(zmm11, zmm26, qword_ptr(rdx, 1024)._1to8()));
+ TEST_INSTRUCTION("6272AD503B5A80" , vpminuq(zmm11, zmm26, qword_ptr(rdx, -1024)._1to8()));
+ TEST_INSTRUCTION("6272AD503B9AF8FBFFFF" , vpminuq(zmm11, zmm26, qword_ptr(rdx, -1032)._1to8()));
+ TEST_INSTRUCTION("62627D4821DF" , vpmovsxbd(zmm27, xmm7));
+ TEST_INSTRUCTION("62627D4D21DF" , k(k5).vpmovsxbd(zmm27, xmm7));
+ TEST_INSTRUCTION("62627DCD21DF" , k(k5).z().vpmovsxbd(zmm27, xmm7));
+ TEST_INSTRUCTION("62627D482119" , vpmovsxbd(zmm27, xmmword_ptr(rcx)));
+ TEST_INSTRUCTION("62227D48219CF023010000" , vpmovsxbd(zmm27, xmmword_ptr(rax, r14, 3, 291)));
+ TEST_INSTRUCTION("62627D48215A7F" , vpmovsxbd(zmm27, xmmword_ptr(rdx, 2032)));
+ TEST_INSTRUCTION("62627D48219A00080000" , vpmovsxbd(zmm27, xmmword_ptr(rdx, 2048)));
+ TEST_INSTRUCTION("62627D48215A80" , vpmovsxbd(zmm27, xmmword_ptr(rdx, -2048)));
+ TEST_INSTRUCTION("62627D48219AF0F7FFFF" , vpmovsxbd(zmm27, xmmword_ptr(rdx, -2064)));
+ TEST_INSTRUCTION("62527D4822DB" , vpmovsxbq(zmm11, xmm11));
+ TEST_INSTRUCTION("62527D4D22DB" , k(k5).vpmovsxbq(zmm11, xmm11));
+ TEST_INSTRUCTION("62527DCD22DB" , k(k5).z().vpmovsxbq(zmm11, xmm11));
+ TEST_INSTRUCTION("62727D482219" , vpmovsxbq(zmm11, qword_ptr(rcx)));
+ TEST_INSTRUCTION("62327D48229CF023010000" , vpmovsxbq(zmm11, qword_ptr(rax, r14, 3, 291)));
+ TEST_INSTRUCTION("62727D48225A7F" , vpmovsxbq(zmm11, qword_ptr(rdx, 1016)));
+ TEST_INSTRUCTION("62727D48229A00040000" , vpmovsxbq(zmm11, qword_ptr(rdx, 1024)));
+ TEST_INSTRUCTION("62727D48225A80" , vpmovsxbq(zmm11, qword_ptr(rdx, -1024)));
+ TEST_INSTRUCTION("62727D48229AF8FBFFFF" , vpmovsxbq(zmm11, qword_ptr(rdx, -1032)));
+ TEST_INSTRUCTION("62027D4825D5" , vpmovsxdq(zmm26, ymm29));
+ TEST_INSTRUCTION("62027D4925D5" , k(k1).vpmovsxdq(zmm26, ymm29));
+ TEST_INSTRUCTION("62027DC925D5" , k(k1).z().vpmovsxdq(zmm26, ymm29));
+ TEST_INSTRUCTION("62627D482511" , vpmovsxdq(zmm26, ymmword_ptr(rcx)));
+ TEST_INSTRUCTION("62227D482594F023010000" , vpmovsxdq(zmm26, ymmword_ptr(rax, r14, 3, 291)));
+ TEST_INSTRUCTION("62627D4825527F" , vpmovsxdq(zmm26, ymmword_ptr(rdx, 4064)));
+ TEST_INSTRUCTION("62627D48259200100000" , vpmovsxdq(zmm26, ymmword_ptr(rdx, 4096)));
+ TEST_INSTRUCTION("62627D48255280" , vpmovsxdq(zmm26, ymmword_ptr(rdx, -4096)));
+ TEST_INSTRUCTION("62627D482592E0EFFFFF" , vpmovsxdq(zmm26, ymmword_ptr(rdx, -4128)));
+ TEST_INSTRUCTION("62C27D4823FB" , vpmovsxwd(zmm23, ymm11));
+ TEST_INSTRUCTION("62C27D4A23FB" , k(k2).vpmovsxwd(zmm23, ymm11));
+ TEST_INSTRUCTION("62C27DCA23FB" , k(k2).z().vpmovsxwd(zmm23, ymm11));
+ TEST_INSTRUCTION("62E27D482339" , vpmovsxwd(zmm23, ymmword_ptr(rcx)));
+ TEST_INSTRUCTION("62A27D4823BCF023010000" , vpmovsxwd(zmm23, ymmword_ptr(rax, r14, 3, 291)));
+ TEST_INSTRUCTION("62E27D48237A7F" , vpmovsxwd(zmm23, ymmword_ptr(rdx, 4064)));
+ TEST_INSTRUCTION("62E27D4823BA00100000" , vpmovsxwd(zmm23, ymmword_ptr(rdx, 4096)));
+ TEST_INSTRUCTION("62E27D48237A80" , vpmovsxwd(zmm23, ymmword_ptr(rdx, -4096)));
+ TEST_INSTRUCTION("62E27D4823BAE0EFFFFF" , vpmovsxwd(zmm23, ymmword_ptr(rdx, -4128)));
+ TEST_INSTRUCTION("62027D4824C9" , vpmovsxwq(zmm25, xmm25));
+ TEST_INSTRUCTION("62027D4C24C9" , k(k4).vpmovsxwq(zmm25, xmm25));
+ TEST_INSTRUCTION("62027DCC24C9" , k(k4).z().vpmovsxwq(zmm25, xmm25));
+ TEST_INSTRUCTION("62627D482409" , vpmovsxwq(zmm25, xmmword_ptr(rcx)));
+ TEST_INSTRUCTION("62227D48248CF023010000" , vpmovsxwq(zmm25, xmmword_ptr(rax, r14, 3, 291)));
+ TEST_INSTRUCTION("62627D48244A7F" , vpmovsxwq(zmm25, xmmword_ptr(rdx, 2032)));
+ TEST_INSTRUCTION("62627D48248A00080000" , vpmovsxwq(zmm25, xmmword_ptr(rdx, 2048)));
+ TEST_INSTRUCTION("62627D48244A80" , vpmovsxwq(zmm25, xmmword_ptr(rdx, -2048)));
+ TEST_INSTRUCTION("62627D48248AF0F7FFFF" , vpmovsxwq(zmm25, xmmword_ptr(rdx, -2064)));
+ TEST_INSTRUCTION("62827D4831D1" , vpmovzxbd(zmm18, xmm25));
+ TEST_INSTRUCTION("62827D4F31D1" , k(k7).vpmovzxbd(zmm18, xmm25));
+ TEST_INSTRUCTION("62827DCF31D1" , k(k7).z().vpmovzxbd(zmm18, xmm25));
+ TEST_INSTRUCTION("62E27D483111" , vpmovzxbd(zmm18, xmmword_ptr(rcx)));
+ TEST_INSTRUCTION("62A27D483194F023010000" , vpmovzxbd(zmm18, xmmword_ptr(rax, r14, 3, 291)));
+ TEST_INSTRUCTION("62E27D4831527F" , vpmovzxbd(zmm18, xmmword_ptr(rdx, 2032)));
+ TEST_INSTRUCTION("62E27D48319200080000" , vpmovzxbd(zmm18, xmmword_ptr(rdx, 2048)));
+ TEST_INSTRUCTION("62E27D48315280" , vpmovzxbd(zmm18, xmmword_ptr(rdx, -2048)));
+ TEST_INSTRUCTION("62E27D483192F0F7FFFF" , vpmovzxbd(zmm18, xmmword_ptr(rdx, -2064)));
+ TEST_INSTRUCTION("62D27D4832EF" , vpmovzxbq(zmm5, xmm15));
+ TEST_INSTRUCTION("62D27D4932EF" , k(k1).vpmovzxbq(zmm5, xmm15));
+ TEST_INSTRUCTION("62D27DC932EF" , k(k1).z().vpmovzxbq(zmm5, xmm15));
+ TEST_INSTRUCTION("62F27D483229" , vpmovzxbq(zmm5, qword_ptr(rcx)));
+ TEST_INSTRUCTION("62B27D4832ACF023010000" , vpmovzxbq(zmm5, qword_ptr(rax, r14, 3, 291)));
+ TEST_INSTRUCTION("62F27D48326A7F" , vpmovzxbq(zmm5, qword_ptr(rdx, 1016)));
+ TEST_INSTRUCTION("62F27D4832AA00040000" , vpmovzxbq(zmm5, qword_ptr(rdx, 1024)));
+ TEST_INSTRUCTION("62F27D48326A80" , vpmovzxbq(zmm5, qword_ptr(rdx, -1024)));
+ TEST_INSTRUCTION("62F27D4832AAF8FBFFFF" , vpmovzxbq(zmm5, qword_ptr(rdx, -1032)));
+ TEST_INSTRUCTION("62E27D4835E4" , vpmovzxdq(zmm20, ymm4));
+ TEST_INSTRUCTION("62E27D4B35E4" , k(k3).vpmovzxdq(zmm20, ymm4));
+ TEST_INSTRUCTION("62E27DCB35E4" , k(k3).z().vpmovzxdq(zmm20, ymm4));
+ TEST_INSTRUCTION("62E27D483521" , vpmovzxdq(zmm20, ymmword_ptr(rcx)));
+ TEST_INSTRUCTION("62A27D4835A4F023010000" , vpmovzxdq(zmm20, ymmword_ptr(rax, r14, 3, 291)));
+ TEST_INSTRUCTION("62E27D4835627F" , vpmovzxdq(zmm20, ymmword_ptr(rdx, 4064)));
+ TEST_INSTRUCTION("62E27D4835A200100000" , vpmovzxdq(zmm20, ymmword_ptr(rdx, 4096)));
+ TEST_INSTRUCTION("62E27D48356280" , vpmovzxdq(zmm20, ymmword_ptr(rdx, -4096)));
+ TEST_INSTRUCTION("62E27D4835A2E0EFFFFF" , vpmovzxdq(zmm20, ymmword_ptr(rdx, -4128)));
+ TEST_INSTRUCTION("62727D4833C6" , vpmovzxwd(zmm8, ymm6));
+ TEST_INSTRUCTION("62727D4F33C6" , k(k7).vpmovzxwd(zmm8, ymm6));
+ TEST_INSTRUCTION("62727DCF33C6" , k(k7).z().vpmovzxwd(zmm8, ymm6));
+ TEST_INSTRUCTION("62727D483301" , vpmovzxwd(zmm8, ymmword_ptr(rcx)));
+ TEST_INSTRUCTION("62327D483384F023010000" , vpmovzxwd(zmm8, ymmword_ptr(rax, r14, 3, 291)));
+ TEST_INSTRUCTION("62727D4833427F" , vpmovzxwd(zmm8, ymmword_ptr(rdx, 4064)));
+ TEST_INSTRUCTION("62727D48338200100000" , vpmovzxwd(zmm8, ymmword_ptr(rdx, 4096)));
+ TEST_INSTRUCTION("62727D48334280" , vpmovzxwd(zmm8, ymmword_ptr(rdx, -4096)));
+ TEST_INSTRUCTION("62727D483382E0EFFFFF" , vpmovzxwd(zmm8, ymmword_ptr(rdx, -4128)));
+ TEST_INSTRUCTION("62D27D4834EF" , vpmovzxwq(zmm5, xmm15));
+ TEST_INSTRUCTION("62D27D4F34EF" , k(k7).vpmovzxwq(zmm5, xmm15));
+ TEST_INSTRUCTION("62D27DCF34EF" , k(k7).z().vpmovzxwq(zmm5, xmm15));
+ TEST_INSTRUCTION("62F27D483429" , vpmovzxwq(zmm5, xmmword_ptr(rcx)));
+ TEST_INSTRUCTION("62B27D4834ACF023010000" , vpmovzxwq(zmm5, xmmword_ptr(rax, r14, 3, 291)));
+ TEST_INSTRUCTION("62F27D48346A7F" , vpmovzxwq(zmm5, xmmword_ptr(rdx, 2032)));
+ TEST_INSTRUCTION("62F27D4834AA00080000" , vpmovzxwq(zmm5, xmmword_ptr(rdx, 2048)));
+ TEST_INSTRUCTION("62F27D48346A80" , vpmovzxwq(zmm5, xmmword_ptr(rdx, -2048)));
+ TEST_INSTRUCTION("62F27D4834AAF0F7FFFF" , vpmovzxwq(zmm5, xmmword_ptr(rdx, -2064)));
+ TEST_INSTRUCTION("6242B54828E9" , vpmuldq(zmm29, zmm9, zmm9));
+ TEST_INSTRUCTION("6242B54D28E9" , k(k5).vpmuldq(zmm29, zmm9, zmm9));
+ TEST_INSTRUCTION("6242B5CD28E9" , k(k5).z().vpmuldq(zmm29, zmm9, zmm9));
+ TEST_INSTRUCTION("6262B5482829" , vpmuldq(zmm29, zmm9, zmmword_ptr(rcx)));
+ TEST_INSTRUCTION("6222B54828ACF023010000" , vpmuldq(zmm29, zmm9, zmmword_ptr(rax, r14, 3, 291)));
+ TEST_INSTRUCTION("6262B5582829" , vpmuldq(zmm29, zmm9, qword_ptr(rcx)._1to8()));
+ TEST_INSTRUCTION("6262B548286A7F" , vpmuldq(zmm29, zmm9, zmmword_ptr(rdx, 8128)));
+ TEST_INSTRUCTION("6262B54828AA00200000" , vpmuldq(zmm29, zmm9, zmmword_ptr(rdx, 8192)));
+ TEST_INSTRUCTION("6262B548286A80" , vpmuldq(zmm29, zmm9, zmmword_ptr(rdx, -8192)));
+ TEST_INSTRUCTION("6262B54828AAC0DFFFFF" , vpmuldq(zmm29, zmm9, zmmword_ptr(rdx, -8256)));
+ TEST_INSTRUCTION("6262B558286A7F" , vpmuldq(zmm29, zmm9, qword_ptr(rdx, 1016)._1to8()));
+ TEST_INSTRUCTION("6262B55828AA00040000" , vpmuldq(zmm29, zmm9, qword_ptr(rdx, 1024)._1to8()));
+ TEST_INSTRUCTION("6262B558286A80" , vpmuldq(zmm29, zmm9, qword_ptr(rdx, -1024)._1to8()));
+ TEST_INSTRUCTION("6262B55828AAF8FBFFFF" , vpmuldq(zmm29, zmm9, qword_ptr(rdx, -1032)._1to8()));
+ TEST_INSTRUCTION("6272654840E2" , vpmulld(zmm12, zmm3, zmm2));
+ TEST_INSTRUCTION("6272654E40E2" , k(k6).vpmulld(zmm12, zmm3, zmm2));
+ TEST_INSTRUCTION("627265CE40E2" , k(k6).z().vpmulld(zmm12, zmm3, zmm2));
+ TEST_INSTRUCTION("627265484021" , vpmulld(zmm12, zmm3, zmmword_ptr(rcx)));
+ TEST_INSTRUCTION("6232654840A4F023010000" , vpmulld(zmm12, zmm3, zmmword_ptr(rax, r14, 3, 291)));
+ TEST_INSTRUCTION("627265584021" , vpmulld(zmm12, zmm3, dword_ptr(rcx)._1to16()));
+ TEST_INSTRUCTION("6272654840627F" , vpmulld(zmm12, zmm3, zmmword_ptr(rdx, 8128)));
+ TEST_INSTRUCTION("6272654840A200200000" , vpmulld(zmm12, zmm3, zmmword_ptr(rdx, 8192)));
+ TEST_INSTRUCTION("62726548406280" , vpmulld(zmm12, zmm3, zmmword_ptr(rdx, -8192)));
+ TEST_INSTRUCTION("6272654840A2C0DFFFFF" , vpmulld(zmm12, zmm3, zmmword_ptr(rdx, -8256)));
+ TEST_INSTRUCTION("6272655840627F" , vpmulld(zmm12, zmm3, dword_ptr(rdx, 508)._1to16()));
+ TEST_INSTRUCTION("6272655840A200020000" , vpmulld(zmm12, zmm3, dword_ptr(rdx, 512)._1to16()));
+ TEST_INSTRUCTION("62726558406280" , vpmulld(zmm12, zmm3, dword_ptr(rdx, -512)._1to16()));
+ TEST_INSTRUCTION("6272655840A2FCFDFFFF" , vpmulld(zmm12, zmm3, dword_ptr(rdx, -516)._1to16()));
+ TEST_INSTRUCTION("62C1D548F4F9" , vpmuludq(zmm23, zmm5, zmm9));
+ TEST_INSTRUCTION("62C1D54CF4F9" , k(k4).vpmuludq(zmm23, zmm5, zmm9));
+ TEST_INSTRUCTION("62C1D5CCF4F9" , k(k4).z().vpmuludq(zmm23, zmm5, zmm9));
+ TEST_INSTRUCTION("62E1D548F439" , vpmuludq(zmm23, zmm5, zmmword_ptr(rcx)));
+ TEST_INSTRUCTION("62A1D548F4BCF023010000" , vpmuludq(zmm23, zmm5, zmmword_ptr(rax, r14, 3, 291)));
+ TEST_INSTRUCTION("62E1D558F439" , vpmuludq(zmm23, zmm5, qword_ptr(rcx)._1to8()));
+ TEST_INSTRUCTION("62E1D548F47A7F" , vpmuludq(zmm23, zmm5, zmmword_ptr(rdx, 8128)));
+ TEST_INSTRUCTION("62E1D548F4BA00200000" , vpmuludq(zmm23, zmm5, zmmword_ptr(rdx, 8192)));
+ TEST_INSTRUCTION("62E1D548F47A80" , vpmuludq(zmm23, zmm5, zmmword_ptr(rdx, -8192)));
+ TEST_INSTRUCTION("62E1D548F4BAC0DFFFFF" , vpmuludq(zmm23, zmm5, zmmword_ptr(rdx, -8256)));
+ TEST_INSTRUCTION("62E1D558F47A7F" , vpmuludq(zmm23, zmm5, qword_ptr(rdx, 1016)._1to8()));
+ TEST_INSTRUCTION("62E1D558F4BA00040000" , vpmuludq(zmm23, zmm5, qword_ptr(rdx, 1024)._1to8()));
+ TEST_INSTRUCTION("62E1D558F47A80" , vpmuludq(zmm23, zmm5, qword_ptr(rdx, -1024)._1to8()));
+ TEST_INSTRUCTION("62E1D558F4BAF8FBFFFF" , vpmuludq(zmm23, zmm5, qword_ptr(rdx, -1032)._1to8()));
+ TEST_INSTRUCTION("62A16D48EBFC" , vpord(zmm23, zmm2, zmm20));
+ TEST_INSTRUCTION("62A16D4AEBFC" , k(k2).vpord(zmm23, zmm2, zmm20));
+ TEST_INSTRUCTION("62A16DCAEBFC" , k(k2).z().vpord(zmm23, zmm2, zmm20));
+ TEST_INSTRUCTION("62E16D48EB39" , vpord(zmm23, zmm2, zmmword_ptr(rcx)));
+ TEST_INSTRUCTION("62A16D48EBBCF023010000" , vpord(zmm23, zmm2, zmmword_ptr(rax, r14, 3, 291)));
+ TEST_INSTRUCTION("62E16D58EB39" , vpord(zmm23, zmm2, dword_ptr(rcx)._1to16()));
+ TEST_INSTRUCTION("62E16D48EB7A7F" , vpord(zmm23, zmm2, zmmword_ptr(rdx, 8128)));
+ TEST_INSTRUCTION("62E16D48EBBA00200000" , vpord(zmm23, zmm2, zmmword_ptr(rdx, 8192)));
+ TEST_INSTRUCTION("62E16D48EB7A80" , vpord(zmm23, zmm2, zmmword_ptr(rdx, -8192)));
+ TEST_INSTRUCTION("62E16D48EBBAC0DFFFFF" , vpord(zmm23, zmm2, zmmword_ptr(rdx, -8256)));
+ TEST_INSTRUCTION("62E16D58EB7A7F" , vpord(zmm23, zmm2, dword_ptr(rdx, 508)._1to16()));
+ TEST_INSTRUCTION("62E16D58EBBA00020000" , vpord(zmm23, zmm2, dword_ptr(rdx, 512)._1to16()));
+ TEST_INSTRUCTION("62E16D58EB7A80" , vpord(zmm23, zmm2, dword_ptr(rdx, -512)._1to16()));
+ TEST_INSTRUCTION("62E16D58EBBAFCFDFFFF" , vpord(zmm23, zmm2, dword_ptr(rdx, -516)._1to16()));
+ TEST_INSTRUCTION("62F1AD48EBCE" , vporq(zmm1, zmm10, zmm6));
+ TEST_INSTRUCTION("62F1AD4AEBCE" , k(k2).vporq(zmm1, zmm10, zmm6));
+ TEST_INSTRUCTION("62F1ADCAEBCE" , k(k2).z().vporq(zmm1, zmm10, zmm6));
+ TEST_INSTRUCTION("62F1AD48EB09" , vporq(zmm1, zmm10, zmmword_ptr(rcx)));
+ TEST_INSTRUCTION("62B1AD48EB8CF023010000" , vporq(zmm1, zmm10, zmmword_ptr(rax, r14, 3, 291)));
+ TEST_INSTRUCTION("62F1AD58EB09" , vporq(zmm1, zmm10, qword_ptr(rcx)._1to8()));
+ TEST_INSTRUCTION("62F1AD48EB4A7F" , vporq(zmm1, zmm10, zmmword_ptr(rdx, 8128)));
+ TEST_INSTRUCTION("62F1AD48EB8A00200000" , vporq(zmm1, zmm10, zmmword_ptr(rdx, 8192)));
+ TEST_INSTRUCTION("62F1AD48EB4A80" , vporq(zmm1, zmm10, zmmword_ptr(rdx, -8192)));
+ TEST_INSTRUCTION("62F1AD48EB8AC0DFFFFF" , vporq(zmm1, zmm10, zmmword_ptr(rdx, -8256)));
+ TEST_INSTRUCTION("62F1AD58EB4A7F" , vporq(zmm1, zmm10, qword_ptr(rdx, 1016)._1to8()));
+ TEST_INSTRUCTION("62F1AD58EB8A00040000" , vporq(zmm1, zmm10, qword_ptr(rdx, 1024)._1to8()));
+ TEST_INSTRUCTION("62F1AD58EB4A80" , vporq(zmm1, zmm10, qword_ptr(rdx, -1024)._1to8()));
+ TEST_INSTRUCTION("62F1AD58EB8AF8FBFFFF" , vporq(zmm1, zmm10, qword_ptr(rdx, -1032)._1to8()));
+ TEST_INSTRUCTION("62817D4870D9AB" , vpshufd(zmm19, zmm25, 171));
+ TEST_INSTRUCTION("62817D4E70D9AB" , k(k6).vpshufd(zmm19, zmm25, 171));
+ TEST_INSTRUCTION("62817DCE70D9AB" , k(k6).z().vpshufd(zmm19, zmm25, 171));
+ TEST_INSTRUCTION("62817D4870D97B" , vpshufd(zmm19, zmm25, 123));
+ TEST_INSTRUCTION("62E17D4870197B" , vpshufd(zmm19, zmmword_ptr(rcx), 123));
+ TEST_INSTRUCTION("62A17D48709CF0230100007B" , vpshufd(zmm19, zmmword_ptr(rax, r14, 3, 291), 123));
+ TEST_INSTRUCTION("62E17D5870197B" , vpshufd(zmm19, dword_ptr(rcx)._1to16(), 123));
+ TEST_INSTRUCTION("62E17D48705A7F7B" , vpshufd(zmm19, zmmword_ptr(rdx, 8128), 123));
+ TEST_INSTRUCTION("62E17D48709A002000007B" , vpshufd(zmm19, zmmword_ptr(rdx, 8192), 123));
+ TEST_INSTRUCTION("62E17D48705A807B" , vpshufd(zmm19, zmmword_ptr(rdx, -8192), 123));
+ TEST_INSTRUCTION("62E17D48709AC0DFFFFF7B" , vpshufd(zmm19, zmmword_ptr(rdx, -8256), 123));
+ TEST_INSTRUCTION("62E17D58705A7F7B" , vpshufd(zmm19, dword_ptr(rdx, 508)._1to16(), 123));
+ TEST_INSTRUCTION("62E17D58709A000200007B" , vpshufd(zmm19, dword_ptr(rdx, 512)._1to16(), 123));
+ TEST_INSTRUCTION("62E17D58705A807B" , vpshufd(zmm19, dword_ptr(rdx, -512)._1to16(), 123));
+ TEST_INSTRUCTION("62E17D58709AFCFDFFFF7B" , vpshufd(zmm19, dword_ptr(rdx, -516)._1to16(), 123));
+ TEST_INSTRUCTION("62E14D48F2CB" , vpslld(zmm17, zmm6, xmm3));
+ TEST_INSTRUCTION("62E14D4BF2CB" , k(k3).vpslld(zmm17, zmm6, xmm3));
+ TEST_INSTRUCTION("62E14DCBF2CB" , k(k3).z().vpslld(zmm17, zmm6, xmm3));
+ TEST_INSTRUCTION("62E14D48F209" , vpslld(zmm17, zmm6, xmmword_ptr(rcx)));
+ TEST_INSTRUCTION("62A14D48F28CF023010000" , vpslld(zmm17, zmm6, xmmword_ptr(rax, r14, 3, 291)));
+ TEST_INSTRUCTION("62E14D48F24A7F" , vpslld(zmm17, zmm6, xmmword_ptr(rdx, 2032)));
+ TEST_INSTRUCTION("62E14D48F28A00080000" , vpslld(zmm17, zmm6, xmmword_ptr(rdx, 2048)));
+ TEST_INSTRUCTION("62E14D48F24A80" , vpslld(zmm17, zmm6, xmmword_ptr(rdx, -2048)));
+ TEST_INSTRUCTION("62E14D48F28AF0F7FFFF" , vpslld(zmm17, zmm6, xmmword_ptr(rdx, -2064)));
+ TEST_INSTRUCTION("6221F540F3D7" , vpsllq(zmm26, zmm17, xmm23));
+ TEST_INSTRUCTION("6221F546F3D7" , k(k6).vpsllq(zmm26, zmm17, xmm23));
+ TEST_INSTRUCTION("6221F5C6F3D7" , k(k6).z().vpsllq(zmm26, zmm17, xmm23));
+ TEST_INSTRUCTION("6261F540F311" , vpsllq(zmm26, zmm17, xmmword_ptr(rcx)));
+ TEST_INSTRUCTION("6221F540F394F023010000" , vpsllq(zmm26, zmm17, xmmword_ptr(rax, r14, 3, 291)));
+ TEST_INSTRUCTION("6261F540F3527F" , vpsllq(zmm26, zmm17, xmmword_ptr(rdx, 2032)));
+ TEST_INSTRUCTION("6261F540F39200080000" , vpsllq(zmm26, zmm17, xmmword_ptr(rdx, 2048)));
+ TEST_INSTRUCTION("6261F540F35280" , vpsllq(zmm26, zmm17, xmmword_ptr(rdx, -2048)));
+ TEST_INSTRUCTION("6261F540F392F0F7FFFF" , vpsllq(zmm26, zmm17, xmmword_ptr(rdx, -2064)));
+ TEST_INSTRUCTION("62321D4847D6" , vpsllvd(zmm10, zmm12, zmm22));
+ TEST_INSTRUCTION("62321D4E47D6" , k(k6).vpsllvd(zmm10, zmm12, zmm22));
+ TEST_INSTRUCTION("62321DCE47D6" , k(k6).z().vpsllvd(zmm10, zmm12, zmm22));
+ TEST_INSTRUCTION("62721D484711" , vpsllvd(zmm10, zmm12, zmmword_ptr(rcx)));
+ TEST_INSTRUCTION("62321D484794F023010000" , vpsllvd(zmm10, zmm12, zmmword_ptr(rax, r14, 3, 291)));
+ TEST_INSTRUCTION("62721D584711" , vpsllvd(zmm10, zmm12, dword_ptr(rcx)._1to16()));
+ TEST_INSTRUCTION("62721D4847527F" , vpsllvd(zmm10, zmm12, zmmword_ptr(rdx, 8128)));
+ TEST_INSTRUCTION("62721D48479200200000" , vpsllvd(zmm10, zmm12, zmmword_ptr(rdx, 8192)));
+ TEST_INSTRUCTION("62721D48475280" , vpsllvd(zmm10, zmm12, zmmword_ptr(rdx, -8192)));
+ TEST_INSTRUCTION("62721D484792C0DFFFFF" , vpsllvd(zmm10, zmm12, zmmword_ptr(rdx, -8256)));
+ TEST_INSTRUCTION("62721D5847527F" , vpsllvd(zmm10, zmm12, dword_ptr(rdx, 508)._1to16()));
+ TEST_INSTRUCTION("62721D58479200020000" , vpsllvd(zmm10, zmm12, dword_ptr(rdx, 512)._1to16()));
+ TEST_INSTRUCTION("62721D58475280" , vpsllvd(zmm10, zmm12, dword_ptr(rdx, -512)._1to16()));
+ TEST_INSTRUCTION("62721D584792FCFDFFFF" , vpsllvd(zmm10, zmm12, dword_ptr(rdx, -516)._1to16()));
+ TEST_INSTRUCTION("6282D54847C2" , vpsllvq(zmm16, zmm5, zmm26));
+ TEST_INSTRUCTION("6282D54D47C2" , k(k5).vpsllvq(zmm16, zmm5, zmm26));
+ TEST_INSTRUCTION("6282D5CD47C2" , k(k5).z().vpsllvq(zmm16, zmm5, zmm26));
+ TEST_INSTRUCTION("62E2D5484701" , vpsllvq(zmm16, zmm5, zmmword_ptr(rcx)));
+ TEST_INSTRUCTION("62A2D5484784F023010000" , vpsllvq(zmm16, zmm5, zmmword_ptr(rax, r14, 3, 291)));
+ TEST_INSTRUCTION("62E2D5584701" , vpsllvq(zmm16, zmm5, qword_ptr(rcx)._1to8()));
+ TEST_INSTRUCTION("62E2D54847427F" , vpsllvq(zmm16, zmm5, zmmword_ptr(rdx, 8128)));
+ TEST_INSTRUCTION("62E2D548478200200000" , vpsllvq(zmm16, zmm5, zmmword_ptr(rdx, 8192)));
+ TEST_INSTRUCTION("62E2D548474280" , vpsllvq(zmm16, zmm5, zmmword_ptr(rdx, -8192)));
+ TEST_INSTRUCTION("62E2D5484782C0DFFFFF" , vpsllvq(zmm16, zmm5, zmmword_ptr(rdx, -8256)));
+ TEST_INSTRUCTION("62E2D55847427F" , vpsllvq(zmm16, zmm5, qword_ptr(rdx, 1016)._1to8()));
+ TEST_INSTRUCTION("62E2D558478200040000" , vpsllvq(zmm16, zmm5, qword_ptr(rdx, 1024)._1to8()));
+ TEST_INSTRUCTION("62E2D558474280" , vpsllvq(zmm16, zmm5, qword_ptr(rdx, -1024)._1to8()));
+ TEST_INSTRUCTION("62E2D5584782F8FBFFFF" , vpsllvq(zmm16, zmm5, qword_ptr(rdx, -1032)._1to8()));
+ TEST_INSTRUCTION("62E10D48E2D6" , vpsrad(zmm18, zmm14, xmm6));
+ TEST_INSTRUCTION("62E10D49E2D6" , k(k1).vpsrad(zmm18, zmm14, xmm6));
+ TEST_INSTRUCTION("62E10DC9E2D6" , k(k1).z().vpsrad(zmm18, zmm14, xmm6));
+ TEST_INSTRUCTION("62E10D48E211" , vpsrad(zmm18, zmm14, xmmword_ptr(rcx)));
+ TEST_INSTRUCTION("62A10D48E294F023010000" , vpsrad(zmm18, zmm14, xmmword_ptr(rax, r14, 3, 291)));
+ TEST_INSTRUCTION("62E10D48E2527F" , vpsrad(zmm18, zmm14, xmmword_ptr(rdx, 2032)));
+ TEST_INSTRUCTION("62E10D48E29200080000" , vpsrad(zmm18, zmm14, xmmword_ptr(rdx, 2048)));
+ TEST_INSTRUCTION("62E10D48E25280" , vpsrad(zmm18, zmm14, xmmword_ptr(rdx, -2048)));
+ TEST_INSTRUCTION("62E10D48E292F0F7FFFF" , vpsrad(zmm18, zmm14, xmmword_ptr(rdx, -2064)));
+ TEST_INSTRUCTION("62A1F540E2EE" , vpsraq(zmm21, zmm17, xmm22));
+ TEST_INSTRUCTION("62A1F543E2EE" , k(k3).vpsraq(zmm21, zmm17, xmm22));
+ TEST_INSTRUCTION("62A1F5C3E2EE" , k(k3).z().vpsraq(zmm21, zmm17, xmm22));
+ TEST_INSTRUCTION("62E1F540E229" , vpsraq(zmm21, zmm17, xmmword_ptr(rcx)));
+ TEST_INSTRUCTION("62A1F540E2ACF023010000" , vpsraq(zmm21, zmm17, xmmword_ptr(rax, r14, 3, 291)));
+ TEST_INSTRUCTION("62E1F540E26A7F" , vpsraq(zmm21, zmm17, xmmword_ptr(rdx, 2032)));
+ TEST_INSTRUCTION("62E1F540E2AA00080000" , vpsraq(zmm21, zmm17, xmmword_ptr(rdx, 2048)));
+ TEST_INSTRUCTION("62E1F540E26A80" , vpsraq(zmm21, zmm17, xmmword_ptr(rdx, -2048)));
+ TEST_INSTRUCTION("62E1F540E2AAF0F7FFFF" , vpsraq(zmm21, zmm17, xmmword_ptr(rdx, -2064)));
+ TEST_INSTRUCTION("6222154046E9" , vpsravd(zmm29, zmm29, zmm17));
+ TEST_INSTRUCTION("6222154246E9" , k(k2).vpsravd(zmm29, zmm29, zmm17));
+ TEST_INSTRUCTION("622215C246E9" , k(k2).z().vpsravd(zmm29, zmm29, zmm17));
+ TEST_INSTRUCTION("626215404629" , vpsravd(zmm29, zmm29, zmmword_ptr(rcx)));
+ TEST_INSTRUCTION("6222154046ACF023010000" , vpsravd(zmm29, zmm29, zmmword_ptr(rax, r14, 3, 291)));
+ TEST_INSTRUCTION("626215504629" , vpsravd(zmm29, zmm29, dword_ptr(rcx)._1to16()));
+ TEST_INSTRUCTION("62621540466A7F" , vpsravd(zmm29, zmm29, zmmword_ptr(rdx, 8128)));
+ TEST_INSTRUCTION("6262154046AA00200000" , vpsravd(zmm29, zmm29, zmmword_ptr(rdx, 8192)));
+ TEST_INSTRUCTION("62621540466A80" , vpsravd(zmm29, zmm29, zmmword_ptr(rdx, -8192)));
+ TEST_INSTRUCTION("6262154046AAC0DFFFFF" , vpsravd(zmm29, zmm29, zmmword_ptr(rdx, -8256)));
+ TEST_INSTRUCTION("62621550466A7F" , vpsravd(zmm29, zmm29, dword_ptr(rdx, 508)._1to16()));
+ TEST_INSTRUCTION("6262155046AA00020000" , vpsravd(zmm29, zmm29, dword_ptr(rdx, 512)._1to16()));
+ TEST_INSTRUCTION("62621550466A80" , vpsravd(zmm29, zmm29, dword_ptr(rdx, -512)._1to16()));
+ TEST_INSTRUCTION("6262155046AAFCFDFFFF" , vpsravd(zmm29, zmm29, dword_ptr(rdx, -516)._1to16()));
+ TEST_INSTRUCTION("62E2DD4046F2" , vpsravq(zmm22, zmm20, zmm2));
+ TEST_INSTRUCTION("62E2DD4246F2" , k(k2).vpsravq(zmm22, zmm20, zmm2));
+ TEST_INSTRUCTION("62E2DDC246F2" , k(k2).z().vpsravq(zmm22, zmm20, zmm2));
+ TEST_INSTRUCTION("62E2DD404631" , vpsravq(zmm22, zmm20, zmmword_ptr(rcx)));
+ TEST_INSTRUCTION("62A2DD4046B4F023010000" , vpsravq(zmm22, zmm20, zmmword_ptr(rax, r14, 3, 291)));
+ TEST_INSTRUCTION("62E2DD504631" , vpsravq(zmm22, zmm20, qword_ptr(rcx)._1to8()));
+ TEST_INSTRUCTION("62E2DD4046727F" , vpsravq(zmm22, zmm20, zmmword_ptr(rdx, 8128)));
+ TEST_INSTRUCTION("62E2DD4046B200200000" , vpsravq(zmm22, zmm20, zmmword_ptr(rdx, 8192)));
+ TEST_INSTRUCTION("62E2DD40467280" , vpsravq(zmm22, zmm20, zmmword_ptr(rdx, -8192)));
+ TEST_INSTRUCTION("62E2DD4046B2C0DFFFFF" , vpsravq(zmm22, zmm20, zmmword_ptr(rdx, -8256)));
+ TEST_INSTRUCTION("62E2DD5046727F" , vpsravq(zmm22, zmm20, qword_ptr(rdx, 1016)._1to8()));
+ TEST_INSTRUCTION("62E2DD5046B200040000" , vpsravq(zmm22, zmm20, qword_ptr(rdx, 1024)._1to8()));
+ TEST_INSTRUCTION("62E2DD50467280" , vpsravq(zmm22, zmm20, qword_ptr(rdx, -1024)._1to8()));
+ TEST_INSTRUCTION("62E2DD5046B2F8FBFFFF" , vpsravq(zmm22, zmm20, qword_ptr(rdx, -1032)._1to8()));
+ TEST_INSTRUCTION("62917540D2C9" , vpsrld(zmm1, zmm17, xmm25));
+ TEST_INSTRUCTION("62917544D2C9" , k(k4).vpsrld(zmm1, zmm17, xmm25));
+ TEST_INSTRUCTION("629175C4D2C9" , k(k4).z().vpsrld(zmm1, zmm17, xmm25));
+ TEST_INSTRUCTION("62F17540D209" , vpsrld(zmm1, zmm17, xmmword_ptr(rcx)));
+ TEST_INSTRUCTION("62B17540D28CF023010000" , vpsrld(zmm1, zmm17, xmmword_ptr(rax, r14, 3, 291)));
+ TEST_INSTRUCTION("62F17540D24A7F" , vpsrld(zmm1, zmm17, xmmword_ptr(rdx, 2032)));
+ TEST_INSTRUCTION("62F17540D28A00080000" , vpsrld(zmm1, zmm17, xmmword_ptr(rdx, 2048)));
+ TEST_INSTRUCTION("62F17540D24A80" , vpsrld(zmm1, zmm17, xmmword_ptr(rdx, -2048)));
+ TEST_INSTRUCTION("62F17540D28AF0F7FFFF" , vpsrld(zmm1, zmm17, xmmword_ptr(rdx, -2064)));
+ TEST_INSTRUCTION("6271A548D3CB" , vpsrlq(zmm9, zmm11, xmm3));
+ TEST_INSTRUCTION("6271A54DD3CB" , k(k5).vpsrlq(zmm9, zmm11, xmm3));
+ TEST_INSTRUCTION("6271A5CDD3CB" , k(k5).z().vpsrlq(zmm9, zmm11, xmm3));
+ TEST_INSTRUCTION("6271A548D309" , vpsrlq(zmm9, zmm11, xmmword_ptr(rcx)));
+ TEST_INSTRUCTION("6231A548D38CF023010000" , vpsrlq(zmm9, zmm11, xmmword_ptr(rax, r14, 3, 291)));
+ TEST_INSTRUCTION("6271A548D34A7F" , vpsrlq(zmm9, zmm11, xmmword_ptr(rdx, 2032)));
+ TEST_INSTRUCTION("6271A548D38A00080000" , vpsrlq(zmm9, zmm11, xmmword_ptr(rdx, 2048)));
+ TEST_INSTRUCTION("6271A548D34A80" , vpsrlq(zmm9, zmm11, xmmword_ptr(rdx, -2048)));
+ TEST_INSTRUCTION("6271A548D38AF0F7FFFF" , vpsrlq(zmm9, zmm11, xmmword_ptr(rdx, -2064)));
+ TEST_INSTRUCTION("62120D4845C4" , vpsrlvd(zmm8, zmm14, zmm28));
+ TEST_INSTRUCTION("62120D4C45C4" , k(k4).vpsrlvd(zmm8, zmm14, zmm28));
+ TEST_INSTRUCTION("62120DCC45C4" , k(k4).z().vpsrlvd(zmm8, zmm14, zmm28));
+ TEST_INSTRUCTION("62720D484501" , vpsrlvd(zmm8, zmm14, zmmword_ptr(rcx)));
+ TEST_INSTRUCTION("62320D484584F023010000" , vpsrlvd(zmm8, zmm14, zmmword_ptr(rax, r14, 3, 291)));
+ TEST_INSTRUCTION("62720D584501" , vpsrlvd(zmm8, zmm14, dword_ptr(rcx)._1to16()));
+ TEST_INSTRUCTION("62720D4845427F" , vpsrlvd(zmm8, zmm14, zmmword_ptr(rdx, 8128)));
+ TEST_INSTRUCTION("62720D48458200200000" , vpsrlvd(zmm8, zmm14, zmmword_ptr(rdx, 8192)));
+ TEST_INSTRUCTION("62720D48454280" , vpsrlvd(zmm8, zmm14, zmmword_ptr(rdx, -8192)));
+ TEST_INSTRUCTION("62720D484582C0DFFFFF" , vpsrlvd(zmm8, zmm14, zmmword_ptr(rdx, -8256)));
+ TEST_INSTRUCTION("62720D5845427F" , vpsrlvd(zmm8, zmm14, dword_ptr(rdx, 508)._1to16()));
+ TEST_INSTRUCTION("62720D58458200020000" , vpsrlvd(zmm8, zmm14, dword_ptr(rdx, 512)._1to16()));
+ TEST_INSTRUCTION("62720D58454280" , vpsrlvd(zmm8, zmm14, dword_ptr(rdx, -512)._1to16()));
+ TEST_INSTRUCTION("62720D584582FCFDFFFF" , vpsrlvd(zmm8, zmm14, dword_ptr(rdx, -516)._1to16()));
+ TEST_INSTRUCTION("6282C54845E2" , vpsrlvq(zmm20, zmm7, zmm26));
+ TEST_INSTRUCTION("6282C54D45E2" , k(k5).vpsrlvq(zmm20, zmm7, zmm26));
+ TEST_INSTRUCTION("6282C5CD45E2" , k(k5).z().vpsrlvq(zmm20, zmm7, zmm26));
+ TEST_INSTRUCTION("62E2C5484521" , vpsrlvq(zmm20, zmm7, zmmword_ptr(rcx)));
+ TEST_INSTRUCTION("62A2C54845A4F023010000" , vpsrlvq(zmm20, zmm7, zmmword_ptr(rax, r14, 3, 291)));
+ TEST_INSTRUCTION("62E2C5584521" , vpsrlvq(zmm20, zmm7, qword_ptr(rcx)._1to8()));
+ TEST_INSTRUCTION("62E2C54845627F" , vpsrlvq(zmm20, zmm7, zmmword_ptr(rdx, 8128)));
+ TEST_INSTRUCTION("62E2C54845A200200000" , vpsrlvq(zmm20, zmm7, zmmword_ptr(rdx, 8192)));
+ TEST_INSTRUCTION("62E2C548456280" , vpsrlvq(zmm20, zmm7, zmmword_ptr(rdx, -8192)));
+ TEST_INSTRUCTION("62E2C54845A2C0DFFFFF" , vpsrlvq(zmm20, zmm7, zmmword_ptr(rdx, -8256)));
+ TEST_INSTRUCTION("62E2C55845627F" , vpsrlvq(zmm20, zmm7, qword_ptr(rdx, 1016)._1to8()));
+ TEST_INSTRUCTION("62E2C55845A200040000" , vpsrlvq(zmm20, zmm7, qword_ptr(rdx, 1024)._1to8()));
+ TEST_INSTRUCTION("62E2C558456280" , vpsrlvq(zmm20, zmm7, qword_ptr(rdx, -1024)._1to8()));
+ TEST_INSTRUCTION("62E2C55845A2F8FBFFFF" , vpsrlvq(zmm20, zmm7, qword_ptr(rdx, -1032)._1to8()));
+ TEST_INSTRUCTION("62F1654872D5AB" , vpsrld(zmm3, zmm5, 171));
+ TEST_INSTRUCTION("62F1654C72D5AB" , k(k4).vpsrld(zmm3, zmm5, 171));
+ TEST_INSTRUCTION("62F165CC72D5AB" , k(k4).z().vpsrld(zmm3, zmm5, 171));
+ TEST_INSTRUCTION("62F1654872D57B" , vpsrld(zmm3, zmm5, 123));
+ TEST_INSTRUCTION("62F1654872117B" , vpsrld(zmm3, zmmword_ptr(rcx), 123));
+ TEST_INSTRUCTION("62B165487294F0230100007B" , vpsrld(zmm3, zmmword_ptr(rax, r14, 3, 291), 123));
+ TEST_INSTRUCTION("62F1655872117B" , vpsrld(zmm3, dword_ptr(rcx)._1to16(), 123));
+ TEST_INSTRUCTION("62F1654872527F7B" , vpsrld(zmm3, zmmword_ptr(rdx, 8128), 123));
+ TEST_INSTRUCTION("62F165487292002000007B" , vpsrld(zmm3, zmmword_ptr(rdx, 8192), 123));
+ TEST_INSTRUCTION("62F165487252807B" , vpsrld(zmm3, zmmword_ptr(rdx, -8192), 123));
+ TEST_INSTRUCTION("62F165487292C0DFFFFF7B" , vpsrld(zmm3, zmmword_ptr(rdx, -8256), 123));
+ TEST_INSTRUCTION("62F1655872527F7B" , vpsrld(zmm3, dword_ptr(rdx, 508)._1to16(), 123));
+ TEST_INSTRUCTION("62F165587292000200007B" , vpsrld(zmm3, dword_ptr(rdx, 512)._1to16(), 123));
+ TEST_INSTRUCTION("62F165587252807B" , vpsrld(zmm3, dword_ptr(rdx, -512)._1to16(), 123));
+ TEST_INSTRUCTION("62F165587292FCFDFFFF7B" , vpsrld(zmm3, dword_ptr(rdx, -516)._1to16(), 123));
+ TEST_INSTRUCTION("6291ED4073D1AB" , vpsrlq(zmm18, zmm25, 171));
+ TEST_INSTRUCTION("6291ED4173D1AB" , k(k1).vpsrlq(zmm18, zmm25, 171));
+ TEST_INSTRUCTION("6291EDC173D1AB" , k(k1).z().vpsrlq(zmm18, zmm25, 171));
+ TEST_INSTRUCTION("6291ED4073D17B" , vpsrlq(zmm18, zmm25, 123));
+ TEST_INSTRUCTION("62F1ED4073117B" , vpsrlq(zmm18, zmmword_ptr(rcx), 123));
+ TEST_INSTRUCTION("62B1ED407394F0230100007B" , vpsrlq(zmm18, zmmword_ptr(rax, r14, 3, 291), 123));
+ TEST_INSTRUCTION("62F1ED5073117B" , vpsrlq(zmm18, qword_ptr(rcx)._1to8(), 123));
+ TEST_INSTRUCTION("62F1ED4073527F7B" , vpsrlq(zmm18, zmmword_ptr(rdx, 8128), 123));
+ TEST_INSTRUCTION("62F1ED407392002000007B" , vpsrlq(zmm18, zmmword_ptr(rdx, 8192), 123));
+ TEST_INSTRUCTION("62F1ED407352807B" , vpsrlq(zmm18, zmmword_ptr(rdx, -8192), 123));
+ TEST_INSTRUCTION("62F1ED407392C0DFFFFF7B" , vpsrlq(zmm18, zmmword_ptr(rdx, -8256), 123));
+ TEST_INSTRUCTION("62F1ED5073527F7B" , vpsrlq(zmm18, qword_ptr(rdx, 1016)._1to8(), 123));
+ TEST_INSTRUCTION("62F1ED507392000400007B" , vpsrlq(zmm18, qword_ptr(rdx, 1024)._1to8(), 123));
+ TEST_INSTRUCTION("62F1ED507352807B" , vpsrlq(zmm18, qword_ptr(rdx, -1024)._1to8(), 123));
+ TEST_INSTRUCTION("62F1ED507392F8FBFFFF7B" , vpsrlq(zmm18, qword_ptr(rdx, -1032)._1to8(), 123));
+ TEST_INSTRUCTION("62F11D40FAFF" , vpsubd(zmm7, zmm28, zmm7));
+ TEST_INSTRUCTION("62F11D43FAFF" , k(k3).vpsubd(zmm7, zmm28, zmm7));
+ TEST_INSTRUCTION("62F11DC3FAFF" , k(k3).z().vpsubd(zmm7, zmm28, zmm7));
+ TEST_INSTRUCTION("62F11D40FA39" , vpsubd(zmm7, zmm28, zmmword_ptr(rcx)));
+ TEST_INSTRUCTION("62B11D40FABCF023010000" , vpsubd(zmm7, zmm28, zmmword_ptr(rax, r14, 3, 291)));
+ TEST_INSTRUCTION("62F11D50FA39" , vpsubd(zmm7, zmm28, dword_ptr(rcx)._1to16()));
+ TEST_INSTRUCTION("62F11D40FA7A7F" , vpsubd(zmm7, zmm28, zmmword_ptr(rdx, 8128)));
+ TEST_INSTRUCTION("62F11D40FABA00200000" , vpsubd(zmm7, zmm28, zmmword_ptr(rdx, 8192)));
+ TEST_INSTRUCTION("62F11D40FA7A80" , vpsubd(zmm7, zmm28, zmmword_ptr(rdx, -8192)));
+ TEST_INSTRUCTION("62F11D40FABAC0DFFFFF" , vpsubd(zmm7, zmm28, zmmword_ptr(rdx, -8256)));
+ TEST_INSTRUCTION("62F11D50FA7A7F" , vpsubd(zmm7, zmm28, dword_ptr(rdx, 508)._1to16()));
+ TEST_INSTRUCTION("62F11D50FABA00020000" , vpsubd(zmm7, zmm28, dword_ptr(rdx, 512)._1to16()));
+ TEST_INSTRUCTION("62F11D50FA7A80" , vpsubd(zmm7, zmm28, dword_ptr(rdx, -512)._1to16()));
+ TEST_INSTRUCTION("62F11D50FABAFCFDFFFF" , vpsubd(zmm7, zmm28, dword_ptr(rdx, -516)._1to16()));
+ TEST_INSTRUCTION("62219D40FBE9" , vpsubq(zmm29, zmm28, zmm17));
+ TEST_INSTRUCTION("62219D42FBE9" , k(k2).vpsubq(zmm29, zmm28, zmm17));
+ TEST_INSTRUCTION("62219DC2FBE9" , k(k2).z().vpsubq(zmm29, zmm28, zmm17));
+ TEST_INSTRUCTION("62619D40FB29" , vpsubq(zmm29, zmm28, zmmword_ptr(rcx)));
+ TEST_INSTRUCTION("62219D40FBACF023010000" , vpsubq(zmm29, zmm28, zmmword_ptr(rax, r14, 3, 291)));
+ TEST_INSTRUCTION("62619D50FB29" , vpsubq(zmm29, zmm28, qword_ptr(rcx)._1to8()));
+ TEST_INSTRUCTION("62619D40FB6A7F" , vpsubq(zmm29, zmm28, zmmword_ptr(rdx, 8128)));
+ TEST_INSTRUCTION("62619D40FBAA00200000" , vpsubq(zmm29, zmm28, zmmword_ptr(rdx, 8192)));
+ TEST_INSTRUCTION("62619D40FB6A80" , vpsubq(zmm29, zmm28, zmmword_ptr(rdx, -8192)));
+ TEST_INSTRUCTION("62619D40FBAAC0DFFFFF" , vpsubq(zmm29, zmm28, zmmword_ptr(rdx, -8256)));
+ TEST_INSTRUCTION("62619D50FB6A7F" , vpsubq(zmm29, zmm28, qword_ptr(rdx, 1016)._1to8()));
+ TEST_INSTRUCTION("62619D50FBAA00040000" , vpsubq(zmm29, zmm28, qword_ptr(rdx, 1024)._1to8()));
+ TEST_INSTRUCTION("62619D50FB6A80" , vpsubq(zmm29, zmm28, qword_ptr(rdx, -1024)._1to8()));
+ TEST_INSTRUCTION("62619D50FBAAF8FBFFFF" , vpsubq(zmm29, zmm28, qword_ptr(rdx, -1032)._1to8()));
+ TEST_INSTRUCTION("62B21D4827D0" , vptestmd(k2, zmm12, zmm16));
+ TEST_INSTRUCTION("62B21D4927D0" , k(k1).vptestmd(k2, zmm12, zmm16));
+ TEST_INSTRUCTION("62F21D482711" , vptestmd(k2, zmm12, zmmword_ptr(rcx)));
+ TEST_INSTRUCTION("62B21D482794F023010000" , vptestmd(k2, zmm12, zmmword_ptr(rax, r14, 3, 291)));
+ TEST_INSTRUCTION("62F21D582711" , vptestmd(k2, zmm12, dword_ptr(rcx)._1to16()));
+ TEST_INSTRUCTION("62F21D4827527F" , vptestmd(k2, zmm12, zmmword_ptr(rdx, 8128)));
+ TEST_INSTRUCTION("62F21D48279200200000" , vptestmd(k2, zmm12, zmmword_ptr(rdx, 8192)));
+ TEST_INSTRUCTION("62F21D48275280" , vptestmd(k2, zmm12, zmmword_ptr(rdx, -8192)));
+ TEST_INSTRUCTION("62F21D482792C0DFFFFF" , vptestmd(k2, zmm12, zmmword_ptr(rdx, -8256)));
+ TEST_INSTRUCTION("62F21D5827527F" , vptestmd(k2, zmm12, dword_ptr(rdx, 508)._1to16()));
+ TEST_INSTRUCTION("62F21D58279200020000" , vptestmd(k2, zmm12, dword_ptr(rdx, 512)._1to16()));
+ TEST_INSTRUCTION("62F21D58275280" , vptestmd(k2, zmm12, dword_ptr(rdx, -512)._1to16()));
+ TEST_INSTRUCTION("62F21D582792FCFDFFFF" , vptestmd(k2, zmm12, dword_ptr(rdx, -516)._1to16()));
+ TEST_INSTRUCTION("62B2CD4827ED" , vptestmq(k5, zmm6, zmm21));
+ TEST_INSTRUCTION("62B2CD4D27ED" , k(k5).vptestmq(k5, zmm6, zmm21));
+ TEST_INSTRUCTION("62F2CD482729" , vptestmq(k5, zmm6, zmmword_ptr(rcx)));
+ TEST_INSTRUCTION("62B2CD4827ACF023010000" , vptestmq(k5, zmm6, zmmword_ptr(rax, r14, 3, 291)));
+ TEST_INSTRUCTION("62F2CD582729" , vptestmq(k5, zmm6, qword_ptr(rcx)._1to8()));
+ TEST_INSTRUCTION("62F2CD48276A7F" , vptestmq(k5, zmm6, zmmword_ptr(rdx, 8128)));
+ TEST_INSTRUCTION("62F2CD4827AA00200000" , vptestmq(k5, zmm6, zmmword_ptr(rdx, 8192)));
+ TEST_INSTRUCTION("62F2CD48276A80" , vptestmq(k5, zmm6, zmmword_ptr(rdx, -8192)));
+ TEST_INSTRUCTION("62F2CD4827AAC0DFFFFF" , vptestmq(k5, zmm6, zmmword_ptr(rdx, -8256)));
+ TEST_INSTRUCTION("62F2CD58276A7F" , vptestmq(k5, zmm6, qword_ptr(rdx, 1016)._1to8()));
+ TEST_INSTRUCTION("62F2CD5827AA00040000" , vptestmq(k5, zmm6, qword_ptr(rdx, 1024)._1to8()));
+ TEST_INSTRUCTION("62F2CD58276A80" , vptestmq(k5, zmm6, qword_ptr(rdx, -1024)._1to8()));
+ TEST_INSTRUCTION("62F2CD5827AAF8FBFFFF" , vptestmq(k5, zmm6, qword_ptr(rdx, -1032)._1to8()));
+ TEST_INSTRUCTION("62D15D486AF5" , vpunpckhdq(zmm6, zmm4, zmm13));
+ TEST_INSTRUCTION("62D15D4D6AF5" , k(k5).vpunpckhdq(zmm6, zmm4, zmm13));
+ TEST_INSTRUCTION("62D15DCD6AF5" , k(k5).z().vpunpckhdq(zmm6, zmm4, zmm13));
+ TEST_INSTRUCTION("62F15D486A31" , vpunpckhdq(zmm6, zmm4, zmmword_ptr(rcx)));
+ TEST_INSTRUCTION("62B15D486AB4F023010000" , vpunpckhdq(zmm6, zmm4, zmmword_ptr(rax, r14, 3, 291)));
+ TEST_INSTRUCTION("62F15D586A31" , vpunpckhdq(zmm6, zmm4, dword_ptr(rcx)._1to16()));
+ TEST_INSTRUCTION("62F15D486A727F" , vpunpckhdq(zmm6, zmm4, zmmword_ptr(rdx, 8128)));
+ TEST_INSTRUCTION("62F15D486AB200200000" , vpunpckhdq(zmm6, zmm4, zmmword_ptr(rdx, 8192)));
+ TEST_INSTRUCTION("62F15D486A7280" , vpunpckhdq(zmm6, zmm4, zmmword_ptr(rdx, -8192)));
+ TEST_INSTRUCTION("62F15D486AB2C0DFFFFF" , vpunpckhdq(zmm6, zmm4, zmmword_ptr(rdx, -8256)));
+ TEST_INSTRUCTION("62F15D586A727F" , vpunpckhdq(zmm6, zmm4, dword_ptr(rdx, 508)._1to16()));
+ TEST_INSTRUCTION("62F15D586AB200020000" , vpunpckhdq(zmm6, zmm4, dword_ptr(rdx, 512)._1to16()));
+ TEST_INSTRUCTION("62F15D586A7280" , vpunpckhdq(zmm6, zmm4, dword_ptr(rdx, -512)._1to16()));
+ TEST_INSTRUCTION("62F15D586AB2FCFDFFFF" , vpunpckhdq(zmm6, zmm4, dword_ptr(rdx, -516)._1to16()));
+ TEST_INSTRUCTION("622185486DD8" , vpunpckhqdq(zmm27, zmm15, zmm16));
+ TEST_INSTRUCTION("6221854B6DD8" , k(k3).vpunpckhqdq(zmm27, zmm15, zmm16));
+ TEST_INSTRUCTION("622185CB6DD8" , k(k3).z().vpunpckhqdq(zmm27, zmm15, zmm16));
+ TEST_INSTRUCTION("626185486D19" , vpunpckhqdq(zmm27, zmm15, zmmword_ptr(rcx)));
+ TEST_INSTRUCTION("622185486D9CF023010000" , vpunpckhqdq(zmm27, zmm15, zmmword_ptr(rax, r14, 3, 291)));
+ TEST_INSTRUCTION("626185586D19" , vpunpckhqdq(zmm27, zmm15, qword_ptr(rcx)._1to8()));
+ TEST_INSTRUCTION("626185486D5A7F" , vpunpckhqdq(zmm27, zmm15, zmmword_ptr(rdx, 8128)));
+ TEST_INSTRUCTION("626185486D9A00200000" , vpunpckhqdq(zmm27, zmm15, zmmword_ptr(rdx, 8192)));
+ TEST_INSTRUCTION("626185486D5A80" , vpunpckhqdq(zmm27, zmm15, zmmword_ptr(rdx, -8192)));
+ TEST_INSTRUCTION("626185486D9AC0DFFFFF" , vpunpckhqdq(zmm27, zmm15, zmmword_ptr(rdx, -8256)));
+ TEST_INSTRUCTION("626185586D5A7F" , vpunpckhqdq(zmm27, zmm15, qword_ptr(rdx, 1016)._1to8()));
+ TEST_INSTRUCTION("626185586D9A00040000" , vpunpckhqdq(zmm27, zmm15, qword_ptr(rdx, 1024)._1to8()));
+ TEST_INSTRUCTION("626185586D5A80" , vpunpckhqdq(zmm27, zmm15, qword_ptr(rdx, -1024)._1to8()));
+ TEST_INSTRUCTION("626185586D9AF8FBFFFF" , vpunpckhqdq(zmm27, zmm15, qword_ptr(rdx, -1032)._1to8()));
+ TEST_INSTRUCTION("6221654862C1" , vpunpckldq(zmm24, zmm3, zmm17));
+ TEST_INSTRUCTION("6221654B62C1" , k(k3).vpunpckldq(zmm24, zmm3, zmm17));
+ TEST_INSTRUCTION("622165CB62C1" , k(k3).z().vpunpckldq(zmm24, zmm3, zmm17));
+ TEST_INSTRUCTION("626165486201" , vpunpckldq(zmm24, zmm3, zmmword_ptr(rcx)));
+ TEST_INSTRUCTION("622165486284F023010000" , vpunpckldq(zmm24, zmm3, zmmword_ptr(rax, r14, 3, 291)));
+ TEST_INSTRUCTION("626165586201" , vpunpckldq(zmm24, zmm3, dword_ptr(rcx)._1to16()));
+ TEST_INSTRUCTION("6261654862427F" , vpunpckldq(zmm24, zmm3, zmmword_ptr(rdx, 8128)));
+ TEST_INSTRUCTION("62616548628200200000" , vpunpckldq(zmm24, zmm3, zmmword_ptr(rdx, 8192)));
+ TEST_INSTRUCTION("62616548624280" , vpunpckldq(zmm24, zmm3, zmmword_ptr(rdx, -8192)));
+ TEST_INSTRUCTION("626165486282C0DFFFFF" , vpunpckldq(zmm24, zmm3, zmmword_ptr(rdx, -8256)));
+ TEST_INSTRUCTION("6261655862427F" , vpunpckldq(zmm24, zmm3, dword_ptr(rdx, 508)._1to16()));
+ TEST_INSTRUCTION("62616558628200020000" , vpunpckldq(zmm24, zmm3, dword_ptr(rdx, 512)._1to16()));
+ TEST_INSTRUCTION("62616558624280" , vpunpckldq(zmm24, zmm3, dword_ptr(rdx, -512)._1to16()));
+ TEST_INSTRUCTION("626165586282FCFDFFFF" , vpunpckldq(zmm24, zmm3, dword_ptr(rdx, -516)._1to16()));
+ TEST_INSTRUCTION("62B1DD486CD9" , vpunpcklqdq(zmm3, zmm4, zmm17));
+ TEST_INSTRUCTION("62B1DD496CD9" , k(k1).vpunpcklqdq(zmm3, zmm4, zmm17));
+ TEST_INSTRUCTION("62B1DDC96CD9" , k(k1).z().vpunpcklqdq(zmm3, zmm4, zmm17));
+ TEST_INSTRUCTION("62F1DD486C19" , vpunpcklqdq(zmm3, zmm4, zmmword_ptr(rcx)));
+ TEST_INSTRUCTION("62B1DD486C9CF023010000" , vpunpcklqdq(zmm3, zmm4, zmmword_ptr(rax, r14, 3, 291)));
+ TEST_INSTRUCTION("62F1DD586C19" , vpunpcklqdq(zmm3, zmm4, qword_ptr(rcx)._1to8()));
+ TEST_INSTRUCTION("62F1DD486C5A7F" , vpunpcklqdq(zmm3, zmm4, zmmword_ptr(rdx, 8128)));
+ TEST_INSTRUCTION("62F1DD486C9A00200000" , vpunpcklqdq(zmm3, zmm4, zmmword_ptr(rdx, 8192)));
+ TEST_INSTRUCTION("62F1DD486C5A80" , vpunpcklqdq(zmm3, zmm4, zmmword_ptr(rdx, -8192)));
+ TEST_INSTRUCTION("62F1DD486C9AC0DFFFFF" , vpunpcklqdq(zmm3, zmm4, zmmword_ptr(rdx, -8256)));
+ TEST_INSTRUCTION("62F1DD586C5A7F" , vpunpcklqdq(zmm3, zmm4, qword_ptr(rdx, 1016)._1to8()));
+ TEST_INSTRUCTION("62F1DD586C9A00040000" , vpunpcklqdq(zmm3, zmm4, qword_ptr(rdx, 1024)._1to8()));
+ TEST_INSTRUCTION("62F1DD586C5A80" , vpunpcklqdq(zmm3, zmm4, qword_ptr(rdx, -1024)._1to8()));
+ TEST_INSTRUCTION("62F1DD586C9AF8FBFFFF" , vpunpcklqdq(zmm3, zmm4, qword_ptr(rdx, -1032)._1to8()));
+ TEST_INSTRUCTION("62111D48EFC0" , vpxord(zmm8, zmm12, zmm24));
+ TEST_INSTRUCTION("62111D4EEFC0" , k(k6).vpxord(zmm8, zmm12, zmm24));
+ TEST_INSTRUCTION("62111DCEEFC0" , k(k6).z().vpxord(zmm8, zmm12, zmm24));
+ TEST_INSTRUCTION("62711D48EF01" , vpxord(zmm8, zmm12, zmmword_ptr(rcx)));
+ TEST_INSTRUCTION("62311D48EF84F023010000" , vpxord(zmm8, zmm12, zmmword_ptr(rax, r14, 3, 291)));
+ TEST_INSTRUCTION("62711D58EF01" , vpxord(zmm8, zmm12, dword_ptr(rcx)._1to16()));
+ TEST_INSTRUCTION("62711D48EF427F" , vpxord(zmm8, zmm12, zmmword_ptr(rdx, 8128)));
+ TEST_INSTRUCTION("62711D48EF8200200000" , vpxord(zmm8, zmm12, zmmword_ptr(rdx, 8192)));
+ TEST_INSTRUCTION("62711D48EF4280" , vpxord(zmm8, zmm12, zmmword_ptr(rdx, -8192)));
+ TEST_INSTRUCTION("62711D48EF82C0DFFFFF" , vpxord(zmm8, zmm12, zmmword_ptr(rdx, -8256)));
+ TEST_INSTRUCTION("62711D58EF427F" , vpxord(zmm8, zmm12, dword_ptr(rdx, 508)._1to16()));
+ TEST_INSTRUCTION("62711D58EF8200020000" , vpxord(zmm8, zmm12, dword_ptr(rdx, 512)._1to16()));
+ TEST_INSTRUCTION("62711D58EF4280" , vpxord(zmm8, zmm12, dword_ptr(rdx, -512)._1to16()));
+ TEST_INSTRUCTION("62711D58EF82FCFDFFFF" , vpxord(zmm8, zmm12, dword_ptr(rdx, -516)._1to16()));
+ TEST_INSTRUCTION("62D1CD40EFFA" , vpxorq(zmm7, zmm22, zmm10));
+ TEST_INSTRUCTION("62D1CD46EFFA" , k(k6).vpxorq(zmm7, zmm22, zmm10));
+ TEST_INSTRUCTION("62D1CDC6EFFA" , k(k6).z().vpxorq(zmm7, zmm22, zmm10));
+ TEST_INSTRUCTION("62F1CD40EF39" , vpxorq(zmm7, zmm22, zmmword_ptr(rcx)));
+ TEST_INSTRUCTION("62B1CD40EFBCF023010000" , vpxorq(zmm7, zmm22, zmmword_ptr(rax, r14, 3, 291)));
+ TEST_INSTRUCTION("62F1CD50EF39" , vpxorq(zmm7, zmm22, qword_ptr(rcx)._1to8()));
+ TEST_INSTRUCTION("62F1CD40EF7A7F" , vpxorq(zmm7, zmm22, zmmword_ptr(rdx, 8128)));
+ TEST_INSTRUCTION("62F1CD40EFBA00200000" , vpxorq(zmm7, zmm22, zmmword_ptr(rdx, 8192)));
+ TEST_INSTRUCTION("62F1CD40EF7A80" , vpxorq(zmm7, zmm22, zmmword_ptr(rdx, -8192)));
+ TEST_INSTRUCTION("62F1CD40EFBAC0DFFFFF" , vpxorq(zmm7, zmm22, zmmword_ptr(rdx, -8256)));
+ TEST_INSTRUCTION("62F1CD50EF7A7F" , vpxorq(zmm7, zmm22, qword_ptr(rdx, 1016)._1to8()));
+ TEST_INSTRUCTION("62F1CD50EFBA00040000" , vpxorq(zmm7, zmm22, qword_ptr(rdx, 1024)._1to8()));
+ TEST_INSTRUCTION("62F1CD50EF7A80" , vpxorq(zmm7, zmm22, qword_ptr(rdx, -1024)._1to8()));
+ TEST_INSTRUCTION("62F1CD50EFBAF8FBFFFF" , vpxorq(zmm7, zmm22, qword_ptr(rdx, -1032)._1to8()));
+ TEST_INSTRUCTION("6272FD484CEC" , vrcp14pd(zmm13, zmm4));
+ TEST_INSTRUCTION("6272FD4D4CEC" , k(k5).vrcp14pd(zmm13, zmm4));
+ TEST_INSTRUCTION("6272FDCD4CEC" , k(k5).z().vrcp14pd(zmm13, zmm4));
+ TEST_INSTRUCTION("6272FD484C29" , vrcp14pd(zmm13, zmmword_ptr(rcx)));
+ TEST_INSTRUCTION("6232FD484CACF023010000" , vrcp14pd(zmm13, zmmword_ptr(rax, r14, 3, 291)));
+ TEST_INSTRUCTION("6272FD584C29" , vrcp14pd(zmm13, qword_ptr(rcx)._1to8()));
+ TEST_INSTRUCTION("6272FD484C6A7F" , vrcp14pd(zmm13, zmmword_ptr(rdx, 8128)));
+ TEST_INSTRUCTION("6272FD484CAA00200000" , vrcp14pd(zmm13, zmmword_ptr(rdx, 8192)));
+ TEST_INSTRUCTION("6272FD484C6A80" , vrcp14pd(zmm13, zmmword_ptr(rdx, -8192)));
+ TEST_INSTRUCTION("6272FD484CAAC0DFFFFF" , vrcp14pd(zmm13, zmmword_ptr(rdx, -8256)));
+ TEST_INSTRUCTION("6272FD584C6A7F" , vrcp14pd(zmm13, qword_ptr(rdx, 1016)._1to8()));
+ TEST_INSTRUCTION("6272FD584CAA00040000" , vrcp14pd(zmm13, qword_ptr(rdx, 1024)._1to8()));
+ TEST_INSTRUCTION("6272FD584C6A80" , vrcp14pd(zmm13, qword_ptr(rdx, -1024)._1to8()));
+ TEST_INSTRUCTION("6272FD584CAAF8FBFFFF" , vrcp14pd(zmm13, qword_ptr(rdx, -1032)._1to8()));
+ TEST_INSTRUCTION("62127D484CD1" , vrcp14ps(zmm10, zmm25));
+ TEST_INSTRUCTION("62127D494CD1" , k(k1).vrcp14ps(zmm10, zmm25));
+ TEST_INSTRUCTION("62127DC94CD1" , k(k1).z().vrcp14ps(zmm10, zmm25));
+ TEST_INSTRUCTION("62727D484C11" , vrcp14ps(zmm10, zmmword_ptr(rcx)));
+ TEST_INSTRUCTION("62327D484C94F023010000" , vrcp14ps(zmm10, zmmword_ptr(rax, r14, 3, 291)));
+ TEST_INSTRUCTION("62727D584C11" , vrcp14ps(zmm10, dword_ptr(rcx)._1to16()));
+ TEST_INSTRUCTION("62727D484C527F" , vrcp14ps(zmm10, zmmword_ptr(rdx, 8128)));
+ TEST_INSTRUCTION("62727D484C9200200000" , vrcp14ps(zmm10, zmmword_ptr(rdx, 8192)));
+ TEST_INSTRUCTION("62727D484C5280" , vrcp14ps(zmm10, zmmword_ptr(rdx, -8192)));
+ TEST_INSTRUCTION("62727D484C92C0DFFFFF" , vrcp14ps(zmm10, zmmword_ptr(rdx, -8256)));
+ TEST_INSTRUCTION("62727D584C527F" , vrcp14ps(zmm10, dword_ptr(rdx, 508)._1to16()));
+ TEST_INSTRUCTION("62727D584C9200020000" , vrcp14ps(zmm10, dword_ptr(rdx, 512)._1to16()));
+ TEST_INSTRUCTION("62727D584C5280" , vrcp14ps(zmm10, dword_ptr(rdx, -512)._1to16()));
+ TEST_INSTRUCTION("62727D584C92FCFDFFFF" , vrcp14ps(zmm10, dword_ptr(rdx, -516)._1to16()));
+ TEST_INSTRUCTION("6252CD004DE6" , vrcp14sd(xmm12, xmm22, xmm14));
+ TEST_INSTRUCTION("6252CD024DE6" , k(k2).vrcp14sd(xmm12, xmm22, xmm14));
+ TEST_INSTRUCTION("6252CD824DE6" , k(k2).z().vrcp14sd(xmm12, xmm22, xmm14));
+ TEST_INSTRUCTION("6272CD004D21" , vrcp14sd(xmm12, xmm22, qword_ptr(rcx)));
+ TEST_INSTRUCTION("6232CD004DA4F023010000" , vrcp14sd(xmm12, xmm22, qword_ptr(rax, r14, 3, 291)));
+ TEST_INSTRUCTION("6272CD004D627F" , vrcp14sd(xmm12, xmm22, qword_ptr(rdx, 1016)));
+ TEST_INSTRUCTION("6272CD004DA200040000" , vrcp14sd(xmm12, xmm22, qword_ptr(rdx, 1024)));
+ TEST_INSTRUCTION("6272CD004D6280" , vrcp14sd(xmm12, xmm22, qword_ptr(rdx, -1024)));
+ TEST_INSTRUCTION("6272CD004DA2F8FBFFFF" , vrcp14sd(xmm12, xmm22, qword_ptr(rdx, -1032)));
+ TEST_INSTRUCTION("62723D084DC3" , vrcp14ss(xmm8, xmm8, xmm3));
+ TEST_INSTRUCTION("62723D0F4DC3" , k(k7).vrcp14ss(xmm8, xmm8, xmm3));
+ TEST_INSTRUCTION("62723D8F4DC3" , k(k7).z().vrcp14ss(xmm8, xmm8, xmm3));
+ TEST_INSTRUCTION("62723D084D01" , vrcp14ss(xmm8, xmm8, dword_ptr(rcx)));
+ TEST_INSTRUCTION("62323D084D84F023010000" , vrcp14ss(xmm8, xmm8, dword_ptr(rax, r14, 3, 291)));
+ TEST_INSTRUCTION("62723D084D427F" , vrcp14ss(xmm8, xmm8, dword_ptr(rdx, 508)));
+ TEST_INSTRUCTION("62723D084D8200020000" , vrcp14ss(xmm8, xmm8, dword_ptr(rdx, 512)));
+ TEST_INSTRUCTION("62723D084D4280" , vrcp14ss(xmm8, xmm8, dword_ptr(rdx, -512)));
+ TEST_INSTRUCTION("62723D084D82FCFDFFFF" , vrcp14ss(xmm8, xmm8, dword_ptr(rdx, -516)));
+ TEST_INSTRUCTION("62C2FD484EDE" , vrsqrt14pd(zmm19, zmm14));
+ TEST_INSTRUCTION("62C2FD494EDE" , k(k1).vrsqrt14pd(zmm19, zmm14));
+ TEST_INSTRUCTION("62C2FDC94EDE" , k(k1).z().vrsqrt14pd(zmm19, zmm14));
+ TEST_INSTRUCTION("62E2FD484E19" , vrsqrt14pd(zmm19, zmmword_ptr(rcx)));
+ TEST_INSTRUCTION("62A2FD484E9CF023010000" , vrsqrt14pd(zmm19, zmmword_ptr(rax, r14, 3, 291)));
+ TEST_INSTRUCTION("62E2FD584E19" , vrsqrt14pd(zmm19, qword_ptr(rcx)._1to8()));
+ TEST_INSTRUCTION("62E2FD484E5A7F" , vrsqrt14pd(zmm19, zmmword_ptr(rdx, 8128)));
+ TEST_INSTRUCTION("62E2FD484E9A00200000" , vrsqrt14pd(zmm19, zmmword_ptr(rdx, 8192)));
+ TEST_INSTRUCTION("62E2FD484E5A80" , vrsqrt14pd(zmm19, zmmword_ptr(rdx, -8192)));
+ TEST_INSTRUCTION("62E2FD484E9AC0DFFFFF" , vrsqrt14pd(zmm19, zmmword_ptr(rdx, -8256)));
+ TEST_INSTRUCTION("62E2FD584E5A7F" , vrsqrt14pd(zmm19, qword_ptr(rdx, 1016)._1to8()));
+ TEST_INSTRUCTION("62E2FD584E9A00040000" , vrsqrt14pd(zmm19, qword_ptr(rdx, 1024)._1to8()));
+ TEST_INSTRUCTION("62E2FD584E5A80" , vrsqrt14pd(zmm19, qword_ptr(rdx, -1024)._1to8()));
+ TEST_INSTRUCTION("62E2FD584E9AF8FBFFFF" , vrsqrt14pd(zmm19, qword_ptr(rdx, -1032)._1to8()));
+ TEST_INSTRUCTION("62C27D484EC1" , vrsqrt14ps(zmm16, zmm9));
+ TEST_INSTRUCTION("62C27D4D4EC1" , k(k5).vrsqrt14ps(zmm16, zmm9));
+ TEST_INSTRUCTION("62C27DCD4EC1" , k(k5).z().vrsqrt14ps(zmm16, zmm9));
+ TEST_INSTRUCTION("62E27D484E01" , vrsqrt14ps(zmm16, zmmword_ptr(rcx)));
+ TEST_INSTRUCTION("62A27D484E84F023010000" , vrsqrt14ps(zmm16, zmmword_ptr(rax, r14, 3, 291)));
+ TEST_INSTRUCTION("62E27D584E01" , vrsqrt14ps(zmm16, dword_ptr(rcx)._1to16()));
+ TEST_INSTRUCTION("62E27D484E427F" , vrsqrt14ps(zmm16, zmmword_ptr(rdx, 8128)));
+ TEST_INSTRUCTION("62E27D484E8200200000" , vrsqrt14ps(zmm16, zmmword_ptr(rdx, 8192)));
+ TEST_INSTRUCTION("62E27D484E4280" , vrsqrt14ps(zmm16, zmmword_ptr(rdx, -8192)));
+ TEST_INSTRUCTION("62E27D484E82C0DFFFFF" , vrsqrt14ps(zmm16, zmmword_ptr(rdx, -8256)));
+ TEST_INSTRUCTION("62E27D584E427F" , vrsqrt14ps(zmm16, dword_ptr(rdx, 508)._1to16()));
+ TEST_INSTRUCTION("62E27D584E8200020000" , vrsqrt14ps(zmm16, dword_ptr(rdx, 512)._1to16()));
+ TEST_INSTRUCTION("62E27D584E4280" , vrsqrt14ps(zmm16, dword_ptr(rdx, -512)._1to16()));
+ TEST_INSTRUCTION("62E27D584E82FCFDFFFF" , vrsqrt14ps(zmm16, dword_ptr(rdx, -516)._1to16()));
+ TEST_INSTRUCTION("6242CD084FD2" , vrsqrt14sd(xmm26, xmm6, xmm10));
+ TEST_INSTRUCTION("6242CD0D4FD2" , k(k5).vrsqrt14sd(xmm26, xmm6, xmm10));
+ TEST_INSTRUCTION("6242CD8D4FD2" , k(k5).z().vrsqrt14sd(xmm26, xmm6, xmm10));
+ TEST_INSTRUCTION("6262CD084F11" , vrsqrt14sd(xmm26, xmm6, qword_ptr(rcx)));
+ TEST_INSTRUCTION("6222CD084F94F023010000" , vrsqrt14sd(xmm26, xmm6, qword_ptr(rax, r14, 3, 291)));
+ TEST_INSTRUCTION("6262CD084F527F" , vrsqrt14sd(xmm26, xmm6, qword_ptr(rdx, 1016)));
+ TEST_INSTRUCTION("6262CD084F9200040000" , vrsqrt14sd(xmm26, xmm6, qword_ptr(rdx, 1024)));
+ TEST_INSTRUCTION("6262CD084F5280" , vrsqrt14sd(xmm26, xmm6, qword_ptr(rdx, -1024)));
+ TEST_INSTRUCTION("6262CD084F92F8FBFFFF" , vrsqrt14sd(xmm26, xmm6, qword_ptr(rdx, -1032)));
+ TEST_INSTRUCTION("62520D084FF1" , vrsqrt14ss(xmm14, xmm14, xmm9));
+ TEST_INSTRUCTION("62520D094FF1" , k(k1).vrsqrt14ss(xmm14, xmm14, xmm9));
+ TEST_INSTRUCTION("62520D894FF1" , k(k1).z().vrsqrt14ss(xmm14, xmm14, xmm9));
+ TEST_INSTRUCTION("62720D084F31" , vrsqrt14ss(xmm14, xmm14, dword_ptr(rcx)));
+ TEST_INSTRUCTION("62320D084FB4F023010000" , vrsqrt14ss(xmm14, xmm14, dword_ptr(rax, r14, 3, 291)));
+ TEST_INSTRUCTION("62720D084F727F" , vrsqrt14ss(xmm14, xmm14, dword_ptr(rdx, 508)));
+ TEST_INSTRUCTION("62720D084FB200020000" , vrsqrt14ss(xmm14, xmm14, dword_ptr(rdx, 512)));
+ TEST_INSTRUCTION("62720D084F7280" , vrsqrt14ss(xmm14, xmm14, dword_ptr(rdx, -512)));
+ TEST_INSTRUCTION("62720D084FB2FCFDFFFF" , vrsqrt14ss(xmm14, xmm14, dword_ptr(rdx, -516)));
+ TEST_INSTRUCTION("6221BD48C6E6AB" , vshufpd(zmm28, zmm8, zmm22, 171));
+ TEST_INSTRUCTION("6221BD4AC6E6AB" , k(k2).vshufpd(zmm28, zmm8, zmm22, 171));
+ TEST_INSTRUCTION("6221BDCAC6E6AB" , k(k2).z().vshufpd(zmm28, zmm8, zmm22, 171));
+ TEST_INSTRUCTION("6221BD48C6E67B" , vshufpd(zmm28, zmm8, zmm22, 123));
+ TEST_INSTRUCTION("6261BD48C6217B" , vshufpd(zmm28, zmm8, zmmword_ptr(rcx), 123));
+ TEST_INSTRUCTION("6221BD48C6A4F0230100007B" , vshufpd(zmm28, zmm8, zmmword_ptr(rax, r14, 3, 291), 123));
+ TEST_INSTRUCTION("6261BD58C6217B" , vshufpd(zmm28, zmm8, qword_ptr(rcx)._1to8(), 123));
+ TEST_INSTRUCTION("6261BD48C6627F7B" , vshufpd(zmm28, zmm8, zmmword_ptr(rdx, 8128), 123));
+ TEST_INSTRUCTION("6261BD48C6A2002000007B" , vshufpd(zmm28, zmm8, zmmword_ptr(rdx, 8192), 123));
+ TEST_INSTRUCTION("6261BD48C662807B" , vshufpd(zmm28, zmm8, zmmword_ptr(rdx, -8192), 123));
+ TEST_INSTRUCTION("6261BD48C6A2C0DFFFFF7B" , vshufpd(zmm28, zmm8, zmmword_ptr(rdx, -8256), 123));
+ TEST_INSTRUCTION("6261BD58C6627F7B" , vshufpd(zmm28, zmm8, qword_ptr(rdx, 1016)._1to8(), 123));
+ TEST_INSTRUCTION("6261BD58C6A2000400007B" , vshufpd(zmm28, zmm8, qword_ptr(rdx, 1024)._1to8(), 123));
+ TEST_INSTRUCTION("6261BD58C662807B" , vshufpd(zmm28, zmm8, qword_ptr(rdx, -1024)._1to8(), 123));
+ TEST_INSTRUCTION("6261BD58C6A2F8FBFFFF7B" , vshufpd(zmm28, zmm8, qword_ptr(rdx, -1032)._1to8(), 123));
+ TEST_INSTRUCTION("62D14C48C6E9AB" , vshufps(zmm5, zmm6, zmm9, 171));
+ TEST_INSTRUCTION("62D14C4EC6E9AB" , k(k6).vshufps(zmm5, zmm6, zmm9, 171));
+ TEST_INSTRUCTION("62D14CCEC6E9AB" , k(k6).z().vshufps(zmm5, zmm6, zmm9, 171));
+ TEST_INSTRUCTION("62D14C48C6E97B" , vshufps(zmm5, zmm6, zmm9, 123));
+ TEST_INSTRUCTION("62F14C48C6297B" , vshufps(zmm5, zmm6, zmmword_ptr(rcx), 123));
+ TEST_INSTRUCTION("62B14C48C6ACF0230100007B" , vshufps(zmm5, zmm6, zmmword_ptr(rax, r14, 3, 291), 123));
+ TEST_INSTRUCTION("62F14C58C6297B" , vshufps(zmm5, zmm6, dword_ptr(rcx)._1to16(), 123));
+ TEST_INSTRUCTION("62F14C48C66A7F7B" , vshufps(zmm5, zmm6, zmmword_ptr(rdx, 8128), 123));
+ TEST_INSTRUCTION("62F14C48C6AA002000007B" , vshufps(zmm5, zmm6, zmmword_ptr(rdx, 8192), 123));
+ TEST_INSTRUCTION("62F14C48C66A807B" , vshufps(zmm5, zmm6, zmmword_ptr(rdx, -8192), 123));
+ TEST_INSTRUCTION("62F14C48C6AAC0DFFFFF7B" , vshufps(zmm5, zmm6, zmmword_ptr(rdx, -8256), 123));
+ TEST_INSTRUCTION("62F14C58C66A7F7B" , vshufps(zmm5, zmm6, dword_ptr(rdx, 508)._1to16(), 123));
+ TEST_INSTRUCTION("62F14C58C6AA000200007B" , vshufps(zmm5, zmm6, dword_ptr(rdx, 512)._1to16(), 123));
+ TEST_INSTRUCTION("62F14C58C66A807B" , vshufps(zmm5, zmm6, dword_ptr(rdx, -512)._1to16(), 123));
+ TEST_INSTRUCTION("62F14C58C6AAFCFDFFFF7B" , vshufps(zmm5, zmm6, dword_ptr(rdx, -516)._1to16(), 123));
+ TEST_INSTRUCTION("62A1FD4851DB" , vsqrtpd(zmm19, zmm19));
+ TEST_INSTRUCTION("62A1FD4D51DB" , k(k5).vsqrtpd(zmm19, zmm19));
+ TEST_INSTRUCTION("62A1FDCD51DB" , k(k5).z().vsqrtpd(zmm19, zmm19));
+ TEST_INSTRUCTION("62A1FD1851DB" , rn_sae().vsqrtpd(zmm19, zmm19));
+ TEST_INSTRUCTION("62A1FD5851DB" , ru_sae().vsqrtpd(zmm19, zmm19));
+ TEST_INSTRUCTION("62A1FD3851DB" , rd_sae().vsqrtpd(zmm19, zmm19));
+ TEST_INSTRUCTION("62A1FD7851DB" , rz_sae().vsqrtpd(zmm19, zmm19));
+ TEST_INSTRUCTION("62E1FD485119" , vsqrtpd(zmm19, zmmword_ptr(rcx)));
+ TEST_INSTRUCTION("62A1FD48519CF023010000" , vsqrtpd(zmm19, zmmword_ptr(rax, r14, 3, 291)));
+ TEST_INSTRUCTION("62E1FD585119" , vsqrtpd(zmm19, qword_ptr(rcx)._1to8()));
+ TEST_INSTRUCTION("62E1FD48515A7F" , vsqrtpd(zmm19, zmmword_ptr(rdx, 8128)));
+ TEST_INSTRUCTION("62E1FD48519A00200000" , vsqrtpd(zmm19, zmmword_ptr(rdx, 8192)));
+ TEST_INSTRUCTION("62E1FD48515A80" , vsqrtpd(zmm19, zmmword_ptr(rdx, -8192)));
+ TEST_INSTRUCTION("62E1FD48519AC0DFFFFF" , vsqrtpd(zmm19, zmmword_ptr(rdx, -8256)));
+ TEST_INSTRUCTION("62E1FD58515A7F" , vsqrtpd(zmm19, qword_ptr(rdx, 1016)._1to8()));
+ TEST_INSTRUCTION("62E1FD58519A00040000" , vsqrtpd(zmm19, qword_ptr(rdx, 1024)._1to8()));
+ TEST_INSTRUCTION("62E1FD58515A80" , vsqrtpd(zmm19, qword_ptr(rdx, -1024)._1to8()));
+ TEST_INSTRUCTION("62E1FD58519AF8FBFFFF" , vsqrtpd(zmm19, qword_ptr(rdx, -1032)._1to8()));
+ TEST_INSTRUCTION("62017C4851E5" , vsqrtps(zmm28, zmm29));
+ TEST_INSTRUCTION("62017C4B51E5" , k(k3).vsqrtps(zmm28, zmm29));
+ TEST_INSTRUCTION("62017CCB51E5" , k(k3).z().vsqrtps(zmm28, zmm29));
+ TEST_INSTRUCTION("62017C1851E5" , rn_sae().vsqrtps(zmm28, zmm29));
+ TEST_INSTRUCTION("62017C5851E5" , ru_sae().vsqrtps(zmm28, zmm29));
+ TEST_INSTRUCTION("62017C3851E5" , rd_sae().vsqrtps(zmm28, zmm29));
+ TEST_INSTRUCTION("62017C7851E5" , rz_sae().vsqrtps(zmm28, zmm29));
+ TEST_INSTRUCTION("62617C485121" , vsqrtps(zmm28, zmmword_ptr(rcx)));
+ TEST_INSTRUCTION("62217C4851A4F023010000" , vsqrtps(zmm28, zmmword_ptr(rax, r14, 3, 291)));
+ TEST_INSTRUCTION("62617C585121" , vsqrtps(zmm28, dword_ptr(rcx)._1to16()));
+ TEST_INSTRUCTION("62617C4851627F" , vsqrtps(zmm28, zmmword_ptr(rdx, 8128)));
+ TEST_INSTRUCTION("62617C4851A200200000" , vsqrtps(zmm28, zmmword_ptr(rdx, 8192)));
+ TEST_INSTRUCTION("62617C48516280" , vsqrtps(zmm28, zmmword_ptr(rdx, -8192)));
+ TEST_INSTRUCTION("62617C4851A2C0DFFFFF" , vsqrtps(zmm28, zmmword_ptr(rdx, -8256)));
+ TEST_INSTRUCTION("62617C5851627F" , vsqrtps(zmm28, dword_ptr(rdx, 508)._1to16()));
+ TEST_INSTRUCTION("62617C5851A200020000" , vsqrtps(zmm28, dword_ptr(rdx, 512)._1to16()));
+ TEST_INSTRUCTION("62617C58516280" , vsqrtps(zmm28, dword_ptr(rdx, -512)._1to16()));
+ TEST_INSTRUCTION("62617C5851A2FCFDFFFF" , vsqrtps(zmm28, dword_ptr(rdx, -516)._1to16()));
+ TEST_INSTRUCTION("C4C16B51F4" , vsqrtsd(xmm6, xmm2, xmm12));
+ TEST_INSTRUCTION("62D1EF0F51F4" , k(k7).vsqrtsd(xmm6, xmm2, xmm12));
+ TEST_INSTRUCTION("62D1EF8F51F4" , k(k7).z().vsqrtsd(xmm6, xmm2, xmm12));
+ TEST_INSTRUCTION("62D1EF1851F4" , rn_sae().vsqrtsd(xmm6, xmm2, xmm12));
+ TEST_INSTRUCTION("62D1EF5851F4" , ru_sae().vsqrtsd(xmm6, xmm2, xmm12));
+ TEST_INSTRUCTION("62D1EF3851F4" , rd_sae().vsqrtsd(xmm6, xmm2, xmm12));
+ TEST_INSTRUCTION("62D1EF7851F4" , rz_sae().vsqrtsd(xmm6, xmm2, xmm12));
+ TEST_INSTRUCTION("C5EB5131" , vsqrtsd(xmm6, xmm2, qword_ptr(rcx)));
+ TEST_INSTRUCTION("C4A16B51B4F023010000" , vsqrtsd(xmm6, xmm2, qword_ptr(rax, r14, 3, 291)));
+ TEST_INSTRUCTION("C5EB51B2F8030000" , vsqrtsd(xmm6, xmm2, qword_ptr(rdx, 1016)));
+ TEST_INSTRUCTION("C5EB51B200040000" , vsqrtsd(xmm6, xmm2, qword_ptr(rdx, 1024)));
+ TEST_INSTRUCTION("C5EB51B200FCFFFF" , vsqrtsd(xmm6, xmm2, qword_ptr(rdx, -1024)));
+ TEST_INSTRUCTION("C5EB51B2F8FBFFFF" , vsqrtsd(xmm6, xmm2, qword_ptr(rdx, -1032)));
+ TEST_INSTRUCTION("62C1660051F0" , vsqrtss(xmm22, xmm19, xmm8));
+ TEST_INSTRUCTION("62C1660151F0" , k(k1).vsqrtss(xmm22, xmm19, xmm8));
+ TEST_INSTRUCTION("62C1668151F0" , k(k1).z().vsqrtss(xmm22, xmm19, xmm8));
+ TEST_INSTRUCTION("62C1661051F0" , rn_sae().vsqrtss(xmm22, xmm19, xmm8));
+ TEST_INSTRUCTION("62C1665051F0" , ru_sae().vsqrtss(xmm22, xmm19, xmm8));
+ TEST_INSTRUCTION("62C1663051F0" , rd_sae().vsqrtss(xmm22, xmm19, xmm8));
+ TEST_INSTRUCTION("62C1667051F0" , rz_sae().vsqrtss(xmm22, xmm19, xmm8));
+ TEST_INSTRUCTION("62E166005131" , vsqrtss(xmm22, xmm19, dword_ptr(rcx)));
+ TEST_INSTRUCTION("62A1660051B4F023010000" , vsqrtss(xmm22, xmm19, dword_ptr(rax, r14, 3, 291)));
+ TEST_INSTRUCTION("62E1660051727F" , vsqrtss(xmm22, xmm19, dword_ptr(rdx, 508)));
+ TEST_INSTRUCTION("62E1660051B200020000" , vsqrtss(xmm22, xmm19, dword_ptr(rdx, 512)));
+ TEST_INSTRUCTION("62E16600517280" , vsqrtss(xmm22, xmm19, dword_ptr(rdx, -512)));
+ TEST_INSTRUCTION("62E1660051B2FCFDFFFF" , vsqrtss(xmm22, xmm19, dword_ptr(rdx, -516)));
+ TEST_INSTRUCTION("62519D485CC9" , vsubpd(zmm9, zmm12, zmm9));
+ TEST_INSTRUCTION("62519D4F5CC9" , k(k7).vsubpd(zmm9, zmm12, zmm9));
+ TEST_INSTRUCTION("62519DCF5CC9" , k(k7).z().vsubpd(zmm9, zmm12, zmm9));
+ TEST_INSTRUCTION("62519D185CC9" , rn_sae().vsubpd(zmm9, zmm12, zmm9));
+ TEST_INSTRUCTION("62519D585CC9" , ru_sae().vsubpd(zmm9, zmm12, zmm9));
+ TEST_INSTRUCTION("62519D385CC9" , rd_sae().vsubpd(zmm9, zmm12, zmm9));
+ TEST_INSTRUCTION("62519D785CC9" , rz_sae().vsubpd(zmm9, zmm12, zmm9));
+ TEST_INSTRUCTION("62719D485C09" , vsubpd(zmm9, zmm12, zmmword_ptr(rcx)));
+ TEST_INSTRUCTION("62319D485C8CF023010000" , vsubpd(zmm9, zmm12, zmmword_ptr(rax, r14, 3, 291)));
+ TEST_INSTRUCTION("62719D585C09" , vsubpd(zmm9, zmm12, qword_ptr(rcx)._1to8()));
+ TEST_INSTRUCTION("62719D485C4A7F" , vsubpd(zmm9, zmm12, zmmword_ptr(rdx, 8128)));
+ TEST_INSTRUCTION("62719D485C8A00200000" , vsubpd(zmm9, zmm12, zmmword_ptr(rdx, 8192)));
+ TEST_INSTRUCTION("62719D485C4A80" , vsubpd(zmm9, zmm12, zmmword_ptr(rdx, -8192)));
+ TEST_INSTRUCTION("62719D485C8AC0DFFFFF" , vsubpd(zmm9, zmm12, zmmword_ptr(rdx, -8256)));
+ TEST_INSTRUCTION("62719D585C4A7F" , vsubpd(zmm9, zmm12, qword_ptr(rdx, 1016)._1to8()));
+ TEST_INSTRUCTION("62719D585C8A00040000" , vsubpd(zmm9, zmm12, qword_ptr(rdx, 1024)._1to8()));
+ TEST_INSTRUCTION("62719D585C4A80" , vsubpd(zmm9, zmm12, qword_ptr(rdx, -1024)._1to8()));
+ TEST_INSTRUCTION("62719D585C8AF8FBFFFF" , vsubpd(zmm9, zmm12, qword_ptr(rdx, -1032)._1to8()));
+ TEST_INSTRUCTION("623124405CF5" , vsubps(zmm14, zmm27, zmm21));
+ TEST_INSTRUCTION("623124455CF5" , k(k5).vsubps(zmm14, zmm27, zmm21));
+ TEST_INSTRUCTION("623124C55CF5" , k(k5).z().vsubps(zmm14, zmm27, zmm21));
+ TEST_INSTRUCTION("623124105CF5" , rn_sae().vsubps(zmm14, zmm27, zmm21));
+ TEST_INSTRUCTION("623124505CF5" , ru_sae().vsubps(zmm14, zmm27, zmm21));
+ TEST_INSTRUCTION("623124305CF5" , rd_sae().vsubps(zmm14, zmm27, zmm21));
+ TEST_INSTRUCTION("623124705CF5" , rz_sae().vsubps(zmm14, zmm27, zmm21));
+ TEST_INSTRUCTION("627124405C31" , vsubps(zmm14, zmm27, zmmword_ptr(rcx)));
+ TEST_INSTRUCTION("623124405CB4F023010000" , vsubps(zmm14, zmm27, zmmword_ptr(rax, r14, 3, 291)));
+ TEST_INSTRUCTION("627124505C31" , vsubps(zmm14, zmm27, dword_ptr(rcx)._1to16()));
+ TEST_INSTRUCTION("627124405C727F" , vsubps(zmm14, zmm27, zmmword_ptr(rdx, 8128)));
+ TEST_INSTRUCTION("627124405CB200200000" , vsubps(zmm14, zmm27, zmmword_ptr(rdx, 8192)));
+ TEST_INSTRUCTION("627124405C7280" , vsubps(zmm14, zmm27, zmmword_ptr(rdx, -8192)));
+ TEST_INSTRUCTION("627124405CB2C0DFFFFF" , vsubps(zmm14, zmm27, zmmword_ptr(rdx, -8256)));
+ TEST_INSTRUCTION("627124505C727F" , vsubps(zmm14, zmm27, dword_ptr(rdx, 508)._1to16()));
+ TEST_INSTRUCTION("627124505CB200020000" , vsubps(zmm14, zmm27, dword_ptr(rdx, 512)._1to16()));
+ TEST_INSTRUCTION("627124505C7280" , vsubps(zmm14, zmm27, dword_ptr(rdx, -512)._1to16()));
+ TEST_INSTRUCTION("627124505CB2FCFDFFFF" , vsubps(zmm14, zmm27, dword_ptr(rdx, -516)._1to16()));
+ TEST_INSTRUCTION("62C1A7005CE7" , vsubsd(xmm20, xmm27, xmm15));
+ TEST_INSTRUCTION("62C1A7055CE7" , k(k5).vsubsd(xmm20, xmm27, xmm15));
+ TEST_INSTRUCTION("62C1A7855CE7" , k(k5).z().vsubsd(xmm20, xmm27, xmm15));
+ TEST_INSTRUCTION("62C1A7105CE7" , rn_sae().vsubsd(xmm20, xmm27, xmm15));
+ TEST_INSTRUCTION("62C1A7505CE7" , ru_sae().vsubsd(xmm20, xmm27, xmm15));
+ TEST_INSTRUCTION("62C1A7305CE7" , rd_sae().vsubsd(xmm20, xmm27, xmm15));
+ TEST_INSTRUCTION("62C1A7705CE7" , rz_sae().vsubsd(xmm20, xmm27, xmm15));
+ TEST_INSTRUCTION("62E1A7005C21" , vsubsd(xmm20, xmm27, qword_ptr(rcx)));
+ TEST_INSTRUCTION("62A1A7005CA4F023010000" , vsubsd(xmm20, xmm27, qword_ptr(rax, r14, 3, 291)));
+ TEST_INSTRUCTION("62E1A7005C627F" , vsubsd(xmm20, xmm27, qword_ptr(rdx, 1016)));
+ TEST_INSTRUCTION("62E1A7005CA200040000" , vsubsd(xmm20, xmm27, qword_ptr(rdx, 1024)));
+ TEST_INSTRUCTION("62E1A7005C6280" , vsubsd(xmm20, xmm27, qword_ptr(rdx, -1024)));
+ TEST_INSTRUCTION("62E1A7005CA2F8FBFFFF" , vsubsd(xmm20, xmm27, qword_ptr(rdx, -1032)));
+ TEST_INSTRUCTION("62D136005CE9" , vsubss(xmm5, xmm25, xmm9));
+ TEST_INSTRUCTION("62D136035CE9" , k(k3).vsubss(xmm5, xmm25, xmm9));
+ TEST_INSTRUCTION("62D136835CE9" , k(k3).z().vsubss(xmm5, xmm25, xmm9));
+ TEST_INSTRUCTION("62D136105CE9" , rn_sae().vsubss(xmm5, xmm25, xmm9));
+ TEST_INSTRUCTION("62D136505CE9" , ru_sae().vsubss(xmm5, xmm25, xmm9));
+ TEST_INSTRUCTION("62D136305CE9" , rd_sae().vsubss(xmm5, xmm25, xmm9));
+ TEST_INSTRUCTION("62D136705CE9" , rz_sae().vsubss(xmm5, xmm25, xmm9));
+ TEST_INSTRUCTION("62F136005C29" , vsubss(xmm5, xmm25, dword_ptr(rcx)));
+ TEST_INSTRUCTION("62B136005CACF023010000" , vsubss(xmm5, xmm25, dword_ptr(rax, r14, 3, 291)));
+ TEST_INSTRUCTION("62F136005C6A7F" , vsubss(xmm5, xmm25, dword_ptr(rdx, 508)));
+ TEST_INSTRUCTION("62F136005CAA00020000" , vsubss(xmm5, xmm25, dword_ptr(rdx, 512)));
+ TEST_INSTRUCTION("62F136005C6A80" , vsubss(xmm5, xmm25, dword_ptr(rdx, -512)));
+ TEST_INSTRUCTION("62F136005CAAFCFDFFFF" , vsubss(xmm5, xmm25, dword_ptr(rdx, -516)));
+ TEST_INSTRUCTION("C441792EDA" , vucomisd(xmm11, xmm10));
+ TEST_INSTRUCTION("6251FD182EDA" , sae().vucomisd(xmm11, xmm10));
+ TEST_INSTRUCTION("C5792E19" , vucomisd(xmm11, qword_ptr(rcx)));
+ TEST_INSTRUCTION("C421792E9CF023010000" , vucomisd(xmm11, qword_ptr(rax, r14, 3, 291)));
+ TEST_INSTRUCTION("C5792E9AF8030000" , vucomisd(xmm11, qword_ptr(rdx, 1016)));
+ TEST_INSTRUCTION("C5792E9A00040000" , vucomisd(xmm11, qword_ptr(rdx, 1024)));
+ TEST_INSTRUCTION("C5792E9A00FCFFFF" , vucomisd(xmm11, qword_ptr(rdx, -1024)));
+ TEST_INSTRUCTION("C5792E9AF8FBFFFF" , vucomisd(xmm11, qword_ptr(rdx, -1032)));
+ TEST_INSTRUCTION("62C17C082EF3" , vucomiss(xmm22, xmm11));
+ TEST_INSTRUCTION("62C17C182EF3" , sae().vucomiss(xmm22, xmm11));
+ TEST_INSTRUCTION("62E17C082E31" , vucomiss(xmm22, dword_ptr(rcx)));
+ TEST_INSTRUCTION("62A17C082EB4F023010000" , vucomiss(xmm22, dword_ptr(rax, r14, 3, 291)));
+ TEST_INSTRUCTION("62E17C082E727F" , vucomiss(xmm22, dword_ptr(rdx, 508)));
+ TEST_INSTRUCTION("62E17C082EB200020000" , vucomiss(xmm22, dword_ptr(rdx, 512)));
+ TEST_INSTRUCTION("62E17C082E7280" , vucomiss(xmm22, dword_ptr(rdx, -512)));
+ TEST_INSTRUCTION("62E17C082EB2FCFDFFFF" , vucomiss(xmm22, dword_ptr(rdx, -516)));
+ TEST_INSTRUCTION("6201E54015CA" , vunpckhpd(zmm25, zmm19, zmm26));
+ TEST_INSTRUCTION("6201E54515CA" , k(k5).vunpckhpd(zmm25, zmm19, zmm26));
+ TEST_INSTRUCTION("6201E5C515CA" , k(k5).z().vunpckhpd(zmm25, zmm19, zmm26));
+ TEST_INSTRUCTION("6261E5401509" , vunpckhpd(zmm25, zmm19, zmmword_ptr(rcx)));
+ TEST_INSTRUCTION("6221E540158CF023010000" , vunpckhpd(zmm25, zmm19, zmmword_ptr(rax, r14, 3, 291)));
+ TEST_INSTRUCTION("6261E5501509" , vunpckhpd(zmm25, zmm19, qword_ptr(rcx)._1to8()));
+ TEST_INSTRUCTION("6261E540154A7F" , vunpckhpd(zmm25, zmm19, zmmword_ptr(rdx, 8128)));
+ TEST_INSTRUCTION("6261E540158A00200000" , vunpckhpd(zmm25, zmm19, zmmword_ptr(rdx, 8192)));
+ TEST_INSTRUCTION("6261E540154A80" , vunpckhpd(zmm25, zmm19, zmmword_ptr(rdx, -8192)));
+ TEST_INSTRUCTION("6261E540158AC0DFFFFF" , vunpckhpd(zmm25, zmm19, zmmword_ptr(rdx, -8256)));
+ TEST_INSTRUCTION("6261E550154A7F" , vunpckhpd(zmm25, zmm19, qword_ptr(rdx, 1016)._1to8()));
+ TEST_INSTRUCTION("6261E550158A00040000" , vunpckhpd(zmm25, zmm19, qword_ptr(rdx, 1024)._1to8()));
+ TEST_INSTRUCTION("6261E550154A80" , vunpckhpd(zmm25, zmm19, qword_ptr(rdx, -1024)._1to8()));
+ TEST_INSTRUCTION("6261E550158AF8FBFFFF" , vunpckhpd(zmm25, zmm19, qword_ptr(rdx, -1032)._1to8()));
+ TEST_INSTRUCTION("62B10C4815E8" , vunpckhps(zmm5, zmm14, zmm16));
+ TEST_INSTRUCTION("62B10C4E15E8" , k(k6).vunpckhps(zmm5, zmm14, zmm16));
+ TEST_INSTRUCTION("62B10CCE15E8" , k(k6).z().vunpckhps(zmm5, zmm14, zmm16));
+ TEST_INSTRUCTION("62F10C481529" , vunpckhps(zmm5, zmm14, zmmword_ptr(rcx)));
+ TEST_INSTRUCTION("62B10C4815ACF023010000" , vunpckhps(zmm5, zmm14, zmmword_ptr(rax, r14, 3, 291)));
+ TEST_INSTRUCTION("62F10C581529" , vunpckhps(zmm5, zmm14, dword_ptr(rcx)._1to16()));
+ TEST_INSTRUCTION("62F10C48156A7F" , vunpckhps(zmm5, zmm14, zmmword_ptr(rdx, 8128)));
+ TEST_INSTRUCTION("62F10C4815AA00200000" , vunpckhps(zmm5, zmm14, zmmword_ptr(rdx, 8192)));
+ TEST_INSTRUCTION("62F10C48156A80" , vunpckhps(zmm5, zmm14, zmmword_ptr(rdx, -8192)));
+ TEST_INSTRUCTION("62F10C4815AAC0DFFFFF" , vunpckhps(zmm5, zmm14, zmmword_ptr(rdx, -8256)));
+ TEST_INSTRUCTION("62F10C58156A7F" , vunpckhps(zmm5, zmm14, dword_ptr(rdx, 508)._1to16()));
+ TEST_INSTRUCTION("62F10C5815AA00020000" , vunpckhps(zmm5, zmm14, dword_ptr(rdx, 512)._1to16()));
+ TEST_INSTRUCTION("62F10C58156A80" , vunpckhps(zmm5, zmm14, dword_ptr(rdx, -512)._1to16()));
+ TEST_INSTRUCTION("62F10C5815AAFCFDFFFF" , vunpckhps(zmm5, zmm14, dword_ptr(rdx, -516)._1to16()));
+ TEST_INSTRUCTION("62A1954014D5" , vunpcklpd(zmm18, zmm29, zmm21));
+ TEST_INSTRUCTION("62A1954614D5" , k(k6).vunpcklpd(zmm18, zmm29, zmm21));
+ TEST_INSTRUCTION("62A195C614D5" , k(k6).z().vunpcklpd(zmm18, zmm29, zmm21));
+ TEST_INSTRUCTION("62E195401411" , vunpcklpd(zmm18, zmm29, zmmword_ptr(rcx)));
+ TEST_INSTRUCTION("62A195401494F023010000" , vunpcklpd(zmm18, zmm29, zmmword_ptr(rax, r14, 3, 291)));
+ TEST_INSTRUCTION("62E195501411" , vunpcklpd(zmm18, zmm29, qword_ptr(rcx)._1to8()));
+ TEST_INSTRUCTION("62E1954014527F" , vunpcklpd(zmm18, zmm29, zmmword_ptr(rdx, 8128)));
+ TEST_INSTRUCTION("62E19540149200200000" , vunpcklpd(zmm18, zmm29, zmmword_ptr(rdx, 8192)));
+ TEST_INSTRUCTION("62E19540145280" , vunpcklpd(zmm18, zmm29, zmmword_ptr(rdx, -8192)));
+ TEST_INSTRUCTION("62E195401492C0DFFFFF" , vunpcklpd(zmm18, zmm29, zmmword_ptr(rdx, -8256)));
+ TEST_INSTRUCTION("62E1955014527F" , vunpcklpd(zmm18, zmm29, qword_ptr(rdx, 1016)._1to8()));
+ TEST_INSTRUCTION("62E19550149200040000" , vunpcklpd(zmm18, zmm29, qword_ptr(rdx, 1024)._1to8()));
+ TEST_INSTRUCTION("62E19550145280" , vunpcklpd(zmm18, zmm29, qword_ptr(rdx, -1024)._1to8()));
+ TEST_INSTRUCTION("62E195501492F8FBFFFF" , vunpcklpd(zmm18, zmm29, qword_ptr(rdx, -1032)._1to8()));
+ TEST_INSTRUCTION("62F1644814CA" , vunpcklps(zmm1, zmm3, zmm2));
+ TEST_INSTRUCTION("62F1644B14CA" , k(k3).vunpcklps(zmm1, zmm3, zmm2));
+ TEST_INSTRUCTION("62F164CB14CA" , k(k3).z().vunpcklps(zmm1, zmm3, zmm2));
+ TEST_INSTRUCTION("62F164481409" , vunpcklps(zmm1, zmm3, zmmword_ptr(rcx)));
+ TEST_INSTRUCTION("62B16448148CF023010000" , vunpcklps(zmm1, zmm3, zmmword_ptr(rax, r14, 3, 291)));
+ TEST_INSTRUCTION("62F164581409" , vunpcklps(zmm1, zmm3, dword_ptr(rcx)._1to16()));
+ TEST_INSTRUCTION("62F16448144A7F" , vunpcklps(zmm1, zmm3, zmmword_ptr(rdx, 8128)));
+ TEST_INSTRUCTION("62F16448148A00200000" , vunpcklps(zmm1, zmm3, zmmword_ptr(rdx, 8192)));
+ TEST_INSTRUCTION("62F16448144A80" , vunpcklps(zmm1, zmm3, zmmword_ptr(rdx, -8192)));
+ TEST_INSTRUCTION("62F16448148AC0DFFFFF" , vunpcklps(zmm1, zmm3, zmmword_ptr(rdx, -8256)));
+ TEST_INSTRUCTION("62F16458144A7F" , vunpcklps(zmm1, zmm3, dword_ptr(rdx, 508)._1to16()));
+ TEST_INSTRUCTION("62F16458148A00020000" , vunpcklps(zmm1, zmm3, dword_ptr(rdx, 512)._1to16()));
+ TEST_INSTRUCTION("62F16458144A80" , vunpcklps(zmm1, zmm3, dword_ptr(rdx, -512)._1to16()));
+ TEST_INSTRUCTION("62F16458148AFCFDFFFF" , vunpcklps(zmm1, zmm3, dword_ptr(rdx, -516)._1to16()));
+ TEST_INSTRUCTION("62330D4825E4AB" , vpternlogd(zmm12, zmm14, zmm20, 171));
+ TEST_INSTRUCTION("62330D4F25E4AB" , k(k7).vpternlogd(zmm12, zmm14, zmm20, 171));
+ TEST_INSTRUCTION("62330DCF25E4AB" , k(k7).z().vpternlogd(zmm12, zmm14, zmm20, 171));
+ TEST_INSTRUCTION("62330D4825E47B" , vpternlogd(zmm12, zmm14, zmm20, 123));
+ TEST_INSTRUCTION("62730D4825217B" , vpternlogd(zmm12, zmm14, zmmword_ptr(rcx), 123));
+ TEST_INSTRUCTION("62330D4825A4F0230100007B" , vpternlogd(zmm12, zmm14, zmmword_ptr(rax, r14, 3, 291), 123));
+ TEST_INSTRUCTION("62730D5825217B" , vpternlogd(zmm12, zmm14, dword_ptr(rcx)._1to16(), 123));
+ TEST_INSTRUCTION("62730D4825627F7B" , vpternlogd(zmm12, zmm14, zmmword_ptr(rdx, 8128), 123));
+ TEST_INSTRUCTION("62730D4825A2002000007B" , vpternlogd(zmm12, zmm14, zmmword_ptr(rdx, 8192), 123));
+ TEST_INSTRUCTION("62730D482562807B" , vpternlogd(zmm12, zmm14, zmmword_ptr(rdx, -8192), 123));
+ TEST_INSTRUCTION("62730D4825A2C0DFFFFF7B" , vpternlogd(zmm12, zmm14, zmmword_ptr(rdx, -8256), 123));
+ TEST_INSTRUCTION("62730D5825627F7B" , vpternlogd(zmm12, zmm14, dword_ptr(rdx, 508)._1to16(), 123));
+ TEST_INSTRUCTION("62730D5825A2000200007B" , vpternlogd(zmm12, zmm14, dword_ptr(rdx, 512)._1to16(), 123));
+ TEST_INSTRUCTION("62730D582562807B" , vpternlogd(zmm12, zmm14, dword_ptr(rdx, -512)._1to16(), 123));
+ TEST_INSTRUCTION("62730D5825A2FCFDFFFF7B" , vpternlogd(zmm12, zmm14, dword_ptr(rdx, -516)._1to16(), 123));
+ TEST_INSTRUCTION("6233ED4825FDAB" , vpternlogq(zmm15, zmm2, zmm21, 171));
+ TEST_INSTRUCTION("6233ED4B25FDAB" , k(k3).vpternlogq(zmm15, zmm2, zmm21, 171));
+ TEST_INSTRUCTION("6233EDCB25FDAB" , k(k3).z().vpternlogq(zmm15, zmm2, zmm21, 171));
+ TEST_INSTRUCTION("6233ED4825FD7B" , vpternlogq(zmm15, zmm2, zmm21, 123));
+ TEST_INSTRUCTION("6273ED4825397B" , vpternlogq(zmm15, zmm2, zmmword_ptr(rcx), 123));
+ TEST_INSTRUCTION("6233ED4825BCF0230100007B" , vpternlogq(zmm15, zmm2, zmmword_ptr(rax, r14, 3, 291), 123));
+ TEST_INSTRUCTION("6273ED5825397B" , vpternlogq(zmm15, zmm2, qword_ptr(rcx)._1to8(), 123));
+ TEST_INSTRUCTION("6273ED48257A7F7B" , vpternlogq(zmm15, zmm2, zmmword_ptr(rdx, 8128), 123));
+ TEST_INSTRUCTION("6273ED4825BA002000007B" , vpternlogq(zmm15, zmm2, zmmword_ptr(rdx, 8192), 123));
+ TEST_INSTRUCTION("6273ED48257A807B" , vpternlogq(zmm15, zmm2, zmmword_ptr(rdx, -8192), 123));
+ TEST_INSTRUCTION("6273ED4825BAC0DFFFFF7B" , vpternlogq(zmm15, zmm2, zmmword_ptr(rdx, -8256), 123));
+ TEST_INSTRUCTION("6273ED58257A7F7B" , vpternlogq(zmm15, zmm2, qword_ptr(rdx, 1016)._1to8(), 123));
+ TEST_INSTRUCTION("6273ED5825BA000400007B" , vpternlogq(zmm15, zmm2, qword_ptr(rdx, 1024)._1to8(), 123));
+ TEST_INSTRUCTION("6273ED58257A807B" , vpternlogq(zmm15, zmm2, qword_ptr(rdx, -1024)._1to8(), 123));
+ TEST_INSTRUCTION("6273ED5825BAF8FBFFFF7B" , vpternlogq(zmm15, zmm2, qword_ptr(rdx, -1032)._1to8(), 123));
+ TEST_INSTRUCTION("62F27E4832D3" , vpmovqb(xmm3, zmm2));
+ TEST_INSTRUCTION("62F27E4932D3" , k(k1).vpmovqb(xmm3, zmm2));
+ TEST_INSTRUCTION("62F27EC932D3" , k(k1).z().vpmovqb(xmm3, zmm2));
+ TEST_INSTRUCTION("62027E4822EE" , vpmovsqb(xmm30, zmm29));
+ TEST_INSTRUCTION("62027E4D22EE" , k(k5).vpmovsqb(xmm30, zmm29));
+ TEST_INSTRUCTION("62027ECD22EE" , k(k5).z().vpmovsqb(xmm30, zmm29));
+ TEST_INSTRUCTION("62027E4812E0" , vpmovusqb(xmm24, zmm28));
+ TEST_INSTRUCTION("62027E4F12E0" , k(k7).vpmovusqb(xmm24, zmm28));
+ TEST_INSTRUCTION("62027ECF12E0" , k(k7).z().vpmovusqb(xmm24, zmm28));
+ TEST_INSTRUCTION("62E27E4834D6" , vpmovqw(xmm6, zmm18));
+ TEST_INSTRUCTION("62E27E4934D6" , k(k1).vpmovqw(xmm6, zmm18));
+ TEST_INSTRUCTION("62E27EC934D6" , k(k1).z().vpmovqw(xmm6, zmm18));
+ TEST_INSTRUCTION("62827E4824DB" , vpmovsqw(xmm27, zmm19));
+ TEST_INSTRUCTION("62827E4E24DB" , k(k6).vpmovsqw(xmm27, zmm19));
+ TEST_INSTRUCTION("62827ECE24DB" , k(k6).z().vpmovsqw(xmm27, zmm19));
+ TEST_INSTRUCTION("62127E4814D4" , vpmovusqw(xmm28, zmm10));
+ TEST_INSTRUCTION("62127E4F14D4" , k(k7).vpmovusqw(xmm28, zmm10));
+ TEST_INSTRUCTION("62127ECF14D4" , k(k7).z().vpmovusqw(xmm28, zmm10));
+ TEST_INSTRUCTION("62627E4835CE" , vpmovqd(ymm6, zmm25));
+ TEST_INSTRUCTION("62627E4D35CE" , k(k5).vpmovqd(ymm6, zmm25));
+ TEST_INSTRUCTION("62627ECD35CE" , k(k5).z().vpmovqd(ymm6, zmm25));
+ TEST_INSTRUCTION("62D27E4825D7" , vpmovsqd(ymm15, zmm2));
+ TEST_INSTRUCTION("62D27E4A25D7" , k(k2).vpmovsqd(ymm15, zmm2));
+ TEST_INSTRUCTION("62D27ECA25D7" , k(k2).z().vpmovsqd(ymm15, zmm2));
+ TEST_INSTRUCTION("62D27E4815E0" , vpmovusqd(ymm8, zmm4));
+ TEST_INSTRUCTION("62D27E4C15E0" , k(k4).vpmovusqd(ymm8, zmm4));
+ TEST_INSTRUCTION("62D27ECC15E0" , k(k4).z().vpmovusqd(ymm8, zmm4));
+ TEST_INSTRUCTION("62F27E4831EA" , vpmovdb(xmm2, zmm5));
+ TEST_INSTRUCTION("62F27E4D31EA" , k(k5).vpmovdb(xmm2, zmm5));
+ TEST_INSTRUCTION("62F27ECD31EA" , k(k5).z().vpmovdb(xmm2, zmm5));
+ TEST_INSTRUCTION("62B27E4821D5" , vpmovsdb(xmm21, zmm2));
+ TEST_INSTRUCTION("62B27E4C21D5" , k(k4).vpmovsdb(xmm21, zmm2));
+ TEST_INSTRUCTION("62B27ECC21D5" , k(k4).z().vpmovsdb(xmm21, zmm2));
+ TEST_INSTRUCTION("62B27E4811D4" , vpmovusdb(xmm20, zmm2));
+ TEST_INSTRUCTION("62B27E4B11D4" , k(k3).vpmovusdb(xmm20, zmm2));
+ TEST_INSTRUCTION("62B27ECB11D4" , k(k3).z().vpmovusdb(xmm20, zmm2));
+ TEST_INSTRUCTION("62227E4833EE" , vpmovdw(ymm22, zmm29));
+ TEST_INSTRUCTION("62227E4D33EE" , k(k5).vpmovdw(ymm22, zmm29));
+ TEST_INSTRUCTION("62227ECD33EE" , k(k5).z().vpmovdw(ymm22, zmm29));
+ TEST_INSTRUCTION("62127E4823F1" , vpmovsdw(ymm25, zmm14));
+ TEST_INSTRUCTION("62127E4C23F1" , k(k4).vpmovsdw(ymm25, zmm14));
+ TEST_INSTRUCTION("62127ECC23F1" , k(k4).z().vpmovsdw(ymm25, zmm14));
+ TEST_INSTRUCTION("62D27E4813F8" , vpmovusdw(ymm8, zmm7));
+ TEST_INSTRUCTION("62D27E4913F8" , k(k1).vpmovusdw(ymm8, zmm7));
+ TEST_INSTRUCTION("62D27EC913F8" , k(k1).z().vpmovusdw(ymm8, zmm7));
+ TEST_INSTRUCTION("62F33D4023F3AB" , vshuff32x4(zmm6, zmm24, zmm3, 171));
+ TEST_INSTRUCTION("62F33D4223F3AB" , k(k2).vshuff32x4(zmm6, zmm24, zmm3, 171));
+ TEST_INSTRUCTION("62F33DC223F3AB" , k(k2).z().vshuff32x4(zmm6, zmm24, zmm3, 171));
+ TEST_INSTRUCTION("62F33D4023F37B" , vshuff32x4(zmm6, zmm24, zmm3, 123));
+ TEST_INSTRUCTION("62F33D4023317B" , vshuff32x4(zmm6, zmm24, zmmword_ptr(rcx), 123));
+ TEST_INSTRUCTION("62B33D4023B4F0230100007B" , vshuff32x4(zmm6, zmm24, zmmword_ptr(rax, r14, 3, 291), 123));
+ TEST_INSTRUCTION("62F33D5023317B" , vshuff32x4(zmm6, zmm24, dword_ptr(rcx)._1to16(), 123));
+ TEST_INSTRUCTION("62F33D4023727F7B" , vshuff32x4(zmm6, zmm24, zmmword_ptr(rdx, 8128), 123));
+ TEST_INSTRUCTION("62F33D4023B2002000007B" , vshuff32x4(zmm6, zmm24, zmmword_ptr(rdx, 8192), 123));
+ TEST_INSTRUCTION("62F33D402372807B" , vshuff32x4(zmm6, zmm24, zmmword_ptr(rdx, -8192), 123));
+ TEST_INSTRUCTION("62F33D4023B2C0DFFFFF7B" , vshuff32x4(zmm6, zmm24, zmmword_ptr(rdx, -8256), 123));
+ TEST_INSTRUCTION("62F33D5023727F7B" , vshuff32x4(zmm6, zmm24, dword_ptr(rdx, 508)._1to16(), 123));
+ TEST_INSTRUCTION("62F33D5023B2000200007B" , vshuff32x4(zmm6, zmm24, dword_ptr(rdx, 512)._1to16(), 123));
+ TEST_INSTRUCTION("62F33D502372807B" , vshuff32x4(zmm6, zmm24, dword_ptr(rdx, -512)._1to16(), 123));
+ TEST_INSTRUCTION("62F33D5023B2FCFDFFFF7B" , vshuff32x4(zmm6, zmm24, dword_ptr(rdx, -516)._1to16(), 123));
+ TEST_INSTRUCTION("6253B54023FBAB" , vshuff64x2(zmm15, zmm25, zmm11, 171));
+ TEST_INSTRUCTION("6253B54223FBAB" , k(k2).vshuff64x2(zmm15, zmm25, zmm11, 171));
+ TEST_INSTRUCTION("6253B5C223FBAB" , k(k2).z().vshuff64x2(zmm15, zmm25, zmm11, 171));
+ TEST_INSTRUCTION("6253B54023FB7B" , vshuff64x2(zmm15, zmm25, zmm11, 123));
+ TEST_INSTRUCTION("6273B54023397B" , vshuff64x2(zmm15, zmm25, zmmword_ptr(rcx), 123));
+ TEST_INSTRUCTION("6233B54023BCF0230100007B" , vshuff64x2(zmm15, zmm25, zmmword_ptr(rax, r14, 3, 291), 123));
+ TEST_INSTRUCTION("6273B55023397B" , vshuff64x2(zmm15, zmm25, qword_ptr(rcx)._1to8(), 123));
+ TEST_INSTRUCTION("6273B540237A7F7B" , vshuff64x2(zmm15, zmm25, zmmword_ptr(rdx, 8128), 123));
+ TEST_INSTRUCTION("6273B54023BA002000007B" , vshuff64x2(zmm15, zmm25, zmmword_ptr(rdx, 8192), 123));
+ TEST_INSTRUCTION("6273B540237A807B" , vshuff64x2(zmm15, zmm25, zmmword_ptr(rdx, -8192), 123));
+ TEST_INSTRUCTION("6273B54023BAC0DFFFFF7B" , vshuff64x2(zmm15, zmm25, zmmword_ptr(rdx, -8256), 123));
+ TEST_INSTRUCTION("6273B550237A7F7B" , vshuff64x2(zmm15, zmm25, qword_ptr(rdx, 1016)._1to8(), 123));
+ TEST_INSTRUCTION("6273B55023BA000400007B" , vshuff64x2(zmm15, zmm25, qword_ptr(rdx, 1024)._1to8(), 123));
+ TEST_INSTRUCTION("6273B550237A807B" , vshuff64x2(zmm15, zmm25, qword_ptr(rdx, -1024)._1to8(), 123));
+ TEST_INSTRUCTION("6273B55023BAF8FBFFFF7B" , vshuff64x2(zmm15, zmm25, qword_ptr(rdx, -1032)._1to8(), 123));
+ TEST_INSTRUCTION("62931D4043C9AB" , vshufi32x4(zmm1, zmm28, zmm25, 171));
+ TEST_INSTRUCTION("62931D4443C9AB" , k(k4).vshufi32x4(zmm1, zmm28, zmm25, 171));
+ TEST_INSTRUCTION("62931DC443C9AB" , k(k4).z().vshufi32x4(zmm1, zmm28, zmm25, 171));
+ TEST_INSTRUCTION("62931D4043C97B" , vshufi32x4(zmm1, zmm28, zmm25, 123));
+ TEST_INSTRUCTION("62F31D4043097B" , vshufi32x4(zmm1, zmm28, zmmword_ptr(rcx), 123));
+ TEST_INSTRUCTION("62B31D40438CF0230100007B" , vshufi32x4(zmm1, zmm28, zmmword_ptr(rax, r14, 3, 291), 123));
+ TEST_INSTRUCTION("62F31D5043097B" , vshufi32x4(zmm1, zmm28, dword_ptr(rcx)._1to16(), 123));
+ TEST_INSTRUCTION("62F31D40434A7F7B" , vshufi32x4(zmm1, zmm28, zmmword_ptr(rdx, 8128), 123));
+ TEST_INSTRUCTION("62F31D40438A002000007B" , vshufi32x4(zmm1, zmm28, zmmword_ptr(rdx, 8192), 123));
+ TEST_INSTRUCTION("62F31D40434A807B" , vshufi32x4(zmm1, zmm28, zmmword_ptr(rdx, -8192), 123));
+ TEST_INSTRUCTION("62F31D40438AC0DFFFFF7B" , vshufi32x4(zmm1, zmm28, zmmword_ptr(rdx, -8256), 123));
+ TEST_INSTRUCTION("62F31D50434A7F7B" , vshufi32x4(zmm1, zmm28, dword_ptr(rdx, 508)._1to16(), 123));
+ TEST_INSTRUCTION("62F31D50438A000200007B" , vshufi32x4(zmm1, zmm28, dword_ptr(rdx, 512)._1to16(), 123));
+ TEST_INSTRUCTION("62F31D50434A807B" , vshufi32x4(zmm1, zmm28, dword_ptr(rdx, -512)._1to16(), 123));
+ TEST_INSTRUCTION("62F31D50438AFCFDFFFF7B" , vshufi32x4(zmm1, zmm28, dword_ptr(rdx, -516)._1to16(), 123));
+ TEST_INSTRUCTION("62B3FD4043DBAB" , vshufi64x2(zmm3, zmm16, zmm19, 171));
+ TEST_INSTRUCTION("62B3FD4743DBAB" , k(k7).vshufi64x2(zmm3, zmm16, zmm19, 171));
+ TEST_INSTRUCTION("62B3FDC743DBAB" , k(k7).z().vshufi64x2(zmm3, zmm16, zmm19, 171));
+ TEST_INSTRUCTION("62B3FD4043DB7B" , vshufi64x2(zmm3, zmm16, zmm19, 123));
+ TEST_INSTRUCTION("62F3FD4043197B" , vshufi64x2(zmm3, zmm16, zmmword_ptr(rcx), 123));
+ TEST_INSTRUCTION("62B3FD40439CF0230100007B" , vshufi64x2(zmm3, zmm16, zmmword_ptr(rax, r14, 3, 291), 123));
+ TEST_INSTRUCTION("62F3FD5043197B" , vshufi64x2(zmm3, zmm16, qword_ptr(rcx)._1to8(), 123));
+ TEST_INSTRUCTION("62F3FD40435A7F7B" , vshufi64x2(zmm3, zmm16, zmmword_ptr(rdx, 8128), 123));
+ TEST_INSTRUCTION("62F3FD40439A002000007B" , vshufi64x2(zmm3, zmm16, zmmword_ptr(rdx, 8192), 123));
+ TEST_INSTRUCTION("62F3FD40435A807B" , vshufi64x2(zmm3, zmm16, zmmword_ptr(rdx, -8192), 123));
+ TEST_INSTRUCTION("62F3FD40439AC0DFFFFF7B" , vshufi64x2(zmm3, zmm16, zmmword_ptr(rdx, -8256), 123));
+ TEST_INSTRUCTION("62F3FD50435A7F7B" , vshufi64x2(zmm3, zmm16, qword_ptr(rdx, 1016)._1to8(), 123));
+ TEST_INSTRUCTION("62F3FD50439A000400007B" , vshufi64x2(zmm3, zmm16, qword_ptr(rdx, 1024)._1to8(), 123));
+ TEST_INSTRUCTION("62F3FD50435A807B" , vshufi64x2(zmm3, zmm16, qword_ptr(rdx, -1024)._1to8(), 123));
+ TEST_INSTRUCTION("62F3FD50439AF8FBFFFF7B" , vshufi64x2(zmm3, zmm16, qword_ptr(rdx, -1032)._1to8(), 123));
+ TEST_INSTRUCTION("62A2C54036EE" , vpermq(zmm21, zmm23, zmm22));
+ TEST_INSTRUCTION("62A2C54136EE" , k(k1).vpermq(zmm21, zmm23, zmm22));
+ TEST_INSTRUCTION("62A2C5C136EE" , k(k1).z().vpermq(zmm21, zmm23, zmm22));
+ TEST_INSTRUCTION("62E2C5403629" , vpermq(zmm21, zmm23, zmmword_ptr(rcx)));
+ TEST_INSTRUCTION("62A2C54036ACF023010000" , vpermq(zmm21, zmm23, zmmword_ptr(rax, r14, 3, 291)));
+ TEST_INSTRUCTION("62E2C5503629" , vpermq(zmm21, zmm23, qword_ptr(rcx)._1to8()));
+ TEST_INSTRUCTION("62E2C540366A7F" , vpermq(zmm21, zmm23, zmmword_ptr(rdx, 8128)));
+ TEST_INSTRUCTION("62E2C54036AA00200000" , vpermq(zmm21, zmm23, zmmword_ptr(rdx, 8192)));
+ TEST_INSTRUCTION("62E2C540366A80" , vpermq(zmm21, zmm23, zmmword_ptr(rdx, -8192)));
+ TEST_INSTRUCTION("62E2C54036AAC0DFFFFF" , vpermq(zmm21, zmm23, zmmword_ptr(rdx, -8256)));
+ TEST_INSTRUCTION("62E2C550366A7F" , vpermq(zmm21, zmm23, qword_ptr(rdx, 1016)._1to8()));
+ TEST_INSTRUCTION("62E2C55036AA00040000" , vpermq(zmm21, zmm23, qword_ptr(rdx, 1024)._1to8()));
+ TEST_INSTRUCTION("62E2C550366A80" , vpermq(zmm21, zmm23, qword_ptr(rdx, -1024)._1to8()));
+ TEST_INSTRUCTION("62E2C55036AAF8FBFFFF" , vpermq(zmm21, zmm23, qword_ptr(rdx, -1032)._1to8()));
+ TEST_INSTRUCTION("6222954016D2" , vpermpd(zmm26, zmm29, zmm18));
+ TEST_INSTRUCTION("6222954616D2" , k(k6).vpermpd(zmm26, zmm29, zmm18));
+ TEST_INSTRUCTION("622295C616D2" , k(k6).z().vpermpd(zmm26, zmm29, zmm18));
+ TEST_INSTRUCTION("626295401611" , vpermpd(zmm26, zmm29, zmmword_ptr(rcx)));
+ TEST_INSTRUCTION("622295401694F023010000" , vpermpd(zmm26, zmm29, zmmword_ptr(rax, r14, 3, 291)));
+ TEST_INSTRUCTION("626295501611" , vpermpd(zmm26, zmm29, qword_ptr(rcx)._1to8()));
+ TEST_INSTRUCTION("6262954016527F" , vpermpd(zmm26, zmm29, zmmword_ptr(rdx, 8128)));
+ TEST_INSTRUCTION("62629540169200200000" , vpermpd(zmm26, zmm29, zmmword_ptr(rdx, 8192)));
+ TEST_INSTRUCTION("62629540165280" , vpermpd(zmm26, zmm29, zmmword_ptr(rdx, -8192)));
+ TEST_INSTRUCTION("626295401692C0DFFFFF" , vpermpd(zmm26, zmm29, zmmword_ptr(rdx, -8256)));
+ TEST_INSTRUCTION("6262955016527F" , vpermpd(zmm26, zmm29, qword_ptr(rdx, 1016)._1to8()));
+ TEST_INSTRUCTION("62629550169200040000" , vpermpd(zmm26, zmm29, qword_ptr(rdx, 1024)._1to8()));
+ TEST_INSTRUCTION("62629550165280" , vpermpd(zmm26, zmm29, qword_ptr(rdx, -1024)._1to8()));
+ TEST_INSTRUCTION("626295501692F8FBFFFF" , vpermpd(zmm26, zmm29, qword_ptr(rdx, -1032)._1to8()));
+ TEST_INSTRUCTION("62724D487EEE" , vpermt2d(zmm13, zmm6, zmm6));
+ TEST_INSTRUCTION("62724D4E7EEE" , k(k6).vpermt2d(zmm13, zmm6, zmm6));
+ TEST_INSTRUCTION("62724DCE7EEE" , k(k6).z().vpermt2d(zmm13, zmm6, zmm6));
+ TEST_INSTRUCTION("62724D487E29" , vpermt2d(zmm13, zmm6, zmmword_ptr(rcx)));
+ TEST_INSTRUCTION("62324D487EACF023010000" , vpermt2d(zmm13, zmm6, zmmword_ptr(rax, r14, 3, 291)));
+ TEST_INSTRUCTION("62724D587E29" , vpermt2d(zmm13, zmm6, dword_ptr(rcx)._1to16()));
+ TEST_INSTRUCTION("62724D487E6A7F" , vpermt2d(zmm13, zmm6, zmmword_ptr(rdx, 8128)));
+ TEST_INSTRUCTION("62724D487EAA00200000" , vpermt2d(zmm13, zmm6, zmmword_ptr(rdx, 8192)));
+ TEST_INSTRUCTION("62724D487E6A80" , vpermt2d(zmm13, zmm6, zmmword_ptr(rdx, -8192)));
+ TEST_INSTRUCTION("62724D487EAAC0DFFFFF" , vpermt2d(zmm13, zmm6, zmmword_ptr(rdx, -8256)));
+ TEST_INSTRUCTION("62724D587E6A7F" , vpermt2d(zmm13, zmm6, dword_ptr(rdx, 508)._1to16()));
+ TEST_INSTRUCTION("62724D587EAA00020000" , vpermt2d(zmm13, zmm6, dword_ptr(rdx, 512)._1to16()));
+ TEST_INSTRUCTION("62724D587E6A80" , vpermt2d(zmm13, zmm6, dword_ptr(rdx, -512)._1to16()));
+ TEST_INSTRUCTION("62724D587EAAFCFDFFFF" , vpermt2d(zmm13, zmm6, dword_ptr(rdx, -516)._1to16()));
+ TEST_INSTRUCTION("62A29D487EE8" , vpermt2q(zmm21, zmm12, zmm16));
+ TEST_INSTRUCTION("62A29D4A7EE8" , k(k2).vpermt2q(zmm21, zmm12, zmm16));
+ TEST_INSTRUCTION("62A29DCA7EE8" , k(k2).z().vpermt2q(zmm21, zmm12, zmm16));
+ TEST_INSTRUCTION("62E29D487E29" , vpermt2q(zmm21, zmm12, zmmword_ptr(rcx)));
+ TEST_INSTRUCTION("62A29D487EACF023010000" , vpermt2q(zmm21, zmm12, zmmword_ptr(rax, r14, 3, 291)));
+ TEST_INSTRUCTION("62E29D587E29" , vpermt2q(zmm21, zmm12, qword_ptr(rcx)._1to8()));
+ TEST_INSTRUCTION("62E29D487E6A7F" , vpermt2q(zmm21, zmm12, zmmword_ptr(rdx, 8128)));
+ TEST_INSTRUCTION("62E29D487EAA00200000" , vpermt2q(zmm21, zmm12, zmmword_ptr(rdx, 8192)));
+ TEST_INSTRUCTION("62E29D487E6A80" , vpermt2q(zmm21, zmm12, zmmword_ptr(rdx, -8192)));
+ TEST_INSTRUCTION("62E29D487EAAC0DFFFFF" , vpermt2q(zmm21, zmm12, zmmword_ptr(rdx, -8256)));
+ TEST_INSTRUCTION("62E29D587E6A7F" , vpermt2q(zmm21, zmm12, qword_ptr(rdx, 1016)._1to8()));
+ TEST_INSTRUCTION("62E29D587EAA00040000" , vpermt2q(zmm21, zmm12, qword_ptr(rdx, 1024)._1to8()));
+ TEST_INSTRUCTION("62E29D587E6A80" , vpermt2q(zmm21, zmm12, qword_ptr(rdx, -1024)._1to8()));
+ TEST_INSTRUCTION("62E29D587EAAF8FBFFFF" , vpermt2q(zmm21, zmm12, qword_ptr(rdx, -1032)._1to8()));
+ TEST_INSTRUCTION("62721D407FDA" , vpermt2ps(zmm11, zmm28, zmm2));
+ TEST_INSTRUCTION("62721D417FDA" , k(k1).vpermt2ps(zmm11, zmm28, zmm2));
+ TEST_INSTRUCTION("62721DC17FDA" , k(k1).z().vpermt2ps(zmm11, zmm28, zmm2));
+ TEST_INSTRUCTION("62721D407F19" , vpermt2ps(zmm11, zmm28, zmmword_ptr(rcx)));
+ TEST_INSTRUCTION("62321D407F9CF023010000" , vpermt2ps(zmm11, zmm28, zmmword_ptr(rax, r14, 3, 291)));
+ TEST_INSTRUCTION("62721D507F19" , vpermt2ps(zmm11, zmm28, dword_ptr(rcx)._1to16()));
+ TEST_INSTRUCTION("62721D407F5A7F" , vpermt2ps(zmm11, zmm28, zmmword_ptr(rdx, 8128)));
+ TEST_INSTRUCTION("62721D407F9A00200000" , vpermt2ps(zmm11, zmm28, zmmword_ptr(rdx, 8192)));
+ TEST_INSTRUCTION("62721D407F5A80" , vpermt2ps(zmm11, zmm28, zmmword_ptr(rdx, -8192)));
+ TEST_INSTRUCTION("62721D407F9AC0DFFFFF" , vpermt2ps(zmm11, zmm28, zmmword_ptr(rdx, -8256)));
+ TEST_INSTRUCTION("62721D507F5A7F" , vpermt2ps(zmm11, zmm28, dword_ptr(rdx, 508)._1to16()));
+ TEST_INSTRUCTION("62721D507F9A00020000" , vpermt2ps(zmm11, zmm28, dword_ptr(rdx, 512)._1to16()));
+ TEST_INSTRUCTION("62721D507F5A80" , vpermt2ps(zmm11, zmm28, dword_ptr(rdx, -512)._1to16()));
+ TEST_INSTRUCTION("62721D507F9AFCFDFFFF" , vpermt2ps(zmm11, zmm28, dword_ptr(rdx, -516)._1to16()));
+ TEST_INSTRUCTION("62D2A5407FDB" , vpermt2pd(zmm3, zmm27, zmm11));
+ TEST_INSTRUCTION("62D2A5427FDB" , k(k2).vpermt2pd(zmm3, zmm27, zmm11));
+ TEST_INSTRUCTION("62D2A5C27FDB" , k(k2).z().vpermt2pd(zmm3, zmm27, zmm11));
+ TEST_INSTRUCTION("62F2A5407F19" , vpermt2pd(zmm3, zmm27, zmmword_ptr(rcx)));
+ TEST_INSTRUCTION("62B2A5407F9CF023010000" , vpermt2pd(zmm3, zmm27, zmmword_ptr(rax, r14, 3, 291)));
+ TEST_INSTRUCTION("62F2A5507F19" , vpermt2pd(zmm3, zmm27, qword_ptr(rcx)._1to8()));
+ TEST_INSTRUCTION("62F2A5407F5A7F" , vpermt2pd(zmm3, zmm27, zmmword_ptr(rdx, 8128)));
+ TEST_INSTRUCTION("62F2A5407F9A00200000" , vpermt2pd(zmm3, zmm27, zmmword_ptr(rdx, 8192)));
+ TEST_INSTRUCTION("62F2A5407F5A80" , vpermt2pd(zmm3, zmm27, zmmword_ptr(rdx, -8192)));
+ TEST_INSTRUCTION("62F2A5407F9AC0DFFFFF" , vpermt2pd(zmm3, zmm27, zmmword_ptr(rdx, -8256)));
+ TEST_INSTRUCTION("62F2A5507F5A7F" , vpermt2pd(zmm3, zmm27, qword_ptr(rdx, 1016)._1to8()));
+ TEST_INSTRUCTION("62F2A5507F9A00040000" , vpermt2pd(zmm3, zmm27, qword_ptr(rdx, 1024)._1to8()));
+ TEST_INSTRUCTION("62F2A5507F5A80" , vpermt2pd(zmm3, zmm27, qword_ptr(rdx, -1024)._1to8()));
+ TEST_INSTRUCTION("62F2A5507F9AF8FBFFFF" , vpermt2pd(zmm3, zmm27, qword_ptr(rdx, -1032)._1to8()));
+ TEST_INSTRUCTION("6223DD4803E7AB" , valignq(zmm28, zmm4, zmm23, 171));
+ TEST_INSTRUCTION("6223DD4B03E7AB" , k(k3).valignq(zmm28, zmm4, zmm23, 171));
+ TEST_INSTRUCTION("6223DDCB03E7AB" , k(k3).z().valignq(zmm28, zmm4, zmm23, 171));
+ TEST_INSTRUCTION("6223DD4803E77B" , valignq(zmm28, zmm4, zmm23, 123));
+ TEST_INSTRUCTION("6263DD4803217B" , valignq(zmm28, zmm4, zmmword_ptr(rcx), 123));
+ TEST_INSTRUCTION("6223DD4803A4F0230100007B" , valignq(zmm28, zmm4, zmmword_ptr(rax, r14, 3, 291), 123));
+ TEST_INSTRUCTION("6263DD5803217B" , valignq(zmm28, zmm4, qword_ptr(rcx)._1to8(), 123));
+ TEST_INSTRUCTION("6263DD4803627F7B" , valignq(zmm28, zmm4, zmmword_ptr(rdx, 8128), 123));
+ TEST_INSTRUCTION("6263DD4803A2002000007B" , valignq(zmm28, zmm4, zmmword_ptr(rdx, 8192), 123));
+ TEST_INSTRUCTION("6263DD480362807B" , valignq(zmm28, zmm4, zmmword_ptr(rdx, -8192), 123));
+ TEST_INSTRUCTION("6263DD4803A2C0DFFFFF7B" , valignq(zmm28, zmm4, zmmword_ptr(rdx, -8256), 123));
+ TEST_INSTRUCTION("6263DD5803627F7B" , valignq(zmm28, zmm4, qword_ptr(rdx, 1016)._1to8(), 123));
+ TEST_INSTRUCTION("6263DD5803A2000400007B" , valignq(zmm28, zmm4, qword_ptr(rdx, 1024)._1to8(), 123));
+ TEST_INSTRUCTION("6263DD580362807B" , valignq(zmm28, zmm4, qword_ptr(rdx, -1024)._1to8(), 123));
+ TEST_INSTRUCTION("6263DD5803A2F8FBFFFF7B" , valignq(zmm28, zmm4, qword_ptr(rdx, -1032)._1to8(), 123));
+ TEST_INSTRUCTION("62917F0879C6" , vcvtsd2usi(eax, xmm30));
+ TEST_INSTRUCTION("62917F1879C6" , rn_sae().vcvtsd2usi(eax, xmm30));
+ TEST_INSTRUCTION("62917F5879C6" , ru_sae().vcvtsd2usi(eax, xmm30));
+ TEST_INSTRUCTION("62917F3879C6" , rd_sae().vcvtsd2usi(eax, xmm30));
+ TEST_INSTRUCTION("62917F7879C6" , rz_sae().vcvtsd2usi(eax, xmm30));
+ TEST_INSTRUCTION("62F17F087901" , vcvtsd2usi(eax, qword_ptr(rcx)));
+ TEST_INSTRUCTION("62B17F087984F023010000" , vcvtsd2usi(eax, qword_ptr(rax, r14, 3, 291)));
+ TEST_INSTRUCTION("62F17F0879427F" , vcvtsd2usi(eax, qword_ptr(rdx, 1016)));
+ TEST_INSTRUCTION("62F17F08798200040000" , vcvtsd2usi(eax, qword_ptr(rdx, 1024)));
+ TEST_INSTRUCTION("62F17F08794280" , vcvtsd2usi(eax, qword_ptr(rdx, -1024)));
+ TEST_INSTRUCTION("62F17F087982F8FBFFFF" , vcvtsd2usi(eax, qword_ptr(rdx, -1032)));
+ TEST_INSTRUCTION("62917F0879EE" , vcvtsd2usi(ebp, xmm30));
+ TEST_INSTRUCTION("62917F1879EE" , rn_sae().vcvtsd2usi(ebp, xmm30));
+ TEST_INSTRUCTION("62917F5879EE" , ru_sae().vcvtsd2usi(ebp, xmm30));
+ TEST_INSTRUCTION("62917F3879EE" , rd_sae().vcvtsd2usi(ebp, xmm30));
+ TEST_INSTRUCTION("62917F7879EE" , rz_sae().vcvtsd2usi(ebp, xmm30));
+ TEST_INSTRUCTION("62F17F087929" , vcvtsd2usi(ebp, qword_ptr(rcx)));
+ TEST_INSTRUCTION("62B17F0879ACF023010000" , vcvtsd2usi(ebp, qword_ptr(rax, r14, 3, 291)));
+ TEST_INSTRUCTION("62F17F08796A7F" , vcvtsd2usi(ebp, qword_ptr(rdx, 1016)));
+ TEST_INSTRUCTION("62F17F0879AA00040000" , vcvtsd2usi(ebp, qword_ptr(rdx, 1024)));
+ TEST_INSTRUCTION("62F17F08796A80" , vcvtsd2usi(ebp, qword_ptr(rdx, -1024)));
+ TEST_INSTRUCTION("62F17F0879AAF8FBFFFF" , vcvtsd2usi(ebp, qword_ptr(rdx, -1032)));
+ TEST_INSTRUCTION("62117F0879EE" , vcvtsd2usi(r13d, xmm30));
+ TEST_INSTRUCTION("62117F1879EE" , rn_sae().vcvtsd2usi(r13d, xmm30));
+ TEST_INSTRUCTION("62117F5879EE" , ru_sae().vcvtsd2usi(r13d, xmm30));
+ TEST_INSTRUCTION("62117F3879EE" , rd_sae().vcvtsd2usi(r13d, xmm30));
+ TEST_INSTRUCTION("62117F7879EE" , rz_sae().vcvtsd2usi(r13d, xmm30));
+ TEST_INSTRUCTION("62717F087929" , vcvtsd2usi(r13d, qword_ptr(rcx)));
+ TEST_INSTRUCTION("62317F0879ACF023010000" , vcvtsd2usi(r13d, qword_ptr(rax, r14, 3, 291)));
+ TEST_INSTRUCTION("62717F08796A7F" , vcvtsd2usi(r13d, qword_ptr(rdx, 1016)));
+ TEST_INSTRUCTION("62717F0879AA00040000" , vcvtsd2usi(r13d, qword_ptr(rdx, 1024)));
+ TEST_INSTRUCTION("62717F08796A80" , vcvtsd2usi(r13d, qword_ptr(rdx, -1024)));
+ TEST_INSTRUCTION("62717F0879AAF8FBFFFF" , vcvtsd2usi(r13d, qword_ptr(rdx, -1032)));
+ TEST_INSTRUCTION("62B1FF0879C2" , vcvtsd2usi(rax, xmm18));
+ TEST_INSTRUCTION("62B1FF1879C2" , rn_sae().vcvtsd2usi(rax, xmm18));
+ TEST_INSTRUCTION("62B1FF5879C2" , ru_sae().vcvtsd2usi(rax, xmm18));
+ TEST_INSTRUCTION("62B1FF3879C2" , rd_sae().vcvtsd2usi(rax, xmm18));
+ TEST_INSTRUCTION("62B1FF7879C2" , rz_sae().vcvtsd2usi(rax, xmm18));
+ TEST_INSTRUCTION("62F1FF087901" , vcvtsd2usi(rax, qword_ptr(rcx)));
+ TEST_INSTRUCTION("62B1FF087984F023010000" , vcvtsd2usi(rax, qword_ptr(rax, r14, 3, 291)));
+ TEST_INSTRUCTION("62F1FF0879427F" , vcvtsd2usi(rax, qword_ptr(rdx, 1016)));
+ TEST_INSTRUCTION("62F1FF08798200040000" , vcvtsd2usi(rax, qword_ptr(rdx, 1024)));
+ TEST_INSTRUCTION("62F1FF08794280" , vcvtsd2usi(rax, qword_ptr(rdx, -1024)));
+ TEST_INSTRUCTION("62F1FF087982F8FBFFFF" , vcvtsd2usi(rax, qword_ptr(rdx, -1032)));
+ TEST_INSTRUCTION("6231FF0879C2" , vcvtsd2usi(r8, xmm18));
+ TEST_INSTRUCTION("6231FF1879C2" , rn_sae().vcvtsd2usi(r8, xmm18));
+ TEST_INSTRUCTION("6231FF5879C2" , ru_sae().vcvtsd2usi(r8, xmm18));
+ TEST_INSTRUCTION("6231FF3879C2" , rd_sae().vcvtsd2usi(r8, xmm18));
+ TEST_INSTRUCTION("6231FF7879C2" , rz_sae().vcvtsd2usi(r8, xmm18));
+ TEST_INSTRUCTION("6271FF087901" , vcvtsd2usi(r8, qword_ptr(rcx)));
+ TEST_INSTRUCTION("6231FF087984F023010000" , vcvtsd2usi(r8, qword_ptr(rax, r14, 3, 291)));
+ TEST_INSTRUCTION("6271FF0879427F" , vcvtsd2usi(r8, qword_ptr(rdx, 1016)));
+ TEST_INSTRUCTION("6271FF08798200040000" , vcvtsd2usi(r8, qword_ptr(rdx, 1024)));
+ TEST_INSTRUCTION("6271FF08794280" , vcvtsd2usi(r8, qword_ptr(rdx, -1024)));
+ TEST_INSTRUCTION("6271FF087982F8FBFFFF" , vcvtsd2usi(r8, qword_ptr(rdx, -1032)));
+ TEST_INSTRUCTION("62917E0879C4" , vcvtss2usi(eax, xmm28));
+ TEST_INSTRUCTION("62917E1879C4" , rn_sae().vcvtss2usi(eax, xmm28));
+ TEST_INSTRUCTION("62917E5879C4" , ru_sae().vcvtss2usi(eax, xmm28));
+ TEST_INSTRUCTION("62917E3879C4" , rd_sae().vcvtss2usi(eax, xmm28));
+ TEST_INSTRUCTION("62917E7879C4" , rz_sae().vcvtss2usi(eax, xmm28));
+ TEST_INSTRUCTION("62F17E087901" , vcvtss2usi(eax, dword_ptr(rcx)));
+ TEST_INSTRUCTION("62B17E087984F023010000" , vcvtss2usi(eax, dword_ptr(rax, r14, 3, 291)));
+ TEST_INSTRUCTION("62F17E0879427F" , vcvtss2usi(eax, dword_ptr(rdx, 508)));
+ TEST_INSTRUCTION("62F17E08798200020000" , vcvtss2usi(eax, dword_ptr(rdx, 512)));
+ TEST_INSTRUCTION("62F17E08794280" , vcvtss2usi(eax, dword_ptr(rdx, -512)));
+ TEST_INSTRUCTION("62F17E087982FCFDFFFF" , vcvtss2usi(eax, dword_ptr(rdx, -516)));
+ TEST_INSTRUCTION("62917E0879EC" , vcvtss2usi(ebp, xmm28));
+ TEST_INSTRUCTION("62917E1879EC" , rn_sae().vcvtss2usi(ebp, xmm28));
+ TEST_INSTRUCTION("62917E5879EC" , ru_sae().vcvtss2usi(ebp, xmm28));
+ TEST_INSTRUCTION("62917E3879EC" , rd_sae().vcvtss2usi(ebp, xmm28));
+ TEST_INSTRUCTION("62917E7879EC" , rz_sae().vcvtss2usi(ebp, xmm28));
+ TEST_INSTRUCTION("62F17E087929" , vcvtss2usi(ebp, dword_ptr(rcx)));
+ TEST_INSTRUCTION("62B17E0879ACF023010000" , vcvtss2usi(ebp, dword_ptr(rax, r14, 3, 291)));
+ TEST_INSTRUCTION("62F17E08796A7F" , vcvtss2usi(ebp, dword_ptr(rdx, 508)));
+ TEST_INSTRUCTION("62F17E0879AA00020000" , vcvtss2usi(ebp, dword_ptr(rdx, 512)));
+ TEST_INSTRUCTION("62F17E08796A80" , vcvtss2usi(ebp, dword_ptr(rdx, -512)));
+ TEST_INSTRUCTION("62F17E0879AAFCFDFFFF" , vcvtss2usi(ebp, dword_ptr(rdx, -516)));
+ TEST_INSTRUCTION("62117E0879EC" , vcvtss2usi(r13d, xmm28));
+ TEST_INSTRUCTION("62117E1879EC" , rn_sae().vcvtss2usi(r13d, xmm28));
+ TEST_INSTRUCTION("62117E5879EC" , ru_sae().vcvtss2usi(r13d, xmm28));
+ TEST_INSTRUCTION("62117E3879EC" , rd_sae().vcvtss2usi(r13d, xmm28));
+ TEST_INSTRUCTION("62117E7879EC" , rz_sae().vcvtss2usi(r13d, xmm28));
+ TEST_INSTRUCTION("62717E087929" , vcvtss2usi(r13d, dword_ptr(rcx)));
+ TEST_INSTRUCTION("62317E0879ACF023010000" , vcvtss2usi(r13d, dword_ptr(rax, r14, 3, 291)));
+ TEST_INSTRUCTION("62717E08796A7F" , vcvtss2usi(r13d, dword_ptr(rdx, 508)));
+ TEST_INSTRUCTION("62717E0879AA00020000" , vcvtss2usi(r13d, dword_ptr(rdx, 512)));
+ TEST_INSTRUCTION("62717E08796A80" , vcvtss2usi(r13d, dword_ptr(rdx, -512)));
+ TEST_INSTRUCTION("62717E0879AAFCFDFFFF" , vcvtss2usi(r13d, dword_ptr(rdx, -516)));
+ TEST_INSTRUCTION("62B1FE0879C7" , vcvtss2usi(rax, xmm23));
+ TEST_INSTRUCTION("62B1FE1879C7" , rn_sae().vcvtss2usi(rax, xmm23));
+ TEST_INSTRUCTION("62B1FE5879C7" , ru_sae().vcvtss2usi(rax, xmm23));
+ TEST_INSTRUCTION("62B1FE3879C7" , rd_sae().vcvtss2usi(rax, xmm23));
+ TEST_INSTRUCTION("62B1FE7879C7" , rz_sae().vcvtss2usi(rax, xmm23));
+ TEST_INSTRUCTION("62F1FE087901" , vcvtss2usi(rax, dword_ptr(rcx)));
+ TEST_INSTRUCTION("62B1FE087984F023010000" , vcvtss2usi(rax, dword_ptr(rax, r14, 3, 291)));
+ TEST_INSTRUCTION("62F1FE0879427F" , vcvtss2usi(rax, dword_ptr(rdx, 508)));
+ TEST_INSTRUCTION("62F1FE08798200020000" , vcvtss2usi(rax, dword_ptr(rdx, 512)));
+ TEST_INSTRUCTION("62F1FE08794280" , vcvtss2usi(rax, dword_ptr(rdx, -512)));
+ TEST_INSTRUCTION("62F1FE087982FCFDFFFF" , vcvtss2usi(rax, dword_ptr(rdx, -516)));
+ TEST_INSTRUCTION("6231FE0879C7" , vcvtss2usi(r8, xmm23));
+ TEST_INSTRUCTION("6231FE1879C7" , rn_sae().vcvtss2usi(r8, xmm23));
+ TEST_INSTRUCTION("6231FE5879C7" , ru_sae().vcvtss2usi(r8, xmm23));
+ TEST_INSTRUCTION("6231FE3879C7" , rd_sae().vcvtss2usi(r8, xmm23));
+ TEST_INSTRUCTION("6231FE7879C7" , rz_sae().vcvtss2usi(r8, xmm23));
+ TEST_INSTRUCTION("6271FE087901" , vcvtss2usi(r8, dword_ptr(rcx)));
+ TEST_INSTRUCTION("6231FE087984F023010000" , vcvtss2usi(r8, dword_ptr(rax, r14, 3, 291)));
+ TEST_INSTRUCTION("6271FE0879427F" , vcvtss2usi(r8, dword_ptr(rdx, 508)));
+ TEST_INSTRUCTION("6271FE08798200020000" , vcvtss2usi(r8, dword_ptr(rdx, 512)));
+ TEST_INSTRUCTION("6271FE08794280" , vcvtss2usi(r8, dword_ptr(rdx, -512)));
+ TEST_INSTRUCTION("6271FE087982FCFDFFFF" , vcvtss2usi(r8, dword_ptr(rdx, -516)));
+ TEST_INSTRUCTION("62E177087BD8" , vcvtusi2sd(xmm19, xmm1, eax));
+ TEST_INSTRUCTION("62E177087BDD" , vcvtusi2sd(xmm19, xmm1, ebp));
+ TEST_INSTRUCTION("62C177087BDD" , vcvtusi2sd(xmm19, xmm1, r13d));
+ TEST_INSTRUCTION("62E177087B19" , vcvtusi2sd(xmm19, xmm1, dword_ptr(rcx)));
+ TEST_INSTRUCTION("62A177087B9CF023010000" , vcvtusi2sd(xmm19, xmm1, dword_ptr(rax, r14, 3, 291)));
+ TEST_INSTRUCTION("62E177087B5A7F" , vcvtusi2sd(xmm19, xmm1, dword_ptr(rdx, 508)));
+ TEST_INSTRUCTION("62E177087B9A00020000" , vcvtusi2sd(xmm19, xmm1, dword_ptr(rdx, 512)));
+ TEST_INSTRUCTION("62E177087B5A80" , vcvtusi2sd(xmm19, xmm1, dword_ptr(rdx, -512)));
+ TEST_INSTRUCTION("62E177087B9AFCFDFFFF" , vcvtusi2sd(xmm19, xmm1, dword_ptr(rdx, -516)));
+ TEST_INSTRUCTION("6271AF007BF0" , vcvtusi2sd(xmm14, xmm26, rax));
+ TEST_INSTRUCTION("6271AF107BF0" , rn_sae().vcvtusi2sd(xmm14, xmm26, rax));
+ TEST_INSTRUCTION("6271AF507BF0" , ru_sae().vcvtusi2sd(xmm14, xmm26, rax));
+ TEST_INSTRUCTION("6271AF307BF0" , rd_sae().vcvtusi2sd(xmm14, xmm26, rax));
+ TEST_INSTRUCTION("6271AF707BF0" , rz_sae().vcvtusi2sd(xmm14, xmm26, rax));
+ TEST_INSTRUCTION("6251AF007BF0" , vcvtusi2sd(xmm14, xmm26, r8));
+ TEST_INSTRUCTION("6251AF107BF0" , rn_sae().vcvtusi2sd(xmm14, xmm26, r8));
+ TEST_INSTRUCTION("6251AF507BF0" , ru_sae().vcvtusi2sd(xmm14, xmm26, r8));
+ TEST_INSTRUCTION("6251AF307BF0" , rd_sae().vcvtusi2sd(xmm14, xmm26, r8));
+ TEST_INSTRUCTION("6251AF707BF0" , rz_sae().vcvtusi2sd(xmm14, xmm26, r8));
+ TEST_INSTRUCTION("6271AF007B31" , vcvtusi2sd(xmm14, xmm26, qword_ptr(rcx)));
+ TEST_INSTRUCTION("6231AF007BB4F023010000" , vcvtusi2sd(xmm14, xmm26, qword_ptr(rax, r14, 3, 291)));
+ TEST_INSTRUCTION("6271AF007B727F" , vcvtusi2sd(xmm14, xmm26, qword_ptr(rdx, 1016)));
+ TEST_INSTRUCTION("6271AF007BB200040000" , vcvtusi2sd(xmm14, xmm26, qword_ptr(rdx, 1024)));
+ TEST_INSTRUCTION("6271AF007B7280" , vcvtusi2sd(xmm14, xmm26, qword_ptr(rdx, -1024)));
+ TEST_INSTRUCTION("6271AF007BB2F8FBFFFF" , vcvtusi2sd(xmm14, xmm26, qword_ptr(rdx, -1032)));
+ TEST_INSTRUCTION("62F12E007BE8" , vcvtusi2ss(xmm5, xmm26, eax));
+ TEST_INSTRUCTION("62F12E107BE8" , rn_sae().vcvtusi2ss(xmm5, xmm26, eax));
+ TEST_INSTRUCTION("62F12E507BE8" , ru_sae().vcvtusi2ss(xmm5, xmm26, eax));
+ TEST_INSTRUCTION("62F12E307BE8" , rd_sae().vcvtusi2ss(xmm5, xmm26, eax));
+ TEST_INSTRUCTION("62F12E707BE8" , rz_sae().vcvtusi2ss(xmm5, xmm26, eax));
+ TEST_INSTRUCTION("62F12E007BED" , vcvtusi2ss(xmm5, xmm26, ebp));
+ TEST_INSTRUCTION("62F12E107BED" , rn_sae().vcvtusi2ss(xmm5, xmm26, ebp));
+ TEST_INSTRUCTION("62F12E507BED" , ru_sae().vcvtusi2ss(xmm5, xmm26, ebp));
+ TEST_INSTRUCTION("62F12E307BED" , rd_sae().vcvtusi2ss(xmm5, xmm26, ebp));
+ TEST_INSTRUCTION("62F12E707BED" , rz_sae().vcvtusi2ss(xmm5, xmm26, ebp));
+ TEST_INSTRUCTION("62D12E007BED" , vcvtusi2ss(xmm5, xmm26, r13d));
+ TEST_INSTRUCTION("62D12E107BED" , rn_sae().vcvtusi2ss(xmm5, xmm26, r13d));
+ TEST_INSTRUCTION("62D12E507BED" , ru_sae().vcvtusi2ss(xmm5, xmm26, r13d));
+ TEST_INSTRUCTION("62D12E307BED" , rd_sae().vcvtusi2ss(xmm5, xmm26, r13d));
+ TEST_INSTRUCTION("62D12E707BED" , rz_sae().vcvtusi2ss(xmm5, xmm26, r13d));
+ TEST_INSTRUCTION("62F12E007B29" , vcvtusi2ss(xmm5, xmm26, dword_ptr(rcx)));
+ TEST_INSTRUCTION("62B12E007BACF023010000" , vcvtusi2ss(xmm5, xmm26, dword_ptr(rax, r14, 3, 291)));
+ TEST_INSTRUCTION("62F12E007B6A7F" , vcvtusi2ss(xmm5, xmm26, dword_ptr(rdx, 508)));
+ TEST_INSTRUCTION("62F12E007BAA00020000" , vcvtusi2ss(xmm5, xmm26, dword_ptr(rdx, 512)));
+ TEST_INSTRUCTION("62F12E007B6A80" , vcvtusi2ss(xmm5, xmm26, dword_ptr(rdx, -512)));
+ TEST_INSTRUCTION("62F12E007BAAFCFDFFFF" , vcvtusi2ss(xmm5, xmm26, dword_ptr(rdx, -516)));
+ TEST_INSTRUCTION("6271CE007BF0" , vcvtusi2ss(xmm14, xmm22, rax));
+ TEST_INSTRUCTION("6271CE107BF0" , rn_sae().vcvtusi2ss(xmm14, xmm22, rax));
+ TEST_INSTRUCTION("6271CE507BF0" , ru_sae().vcvtusi2ss(xmm14, xmm22, rax));
+ TEST_INSTRUCTION("6271CE307BF0" , rd_sae().vcvtusi2ss(xmm14, xmm22, rax));
+ TEST_INSTRUCTION("6271CE707BF0" , rz_sae().vcvtusi2ss(xmm14, xmm22, rax));
+ TEST_INSTRUCTION("6251CE007BF0" , vcvtusi2ss(xmm14, xmm22, r8));
+ TEST_INSTRUCTION("6251CE107BF0" , rn_sae().vcvtusi2ss(xmm14, xmm22, r8));
+ TEST_INSTRUCTION("6251CE507BF0" , ru_sae().vcvtusi2ss(xmm14, xmm22, r8));
+ TEST_INSTRUCTION("6251CE307BF0" , rd_sae().vcvtusi2ss(xmm14, xmm22, r8));
+ TEST_INSTRUCTION("6251CE707BF0" , rz_sae().vcvtusi2ss(xmm14, xmm22, r8));
+ TEST_INSTRUCTION("6271CE007B31" , vcvtusi2ss(xmm14, xmm22, qword_ptr(rcx)));
+ TEST_INSTRUCTION("6231CE007BB4F023010000" , vcvtusi2ss(xmm14, xmm22, qword_ptr(rax, r14, 3, 291)));
+ TEST_INSTRUCTION("6271CE007B727F" , vcvtusi2ss(xmm14, xmm22, qword_ptr(rdx, 1016)));
+ TEST_INSTRUCTION("6271CE007BB200040000" , vcvtusi2ss(xmm14, xmm22, qword_ptr(rdx, 1024)));
+ TEST_INSTRUCTION("6271CE007B7280" , vcvtusi2ss(xmm14, xmm22, qword_ptr(rdx, -1024)));
+ TEST_INSTRUCTION("6271CE007BB2F8FBFFFF" , vcvtusi2ss(xmm14, xmm22, qword_ptr(rdx, -1032)));
+ TEST_INSTRUCTION("6202AD402CD4" , vscalefpd(zmm26, zmm26, zmm28));
+ TEST_INSTRUCTION("6202AD452CD4" , k(k5).vscalefpd(zmm26, zmm26, zmm28));
+ TEST_INSTRUCTION("6202ADC52CD4" , k(k5).z().vscalefpd(zmm26, zmm26, zmm28));
+ TEST_INSTRUCTION("6202AD102CD4" , rn_sae().vscalefpd(zmm26, zmm26, zmm28));
+ TEST_INSTRUCTION("6202AD502CD4" , ru_sae().vscalefpd(zmm26, zmm26, zmm28));
+ TEST_INSTRUCTION("6202AD302CD4" , rd_sae().vscalefpd(zmm26, zmm26, zmm28));
+ TEST_INSTRUCTION("6202AD702CD4" , rz_sae().vscalefpd(zmm26, zmm26, zmm28));
+ TEST_INSTRUCTION("6262AD402C11" , vscalefpd(zmm26, zmm26, zmmword_ptr(rcx)));
+ TEST_INSTRUCTION("6222AD402C94F023010000" , vscalefpd(zmm26, zmm26, zmmword_ptr(rax, r14, 3, 291)));
+ TEST_INSTRUCTION("6262AD502C11" , vscalefpd(zmm26, zmm26, qword_ptr(rcx)._1to8()));
+ TEST_INSTRUCTION("6262AD402C527F" , vscalefpd(zmm26, zmm26, zmmword_ptr(rdx, 8128)));
+ TEST_INSTRUCTION("6262AD402C9200200000" , vscalefpd(zmm26, zmm26, zmmword_ptr(rdx, 8192)));
+ TEST_INSTRUCTION("6262AD402C5280" , vscalefpd(zmm26, zmm26, zmmword_ptr(rdx, -8192)));
+ TEST_INSTRUCTION("6262AD402C92C0DFFFFF" , vscalefpd(zmm26, zmm26, zmmword_ptr(rdx, -8256)));
+ TEST_INSTRUCTION("6262AD502C527F" , vscalefpd(zmm26, zmm26, qword_ptr(rdx, 1016)._1to8()));
+ TEST_INSTRUCTION("6262AD502C9200040000" , vscalefpd(zmm26, zmm26, qword_ptr(rdx, 1024)._1to8()));
+ TEST_INSTRUCTION("6262AD502C5280" , vscalefpd(zmm26, zmm26, qword_ptr(rdx, -1024)._1to8()));
+ TEST_INSTRUCTION("6262AD502C92F8FBFFFF" , vscalefpd(zmm26, zmm26, qword_ptr(rdx, -1032)._1to8()));
+ TEST_INSTRUCTION("62A24D482CDA" , vscalefps(zmm19, zmm6, zmm18));
+ TEST_INSTRUCTION("62A24D4E2CDA" , k(k6).vscalefps(zmm19, zmm6, zmm18));
+ TEST_INSTRUCTION("62A24DCE2CDA" , k(k6).z().vscalefps(zmm19, zmm6, zmm18));
+ TEST_INSTRUCTION("62A24D182CDA" , rn_sae().vscalefps(zmm19, zmm6, zmm18));
+ TEST_INSTRUCTION("62A24D582CDA" , ru_sae().vscalefps(zmm19, zmm6, zmm18));
+ TEST_INSTRUCTION("62A24D382CDA" , rd_sae().vscalefps(zmm19, zmm6, zmm18));
+ TEST_INSTRUCTION("62A24D782CDA" , rz_sae().vscalefps(zmm19, zmm6, zmm18));
+ TEST_INSTRUCTION("62E24D482C19" , vscalefps(zmm19, zmm6, zmmword_ptr(rcx)));
+ TEST_INSTRUCTION("62A24D482C9CF023010000" , vscalefps(zmm19, zmm6, zmmword_ptr(rax, r14, 3, 291)));
+ TEST_INSTRUCTION("62E24D582C19" , vscalefps(zmm19, zmm6, dword_ptr(rcx)._1to16()));
+ TEST_INSTRUCTION("62E24D482C5A7F" , vscalefps(zmm19, zmm6, zmmword_ptr(rdx, 8128)));
+ TEST_INSTRUCTION("62E24D482C9A00200000" , vscalefps(zmm19, zmm6, zmmword_ptr(rdx, 8192)));
+ TEST_INSTRUCTION("62E24D482C5A80" , vscalefps(zmm19, zmm6, zmmword_ptr(rdx, -8192)));
+ TEST_INSTRUCTION("62E24D482C9AC0DFFFFF" , vscalefps(zmm19, zmm6, zmmword_ptr(rdx, -8256)));
+ TEST_INSTRUCTION("62E24D582C5A7F" , vscalefps(zmm19, zmm6, dword_ptr(rdx, 508)._1to16()));
+ TEST_INSTRUCTION("62E24D582C9A00020000" , vscalefps(zmm19, zmm6, dword_ptr(rdx, 512)._1to16()));
+ TEST_INSTRUCTION("62E24D582C5A80" , vscalefps(zmm19, zmm6, dword_ptr(rdx, -512)._1to16()));
+ TEST_INSTRUCTION("62E24D582C9AFCFDFFFF" , vscalefps(zmm19, zmm6, dword_ptr(rdx, -516)._1to16()));
+ TEST_INSTRUCTION("62A2CD002DED" , vscalefsd(xmm21, xmm22, xmm21));
+ TEST_INSTRUCTION("62A2CD022DED" , k(k2).vscalefsd(xmm21, xmm22, xmm21));
+ TEST_INSTRUCTION("62A2CD822DED" , k(k2).z().vscalefsd(xmm21, xmm22, xmm21));
+ TEST_INSTRUCTION("62A2CD102DED" , rn_sae().vscalefsd(xmm21, xmm22, xmm21));
+ TEST_INSTRUCTION("62A2CD502DED" , ru_sae().vscalefsd(xmm21, xmm22, xmm21));
+ TEST_INSTRUCTION("62A2CD302DED" , rd_sae().vscalefsd(xmm21, xmm22, xmm21));
+ TEST_INSTRUCTION("62A2CD702DED" , rz_sae().vscalefsd(xmm21, xmm22, xmm21));
+ TEST_INSTRUCTION("62E2CD002D29" , vscalefsd(xmm21, xmm22, qword_ptr(rcx)));
+ TEST_INSTRUCTION("62A2CD002DACF023010000" , vscalefsd(xmm21, xmm22, qword_ptr(rax, r14, 3, 291)));
+ TEST_INSTRUCTION("62E2CD002D6A7F" , vscalefsd(xmm21, xmm22, qword_ptr(rdx, 1016)));
+ TEST_INSTRUCTION("62E2CD002DAA00040000" , vscalefsd(xmm21, xmm22, qword_ptr(rdx, 1024)));
+ TEST_INSTRUCTION("62E2CD002D6A80" , vscalefsd(xmm21, xmm22, qword_ptr(rdx, -1024)));
+ TEST_INSTRUCTION("62E2CD002DAAF8FBFFFF" , vscalefsd(xmm21, xmm22, qword_ptr(rdx, -1032)));
+ TEST_INSTRUCTION("623205082DEF" , vscalefss(xmm13, xmm15, xmm23));
+ TEST_INSTRUCTION("6232050B2DEF" , k(k3).vscalefss(xmm13, xmm15, xmm23));
+ TEST_INSTRUCTION("6232058B2DEF" , k(k3).z().vscalefss(xmm13, xmm15, xmm23));
+ TEST_INSTRUCTION("623205182DEF" , rn_sae().vscalefss(xmm13, xmm15, xmm23));
+ TEST_INSTRUCTION("623205582DEF" , ru_sae().vscalefss(xmm13, xmm15, xmm23));
+ TEST_INSTRUCTION("623205382DEF" , rd_sae().vscalefss(xmm13, xmm15, xmm23));
+ TEST_INSTRUCTION("623205782DEF" , rz_sae().vscalefss(xmm13, xmm15, xmm23));
+ TEST_INSTRUCTION("627205082D29" , vscalefss(xmm13, xmm15, dword_ptr(rcx)));
+ TEST_INSTRUCTION("623205082DACF023010000" , vscalefss(xmm13, xmm15, dword_ptr(rax, r14, 3, 291)));
+ TEST_INSTRUCTION("627205082D6A7F" , vscalefss(xmm13, xmm15, dword_ptr(rdx, 508)));
+ TEST_INSTRUCTION("627205082DAA00020000" , vscalefss(xmm13, xmm15, dword_ptr(rdx, 512)));
+ TEST_INSTRUCTION("627205082D6A80" , vscalefss(xmm13, xmm15, dword_ptr(rdx, -512)));
+ TEST_INSTRUCTION("627205082DAAFCFDFFFF" , vscalefss(xmm13, xmm15, dword_ptr(rdx, -516)));
+ TEST_INSTRUCTION("62732D4054FAAB" , vfixupimmps(zmm15, zmm26, zmm2, 171));
+ TEST_INSTRUCTION("62732D4454FAAB" , k(k4).vfixupimmps(zmm15, zmm26, zmm2, 171));
+ TEST_INSTRUCTION("62732DC454FAAB" , k(k4).z().vfixupimmps(zmm15, zmm26, zmm2, 171));
+ TEST_INSTRUCTION("62732D1054FAAB" , sae().vfixupimmps(zmm15, zmm26, zmm2, 171));
+ TEST_INSTRUCTION("62732D4054FA7B" , vfixupimmps(zmm15, zmm26, zmm2, 123));
+ TEST_INSTRUCTION("62732D1054FA7B" , sae().vfixupimmps(zmm15, zmm26, zmm2, 123));
+ TEST_INSTRUCTION("62732D4054397B" , vfixupimmps(zmm15, zmm26, zmmword_ptr(rcx), 123));
+ TEST_INSTRUCTION("62332D4054BCF0230100007B" , vfixupimmps(zmm15, zmm26, zmmword_ptr(rax, r14, 3, 291), 123));
+ TEST_INSTRUCTION("62732D5054397B" , vfixupimmps(zmm15, zmm26, dword_ptr(rcx)._1to16(), 123));
+ TEST_INSTRUCTION("62732D40547A7F7B" , vfixupimmps(zmm15, zmm26, zmmword_ptr(rdx, 8128), 123));
+ TEST_INSTRUCTION("62732D4054BA002000007B" , vfixupimmps(zmm15, zmm26, zmmword_ptr(rdx, 8192), 123));
+ TEST_INSTRUCTION("62732D40547A807B" , vfixupimmps(zmm15, zmm26, zmmword_ptr(rdx, -8192), 123));
+ TEST_INSTRUCTION("62732D4054BAC0DFFFFF7B" , vfixupimmps(zmm15, zmm26, zmmword_ptr(rdx, -8256), 123));
+ TEST_INSTRUCTION("62732D50547A7F7B" , vfixupimmps(zmm15, zmm26, dword_ptr(rdx, 508)._1to16(), 123));
+ TEST_INSTRUCTION("62732D5054BA000200007B" , vfixupimmps(zmm15, zmm26, dword_ptr(rdx, 512)._1to16(), 123));
+ TEST_INSTRUCTION("62732D50547A807B" , vfixupimmps(zmm15, zmm26, dword_ptr(rdx, -512)._1to16(), 123));
+ TEST_INSTRUCTION("62732D5054BAFCFDFFFF7B" , vfixupimmps(zmm15, zmm26, dword_ptr(rdx, -516)._1to16(), 123));
+ TEST_INSTRUCTION("6233D54054CBAB" , vfixupimmpd(zmm9, zmm21, zmm19, 171));
+ TEST_INSTRUCTION("6233D54254CBAB" , k(k2).vfixupimmpd(zmm9, zmm21, zmm19, 171));
+ TEST_INSTRUCTION("6233D5C254CBAB" , k(k2).z().vfixupimmpd(zmm9, zmm21, zmm19, 171));
+ TEST_INSTRUCTION("6233D51054CBAB" , sae().vfixupimmpd(zmm9, zmm21, zmm19, 171));
+ TEST_INSTRUCTION("6233D54054CB7B" , vfixupimmpd(zmm9, zmm21, zmm19, 123));
+ TEST_INSTRUCTION("6233D51054CB7B" , sae().vfixupimmpd(zmm9, zmm21, zmm19, 123));
+ TEST_INSTRUCTION("6273D54054097B" , vfixupimmpd(zmm9, zmm21, zmmword_ptr(rcx), 123));
+ TEST_INSTRUCTION("6233D540548CF0230100007B" , vfixupimmpd(zmm9, zmm21, zmmword_ptr(rax, r14, 3, 291), 123));
+ TEST_INSTRUCTION("6273D55054097B" , vfixupimmpd(zmm9, zmm21, qword_ptr(rcx)._1to8(), 123));
+ TEST_INSTRUCTION("6273D540544A7F7B" , vfixupimmpd(zmm9, zmm21, zmmword_ptr(rdx, 8128), 123));
+ TEST_INSTRUCTION("6273D540548A002000007B" , vfixupimmpd(zmm9, zmm21, zmmword_ptr(rdx, 8192), 123));
+ TEST_INSTRUCTION("6273D540544A807B" , vfixupimmpd(zmm9, zmm21, zmmword_ptr(rdx, -8192), 123));
+ TEST_INSTRUCTION("6273D540548AC0DFFFFF7B" , vfixupimmpd(zmm9, zmm21, zmmword_ptr(rdx, -8256), 123));
+ TEST_INSTRUCTION("6273D550544A7F7B" , vfixupimmpd(zmm9, zmm21, qword_ptr(rdx, 1016)._1to8(), 123));
+ TEST_INSTRUCTION("6273D550548A000400007B" , vfixupimmpd(zmm9, zmm21, qword_ptr(rdx, 1024)._1to8(), 123));
+ TEST_INSTRUCTION("6273D550544A807B" , vfixupimmpd(zmm9, zmm21, qword_ptr(rdx, -1024)._1to8(), 123));
+ TEST_INSTRUCTION("6273D550548AF8FBFFFF7B" , vfixupimmpd(zmm9, zmm21, qword_ptr(rdx, -1032)._1to8(), 123));
+ TEST_INSTRUCTION("62136D0055FCAB" , vfixupimmss(xmm15, xmm18, xmm28, 171));
+ TEST_INSTRUCTION("62136D0555FCAB" , k(k5).vfixupimmss(xmm15, xmm18, xmm28, 171));
+ TEST_INSTRUCTION("62136D8555FCAB" , k(k5).z().vfixupimmss(xmm15, xmm18, xmm28, 171));
+ TEST_INSTRUCTION("62136D1055FCAB" , sae().vfixupimmss(xmm15, xmm18, xmm28, 171));
+ TEST_INSTRUCTION("62136D0055FC7B" , vfixupimmss(xmm15, xmm18, xmm28, 123));
+ TEST_INSTRUCTION("62136D1055FC7B" , sae().vfixupimmss(xmm15, xmm18, xmm28, 123));
+ TEST_INSTRUCTION("62736D0055397B" , vfixupimmss(xmm15, xmm18, dword_ptr(rcx), 123));
+ TEST_INSTRUCTION("62336D0055BCF0230100007B" , vfixupimmss(xmm15, xmm18, dword_ptr(rax, r14, 3, 291), 123));
+ TEST_INSTRUCTION("62736D00557A7F7B" , vfixupimmss(xmm15, xmm18, dword_ptr(rdx, 508), 123));
+ TEST_INSTRUCTION("62736D0055BA000200007B" , vfixupimmss(xmm15, xmm18, dword_ptr(rdx, 512), 123));
+ TEST_INSTRUCTION("62736D00557A807B" , vfixupimmss(xmm15, xmm18, dword_ptr(rdx, -512), 123));
+ TEST_INSTRUCTION("62736D0055BAFCFDFFFF7B" , vfixupimmss(xmm15, xmm18, dword_ptr(rdx, -516), 123));
+ TEST_INSTRUCTION("6273AD0055EDAB" , vfixupimmsd(xmm13, xmm26, xmm5, 171));
+ TEST_INSTRUCTION("6273AD0655EDAB" , k(k6).vfixupimmsd(xmm13, xmm26, xmm5, 171));
+ TEST_INSTRUCTION("6273AD8655EDAB" , k(k6).z().vfixupimmsd(xmm13, xmm26, xmm5, 171));
+ TEST_INSTRUCTION("6273AD1055EDAB" , sae().vfixupimmsd(xmm13, xmm26, xmm5, 171));
+ TEST_INSTRUCTION("6273AD0055ED7B" , vfixupimmsd(xmm13, xmm26, xmm5, 123));
+ TEST_INSTRUCTION("6273AD1055ED7B" , sae().vfixupimmsd(xmm13, xmm26, xmm5, 123));
+ TEST_INSTRUCTION("6273AD0055297B" , vfixupimmsd(xmm13, xmm26, qword_ptr(rcx), 123));
+ TEST_INSTRUCTION("6233AD0055ACF0230100007B" , vfixupimmsd(xmm13, xmm26, qword_ptr(rax, r14, 3, 291), 123));
+ TEST_INSTRUCTION("6273AD00556A7F7B" , vfixupimmsd(xmm13, xmm26, qword_ptr(rdx, 1016), 123));
+ TEST_INSTRUCTION("6273AD0055AA000400007B" , vfixupimmsd(xmm13, xmm26, qword_ptr(rdx, 1024), 123));
+ TEST_INSTRUCTION("6273AD00556A807B" , vfixupimmsd(xmm13, xmm26, qword_ptr(rdx, -1024), 123));
+ TEST_INSTRUCTION("6273AD0055AAF8FBFFFF7B" , vfixupimmsd(xmm13, xmm26, qword_ptr(rdx, -1032), 123));
+ TEST_INSTRUCTION("6291154072F0AB" , vpslld(zmm29, zmm24, 171));
+ TEST_INSTRUCTION("6291154672F0AB" , k(k6).vpslld(zmm29, zmm24, 171));
+ TEST_INSTRUCTION("629115C672F0AB" , k(k6).z().vpslld(zmm29, zmm24, 171));
+ TEST_INSTRUCTION("6291154072F07B" , vpslld(zmm29, zmm24, 123));
+ TEST_INSTRUCTION("62F1154072317B" , vpslld(zmm29, zmmword_ptr(rcx), 123));
+ TEST_INSTRUCTION("62B1154072B4F0230100007B" , vpslld(zmm29, zmmword_ptr(rax, r14, 3, 291), 123));
+ TEST_INSTRUCTION("62F1155072317B" , vpslld(zmm29, dword_ptr(rcx)._1to16(), 123));
+ TEST_INSTRUCTION("62F1154072727F7B" , vpslld(zmm29, zmmword_ptr(rdx, 8128), 123));
+ TEST_INSTRUCTION("62F1154072B2002000007B" , vpslld(zmm29, zmmword_ptr(rdx, 8192), 123));
+ TEST_INSTRUCTION("62F115407272807B" , vpslld(zmm29, zmmword_ptr(rdx, -8192), 123));
+ TEST_INSTRUCTION("62F1154072B2C0DFFFFF7B" , vpslld(zmm29, zmmword_ptr(rdx, -8256), 123));
+ TEST_INSTRUCTION("62F1155072727F7B" , vpslld(zmm29, dword_ptr(rdx, 508)._1to16(), 123));
+ TEST_INSTRUCTION("62F1155072B2000200007B" , vpslld(zmm29, dword_ptr(rdx, 512)._1to16(), 123));
+ TEST_INSTRUCTION("62F115507272807B" , vpslld(zmm29, dword_ptr(rdx, -512)._1to16(), 123));
+ TEST_INSTRUCTION("62F1155072B2FCFDFFFF7B" , vpslld(zmm29, dword_ptr(rdx, -516)._1to16(), 123));
+ TEST_INSTRUCTION("62D1CD4873F3AB" , vpsllq(zmm6, zmm11, 171));
+ TEST_INSTRUCTION("62D1CD4A73F3AB" , k(k2).vpsllq(zmm6, zmm11, 171));
+ TEST_INSTRUCTION("62D1CDCA73F3AB" , k(k2).z().vpsllq(zmm6, zmm11, 171));
+ TEST_INSTRUCTION("62D1CD4873F37B" , vpsllq(zmm6, zmm11, 123));
+ TEST_INSTRUCTION("62F1CD4873317B" , vpsllq(zmm6, zmmword_ptr(rcx), 123));
+ TEST_INSTRUCTION("62B1CD4873B4F0230100007B" , vpsllq(zmm6, zmmword_ptr(rax, r14, 3, 291), 123));
+ TEST_INSTRUCTION("62F1CD5873317B" , vpsllq(zmm6, qword_ptr(rcx)._1to8(), 123));
+ TEST_INSTRUCTION("62F1CD4873727F7B" , vpsllq(zmm6, zmmword_ptr(rdx, 8128), 123));
+ TEST_INSTRUCTION("62F1CD4873B2002000007B" , vpsllq(zmm6, zmmword_ptr(rdx, 8192), 123));
+ TEST_INSTRUCTION("62F1CD487372807B" , vpsllq(zmm6, zmmword_ptr(rdx, -8192), 123));
+ TEST_INSTRUCTION("62F1CD4873B2C0DFFFFF7B" , vpsllq(zmm6, zmmword_ptr(rdx, -8256), 123));
+ TEST_INSTRUCTION("62F1CD5873727F7B" , vpsllq(zmm6, qword_ptr(rdx, 1016)._1to8(), 123));
+ TEST_INSTRUCTION("62F1CD5873B2000400007B" , vpsllq(zmm6, qword_ptr(rdx, 1024)._1to8(), 123));
+ TEST_INSTRUCTION("62F1CD587372807B" , vpsllq(zmm6, qword_ptr(rdx, -1024)._1to8(), 123));
+ TEST_INSTRUCTION("62F1CD5873B2F8FBFFFF7B" , vpsllq(zmm6, qword_ptr(rdx, -1032)._1to8(), 123));
+ TEST_INSTRUCTION("62F1254072E5AB" , vpsrad(zmm27, zmm5, 171));
+ TEST_INSTRUCTION("62F1254572E5AB" , k(k5).vpsrad(zmm27, zmm5, 171));
+ TEST_INSTRUCTION("62F125C572E5AB" , k(k5).z().vpsrad(zmm27, zmm5, 171));
+ TEST_INSTRUCTION("62F1254072E57B" , vpsrad(zmm27, zmm5, 123));
+ TEST_INSTRUCTION("62F1254072217B" , vpsrad(zmm27, zmmword_ptr(rcx), 123));
+ TEST_INSTRUCTION("62B1254072A4F0230100007B" , vpsrad(zmm27, zmmword_ptr(rax, r14, 3, 291), 123));
+ TEST_INSTRUCTION("62F1255072217B" , vpsrad(zmm27, dword_ptr(rcx)._1to16(), 123));
+ TEST_INSTRUCTION("62F1254072627F7B" , vpsrad(zmm27, zmmword_ptr(rdx, 8128), 123));
+ TEST_INSTRUCTION("62F1254072A2002000007B" , vpsrad(zmm27, zmmword_ptr(rdx, 8192), 123));
+ TEST_INSTRUCTION("62F125407262807B" , vpsrad(zmm27, zmmword_ptr(rdx, -8192), 123));
+ TEST_INSTRUCTION("62F1254072A2C0DFFFFF7B" , vpsrad(zmm27, zmmword_ptr(rdx, -8256), 123));
+ TEST_INSTRUCTION("62F1255072627F7B" , vpsrad(zmm27, dword_ptr(rdx, 508)._1to16(), 123));
+ TEST_INSTRUCTION("62F1255072A2000200007B" , vpsrad(zmm27, dword_ptr(rdx, 512)._1to16(), 123));
+ TEST_INSTRUCTION("62F125507262807B" , vpsrad(zmm27, dword_ptr(rdx, -512)._1to16(), 123));
+ TEST_INSTRUCTION("62F1255072A2FCFDFFFF7B" , vpsrad(zmm27, dword_ptr(rdx, -516)._1to16(), 123));
+ TEST_INSTRUCTION("62F1954072E5AB" , vpsraq(zmm29, zmm5, 171));
+ TEST_INSTRUCTION("62F1954472E5AB" , k(k4).vpsraq(zmm29, zmm5, 171));
+ TEST_INSTRUCTION("62F195C472E5AB" , k(k4).z().vpsraq(zmm29, zmm5, 171));
+ TEST_INSTRUCTION("62F1954072E57B" , vpsraq(zmm29, zmm5, 123));
+ TEST_INSTRUCTION("62F1954072217B" , vpsraq(zmm29, zmmword_ptr(rcx), 123));
+ TEST_INSTRUCTION("62B1954072A4F0230100007B" , vpsraq(zmm29, zmmword_ptr(rax, r14, 3, 291), 123));
+ TEST_INSTRUCTION("62F1955072217B" , vpsraq(zmm29, qword_ptr(rcx)._1to8(), 123));
+ TEST_INSTRUCTION("62F1954072627F7B" , vpsraq(zmm29, zmmword_ptr(rdx, 8128), 123));
+ TEST_INSTRUCTION("62F1954072A2002000007B" , vpsraq(zmm29, zmmword_ptr(rdx, 8192), 123));
+ TEST_INSTRUCTION("62F195407262807B" , vpsraq(zmm29, zmmword_ptr(rdx, -8192), 123));
+ TEST_INSTRUCTION("62F1954072A2C0DFFFFF7B" , vpsraq(zmm29, zmmword_ptr(rdx, -8256), 123));
+ TEST_INSTRUCTION("62F1955072627F7B" , vpsraq(zmm29, qword_ptr(rdx, 1016)._1to8(), 123));
+ TEST_INSTRUCTION("62F1955072A2000400007B" , vpsraq(zmm29, qword_ptr(rdx, 1024)._1to8(), 123));
+ TEST_INSTRUCTION("62F195507262807B" , vpsraq(zmm29, qword_ptr(rdx, -1024)._1to8(), 123));
+ TEST_INSTRUCTION("62F1955072A2F8FBFFFF7B" , vpsraq(zmm29, qword_ptr(rdx, -1032)._1to8(), 123));
+ TEST_INSTRUCTION("62B2154015F0" , vprolvd(zmm6, zmm29, zmm16));
+ TEST_INSTRUCTION("62B2154215F0" , k(k2).vprolvd(zmm6, zmm29, zmm16));
+ TEST_INSTRUCTION("62B215C215F0" , k(k2).z().vprolvd(zmm6, zmm29, zmm16));
+ TEST_INSTRUCTION("62F215401531" , vprolvd(zmm6, zmm29, zmmword_ptr(rcx)));
+ TEST_INSTRUCTION("62B2154015B4F023010000" , vprolvd(zmm6, zmm29, zmmword_ptr(rax, r14, 3, 291)));
+ TEST_INSTRUCTION("62F215501531" , vprolvd(zmm6, zmm29, dword_ptr(rcx)._1to16()));
+ TEST_INSTRUCTION("62F2154015727F" , vprolvd(zmm6, zmm29, zmmword_ptr(rdx, 8128)));
+ TEST_INSTRUCTION("62F2154015B200200000" , vprolvd(zmm6, zmm29, zmmword_ptr(rdx, 8192)));
+ TEST_INSTRUCTION("62F21540157280" , vprolvd(zmm6, zmm29, zmmword_ptr(rdx, -8192)));
+ TEST_INSTRUCTION("62F2154015B2C0DFFFFF" , vprolvd(zmm6, zmm29, zmmword_ptr(rdx, -8256)));
+ TEST_INSTRUCTION("62F2155015727F" , vprolvd(zmm6, zmm29, dword_ptr(rdx, 508)._1to16()));
+ TEST_INSTRUCTION("62F2155015B200020000" , vprolvd(zmm6, zmm29, dword_ptr(rdx, 512)._1to16()));
+ TEST_INSTRUCTION("62F21550157280" , vprolvd(zmm6, zmm29, dword_ptr(rdx, -512)._1to16()));
+ TEST_INSTRUCTION("62F2155015B2FCFDFFFF" , vprolvd(zmm6, zmm29, dword_ptr(rdx, -516)._1to16()));
+ TEST_INSTRUCTION("62F12D4872CDAB" , vprold(zmm10, zmm5, 171));
+ TEST_INSTRUCTION("62F12D4F72CDAB" , k(k7).vprold(zmm10, zmm5, 171));
+ TEST_INSTRUCTION("62F12DCF72CDAB" , k(k7).z().vprold(zmm10, zmm5, 171));
+ TEST_INSTRUCTION("62F12D4872CD7B" , vprold(zmm10, zmm5, 123));
+ TEST_INSTRUCTION("62F12D4872097B" , vprold(zmm10, zmmword_ptr(rcx), 123));
+ TEST_INSTRUCTION("62B12D48728CF0230100007B" , vprold(zmm10, zmmword_ptr(rax, r14, 3, 291), 123));
+ TEST_INSTRUCTION("62F12D5872097B" , vprold(zmm10, dword_ptr(rcx)._1to16(), 123));
+ TEST_INSTRUCTION("62F12D48724A7F7B" , vprold(zmm10, zmmword_ptr(rdx, 8128), 123));
+ TEST_INSTRUCTION("62F12D48728A002000007B" , vprold(zmm10, zmmword_ptr(rdx, 8192), 123));
+ TEST_INSTRUCTION("62F12D48724A807B" , vprold(zmm10, zmmword_ptr(rdx, -8192), 123));
+ TEST_INSTRUCTION("62F12D48728AC0DFFFFF7B" , vprold(zmm10, zmmword_ptr(rdx, -8256), 123));
+ TEST_INSTRUCTION("62F12D58724A7F7B" , vprold(zmm10, dword_ptr(rdx, 508)._1to16(), 123));
+ TEST_INSTRUCTION("62F12D58728A000200007B" , vprold(zmm10, dword_ptr(rdx, 512)._1to16(), 123));
+ TEST_INSTRUCTION("62F12D58724A807B" , vprold(zmm10, dword_ptr(rdx, -512)._1to16(), 123));
+ TEST_INSTRUCTION("62F12D58728AFCFDFFFF7B" , vprold(zmm10, dword_ptr(rdx, -516)._1to16(), 123));
+ TEST_INSTRUCTION("6262DD4815DE" , vprolvq(zmm27, zmm4, zmm6));
+ TEST_INSTRUCTION("6262DD4D15DE" , k(k5).vprolvq(zmm27, zmm4, zmm6));
+ TEST_INSTRUCTION("6262DDCD15DE" , k(k5).z().vprolvq(zmm27, zmm4, zmm6));
+ TEST_INSTRUCTION("6262DD481519" , vprolvq(zmm27, zmm4, zmmword_ptr(rcx)));
+ TEST_INSTRUCTION("6222DD48159CF023010000" , vprolvq(zmm27, zmm4, zmmword_ptr(rax, r14, 3, 291)));
+ TEST_INSTRUCTION("6262DD581519" , vprolvq(zmm27, zmm4, qword_ptr(rcx)._1to8()));
+ TEST_INSTRUCTION("6262DD48155A7F" , vprolvq(zmm27, zmm4, zmmword_ptr(rdx, 8128)));
+ TEST_INSTRUCTION("6262DD48159A00200000" , vprolvq(zmm27, zmm4, zmmword_ptr(rdx, 8192)));
+ TEST_INSTRUCTION("6262DD48155A80" , vprolvq(zmm27, zmm4, zmmword_ptr(rdx, -8192)));
+ TEST_INSTRUCTION("6262DD48159AC0DFFFFF" , vprolvq(zmm27, zmm4, zmmword_ptr(rdx, -8256)));
+ TEST_INSTRUCTION("6262DD58155A7F" , vprolvq(zmm27, zmm4, qword_ptr(rdx, 1016)._1to8()));
+ TEST_INSTRUCTION("6262DD58159A00040000" , vprolvq(zmm27, zmm4, qword_ptr(rdx, 1024)._1to8()));
+ TEST_INSTRUCTION("6262DD58155A80" , vprolvq(zmm27, zmm4, qword_ptr(rdx, -1024)._1to8()));
+ TEST_INSTRUCTION("6262DD58159AF8FBFFFF" , vprolvq(zmm27, zmm4, qword_ptr(rdx, -1032)._1to8()));
+ TEST_INSTRUCTION("62B1E54072CAAB" , vprolq(zmm19, zmm18, 171));
+ TEST_INSTRUCTION("62B1E54372CAAB" , k(k3).vprolq(zmm19, zmm18, 171));
+ TEST_INSTRUCTION("62B1E5C372CAAB" , k(k3).z().vprolq(zmm19, zmm18, 171));
+ TEST_INSTRUCTION("62B1E54072CA7B" , vprolq(zmm19, zmm18, 123));
+ TEST_INSTRUCTION("62F1E54072097B" , vprolq(zmm19, zmmword_ptr(rcx), 123));
+ TEST_INSTRUCTION("62B1E540728CF0230100007B" , vprolq(zmm19, zmmword_ptr(rax, r14, 3, 291), 123));
+ TEST_INSTRUCTION("62F1E55072097B" , vprolq(zmm19, qword_ptr(rcx)._1to8(), 123));
+ TEST_INSTRUCTION("62F1E540724A7F7B" , vprolq(zmm19, zmmword_ptr(rdx, 8128), 123));
+ TEST_INSTRUCTION("62F1E540728A002000007B" , vprolq(zmm19, zmmword_ptr(rdx, 8192), 123));
+ TEST_INSTRUCTION("62F1E540724A807B" , vprolq(zmm19, zmmword_ptr(rdx, -8192), 123));
+ TEST_INSTRUCTION("62F1E540728AC0DFFFFF7B" , vprolq(zmm19, zmmword_ptr(rdx, -8256), 123));
+ TEST_INSTRUCTION("62F1E550724A7F7B" , vprolq(zmm19, qword_ptr(rdx, 1016)._1to8(), 123));
+ TEST_INSTRUCTION("62F1E550728A000400007B" , vprolq(zmm19, qword_ptr(rdx, 1024)._1to8(), 123));
+ TEST_INSTRUCTION("62F1E550724A807B" , vprolq(zmm19, qword_ptr(rdx, -1024)._1to8(), 123));
+ TEST_INSTRUCTION("62F1E550728AF8FBFFFF7B" , vprolq(zmm19, qword_ptr(rdx, -1032)._1to8(), 123));
+ TEST_INSTRUCTION("62125D4014DC" , vprorvd(zmm11, zmm20, zmm28));
+ TEST_INSTRUCTION("62125D4214DC" , k(k2).vprorvd(zmm11, zmm20, zmm28));
+ TEST_INSTRUCTION("62125DC214DC" , k(k2).z().vprorvd(zmm11, zmm20, zmm28));
+ TEST_INSTRUCTION("62725D401419" , vprorvd(zmm11, zmm20, zmmword_ptr(rcx)));
+ TEST_INSTRUCTION("62325D40149CF023010000" , vprorvd(zmm11, zmm20, zmmword_ptr(rax, r14, 3, 291)));
+ TEST_INSTRUCTION("62725D501419" , vprorvd(zmm11, zmm20, dword_ptr(rcx)._1to16()));
+ TEST_INSTRUCTION("62725D40145A7F" , vprorvd(zmm11, zmm20, zmmword_ptr(rdx, 8128)));
+ TEST_INSTRUCTION("62725D40149A00200000" , vprorvd(zmm11, zmm20, zmmword_ptr(rdx, 8192)));
+ TEST_INSTRUCTION("62725D40145A80" , vprorvd(zmm11, zmm20, zmmword_ptr(rdx, -8192)));
+ TEST_INSTRUCTION("62725D40149AC0DFFFFF" , vprorvd(zmm11, zmm20, zmmword_ptr(rdx, -8256)));
+ TEST_INSTRUCTION("62725D50145A7F" , vprorvd(zmm11, zmm20, dword_ptr(rdx, 508)._1to16()));
+ TEST_INSTRUCTION("62725D50149A00020000" , vprorvd(zmm11, zmm20, dword_ptr(rdx, 512)._1to16()));
+ TEST_INSTRUCTION("62725D50145A80" , vprorvd(zmm11, zmm20, dword_ptr(rdx, -512)._1to16()));
+ TEST_INSTRUCTION("62725D50149AFCFDFFFF" , vprorvd(zmm11, zmm20, dword_ptr(rdx, -516)._1to16()));
+ TEST_INSTRUCTION("62D1354872C2AB" , vprord(zmm9, zmm10, 171));
+ TEST_INSTRUCTION("62D1354F72C2AB" , k(k7).vprord(zmm9, zmm10, 171));
+ TEST_INSTRUCTION("62D135CF72C2AB" , k(k7).z().vprord(zmm9, zmm10, 171));
+ TEST_INSTRUCTION("62D1354872C27B" , vprord(zmm9, zmm10, 123));
+ TEST_INSTRUCTION("62F1354872017B" , vprord(zmm9, zmmword_ptr(rcx), 123));
+ TEST_INSTRUCTION("62B135487284F0230100007B" , vprord(zmm9, zmmword_ptr(rax, r14, 3, 291), 123));
+ TEST_INSTRUCTION("62F1355872017B" , vprord(zmm9, dword_ptr(rcx)._1to16(), 123));
+ TEST_INSTRUCTION("62F1354872427F7B" , vprord(zmm9, zmmword_ptr(rdx, 8128), 123));
+ TEST_INSTRUCTION("62F135487282002000007B" , vprord(zmm9, zmmword_ptr(rdx, 8192), 123));
+ TEST_INSTRUCTION("62F135487242807B" , vprord(zmm9, zmmword_ptr(rdx, -8192), 123));
+ TEST_INSTRUCTION("62F135487282C0DFFFFF7B" , vprord(zmm9, zmmword_ptr(rdx, -8256), 123));
+ TEST_INSTRUCTION("62F1355872427F7B" , vprord(zmm9, dword_ptr(rdx, 508)._1to16(), 123));
+ TEST_INSTRUCTION("62F135587282000200007B" , vprord(zmm9, dword_ptr(rdx, 512)._1to16(), 123));
+ TEST_INSTRUCTION("62F135587242807B" , vprord(zmm9, dword_ptr(rdx, -512)._1to16(), 123));
+ TEST_INSTRUCTION("62F135587282FCFDFFFF7B" , vprord(zmm9, dword_ptr(rdx, -516)._1to16(), 123));
+ TEST_INSTRUCTION("6272BD4014F1" , vprorvq(zmm14, zmm24, zmm1));
+ TEST_INSTRUCTION("6272BD4714F1" , k(k7).vprorvq(zmm14, zmm24, zmm1));
+ TEST_INSTRUCTION("6272BDC714F1" , k(k7).z().vprorvq(zmm14, zmm24, zmm1));
+ TEST_INSTRUCTION("6272BD401431" , vprorvq(zmm14, zmm24, zmmword_ptr(rcx)));
+ TEST_INSTRUCTION("6232BD4014B4F023010000" , vprorvq(zmm14, zmm24, zmmword_ptr(rax, r14, 3, 291)));
+ TEST_INSTRUCTION("6272BD501431" , vprorvq(zmm14, zmm24, qword_ptr(rcx)._1to8()));
+ TEST_INSTRUCTION("6272BD4014727F" , vprorvq(zmm14, zmm24, zmmword_ptr(rdx, 8128)));
+ TEST_INSTRUCTION("6272BD4014B200200000" , vprorvq(zmm14, zmm24, zmmword_ptr(rdx, 8192)));
+ TEST_INSTRUCTION("6272BD40147280" , vprorvq(zmm14, zmm24, zmmword_ptr(rdx, -8192)));
+ TEST_INSTRUCTION("6272BD4014B2C0DFFFFF" , vprorvq(zmm14, zmm24, zmmword_ptr(rdx, -8256)));
+ TEST_INSTRUCTION("6272BD5014727F" , vprorvq(zmm14, zmm24, qword_ptr(rdx, 1016)._1to8()));
+ TEST_INSTRUCTION("6272BD5014B200040000" , vprorvq(zmm14, zmm24, qword_ptr(rdx, 1024)._1to8()));
+ TEST_INSTRUCTION("6272BD50147280" , vprorvq(zmm14, zmm24, qword_ptr(rdx, -1024)._1to8()));
+ TEST_INSTRUCTION("6272BD5014B2F8FBFFFF" , vprorvq(zmm14, zmm24, qword_ptr(rdx, -1032)._1to8()));
+ TEST_INSTRUCTION("6291D54072C1AB" , vprorq(zmm21, zmm25, 171));
+ TEST_INSTRUCTION("6291D54672C1AB" , k(k6).vprorq(zmm21, zmm25, 171));
+ TEST_INSTRUCTION("6291D5C672C1AB" , k(k6).z().vprorq(zmm21, zmm25, 171));
+ TEST_INSTRUCTION("6291D54072C17B" , vprorq(zmm21, zmm25, 123));
+ TEST_INSTRUCTION("62F1D54072017B" , vprorq(zmm21, zmmword_ptr(rcx), 123));
+ TEST_INSTRUCTION("62B1D5407284F0230100007B" , vprorq(zmm21, zmmword_ptr(rax, r14, 3, 291), 123));
+ TEST_INSTRUCTION("62F1D55072017B" , vprorq(zmm21, qword_ptr(rcx)._1to8(), 123));
+ TEST_INSTRUCTION("62F1D54072427F7B" , vprorq(zmm21, zmmword_ptr(rdx, 8128), 123));
+ TEST_INSTRUCTION("62F1D5407282002000007B" , vprorq(zmm21, zmmword_ptr(rdx, 8192), 123));
+ TEST_INSTRUCTION("62F1D5407242807B" , vprorq(zmm21, zmmword_ptr(rdx, -8192), 123));
+ TEST_INSTRUCTION("62F1D5407282C0DFFFFF7B" , vprorq(zmm21, zmmword_ptr(rdx, -8256), 123));
+ TEST_INSTRUCTION("62F1D55072427F7B" , vprorq(zmm21, qword_ptr(rdx, 1016)._1to8(), 123));
+ TEST_INSTRUCTION("62F1D5507282000400007B" , vprorq(zmm21, qword_ptr(rdx, 1024)._1to8(), 123));
+ TEST_INSTRUCTION("62F1D5507242807B" , vprorq(zmm21, qword_ptr(rdx, -1024)._1to8(), 123));
+ TEST_INSTRUCTION("62F1D5507282F8FBFFFF7B" , vprorq(zmm21, qword_ptr(rdx, -1032)._1to8(), 123));
+ TEST_INSTRUCTION("62E3FD4809F7AB" , vrndscalepd(zmm22, zmm7, 171));
+ TEST_INSTRUCTION("62E3FD4909F7AB" , k(k1).vrndscalepd(zmm22, zmm7, 171));
+ TEST_INSTRUCTION("62E3FDC909F7AB" , k(k1).z().vrndscalepd(zmm22, zmm7, 171));
+ TEST_INSTRUCTION("62E3FD1809F7AB" , sae().vrndscalepd(zmm22, zmm7, 171));
+ TEST_INSTRUCTION("62E3FD4809F77B" , vrndscalepd(zmm22, zmm7, 123));
+ TEST_INSTRUCTION("62E3FD1809F77B" , sae().vrndscalepd(zmm22, zmm7, 123));
+ TEST_INSTRUCTION("62E3FD4809317B" , vrndscalepd(zmm22, zmmword_ptr(rcx), 123));
+ TEST_INSTRUCTION("62A3FD4809B4F0230100007B" , vrndscalepd(zmm22, zmmword_ptr(rax, r14, 3, 291), 123));
+ TEST_INSTRUCTION("62E3FD5809317B" , vrndscalepd(zmm22, qword_ptr(rcx)._1to8(), 123));
+ TEST_INSTRUCTION("62E3FD4809727F7B" , vrndscalepd(zmm22, zmmword_ptr(rdx, 8128), 123));
+ TEST_INSTRUCTION("62E3FD4809B2002000007B" , vrndscalepd(zmm22, zmmword_ptr(rdx, 8192), 123));
+ TEST_INSTRUCTION("62E3FD480972807B" , vrndscalepd(zmm22, zmmword_ptr(rdx, -8192), 123));
+ TEST_INSTRUCTION("62E3FD4809B2C0DFFFFF7B" , vrndscalepd(zmm22, zmmword_ptr(rdx, -8256), 123));
+ TEST_INSTRUCTION("62E3FD5809727F7B" , vrndscalepd(zmm22, qword_ptr(rdx, 1016)._1to8(), 123));
+ TEST_INSTRUCTION("62E3FD5809B2000400007B" , vrndscalepd(zmm22, qword_ptr(rdx, 1024)._1to8(), 123));
+ TEST_INSTRUCTION("62E3FD580972807B" , vrndscalepd(zmm22, qword_ptr(rdx, -1024)._1to8(), 123));
+ TEST_INSTRUCTION("62E3FD5809B2F8FBFFFF7B" , vrndscalepd(zmm22, qword_ptr(rdx, -1032)._1to8(), 123));
+ TEST_INSTRUCTION("62737D4808EFAB" , vrndscaleps(zmm13, zmm7, 171));
+ TEST_INSTRUCTION("62737D4908EFAB" , k(k1).vrndscaleps(zmm13, zmm7, 171));
+ TEST_INSTRUCTION("62737DC908EFAB" , k(k1).z().vrndscaleps(zmm13, zmm7, 171));
+ TEST_INSTRUCTION("62737D1808EFAB" , sae().vrndscaleps(zmm13, zmm7, 171));
+ TEST_INSTRUCTION("62737D4808EF7B" , vrndscaleps(zmm13, zmm7, 123));
+ TEST_INSTRUCTION("62737D1808EF7B" , sae().vrndscaleps(zmm13, zmm7, 123));
+ TEST_INSTRUCTION("62737D4808297B" , vrndscaleps(zmm13, zmmword_ptr(rcx), 123));
+ TEST_INSTRUCTION("62337D4808ACF0230100007B" , vrndscaleps(zmm13, zmmword_ptr(rax, r14, 3, 291), 123));
+ TEST_INSTRUCTION("62737D5808297B" , vrndscaleps(zmm13, dword_ptr(rcx)._1to16(), 123));
+ TEST_INSTRUCTION("62737D48086A7F7B" , vrndscaleps(zmm13, zmmword_ptr(rdx, 8128), 123));
+ TEST_INSTRUCTION("62737D4808AA002000007B" , vrndscaleps(zmm13, zmmword_ptr(rdx, 8192), 123));
+ TEST_INSTRUCTION("62737D48086A807B" , vrndscaleps(zmm13, zmmword_ptr(rdx, -8192), 123));
+ TEST_INSTRUCTION("62737D4808AAC0DFFFFF7B" , vrndscaleps(zmm13, zmmword_ptr(rdx, -8256), 123));
+ TEST_INSTRUCTION("62737D58086A7F7B" , vrndscaleps(zmm13, dword_ptr(rdx, 508)._1to16(), 123));
+ TEST_INSTRUCTION("62737D5808AA000200007B" , vrndscaleps(zmm13, dword_ptr(rdx, 512)._1to16(), 123));
+ TEST_INSTRUCTION("62737D58086A807B" , vrndscaleps(zmm13, dword_ptr(rdx, -512)._1to16(), 123));
+ TEST_INSTRUCTION("62737D5808AAFCFDFFFF7B" , vrndscaleps(zmm13, dword_ptr(rdx, -516)._1to16(), 123));
+ TEST_INSTRUCTION("62439D080BCFAB" , vrndscalesd(xmm25, xmm12, xmm15, 171));
+ TEST_INSTRUCTION("62439D0E0BCFAB" , k(k6).vrndscalesd(xmm25, xmm12, xmm15, 171));
+ TEST_INSTRUCTION("62439D8E0BCFAB" , k(k6).z().vrndscalesd(xmm25, xmm12, xmm15, 171));
+ TEST_INSTRUCTION("62439D180BCFAB" , sae().vrndscalesd(xmm25, xmm12, xmm15, 171));
+ TEST_INSTRUCTION("62439D080BCF7B" , vrndscalesd(xmm25, xmm12, xmm15, 123));
+ TEST_INSTRUCTION("62439D180BCF7B" , sae().vrndscalesd(xmm25, xmm12, xmm15, 123));
+ TEST_INSTRUCTION("62639D080B097B" , vrndscalesd(xmm25, xmm12, qword_ptr(rcx), 123));
+ TEST_INSTRUCTION("62239D080B8CF0230100007B" , vrndscalesd(xmm25, xmm12, qword_ptr(rax, r14, 3, 291), 123));
+ TEST_INSTRUCTION("62639D080B4A7F7B" , vrndscalesd(xmm25, xmm12, qword_ptr(rdx, 1016), 123));
+ TEST_INSTRUCTION("62639D080B8A000400007B" , vrndscalesd(xmm25, xmm12, qword_ptr(rdx, 1024), 123));
+ TEST_INSTRUCTION("62639D080B4A807B" , vrndscalesd(xmm25, xmm12, qword_ptr(rdx, -1024), 123));
+ TEST_INSTRUCTION("62639D080B8AF8FBFFFF7B" , vrndscalesd(xmm25, xmm12, qword_ptr(rdx, -1032), 123));
+ TEST_INSTRUCTION("623325080AD9AB" , vrndscaless(xmm11, xmm11, xmm17, 171));
+ TEST_INSTRUCTION("6233250B0AD9AB" , k(k3).vrndscaless(xmm11, xmm11, xmm17, 171));
+ TEST_INSTRUCTION("6233258B0AD9AB" , k(k3).z().vrndscaless(xmm11, xmm11, xmm17, 171));
+ TEST_INSTRUCTION("623325180AD9AB" , sae().vrndscaless(xmm11, xmm11, xmm17, 171));
+ TEST_INSTRUCTION("623325080AD97B" , vrndscaless(xmm11, xmm11, xmm17, 123));
+ TEST_INSTRUCTION("623325180AD97B" , sae().vrndscaless(xmm11, xmm11, xmm17, 123));
+ TEST_INSTRUCTION("627325080A197B" , vrndscaless(xmm11, xmm11, dword_ptr(rcx), 123));
+ TEST_INSTRUCTION("623325080A9CF0230100007B" , vrndscaless(xmm11, xmm11, dword_ptr(rax, r14, 3, 291), 123));
+ TEST_INSTRUCTION("627325080A5A7F7B" , vrndscaless(xmm11, xmm11, dword_ptr(rdx, 508), 123));
+ TEST_INSTRUCTION("627325080A9A000200007B" , vrndscaless(xmm11, xmm11, dword_ptr(rdx, 512), 123));
+ TEST_INSTRUCTION("627325080A5A807B" , vrndscaless(xmm11, xmm11, dword_ptr(rdx, -512), 123));
+ TEST_INSTRUCTION("627325080A9AFCFDFFFF7B" , vrndscaless(xmm11, xmm11, dword_ptr(rdx, -516), 123));
+ TEST_INSTRUCTION("6272FD488B19" , vpcompressq(zmmword_ptr(rcx), zmm11));
+ TEST_INSTRUCTION("6272FD4F8B19" , k(k7).vpcompressq(zmmword_ptr(rcx), zmm11));
+ TEST_INSTRUCTION("6232FD488B9CF023010000" , vpcompressq(zmmword_ptr(rax, r14, 3, 291), zmm11));
+ TEST_INSTRUCTION("6272FD488B5A7F" , vpcompressq(zmmword_ptr(rdx, 1016), zmm11));
+ TEST_INSTRUCTION("6272FD488B9A00040000" , vpcompressq(zmmword_ptr(rdx, 1024), zmm11));
+ TEST_INSTRUCTION("6272FD488B5A80" , vpcompressq(zmmword_ptr(rdx, -1024), zmm11));
+ TEST_INSTRUCTION("6272FD488B9AF8FBFFFF" , vpcompressq(zmmword_ptr(rdx, -1032), zmm11));
+ TEST_INSTRUCTION("62A2FD488BD9" , vpcompressq(zmm17, zmm19));
+ TEST_INSTRUCTION("62A2FD4A8BD9" , k(k2).vpcompressq(zmm17, zmm19));
+ TEST_INSTRUCTION("62A2FDCA8BD9" , k(k2).z().vpcompressq(zmm17, zmm19));
+ TEST_INSTRUCTION("C5D441D6" , kandw(k2, k5, k6));
+ TEST_INSTRUCTION("C5CC42E7" , kandnw(k4, k6, k7));
+ TEST_INSTRUCTION("C5CC45E7" , korw(k4, k6, k7));
+ TEST_INSTRUCTION("C5D446DD" , kxnorw(k3, k5, k5));
+ TEST_INSTRUCTION("C5CC47D7" , kxorw(k2, k6, k7));
+ TEST_INSTRUCTION("C5F844DE" , knotw(k3, k6));
+ TEST_INSTRUCTION("C5F898D6" , kortestw(k2, k6));
+ TEST_INSTRUCTION("C4E3F930E4AB" , kshiftrw(k4, k4, 171));
+ TEST_INSTRUCTION("C4E3F930E47B" , kshiftrw(k4, k4, 123));
+ TEST_INSTRUCTION("C4E3F932D5AB" , kshiftlw(k2, k5, 171));
+ TEST_INSTRUCTION("C4E3F932D57B" , kshiftlw(k2, k5, 123));
+ TEST_INSTRUCTION("C5F890E5" , kmovw(k4, k5));
+ TEST_INSTRUCTION("C5F89021" , kmovw(k4, word_ptr(rcx)));
+ TEST_INSTRUCTION("C4A17890A4F023010000" , kmovw(k4, word_ptr(rax, r14, 3, 291)));
+ TEST_INSTRUCTION("C5F89121" , kmovw(word_ptr(rcx), k4));
+ TEST_INSTRUCTION("C4A17891A4F023010000" , kmovw(word_ptr(rax, r14, 3, 291), k4));
+ TEST_INSTRUCTION("C5F892D8" , kmovw(k3, eax));
+ TEST_INSTRUCTION("C5F892DD" , kmovw(k3, ebp));
+ TEST_INSTRUCTION("C4C17892DD" , kmovw(k3, r13d));
+ TEST_INSTRUCTION("C5F893C2" , kmovw(eax, k2));
+ TEST_INSTRUCTION("C5F893EA" , kmovw(ebp, k2));
+ TEST_INSTRUCTION("C57893EA" , kmovw(r13d, k2));
+ TEST_INSTRUCTION("C5D54BEE" , kunpckbw(k5, k5, k6));
+ TEST_INSTRUCTION("62E37D481D19AB" , vcvtps2ph(ymmword_ptr(rcx), zmm19, 171));
+ TEST_INSTRUCTION("62E37D4E1D19AB" , k(k6).vcvtps2ph(ymmword_ptr(rcx), zmm19, 171));
+ TEST_INSTRUCTION("62E37D481D197B" , vcvtps2ph(ymmword_ptr(rcx), zmm19, 123));
+ TEST_INSTRUCTION("62A37D481D9CF0230100007B" , vcvtps2ph(ymmword_ptr(rax, r14, 3, 291), zmm19, 123));
+ TEST_INSTRUCTION("62E37D481D5A7F7B" , vcvtps2ph(ymmword_ptr(rdx, 4064), zmm19, 123));
+ TEST_INSTRUCTION("62E37D481D9A001000007B" , vcvtps2ph(ymmword_ptr(rdx, 4096), zmm19, 123));
+ TEST_INSTRUCTION("62E37D481D5A807B" , vcvtps2ph(ymmword_ptr(rdx, -4096), zmm19, 123));
+ TEST_INSTRUCTION("62E37D481D9AE0EFFFFF7B" , vcvtps2ph(ymmword_ptr(rdx, -4128), zmm19, 123));
+ TEST_INSTRUCTION("62E37D481921AB" , vextractf32x4(xmmword_ptr(rcx), zmm20, 171));
+ TEST_INSTRUCTION("62E37D4F1921AB" , k(k7).vextractf32x4(xmmword_ptr(rcx), zmm20, 171));
+ TEST_INSTRUCTION("62E37D4819217B" , vextractf32x4(xmmword_ptr(rcx), zmm20, 123));
+ TEST_INSTRUCTION("62A37D4819A4F0230100007B" , vextractf32x4(xmmword_ptr(rax, r14, 3, 291), zmm20, 123));
+ TEST_INSTRUCTION("62E37D4819627F7B" , vextractf32x4(xmmword_ptr(rdx, 2032), zmm20, 123));
+ TEST_INSTRUCTION("62E37D4819A2000800007B" , vextractf32x4(xmmword_ptr(rdx, 2048), zmm20, 123));
+ TEST_INSTRUCTION("62E37D481962807B" , vextractf32x4(xmmword_ptr(rdx, -2048), zmm20, 123));
+ TEST_INSTRUCTION("62E37D4819A2F0F7FFFF7B" , vextractf32x4(xmmword_ptr(rdx, -2064), zmm20, 123));
+ TEST_INSTRUCTION("62F3FD481B29AB" , vextractf64x4(ymmword_ptr(rcx), zmm5, 171));
+ TEST_INSTRUCTION("62F3FD4C1B29AB" , k(k4).vextractf64x4(ymmword_ptr(rcx), zmm5, 171));
+ TEST_INSTRUCTION("62F3FD481B297B" , vextractf64x4(ymmword_ptr(rcx), zmm5, 123));
+ TEST_INSTRUCTION("62B3FD481BACF0230100007B" , vextractf64x4(ymmword_ptr(rax, r14, 3, 291), zmm5, 123));
+ TEST_INSTRUCTION("62F3FD481B6A7F7B" , vextractf64x4(ymmword_ptr(rdx, 4064), zmm5, 123));
+ TEST_INSTRUCTION("62F3FD481BAA001000007B" , vextractf64x4(ymmword_ptr(rdx, 4096), zmm5, 123));
+ TEST_INSTRUCTION("62F3FD481B6A807B" , vextractf64x4(ymmword_ptr(rdx, -4096), zmm5, 123));
+ TEST_INSTRUCTION("62F3FD481BAAE0EFFFFF7B" , vextractf64x4(ymmword_ptr(rdx, -4128), zmm5, 123));
+ TEST_INSTRUCTION("62637D483929AB" , vextracti32x4(xmmword_ptr(rcx), zmm29, 171));
+ TEST_INSTRUCTION("62637D4A3929AB" , k(k2).vextracti32x4(xmmword_ptr(rcx), zmm29, 171));
+ TEST_INSTRUCTION("62637D4839297B" , vextracti32x4(xmmword_ptr(rcx), zmm29, 123));
+ TEST_INSTRUCTION("62237D4839ACF0230100007B" , vextracti32x4(xmmword_ptr(rax, r14, 3, 291), zmm29, 123));
+ TEST_INSTRUCTION("62637D48396A7F7B" , vextracti32x4(xmmword_ptr(rdx, 2032), zmm29, 123));
+ TEST_INSTRUCTION("62637D4839AA000800007B" , vextracti32x4(xmmword_ptr(rdx, 2048), zmm29, 123));
+ TEST_INSTRUCTION("62637D48396A807B" , vextracti32x4(xmmword_ptr(rdx, -2048), zmm29, 123));
+ TEST_INSTRUCTION("62637D4839AAF0F7FFFF7B" , vextracti32x4(xmmword_ptr(rdx, -2064), zmm29, 123));
+ TEST_INSTRUCTION("6263FD483B31AB" , vextracti64x4(ymmword_ptr(rcx), zmm30, 171));
+ TEST_INSTRUCTION("6263FD4C3B31AB" , k(k4).vextracti64x4(ymmword_ptr(rcx), zmm30, 171));
+ TEST_INSTRUCTION("6263FD483B317B" , vextracti64x4(ymmword_ptr(rcx), zmm30, 123));
+ TEST_INSTRUCTION("6223FD483BB4F0230100007B" , vextracti64x4(ymmword_ptr(rax, r14, 3, 291), zmm30, 123));
+ TEST_INSTRUCTION("6263FD483B727F7B" , vextracti64x4(ymmword_ptr(rdx, 4064), zmm30, 123));
+ TEST_INSTRUCTION("6263FD483BB2001000007B" , vextracti64x4(ymmword_ptr(rdx, 4096), zmm30, 123));
+ TEST_INSTRUCTION("6263FD483B72807B" , vextracti64x4(ymmword_ptr(rdx, -4096), zmm30, 123));
+ TEST_INSTRUCTION("6263FD483BB2E0EFFFFF7B" , vextracti64x4(ymmword_ptr(rdx, -4128), zmm30, 123));
+ TEST_INSTRUCTION("62E1FD482911" , vmovapd(zmmword_ptr(rcx), zmm18));
+ TEST_INSTRUCTION("62E1FD4E2911" , k(k6).vmovapd(zmmword_ptr(rcx), zmm18));
+ TEST_INSTRUCTION("62A1FD482994F023010000" , vmovapd(zmmword_ptr(rax, r14, 3, 291), zmm18));
+ TEST_INSTRUCTION("62E1FD4829527F" , vmovapd(zmmword_ptr(rdx, 8128), zmm18));
+ TEST_INSTRUCTION("62E1FD48299200200000" , vmovapd(zmmword_ptr(rdx, 8192), zmm18));
+ TEST_INSTRUCTION("62E1FD48295280" , vmovapd(zmmword_ptr(rdx, -8192), zmm18));
+ TEST_INSTRUCTION("62E1FD482992C0DFFFFF" , vmovapd(zmmword_ptr(rdx, -8256), zmm18));
+ TEST_INSTRUCTION("62717C482909" , vmovaps(zmmword_ptr(rcx), zmm9));
+ TEST_INSTRUCTION("62717C4B2909" , k(k3).vmovaps(zmmword_ptr(rcx), zmm9));
+ TEST_INSTRUCTION("62317C48298CF023010000" , vmovaps(zmmword_ptr(rax, r14, 3, 291), zmm9));
+ TEST_INSTRUCTION("62717C48294A7F" , vmovaps(zmmword_ptr(rdx, 8128), zmm9));
+ TEST_INSTRUCTION("62717C48298A00200000" , vmovaps(zmmword_ptr(rdx, 8192), zmm9));
+ TEST_INSTRUCTION("62717C48294A80" , vmovaps(zmmword_ptr(rdx, -8192), zmm9));
+ TEST_INSTRUCTION("62717C48298AC0DFFFFF" , vmovaps(zmmword_ptr(rdx, -8256), zmm9));
+ TEST_INSTRUCTION("62E17D487F11" , vmovdqa32(zmmword_ptr(rcx), zmm18));
+ TEST_INSTRUCTION("62E17D4C7F11" , k(k4).vmovdqa32(zmmword_ptr(rcx), zmm18));
+ TEST_INSTRUCTION("62A17D487F94F023010000" , vmovdqa32(zmmword_ptr(rax, r14, 3, 291), zmm18));
+ TEST_INSTRUCTION("62E17D487F527F" , vmovdqa32(zmmword_ptr(rdx, 8128), zmm18));
+ TEST_INSTRUCTION("62E17D487F9200200000" , vmovdqa32(zmmword_ptr(rdx, 8192), zmm18));
+ TEST_INSTRUCTION("62E17D487F5280" , vmovdqa32(zmmword_ptr(rdx, -8192), zmm18));
+ TEST_INSTRUCTION("62E17D487F92C0DFFFFF" , vmovdqa32(zmmword_ptr(rdx, -8256), zmm18));
+ TEST_INSTRUCTION("62E1FD487F19" , vmovdqa64(zmmword_ptr(rcx), zmm19));
+ TEST_INSTRUCTION("62E1FD4D7F19" , k(k5).vmovdqa64(zmmword_ptr(rcx), zmm19));
+ TEST_INSTRUCTION("62A1FD487F9CF023010000" , vmovdqa64(zmmword_ptr(rax, r14, 3, 291), zmm19));
+ TEST_INSTRUCTION("62E1FD487F5A7F" , vmovdqa64(zmmword_ptr(rdx, 8128), zmm19));
+ TEST_INSTRUCTION("62E1FD487F9A00200000" , vmovdqa64(zmmword_ptr(rdx, 8192), zmm19));
+ TEST_INSTRUCTION("62E1FD487F5A80" , vmovdqa64(zmmword_ptr(rdx, -8192), zmm19));
+ TEST_INSTRUCTION("62E1FD487F9AC0DFFFFF" , vmovdqa64(zmmword_ptr(rdx, -8256), zmm19));
+ TEST_INSTRUCTION("62E17E487F31" , vmovdqu32(zmmword_ptr(rcx), zmm22));
+ TEST_INSTRUCTION("62E17E497F31" , k(k1).vmovdqu32(zmmword_ptr(rcx), zmm22));
+ TEST_INSTRUCTION("62A17E487FB4F023010000" , vmovdqu32(zmmword_ptr(rax, r14, 3, 291), zmm22));
+ TEST_INSTRUCTION("62E17E487F727F" , vmovdqu32(zmmword_ptr(rdx, 8128), zmm22));
+ TEST_INSTRUCTION("62E17E487FB200200000" , vmovdqu32(zmmword_ptr(rdx, 8192), zmm22));
+ TEST_INSTRUCTION("62E17E487F7280" , vmovdqu32(zmmword_ptr(rdx, -8192), zmm22));
+ TEST_INSTRUCTION("62E17E487FB2C0DFFFFF" , vmovdqu32(zmmword_ptr(rdx, -8256), zmm22));
+ TEST_INSTRUCTION("6261FE487F01" , vmovdqu64(zmmword_ptr(rcx), zmm24));
+ TEST_INSTRUCTION("6261FE4D7F01" , k(k5).vmovdqu64(zmmword_ptr(rcx), zmm24));
+ TEST_INSTRUCTION("6221FE487F84F023010000" , vmovdqu64(zmmword_ptr(rax, r14, 3, 291), zmm24));
+ TEST_INSTRUCTION("6261FE487F427F" , vmovdqu64(zmmword_ptr(rdx, 8128), zmm24));
+ TEST_INSTRUCTION("6261FE487F8200200000" , vmovdqu64(zmmword_ptr(rdx, 8192), zmm24));
+ TEST_INSTRUCTION("6261FE487F4280" , vmovdqu64(zmmword_ptr(rdx, -8192), zmm24));
+ TEST_INSTRUCTION("6261FE487F82C0DFFFFF" , vmovdqu64(zmmword_ptr(rdx, -8256), zmm24));
+ TEST_INSTRUCTION("6271FD481111" , vmovupd(zmmword_ptr(rcx), zmm10));
+ TEST_INSTRUCTION("6271FD4F1111" , k(k7).vmovupd(zmmword_ptr(rcx), zmm10));
+ TEST_INSTRUCTION("6231FD481194F023010000" , vmovupd(zmmword_ptr(rax, r14, 3, 291), zmm10));
+ TEST_INSTRUCTION("6271FD4811527F" , vmovupd(zmmword_ptr(rdx, 8128), zmm10));
+ TEST_INSTRUCTION("6271FD48119200200000" , vmovupd(zmmword_ptr(rdx, 8192), zmm10));
+ TEST_INSTRUCTION("6271FD48115280" , vmovupd(zmmword_ptr(rdx, -8192), zmm10));
+ TEST_INSTRUCTION("6271FD481192C0DFFFFF" , vmovupd(zmmword_ptr(rdx, -8256), zmm10));
+ TEST_INSTRUCTION("62617C481101" , vmovups(zmmword_ptr(rcx), zmm24));
+ TEST_INSTRUCTION("62617C4F1101" , k(k7).vmovups(zmmword_ptr(rcx), zmm24));
+ TEST_INSTRUCTION("62217C481184F023010000" , vmovups(zmmword_ptr(rax, r14, 3, 291), zmm24));
+ TEST_INSTRUCTION("62617C4811427F" , vmovups(zmmword_ptr(rdx, 8128), zmm24));
+ TEST_INSTRUCTION("62617C48118200200000" , vmovups(zmmword_ptr(rdx, 8192), zmm24));
+ TEST_INSTRUCTION("62617C48114280" , vmovups(zmmword_ptr(rdx, -8192), zmm24));
+ TEST_INSTRUCTION("62617C481182C0DFFFFF" , vmovups(zmmword_ptr(rdx, -8256), zmm24));
+ TEST_INSTRUCTION("62F27E483219" , vpmovqb(qword_ptr(rcx), zmm3));
+ TEST_INSTRUCTION("62F27E4F3219" , k(k7).vpmovqb(qword_ptr(rcx), zmm3));
+ TEST_INSTRUCTION("62B27E48329CF023010000" , vpmovqb(qword_ptr(rax, r14, 3, 291), zmm3));
+ TEST_INSTRUCTION("62F27E48325A7F" , vpmovqb(qword_ptr(rdx, 1016), zmm3));
+ TEST_INSTRUCTION("62F27E48329A00040000" , vpmovqb(qword_ptr(rdx, 1024), zmm3));
+ TEST_INSTRUCTION("62F27E48325A80" , vpmovqb(qword_ptr(rdx, -1024), zmm3));
+ TEST_INSTRUCTION("62F27E48329AF8FBFFFF" , vpmovqb(qword_ptr(rdx, -1032), zmm3));
+ TEST_INSTRUCTION("62E27E482201" , vpmovsqb(qword_ptr(rcx), zmm16));
+ TEST_INSTRUCTION("62E27E4A2201" , k(k2).vpmovsqb(qword_ptr(rcx), zmm16));
+ TEST_INSTRUCTION("62A27E482284F023010000" , vpmovsqb(qword_ptr(rax, r14, 3, 291), zmm16));
+ TEST_INSTRUCTION("62E27E4822427F" , vpmovsqb(qword_ptr(rdx, 1016), zmm16));
+ TEST_INSTRUCTION("62E27E48228200040000" , vpmovsqb(qword_ptr(rdx, 1024), zmm16));
+ TEST_INSTRUCTION("62E27E48224280" , vpmovsqb(qword_ptr(rdx, -1024), zmm16));
+ TEST_INSTRUCTION("62E27E482282F8FBFFFF" , vpmovsqb(qword_ptr(rdx, -1032), zmm16));
+ TEST_INSTRUCTION("62627E481221" , vpmovusqb(qword_ptr(rcx), zmm28));
+ TEST_INSTRUCTION("62627E491221" , k(k1).vpmovusqb(qword_ptr(rcx), zmm28));
+ TEST_INSTRUCTION("62227E4812A4F023010000" , vpmovusqb(qword_ptr(rax, r14, 3, 291), zmm28));
+ TEST_INSTRUCTION("62627E4812627F" , vpmovusqb(qword_ptr(rdx, 1016), zmm28));
+ TEST_INSTRUCTION("62627E4812A200040000" , vpmovusqb(qword_ptr(rdx, 1024), zmm28));
+ TEST_INSTRUCTION("62627E48126280" , vpmovusqb(qword_ptr(rdx, -1024), zmm28));
+ TEST_INSTRUCTION("62627E4812A2F8FBFFFF" , vpmovusqb(qword_ptr(rdx, -1032), zmm28));
+ TEST_INSTRUCTION("62F27E483439" , vpmovqw(xmmword_ptr(rcx), zmm7));
+ TEST_INSTRUCTION("62F27E4E3439" , k(k6).vpmovqw(xmmword_ptr(rcx), zmm7));
+ TEST_INSTRUCTION("62B27E4834BCF023010000" , vpmovqw(xmmword_ptr(rax, r14, 3, 291), zmm7));
+ TEST_INSTRUCTION("62F27E48347A7F" , vpmovqw(xmmword_ptr(rdx, 2032), zmm7));
+ TEST_INSTRUCTION("62F27E4834BA00080000" , vpmovqw(xmmword_ptr(rdx, 2048), zmm7));
+ TEST_INSTRUCTION("62F27E48347A80" , vpmovqw(xmmword_ptr(rdx, -2048), zmm7));
+ TEST_INSTRUCTION("62F27E4834BAF0F7FFFF" , vpmovqw(xmmword_ptr(rdx, -2064), zmm7));
+ TEST_INSTRUCTION("62F27E482409" , vpmovsqw(xmmword_ptr(rcx), zmm1));
+ TEST_INSTRUCTION("62F27E4D2409" , k(k5).vpmovsqw(xmmword_ptr(rcx), zmm1));
+ TEST_INSTRUCTION("62B27E48248CF023010000" , vpmovsqw(xmmword_ptr(rax, r14, 3, 291), zmm1));
+ TEST_INSTRUCTION("62F27E48244A7F" , vpmovsqw(xmmword_ptr(rdx, 2032), zmm1));
+ TEST_INSTRUCTION("62F27E48248A00080000" , vpmovsqw(xmmword_ptr(rdx, 2048), zmm1));
+ TEST_INSTRUCTION("62F27E48244A80" , vpmovsqw(xmmword_ptr(rdx, -2048), zmm1));
+ TEST_INSTRUCTION("62F27E48248AF0F7FFFF" , vpmovsqw(xmmword_ptr(rdx, -2064), zmm1));
+ TEST_INSTRUCTION("62627E481409" , vpmovusqw(xmmword_ptr(rcx), zmm25));
+ TEST_INSTRUCTION("62627E4B1409" , k(k3).vpmovusqw(xmmword_ptr(rcx), zmm25));
+ TEST_INSTRUCTION("62227E48148CF023010000" , vpmovusqw(xmmword_ptr(rax, r14, 3, 291), zmm25));
+ TEST_INSTRUCTION("62627E48144A7F" , vpmovusqw(xmmword_ptr(rdx, 2032), zmm25));
+ TEST_INSTRUCTION("62627E48148A00080000" , vpmovusqw(xmmword_ptr(rdx, 2048), zmm25));
+ TEST_INSTRUCTION("62627E48144A80" , vpmovusqw(xmmword_ptr(rdx, -2048), zmm25));
+ TEST_INSTRUCTION("62627E48148AF0F7FFFF" , vpmovusqw(xmmword_ptr(rdx, -2064), zmm25));
+ TEST_INSTRUCTION("62627E483521" , vpmovqd(ymmword_ptr(rcx), zmm28));
+ TEST_INSTRUCTION("62627E4D3521" , k(k5).vpmovqd(ymmword_ptr(rcx), zmm28));
+ TEST_INSTRUCTION("62227E4835A4F023010000" , vpmovqd(ymmword_ptr(rax, r14, 3, 291), zmm28));
+ TEST_INSTRUCTION("62627E4835627F" , vpmovqd(ymmword_ptr(rdx, 4064), zmm28));
+ TEST_INSTRUCTION("62627E4835A200100000" , vpmovqd(ymmword_ptr(rdx, 4096), zmm28));
+ TEST_INSTRUCTION("62627E48356280" , vpmovqd(ymmword_ptr(rdx, -4096), zmm28));
+ TEST_INSTRUCTION("62627E4835A2E0EFFFFF" , vpmovqd(ymmword_ptr(rdx, -4128), zmm28));
+ TEST_INSTRUCTION("62727E482509" , vpmovsqd(ymmword_ptr(rcx), zmm9));
+ TEST_INSTRUCTION("62727E4F2509" , k(k7).vpmovsqd(ymmword_ptr(rcx), zmm9));
+ TEST_INSTRUCTION("62327E48258CF023010000" , vpmovsqd(ymmword_ptr(rax, r14, 3, 291), zmm9));
+ TEST_INSTRUCTION("62727E48254A7F" , vpmovsqd(ymmword_ptr(rdx, 4064), zmm9));
+ TEST_INSTRUCTION("62727E48258A00100000" , vpmovsqd(ymmword_ptr(rdx, 4096), zmm9));
+ TEST_INSTRUCTION("62727E48254A80" , vpmovsqd(ymmword_ptr(rdx, -4096), zmm9));
+ TEST_INSTRUCTION("62727E48258AE0EFFFFF" , vpmovsqd(ymmword_ptr(rdx, -4128), zmm9));
+ TEST_INSTRUCTION("62E27E481531" , vpmovusqd(ymmword_ptr(rcx), zmm22));
+ TEST_INSTRUCTION("62E27E491531" , k(k1).vpmovusqd(ymmword_ptr(rcx), zmm22));
+ TEST_INSTRUCTION("62A27E4815B4F023010000" , vpmovusqd(ymmword_ptr(rax, r14, 3, 291), zmm22));
+ TEST_INSTRUCTION("62E27E4815727F" , vpmovusqd(ymmword_ptr(rdx, 4064), zmm22));
+ TEST_INSTRUCTION("62E27E4815B200100000" , vpmovusqd(ymmword_ptr(rdx, 4096), zmm22));
+ TEST_INSTRUCTION("62E27E48157280" , vpmovusqd(ymmword_ptr(rdx, -4096), zmm22));
+ TEST_INSTRUCTION("62E27E4815B2E0EFFFFF" , vpmovusqd(ymmword_ptr(rdx, -4128), zmm22));
+ TEST_INSTRUCTION("62727E483121" , vpmovdb(xmmword_ptr(rcx), zmm12));
+ TEST_INSTRUCTION("62727E4B3121" , k(k3).vpmovdb(xmmword_ptr(rcx), zmm12));
+ TEST_INSTRUCTION("62327E4831A4F023010000" , vpmovdb(xmmword_ptr(rax, r14, 3, 291), zmm12));
+ TEST_INSTRUCTION("62727E4831627F" , vpmovdb(xmmword_ptr(rdx, 2032), zmm12));
+ TEST_INSTRUCTION("62727E4831A200080000" , vpmovdb(xmmword_ptr(rdx, 2048), zmm12));
+ TEST_INSTRUCTION("62727E48316280" , vpmovdb(xmmword_ptr(rdx, -2048), zmm12));
+ TEST_INSTRUCTION("62727E4831A2F0F7FFFF" , vpmovdb(xmmword_ptr(rdx, -2064), zmm12));
+ TEST_INSTRUCTION("62F27E482131" , vpmovsdb(xmmword_ptr(rcx), zmm6));
+ TEST_INSTRUCTION("62F27E492131" , k(k1).vpmovsdb(xmmword_ptr(rcx), zmm6));
+ TEST_INSTRUCTION("62B27E4821B4F023010000" , vpmovsdb(xmmword_ptr(rax, r14, 3, 291), zmm6));
+ TEST_INSTRUCTION("62F27E4821727F" , vpmovsdb(xmmword_ptr(rdx, 2032), zmm6));
+ TEST_INSTRUCTION("62F27E4821B200080000" , vpmovsdb(xmmword_ptr(rdx, 2048), zmm6));
+ TEST_INSTRUCTION("62F27E48217280" , vpmovsdb(xmmword_ptr(rdx, -2048), zmm6));
+ TEST_INSTRUCTION("62F27E4821B2F0F7FFFF" , vpmovsdb(xmmword_ptr(rdx, -2064), zmm6));
+ TEST_INSTRUCTION("62E27E481139" , vpmovusdb(xmmword_ptr(rcx), zmm23));
+ TEST_INSTRUCTION("62E27E4B1139" , k(k3).vpmovusdb(xmmword_ptr(rcx), zmm23));
+ TEST_INSTRUCTION("62A27E4811BCF023010000" , vpmovusdb(xmmword_ptr(rax, r14, 3, 291), zmm23));
+ TEST_INSTRUCTION("62E27E48117A7F" , vpmovusdb(xmmword_ptr(rdx, 2032), zmm23));
+ TEST_INSTRUCTION("62E27E4811BA00080000" , vpmovusdb(xmmword_ptr(rdx, 2048), zmm23));
+ TEST_INSTRUCTION("62E27E48117A80" , vpmovusdb(xmmword_ptr(rdx, -2048), zmm23));
+ TEST_INSTRUCTION("62E27E4811BAF0F7FFFF" , vpmovusdb(xmmword_ptr(rdx, -2064), zmm23));
+ TEST_INSTRUCTION("62F27E483339" , vpmovdw(ymmword_ptr(rcx), zmm7));
+ TEST_INSTRUCTION("62F27E4F3339" , k(k7).vpmovdw(ymmword_ptr(rcx), zmm7));
+ TEST_INSTRUCTION("62B27E4833BCF023010000" , vpmovdw(ymmword_ptr(rax, r14, 3, 291), zmm7));
+ TEST_INSTRUCTION("62F27E48337A7F" , vpmovdw(ymmword_ptr(rdx, 4064), zmm7));
+ TEST_INSTRUCTION("62F27E4833BA00100000" , vpmovdw(ymmword_ptr(rdx, 4096), zmm7));
+ TEST_INSTRUCTION("62F27E48337A80" , vpmovdw(ymmword_ptr(rdx, -4096), zmm7));
+ TEST_INSTRUCTION("62F27E4833BAE0EFFFFF" , vpmovdw(ymmword_ptr(rdx, -4128), zmm7));
+ TEST_INSTRUCTION("62727E482331" , vpmovsdw(ymmword_ptr(rcx), zmm14));
+ TEST_INSTRUCTION("62727E4E2331" , k(k6).vpmovsdw(ymmword_ptr(rcx), zmm14));
+ TEST_INSTRUCTION("62327E4823B4F023010000" , vpmovsdw(ymmword_ptr(rax, r14, 3, 291), zmm14));
+ TEST_INSTRUCTION("62727E4823727F" , vpmovsdw(ymmword_ptr(rdx, 4064), zmm14));
+ TEST_INSTRUCTION("62727E4823B200100000" , vpmovsdw(ymmword_ptr(rdx, 4096), zmm14));
+ TEST_INSTRUCTION("62727E48237280" , vpmovsdw(ymmword_ptr(rdx, -4096), zmm14));
+ TEST_INSTRUCTION("62727E4823B2E0EFFFFF" , vpmovsdw(ymmword_ptr(rdx, -4128), zmm14));
+ TEST_INSTRUCTION("62F27E481329" , vpmovusdw(ymmword_ptr(rcx), zmm5));
+ TEST_INSTRUCTION("62F27E4B1329" , k(k3).vpmovusdw(ymmword_ptr(rcx), zmm5));
+ TEST_INSTRUCTION("62B27E4813ACF023010000" , vpmovusdw(ymmword_ptr(rax, r14, 3, 291), zmm5));
+ TEST_INSTRUCTION("62F27E48136A7F" , vpmovusdw(ymmword_ptr(rdx, 4064), zmm5));
+ TEST_INSTRUCTION("62F27E4813AA00100000" , vpmovusdw(ymmword_ptr(rdx, 4096), zmm5));
+ TEST_INSTRUCTION("62F27E48136A80" , vpmovusdw(ymmword_ptr(rdx, -4096), zmm5));
+ TEST_INSTRUCTION("62F27E4813AAE0EFFFFF" , vpmovusdw(ymmword_ptr(rdx, -4128), zmm5));
+ TEST_INSTRUCTION("62A1FC4878C4" , vcvttpd2udq(ymm16, zmm20));
+ TEST_INSTRUCTION("62A1FC4F78C4" , k(k7).vcvttpd2udq(ymm16, zmm20));
+ TEST_INSTRUCTION("62A1FCCF78C4" , k(k7).z().vcvttpd2udq(ymm16, zmm20));
+ TEST_INSTRUCTION("62A1FC1878C4" , sae().vcvttpd2udq(ymm16, zmm20));
+ TEST_INSTRUCTION("62E1FC487801" , vcvttpd2udq(ymm16, zmmword_ptr(rcx)));
+ TEST_INSTRUCTION("62A1FC487884F023010000" , vcvttpd2udq(ymm16, zmmword_ptr(rax, r14, 3, 291)));
+ TEST_INSTRUCTION("62E1FC587801" , vcvttpd2udq(ymm16, qword_ptr(rcx)._1to8()));
+ TEST_INSTRUCTION("62E1FC4878427F" , vcvttpd2udq(ymm16, zmmword_ptr(rdx, 8128)));
+ TEST_INSTRUCTION("62E1FC48788200200000" , vcvttpd2udq(ymm16, zmmword_ptr(rdx, 8192)));
+ TEST_INSTRUCTION("62E1FC48784280" , vcvttpd2udq(ymm16, zmmword_ptr(rdx, -8192)));
+ TEST_INSTRUCTION("62E1FC487882C0DFFFFF" , vcvttpd2udq(ymm16, zmmword_ptr(rdx, -8256)));
+ TEST_INSTRUCTION("62E1FC5878427F" , vcvttpd2udq(ymm16, qword_ptr(rdx, 1016)._1to8()));
+ TEST_INSTRUCTION("62E1FC58788200040000" , vcvttpd2udq(ymm16, qword_ptr(rdx, 1024)._1to8()));
+ TEST_INSTRUCTION("62E1FC58784280" , vcvttpd2udq(ymm16, qword_ptr(rdx, -1024)._1to8()));
+ TEST_INSTRUCTION("62E1FC587882F8FBFFFF" , vcvttpd2udq(ymm16, qword_ptr(rdx, -1032)._1to8()));
+ TEST_INSTRUCTION("62117C4878F4" , vcvttps2udq(zmm14, zmm28));
+ TEST_INSTRUCTION("62117C4978F4" , k(k1).vcvttps2udq(zmm14, zmm28));
+ TEST_INSTRUCTION("62117CC978F4" , k(k1).z().vcvttps2udq(zmm14, zmm28));
+ TEST_INSTRUCTION("62117C1878F4" , sae().vcvttps2udq(zmm14, zmm28));
+ TEST_INSTRUCTION("62717C487831" , vcvttps2udq(zmm14, zmmword_ptr(rcx)));
+ TEST_INSTRUCTION("62317C4878B4F023010000" , vcvttps2udq(zmm14, zmmword_ptr(rax, r14, 3, 291)));
+ TEST_INSTRUCTION("62717C587831" , vcvttps2udq(zmm14, dword_ptr(rcx)._1to16()));
+ TEST_INSTRUCTION("62717C4878727F" , vcvttps2udq(zmm14, zmmword_ptr(rdx, 8128)));
+ TEST_INSTRUCTION("62717C4878B200200000" , vcvttps2udq(zmm14, zmmword_ptr(rdx, 8192)));
+ TEST_INSTRUCTION("62717C48787280" , vcvttps2udq(zmm14, zmmword_ptr(rdx, -8192)));
+ TEST_INSTRUCTION("62717C4878B2C0DFFFFF" , vcvttps2udq(zmm14, zmmword_ptr(rdx, -8256)));
+ TEST_INSTRUCTION("62717C5878727F" , vcvttps2udq(zmm14, dword_ptr(rdx, 508)._1to16()));
+ TEST_INSTRUCTION("62717C5878B200020000" , vcvttps2udq(zmm14, dword_ptr(rdx, 512)._1to16()));
+ TEST_INSTRUCTION("62717C58787280" , vcvttps2udq(zmm14, dword_ptr(rdx, -512)._1to16()));
+ TEST_INSTRUCTION("62717C5878B2FCFDFFFF" , vcvttps2udq(zmm14, dword_ptr(rdx, -516)._1to16()));
+ TEST_INSTRUCTION("62B17F0878C5" , vcvttsd2usi(eax, xmm21));
+ TEST_INSTRUCTION("62B17F1878C5" , sae().vcvttsd2usi(eax, xmm21));
+ TEST_INSTRUCTION("62F17F087801" , vcvttsd2usi(eax, qword_ptr(rcx)));
+ TEST_INSTRUCTION("62B17F087884F023010000" , vcvttsd2usi(eax, qword_ptr(rax, r14, 3, 291)));
+ TEST_INSTRUCTION("62F17F0878427F" , vcvttsd2usi(eax, qword_ptr(rdx, 1016)));
+ TEST_INSTRUCTION("62F17F08788200040000" , vcvttsd2usi(eax, qword_ptr(rdx, 1024)));
+ TEST_INSTRUCTION("62F17F08784280" , vcvttsd2usi(eax, qword_ptr(rdx, -1024)));
+ TEST_INSTRUCTION("62F17F087882F8FBFFFF" , vcvttsd2usi(eax, qword_ptr(rdx, -1032)));
+ TEST_INSTRUCTION("62B17F0878ED" , vcvttsd2usi(ebp, xmm21));
+ TEST_INSTRUCTION("62B17F1878ED" , sae().vcvttsd2usi(ebp, xmm21));
+ TEST_INSTRUCTION("62F17F087829" , vcvttsd2usi(ebp, qword_ptr(rcx)));
+ TEST_INSTRUCTION("62B17F0878ACF023010000" , vcvttsd2usi(ebp, qword_ptr(rax, r14, 3, 291)));
+ TEST_INSTRUCTION("62F17F08786A7F" , vcvttsd2usi(ebp, qword_ptr(rdx, 1016)));
+ TEST_INSTRUCTION("62F17F0878AA00040000" , vcvttsd2usi(ebp, qword_ptr(rdx, 1024)));
+ TEST_INSTRUCTION("62F17F08786A80" , vcvttsd2usi(ebp, qword_ptr(rdx, -1024)));
+ TEST_INSTRUCTION("62F17F0878AAF8FBFFFF" , vcvttsd2usi(ebp, qword_ptr(rdx, -1032)));
+ TEST_INSTRUCTION("62317F0878ED" , vcvttsd2usi(r13d, xmm21));
+ TEST_INSTRUCTION("62317F1878ED" , sae().vcvttsd2usi(r13d, xmm21));
+ TEST_INSTRUCTION("62717F087829" , vcvttsd2usi(r13d, qword_ptr(rcx)));
+ TEST_INSTRUCTION("62317F0878ACF023010000" , vcvttsd2usi(r13d, qword_ptr(rax, r14, 3, 291)));
+ TEST_INSTRUCTION("62717F08786A7F" , vcvttsd2usi(r13d, qword_ptr(rdx, 1016)));
+ TEST_INSTRUCTION("62717F0878AA00040000" , vcvttsd2usi(r13d, qword_ptr(rdx, 1024)));
+ TEST_INSTRUCTION("62717F08786A80" , vcvttsd2usi(r13d, qword_ptr(rdx, -1024)));
+ TEST_INSTRUCTION("62717F0878AAF8FBFFFF" , vcvttsd2usi(r13d, qword_ptr(rdx, -1032)));
+ TEST_INSTRUCTION("62F1FF0878C7" , vcvttsd2usi(rax, xmm7));
+ TEST_INSTRUCTION("62F1FF1878C7" , sae().vcvttsd2usi(rax, xmm7));
+ TEST_INSTRUCTION("62F1FF087801" , vcvttsd2usi(rax, qword_ptr(rcx)));
+ TEST_INSTRUCTION("62B1FF087884F023010000" , vcvttsd2usi(rax, qword_ptr(rax, r14, 3, 291)));
+ TEST_INSTRUCTION("62F1FF0878427F" , vcvttsd2usi(rax, qword_ptr(rdx, 1016)));
+ TEST_INSTRUCTION("62F1FF08788200040000" , vcvttsd2usi(rax, qword_ptr(rdx, 1024)));
+ TEST_INSTRUCTION("62F1FF08784280" , vcvttsd2usi(rax, qword_ptr(rdx, -1024)));
+ TEST_INSTRUCTION("62F1FF087882F8FBFFFF" , vcvttsd2usi(rax, qword_ptr(rdx, -1032)));
+ TEST_INSTRUCTION("6271FF0878C7" , vcvttsd2usi(r8, xmm7));
+ TEST_INSTRUCTION("6271FF1878C7" , sae().vcvttsd2usi(r8, xmm7));
+ TEST_INSTRUCTION("6271FF087801" , vcvttsd2usi(r8, qword_ptr(rcx)));
+ TEST_INSTRUCTION("6231FF087884F023010000" , vcvttsd2usi(r8, qword_ptr(rax, r14, 3, 291)));
+ TEST_INSTRUCTION("6271FF0878427F" , vcvttsd2usi(r8, qword_ptr(rdx, 1016)));
+ TEST_INSTRUCTION("6271FF08788200040000" , vcvttsd2usi(r8, qword_ptr(rdx, 1024)));
+ TEST_INSTRUCTION("6271FF08784280" , vcvttsd2usi(r8, qword_ptr(rdx, -1024)));
+ TEST_INSTRUCTION("6271FF087882F8FBFFFF" , vcvttsd2usi(r8, qword_ptr(rdx, -1032)));
+ TEST_INSTRUCTION("62B17E0878C2" , vcvttss2usi(eax, xmm18));
+ TEST_INSTRUCTION("62B17E1878C2" , sae().vcvttss2usi(eax, xmm18));
+ TEST_INSTRUCTION("62F17E087801" , vcvttss2usi(eax, dword_ptr(rcx)));
+ TEST_INSTRUCTION("62B17E087884F023010000" , vcvttss2usi(eax, dword_ptr(rax, r14, 3, 291)));
+ TEST_INSTRUCTION("62F17E0878427F" , vcvttss2usi(eax, dword_ptr(rdx, 508)));
+ TEST_INSTRUCTION("62F17E08788200020000" , vcvttss2usi(eax, dword_ptr(rdx, 512)));
+ TEST_INSTRUCTION("62F17E08784280" , vcvttss2usi(eax, dword_ptr(rdx, -512)));
+ TEST_INSTRUCTION("62F17E087882FCFDFFFF" , vcvttss2usi(eax, dword_ptr(rdx, -516)));
+ TEST_INSTRUCTION("62B17E0878EA" , vcvttss2usi(ebp, xmm18));
+ TEST_INSTRUCTION("62B17E1878EA" , sae().vcvttss2usi(ebp, xmm18));
+ TEST_INSTRUCTION("62F17E087829" , vcvttss2usi(ebp, dword_ptr(rcx)));
+ TEST_INSTRUCTION("62B17E0878ACF023010000" , vcvttss2usi(ebp, dword_ptr(rax, r14, 3, 291)));
+ TEST_INSTRUCTION("62F17E08786A7F" , vcvttss2usi(ebp, dword_ptr(rdx, 508)));
+ TEST_INSTRUCTION("62F17E0878AA00020000" , vcvttss2usi(ebp, dword_ptr(rdx, 512)));
+ TEST_INSTRUCTION("62F17E08786A80" , vcvttss2usi(ebp, dword_ptr(rdx, -512)));
+ TEST_INSTRUCTION("62F17E0878AAFCFDFFFF" , vcvttss2usi(ebp, dword_ptr(rdx, -516)));
+ TEST_INSTRUCTION("62317E0878EA" , vcvttss2usi(r13d, xmm18));
+ TEST_INSTRUCTION("62317E1878EA" , sae().vcvttss2usi(r13d, xmm18));
+ TEST_INSTRUCTION("62717E087829" , vcvttss2usi(r13d, dword_ptr(rcx)));
+ TEST_INSTRUCTION("62317E0878ACF023010000" , vcvttss2usi(r13d, dword_ptr(rax, r14, 3, 291)));
+ TEST_INSTRUCTION("62717E08786A7F" , vcvttss2usi(r13d, dword_ptr(rdx, 508)));
+ TEST_INSTRUCTION("62717E0878AA00020000" , vcvttss2usi(r13d, dword_ptr(rdx, 512)));
+ TEST_INSTRUCTION("62717E08786A80" , vcvttss2usi(r13d, dword_ptr(rdx, -512)));
+ TEST_INSTRUCTION("62717E0878AAFCFDFFFF" , vcvttss2usi(r13d, dword_ptr(rdx, -516)));
+ TEST_INSTRUCTION("6291FE0878C3" , vcvttss2usi(rax, xmm27));
+ TEST_INSTRUCTION("6291FE1878C3" , sae().vcvttss2usi(rax, xmm27));
+ TEST_INSTRUCTION("62F1FE087801" , vcvttss2usi(rax, dword_ptr(rcx)));
+ TEST_INSTRUCTION("62B1FE087884F023010000" , vcvttss2usi(rax, dword_ptr(rax, r14, 3, 291)));
+ TEST_INSTRUCTION("62F1FE0878427F" , vcvttss2usi(rax, dword_ptr(rdx, 508)));
+ TEST_INSTRUCTION("62F1FE08788200020000" , vcvttss2usi(rax, dword_ptr(rdx, 512)));
+ TEST_INSTRUCTION("62F1FE08784280" , vcvttss2usi(rax, dword_ptr(rdx, -512)));
+ TEST_INSTRUCTION("62F1FE087882FCFDFFFF" , vcvttss2usi(rax, dword_ptr(rdx, -516)));
+ TEST_INSTRUCTION("6211FE0878C3" , vcvttss2usi(r8, xmm27));
+ TEST_INSTRUCTION("6211FE1878C3" , sae().vcvttss2usi(r8, xmm27));
+ TEST_INSTRUCTION("6271FE087801" , vcvttss2usi(r8, dword_ptr(rcx)));
+ TEST_INSTRUCTION("6231FE087884F023010000" , vcvttss2usi(r8, dword_ptr(rax, r14, 3, 291)));
+ TEST_INSTRUCTION("6271FE0878427F" , vcvttss2usi(r8, dword_ptr(rdx, 508)));
+ TEST_INSTRUCTION("6271FE08788200020000" , vcvttss2usi(r8, dword_ptr(rdx, 512)));
+ TEST_INSTRUCTION("6271FE08784280" , vcvttss2usi(r8, dword_ptr(rdx, -512)));
+ TEST_INSTRUCTION("6271FE087882FCFDFFFF" , vcvttss2usi(r8, dword_ptr(rdx, -516)));
+ TEST_INSTRUCTION("62721D4076D4" , vpermi2d(zmm10, zmm28, zmm4));
+ TEST_INSTRUCTION("62721D4576D4" , k(k5).vpermi2d(zmm10, zmm28, zmm4));
+ TEST_INSTRUCTION("62721DC576D4" , k(k5).z().vpermi2d(zmm10, zmm28, zmm4));
+ TEST_INSTRUCTION("62721D407611" , vpermi2d(zmm10, zmm28, zmmword_ptr(rcx)));
+ TEST_INSTRUCTION("62321D407694F023010000" , vpermi2d(zmm10, zmm28, zmmword_ptr(rax, r14, 3, 291)));
+ TEST_INSTRUCTION("62721D507611" , vpermi2d(zmm10, zmm28, dword_ptr(rcx)._1to16()));
+ TEST_INSTRUCTION("62721D4076527F" , vpermi2d(zmm10, zmm28, zmmword_ptr(rdx, 8128)));
+ TEST_INSTRUCTION("62721D40769200200000" , vpermi2d(zmm10, zmm28, zmmword_ptr(rdx, 8192)));
+ TEST_INSTRUCTION("62721D40765280" , vpermi2d(zmm10, zmm28, zmmword_ptr(rdx, -8192)));
+ TEST_INSTRUCTION("62721D407692C0DFFFFF" , vpermi2d(zmm10, zmm28, zmmword_ptr(rdx, -8256)));
+ TEST_INSTRUCTION("62721D5076527F" , vpermi2d(zmm10, zmm28, dword_ptr(rdx, 508)._1to16()));
+ TEST_INSTRUCTION("62721D50769200020000" , vpermi2d(zmm10, zmm28, dword_ptr(rdx, 512)._1to16()));
+ TEST_INSTRUCTION("62721D50765280" , vpermi2d(zmm10, zmm28, dword_ptr(rdx, -512)._1to16()));
+ TEST_INSTRUCTION("62721D507692FCFDFFFF" , vpermi2d(zmm10, zmm28, dword_ptr(rdx, -516)._1to16()));
+ TEST_INSTRUCTION("62829D4076D4" , vpermi2q(zmm18, zmm28, zmm28));
+ TEST_INSTRUCTION("62829D4276D4" , k(k2).vpermi2q(zmm18, zmm28, zmm28));
+ TEST_INSTRUCTION("62829DC276D4" , k(k2).z().vpermi2q(zmm18, zmm28, zmm28));
+ TEST_INSTRUCTION("62E29D407611" , vpermi2q(zmm18, zmm28, zmmword_ptr(rcx)));
+ TEST_INSTRUCTION("62A29D407694F023010000" , vpermi2q(zmm18, zmm28, zmmword_ptr(rax, r14, 3, 291)));
+ TEST_INSTRUCTION("62E29D507611" , vpermi2q(zmm18, zmm28, qword_ptr(rcx)._1to8()));
+ TEST_INSTRUCTION("62E29D4076527F" , vpermi2q(zmm18, zmm28, zmmword_ptr(rdx, 8128)));
+ TEST_INSTRUCTION("62E29D40769200200000" , vpermi2q(zmm18, zmm28, zmmword_ptr(rdx, 8192)));
+ TEST_INSTRUCTION("62E29D40765280" , vpermi2q(zmm18, zmm28, zmmword_ptr(rdx, -8192)));
+ TEST_INSTRUCTION("62E29D407692C0DFFFFF" , vpermi2q(zmm18, zmm28, zmmword_ptr(rdx, -8256)));
+ TEST_INSTRUCTION("62E29D5076527F" , vpermi2q(zmm18, zmm28, qword_ptr(rdx, 1016)._1to8()));
+ TEST_INSTRUCTION("62E29D50769200040000" , vpermi2q(zmm18, zmm28, qword_ptr(rdx, 1024)._1to8()));
+ TEST_INSTRUCTION("62E29D50765280" , vpermi2q(zmm18, zmm28, qword_ptr(rdx, -1024)._1to8()));
+ TEST_INSTRUCTION("62E29D507692F8FBFFFF" , vpermi2q(zmm18, zmm28, qword_ptr(rdx, -1032)._1to8()));
+ TEST_INSTRUCTION("6242454077C0" , vpermi2ps(zmm24, zmm23, zmm8));
+ TEST_INSTRUCTION("6242454277C0" , k(k2).vpermi2ps(zmm24, zmm23, zmm8));
+ TEST_INSTRUCTION("624245C277C0" , k(k2).z().vpermi2ps(zmm24, zmm23, zmm8));
+ TEST_INSTRUCTION("626245407701" , vpermi2ps(zmm24, zmm23, zmmword_ptr(rcx)));
+ TEST_INSTRUCTION("622245407784F023010000" , vpermi2ps(zmm24, zmm23, zmmword_ptr(rax, r14, 3, 291)));
+ TEST_INSTRUCTION("626245507701" , vpermi2ps(zmm24, zmm23, dword_ptr(rcx)._1to16()));
+ TEST_INSTRUCTION("6262454077427F" , vpermi2ps(zmm24, zmm23, zmmword_ptr(rdx, 8128)));
+ TEST_INSTRUCTION("62624540778200200000" , vpermi2ps(zmm24, zmm23, zmmword_ptr(rdx, 8192)));
+ TEST_INSTRUCTION("62624540774280" , vpermi2ps(zmm24, zmm23, zmmword_ptr(rdx, -8192)));
+ TEST_INSTRUCTION("626245407782C0DFFFFF" , vpermi2ps(zmm24, zmm23, zmmword_ptr(rdx, -8256)));
+ TEST_INSTRUCTION("6262455077427F" , vpermi2ps(zmm24, zmm23, dword_ptr(rdx, 508)._1to16()));
+ TEST_INSTRUCTION("62624550778200020000" , vpermi2ps(zmm24, zmm23, dword_ptr(rdx, 512)._1to16()));
+ TEST_INSTRUCTION("62624550774280" , vpermi2ps(zmm24, zmm23, dword_ptr(rdx, -512)._1to16()));
+ TEST_INSTRUCTION("626245507782FCFDFFFF" , vpermi2ps(zmm24, zmm23, dword_ptr(rdx, -516)._1to16()));
+ TEST_INSTRUCTION("62A2D54877E4" , vpermi2pd(zmm20, zmm5, zmm20));
+ TEST_INSTRUCTION("62A2D54B77E4" , k(k3).vpermi2pd(zmm20, zmm5, zmm20));
+ TEST_INSTRUCTION("62A2D5CB77E4" , k(k3).z().vpermi2pd(zmm20, zmm5, zmm20));
+ TEST_INSTRUCTION("62E2D5487721" , vpermi2pd(zmm20, zmm5, zmmword_ptr(rcx)));
+ TEST_INSTRUCTION("62A2D54877A4F023010000" , vpermi2pd(zmm20, zmm5, zmmword_ptr(rax, r14, 3, 291)));
+ TEST_INSTRUCTION("62E2D5587721" , vpermi2pd(zmm20, zmm5, qword_ptr(rcx)._1to8()));
+ TEST_INSTRUCTION("62E2D54877627F" , vpermi2pd(zmm20, zmm5, zmmword_ptr(rdx, 8128)));
+ TEST_INSTRUCTION("62E2D54877A200200000" , vpermi2pd(zmm20, zmm5, zmmword_ptr(rdx, 8192)));
+ TEST_INSTRUCTION("62E2D548776280" , vpermi2pd(zmm20, zmm5, zmmword_ptr(rdx, -8192)));
+ TEST_INSTRUCTION("62E2D54877A2C0DFFFFF" , vpermi2pd(zmm20, zmm5, zmmword_ptr(rdx, -8256)));
+ TEST_INSTRUCTION("62E2D55877627F" , vpermi2pd(zmm20, zmm5, qword_ptr(rdx, 1016)._1to8()));
+ TEST_INSTRUCTION("62E2D55877A200040000" , vpermi2pd(zmm20, zmm5, qword_ptr(rdx, 1024)._1to8()));
+ TEST_INSTRUCTION("62E2D558776280" , vpermi2pd(zmm20, zmm5, qword_ptr(rdx, -1024)._1to8()));
+ TEST_INSTRUCTION("62E2D55877A2F8FBFFFF" , vpermi2pd(zmm20, zmm5, qword_ptr(rdx, -1032)._1to8()));
+ TEST_INSTRUCTION("62E1A54858CA" , vaddpd(zmm17, zmm11, zmm2));
+ TEST_INSTRUCTION("62E1A54958CA" , k(k1).vaddpd(zmm17, zmm11, zmm2));
+ TEST_INSTRUCTION("62E1A5C958CA" , k(k1).z().vaddpd(zmm17, zmm11, zmm2));
+ TEST_INSTRUCTION("62E1A51858CA" , rn_sae().vaddpd(zmm17, zmm11, zmm2));
+ TEST_INSTRUCTION("62E1A55858CA" , ru_sae().vaddpd(zmm17, zmm11, zmm2));
+ TEST_INSTRUCTION("62E1A53858CA" , rd_sae().vaddpd(zmm17, zmm11, zmm2));
+ TEST_INSTRUCTION("62E1A57858CA" , rz_sae().vaddpd(zmm17, zmm11, zmm2));
+ TEST_INSTRUCTION("62E1A5485809" , vaddpd(zmm17, zmm11, zmmword_ptr(rcx)));
+ TEST_INSTRUCTION("62A1A548588CF034120000" , vaddpd(zmm17, zmm11, zmmword_ptr(rax, r14, 3, 4660)));
+ TEST_INSTRUCTION("62E1A5585809" , vaddpd(zmm17, zmm11, qword_ptr(rcx)._1to8()));
+ TEST_INSTRUCTION("62E1A548584A7F" , vaddpd(zmm17, zmm11, zmmword_ptr(rdx, 8128)));
+ TEST_INSTRUCTION("62E1A548588A00200000" , vaddpd(zmm17, zmm11, zmmword_ptr(rdx, 8192)));
+ TEST_INSTRUCTION("62E1A548584A80" , vaddpd(zmm17, zmm11, zmmword_ptr(rdx, -8192)));
+ TEST_INSTRUCTION("62E1A548588AC0DFFFFF" , vaddpd(zmm17, zmm11, zmmword_ptr(rdx, -8256)));
+ TEST_INSTRUCTION("62E1A558584A7F" , vaddpd(zmm17, zmm11, qword_ptr(rdx, 1016)._1to8()));
+ TEST_INSTRUCTION("62E1A558588A00040000" , vaddpd(zmm17, zmm11, qword_ptr(rdx, 1024)._1to8()));
+ TEST_INSTRUCTION("62E1A558584A80" , vaddpd(zmm17, zmm11, qword_ptr(rdx, -1024)._1to8()));
+ TEST_INSTRUCTION("62E1A558588AF8FBFFFF" , vaddpd(zmm17, zmm11, qword_ptr(rdx, -1032)._1to8()));
+ TEST_INSTRUCTION("62F14C4858DD" , vaddps(zmm3, zmm6, zmm5));
+ TEST_INSTRUCTION("62F14C4958DD" , k(k1).vaddps(zmm3, zmm6, zmm5));
+ TEST_INSTRUCTION("62F14CC958DD" , k(k1).z().vaddps(zmm3, zmm6, zmm5));
+ TEST_INSTRUCTION("62F14C1858DD" , rn_sae().vaddps(zmm3, zmm6, zmm5));
+ TEST_INSTRUCTION("62F14C5858DD" , ru_sae().vaddps(zmm3, zmm6, zmm5));
+ TEST_INSTRUCTION("62F14C3858DD" , rd_sae().vaddps(zmm3, zmm6, zmm5));
+ TEST_INSTRUCTION("62F14C7858DD" , rz_sae().vaddps(zmm3, zmm6, zmm5));
+ TEST_INSTRUCTION("62F14C485819" , vaddps(zmm3, zmm6, zmmword_ptr(rcx)));
+ TEST_INSTRUCTION("62B14C48589CF034120000" , vaddps(zmm3, zmm6, zmmword_ptr(rax, r14, 3, 4660)));
+ TEST_INSTRUCTION("62F14C585819" , vaddps(zmm3, zmm6, dword_ptr(rcx)._1to16()));
+ TEST_INSTRUCTION("62F14C48585A7F" , vaddps(zmm3, zmm6, zmmword_ptr(rdx, 8128)));
+ TEST_INSTRUCTION("62F14C48589A00200000" , vaddps(zmm3, zmm6, zmmword_ptr(rdx, 8192)));
+ TEST_INSTRUCTION("62F14C48585A80" , vaddps(zmm3, zmm6, zmmword_ptr(rdx, -8192)));
+ TEST_INSTRUCTION("62F14C48589AC0DFFFFF" , vaddps(zmm3, zmm6, zmmword_ptr(rdx, -8256)));
+ TEST_INSTRUCTION("62F14C58585A7F" , vaddps(zmm3, zmm6, dword_ptr(rdx, 508)._1to16()));
+ TEST_INSTRUCTION("62F14C58589A00020000" , vaddps(zmm3, zmm6, dword_ptr(rdx, 512)._1to16()));
+ TEST_INSTRUCTION("62F14C58585A80" , vaddps(zmm3, zmm6, dword_ptr(rdx, -512)._1to16()));
+ TEST_INSTRUCTION("62F14C58589AFCFDFFFF" , vaddps(zmm3, zmm6, dword_ptr(rdx, -516)._1to16()));
+ TEST_INSTRUCTION("6291EF0058CB" , vaddsd(xmm1, xmm18, xmm27));
+ TEST_INSTRUCTION("6291EF0358CB" , k(k3).vaddsd(xmm1, xmm18, xmm27));
+ TEST_INSTRUCTION("6291EF8358CB" , k(k3).z().vaddsd(xmm1, xmm18, xmm27));
+ TEST_INSTRUCTION("6291EF1058CB" , rn_sae().vaddsd(xmm1, xmm18, xmm27));
+ TEST_INSTRUCTION("6291EF5058CB" , ru_sae().vaddsd(xmm1, xmm18, xmm27));
+ TEST_INSTRUCTION("6291EF3058CB" , rd_sae().vaddsd(xmm1, xmm18, xmm27));
+ TEST_INSTRUCTION("6291EF7058CB" , rz_sae().vaddsd(xmm1, xmm18, xmm27));
+ TEST_INSTRUCTION("62F1EF005809" , vaddsd(xmm1, xmm18, qword_ptr(rcx)));
+ TEST_INSTRUCTION("62B1EF00588CF034120000" , vaddsd(xmm1, xmm18, qword_ptr(rax, r14, 3, 4660)));
+ TEST_INSTRUCTION("62F1EF00584A7F" , vaddsd(xmm1, xmm18, qword_ptr(rdx, 1016)));
+ TEST_INSTRUCTION("62F1EF00588A00040000" , vaddsd(xmm1, xmm18, qword_ptr(rdx, 1024)));
+ TEST_INSTRUCTION("62F1EF00584A80" , vaddsd(xmm1, xmm18, qword_ptr(rdx, -1024)));
+ TEST_INSTRUCTION("62F1EF00588AF8FBFFFF" , vaddsd(xmm1, xmm18, qword_ptr(rdx, -1032)));
+ TEST_INSTRUCTION("62C10E0858CF" , vaddss(xmm17, xmm14, xmm15));
+ TEST_INSTRUCTION("62C10E0C58CF" , k(k4).vaddss(xmm17, xmm14, xmm15));
+ TEST_INSTRUCTION("62C10E8C58CF" , k(k4).z().vaddss(xmm17, xmm14, xmm15));
+ TEST_INSTRUCTION("62C10E1858CF" , rn_sae().vaddss(xmm17, xmm14, xmm15));
+ TEST_INSTRUCTION("62C10E5858CF" , ru_sae().vaddss(xmm17, xmm14, xmm15));
+ TEST_INSTRUCTION("62C10E3858CF" , rd_sae().vaddss(xmm17, xmm14, xmm15));
+ TEST_INSTRUCTION("62C10E7858CF" , rz_sae().vaddss(xmm17, xmm14, xmm15));
+ TEST_INSTRUCTION("62E10E085809" , vaddss(xmm17, xmm14, dword_ptr(rcx)));
+ TEST_INSTRUCTION("62A10E08588CF034120000" , vaddss(xmm17, xmm14, dword_ptr(rax, r14, 3, 4660)));
+ TEST_INSTRUCTION("62E10E08584A7F" , vaddss(xmm17, xmm14, dword_ptr(rdx, 508)));
+ TEST_INSTRUCTION("62E10E08588A00020000" , vaddss(xmm17, xmm14, dword_ptr(rdx, 512)));
+ TEST_INSTRUCTION("62E10E08584A80" , vaddss(xmm17, xmm14, dword_ptr(rdx, -512)));
+ TEST_INSTRUCTION("62E10E08588AFCFDFFFF" , vaddss(xmm17, xmm14, dword_ptr(rdx, -516)));
+ TEST_INSTRUCTION("6273454803FDAB" , valignd(zmm15, zmm7, zmm5, 171));
+ TEST_INSTRUCTION("6273454A03FDAB" , k(k2).valignd(zmm15, zmm7, zmm5, 171));
+ TEST_INSTRUCTION("627345CA03FDAB" , k(k2).z().valignd(zmm15, zmm7, zmm5, 171));
+ TEST_INSTRUCTION("6273454803FD7B" , valignd(zmm15, zmm7, zmm5, 123));
+ TEST_INSTRUCTION("6273454803397B" , valignd(zmm15, zmm7, zmmword_ptr(rcx), 123));
+ TEST_INSTRUCTION("6233454803BCF0341200007B" , valignd(zmm15, zmm7, zmmword_ptr(rax, r14, 3, 4660), 123));
+ TEST_INSTRUCTION("6273455803397B" , valignd(zmm15, zmm7, dword_ptr(rcx)._1to16(), 123));
+ TEST_INSTRUCTION("62734548037A7F7B" , valignd(zmm15, zmm7, zmmword_ptr(rdx, 8128), 123));
+ TEST_INSTRUCTION("6273454803BA002000007B" , valignd(zmm15, zmm7, zmmword_ptr(rdx, 8192), 123));
+ TEST_INSTRUCTION("62734548037A807B" , valignd(zmm15, zmm7, zmmword_ptr(rdx, -8192), 123));
+ TEST_INSTRUCTION("6273454803BAC0DFFFFF7B" , valignd(zmm15, zmm7, zmmword_ptr(rdx, -8256), 123));
+ TEST_INSTRUCTION("62734558037A7F7B" , valignd(zmm15, zmm7, dword_ptr(rdx, 508)._1to16(), 123));
+ TEST_INSTRUCTION("6273455803BA000200007B" , valignd(zmm15, zmm7, dword_ptr(rdx, 512)._1to16(), 123));
+ TEST_INSTRUCTION("62734558037A807B" , valignd(zmm15, zmm7, dword_ptr(rdx, -512)._1to16(), 123));
+ TEST_INSTRUCTION("6273455803BAFCFDFFFF7B" , valignd(zmm15, zmm7, dword_ptr(rdx, -516)._1to16(), 123));
+ TEST_INSTRUCTION("62C2ED4865F8" , vblendmpd(zmm23, zmm2, zmm8));
+ TEST_INSTRUCTION("62C2ED4F65F8" , k(k7).vblendmpd(zmm23, zmm2, zmm8));
+ TEST_INSTRUCTION("62C2EDCF65F8" , k(k7).z().vblendmpd(zmm23, zmm2, zmm8));
+ TEST_INSTRUCTION("62E2ED486539" , vblendmpd(zmm23, zmm2, zmmword_ptr(rcx)));
+ TEST_INSTRUCTION("62A2ED4865BCF034120000" , vblendmpd(zmm23, zmm2, zmmword_ptr(rax, r14, 3, 4660)));
+ TEST_INSTRUCTION("62E2ED586539" , vblendmpd(zmm23, zmm2, qword_ptr(rcx)._1to8()));
+ TEST_INSTRUCTION("62E2ED48657A7F" , vblendmpd(zmm23, zmm2, zmmword_ptr(rdx, 8128)));
+ TEST_INSTRUCTION("62E2ED4865BA00200000" , vblendmpd(zmm23, zmm2, zmmword_ptr(rdx, 8192)));
+ TEST_INSTRUCTION("62E2ED48657A80" , vblendmpd(zmm23, zmm2, zmmword_ptr(rdx, -8192)));
+ TEST_INSTRUCTION("62E2ED4865BAC0DFFFFF" , vblendmpd(zmm23, zmm2, zmmword_ptr(rdx, -8256)));
+ TEST_INSTRUCTION("62E2ED58657A7F" , vblendmpd(zmm23, zmm2, qword_ptr(rdx, 1016)._1to8()));
+ TEST_INSTRUCTION("62E2ED5865BA00040000" , vblendmpd(zmm23, zmm2, qword_ptr(rdx, 1024)._1to8()));
+ TEST_INSTRUCTION("62E2ED58657A80" , vblendmpd(zmm23, zmm2, qword_ptr(rdx, -1024)._1to8()));
+ TEST_INSTRUCTION("62E2ED5865BAF8FBFFFF" , vblendmpd(zmm23, zmm2, qword_ptr(rdx, -1032)._1to8()));
+ TEST_INSTRUCTION("62E2354865FF" , vblendmps(zmm23, zmm9, zmm7));
+ TEST_INSTRUCTION("62E2354F65FF" , k(k7).vblendmps(zmm23, zmm9, zmm7));
+ TEST_INSTRUCTION("62E235CF65FF" , k(k7).z().vblendmps(zmm23, zmm9, zmm7));
+ TEST_INSTRUCTION("62E235486539" , vblendmps(zmm23, zmm9, zmmword_ptr(rcx)));
+ TEST_INSTRUCTION("62A2354865BCF034120000" , vblendmps(zmm23, zmm9, zmmword_ptr(rax, r14, 3, 4660)));
+ TEST_INSTRUCTION("62E235586539" , vblendmps(zmm23, zmm9, dword_ptr(rcx)._1to16()));
+ TEST_INSTRUCTION("62E23548657A7F" , vblendmps(zmm23, zmm9, zmmword_ptr(rdx, 8128)));
+ TEST_INSTRUCTION("62E2354865BA00200000" , vblendmps(zmm23, zmm9, zmmword_ptr(rdx, 8192)));
+ TEST_INSTRUCTION("62E23548657A80" , vblendmps(zmm23, zmm9, zmmword_ptr(rdx, -8192)));
+ TEST_INSTRUCTION("62E2354865BAC0DFFFFF" , vblendmps(zmm23, zmm9, zmmword_ptr(rdx, -8256)));
+ TEST_INSTRUCTION("62E23558657A7F" , vblendmps(zmm23, zmm9, dword_ptr(rdx, 508)._1to16()));
+ TEST_INSTRUCTION("62E2355865BA00020000" , vblendmps(zmm23, zmm9, dword_ptr(rdx, 512)._1to16()));
+ TEST_INSTRUCTION("62E23558657A80" , vblendmps(zmm23, zmm9, dword_ptr(rdx, -512)._1to16()));
+ TEST_INSTRUCTION("62E2355865BAFCFDFFFF" , vblendmps(zmm23, zmm9, dword_ptr(rdx, -516)._1to16()));
+ TEST_INSTRUCTION("62727D481A39" , vbroadcastf32x4(zmm15, xmmword_ptr(rcx)));
+ TEST_INSTRUCTION("62727D4B1A39" , k(k3).vbroadcastf32x4(zmm15, xmmword_ptr(rcx)));
+ TEST_INSTRUCTION("62727DCB1A39" , k(k3).z().vbroadcastf32x4(zmm15, xmmword_ptr(rcx)));
+ TEST_INSTRUCTION("62327D481ABCF034120000" , vbroadcastf32x4(zmm15, xmmword_ptr(rax, r14, 3, 4660)));
+ TEST_INSTRUCTION("62727D481A7A7F" , vbroadcastf32x4(zmm15, xmmword_ptr(rdx, 2032)));
+ TEST_INSTRUCTION("62727D481ABA00080000" , vbroadcastf32x4(zmm15, xmmword_ptr(rdx, 2048)));
+ TEST_INSTRUCTION("62727D481A7A80" , vbroadcastf32x4(zmm15, xmmword_ptr(rdx, -2048)));
+ TEST_INSTRUCTION("62727D481ABAF0F7FFFF" , vbroadcastf32x4(zmm15, xmmword_ptr(rdx, -2064)));
+ TEST_INSTRUCTION("6262FD481B11" , vbroadcastf64x4(zmm26, ymmword_ptr(rcx)));
+ TEST_INSTRUCTION("6262FD491B11" , k(k1).vbroadcastf64x4(zmm26, ymmword_ptr(rcx)));
+ TEST_INSTRUCTION("6262FDC91B11" , k(k1).z().vbroadcastf64x4(zmm26, ymmword_ptr(rcx)));
+ TEST_INSTRUCTION("6222FD481B94F034120000" , vbroadcastf64x4(zmm26, ymmword_ptr(rax, r14, 3, 4660)));
+ TEST_INSTRUCTION("6262FD481B527F" , vbroadcastf64x4(zmm26, ymmword_ptr(rdx, 4064)));
+ TEST_INSTRUCTION("6262FD481B9200100000" , vbroadcastf64x4(zmm26, ymmword_ptr(rdx, 4096)));
+ TEST_INSTRUCTION("6262FD481B5280" , vbroadcastf64x4(zmm26, ymmword_ptr(rdx, -4096)));
+ TEST_INSTRUCTION("6262FD481B92E0EFFFFF" , vbroadcastf64x4(zmm26, ymmword_ptr(rdx, -4128)));
+ TEST_INSTRUCTION("62F27D485A11" , vbroadcasti32x4(zmm2, xmmword_ptr(rcx)));
+ TEST_INSTRUCTION("62F27D4D5A11" , k(k5).vbroadcasti32x4(zmm2, xmmword_ptr(rcx)));
+ TEST_INSTRUCTION("62F27DCD5A11" , k(k5).z().vbroadcasti32x4(zmm2, xmmword_ptr(rcx)));
+ TEST_INSTRUCTION("62B27D485A94F034120000" , vbroadcasti32x4(zmm2, xmmword_ptr(rax, r14, 3, 4660)));
+ TEST_INSTRUCTION("62F27D485A527F" , vbroadcasti32x4(zmm2, xmmword_ptr(rdx, 2032)));
+ TEST_INSTRUCTION("62F27D485A9200080000" , vbroadcasti32x4(zmm2, xmmword_ptr(rdx, 2048)));
+ TEST_INSTRUCTION("62F27D485A5280" , vbroadcasti32x4(zmm2, xmmword_ptr(rdx, -2048)));
+ TEST_INSTRUCTION("62F27D485A92F0F7FFFF" , vbroadcasti32x4(zmm2, xmmword_ptr(rdx, -2064)));
+ TEST_INSTRUCTION("62E2FD485B09" , vbroadcasti64x4(zmm17, ymmword_ptr(rcx)));
+ TEST_INSTRUCTION("62E2FD4A5B09" , k(k2).vbroadcasti64x4(zmm17, ymmword_ptr(rcx)));
+ TEST_INSTRUCTION("62E2FDCA5B09" , k(k2).z().vbroadcasti64x4(zmm17, ymmword_ptr(rcx)));
+ TEST_INSTRUCTION("62A2FD485B8CF034120000" , vbroadcasti64x4(zmm17, ymmword_ptr(rax, r14, 3, 4660)));
+ TEST_INSTRUCTION("62E2FD485B4A7F" , vbroadcasti64x4(zmm17, ymmword_ptr(rdx, 4064)));
+ TEST_INSTRUCTION("62E2FD485B8A00100000" , vbroadcasti64x4(zmm17, ymmword_ptr(rdx, 4096)));
+ TEST_INSTRUCTION("62E2FD485B4A80" , vbroadcasti64x4(zmm17, ymmword_ptr(rdx, -4096)));
+ TEST_INSTRUCTION("62E2FD485B8AE0EFFFFF" , vbroadcasti64x4(zmm17, ymmword_ptr(rdx, -4128)));
+ TEST_INSTRUCTION("6262FD481919" , vbroadcastsd(zmm27, qword_ptr(rcx)));
+ TEST_INSTRUCTION("6262FD4F1919" , k(k7).vbroadcastsd(zmm27, qword_ptr(rcx)));
+ TEST_INSTRUCTION("6262FDCF1919" , k(k7).z().vbroadcastsd(zmm27, qword_ptr(rcx)));
+ TEST_INSTRUCTION("6222FD48199CF034120000" , vbroadcastsd(zmm27, qword_ptr(rax, r14, 3, 4660)));
+ TEST_INSTRUCTION("6262FD48195A7F" , vbroadcastsd(zmm27, qword_ptr(rdx, 1016)));
+ TEST_INSTRUCTION("6262FD48199A00040000" , vbroadcastsd(zmm27, qword_ptr(rdx, 1024)));
+ TEST_INSTRUCTION("6262FD48195A80" , vbroadcastsd(zmm27, qword_ptr(rdx, -1024)));
+ TEST_INSTRUCTION("6262FD48199AF8FBFFFF" , vbroadcastsd(zmm27, qword_ptr(rdx, -1032)));
+ TEST_INSTRUCTION("6282FD4819D9" , vbroadcastsd(zmm19, xmm25));
+ TEST_INSTRUCTION("6282FD4B19D9" , k(k3).vbroadcastsd(zmm19, xmm25));
+ TEST_INSTRUCTION("6282FDCB19D9" , k(k3).z().vbroadcastsd(zmm19, xmm25));
+ TEST_INSTRUCTION("62F27D481811" , vbroadcastss(zmm2, dword_ptr(rcx)));
+ TEST_INSTRUCTION("62F27D491811" , k(k1).vbroadcastss(zmm2, dword_ptr(rcx)));
+ TEST_INSTRUCTION("62F27DC91811" , k(k1).z().vbroadcastss(zmm2, dword_ptr(rcx)));
+ TEST_INSTRUCTION("62B27D481894F034120000" , vbroadcastss(zmm2, dword_ptr(rax, r14, 3, 4660)));
+ TEST_INSTRUCTION("62F27D4818527F" , vbroadcastss(zmm2, dword_ptr(rdx, 508)));
+ TEST_INSTRUCTION("62F27D48189200020000" , vbroadcastss(zmm2, dword_ptr(rdx, 512)));
+ TEST_INSTRUCTION("62F27D48185280" , vbroadcastss(zmm2, dword_ptr(rdx, -512)));
+ TEST_INSTRUCTION("62F27D481892FCFDFFFF" , vbroadcastss(zmm2, dword_ptr(rdx, -516)));
+ TEST_INSTRUCTION("62C27D4818FF" , vbroadcastss(zmm23, xmm15));
+ TEST_INSTRUCTION("62C27D4C18FF" , k(k4).vbroadcastss(zmm23, xmm15));
+ TEST_INSTRUCTION("62C27DCC18FF" , k(k4).z().vbroadcastss(zmm23, xmm15));
+ TEST_INSTRUCTION("62B18548C2E8AB" , vcmppd(k5, zmm15, zmm16, 171));
+ TEST_INSTRUCTION("62B1854DC2E8AB" , k(k5).vcmppd(k5, zmm15, zmm16, 171));
+ TEST_INSTRUCTION("62B18518C2E8AB" , sae().vcmppd(k5, zmm15, zmm16, 171));
+ TEST_INSTRUCTION("62B18548C2E87B" , vcmppd(k5, zmm15, zmm16, 123));
+ TEST_INSTRUCTION("62B18518C2E87B" , sae().vcmppd(k5, zmm15, zmm16, 123));
+ TEST_INSTRUCTION("62F18548C2297B" , vcmppd(k5, zmm15, zmmword_ptr(rcx), 123));
+ TEST_INSTRUCTION("62B18548C2ACF0341200007B" , vcmppd(k5, zmm15, zmmword_ptr(rax, r14, 3, 4660), 123));
+ TEST_INSTRUCTION("62F18558C2297B" , vcmppd(k5, zmm15, qword_ptr(rcx)._1to8(), 123));
+ TEST_INSTRUCTION("62F18548C26A7F7B" , vcmppd(k5, zmm15, zmmword_ptr(rdx, 8128), 123));
+ TEST_INSTRUCTION("62F18548C2AA002000007B" , vcmppd(k5, zmm15, zmmword_ptr(rdx, 8192), 123));
+ TEST_INSTRUCTION("62F18548C26A807B" , vcmppd(k5, zmm15, zmmword_ptr(rdx, -8192), 123));
+ TEST_INSTRUCTION("62F18548C2AAC0DFFFFF7B" , vcmppd(k5, zmm15, zmmword_ptr(rdx, -8256), 123));
+ TEST_INSTRUCTION("62F18558C26A7F7B" , vcmppd(k5, zmm15, qword_ptr(rdx, 1016)._1to8(), 123));
+ TEST_INSTRUCTION("62F18558C2AA000400007B" , vcmppd(k5, zmm15, qword_ptr(rdx, 1024)._1to8(), 123));
+ TEST_INSTRUCTION("62F18558C26A807B" , vcmppd(k5, zmm15, qword_ptr(rdx, -1024)._1to8(), 123));
+ TEST_INSTRUCTION("62F18558C2AAF8FBFFFF7B" , vcmppd(k5, zmm15, qword_ptr(rdx, -1032)._1to8(), 123));
+ TEST_INSTRUCTION("62916448C2D5AB" , vcmpps(k2, zmm3, zmm29, 171));
+ TEST_INSTRUCTION("6291644DC2D5AB" , k(k5).vcmpps(k2, zmm3, zmm29, 171));
+ TEST_INSTRUCTION("62916418C2D5AB" , sae().vcmpps(k2, zmm3, zmm29, 171));
+ TEST_INSTRUCTION("62916448C2D57B" , vcmpps(k2, zmm3, zmm29, 123));
+ TEST_INSTRUCTION("62916418C2D57B" , sae().vcmpps(k2, zmm3, zmm29, 123));
+ TEST_INSTRUCTION("62F16448C2117B" , vcmpps(k2, zmm3, zmmword_ptr(rcx), 123));
+ TEST_INSTRUCTION("62B16448C294F0341200007B" , vcmpps(k2, zmm3, zmmword_ptr(rax, r14, 3, 4660), 123));
+ TEST_INSTRUCTION("62F16458C2117B" , vcmpps(k2, zmm3, dword_ptr(rcx)._1to16(), 123));
+ TEST_INSTRUCTION("62F16448C2527F7B" , vcmpps(k2, zmm3, zmmword_ptr(rdx, 8128), 123));
+ TEST_INSTRUCTION("62F16448C292002000007B" , vcmpps(k2, zmm3, zmmword_ptr(rdx, 8192), 123));
+ TEST_INSTRUCTION("62F16448C252807B" , vcmpps(k2, zmm3, zmmword_ptr(rdx, -8192), 123));
+ TEST_INSTRUCTION("62F16448C292C0DFFFFF7B" , vcmpps(k2, zmm3, zmmword_ptr(rdx, -8256), 123));
+ TEST_INSTRUCTION("62F16458C2527F7B" , vcmpps(k2, zmm3, dword_ptr(rdx, 508)._1to16(), 123));
+ TEST_INSTRUCTION("62F16458C292000200007B" , vcmpps(k2, zmm3, dword_ptr(rdx, 512)._1to16(), 123));
+ TEST_INSTRUCTION("62F16458C252807B" , vcmpps(k2, zmm3, dword_ptr(rdx, -512)._1to16(), 123));
+ TEST_INSTRUCTION("62F16458C292FCFDFFFF7B" , vcmpps(k2, zmm3, dword_ptr(rdx, -516)._1to16(), 123));
+ TEST_INSTRUCTION("62F1D708C2E6AB" , vcmpsd(k4, xmm5, xmm6, 171));
+ TEST_INSTRUCTION("62F1D70DC2E6AB" , k(k5).vcmpsd(k4, xmm5, xmm6, 171));
+ TEST_INSTRUCTION("62F1D718C2E6AB" , sae().vcmpsd(k4, xmm5, xmm6, 171));
+ TEST_INSTRUCTION("62F1D708C2E67B" , vcmpsd(k4, xmm5, xmm6, 123));
+ TEST_INSTRUCTION("62F1D718C2E67B" , sae().vcmpsd(k4, xmm5, xmm6, 123));
+ TEST_INSTRUCTION("62F1D708C2217B" , vcmpsd(k4, xmm5, qword_ptr(rcx), 123));
+ TEST_INSTRUCTION("62B1D708C2A4F0341200007B" , vcmpsd(k4, xmm5, qword_ptr(rax, r14, 3, 4660), 123));
+ TEST_INSTRUCTION("62F1D708C2627F7B" , vcmpsd(k4, xmm5, qword_ptr(rdx, 1016), 123));
+ TEST_INSTRUCTION("62F1D708C2A2000400007B" , vcmpsd(k4, xmm5, qword_ptr(rdx, 1024), 123));
+ TEST_INSTRUCTION("62F1D708C262807B" , vcmpsd(k4, xmm5, qword_ptr(rdx, -1024), 123));
+ TEST_INSTRUCTION("62F1D708C2A2F8FBFFFF7B" , vcmpsd(k4, xmm5, qword_ptr(rdx, -1032), 123));
+ TEST_INSTRUCTION("62916600C2D0AB" , vcmpss(k2, xmm19, xmm24, 171));
+ TEST_INSTRUCTION("62916601C2D0AB" , k(k1).vcmpss(k2, xmm19, xmm24, 171));
+ TEST_INSTRUCTION("62916610C2D0AB" , sae().vcmpss(k2, xmm19, xmm24, 171));
+ TEST_INSTRUCTION("62916600C2D07B" , vcmpss(k2, xmm19, xmm24, 123));
+ TEST_INSTRUCTION("62916610C2D07B" , sae().vcmpss(k2, xmm19, xmm24, 123));
+ TEST_INSTRUCTION("62F16600C2117B" , vcmpss(k2, xmm19, dword_ptr(rcx), 123));
+ TEST_INSTRUCTION("62B16600C294F0341200007B" , vcmpss(k2, xmm19, dword_ptr(rax, r14, 3, 4660), 123));
+ TEST_INSTRUCTION("62F16600C2527F7B" , vcmpss(k2, xmm19, dword_ptr(rdx, 508), 123));
+ TEST_INSTRUCTION("62F16600C292000200007B" , vcmpss(k2, xmm19, dword_ptr(rdx, 512), 123));
+ TEST_INSTRUCTION("62F16600C252807B" , vcmpss(k2, xmm19, dword_ptr(rdx, -512), 123));
+ TEST_INSTRUCTION("62F16600C292FCFDFFFF7B" , vcmpss(k2, xmm19, dword_ptr(rdx, -516), 123));
+ TEST_INSTRUCTION("C441792FEB" , vcomisd(xmm13, xmm11));
+ TEST_INSTRUCTION("6251FD182FEB" , sae().vcomisd(xmm13, xmm11));
+ TEST_INSTRUCTION("C5792F29" , vcomisd(xmm13, qword_ptr(rcx)));
+ TEST_INSTRUCTION("C421792FACF034120000" , vcomisd(xmm13, qword_ptr(rax, r14, 3, 4660)));
+ TEST_INSTRUCTION("C5792FAAF8030000" , vcomisd(xmm13, qword_ptr(rdx, 1016)));
+ TEST_INSTRUCTION("C5792FAA00040000" , vcomisd(xmm13, qword_ptr(rdx, 1024)));
+ TEST_INSTRUCTION("C5792FAA00FCFFFF" , vcomisd(xmm13, qword_ptr(rdx, -1024)));
+ TEST_INSTRUCTION("C5792FAAF8FBFFFF" , vcomisd(xmm13, qword_ptr(rdx, -1032)));
+ TEST_INSTRUCTION("C441782FC7" , vcomiss(xmm8, xmm15));
+ TEST_INSTRUCTION("62517C182FC7" , sae().vcomiss(xmm8, xmm15));
+ TEST_INSTRUCTION("C5782F01" , vcomiss(xmm8, dword_ptr(rcx)));
+ TEST_INSTRUCTION("C421782F84F034120000" , vcomiss(xmm8, dword_ptr(rax, r14, 3, 4660)));
+ TEST_INSTRUCTION("C5782F82FC010000" , vcomiss(xmm8, dword_ptr(rdx, 508)));
+ TEST_INSTRUCTION("C5782F8200020000" , vcomiss(xmm8, dword_ptr(rdx, 512)));
+ TEST_INSTRUCTION("C5782F8200FEFFFF" , vcomiss(xmm8, dword_ptr(rdx, -512)));
+ TEST_INSTRUCTION("C5782F82FCFDFFFF" , vcomiss(xmm8, dword_ptr(rdx, -516)));
+ TEST_INSTRUCTION("6262FD488A31" , vcompresspd(zmmword_ptr(rcx), zmm30));
+ TEST_INSTRUCTION("6262FD4F8A31" , k(k7).vcompresspd(zmmword_ptr(rcx), zmm30));
+ TEST_INSTRUCTION("6222FD488AB4F034120000" , vcompresspd(zmmword_ptr(rax, r14, 3, 4660), zmm30));
+ TEST_INSTRUCTION("6262FD488A727F" , vcompresspd(zmmword_ptr(rdx, 1016), zmm30));
+ TEST_INSTRUCTION("6262FD488AB200040000" , vcompresspd(zmmword_ptr(rdx, 1024), zmm30));
+ TEST_INSTRUCTION("6262FD488A7280" , vcompresspd(zmmword_ptr(rdx, -1024), zmm30));
+ TEST_INSTRUCTION("6262FD488AB2F8FBFFFF" , vcompresspd(zmmword_ptr(rdx, -1032), zmm30));
+ TEST_INSTRUCTION("6262FD488AC9" , vcompresspd(zmm1, zmm25));
+ TEST_INSTRUCTION("6262FD4C8AC9" , k(k4).vcompresspd(zmm1, zmm25));
+ TEST_INSTRUCTION("6262FDCC8AC9" , k(k4).z().vcompresspd(zmm1, zmm25));
+ TEST_INSTRUCTION("62727D488A11" , vcompressps(zmmword_ptr(rcx), zmm10));
+ TEST_INSTRUCTION("62727D4C8A11" , k(k4).vcompressps(zmmword_ptr(rcx), zmm10));
+ TEST_INSTRUCTION("62327D488A94F034120000" , vcompressps(zmmword_ptr(rax, r14, 3, 4660), zmm10));
+ TEST_INSTRUCTION("62727D488A527F" , vcompressps(zmmword_ptr(rdx, 508), zmm10));
+ TEST_INSTRUCTION("62727D488A9200020000" , vcompressps(zmmword_ptr(rdx, 512), zmm10));
+ TEST_INSTRUCTION("62727D488A5280" , vcompressps(zmmword_ptr(rdx, -512), zmm10));
+ TEST_INSTRUCTION("62727D488A92FCFDFFFF" , vcompressps(zmmword_ptr(rdx, -516), zmm10));
+ TEST_INSTRUCTION("62B27D488AFB" , vcompressps(zmm19, zmm7));
+ TEST_INSTRUCTION("62B27D4B8AFB" , k(k3).vcompressps(zmm19, zmm7));
+ TEST_INSTRUCTION("62B27DCB8AFB" , k(k3).z().vcompressps(zmm19, zmm7));
+ TEST_INSTRUCTION("62217E48E6E4" , vcvtdq2pd(zmm28, ymm20));
+ TEST_INSTRUCTION("62217E4AE6E4" , k(k2).vcvtdq2pd(zmm28, ymm20));
+ TEST_INSTRUCTION("62217ECAE6E4" , k(k2).z().vcvtdq2pd(zmm28, ymm20));
+ TEST_INSTRUCTION("62617E48E621" , vcvtdq2pd(zmm28, ymmword_ptr(rcx)));
+ TEST_INSTRUCTION("62217E48E6A4F034120000" , vcvtdq2pd(zmm28, ymmword_ptr(rax, r14, 3, 4660)));
+ TEST_INSTRUCTION("62617E58E621" , vcvtdq2pd(zmm28, dword_ptr(rcx)._1to8()));
+ TEST_INSTRUCTION("62617E48E6627F" , vcvtdq2pd(zmm28, ymmword_ptr(rdx, 4064)));
+ TEST_INSTRUCTION("62617E48E6A200100000" , vcvtdq2pd(zmm28, ymmword_ptr(rdx, 4096)));
+ TEST_INSTRUCTION("62617E48E66280" , vcvtdq2pd(zmm28, ymmword_ptr(rdx, -4096)));
+ TEST_INSTRUCTION("62617E48E6A2E0EFFFFF" , vcvtdq2pd(zmm28, ymmword_ptr(rdx, -4128)));
+ TEST_INSTRUCTION("62617E58E6627F" , vcvtdq2pd(zmm28, dword_ptr(rdx, 508)._1to8()));
+ TEST_INSTRUCTION("62617E58E6A200020000" , vcvtdq2pd(zmm28, dword_ptr(rdx, 512)._1to8()));
+ TEST_INSTRUCTION("62617E58E66280" , vcvtdq2pd(zmm28, dword_ptr(rdx, -512)._1to8()));
+ TEST_INSTRUCTION("62617E58E6A2FCFDFFFF" , vcvtdq2pd(zmm28, dword_ptr(rdx, -516)._1to8()));
+ TEST_INSTRUCTION("62E17C485BDC" , vcvtdq2ps(zmm19, zmm4));
+ TEST_INSTRUCTION("62E17C4D5BDC" , k(k5).vcvtdq2ps(zmm19, zmm4));
+ TEST_INSTRUCTION("62E17CCD5BDC" , k(k5).z().vcvtdq2ps(zmm19, zmm4));
+ TEST_INSTRUCTION("62E17C185BDC" , rn_sae().vcvtdq2ps(zmm19, zmm4));
+ TEST_INSTRUCTION("62E17C585BDC" , ru_sae().vcvtdq2ps(zmm19, zmm4));
+ TEST_INSTRUCTION("62E17C385BDC" , rd_sae().vcvtdq2ps(zmm19, zmm4));
+ TEST_INSTRUCTION("62E17C785BDC" , rz_sae().vcvtdq2ps(zmm19, zmm4));
+ TEST_INSTRUCTION("62E17C485B19" , vcvtdq2ps(zmm19, zmmword_ptr(rcx)));
+ TEST_INSTRUCTION("62A17C485B9CF034120000" , vcvtdq2ps(zmm19, zmmword_ptr(rax, r14, 3, 4660)));
+ TEST_INSTRUCTION("62E17C585B19" , vcvtdq2ps(zmm19, dword_ptr(rcx)._1to16()));
+ TEST_INSTRUCTION("62E17C485B5A7F" , vcvtdq2ps(zmm19, zmmword_ptr(rdx, 8128)));
+ TEST_INSTRUCTION("62E17C485B9A00200000" , vcvtdq2ps(zmm19, zmmword_ptr(rdx, 8192)));
+ TEST_INSTRUCTION("62E17C485B5A80" , vcvtdq2ps(zmm19, zmmword_ptr(rdx, -8192)));
+ TEST_INSTRUCTION("62E17C485B9AC0DFFFFF" , vcvtdq2ps(zmm19, zmmword_ptr(rdx, -8256)));
+ TEST_INSTRUCTION("62E17C585B5A7F" , vcvtdq2ps(zmm19, dword_ptr(rdx, 508)._1to16()));
+ TEST_INSTRUCTION("62E17C585B9A00020000" , vcvtdq2ps(zmm19, dword_ptr(rdx, 512)._1to16()));
+ TEST_INSTRUCTION("62E17C585B5A80" , vcvtdq2ps(zmm19, dword_ptr(rdx, -512)._1to16()));
+ TEST_INSTRUCTION("62E17C585B9AFCFDFFFF" , vcvtdq2ps(zmm19, dword_ptr(rdx, -516)._1to16()));
+ TEST_INSTRUCTION("62F1FF48E6F2" , vcvtpd2dq(ymm6, zmm2));
+ TEST_INSTRUCTION("62F1FF4EE6F2" , k(k6).vcvtpd2dq(ymm6, zmm2));
+ TEST_INSTRUCTION("62F1FFCEE6F2" , k(k6).z().vcvtpd2dq(ymm6, zmm2));
+ TEST_INSTRUCTION("62F1FF18E6F2" , rn_sae().vcvtpd2dq(ymm6, zmm2));
+ TEST_INSTRUCTION("62F1FF58E6F2" , ru_sae().vcvtpd2dq(ymm6, zmm2));
+ TEST_INSTRUCTION("62F1FF38E6F2" , rd_sae().vcvtpd2dq(ymm6, zmm2));
+ TEST_INSTRUCTION("62F1FF78E6F2" , rz_sae().vcvtpd2dq(ymm6, zmm2));
+ TEST_INSTRUCTION("62F1FF48E631" , vcvtpd2dq(ymm6, zmmword_ptr(rcx)));
+ TEST_INSTRUCTION("62B1FF48E6B4F034120000" , vcvtpd2dq(ymm6, zmmword_ptr(rax, r14, 3, 4660)));
+ TEST_INSTRUCTION("62F1FF58E631" , vcvtpd2dq(ymm6, qword_ptr(rcx)._1to8()));
+ TEST_INSTRUCTION("62F1FF48E6727F" , vcvtpd2dq(ymm6, zmmword_ptr(rdx, 8128)));
+ TEST_INSTRUCTION("62F1FF48E6B200200000" , vcvtpd2dq(ymm6, zmmword_ptr(rdx, 8192)));
+ TEST_INSTRUCTION("62F1FF48E67280" , vcvtpd2dq(ymm6, zmmword_ptr(rdx, -8192)));
+ TEST_INSTRUCTION("62F1FF48E6B2C0DFFFFF" , vcvtpd2dq(ymm6, zmmword_ptr(rdx, -8256)));
+ TEST_INSTRUCTION("62F1FF58E6727F" , vcvtpd2dq(ymm6, qword_ptr(rdx, 1016)._1to8()));
+ TEST_INSTRUCTION("62F1FF58E6B200040000" , vcvtpd2dq(ymm6, qword_ptr(rdx, 1024)._1to8()));
+ TEST_INSTRUCTION("62F1FF58E67280" , vcvtpd2dq(ymm6, qword_ptr(rdx, -1024)._1to8()));
+ TEST_INSTRUCTION("62F1FF58E6B2F8FBFFFF" , vcvtpd2dq(ymm6, qword_ptr(rdx, -1032)._1to8()));
+ TEST_INSTRUCTION("62C1FD485AC2" , vcvtpd2ps(ymm16, zmm10));
+ TEST_INSTRUCTION("62C1FD4A5AC2" , k(k2).vcvtpd2ps(ymm16, zmm10));
+ TEST_INSTRUCTION("62C1FDCA5AC2" , k(k2).z().vcvtpd2ps(ymm16, zmm10));
+ TEST_INSTRUCTION("62C1FD185AC2" , rn_sae().vcvtpd2ps(ymm16, zmm10));
+ TEST_INSTRUCTION("62C1FD585AC2" , ru_sae().vcvtpd2ps(ymm16, zmm10));
+ TEST_INSTRUCTION("62C1FD385AC2" , rd_sae().vcvtpd2ps(ymm16, zmm10));
+ TEST_INSTRUCTION("62C1FD785AC2" , rz_sae().vcvtpd2ps(ymm16, zmm10));
+ TEST_INSTRUCTION("62E1FD485A01" , vcvtpd2ps(ymm16, zmmword_ptr(rcx)));
+ TEST_INSTRUCTION("62A1FD485A84F034120000" , vcvtpd2ps(ymm16, zmmword_ptr(rax, r14, 3, 4660)));
+ TEST_INSTRUCTION("62E1FD585A01" , vcvtpd2ps(ymm16, qword_ptr(rcx)._1to8()));
+ TEST_INSTRUCTION("62E1FD485A427F" , vcvtpd2ps(ymm16, zmmword_ptr(rdx, 8128)));
+ TEST_INSTRUCTION("62E1FD485A8200200000" , vcvtpd2ps(ymm16, zmmword_ptr(rdx, 8192)));
+ TEST_INSTRUCTION("62E1FD485A4280" , vcvtpd2ps(ymm16, zmmword_ptr(rdx, -8192)));
+ TEST_INSTRUCTION("62E1FD485A82C0DFFFFF" , vcvtpd2ps(ymm16, zmmword_ptr(rdx, -8256)));
+ TEST_INSTRUCTION("62E1FD585A427F" , vcvtpd2ps(ymm16, qword_ptr(rdx, 1016)._1to8()));
+ TEST_INSTRUCTION("62E1FD585A8200040000" , vcvtpd2ps(ymm16, qword_ptr(rdx, 1024)._1to8()));
+ TEST_INSTRUCTION("62E1FD585A4280" , vcvtpd2ps(ymm16, qword_ptr(rdx, -1024)._1to8()));
+ TEST_INSTRUCTION("62E1FD585A82F8FBFFFF" , vcvtpd2ps(ymm16, qword_ptr(rdx, -1032)._1to8()));
+ TEST_INSTRUCTION("6201FC4879C9" , vcvtpd2udq(ymm25, zmm25));
+ TEST_INSTRUCTION("6201FC4979C9" , k(k1).vcvtpd2udq(ymm25, zmm25));
+ TEST_INSTRUCTION("6201FCC979C9" , k(k1).z().vcvtpd2udq(ymm25, zmm25));
+ TEST_INSTRUCTION("6201FC1879C9" , rn_sae().vcvtpd2udq(ymm25, zmm25));
+ TEST_INSTRUCTION("6201FC5879C9" , ru_sae().vcvtpd2udq(ymm25, zmm25));
+ TEST_INSTRUCTION("6201FC3879C9" , rd_sae().vcvtpd2udq(ymm25, zmm25));
+ TEST_INSTRUCTION("6201FC7879C9" , rz_sae().vcvtpd2udq(ymm25, zmm25));
+ TEST_INSTRUCTION("6261FC487909" , vcvtpd2udq(ymm25, zmmword_ptr(rcx)));
+ TEST_INSTRUCTION("6221FC48798CF034120000" , vcvtpd2udq(ymm25, zmmword_ptr(rax, r14, 3, 4660)));
+ TEST_INSTRUCTION("6261FC587909" , vcvtpd2udq(ymm25, qword_ptr(rcx)._1to8()));
+ TEST_INSTRUCTION("6261FC48794A7F" , vcvtpd2udq(ymm25, zmmword_ptr(rdx, 8128)));
+ TEST_INSTRUCTION("6261FC48798A00200000" , vcvtpd2udq(ymm25, zmmword_ptr(rdx, 8192)));
+ TEST_INSTRUCTION("6261FC48794A80" , vcvtpd2udq(ymm25, zmmword_ptr(rdx, -8192)));
+ TEST_INSTRUCTION("6261FC48798AC0DFFFFF" , vcvtpd2udq(ymm25, zmmword_ptr(rdx, -8256)));
+ TEST_INSTRUCTION("6261FC58794A7F" , vcvtpd2udq(ymm25, qword_ptr(rdx, 1016)._1to8()));
+ TEST_INSTRUCTION("6261FC58798A00040000" , vcvtpd2udq(ymm25, qword_ptr(rdx, 1024)._1to8()));
+ TEST_INSTRUCTION("6261FC58794A80" , vcvtpd2udq(ymm25, qword_ptr(rdx, -1024)._1to8()));
+ TEST_INSTRUCTION("6261FC58798AF8FBFFFF" , vcvtpd2udq(ymm25, qword_ptr(rdx, -1032)._1to8()));
+ TEST_INSTRUCTION("62327D4813CD" , vcvtph2ps(zmm9, ymm21));
+ TEST_INSTRUCTION("62327D4B13CD" , k(k3).vcvtph2ps(zmm9, ymm21));
+ TEST_INSTRUCTION("62327DCB13CD" , k(k3).z().vcvtph2ps(zmm9, ymm21));
+ TEST_INSTRUCTION("62327D1813CD" , sae().vcvtph2ps(zmm9, ymm21));
+ TEST_INSTRUCTION("62727D481309" , vcvtph2ps(zmm9, ymmword_ptr(rcx)));
+ TEST_INSTRUCTION("62327D48138CF034120000" , vcvtph2ps(zmm9, ymmword_ptr(rax, r14, 3, 4660)));
+ TEST_INSTRUCTION("62727D48134A7F" , vcvtph2ps(zmm9, ymmword_ptr(rdx, 4064)));
+ TEST_INSTRUCTION("62727D48138A00100000" , vcvtph2ps(zmm9, ymmword_ptr(rdx, 4096)));
+ TEST_INSTRUCTION("62727D48134A80" , vcvtph2ps(zmm9, ymmword_ptr(rdx, -4096)));
+ TEST_INSTRUCTION("62727D48138AE0EFFFFF" , vcvtph2ps(zmm9, ymmword_ptr(rdx, -4128)));
+ TEST_INSTRUCTION("62E17D485BC6" , vcvtps2dq(zmm16, zmm6));
+ TEST_INSTRUCTION("62E17D4A5BC6" , k(k2).vcvtps2dq(zmm16, zmm6));
+ TEST_INSTRUCTION("62E17DCA5BC6" , k(k2).z().vcvtps2dq(zmm16, zmm6));
+ TEST_INSTRUCTION("62E17D185BC6" , rn_sae().vcvtps2dq(zmm16, zmm6));
+ TEST_INSTRUCTION("62E17D585BC6" , ru_sae().vcvtps2dq(zmm16, zmm6));
+ TEST_INSTRUCTION("62E17D385BC6" , rd_sae().vcvtps2dq(zmm16, zmm6));
+ TEST_INSTRUCTION("62E17D785BC6" , rz_sae().vcvtps2dq(zmm16, zmm6));
+ TEST_INSTRUCTION("62E17D485B01" , vcvtps2dq(zmm16, zmmword_ptr(rcx)));
+ TEST_INSTRUCTION("62A17D485B84F034120000" , vcvtps2dq(zmm16, zmmword_ptr(rax, r14, 3, 4660)));
+ TEST_INSTRUCTION("62E17D585B01" , vcvtps2dq(zmm16, dword_ptr(rcx)._1to16()));
+ TEST_INSTRUCTION("62E17D485B427F" , vcvtps2dq(zmm16, zmmword_ptr(rdx, 8128)));
+ TEST_INSTRUCTION("62E17D485B8200200000" , vcvtps2dq(zmm16, zmmword_ptr(rdx, 8192)));
+ TEST_INSTRUCTION("62E17D485B4280" , vcvtps2dq(zmm16, zmmword_ptr(rdx, -8192)));
+ TEST_INSTRUCTION("62E17D485B82C0DFFFFF" , vcvtps2dq(zmm16, zmmword_ptr(rdx, -8256)));
+ TEST_INSTRUCTION("62E17D585B427F" , vcvtps2dq(zmm16, dword_ptr(rdx, 508)._1to16()));
+ TEST_INSTRUCTION("62E17D585B8200020000" , vcvtps2dq(zmm16, dword_ptr(rdx, 512)._1to16()));
+ TEST_INSTRUCTION("62E17D585B4280" , vcvtps2dq(zmm16, dword_ptr(rdx, -512)._1to16()));
+ TEST_INSTRUCTION("62E17D585B82FCFDFFFF" , vcvtps2dq(zmm16, dword_ptr(rdx, -516)._1to16()));
+ TEST_INSTRUCTION("62117C485AD8" , vcvtps2pd(zmm11, ymm24));
+ TEST_INSTRUCTION("62117C4B5AD8" , k(k3).vcvtps2pd(zmm11, ymm24));
+ TEST_INSTRUCTION("62117CCB5AD8" , k(k3).z().vcvtps2pd(zmm11, ymm24));
+ TEST_INSTRUCTION("62117C185AD8" , sae().vcvtps2pd(zmm11, ymm24));
+ TEST_INSTRUCTION("62717C485A19" , vcvtps2pd(zmm11, ymmword_ptr(rcx)));
+ TEST_INSTRUCTION("62317C485A9CF034120000" , vcvtps2pd(zmm11, ymmword_ptr(rax, r14, 3, 4660)));
+ TEST_INSTRUCTION("62717C585A19" , vcvtps2pd(zmm11, dword_ptr(rcx)._1to8()));
+ TEST_INSTRUCTION("62717C485A5A7F" , vcvtps2pd(zmm11, ymmword_ptr(rdx, 4064)));
+ TEST_INSTRUCTION("62717C485A9A00100000" , vcvtps2pd(zmm11, ymmword_ptr(rdx, 4096)));
+ TEST_INSTRUCTION("62717C485A5A80" , vcvtps2pd(zmm11, ymmword_ptr(rdx, -4096)));
+ TEST_INSTRUCTION("62717C485A9AE0EFFFFF" , vcvtps2pd(zmm11, ymmword_ptr(rdx, -4128)));
+ TEST_INSTRUCTION("62717C585A5A7F" , vcvtps2pd(zmm11, dword_ptr(rdx, 508)._1to8()));
+ TEST_INSTRUCTION("62717C585A9A00020000" , vcvtps2pd(zmm11, dword_ptr(rdx, 512)._1to8()));
+ TEST_INSTRUCTION("62717C585A5A80" , vcvtps2pd(zmm11, dword_ptr(rdx, -512)._1to8()));
+ TEST_INSTRUCTION("62717C585A9AFCFDFFFF" , vcvtps2pd(zmm11, dword_ptr(rdx, -516)._1to8()));
+ TEST_INSTRUCTION("62C37D481DF1AB" , vcvtps2ph(ymm9, zmm22, 171));
+ TEST_INSTRUCTION("62C37D4F1DF1AB" , k(k7).vcvtps2ph(ymm9, zmm22, 171));
+ TEST_INSTRUCTION("62C37DCF1DF1AB" , k(k7).z().vcvtps2ph(ymm9, zmm22, 171));
+ TEST_INSTRUCTION("62C37D181DF1AB" , sae().vcvtps2ph(ymm9, zmm22, 171));
+ TEST_INSTRUCTION("62C37D481DF17B" , vcvtps2ph(ymm9, zmm22, 123));
+ TEST_INSTRUCTION("62C37D181DF17B" , sae().vcvtps2ph(ymm9, zmm22, 123));
+ TEST_INSTRUCTION("62F17C4879EC" , vcvtps2udq(zmm5, zmm4));
+ TEST_INSTRUCTION("62F17C4D79EC" , k(k5).vcvtps2udq(zmm5, zmm4));
+ TEST_INSTRUCTION("62F17CCD79EC" , k(k5).z().vcvtps2udq(zmm5, zmm4));
+ TEST_INSTRUCTION("62F17C1879EC" , rn_sae().vcvtps2udq(zmm5, zmm4));
+ TEST_INSTRUCTION("62F17C5879EC" , ru_sae().vcvtps2udq(zmm5, zmm4));
+ TEST_INSTRUCTION("62F17C3879EC" , rd_sae().vcvtps2udq(zmm5, zmm4));
+ TEST_INSTRUCTION("62F17C7879EC" , rz_sae().vcvtps2udq(zmm5, zmm4));
+ TEST_INSTRUCTION("62F17C487929" , vcvtps2udq(zmm5, zmmword_ptr(rcx)));
+ TEST_INSTRUCTION("62B17C4879ACF034120000" , vcvtps2udq(zmm5, zmmword_ptr(rax, r14, 3, 4660)));
+ TEST_INSTRUCTION("62F17C587929" , vcvtps2udq(zmm5, dword_ptr(rcx)._1to16()));
+ TEST_INSTRUCTION("62F17C48796A7F" , vcvtps2udq(zmm5, zmmword_ptr(rdx, 8128)));
+ TEST_INSTRUCTION("62F17C4879AA00200000" , vcvtps2udq(zmm5, zmmword_ptr(rdx, 8192)));
+ TEST_INSTRUCTION("62F17C48796A80" , vcvtps2udq(zmm5, zmmword_ptr(rdx, -8192)));
+ TEST_INSTRUCTION("62F17C4879AAC0DFFFFF" , vcvtps2udq(zmm5, zmmword_ptr(rdx, -8256)));
+ TEST_INSTRUCTION("62F17C58796A7F" , vcvtps2udq(zmm5, dword_ptr(rdx, 508)._1to16()));
+ TEST_INSTRUCTION("62F17C5879AA00020000" , vcvtps2udq(zmm5, dword_ptr(rdx, 512)._1to16()));
+ TEST_INSTRUCTION("62F17C58796A80" , vcvtps2udq(zmm5, dword_ptr(rdx, -512)._1to16()));
+ TEST_INSTRUCTION("62F17C5879AAFCFDFFFF" , vcvtps2udq(zmm5, dword_ptr(rdx, -516)._1to16()));
+ TEST_INSTRUCTION("62F17F182DC4" , rn_sae().vcvtsd2si(eax, xmm4));
+ TEST_INSTRUCTION("62F17F582DC4" , ru_sae().vcvtsd2si(eax, xmm4));
+ TEST_INSTRUCTION("62F17F382DC4" , rd_sae().vcvtsd2si(eax, xmm4));
+ TEST_INSTRUCTION("62F17F782DC4" , rz_sae().vcvtsd2si(eax, xmm4));
+ TEST_INSTRUCTION("62F17F182DEC" , rn_sae().vcvtsd2si(ebp, xmm4));
+ TEST_INSTRUCTION("62F17F582DEC" , ru_sae().vcvtsd2si(ebp, xmm4));
+ TEST_INSTRUCTION("62F17F382DEC" , rd_sae().vcvtsd2si(ebp, xmm4));
+ TEST_INSTRUCTION("62F17F782DEC" , rz_sae().vcvtsd2si(ebp, xmm4));
+ TEST_INSTRUCTION("62717F182DEC" , rn_sae().vcvtsd2si(r13d, xmm4));
+ TEST_INSTRUCTION("62717F582DEC" , ru_sae().vcvtsd2si(r13d, xmm4));
+ TEST_INSTRUCTION("62717F382DEC" , rd_sae().vcvtsd2si(r13d, xmm4));
+ TEST_INSTRUCTION("62717F782DEC" , rz_sae().vcvtsd2si(r13d, xmm4));
+ TEST_INSTRUCTION("6291FF182DC3" , rn_sae().vcvtsd2si(rax, xmm27));
+ TEST_INSTRUCTION("6291FF582DC3" , ru_sae().vcvtsd2si(rax, xmm27));
+ TEST_INSTRUCTION("6291FF382DC3" , rd_sae().vcvtsd2si(rax, xmm27));
+ TEST_INSTRUCTION("6291FF782DC3" , rz_sae().vcvtsd2si(rax, xmm27));
+ TEST_INSTRUCTION("6211FF182DC3" , rn_sae().vcvtsd2si(r8, xmm27));
+ TEST_INSTRUCTION("6211FF582DC3" , ru_sae().vcvtsd2si(r8, xmm27));
+ TEST_INSTRUCTION("6211FF382DC3" , rd_sae().vcvtsd2si(r8, xmm27));
+ TEST_INSTRUCTION("6211FF782DC3" , rz_sae().vcvtsd2si(r8, xmm27));
+ TEST_INSTRUCTION("C5B32AE0" , vcvtsi2sd(xmm4, xmm9, eax));
+ TEST_INSTRUCTION("C5B32AE5" , vcvtsi2sd(xmm4, xmm9, ebp));
+ TEST_INSTRUCTION("C4C1332AE5" , vcvtsi2sd(xmm4, xmm9, r13d));
+ TEST_INSTRUCTION("C5B32A21" , vcvtsi2sd(xmm4, xmm9, dword_ptr(rcx)));
+ TEST_INSTRUCTION("C4A1332AA4F034120000" , vcvtsi2sd(xmm4, xmm9, dword_ptr(rax, r14, 3, 4660)));
+ TEST_INSTRUCTION("C5B32AA2FC010000" , vcvtsi2sd(xmm4, xmm9, dword_ptr(rdx, 508)));
+ TEST_INSTRUCTION("C5B32AA200020000" , vcvtsi2sd(xmm4, xmm9, dword_ptr(rdx, 512)));
+ TEST_INSTRUCTION("C5B32AA200FEFFFF" , vcvtsi2sd(xmm4, xmm9, dword_ptr(rdx, -512)));
+ TEST_INSTRUCTION("C5B32AA2FCFDFFFF" , vcvtsi2sd(xmm4, xmm9, dword_ptr(rdx, -516)));
+ TEST_INSTRUCTION("6261F7002AC0" , vcvtsi2sd(xmm24, xmm17, rax));
+ TEST_INSTRUCTION("6261F7102AC0" , rn_sae().vcvtsi2sd(xmm24, xmm17, rax));
+ TEST_INSTRUCTION("6261F7502AC0" , ru_sae().vcvtsi2sd(xmm24, xmm17, rax));
+ TEST_INSTRUCTION("6261F7302AC0" , rd_sae().vcvtsi2sd(xmm24, xmm17, rax));
+ TEST_INSTRUCTION("6261F7702AC0" , rz_sae().vcvtsi2sd(xmm24, xmm17, rax));
+ TEST_INSTRUCTION("6241F7002AC0" , vcvtsi2sd(xmm24, xmm17, r8));
+ TEST_INSTRUCTION("6241F7102AC0" , rn_sae().vcvtsi2sd(xmm24, xmm17, r8));
+ TEST_INSTRUCTION("6241F7502AC0" , ru_sae().vcvtsi2sd(xmm24, xmm17, r8));
+ TEST_INSTRUCTION("6241F7302AC0" , rd_sae().vcvtsi2sd(xmm24, xmm17, r8));
+ TEST_INSTRUCTION("6241F7702AC0" , rz_sae().vcvtsi2sd(xmm24, xmm17, r8));
+ TEST_INSTRUCTION("6261F7002A01" , vcvtsi2sd(xmm24, xmm17, qword_ptr(rcx)));
+ TEST_INSTRUCTION("6221F7002A84F034120000" , vcvtsi2sd(xmm24, xmm17, qword_ptr(rax, r14, 3, 4660)));
+ TEST_INSTRUCTION("6261F7002A427F" , vcvtsi2sd(xmm24, xmm17, qword_ptr(rdx, 1016)));
+ TEST_INSTRUCTION("6261F7002A8200040000" , vcvtsi2sd(xmm24, xmm17, qword_ptr(rdx, 1024)));
+ TEST_INSTRUCTION("6261F7002A4280" , vcvtsi2sd(xmm24, xmm17, qword_ptr(rdx, -1024)));
+ TEST_INSTRUCTION("6261F7002A82F8FBFFFF" , vcvtsi2sd(xmm24, xmm17, qword_ptr(rdx, -1032)));
+ TEST_INSTRUCTION("62611E002AC8" , vcvtsi2ss(xmm25, xmm28, eax));
+ TEST_INSTRUCTION("62611E102AC8" , rn_sae().vcvtsi2ss(xmm25, xmm28, eax));
+ TEST_INSTRUCTION("62611E502AC8" , ru_sae().vcvtsi2ss(xmm25, xmm28, eax));
+ TEST_INSTRUCTION("62611E302AC8" , rd_sae().vcvtsi2ss(xmm25, xmm28, eax));
+ TEST_INSTRUCTION("62611E702AC8" , rz_sae().vcvtsi2ss(xmm25, xmm28, eax));
+ TEST_INSTRUCTION("62611E002ACD" , vcvtsi2ss(xmm25, xmm28, ebp));
+ TEST_INSTRUCTION("62611E102ACD" , rn_sae().vcvtsi2ss(xmm25, xmm28, ebp));
+ TEST_INSTRUCTION("62611E502ACD" , ru_sae().vcvtsi2ss(xmm25, xmm28, ebp));
+ TEST_INSTRUCTION("62611E302ACD" , rd_sae().vcvtsi2ss(xmm25, xmm28, ebp));
+ TEST_INSTRUCTION("62611E702ACD" , rz_sae().vcvtsi2ss(xmm25, xmm28, ebp));
+ TEST_INSTRUCTION("62411E002ACD" , vcvtsi2ss(xmm25, xmm28, r13d));
+ TEST_INSTRUCTION("62411E102ACD" , rn_sae().vcvtsi2ss(xmm25, xmm28, r13d));
+ TEST_INSTRUCTION("62411E502ACD" , ru_sae().vcvtsi2ss(xmm25, xmm28, r13d));
+ TEST_INSTRUCTION("62411E302ACD" , rd_sae().vcvtsi2ss(xmm25, xmm28, r13d));
+ TEST_INSTRUCTION("62411E702ACD" , rz_sae().vcvtsi2ss(xmm25, xmm28, r13d));
+ TEST_INSTRUCTION("62611E002A09" , vcvtsi2ss(xmm25, xmm28, dword_ptr(rcx)));
+ TEST_INSTRUCTION("62211E002A8CF034120000" , vcvtsi2ss(xmm25, xmm28, dword_ptr(rax, r14, 3, 4660)));
+ TEST_INSTRUCTION("62611E002A4A7F" , vcvtsi2ss(xmm25, xmm28, dword_ptr(rdx, 508)));
+ TEST_INSTRUCTION("62611E002A8A00020000" , vcvtsi2ss(xmm25, xmm28, dword_ptr(rdx, 512)));
+ TEST_INSTRUCTION("62611E002A4A80" , vcvtsi2ss(xmm25, xmm28, dword_ptr(rdx, -512)));
+ TEST_INSTRUCTION("62611E002A8AFCFDFFFF" , vcvtsi2ss(xmm25, xmm28, dword_ptr(rdx, -516)));
+ TEST_INSTRUCTION("C4E1BA2AE0" , vcvtsi2ss(xmm4, xmm8, rax));
+ TEST_INSTRUCTION("62F1BE182AE0" , rn_sae().vcvtsi2ss(xmm4, xmm8, rax));
+ TEST_INSTRUCTION("62F1BE582AE0" , ru_sae().vcvtsi2ss(xmm4, xmm8, rax));
+ TEST_INSTRUCTION("62F1BE382AE0" , rd_sae().vcvtsi2ss(xmm4, xmm8, rax));
+ TEST_INSTRUCTION("62F1BE782AE0" , rz_sae().vcvtsi2ss(xmm4, xmm8, rax));
+ TEST_INSTRUCTION("C4C1BA2AE0" , vcvtsi2ss(xmm4, xmm8, r8));
+ TEST_INSTRUCTION("62D1BE182AE0" , rn_sae().vcvtsi2ss(xmm4, xmm8, r8));
+ TEST_INSTRUCTION("62D1BE582AE0" , ru_sae().vcvtsi2ss(xmm4, xmm8, r8));
+ TEST_INSTRUCTION("62D1BE382AE0" , rd_sae().vcvtsi2ss(xmm4, xmm8, r8));
+ TEST_INSTRUCTION("62D1BE782AE0" , rz_sae().vcvtsi2ss(xmm4, xmm8, r8));
+ TEST_INSTRUCTION("C4E1BA2A21" , vcvtsi2ss(xmm4, xmm8, qword_ptr(rcx)));
+ TEST_INSTRUCTION("C4A1BA2AA4F034120000" , vcvtsi2ss(xmm4, xmm8, qword_ptr(rax, r14, 3, 4660)));
+ TEST_INSTRUCTION("C4E1BA2AA2F8030000" , vcvtsi2ss(xmm4, xmm8, qword_ptr(rdx, 1016)));
+ TEST_INSTRUCTION("C4E1BA2AA200040000" , vcvtsi2ss(xmm4, xmm8, qword_ptr(rdx, 1024)));
+ TEST_INSTRUCTION("C4E1BA2AA200FCFFFF" , vcvtsi2ss(xmm4, xmm8, qword_ptr(rdx, -1024)));
+ TEST_INSTRUCTION("C4E1BA2AA2F8FBFFFF" , vcvtsi2ss(xmm4, xmm8, qword_ptr(rdx, -1032)));
+ TEST_INSTRUCTION("62D17E182DC0" , rn_sae().vcvtss2si(eax, xmm8));
+ TEST_INSTRUCTION("62D17E582DC0" , ru_sae().vcvtss2si(eax, xmm8));
+ TEST_INSTRUCTION("62D17E382DC0" , rd_sae().vcvtss2si(eax, xmm8));
+ TEST_INSTRUCTION("62D17E782DC0" , rz_sae().vcvtss2si(eax, xmm8));
+ TEST_INSTRUCTION("62D17E182DE8" , rn_sae().vcvtss2si(ebp, xmm8));
+ TEST_INSTRUCTION("62D17E582DE8" , ru_sae().vcvtss2si(ebp, xmm8));
+ TEST_INSTRUCTION("62D17E382DE8" , rd_sae().vcvtss2si(ebp, xmm8));
+ TEST_INSTRUCTION("62D17E782DE8" , rz_sae().vcvtss2si(ebp, xmm8));
+ TEST_INSTRUCTION("62517E182DE8" , rn_sae().vcvtss2si(r13d, xmm8));
+ TEST_INSTRUCTION("62517E582DE8" , ru_sae().vcvtss2si(r13d, xmm8));
+ TEST_INSTRUCTION("62517E382DE8" , rd_sae().vcvtss2si(r13d, xmm8));
+ TEST_INSTRUCTION("62517E782DE8" , rz_sae().vcvtss2si(r13d, xmm8));
+ TEST_INSTRUCTION("62F1FE182DC6" , rn_sae().vcvtss2si(rax, xmm6));
+ TEST_INSTRUCTION("62F1FE582DC6" , ru_sae().vcvtss2si(rax, xmm6));
+ TEST_INSTRUCTION("62F1FE382DC6" , rd_sae().vcvtss2si(rax, xmm6));
+ TEST_INSTRUCTION("62F1FE782DC6" , rz_sae().vcvtss2si(rax, xmm6));
+ TEST_INSTRUCTION("6271FE182DC6" , rn_sae().vcvtss2si(r8, xmm6));
+ TEST_INSTRUCTION("6271FE582DC6" , ru_sae().vcvtss2si(r8, xmm6));
+ TEST_INSTRUCTION("6271FE382DC6" , rd_sae().vcvtss2si(r8, xmm6));
+ TEST_INSTRUCTION("6271FE782DC6" , rz_sae().vcvtss2si(r8, xmm6));
+ TEST_INSTRUCTION("62F1FD48E6E1" , vcvttpd2dq(ymm4, zmm1));
+ TEST_INSTRUCTION("62F1FD4EE6E1" , k(k6).vcvttpd2dq(ymm4, zmm1));
+ TEST_INSTRUCTION("62F1FDCEE6E1" , k(k6).z().vcvttpd2dq(ymm4, zmm1));
+ TEST_INSTRUCTION("62F1FD18E6E1" , sae().vcvttpd2dq(ymm4, zmm1));
+ TEST_INSTRUCTION("62F1FD48E621" , vcvttpd2dq(ymm4, zmmword_ptr(rcx)));
+ TEST_INSTRUCTION("62B1FD48E6A4F034120000" , vcvttpd2dq(ymm4, zmmword_ptr(rax, r14, 3, 4660)));
+ TEST_INSTRUCTION("62F1FD58E621" , vcvttpd2dq(ymm4, qword_ptr(rcx)._1to8()));
+ TEST_INSTRUCTION("62F1FD48E6627F" , vcvttpd2dq(ymm4, zmmword_ptr(rdx, 8128)));
+ TEST_INSTRUCTION("62F1FD48E6A200200000" , vcvttpd2dq(ymm4, zmmword_ptr(rdx, 8192)));
+ TEST_INSTRUCTION("62F1FD48E66280" , vcvttpd2dq(ymm4, zmmword_ptr(rdx, -8192)));
+ TEST_INSTRUCTION("62F1FD48E6A2C0DFFFFF" , vcvttpd2dq(ymm4, zmmword_ptr(rdx, -8256)));
+ TEST_INSTRUCTION("62F1FD58E6627F" , vcvttpd2dq(ymm4, qword_ptr(rdx, 1016)._1to8()));
+ TEST_INSTRUCTION("62F1FD58E6A200040000" , vcvttpd2dq(ymm4, qword_ptr(rdx, 1024)._1to8()));
+ TEST_INSTRUCTION("62F1FD58E66280" , vcvttpd2dq(ymm4, qword_ptr(rdx, -1024)._1to8()));
+ TEST_INSTRUCTION("62F1FD58E6A2F8FBFFFF" , vcvttpd2dq(ymm4, qword_ptr(rdx, -1032)._1to8()));
+ TEST_INSTRUCTION("62817E485BFC" , vcvttps2dq(zmm23, zmm28));
+ TEST_INSTRUCTION("62817E4B5BFC" , k(k3).vcvttps2dq(zmm23, zmm28));
+ TEST_INSTRUCTION("62817ECB5BFC" , k(k3).z().vcvttps2dq(zmm23, zmm28));
+ TEST_INSTRUCTION("62817E185BFC" , sae().vcvttps2dq(zmm23, zmm28));
+ TEST_INSTRUCTION("62E17E485B39" , vcvttps2dq(zmm23, zmmword_ptr(rcx)));
+ TEST_INSTRUCTION("62A17E485BBCF034120000" , vcvttps2dq(zmm23, zmmword_ptr(rax, r14, 3, 4660)));
+ TEST_INSTRUCTION("62E17E585B39" , vcvttps2dq(zmm23, dword_ptr(rcx)._1to16()));
+ TEST_INSTRUCTION("62E17E485B7A7F" , vcvttps2dq(zmm23, zmmword_ptr(rdx, 8128)));
+ TEST_INSTRUCTION("62E17E485BBA00200000" , vcvttps2dq(zmm23, zmmword_ptr(rdx, 8192)));
+ TEST_INSTRUCTION("62E17E485B7A80" , vcvttps2dq(zmm23, zmmword_ptr(rdx, -8192)));
+ TEST_INSTRUCTION("62E17E485BBAC0DFFFFF" , vcvttps2dq(zmm23, zmmword_ptr(rdx, -8256)));
+ TEST_INSTRUCTION("62E17E585B7A7F" , vcvttps2dq(zmm23, dword_ptr(rdx, 508)._1to16()));
+ TEST_INSTRUCTION("62E17E585BBA00020000" , vcvttps2dq(zmm23, dword_ptr(rdx, 512)._1to16()));
+ TEST_INSTRUCTION("62E17E585B7A80" , vcvttps2dq(zmm23, dword_ptr(rdx, -512)._1to16()));
+ TEST_INSTRUCTION("62E17E585BBAFCFDFFFF" , vcvttps2dq(zmm23, dword_ptr(rdx, -516)._1to16()));
+ TEST_INSTRUCTION("62F17F182CC5" , sae().vcvttsd2si(eax, xmm5));
+ TEST_INSTRUCTION("62F17F182CED" , sae().vcvttsd2si(ebp, xmm5));
+ TEST_INSTRUCTION("62717F182CED" , sae().vcvttsd2si(r13d, xmm5));
+ TEST_INSTRUCTION("62F1FF182CC7" , sae().vcvttsd2si(rax, xmm7));
+ TEST_INSTRUCTION("6271FF182CC7" , sae().vcvttsd2si(r8, xmm7));
+ TEST_INSTRUCTION("62F17E182CC4" , sae().vcvttss2si(eax, xmm4));
+ TEST_INSTRUCTION("62F17E182CEC" , sae().vcvttss2si(ebp, xmm4));
+ TEST_INSTRUCTION("62717E182CEC" , sae().vcvttss2si(r13d, xmm4));
+ TEST_INSTRUCTION("6291FE182CC3" , sae().vcvttss2si(rax, xmm27));
+ TEST_INSTRUCTION("6211FE182CC3" , sae().vcvttss2si(r8, xmm27));
+ TEST_INSTRUCTION("62817E487AD4" , vcvtudq2pd(zmm18, ymm28));
+ TEST_INSTRUCTION("62817E497AD4" , k(k1).vcvtudq2pd(zmm18, ymm28));
+ TEST_INSTRUCTION("62817EC97AD4" , k(k1).z().vcvtudq2pd(zmm18, ymm28));
+ TEST_INSTRUCTION("62E17E487A11" , vcvtudq2pd(zmm18, ymmword_ptr(rcx)));
+ TEST_INSTRUCTION("62A17E487A94F034120000" , vcvtudq2pd(zmm18, ymmword_ptr(rax, r14, 3, 4660)));
+ TEST_INSTRUCTION("62E17E587A11" , vcvtudq2pd(zmm18, dword_ptr(rcx)._1to8()));
+ TEST_INSTRUCTION("62E17E487A527F" , vcvtudq2pd(zmm18, ymmword_ptr(rdx, 4064)));
+ TEST_INSTRUCTION("62E17E487A9200100000" , vcvtudq2pd(zmm18, ymmword_ptr(rdx, 4096)));
+ TEST_INSTRUCTION("62E17E487A5280" , vcvtudq2pd(zmm18, ymmword_ptr(rdx, -4096)));
+ TEST_INSTRUCTION("62E17E487A92E0EFFFFF" , vcvtudq2pd(zmm18, ymmword_ptr(rdx, -4128)));
+ TEST_INSTRUCTION("62E17E587A527F" , vcvtudq2pd(zmm18, dword_ptr(rdx, 508)._1to8()));
+ TEST_INSTRUCTION("62E17E587A9200020000" , vcvtudq2pd(zmm18, dword_ptr(rdx, 512)._1to8()));
+ TEST_INSTRUCTION("62E17E587A5280" , vcvtudq2pd(zmm18, dword_ptr(rdx, -512)._1to8()));
+ TEST_INSTRUCTION("62E17E587A92FCFDFFFF" , vcvtudq2pd(zmm18, dword_ptr(rdx, -516)._1to8()));
+ TEST_INSTRUCTION("62917F487AF8" , vcvtudq2ps(zmm7, zmm24));
+ TEST_INSTRUCTION("62917F4F7AF8" , k(k7).vcvtudq2ps(zmm7, zmm24));
+ TEST_INSTRUCTION("62917FCF7AF8" , k(k7).z().vcvtudq2ps(zmm7, zmm24));
+ TEST_INSTRUCTION("62917F187AF8" , rn_sae().vcvtudq2ps(zmm7, zmm24));
+ TEST_INSTRUCTION("62917F587AF8" , ru_sae().vcvtudq2ps(zmm7, zmm24));
+ TEST_INSTRUCTION("62917F387AF8" , rd_sae().vcvtudq2ps(zmm7, zmm24));
+ TEST_INSTRUCTION("62917F787AF8" , rz_sae().vcvtudq2ps(zmm7, zmm24));
+ TEST_INSTRUCTION("62F17F487A39" , vcvtudq2ps(zmm7, zmmword_ptr(rcx)));
+ TEST_INSTRUCTION("62B17F487ABCF034120000" , vcvtudq2ps(zmm7, zmmword_ptr(rax, r14, 3, 4660)));
+ TEST_INSTRUCTION("62F17F587A39" , vcvtudq2ps(zmm7, dword_ptr(rcx)._1to16()));
+ TEST_INSTRUCTION("62F17F487A7A7F" , vcvtudq2ps(zmm7, zmmword_ptr(rdx, 8128)));
+ TEST_INSTRUCTION("62F17F487ABA00200000" , vcvtudq2ps(zmm7, zmmword_ptr(rdx, 8192)));
+ TEST_INSTRUCTION("62F17F487A7A80" , vcvtudq2ps(zmm7, zmmword_ptr(rdx, -8192)));
+ TEST_INSTRUCTION("62F17F487ABAC0DFFFFF" , vcvtudq2ps(zmm7, zmmword_ptr(rdx, -8256)));
+ TEST_INSTRUCTION("62F17F587A7A7F" , vcvtudq2ps(zmm7, dword_ptr(rdx, 508)._1to16()));
+ TEST_INSTRUCTION("62F17F587ABA00020000" , vcvtudq2ps(zmm7, dword_ptr(rdx, 512)._1to16()));
+ TEST_INSTRUCTION("62F17F587A7A80" , vcvtudq2ps(zmm7, dword_ptr(rdx, -512)._1to16()));
+ TEST_INSTRUCTION("62F17F587ABAFCFDFFFF" , vcvtudq2ps(zmm7, dword_ptr(rdx, -516)._1to16()));
+ TEST_INSTRUCTION("62A1DD485ED3" , vdivpd(zmm18, zmm4, zmm19));
+ TEST_INSTRUCTION("62A1DD4D5ED3" , k(k5).vdivpd(zmm18, zmm4, zmm19));
+ TEST_INSTRUCTION("62A1DDCD5ED3" , k(k5).z().vdivpd(zmm18, zmm4, zmm19));
+ TEST_INSTRUCTION("62A1DD185ED3" , rn_sae().vdivpd(zmm18, zmm4, zmm19));
+ TEST_INSTRUCTION("62A1DD585ED3" , ru_sae().vdivpd(zmm18, zmm4, zmm19));
+ TEST_INSTRUCTION("62A1DD385ED3" , rd_sae().vdivpd(zmm18, zmm4, zmm19));
+ TEST_INSTRUCTION("62A1DD785ED3" , rz_sae().vdivpd(zmm18, zmm4, zmm19));
+ TEST_INSTRUCTION("62E1DD485E11" , vdivpd(zmm18, zmm4, zmmword_ptr(rcx)));
+ TEST_INSTRUCTION("62A1DD485E94F034120000" , vdivpd(zmm18, zmm4, zmmword_ptr(rax, r14, 3, 4660)));
+ TEST_INSTRUCTION("62E1DD585E11" , vdivpd(zmm18, zmm4, qword_ptr(rcx)._1to8()));
+ TEST_INSTRUCTION("62E1DD485E527F" , vdivpd(zmm18, zmm4, zmmword_ptr(rdx, 8128)));
+ TEST_INSTRUCTION("62E1DD485E9200200000" , vdivpd(zmm18, zmm4, zmmword_ptr(rdx, 8192)));
+ TEST_INSTRUCTION("62E1DD485E5280" , vdivpd(zmm18, zmm4, zmmword_ptr(rdx, -8192)));
+ TEST_INSTRUCTION("62E1DD485E92C0DFFFFF" , vdivpd(zmm18, zmm4, zmmword_ptr(rdx, -8256)));
+ TEST_INSTRUCTION("62E1DD585E527F" , vdivpd(zmm18, zmm4, qword_ptr(rdx, 1016)._1to8()));
+ TEST_INSTRUCTION("62E1DD585E9200040000" , vdivpd(zmm18, zmm4, qword_ptr(rdx, 1024)._1to8()));
+ TEST_INSTRUCTION("62E1DD585E5280" , vdivpd(zmm18, zmm4, qword_ptr(rdx, -1024)._1to8()));
+ TEST_INSTRUCTION("62E1DD585E92F8FBFFFF" , vdivpd(zmm18, zmm4, qword_ptr(rdx, -1032)._1to8()));
+ TEST_INSTRUCTION("62F114405EF4" , vdivps(zmm6, zmm29, zmm4));
+ TEST_INSTRUCTION("62F114465EF4" , k(k6).vdivps(zmm6, zmm29, zmm4));
+ TEST_INSTRUCTION("62F114C65EF4" , k(k6).z().vdivps(zmm6, zmm29, zmm4));
+ TEST_INSTRUCTION("62F114105EF4" , rn_sae().vdivps(zmm6, zmm29, zmm4));
+ TEST_INSTRUCTION("62F114505EF4" , ru_sae().vdivps(zmm6, zmm29, zmm4));
+ TEST_INSTRUCTION("62F114305EF4" , rd_sae().vdivps(zmm6, zmm29, zmm4));
+ TEST_INSTRUCTION("62F114705EF4" , rz_sae().vdivps(zmm6, zmm29, zmm4));
+ TEST_INSTRUCTION("62F114405E31" , vdivps(zmm6, zmm29, zmmword_ptr(rcx)));
+ TEST_INSTRUCTION("62B114405EB4F034120000" , vdivps(zmm6, zmm29, zmmword_ptr(rax, r14, 3, 4660)));
+ TEST_INSTRUCTION("62F114505E31" , vdivps(zmm6, zmm29, dword_ptr(rcx)._1to16()));
+ TEST_INSTRUCTION("62F114405E727F" , vdivps(zmm6, zmm29, zmmword_ptr(rdx, 8128)));
+ TEST_INSTRUCTION("62F114405EB200200000" , vdivps(zmm6, zmm29, zmmword_ptr(rdx, 8192)));
+ TEST_INSTRUCTION("62F114405E7280" , vdivps(zmm6, zmm29, zmmword_ptr(rdx, -8192)));
+ TEST_INSTRUCTION("62F114405EB2C0DFFFFF" , vdivps(zmm6, zmm29, zmmword_ptr(rdx, -8256)));
+ TEST_INSTRUCTION("62F114505E727F" , vdivps(zmm6, zmm29, dword_ptr(rdx, 508)._1to16()));
+ TEST_INSTRUCTION("62F114505EB200020000" , vdivps(zmm6, zmm29, dword_ptr(rdx, 512)._1to16()));
+ TEST_INSTRUCTION("62F114505E7280" , vdivps(zmm6, zmm29, dword_ptr(rdx, -512)._1to16()));
+ TEST_INSTRUCTION("62F114505EB2FCFDFFFF" , vdivps(zmm6, zmm29, dword_ptr(rdx, -516)._1to16()));
+ TEST_INSTRUCTION("6231DF085EFE" , vdivsd(xmm15, xmm4, xmm22));
+ TEST_INSTRUCTION("6231DF0B5EFE" , k(k3).vdivsd(xmm15, xmm4, xmm22));
+ TEST_INSTRUCTION("6231DF8B5EFE" , k(k3).z().vdivsd(xmm15, xmm4, xmm22));
+ TEST_INSTRUCTION("6231DF185EFE" , rn_sae().vdivsd(xmm15, xmm4, xmm22));
+ TEST_INSTRUCTION("6231DF585EFE" , ru_sae().vdivsd(xmm15, xmm4, xmm22));
+ TEST_INSTRUCTION("6231DF385EFE" , rd_sae().vdivsd(xmm15, xmm4, xmm22));
+ TEST_INSTRUCTION("6231DF785EFE" , rz_sae().vdivsd(xmm15, xmm4, xmm22));
+ TEST_INSTRUCTION("C55B5E39" , vdivsd(xmm15, xmm4, qword_ptr(rcx)));
+ TEST_INSTRUCTION("C4215B5EBCF034120000" , vdivsd(xmm15, xmm4, qword_ptr(rax, r14, 3, 4660)));
+ TEST_INSTRUCTION("C55B5EBAF8030000" , vdivsd(xmm15, xmm4, qword_ptr(rdx, 1016)));
+ TEST_INSTRUCTION("C55B5EBA00040000" , vdivsd(xmm15, xmm4, qword_ptr(rdx, 1024)));
+ TEST_INSTRUCTION("C55B5EBA00FCFFFF" , vdivsd(xmm15, xmm4, qword_ptr(rdx, -1024)));
+ TEST_INSTRUCTION("C55B5EBAF8FBFFFF" , vdivsd(xmm15, xmm4, qword_ptr(rdx, -1032)));
+ TEST_INSTRUCTION("62216E085EDC" , vdivss(xmm27, xmm2, xmm20));
+ TEST_INSTRUCTION("62216E0D5EDC" , k(k5).vdivss(xmm27, xmm2, xmm20));
+ TEST_INSTRUCTION("62216E8D5EDC" , k(k5).z().vdivss(xmm27, xmm2, xmm20));
+ TEST_INSTRUCTION("62216E185EDC" , rn_sae().vdivss(xmm27, xmm2, xmm20));
+ TEST_INSTRUCTION("62216E585EDC" , ru_sae().vdivss(xmm27, xmm2, xmm20));
+ TEST_INSTRUCTION("62216E385EDC" , rd_sae().vdivss(xmm27, xmm2, xmm20));
+ TEST_INSTRUCTION("62216E785EDC" , rz_sae().vdivss(xmm27, xmm2, xmm20));
+ TEST_INSTRUCTION("62616E085E19" , vdivss(xmm27, xmm2, dword_ptr(rcx)));
+ TEST_INSTRUCTION("62216E085E9CF034120000" , vdivss(xmm27, xmm2, dword_ptr(rax, r14, 3, 4660)));
+ TEST_INSTRUCTION("62616E085E5A7F" , vdivss(xmm27, xmm2, dword_ptr(rdx, 508)));
+ TEST_INSTRUCTION("62616E085E9A00020000" , vdivss(xmm27, xmm2, dword_ptr(rdx, 512)));
+ TEST_INSTRUCTION("62616E085E5A80" , vdivss(xmm27, xmm2, dword_ptr(rdx, -512)));
+ TEST_INSTRUCTION("62616E085E9AFCFDFFFF" , vdivss(xmm27, xmm2, dword_ptr(rdx, -516)));
+ TEST_INSTRUCTION("62F2FD488821" , vexpandpd(zmm4, zmmword_ptr(rcx)));
+ TEST_INSTRUCTION("62F2FD4F8821" , k(k7).vexpandpd(zmm4, zmmword_ptr(rcx)));
+ TEST_INSTRUCTION("62F2FDCF8821" , k(k7).z().vexpandpd(zmm4, zmmword_ptr(rcx)));
+ TEST_INSTRUCTION("62B2FD4888A4F034120000" , vexpandpd(zmm4, zmmword_ptr(rax, r14, 3, 4660)));
+ TEST_INSTRUCTION("62F2FD4888627F" , vexpandpd(zmm4, zmmword_ptr(rdx, 1016)));
+ TEST_INSTRUCTION("62F2FD4888A200040000" , vexpandpd(zmm4, zmmword_ptr(rdx, 1024)));
+ TEST_INSTRUCTION("62F2FD48886280" , vexpandpd(zmm4, zmmword_ptr(rdx, -1024)));
+ TEST_INSTRUCTION("62F2FD4888A2F8FBFFFF" , vexpandpd(zmm4, zmmword_ptr(rdx, -1032)));
+ TEST_INSTRUCTION("62C2FD4888D1" , vexpandpd(zmm18, zmm9));
+ TEST_INSTRUCTION("62C2FD4A88D1" , k(k2).vexpandpd(zmm18, zmm9));
+ TEST_INSTRUCTION("62C2FDCA88D1" , k(k2).z().vexpandpd(zmm18, zmm9));
+ TEST_INSTRUCTION("62627D488821" , vexpandps(zmm28, zmmword_ptr(rcx)));
+ TEST_INSTRUCTION("62627D4F8821" , k(k7).vexpandps(zmm28, zmmword_ptr(rcx)));
+ TEST_INSTRUCTION("62627DCF8821" , k(k7).z().vexpandps(zmm28, zmmword_ptr(rcx)));
+ TEST_INSTRUCTION("62227D4888A4F034120000" , vexpandps(zmm28, zmmword_ptr(rax, r14, 3, 4660)));
+ TEST_INSTRUCTION("62627D4888627F" , vexpandps(zmm28, zmmword_ptr(rdx, 508)));
+ TEST_INSTRUCTION("62627D4888A200020000" , vexpandps(zmm28, zmmword_ptr(rdx, 512)));
+ TEST_INSTRUCTION("62627D48886280" , vexpandps(zmm28, zmmword_ptr(rdx, -512)));
+ TEST_INSTRUCTION("62627D4888A2FCFDFFFF" , vexpandps(zmm28, zmmword_ptr(rdx, -516)));
+ TEST_INSTRUCTION("62A27D4888CA" , vexpandps(zmm17, zmm18));
+ TEST_INSTRUCTION("62A27D4988CA" , k(k1).vexpandps(zmm17, zmm18));
+ TEST_INSTRUCTION("62A27DC988CA" , k(k1).z().vexpandps(zmm17, zmm18));
+ TEST_INSTRUCTION("62337D4819D5AB" , vextractf32x4(xmm21, zmm10, 171));
+ TEST_INSTRUCTION("62337D4A19D5AB" , k(k2).vextractf32x4(xmm21, zmm10, 171));
+ TEST_INSTRUCTION("62337DCA19D5AB" , k(k2).z().vextractf32x4(xmm21, zmm10, 171));
+ TEST_INSTRUCTION("62337D4819D57B" , vextractf32x4(xmm21, zmm10, 123));
+ TEST_INSTRUCTION("62D3FD481BEEAB" , vextractf64x4(ymm14, zmm5, 171));
+ TEST_INSTRUCTION("62D3FD4B1BEEAB" , k(k3).vextractf64x4(ymm14, zmm5, 171));
+ TEST_INSTRUCTION("62D3FDCB1BEEAB" , k(k3).z().vextractf64x4(ymm14, zmm5, 171));
+ TEST_INSTRUCTION("62D3FD481BEE7B" , vextractf64x4(ymm14, zmm5, 123));
+ TEST_INSTRUCTION("62137D4839E5AB" , vextracti32x4(xmm29, zmm12, 171));
+ TEST_INSTRUCTION("62137D4D39E5AB" , k(k5).vextracti32x4(xmm29, zmm12, 171));
+ TEST_INSTRUCTION("62137DCD39E5AB" , k(k5).z().vextracti32x4(xmm29, zmm12, 171));
+ TEST_INSTRUCTION("62137D4839E57B" , vextracti32x4(xmm29, zmm12, 123));
+ TEST_INSTRUCTION("62E3FD483BF5AB" , vextracti64x4(ymm5, zmm22, 171));
+ TEST_INSTRUCTION("62E3FD4E3BF5AB" , k(k6).vextracti64x4(ymm5, zmm22, 171));
+ TEST_INSTRUCTION("62E3FDCE3BF5AB" , k(k6).z().vextracti64x4(ymm5, zmm22, 171));
+ TEST_INSTRUCTION("62E3FD483BF57B" , vextracti64x4(ymm5, zmm22, 123));
+ TEST_INSTRUCTION("62C2854898FB" , vfmadd132pd(zmm23, zmm15, zmm11));
+ TEST_INSTRUCTION("62C2854F98FB" , k(k7).vfmadd132pd(zmm23, zmm15, zmm11));
+ TEST_INSTRUCTION("62C285CF98FB" , k(k7).z().vfmadd132pd(zmm23, zmm15, zmm11));
+ TEST_INSTRUCTION("62C2851898FB" , rn_sae().vfmadd132pd(zmm23, zmm15, zmm11));
+ TEST_INSTRUCTION("62C2855898FB" , ru_sae().vfmadd132pd(zmm23, zmm15, zmm11));
+ TEST_INSTRUCTION("62C2853898FB" , rd_sae().vfmadd132pd(zmm23, zmm15, zmm11));
+ TEST_INSTRUCTION("62C2857898FB" , rz_sae().vfmadd132pd(zmm23, zmm15, zmm11));
+ TEST_INSTRUCTION("62E285489839" , vfmadd132pd(zmm23, zmm15, zmmword_ptr(rcx)));
+ TEST_INSTRUCTION("62A2854898BCF034120000" , vfmadd132pd(zmm23, zmm15, zmmword_ptr(rax, r14, 3, 4660)));
+ TEST_INSTRUCTION("62E285589839" , vfmadd132pd(zmm23, zmm15, qword_ptr(rcx)._1to8()));
+ TEST_INSTRUCTION("62E28548987A7F" , vfmadd132pd(zmm23, zmm15, zmmword_ptr(rdx, 8128)));
+ TEST_INSTRUCTION("62E2854898BA00200000" , vfmadd132pd(zmm23, zmm15, zmmword_ptr(rdx, 8192)));
+ TEST_INSTRUCTION("62E28548987A80" , vfmadd132pd(zmm23, zmm15, zmmword_ptr(rdx, -8192)));
+ TEST_INSTRUCTION("62E2854898BAC0DFFFFF" , vfmadd132pd(zmm23, zmm15, zmmword_ptr(rdx, -8256)));
+ TEST_INSTRUCTION("62E28558987A7F" , vfmadd132pd(zmm23, zmm15, qword_ptr(rdx, 1016)._1to8()));
+ TEST_INSTRUCTION("62E2855898BA00040000" , vfmadd132pd(zmm23, zmm15, qword_ptr(rdx, 1024)._1to8()));
+ TEST_INSTRUCTION("62E28558987A80" , vfmadd132pd(zmm23, zmm15, qword_ptr(rdx, -1024)._1to8()));
+ TEST_INSTRUCTION("62E2855898BAF8FBFFFF" , vfmadd132pd(zmm23, zmm15, qword_ptr(rdx, -1032)._1to8()));
+ TEST_INSTRUCTION("62A2354098D9" , vfmadd132ps(zmm19, zmm25, zmm17));
+ TEST_INSTRUCTION("62A2354698D9" , k(k6).vfmadd132ps(zmm19, zmm25, zmm17));
+ TEST_INSTRUCTION("62A235C698D9" , k(k6).z().vfmadd132ps(zmm19, zmm25, zmm17));
+ TEST_INSTRUCTION("62A2351098D9" , rn_sae().vfmadd132ps(zmm19, zmm25, zmm17));
+ TEST_INSTRUCTION("62A2355098D9" , ru_sae().vfmadd132ps(zmm19, zmm25, zmm17));
+ TEST_INSTRUCTION("62A2353098D9" , rd_sae().vfmadd132ps(zmm19, zmm25, zmm17));
+ TEST_INSTRUCTION("62A2357098D9" , rz_sae().vfmadd132ps(zmm19, zmm25, zmm17));
+ TEST_INSTRUCTION("62E235409819" , vfmadd132ps(zmm19, zmm25, zmmword_ptr(rcx)));
+ TEST_INSTRUCTION("62A23540989CF034120000" , vfmadd132ps(zmm19, zmm25, zmmword_ptr(rax, r14, 3, 4660)));
+ TEST_INSTRUCTION("62E235509819" , vfmadd132ps(zmm19, zmm25, dword_ptr(rcx)._1to16()));
+ TEST_INSTRUCTION("62E23540985A7F" , vfmadd132ps(zmm19, zmm25, zmmword_ptr(rdx, 8128)));
+ TEST_INSTRUCTION("62E23540989A00200000" , vfmadd132ps(zmm19, zmm25, zmmword_ptr(rdx, 8192)));
+ TEST_INSTRUCTION("62E23540985A80" , vfmadd132ps(zmm19, zmm25, zmmword_ptr(rdx, -8192)));
+ TEST_INSTRUCTION("62E23540989AC0DFFFFF" , vfmadd132ps(zmm19, zmm25, zmmword_ptr(rdx, -8256)));
+ TEST_INSTRUCTION("62E23550985A7F" , vfmadd132ps(zmm19, zmm25, dword_ptr(rdx, 508)._1to16()));
+ TEST_INSTRUCTION("62E23550989A00020000" , vfmadd132ps(zmm19, zmm25, dword_ptr(rdx, 512)._1to16()));
+ TEST_INSTRUCTION("62E23550985A80" , vfmadd132ps(zmm19, zmm25, dword_ptr(rdx, -512)._1to16()));
+ TEST_INSTRUCTION("62E23550989AFCFDFFFF" , vfmadd132ps(zmm19, zmm25, dword_ptr(rdx, -516)._1to16()));
+ TEST_INSTRUCTION("62C2CD0099D3" , vfmadd132sd(xmm18, xmm22, xmm11));
+ TEST_INSTRUCTION("62C2CD0699D3" , k(k6).vfmadd132sd(xmm18, xmm22, xmm11));
+ TEST_INSTRUCTION("62C2CD8699D3" , k(k6).z().vfmadd132sd(xmm18, xmm22, xmm11));
+ TEST_INSTRUCTION("62C2CD1099D3" , rn_sae().vfmadd132sd(xmm18, xmm22, xmm11));
+ TEST_INSTRUCTION("62C2CD5099D3" , ru_sae().vfmadd132sd(xmm18, xmm22, xmm11));
+ TEST_INSTRUCTION("62C2CD3099D3" , rd_sae().vfmadd132sd(xmm18, xmm22, xmm11));
+ TEST_INSTRUCTION("62C2CD7099D3" , rz_sae().vfmadd132sd(xmm18, xmm22, xmm11));
+ TEST_INSTRUCTION("62E2CD009911" , vfmadd132sd(xmm18, xmm22, qword_ptr(rcx)));
+ TEST_INSTRUCTION("62A2CD009994F034120000" , vfmadd132sd(xmm18, xmm22, qword_ptr(rax, r14, 3, 4660)));
+ TEST_INSTRUCTION("62E2CD0099527F" , vfmadd132sd(xmm18, xmm22, qword_ptr(rdx, 1016)));
+ TEST_INSTRUCTION("62E2CD00999200040000" , vfmadd132sd(xmm18, xmm22, qword_ptr(rdx, 1024)));
+ TEST_INSTRUCTION("62E2CD00995280" , vfmadd132sd(xmm18, xmm22, qword_ptr(rdx, -1024)));
+ TEST_INSTRUCTION("62E2CD009992F8FBFFFF" , vfmadd132sd(xmm18, xmm22, qword_ptr(rdx, -1032)));
+ TEST_INSTRUCTION("62625D0099D7" , vfmadd132ss(xmm26, xmm20, xmm7));
+ TEST_INSTRUCTION("62625D0799D7" , k(k7).vfmadd132ss(xmm26, xmm20, xmm7));
+ TEST_INSTRUCTION("62625D8799D7" , k(k7).z().vfmadd132ss(xmm26, xmm20, xmm7));
+ TEST_INSTRUCTION("62625D1099D7" , rn_sae().vfmadd132ss(xmm26, xmm20, xmm7));
+ TEST_INSTRUCTION("62625D5099D7" , ru_sae().vfmadd132ss(xmm26, xmm20, xmm7));
+ TEST_INSTRUCTION("62625D3099D7" , rd_sae().vfmadd132ss(xmm26, xmm20, xmm7));
+ TEST_INSTRUCTION("62625D7099D7" , rz_sae().vfmadd132ss(xmm26, xmm20, xmm7));
+ TEST_INSTRUCTION("62625D009911" , vfmadd132ss(xmm26, xmm20, dword_ptr(rcx)));
+ TEST_INSTRUCTION("62225D009994F034120000" , vfmadd132ss(xmm26, xmm20, dword_ptr(rax, r14, 3, 4660)));
+ TEST_INSTRUCTION("62625D0099527F" , vfmadd132ss(xmm26, xmm20, dword_ptr(rdx, 508)));
+ TEST_INSTRUCTION("62625D00999200020000" , vfmadd132ss(xmm26, xmm20, dword_ptr(rdx, 512)));
+ TEST_INSTRUCTION("62625D00995280" , vfmadd132ss(xmm26, xmm20, dword_ptr(rdx, -512)));
+ TEST_INSTRUCTION("62625D009992FCFDFFFF" , vfmadd132ss(xmm26, xmm20, dword_ptr(rdx, -516)));
+ TEST_INSTRUCTION("62F2F540A8F1" , vfmadd213pd(zmm6, zmm17, zmm1));
+ TEST_INSTRUCTION("62F2F546A8F1" , k(k6).vfmadd213pd(zmm6, zmm17, zmm1));
+ TEST_INSTRUCTION("62F2F5C6A8F1" , k(k6).z().vfmadd213pd(zmm6, zmm17, zmm1));
+ TEST_INSTRUCTION("62F2F510A8F1" , rn_sae().vfmadd213pd(zmm6, zmm17, zmm1));
+ TEST_INSTRUCTION("62F2F550A8F1" , ru_sae().vfmadd213pd(zmm6, zmm17, zmm1));
+ TEST_INSTRUCTION("62F2F530A8F1" , rd_sae().vfmadd213pd(zmm6, zmm17, zmm1));
+ TEST_INSTRUCTION("62F2F570A8F1" , rz_sae().vfmadd213pd(zmm6, zmm17, zmm1));
+ TEST_INSTRUCTION("62F2F540A831" , vfmadd213pd(zmm6, zmm17, zmmword_ptr(rcx)));
+ TEST_INSTRUCTION("62B2F540A8B4F034120000" , vfmadd213pd(zmm6, zmm17, zmmword_ptr(rax, r14, 3, 4660)));
+ TEST_INSTRUCTION("62F2F550A831" , vfmadd213pd(zmm6, zmm17, qword_ptr(rcx)._1to8()));
+ TEST_INSTRUCTION("62F2F540A8727F" , vfmadd213pd(zmm6, zmm17, zmmword_ptr(rdx, 8128)));
+ TEST_INSTRUCTION("62F2F540A8B200200000" , vfmadd213pd(zmm6, zmm17, zmmword_ptr(rdx, 8192)));
+ TEST_INSTRUCTION("62F2F540A87280" , vfmadd213pd(zmm6, zmm17, zmmword_ptr(rdx, -8192)));
+ TEST_INSTRUCTION("62F2F540A8B2C0DFFFFF" , vfmadd213pd(zmm6, zmm17, zmmword_ptr(rdx, -8256)));
+ TEST_INSTRUCTION("62F2F550A8727F" , vfmadd213pd(zmm6, zmm17, qword_ptr(rdx, 1016)._1to8()));
+ TEST_INSTRUCTION("62F2F550A8B200040000" , vfmadd213pd(zmm6, zmm17, qword_ptr(rdx, 1024)._1to8()));
+ TEST_INSTRUCTION("62F2F550A87280" , vfmadd213pd(zmm6, zmm17, qword_ptr(rdx, -1024)._1to8()));
+ TEST_INSTRUCTION("62F2F550A8B2F8FBFFFF" , vfmadd213pd(zmm6, zmm17, qword_ptr(rdx, -1032)._1to8()));
+ TEST_INSTRUCTION("62923D40A8E8" , vfmadd213ps(zmm5, zmm24, zmm24));
+ TEST_INSTRUCTION("62923D46A8E8" , k(k6).vfmadd213ps(zmm5, zmm24, zmm24));
+ TEST_INSTRUCTION("62923DC6A8E8" , k(k6).z().vfmadd213ps(zmm5, zmm24, zmm24));
+ TEST_INSTRUCTION("62923D10A8E8" , rn_sae().vfmadd213ps(zmm5, zmm24, zmm24));
+ TEST_INSTRUCTION("62923D50A8E8" , ru_sae().vfmadd213ps(zmm5, zmm24, zmm24));
+ TEST_INSTRUCTION("62923D30A8E8" , rd_sae().vfmadd213ps(zmm5, zmm24, zmm24));
+ TEST_INSTRUCTION("62923D70A8E8" , rz_sae().vfmadd213ps(zmm5, zmm24, zmm24));
+ TEST_INSTRUCTION("62F23D40A829" , vfmadd213ps(zmm5, zmm24, zmmword_ptr(rcx)));
+ TEST_INSTRUCTION("62B23D40A8ACF034120000" , vfmadd213ps(zmm5, zmm24, zmmword_ptr(rax, r14, 3, 4660)));
+ TEST_INSTRUCTION("62F23D50A829" , vfmadd213ps(zmm5, zmm24, dword_ptr(rcx)._1to16()));
+ TEST_INSTRUCTION("62F23D40A86A7F" , vfmadd213ps(zmm5, zmm24, zmmword_ptr(rdx, 8128)));
+ TEST_INSTRUCTION("62F23D40A8AA00200000" , vfmadd213ps(zmm5, zmm24, zmmword_ptr(rdx, 8192)));
+ TEST_INSTRUCTION("62F23D40A86A80" , vfmadd213ps(zmm5, zmm24, zmmword_ptr(rdx, -8192)));
+ TEST_INSTRUCTION("62F23D40A8AAC0DFFFFF" , vfmadd213ps(zmm5, zmm24, zmmword_ptr(rdx, -8256)));
+ TEST_INSTRUCTION("62F23D50A86A7F" , vfmadd213ps(zmm5, zmm24, dword_ptr(rdx, 508)._1to16()));
+ TEST_INSTRUCTION("62F23D50A8AA00020000" , vfmadd213ps(zmm5, zmm24, dword_ptr(rdx, 512)._1to16()));
+ TEST_INSTRUCTION("62F23D50A86A80" , vfmadd213ps(zmm5, zmm24, dword_ptr(rdx, -512)._1to16()));
+ TEST_INSTRUCTION("62F23D50A8AAFCFDFFFF" , vfmadd213ps(zmm5, zmm24, dword_ptr(rdx, -516)._1to16()));
+ TEST_INSTRUCTION("62028D08A9F4" , vfmadd213sd(xmm30, xmm14, xmm28));
+ TEST_INSTRUCTION("62028D0DA9F4" , k(k5).vfmadd213sd(xmm30, xmm14, xmm28));
+ TEST_INSTRUCTION("62028D8DA9F4" , k(k5).z().vfmadd213sd(xmm30, xmm14, xmm28));
+ TEST_INSTRUCTION("62028D18A9F4" , rn_sae().vfmadd213sd(xmm30, xmm14, xmm28));
+ TEST_INSTRUCTION("62028D58A9F4" , ru_sae().vfmadd213sd(xmm30, xmm14, xmm28));
+ TEST_INSTRUCTION("62028D38A9F4" , rd_sae().vfmadd213sd(xmm30, xmm14, xmm28));
+ TEST_INSTRUCTION("62028D78A9F4" , rz_sae().vfmadd213sd(xmm30, xmm14, xmm28));
+ TEST_INSTRUCTION("62628D08A931" , vfmadd213sd(xmm30, xmm14, qword_ptr(rcx)));
+ TEST_INSTRUCTION("62228D08A9B4F034120000" , vfmadd213sd(xmm30, xmm14, qword_ptr(rax, r14, 3, 4660)));
+ TEST_INSTRUCTION("62628D08A9727F" , vfmadd213sd(xmm30, xmm14, qword_ptr(rdx, 1016)));
+ TEST_INSTRUCTION("62628D08A9B200040000" , vfmadd213sd(xmm30, xmm14, qword_ptr(rdx, 1024)));
+ TEST_INSTRUCTION("62628D08A97280" , vfmadd213sd(xmm30, xmm14, qword_ptr(rdx, -1024)));
+ TEST_INSTRUCTION("62628D08A9B2F8FBFFFF" , vfmadd213sd(xmm30, xmm14, qword_ptr(rdx, -1032)));
+ TEST_INSTRUCTION("62823500A9D1" , vfmadd213ss(xmm18, xmm25, xmm25));
+ TEST_INSTRUCTION("62823501A9D1" , k(k1).vfmadd213ss(xmm18, xmm25, xmm25));
+ TEST_INSTRUCTION("62823581A9D1" , k(k1).z().vfmadd213ss(xmm18, xmm25, xmm25));
+ TEST_INSTRUCTION("62823510A9D1" , rn_sae().vfmadd213ss(xmm18, xmm25, xmm25));
+ TEST_INSTRUCTION("62823550A9D1" , ru_sae().vfmadd213ss(xmm18, xmm25, xmm25));
+ TEST_INSTRUCTION("62823530A9D1" , rd_sae().vfmadd213ss(xmm18, xmm25, xmm25));
+ TEST_INSTRUCTION("62823570A9D1" , rz_sae().vfmadd213ss(xmm18, xmm25, xmm25));
+ TEST_INSTRUCTION("62E23500A911" , vfmadd213ss(xmm18, xmm25, dword_ptr(rcx)));
+ TEST_INSTRUCTION("62A23500A994F034120000" , vfmadd213ss(xmm18, xmm25, dword_ptr(rax, r14, 3, 4660)));
+ TEST_INSTRUCTION("62E23500A9527F" , vfmadd213ss(xmm18, xmm25, dword_ptr(rdx, 508)));
+ TEST_INSTRUCTION("62E23500A99200020000" , vfmadd213ss(xmm18, xmm25, dword_ptr(rdx, 512)));
+ TEST_INSTRUCTION("62E23500A95280" , vfmadd213ss(xmm18, xmm25, dword_ptr(rdx, -512)));
+ TEST_INSTRUCTION("62E23500A992FCFDFFFF" , vfmadd213ss(xmm18, xmm25, dword_ptr(rdx, -516)));
+ TEST_INSTRUCTION("62B29548B8EB" , vfmadd231pd(zmm5, zmm13, zmm19));
+ TEST_INSTRUCTION("62B29549B8EB" , k(k1).vfmadd231pd(zmm5, zmm13, zmm19));
+ TEST_INSTRUCTION("62B295C9B8EB" , k(k1).z().vfmadd231pd(zmm5, zmm13, zmm19));
+ TEST_INSTRUCTION("62B29518B8EB" , rn_sae().vfmadd231pd(zmm5, zmm13, zmm19));
+ TEST_INSTRUCTION("62B29558B8EB" , ru_sae().vfmadd231pd(zmm5, zmm13, zmm19));
+ TEST_INSTRUCTION("62B29538B8EB" , rd_sae().vfmadd231pd(zmm5, zmm13, zmm19));
+ TEST_INSTRUCTION("62B29578B8EB" , rz_sae().vfmadd231pd(zmm5, zmm13, zmm19));
+ TEST_INSTRUCTION("62F29548B829" , vfmadd231pd(zmm5, zmm13, zmmword_ptr(rcx)));
+ TEST_INSTRUCTION("62B29548B8ACF034120000" , vfmadd231pd(zmm5, zmm13, zmmword_ptr(rax, r14, 3, 4660)));
+ TEST_INSTRUCTION("62F29558B829" , vfmadd231pd(zmm5, zmm13, qword_ptr(rcx)._1to8()));
+ TEST_INSTRUCTION("62F29548B86A7F" , vfmadd231pd(zmm5, zmm13, zmmword_ptr(rdx, 8128)));
+ TEST_INSTRUCTION("62F29548B8AA00200000" , vfmadd231pd(zmm5, zmm13, zmmword_ptr(rdx, 8192)));
+ TEST_INSTRUCTION("62F29548B86A80" , vfmadd231pd(zmm5, zmm13, zmmword_ptr(rdx, -8192)));
+ TEST_INSTRUCTION("62F29548B8AAC0DFFFFF" , vfmadd231pd(zmm5, zmm13, zmmword_ptr(rdx, -8256)));
+ TEST_INSTRUCTION("62F29558B86A7F" , vfmadd231pd(zmm5, zmm13, qword_ptr(rdx, 1016)._1to8()));
+ TEST_INSTRUCTION("62F29558B8AA00040000" , vfmadd231pd(zmm5, zmm13, qword_ptr(rdx, 1024)._1to8()));
+ TEST_INSTRUCTION("62F29558B86A80" , vfmadd231pd(zmm5, zmm13, qword_ptr(rdx, -1024)._1to8()));
+ TEST_INSTRUCTION("62F29558B8AAF8FBFFFF" , vfmadd231pd(zmm5, zmm13, qword_ptr(rdx, -1032)._1to8()));
+ TEST_INSTRUCTION("62B27548B8D2" , vfmadd231ps(zmm2, zmm1, zmm18));
+ TEST_INSTRUCTION("62B2754AB8D2" , k(k2).vfmadd231ps(zmm2, zmm1, zmm18));
+ TEST_INSTRUCTION("62B275CAB8D2" , k(k2).z().vfmadd231ps(zmm2, zmm1, zmm18));
+ TEST_INSTRUCTION("62B27518B8D2" , rn_sae().vfmadd231ps(zmm2, zmm1, zmm18));
+ TEST_INSTRUCTION("62B27558B8D2" , ru_sae().vfmadd231ps(zmm2, zmm1, zmm18));
+ TEST_INSTRUCTION("62B27538B8D2" , rd_sae().vfmadd231ps(zmm2, zmm1, zmm18));
+ TEST_INSTRUCTION("62B27578B8D2" , rz_sae().vfmadd231ps(zmm2, zmm1, zmm18));
+ TEST_INSTRUCTION("62F27548B811" , vfmadd231ps(zmm2, zmm1, zmmword_ptr(rcx)));
+ TEST_INSTRUCTION("62B27548B894F034120000" , vfmadd231ps(zmm2, zmm1, zmmword_ptr(rax, r14, 3, 4660)));
+ TEST_INSTRUCTION("62F27558B811" , vfmadd231ps(zmm2, zmm1, dword_ptr(rcx)._1to16()));
+ TEST_INSTRUCTION("62F27548B8527F" , vfmadd231ps(zmm2, zmm1, zmmword_ptr(rdx, 8128)));
+ TEST_INSTRUCTION("62F27548B89200200000" , vfmadd231ps(zmm2, zmm1, zmmword_ptr(rdx, 8192)));
+ TEST_INSTRUCTION("62F27548B85280" , vfmadd231ps(zmm2, zmm1, zmmword_ptr(rdx, -8192)));
+ TEST_INSTRUCTION("62F27548B892C0DFFFFF" , vfmadd231ps(zmm2, zmm1, zmmword_ptr(rdx, -8256)));
+ TEST_INSTRUCTION("62F27558B8527F" , vfmadd231ps(zmm2, zmm1, dword_ptr(rdx, 508)._1to16()));
+ TEST_INSTRUCTION("62F27558B89200020000" , vfmadd231ps(zmm2, zmm1, dword_ptr(rdx, 512)._1to16()));
+ TEST_INSTRUCTION("62F27558B85280" , vfmadd231ps(zmm2, zmm1, dword_ptr(rdx, -512)._1to16()));
+ TEST_INSTRUCTION("62F27558B892FCFDFFFF" , vfmadd231ps(zmm2, zmm1, dword_ptr(rdx, -516)._1to16()));
+ TEST_INSTRUCTION("C4C289B9F6" , vfmadd231sd(xmm6, xmm14, xmm14));
+ TEST_INSTRUCTION("62D28D0AB9F6" , k(k2).vfmadd231sd(xmm6, xmm14, xmm14));
+ TEST_INSTRUCTION("62D28D8AB9F6" , k(k2).z().vfmadd231sd(xmm6, xmm14, xmm14));
+ TEST_INSTRUCTION("62D28D18B9F6" , rn_sae().vfmadd231sd(xmm6, xmm14, xmm14));
+ TEST_INSTRUCTION("62D28D58B9F6" , ru_sae().vfmadd231sd(xmm6, xmm14, xmm14));
+ TEST_INSTRUCTION("62D28D38B9F6" , rd_sae().vfmadd231sd(xmm6, xmm14, xmm14));
+ TEST_INSTRUCTION("62D28D78B9F6" , rz_sae().vfmadd231sd(xmm6, xmm14, xmm14));
+ TEST_INSTRUCTION("C4E289B931" , vfmadd231sd(xmm6, xmm14, qword_ptr(rcx)));
+ TEST_INSTRUCTION("C4A289B9B4F034120000" , vfmadd231sd(xmm6, xmm14, qword_ptr(rax, r14, 3, 4660)));
+ TEST_INSTRUCTION("C4E289B9B2F8030000" , vfmadd231sd(xmm6, xmm14, qword_ptr(rdx, 1016)));
+ TEST_INSTRUCTION("C4E289B9B200040000" , vfmadd231sd(xmm6, xmm14, qword_ptr(rdx, 1024)));
+ TEST_INSTRUCTION("C4E289B9B200FCFFFF" , vfmadd231sd(xmm6, xmm14, qword_ptr(rdx, -1024)));
+ TEST_INSTRUCTION("C4E289B9B2F8FBFFFF" , vfmadd231sd(xmm6, xmm14, qword_ptr(rdx, -1032)));
+ TEST_INSTRUCTION("62220D08B9D3" , vfmadd231ss(xmm26, xmm14, xmm19));
+ TEST_INSTRUCTION("62220D0CB9D3" , k(k4).vfmadd231ss(xmm26, xmm14, xmm19));
+ TEST_INSTRUCTION("62220D8CB9D3" , k(k4).z().vfmadd231ss(xmm26, xmm14, xmm19));
+ TEST_INSTRUCTION("62220D18B9D3" , rn_sae().vfmadd231ss(xmm26, xmm14, xmm19));
+ TEST_INSTRUCTION("62220D58B9D3" , ru_sae().vfmadd231ss(xmm26, xmm14, xmm19));
+ TEST_INSTRUCTION("62220D38B9D3" , rd_sae().vfmadd231ss(xmm26, xmm14, xmm19));
+ TEST_INSTRUCTION("62220D78B9D3" , rz_sae().vfmadd231ss(xmm26, xmm14, xmm19));
+ TEST_INSTRUCTION("62620D08B911" , vfmadd231ss(xmm26, xmm14, dword_ptr(rcx)));
+ TEST_INSTRUCTION("62220D08B994F034120000" , vfmadd231ss(xmm26, xmm14, dword_ptr(rax, r14, 3, 4660)));
+ TEST_INSTRUCTION("62620D08B9527F" , vfmadd231ss(xmm26, xmm14, dword_ptr(rdx, 508)));
+ TEST_INSTRUCTION("62620D08B99200020000" , vfmadd231ss(xmm26, xmm14, dword_ptr(rdx, 512)));
+ TEST_INSTRUCTION("62620D08B95280" , vfmadd231ss(xmm26, xmm14, dword_ptr(rdx, -512)));
+ TEST_INSTRUCTION("62620D08B992FCFDFFFF" , vfmadd231ss(xmm26, xmm14, dword_ptr(rdx, -516)));
+ TEST_INSTRUCTION("62E2CD4896E2" , vfmaddsub132pd(zmm20, zmm6, zmm2));
+ TEST_INSTRUCTION("62E2CD4E96E2" , k(k6).vfmaddsub132pd(zmm20, zmm6, zmm2));
+ TEST_INSTRUCTION("62E2CDCE96E2" , k(k6).z().vfmaddsub132pd(zmm20, zmm6, zmm2));
+ TEST_INSTRUCTION("62E2CD1896E2" , rn_sae().vfmaddsub132pd(zmm20, zmm6, zmm2));
+ TEST_INSTRUCTION("62E2CD5896E2" , ru_sae().vfmaddsub132pd(zmm20, zmm6, zmm2));
+ TEST_INSTRUCTION("62E2CD3896E2" , rd_sae().vfmaddsub132pd(zmm20, zmm6, zmm2));
+ TEST_INSTRUCTION("62E2CD7896E2" , rz_sae().vfmaddsub132pd(zmm20, zmm6, zmm2));
+ TEST_INSTRUCTION("62E2CD489621" , vfmaddsub132pd(zmm20, zmm6, zmmword_ptr(rcx)));
+ TEST_INSTRUCTION("62A2CD4896A4F034120000" , vfmaddsub132pd(zmm20, zmm6, zmmword_ptr(rax, r14, 3, 4660)));
+ TEST_INSTRUCTION("62E2CD589621" , vfmaddsub132pd(zmm20, zmm6, qword_ptr(rcx)._1to8()));
+ TEST_INSTRUCTION("62E2CD4896627F" , vfmaddsub132pd(zmm20, zmm6, zmmword_ptr(rdx, 8128)));
+ TEST_INSTRUCTION("62E2CD4896A200200000" , vfmaddsub132pd(zmm20, zmm6, zmmword_ptr(rdx, 8192)));
+ TEST_INSTRUCTION("62E2CD48966280" , vfmaddsub132pd(zmm20, zmm6, zmmword_ptr(rdx, -8192)));
+ TEST_INSTRUCTION("62E2CD4896A2C0DFFFFF" , vfmaddsub132pd(zmm20, zmm6, zmmword_ptr(rdx, -8256)));
+ TEST_INSTRUCTION("62E2CD5896627F" , vfmaddsub132pd(zmm20, zmm6, qword_ptr(rdx, 1016)._1to8()));
+ TEST_INSTRUCTION("62E2CD5896A200040000" , vfmaddsub132pd(zmm20, zmm6, qword_ptr(rdx, 1024)._1to8()));
+ TEST_INSTRUCTION("62E2CD58966280" , vfmaddsub132pd(zmm20, zmm6, qword_ptr(rdx, -1024)._1to8()));
+ TEST_INSTRUCTION("62E2CD5896A2F8FBFFFF" , vfmaddsub132pd(zmm20, zmm6, qword_ptr(rdx, -1032)._1to8()));
+ TEST_INSTRUCTION("6242454896EC" , vfmaddsub132ps(zmm29, zmm7, zmm12));
+ TEST_INSTRUCTION("6242454F96EC" , k(k7).vfmaddsub132ps(zmm29, zmm7, zmm12));
+ TEST_INSTRUCTION("624245CF96EC" , k(k7).z().vfmaddsub132ps(zmm29, zmm7, zmm12));
+ TEST_INSTRUCTION("6242451896EC" , rn_sae().vfmaddsub132ps(zmm29, zmm7, zmm12));
+ TEST_INSTRUCTION("6242455896EC" , ru_sae().vfmaddsub132ps(zmm29, zmm7, zmm12));
+ TEST_INSTRUCTION("6242453896EC" , rd_sae().vfmaddsub132ps(zmm29, zmm7, zmm12));
+ TEST_INSTRUCTION("6242457896EC" , rz_sae().vfmaddsub132ps(zmm29, zmm7, zmm12));
+ TEST_INSTRUCTION("626245489629" , vfmaddsub132ps(zmm29, zmm7, zmmword_ptr(rcx)));
+ TEST_INSTRUCTION("6222454896ACF034120000" , vfmaddsub132ps(zmm29, zmm7, zmmword_ptr(rax, r14, 3, 4660)));
+ TEST_INSTRUCTION("626245589629" , vfmaddsub132ps(zmm29, zmm7, dword_ptr(rcx)._1to16()));
+ TEST_INSTRUCTION("62624548966A7F" , vfmaddsub132ps(zmm29, zmm7, zmmword_ptr(rdx, 8128)));
+ TEST_INSTRUCTION("6262454896AA00200000" , vfmaddsub132ps(zmm29, zmm7, zmmword_ptr(rdx, 8192)));
+ TEST_INSTRUCTION("62624548966A80" , vfmaddsub132ps(zmm29, zmm7, zmmword_ptr(rdx, -8192)));
+ TEST_INSTRUCTION("6262454896AAC0DFFFFF" , vfmaddsub132ps(zmm29, zmm7, zmmword_ptr(rdx, -8256)));
+ TEST_INSTRUCTION("62624558966A7F" , vfmaddsub132ps(zmm29, zmm7, dword_ptr(rdx, 508)._1to16()));
+ TEST_INSTRUCTION("6262455896AA00020000" , vfmaddsub132ps(zmm29, zmm7, dword_ptr(rdx, 512)._1to16()));
+ TEST_INSTRUCTION("62624558966A80" , vfmaddsub132ps(zmm29, zmm7, dword_ptr(rdx, -512)._1to16()));
+ TEST_INSTRUCTION("6262455896AAFCFDFFFF" , vfmaddsub132ps(zmm29, zmm7, dword_ptr(rdx, -516)._1to16()));
+ TEST_INSTRUCTION("6242DD40A6DF" , vfmaddsub213pd(zmm27, zmm20, zmm15));
+ TEST_INSTRUCTION("6242DD43A6DF" , k(k3).vfmaddsub213pd(zmm27, zmm20, zmm15));
+ TEST_INSTRUCTION("6242DDC3A6DF" , k(k3).z().vfmaddsub213pd(zmm27, zmm20, zmm15));
+ TEST_INSTRUCTION("6242DD10A6DF" , rn_sae().vfmaddsub213pd(zmm27, zmm20, zmm15));
+ TEST_INSTRUCTION("6242DD50A6DF" , ru_sae().vfmaddsub213pd(zmm27, zmm20, zmm15));
+ TEST_INSTRUCTION("6242DD30A6DF" , rd_sae().vfmaddsub213pd(zmm27, zmm20, zmm15));
+ TEST_INSTRUCTION("6242DD70A6DF" , rz_sae().vfmaddsub213pd(zmm27, zmm20, zmm15));
+ TEST_INSTRUCTION("6262DD40A619" , vfmaddsub213pd(zmm27, zmm20, zmmword_ptr(rcx)));
+ TEST_INSTRUCTION("6222DD40A69CF034120000" , vfmaddsub213pd(zmm27, zmm20, zmmword_ptr(rax, r14, 3, 4660)));
+ TEST_INSTRUCTION("6262DD50A619" , vfmaddsub213pd(zmm27, zmm20, qword_ptr(rcx)._1to8()));
+ TEST_INSTRUCTION("6262DD40A65A7F" , vfmaddsub213pd(zmm27, zmm20, zmmword_ptr(rdx, 8128)));
+ TEST_INSTRUCTION("6262DD40A69A00200000" , vfmaddsub213pd(zmm27, zmm20, zmmword_ptr(rdx, 8192)));
+ TEST_INSTRUCTION("6262DD40A65A80" , vfmaddsub213pd(zmm27, zmm20, zmmword_ptr(rdx, -8192)));
+ TEST_INSTRUCTION("6262DD40A69AC0DFFFFF" , vfmaddsub213pd(zmm27, zmm20, zmmword_ptr(rdx, -8256)));
+ TEST_INSTRUCTION("6262DD50A65A7F" , vfmaddsub213pd(zmm27, zmm20, qword_ptr(rdx, 1016)._1to8()));
+ TEST_INSTRUCTION("6262DD50A69A00040000" , vfmaddsub213pd(zmm27, zmm20, qword_ptr(rdx, 1024)._1to8()));
+ TEST_INSTRUCTION("6262DD50A65A80" , vfmaddsub213pd(zmm27, zmm20, qword_ptr(rdx, -1024)._1to8()));
+ TEST_INSTRUCTION("6262DD50A69AF8FBFFFF" , vfmaddsub213pd(zmm27, zmm20, qword_ptr(rdx, -1032)._1to8()));
+ TEST_INSTRUCTION("62C21548A6F2" , vfmaddsub213ps(zmm22, zmm13, zmm10));
+ TEST_INSTRUCTION("62C2154DA6F2" , k(k5).vfmaddsub213ps(zmm22, zmm13, zmm10));
+ TEST_INSTRUCTION("62C215CDA6F2" , k(k5).z().vfmaddsub213ps(zmm22, zmm13, zmm10));
+ TEST_INSTRUCTION("62C21518A6F2" , rn_sae().vfmaddsub213ps(zmm22, zmm13, zmm10));
+ TEST_INSTRUCTION("62C21558A6F2" , ru_sae().vfmaddsub213ps(zmm22, zmm13, zmm10));
+ TEST_INSTRUCTION("62C21538A6F2" , rd_sae().vfmaddsub213ps(zmm22, zmm13, zmm10));
+ TEST_INSTRUCTION("62C21578A6F2" , rz_sae().vfmaddsub213ps(zmm22, zmm13, zmm10));
+ TEST_INSTRUCTION("62E21548A631" , vfmaddsub213ps(zmm22, zmm13, zmmword_ptr(rcx)));
+ TEST_INSTRUCTION("62A21548A6B4F034120000" , vfmaddsub213ps(zmm22, zmm13, zmmword_ptr(rax, r14, 3, 4660)));
+ TEST_INSTRUCTION("62E21558A631" , vfmaddsub213ps(zmm22, zmm13, dword_ptr(rcx)._1to16()));
+ TEST_INSTRUCTION("62E21548A6727F" , vfmaddsub213ps(zmm22, zmm13, zmmword_ptr(rdx, 8128)));
+ TEST_INSTRUCTION("62E21548A6B200200000" , vfmaddsub213ps(zmm22, zmm13, zmmword_ptr(rdx, 8192)));
+ TEST_INSTRUCTION("62E21548A67280" , vfmaddsub213ps(zmm22, zmm13, zmmword_ptr(rdx, -8192)));
+ TEST_INSTRUCTION("62E21548A6B2C0DFFFFF" , vfmaddsub213ps(zmm22, zmm13, zmmword_ptr(rdx, -8256)));
+ TEST_INSTRUCTION("62E21558A6727F" , vfmaddsub213ps(zmm22, zmm13, dword_ptr(rdx, 508)._1to16()));
+ TEST_INSTRUCTION("62E21558A6B200020000" , vfmaddsub213ps(zmm22, zmm13, dword_ptr(rdx, 512)._1to16()));
+ TEST_INSTRUCTION("62E21558A67280" , vfmaddsub213ps(zmm22, zmm13, dword_ptr(rdx, -512)._1to16()));
+ TEST_INSTRUCTION("62E21558A6B2FCFDFFFF" , vfmaddsub213ps(zmm22, zmm13, dword_ptr(rdx, -516)._1to16()));
+ TEST_INSTRUCTION("6292B540B6E4" , vfmaddsub231pd(zmm4, zmm25, zmm28));
+ TEST_INSTRUCTION("6292B546B6E4" , k(k6).vfmaddsub231pd(zmm4, zmm25, zmm28));
+ TEST_INSTRUCTION("6292B5C6B6E4" , k(k6).z().vfmaddsub231pd(zmm4, zmm25, zmm28));
+ TEST_INSTRUCTION("6292B510B6E4" , rn_sae().vfmaddsub231pd(zmm4, zmm25, zmm28));
+ TEST_INSTRUCTION("6292B550B6E4" , ru_sae().vfmaddsub231pd(zmm4, zmm25, zmm28));
+ TEST_INSTRUCTION("6292B530B6E4" , rd_sae().vfmaddsub231pd(zmm4, zmm25, zmm28));
+ TEST_INSTRUCTION("6292B570B6E4" , rz_sae().vfmaddsub231pd(zmm4, zmm25, zmm28));
+ TEST_INSTRUCTION("62F2B540B621" , vfmaddsub231pd(zmm4, zmm25, zmmword_ptr(rcx)));
+ TEST_INSTRUCTION("62B2B540B6A4F034120000" , vfmaddsub231pd(zmm4, zmm25, zmmword_ptr(rax, r14, 3, 4660)));
+ TEST_INSTRUCTION("62F2B550B621" , vfmaddsub231pd(zmm4, zmm25, qword_ptr(rcx)._1to8()));
+ TEST_INSTRUCTION("62F2B540B6627F" , vfmaddsub231pd(zmm4, zmm25, zmmword_ptr(rdx, 8128)));
+ TEST_INSTRUCTION("62F2B540B6A200200000" , vfmaddsub231pd(zmm4, zmm25, zmmword_ptr(rdx, 8192)));
+ TEST_INSTRUCTION("62F2B540B66280" , vfmaddsub231pd(zmm4, zmm25, zmmword_ptr(rdx, -8192)));
+ TEST_INSTRUCTION("62F2B540B6A2C0DFFFFF" , vfmaddsub231pd(zmm4, zmm25, zmmword_ptr(rdx, -8256)));
+ TEST_INSTRUCTION("62F2B550B6627F" , vfmaddsub231pd(zmm4, zmm25, qword_ptr(rdx, 1016)._1to8()));
+ TEST_INSTRUCTION("62F2B550B6A200040000" , vfmaddsub231pd(zmm4, zmm25, qword_ptr(rdx, 1024)._1to8()));
+ TEST_INSTRUCTION("62F2B550B66280" , vfmaddsub231pd(zmm4, zmm25, qword_ptr(rdx, -1024)._1to8()));
+ TEST_INSTRUCTION("62F2B550B6A2F8FBFFFF" , vfmaddsub231pd(zmm4, zmm25, qword_ptr(rdx, -1032)._1to8()));
+ TEST_INSTRUCTION("62D24D40B6FA" , vfmaddsub231ps(zmm7, zmm22, zmm10));
+ TEST_INSTRUCTION("62D24D46B6FA" , k(k6).vfmaddsub231ps(zmm7, zmm22, zmm10));
+ TEST_INSTRUCTION("62D24DC6B6FA" , k(k6).z().vfmaddsub231ps(zmm7, zmm22, zmm10));
+ TEST_INSTRUCTION("62D24D10B6FA" , rn_sae().vfmaddsub231ps(zmm7, zmm22, zmm10));
+ TEST_INSTRUCTION("62D24D50B6FA" , ru_sae().vfmaddsub231ps(zmm7, zmm22, zmm10));
+ TEST_INSTRUCTION("62D24D30B6FA" , rd_sae().vfmaddsub231ps(zmm7, zmm22, zmm10));
+ TEST_INSTRUCTION("62D24D70B6FA" , rz_sae().vfmaddsub231ps(zmm7, zmm22, zmm10));
+ TEST_INSTRUCTION("62F24D40B639" , vfmaddsub231ps(zmm7, zmm22, zmmword_ptr(rcx)));
+ TEST_INSTRUCTION("62B24D40B6BCF034120000" , vfmaddsub231ps(zmm7, zmm22, zmmword_ptr(rax, r14, 3, 4660)));
+ TEST_INSTRUCTION("62F24D50B639" , vfmaddsub231ps(zmm7, zmm22, dword_ptr(rcx)._1to16()));
+ TEST_INSTRUCTION("62F24D40B67A7F" , vfmaddsub231ps(zmm7, zmm22, zmmword_ptr(rdx, 8128)));
+ TEST_INSTRUCTION("62F24D40B6BA00200000" , vfmaddsub231ps(zmm7, zmm22, zmmword_ptr(rdx, 8192)));
+ TEST_INSTRUCTION("62F24D40B67A80" , vfmaddsub231ps(zmm7, zmm22, zmmword_ptr(rdx, -8192)));
+ TEST_INSTRUCTION("62F24D40B6BAC0DFFFFF" , vfmaddsub231ps(zmm7, zmm22, zmmword_ptr(rdx, -8256)));
+ TEST_INSTRUCTION("62F24D50B67A7F" , vfmaddsub231ps(zmm7, zmm22, dword_ptr(rdx, 508)._1to16()));
+ TEST_INSTRUCTION("62F24D50B6BA00020000" , vfmaddsub231ps(zmm7, zmm22, dword_ptr(rdx, 512)._1to16()));
+ TEST_INSTRUCTION("62F24D50B67A80" , vfmaddsub231ps(zmm7, zmm22, dword_ptr(rdx, -512)._1to16()));
+ TEST_INSTRUCTION("62F24D50B6BAFCFDFFFF" , vfmaddsub231ps(zmm7, zmm22, dword_ptr(rdx, -516)._1to16()));
+ TEST_INSTRUCTION("622295409ACB" , vfmsub132pd(zmm25, zmm29, zmm19));
+ TEST_INSTRUCTION("622295449ACB" , k(k4).vfmsub132pd(zmm25, zmm29, zmm19));
+ TEST_INSTRUCTION("622295C49ACB" , k(k4).z().vfmsub132pd(zmm25, zmm29, zmm19));
+ TEST_INSTRUCTION("622295109ACB" , rn_sae().vfmsub132pd(zmm25, zmm29, zmm19));
+ TEST_INSTRUCTION("622295509ACB" , ru_sae().vfmsub132pd(zmm25, zmm29, zmm19));
+ TEST_INSTRUCTION("622295309ACB" , rd_sae().vfmsub132pd(zmm25, zmm29, zmm19));
+ TEST_INSTRUCTION("622295709ACB" , rz_sae().vfmsub132pd(zmm25, zmm29, zmm19));
+ TEST_INSTRUCTION("626295409A09" , vfmsub132pd(zmm25, zmm29, zmmword_ptr(rcx)));
+ TEST_INSTRUCTION("622295409A8CF034120000" , vfmsub132pd(zmm25, zmm29, zmmword_ptr(rax, r14, 3, 4660)));
+ TEST_INSTRUCTION("626295509A09" , vfmsub132pd(zmm25, zmm29, qword_ptr(rcx)._1to8()));
+ TEST_INSTRUCTION("626295409A4A7F" , vfmsub132pd(zmm25, zmm29, zmmword_ptr(rdx, 8128)));
+ TEST_INSTRUCTION("626295409A8A00200000" , vfmsub132pd(zmm25, zmm29, zmmword_ptr(rdx, 8192)));
+ TEST_INSTRUCTION("626295409A4A80" , vfmsub132pd(zmm25, zmm29, zmmword_ptr(rdx, -8192)));
+ TEST_INSTRUCTION("626295409A8AC0DFFFFF" , vfmsub132pd(zmm25, zmm29, zmmword_ptr(rdx, -8256)));
+ TEST_INSTRUCTION("626295509A4A7F" , vfmsub132pd(zmm25, zmm29, qword_ptr(rdx, 1016)._1to8()));
+ TEST_INSTRUCTION("626295509A8A00040000" , vfmsub132pd(zmm25, zmm29, qword_ptr(rdx, 1024)._1to8()));
+ TEST_INSTRUCTION("626295509A4A80" , vfmsub132pd(zmm25, zmm29, qword_ptr(rdx, -1024)._1to8()));
+ TEST_INSTRUCTION("626295509A8AF8FBFFFF" , vfmsub132pd(zmm25, zmm29, qword_ptr(rdx, -1032)._1to8()));
+ TEST_INSTRUCTION("62224D489ADA" , vfmsub132ps(zmm27, zmm6, zmm18));
+ TEST_INSTRUCTION("62224D4C9ADA" , k(k4).vfmsub132ps(zmm27, zmm6, zmm18));
+ TEST_INSTRUCTION("62224DCC9ADA" , k(k4).z().vfmsub132ps(zmm27, zmm6, zmm18));
+ TEST_INSTRUCTION("62224D189ADA" , rn_sae().vfmsub132ps(zmm27, zmm6, zmm18));
+ TEST_INSTRUCTION("62224D589ADA" , ru_sae().vfmsub132ps(zmm27, zmm6, zmm18));
+ TEST_INSTRUCTION("62224D389ADA" , rd_sae().vfmsub132ps(zmm27, zmm6, zmm18));
+ TEST_INSTRUCTION("62224D789ADA" , rz_sae().vfmsub132ps(zmm27, zmm6, zmm18));
+ TEST_INSTRUCTION("62624D489A19" , vfmsub132ps(zmm27, zmm6, zmmword_ptr(rcx)));
+ TEST_INSTRUCTION("62224D489A9CF034120000" , vfmsub132ps(zmm27, zmm6, zmmword_ptr(rax, r14, 3, 4660)));
+ TEST_INSTRUCTION("62624D589A19" , vfmsub132ps(zmm27, zmm6, dword_ptr(rcx)._1to16()));
+ TEST_INSTRUCTION("62624D489A5A7F" , vfmsub132ps(zmm27, zmm6, zmmword_ptr(rdx, 8128)));
+ TEST_INSTRUCTION("62624D489A9A00200000" , vfmsub132ps(zmm27, zmm6, zmmword_ptr(rdx, 8192)));
+ TEST_INSTRUCTION("62624D489A5A80" , vfmsub132ps(zmm27, zmm6, zmmword_ptr(rdx, -8192)));
+ TEST_INSTRUCTION("62624D489A9AC0DFFFFF" , vfmsub132ps(zmm27, zmm6, zmmword_ptr(rdx, -8256)));
+ TEST_INSTRUCTION("62624D589A5A7F" , vfmsub132ps(zmm27, zmm6, dword_ptr(rdx, 508)._1to16()));
+ TEST_INSTRUCTION("62624D589A9A00020000" , vfmsub132ps(zmm27, zmm6, dword_ptr(rdx, 512)._1to16()));
+ TEST_INSTRUCTION("62624D589A5A80" , vfmsub132ps(zmm27, zmm6, dword_ptr(rdx, -512)._1to16()));
+ TEST_INSTRUCTION("62624D589A9AFCFDFFFF" , vfmsub132ps(zmm27, zmm6, dword_ptr(rdx, -516)._1to16()));
+ TEST_INSTRUCTION("6282DD009BFC" , vfmsub132sd(xmm23, xmm20, xmm28));
+ TEST_INSTRUCTION("6282DD019BFC" , k(k1).vfmsub132sd(xmm23, xmm20, xmm28));
+ TEST_INSTRUCTION("6282DD819BFC" , k(k1).z().vfmsub132sd(xmm23, xmm20, xmm28));
+ TEST_INSTRUCTION("6282DD109BFC" , rn_sae().vfmsub132sd(xmm23, xmm20, xmm28));
+ TEST_INSTRUCTION("6282DD509BFC" , ru_sae().vfmsub132sd(xmm23, xmm20, xmm28));
+ TEST_INSTRUCTION("6282DD309BFC" , rd_sae().vfmsub132sd(xmm23, xmm20, xmm28));
+ TEST_INSTRUCTION("6282DD709BFC" , rz_sae().vfmsub132sd(xmm23, xmm20, xmm28));
+ TEST_INSTRUCTION("62E2DD009B39" , vfmsub132sd(xmm23, xmm20, qword_ptr(rcx)));
+ TEST_INSTRUCTION("62A2DD009BBCF034120000" , vfmsub132sd(xmm23, xmm20, qword_ptr(rax, r14, 3, 4660)));
+ TEST_INSTRUCTION("62E2DD009B7A7F" , vfmsub132sd(xmm23, xmm20, qword_ptr(rdx, 1016)));
+ TEST_INSTRUCTION("62E2DD009BBA00040000" , vfmsub132sd(xmm23, xmm20, qword_ptr(rdx, 1024)));
+ TEST_INSTRUCTION("62E2DD009B7A80" , vfmsub132sd(xmm23, xmm20, qword_ptr(rdx, -1024)));
+ TEST_INSTRUCTION("62E2DD009BBAF8FBFFFF" , vfmsub132sd(xmm23, xmm20, qword_ptr(rdx, -1032)));
+ TEST_INSTRUCTION("620235089BD1" , vfmsub132ss(xmm26, xmm9, xmm25));
+ TEST_INSTRUCTION("6202350F9BD1" , k(k7).vfmsub132ss(xmm26, xmm9, xmm25));
+ TEST_INSTRUCTION("6202358F9BD1" , k(k7).z().vfmsub132ss(xmm26, xmm9, xmm25));
+ TEST_INSTRUCTION("620235189BD1" , rn_sae().vfmsub132ss(xmm26, xmm9, xmm25));
+ TEST_INSTRUCTION("620235589BD1" , ru_sae().vfmsub132ss(xmm26, xmm9, xmm25));
+ TEST_INSTRUCTION("620235389BD1" , rd_sae().vfmsub132ss(xmm26, xmm9, xmm25));
+ TEST_INSTRUCTION("620235789BD1" , rz_sae().vfmsub132ss(xmm26, xmm9, xmm25));
+ TEST_INSTRUCTION("626235089B11" , vfmsub132ss(xmm26, xmm9, dword_ptr(rcx)));
+ TEST_INSTRUCTION("622235089B94F034120000" , vfmsub132ss(xmm26, xmm9, dword_ptr(rax, r14, 3, 4660)));
+ TEST_INSTRUCTION("626235089B527F" , vfmsub132ss(xmm26, xmm9, dword_ptr(rdx, 508)));
+ TEST_INSTRUCTION("626235089B9200020000" , vfmsub132ss(xmm26, xmm9, dword_ptr(rdx, 512)));
+ TEST_INSTRUCTION("626235089B5280" , vfmsub132ss(xmm26, xmm9, dword_ptr(rdx, -512)));
+ TEST_INSTRUCTION("626235089B92FCFDFFFF" , vfmsub132ss(xmm26, xmm9, dword_ptr(rdx, -516)));
+ TEST_INSTRUCTION("62B2ED40AAFB" , vfmsub213pd(zmm7, zmm18, zmm19));
+ TEST_INSTRUCTION("62B2ED44AAFB" , k(k4).vfmsub213pd(zmm7, zmm18, zmm19));
+ TEST_INSTRUCTION("62B2EDC4AAFB" , k(k4).z().vfmsub213pd(zmm7, zmm18, zmm19));
+ TEST_INSTRUCTION("62B2ED10AAFB" , rn_sae().vfmsub213pd(zmm7, zmm18, zmm19));
+ TEST_INSTRUCTION("62B2ED50AAFB" , ru_sae().vfmsub213pd(zmm7, zmm18, zmm19));
+ TEST_INSTRUCTION("62B2ED30AAFB" , rd_sae().vfmsub213pd(zmm7, zmm18, zmm19));
+ TEST_INSTRUCTION("62B2ED70AAFB" , rz_sae().vfmsub213pd(zmm7, zmm18, zmm19));
+ TEST_INSTRUCTION("62F2ED40AA39" , vfmsub213pd(zmm7, zmm18, zmmword_ptr(rcx)));
+ TEST_INSTRUCTION("62B2ED40AABCF034120000" , vfmsub213pd(zmm7, zmm18, zmmword_ptr(rax, r14, 3, 4660)));
+ TEST_INSTRUCTION("62F2ED50AA39" , vfmsub213pd(zmm7, zmm18, qword_ptr(rcx)._1to8()));
+ TEST_INSTRUCTION("62F2ED40AA7A7F" , vfmsub213pd(zmm7, zmm18, zmmword_ptr(rdx, 8128)));
+ TEST_INSTRUCTION("62F2ED40AABA00200000" , vfmsub213pd(zmm7, zmm18, zmmword_ptr(rdx, 8192)));
+ TEST_INSTRUCTION("62F2ED40AA7A80" , vfmsub213pd(zmm7, zmm18, zmmword_ptr(rdx, -8192)));
+ TEST_INSTRUCTION("62F2ED40AABAC0DFFFFF" , vfmsub213pd(zmm7, zmm18, zmmword_ptr(rdx, -8256)));
+ TEST_INSTRUCTION("62F2ED50AA7A7F" , vfmsub213pd(zmm7, zmm18, qword_ptr(rdx, 1016)._1to8()));
+ TEST_INSTRUCTION("62F2ED50AABA00040000" , vfmsub213pd(zmm7, zmm18, qword_ptr(rdx, 1024)._1to8()));
+ TEST_INSTRUCTION("62F2ED50AA7A80" , vfmsub213pd(zmm7, zmm18, qword_ptr(rdx, -1024)._1to8()));
+ TEST_INSTRUCTION("62F2ED50AABAF8FBFFFF" , vfmsub213pd(zmm7, zmm18, qword_ptr(rdx, -1032)._1to8()));
+ TEST_INSTRUCTION("62727D40AACE" , vfmsub213ps(zmm9, zmm16, zmm6));
+ TEST_INSTRUCTION("62727D46AACE" , k(k6).vfmsub213ps(zmm9, zmm16, zmm6));
+ TEST_INSTRUCTION("62727DC6AACE" , k(k6).z().vfmsub213ps(zmm9, zmm16, zmm6));
+ TEST_INSTRUCTION("62727D10AACE" , rn_sae().vfmsub213ps(zmm9, zmm16, zmm6));
+ TEST_INSTRUCTION("62727D50AACE" , ru_sae().vfmsub213ps(zmm9, zmm16, zmm6));
+ TEST_INSTRUCTION("62727D30AACE" , rd_sae().vfmsub213ps(zmm9, zmm16, zmm6));
+ TEST_INSTRUCTION("62727D70AACE" , rz_sae().vfmsub213ps(zmm9, zmm16, zmm6));
+ TEST_INSTRUCTION("62727D40AA09" , vfmsub213ps(zmm9, zmm16, zmmword_ptr(rcx)));
+ TEST_INSTRUCTION("62327D40AA8CF034120000" , vfmsub213ps(zmm9, zmm16, zmmword_ptr(rax, r14, 3, 4660)));
+ TEST_INSTRUCTION("62727D50AA09" , vfmsub213ps(zmm9, zmm16, dword_ptr(rcx)._1to16()));
+ TEST_INSTRUCTION("62727D40AA4A7F" , vfmsub213ps(zmm9, zmm16, zmmword_ptr(rdx, 8128)));
+ TEST_INSTRUCTION("62727D40AA8A00200000" , vfmsub213ps(zmm9, zmm16, zmmword_ptr(rdx, 8192)));
+ TEST_INSTRUCTION("62727D40AA4A80" , vfmsub213ps(zmm9, zmm16, zmmword_ptr(rdx, -8192)));
+ TEST_INSTRUCTION("62727D40AA8AC0DFFFFF" , vfmsub213ps(zmm9, zmm16, zmmword_ptr(rdx, -8256)));
+ TEST_INSTRUCTION("62727D50AA4A7F" , vfmsub213ps(zmm9, zmm16, dword_ptr(rdx, 508)._1to16()));
+ TEST_INSTRUCTION("62727D50AA8A00020000" , vfmsub213ps(zmm9, zmm16, dword_ptr(rdx, 512)._1to16()));
+ TEST_INSTRUCTION("62727D50AA4A80" , vfmsub213ps(zmm9, zmm16, dword_ptr(rdx, -512)._1to16()));
+ TEST_INSTRUCTION("62727D50AA8AFCFDFFFF" , vfmsub213ps(zmm9, zmm16, dword_ptr(rdx, -516)._1to16()));
+ TEST_INSTRUCTION("6232ED00ABE4" , vfmsub213sd(xmm12, xmm18, xmm20));
+ TEST_INSTRUCTION("6232ED04ABE4" , k(k4).vfmsub213sd(xmm12, xmm18, xmm20));
+ TEST_INSTRUCTION("6232ED84ABE4" , k(k4).z().vfmsub213sd(xmm12, xmm18, xmm20));
+ TEST_INSTRUCTION("6232ED10ABE4" , rn_sae().vfmsub213sd(xmm12, xmm18, xmm20));
+ TEST_INSTRUCTION("6232ED50ABE4" , ru_sae().vfmsub213sd(xmm12, xmm18, xmm20));
+ TEST_INSTRUCTION("6232ED30ABE4" , rd_sae().vfmsub213sd(xmm12, xmm18, xmm20));
+ TEST_INSTRUCTION("6232ED70ABE4" , rz_sae().vfmsub213sd(xmm12, xmm18, xmm20));
+ TEST_INSTRUCTION("6272ED00AB21" , vfmsub213sd(xmm12, xmm18, qword_ptr(rcx)));
+ TEST_INSTRUCTION("6232ED00ABA4F034120000" , vfmsub213sd(xmm12, xmm18, qword_ptr(rax, r14, 3, 4660)));
+ TEST_INSTRUCTION("6272ED00AB627F" , vfmsub213sd(xmm12, xmm18, qword_ptr(rdx, 1016)));
+ TEST_INSTRUCTION("6272ED00ABA200040000" , vfmsub213sd(xmm12, xmm18, qword_ptr(rdx, 1024)));
+ TEST_INSTRUCTION("6272ED00AB6280" , vfmsub213sd(xmm12, xmm18, qword_ptr(rdx, -1024)));
+ TEST_INSTRUCTION("6272ED00ABA2F8FBFFFF" , vfmsub213sd(xmm12, xmm18, qword_ptr(rdx, -1032)));
+ TEST_INSTRUCTION("C4C271ABD1" , vfmsub213ss(xmm2, xmm1, xmm9));
+ TEST_INSTRUCTION("62D2750FABD1" , k(k7).vfmsub213ss(xmm2, xmm1, xmm9));
+ TEST_INSTRUCTION("62D2758FABD1" , k(k7).z().vfmsub213ss(xmm2, xmm1, xmm9));
+ TEST_INSTRUCTION("62D27518ABD1" , rn_sae().vfmsub213ss(xmm2, xmm1, xmm9));
+ TEST_INSTRUCTION("62D27558ABD1" , ru_sae().vfmsub213ss(xmm2, xmm1, xmm9));
+ TEST_INSTRUCTION("62D27538ABD1" , rd_sae().vfmsub213ss(xmm2, xmm1, xmm9));
+ TEST_INSTRUCTION("62D27578ABD1" , rz_sae().vfmsub213ss(xmm2, xmm1, xmm9));
+ TEST_INSTRUCTION("C4E271AB11" , vfmsub213ss(xmm2, xmm1, dword_ptr(rcx)));
+ TEST_INSTRUCTION("C4A271AB94F034120000" , vfmsub213ss(xmm2, xmm1, dword_ptr(rax, r14, 3, 4660)));
+ TEST_INSTRUCTION("C4E271AB92FC010000" , vfmsub213ss(xmm2, xmm1, dword_ptr(rdx, 508)));
+ TEST_INSTRUCTION("C4E271AB9200020000" , vfmsub213ss(xmm2, xmm1, dword_ptr(rdx, 512)));
+ TEST_INSTRUCTION("C4E271AB9200FEFFFF" , vfmsub213ss(xmm2, xmm1, dword_ptr(rdx, -512)));
+ TEST_INSTRUCTION("C4E271AB92FCFDFFFF" , vfmsub213ss(xmm2, xmm1, dword_ptr(rdx, -516)));
+ TEST_INSTRUCTION("62C2ED48BACE" , vfmsub231pd(zmm17, zmm2, zmm14));
+ TEST_INSTRUCTION("62C2ED4ABACE" , k(k2).vfmsub231pd(zmm17, zmm2, zmm14));
+ TEST_INSTRUCTION("62C2EDCABACE" , k(k2).z().vfmsub231pd(zmm17, zmm2, zmm14));
+ TEST_INSTRUCTION("62C2ED18BACE" , rn_sae().vfmsub231pd(zmm17, zmm2, zmm14));
+ TEST_INSTRUCTION("62C2ED58BACE" , ru_sae().vfmsub231pd(zmm17, zmm2, zmm14));
+ TEST_INSTRUCTION("62C2ED38BACE" , rd_sae().vfmsub231pd(zmm17, zmm2, zmm14));
+ TEST_INSTRUCTION("62C2ED78BACE" , rz_sae().vfmsub231pd(zmm17, zmm2, zmm14));
+ TEST_INSTRUCTION("62E2ED48BA09" , vfmsub231pd(zmm17, zmm2, zmmword_ptr(rcx)));
+ TEST_INSTRUCTION("62A2ED48BA8CF034120000" , vfmsub231pd(zmm17, zmm2, zmmword_ptr(rax, r14, 3, 4660)));
+ TEST_INSTRUCTION("62E2ED58BA09" , vfmsub231pd(zmm17, zmm2, qword_ptr(rcx)._1to8()));
+ TEST_INSTRUCTION("62E2ED48BA4A7F" , vfmsub231pd(zmm17, zmm2, zmmword_ptr(rdx, 8128)));
+ TEST_INSTRUCTION("62E2ED48BA8A00200000" , vfmsub231pd(zmm17, zmm2, zmmword_ptr(rdx, 8192)));
+ TEST_INSTRUCTION("62E2ED48BA4A80" , vfmsub231pd(zmm17, zmm2, zmmword_ptr(rdx, -8192)));
+ TEST_INSTRUCTION("62E2ED48BA8AC0DFFFFF" , vfmsub231pd(zmm17, zmm2, zmmword_ptr(rdx, -8256)));
+ TEST_INSTRUCTION("62E2ED58BA4A7F" , vfmsub231pd(zmm17, zmm2, qword_ptr(rdx, 1016)._1to8()));
+ TEST_INSTRUCTION("62E2ED58BA8A00040000" , vfmsub231pd(zmm17, zmm2, qword_ptr(rdx, 1024)._1to8()));
+ TEST_INSTRUCTION("62E2ED58BA4A80" , vfmsub231pd(zmm17, zmm2, qword_ptr(rdx, -1024)._1to8()));
+ TEST_INSTRUCTION("62E2ED58BA8AF8FBFFFF" , vfmsub231pd(zmm17, zmm2, qword_ptr(rdx, -1032)._1to8()));
+ TEST_INSTRUCTION("62B25D48BAEC" , vfmsub231ps(zmm5, zmm4, zmm20));
+ TEST_INSTRUCTION("62B25D49BAEC" , k(k1).vfmsub231ps(zmm5, zmm4, zmm20));
+ TEST_INSTRUCTION("62B25DC9BAEC" , k(k1).z().vfmsub231ps(zmm5, zmm4, zmm20));
+ TEST_INSTRUCTION("62B25D18BAEC" , rn_sae().vfmsub231ps(zmm5, zmm4, zmm20));
+ TEST_INSTRUCTION("62B25D58BAEC" , ru_sae().vfmsub231ps(zmm5, zmm4, zmm20));
+ TEST_INSTRUCTION("62B25D38BAEC" , rd_sae().vfmsub231ps(zmm5, zmm4, zmm20));
+ TEST_INSTRUCTION("62B25D78BAEC" , rz_sae().vfmsub231ps(zmm5, zmm4, zmm20));
+ TEST_INSTRUCTION("62F25D48BA29" , vfmsub231ps(zmm5, zmm4, zmmword_ptr(rcx)));
+ TEST_INSTRUCTION("62B25D48BAACF034120000" , vfmsub231ps(zmm5, zmm4, zmmword_ptr(rax, r14, 3, 4660)));
+ TEST_INSTRUCTION("62F25D58BA29" , vfmsub231ps(zmm5, zmm4, dword_ptr(rcx)._1to16()));
+ TEST_INSTRUCTION("62F25D48BA6A7F" , vfmsub231ps(zmm5, zmm4, zmmword_ptr(rdx, 8128)));
+ TEST_INSTRUCTION("62F25D48BAAA00200000" , vfmsub231ps(zmm5, zmm4, zmmword_ptr(rdx, 8192)));
+ TEST_INSTRUCTION("62F25D48BA6A80" , vfmsub231ps(zmm5, zmm4, zmmword_ptr(rdx, -8192)));
+ TEST_INSTRUCTION("62F25D48BAAAC0DFFFFF" , vfmsub231ps(zmm5, zmm4, zmmword_ptr(rdx, -8256)));
+ TEST_INSTRUCTION("62F25D58BA6A7F" , vfmsub231ps(zmm5, zmm4, dword_ptr(rdx, 508)._1to16()));
+ TEST_INSTRUCTION("62F25D58BAAA00020000" , vfmsub231ps(zmm5, zmm4, dword_ptr(rdx, 512)._1to16()));
+ TEST_INSTRUCTION("62F25D58BA6A80" , vfmsub231ps(zmm5, zmm4, dword_ptr(rdx, -512)._1to16()));
+ TEST_INSTRUCTION("62F25D58BAAAFCFDFFFF" , vfmsub231ps(zmm5, zmm4, dword_ptr(rdx, -516)._1to16()));
+ TEST_INSTRUCTION("C4E2E9BBFE" , vfmsub231sd(xmm7, xmm2, xmm6));
+ TEST_INSTRUCTION("62F2ED0CBBFE" , k(k4).vfmsub231sd(xmm7, xmm2, xmm6));
+ TEST_INSTRUCTION("62F2ED8CBBFE" , k(k4).z().vfmsub231sd(xmm7, xmm2, xmm6));
+ TEST_INSTRUCTION("62F2ED18BBFE" , rn_sae().vfmsub231sd(xmm7, xmm2, xmm6));
+ TEST_INSTRUCTION("62F2ED58BBFE" , ru_sae().vfmsub231sd(xmm7, xmm2, xmm6));
+ TEST_INSTRUCTION("62F2ED38BBFE" , rd_sae().vfmsub231sd(xmm7, xmm2, xmm6));
+ TEST_INSTRUCTION("62F2ED78BBFE" , rz_sae().vfmsub231sd(xmm7, xmm2, xmm6));
+ TEST_INSTRUCTION("C4E2E9BB39" , vfmsub231sd(xmm7, xmm2, qword_ptr(rcx)));
+ TEST_INSTRUCTION("C4A2E9BBBCF034120000" , vfmsub231sd(xmm7, xmm2, qword_ptr(rax, r14, 3, 4660)));
+ TEST_INSTRUCTION("C4E2E9BBBAF8030000" , vfmsub231sd(xmm7, xmm2, qword_ptr(rdx, 1016)));
+ TEST_INSTRUCTION("C4E2E9BBBA00040000" , vfmsub231sd(xmm7, xmm2, qword_ptr(rdx, 1024)));
+ TEST_INSTRUCTION("C4E2E9BBBA00FCFFFF" , vfmsub231sd(xmm7, xmm2, qword_ptr(rdx, -1024)));
+ TEST_INSTRUCTION("C4E2E9BBBAF8FBFFFF" , vfmsub231sd(xmm7, xmm2, qword_ptr(rdx, -1032)));
+ TEST_INSTRUCTION("62A26D00BBD2" , vfmsub231ss(xmm18, xmm18, xmm18));
+ TEST_INSTRUCTION("62A26D07BBD2" , k(k7).vfmsub231ss(xmm18, xmm18, xmm18));
+ TEST_INSTRUCTION("62A26D87BBD2" , k(k7).z().vfmsub231ss(xmm18, xmm18, xmm18));
+ TEST_INSTRUCTION("62A26D10BBD2" , rn_sae().vfmsub231ss(xmm18, xmm18, xmm18));
+ TEST_INSTRUCTION("62A26D50BBD2" , ru_sae().vfmsub231ss(xmm18, xmm18, xmm18));
+ TEST_INSTRUCTION("62A26D30BBD2" , rd_sae().vfmsub231ss(xmm18, xmm18, xmm18));
+ TEST_INSTRUCTION("62A26D70BBD2" , rz_sae().vfmsub231ss(xmm18, xmm18, xmm18));
+ TEST_INSTRUCTION("62E26D00BB11" , vfmsub231ss(xmm18, xmm18, dword_ptr(rcx)));
+ TEST_INSTRUCTION("62A26D00BB94F034120000" , vfmsub231ss(xmm18, xmm18, dword_ptr(rax, r14, 3, 4660)));
+ TEST_INSTRUCTION("62E26D00BB527F" , vfmsub231ss(xmm18, xmm18, dword_ptr(rdx, 508)));
+ TEST_INSTRUCTION("62E26D00BB9200020000" , vfmsub231ss(xmm18, xmm18, dword_ptr(rdx, 512)));
+ TEST_INSTRUCTION("62E26D00BB5280" , vfmsub231ss(xmm18, xmm18, dword_ptr(rdx, -512)));
+ TEST_INSTRUCTION("62E26D00BB92FCFDFFFF" , vfmsub231ss(xmm18, xmm18, dword_ptr(rdx, -516)));
+ TEST_INSTRUCTION("62E2DD4897EF" , vfmsubadd132pd(zmm21, zmm4, zmm7));
+ TEST_INSTRUCTION("62E2DD4D97EF" , k(k5).vfmsubadd132pd(zmm21, zmm4, zmm7));
+ TEST_INSTRUCTION("62E2DDCD97EF" , k(k5).z().vfmsubadd132pd(zmm21, zmm4, zmm7));
+ TEST_INSTRUCTION("62E2DD1897EF" , rn_sae().vfmsubadd132pd(zmm21, zmm4, zmm7));
+ TEST_INSTRUCTION("62E2DD5897EF" , ru_sae().vfmsubadd132pd(zmm21, zmm4, zmm7));
+ TEST_INSTRUCTION("62E2DD3897EF" , rd_sae().vfmsubadd132pd(zmm21, zmm4, zmm7));
+ TEST_INSTRUCTION("62E2DD7897EF" , rz_sae().vfmsubadd132pd(zmm21, zmm4, zmm7));
+ TEST_INSTRUCTION("62E2DD489729" , vfmsubadd132pd(zmm21, zmm4, zmmword_ptr(rcx)));
+ TEST_INSTRUCTION("62A2DD4897ACF034120000" , vfmsubadd132pd(zmm21, zmm4, zmmword_ptr(rax, r14, 3, 4660)));
+ TEST_INSTRUCTION("62E2DD589729" , vfmsubadd132pd(zmm21, zmm4, qword_ptr(rcx)._1to8()));
+ TEST_INSTRUCTION("62E2DD48976A7F" , vfmsubadd132pd(zmm21, zmm4, zmmword_ptr(rdx, 8128)));
+ TEST_INSTRUCTION("62E2DD4897AA00200000" , vfmsubadd132pd(zmm21, zmm4, zmmword_ptr(rdx, 8192)));
+ TEST_INSTRUCTION("62E2DD48976A80" , vfmsubadd132pd(zmm21, zmm4, zmmword_ptr(rdx, -8192)));
+ TEST_INSTRUCTION("62E2DD4897AAC0DFFFFF" , vfmsubadd132pd(zmm21, zmm4, zmmword_ptr(rdx, -8256)));
+ TEST_INSTRUCTION("62E2DD58976A7F" , vfmsubadd132pd(zmm21, zmm4, qword_ptr(rdx, 1016)._1to8()));
+ TEST_INSTRUCTION("62E2DD5897AA00040000" , vfmsubadd132pd(zmm21, zmm4, qword_ptr(rdx, 1024)._1to8()));
+ TEST_INSTRUCTION("62E2DD58976A80" , vfmsubadd132pd(zmm21, zmm4, qword_ptr(rdx, -1024)._1to8()));
+ TEST_INSTRUCTION("62E2DD5897AAF8FBFFFF" , vfmsubadd132pd(zmm21, zmm4, qword_ptr(rdx, -1032)._1to8()));
+ TEST_INSTRUCTION("62B23D4097F0" , vfmsubadd132ps(zmm6, zmm24, zmm16));
+ TEST_INSTRUCTION("62B23D4797F0" , k(k7).vfmsubadd132ps(zmm6, zmm24, zmm16));
+ TEST_INSTRUCTION("62B23DC797F0" , k(k7).z().vfmsubadd132ps(zmm6, zmm24, zmm16));
+ TEST_INSTRUCTION("62B23D1097F0" , rn_sae().vfmsubadd132ps(zmm6, zmm24, zmm16));
+ TEST_INSTRUCTION("62B23D5097F0" , ru_sae().vfmsubadd132ps(zmm6, zmm24, zmm16));
+ TEST_INSTRUCTION("62B23D3097F0" , rd_sae().vfmsubadd132ps(zmm6, zmm24, zmm16));
+ TEST_INSTRUCTION("62B23D7097F0" , rz_sae().vfmsubadd132ps(zmm6, zmm24, zmm16));
+ TEST_INSTRUCTION("62F23D409731" , vfmsubadd132ps(zmm6, zmm24, zmmword_ptr(rcx)));
+ TEST_INSTRUCTION("62B23D4097B4F034120000" , vfmsubadd132ps(zmm6, zmm24, zmmword_ptr(rax, r14, 3, 4660)));
+ TEST_INSTRUCTION("62F23D509731" , vfmsubadd132ps(zmm6, zmm24, dword_ptr(rcx)._1to16()));
+ TEST_INSTRUCTION("62F23D4097727F" , vfmsubadd132ps(zmm6, zmm24, zmmword_ptr(rdx, 8128)));
+ TEST_INSTRUCTION("62F23D4097B200200000" , vfmsubadd132ps(zmm6, zmm24, zmmword_ptr(rdx, 8192)));
+ TEST_INSTRUCTION("62F23D40977280" , vfmsubadd132ps(zmm6, zmm24, zmmword_ptr(rdx, -8192)));
+ TEST_INSTRUCTION("62F23D4097B2C0DFFFFF" , vfmsubadd132ps(zmm6, zmm24, zmmword_ptr(rdx, -8256)));
+ TEST_INSTRUCTION("62F23D5097727F" , vfmsubadd132ps(zmm6, zmm24, dword_ptr(rdx, 508)._1to16()));
+ TEST_INSTRUCTION("62F23D5097B200020000" , vfmsubadd132ps(zmm6, zmm24, dword_ptr(rdx, 512)._1to16()));
+ TEST_INSTRUCTION("62F23D50977280" , vfmsubadd132ps(zmm6, zmm24, dword_ptr(rdx, -512)._1to16()));
+ TEST_INSTRUCTION("62F23D5097B2FCFDFFFF" , vfmsubadd132ps(zmm6, zmm24, dword_ptr(rdx, -516)._1to16()));
+ TEST_INSTRUCTION("6252CD40A7DB" , vfmsubadd213pd(zmm11, zmm22, zmm11));
+ TEST_INSTRUCTION("6252CD44A7DB" , k(k4).vfmsubadd213pd(zmm11, zmm22, zmm11));
+ TEST_INSTRUCTION("6252CDC4A7DB" , k(k4).z().vfmsubadd213pd(zmm11, zmm22, zmm11));
+ TEST_INSTRUCTION("6252CD10A7DB" , rn_sae().vfmsubadd213pd(zmm11, zmm22, zmm11));
+ TEST_INSTRUCTION("6252CD50A7DB" , ru_sae().vfmsubadd213pd(zmm11, zmm22, zmm11));
+ TEST_INSTRUCTION("6252CD30A7DB" , rd_sae().vfmsubadd213pd(zmm11, zmm22, zmm11));
+ TEST_INSTRUCTION("6252CD70A7DB" , rz_sae().vfmsubadd213pd(zmm11, zmm22, zmm11));
+ TEST_INSTRUCTION("6272CD40A719" , vfmsubadd213pd(zmm11, zmm22, zmmword_ptr(rcx)));
+ TEST_INSTRUCTION("6232CD40A79CF034120000" , vfmsubadd213pd(zmm11, zmm22, zmmword_ptr(rax, r14, 3, 4660)));
+ TEST_INSTRUCTION("6272CD50A719" , vfmsubadd213pd(zmm11, zmm22, qword_ptr(rcx)._1to8()));
+ TEST_INSTRUCTION("6272CD40A75A7F" , vfmsubadd213pd(zmm11, zmm22, zmmword_ptr(rdx, 8128)));
+ TEST_INSTRUCTION("6272CD40A79A00200000" , vfmsubadd213pd(zmm11, zmm22, zmmword_ptr(rdx, 8192)));
+ TEST_INSTRUCTION("6272CD40A75A80" , vfmsubadd213pd(zmm11, zmm22, zmmword_ptr(rdx, -8192)));
+ TEST_INSTRUCTION("6272CD40A79AC0DFFFFF" , vfmsubadd213pd(zmm11, zmm22, zmmword_ptr(rdx, -8256)));
+ TEST_INSTRUCTION("6272CD50A75A7F" , vfmsubadd213pd(zmm11, zmm22, qword_ptr(rdx, 1016)._1to8()));
+ TEST_INSTRUCTION("6272CD50A79A00040000" , vfmsubadd213pd(zmm11, zmm22, qword_ptr(rdx, 1024)._1to8()));
+ TEST_INSTRUCTION("6272CD50A75A80" , vfmsubadd213pd(zmm11, zmm22, qword_ptr(rdx, -1024)._1to8()));
+ TEST_INSTRUCTION("6272CD50A79AF8FBFFFF" , vfmsubadd213pd(zmm11, zmm22, qword_ptr(rdx, -1032)._1to8()));
+ TEST_INSTRUCTION("62523548A7E2" , vfmsubadd213ps(zmm12, zmm9, zmm10));
+ TEST_INSTRUCTION("6252354FA7E2" , k(k7).vfmsubadd213ps(zmm12, zmm9, zmm10));
+ TEST_INSTRUCTION("625235CFA7E2" , k(k7).z().vfmsubadd213ps(zmm12, zmm9, zmm10));
+ TEST_INSTRUCTION("62523518A7E2" , rn_sae().vfmsubadd213ps(zmm12, zmm9, zmm10));
+ TEST_INSTRUCTION("62523558A7E2" , ru_sae().vfmsubadd213ps(zmm12, zmm9, zmm10));
+ TEST_INSTRUCTION("62523538A7E2" , rd_sae().vfmsubadd213ps(zmm12, zmm9, zmm10));
+ TEST_INSTRUCTION("62523578A7E2" , rz_sae().vfmsubadd213ps(zmm12, zmm9, zmm10));
+ TEST_INSTRUCTION("62723548A721" , vfmsubadd213ps(zmm12, zmm9, zmmword_ptr(rcx)));
+ TEST_INSTRUCTION("62323548A7A4F034120000" , vfmsubadd213ps(zmm12, zmm9, zmmword_ptr(rax, r14, 3, 4660)));
+ TEST_INSTRUCTION("62723558A721" , vfmsubadd213ps(zmm12, zmm9, dword_ptr(rcx)._1to16()));
+ TEST_INSTRUCTION("62723548A7627F" , vfmsubadd213ps(zmm12, zmm9, zmmword_ptr(rdx, 8128)));
+ TEST_INSTRUCTION("62723548A7A200200000" , vfmsubadd213ps(zmm12, zmm9, zmmword_ptr(rdx, 8192)));
+ TEST_INSTRUCTION("62723548A76280" , vfmsubadd213ps(zmm12, zmm9, zmmword_ptr(rdx, -8192)));
+ TEST_INSTRUCTION("62723548A7A2C0DFFFFF" , vfmsubadd213ps(zmm12, zmm9, zmmword_ptr(rdx, -8256)));
+ TEST_INSTRUCTION("62723558A7627F" , vfmsubadd213ps(zmm12, zmm9, dword_ptr(rdx, 508)._1to16()));
+ TEST_INSTRUCTION("62723558A7A200020000" , vfmsubadd213ps(zmm12, zmm9, dword_ptr(rdx, 512)._1to16()));
+ TEST_INSTRUCTION("62723558A76280" , vfmsubadd213ps(zmm12, zmm9, dword_ptr(rdx, -512)._1to16()));
+ TEST_INSTRUCTION("62723558A7A2FCFDFFFF" , vfmsubadd213ps(zmm12, zmm9, dword_ptr(rdx, -516)._1to16()));
+ TEST_INSTRUCTION("62C2ED48B7E9" , vfmsubadd231pd(zmm21, zmm2, zmm9));
+ TEST_INSTRUCTION("62C2ED4EB7E9" , k(k6).vfmsubadd231pd(zmm21, zmm2, zmm9));
+ TEST_INSTRUCTION("62C2EDCEB7E9" , k(k6).z().vfmsubadd231pd(zmm21, zmm2, zmm9));
+ TEST_INSTRUCTION("62C2ED18B7E9" , rn_sae().vfmsubadd231pd(zmm21, zmm2, zmm9));
+ TEST_INSTRUCTION("62C2ED58B7E9" , ru_sae().vfmsubadd231pd(zmm21, zmm2, zmm9));
+ TEST_INSTRUCTION("62C2ED38B7E9" , rd_sae().vfmsubadd231pd(zmm21, zmm2, zmm9));
+ TEST_INSTRUCTION("62C2ED78B7E9" , rz_sae().vfmsubadd231pd(zmm21, zmm2, zmm9));
+ TEST_INSTRUCTION("62E2ED48B729" , vfmsubadd231pd(zmm21, zmm2, zmmword_ptr(rcx)));
+ TEST_INSTRUCTION("62A2ED48B7ACF034120000" , vfmsubadd231pd(zmm21, zmm2, zmmword_ptr(rax, r14, 3, 4660)));
+ TEST_INSTRUCTION("62E2ED58B729" , vfmsubadd231pd(zmm21, zmm2, qword_ptr(rcx)._1to8()));
+ TEST_INSTRUCTION("62E2ED48B76A7F" , vfmsubadd231pd(zmm21, zmm2, zmmword_ptr(rdx, 8128)));
+ TEST_INSTRUCTION("62E2ED48B7AA00200000" , vfmsubadd231pd(zmm21, zmm2, zmmword_ptr(rdx, 8192)));
+ TEST_INSTRUCTION("62E2ED48B76A80" , vfmsubadd231pd(zmm21, zmm2, zmmword_ptr(rdx, -8192)));
+ TEST_INSTRUCTION("62E2ED48B7AAC0DFFFFF" , vfmsubadd231pd(zmm21, zmm2, zmmword_ptr(rdx, -8256)));
+ TEST_INSTRUCTION("62E2ED58B76A7F" , vfmsubadd231pd(zmm21, zmm2, qword_ptr(rdx, 1016)._1to8()));
+ TEST_INSTRUCTION("62E2ED58B7AA00040000" , vfmsubadd231pd(zmm21, zmm2, qword_ptr(rdx, 1024)._1to8()));
+ TEST_INSTRUCTION("62E2ED58B76A80" , vfmsubadd231pd(zmm21, zmm2, qword_ptr(rdx, -1024)._1to8()));
+ TEST_INSTRUCTION("62E2ED58B7AAF8FBFFFF" , vfmsubadd231pd(zmm21, zmm2, qword_ptr(rdx, -1032)._1to8()));
+ TEST_INSTRUCTION("62025540B7D8" , vfmsubadd231ps(zmm27, zmm21, zmm24));
+ TEST_INSTRUCTION("62025546B7D8" , k(k6).vfmsubadd231ps(zmm27, zmm21, zmm24));
+ TEST_INSTRUCTION("620255C6B7D8" , k(k6).z().vfmsubadd231ps(zmm27, zmm21, zmm24));
+ TEST_INSTRUCTION("62025510B7D8" , rn_sae().vfmsubadd231ps(zmm27, zmm21, zmm24));
+ TEST_INSTRUCTION("62025550B7D8" , ru_sae().vfmsubadd231ps(zmm27, zmm21, zmm24));
+ TEST_INSTRUCTION("62025530B7D8" , rd_sae().vfmsubadd231ps(zmm27, zmm21, zmm24));
+ TEST_INSTRUCTION("62025570B7D8" , rz_sae().vfmsubadd231ps(zmm27, zmm21, zmm24));
+ TEST_INSTRUCTION("62625540B719" , vfmsubadd231ps(zmm27, zmm21, zmmword_ptr(rcx)));
+ TEST_INSTRUCTION("62225540B79CF034120000" , vfmsubadd231ps(zmm27, zmm21, zmmword_ptr(rax, r14, 3, 4660)));
+ TEST_INSTRUCTION("62625550B719" , vfmsubadd231ps(zmm27, zmm21, dword_ptr(rcx)._1to16()));
+ TEST_INSTRUCTION("62625540B75A7F" , vfmsubadd231ps(zmm27, zmm21, zmmword_ptr(rdx, 8128)));
+ TEST_INSTRUCTION("62625540B79A00200000" , vfmsubadd231ps(zmm27, zmm21, zmmword_ptr(rdx, 8192)));
+ TEST_INSTRUCTION("62625540B75A80" , vfmsubadd231ps(zmm27, zmm21, zmmword_ptr(rdx, -8192)));
+ TEST_INSTRUCTION("62625540B79AC0DFFFFF" , vfmsubadd231ps(zmm27, zmm21, zmmword_ptr(rdx, -8256)));
+ TEST_INSTRUCTION("62625550B75A7F" , vfmsubadd231ps(zmm27, zmm21, dword_ptr(rdx, 508)._1to16()));
+ TEST_INSTRUCTION("62625550B79A00020000" , vfmsubadd231ps(zmm27, zmm21, dword_ptr(rdx, 512)._1to16()));
+ TEST_INSTRUCTION("62625550B75A80" , vfmsubadd231ps(zmm27, zmm21, dword_ptr(rdx, -512)._1to16()));
+ TEST_INSTRUCTION("62625550B79AFCFDFFFF" , vfmsubadd231ps(zmm27, zmm21, dword_ptr(rdx, -516)._1to16()));
+ TEST_INSTRUCTION("623295409CDB" , vfnmadd132pd(zmm11, zmm29, zmm19));
+ TEST_INSTRUCTION("623295429CDB" , k(k2).vfnmadd132pd(zmm11, zmm29, zmm19));
+ TEST_INSTRUCTION("623295C29CDB" , k(k2).z().vfnmadd132pd(zmm11, zmm29, zmm19));
+ TEST_INSTRUCTION("623295109CDB" , rn_sae().vfnmadd132pd(zmm11, zmm29, zmm19));
+ TEST_INSTRUCTION("623295509CDB" , ru_sae().vfnmadd132pd(zmm11, zmm29, zmm19));
+ TEST_INSTRUCTION("623295309CDB" , rd_sae().vfnmadd132pd(zmm11, zmm29, zmm19));
+ TEST_INSTRUCTION("623295709CDB" , rz_sae().vfnmadd132pd(zmm11, zmm29, zmm19));
+ TEST_INSTRUCTION("627295409C19" , vfnmadd132pd(zmm11, zmm29, zmmword_ptr(rcx)));
+ TEST_INSTRUCTION("623295409C9CF034120000" , vfnmadd132pd(zmm11, zmm29, zmmword_ptr(rax, r14, 3, 4660)));
+ TEST_INSTRUCTION("627295509C19" , vfnmadd132pd(zmm11, zmm29, qword_ptr(rcx)._1to8()));
+ TEST_INSTRUCTION("627295409C5A7F" , vfnmadd132pd(zmm11, zmm29, zmmword_ptr(rdx, 8128)));
+ TEST_INSTRUCTION("627295409C9A00200000" , vfnmadd132pd(zmm11, zmm29, zmmword_ptr(rdx, 8192)));
+ TEST_INSTRUCTION("627295409C5A80" , vfnmadd132pd(zmm11, zmm29, zmmword_ptr(rdx, -8192)));
+ TEST_INSTRUCTION("627295409C9AC0DFFFFF" , vfnmadd132pd(zmm11, zmm29, zmmword_ptr(rdx, -8256)));
+ TEST_INSTRUCTION("627295509C5A7F" , vfnmadd132pd(zmm11, zmm29, qword_ptr(rdx, 1016)._1to8()));
+ TEST_INSTRUCTION("627295509C9A00040000" , vfnmadd132pd(zmm11, zmm29, qword_ptr(rdx, 1024)._1to8()));
+ TEST_INSTRUCTION("627295509C5A80" , vfnmadd132pd(zmm11, zmm29, qword_ptr(rdx, -1024)._1to8()));
+ TEST_INSTRUCTION("627295509C9AF8FBFFFF" , vfnmadd132pd(zmm11, zmm29, qword_ptr(rdx, -1032)._1to8()));
+ TEST_INSTRUCTION("62C265489CCF" , vfnmadd132ps(zmm17, zmm3, zmm15));
+ TEST_INSTRUCTION("62C2654D9CCF" , k(k5).vfnmadd132ps(zmm17, zmm3, zmm15));
+ TEST_INSTRUCTION("62C265CD9CCF" , k(k5).z().vfnmadd132ps(zmm17, zmm3, zmm15));
+ TEST_INSTRUCTION("62C265189CCF" , rn_sae().vfnmadd132ps(zmm17, zmm3, zmm15));
+ TEST_INSTRUCTION("62C265589CCF" , ru_sae().vfnmadd132ps(zmm17, zmm3, zmm15));
+ TEST_INSTRUCTION("62C265389CCF" , rd_sae().vfnmadd132ps(zmm17, zmm3, zmm15));
+ TEST_INSTRUCTION("62C265789CCF" , rz_sae().vfnmadd132ps(zmm17, zmm3, zmm15));
+ TEST_INSTRUCTION("62E265489C09" , vfnmadd132ps(zmm17, zmm3, zmmword_ptr(rcx)));
+ TEST_INSTRUCTION("62A265489C8CF034120000" , vfnmadd132ps(zmm17, zmm3, zmmword_ptr(rax, r14, 3, 4660)));
+ TEST_INSTRUCTION("62E265589C09" , vfnmadd132ps(zmm17, zmm3, dword_ptr(rcx)._1to16()));
+ TEST_INSTRUCTION("62E265489C4A7F" , vfnmadd132ps(zmm17, zmm3, zmmword_ptr(rdx, 8128)));
+ TEST_INSTRUCTION("62E265489C8A00200000" , vfnmadd132ps(zmm17, zmm3, zmmword_ptr(rdx, 8192)));
+ TEST_INSTRUCTION("62E265489C4A80" , vfnmadd132ps(zmm17, zmm3, zmmword_ptr(rdx, -8192)));
+ TEST_INSTRUCTION("62E265489C8AC0DFFFFF" , vfnmadd132ps(zmm17, zmm3, zmmword_ptr(rdx, -8256)));
+ TEST_INSTRUCTION("62E265589C4A7F" , vfnmadd132ps(zmm17, zmm3, dword_ptr(rdx, 508)._1to16()));
+ TEST_INSTRUCTION("62E265589C8A00020000" , vfnmadd132ps(zmm17, zmm3, dword_ptr(rdx, 512)._1to16()));
+ TEST_INSTRUCTION("62E265589C4A80" , vfnmadd132ps(zmm17, zmm3, dword_ptr(rdx, -512)._1to16()));
+ TEST_INSTRUCTION("62E265589C8AFCFDFFFF" , vfnmadd132ps(zmm17, zmm3, dword_ptr(rdx, -516)._1to16()));
+ TEST_INSTRUCTION("62F2BD009DD1" , vfnmadd132sd(xmm2, xmm24, xmm1));
+ TEST_INSTRUCTION("62F2BD049DD1" , k(k4).vfnmadd132sd(xmm2, xmm24, xmm1));
+ TEST_INSTRUCTION("62F2BD849DD1" , k(k4).z().vfnmadd132sd(xmm2, xmm24, xmm1));
+ TEST_INSTRUCTION("62F2BD109DD1" , rn_sae().vfnmadd132sd(xmm2, xmm24, xmm1));
+ TEST_INSTRUCTION("62F2BD509DD1" , ru_sae().vfnmadd132sd(xmm2, xmm24, xmm1));
+ TEST_INSTRUCTION("62F2BD309DD1" , rd_sae().vfnmadd132sd(xmm2, xmm24, xmm1));
+ TEST_INSTRUCTION("62F2BD709DD1" , rz_sae().vfnmadd132sd(xmm2, xmm24, xmm1));
+ TEST_INSTRUCTION("62F2BD009D11" , vfnmadd132sd(xmm2, xmm24, qword_ptr(rcx)));
+ TEST_INSTRUCTION("62B2BD009D94F034120000" , vfnmadd132sd(xmm2, xmm24, qword_ptr(rax, r14, 3, 4660)));
+ TEST_INSTRUCTION("62F2BD009D527F" , vfnmadd132sd(xmm2, xmm24, qword_ptr(rdx, 1016)));
+ TEST_INSTRUCTION("62F2BD009D9200040000" , vfnmadd132sd(xmm2, xmm24, qword_ptr(rdx, 1024)));
+ TEST_INSTRUCTION("62F2BD009D5280" , vfnmadd132sd(xmm2, xmm24, qword_ptr(rdx, -1024)));
+ TEST_INSTRUCTION("62F2BD009D92F8FBFFFF" , vfnmadd132sd(xmm2, xmm24, qword_ptr(rdx, -1032)));
+ TEST_INSTRUCTION("625265009DED" , vfnmadd132ss(xmm13, xmm19, xmm13));
+ TEST_INSTRUCTION("625265049DED" , k(k4).vfnmadd132ss(xmm13, xmm19, xmm13));
+ TEST_INSTRUCTION("625265849DED" , k(k4).z().vfnmadd132ss(xmm13, xmm19, xmm13));
+ TEST_INSTRUCTION("625265109DED" , rn_sae().vfnmadd132ss(xmm13, xmm19, xmm13));
+ TEST_INSTRUCTION("625265509DED" , ru_sae().vfnmadd132ss(xmm13, xmm19, xmm13));
+ TEST_INSTRUCTION("625265309DED" , rd_sae().vfnmadd132ss(xmm13, xmm19, xmm13));
+ TEST_INSTRUCTION("625265709DED" , rz_sae().vfnmadd132ss(xmm13, xmm19, xmm13));
+ TEST_INSTRUCTION("627265009D29" , vfnmadd132ss(xmm13, xmm19, dword_ptr(rcx)));
+ TEST_INSTRUCTION("623265009DACF034120000" , vfnmadd132ss(xmm13, xmm19, dword_ptr(rax, r14, 3, 4660)));
+ TEST_INSTRUCTION("627265009D6A7F" , vfnmadd132ss(xmm13, xmm19, dword_ptr(rdx, 508)));
+ TEST_INSTRUCTION("627265009DAA00020000" , vfnmadd132ss(xmm13, xmm19, dword_ptr(rdx, 512)));
+ TEST_INSTRUCTION("627265009D6A80" , vfnmadd132ss(xmm13, xmm19, dword_ptr(rdx, -512)));
+ TEST_INSTRUCTION("627265009DAAFCFDFFFF" , vfnmadd132ss(xmm13, xmm19, dword_ptr(rdx, -516)));
+ TEST_INSTRUCTION("6232F548ACFE" , vfnmadd213pd(zmm15, zmm1, zmm22));
+ TEST_INSTRUCTION("6232F54BACFE" , k(k3).vfnmadd213pd(zmm15, zmm1, zmm22));
+ TEST_INSTRUCTION("6232F5CBACFE" , k(k3).z().vfnmadd213pd(zmm15, zmm1, zmm22));
+ TEST_INSTRUCTION("6232F518ACFE" , rn_sae().vfnmadd213pd(zmm15, zmm1, zmm22));
+ TEST_INSTRUCTION("6232F558ACFE" , ru_sae().vfnmadd213pd(zmm15, zmm1, zmm22));
+ TEST_INSTRUCTION("6232F538ACFE" , rd_sae().vfnmadd213pd(zmm15, zmm1, zmm22));
+ TEST_INSTRUCTION("6232F578ACFE" , rz_sae().vfnmadd213pd(zmm15, zmm1, zmm22));
+ TEST_INSTRUCTION("6272F548AC39" , vfnmadd213pd(zmm15, zmm1, zmmword_ptr(rcx)));
+ TEST_INSTRUCTION("6232F548ACBCF034120000" , vfnmadd213pd(zmm15, zmm1, zmmword_ptr(rax, r14, 3, 4660)));
+ TEST_INSTRUCTION("6272F558AC39" , vfnmadd213pd(zmm15, zmm1, qword_ptr(rcx)._1to8()));
+ TEST_INSTRUCTION("6272F548AC7A7F" , vfnmadd213pd(zmm15, zmm1, zmmword_ptr(rdx, 8128)));
+ TEST_INSTRUCTION("6272F548ACBA00200000" , vfnmadd213pd(zmm15, zmm1, zmmword_ptr(rdx, 8192)));
+ TEST_INSTRUCTION("6272F548AC7A80" , vfnmadd213pd(zmm15, zmm1, zmmword_ptr(rdx, -8192)));
+ TEST_INSTRUCTION("6272F548ACBAC0DFFFFF" , vfnmadd213pd(zmm15, zmm1, zmmword_ptr(rdx, -8256)));
+ TEST_INSTRUCTION("6272F558AC7A7F" , vfnmadd213pd(zmm15, zmm1, qword_ptr(rdx, 1016)._1to8()));
+ TEST_INSTRUCTION("6272F558ACBA00040000" , vfnmadd213pd(zmm15, zmm1, qword_ptr(rdx, 1024)._1to8()));
+ TEST_INSTRUCTION("6272F558AC7A80" , vfnmadd213pd(zmm15, zmm1, qword_ptr(rdx, -1024)._1to8()));
+ TEST_INSTRUCTION("6272F558ACBAF8FBFFFF" , vfnmadd213pd(zmm15, zmm1, qword_ptr(rdx, -1032)._1to8()));
+ TEST_INSTRUCTION("62725D48ACDC" , vfnmadd213ps(zmm11, zmm4, zmm4));
+ TEST_INSTRUCTION("62725D4CACDC" , k(k4).vfnmadd213ps(zmm11, zmm4, zmm4));
+ TEST_INSTRUCTION("62725DCCACDC" , k(k4).z().vfnmadd213ps(zmm11, zmm4, zmm4));
+ TEST_INSTRUCTION("62725D18ACDC" , rn_sae().vfnmadd213ps(zmm11, zmm4, zmm4));
+ TEST_INSTRUCTION("62725D58ACDC" , ru_sae().vfnmadd213ps(zmm11, zmm4, zmm4));
+ TEST_INSTRUCTION("62725D38ACDC" , rd_sae().vfnmadd213ps(zmm11, zmm4, zmm4));
+ TEST_INSTRUCTION("62725D78ACDC" , rz_sae().vfnmadd213ps(zmm11, zmm4, zmm4));
+ TEST_INSTRUCTION("62725D48AC19" , vfnmadd213ps(zmm11, zmm4, zmmword_ptr(rcx)));
+ TEST_INSTRUCTION("62325D48AC9CF034120000" , vfnmadd213ps(zmm11, zmm4, zmmword_ptr(rax, r14, 3, 4660)));
+ TEST_INSTRUCTION("62725D58AC19" , vfnmadd213ps(zmm11, zmm4, dword_ptr(rcx)._1to16()));
+ TEST_INSTRUCTION("62725D48AC5A7F" , vfnmadd213ps(zmm11, zmm4, zmmword_ptr(rdx, 8128)));
+ TEST_INSTRUCTION("62725D48AC9A00200000" , vfnmadd213ps(zmm11, zmm4, zmmword_ptr(rdx, 8192)));
+ TEST_INSTRUCTION("62725D48AC5A80" , vfnmadd213ps(zmm11, zmm4, zmmword_ptr(rdx, -8192)));
+ TEST_INSTRUCTION("62725D48AC9AC0DFFFFF" , vfnmadd213ps(zmm11, zmm4, zmmword_ptr(rdx, -8256)));
+ TEST_INSTRUCTION("62725D58AC5A7F" , vfnmadd213ps(zmm11, zmm4, dword_ptr(rdx, 508)._1to16()));
+ TEST_INSTRUCTION("62725D58AC9A00020000" , vfnmadd213ps(zmm11, zmm4, dword_ptr(rdx, 512)._1to16()));
+ TEST_INSTRUCTION("62725D58AC5A80" , vfnmadd213ps(zmm11, zmm4, dword_ptr(rdx, -512)._1to16()));
+ TEST_INSTRUCTION("62725D58AC9AFCFDFFFF" , vfnmadd213ps(zmm11, zmm4, dword_ptr(rdx, -516)._1to16()));
+ TEST_INSTRUCTION("62428D08ADF3" , vfnmadd213sd(xmm30, xmm14, xmm11));
+ TEST_INSTRUCTION("62428D0CADF3" , k(k4).vfnmadd213sd(xmm30, xmm14, xmm11));
+ TEST_INSTRUCTION("62428D8CADF3" , k(k4).z().vfnmadd213sd(xmm30, xmm14, xmm11));
+ TEST_INSTRUCTION("62428D18ADF3" , rn_sae().vfnmadd213sd(xmm30, xmm14, xmm11));
+ TEST_INSTRUCTION("62428D58ADF3" , ru_sae().vfnmadd213sd(xmm30, xmm14, xmm11));
+ TEST_INSTRUCTION("62428D38ADF3" , rd_sae().vfnmadd213sd(xmm30, xmm14, xmm11));
+ TEST_INSTRUCTION("62428D78ADF3" , rz_sae().vfnmadd213sd(xmm30, xmm14, xmm11));
+ TEST_INSTRUCTION("62628D08AD31" , vfnmadd213sd(xmm30, xmm14, qword_ptr(rcx)));
+ TEST_INSTRUCTION("62228D08ADB4F034120000" , vfnmadd213sd(xmm30, xmm14, qword_ptr(rax, r14, 3, 4660)));
+ TEST_INSTRUCTION("62628D08AD727F" , vfnmadd213sd(xmm30, xmm14, qword_ptr(rdx, 1016)));
+ TEST_INSTRUCTION("62628D08ADB200040000" , vfnmadd213sd(xmm30, xmm14, qword_ptr(rdx, 1024)));
+ TEST_INSTRUCTION("62628D08AD7280" , vfnmadd213sd(xmm30, xmm14, qword_ptr(rdx, -1024)));
+ TEST_INSTRUCTION("62628D08ADB2F8FBFFFF" , vfnmadd213sd(xmm30, xmm14, qword_ptr(rdx, -1032)));
+ TEST_INSTRUCTION("62226508ADE4" , vfnmadd213ss(xmm28, xmm3, xmm20));
+ TEST_INSTRUCTION("6222650BADE4" , k(k3).vfnmadd213ss(xmm28, xmm3, xmm20));
+ TEST_INSTRUCTION("6222658BADE4" , k(k3).z().vfnmadd213ss(xmm28, xmm3, xmm20));
+ TEST_INSTRUCTION("62226518ADE4" , rn_sae().vfnmadd213ss(xmm28, xmm3, xmm20));
+ TEST_INSTRUCTION("62226558ADE4" , ru_sae().vfnmadd213ss(xmm28, xmm3, xmm20));
+ TEST_INSTRUCTION("62226538ADE4" , rd_sae().vfnmadd213ss(xmm28, xmm3, xmm20));
+ TEST_INSTRUCTION("62226578ADE4" , rz_sae().vfnmadd213ss(xmm28, xmm3, xmm20));
+ TEST_INSTRUCTION("62626508AD21" , vfnmadd213ss(xmm28, xmm3, dword_ptr(rcx)));
+ TEST_INSTRUCTION("62226508ADA4F034120000" , vfnmadd213ss(xmm28, xmm3, dword_ptr(rax, r14, 3, 4660)));
+ TEST_INSTRUCTION("62626508AD627F" , vfnmadd213ss(xmm28, xmm3, dword_ptr(rdx, 508)));
+ TEST_INSTRUCTION("62626508ADA200020000" , vfnmadd213ss(xmm28, xmm3, dword_ptr(rdx, 512)));
+ TEST_INSTRUCTION("62626508AD6280" , vfnmadd213ss(xmm28, xmm3, dword_ptr(rdx, -512)));
+ TEST_INSTRUCTION("62626508ADA2FCFDFFFF" , vfnmadd213ss(xmm28, xmm3, dword_ptr(rdx, -516)));
+ TEST_INSTRUCTION("6232D548BCFE" , vfnmadd231pd(zmm15, zmm5, zmm22));
+ TEST_INSTRUCTION("6232D54FBCFE" , k(k7).vfnmadd231pd(zmm15, zmm5, zmm22));
+ TEST_INSTRUCTION("6232D5CFBCFE" , k(k7).z().vfnmadd231pd(zmm15, zmm5, zmm22));
+ TEST_INSTRUCTION("6232D518BCFE" , rn_sae().vfnmadd231pd(zmm15, zmm5, zmm22));
+ TEST_INSTRUCTION("6232D558BCFE" , ru_sae().vfnmadd231pd(zmm15, zmm5, zmm22));
+ TEST_INSTRUCTION("6232D538BCFE" , rd_sae().vfnmadd231pd(zmm15, zmm5, zmm22));
+ TEST_INSTRUCTION("6232D578BCFE" , rz_sae().vfnmadd231pd(zmm15, zmm5, zmm22));
+ TEST_INSTRUCTION("6272D548BC39" , vfnmadd231pd(zmm15, zmm5, zmmword_ptr(rcx)));
+ TEST_INSTRUCTION("6232D548BCBCF034120000" , vfnmadd231pd(zmm15, zmm5, zmmword_ptr(rax, r14, 3, 4660)));
+ TEST_INSTRUCTION("6272D558BC39" , vfnmadd231pd(zmm15, zmm5, qword_ptr(rcx)._1to8()));
+ TEST_INSTRUCTION("6272D548BC7A7F" , vfnmadd231pd(zmm15, zmm5, zmmword_ptr(rdx, 8128)));
+ TEST_INSTRUCTION("6272D548BCBA00200000" , vfnmadd231pd(zmm15, zmm5, zmmword_ptr(rdx, 8192)));
+ TEST_INSTRUCTION("6272D548BC7A80" , vfnmadd231pd(zmm15, zmm5, zmmword_ptr(rdx, -8192)));
+ TEST_INSTRUCTION("6272D548BCBAC0DFFFFF" , vfnmadd231pd(zmm15, zmm5, zmmword_ptr(rdx, -8256)));
+ TEST_INSTRUCTION("6272D558BC7A7F" , vfnmadd231pd(zmm15, zmm5, qword_ptr(rdx, 1016)._1to8()));
+ TEST_INSTRUCTION("6272D558BCBA00040000" , vfnmadd231pd(zmm15, zmm5, qword_ptr(rdx, 1024)._1to8()));
+ TEST_INSTRUCTION("6272D558BC7A80" , vfnmadd231pd(zmm15, zmm5, qword_ptr(rdx, -1024)._1to8()));
+ TEST_INSTRUCTION("6272D558BCBAF8FBFFFF" , vfnmadd231pd(zmm15, zmm5, qword_ptr(rdx, -1032)._1to8()));
+ TEST_INSTRUCTION("62521D40BCE9" , vfnmadd231ps(zmm13, zmm28, zmm9));
+ TEST_INSTRUCTION("62521D43BCE9" , k(k3).vfnmadd231ps(zmm13, zmm28, zmm9));
+ TEST_INSTRUCTION("62521DC3BCE9" , k(k3).z().vfnmadd231ps(zmm13, zmm28, zmm9));
+ TEST_INSTRUCTION("62521D10BCE9" , rn_sae().vfnmadd231ps(zmm13, zmm28, zmm9));
+ TEST_INSTRUCTION("62521D50BCE9" , ru_sae().vfnmadd231ps(zmm13, zmm28, zmm9));
+ TEST_INSTRUCTION("62521D30BCE9" , rd_sae().vfnmadd231ps(zmm13, zmm28, zmm9));
+ TEST_INSTRUCTION("62521D70BCE9" , rz_sae().vfnmadd231ps(zmm13, zmm28, zmm9));
+ TEST_INSTRUCTION("62721D40BC29" , vfnmadd231ps(zmm13, zmm28, zmmword_ptr(rcx)));
+ TEST_INSTRUCTION("62321D40BCACF034120000" , vfnmadd231ps(zmm13, zmm28, zmmword_ptr(rax, r14, 3, 4660)));
+ TEST_INSTRUCTION("62721D50BC29" , vfnmadd231ps(zmm13, zmm28, dword_ptr(rcx)._1to16()));
+ TEST_INSTRUCTION("62721D40BC6A7F" , vfnmadd231ps(zmm13, zmm28, zmmword_ptr(rdx, 8128)));
+ TEST_INSTRUCTION("62721D40BCAA00200000" , vfnmadd231ps(zmm13, zmm28, zmmword_ptr(rdx, 8192)));
+ TEST_INSTRUCTION("62721D40BC6A80" , vfnmadd231ps(zmm13, zmm28, zmmword_ptr(rdx, -8192)));
+ TEST_INSTRUCTION("62721D40BCAAC0DFFFFF" , vfnmadd231ps(zmm13, zmm28, zmmword_ptr(rdx, -8256)));
+ TEST_INSTRUCTION("62721D50BC6A7F" , vfnmadd231ps(zmm13, zmm28, dword_ptr(rdx, 508)._1to16()));
+ TEST_INSTRUCTION("62721D50BCAA00020000" , vfnmadd231ps(zmm13, zmm28, dword_ptr(rdx, 512)._1to16()));
+ TEST_INSTRUCTION("62721D50BC6A80" , vfnmadd231ps(zmm13, zmm28, dword_ptr(rdx, -512)._1to16()));
+ TEST_INSTRUCTION("62721D50BCAAFCFDFFFF" , vfnmadd231ps(zmm13, zmm28, dword_ptr(rdx, -516)._1to16()));
+ TEST_INSTRUCTION("C462D1BDF5" , vfnmadd231sd(xmm14, xmm5, xmm5));
+ TEST_INSTRUCTION("6272D50FBDF5" , k(k7).vfnmadd231sd(xmm14, xmm5, xmm5));
+ TEST_INSTRUCTION("6272D58FBDF5" , k(k7).z().vfnmadd231sd(xmm14, xmm5, xmm5));
+ TEST_INSTRUCTION("6272D518BDF5" , rn_sae().vfnmadd231sd(xmm14, xmm5, xmm5));
+ TEST_INSTRUCTION("6272D558BDF5" , ru_sae().vfnmadd231sd(xmm14, xmm5, xmm5));
+ TEST_INSTRUCTION("6272D538BDF5" , rd_sae().vfnmadd231sd(xmm14, xmm5, xmm5));
+ TEST_INSTRUCTION("6272D578BDF5" , rz_sae().vfnmadd231sd(xmm14, xmm5, xmm5));
+ TEST_INSTRUCTION("C462D1BD31" , vfnmadd231sd(xmm14, xmm5, qword_ptr(rcx)));
+ TEST_INSTRUCTION("C422D1BDB4F034120000" , vfnmadd231sd(xmm14, xmm5, qword_ptr(rax, r14, 3, 4660)));
+ TEST_INSTRUCTION("C462D1BDB2F8030000" , vfnmadd231sd(xmm14, xmm5, qword_ptr(rdx, 1016)));
+ TEST_INSTRUCTION("C462D1BDB200040000" , vfnmadd231sd(xmm14, xmm5, qword_ptr(rdx, 1024)));
+ TEST_INSTRUCTION("C462D1BDB200FCFFFF" , vfnmadd231sd(xmm14, xmm5, qword_ptr(rdx, -1024)));
+ TEST_INSTRUCTION("C462D1BDB2F8FBFFFF" , vfnmadd231sd(xmm14, xmm5, qword_ptr(rdx, -1032)));
+ TEST_INSTRUCTION("62027D00BDC9" , vfnmadd231ss(xmm25, xmm16, xmm25));
+ TEST_INSTRUCTION("62027D06BDC9" , k(k6).vfnmadd231ss(xmm25, xmm16, xmm25));
+ TEST_INSTRUCTION("62027D86BDC9" , k(k6).z().vfnmadd231ss(xmm25, xmm16, xmm25));
+ TEST_INSTRUCTION("62027D10BDC9" , rn_sae().vfnmadd231ss(xmm25, xmm16, xmm25));
+ TEST_INSTRUCTION("62027D50BDC9" , ru_sae().vfnmadd231ss(xmm25, xmm16, xmm25));
+ TEST_INSTRUCTION("62027D30BDC9" , rd_sae().vfnmadd231ss(xmm25, xmm16, xmm25));
+ TEST_INSTRUCTION("62027D70BDC9" , rz_sae().vfnmadd231ss(xmm25, xmm16, xmm25));
+ TEST_INSTRUCTION("62627D00BD09" , vfnmadd231ss(xmm25, xmm16, dword_ptr(rcx)));
+ TEST_INSTRUCTION("62227D00BD8CF034120000" , vfnmadd231ss(xmm25, xmm16, dword_ptr(rax, r14, 3, 4660)));
+ TEST_INSTRUCTION("62627D00BD4A7F" , vfnmadd231ss(xmm25, xmm16, dword_ptr(rdx, 508)));
+ TEST_INSTRUCTION("62627D00BD8A00020000" , vfnmadd231ss(xmm25, xmm16, dword_ptr(rdx, 512)));
+ TEST_INSTRUCTION("62627D00BD4A80" , vfnmadd231ss(xmm25, xmm16, dword_ptr(rdx, -512)));
+ TEST_INSTRUCTION("62627D00BD8AFCFDFFFF" , vfnmadd231ss(xmm25, xmm16, dword_ptr(rdx, -516)));
+ TEST_INSTRUCTION("6242BD489ED9" , vfnmsub132pd(zmm27, zmm8, zmm9));
+ TEST_INSTRUCTION("6242BD4C9ED9" , k(k4).vfnmsub132pd(zmm27, zmm8, zmm9));
+ TEST_INSTRUCTION("6242BDCC9ED9" , k(k4).z().vfnmsub132pd(zmm27, zmm8, zmm9));
+ TEST_INSTRUCTION("6242BD189ED9" , rn_sae().vfnmsub132pd(zmm27, zmm8, zmm9));
+ TEST_INSTRUCTION("6242BD589ED9" , ru_sae().vfnmsub132pd(zmm27, zmm8, zmm9));
+ TEST_INSTRUCTION("6242BD389ED9" , rd_sae().vfnmsub132pd(zmm27, zmm8, zmm9));
+ TEST_INSTRUCTION("6242BD789ED9" , rz_sae().vfnmsub132pd(zmm27, zmm8, zmm9));
+ TEST_INSTRUCTION("6262BD489E19" , vfnmsub132pd(zmm27, zmm8, zmmword_ptr(rcx)));
+ TEST_INSTRUCTION("6222BD489E9CF034120000" , vfnmsub132pd(zmm27, zmm8, zmmword_ptr(rax, r14, 3, 4660)));
+ TEST_INSTRUCTION("6262BD589E19" , vfnmsub132pd(zmm27, zmm8, qword_ptr(rcx)._1to8()));
+ TEST_INSTRUCTION("6262BD489E5A7F" , vfnmsub132pd(zmm27, zmm8, zmmword_ptr(rdx, 8128)));
+ TEST_INSTRUCTION("6262BD489E9A00200000" , vfnmsub132pd(zmm27, zmm8, zmmword_ptr(rdx, 8192)));
+ TEST_INSTRUCTION("6262BD489E5A80" , vfnmsub132pd(zmm27, zmm8, zmmword_ptr(rdx, -8192)));
+ TEST_INSTRUCTION("6262BD489E9AC0DFFFFF" , vfnmsub132pd(zmm27, zmm8, zmmword_ptr(rdx, -8256)));
+ TEST_INSTRUCTION("6262BD589E5A7F" , vfnmsub132pd(zmm27, zmm8, qword_ptr(rdx, 1016)._1to8()));
+ TEST_INSTRUCTION("6262BD589E9A00040000" , vfnmsub132pd(zmm27, zmm8, qword_ptr(rdx, 1024)._1to8()));
+ TEST_INSTRUCTION("6262BD589E5A80" , vfnmsub132pd(zmm27, zmm8, qword_ptr(rdx, -1024)._1to8()));
+ TEST_INSTRUCTION("6262BD589E9AF8FBFFFF" , vfnmsub132pd(zmm27, zmm8, qword_ptr(rdx, -1032)._1to8()));
+ TEST_INSTRUCTION("624225489ED1" , vfnmsub132ps(zmm26, zmm11, zmm9));
+ TEST_INSTRUCTION("6242254C9ED1" , k(k4).vfnmsub132ps(zmm26, zmm11, zmm9));
+ TEST_INSTRUCTION("624225CC9ED1" , k(k4).z().vfnmsub132ps(zmm26, zmm11, zmm9));
+ TEST_INSTRUCTION("624225189ED1" , rn_sae().vfnmsub132ps(zmm26, zmm11, zmm9));
+ TEST_INSTRUCTION("624225589ED1" , ru_sae().vfnmsub132ps(zmm26, zmm11, zmm9));
+ TEST_INSTRUCTION("624225389ED1" , rd_sae().vfnmsub132ps(zmm26, zmm11, zmm9));
+ TEST_INSTRUCTION("624225789ED1" , rz_sae().vfnmsub132ps(zmm26, zmm11, zmm9));
+ TEST_INSTRUCTION("626225489E11" , vfnmsub132ps(zmm26, zmm11, zmmword_ptr(rcx)));
+ TEST_INSTRUCTION("622225489E94F034120000" , vfnmsub132ps(zmm26, zmm11, zmmword_ptr(rax, r14, 3, 4660)));
+ TEST_INSTRUCTION("626225589E11" , vfnmsub132ps(zmm26, zmm11, dword_ptr(rcx)._1to16()));
+ TEST_INSTRUCTION("626225489E527F" , vfnmsub132ps(zmm26, zmm11, zmmword_ptr(rdx, 8128)));
+ TEST_INSTRUCTION("626225489E9200200000" , vfnmsub132ps(zmm26, zmm11, zmmword_ptr(rdx, 8192)));
+ TEST_INSTRUCTION("626225489E5280" , vfnmsub132ps(zmm26, zmm11, zmmword_ptr(rdx, -8192)));
+ TEST_INSTRUCTION("626225489E92C0DFFFFF" , vfnmsub132ps(zmm26, zmm11, zmmword_ptr(rdx, -8256)));
+ TEST_INSTRUCTION("626225589E527F" , vfnmsub132ps(zmm26, zmm11, dword_ptr(rdx, 508)._1to16()));
+ TEST_INSTRUCTION("626225589E9200020000" , vfnmsub132ps(zmm26, zmm11, dword_ptr(rdx, 512)._1to16()));
+ TEST_INSTRUCTION("626225589E5280" , vfnmsub132ps(zmm26, zmm11, dword_ptr(rdx, -512)._1to16()));
+ TEST_INSTRUCTION("626225589E92FCFDFFFF" , vfnmsub132ps(zmm26, zmm11, dword_ptr(rdx, -516)._1to16()));
+ TEST_INSTRUCTION("62B2BD089FDB" , vfnmsub132sd(xmm3, xmm8, xmm19));
+ TEST_INSTRUCTION("62B2BD0B9FDB" , k(k3).vfnmsub132sd(xmm3, xmm8, xmm19));
+ TEST_INSTRUCTION("62B2BD8B9FDB" , k(k3).z().vfnmsub132sd(xmm3, xmm8, xmm19));
+ TEST_INSTRUCTION("62B2BD189FDB" , rn_sae().vfnmsub132sd(xmm3, xmm8, xmm19));
+ TEST_INSTRUCTION("62B2BD589FDB" , ru_sae().vfnmsub132sd(xmm3, xmm8, xmm19));
+ TEST_INSTRUCTION("62B2BD389FDB" , rd_sae().vfnmsub132sd(xmm3, xmm8, xmm19));
+ TEST_INSTRUCTION("62B2BD789FDB" , rz_sae().vfnmsub132sd(xmm3, xmm8, xmm19));
+ TEST_INSTRUCTION("C4E2B99F19" , vfnmsub132sd(xmm3, xmm8, qword_ptr(rcx)));
+ TEST_INSTRUCTION("C4A2B99F9CF034120000" , vfnmsub132sd(xmm3, xmm8, qword_ptr(rax, r14, 3, 4660)));
+ TEST_INSTRUCTION("C4E2B99F9AF8030000" , vfnmsub132sd(xmm3, xmm8, qword_ptr(rdx, 1016)));
+ TEST_INSTRUCTION("C4E2B99F9A00040000" , vfnmsub132sd(xmm3, xmm8, qword_ptr(rdx, 1024)));
+ TEST_INSTRUCTION("C4E2B99F9A00FCFFFF" , vfnmsub132sd(xmm3, xmm8, qword_ptr(rdx, -1024)));
+ TEST_INSTRUCTION("C4E2B99F9AF8FBFFFF" , vfnmsub132sd(xmm3, xmm8, qword_ptr(rdx, -1032)));
+ TEST_INSTRUCTION("62E275009FDE" , vfnmsub132ss(xmm19, xmm17, xmm6));
+ TEST_INSTRUCTION("62E275019FDE" , k(k1).vfnmsub132ss(xmm19, xmm17, xmm6));
+ TEST_INSTRUCTION("62E275819FDE" , k(k1).z().vfnmsub132ss(xmm19, xmm17, xmm6));
+ TEST_INSTRUCTION("62E275109FDE" , rn_sae().vfnmsub132ss(xmm19, xmm17, xmm6));
+ TEST_INSTRUCTION("62E275509FDE" , ru_sae().vfnmsub132ss(xmm19, xmm17, xmm6));
+ TEST_INSTRUCTION("62E275309FDE" , rd_sae().vfnmsub132ss(xmm19, xmm17, xmm6));
+ TEST_INSTRUCTION("62E275709FDE" , rz_sae().vfnmsub132ss(xmm19, xmm17, xmm6));
+ TEST_INSTRUCTION("62E275009F19" , vfnmsub132ss(xmm19, xmm17, dword_ptr(rcx)));
+ TEST_INSTRUCTION("62A275009F9CF034120000" , vfnmsub132ss(xmm19, xmm17, dword_ptr(rax, r14, 3, 4660)));
+ TEST_INSTRUCTION("62E275009F5A7F" , vfnmsub132ss(xmm19, xmm17, dword_ptr(rdx, 508)));
+ TEST_INSTRUCTION("62E275009F9A00020000" , vfnmsub132ss(xmm19, xmm17, dword_ptr(rdx, 512)));
+ TEST_INSTRUCTION("62E275009F5A80" , vfnmsub132ss(xmm19, xmm17, dword_ptr(rdx, -512)));
+ TEST_INSTRUCTION("62E275009F9AFCFDFFFF" , vfnmsub132ss(xmm19, xmm17, dword_ptr(rdx, -516)));
+ TEST_INSTRUCTION("62F2BD48AEFF" , vfnmsub213pd(zmm7, zmm8, zmm7));
+ TEST_INSTRUCTION("62F2BD4DAEFF" , k(k5).vfnmsub213pd(zmm7, zmm8, zmm7));
+ TEST_INSTRUCTION("62F2BDCDAEFF" , k(k5).z().vfnmsub213pd(zmm7, zmm8, zmm7));
+ TEST_INSTRUCTION("62F2BD18AEFF" , rn_sae().vfnmsub213pd(zmm7, zmm8, zmm7));
+ TEST_INSTRUCTION("62F2BD58AEFF" , ru_sae().vfnmsub213pd(zmm7, zmm8, zmm7));
+ TEST_INSTRUCTION("62F2BD38AEFF" , rd_sae().vfnmsub213pd(zmm7, zmm8, zmm7));
+ TEST_INSTRUCTION("62F2BD78AEFF" , rz_sae().vfnmsub213pd(zmm7, zmm8, zmm7));
+ TEST_INSTRUCTION("62F2BD48AE39" , vfnmsub213pd(zmm7, zmm8, zmmword_ptr(rcx)));
+ TEST_INSTRUCTION("62B2BD48AEBCF034120000" , vfnmsub213pd(zmm7, zmm8, zmmword_ptr(rax, r14, 3, 4660)));
+ TEST_INSTRUCTION("62F2BD58AE39" , vfnmsub213pd(zmm7, zmm8, qword_ptr(rcx)._1to8()));
+ TEST_INSTRUCTION("62F2BD48AE7A7F" , vfnmsub213pd(zmm7, zmm8, zmmword_ptr(rdx, 8128)));
+ TEST_INSTRUCTION("62F2BD48AEBA00200000" , vfnmsub213pd(zmm7, zmm8, zmmword_ptr(rdx, 8192)));
+ TEST_INSTRUCTION("62F2BD48AE7A80" , vfnmsub213pd(zmm7, zmm8, zmmword_ptr(rdx, -8192)));
+ TEST_INSTRUCTION("62F2BD48AEBAC0DFFFFF" , vfnmsub213pd(zmm7, zmm8, zmmword_ptr(rdx, -8256)));
+ TEST_INSTRUCTION("62F2BD58AE7A7F" , vfnmsub213pd(zmm7, zmm8, qword_ptr(rdx, 1016)._1to8()));
+ TEST_INSTRUCTION("62F2BD58AEBA00040000" , vfnmsub213pd(zmm7, zmm8, qword_ptr(rdx, 1024)._1to8()));
+ TEST_INSTRUCTION("62F2BD58AE7A80" , vfnmsub213pd(zmm7, zmm8, qword_ptr(rdx, -1024)._1to8()));
+ TEST_INSTRUCTION("62F2BD58AEBAF8FBFFFF" , vfnmsub213pd(zmm7, zmm8, qword_ptr(rdx, -1032)._1to8()));
+ TEST_INSTRUCTION("62423D40AEEE" , vfnmsub213ps(zmm29, zmm24, zmm14));
+ TEST_INSTRUCTION("62423D47AEEE" , k(k7).vfnmsub213ps(zmm29, zmm24, zmm14));
+ TEST_INSTRUCTION("62423DC7AEEE" , k(k7).z().vfnmsub213ps(zmm29, zmm24, zmm14));
+ TEST_INSTRUCTION("62423D10AEEE" , rn_sae().vfnmsub213ps(zmm29, zmm24, zmm14));
+ TEST_INSTRUCTION("62423D50AEEE" , ru_sae().vfnmsub213ps(zmm29, zmm24, zmm14));
+ TEST_INSTRUCTION("62423D30AEEE" , rd_sae().vfnmsub213ps(zmm29, zmm24, zmm14));
+ TEST_INSTRUCTION("62423D70AEEE" , rz_sae().vfnmsub213ps(zmm29, zmm24, zmm14));
+ TEST_INSTRUCTION("62623D40AE29" , vfnmsub213ps(zmm29, zmm24, zmmword_ptr(rcx)));
+ TEST_INSTRUCTION("62223D40AEACF034120000" , vfnmsub213ps(zmm29, zmm24, zmmword_ptr(rax, r14, 3, 4660)));
+ TEST_INSTRUCTION("62623D50AE29" , vfnmsub213ps(zmm29, zmm24, dword_ptr(rcx)._1to16()));
+ TEST_INSTRUCTION("62623D40AE6A7F" , vfnmsub213ps(zmm29, zmm24, zmmword_ptr(rdx, 8128)));
+ TEST_INSTRUCTION("62623D40AEAA00200000" , vfnmsub213ps(zmm29, zmm24, zmmword_ptr(rdx, 8192)));
+ TEST_INSTRUCTION("62623D40AE6A80" , vfnmsub213ps(zmm29, zmm24, zmmword_ptr(rdx, -8192)));
+ TEST_INSTRUCTION("62623D40AEAAC0DFFFFF" , vfnmsub213ps(zmm29, zmm24, zmmword_ptr(rdx, -8256)));
+ TEST_INSTRUCTION("62623D50AE6A7F" , vfnmsub213ps(zmm29, zmm24, dword_ptr(rdx, 508)._1to16()));
+ TEST_INSTRUCTION("62623D50AEAA00020000" , vfnmsub213ps(zmm29, zmm24, dword_ptr(rdx, 512)._1to16()));
+ TEST_INSTRUCTION("62623D50AE6A80" , vfnmsub213ps(zmm29, zmm24, dword_ptr(rdx, -512)._1to16()));
+ TEST_INSTRUCTION("62623D50AEAAFCFDFFFF" , vfnmsub213ps(zmm29, zmm24, dword_ptr(rdx, -516)._1to16()));
+ TEST_INSTRUCTION("6222BD08AFCF" , vfnmsub213sd(xmm25, xmm8, xmm23));
+ TEST_INSTRUCTION("6222BD09AFCF" , k(k1).vfnmsub213sd(xmm25, xmm8, xmm23));
+ TEST_INSTRUCTION("6222BD89AFCF" , k(k1).z().vfnmsub213sd(xmm25, xmm8, xmm23));
+ TEST_INSTRUCTION("6222BD18AFCF" , rn_sae().vfnmsub213sd(xmm25, xmm8, xmm23));
+ TEST_INSTRUCTION("6222BD58AFCF" , ru_sae().vfnmsub213sd(xmm25, xmm8, xmm23));
+ TEST_INSTRUCTION("6222BD38AFCF" , rd_sae().vfnmsub213sd(xmm25, xmm8, xmm23));
+ TEST_INSTRUCTION("6222BD78AFCF" , rz_sae().vfnmsub213sd(xmm25, xmm8, xmm23));
+ TEST_INSTRUCTION("6262BD08AF09" , vfnmsub213sd(xmm25, xmm8, qword_ptr(rcx)));
+ TEST_INSTRUCTION("6222BD08AF8CF034120000" , vfnmsub213sd(xmm25, xmm8, qword_ptr(rax, r14, 3, 4660)));
+ TEST_INSTRUCTION("6262BD08AF4A7F" , vfnmsub213sd(xmm25, xmm8, qword_ptr(rdx, 1016)));
+ TEST_INSTRUCTION("6262BD08AF8A00040000" , vfnmsub213sd(xmm25, xmm8, qword_ptr(rdx, 1024)));
+ TEST_INSTRUCTION("6262BD08AF4A80" , vfnmsub213sd(xmm25, xmm8, qword_ptr(rdx, -1024)));
+ TEST_INSTRUCTION("6262BD08AF8AF8FBFFFF" , vfnmsub213sd(xmm25, xmm8, qword_ptr(rdx, -1032)));
+ TEST_INSTRUCTION("62425D00AFC7" , vfnmsub213ss(xmm24, xmm20, xmm15));
+ TEST_INSTRUCTION("62425D06AFC7" , k(k6).vfnmsub213ss(xmm24, xmm20, xmm15));
+ TEST_INSTRUCTION("62425D86AFC7" , k(k6).z().vfnmsub213ss(xmm24, xmm20, xmm15));
+ TEST_INSTRUCTION("62425D10AFC7" , rn_sae().vfnmsub213ss(xmm24, xmm20, xmm15));
+ TEST_INSTRUCTION("62425D50AFC7" , ru_sae().vfnmsub213ss(xmm24, xmm20, xmm15));
+ TEST_INSTRUCTION("62425D30AFC7" , rd_sae().vfnmsub213ss(xmm24, xmm20, xmm15));
+ TEST_INSTRUCTION("62425D70AFC7" , rz_sae().vfnmsub213ss(xmm24, xmm20, xmm15));
+ TEST_INSTRUCTION("62625D00AF01" , vfnmsub213ss(xmm24, xmm20, dword_ptr(rcx)));
+ TEST_INSTRUCTION("62225D00AF84F034120000" , vfnmsub213ss(xmm24, xmm20, dword_ptr(rax, r14, 3, 4660)));
+ TEST_INSTRUCTION("62625D00AF427F" , vfnmsub213ss(xmm24, xmm20, dword_ptr(rdx, 508)));
+ TEST_INSTRUCTION("62625D00AF8200020000" , vfnmsub213ss(xmm24, xmm20, dword_ptr(rdx, 512)));
+ TEST_INSTRUCTION("62625D00AF4280" , vfnmsub213ss(xmm24, xmm20, dword_ptr(rdx, -512)));
+ TEST_INSTRUCTION("62625D00AF82FCFDFFFF" , vfnmsub213ss(xmm24, xmm20, dword_ptr(rdx, -516)));
+ TEST_INSTRUCTION("62D2AD48BECC" , vfnmsub231pd(zmm1, zmm10, zmm12));
+ TEST_INSTRUCTION("62D2AD4DBECC" , k(k5).vfnmsub231pd(zmm1, zmm10, zmm12));
+ TEST_INSTRUCTION("62D2ADCDBECC" , k(k5).z().vfnmsub231pd(zmm1, zmm10, zmm12));
+ TEST_INSTRUCTION("62D2AD18BECC" , rn_sae().vfnmsub231pd(zmm1, zmm10, zmm12));
+ TEST_INSTRUCTION("62D2AD58BECC" , ru_sae().vfnmsub231pd(zmm1, zmm10, zmm12));
+ TEST_INSTRUCTION("62D2AD38BECC" , rd_sae().vfnmsub231pd(zmm1, zmm10, zmm12));
+ TEST_INSTRUCTION("62D2AD78BECC" , rz_sae().vfnmsub231pd(zmm1, zmm10, zmm12));
+ TEST_INSTRUCTION("62F2AD48BE09" , vfnmsub231pd(zmm1, zmm10, zmmword_ptr(rcx)));
+ TEST_INSTRUCTION("62B2AD48BE8CF034120000" , vfnmsub231pd(zmm1, zmm10, zmmword_ptr(rax, r14, 3, 4660)));
+ TEST_INSTRUCTION("62F2AD58BE09" , vfnmsub231pd(zmm1, zmm10, qword_ptr(rcx)._1to8()));
+ TEST_INSTRUCTION("62F2AD48BE4A7F" , vfnmsub231pd(zmm1, zmm10, zmmword_ptr(rdx, 8128)));
+ TEST_INSTRUCTION("62F2AD48BE8A00200000" , vfnmsub231pd(zmm1, zmm10, zmmword_ptr(rdx, 8192)));
+ TEST_INSTRUCTION("62F2AD48BE4A80" , vfnmsub231pd(zmm1, zmm10, zmmword_ptr(rdx, -8192)));
+ TEST_INSTRUCTION("62F2AD48BE8AC0DFFFFF" , vfnmsub231pd(zmm1, zmm10, zmmword_ptr(rdx, -8256)));
+ TEST_INSTRUCTION("62F2AD58BE4A7F" , vfnmsub231pd(zmm1, zmm10, qword_ptr(rdx, 1016)._1to8()));
+ TEST_INSTRUCTION("62F2AD58BE8A00040000" , vfnmsub231pd(zmm1, zmm10, qword_ptr(rdx, 1024)._1to8()));
+ TEST_INSTRUCTION("62F2AD58BE4A80" , vfnmsub231pd(zmm1, zmm10, qword_ptr(rdx, -1024)._1to8()));
+ TEST_INSTRUCTION("62F2AD58BE8AF8FBFFFF" , vfnmsub231pd(zmm1, zmm10, qword_ptr(rdx, -1032)._1to8()));
+ TEST_INSTRUCTION("62A22D40BECB" , vfnmsub231ps(zmm17, zmm26, zmm19));
+ TEST_INSTRUCTION("62A22D44BECB" , k(k4).vfnmsub231ps(zmm17, zmm26, zmm19));
+ TEST_INSTRUCTION("62A22DC4BECB" , k(k4).z().vfnmsub231ps(zmm17, zmm26, zmm19));
+ TEST_INSTRUCTION("62A22D10BECB" , rn_sae().vfnmsub231ps(zmm17, zmm26, zmm19));
+ TEST_INSTRUCTION("62A22D50BECB" , ru_sae().vfnmsub231ps(zmm17, zmm26, zmm19));
+ TEST_INSTRUCTION("62A22D30BECB" , rd_sae().vfnmsub231ps(zmm17, zmm26, zmm19));
+ TEST_INSTRUCTION("62A22D70BECB" , rz_sae().vfnmsub231ps(zmm17, zmm26, zmm19));
+ TEST_INSTRUCTION("62E22D40BE09" , vfnmsub231ps(zmm17, zmm26, zmmword_ptr(rcx)));
+ TEST_INSTRUCTION("62A22D40BE8CF034120000" , vfnmsub231ps(zmm17, zmm26, zmmword_ptr(rax, r14, 3, 4660)));
+ TEST_INSTRUCTION("62E22D50BE09" , vfnmsub231ps(zmm17, zmm26, dword_ptr(rcx)._1to16()));
+ TEST_INSTRUCTION("62E22D40BE4A7F" , vfnmsub231ps(zmm17, zmm26, zmmword_ptr(rdx, 8128)));
+ TEST_INSTRUCTION("62E22D40BE8A00200000" , vfnmsub231ps(zmm17, zmm26, zmmword_ptr(rdx, 8192)));
+ TEST_INSTRUCTION("62E22D40BE4A80" , vfnmsub231ps(zmm17, zmm26, zmmword_ptr(rdx, -8192)));
+ TEST_INSTRUCTION("62E22D40BE8AC0DFFFFF" , vfnmsub231ps(zmm17, zmm26, zmmword_ptr(rdx, -8256)));
+ TEST_INSTRUCTION("62E22D50BE4A7F" , vfnmsub231ps(zmm17, zmm26, dword_ptr(rdx, 508)._1to16()));
+ TEST_INSTRUCTION("62E22D50BE8A00020000" , vfnmsub231ps(zmm17, zmm26, dword_ptr(rdx, 512)._1to16()));
+ TEST_INSTRUCTION("62E22D50BE4A80" , vfnmsub231ps(zmm17, zmm26, dword_ptr(rdx, -512)._1to16()));
+ TEST_INSTRUCTION("62E22D50BE8AFCFDFFFF" , vfnmsub231ps(zmm17, zmm26, dword_ptr(rdx, -516)._1to16()));
+ TEST_INSTRUCTION("6282CD08BFDA" , vfnmsub231sd(xmm19, xmm6, xmm26));
+ TEST_INSTRUCTION("6282CD0FBFDA" , k(k7).vfnmsub231sd(xmm19, xmm6, xmm26));
+ TEST_INSTRUCTION("6282CD8FBFDA" , k(k7).z().vfnmsub231sd(xmm19, xmm6, xmm26));
+ TEST_INSTRUCTION("6282CD18BFDA" , rn_sae().vfnmsub231sd(xmm19, xmm6, xmm26));
+ TEST_INSTRUCTION("6282CD58BFDA" , ru_sae().vfnmsub231sd(xmm19, xmm6, xmm26));
+ TEST_INSTRUCTION("6282CD38BFDA" , rd_sae().vfnmsub231sd(xmm19, xmm6, xmm26));
+ TEST_INSTRUCTION("6282CD78BFDA" , rz_sae().vfnmsub231sd(xmm19, xmm6, xmm26));
+ TEST_INSTRUCTION("62E2CD08BF19" , vfnmsub231sd(xmm19, xmm6, qword_ptr(rcx)));
+ TEST_INSTRUCTION("62A2CD08BF9CF034120000" , vfnmsub231sd(xmm19, xmm6, qword_ptr(rax, r14, 3, 4660)));
+ TEST_INSTRUCTION("62E2CD08BF5A7F" , vfnmsub231sd(xmm19, xmm6, qword_ptr(rdx, 1016)));
+ TEST_INSTRUCTION("62E2CD08BF9A00040000" , vfnmsub231sd(xmm19, xmm6, qword_ptr(rdx, 1024)));
+ TEST_INSTRUCTION("62E2CD08BF5A80" , vfnmsub231sd(xmm19, xmm6, qword_ptr(rdx, -1024)));
+ TEST_INSTRUCTION("62E2CD08BF9AF8FBFFFF" , vfnmsub231sd(xmm19, xmm6, qword_ptr(rdx, -1032)));
+ TEST_INSTRUCTION("62726D00BFE9" , vfnmsub231ss(xmm13, xmm18, xmm1));
+ TEST_INSTRUCTION("62726D05BFE9" , k(k5).vfnmsub231ss(xmm13, xmm18, xmm1));
+ TEST_INSTRUCTION("62726D85BFE9" , k(k5).z().vfnmsub231ss(xmm13, xmm18, xmm1));
+ TEST_INSTRUCTION("62726D10BFE9" , rn_sae().vfnmsub231ss(xmm13, xmm18, xmm1));
+ TEST_INSTRUCTION("62726D50BFE9" , ru_sae().vfnmsub231ss(xmm13, xmm18, xmm1));
+ TEST_INSTRUCTION("62726D30BFE9" , rd_sae().vfnmsub231ss(xmm13, xmm18, xmm1));
+ TEST_INSTRUCTION("62726D70BFE9" , rz_sae().vfnmsub231ss(xmm13, xmm18, xmm1));
+ TEST_INSTRUCTION("62726D00BF29" , vfnmsub231ss(xmm13, xmm18, dword_ptr(rcx)));
+ TEST_INSTRUCTION("62326D00BFACF034120000" , vfnmsub231ss(xmm13, xmm18, dword_ptr(rax, r14, 3, 4660)));
+ TEST_INSTRUCTION("62726D00BF6A7F" , vfnmsub231ss(xmm13, xmm18, dword_ptr(rdx, 508)));
+ TEST_INSTRUCTION("62726D00BFAA00020000" , vfnmsub231ss(xmm13, xmm18, dword_ptr(rdx, 512)));
+ TEST_INSTRUCTION("62726D00BF6A80" , vfnmsub231ss(xmm13, xmm18, dword_ptr(rdx, -512)));
+ TEST_INSTRUCTION("62726D00BFAAFCFDFFFF" , vfnmsub231ss(xmm13, xmm18, dword_ptr(rdx, -516)));
+ TEST_INSTRUCTION("6292FD4842F1" , vgetexppd(zmm6, zmm25));
+ TEST_INSTRUCTION("6292FD4B42F1" , k(k3).vgetexppd(zmm6, zmm25));
+ TEST_INSTRUCTION("6292FDCB42F1" , k(k3).z().vgetexppd(zmm6, zmm25));
+ TEST_INSTRUCTION("6292FD1842F1" , sae().vgetexppd(zmm6, zmm25));
+ TEST_INSTRUCTION("62F2FD484231" , vgetexppd(zmm6, zmmword_ptr(rcx)));
+ TEST_INSTRUCTION("62B2FD4842B4F034120000" , vgetexppd(zmm6, zmmword_ptr(rax, r14, 3, 4660)));
+ TEST_INSTRUCTION("62F2FD584231" , vgetexppd(zmm6, qword_ptr(rcx)._1to8()));
+ TEST_INSTRUCTION("62F2FD4842727F" , vgetexppd(zmm6, zmmword_ptr(rdx, 8128)));
+ TEST_INSTRUCTION("62F2FD4842B200200000" , vgetexppd(zmm6, zmmword_ptr(rdx, 8192)));
+ TEST_INSTRUCTION("62F2FD48427280" , vgetexppd(zmm6, zmmword_ptr(rdx, -8192)));
+ TEST_INSTRUCTION("62F2FD4842B2C0DFFFFF" , vgetexppd(zmm6, zmmword_ptr(rdx, -8256)));
+ TEST_INSTRUCTION("62F2FD5842727F" , vgetexppd(zmm6, qword_ptr(rdx, 1016)._1to8()));
+ TEST_INSTRUCTION("62F2FD5842B200040000" , vgetexppd(zmm6, qword_ptr(rdx, 1024)._1to8()));
+ TEST_INSTRUCTION("62F2FD58427280" , vgetexppd(zmm6, qword_ptr(rdx, -1024)._1to8()));
+ TEST_INSTRUCTION("62F2FD5842B2F8FBFFFF" , vgetexppd(zmm6, qword_ptr(rdx, -1032)._1to8()));
+ TEST_INSTRUCTION("62B27D4842F8" , vgetexpps(zmm7, zmm16));
+ TEST_INSTRUCTION("62B27D4A42F8" , k(k2).vgetexpps(zmm7, zmm16));
+ TEST_INSTRUCTION("62B27DCA42F8" , k(k2).z().vgetexpps(zmm7, zmm16));
+ TEST_INSTRUCTION("62B27D1842F8" , sae().vgetexpps(zmm7, zmm16));
+ TEST_INSTRUCTION("62F27D484239" , vgetexpps(zmm7, zmmword_ptr(rcx)));
+ TEST_INSTRUCTION("62B27D4842BCF034120000" , vgetexpps(zmm7, zmmword_ptr(rax, r14, 3, 4660)));
+ TEST_INSTRUCTION("62F27D584239" , vgetexpps(zmm7, dword_ptr(rcx)._1to16()));
+ TEST_INSTRUCTION("62F27D48427A7F" , vgetexpps(zmm7, zmmword_ptr(rdx, 8128)));
+ TEST_INSTRUCTION("62F27D4842BA00200000" , vgetexpps(zmm7, zmmword_ptr(rdx, 8192)));
+ TEST_INSTRUCTION("62F27D48427A80" , vgetexpps(zmm7, zmmword_ptr(rdx, -8192)));
+ TEST_INSTRUCTION("62F27D4842BAC0DFFFFF" , vgetexpps(zmm7, zmmword_ptr(rdx, -8256)));
+ TEST_INSTRUCTION("62F27D58427A7F" , vgetexpps(zmm7, dword_ptr(rdx, 508)._1to16()));
+ TEST_INSTRUCTION("62F27D5842BA00020000" , vgetexpps(zmm7, dword_ptr(rdx, 512)._1to16()));
+ TEST_INSTRUCTION("62F27D58427A80" , vgetexpps(zmm7, dword_ptr(rdx, -512)._1to16()));
+ TEST_INSTRUCTION("62F27D5842BAFCFDFFFF" , vgetexpps(zmm7, dword_ptr(rdx, -516)._1to16()));
+ TEST_INSTRUCTION("62728D0843D5" , vgetexpsd(xmm10, xmm14, xmm5));
+ TEST_INSTRUCTION("62728D0C43D5" , k(k4).vgetexpsd(xmm10, xmm14, xmm5));
+ TEST_INSTRUCTION("62728D8C43D5" , k(k4).z().vgetexpsd(xmm10, xmm14, xmm5));
+ TEST_INSTRUCTION("62728D1843D5" , sae().vgetexpsd(xmm10, xmm14, xmm5));
+ TEST_INSTRUCTION("62728D084311" , vgetexpsd(xmm10, xmm14, qword_ptr(rcx)));
+ TEST_INSTRUCTION("62328D084394F034120000" , vgetexpsd(xmm10, xmm14, qword_ptr(rax, r14, 3, 4660)));
+ TEST_INSTRUCTION("62728D0843527F" , vgetexpsd(xmm10, xmm14, qword_ptr(rdx, 1016)));
+ TEST_INSTRUCTION("62728D08439200040000" , vgetexpsd(xmm10, xmm14, qword_ptr(rdx, 1024)));
+ TEST_INSTRUCTION("62728D08435280" , vgetexpsd(xmm10, xmm14, qword_ptr(rdx, -1024)));
+ TEST_INSTRUCTION("62728D084392F8FBFFFF" , vgetexpsd(xmm10, xmm14, qword_ptr(rdx, -1032)));
+ TEST_INSTRUCTION("62A2550043C7" , vgetexpss(xmm16, xmm21, xmm23));
+ TEST_INSTRUCTION("62A2550243C7" , k(k2).vgetexpss(xmm16, xmm21, xmm23));
+ TEST_INSTRUCTION("62A2558243C7" , k(k2).z().vgetexpss(xmm16, xmm21, xmm23));
+ TEST_INSTRUCTION("62A2551043C7" , sae().vgetexpss(xmm16, xmm21, xmm23));
+ TEST_INSTRUCTION("62E255004301" , vgetexpss(xmm16, xmm21, dword_ptr(rcx)));
+ TEST_INSTRUCTION("62A255004384F034120000" , vgetexpss(xmm16, xmm21, dword_ptr(rax, r14, 3, 4660)));
+ TEST_INSTRUCTION("62E2550043427F" , vgetexpss(xmm16, xmm21, dword_ptr(rdx, 508)));
+ TEST_INSTRUCTION("62E25500438200020000" , vgetexpss(xmm16, xmm21, dword_ptr(rdx, 512)));
+ TEST_INSTRUCTION("62E25500434280" , vgetexpss(xmm16, xmm21, dword_ptr(rdx, -512)));
+ TEST_INSTRUCTION("62E255004382FCFDFFFF" , vgetexpss(xmm16, xmm21, dword_ptr(rdx, -516)));
+ TEST_INSTRUCTION("6253FD4826CAAB" , vgetmantpd(zmm9, zmm10, 171));
+ TEST_INSTRUCTION("6253FD4D26CAAB" , k(k5).vgetmantpd(zmm9, zmm10, 171));
+ TEST_INSTRUCTION("6253FDCD26CAAB" , k(k5).z().vgetmantpd(zmm9, zmm10, 171));
+ TEST_INSTRUCTION("6253FD1826CAAB" , sae().vgetmantpd(zmm9, zmm10, 171));
+ TEST_INSTRUCTION("6253FD4826CA7B" , vgetmantpd(zmm9, zmm10, 123));
+ TEST_INSTRUCTION("6253FD1826CA7B" , sae().vgetmantpd(zmm9, zmm10, 123));
+ TEST_INSTRUCTION("6273FD4826097B" , vgetmantpd(zmm9, zmmword_ptr(rcx), 123));
+ TEST_INSTRUCTION("6233FD48268CF0341200007B" , vgetmantpd(zmm9, zmmword_ptr(rax, r14, 3, 4660), 123));
+ TEST_INSTRUCTION("6273FD5826097B" , vgetmantpd(zmm9, qword_ptr(rcx)._1to8(), 123));
+ TEST_INSTRUCTION("6273FD48264A7F7B" , vgetmantpd(zmm9, zmmword_ptr(rdx, 8128), 123));
+ TEST_INSTRUCTION("6273FD48268A002000007B" , vgetmantpd(zmm9, zmmword_ptr(rdx, 8192), 123));
+ TEST_INSTRUCTION("6273FD48264A807B" , vgetmantpd(zmm9, zmmword_ptr(rdx, -8192), 123));
+ TEST_INSTRUCTION("6273FD48268AC0DFFFFF7B" , vgetmantpd(zmm9, zmmword_ptr(rdx, -8256), 123));
+ TEST_INSTRUCTION("6273FD58264A7F7B" , vgetmantpd(zmm9, qword_ptr(rdx, 1016)._1to8(), 123));
+ TEST_INSTRUCTION("6273FD58268A000400007B" , vgetmantpd(zmm9, qword_ptr(rdx, 1024)._1to8(), 123));
+ TEST_INSTRUCTION("6273FD58264A807B" , vgetmantpd(zmm9, qword_ptr(rdx, -1024)._1to8(), 123));
+ TEST_INSTRUCTION("6273FD58268AF8FBFFFF7B" , vgetmantpd(zmm9, qword_ptr(rdx, -1032)._1to8(), 123));
+ TEST_INSTRUCTION("62037D4826E9AB" , vgetmantps(zmm29, zmm25, 171));
+ TEST_INSTRUCTION("62037D4B26E9AB" , k(k3).vgetmantps(zmm29, zmm25, 171));
+ TEST_INSTRUCTION("62037DCB26E9AB" , k(k3).z().vgetmantps(zmm29, zmm25, 171));
+ TEST_INSTRUCTION("62037D1826E9AB" , sae().vgetmantps(zmm29, zmm25, 171));
+ TEST_INSTRUCTION("62037D4826E97B" , vgetmantps(zmm29, zmm25, 123));
+ TEST_INSTRUCTION("62037D1826E97B" , sae().vgetmantps(zmm29, zmm25, 123));
+ TEST_INSTRUCTION("62637D4826297B" , vgetmantps(zmm29, zmmword_ptr(rcx), 123));
+ TEST_INSTRUCTION("62237D4826ACF0341200007B" , vgetmantps(zmm29, zmmword_ptr(rax, r14, 3, 4660), 123));
+ TEST_INSTRUCTION("62637D5826297B" , vgetmantps(zmm29, dword_ptr(rcx)._1to16(), 123));
+ TEST_INSTRUCTION("62637D48266A7F7B" , vgetmantps(zmm29, zmmword_ptr(rdx, 8128), 123));
+ TEST_INSTRUCTION("62637D4826AA002000007B" , vgetmantps(zmm29, zmmword_ptr(rdx, 8192), 123));
+ TEST_INSTRUCTION("62637D48266A807B" , vgetmantps(zmm29, zmmword_ptr(rdx, -8192), 123));
+ TEST_INSTRUCTION("62637D4826AAC0DFFFFF7B" , vgetmantps(zmm29, zmmword_ptr(rdx, -8256), 123));
+ TEST_INSTRUCTION("62637D58266A7F7B" , vgetmantps(zmm29, dword_ptr(rdx, 508)._1to16(), 123));
+ TEST_INSTRUCTION("62637D5826AA000200007B" , vgetmantps(zmm29, dword_ptr(rdx, 512)._1to16(), 123));
+ TEST_INSTRUCTION("62637D58266A807B" , vgetmantps(zmm29, dword_ptr(rdx, -512)._1to16(), 123));
+ TEST_INSTRUCTION("62637D5826AAFCFDFFFF7B" , vgetmantps(zmm29, dword_ptr(rdx, -516)._1to16(), 123));
+ TEST_INSTRUCTION("62A3E50827E1AB" , vgetmantsd(xmm20, xmm3, xmm17, 171));
+ TEST_INSTRUCTION("62A3E50F27E1AB" , k(k7).vgetmantsd(xmm20, xmm3, xmm17, 171));
+ TEST_INSTRUCTION("62A3E58F27E1AB" , k(k7).z().vgetmantsd(xmm20, xmm3, xmm17, 171));
+ TEST_INSTRUCTION("62A3E51827E1AB" , sae().vgetmantsd(xmm20, xmm3, xmm17, 171));
+ TEST_INSTRUCTION("62A3E50827E17B" , vgetmantsd(xmm20, xmm3, xmm17, 123));
+ TEST_INSTRUCTION("62A3E51827E17B" , sae().vgetmantsd(xmm20, xmm3, xmm17, 123));
+ TEST_INSTRUCTION("62E3E50827217B" , vgetmantsd(xmm20, xmm3, qword_ptr(rcx), 123));
+ TEST_INSTRUCTION("62A3E50827A4F0341200007B" , vgetmantsd(xmm20, xmm3, qword_ptr(rax, r14, 3, 4660), 123));
+ TEST_INSTRUCTION("62E3E50827627F7B" , vgetmantsd(xmm20, xmm3, qword_ptr(rdx, 1016), 123));
+ TEST_INSTRUCTION("62E3E50827A2000400007B" , vgetmantsd(xmm20, xmm3, qword_ptr(rdx, 1024), 123));
+ TEST_INSTRUCTION("62E3E5082762807B" , vgetmantsd(xmm20, xmm3, qword_ptr(rdx, -1024), 123));
+ TEST_INSTRUCTION("62E3E50827A2F8FBFFFF7B" , vgetmantsd(xmm20, xmm3, qword_ptr(rdx, -1032), 123));
+ TEST_INSTRUCTION("62731D0827EEAB" , vgetmantss(xmm13, xmm12, xmm6, 171));
+ TEST_INSTRUCTION("62731D0A27EEAB" , k(k2).vgetmantss(xmm13, xmm12, xmm6, 171));
+ TEST_INSTRUCTION("62731D8A27EEAB" , k(k2).z().vgetmantss(xmm13, xmm12, xmm6, 171));
+ TEST_INSTRUCTION("62731D1827EEAB" , sae().vgetmantss(xmm13, xmm12, xmm6, 171));
+ TEST_INSTRUCTION("62731D0827EE7B" , vgetmantss(xmm13, xmm12, xmm6, 123));
+ TEST_INSTRUCTION("62731D1827EE7B" , sae().vgetmantss(xmm13, xmm12, xmm6, 123));
+ TEST_INSTRUCTION("62731D0827297B" , vgetmantss(xmm13, xmm12, dword_ptr(rcx), 123));
+ TEST_INSTRUCTION("62331D0827ACF0341200007B" , vgetmantss(xmm13, xmm12, dword_ptr(rax, r14, 3, 4660), 123));
+ TEST_INSTRUCTION("62731D08276A7F7B" , vgetmantss(xmm13, xmm12, dword_ptr(rdx, 508), 123));
+ TEST_INSTRUCTION("62731D0827AA000200007B" , vgetmantss(xmm13, xmm12, dword_ptr(rdx, 512), 123));
+ TEST_INSTRUCTION("62731D08276A807B" , vgetmantss(xmm13, xmm12, dword_ptr(rdx, -512), 123));
+ TEST_INSTRUCTION("62731D0827AAFCFDFFFF7B" , vgetmantss(xmm13, xmm12, dword_ptr(rdx, -516), 123));
+ TEST_INSTRUCTION("62337D4018C6AB" , vinsertf32x4(zmm8, zmm16, xmm22, 171));
+ TEST_INSTRUCTION("62337D4518C6AB" , k(k5).vinsertf32x4(zmm8, zmm16, xmm22, 171));
+ TEST_INSTRUCTION("62337DC518C6AB" , k(k5).z().vinsertf32x4(zmm8, zmm16, xmm22, 171));
+ TEST_INSTRUCTION("62337D4018C67B" , vinsertf32x4(zmm8, zmm16, xmm22, 123));
+ TEST_INSTRUCTION("62737D4018017B" , vinsertf32x4(zmm8, zmm16, xmmword_ptr(rcx), 123));
+ TEST_INSTRUCTION("62337D401884F0341200007B" , vinsertf32x4(zmm8, zmm16, xmmword_ptr(rax, r14, 3, 4660), 123));
+ TEST_INSTRUCTION("62737D4018427F7B" , vinsertf32x4(zmm8, zmm16, xmmword_ptr(rdx, 2032), 123));
+ TEST_INSTRUCTION("62737D401882000800007B" , vinsertf32x4(zmm8, zmm16, xmmword_ptr(rdx, 2048), 123));
+ TEST_INSTRUCTION("62737D401842807B" , vinsertf32x4(zmm8, zmm16, xmmword_ptr(rdx, -2048), 123));
+ TEST_INSTRUCTION("62737D401882F0F7FFFF7B" , vinsertf32x4(zmm8, zmm16, xmmword_ptr(rdx, -2064), 123));
+ TEST_INSTRUCTION("62C3B5481AF4AB" , vinsertf64x4(zmm22, zmm9, ymm12, 171));
+ TEST_INSTRUCTION("62C3B54E1AF4AB" , k(k6).vinsertf64x4(zmm22, zmm9, ymm12, 171));
+ TEST_INSTRUCTION("62C3B5CE1AF4AB" , k(k6).z().vinsertf64x4(zmm22, zmm9, ymm12, 171));
+ TEST_INSTRUCTION("62C3B5481AF47B" , vinsertf64x4(zmm22, zmm9, ymm12, 123));
+ TEST_INSTRUCTION("62E3B5481A317B" , vinsertf64x4(zmm22, zmm9, ymmword_ptr(rcx), 123));
+ TEST_INSTRUCTION("62A3B5481AB4F0341200007B" , vinsertf64x4(zmm22, zmm9, ymmword_ptr(rax, r14, 3, 4660), 123));
+ TEST_INSTRUCTION("62E3B5481A727F7B" , vinsertf64x4(zmm22, zmm9, ymmword_ptr(rdx, 4064), 123));
+ TEST_INSTRUCTION("62E3B5481AB2001000007B" , vinsertf64x4(zmm22, zmm9, ymmword_ptr(rdx, 4096), 123));
+ TEST_INSTRUCTION("62E3B5481A72807B" , vinsertf64x4(zmm22, zmm9, ymmword_ptr(rdx, -4096), 123));
+ TEST_INSTRUCTION("62E3B5481AB2E0EFFFFF7B" , vinsertf64x4(zmm22, zmm9, ymmword_ptr(rdx, -4128), 123));
+ TEST_INSTRUCTION("62935D4838F8AB" , vinserti32x4(zmm7, zmm4, xmm24, 171));
+ TEST_INSTRUCTION("62935D4F38F8AB" , k(k7).vinserti32x4(zmm7, zmm4, xmm24, 171));
+ TEST_INSTRUCTION("62935DCF38F8AB" , k(k7).z().vinserti32x4(zmm7, zmm4, xmm24, 171));
+ TEST_INSTRUCTION("62935D4838F87B" , vinserti32x4(zmm7, zmm4, xmm24, 123));
+ TEST_INSTRUCTION("62F35D4838397B" , vinserti32x4(zmm7, zmm4, xmmword_ptr(rcx), 123));
+ TEST_INSTRUCTION("62B35D4838BCF0341200007B" , vinserti32x4(zmm7, zmm4, xmmword_ptr(rax, r14, 3, 4660), 123));
+ TEST_INSTRUCTION("62F35D48387A7F7B" , vinserti32x4(zmm7, zmm4, xmmword_ptr(rdx, 2032), 123));
+ TEST_INSTRUCTION("62F35D4838BA000800007B" , vinserti32x4(zmm7, zmm4, xmmword_ptr(rdx, 2048), 123));
+ TEST_INSTRUCTION("62F35D48387A807B" , vinserti32x4(zmm7, zmm4, xmmword_ptr(rdx, -2048), 123));
+ TEST_INSTRUCTION("62F35D4838BAF0F7FFFF7B" , vinserti32x4(zmm7, zmm4, xmmword_ptr(rdx, -2064), 123));
+ TEST_INSTRUCTION("62A3D5483AD7AB" , vinserti64x4(zmm18, zmm5, ymm23, 171));
+ TEST_INSTRUCTION("62A3D54A3AD7AB" , k(k2).vinserti64x4(zmm18, zmm5, ymm23, 171));
+ TEST_INSTRUCTION("62A3D5CA3AD7AB" , k(k2).z().vinserti64x4(zmm18, zmm5, ymm23, 171));
+ TEST_INSTRUCTION("62A3D5483AD77B" , vinserti64x4(zmm18, zmm5, ymm23, 123));
+ TEST_INSTRUCTION("62E3D5483A117B" , vinserti64x4(zmm18, zmm5, ymmword_ptr(rcx), 123));
+ TEST_INSTRUCTION("62A3D5483A94F0341200007B" , vinserti64x4(zmm18, zmm5, ymmword_ptr(rax, r14, 3, 4660), 123));
+ TEST_INSTRUCTION("62E3D5483A527F7B" , vinserti64x4(zmm18, zmm5, ymmword_ptr(rdx, 4064), 123));
+ TEST_INSTRUCTION("62E3D5483A92001000007B" , vinserti64x4(zmm18, zmm5, ymmword_ptr(rdx, 4096), 123));
+ TEST_INSTRUCTION("62E3D5483A52807B" , vinserti64x4(zmm18, zmm5, ymmword_ptr(rdx, -4096), 123));
+ TEST_INSTRUCTION("62E3D5483A92E0EFFFFF7B" , vinserti64x4(zmm18, zmm5, ymmword_ptr(rdx, -4128), 123));
+ TEST_INSTRUCTION("62034D0821C4AB" , vinsertps(xmm24, xmm6, xmm28, 171));
+ TEST_INSTRUCTION("62034D0821C47B" , vinsertps(xmm24, xmm6, xmm28, 123));
+ TEST_INSTRUCTION("62634D0821017B" , vinsertps(xmm24, xmm6, dword_ptr(rcx), 123));
+ TEST_INSTRUCTION("62234D082184F0341200007B" , vinsertps(xmm24, xmm6, dword_ptr(rax, r14, 3, 4660), 123));
+ TEST_INSTRUCTION("62634D0821427F7B" , vinsertps(xmm24, xmm6, dword_ptr(rdx, 508), 123));
+ TEST_INSTRUCTION("62634D082182000200007B" , vinsertps(xmm24, xmm6, dword_ptr(rdx, 512), 123));
+ TEST_INSTRUCTION("62634D082142807B" , vinsertps(xmm24, xmm6, dword_ptr(rdx, -512), 123));
+ TEST_INSTRUCTION("62634D082182FCFDFFFF7B" , vinsertps(xmm24, xmm6, dword_ptr(rdx, -516), 123));
+ TEST_INSTRUCTION("62319D485FCD" , vmaxpd(zmm9, zmm12, zmm21));
+ TEST_INSTRUCTION("62319D4E5FCD" , k(k6).vmaxpd(zmm9, zmm12, zmm21));
+ TEST_INSTRUCTION("62319DCE5FCD" , k(k6).z().vmaxpd(zmm9, zmm12, zmm21));
+ TEST_INSTRUCTION("62319D185FCD" , sae().vmaxpd(zmm9, zmm12, zmm21));
+ TEST_INSTRUCTION("62719D485F09" , vmaxpd(zmm9, zmm12, zmmword_ptr(rcx)));
+ TEST_INSTRUCTION("62319D485F8CF034120000" , vmaxpd(zmm9, zmm12, zmmword_ptr(rax, r14, 3, 4660)));
+ TEST_INSTRUCTION("62719D585F09" , vmaxpd(zmm9, zmm12, qword_ptr(rcx)._1to8()));
+ TEST_INSTRUCTION("62719D485F4A7F" , vmaxpd(zmm9, zmm12, zmmword_ptr(rdx, 8128)));
+ TEST_INSTRUCTION("62719D485F8A00200000" , vmaxpd(zmm9, zmm12, zmmword_ptr(rdx, 8192)));
+ TEST_INSTRUCTION("62719D485F4A80" , vmaxpd(zmm9, zmm12, zmmword_ptr(rdx, -8192)));
+ TEST_INSTRUCTION("62719D485F8AC0DFFFFF" , vmaxpd(zmm9, zmm12, zmmword_ptr(rdx, -8256)));
+ TEST_INSTRUCTION("62719D585F4A7F" , vmaxpd(zmm9, zmm12, qword_ptr(rdx, 1016)._1to8()));
+ TEST_INSTRUCTION("62719D585F8A00040000" , vmaxpd(zmm9, zmm12, qword_ptr(rdx, 1024)._1to8()));
+ TEST_INSTRUCTION("62719D585F4A80" , vmaxpd(zmm9, zmm12, qword_ptr(rdx, -1024)._1to8()));
+ TEST_INSTRUCTION("62719D585F8AF8FBFFFF" , vmaxpd(zmm9, zmm12, qword_ptr(rdx, -1032)._1to8()));
+ TEST_INSTRUCTION("62813C405FC8" , vmaxps(zmm17, zmm24, zmm24));
+ TEST_INSTRUCTION("62813C445FC8" , k(k4).vmaxps(zmm17, zmm24, zmm24));
+ TEST_INSTRUCTION("62813CC45FC8" , k(k4).z().vmaxps(zmm17, zmm24, zmm24));
+ TEST_INSTRUCTION("62813C105FC8" , sae().vmaxps(zmm17, zmm24, zmm24));
+ TEST_INSTRUCTION("62E13C405F09" , vmaxps(zmm17, zmm24, zmmword_ptr(rcx)));
+ TEST_INSTRUCTION("62A13C405F8CF034120000" , vmaxps(zmm17, zmm24, zmmword_ptr(rax, r14, 3, 4660)));
+ TEST_INSTRUCTION("62E13C505F09" , vmaxps(zmm17, zmm24, dword_ptr(rcx)._1to16()));
+ TEST_INSTRUCTION("62E13C405F4A7F" , vmaxps(zmm17, zmm24, zmmword_ptr(rdx, 8128)));
+ TEST_INSTRUCTION("62E13C405F8A00200000" , vmaxps(zmm17, zmm24, zmmword_ptr(rdx, 8192)));
+ TEST_INSTRUCTION("62E13C405F4A80" , vmaxps(zmm17, zmm24, zmmword_ptr(rdx, -8192)));
+ TEST_INSTRUCTION("62E13C405F8AC0DFFFFF" , vmaxps(zmm17, zmm24, zmmword_ptr(rdx, -8256)));
+ TEST_INSTRUCTION("62E13C505F4A7F" , vmaxps(zmm17, zmm24, dword_ptr(rdx, 508)._1to16()));
+ TEST_INSTRUCTION("62E13C505F8A00020000" , vmaxps(zmm17, zmm24, dword_ptr(rdx, 512)._1to16()));
+ TEST_INSTRUCTION("62E13C505F4A80" , vmaxps(zmm17, zmm24, dword_ptr(rdx, -512)._1to16()));
+ TEST_INSTRUCTION("62E13C505F8AFCFDFFFF" , vmaxps(zmm17, zmm24, dword_ptr(rdx, -516)._1to16()));
+ TEST_INSTRUCTION("62A1D7005FF8" , vmaxsd(xmm23, xmm21, xmm16));
+ TEST_INSTRUCTION("62A1D7035FF8" , k(k3).vmaxsd(xmm23, xmm21, xmm16));
+ TEST_INSTRUCTION("62A1D7835FF8" , k(k3).z().vmaxsd(xmm23, xmm21, xmm16));
+ TEST_INSTRUCTION("62A1D7105FF8" , sae().vmaxsd(xmm23, xmm21, xmm16));
+ TEST_INSTRUCTION("62E1D7005F39" , vmaxsd(xmm23, xmm21, qword_ptr(rcx)));
+ TEST_INSTRUCTION("62A1D7005FBCF034120000" , vmaxsd(xmm23, xmm21, qword_ptr(rax, r14, 3, 4660)));
+ TEST_INSTRUCTION("62E1D7005F7A7F" , vmaxsd(xmm23, xmm21, qword_ptr(rdx, 1016)));
+ TEST_INSTRUCTION("62E1D7005FBA00040000" , vmaxsd(xmm23, xmm21, qword_ptr(rdx, 1024)));
+ TEST_INSTRUCTION("62E1D7005F7A80" , vmaxsd(xmm23, xmm21, qword_ptr(rdx, -1024)));
+ TEST_INSTRUCTION("62E1D7005FBAF8FBFFFF" , vmaxsd(xmm23, xmm21, qword_ptr(rdx, -1032)));
+ TEST_INSTRUCTION("62A176005FF0" , vmaxss(xmm22, xmm17, xmm16));
+ TEST_INSTRUCTION("62A176075FF0" , k(k7).vmaxss(xmm22, xmm17, xmm16));
+ TEST_INSTRUCTION("62A176875FF0" , k(k7).z().vmaxss(xmm22, xmm17, xmm16));
+ TEST_INSTRUCTION("62A176105FF0" , sae().vmaxss(xmm22, xmm17, xmm16));
+ TEST_INSTRUCTION("62E176005F31" , vmaxss(xmm22, xmm17, dword_ptr(rcx)));
+ TEST_INSTRUCTION("62A176005FB4F034120000" , vmaxss(xmm22, xmm17, dword_ptr(rax, r14, 3, 4660)));
+ TEST_INSTRUCTION("62E176005F727F" , vmaxss(xmm22, xmm17, dword_ptr(rdx, 508)));
+ TEST_INSTRUCTION("62E176005FB200020000" , vmaxss(xmm22, xmm17, dword_ptr(rdx, 512)));
+ TEST_INSTRUCTION("62E176005F7280" , vmaxss(xmm22, xmm17, dword_ptr(rdx, -512)));
+ TEST_INSTRUCTION("62E176005FB2FCFDFFFF" , vmaxss(xmm22, xmm17, dword_ptr(rdx, -516)));
+ TEST_INSTRUCTION("6211B5405DD3" , vminpd(zmm10, zmm25, zmm27));
+ TEST_INSTRUCTION("6211B5445DD3" , k(k4).vminpd(zmm10, zmm25, zmm27));
+ TEST_INSTRUCTION("6211B5C45DD3" , k(k4).z().vminpd(zmm10, zmm25, zmm27));
+ TEST_INSTRUCTION("6211B5105DD3" , sae().vminpd(zmm10, zmm25, zmm27));
+ TEST_INSTRUCTION("6271B5405D11" , vminpd(zmm10, zmm25, zmmword_ptr(rcx)));
+ TEST_INSTRUCTION("6231B5405D94F034120000" , vminpd(zmm10, zmm25, zmmword_ptr(rax, r14, 3, 4660)));
+ TEST_INSTRUCTION("6271B5505D11" , vminpd(zmm10, zmm25, qword_ptr(rcx)._1to8()));
+ TEST_INSTRUCTION("6271B5405D527F" , vminpd(zmm10, zmm25, zmmword_ptr(rdx, 8128)));
+ TEST_INSTRUCTION("6271B5405D9200200000" , vminpd(zmm10, zmm25, zmmword_ptr(rdx, 8192)));
+ TEST_INSTRUCTION("6271B5405D5280" , vminpd(zmm10, zmm25, zmmword_ptr(rdx, -8192)));
+ TEST_INSTRUCTION("6271B5405D92C0DFFFFF" , vminpd(zmm10, zmm25, zmmword_ptr(rdx, -8256)));
+ TEST_INSTRUCTION("6271B5505D527F" , vminpd(zmm10, zmm25, qword_ptr(rdx, 1016)._1to8()));
+ TEST_INSTRUCTION("6271B5505D9200040000" , vminpd(zmm10, zmm25, qword_ptr(rdx, 1024)._1to8()));
+ TEST_INSTRUCTION("6271B5505D5280" , vminpd(zmm10, zmm25, qword_ptr(rdx, -1024)._1to8()));
+ TEST_INSTRUCTION("6271B5505D92F8FBFFFF" , vminpd(zmm10, zmm25, qword_ptr(rdx, -1032)._1to8()));
+ TEST_INSTRUCTION("62B10C485DD8" , vminps(zmm3, zmm14, zmm16));
+ TEST_INSTRUCTION("62B10C4F5DD8" , k(k7).vminps(zmm3, zmm14, zmm16));
+ TEST_INSTRUCTION("62B10CCF5DD8" , k(k7).z().vminps(zmm3, zmm14, zmm16));
+ TEST_INSTRUCTION("62B10C185DD8" , sae().vminps(zmm3, zmm14, zmm16));
+ TEST_INSTRUCTION("62F10C485D19" , vminps(zmm3, zmm14, zmmword_ptr(rcx)));
+ TEST_INSTRUCTION("62B10C485D9CF034120000" , vminps(zmm3, zmm14, zmmword_ptr(rax, r14, 3, 4660)));
+ TEST_INSTRUCTION("62F10C585D19" , vminps(zmm3, zmm14, dword_ptr(rcx)._1to16()));
+ TEST_INSTRUCTION("62F10C485D5A7F" , vminps(zmm3, zmm14, zmmword_ptr(rdx, 8128)));
+ TEST_INSTRUCTION("62F10C485D9A00200000" , vminps(zmm3, zmm14, zmmword_ptr(rdx, 8192)));
+ TEST_INSTRUCTION("62F10C485D5A80" , vminps(zmm3, zmm14, zmmword_ptr(rdx, -8192)));
+ TEST_INSTRUCTION("62F10C485D9AC0DFFFFF" , vminps(zmm3, zmm14, zmmword_ptr(rdx, -8256)));
+ TEST_INSTRUCTION("62F10C585D5A7F" , vminps(zmm3, zmm14, dword_ptr(rdx, 508)._1to16()));
+ TEST_INSTRUCTION("62F10C585D9A00020000" , vminps(zmm3, zmm14, dword_ptr(rdx, 512)._1to16()));
+ TEST_INSTRUCTION("62F10C585D5A80" , vminps(zmm3, zmm14, dword_ptr(rdx, -512)._1to16()));
+ TEST_INSTRUCTION("62F10C585D9AFCFDFFFF" , vminps(zmm3, zmm14, dword_ptr(rdx, -516)._1to16()));
+ TEST_INSTRUCTION("6211F7085DD4" , vminsd(xmm10, xmm1, xmm28));
+ TEST_INSTRUCTION("6211F70A5DD4" , k(k2).vminsd(xmm10, xmm1, xmm28));
+ TEST_INSTRUCTION("6211F78A5DD4" , k(k2).z().vminsd(xmm10, xmm1, xmm28));
+ TEST_INSTRUCTION("6211F7185DD4" , sae().vminsd(xmm10, xmm1, xmm28));
+ TEST_INSTRUCTION("C5735D11" , vminsd(xmm10, xmm1, qword_ptr(rcx)));
+ TEST_INSTRUCTION("C421735D94F034120000" , vminsd(xmm10, xmm1, qword_ptr(rax, r14, 3, 4660)));
+ TEST_INSTRUCTION("C5735D92F8030000" , vminsd(xmm10, xmm1, qword_ptr(rdx, 1016)));
+ TEST_INSTRUCTION("C5735D9200040000" , vminsd(xmm10, xmm1, qword_ptr(rdx, 1024)));
+ TEST_INSTRUCTION("C5735D9200FCFFFF" , vminsd(xmm10, xmm1, qword_ptr(rdx, -1024)));
+ TEST_INSTRUCTION("C5735D92F8FBFFFF" , vminsd(xmm10, xmm1, qword_ptr(rdx, -1032)));
+ TEST_INSTRUCTION("624156085DE0" , vminss(xmm28, xmm5, xmm8));
+ TEST_INSTRUCTION("6241560C5DE0" , k(k4).vminss(xmm28, xmm5, xmm8));
+ TEST_INSTRUCTION("6241568C5DE0" , k(k4).z().vminss(xmm28, xmm5, xmm8));
+ TEST_INSTRUCTION("624156185DE0" , sae().vminss(xmm28, xmm5, xmm8));
+ TEST_INSTRUCTION("626156085D21" , vminss(xmm28, xmm5, dword_ptr(rcx)));
+ TEST_INSTRUCTION("622156085DA4F034120000" , vminss(xmm28, xmm5, dword_ptr(rax, r14, 3, 4660)));
+ TEST_INSTRUCTION("626156085D627F" , vminss(xmm28, xmm5, dword_ptr(rdx, 508)));
+ TEST_INSTRUCTION("626156085DA200020000" , vminss(xmm28, xmm5, dword_ptr(rdx, 512)));
+ TEST_INSTRUCTION("626156085D6280" , vminss(xmm28, xmm5, dword_ptr(rdx, -512)));
+ TEST_INSTRUCTION("626156085DA2FCFDFFFF" , vminss(xmm28, xmm5, dword_ptr(rdx, -516)));
+ TEST_INSTRUCTION("62C1FD4828F9" , vmovapd(zmm23, zmm9));
+ TEST_INSTRUCTION("62C1FD4D28F9" , k(k5).vmovapd(zmm23, zmm9));
+ TEST_INSTRUCTION("62C1FDCD28F9" , k(k5).z().vmovapd(zmm23, zmm9));
+ TEST_INSTRUCTION("62E1FD482839" , vmovapd(zmm23, zmmword_ptr(rcx)));
+ TEST_INSTRUCTION("62A1FD4828BCF034120000" , vmovapd(zmm23, zmmword_ptr(rax, r14, 3, 4660)));
+ TEST_INSTRUCTION("62E1FD48287A7F" , vmovapd(zmm23, zmmword_ptr(rdx, 8128)));
+ TEST_INSTRUCTION("62E1FD4828BA00200000" , vmovapd(zmm23, zmmword_ptr(rdx, 8192)));
+ TEST_INSTRUCTION("62E1FD48287A80" , vmovapd(zmm23, zmmword_ptr(rdx, -8192)));
+ TEST_INSTRUCTION("62E1FD4828BAC0DFFFFF" , vmovapd(zmm23, zmmword_ptr(rdx, -8256)));
+ TEST_INSTRUCTION("62417C4828D3" , vmovaps(zmm26, zmm11));
+ TEST_INSTRUCTION("62417C4F28D3" , k(k7).vmovaps(zmm26, zmm11));
+ TEST_INSTRUCTION("62417CCF28D3" , k(k7).z().vmovaps(zmm26, zmm11));
+ TEST_INSTRUCTION("62617C482811" , vmovaps(zmm26, zmmword_ptr(rcx)));
+ TEST_INSTRUCTION("62217C482894F034120000" , vmovaps(zmm26, zmmword_ptr(rax, r14, 3, 4660)));
+ TEST_INSTRUCTION("62617C4828527F" , vmovaps(zmm26, zmmword_ptr(rdx, 8128)));
+ TEST_INSTRUCTION("62617C48289200200000" , vmovaps(zmm26, zmmword_ptr(rdx, 8192)));
+ TEST_INSTRUCTION("62617C48285280" , vmovaps(zmm26, zmmword_ptr(rdx, -8192)));
+ TEST_INSTRUCTION("62617C482892C0DFFFFF" , vmovaps(zmm26, zmmword_ptr(rdx, -8256)));
+ TEST_INSTRUCTION("C5796EF0" , vmovd(xmm14, eax));
+ TEST_INSTRUCTION("C5796EF5" , vmovd(xmm14, ebp));
+ TEST_INSTRUCTION("C441796EF5" , vmovd(xmm14, r13d));
+ TEST_INSTRUCTION("C5796E31" , vmovd(xmm14, dword_ptr(rcx)));
+ TEST_INSTRUCTION("C421796EB4F034120000" , vmovd(xmm14, dword_ptr(rax, r14, 3, 4660)));
+ TEST_INSTRUCTION("C5796EB2FC010000" , vmovd(xmm14, dword_ptr(rdx, 508)));
+ TEST_INSTRUCTION("C5796EB200020000" , vmovd(xmm14, dword_ptr(rdx, 512)));
+ TEST_INSTRUCTION("C5796EB200FEFFFF" , vmovd(xmm14, dword_ptr(rdx, -512)));
+ TEST_INSTRUCTION("C5796EB2FCFDFFFF" , vmovd(xmm14, dword_ptr(rdx, -516)));
+ TEST_INSTRUCTION("C5797E31" , vmovd(dword_ptr(rcx), xmm14));
+ TEST_INSTRUCTION("C421797EB4F034120000" , vmovd(dword_ptr(rax, r14, 3, 4660), xmm14));
+ TEST_INSTRUCTION("C5797EB2FC010000" , vmovd(dword_ptr(rdx, 508), xmm14));
+ TEST_INSTRUCTION("C5797EB200020000" , vmovd(dword_ptr(rdx, 512), xmm14));
+ TEST_INSTRUCTION("C5797EB200FEFFFF" , vmovd(dword_ptr(rdx, -512), xmm14));
+ TEST_INSTRUCTION("C5797EB2FCFDFFFF" , vmovd(dword_ptr(rdx, -516), xmm14));
+ TEST_INSTRUCTION("62D1FF4812CA" , vmovddup(zmm1, zmm10));
+ TEST_INSTRUCTION("62D1FF4B12CA" , k(k3).vmovddup(zmm1, zmm10));
+ TEST_INSTRUCTION("62D1FFCB12CA" , k(k3).z().vmovddup(zmm1, zmm10));
+ TEST_INSTRUCTION("62F1FF481209" , vmovddup(zmm1, zmmword_ptr(rcx)));
+ TEST_INSTRUCTION("62B1FF48128CF034120000" , vmovddup(zmm1, zmmword_ptr(rax, r14, 3, 4660)));
+ TEST_INSTRUCTION("62F1FF48124A7F" , vmovddup(zmm1, zmmword_ptr(rdx, 8128)));
+ TEST_INSTRUCTION("62F1FF48128A00200000" , vmovddup(zmm1, zmmword_ptr(rdx, 8192)));
+ TEST_INSTRUCTION("62F1FF48124A80" , vmovddup(zmm1, zmmword_ptr(rdx, -8192)));
+ TEST_INSTRUCTION("62F1FF48128AC0DFFFFF" , vmovddup(zmm1, zmmword_ptr(rdx, -8256)));
+ TEST_INSTRUCTION("62817D486FF5" , vmovdqa32(zmm22, zmm29));
+ TEST_INSTRUCTION("62817D4D6FF5" , k(k5).vmovdqa32(zmm22, zmm29));
+ TEST_INSTRUCTION("62817DCD6FF5" , k(k5).z().vmovdqa32(zmm22, zmm29));
+ TEST_INSTRUCTION("62E17D486F31" , vmovdqa32(zmm22, zmmword_ptr(rcx)));
+ TEST_INSTRUCTION("62A17D486FB4F034120000" , vmovdqa32(zmm22, zmmword_ptr(rax, r14, 3, 4660)));
+ TEST_INSTRUCTION("62E17D486F727F" , vmovdqa32(zmm22, zmmword_ptr(rdx, 8128)));
+ TEST_INSTRUCTION("62E17D486FB200200000" , vmovdqa32(zmm22, zmmword_ptr(rdx, 8192)));
+ TEST_INSTRUCTION("62E17D486F7280" , vmovdqa32(zmm22, zmmword_ptr(rdx, -8192)));
+ TEST_INSTRUCTION("62E17D486FB2C0DFFFFF" , vmovdqa32(zmm22, zmmword_ptr(rdx, -8256)));
+ TEST_INSTRUCTION("6271FD486FCF" , vmovdqa64(zmm9, zmm7));
+ TEST_INSTRUCTION("6271FD4A6FCF" , k(k2).vmovdqa64(zmm9, zmm7));
+ TEST_INSTRUCTION("6271FDCA6FCF" , k(k2).z().vmovdqa64(zmm9, zmm7));
+ TEST_INSTRUCTION("6271FD486F09" , vmovdqa64(zmm9, zmmword_ptr(rcx)));
+ TEST_INSTRUCTION("6231FD486F8CF034120000" , vmovdqa64(zmm9, zmmword_ptr(rax, r14, 3, 4660)));
+ TEST_INSTRUCTION("6271FD486F4A7F" , vmovdqa64(zmm9, zmmword_ptr(rdx, 8128)));
+ TEST_INSTRUCTION("6271FD486F8A00200000" , vmovdqa64(zmm9, zmmword_ptr(rdx, 8192)));
+ TEST_INSTRUCTION("6271FD486F4A80" , vmovdqa64(zmm9, zmmword_ptr(rdx, -8192)));
+ TEST_INSTRUCTION("6271FD486F8AC0DFFFFF" , vmovdqa64(zmm9, zmmword_ptr(rdx, -8256)));
+ TEST_INSTRUCTION("62B17E486FEE" , vmovdqu32(zmm5, zmm22));
+ TEST_INSTRUCTION("62B17E4D6FEE" , k(k5).vmovdqu32(zmm5, zmm22));
+ TEST_INSTRUCTION("62B17ECD6FEE" , k(k5).z().vmovdqu32(zmm5, zmm22));
+ TEST_INSTRUCTION("62F17E486F29" , vmovdqu32(zmm5, zmmword_ptr(rcx)));
+ TEST_INSTRUCTION("62B17E486FACF034120000" , vmovdqu32(zmm5, zmmword_ptr(rax, r14, 3, 4660)));
+ TEST_INSTRUCTION("62F17E486F6A7F" , vmovdqu32(zmm5, zmmword_ptr(rdx, 8128)));
+ TEST_INSTRUCTION("62F17E486FAA00200000" , vmovdqu32(zmm5, zmmword_ptr(rdx, 8192)));
+ TEST_INSTRUCTION("62F17E486F6A80" , vmovdqu32(zmm5, zmmword_ptr(rdx, -8192)));
+ TEST_INSTRUCTION("62F17E486FAAC0DFFFFF" , vmovdqu32(zmm5, zmmword_ptr(rdx, -8256)));
+ TEST_INSTRUCTION("6261FE486FE5" , vmovdqu64(zmm28, zmm5));
+ TEST_INSTRUCTION("6261FE4B6FE5" , k(k3).vmovdqu64(zmm28, zmm5));
+ TEST_INSTRUCTION("6261FECB6FE5" , k(k3).z().vmovdqu64(zmm28, zmm5));
+ TEST_INSTRUCTION("6261FE486F21" , vmovdqu64(zmm28, zmmword_ptr(rcx)));
+ TEST_INSTRUCTION("6221FE486FA4F034120000" , vmovdqu64(zmm28, zmmword_ptr(rax, r14, 3, 4660)));
+ TEST_INSTRUCTION("6261FE486F627F" , vmovdqu64(zmm28, zmmword_ptr(rdx, 8128)));
+ TEST_INSTRUCTION("6261FE486FA200200000" , vmovdqu64(zmm28, zmmword_ptr(rdx, 8192)));
+ TEST_INSTRUCTION("6261FE486F6280" , vmovdqu64(zmm28, zmmword_ptr(rdx, -8192)));
+ TEST_INSTRUCTION("6261FE486FA2C0DFFFFF" , vmovdqu64(zmm28, zmmword_ptr(rdx, -8256)));
+ TEST_INSTRUCTION("62817C0012F1" , vmovhlps(xmm22, xmm16, xmm25));
+ TEST_INSTRUCTION("6261F5081609" , vmovhpd(xmm25, xmm1, qword_ptr(rcx)));
+ TEST_INSTRUCTION("6221F508168CF034120000" , vmovhpd(xmm25, xmm1, qword_ptr(rax, r14, 3, 4660)));
+ TEST_INSTRUCTION("6261F508164A7F" , vmovhpd(xmm25, xmm1, qword_ptr(rdx, 1016)));
+ TEST_INSTRUCTION("6261F508168A00040000" , vmovhpd(xmm25, xmm1, qword_ptr(rdx, 1024)));
+ TEST_INSTRUCTION("6261F508164A80" , vmovhpd(xmm25, xmm1, qword_ptr(rdx, -1024)));
+ TEST_INSTRUCTION("6261F508168AF8FBFFFF" , vmovhpd(xmm25, xmm1, qword_ptr(rdx, -1032)));
+ TEST_INSTRUCTION("C5791709" , vmovhpd(qword_ptr(rcx), xmm9));
+ TEST_INSTRUCTION("C42179178CF034120000" , vmovhpd(qword_ptr(rax, r14, 3, 4660), xmm9));
+ TEST_INSTRUCTION("C579178AF8030000" , vmovhpd(qword_ptr(rdx, 1016), xmm9));
+ TEST_INSTRUCTION("C579178A00040000" , vmovhpd(qword_ptr(rdx, 1024), xmm9));
+ TEST_INSTRUCTION("C579178A00FCFFFF" , vmovhpd(qword_ptr(rdx, -1024), xmm9));
+ TEST_INSTRUCTION("C579178AF8FBFFFF" , vmovhpd(qword_ptr(rdx, -1032), xmm9));
+ TEST_INSTRUCTION("626174001621" , vmovhps(xmm28, xmm17, qword_ptr(rcx)));
+ TEST_INSTRUCTION("6221740016A4F034120000" , vmovhps(xmm28, xmm17, qword_ptr(rax, r14, 3, 4660)));
+ TEST_INSTRUCTION("6261740016627F" , vmovhps(xmm28, xmm17, qword_ptr(rdx, 1016)));
+ TEST_INSTRUCTION("6261740016A200040000" , vmovhps(xmm28, xmm17, qword_ptr(rdx, 1024)));
+ TEST_INSTRUCTION("62617400166280" , vmovhps(xmm28, xmm17, qword_ptr(rdx, -1024)));
+ TEST_INSTRUCTION("6261740016A2F8FBFFFF" , vmovhps(xmm28, xmm17, qword_ptr(rdx, -1032)));
+ TEST_INSTRUCTION("C5781729" , vmovhps(qword_ptr(rcx), xmm13));
+ TEST_INSTRUCTION("C4217817ACF034120000" , vmovhps(qword_ptr(rax, r14, 3, 4660), xmm13));
+ TEST_INSTRUCTION("C57817AAF8030000" , vmovhps(qword_ptr(rdx, 1016), xmm13));
+ TEST_INSTRUCTION("C57817AA00040000" , vmovhps(qword_ptr(rdx, 1024), xmm13));
+ TEST_INSTRUCTION("C57817AA00FCFFFF" , vmovhps(qword_ptr(rdx, -1024), xmm13));
+ TEST_INSTRUCTION("C57817AAF8FBFFFF" , vmovhps(qword_ptr(rdx, -1032), xmm13));
+ TEST_INSTRUCTION("C59816F6" , vmovlhps(xmm6, xmm12, xmm6));
+ TEST_INSTRUCTION("62E1DD001209" , vmovlpd(xmm17, xmm20, qword_ptr(rcx)));
+ TEST_INSTRUCTION("62A1DD00128CF034120000" , vmovlpd(xmm17, xmm20, qword_ptr(rax, r14, 3, 4660)));
+ TEST_INSTRUCTION("62E1DD00124A7F" , vmovlpd(xmm17, xmm20, qword_ptr(rdx, 1016)));
+ TEST_INSTRUCTION("62E1DD00128A00040000" , vmovlpd(xmm17, xmm20, qword_ptr(rdx, 1024)));
+ TEST_INSTRUCTION("62E1DD00124A80" , vmovlpd(xmm17, xmm20, qword_ptr(rdx, -1024)));
+ TEST_INSTRUCTION("62E1DD00128AF8FBFFFF" , vmovlpd(xmm17, xmm20, qword_ptr(rdx, -1032)));
+ TEST_INSTRUCTION("C5F91339" , vmovlpd(qword_ptr(rcx), xmm7));
+ TEST_INSTRUCTION("C4A17913BCF034120000" , vmovlpd(qword_ptr(rax, r14, 3, 4660), xmm7));
+ TEST_INSTRUCTION("C5F913BAF8030000" , vmovlpd(qword_ptr(rdx, 1016), xmm7));
+ TEST_INSTRUCTION("C5F913BA00040000" , vmovlpd(qword_ptr(rdx, 1024), xmm7));
+ TEST_INSTRUCTION("C5F913BA00FCFFFF" , vmovlpd(qword_ptr(rdx, -1024), xmm7));
+ TEST_INSTRUCTION("C5F913BAF8FBFFFF" , vmovlpd(qword_ptr(rdx, -1032), xmm7));
+ TEST_INSTRUCTION("C5201219" , vmovlps(xmm11, xmm11, qword_ptr(rcx)));
+ TEST_INSTRUCTION("C42120129CF034120000" , vmovlps(xmm11, xmm11, qword_ptr(rax, r14, 3, 4660)));
+ TEST_INSTRUCTION("C520129AF8030000" , vmovlps(xmm11, xmm11, qword_ptr(rdx, 1016)));
+ TEST_INSTRUCTION("C520129A00040000" , vmovlps(xmm11, xmm11, qword_ptr(rdx, 1024)));
+ TEST_INSTRUCTION("C520129A00FCFFFF" , vmovlps(xmm11, xmm11, qword_ptr(rdx, -1024)));
+ TEST_INSTRUCTION("C520129AF8FBFFFF" , vmovlps(xmm11, xmm11, qword_ptr(rdx, -1032)));
+ TEST_INSTRUCTION("62E17C081329" , vmovlps(qword_ptr(rcx), xmm21));
+ TEST_INSTRUCTION("62A17C0813ACF034120000" , vmovlps(qword_ptr(rax, r14, 3, 4660), xmm21));
+ TEST_INSTRUCTION("62E17C08136A7F" , vmovlps(qword_ptr(rdx, 1016), xmm21));
+ TEST_INSTRUCTION("62E17C0813AA00040000" , vmovlps(qword_ptr(rdx, 1024), xmm21));
+ TEST_INSTRUCTION("62E17C08136A80" , vmovlps(qword_ptr(rdx, -1024), xmm21));
+ TEST_INSTRUCTION("62E17C0813AAF8FBFFFF" , vmovlps(qword_ptr(rdx, -1032), xmm21));
+ TEST_INSTRUCTION("62E17D48E721" , vmovntdq(zmmword_ptr(rcx), zmm20));
+ TEST_INSTRUCTION("62A17D48E7A4F034120000" , vmovntdq(zmmword_ptr(rax, r14, 3, 4660), zmm20));
+ TEST_INSTRUCTION("62E17D48E7627F" , vmovntdq(zmmword_ptr(rdx, 8128), zmm20));
+ TEST_INSTRUCTION("62E17D48E7A200200000" , vmovntdq(zmmword_ptr(rdx, 8192), zmm20));
+ TEST_INSTRUCTION("62E17D48E76280" , vmovntdq(zmmword_ptr(rdx, -8192), zmm20));
+ TEST_INSTRUCTION("62E17D48E7A2C0DFFFFF" , vmovntdq(zmmword_ptr(rdx, -8256), zmm20));
+ TEST_INSTRUCTION("62727D482A11" , vmovntdqa(zmm10, zmmword_ptr(rcx)));
+ TEST_INSTRUCTION("62327D482A94F034120000" , vmovntdqa(zmm10, zmmword_ptr(rax, r14, 3, 4660)));
+ TEST_INSTRUCTION("62727D482A527F" , vmovntdqa(zmm10, zmmword_ptr(rdx, 8128)));
+ TEST_INSTRUCTION("62727D482A9200200000" , vmovntdqa(zmm10, zmmword_ptr(rdx, 8192)));
+ TEST_INSTRUCTION("62727D482A5280" , vmovntdqa(zmm10, zmmword_ptr(rdx, -8192)));
+ TEST_INSTRUCTION("62727D482A92C0DFFFFF" , vmovntdqa(zmm10, zmmword_ptr(rdx, -8256)));
+ TEST_INSTRUCTION("62E1FD482B29" , vmovntpd(zmmword_ptr(rcx), zmm21));
+ TEST_INSTRUCTION("62A1FD482BACF034120000" , vmovntpd(zmmword_ptr(rax, r14, 3, 4660), zmm21));
+ TEST_INSTRUCTION("62E1FD482B6A7F" , vmovntpd(zmmword_ptr(rdx, 8128), zmm21));
+ TEST_INSTRUCTION("62E1FD482BAA00200000" , vmovntpd(zmmword_ptr(rdx, 8192), zmm21));
+ TEST_INSTRUCTION("62E1FD482B6A80" , vmovntpd(zmmword_ptr(rdx, -8192), zmm21));
+ TEST_INSTRUCTION("62E1FD482BAAC0DFFFFF" , vmovntpd(zmmword_ptr(rdx, -8256), zmm21));
+ TEST_INSTRUCTION("62E17C482B39" , vmovntps(zmmword_ptr(rcx), zmm23));
+ TEST_INSTRUCTION("62A17C482BBCF034120000" , vmovntps(zmmword_ptr(rax, r14, 3, 4660), zmm23));
+ TEST_INSTRUCTION("62E17C482B7A7F" , vmovntps(zmmword_ptr(rdx, 8128), zmm23));
+ TEST_INSTRUCTION("62E17C482BBA00200000" , vmovntps(zmmword_ptr(rdx, 8192), zmm23));
+ TEST_INSTRUCTION("62E17C482B7A80" , vmovntps(zmmword_ptr(rdx, -8192), zmm23));
+ TEST_INSTRUCTION("62E17C482BBAC0DFFFFF" , vmovntps(zmmword_ptr(rdx, -8256), zmm23));
+ TEST_INSTRUCTION("6261FD086EC0" , vmovq(xmm24, rax));
+ TEST_INSTRUCTION("6241FD086EC0" , vmovq(xmm24, r8));
+ TEST_INSTRUCTION("C5FB1029" , vmovsd(xmm5, qword_ptr(rcx)));
+ TEST_INSTRUCTION("62F1FF0B1029" , k(k3).vmovsd(xmm5, qword_ptr(rcx)));
+ TEST_INSTRUCTION("62F1FF8B1029" , k(k3).z().vmovsd(xmm5, qword_ptr(rcx)));
+ TEST_INSTRUCTION("C4A17B10ACF034120000" , vmovsd(xmm5, qword_ptr(rax, r14, 3, 4660)));
+ TEST_INSTRUCTION("C5FB10AAF8030000" , vmovsd(xmm5, qword_ptr(rdx, 1016)));
+ TEST_INSTRUCTION("C5FB10AA00040000" , vmovsd(xmm5, qword_ptr(rdx, 1024)));
+ TEST_INSTRUCTION("C5FB10AA00FCFFFF" , vmovsd(xmm5, qword_ptr(rdx, -1024)));
+ TEST_INSTRUCTION("C5FB10AAF8FBFFFF" , vmovsd(xmm5, qword_ptr(rdx, -1032)));
+ TEST_INSTRUCTION("62E1FF081109" , vmovsd(qword_ptr(rcx), xmm17));
+ TEST_INSTRUCTION("62E1FF0B1109" , k(k3).vmovsd(qword_ptr(rcx), xmm17));
+ TEST_INSTRUCTION("62A1FF08118CF034120000" , vmovsd(qword_ptr(rax, r14, 3, 4660), xmm17));
+ TEST_INSTRUCTION("62E1FF08114A7F" , vmovsd(qword_ptr(rdx, 1016), xmm17));
+ TEST_INSTRUCTION("62E1FF08118A00040000" , vmovsd(qword_ptr(rdx, 1024), xmm17));
+ TEST_INSTRUCTION("62E1FF08114A80" , vmovsd(qword_ptr(rdx, -1024), xmm17));
+ TEST_INSTRUCTION("62E1FF08118AF8FBFFFF" , vmovsd(qword_ptr(rdx, -1032), xmm17));
+ TEST_INSTRUCTION("62C1970010EC" , vmovsd(xmm21, xmm29, xmm12));
+ TEST_INSTRUCTION("62C1970710EC" , k(k7).vmovsd(xmm21, xmm29, xmm12));
+ TEST_INSTRUCTION("62C1978710EC" , k(k7).z().vmovsd(xmm21, xmm29, xmm12));
+ TEST_INSTRUCTION("62A17E4816D4" , vmovshdup(zmm18, zmm20));
+ TEST_INSTRUCTION("62A17E4D16D4" , k(k5).vmovshdup(zmm18, zmm20));
+ TEST_INSTRUCTION("62A17ECD16D4" , k(k5).z().vmovshdup(zmm18, zmm20));
+ TEST_INSTRUCTION("62E17E481611" , vmovshdup(zmm18, zmmword_ptr(rcx)));
+ TEST_INSTRUCTION("62A17E481694F034120000" , vmovshdup(zmm18, zmmword_ptr(rax, r14, 3, 4660)));
+ TEST_INSTRUCTION("62E17E4816527F" , vmovshdup(zmm18, zmmword_ptr(rdx, 8128)));
+ TEST_INSTRUCTION("62E17E48169200200000" , vmovshdup(zmm18, zmmword_ptr(rdx, 8192)));
+ TEST_INSTRUCTION("62E17E48165280" , vmovshdup(zmm18, zmmword_ptr(rdx, -8192)));
+ TEST_INSTRUCTION("62E17E481692C0DFFFFF" , vmovshdup(zmm18, zmmword_ptr(rdx, -8256)));
+ TEST_INSTRUCTION("62717E4812CD" , vmovsldup(zmm9, zmm5));
+ TEST_INSTRUCTION("62717E4F12CD" , k(k7).vmovsldup(zmm9, zmm5));
+ TEST_INSTRUCTION("62717ECF12CD" , k(k7).z().vmovsldup(zmm9, zmm5));
+ TEST_INSTRUCTION("62717E481209" , vmovsldup(zmm9, zmmword_ptr(rcx)));
+ TEST_INSTRUCTION("62317E48128CF034120000" , vmovsldup(zmm9, zmmword_ptr(rax, r14, 3, 4660)));
+ TEST_INSTRUCTION("62717E48124A7F" , vmovsldup(zmm9, zmmword_ptr(rdx, 8128)));
+ TEST_INSTRUCTION("62717E48128A00200000" , vmovsldup(zmm9, zmmword_ptr(rdx, 8192)));
+ TEST_INSTRUCTION("62717E48124A80" , vmovsldup(zmm9, zmmword_ptr(rdx, -8192)));
+ TEST_INSTRUCTION("62717E48128AC0DFFFFF" , vmovsldup(zmm9, zmmword_ptr(rdx, -8256)));
+ TEST_INSTRUCTION("C5FA1009" , vmovss(xmm1, dword_ptr(rcx)));
+ TEST_INSTRUCTION("62F17E0C1009" , k(k4).vmovss(xmm1, dword_ptr(rcx)));
+ TEST_INSTRUCTION("62F17E8C1009" , k(k4).z().vmovss(xmm1, dword_ptr(rcx)));
+ TEST_INSTRUCTION("C4A17A108CF034120000" , vmovss(xmm1, dword_ptr(rax, r14, 3, 4660)));
+ TEST_INSTRUCTION("C5FA108AFC010000" , vmovss(xmm1, dword_ptr(rdx, 508)));
+ TEST_INSTRUCTION("C5FA108A00020000" , vmovss(xmm1, dword_ptr(rdx, 512)));
+ TEST_INSTRUCTION("C5FA108A00FEFFFF" , vmovss(xmm1, dword_ptr(rdx, -512)));
+ TEST_INSTRUCTION("C5FA108AFCFDFFFF" , vmovss(xmm1, dword_ptr(rdx, -516)));
+ TEST_INSTRUCTION("C57A1129" , vmovss(dword_ptr(rcx), xmm13));
+ TEST_INSTRUCTION("62717E0A1129" , k(k2).vmovss(dword_ptr(rcx), xmm13));
+ TEST_INSTRUCTION("C4217A11ACF034120000" , vmovss(dword_ptr(rax, r14, 3, 4660), xmm13));
+ TEST_INSTRUCTION("C57A11AAFC010000" , vmovss(dword_ptr(rdx, 508), xmm13));
+ TEST_INSTRUCTION("C57A11AA00020000" , vmovss(dword_ptr(rdx, 512), xmm13));
+ TEST_INSTRUCTION("C57A11AA00FEFFFF" , vmovss(dword_ptr(rdx, -512), xmm13));
+ TEST_INSTRUCTION("C57A11AAFCFDFFFF" , vmovss(dword_ptr(rdx, -516), xmm13));
+ TEST_INSTRUCTION("62C1260010D6" , vmovss(xmm18, xmm27, xmm14));
+ TEST_INSTRUCTION("62C1260210D6" , k(k2).vmovss(xmm18, xmm27, xmm14));
+ TEST_INSTRUCTION("62C1268210D6" , k(k2).z().vmovss(xmm18, xmm27, xmm14));
+ TEST_INSTRUCTION("62E1FD4810C6" , vmovupd(zmm16, zmm6));
+ TEST_INSTRUCTION("62E1FD4A10C6" , k(k2).vmovupd(zmm16, zmm6));
+ TEST_INSTRUCTION("62E1FDCA10C6" , k(k2).z().vmovupd(zmm16, zmm6));
+ TEST_INSTRUCTION("62E1FD481001" , vmovupd(zmm16, zmmword_ptr(rcx)));
+ TEST_INSTRUCTION("62A1FD481084F034120000" , vmovupd(zmm16, zmmword_ptr(rax, r14, 3, 4660)));
+ TEST_INSTRUCTION("62E1FD4810427F" , vmovupd(zmm16, zmmword_ptr(rdx, 8128)));
+ TEST_INSTRUCTION("62E1FD48108200200000" , vmovupd(zmm16, zmmword_ptr(rdx, 8192)));
+ TEST_INSTRUCTION("62E1FD48104280" , vmovupd(zmm16, zmmword_ptr(rdx, -8192)));
+ TEST_INSTRUCTION("62E1FD481082C0DFFFFF" , vmovupd(zmm16, zmmword_ptr(rdx, -8256)));
+ TEST_INSTRUCTION("62E17C4810F4" , vmovups(zmm22, zmm4));
+ TEST_INSTRUCTION("62E17C4F10F4" , k(k7).vmovups(zmm22, zmm4));
+ TEST_INSTRUCTION("62E17CCF10F4" , k(k7).z().vmovups(zmm22, zmm4));
+ TEST_INSTRUCTION("62E17C481031" , vmovups(zmm22, zmmword_ptr(rcx)));
+ TEST_INSTRUCTION("62A17C4810B4F034120000" , vmovups(zmm22, zmmword_ptr(rax, r14, 3, 4660)));
+ TEST_INSTRUCTION("62E17C4810727F" , vmovups(zmm22, zmmword_ptr(rdx, 8128)));
+ TEST_INSTRUCTION("62E17C4810B200200000" , vmovups(zmm22, zmmword_ptr(rdx, 8192)));
+ TEST_INSTRUCTION("62E17C48107280" , vmovups(zmm22, zmmword_ptr(rdx, -8192)));
+ TEST_INSTRUCTION("62E17C4810B2C0DFFFFF" , vmovups(zmm22, zmmword_ptr(rdx, -8256)));
+ TEST_INSTRUCTION("6261B54059C5" , vmulpd(zmm24, zmm25, zmm5));
+ TEST_INSTRUCTION("6261B54459C5" , k(k4).vmulpd(zmm24, zmm25, zmm5));
+ TEST_INSTRUCTION("6261B5C459C5" , k(k4).z().vmulpd(zmm24, zmm25, zmm5));
+ TEST_INSTRUCTION("6261B51059C5" , rn_sae().vmulpd(zmm24, zmm25, zmm5));
+ TEST_INSTRUCTION("6261B55059C5" , ru_sae().vmulpd(zmm24, zmm25, zmm5));
+ TEST_INSTRUCTION("6261B53059C5" , rd_sae().vmulpd(zmm24, zmm25, zmm5));
+ TEST_INSTRUCTION("6261B57059C5" , rz_sae().vmulpd(zmm24, zmm25, zmm5));
+ TEST_INSTRUCTION("6261B5405901" , vmulpd(zmm24, zmm25, zmmword_ptr(rcx)));
+ TEST_INSTRUCTION("6221B5405984F034120000" , vmulpd(zmm24, zmm25, zmmword_ptr(rax, r14, 3, 4660)));
+ TEST_INSTRUCTION("6261B5505901" , vmulpd(zmm24, zmm25, qword_ptr(rcx)._1to8()));
+ TEST_INSTRUCTION("6261B54059427F" , vmulpd(zmm24, zmm25, zmmword_ptr(rdx, 8128)));
+ TEST_INSTRUCTION("6261B540598200200000" , vmulpd(zmm24, zmm25, zmmword_ptr(rdx, 8192)));
+ TEST_INSTRUCTION("6261B540594280" , vmulpd(zmm24, zmm25, zmmword_ptr(rdx, -8192)));
+ TEST_INSTRUCTION("6261B5405982C0DFFFFF" , vmulpd(zmm24, zmm25, zmmword_ptr(rdx, -8256)));
+ TEST_INSTRUCTION("6261B55059427F" , vmulpd(zmm24, zmm25, qword_ptr(rdx, 1016)._1to8()));
+ TEST_INSTRUCTION("6261B550598200040000" , vmulpd(zmm24, zmm25, qword_ptr(rdx, 1024)._1to8()));
+ TEST_INSTRUCTION("6261B550594280" , vmulpd(zmm24, zmm25, qword_ptr(rdx, -1024)._1to8()));
+ TEST_INSTRUCTION("6261B5505982F8FBFFFF" , vmulpd(zmm24, zmm25, qword_ptr(rdx, -1032)._1to8()));
+ TEST_INSTRUCTION("62F1244059F3" , vmulps(zmm6, zmm27, zmm3));
+ TEST_INSTRUCTION("62F1244559F3" , k(k5).vmulps(zmm6, zmm27, zmm3));
+ TEST_INSTRUCTION("62F124C559F3" , k(k5).z().vmulps(zmm6, zmm27, zmm3));
+ TEST_INSTRUCTION("62F1241059F3" , rn_sae().vmulps(zmm6, zmm27, zmm3));
+ TEST_INSTRUCTION("62F1245059F3" , ru_sae().vmulps(zmm6, zmm27, zmm3));
+ TEST_INSTRUCTION("62F1243059F3" , rd_sae().vmulps(zmm6, zmm27, zmm3));
+ TEST_INSTRUCTION("62F1247059F3" , rz_sae().vmulps(zmm6, zmm27, zmm3));
+ TEST_INSTRUCTION("62F124405931" , vmulps(zmm6, zmm27, zmmword_ptr(rcx)));
+ TEST_INSTRUCTION("62B1244059B4F034120000" , vmulps(zmm6, zmm27, zmmword_ptr(rax, r14, 3, 4660)));
+ TEST_INSTRUCTION("62F124505931" , vmulps(zmm6, zmm27, dword_ptr(rcx)._1to16()));
+ TEST_INSTRUCTION("62F1244059727F" , vmulps(zmm6, zmm27, zmmword_ptr(rdx, 8128)));
+ TEST_INSTRUCTION("62F1244059B200200000" , vmulps(zmm6, zmm27, zmmword_ptr(rdx, 8192)));
+ TEST_INSTRUCTION("62F12440597280" , vmulps(zmm6, zmm27, zmmword_ptr(rdx, -8192)));
+ TEST_INSTRUCTION("62F1244059B2C0DFFFFF" , vmulps(zmm6, zmm27, zmmword_ptr(rdx, -8256)));
+ TEST_INSTRUCTION("62F1245059727F" , vmulps(zmm6, zmm27, dword_ptr(rdx, 508)._1to16()));
+ TEST_INSTRUCTION("62F1245059B200020000" , vmulps(zmm6, zmm27, dword_ptr(rdx, 512)._1to16()));
+ TEST_INSTRUCTION("62F12450597280" , vmulps(zmm6, zmm27, dword_ptr(rdx, -512)._1to16()));
+ TEST_INSTRUCTION("62F1245059B2FCFDFFFF" , vmulps(zmm6, zmm27, dword_ptr(rdx, -516)._1to16()));
+ TEST_INSTRUCTION("62A1970059FE" , vmulsd(xmm23, xmm29, xmm22));
+ TEST_INSTRUCTION("62A1970559FE" , k(k5).vmulsd(xmm23, xmm29, xmm22));
+ TEST_INSTRUCTION("62A1978559FE" , k(k5).z().vmulsd(xmm23, xmm29, xmm22));
+ TEST_INSTRUCTION("62A1971059FE" , rn_sae().vmulsd(xmm23, xmm29, xmm22));
+ TEST_INSTRUCTION("62A1975059FE" , ru_sae().vmulsd(xmm23, xmm29, xmm22));
+ TEST_INSTRUCTION("62A1973059FE" , rd_sae().vmulsd(xmm23, xmm29, xmm22));
+ TEST_INSTRUCTION("62A1977059FE" , rz_sae().vmulsd(xmm23, xmm29, xmm22));
+ TEST_INSTRUCTION("62E197005939" , vmulsd(xmm23, xmm29, qword_ptr(rcx)));
+ TEST_INSTRUCTION("62A1970059BCF034120000" , vmulsd(xmm23, xmm29, qword_ptr(rax, r14, 3, 4660)));
+ TEST_INSTRUCTION("62E19700597A7F" , vmulsd(xmm23, xmm29, qword_ptr(rdx, 1016)));
+ TEST_INSTRUCTION("62E1970059BA00040000" , vmulsd(xmm23, xmm29, qword_ptr(rdx, 1024)));
+ TEST_INSTRUCTION("62E19700597A80" , vmulsd(xmm23, xmm29, qword_ptr(rdx, -1024)));
+ TEST_INSTRUCTION("62E1970059BAF8FBFFFF" , vmulsd(xmm23, xmm29, qword_ptr(rdx, -1032)));
+ TEST_INSTRUCTION("62412E0059C8" , vmulss(xmm25, xmm26, xmm8));
+ TEST_INSTRUCTION("62412E0559C8" , k(k5).vmulss(xmm25, xmm26, xmm8));
+ TEST_INSTRUCTION("62412E8559C8" , k(k5).z().vmulss(xmm25, xmm26, xmm8));
+ TEST_INSTRUCTION("62412E1059C8" , rn_sae().vmulss(xmm25, xmm26, xmm8));
+ TEST_INSTRUCTION("62412E5059C8" , ru_sae().vmulss(xmm25, xmm26, xmm8));
+ TEST_INSTRUCTION("62412E3059C8" , rd_sae().vmulss(xmm25, xmm26, xmm8));
+ TEST_INSTRUCTION("62412E7059C8" , rz_sae().vmulss(xmm25, xmm26, xmm8));
+ TEST_INSTRUCTION("62612E005909" , vmulss(xmm25, xmm26, dword_ptr(rcx)));
+ TEST_INSTRUCTION("62212E00598CF034120000" , vmulss(xmm25, xmm26, dword_ptr(rax, r14, 3, 4660)));
+ TEST_INSTRUCTION("62612E00594A7F" , vmulss(xmm25, xmm26, dword_ptr(rdx, 508)));
+ TEST_INSTRUCTION("62612E00598A00020000" , vmulss(xmm25, xmm26, dword_ptr(rdx, 512)));
+ TEST_INSTRUCTION("62612E00594A80" , vmulss(xmm25, xmm26, dword_ptr(rdx, -512)));
+ TEST_INSTRUCTION("62612E00598AFCFDFFFF" , vmulss(xmm25, xmm26, dword_ptr(rdx, -516)));
+ TEST_INSTRUCTION("62927D481EE5" , vpabsd(zmm4, zmm29));
+ TEST_INSTRUCTION("62927D4C1EE5" , k(k4).vpabsd(zmm4, zmm29));
+ TEST_INSTRUCTION("62927DCC1EE5" , k(k4).z().vpabsd(zmm4, zmm29));
+ TEST_INSTRUCTION("62F27D481E21" , vpabsd(zmm4, zmmword_ptr(rcx)));
+ TEST_INSTRUCTION("62B27D481EA4F034120000" , vpabsd(zmm4, zmmword_ptr(rax, r14, 3, 4660)));
+ TEST_INSTRUCTION("62F27D581E21" , vpabsd(zmm4, dword_ptr(rcx)._1to16()));
+ TEST_INSTRUCTION("62F27D481E627F" , vpabsd(zmm4, zmmword_ptr(rdx, 8128)));
+ TEST_INSTRUCTION("62F27D481EA200200000" , vpabsd(zmm4, zmmword_ptr(rdx, 8192)));
+ TEST_INSTRUCTION("62F27D481E6280" , vpabsd(zmm4, zmmword_ptr(rdx, -8192)));
+ TEST_INSTRUCTION("62F27D481EA2C0DFFFFF" , vpabsd(zmm4, zmmword_ptr(rdx, -8256)));
+ TEST_INSTRUCTION("62F27D581E627F" , vpabsd(zmm4, dword_ptr(rdx, 508)._1to16()));
+ TEST_INSTRUCTION("62F27D581EA200020000" , vpabsd(zmm4, dword_ptr(rdx, 512)._1to16()));
+ TEST_INSTRUCTION("62F27D581E6280" , vpabsd(zmm4, dword_ptr(rdx, -512)._1to16()));
+ TEST_INSTRUCTION("62F27D581EA2FCFDFFFF" , vpabsd(zmm4, dword_ptr(rdx, -516)._1to16()));
+ TEST_INSTRUCTION("62E2FD481FCB" , vpabsq(zmm17, zmm3));
+ TEST_INSTRUCTION("62E2FD4A1FCB" , k(k2).vpabsq(zmm17, zmm3));
+ TEST_INSTRUCTION("62E2FDCA1FCB" , k(k2).z().vpabsq(zmm17, zmm3));
+ TEST_INSTRUCTION("62E2FD481F09" , vpabsq(zmm17, zmmword_ptr(rcx)));
+ TEST_INSTRUCTION("62A2FD481F8CF034120000" , vpabsq(zmm17, zmmword_ptr(rax, r14, 3, 4660)));
+ TEST_INSTRUCTION("62E2FD581F09" , vpabsq(zmm17, qword_ptr(rcx)._1to8()));
+ TEST_INSTRUCTION("62E2FD481F4A7F" , vpabsq(zmm17, zmmword_ptr(rdx, 8128)));
+ TEST_INSTRUCTION("62E2FD481F8A00200000" , vpabsq(zmm17, zmmword_ptr(rdx, 8192)));
+ TEST_INSTRUCTION("62E2FD481F4A80" , vpabsq(zmm17, zmmword_ptr(rdx, -8192)));
+ TEST_INSTRUCTION("62E2FD481F8AC0DFFFFF" , vpabsq(zmm17, zmmword_ptr(rdx, -8256)));
+ TEST_INSTRUCTION("62E2FD581F4A7F" , vpabsq(zmm17, qword_ptr(rdx, 1016)._1to8()));
+ TEST_INSTRUCTION("62E2FD581F8A00040000" , vpabsq(zmm17, qword_ptr(rdx, 1024)._1to8()));
+ TEST_INSTRUCTION("62E2FD581F4A80" , vpabsq(zmm17, qword_ptr(rdx, -1024)._1to8()));
+ TEST_INSTRUCTION("62E2FD581F8AF8FBFFFF" , vpabsq(zmm17, qword_ptr(rdx, -1032)._1to8()));
+ TEST_INSTRUCTION("62513D48FED3" , vpaddd(zmm10, zmm8, zmm11));
+ TEST_INSTRUCTION("62513D4FFED3" , k(k7).vpaddd(zmm10, zmm8, zmm11));
+ TEST_INSTRUCTION("62513DCFFED3" , k(k7).z().vpaddd(zmm10, zmm8, zmm11));
+ TEST_INSTRUCTION("62713D48FE11" , vpaddd(zmm10, zmm8, zmmword_ptr(rcx)));
+ TEST_INSTRUCTION("62313D48FE94F034120000" , vpaddd(zmm10, zmm8, zmmword_ptr(rax, r14, 3, 4660)));
+ TEST_INSTRUCTION("62713D58FE11" , vpaddd(zmm10, zmm8, dword_ptr(rcx)._1to16()));
+ TEST_INSTRUCTION("62713D48FE527F" , vpaddd(zmm10, zmm8, zmmword_ptr(rdx, 8128)));
+ TEST_INSTRUCTION("62713D48FE9200200000" , vpaddd(zmm10, zmm8, zmmword_ptr(rdx, 8192)));
+ TEST_INSTRUCTION("62713D48FE5280" , vpaddd(zmm10, zmm8, zmmword_ptr(rdx, -8192)));
+ TEST_INSTRUCTION("62713D48FE92C0DFFFFF" , vpaddd(zmm10, zmm8, zmmword_ptr(rdx, -8256)));
+ TEST_INSTRUCTION("62713D58FE527F" , vpaddd(zmm10, zmm8, dword_ptr(rdx, 508)._1to16()));
+ TEST_INSTRUCTION("62713D58FE9200020000" , vpaddd(zmm10, zmm8, dword_ptr(rdx, 512)._1to16()));
+ TEST_INSTRUCTION("62713D58FE5280" , vpaddd(zmm10, zmm8, dword_ptr(rdx, -512)._1to16()));
+ TEST_INSTRUCTION("62713D58FE92FCFDFFFF" , vpaddd(zmm10, zmm8, dword_ptr(rdx, -516)._1to16()));
+ TEST_INSTRUCTION("6291DD48D4F2" , vpaddq(zmm6, zmm4, zmm26));
+ TEST_INSTRUCTION("6291DD4BD4F2" , k(k3).vpaddq(zmm6, zmm4, zmm26));
+ TEST_INSTRUCTION("6291DDCBD4F2" , k(k3).z().vpaddq(zmm6, zmm4, zmm26));
+ TEST_INSTRUCTION("62F1DD48D431" , vpaddq(zmm6, zmm4, zmmword_ptr(rcx)));
+ TEST_INSTRUCTION("62B1DD48D4B4F034120000" , vpaddq(zmm6, zmm4, zmmword_ptr(rax, r14, 3, 4660)));
+ TEST_INSTRUCTION("62F1DD58D431" , vpaddq(zmm6, zmm4, qword_ptr(rcx)._1to8()));
+ TEST_INSTRUCTION("62F1DD48D4727F" , vpaddq(zmm6, zmm4, zmmword_ptr(rdx, 8128)));
+ TEST_INSTRUCTION("62F1DD48D4B200200000" , vpaddq(zmm6, zmm4, zmmword_ptr(rdx, 8192)));
+ TEST_INSTRUCTION("62F1DD48D47280" , vpaddq(zmm6, zmm4, zmmword_ptr(rdx, -8192)));
+ TEST_INSTRUCTION("62F1DD48D4B2C0DFFFFF" , vpaddq(zmm6, zmm4, zmmword_ptr(rdx, -8256)));
+ TEST_INSTRUCTION("62F1DD58D4727F" , vpaddq(zmm6, zmm4, qword_ptr(rdx, 1016)._1to8()));
+ TEST_INSTRUCTION("62F1DD58D4B200040000" , vpaddq(zmm6, zmm4, qword_ptr(rdx, 1024)._1to8()));
+ TEST_INSTRUCTION("62F1DD58D47280" , vpaddq(zmm6, zmm4, qword_ptr(rdx, -1024)._1to8()));
+ TEST_INSTRUCTION("62F1DD58D4B2F8FBFFFF" , vpaddq(zmm6, zmm4, qword_ptr(rdx, -1032)._1to8()));
+ TEST_INSTRUCTION("62B11540DBC8" , vpandd(zmm1, zmm29, zmm16));
+ TEST_INSTRUCTION("62B11542DBC8" , k(k2).vpandd(zmm1, zmm29, zmm16));
+ TEST_INSTRUCTION("62B115C2DBC8" , k(k2).z().vpandd(zmm1, zmm29, zmm16));
+ TEST_INSTRUCTION("62F11540DB09" , vpandd(zmm1, zmm29, zmmword_ptr(rcx)));
+ TEST_INSTRUCTION("62B11540DB8CF034120000" , vpandd(zmm1, zmm29, zmmword_ptr(rax, r14, 3, 4660)));
+ TEST_INSTRUCTION("62F11550DB09" , vpandd(zmm1, zmm29, dword_ptr(rcx)._1to16()));
+ TEST_INSTRUCTION("62F11540DB4A7F" , vpandd(zmm1, zmm29, zmmword_ptr(rdx, 8128)));
+ TEST_INSTRUCTION("62F11540DB8A00200000" , vpandd(zmm1, zmm29, zmmword_ptr(rdx, 8192)));
+ TEST_INSTRUCTION("62F11540DB4A80" , vpandd(zmm1, zmm29, zmmword_ptr(rdx, -8192)));
+ TEST_INSTRUCTION("62F11540DB8AC0DFFFFF" , vpandd(zmm1, zmm29, zmmword_ptr(rdx, -8256)));
+ TEST_INSTRUCTION("62F11550DB4A7F" , vpandd(zmm1, zmm29, dword_ptr(rdx, 508)._1to16()));
+ TEST_INSTRUCTION("62F11550DB8A00020000" , vpandd(zmm1, zmm29, dword_ptr(rdx, 512)._1to16()));
+ TEST_INSTRUCTION("62F11550DB4A80" , vpandd(zmm1, zmm29, dword_ptr(rdx, -512)._1to16()));
+ TEST_INSTRUCTION("62F11550DB8AFCFDFFFF" , vpandd(zmm1, zmm29, dword_ptr(rdx, -516)._1to16()));
+ TEST_INSTRUCTION("62A17540DFF0" , vpandnd(zmm22, zmm17, zmm16));
+ TEST_INSTRUCTION("62A17545DFF0" , k(k5).vpandnd(zmm22, zmm17, zmm16));
+ TEST_INSTRUCTION("62A175C5DFF0" , k(k5).z().vpandnd(zmm22, zmm17, zmm16));
+ TEST_INSTRUCTION("62E17540DF31" , vpandnd(zmm22, zmm17, zmmword_ptr(rcx)));
+ TEST_INSTRUCTION("62A17540DFB4F034120000" , vpandnd(zmm22, zmm17, zmmword_ptr(rax, r14, 3, 4660)));
+ TEST_INSTRUCTION("62E17550DF31" , vpandnd(zmm22, zmm17, dword_ptr(rcx)._1to16()));
+ TEST_INSTRUCTION("62E17540DF727F" , vpandnd(zmm22, zmm17, zmmword_ptr(rdx, 8128)));
+ TEST_INSTRUCTION("62E17540DFB200200000" , vpandnd(zmm22, zmm17, zmmword_ptr(rdx, 8192)));
+ TEST_INSTRUCTION("62E17540DF7280" , vpandnd(zmm22, zmm17, zmmword_ptr(rdx, -8192)));
+ TEST_INSTRUCTION("62E17540DFB2C0DFFFFF" , vpandnd(zmm22, zmm17, zmmword_ptr(rdx, -8256)));
+ TEST_INSTRUCTION("62E17550DF727F" , vpandnd(zmm22, zmm17, dword_ptr(rdx, 508)._1to16()));
+ TEST_INSTRUCTION("62E17550DFB200020000" , vpandnd(zmm22, zmm17, dword_ptr(rdx, 512)._1to16()));
+ TEST_INSTRUCTION("62E17550DF7280" , vpandnd(zmm22, zmm17, dword_ptr(rdx, -512)._1to16()));
+ TEST_INSTRUCTION("62E17550DFB2FCFDFFFF" , vpandnd(zmm22, zmm17, dword_ptr(rdx, -516)._1to16()));
+ TEST_INSTRUCTION("6261DD48DFCA" , vpandnq(zmm25, zmm4, zmm2));
+ TEST_INSTRUCTION("6261DD4BDFCA" , k(k3).vpandnq(zmm25, zmm4, zmm2));
+ TEST_INSTRUCTION("6261DDCBDFCA" , k(k3).z().vpandnq(zmm25, zmm4, zmm2));
+ TEST_INSTRUCTION("6261DD48DF09" , vpandnq(zmm25, zmm4, zmmword_ptr(rcx)));
+ TEST_INSTRUCTION("6221DD48DF8CF034120000" , vpandnq(zmm25, zmm4, zmmword_ptr(rax, r14, 3, 4660)));
+ TEST_INSTRUCTION("6261DD58DF09" , vpandnq(zmm25, zmm4, qword_ptr(rcx)._1to8()));
+ TEST_INSTRUCTION("6261DD48DF4A7F" , vpandnq(zmm25, zmm4, zmmword_ptr(rdx, 8128)));
+ TEST_INSTRUCTION("6261DD48DF8A00200000" , vpandnq(zmm25, zmm4, zmmword_ptr(rdx, 8192)));
+ TEST_INSTRUCTION("6261DD48DF4A80" , vpandnq(zmm25, zmm4, zmmword_ptr(rdx, -8192)));
+ TEST_INSTRUCTION("6261DD48DF8AC0DFFFFF" , vpandnq(zmm25, zmm4, zmmword_ptr(rdx, -8256)));
+ TEST_INSTRUCTION("6261DD58DF4A7F" , vpandnq(zmm25, zmm4, qword_ptr(rdx, 1016)._1to8()));
+ TEST_INSTRUCTION("6261DD58DF8A00040000" , vpandnq(zmm25, zmm4, qword_ptr(rdx, 1024)._1to8()));
+ TEST_INSTRUCTION("6261DD58DF4A80" , vpandnq(zmm25, zmm4, qword_ptr(rdx, -1024)._1to8()));
+ TEST_INSTRUCTION("6261DD58DF8AF8FBFFFF" , vpandnq(zmm25, zmm4, qword_ptr(rdx, -1032)._1to8()));
+ TEST_INSTRUCTION("62419D48DBD9" , vpandq(zmm27, zmm12, zmm9));
+ TEST_INSTRUCTION("62419D4ADBD9" , k(k2).vpandq(zmm27, zmm12, zmm9));
+ TEST_INSTRUCTION("62419DCADBD9" , k(k2).z().vpandq(zmm27, zmm12, zmm9));
+ TEST_INSTRUCTION("62619D48DB19" , vpandq(zmm27, zmm12, zmmword_ptr(rcx)));
+ TEST_INSTRUCTION("62219D48DB9CF034120000" , vpandq(zmm27, zmm12, zmmword_ptr(rax, r14, 3, 4660)));
+ TEST_INSTRUCTION("62619D58DB19" , vpandq(zmm27, zmm12, qword_ptr(rcx)._1to8()));
+ TEST_INSTRUCTION("62619D48DB5A7F" , vpandq(zmm27, zmm12, zmmword_ptr(rdx, 8128)));
+ TEST_INSTRUCTION("62619D48DB9A00200000" , vpandq(zmm27, zmm12, zmmword_ptr(rdx, 8192)));
+ TEST_INSTRUCTION("62619D48DB5A80" , vpandq(zmm27, zmm12, zmmword_ptr(rdx, -8192)));
+ TEST_INSTRUCTION("62619D48DB9AC0DFFFFF" , vpandq(zmm27, zmm12, zmmword_ptr(rdx, -8256)));
+ TEST_INSTRUCTION("62619D58DB5A7F" , vpandq(zmm27, zmm12, qword_ptr(rdx, 1016)._1to8()));
+ TEST_INSTRUCTION("62619D58DB9A00040000" , vpandq(zmm27, zmm12, qword_ptr(rdx, 1024)._1to8()));
+ TEST_INSTRUCTION("62619D58DB5A80" , vpandq(zmm27, zmm12, qword_ptr(rdx, -1024)._1to8()));
+ TEST_INSTRUCTION("62619D58DB9AF8FBFFFF" , vpandq(zmm27, zmm12, qword_ptr(rdx, -1032)._1to8()));
+ TEST_INSTRUCTION("62C23D4064FC" , vpblendmd(zmm23, zmm24, zmm12));
+ TEST_INSTRUCTION("62C23D4164FC" , k(k1).vpblendmd(zmm23, zmm24, zmm12));
+ TEST_INSTRUCTION("62C23DC164FC" , k(k1).z().vpblendmd(zmm23, zmm24, zmm12));
+ TEST_INSTRUCTION("62E23D406439" , vpblendmd(zmm23, zmm24, zmmword_ptr(rcx)));
+ TEST_INSTRUCTION("62A23D4064BCF034120000" , vpblendmd(zmm23, zmm24, zmmword_ptr(rax, r14, 3, 4660)));
+ TEST_INSTRUCTION("62E23D506439" , vpblendmd(zmm23, zmm24, dword_ptr(rcx)._1to16()));
+ TEST_INSTRUCTION("62E23D40647A7F" , vpblendmd(zmm23, zmm24, zmmword_ptr(rdx, 8128)));
+ TEST_INSTRUCTION("62E23D4064BA00200000" , vpblendmd(zmm23, zmm24, zmmword_ptr(rdx, 8192)));
+ TEST_INSTRUCTION("62E23D40647A80" , vpblendmd(zmm23, zmm24, zmmword_ptr(rdx, -8192)));
+ TEST_INSTRUCTION("62E23D4064BAC0DFFFFF" , vpblendmd(zmm23, zmm24, zmmword_ptr(rdx, -8256)));
+ TEST_INSTRUCTION("62E23D50647A7F" , vpblendmd(zmm23, zmm24, dword_ptr(rdx, 508)._1to16()));
+ TEST_INSTRUCTION("62E23D5064BA00020000" , vpblendmd(zmm23, zmm24, dword_ptr(rdx, 512)._1to16()));
+ TEST_INSTRUCTION("62E23D50647A80" , vpblendmd(zmm23, zmm24, dword_ptr(rdx, -512)._1to16()));
+ TEST_INSTRUCTION("62E23D5064BAFCFDFFFF" , vpblendmd(zmm23, zmm24, dword_ptr(rdx, -516)._1to16()));
+ TEST_INSTRUCTION("62E27D485819" , vpbroadcastd(zmm19, dword_ptr(rcx)));
+ TEST_INSTRUCTION("62E27D4D5819" , k(k5).vpbroadcastd(zmm19, dword_ptr(rcx)));
+ TEST_INSTRUCTION("62E27DCD5819" , k(k5).z().vpbroadcastd(zmm19, dword_ptr(rcx)));
+ TEST_INSTRUCTION("62A27D48589CF034120000" , vpbroadcastd(zmm19, dword_ptr(rax, r14, 3, 4660)));
+ TEST_INSTRUCTION("62E27D48585A7F" , vpbroadcastd(zmm19, dword_ptr(rdx, 508)));
+ TEST_INSTRUCTION("62E27D48589A00020000" , vpbroadcastd(zmm19, dword_ptr(rdx, 512)));
+ TEST_INSTRUCTION("62E27D48585A80" , vpbroadcastd(zmm19, dword_ptr(rdx, -512)));
+ TEST_INSTRUCTION("62E27D48589AFCFDFFFF" , vpbroadcastd(zmm19, dword_ptr(rdx, -516)));
+ TEST_INSTRUCTION("62F27D4858D9" , vpbroadcastd(zmm3, xmm1));
+ TEST_INSTRUCTION("62F27D4E58D9" , k(k6).vpbroadcastd(zmm3, xmm1));
+ TEST_INSTRUCTION("62F27DCE58D9" , k(k6).z().vpbroadcastd(zmm3, xmm1));
+ TEST_INSTRUCTION("62727D487CC0" , vpbroadcastd(zmm8, eax));
+ TEST_INSTRUCTION("62727D4B7CC0" , k(k3).vpbroadcastd(zmm8, eax));
+ TEST_INSTRUCTION("62727DCB7CC0" , k(k3).z().vpbroadcastd(zmm8, eax));
+ TEST_INSTRUCTION("62727D487CC5" , vpbroadcastd(zmm8, ebp));
+ TEST_INSTRUCTION("62527D487CC5" , vpbroadcastd(zmm8, r13d));
+ TEST_INSTRUCTION("6272FD485931" , vpbroadcastq(zmm14, qword_ptr(rcx)));
+ TEST_INSTRUCTION("6272FD4D5931" , k(k5).vpbroadcastq(zmm14, qword_ptr(rcx)));
+ TEST_INSTRUCTION("6272FDCD5931" , k(k5).z().vpbroadcastq(zmm14, qword_ptr(rcx)));
+ TEST_INSTRUCTION("6232FD4859B4F034120000" , vpbroadcastq(zmm14, qword_ptr(rax, r14, 3, 4660)));
+ TEST_INSTRUCTION("6272FD4859727F" , vpbroadcastq(zmm14, qword_ptr(rdx, 1016)));
+ TEST_INSTRUCTION("6272FD4859B200040000" , vpbroadcastq(zmm14, qword_ptr(rdx, 1024)));
+ TEST_INSTRUCTION("6272FD48597280" , vpbroadcastq(zmm14, qword_ptr(rdx, -1024)));
+ TEST_INSTRUCTION("6272FD4859B2F8FBFFFF" , vpbroadcastq(zmm14, qword_ptr(rdx, -1032)));
+ TEST_INSTRUCTION("6272FD4859C4" , vpbroadcastq(zmm8, xmm4));
+ TEST_INSTRUCTION("6272FD4B59C4" , k(k3).vpbroadcastq(zmm8, xmm4));
+ TEST_INSTRUCTION("6272FDCB59C4" , k(k3).z().vpbroadcastq(zmm8, xmm4));
+ TEST_INSTRUCTION("62F2FD487CE8" , vpbroadcastq(zmm5, rax));
+ TEST_INSTRUCTION("62F2FD4E7CE8" , k(k6).vpbroadcastq(zmm5, rax));
+ TEST_INSTRUCTION("62F2FDCE7CE8" , k(k6).z().vpbroadcastq(zmm5, rax));
+ TEST_INSTRUCTION("62D2FD487CE8" , vpbroadcastq(zmm5, r8));
+ TEST_INSTRUCTION("62B335401FD6AB" , vpcmpd(k2, zmm25, zmm22, 171));
+ TEST_INSTRUCTION("62B335431FD6AB" , k(k3).vpcmpd(k2, zmm25, zmm22, 171));
+ TEST_INSTRUCTION("62B335401FD67B" , vpcmpd(k2, zmm25, zmm22, 123));
+ TEST_INSTRUCTION("62F335401F117B" , vpcmpd(k2, zmm25, zmmword_ptr(rcx), 123));
+ TEST_INSTRUCTION("62B335401F94F0341200007B" , vpcmpd(k2, zmm25, zmmword_ptr(rax, r14, 3, 4660), 123));
+ TEST_INSTRUCTION("62F335501F117B" , vpcmpd(k2, zmm25, dword_ptr(rcx)._1to16(), 123));
+ TEST_INSTRUCTION("62F335401F527F7B" , vpcmpd(k2, zmm25, zmmword_ptr(rdx, 8128), 123));
+ TEST_INSTRUCTION("62F335401F92002000007B" , vpcmpd(k2, zmm25, zmmword_ptr(rdx, 8192), 123));
+ TEST_INSTRUCTION("62F335401F52807B" , vpcmpd(k2, zmm25, zmmword_ptr(rdx, -8192), 123));
+ TEST_INSTRUCTION("62F335401F92C0DFFFFF7B" , vpcmpd(k2, zmm25, zmmword_ptr(rdx, -8256), 123));
+ TEST_INSTRUCTION("62F335501F527F7B" , vpcmpd(k2, zmm25, dword_ptr(rdx, 508)._1to16(), 123));
+ TEST_INSTRUCTION("62F335501F92000200007B" , vpcmpd(k2, zmm25, dword_ptr(rdx, 512)._1to16(), 123));
+ TEST_INSTRUCTION("62F335501F52807B" , vpcmpd(k2, zmm25, dword_ptr(rdx, -512)._1to16(), 123));
+ TEST_INSTRUCTION("62F335501F92FCFDFFFF7B" , vpcmpd(k2, zmm25, dword_ptr(rdx, -516)._1to16(), 123));
+ TEST_INSTRUCTION("62B13D4876ED" , vpcmpeqd(k5, zmm8, zmm21));
+ TEST_INSTRUCTION("62B13D4C76ED" , k(k4).vpcmpeqd(k5, zmm8, zmm21));
+ TEST_INSTRUCTION("62F13D487629" , vpcmpeqd(k5, zmm8, zmmword_ptr(rcx)));
+ TEST_INSTRUCTION("62B13D4876ACF034120000" , vpcmpeqd(k5, zmm8, zmmword_ptr(rax, r14, 3, 4660)));
+ TEST_INSTRUCTION("62F13D587629" , vpcmpeqd(k5, zmm8, dword_ptr(rcx)._1to16()));
+ TEST_INSTRUCTION("62F13D48766A7F" , vpcmpeqd(k5, zmm8, zmmword_ptr(rdx, 8128)));
+ TEST_INSTRUCTION("62F13D4876AA00200000" , vpcmpeqd(k5, zmm8, zmmword_ptr(rdx, 8192)));
+ TEST_INSTRUCTION("62F13D48766A80" , vpcmpeqd(k5, zmm8, zmmword_ptr(rdx, -8192)));
+ TEST_INSTRUCTION("62F13D4876AAC0DFFFFF" , vpcmpeqd(k5, zmm8, zmmword_ptr(rdx, -8256)));
+ TEST_INSTRUCTION("62F13D58766A7F" , vpcmpeqd(k5, zmm8, dword_ptr(rdx, 508)._1to16()));
+ TEST_INSTRUCTION("62F13D5876AA00020000" , vpcmpeqd(k5, zmm8, dword_ptr(rdx, 512)._1to16()));
+ TEST_INSTRUCTION("62F13D58766A80" , vpcmpeqd(k5, zmm8, dword_ptr(rdx, -512)._1to16()));
+ TEST_INSTRUCTION("62F13D5876AAFCFDFFFF" , vpcmpeqd(k5, zmm8, dword_ptr(rdx, -516)._1to16()));
+ TEST_INSTRUCTION("62D28D4829E1" , vpcmpeqq(k4, zmm14, zmm9));
+ TEST_INSTRUCTION("62D28D4E29E1" , k(k6).vpcmpeqq(k4, zmm14, zmm9));
+ TEST_INSTRUCTION("62F28D482921" , vpcmpeqq(k4, zmm14, zmmword_ptr(rcx)));
+ TEST_INSTRUCTION("62B28D4829A4F034120000" , vpcmpeqq(k4, zmm14, zmmword_ptr(rax, r14, 3, 4660)));
+ TEST_INSTRUCTION("62F28D582921" , vpcmpeqq(k4, zmm14, qword_ptr(rcx)._1to8()));
+ TEST_INSTRUCTION("62F28D4829627F" , vpcmpeqq(k4, zmm14, zmmword_ptr(rdx, 8128)));
+ TEST_INSTRUCTION("62F28D4829A200200000" , vpcmpeqq(k4, zmm14, zmmword_ptr(rdx, 8192)));
+ TEST_INSTRUCTION("62F28D48296280" , vpcmpeqq(k4, zmm14, zmmword_ptr(rdx, -8192)));
+ TEST_INSTRUCTION("62F28D4829A2C0DFFFFF" , vpcmpeqq(k4, zmm14, zmmword_ptr(rdx, -8256)));
+ TEST_INSTRUCTION("62F28D5829627F" , vpcmpeqq(k4, zmm14, qword_ptr(rdx, 1016)._1to8()));
+ TEST_INSTRUCTION("62F28D5829A200040000" , vpcmpeqq(k4, zmm14, qword_ptr(rdx, 1024)._1to8()));
+ TEST_INSTRUCTION("62F28D58296280" , vpcmpeqq(k4, zmm14, qword_ptr(rdx, -1024)._1to8()));
+ TEST_INSTRUCTION("62F28D5829A2F8FBFFFF" , vpcmpeqq(k4, zmm14, qword_ptr(rdx, -1032)._1to8()));
+ TEST_INSTRUCTION("62D13D4866E0" , vpcmpgtd(k4, zmm8, zmm8));
+ TEST_INSTRUCTION("62D13D4F66E0" , k(k7).vpcmpgtd(k4, zmm8, zmm8));
+ TEST_INSTRUCTION("62F13D486621" , vpcmpgtd(k4, zmm8, zmmword_ptr(rcx)));
+ TEST_INSTRUCTION("62B13D4866A4F034120000" , vpcmpgtd(k4, zmm8, zmmword_ptr(rax, r14, 3, 4660)));
+ TEST_INSTRUCTION("62F13D586621" , vpcmpgtd(k4, zmm8, dword_ptr(rcx)._1to16()));
+ TEST_INSTRUCTION("62F13D4866627F" , vpcmpgtd(k4, zmm8, zmmword_ptr(rdx, 8128)));
+ TEST_INSTRUCTION("62F13D4866A200200000" , vpcmpgtd(k4, zmm8, zmmword_ptr(rdx, 8192)));
+ TEST_INSTRUCTION("62F13D48666280" , vpcmpgtd(k4, zmm8, zmmword_ptr(rdx, -8192)));
+ TEST_INSTRUCTION("62F13D4866A2C0DFFFFF" , vpcmpgtd(k4, zmm8, zmmword_ptr(rdx, -8256)));
+ TEST_INSTRUCTION("62F13D5866627F" , vpcmpgtd(k4, zmm8, dword_ptr(rdx, 508)._1to16()));
+ TEST_INSTRUCTION("62F13D5866A200020000" , vpcmpgtd(k4, zmm8, dword_ptr(rdx, 512)._1to16()));
+ TEST_INSTRUCTION("62F13D58666280" , vpcmpgtd(k4, zmm8, dword_ptr(rdx, -512)._1to16()));
+ TEST_INSTRUCTION("62F13D5866A2FCFDFFFF" , vpcmpgtd(k4, zmm8, dword_ptr(rdx, -516)._1to16()));
+ TEST_INSTRUCTION("62929D4837DA" , vpcmpgtq(k3, zmm12, zmm26));
+ TEST_INSTRUCTION("62929D4C37DA" , k(k4).vpcmpgtq(k3, zmm12, zmm26));
+ TEST_INSTRUCTION("62F29D483719" , vpcmpgtq(k3, zmm12, zmmword_ptr(rcx)));
+ TEST_INSTRUCTION("62B29D48379CF034120000" , vpcmpgtq(k3, zmm12, zmmword_ptr(rax, r14, 3, 4660)));
+ TEST_INSTRUCTION("62F29D583719" , vpcmpgtq(k3, zmm12, qword_ptr(rcx)._1to8()));
+ TEST_INSTRUCTION("62F29D48375A7F" , vpcmpgtq(k3, zmm12, zmmword_ptr(rdx, 8128)));
+ TEST_INSTRUCTION("62F29D48379A00200000" , vpcmpgtq(k3, zmm12, zmmword_ptr(rdx, 8192)));
+ TEST_INSTRUCTION("62F29D48375A80" , vpcmpgtq(k3, zmm12, zmmword_ptr(rdx, -8192)));
+ TEST_INSTRUCTION("62F29D48379AC0DFFFFF" , vpcmpgtq(k3, zmm12, zmmword_ptr(rdx, -8256)));
+ TEST_INSTRUCTION("62F29D58375A7F" , vpcmpgtq(k3, zmm12, qword_ptr(rdx, 1016)._1to8()));
+ TEST_INSTRUCTION("62F29D58379A00040000" , vpcmpgtq(k3, zmm12, qword_ptr(rdx, 1024)._1to8()));
+ TEST_INSTRUCTION("62F29D58375A80" , vpcmpgtq(k3, zmm12, qword_ptr(rdx, -1024)._1to8()));
+ TEST_INSTRUCTION("62F29D58379AF8FBFFFF" , vpcmpgtq(k3, zmm12, qword_ptr(rdx, -1032)._1to8()));
+ TEST_INSTRUCTION("62D3B5401FDFAB" , vpcmpq(k3, zmm25, zmm15, 171));
+ TEST_INSTRUCTION("62D3B5441FDFAB" , k(k4).vpcmpq(k3, zmm25, zmm15, 171));
+ TEST_INSTRUCTION("62D3B5401FDF7B" , vpcmpq(k3, zmm25, zmm15, 123));
+ TEST_INSTRUCTION("62F3B5401F197B" , vpcmpq(k3, zmm25, zmmword_ptr(rcx), 123));
+ TEST_INSTRUCTION("62B3B5401F9CF0341200007B" , vpcmpq(k3, zmm25, zmmword_ptr(rax, r14, 3, 4660), 123));
+ TEST_INSTRUCTION("62F3B5501F197B" , vpcmpq(k3, zmm25, qword_ptr(rcx)._1to8(), 123));
+ TEST_INSTRUCTION("62F3B5401F5A7F7B" , vpcmpq(k3, zmm25, zmmword_ptr(rdx, 8128), 123));
+ TEST_INSTRUCTION("62F3B5401F9A002000007B" , vpcmpq(k3, zmm25, zmmword_ptr(rdx, 8192), 123));
+ TEST_INSTRUCTION("62F3B5401F5A807B" , vpcmpq(k3, zmm25, zmmword_ptr(rdx, -8192), 123));
+ TEST_INSTRUCTION("62F3B5401F9AC0DFFFFF7B" , vpcmpq(k3, zmm25, zmmword_ptr(rdx, -8256), 123));
+ TEST_INSTRUCTION("62F3B5501F5A7F7B" , vpcmpq(k3, zmm25, qword_ptr(rdx, 1016)._1to8(), 123));
+ TEST_INSTRUCTION("62F3B5501F9A000400007B" , vpcmpq(k3, zmm25, qword_ptr(rdx, 1024)._1to8(), 123));
+ TEST_INSTRUCTION("62F3B5501F5A807B" , vpcmpq(k3, zmm25, qword_ptr(rdx, -1024)._1to8(), 123));
+ TEST_INSTRUCTION("62F3B5501F9AF8FBFFFF7B" , vpcmpq(k3, zmm25, qword_ptr(rdx, -1032)._1to8(), 123));
+ TEST_INSTRUCTION("62F315401EDDAB" , vpcmpud(k3, zmm29, zmm5, 171));
+ TEST_INSTRUCTION("62F315471EDDAB" , k(k7).vpcmpud(k3, zmm29, zmm5, 171));
+ TEST_INSTRUCTION("62F315401EDD7B" , vpcmpud(k3, zmm29, zmm5, 123));
+ TEST_INSTRUCTION("62F315401E197B" , vpcmpud(k3, zmm29, zmmword_ptr(rcx), 123));
+ TEST_INSTRUCTION("62B315401E9CF0341200007B" , vpcmpud(k3, zmm29, zmmword_ptr(rax, r14, 3, 4660), 123));
+ TEST_INSTRUCTION("62F315501E197B" , vpcmpud(k3, zmm29, dword_ptr(rcx)._1to16(), 123));
+ TEST_INSTRUCTION("62F315401E5A7F7B" , vpcmpud(k3, zmm29, zmmword_ptr(rdx, 8128), 123));
+ TEST_INSTRUCTION("62F315401E9A002000007B" , vpcmpud(k3, zmm29, zmmword_ptr(rdx, 8192), 123));
+ TEST_INSTRUCTION("62F315401E5A807B" , vpcmpud(k3, zmm29, zmmword_ptr(rdx, -8192), 123));
+ TEST_INSTRUCTION("62F315401E9AC0DFFFFF7B" , vpcmpud(k3, zmm29, zmmword_ptr(rdx, -8256), 123));
+ TEST_INSTRUCTION("62F315501E5A7F7B" , vpcmpud(k3, zmm29, dword_ptr(rdx, 508)._1to16(), 123));
+ TEST_INSTRUCTION("62F315501E9A000200007B" , vpcmpud(k3, zmm29, dword_ptr(rdx, 512)._1to16(), 123));
+ TEST_INSTRUCTION("62F315501E5A807B" , vpcmpud(k3, zmm29, dword_ptr(rdx, -512)._1to16(), 123));
+ TEST_INSTRUCTION("62F315501E9AFCFDFFFF7B" , vpcmpud(k3, zmm29, dword_ptr(rdx, -516)._1to16(), 123));
+ TEST_INSTRUCTION("62D38D481ED4AB" , vpcmpuq(k2, zmm14, zmm12, 171));
+ TEST_INSTRUCTION("62D38D4B1ED4AB" , k(k3).vpcmpuq(k2, zmm14, zmm12, 171));
+ TEST_INSTRUCTION("62D38D481ED47B" , vpcmpuq(k2, zmm14, zmm12, 123));
+ TEST_INSTRUCTION("62F38D481E117B" , vpcmpuq(k2, zmm14, zmmword_ptr(rcx), 123));
+ TEST_INSTRUCTION("62B38D481E94F0341200007B" , vpcmpuq(k2, zmm14, zmmword_ptr(rax, r14, 3, 4660), 123));
+ TEST_INSTRUCTION("62F38D581E117B" , vpcmpuq(k2, zmm14, qword_ptr(rcx)._1to8(), 123));
+ TEST_INSTRUCTION("62F38D481E527F7B" , vpcmpuq(k2, zmm14, zmmword_ptr(rdx, 8128), 123));
+ TEST_INSTRUCTION("62F38D481E92002000007B" , vpcmpuq(k2, zmm14, zmmword_ptr(rdx, 8192), 123));
+ TEST_INSTRUCTION("62F38D481E52807B" , vpcmpuq(k2, zmm14, zmmword_ptr(rdx, -8192), 123));
+ TEST_INSTRUCTION("62F38D481E92C0DFFFFF7B" , vpcmpuq(k2, zmm14, zmmword_ptr(rdx, -8256), 123));
+ TEST_INSTRUCTION("62F38D581E527F7B" , vpcmpuq(k2, zmm14, qword_ptr(rdx, 1016)._1to8(), 123));
+ TEST_INSTRUCTION("62F38D581E92000400007B" , vpcmpuq(k2, zmm14, qword_ptr(rdx, 1024)._1to8(), 123));
+ TEST_INSTRUCTION("62F38D581E52807B" , vpcmpuq(k2, zmm14, qword_ptr(rdx, -1024)._1to8(), 123));
+ TEST_INSTRUCTION("62F38D581E92F8FBFFFF7B" , vpcmpuq(k2, zmm14, qword_ptr(rdx, -1032)._1to8(), 123));
+ TEST_INSTRUCTION("6262ED4064C5" , vpblendmq(zmm24, zmm18, zmm5));
+ TEST_INSTRUCTION("6262ED4364C5" , k(k3).vpblendmq(zmm24, zmm18, zmm5));
+ TEST_INSTRUCTION("6262EDC364C5" , k(k3).z().vpblendmq(zmm24, zmm18, zmm5));
+ TEST_INSTRUCTION("6262ED406401" , vpblendmq(zmm24, zmm18, zmmword_ptr(rcx)));
+ TEST_INSTRUCTION("6222ED406484F034120000" , vpblendmq(zmm24, zmm18, zmmword_ptr(rax, r14, 3, 4660)));
+ TEST_INSTRUCTION("6262ED506401" , vpblendmq(zmm24, zmm18, qword_ptr(rcx)._1to8()));
+ TEST_INSTRUCTION("6262ED4064427F" , vpblendmq(zmm24, zmm18, zmmword_ptr(rdx, 8128)));
+ TEST_INSTRUCTION("6262ED40648200200000" , vpblendmq(zmm24, zmm18, zmmword_ptr(rdx, 8192)));
+ TEST_INSTRUCTION("6262ED40644280" , vpblendmq(zmm24, zmm18, zmmword_ptr(rdx, -8192)));
+ TEST_INSTRUCTION("6262ED406482C0DFFFFF" , vpblendmq(zmm24, zmm18, zmmword_ptr(rdx, -8256)));
+ TEST_INSTRUCTION("6262ED5064427F" , vpblendmq(zmm24, zmm18, qword_ptr(rdx, 1016)._1to8()));
+ TEST_INSTRUCTION("6262ED50648200040000" , vpblendmq(zmm24, zmm18, qword_ptr(rdx, 1024)._1to8()));
+ TEST_INSTRUCTION("6262ED50644280" , vpblendmq(zmm24, zmm18, qword_ptr(rdx, -1024)._1to8()));
+ TEST_INSTRUCTION("6262ED506482F8FBFFFF" , vpblendmq(zmm24, zmm18, qword_ptr(rdx, -1032)._1to8()));
+ TEST_INSTRUCTION("62E27D488B21" , vpcompressd(zmmword_ptr(rcx), zmm20));
+ TEST_INSTRUCTION("62E27D4E8B21" , k(k6).vpcompressd(zmmword_ptr(rcx), zmm20));
+ TEST_INSTRUCTION("62A27D488BA4F034120000" , vpcompressd(zmmword_ptr(rax, r14, 3, 4660), zmm20));
+ TEST_INSTRUCTION("62E27D488B627F" , vpcompressd(zmmword_ptr(rdx, 508), zmm20));
+ TEST_INSTRUCTION("62E27D488BA200020000" , vpcompressd(zmmword_ptr(rdx, 512), zmm20));
+ TEST_INSTRUCTION("62E27D488B6280" , vpcompressd(zmmword_ptr(rdx, -512), zmm20));
+ TEST_INSTRUCTION("62E27D488BA2FCFDFFFF" , vpcompressd(zmmword_ptr(rdx, -516), zmm20));
+ TEST_INSTRUCTION("62127D488BE0" , vpcompressd(zmm24, zmm12));
+ TEST_INSTRUCTION("62127D4D8BE0" , k(k5).vpcompressd(zmm24, zmm12));
+ TEST_INSTRUCTION("62127DCD8BE0" , k(k5).z().vpcompressd(zmm24, zmm12));
+ TEST_INSTRUCTION("62422D4836C8" , vpermd(zmm25, zmm10, zmm8));
+ TEST_INSTRUCTION("62422D4E36C8" , k(k6).vpermd(zmm25, zmm10, zmm8));
+ TEST_INSTRUCTION("62422DCE36C8" , k(k6).z().vpermd(zmm25, zmm10, zmm8));
+ TEST_INSTRUCTION("62622D483609" , vpermd(zmm25, zmm10, zmmword_ptr(rcx)));
+ TEST_INSTRUCTION("62222D48368CF034120000" , vpermd(zmm25, zmm10, zmmword_ptr(rax, r14, 3, 4660)));
+ TEST_INSTRUCTION("62622D583609" , vpermd(zmm25, zmm10, dword_ptr(rcx)._1to16()));
+ TEST_INSTRUCTION("62622D48364A7F" , vpermd(zmm25, zmm10, zmmword_ptr(rdx, 8128)));
+ TEST_INSTRUCTION("62622D48368A00200000" , vpermd(zmm25, zmm10, zmmword_ptr(rdx, 8192)));
+ TEST_INSTRUCTION("62622D48364A80" , vpermd(zmm25, zmm10, zmmword_ptr(rdx, -8192)));
+ TEST_INSTRUCTION("62622D48368AC0DFFFFF" , vpermd(zmm25, zmm10, zmmword_ptr(rdx, -8256)));
+ TEST_INSTRUCTION("62622D58364A7F" , vpermd(zmm25, zmm10, dword_ptr(rdx, 508)._1to16()));
+ TEST_INSTRUCTION("62622D58368A00020000" , vpermd(zmm25, zmm10, dword_ptr(rdx, 512)._1to16()));
+ TEST_INSTRUCTION("62622D58364A80" , vpermd(zmm25, zmm10, dword_ptr(rdx, -512)._1to16()));
+ TEST_INSTRUCTION("62622D58368AFCFDFFFF" , vpermd(zmm25, zmm10, dword_ptr(rdx, -516)._1to16()));
+ TEST_INSTRUCTION("6253FD4805F8AB" , vpermilpd(zmm15, zmm8, 171));
+ TEST_INSTRUCTION("6253FD4E05F8AB" , k(k6).vpermilpd(zmm15, zmm8, 171));
+ TEST_INSTRUCTION("6253FDCE05F8AB" , k(k6).z().vpermilpd(zmm15, zmm8, 171));
+ TEST_INSTRUCTION("6253FD4805F87B" , vpermilpd(zmm15, zmm8, 123));
+ TEST_INSTRUCTION("6273FD4805397B" , vpermilpd(zmm15, zmmword_ptr(rcx), 123));
+ TEST_INSTRUCTION("6233FD4805BCF0341200007B" , vpermilpd(zmm15, zmmword_ptr(rax, r14, 3, 4660), 123));
+ TEST_INSTRUCTION("6273FD5805397B" , vpermilpd(zmm15, qword_ptr(rcx)._1to8(), 123));
+ TEST_INSTRUCTION("6273FD48057A7F7B" , vpermilpd(zmm15, zmmword_ptr(rdx, 8128), 123));
+ TEST_INSTRUCTION("6273FD4805BA002000007B" , vpermilpd(zmm15, zmmword_ptr(rdx, 8192), 123));
+ TEST_INSTRUCTION("6273FD48057A807B" , vpermilpd(zmm15, zmmword_ptr(rdx, -8192), 123));
+ TEST_INSTRUCTION("6273FD4805BAC0DFFFFF7B" , vpermilpd(zmm15, zmmword_ptr(rdx, -8256), 123));
+ TEST_INSTRUCTION("6273FD58057A7F7B" , vpermilpd(zmm15, qword_ptr(rdx, 1016)._1to8(), 123));
+ TEST_INSTRUCTION("6273FD5805BA000400007B" , vpermilpd(zmm15, qword_ptr(rdx, 1024)._1to8(), 123));
+ TEST_INSTRUCTION("6273FD58057A807B" , vpermilpd(zmm15, qword_ptr(rdx, -1024)._1to8(), 123));
+ TEST_INSTRUCTION("6273FD5805BAF8FBFFFF7B" , vpermilpd(zmm15, qword_ptr(rdx, -1032)._1to8(), 123));
+ TEST_INSTRUCTION("62C2AD400DF8" , vpermilpd(zmm23, zmm26, zmm8));
+ TEST_INSTRUCTION("62C2AD410DF8" , k(k1).vpermilpd(zmm23, zmm26, zmm8));
+ TEST_INSTRUCTION("62C2ADC10DF8" , k(k1).z().vpermilpd(zmm23, zmm26, zmm8));
+ TEST_INSTRUCTION("62E2AD400D39" , vpermilpd(zmm23, zmm26, zmmword_ptr(rcx)));
+ TEST_INSTRUCTION("62A2AD400DBCF034120000" , vpermilpd(zmm23, zmm26, zmmword_ptr(rax, r14, 3, 4660)));
+ TEST_INSTRUCTION("62E2AD500D39" , vpermilpd(zmm23, zmm26, qword_ptr(rcx)._1to8()));
+ TEST_INSTRUCTION("62E2AD400D7A7F" , vpermilpd(zmm23, zmm26, zmmword_ptr(rdx, 8128)));
+ TEST_INSTRUCTION("62E2AD400DBA00200000" , vpermilpd(zmm23, zmm26, zmmword_ptr(rdx, 8192)));
+ TEST_INSTRUCTION("62E2AD400D7A80" , vpermilpd(zmm23, zmm26, zmmword_ptr(rdx, -8192)));
+ TEST_INSTRUCTION("62E2AD400DBAC0DFFFFF" , vpermilpd(zmm23, zmm26, zmmword_ptr(rdx, -8256)));
+ TEST_INSTRUCTION("62E2AD500D7A7F" , vpermilpd(zmm23, zmm26, qword_ptr(rdx, 1016)._1to8()));
+ TEST_INSTRUCTION("62E2AD500DBA00040000" , vpermilpd(zmm23, zmm26, qword_ptr(rdx, 1024)._1to8()));
+ TEST_INSTRUCTION("62E2AD500D7A80" , vpermilpd(zmm23, zmm26, qword_ptr(rdx, -1024)._1to8()));
+ TEST_INSTRUCTION("62E2AD500DBAF8FBFFFF" , vpermilpd(zmm23, zmm26, qword_ptr(rdx, -1032)._1to8()));
+ TEST_INSTRUCTION("62637D4804CFAB" , vpermilps(zmm25, zmm7, 171));
+ TEST_INSTRUCTION("62637D4A04CFAB" , k(k2).vpermilps(zmm25, zmm7, 171));
+ TEST_INSTRUCTION("62637DCA04CFAB" , k(k2).z().vpermilps(zmm25, zmm7, 171));
+ TEST_INSTRUCTION("62637D4804CF7B" , vpermilps(zmm25, zmm7, 123));
+ TEST_INSTRUCTION("62637D4804097B" , vpermilps(zmm25, zmmword_ptr(rcx), 123));
+ TEST_INSTRUCTION("62237D48048CF0341200007B" , vpermilps(zmm25, zmmword_ptr(rax, r14, 3, 4660), 123));
+ TEST_INSTRUCTION("62637D5804097B" , vpermilps(zmm25, dword_ptr(rcx)._1to16(), 123));
+ TEST_INSTRUCTION("62637D48044A7F7B" , vpermilps(zmm25, zmmword_ptr(rdx, 8128), 123));
+ TEST_INSTRUCTION("62637D48048A002000007B" , vpermilps(zmm25, zmmword_ptr(rdx, 8192), 123));
+ TEST_INSTRUCTION("62637D48044A807B" , vpermilps(zmm25, zmmword_ptr(rdx, -8192), 123));
+ TEST_INSTRUCTION("62637D48048AC0DFFFFF7B" , vpermilps(zmm25, zmmword_ptr(rdx, -8256), 123));
+ TEST_INSTRUCTION("62637D58044A7F7B" , vpermilps(zmm25, dword_ptr(rdx, 508)._1to16(), 123));
+ TEST_INSTRUCTION("62637D58048A000200007B" , vpermilps(zmm25, dword_ptr(rdx, 512)._1to16(), 123));
+ TEST_INSTRUCTION("62637D58044A807B" , vpermilps(zmm25, dword_ptr(rdx, -512)._1to16(), 123));
+ TEST_INSTRUCTION("62637D58048AFCFDFFFF7B" , vpermilps(zmm25, dword_ptr(rdx, -516)._1to16(), 123));
+ TEST_INSTRUCTION("62B22D400CD9" , vpermilps(zmm3, zmm26, zmm17));
+ TEST_INSTRUCTION("62B22D430CD9" , k(k3).vpermilps(zmm3, zmm26, zmm17));
+ TEST_INSTRUCTION("62B22DC30CD9" , k(k3).z().vpermilps(zmm3, zmm26, zmm17));
+ TEST_INSTRUCTION("62F22D400C19" , vpermilps(zmm3, zmm26, zmmword_ptr(rcx)));
+ TEST_INSTRUCTION("62B22D400C9CF034120000" , vpermilps(zmm3, zmm26, zmmword_ptr(rax, r14, 3, 4660)));
+ TEST_INSTRUCTION("62F22D500C19" , vpermilps(zmm3, zmm26, dword_ptr(rcx)._1to16()));
+ TEST_INSTRUCTION("62F22D400C5A7F" , vpermilps(zmm3, zmm26, zmmword_ptr(rdx, 8128)));
+ TEST_INSTRUCTION("62F22D400C9A00200000" , vpermilps(zmm3, zmm26, zmmword_ptr(rdx, 8192)));
+ TEST_INSTRUCTION("62F22D400C5A80" , vpermilps(zmm3, zmm26, zmmword_ptr(rdx, -8192)));
+ TEST_INSTRUCTION("62F22D400C9AC0DFFFFF" , vpermilps(zmm3, zmm26, zmmword_ptr(rdx, -8256)));
+ TEST_INSTRUCTION("62F22D500C5A7F" , vpermilps(zmm3, zmm26, dword_ptr(rdx, 508)._1to16()));
+ TEST_INSTRUCTION("62F22D500C9A00020000" , vpermilps(zmm3, zmm26, dword_ptr(rdx, 512)._1to16()));
+ TEST_INSTRUCTION("62F22D500C5A80" , vpermilps(zmm3, zmm26, dword_ptr(rdx, -512)._1to16()));
+ TEST_INSTRUCTION("62F22D500C9AFCFDFFFF" , vpermilps(zmm3, zmm26, dword_ptr(rdx, -516)._1to16()));
+ TEST_INSTRUCTION("6243FD4801E7AB" , vpermpd(zmm28, zmm15, 171));
+ TEST_INSTRUCTION("6243FD4C01E7AB" , k(k4).vpermpd(zmm28, zmm15, 171));
+ TEST_INSTRUCTION("6243FDCC01E7AB" , k(k4).z().vpermpd(zmm28, zmm15, 171));
+ TEST_INSTRUCTION("6243FD4801E77B" , vpermpd(zmm28, zmm15, 123));
+ TEST_INSTRUCTION("6263FD4801217B" , vpermpd(zmm28, zmmword_ptr(rcx), 123));
+ TEST_INSTRUCTION("6223FD4801A4F0341200007B" , vpermpd(zmm28, zmmword_ptr(rax, r14, 3, 4660), 123));
+ TEST_INSTRUCTION("6263FD5801217B" , vpermpd(zmm28, qword_ptr(rcx)._1to8(), 123));
+ TEST_INSTRUCTION("6263FD4801627F7B" , vpermpd(zmm28, zmmword_ptr(rdx, 8128), 123));
+ TEST_INSTRUCTION("6263FD4801A2002000007B" , vpermpd(zmm28, zmmword_ptr(rdx, 8192), 123));
+ TEST_INSTRUCTION("6263FD480162807B" , vpermpd(zmm28, zmmword_ptr(rdx, -8192), 123));
+ TEST_INSTRUCTION("6263FD4801A2C0DFFFFF7B" , vpermpd(zmm28, zmmword_ptr(rdx, -8256), 123));
+ TEST_INSTRUCTION("6263FD5801627F7B" , vpermpd(zmm28, qword_ptr(rdx, 1016)._1to8(), 123));
+ TEST_INSTRUCTION("6263FD5801A2000400007B" , vpermpd(zmm28, qword_ptr(rdx, 1024)._1to8(), 123));
+ TEST_INSTRUCTION("6263FD580162807B" , vpermpd(zmm28, qword_ptr(rdx, -1024)._1to8(), 123));
+ TEST_INSTRUCTION("6263FD5801A2F8FBFFFF7B" , vpermpd(zmm28, qword_ptr(rdx, -1032)._1to8(), 123));
+ TEST_INSTRUCTION("62A24D4816F5" , vpermps(zmm22, zmm6, zmm21));
+ TEST_INSTRUCTION("62A24D4D16F5" , k(k5).vpermps(zmm22, zmm6, zmm21));
+ TEST_INSTRUCTION("62A24DCD16F5" , k(k5).z().vpermps(zmm22, zmm6, zmm21));
+ TEST_INSTRUCTION("62E24D481631" , vpermps(zmm22, zmm6, zmmword_ptr(rcx)));
+ TEST_INSTRUCTION("62A24D4816B4F034120000" , vpermps(zmm22, zmm6, zmmword_ptr(rax, r14, 3, 4660)));
+ TEST_INSTRUCTION("62E24D581631" , vpermps(zmm22, zmm6, dword_ptr(rcx)._1to16()));
+ TEST_INSTRUCTION("62E24D4816727F" , vpermps(zmm22, zmm6, zmmword_ptr(rdx, 8128)));
+ TEST_INSTRUCTION("62E24D4816B200200000" , vpermps(zmm22, zmm6, zmmword_ptr(rdx, 8192)));
+ TEST_INSTRUCTION("62E24D48167280" , vpermps(zmm22, zmm6, zmmword_ptr(rdx, -8192)));
+ TEST_INSTRUCTION("62E24D4816B2C0DFFFFF" , vpermps(zmm22, zmm6, zmmword_ptr(rdx, -8256)));
+ TEST_INSTRUCTION("62E24D5816727F" , vpermps(zmm22, zmm6, dword_ptr(rdx, 508)._1to16()));
+ TEST_INSTRUCTION("62E24D5816B200020000" , vpermps(zmm22, zmm6, dword_ptr(rdx, 512)._1to16()));
+ TEST_INSTRUCTION("62E24D58167280" , vpermps(zmm22, zmm6, dword_ptr(rdx, -512)._1to16()));
+ TEST_INSTRUCTION("62E24D5816B2FCFDFFFF" , vpermps(zmm22, zmm6, dword_ptr(rdx, -516)._1to16()));
+ TEST_INSTRUCTION("6223FD4800C7AB" , vpermq(zmm24, zmm23, 171));
+ TEST_INSTRUCTION("6223FD4B00C7AB" , k(k3).vpermq(zmm24, zmm23, 171));
+ TEST_INSTRUCTION("6223FDCB00C7AB" , k(k3).z().vpermq(zmm24, zmm23, 171));
+ TEST_INSTRUCTION("6223FD4800C77B" , vpermq(zmm24, zmm23, 123));
+ TEST_INSTRUCTION("6263FD4800017B" , vpermq(zmm24, zmmword_ptr(rcx), 123));
+ TEST_INSTRUCTION("6223FD480084F0341200007B" , vpermq(zmm24, zmmword_ptr(rax, r14, 3, 4660), 123));
+ TEST_INSTRUCTION("6263FD5800017B" , vpermq(zmm24, qword_ptr(rcx)._1to8(), 123));
+ TEST_INSTRUCTION("6263FD4800427F7B" , vpermq(zmm24, zmmword_ptr(rdx, 8128), 123));
+ TEST_INSTRUCTION("6263FD480082002000007B" , vpermq(zmm24, zmmword_ptr(rdx, 8192), 123));
+ TEST_INSTRUCTION("6263FD480042807B" , vpermq(zmm24, zmmword_ptr(rdx, -8192), 123));
+ TEST_INSTRUCTION("6263FD480082C0DFFFFF7B" , vpermq(zmm24, zmmword_ptr(rdx, -8256), 123));
+ TEST_INSTRUCTION("6263FD5800427F7B" , vpermq(zmm24, qword_ptr(rdx, 1016)._1to8(), 123));
+ TEST_INSTRUCTION("6263FD580082000400007B" , vpermq(zmm24, qword_ptr(rdx, 1024)._1to8(), 123));
+ TEST_INSTRUCTION("6263FD580042807B" , vpermq(zmm24, qword_ptr(rdx, -1024)._1to8(), 123));
+ TEST_INSTRUCTION("6263FD580082F8FBFFFF7B" , vpermq(zmm24, qword_ptr(rdx, -1032)._1to8(), 123));
+ TEST_INSTRUCTION("62E27D488911" , vpexpandd(zmm18, zmmword_ptr(rcx)));
+ TEST_INSTRUCTION("62E27D4A8911" , k(k2).vpexpandd(zmm18, zmmword_ptr(rcx)));
+ TEST_INSTRUCTION("62E27DCA8911" , k(k2).z().vpexpandd(zmm18, zmmword_ptr(rcx)));
+ TEST_INSTRUCTION("62A27D488994F034120000" , vpexpandd(zmm18, zmmword_ptr(rax, r14, 3, 4660)));
+ TEST_INSTRUCTION("62E27D4889527F" , vpexpandd(zmm18, zmmword_ptr(rdx, 508)));
+ TEST_INSTRUCTION("62E27D48899200020000" , vpexpandd(zmm18, zmmword_ptr(rdx, 512)));
+ TEST_INSTRUCTION("62E27D48895280" , vpexpandd(zmm18, zmmword_ptr(rdx, -512)));
+ TEST_INSTRUCTION("62E27D488992FCFDFFFF" , vpexpandd(zmm18, zmmword_ptr(rdx, -516)));
+ TEST_INSTRUCTION("62127D4889E4" , vpexpandd(zmm12, zmm28));
+ TEST_INSTRUCTION("62127D4E89E4" , k(k6).vpexpandd(zmm12, zmm28));
+ TEST_INSTRUCTION("62127DCE89E4" , k(k6).z().vpexpandd(zmm12, zmm28));
+ TEST_INSTRUCTION("62F2FD488909" , vpexpandq(zmm1, zmmword_ptr(rcx)));
+ TEST_INSTRUCTION("62F2FD4F8909" , k(k7).vpexpandq(zmm1, zmmword_ptr(rcx)));
+ TEST_INSTRUCTION("62F2FDCF8909" , k(k7).z().vpexpandq(zmm1, zmmword_ptr(rcx)));
+ TEST_INSTRUCTION("62B2FD48898CF034120000" , vpexpandq(zmm1, zmmword_ptr(rax, r14, 3, 4660)));
+ TEST_INSTRUCTION("62F2FD48894A7F" , vpexpandq(zmm1, zmmword_ptr(rdx, 1016)));
+ TEST_INSTRUCTION("62F2FD48898A00040000" , vpexpandq(zmm1, zmmword_ptr(rdx, 1024)));
+ TEST_INSTRUCTION("62F2FD48894A80" , vpexpandq(zmm1, zmmword_ptr(rdx, -1024)));
+ TEST_INSTRUCTION("62F2FD48898AF8FBFFFF" , vpexpandq(zmm1, zmmword_ptr(rdx, -1032)));
+ TEST_INSTRUCTION("6282FD4889CA" , vpexpandq(zmm17, zmm26));
+ TEST_INSTRUCTION("6282FD4F89CA" , k(k7).vpexpandq(zmm17, zmm26));
+ TEST_INSTRUCTION("6282FDCF89CA" , k(k7).z().vpexpandq(zmm17, zmm26));
+ TEST_INSTRUCTION("624215483DF1" , vpmaxsd(zmm30, zmm13, zmm9));
+ TEST_INSTRUCTION("6242154F3DF1" , k(k7).vpmaxsd(zmm30, zmm13, zmm9));
+ TEST_INSTRUCTION("624215CF3DF1" , k(k7).z().vpmaxsd(zmm30, zmm13, zmm9));
+ TEST_INSTRUCTION("626215483D31" , vpmaxsd(zmm30, zmm13, zmmword_ptr(rcx)));
+ TEST_INSTRUCTION("622215483DB4F034120000" , vpmaxsd(zmm30, zmm13, zmmword_ptr(rax, r14, 3, 4660)));
+ TEST_INSTRUCTION("626215583D31" , vpmaxsd(zmm30, zmm13, dword_ptr(rcx)._1to16()));
+ TEST_INSTRUCTION("626215483D727F" , vpmaxsd(zmm30, zmm13, zmmword_ptr(rdx, 8128)));
+ TEST_INSTRUCTION("626215483DB200200000" , vpmaxsd(zmm30, zmm13, zmmword_ptr(rdx, 8192)));
+ TEST_INSTRUCTION("626215483D7280" , vpmaxsd(zmm30, zmm13, zmmword_ptr(rdx, -8192)));
+ TEST_INSTRUCTION("626215483DB2C0DFFFFF" , vpmaxsd(zmm30, zmm13, zmmword_ptr(rdx, -8256)));
+ TEST_INSTRUCTION("626215583D727F" , vpmaxsd(zmm30, zmm13, dword_ptr(rdx, 508)._1to16()));
+ TEST_INSTRUCTION("626215583DB200020000" , vpmaxsd(zmm30, zmm13, dword_ptr(rdx, 512)._1to16()));
+ TEST_INSTRUCTION("626215583D7280" , vpmaxsd(zmm30, zmm13, dword_ptr(rdx, -512)._1to16()));
+ TEST_INSTRUCTION("626215583DB2FCFDFFFF" , vpmaxsd(zmm30, zmm13, dword_ptr(rdx, -516)._1to16()));
+ TEST_INSTRUCTION("62F2C5483DDD" , vpmaxsq(zmm3, zmm7, zmm5));
+ TEST_INSTRUCTION("62F2C54B3DDD" , k(k3).vpmaxsq(zmm3, zmm7, zmm5));
+ TEST_INSTRUCTION("62F2C5CB3DDD" , k(k3).z().vpmaxsq(zmm3, zmm7, zmm5));
+ TEST_INSTRUCTION("62F2C5483D19" , vpmaxsq(zmm3, zmm7, zmmword_ptr(rcx)));
+ TEST_INSTRUCTION("62B2C5483D9CF034120000" , vpmaxsq(zmm3, zmm7, zmmword_ptr(rax, r14, 3, 4660)));
+ TEST_INSTRUCTION("62F2C5583D19" , vpmaxsq(zmm3, zmm7, qword_ptr(rcx)._1to8()));
+ TEST_INSTRUCTION("62F2C5483D5A7F" , vpmaxsq(zmm3, zmm7, zmmword_ptr(rdx, 8128)));
+ TEST_INSTRUCTION("62F2C5483D9A00200000" , vpmaxsq(zmm3, zmm7, zmmword_ptr(rdx, 8192)));
+ TEST_INSTRUCTION("62F2C5483D5A80" , vpmaxsq(zmm3, zmm7, zmmword_ptr(rdx, -8192)));
+ TEST_INSTRUCTION("62F2C5483D9AC0DFFFFF" , vpmaxsq(zmm3, zmm7, zmmword_ptr(rdx, -8256)));
+ TEST_INSTRUCTION("62F2C5583D5A7F" , vpmaxsq(zmm3, zmm7, qword_ptr(rdx, 1016)._1to8()));
+ TEST_INSTRUCTION("62F2C5583D9A00040000" , vpmaxsq(zmm3, zmm7, qword_ptr(rdx, 1024)._1to8()));
+ TEST_INSTRUCTION("62F2C5583D5A80" , vpmaxsq(zmm3, zmm7, qword_ptr(rdx, -1024)._1to8()));
+ TEST_INSTRUCTION("62F2C5583D9AF8FBFFFF" , vpmaxsq(zmm3, zmm7, qword_ptr(rdx, -1032)._1to8()));
+ TEST_INSTRUCTION("62C225403FF4" , vpmaxud(zmm22, zmm27, zmm12));
+ TEST_INSTRUCTION("62C225473FF4" , k(k7).vpmaxud(zmm22, zmm27, zmm12));
+ TEST_INSTRUCTION("62C225C73FF4" , k(k7).z().vpmaxud(zmm22, zmm27, zmm12));
+ TEST_INSTRUCTION("62E225403F31" , vpmaxud(zmm22, zmm27, zmmword_ptr(rcx)));
+ TEST_INSTRUCTION("62A225403FB4F034120000" , vpmaxud(zmm22, zmm27, zmmword_ptr(rax, r14, 3, 4660)));
+ TEST_INSTRUCTION("62E225503F31" , vpmaxud(zmm22, zmm27, dword_ptr(rcx)._1to16()));
+ TEST_INSTRUCTION("62E225403F727F" , vpmaxud(zmm22, zmm27, zmmword_ptr(rdx, 8128)));
+ TEST_INSTRUCTION("62E225403FB200200000" , vpmaxud(zmm22, zmm27, zmmword_ptr(rdx, 8192)));
+ TEST_INSTRUCTION("62E225403F7280" , vpmaxud(zmm22, zmm27, zmmword_ptr(rdx, -8192)));
+ TEST_INSTRUCTION("62E225403FB2C0DFFFFF" , vpmaxud(zmm22, zmm27, zmmword_ptr(rdx, -8256)));
+ TEST_INSTRUCTION("62E225503F727F" , vpmaxud(zmm22, zmm27, dword_ptr(rdx, 508)._1to16()));
+ TEST_INSTRUCTION("62E225503FB200020000" , vpmaxud(zmm22, zmm27, dword_ptr(rdx, 512)._1to16()));
+ TEST_INSTRUCTION("62E225503F7280" , vpmaxud(zmm22, zmm27, dword_ptr(rdx, -512)._1to16()));
+ TEST_INSTRUCTION("62E225503FB2FCFDFFFF" , vpmaxud(zmm22, zmm27, dword_ptr(rdx, -516)._1to16()));
+ TEST_INSTRUCTION("62D2B5483FCC" , vpmaxuq(zmm1, zmm9, zmm12));
+ TEST_INSTRUCTION("62D2B54A3FCC" , k(k2).vpmaxuq(zmm1, zmm9, zmm12));
+ TEST_INSTRUCTION("62D2B5CA3FCC" , k(k2).z().vpmaxuq(zmm1, zmm9, zmm12));
+ TEST_INSTRUCTION("62F2B5483F09" , vpmaxuq(zmm1, zmm9, zmmword_ptr(rcx)));
+ TEST_INSTRUCTION("62B2B5483F8CF034120000" , vpmaxuq(zmm1, zmm9, zmmword_ptr(rax, r14, 3, 4660)));
+ TEST_INSTRUCTION("62F2B5583F09" , vpmaxuq(zmm1, zmm9, qword_ptr(rcx)._1to8()));
+ TEST_INSTRUCTION("62F2B5483F4A7F" , vpmaxuq(zmm1, zmm9, zmmword_ptr(rdx, 8128)));
+ TEST_INSTRUCTION("62F2B5483F8A00200000" , vpmaxuq(zmm1, zmm9, zmmword_ptr(rdx, 8192)));
+ TEST_INSTRUCTION("62F2B5483F4A80" , vpmaxuq(zmm1, zmm9, zmmword_ptr(rdx, -8192)));
+ TEST_INSTRUCTION("62F2B5483F8AC0DFFFFF" , vpmaxuq(zmm1, zmm9, zmmword_ptr(rdx, -8256)));
+ TEST_INSTRUCTION("62F2B5583F4A7F" , vpmaxuq(zmm1, zmm9, qword_ptr(rdx, 1016)._1to8()));
+ TEST_INSTRUCTION("62F2B5583F8A00040000" , vpmaxuq(zmm1, zmm9, qword_ptr(rdx, 1024)._1to8()));
+ TEST_INSTRUCTION("62F2B5583F4A80" , vpmaxuq(zmm1, zmm9, qword_ptr(rdx, -1024)._1to8()));
+ TEST_INSTRUCTION("62F2B5583F8AF8FBFFFF" , vpmaxuq(zmm1, zmm9, qword_ptr(rdx, -1032)._1to8()));
+ TEST_INSTRUCTION("62E2754039DA" , vpminsd(zmm19, zmm17, zmm2));
+ TEST_INSTRUCTION("62E2754739DA" , k(k7).vpminsd(zmm19, zmm17, zmm2));
+ TEST_INSTRUCTION("62E275C739DA" , k(k7).z().vpminsd(zmm19, zmm17, zmm2));
+ TEST_INSTRUCTION("62E275403919" , vpminsd(zmm19, zmm17, zmmword_ptr(rcx)));
+ TEST_INSTRUCTION("62A27540399CF034120000" , vpminsd(zmm19, zmm17, zmmword_ptr(rax, r14, 3, 4660)));
+ TEST_INSTRUCTION("62E275503919" , vpminsd(zmm19, zmm17, dword_ptr(rcx)._1to16()));
+ TEST_INSTRUCTION("62E27540395A7F" , vpminsd(zmm19, zmm17, zmmword_ptr(rdx, 8128)));
+ TEST_INSTRUCTION("62E27540399A00200000" , vpminsd(zmm19, zmm17, zmmword_ptr(rdx, 8192)));
+ TEST_INSTRUCTION("62E27540395A80" , vpminsd(zmm19, zmm17, zmmword_ptr(rdx, -8192)));
+ TEST_INSTRUCTION("62E27540399AC0DFFFFF" , vpminsd(zmm19, zmm17, zmmword_ptr(rdx, -8256)));
+ TEST_INSTRUCTION("62E27550395A7F" , vpminsd(zmm19, zmm17, dword_ptr(rdx, 508)._1to16()));
+ TEST_INSTRUCTION("62E27550399A00020000" , vpminsd(zmm19, zmm17, dword_ptr(rdx, 512)._1to16()));
+ TEST_INSTRUCTION("62E27550395A80" , vpminsd(zmm19, zmm17, dword_ptr(rdx, -512)._1to16()));
+ TEST_INSTRUCTION("62E27550399AFCFDFFFF" , vpminsd(zmm19, zmm17, dword_ptr(rdx, -516)._1to16()));
+ TEST_INSTRUCTION("62A2F54839EE" , vpminsq(zmm21, zmm1, zmm22));
+ TEST_INSTRUCTION("62A2F54E39EE" , k(k6).vpminsq(zmm21, zmm1, zmm22));
+ TEST_INSTRUCTION("62A2F5CE39EE" , k(k6).z().vpminsq(zmm21, zmm1, zmm22));
+ TEST_INSTRUCTION("62E2F5483929" , vpminsq(zmm21, zmm1, zmmword_ptr(rcx)));
+ TEST_INSTRUCTION("62A2F54839ACF034120000" , vpminsq(zmm21, zmm1, zmmword_ptr(rax, r14, 3, 4660)));
+ TEST_INSTRUCTION("62E2F5583929" , vpminsq(zmm21, zmm1, qword_ptr(rcx)._1to8()));
+ TEST_INSTRUCTION("62E2F548396A7F" , vpminsq(zmm21, zmm1, zmmword_ptr(rdx, 8128)));
+ TEST_INSTRUCTION("62E2F54839AA00200000" , vpminsq(zmm21, zmm1, zmmword_ptr(rdx, 8192)));
+ TEST_INSTRUCTION("62E2F548396A80" , vpminsq(zmm21, zmm1, zmmword_ptr(rdx, -8192)));
+ TEST_INSTRUCTION("62E2F54839AAC0DFFFFF" , vpminsq(zmm21, zmm1, zmmword_ptr(rdx, -8256)));
+ TEST_INSTRUCTION("62E2F558396A7F" , vpminsq(zmm21, zmm1, qword_ptr(rdx, 1016)._1to8()));
+ TEST_INSTRUCTION("62E2F55839AA00040000" , vpminsq(zmm21, zmm1, qword_ptr(rdx, 1024)._1to8()));
+ TEST_INSTRUCTION("62E2F558396A80" , vpminsq(zmm21, zmm1, qword_ptr(rdx, -1024)._1to8()));
+ TEST_INSTRUCTION("62E2F55839AAF8FBFFFF" , vpminsq(zmm21, zmm1, qword_ptr(rdx, -1032)._1to8()));
+ TEST_INSTRUCTION("62F24D403BE3" , vpminud(zmm4, zmm22, zmm3));
+ TEST_INSTRUCTION("62F24D443BE3" , k(k4).vpminud(zmm4, zmm22, zmm3));
+ TEST_INSTRUCTION("62F24DC43BE3" , k(k4).z().vpminud(zmm4, zmm22, zmm3));
+ TEST_INSTRUCTION("62F24D403B21" , vpminud(zmm4, zmm22, zmmword_ptr(rcx)));
+ TEST_INSTRUCTION("62B24D403BA4F034120000" , vpminud(zmm4, zmm22, zmmword_ptr(rax, r14, 3, 4660)));
+ TEST_INSTRUCTION("62F24D503B21" , vpminud(zmm4, zmm22, dword_ptr(rcx)._1to16()));
+ TEST_INSTRUCTION("62F24D403B627F" , vpminud(zmm4, zmm22, zmmword_ptr(rdx, 8128)));
+ TEST_INSTRUCTION("62F24D403BA200200000" , vpminud(zmm4, zmm22, zmmword_ptr(rdx, 8192)));
+ TEST_INSTRUCTION("62F24D403B6280" , vpminud(zmm4, zmm22, zmmword_ptr(rdx, -8192)));
+ TEST_INSTRUCTION("62F24D403BA2C0DFFFFF" , vpminud(zmm4, zmm22, zmmword_ptr(rdx, -8256)));
+ TEST_INSTRUCTION("62F24D503B627F" , vpminud(zmm4, zmm22, dword_ptr(rdx, 508)._1to16()));
+ TEST_INSTRUCTION("62F24D503BA200020000" , vpminud(zmm4, zmm22, dword_ptr(rdx, 512)._1to16()));
+ TEST_INSTRUCTION("62F24D503B6280" , vpminud(zmm4, zmm22, dword_ptr(rdx, -512)._1to16()));
+ TEST_INSTRUCTION("62F24D503BA2FCFDFFFF" , vpminud(zmm4, zmm22, dword_ptr(rdx, -516)._1to16()));
+ TEST_INSTRUCTION("6202AD403BCB" , vpminuq(zmm25, zmm26, zmm27));
+ TEST_INSTRUCTION("6202AD463BCB" , k(k6).vpminuq(zmm25, zmm26, zmm27));
+ TEST_INSTRUCTION("6202ADC63BCB" , k(k6).z().vpminuq(zmm25, zmm26, zmm27));
+ TEST_INSTRUCTION("6262AD403B09" , vpminuq(zmm25, zmm26, zmmword_ptr(rcx)));
+ TEST_INSTRUCTION("6222AD403B8CF034120000" , vpminuq(zmm25, zmm26, zmmword_ptr(rax, r14, 3, 4660)));
+ TEST_INSTRUCTION("6262AD503B09" , vpminuq(zmm25, zmm26, qword_ptr(rcx)._1to8()));
+ TEST_INSTRUCTION("6262AD403B4A7F" , vpminuq(zmm25, zmm26, zmmword_ptr(rdx, 8128)));
+ TEST_INSTRUCTION("6262AD403B8A00200000" , vpminuq(zmm25, zmm26, zmmword_ptr(rdx, 8192)));
+ TEST_INSTRUCTION("6262AD403B4A80" , vpminuq(zmm25, zmm26, zmmword_ptr(rdx, -8192)));
+ TEST_INSTRUCTION("6262AD403B8AC0DFFFFF" , vpminuq(zmm25, zmm26, zmmword_ptr(rdx, -8256)));
+ TEST_INSTRUCTION("6262AD503B4A7F" , vpminuq(zmm25, zmm26, qword_ptr(rdx, 1016)._1to8()));
+ TEST_INSTRUCTION("6262AD503B8A00040000" , vpminuq(zmm25, zmm26, qword_ptr(rdx, 1024)._1to8()));
+ TEST_INSTRUCTION("6262AD503B4A80" , vpminuq(zmm25, zmm26, qword_ptr(rdx, -1024)._1to8()));
+ TEST_INSTRUCTION("6262AD503B8AF8FBFFFF" , vpminuq(zmm25, zmm26, qword_ptr(rdx, -1032)._1to8()));
+ TEST_INSTRUCTION("62427D4821CA" , vpmovsxbd(zmm25, xmm10));
+ TEST_INSTRUCTION("62427D4921CA" , k(k1).vpmovsxbd(zmm25, xmm10));
+ TEST_INSTRUCTION("62427DC921CA" , k(k1).z().vpmovsxbd(zmm25, xmm10));
+ TEST_INSTRUCTION("62627D482109" , vpmovsxbd(zmm25, xmmword_ptr(rcx)));
+ TEST_INSTRUCTION("62227D48218CF034120000" , vpmovsxbd(zmm25, xmmword_ptr(rax, r14, 3, 4660)));
+ TEST_INSTRUCTION("62627D48214A7F" , vpmovsxbd(zmm25, xmmword_ptr(rdx, 2032)));
+ TEST_INSTRUCTION("62627D48218A00080000" , vpmovsxbd(zmm25, xmmword_ptr(rdx, 2048)));
+ TEST_INSTRUCTION("62627D48214A80" , vpmovsxbd(zmm25, xmmword_ptr(rdx, -2048)));
+ TEST_INSTRUCTION("62627D48218AF0F7FFFF" , vpmovsxbd(zmm25, xmmword_ptr(rdx, -2064)));
+ TEST_INSTRUCTION("62527D4822F6" , vpmovsxbq(zmm14, xmm14));
+ TEST_INSTRUCTION("62527D4D22F6" , k(k5).vpmovsxbq(zmm14, xmm14));
+ TEST_INSTRUCTION("62527DCD22F6" , k(k5).z().vpmovsxbq(zmm14, xmm14));
+ TEST_INSTRUCTION("62727D482231" , vpmovsxbq(zmm14, qword_ptr(rcx)));
+ TEST_INSTRUCTION("62327D4822B4F034120000" , vpmovsxbq(zmm14, qword_ptr(rax, r14, 3, 4660)));
+ TEST_INSTRUCTION("62727D4822727F" , vpmovsxbq(zmm14, qword_ptr(rdx, 1016)));
+ TEST_INSTRUCTION("62727D4822B200040000" , vpmovsxbq(zmm14, qword_ptr(rdx, 1024)));
+ TEST_INSTRUCTION("62727D48227280" , vpmovsxbq(zmm14, qword_ptr(rdx, -1024)));
+ TEST_INSTRUCTION("62727D4822B2F8FBFFFF" , vpmovsxbq(zmm14, qword_ptr(rdx, -1032)));
+ TEST_INSTRUCTION("62527D4825D9" , vpmovsxdq(zmm11, ymm9));
+ TEST_INSTRUCTION("62527D4E25D9" , k(k6).vpmovsxdq(zmm11, ymm9));
+ TEST_INSTRUCTION("62527DCE25D9" , k(k6).z().vpmovsxdq(zmm11, ymm9));
+ TEST_INSTRUCTION("62727D482519" , vpmovsxdq(zmm11, ymmword_ptr(rcx)));
+ TEST_INSTRUCTION("62327D48259CF034120000" , vpmovsxdq(zmm11, ymmword_ptr(rax, r14, 3, 4660)));
+ TEST_INSTRUCTION("62727D48255A7F" , vpmovsxdq(zmm11, ymmword_ptr(rdx, 4064)));
+ TEST_INSTRUCTION("62727D48259A00100000" , vpmovsxdq(zmm11, ymmword_ptr(rdx, 4096)));
+ TEST_INSTRUCTION("62727D48255A80" , vpmovsxdq(zmm11, ymmword_ptr(rdx, -4096)));
+ TEST_INSTRUCTION("62727D48259AE0EFFFFF" , vpmovsxdq(zmm11, ymmword_ptr(rdx, -4128)));
+ TEST_INSTRUCTION("62527D4823E3" , vpmovsxwd(zmm12, ymm11));
+ TEST_INSTRUCTION("62527D4A23E3" , k(k2).vpmovsxwd(zmm12, ymm11));
+ TEST_INSTRUCTION("62527DCA23E3" , k(k2).z().vpmovsxwd(zmm12, ymm11));
+ TEST_INSTRUCTION("62727D482321" , vpmovsxwd(zmm12, ymmword_ptr(rcx)));
+ TEST_INSTRUCTION("62327D4823A4F034120000" , vpmovsxwd(zmm12, ymmword_ptr(rax, r14, 3, 4660)));
+ TEST_INSTRUCTION("62727D4823627F" , vpmovsxwd(zmm12, ymmword_ptr(rdx, 4064)));
+ TEST_INSTRUCTION("62727D4823A200100000" , vpmovsxwd(zmm12, ymmword_ptr(rdx, 4096)));
+ TEST_INSTRUCTION("62727D48236280" , vpmovsxwd(zmm12, ymmword_ptr(rdx, -4096)));
+ TEST_INSTRUCTION("62727D4823A2E0EFFFFF" , vpmovsxwd(zmm12, ymmword_ptr(rdx, -4128)));
+ TEST_INSTRUCTION("62527D4824DE" , vpmovsxwq(zmm11, xmm14));
+ TEST_INSTRUCTION("62527D4D24DE" , k(k5).vpmovsxwq(zmm11, xmm14));
+ TEST_INSTRUCTION("62527DCD24DE" , k(k5).z().vpmovsxwq(zmm11, xmm14));
+ TEST_INSTRUCTION("62727D482419" , vpmovsxwq(zmm11, xmmword_ptr(rcx)));
+ TEST_INSTRUCTION("62327D48249CF034120000" , vpmovsxwq(zmm11, xmmword_ptr(rax, r14, 3, 4660)));
+ TEST_INSTRUCTION("62727D48245A7F" , vpmovsxwq(zmm11, xmmword_ptr(rdx, 2032)));
+ TEST_INSTRUCTION("62727D48249A00080000" , vpmovsxwq(zmm11, xmmword_ptr(rdx, 2048)));
+ TEST_INSTRUCTION("62727D48245A80" , vpmovsxwq(zmm11, xmmword_ptr(rdx, -2048)));
+ TEST_INSTRUCTION("62727D48249AF0F7FFFF" , vpmovsxwq(zmm11, xmmword_ptr(rdx, -2064)));
+ TEST_INSTRUCTION("62027D4831C9" , vpmovzxbd(zmm25, xmm25));
+ TEST_INSTRUCTION("62027D4C31C9" , k(k4).vpmovzxbd(zmm25, xmm25));
+ TEST_INSTRUCTION("62027DCC31C9" , k(k4).z().vpmovzxbd(zmm25, xmm25));
+ TEST_INSTRUCTION("62627D483109" , vpmovzxbd(zmm25, xmmword_ptr(rcx)));
+ TEST_INSTRUCTION("62227D48318CF034120000" , vpmovzxbd(zmm25, xmmword_ptr(rax, r14, 3, 4660)));
+ TEST_INSTRUCTION("62627D48314A7F" , vpmovzxbd(zmm25, xmmword_ptr(rdx, 2032)));
+ TEST_INSTRUCTION("62627D48318A00080000" , vpmovzxbd(zmm25, xmmword_ptr(rdx, 2048)));
+ TEST_INSTRUCTION("62627D48314A80" , vpmovzxbd(zmm25, xmmword_ptr(rdx, -2048)));
+ TEST_INSTRUCTION("62627D48318AF0F7FFFF" , vpmovzxbd(zmm25, xmmword_ptr(rdx, -2064)));
+ TEST_INSTRUCTION("62A27D4832FC" , vpmovzxbq(zmm23, xmm20));
+ TEST_INSTRUCTION("62A27D4B32FC" , k(k3).vpmovzxbq(zmm23, xmm20));
+ TEST_INSTRUCTION("62A27DCB32FC" , k(k3).z().vpmovzxbq(zmm23, xmm20));
+ TEST_INSTRUCTION("62E27D483239" , vpmovzxbq(zmm23, qword_ptr(rcx)));
+ TEST_INSTRUCTION("62A27D4832BCF034120000" , vpmovzxbq(zmm23, qword_ptr(rax, r14, 3, 4660)));
+ TEST_INSTRUCTION("62E27D48327A7F" , vpmovzxbq(zmm23, qword_ptr(rdx, 1016)));
+ TEST_INSTRUCTION("62E27D4832BA00040000" , vpmovzxbq(zmm23, qword_ptr(rdx, 1024)));
+ TEST_INSTRUCTION("62E27D48327A80" , vpmovzxbq(zmm23, qword_ptr(rdx, -1024)));
+ TEST_INSTRUCTION("62E27D4832BAF8FBFFFF" , vpmovzxbq(zmm23, qword_ptr(rdx, -1032)));
+ TEST_INSTRUCTION("62327D4835CE" , vpmovzxdq(zmm9, ymm22));
+ TEST_INSTRUCTION("62327D4B35CE" , k(k3).vpmovzxdq(zmm9, ymm22));
+ TEST_INSTRUCTION("62327DCB35CE" , k(k3).z().vpmovzxdq(zmm9, ymm22));
+ TEST_INSTRUCTION("62727D483509" , vpmovzxdq(zmm9, ymmword_ptr(rcx)));
+ TEST_INSTRUCTION("62327D48358CF034120000" , vpmovzxdq(zmm9, ymmword_ptr(rax, r14, 3, 4660)));
+ TEST_INSTRUCTION("62727D48354A7F" , vpmovzxdq(zmm9, ymmword_ptr(rdx, 4064)));
+ TEST_INSTRUCTION("62727D48358A00100000" , vpmovzxdq(zmm9, ymmword_ptr(rdx, 4096)));
+ TEST_INSTRUCTION("62727D48354A80" , vpmovzxdq(zmm9, ymmword_ptr(rdx, -4096)));
+ TEST_INSTRUCTION("62727D48358AE0EFFFFF" , vpmovzxdq(zmm9, ymmword_ptr(rdx, -4128)));
+ TEST_INSTRUCTION("62927D4833F5" , vpmovzxwd(zmm6, ymm29));
+ TEST_INSTRUCTION("62927D4C33F5" , k(k4).vpmovzxwd(zmm6, ymm29));
+ TEST_INSTRUCTION("62927DCC33F5" , k(k4).z().vpmovzxwd(zmm6, ymm29));
+ TEST_INSTRUCTION("62F27D483331" , vpmovzxwd(zmm6, ymmword_ptr(rcx)));
+ TEST_INSTRUCTION("62B27D4833B4F034120000" , vpmovzxwd(zmm6, ymmword_ptr(rax, r14, 3, 4660)));
+ TEST_INSTRUCTION("62F27D4833727F" , vpmovzxwd(zmm6, ymmword_ptr(rdx, 4064)));
+ TEST_INSTRUCTION("62F27D4833B200100000" , vpmovzxwd(zmm6, ymmword_ptr(rdx, 4096)));
+ TEST_INSTRUCTION("62F27D48337280" , vpmovzxwd(zmm6, ymmword_ptr(rdx, -4096)));
+ TEST_INSTRUCTION("62F27D4833B2E0EFFFFF" , vpmovzxwd(zmm6, ymmword_ptr(rdx, -4128)));
+ TEST_INSTRUCTION("62327D4834E2" , vpmovzxwq(zmm12, xmm18));
+ TEST_INSTRUCTION("62327D4E34E2" , k(k6).vpmovzxwq(zmm12, xmm18));
+ TEST_INSTRUCTION("62327DCE34E2" , k(k6).z().vpmovzxwq(zmm12, xmm18));
+ TEST_INSTRUCTION("62727D483421" , vpmovzxwq(zmm12, xmmword_ptr(rcx)));
+ TEST_INSTRUCTION("62327D4834A4F034120000" , vpmovzxwq(zmm12, xmmword_ptr(rax, r14, 3, 4660)));
+ TEST_INSTRUCTION("62727D4834627F" , vpmovzxwq(zmm12, xmmword_ptr(rdx, 2032)));
+ TEST_INSTRUCTION("62727D4834A200080000" , vpmovzxwq(zmm12, xmmword_ptr(rdx, 2048)));
+ TEST_INSTRUCTION("62727D48346280" , vpmovzxwq(zmm12, xmmword_ptr(rdx, -2048)));
+ TEST_INSTRUCTION("62727D4834A2F0F7FFFF" , vpmovzxwq(zmm12, xmmword_ptr(rdx, -2064)));
+ TEST_INSTRUCTION("62D2CD4028EC" , vpmuldq(zmm5, zmm22, zmm12));
+ TEST_INSTRUCTION("62D2CD4428EC" , k(k4).vpmuldq(zmm5, zmm22, zmm12));
+ TEST_INSTRUCTION("62D2CDC428EC" , k(k4).z().vpmuldq(zmm5, zmm22, zmm12));
+ TEST_INSTRUCTION("62F2CD402829" , vpmuldq(zmm5, zmm22, zmmword_ptr(rcx)));
+ TEST_INSTRUCTION("62B2CD4028ACF034120000" , vpmuldq(zmm5, zmm22, zmmword_ptr(rax, r14, 3, 4660)));
+ TEST_INSTRUCTION("62F2CD502829" , vpmuldq(zmm5, zmm22, qword_ptr(rcx)._1to8()));
+ TEST_INSTRUCTION("62F2CD40286A7F" , vpmuldq(zmm5, zmm22, zmmword_ptr(rdx, 8128)));
+ TEST_INSTRUCTION("62F2CD4028AA00200000" , vpmuldq(zmm5, zmm22, zmmword_ptr(rdx, 8192)));
+ TEST_INSTRUCTION("62F2CD40286A80" , vpmuldq(zmm5, zmm22, zmmword_ptr(rdx, -8192)));
+ TEST_INSTRUCTION("62F2CD4028AAC0DFFFFF" , vpmuldq(zmm5, zmm22, zmmword_ptr(rdx, -8256)));
+ TEST_INSTRUCTION("62F2CD50286A7F" , vpmuldq(zmm5, zmm22, qword_ptr(rdx, 1016)._1to8()));
+ TEST_INSTRUCTION("62F2CD5028AA00040000" , vpmuldq(zmm5, zmm22, qword_ptr(rdx, 1024)._1to8()));
+ TEST_INSTRUCTION("62F2CD50286A80" , vpmuldq(zmm5, zmm22, qword_ptr(rdx, -1024)._1to8()));
+ TEST_INSTRUCTION("62F2CD5028AAF8FBFFFF" , vpmuldq(zmm5, zmm22, qword_ptr(rdx, -1032)._1to8()));
+ TEST_INSTRUCTION("62723D4040E2" , vpmulld(zmm12, zmm24, zmm2));
+ TEST_INSTRUCTION("62723D4640E2" , k(k6).vpmulld(zmm12, zmm24, zmm2));
+ TEST_INSTRUCTION("62723DC640E2" , k(k6).z().vpmulld(zmm12, zmm24, zmm2));
+ TEST_INSTRUCTION("62723D404021" , vpmulld(zmm12, zmm24, zmmword_ptr(rcx)));
+ TEST_INSTRUCTION("62323D4040A4F034120000" , vpmulld(zmm12, zmm24, zmmword_ptr(rax, r14, 3, 4660)));
+ TEST_INSTRUCTION("62723D504021" , vpmulld(zmm12, zmm24, dword_ptr(rcx)._1to16()));
+ TEST_INSTRUCTION("62723D4040627F" , vpmulld(zmm12, zmm24, zmmword_ptr(rdx, 8128)));
+ TEST_INSTRUCTION("62723D4040A200200000" , vpmulld(zmm12, zmm24, zmmword_ptr(rdx, 8192)));
+ TEST_INSTRUCTION("62723D40406280" , vpmulld(zmm12, zmm24, zmmword_ptr(rdx, -8192)));
+ TEST_INSTRUCTION("62723D4040A2C0DFFFFF" , vpmulld(zmm12, zmm24, zmmword_ptr(rdx, -8256)));
+ TEST_INSTRUCTION("62723D5040627F" , vpmulld(zmm12, zmm24, dword_ptr(rdx, 508)._1to16()));
+ TEST_INSTRUCTION("62723D5040A200020000" , vpmulld(zmm12, zmm24, dword_ptr(rdx, 512)._1to16()));
+ TEST_INSTRUCTION("62723D50406280" , vpmulld(zmm12, zmm24, dword_ptr(rdx, -512)._1to16()));
+ TEST_INSTRUCTION("62723D5040A2FCFDFFFF" , vpmulld(zmm12, zmm24, dword_ptr(rdx, -516)._1to16()));
+ TEST_INSTRUCTION("6251ED48F4C2" , vpmuludq(zmm8, zmm2, zmm10));
+ TEST_INSTRUCTION("6251ED4FF4C2" , k(k7).vpmuludq(zmm8, zmm2, zmm10));
+ TEST_INSTRUCTION("6251EDCFF4C2" , k(k7).z().vpmuludq(zmm8, zmm2, zmm10));
+ TEST_INSTRUCTION("6271ED48F401" , vpmuludq(zmm8, zmm2, zmmword_ptr(rcx)));
+ TEST_INSTRUCTION("6231ED48F484F034120000" , vpmuludq(zmm8, zmm2, zmmword_ptr(rax, r14, 3, 4660)));
+ TEST_INSTRUCTION("6271ED58F401" , vpmuludq(zmm8, zmm2, qword_ptr(rcx)._1to8()));
+ TEST_INSTRUCTION("6271ED48F4427F" , vpmuludq(zmm8, zmm2, zmmword_ptr(rdx, 8128)));
+ TEST_INSTRUCTION("6271ED48F48200200000" , vpmuludq(zmm8, zmm2, zmmword_ptr(rdx, 8192)));
+ TEST_INSTRUCTION("6271ED48F44280" , vpmuludq(zmm8, zmm2, zmmword_ptr(rdx, -8192)));
+ TEST_INSTRUCTION("6271ED48F482C0DFFFFF" , vpmuludq(zmm8, zmm2, zmmword_ptr(rdx, -8256)));
+ TEST_INSTRUCTION("6271ED58F4427F" , vpmuludq(zmm8, zmm2, qword_ptr(rdx, 1016)._1to8()));
+ TEST_INSTRUCTION("6271ED58F48200040000" , vpmuludq(zmm8, zmm2, qword_ptr(rdx, 1024)._1to8()));
+ TEST_INSTRUCTION("6271ED58F44280" , vpmuludq(zmm8, zmm2, qword_ptr(rdx, -1024)._1to8()));
+ TEST_INSTRUCTION("6271ED58F482F8FBFFFF" , vpmuludq(zmm8, zmm2, qword_ptr(rdx, -1032)._1to8()));
+ TEST_INSTRUCTION("62412D48EBEF" , vpord(zmm29, zmm10, zmm15));
+ TEST_INSTRUCTION("62412D4CEBEF" , k(k4).vpord(zmm29, zmm10, zmm15));
+ TEST_INSTRUCTION("62412DCCEBEF" , k(k4).z().vpord(zmm29, zmm10, zmm15));
+ TEST_INSTRUCTION("62612D48EB29" , vpord(zmm29, zmm10, zmmword_ptr(rcx)));
+ TEST_INSTRUCTION("62212D48EBACF034120000" , vpord(zmm29, zmm10, zmmword_ptr(rax, r14, 3, 4660)));
+ TEST_INSTRUCTION("62612D58EB29" , vpord(zmm29, zmm10, dword_ptr(rcx)._1to16()));
+ TEST_INSTRUCTION("62612D48EB6A7F" , vpord(zmm29, zmm10, zmmword_ptr(rdx, 8128)));
+ TEST_INSTRUCTION("62612D48EBAA00200000" , vpord(zmm29, zmm10, zmmword_ptr(rdx, 8192)));
+ TEST_INSTRUCTION("62612D48EB6A80" , vpord(zmm29, zmm10, zmmword_ptr(rdx, -8192)));
+ TEST_INSTRUCTION("62612D48EBAAC0DFFFFF" , vpord(zmm29, zmm10, zmmword_ptr(rdx, -8256)));
+ TEST_INSTRUCTION("62612D58EB6A7F" , vpord(zmm29, zmm10, dword_ptr(rdx, 508)._1to16()));
+ TEST_INSTRUCTION("62612D58EBAA00020000" , vpord(zmm29, zmm10, dword_ptr(rdx, 512)._1to16()));
+ TEST_INSTRUCTION("62612D58EB6A80" , vpord(zmm29, zmm10, dword_ptr(rdx, -512)._1to16()));
+ TEST_INSTRUCTION("62612D58EBAAFCFDFFFF" , vpord(zmm29, zmm10, dword_ptr(rdx, -516)._1to16()));
+ TEST_INSTRUCTION("6291C540EBDA" , vporq(zmm3, zmm23, zmm26));
+ TEST_INSTRUCTION("6291C544EBDA" , k(k4).vporq(zmm3, zmm23, zmm26));
+ TEST_INSTRUCTION("6291C5C4EBDA" , k(k4).z().vporq(zmm3, zmm23, zmm26));
+ TEST_INSTRUCTION("62F1C540EB19" , vporq(zmm3, zmm23, zmmword_ptr(rcx)));
+ TEST_INSTRUCTION("62B1C540EB9CF034120000" , vporq(zmm3, zmm23, zmmword_ptr(rax, r14, 3, 4660)));
+ TEST_INSTRUCTION("62F1C550EB19" , vporq(zmm3, zmm23, qword_ptr(rcx)._1to8()));
+ TEST_INSTRUCTION("62F1C540EB5A7F" , vporq(zmm3, zmm23, zmmword_ptr(rdx, 8128)));
+ TEST_INSTRUCTION("62F1C540EB9A00200000" , vporq(zmm3, zmm23, zmmword_ptr(rdx, 8192)));
+ TEST_INSTRUCTION("62F1C540EB5A80" , vporq(zmm3, zmm23, zmmword_ptr(rdx, -8192)));
+ TEST_INSTRUCTION("62F1C540EB9AC0DFFFFF" , vporq(zmm3, zmm23, zmmword_ptr(rdx, -8256)));
+ TEST_INSTRUCTION("62F1C550EB5A7F" , vporq(zmm3, zmm23, qword_ptr(rdx, 1016)._1to8()));
+ TEST_INSTRUCTION("62F1C550EB9A00040000" , vporq(zmm3, zmm23, qword_ptr(rdx, 1024)._1to8()));
+ TEST_INSTRUCTION("62F1C550EB5A80" , vporq(zmm3, zmm23, qword_ptr(rdx, -1024)._1to8()));
+ TEST_INSTRUCTION("62F1C550EB9AF8FBFFFF" , vporq(zmm3, zmm23, qword_ptr(rdx, -1032)._1to8()));
+ TEST_INSTRUCTION("62D17D4870FCAB" , vpshufd(zmm7, zmm12, 171));
+ TEST_INSTRUCTION("62D17D4970FCAB" , k(k1).vpshufd(zmm7, zmm12, 171));
+ TEST_INSTRUCTION("62D17DC970FCAB" , k(k1).z().vpshufd(zmm7, zmm12, 171));
+ TEST_INSTRUCTION("62D17D4870FC7B" , vpshufd(zmm7, zmm12, 123));
+ TEST_INSTRUCTION("62F17D4870397B" , vpshufd(zmm7, zmmword_ptr(rcx), 123));
+ TEST_INSTRUCTION("62B17D4870BCF0341200007B" , vpshufd(zmm7, zmmword_ptr(rax, r14, 3, 4660), 123));
+ TEST_INSTRUCTION("62F17D5870397B" , vpshufd(zmm7, dword_ptr(rcx)._1to16(), 123));
+ TEST_INSTRUCTION("62F17D48707A7F7B" , vpshufd(zmm7, zmmword_ptr(rdx, 8128), 123));
+ TEST_INSTRUCTION("62F17D4870BA002000007B" , vpshufd(zmm7, zmmword_ptr(rdx, 8192), 123));
+ TEST_INSTRUCTION("62F17D48707A807B" , vpshufd(zmm7, zmmword_ptr(rdx, -8192), 123));
+ TEST_INSTRUCTION("62F17D4870BAC0DFFFFF7B" , vpshufd(zmm7, zmmword_ptr(rdx, -8256), 123));
+ TEST_INSTRUCTION("62F17D58707A7F7B" , vpshufd(zmm7, dword_ptr(rdx, 508)._1to16(), 123));
+ TEST_INSTRUCTION("62F17D5870BA000200007B" , vpshufd(zmm7, dword_ptr(rdx, 512)._1to16(), 123));
+ TEST_INSTRUCTION("62F17D58707A807B" , vpshufd(zmm7, dword_ptr(rdx, -512)._1to16(), 123));
+ TEST_INSTRUCTION("62F17D5870BAFCFDFFFF7B" , vpshufd(zmm7, dword_ptr(rdx, -516)._1to16(), 123));
+ TEST_INSTRUCTION("62D14D40F2FE" , vpslld(zmm7, zmm22, xmm14));
+ TEST_INSTRUCTION("62D14D44F2FE" , k(k4).vpslld(zmm7, zmm22, xmm14));
+ TEST_INSTRUCTION("62D14DC4F2FE" , k(k4).z().vpslld(zmm7, zmm22, xmm14));
+ TEST_INSTRUCTION("62F14D40F239" , vpslld(zmm7, zmm22, xmmword_ptr(rcx)));
+ TEST_INSTRUCTION("62B14D40F2BCF034120000" , vpslld(zmm7, zmm22, xmmword_ptr(rax, r14, 3, 4660)));
+ TEST_INSTRUCTION("62F14D40F27A7F" , vpslld(zmm7, zmm22, xmmword_ptr(rdx, 2032)));
+ TEST_INSTRUCTION("62F14D40F2BA00080000" , vpslld(zmm7, zmm22, xmmword_ptr(rdx, 2048)));
+ TEST_INSTRUCTION("62F14D40F27A80" , vpslld(zmm7, zmm22, xmmword_ptr(rdx, -2048)));
+ TEST_INSTRUCTION("62F14D40F2BAF0F7FFFF" , vpslld(zmm7, zmm22, xmmword_ptr(rdx, -2064)));
+ TEST_INSTRUCTION("6201ED48F3EB" , vpsllq(zmm29, zmm2, xmm27));
+ TEST_INSTRUCTION("6201ED4DF3EB" , k(k5).vpsllq(zmm29, zmm2, xmm27));
+ TEST_INSTRUCTION("6201EDCDF3EB" , k(k5).z().vpsllq(zmm29, zmm2, xmm27));
+ TEST_INSTRUCTION("6261ED48F329" , vpsllq(zmm29, zmm2, xmmword_ptr(rcx)));
+ TEST_INSTRUCTION("6221ED48F3ACF034120000" , vpsllq(zmm29, zmm2, xmmword_ptr(rax, r14, 3, 4660)));
+ TEST_INSTRUCTION("6261ED48F36A7F" , vpsllq(zmm29, zmm2, xmmword_ptr(rdx, 2032)));
+ TEST_INSTRUCTION("6261ED48F3AA00080000" , vpsllq(zmm29, zmm2, xmmword_ptr(rdx, 2048)));
+ TEST_INSTRUCTION("6261ED48F36A80" , vpsllq(zmm29, zmm2, xmmword_ptr(rdx, -2048)));
+ TEST_INSTRUCTION("6261ED48F3AAF0F7FFFF" , vpsllq(zmm29, zmm2, xmmword_ptr(rdx, -2064)));
+ TEST_INSTRUCTION("6242654847EF" , vpsllvd(zmm29, zmm3, zmm15));
+ TEST_INSTRUCTION("6242654F47EF" , k(k7).vpsllvd(zmm29, zmm3, zmm15));
+ TEST_INSTRUCTION("624265CF47EF" , k(k7).z().vpsllvd(zmm29, zmm3, zmm15));
+ TEST_INSTRUCTION("626265484729" , vpsllvd(zmm29, zmm3, zmmword_ptr(rcx)));
+ TEST_INSTRUCTION("6222654847ACF034120000" , vpsllvd(zmm29, zmm3, zmmword_ptr(rax, r14, 3, 4660)));
+ TEST_INSTRUCTION("626265584729" , vpsllvd(zmm29, zmm3, dword_ptr(rcx)._1to16()));
+ TEST_INSTRUCTION("62626548476A7F" , vpsllvd(zmm29, zmm3, zmmword_ptr(rdx, 8128)));
+ TEST_INSTRUCTION("6262654847AA00200000" , vpsllvd(zmm29, zmm3, zmmword_ptr(rdx, 8192)));
+ TEST_INSTRUCTION("62626548476A80" , vpsllvd(zmm29, zmm3, zmmword_ptr(rdx, -8192)));
+ TEST_INSTRUCTION("6262654847AAC0DFFFFF" , vpsllvd(zmm29, zmm3, zmmword_ptr(rdx, -8256)));
+ TEST_INSTRUCTION("62626558476A7F" , vpsllvd(zmm29, zmm3, dword_ptr(rdx, 508)._1to16()));
+ TEST_INSTRUCTION("6262655847AA00020000" , vpsllvd(zmm29, zmm3, dword_ptr(rdx, 512)._1to16()));
+ TEST_INSTRUCTION("62626558476A80" , vpsllvd(zmm29, zmm3, dword_ptr(rdx, -512)._1to16()));
+ TEST_INSTRUCTION("6262655847AAFCFDFFFF" , vpsllvd(zmm29, zmm3, dword_ptr(rdx, -516)._1to16()));
+ TEST_INSTRUCTION("62D2954047E5" , vpsllvq(zmm4, zmm29, zmm13));
+ TEST_INSTRUCTION("62D2954547E5" , k(k5).vpsllvq(zmm4, zmm29, zmm13));
+ TEST_INSTRUCTION("62D295C547E5" , k(k5).z().vpsllvq(zmm4, zmm29, zmm13));
+ TEST_INSTRUCTION("62F295404721" , vpsllvq(zmm4, zmm29, zmmword_ptr(rcx)));
+ TEST_INSTRUCTION("62B2954047A4F034120000" , vpsllvq(zmm4, zmm29, zmmword_ptr(rax, r14, 3, 4660)));
+ TEST_INSTRUCTION("62F295504721" , vpsllvq(zmm4, zmm29, qword_ptr(rcx)._1to8()));
+ TEST_INSTRUCTION("62F2954047627F" , vpsllvq(zmm4, zmm29, zmmword_ptr(rdx, 8128)));
+ TEST_INSTRUCTION("62F2954047A200200000" , vpsllvq(zmm4, zmm29, zmmword_ptr(rdx, 8192)));
+ TEST_INSTRUCTION("62F29540476280" , vpsllvq(zmm4, zmm29, zmmword_ptr(rdx, -8192)));
+ TEST_INSTRUCTION("62F2954047A2C0DFFFFF" , vpsllvq(zmm4, zmm29, zmmword_ptr(rdx, -8256)));
+ TEST_INSTRUCTION("62F2955047627F" , vpsllvq(zmm4, zmm29, qword_ptr(rdx, 1016)._1to8()));
+ TEST_INSTRUCTION("62F2955047A200040000" , vpsllvq(zmm4, zmm29, qword_ptr(rdx, 1024)._1to8()));
+ TEST_INSTRUCTION("62F29550476280" , vpsllvq(zmm4, zmm29, qword_ptr(rdx, -1024)._1to8()));
+ TEST_INSTRUCTION("62F2955047A2F8FBFFFF" , vpsllvq(zmm4, zmm29, qword_ptr(rdx, -1032)._1to8()));
+ TEST_INSTRUCTION("62812D48E2D9" , vpsrad(zmm19, zmm10, xmm25));
+ TEST_INSTRUCTION("62812D4AE2D9" , k(k2).vpsrad(zmm19, zmm10, xmm25));
+ TEST_INSTRUCTION("62812DCAE2D9" , k(k2).z().vpsrad(zmm19, zmm10, xmm25));
+ TEST_INSTRUCTION("62E12D48E219" , vpsrad(zmm19, zmm10, xmmword_ptr(rcx)));
+ TEST_INSTRUCTION("62A12D48E29CF034120000" , vpsrad(zmm19, zmm10, xmmword_ptr(rax, r14, 3, 4660)));
+ TEST_INSTRUCTION("62E12D48E25A7F" , vpsrad(zmm19, zmm10, xmmword_ptr(rdx, 2032)));
+ TEST_INSTRUCTION("62E12D48E29A00080000" , vpsrad(zmm19, zmm10, xmmword_ptr(rdx, 2048)));
+ TEST_INSTRUCTION("62E12D48E25A80" , vpsrad(zmm19, zmm10, xmmword_ptr(rdx, -2048)));
+ TEST_INSTRUCTION("62E12D48E29AF0F7FFFF" , vpsrad(zmm19, zmm10, xmmword_ptr(rdx, -2064)));
+ TEST_INSTRUCTION("62A1C540E2FA" , vpsraq(zmm23, zmm23, xmm18));
+ TEST_INSTRUCTION("62A1C544E2FA" , k(k4).vpsraq(zmm23, zmm23, xmm18));
+ TEST_INSTRUCTION("62A1C5C4E2FA" , k(k4).z().vpsraq(zmm23, zmm23, xmm18));
+ TEST_INSTRUCTION("62E1C540E239" , vpsraq(zmm23, zmm23, xmmword_ptr(rcx)));
+ TEST_INSTRUCTION("62A1C540E2BCF034120000" , vpsraq(zmm23, zmm23, xmmword_ptr(rax, r14, 3, 4660)));
+ TEST_INSTRUCTION("62E1C540E27A7F" , vpsraq(zmm23, zmm23, xmmword_ptr(rdx, 2032)));
+ TEST_INSTRUCTION("62E1C540E2BA00080000" , vpsraq(zmm23, zmm23, xmmword_ptr(rdx, 2048)));
+ TEST_INSTRUCTION("62E1C540E27A80" , vpsraq(zmm23, zmm23, xmmword_ptr(rdx, -2048)));
+ TEST_INSTRUCTION("62E1C540E2BAF0F7FFFF" , vpsraq(zmm23, zmm23, xmmword_ptr(rdx, -2064)));
+ TEST_INSTRUCTION("62E2554846CE" , vpsravd(zmm17, zmm5, zmm6));
+ TEST_INSTRUCTION("62E2554E46CE" , k(k6).vpsravd(zmm17, zmm5, zmm6));
+ TEST_INSTRUCTION("62E255CE46CE" , k(k6).z().vpsravd(zmm17, zmm5, zmm6));
+ TEST_INSTRUCTION("62E255484609" , vpsravd(zmm17, zmm5, zmmword_ptr(rcx)));
+ TEST_INSTRUCTION("62A25548468CF034120000" , vpsravd(zmm17, zmm5, zmmword_ptr(rax, r14, 3, 4660)));
+ TEST_INSTRUCTION("62E255584609" , vpsravd(zmm17, zmm5, dword_ptr(rcx)._1to16()));
+ TEST_INSTRUCTION("62E25548464A7F" , vpsravd(zmm17, zmm5, zmmword_ptr(rdx, 8128)));
+ TEST_INSTRUCTION("62E25548468A00200000" , vpsravd(zmm17, zmm5, zmmword_ptr(rdx, 8192)));
+ TEST_INSTRUCTION("62E25548464A80" , vpsravd(zmm17, zmm5, zmmword_ptr(rdx, -8192)));
+ TEST_INSTRUCTION("62E25548468AC0DFFFFF" , vpsravd(zmm17, zmm5, zmmword_ptr(rdx, -8256)));
+ TEST_INSTRUCTION("62E25558464A7F" , vpsravd(zmm17, zmm5, dword_ptr(rdx, 508)._1to16()));
+ TEST_INSTRUCTION("62E25558468A00020000" , vpsravd(zmm17, zmm5, dword_ptr(rdx, 512)._1to16()));
+ TEST_INSTRUCTION("62E25558464A80" , vpsravd(zmm17, zmm5, dword_ptr(rdx, -512)._1to16()));
+ TEST_INSTRUCTION("62E25558468AFCFDFFFF" , vpsravd(zmm17, zmm5, dword_ptr(rdx, -516)._1to16()));
+ TEST_INSTRUCTION("6292BD4846DA" , vpsravq(zmm3, zmm8, zmm26));
+ TEST_INSTRUCTION("6292BD4946DA" , k(k1).vpsravq(zmm3, zmm8, zmm26));
+ TEST_INSTRUCTION("6292BDC946DA" , k(k1).z().vpsravq(zmm3, zmm8, zmm26));
+ TEST_INSTRUCTION("62F2BD484619" , vpsravq(zmm3, zmm8, zmmword_ptr(rcx)));
+ TEST_INSTRUCTION("62B2BD48469CF034120000" , vpsravq(zmm3, zmm8, zmmword_ptr(rax, r14, 3, 4660)));
+ TEST_INSTRUCTION("62F2BD584619" , vpsravq(zmm3, zmm8, qword_ptr(rcx)._1to8()));
+ TEST_INSTRUCTION("62F2BD48465A7F" , vpsravq(zmm3, zmm8, zmmword_ptr(rdx, 8128)));
+ TEST_INSTRUCTION("62F2BD48469A00200000" , vpsravq(zmm3, zmm8, zmmword_ptr(rdx, 8192)));
+ TEST_INSTRUCTION("62F2BD48465A80" , vpsravq(zmm3, zmm8, zmmword_ptr(rdx, -8192)));
+ TEST_INSTRUCTION("62F2BD48469AC0DFFFFF" , vpsravq(zmm3, zmm8, zmmword_ptr(rdx, -8256)));
+ TEST_INSTRUCTION("62F2BD58465A7F" , vpsravq(zmm3, zmm8, qword_ptr(rdx, 1016)._1to8()));
+ TEST_INSTRUCTION("62F2BD58469A00040000" , vpsravq(zmm3, zmm8, qword_ptr(rdx, 1024)._1to8()));
+ TEST_INSTRUCTION("62F2BD58465A80" , vpsravq(zmm3, zmm8, qword_ptr(rdx, -1024)._1to8()));
+ TEST_INSTRUCTION("62F2BD58469AF8FBFFFF" , vpsravq(zmm3, zmm8, qword_ptr(rdx, -1032)._1to8()));
+ TEST_INSTRUCTION("62216540D2CF" , vpsrld(zmm25, zmm19, xmm23));
+ TEST_INSTRUCTION("62216546D2CF" , k(k6).vpsrld(zmm25, zmm19, xmm23));
+ TEST_INSTRUCTION("622165C6D2CF" , k(k6).z().vpsrld(zmm25, zmm19, xmm23));
+ TEST_INSTRUCTION("62616540D209" , vpsrld(zmm25, zmm19, xmmword_ptr(rcx)));
+ TEST_INSTRUCTION("62216540D28CF034120000" , vpsrld(zmm25, zmm19, xmmword_ptr(rax, r14, 3, 4660)));
+ TEST_INSTRUCTION("62616540D24A7F" , vpsrld(zmm25, zmm19, xmmword_ptr(rdx, 2032)));
+ TEST_INSTRUCTION("62616540D28A00080000" , vpsrld(zmm25, zmm19, xmmword_ptr(rdx, 2048)));
+ TEST_INSTRUCTION("62616540D24A80" , vpsrld(zmm25, zmm19, xmmword_ptr(rdx, -2048)));
+ TEST_INSTRUCTION("62616540D28AF0F7FFFF" , vpsrld(zmm25, zmm19, xmmword_ptr(rdx, -2064)));
+ TEST_INSTRUCTION("62A1AD48D3DD" , vpsrlq(zmm19, zmm10, xmm21));
+ TEST_INSTRUCTION("62A1AD4CD3DD" , k(k4).vpsrlq(zmm19, zmm10, xmm21));
+ TEST_INSTRUCTION("62A1ADCCD3DD" , k(k4).z().vpsrlq(zmm19, zmm10, xmm21));
+ TEST_INSTRUCTION("62E1AD48D319" , vpsrlq(zmm19, zmm10, xmmword_ptr(rcx)));
+ TEST_INSTRUCTION("62A1AD48D39CF034120000" , vpsrlq(zmm19, zmm10, xmmword_ptr(rax, r14, 3, 4660)));
+ TEST_INSTRUCTION("62E1AD48D35A7F" , vpsrlq(zmm19, zmm10, xmmword_ptr(rdx, 2032)));
+ TEST_INSTRUCTION("62E1AD48D39A00080000" , vpsrlq(zmm19, zmm10, xmmword_ptr(rdx, 2048)));
+ TEST_INSTRUCTION("62E1AD48D35A80" , vpsrlq(zmm19, zmm10, xmmword_ptr(rdx, -2048)));
+ TEST_INSTRUCTION("62E1AD48D39AF0F7FFFF" , vpsrlq(zmm19, zmm10, xmmword_ptr(rdx, -2064)));
+ TEST_INSTRUCTION("62D25D4845D3" , vpsrlvd(zmm2, zmm4, zmm11));
+ TEST_INSTRUCTION("62D25D4F45D3" , k(k7).vpsrlvd(zmm2, zmm4, zmm11));
+ TEST_INSTRUCTION("62D25DCF45D3" , k(k7).z().vpsrlvd(zmm2, zmm4, zmm11));
+ TEST_INSTRUCTION("62F25D484511" , vpsrlvd(zmm2, zmm4, zmmword_ptr(rcx)));
+ TEST_INSTRUCTION("62B25D484594F034120000" , vpsrlvd(zmm2, zmm4, zmmword_ptr(rax, r14, 3, 4660)));
+ TEST_INSTRUCTION("62F25D584511" , vpsrlvd(zmm2, zmm4, dword_ptr(rcx)._1to16()));
+ TEST_INSTRUCTION("62F25D4845527F" , vpsrlvd(zmm2, zmm4, zmmword_ptr(rdx, 8128)));
+ TEST_INSTRUCTION("62F25D48459200200000" , vpsrlvd(zmm2, zmm4, zmmword_ptr(rdx, 8192)));
+ TEST_INSTRUCTION("62F25D48455280" , vpsrlvd(zmm2, zmm4, zmmword_ptr(rdx, -8192)));
+ TEST_INSTRUCTION("62F25D484592C0DFFFFF" , vpsrlvd(zmm2, zmm4, zmmword_ptr(rdx, -8256)));
+ TEST_INSTRUCTION("62F25D5845527F" , vpsrlvd(zmm2, zmm4, dword_ptr(rdx, 508)._1to16()));
+ TEST_INSTRUCTION("62F25D58459200020000" , vpsrlvd(zmm2, zmm4, dword_ptr(rdx, 512)._1to16()));
+ TEST_INSTRUCTION("62F25D58455280" , vpsrlvd(zmm2, zmm4, dword_ptr(rdx, -512)._1to16()));
+ TEST_INSTRUCTION("62F25D584592FCFDFFFF" , vpsrlvd(zmm2, zmm4, dword_ptr(rdx, -516)._1to16()));
+ TEST_INSTRUCTION("62529D4045C7" , vpsrlvq(zmm8, zmm28, zmm15));
+ TEST_INSTRUCTION("62529D4545C7" , k(k5).vpsrlvq(zmm8, zmm28, zmm15));
+ TEST_INSTRUCTION("62529DC545C7" , k(k5).z().vpsrlvq(zmm8, zmm28, zmm15));
+ TEST_INSTRUCTION("62729D404501" , vpsrlvq(zmm8, zmm28, zmmword_ptr(rcx)));
+ TEST_INSTRUCTION("62329D404584F034120000" , vpsrlvq(zmm8, zmm28, zmmword_ptr(rax, r14, 3, 4660)));
+ TEST_INSTRUCTION("62729D504501" , vpsrlvq(zmm8, zmm28, qword_ptr(rcx)._1to8()));
+ TEST_INSTRUCTION("62729D4045427F" , vpsrlvq(zmm8, zmm28, zmmword_ptr(rdx, 8128)));
+ TEST_INSTRUCTION("62729D40458200200000" , vpsrlvq(zmm8, zmm28, zmmword_ptr(rdx, 8192)));
+ TEST_INSTRUCTION("62729D40454280" , vpsrlvq(zmm8, zmm28, zmmword_ptr(rdx, -8192)));
+ TEST_INSTRUCTION("62729D404582C0DFFFFF" , vpsrlvq(zmm8, zmm28, zmmword_ptr(rdx, -8256)));
+ TEST_INSTRUCTION("62729D5045427F" , vpsrlvq(zmm8, zmm28, qword_ptr(rdx, 1016)._1to8()));
+ TEST_INSTRUCTION("62729D50458200040000" , vpsrlvq(zmm8, zmm28, qword_ptr(rdx, 1024)._1to8()));
+ TEST_INSTRUCTION("62729D50454280" , vpsrlvq(zmm8, zmm28, qword_ptr(rdx, -1024)._1to8()));
+ TEST_INSTRUCTION("62729D504582F8FBFFFF" , vpsrlvq(zmm8, zmm28, qword_ptr(rdx, -1032)._1to8()));
+ TEST_INSTRUCTION("62D1254872D1AB" , vpsrld(zmm11, zmm9, 171));
+ TEST_INSTRUCTION("62D1254E72D1AB" , k(k6).vpsrld(zmm11, zmm9, 171));
+ TEST_INSTRUCTION("62D125CE72D1AB" , k(k6).z().vpsrld(zmm11, zmm9, 171));
+ TEST_INSTRUCTION("62D1254872D17B" , vpsrld(zmm11, zmm9, 123));
+ TEST_INSTRUCTION("62F1254872117B" , vpsrld(zmm11, zmmword_ptr(rcx), 123));
+ TEST_INSTRUCTION("62B125487294F0341200007B" , vpsrld(zmm11, zmmword_ptr(rax, r14, 3, 4660), 123));
+ TEST_INSTRUCTION("62F1255872117B" , vpsrld(zmm11, dword_ptr(rcx)._1to16(), 123));
+ TEST_INSTRUCTION("62F1254872527F7B" , vpsrld(zmm11, zmmword_ptr(rdx, 8128), 123));
+ TEST_INSTRUCTION("62F125487292002000007B" , vpsrld(zmm11, zmmword_ptr(rdx, 8192), 123));
+ TEST_INSTRUCTION("62F125487252807B" , vpsrld(zmm11, zmmword_ptr(rdx, -8192), 123));
+ TEST_INSTRUCTION("62F125487292C0DFFFFF7B" , vpsrld(zmm11, zmmword_ptr(rdx, -8256), 123));
+ TEST_INSTRUCTION("62F1255872527F7B" , vpsrld(zmm11, dword_ptr(rdx, 508)._1to16(), 123));
+ TEST_INSTRUCTION("62F125587292000200007B" , vpsrld(zmm11, dword_ptr(rdx, 512)._1to16(), 123));
+ TEST_INSTRUCTION("62F125587252807B" , vpsrld(zmm11, dword_ptr(rdx, -512)._1to16(), 123));
+ TEST_INSTRUCTION("62F125587292FCFDFFFF7B" , vpsrld(zmm11, dword_ptr(rdx, -516)._1to16(), 123));
+ TEST_INSTRUCTION("62D1CD4873D6AB" , vpsrlq(zmm6, zmm14, 171));
+ TEST_INSTRUCTION("62D1CD4D73D6AB" , k(k5).vpsrlq(zmm6, zmm14, 171));
+ TEST_INSTRUCTION("62D1CDCD73D6AB" , k(k5).z().vpsrlq(zmm6, zmm14, 171));
+ TEST_INSTRUCTION("62D1CD4873D67B" , vpsrlq(zmm6, zmm14, 123));
+ TEST_INSTRUCTION("62F1CD4873117B" , vpsrlq(zmm6, zmmword_ptr(rcx), 123));
+ TEST_INSTRUCTION("62B1CD487394F0341200007B" , vpsrlq(zmm6, zmmword_ptr(rax, r14, 3, 4660), 123));
+ TEST_INSTRUCTION("62F1CD5873117B" , vpsrlq(zmm6, qword_ptr(rcx)._1to8(), 123));
+ TEST_INSTRUCTION("62F1CD4873527F7B" , vpsrlq(zmm6, zmmword_ptr(rdx, 8128), 123));
+ TEST_INSTRUCTION("62F1CD487392002000007B" , vpsrlq(zmm6, zmmword_ptr(rdx, 8192), 123));
+ TEST_INSTRUCTION("62F1CD487352807B" , vpsrlq(zmm6, zmmword_ptr(rdx, -8192), 123));
+ TEST_INSTRUCTION("62F1CD487392C0DFFFFF7B" , vpsrlq(zmm6, zmmword_ptr(rdx, -8256), 123));
+ TEST_INSTRUCTION("62F1CD5873527F7B" , vpsrlq(zmm6, qword_ptr(rdx, 1016)._1to8(), 123));
+ TEST_INSTRUCTION("62F1CD587392000400007B" , vpsrlq(zmm6, qword_ptr(rdx, 1024)._1to8(), 123));
+ TEST_INSTRUCTION("62F1CD587352807B" , vpsrlq(zmm6, qword_ptr(rdx, -1024)._1to8(), 123));
+ TEST_INSTRUCTION("62F1CD587392F8FBFFFF7B" , vpsrlq(zmm6, qword_ptr(rdx, -1032)._1to8(), 123));
+ TEST_INSTRUCTION("62210D48FAD7" , vpsubd(zmm26, zmm14, zmm23));
+ TEST_INSTRUCTION("62210D4FFAD7" , k(k7).vpsubd(zmm26, zmm14, zmm23));
+ TEST_INSTRUCTION("62210DCFFAD7" , k(k7).z().vpsubd(zmm26, zmm14, zmm23));
+ TEST_INSTRUCTION("62610D48FA11" , vpsubd(zmm26, zmm14, zmmword_ptr(rcx)));
+ TEST_INSTRUCTION("62210D48FA94F034120000" , vpsubd(zmm26, zmm14, zmmword_ptr(rax, r14, 3, 4660)));
+ TEST_INSTRUCTION("62610D58FA11" , vpsubd(zmm26, zmm14, dword_ptr(rcx)._1to16()));
+ TEST_INSTRUCTION("62610D48FA527F" , vpsubd(zmm26, zmm14, zmmword_ptr(rdx, 8128)));
+ TEST_INSTRUCTION("62610D48FA9200200000" , vpsubd(zmm26, zmm14, zmmword_ptr(rdx, 8192)));
+ TEST_INSTRUCTION("62610D48FA5280" , vpsubd(zmm26, zmm14, zmmword_ptr(rdx, -8192)));
+ TEST_INSTRUCTION("62610D48FA92C0DFFFFF" , vpsubd(zmm26, zmm14, zmmword_ptr(rdx, -8256)));
+ TEST_INSTRUCTION("62610D58FA527F" , vpsubd(zmm26, zmm14, dword_ptr(rdx, 508)._1to16()));
+ TEST_INSTRUCTION("62610D58FA9200020000" , vpsubd(zmm26, zmm14, dword_ptr(rdx, 512)._1to16()));
+ TEST_INSTRUCTION("62610D58FA5280" , vpsubd(zmm26, zmm14, dword_ptr(rdx, -512)._1to16()));
+ TEST_INSTRUCTION("62610D58FA92FCFDFFFF" , vpsubd(zmm26, zmm14, dword_ptr(rdx, -516)._1to16()));
+ TEST_INSTRUCTION("62A1BD48FBC7" , vpsubq(zmm16, zmm8, zmm23));
+ TEST_INSTRUCTION("62A1BD4FFBC7" , k(k7).vpsubq(zmm16, zmm8, zmm23));
+ TEST_INSTRUCTION("62A1BDCFFBC7" , k(k7).z().vpsubq(zmm16, zmm8, zmm23));
+ TEST_INSTRUCTION("62E1BD48FB01" , vpsubq(zmm16, zmm8, zmmword_ptr(rcx)));
+ TEST_INSTRUCTION("62A1BD48FB84F034120000" , vpsubq(zmm16, zmm8, zmmword_ptr(rax, r14, 3, 4660)));
+ TEST_INSTRUCTION("62E1BD58FB01" , vpsubq(zmm16, zmm8, qword_ptr(rcx)._1to8()));
+ TEST_INSTRUCTION("62E1BD48FB427F" , vpsubq(zmm16, zmm8, zmmword_ptr(rdx, 8128)));
+ TEST_INSTRUCTION("62E1BD48FB8200200000" , vpsubq(zmm16, zmm8, zmmword_ptr(rdx, 8192)));
+ TEST_INSTRUCTION("62E1BD48FB4280" , vpsubq(zmm16, zmm8, zmmword_ptr(rdx, -8192)));
+ TEST_INSTRUCTION("62E1BD48FB82C0DFFFFF" , vpsubq(zmm16, zmm8, zmmword_ptr(rdx, -8256)));
+ TEST_INSTRUCTION("62E1BD58FB427F" , vpsubq(zmm16, zmm8, qword_ptr(rdx, 1016)._1to8()));
+ TEST_INSTRUCTION("62E1BD58FB8200040000" , vpsubq(zmm16, zmm8, qword_ptr(rdx, 1024)._1to8()));
+ TEST_INSTRUCTION("62E1BD58FB4280" , vpsubq(zmm16, zmm8, qword_ptr(rdx, -1024)._1to8()));
+ TEST_INSTRUCTION("62E1BD58FB82F8FBFFFF" , vpsubq(zmm16, zmm8, qword_ptr(rdx, -1032)._1to8()));
+ TEST_INSTRUCTION("62923D4027D0" , vptestmd(k2, zmm24, zmm24));
+ TEST_INSTRUCTION("62923D4227D0" , k(k2).vptestmd(k2, zmm24, zmm24));
+ TEST_INSTRUCTION("62F23D402711" , vptestmd(k2, zmm24, zmmword_ptr(rcx)));
+ TEST_INSTRUCTION("62B23D402794F034120000" , vptestmd(k2, zmm24, zmmword_ptr(rax, r14, 3, 4660)));
+ TEST_INSTRUCTION("62F23D502711" , vptestmd(k2, zmm24, dword_ptr(rcx)._1to16()));
+ TEST_INSTRUCTION("62F23D4027527F" , vptestmd(k2, zmm24, zmmword_ptr(rdx, 8128)));
+ TEST_INSTRUCTION("62F23D40279200200000" , vptestmd(k2, zmm24, zmmword_ptr(rdx, 8192)));
+ TEST_INSTRUCTION("62F23D40275280" , vptestmd(k2, zmm24, zmmword_ptr(rdx, -8192)));
+ TEST_INSTRUCTION("62F23D402792C0DFFFFF" , vptestmd(k2, zmm24, zmmword_ptr(rdx, -8256)));
+ TEST_INSTRUCTION("62F23D5027527F" , vptestmd(k2, zmm24, dword_ptr(rdx, 508)._1to16()));
+ TEST_INSTRUCTION("62F23D50279200020000" , vptestmd(k2, zmm24, dword_ptr(rdx, 512)._1to16()));
+ TEST_INSTRUCTION("62F23D50275280" , vptestmd(k2, zmm24, dword_ptr(rdx, -512)._1to16()));
+ TEST_INSTRUCTION("62F23D502792FCFDFFFF" , vptestmd(k2, zmm24, dword_ptr(rdx, -516)._1to16()));
+ TEST_INSTRUCTION("62B2854827E4" , vptestmq(k4, zmm15, zmm20));
+ TEST_INSTRUCTION("62B2854A27E4" , k(k2).vptestmq(k4, zmm15, zmm20));
+ TEST_INSTRUCTION("62F285482721" , vptestmq(k4, zmm15, zmmword_ptr(rcx)));
+ TEST_INSTRUCTION("62B2854827A4F034120000" , vptestmq(k4, zmm15, zmmword_ptr(rax, r14, 3, 4660)));
+ TEST_INSTRUCTION("62F285582721" , vptestmq(k4, zmm15, qword_ptr(rcx)._1to8()));
+ TEST_INSTRUCTION("62F2854827627F" , vptestmq(k4, zmm15, zmmword_ptr(rdx, 8128)));
+ TEST_INSTRUCTION("62F2854827A200200000" , vptestmq(k4, zmm15, zmmword_ptr(rdx, 8192)));
+ TEST_INSTRUCTION("62F28548276280" , vptestmq(k4, zmm15, zmmword_ptr(rdx, -8192)));
+ TEST_INSTRUCTION("62F2854827A2C0DFFFFF" , vptestmq(k4, zmm15, zmmword_ptr(rdx, -8256)));
+ TEST_INSTRUCTION("62F2855827627F" , vptestmq(k4, zmm15, qword_ptr(rdx, 1016)._1to8()));
+ TEST_INSTRUCTION("62F2855827A200040000" , vptestmq(k4, zmm15, qword_ptr(rdx, 1024)._1to8()));
+ TEST_INSTRUCTION("62F28558276280" , vptestmq(k4, zmm15, qword_ptr(rdx, -1024)._1to8()));
+ TEST_INSTRUCTION("62F2855827A2F8FBFFFF" , vptestmq(k4, zmm15, qword_ptr(rdx, -1032)._1to8()));
+ TEST_INSTRUCTION("62714D486ADF" , vpunpckhdq(zmm11, zmm6, zmm7));
+ TEST_INSTRUCTION("62714D4B6ADF" , k(k3).vpunpckhdq(zmm11, zmm6, zmm7));
+ TEST_INSTRUCTION("62714DCB6ADF" , k(k3).z().vpunpckhdq(zmm11, zmm6, zmm7));
+ TEST_INSTRUCTION("62714D486A19" , vpunpckhdq(zmm11, zmm6, zmmword_ptr(rcx)));
+ TEST_INSTRUCTION("62314D486A9CF034120000" , vpunpckhdq(zmm11, zmm6, zmmword_ptr(rax, r14, 3, 4660)));
+ TEST_INSTRUCTION("62714D586A19" , vpunpckhdq(zmm11, zmm6, dword_ptr(rcx)._1to16()));
+ TEST_INSTRUCTION("62714D486A5A7F" , vpunpckhdq(zmm11, zmm6, zmmword_ptr(rdx, 8128)));
+ TEST_INSTRUCTION("62714D486A9A00200000" , vpunpckhdq(zmm11, zmm6, zmmword_ptr(rdx, 8192)));
+ TEST_INSTRUCTION("62714D486A5A80" , vpunpckhdq(zmm11, zmm6, zmmword_ptr(rdx, -8192)));
+ TEST_INSTRUCTION("62714D486A9AC0DFFFFF" , vpunpckhdq(zmm11, zmm6, zmmword_ptr(rdx, -8256)));
+ TEST_INSTRUCTION("62714D586A5A7F" , vpunpckhdq(zmm11, zmm6, dword_ptr(rdx, 508)._1to16()));
+ TEST_INSTRUCTION("62714D586A9A00020000" , vpunpckhdq(zmm11, zmm6, dword_ptr(rdx, 512)._1to16()));
+ TEST_INSTRUCTION("62714D586A5A80" , vpunpckhdq(zmm11, zmm6, dword_ptr(rdx, -512)._1to16()));
+ TEST_INSTRUCTION("62714D586A9AFCFDFFFF" , vpunpckhdq(zmm11, zmm6, dword_ptr(rdx, -516)._1to16()));
+ TEST_INSTRUCTION("6211CD486DC2" , vpunpckhqdq(zmm8, zmm6, zmm26));
+ TEST_INSTRUCTION("6211CD4E6DC2" , k(k6).vpunpckhqdq(zmm8, zmm6, zmm26));
+ TEST_INSTRUCTION("6211CDCE6DC2" , k(k6).z().vpunpckhqdq(zmm8, zmm6, zmm26));
+ TEST_INSTRUCTION("6271CD486D01" , vpunpckhqdq(zmm8, zmm6, zmmword_ptr(rcx)));
+ TEST_INSTRUCTION("6231CD486D84F034120000" , vpunpckhqdq(zmm8, zmm6, zmmword_ptr(rax, r14, 3, 4660)));
+ TEST_INSTRUCTION("6271CD586D01" , vpunpckhqdq(zmm8, zmm6, qword_ptr(rcx)._1to8()));
+ TEST_INSTRUCTION("6271CD486D427F" , vpunpckhqdq(zmm8, zmm6, zmmword_ptr(rdx, 8128)));
+ TEST_INSTRUCTION("6271CD486D8200200000" , vpunpckhqdq(zmm8, zmm6, zmmword_ptr(rdx, 8192)));
+ TEST_INSTRUCTION("6271CD486D4280" , vpunpckhqdq(zmm8, zmm6, zmmword_ptr(rdx, -8192)));
+ TEST_INSTRUCTION("6271CD486D82C0DFFFFF" , vpunpckhqdq(zmm8, zmm6, zmmword_ptr(rdx, -8256)));
+ TEST_INSTRUCTION("6271CD586D427F" , vpunpckhqdq(zmm8, zmm6, qword_ptr(rdx, 1016)._1to8()));
+ TEST_INSTRUCTION("6271CD586D8200040000" , vpunpckhqdq(zmm8, zmm6, qword_ptr(rdx, 1024)._1to8()));
+ TEST_INSTRUCTION("6271CD586D4280" , vpunpckhqdq(zmm8, zmm6, qword_ptr(rdx, -1024)._1to8()));
+ TEST_INSTRUCTION("6271CD586D82F8FBFFFF" , vpunpckhqdq(zmm8, zmm6, qword_ptr(rdx, -1032)._1to8()));
+ TEST_INSTRUCTION("62C16D4062C5" , vpunpckldq(zmm16, zmm18, zmm13));
+ TEST_INSTRUCTION("62C16D4762C5" , k(k7).vpunpckldq(zmm16, zmm18, zmm13));
+ TEST_INSTRUCTION("62C16DC762C5" , k(k7).z().vpunpckldq(zmm16, zmm18, zmm13));
+ TEST_INSTRUCTION("62E16D406201" , vpunpckldq(zmm16, zmm18, zmmword_ptr(rcx)));
+ TEST_INSTRUCTION("62A16D406284F034120000" , vpunpckldq(zmm16, zmm18, zmmword_ptr(rax, r14, 3, 4660)));
+ TEST_INSTRUCTION("62E16D506201" , vpunpckldq(zmm16, zmm18, dword_ptr(rcx)._1to16()));
+ TEST_INSTRUCTION("62E16D4062427F" , vpunpckldq(zmm16, zmm18, zmmword_ptr(rdx, 8128)));
+ TEST_INSTRUCTION("62E16D40628200200000" , vpunpckldq(zmm16, zmm18, zmmword_ptr(rdx, 8192)));
+ TEST_INSTRUCTION("62E16D40624280" , vpunpckldq(zmm16, zmm18, zmmword_ptr(rdx, -8192)));
+ TEST_INSTRUCTION("62E16D406282C0DFFFFF" , vpunpckldq(zmm16, zmm18, zmmword_ptr(rdx, -8256)));
+ TEST_INSTRUCTION("62E16D5062427F" , vpunpckldq(zmm16, zmm18, dword_ptr(rdx, 508)._1to16()));
+ TEST_INSTRUCTION("62E16D50628200020000" , vpunpckldq(zmm16, zmm18, dword_ptr(rdx, 512)._1to16()));
+ TEST_INSTRUCTION("62E16D50624280" , vpunpckldq(zmm16, zmm18, dword_ptr(rdx, -512)._1to16()));
+ TEST_INSTRUCTION("62E16D506282FCFDFFFF" , vpunpckldq(zmm16, zmm18, dword_ptr(rdx, -516)._1to16()));
+ TEST_INSTRUCTION("62C1FD406CC9" , vpunpcklqdq(zmm17, zmm16, zmm9));
+ TEST_INSTRUCTION("62C1FD456CC9" , k(k5).vpunpcklqdq(zmm17, zmm16, zmm9));
+ TEST_INSTRUCTION("62C1FDC56CC9" , k(k5).z().vpunpcklqdq(zmm17, zmm16, zmm9));
+ TEST_INSTRUCTION("62E1FD406C09" , vpunpcklqdq(zmm17, zmm16, zmmword_ptr(rcx)));
+ TEST_INSTRUCTION("62A1FD406C8CF034120000" , vpunpcklqdq(zmm17, zmm16, zmmword_ptr(rax, r14, 3, 4660)));
+ TEST_INSTRUCTION("62E1FD506C09" , vpunpcklqdq(zmm17, zmm16, qword_ptr(rcx)._1to8()));
+ TEST_INSTRUCTION("62E1FD406C4A7F" , vpunpcklqdq(zmm17, zmm16, zmmword_ptr(rdx, 8128)));
+ TEST_INSTRUCTION("62E1FD406C8A00200000" , vpunpcklqdq(zmm17, zmm16, zmmword_ptr(rdx, 8192)));
+ TEST_INSTRUCTION("62E1FD406C4A80" , vpunpcklqdq(zmm17, zmm16, zmmword_ptr(rdx, -8192)));
+ TEST_INSTRUCTION("62E1FD406C8AC0DFFFFF" , vpunpcklqdq(zmm17, zmm16, zmmword_ptr(rdx, -8256)));
+ TEST_INSTRUCTION("62E1FD506C4A7F" , vpunpcklqdq(zmm17, zmm16, qword_ptr(rdx, 1016)._1to8()));
+ TEST_INSTRUCTION("62E1FD506C8A00040000" , vpunpcklqdq(zmm17, zmm16, qword_ptr(rdx, 1024)._1to8()));
+ TEST_INSTRUCTION("62E1FD506C4A80" , vpunpcklqdq(zmm17, zmm16, qword_ptr(rdx, -1024)._1to8()));
+ TEST_INSTRUCTION("62E1FD506C8AF8FBFFFF" , vpunpcklqdq(zmm17, zmm16, qword_ptr(rdx, -1032)._1to8()));
+ TEST_INSTRUCTION("62916548EFE9" , vpxord(zmm5, zmm3, zmm25));
+ TEST_INSTRUCTION("6291654BEFE9" , k(k3).vpxord(zmm5, zmm3, zmm25));
+ TEST_INSTRUCTION("629165CBEFE9" , k(k3).z().vpxord(zmm5, zmm3, zmm25));
+ TEST_INSTRUCTION("62F16548EF29" , vpxord(zmm5, zmm3, zmmword_ptr(rcx)));
+ TEST_INSTRUCTION("62B16548EFACF034120000" , vpxord(zmm5, zmm3, zmmword_ptr(rax, r14, 3, 4660)));
+ TEST_INSTRUCTION("62F16558EF29" , vpxord(zmm5, zmm3, dword_ptr(rcx)._1to16()));
+ TEST_INSTRUCTION("62F16548EF6A7F" , vpxord(zmm5, zmm3, zmmword_ptr(rdx, 8128)));
+ TEST_INSTRUCTION("62F16548EFAA00200000" , vpxord(zmm5, zmm3, zmmword_ptr(rdx, 8192)));
+ TEST_INSTRUCTION("62F16548EF6A80" , vpxord(zmm5, zmm3, zmmword_ptr(rdx, -8192)));
+ TEST_INSTRUCTION("62F16548EFAAC0DFFFFF" , vpxord(zmm5, zmm3, zmmword_ptr(rdx, -8256)));
+ TEST_INSTRUCTION("62F16558EF6A7F" , vpxord(zmm5, zmm3, dword_ptr(rdx, 508)._1to16()));
+ TEST_INSTRUCTION("62F16558EFAA00020000" , vpxord(zmm5, zmm3, dword_ptr(rdx, 512)._1to16()));
+ TEST_INSTRUCTION("62F16558EF6A80" , vpxord(zmm5, zmm3, dword_ptr(rdx, -512)._1to16()));
+ TEST_INSTRUCTION("62F16558EFAAFCFDFFFF" , vpxord(zmm5, zmm3, dword_ptr(rdx, -516)._1to16()));
+ TEST_INSTRUCTION("6231DD48EFD2" , vpxorq(zmm10, zmm4, zmm18));
+ TEST_INSTRUCTION("6231DD4CEFD2" , k(k4).vpxorq(zmm10, zmm4, zmm18));
+ TEST_INSTRUCTION("6231DDCCEFD2" , k(k4).z().vpxorq(zmm10, zmm4, zmm18));
+ TEST_INSTRUCTION("6271DD48EF11" , vpxorq(zmm10, zmm4, zmmword_ptr(rcx)));
+ TEST_INSTRUCTION("6231DD48EF94F034120000" , vpxorq(zmm10, zmm4, zmmword_ptr(rax, r14, 3, 4660)));
+ TEST_INSTRUCTION("6271DD58EF11" , vpxorq(zmm10, zmm4, qword_ptr(rcx)._1to8()));
+ TEST_INSTRUCTION("6271DD48EF527F" , vpxorq(zmm10, zmm4, zmmword_ptr(rdx, 8128)));
+ TEST_INSTRUCTION("6271DD48EF9200200000" , vpxorq(zmm10, zmm4, zmmword_ptr(rdx, 8192)));
+ TEST_INSTRUCTION("6271DD48EF5280" , vpxorq(zmm10, zmm4, zmmword_ptr(rdx, -8192)));
+ TEST_INSTRUCTION("6271DD48EF92C0DFFFFF" , vpxorq(zmm10, zmm4, zmmword_ptr(rdx, -8256)));
+ TEST_INSTRUCTION("6271DD58EF527F" , vpxorq(zmm10, zmm4, qword_ptr(rdx, 1016)._1to8()));
+ TEST_INSTRUCTION("6271DD58EF9200040000" , vpxorq(zmm10, zmm4, qword_ptr(rdx, 1024)._1to8()));
+ TEST_INSTRUCTION("6271DD58EF5280" , vpxorq(zmm10, zmm4, qword_ptr(rdx, -1024)._1to8()));
+ TEST_INSTRUCTION("6271DD58EF92F8FBFFFF" , vpxorq(zmm10, zmm4, qword_ptr(rdx, -1032)._1to8()));
+ TEST_INSTRUCTION("6242FD484CD2" , vrcp14pd(zmm26, zmm10));
+ TEST_INSTRUCTION("6242FD4E4CD2" , k(k6).vrcp14pd(zmm26, zmm10));
+ TEST_INSTRUCTION("6242FDCE4CD2" , k(k6).z().vrcp14pd(zmm26, zmm10));
+ TEST_INSTRUCTION("6262FD484C11" , vrcp14pd(zmm26, zmmword_ptr(rcx)));
+ TEST_INSTRUCTION("6222FD484C94F034120000" , vrcp14pd(zmm26, zmmword_ptr(rax, r14, 3, 4660)));
+ TEST_INSTRUCTION("6262FD584C11" , vrcp14pd(zmm26, qword_ptr(rcx)._1to8()));
+ TEST_INSTRUCTION("6262FD484C527F" , vrcp14pd(zmm26, zmmword_ptr(rdx, 8128)));
+ TEST_INSTRUCTION("6262FD484C9200200000" , vrcp14pd(zmm26, zmmword_ptr(rdx, 8192)));
+ TEST_INSTRUCTION("6262FD484C5280" , vrcp14pd(zmm26, zmmword_ptr(rdx, -8192)));
+ TEST_INSTRUCTION("6262FD484C92C0DFFFFF" , vrcp14pd(zmm26, zmmword_ptr(rdx, -8256)));
+ TEST_INSTRUCTION("6262FD584C527F" , vrcp14pd(zmm26, qword_ptr(rdx, 1016)._1to8()));
+ TEST_INSTRUCTION("6262FD584C9200040000" , vrcp14pd(zmm26, qword_ptr(rdx, 1024)._1to8()));
+ TEST_INSTRUCTION("6262FD584C5280" , vrcp14pd(zmm26, qword_ptr(rdx, -1024)._1to8()));
+ TEST_INSTRUCTION("6262FD584C92F8FBFFFF" , vrcp14pd(zmm26, qword_ptr(rdx, -1032)._1to8()));
+ TEST_INSTRUCTION("62927D484CDB" , vrcp14ps(zmm3, zmm27));
+ TEST_INSTRUCTION("62927D4D4CDB" , k(k5).vrcp14ps(zmm3, zmm27));
+ TEST_INSTRUCTION("62927DCD4CDB" , k(k5).z().vrcp14ps(zmm3, zmm27));
+ TEST_INSTRUCTION("62F27D484C19" , vrcp14ps(zmm3, zmmword_ptr(rcx)));
+ TEST_INSTRUCTION("62B27D484C9CF034120000" , vrcp14ps(zmm3, zmmword_ptr(rax, r14, 3, 4660)));
+ TEST_INSTRUCTION("62F27D584C19" , vrcp14ps(zmm3, dword_ptr(rcx)._1to16()));
+ TEST_INSTRUCTION("62F27D484C5A7F" , vrcp14ps(zmm3, zmmword_ptr(rdx, 8128)));
+ TEST_INSTRUCTION("62F27D484C9A00200000" , vrcp14ps(zmm3, zmmword_ptr(rdx, 8192)));
+ TEST_INSTRUCTION("62F27D484C5A80" , vrcp14ps(zmm3, zmmword_ptr(rdx, -8192)));
+ TEST_INSTRUCTION("62F27D484C9AC0DFFFFF" , vrcp14ps(zmm3, zmmword_ptr(rdx, -8256)));
+ TEST_INSTRUCTION("62F27D584C5A7F" , vrcp14ps(zmm3, dword_ptr(rdx, 508)._1to16()));
+ TEST_INSTRUCTION("62F27D584C9A00020000" , vrcp14ps(zmm3, dword_ptr(rdx, 512)._1to16()));
+ TEST_INSTRUCTION("62F27D584C5A80" , vrcp14ps(zmm3, dword_ptr(rdx, -512)._1to16()));
+ TEST_INSTRUCTION("62F27D584C9AFCFDFFFF" , vrcp14ps(zmm3, dword_ptr(rdx, -516)._1to16()));
+ TEST_INSTRUCTION("6272CD084DF7" , vrcp14sd(xmm14, xmm6, xmm7));
+ TEST_INSTRUCTION("6272CD094DF7" , k(k1).vrcp14sd(xmm14, xmm6, xmm7));
+ TEST_INSTRUCTION("6272CD894DF7" , k(k1).z().vrcp14sd(xmm14, xmm6, xmm7));
+ TEST_INSTRUCTION("6272CD084D31" , vrcp14sd(xmm14, xmm6, qword_ptr(rcx)));
+ TEST_INSTRUCTION("6232CD084DB4F034120000" , vrcp14sd(xmm14, xmm6, qword_ptr(rax, r14, 3, 4660)));
+ TEST_INSTRUCTION("6272CD084D727F" , vrcp14sd(xmm14, xmm6, qword_ptr(rdx, 1016)));
+ TEST_INSTRUCTION("6272CD084DB200040000" , vrcp14sd(xmm14, xmm6, qword_ptr(rdx, 1024)));
+ TEST_INSTRUCTION("6272CD084D7280" , vrcp14sd(xmm14, xmm6, qword_ptr(rdx, -1024)));
+ TEST_INSTRUCTION("6272CD084DB2F8FBFFFF" , vrcp14sd(xmm14, xmm6, qword_ptr(rdx, -1032)));
+ TEST_INSTRUCTION("622275084DCD" , vrcp14ss(xmm25, xmm1, xmm21));
+ TEST_INSTRUCTION("6222750A4DCD" , k(k2).vrcp14ss(xmm25, xmm1, xmm21));
+ TEST_INSTRUCTION("6222758A4DCD" , k(k2).z().vrcp14ss(xmm25, xmm1, xmm21));
+ TEST_INSTRUCTION("626275084D09" , vrcp14ss(xmm25, xmm1, dword_ptr(rcx)));
+ TEST_INSTRUCTION("622275084D8CF034120000" , vrcp14ss(xmm25, xmm1, dword_ptr(rax, r14, 3, 4660)));
+ TEST_INSTRUCTION("626275084D4A7F" , vrcp14ss(xmm25, xmm1, dword_ptr(rdx, 508)));
+ TEST_INSTRUCTION("626275084D8A00020000" , vrcp14ss(xmm25, xmm1, dword_ptr(rdx, 512)));
+ TEST_INSTRUCTION("626275084D4A80" , vrcp14ss(xmm25, xmm1, dword_ptr(rdx, -512)));
+ TEST_INSTRUCTION("626275084D8AFCFDFFFF" , vrcp14ss(xmm25, xmm1, dword_ptr(rdx, -516)));
+ TEST_INSTRUCTION("6272FD484EF4" , vrsqrt14pd(zmm14, zmm4));
+ TEST_INSTRUCTION("6272FD4F4EF4" , k(k7).vrsqrt14pd(zmm14, zmm4));
+ TEST_INSTRUCTION("6272FDCF4EF4" , k(k7).z().vrsqrt14pd(zmm14, zmm4));
+ TEST_INSTRUCTION("6272FD484E31" , vrsqrt14pd(zmm14, zmmword_ptr(rcx)));
+ TEST_INSTRUCTION("6232FD484EB4F034120000" , vrsqrt14pd(zmm14, zmmword_ptr(rax, r14, 3, 4660)));
+ TEST_INSTRUCTION("6272FD584E31" , vrsqrt14pd(zmm14, qword_ptr(rcx)._1to8()));
+ TEST_INSTRUCTION("6272FD484E727F" , vrsqrt14pd(zmm14, zmmword_ptr(rdx, 8128)));
+ TEST_INSTRUCTION("6272FD484EB200200000" , vrsqrt14pd(zmm14, zmmword_ptr(rdx, 8192)));
+ TEST_INSTRUCTION("6272FD484E7280" , vrsqrt14pd(zmm14, zmmword_ptr(rdx, -8192)));
+ TEST_INSTRUCTION("6272FD484EB2C0DFFFFF" , vrsqrt14pd(zmm14, zmmword_ptr(rdx, -8256)));
+ TEST_INSTRUCTION("6272FD584E727F" , vrsqrt14pd(zmm14, qword_ptr(rdx, 1016)._1to8()));
+ TEST_INSTRUCTION("6272FD584EB200040000" , vrsqrt14pd(zmm14, qword_ptr(rdx, 1024)._1to8()));
+ TEST_INSTRUCTION("6272FD584E7280" , vrsqrt14pd(zmm14, qword_ptr(rdx, -1024)._1to8()));
+ TEST_INSTRUCTION("6272FD584EB2F8FBFFFF" , vrsqrt14pd(zmm14, qword_ptr(rdx, -1032)._1to8()));
+ TEST_INSTRUCTION("62927D484ED9" , vrsqrt14ps(zmm3, zmm25));
+ TEST_INSTRUCTION("62927D4B4ED9" , k(k3).vrsqrt14ps(zmm3, zmm25));
+ TEST_INSTRUCTION("62927DCB4ED9" , k(k3).z().vrsqrt14ps(zmm3, zmm25));
+ TEST_INSTRUCTION("62F27D484E19" , vrsqrt14ps(zmm3, zmmword_ptr(rcx)));
+ TEST_INSTRUCTION("62B27D484E9CF034120000" , vrsqrt14ps(zmm3, zmmword_ptr(rax, r14, 3, 4660)));
+ TEST_INSTRUCTION("62F27D584E19" , vrsqrt14ps(zmm3, dword_ptr(rcx)._1to16()));
+ TEST_INSTRUCTION("62F27D484E5A7F" , vrsqrt14ps(zmm3, zmmword_ptr(rdx, 8128)));
+ TEST_INSTRUCTION("62F27D484E9A00200000" , vrsqrt14ps(zmm3, zmmword_ptr(rdx, 8192)));
+ TEST_INSTRUCTION("62F27D484E5A80" , vrsqrt14ps(zmm3, zmmword_ptr(rdx, -8192)));
+ TEST_INSTRUCTION("62F27D484E9AC0DFFFFF" , vrsqrt14ps(zmm3, zmmword_ptr(rdx, -8256)));
+ TEST_INSTRUCTION("62F27D584E5A7F" , vrsqrt14ps(zmm3, dword_ptr(rdx, 508)._1to16()));
+ TEST_INSTRUCTION("62F27D584E9A00020000" , vrsqrt14ps(zmm3, dword_ptr(rdx, 512)._1to16()));
+ TEST_INSTRUCTION("62F27D584E5A80" , vrsqrt14ps(zmm3, dword_ptr(rdx, -512)._1to16()));
+ TEST_INSTRUCTION("62F27D584E9AFCFDFFFF" , vrsqrt14ps(zmm3, dword_ptr(rdx, -516)._1to16()));
+ TEST_INSTRUCTION("62F2D5004FCB" , vrsqrt14sd(xmm1, xmm21, xmm3));
+ TEST_INSTRUCTION("62F2D5024FCB" , k(k2).vrsqrt14sd(xmm1, xmm21, xmm3));
+ TEST_INSTRUCTION("62F2D5824FCB" , k(k2).z().vrsqrt14sd(xmm1, xmm21, xmm3));
+ TEST_INSTRUCTION("62F2D5004F09" , vrsqrt14sd(xmm1, xmm21, qword_ptr(rcx)));
+ TEST_INSTRUCTION("62B2D5004F8CF034120000" , vrsqrt14sd(xmm1, xmm21, qword_ptr(rax, r14, 3, 4660)));
+ TEST_INSTRUCTION("62F2D5004F4A7F" , vrsqrt14sd(xmm1, xmm21, qword_ptr(rdx, 1016)));
+ TEST_INSTRUCTION("62F2D5004F8A00040000" , vrsqrt14sd(xmm1, xmm21, qword_ptr(rdx, 1024)));
+ TEST_INSTRUCTION("62F2D5004F4A80" , vrsqrt14sd(xmm1, xmm21, qword_ptr(rdx, -1024)));
+ TEST_INSTRUCTION("62F2D5004F8AF8FBFFFF" , vrsqrt14sd(xmm1, xmm21, qword_ptr(rdx, -1032)));
+ TEST_INSTRUCTION("62A22D004FDA" , vrsqrt14ss(xmm19, xmm26, xmm18));
+ TEST_INSTRUCTION("62A22D034FDA" , k(k3).vrsqrt14ss(xmm19, xmm26, xmm18));
+ TEST_INSTRUCTION("62A22D834FDA" , k(k3).z().vrsqrt14ss(xmm19, xmm26, xmm18));
+ TEST_INSTRUCTION("62E22D004F19" , vrsqrt14ss(xmm19, xmm26, dword_ptr(rcx)));
+ TEST_INSTRUCTION("62A22D004F9CF034120000" , vrsqrt14ss(xmm19, xmm26, dword_ptr(rax, r14, 3, 4660)));
+ TEST_INSTRUCTION("62E22D004F5A7F" , vrsqrt14ss(xmm19, xmm26, dword_ptr(rdx, 508)));
+ TEST_INSTRUCTION("62E22D004F9A00020000" , vrsqrt14ss(xmm19, xmm26, dword_ptr(rdx, 512)));
+ TEST_INSTRUCTION("62E22D004F5A80" , vrsqrt14ss(xmm19, xmm26, dword_ptr(rdx, -512)));
+ TEST_INSTRUCTION("62E22D004F9AFCFDFFFF" , vrsqrt14ss(xmm19, xmm26, dword_ptr(rdx, -516)));
+ TEST_INSTRUCTION("6291AD48C6C9AB" , vshufpd(zmm1, zmm10, zmm25, 171));
+ TEST_INSTRUCTION("6291AD4BC6C9AB" , k(k3).vshufpd(zmm1, zmm10, zmm25, 171));
+ TEST_INSTRUCTION("6291ADCBC6C9AB" , k(k3).z().vshufpd(zmm1, zmm10, zmm25, 171));
+ TEST_INSTRUCTION("6291AD48C6C97B" , vshufpd(zmm1, zmm10, zmm25, 123));
+ TEST_INSTRUCTION("62F1AD48C6097B" , vshufpd(zmm1, zmm10, zmmword_ptr(rcx), 123));
+ TEST_INSTRUCTION("62B1AD48C68CF0341200007B" , vshufpd(zmm1, zmm10, zmmword_ptr(rax, r14, 3, 4660), 123));
+ TEST_INSTRUCTION("62F1AD58C6097B" , vshufpd(zmm1, zmm10, qword_ptr(rcx)._1to8(), 123));
+ TEST_INSTRUCTION("62F1AD48C64A7F7B" , vshufpd(zmm1, zmm10, zmmword_ptr(rdx, 8128), 123));
+ TEST_INSTRUCTION("62F1AD48C68A002000007B" , vshufpd(zmm1, zmm10, zmmword_ptr(rdx, 8192), 123));
+ TEST_INSTRUCTION("62F1AD48C64A807B" , vshufpd(zmm1, zmm10, zmmword_ptr(rdx, -8192), 123));
+ TEST_INSTRUCTION("62F1AD48C68AC0DFFFFF7B" , vshufpd(zmm1, zmm10, zmmword_ptr(rdx, -8256), 123));
+ TEST_INSTRUCTION("62F1AD58C64A7F7B" , vshufpd(zmm1, zmm10, qword_ptr(rdx, 1016)._1to8(), 123));
+ TEST_INSTRUCTION("62F1AD58C68A000400007B" , vshufpd(zmm1, zmm10, qword_ptr(rdx, 1024)._1to8(), 123));
+ TEST_INSTRUCTION("62F1AD58C64A807B" , vshufpd(zmm1, zmm10, qword_ptr(rdx, -1024)._1to8(), 123));
+ TEST_INSTRUCTION("62F1AD58C68AF8FBFFFF7B" , vshufpd(zmm1, zmm10, qword_ptr(rdx, -1032)._1to8(), 123));
+ TEST_INSTRUCTION("62917448C6C9AB" , vshufps(zmm1, zmm1, zmm25, 171));
+ TEST_INSTRUCTION("62917449C6C9AB" , k(k1).vshufps(zmm1, zmm1, zmm25, 171));
+ TEST_INSTRUCTION("629174C9C6C9AB" , k(k1).z().vshufps(zmm1, zmm1, zmm25, 171));
+ TEST_INSTRUCTION("62917448C6C97B" , vshufps(zmm1, zmm1, zmm25, 123));
+ TEST_INSTRUCTION("62F17448C6097B" , vshufps(zmm1, zmm1, zmmword_ptr(rcx), 123));
+ TEST_INSTRUCTION("62B17448C68CF0341200007B" , vshufps(zmm1, zmm1, zmmword_ptr(rax, r14, 3, 4660), 123));
+ TEST_INSTRUCTION("62F17458C6097B" , vshufps(zmm1, zmm1, dword_ptr(rcx)._1to16(), 123));
+ TEST_INSTRUCTION("62F17448C64A7F7B" , vshufps(zmm1, zmm1, zmmword_ptr(rdx, 8128), 123));
+ TEST_INSTRUCTION("62F17448C68A002000007B" , vshufps(zmm1, zmm1, zmmword_ptr(rdx, 8192), 123));
+ TEST_INSTRUCTION("62F17448C64A807B" , vshufps(zmm1, zmm1, zmmword_ptr(rdx, -8192), 123));
+ TEST_INSTRUCTION("62F17448C68AC0DFFFFF7B" , vshufps(zmm1, zmm1, zmmword_ptr(rdx, -8256), 123));
+ TEST_INSTRUCTION("62F17458C64A7F7B" , vshufps(zmm1, zmm1, dword_ptr(rdx, 508)._1to16(), 123));
+ TEST_INSTRUCTION("62F17458C68A000200007B" , vshufps(zmm1, zmm1, dword_ptr(rdx, 512)._1to16(), 123));
+ TEST_INSTRUCTION("62F17458C64A807B" , vshufps(zmm1, zmm1, dword_ptr(rdx, -512)._1to16(), 123));
+ TEST_INSTRUCTION("62F17458C68AFCFDFFFF7B" , vshufps(zmm1, zmm1, dword_ptr(rdx, -516)._1to16(), 123));
+ TEST_INSTRUCTION("6271FD4851CD" , vsqrtpd(zmm9, zmm5));
+ TEST_INSTRUCTION("6271FD4A51CD" , k(k2).vsqrtpd(zmm9, zmm5));
+ TEST_INSTRUCTION("6271FDCA51CD" , k(k2).z().vsqrtpd(zmm9, zmm5));
+ TEST_INSTRUCTION("6271FD1851CD" , rn_sae().vsqrtpd(zmm9, zmm5));
+ TEST_INSTRUCTION("6271FD5851CD" , ru_sae().vsqrtpd(zmm9, zmm5));
+ TEST_INSTRUCTION("6271FD3851CD" , rd_sae().vsqrtpd(zmm9, zmm5));
+ TEST_INSTRUCTION("6271FD7851CD" , rz_sae().vsqrtpd(zmm9, zmm5));
+ TEST_INSTRUCTION("6271FD485109" , vsqrtpd(zmm9, zmmword_ptr(rcx)));
+ TEST_INSTRUCTION("6231FD48518CF034120000" , vsqrtpd(zmm9, zmmword_ptr(rax, r14, 3, 4660)));
+ TEST_INSTRUCTION("6271FD585109" , vsqrtpd(zmm9, qword_ptr(rcx)._1to8()));
+ TEST_INSTRUCTION("6271FD48514A7F" , vsqrtpd(zmm9, zmmword_ptr(rdx, 8128)));
+ TEST_INSTRUCTION("6271FD48518A00200000" , vsqrtpd(zmm9, zmmword_ptr(rdx, 8192)));
+ TEST_INSTRUCTION("6271FD48514A80" , vsqrtpd(zmm9, zmmword_ptr(rdx, -8192)));
+ TEST_INSTRUCTION("6271FD48518AC0DFFFFF" , vsqrtpd(zmm9, zmmword_ptr(rdx, -8256)));
+ TEST_INSTRUCTION("6271FD58514A7F" , vsqrtpd(zmm9, qword_ptr(rdx, 1016)._1to8()));
+ TEST_INSTRUCTION("6271FD58518A00040000" , vsqrtpd(zmm9, qword_ptr(rdx, 1024)._1to8()));
+ TEST_INSTRUCTION("6271FD58514A80" , vsqrtpd(zmm9, qword_ptr(rdx, -1024)._1to8()));
+ TEST_INSTRUCTION("6271FD58518AF8FBFFFF" , vsqrtpd(zmm9, qword_ptr(rdx, -1032)._1to8()));
+ TEST_INSTRUCTION("62B17C4851E7" , vsqrtps(zmm4, zmm23));
+ TEST_INSTRUCTION("62B17C4E51E7" , k(k6).vsqrtps(zmm4, zmm23));
+ TEST_INSTRUCTION("62B17CCE51E7" , k(k6).z().vsqrtps(zmm4, zmm23));
+ TEST_INSTRUCTION("62B17C1851E7" , rn_sae().vsqrtps(zmm4, zmm23));
+ TEST_INSTRUCTION("62B17C5851E7" , ru_sae().vsqrtps(zmm4, zmm23));
+ TEST_INSTRUCTION("62B17C3851E7" , rd_sae().vsqrtps(zmm4, zmm23));
+ TEST_INSTRUCTION("62B17C7851E7" , rz_sae().vsqrtps(zmm4, zmm23));
+ TEST_INSTRUCTION("62F17C485121" , vsqrtps(zmm4, zmmword_ptr(rcx)));
+ TEST_INSTRUCTION("62B17C4851A4F034120000" , vsqrtps(zmm4, zmmword_ptr(rax, r14, 3, 4660)));
+ TEST_INSTRUCTION("62F17C585121" , vsqrtps(zmm4, dword_ptr(rcx)._1to16()));
+ TEST_INSTRUCTION("62F17C4851627F" , vsqrtps(zmm4, zmmword_ptr(rdx, 8128)));
+ TEST_INSTRUCTION("62F17C4851A200200000" , vsqrtps(zmm4, zmmword_ptr(rdx, 8192)));
+ TEST_INSTRUCTION("62F17C48516280" , vsqrtps(zmm4, zmmword_ptr(rdx, -8192)));
+ TEST_INSTRUCTION("62F17C4851A2C0DFFFFF" , vsqrtps(zmm4, zmmword_ptr(rdx, -8256)));
+ TEST_INSTRUCTION("62F17C5851627F" , vsqrtps(zmm4, dword_ptr(rdx, 508)._1to16()));
+ TEST_INSTRUCTION("62F17C5851A200020000" , vsqrtps(zmm4, dword_ptr(rdx, 512)._1to16()));
+ TEST_INSTRUCTION("62F17C58516280" , vsqrtps(zmm4, dword_ptr(rdx, -512)._1to16()));
+ TEST_INSTRUCTION("62F17C5851A2FCFDFFFF" , vsqrtps(zmm4, dword_ptr(rdx, -516)._1to16()));
+ TEST_INSTRUCTION("6271BF0051C5" , vsqrtsd(xmm8, xmm24, xmm5));
+ TEST_INSTRUCTION("6271BF0351C5" , k(k3).vsqrtsd(xmm8, xmm24, xmm5));
+ TEST_INSTRUCTION("6271BF8351C5" , k(k3).z().vsqrtsd(xmm8, xmm24, xmm5));
+ TEST_INSTRUCTION("6271BF1051C5" , rn_sae().vsqrtsd(xmm8, xmm24, xmm5));
+ TEST_INSTRUCTION("6271BF5051C5" , ru_sae().vsqrtsd(xmm8, xmm24, xmm5));
+ TEST_INSTRUCTION("6271BF3051C5" , rd_sae().vsqrtsd(xmm8, xmm24, xmm5));
+ TEST_INSTRUCTION("6271BF7051C5" , rz_sae().vsqrtsd(xmm8, xmm24, xmm5));
+ TEST_INSTRUCTION("6271BF005101" , vsqrtsd(xmm8, xmm24, qword_ptr(rcx)));
+ TEST_INSTRUCTION("6231BF005184F034120000" , vsqrtsd(xmm8, xmm24, qword_ptr(rax, r14, 3, 4660)));
+ TEST_INSTRUCTION("6271BF0051427F" , vsqrtsd(xmm8, xmm24, qword_ptr(rdx, 1016)));
+ TEST_INSTRUCTION("6271BF00518200040000" , vsqrtsd(xmm8, xmm24, qword_ptr(rdx, 1024)));
+ TEST_INSTRUCTION("6271BF00514280" , vsqrtsd(xmm8, xmm24, qword_ptr(rdx, -1024)));
+ TEST_INSTRUCTION("6271BF005182F8FBFFFF" , vsqrtsd(xmm8, xmm24, qword_ptr(rdx, -1032)));
+ TEST_INSTRUCTION("62410E0851CB" , vsqrtss(xmm25, xmm14, xmm11));
+ TEST_INSTRUCTION("62410E0F51CB" , k(k7).vsqrtss(xmm25, xmm14, xmm11));
+ TEST_INSTRUCTION("62410E8F51CB" , k(k7).z().vsqrtss(xmm25, xmm14, xmm11));
+ TEST_INSTRUCTION("62410E1851CB" , rn_sae().vsqrtss(xmm25, xmm14, xmm11));
+ TEST_INSTRUCTION("62410E5851CB" , ru_sae().vsqrtss(xmm25, xmm14, xmm11));
+ TEST_INSTRUCTION("62410E3851CB" , rd_sae().vsqrtss(xmm25, xmm14, xmm11));
+ TEST_INSTRUCTION("62410E7851CB" , rz_sae().vsqrtss(xmm25, xmm14, xmm11));
+ TEST_INSTRUCTION("62610E085109" , vsqrtss(xmm25, xmm14, dword_ptr(rcx)));
+ TEST_INSTRUCTION("62210E08518CF034120000" , vsqrtss(xmm25, xmm14, dword_ptr(rax, r14, 3, 4660)));
+ TEST_INSTRUCTION("62610E08514A7F" , vsqrtss(xmm25, xmm14, dword_ptr(rdx, 508)));
+ TEST_INSTRUCTION("62610E08518A00020000" , vsqrtss(xmm25, xmm14, dword_ptr(rdx, 512)));
+ TEST_INSTRUCTION("62610E08514A80" , vsqrtss(xmm25, xmm14, dword_ptr(rdx, -512)));
+ TEST_INSTRUCTION("62610E08518AFCFDFFFF" , vsqrtss(xmm25, xmm14, dword_ptr(rdx, -516)));
+ TEST_INSTRUCTION("62C19D405CE8" , vsubpd(zmm21, zmm28, zmm8));
+ TEST_INSTRUCTION("62C19D415CE8" , k(k1).vsubpd(zmm21, zmm28, zmm8));
+ TEST_INSTRUCTION("62C19DC15CE8" , k(k1).z().vsubpd(zmm21, zmm28, zmm8));
+ TEST_INSTRUCTION("62C19D105CE8" , rn_sae().vsubpd(zmm21, zmm28, zmm8));
+ TEST_INSTRUCTION("62C19D505CE8" , ru_sae().vsubpd(zmm21, zmm28, zmm8));
+ TEST_INSTRUCTION("62C19D305CE8" , rd_sae().vsubpd(zmm21, zmm28, zmm8));
+ TEST_INSTRUCTION("62C19D705CE8" , rz_sae().vsubpd(zmm21, zmm28, zmm8));
+ TEST_INSTRUCTION("62E19D405C29" , vsubpd(zmm21, zmm28, zmmword_ptr(rcx)));
+ TEST_INSTRUCTION("62A19D405CACF034120000" , vsubpd(zmm21, zmm28, zmmword_ptr(rax, r14, 3, 4660)));
+ TEST_INSTRUCTION("62E19D505C29" , vsubpd(zmm21, zmm28, qword_ptr(rcx)._1to8()));
+ TEST_INSTRUCTION("62E19D405C6A7F" , vsubpd(zmm21, zmm28, zmmword_ptr(rdx, 8128)));
+ TEST_INSTRUCTION("62E19D405CAA00200000" , vsubpd(zmm21, zmm28, zmmword_ptr(rdx, 8192)));
+ TEST_INSTRUCTION("62E19D405C6A80" , vsubpd(zmm21, zmm28, zmmword_ptr(rdx, -8192)));
+ TEST_INSTRUCTION("62E19D405CAAC0DFFFFF" , vsubpd(zmm21, zmm28, zmmword_ptr(rdx, -8256)));
+ TEST_INSTRUCTION("62E19D505C6A7F" , vsubpd(zmm21, zmm28, qword_ptr(rdx, 1016)._1to8()));
+ TEST_INSTRUCTION("62E19D505CAA00040000" , vsubpd(zmm21, zmm28, qword_ptr(rdx, 1024)._1to8()));
+ TEST_INSTRUCTION("62E19D505C6A80" , vsubpd(zmm21, zmm28, qword_ptr(rdx, -1024)._1to8()));
+ TEST_INSTRUCTION("62E19D505CAAF8FBFFFF" , vsubpd(zmm21, zmm28, qword_ptr(rdx, -1032)._1to8()));
+ TEST_INSTRUCTION("62E12C485CDD" , vsubps(zmm19, zmm10, zmm5));
+ TEST_INSTRUCTION("62E12C4F5CDD" , k(k7).vsubps(zmm19, zmm10, zmm5));
+ TEST_INSTRUCTION("62E12CCF5CDD" , k(k7).z().vsubps(zmm19, zmm10, zmm5));
+ TEST_INSTRUCTION("62E12C185CDD" , rn_sae().vsubps(zmm19, zmm10, zmm5));
+ TEST_INSTRUCTION("62E12C585CDD" , ru_sae().vsubps(zmm19, zmm10, zmm5));
+ TEST_INSTRUCTION("62E12C385CDD" , rd_sae().vsubps(zmm19, zmm10, zmm5));
+ TEST_INSTRUCTION("62E12C785CDD" , rz_sae().vsubps(zmm19, zmm10, zmm5));
+ TEST_INSTRUCTION("62E12C485C19" , vsubps(zmm19, zmm10, zmmword_ptr(rcx)));
+ TEST_INSTRUCTION("62A12C485C9CF034120000" , vsubps(zmm19, zmm10, zmmword_ptr(rax, r14, 3, 4660)));
+ TEST_INSTRUCTION("62E12C585C19" , vsubps(zmm19, zmm10, dword_ptr(rcx)._1to16()));
+ TEST_INSTRUCTION("62E12C485C5A7F" , vsubps(zmm19, zmm10, zmmword_ptr(rdx, 8128)));
+ TEST_INSTRUCTION("62E12C485C9A00200000" , vsubps(zmm19, zmm10, zmmword_ptr(rdx, 8192)));
+ TEST_INSTRUCTION("62E12C485C5A80" , vsubps(zmm19, zmm10, zmmword_ptr(rdx, -8192)));
+ TEST_INSTRUCTION("62E12C485C9AC0DFFFFF" , vsubps(zmm19, zmm10, zmmword_ptr(rdx, -8256)));
+ TEST_INSTRUCTION("62E12C585C5A7F" , vsubps(zmm19, zmm10, dword_ptr(rdx, 508)._1to16()));
+ TEST_INSTRUCTION("62E12C585C9A00020000" , vsubps(zmm19, zmm10, dword_ptr(rdx, 512)._1to16()));
+ TEST_INSTRUCTION("62E12C585C5A80" , vsubps(zmm19, zmm10, dword_ptr(rdx, -512)._1to16()));
+ TEST_INSTRUCTION("62E12C585C9AFCFDFFFF" , vsubps(zmm19, zmm10, dword_ptr(rdx, -516)._1to16()));
+ TEST_INSTRUCTION("6241C7005CC5" , vsubsd(xmm24, xmm23, xmm13));
+ TEST_INSTRUCTION("6241C7075CC5" , k(k7).vsubsd(xmm24, xmm23, xmm13));
+ TEST_INSTRUCTION("6241C7875CC5" , k(k7).z().vsubsd(xmm24, xmm23, xmm13));
+ TEST_INSTRUCTION("6241C7105CC5" , rn_sae().vsubsd(xmm24, xmm23, xmm13));
+ TEST_INSTRUCTION("6241C7505CC5" , ru_sae().vsubsd(xmm24, xmm23, xmm13));
+ TEST_INSTRUCTION("6241C7305CC5" , rd_sae().vsubsd(xmm24, xmm23, xmm13));
+ TEST_INSTRUCTION("6241C7705CC5" , rz_sae().vsubsd(xmm24, xmm23, xmm13));
+ TEST_INSTRUCTION("6261C7005C01" , vsubsd(xmm24, xmm23, qword_ptr(rcx)));
+ TEST_INSTRUCTION("6221C7005C84F034120000" , vsubsd(xmm24, xmm23, qword_ptr(rax, r14, 3, 4660)));
+ TEST_INSTRUCTION("6261C7005C427F" , vsubsd(xmm24, xmm23, qword_ptr(rdx, 1016)));
+ TEST_INSTRUCTION("6261C7005C8200040000" , vsubsd(xmm24, xmm23, qword_ptr(rdx, 1024)));
+ TEST_INSTRUCTION("6261C7005C4280" , vsubsd(xmm24, xmm23, qword_ptr(rdx, -1024)));
+ TEST_INSTRUCTION("6261C7005C82F8FBFFFF" , vsubsd(xmm24, xmm23, qword_ptr(rdx, -1032)));
+ TEST_INSTRUCTION("62215E005CD8" , vsubss(xmm27, xmm20, xmm16));
+ TEST_INSTRUCTION("62215E065CD8" , k(k6).vsubss(xmm27, xmm20, xmm16));
+ TEST_INSTRUCTION("62215E865CD8" , k(k6).z().vsubss(xmm27, xmm20, xmm16));
+ TEST_INSTRUCTION("62215E105CD8" , rn_sae().vsubss(xmm27, xmm20, xmm16));
+ TEST_INSTRUCTION("62215E505CD8" , ru_sae().vsubss(xmm27, xmm20, xmm16));
+ TEST_INSTRUCTION("62215E305CD8" , rd_sae().vsubss(xmm27, xmm20, xmm16));
+ TEST_INSTRUCTION("62215E705CD8" , rz_sae().vsubss(xmm27, xmm20, xmm16));
+ TEST_INSTRUCTION("62615E005C19" , vsubss(xmm27, xmm20, dword_ptr(rcx)));
+ TEST_INSTRUCTION("62215E005C9CF034120000" , vsubss(xmm27, xmm20, dword_ptr(rax, r14, 3, 4660)));
+ TEST_INSTRUCTION("62615E005C5A7F" , vsubss(xmm27, xmm20, dword_ptr(rdx, 508)));
+ TEST_INSTRUCTION("62615E005C9A00020000" , vsubss(xmm27, xmm20, dword_ptr(rdx, 512)));
+ TEST_INSTRUCTION("62615E005C5A80" , vsubss(xmm27, xmm20, dword_ptr(rdx, -512)));
+ TEST_INSTRUCTION("62615E005C9AFCFDFFFF" , vsubss(xmm27, xmm20, dword_ptr(rdx, -516)));
+ TEST_INSTRUCTION("62A1FD082EEB" , vucomisd(xmm21, xmm19));
+ TEST_INSTRUCTION("62A1FD182EEB" , sae().vucomisd(xmm21, xmm19));
+ TEST_INSTRUCTION("62E1FD082E29" , vucomisd(xmm21, qword_ptr(rcx)));
+ TEST_INSTRUCTION("62A1FD082EACF034120000" , vucomisd(xmm21, qword_ptr(rax, r14, 3, 4660)));
+ TEST_INSTRUCTION("62E1FD082E6A7F" , vucomisd(xmm21, qword_ptr(rdx, 1016)));
+ TEST_INSTRUCTION("62E1FD082EAA00040000" , vucomisd(xmm21, qword_ptr(rdx, 1024)));
+ TEST_INSTRUCTION("62E1FD082E6A80" , vucomisd(xmm21, qword_ptr(rdx, -1024)));
+ TEST_INSTRUCTION("62E1FD082EAAF8FBFFFF" , vucomisd(xmm21, qword_ptr(rdx, -1032)));
+ TEST_INSTRUCTION("62017C082EDD" , vucomiss(xmm27, xmm29));
+ TEST_INSTRUCTION("62017C182EDD" , sae().vucomiss(xmm27, xmm29));
+ TEST_INSTRUCTION("62617C082E19" , vucomiss(xmm27, dword_ptr(rcx)));
+ TEST_INSTRUCTION("62217C082E9CF034120000" , vucomiss(xmm27, dword_ptr(rax, r14, 3, 4660)));
+ TEST_INSTRUCTION("62617C082E5A7F" , vucomiss(xmm27, dword_ptr(rdx, 508)));
+ TEST_INSTRUCTION("62617C082E9A00020000" , vucomiss(xmm27, dword_ptr(rdx, 512)));
+ TEST_INSTRUCTION("62617C082E5A80" , vucomiss(xmm27, dword_ptr(rdx, -512)));
+ TEST_INSTRUCTION("62617C082E9AFCFDFFFF" , vucomiss(xmm27, dword_ptr(rdx, -516)));
+ TEST_INSTRUCTION("62D1C54015F4" , vunpckhpd(zmm6, zmm23, zmm12));
+ TEST_INSTRUCTION("62D1C54715F4" , k(k7).vunpckhpd(zmm6, zmm23, zmm12));
+ TEST_INSTRUCTION("62D1C5C715F4" , k(k7).z().vunpckhpd(zmm6, zmm23, zmm12));
+ TEST_INSTRUCTION("62F1C5401531" , vunpckhpd(zmm6, zmm23, zmmword_ptr(rcx)));
+ TEST_INSTRUCTION("62B1C54015B4F034120000" , vunpckhpd(zmm6, zmm23, zmmword_ptr(rax, r14, 3, 4660)));
+ TEST_INSTRUCTION("62F1C5501531" , vunpckhpd(zmm6, zmm23, qword_ptr(rcx)._1to8()));
+ TEST_INSTRUCTION("62F1C54015727F" , vunpckhpd(zmm6, zmm23, zmmword_ptr(rdx, 8128)));
+ TEST_INSTRUCTION("62F1C54015B200200000" , vunpckhpd(zmm6, zmm23, zmmword_ptr(rdx, 8192)));
+ TEST_INSTRUCTION("62F1C540157280" , vunpckhpd(zmm6, zmm23, zmmword_ptr(rdx, -8192)));
+ TEST_INSTRUCTION("62F1C54015B2C0DFFFFF" , vunpckhpd(zmm6, zmm23, zmmword_ptr(rdx, -8256)));
+ TEST_INSTRUCTION("62F1C55015727F" , vunpckhpd(zmm6, zmm23, qword_ptr(rdx, 1016)._1to8()));
+ TEST_INSTRUCTION("62F1C55015B200040000" , vunpckhpd(zmm6, zmm23, qword_ptr(rdx, 1024)._1to8()));
+ TEST_INSTRUCTION("62F1C550157280" , vunpckhpd(zmm6, zmm23, qword_ptr(rdx, -1024)._1to8()));
+ TEST_INSTRUCTION("62F1C55015B2F8FBFFFF" , vunpckhpd(zmm6, zmm23, qword_ptr(rdx, -1032)._1to8()));
+ TEST_INSTRUCTION("62616C4815EC" , vunpckhps(zmm29, zmm2, zmm4));
+ TEST_INSTRUCTION("62616C4C15EC" , k(k4).vunpckhps(zmm29, zmm2, zmm4));
+ TEST_INSTRUCTION("62616CCC15EC" , k(k4).z().vunpckhps(zmm29, zmm2, zmm4));
+ TEST_INSTRUCTION("62616C481529" , vunpckhps(zmm29, zmm2, zmmword_ptr(rcx)));
+ TEST_INSTRUCTION("62216C4815ACF034120000" , vunpckhps(zmm29, zmm2, zmmword_ptr(rax, r14, 3, 4660)));
+ TEST_INSTRUCTION("62616C581529" , vunpckhps(zmm29, zmm2, dword_ptr(rcx)._1to16()));
+ TEST_INSTRUCTION("62616C48156A7F" , vunpckhps(zmm29, zmm2, zmmword_ptr(rdx, 8128)));
+ TEST_INSTRUCTION("62616C4815AA00200000" , vunpckhps(zmm29, zmm2, zmmword_ptr(rdx, 8192)));
+ TEST_INSTRUCTION("62616C48156A80" , vunpckhps(zmm29, zmm2, zmmword_ptr(rdx, -8192)));
+ TEST_INSTRUCTION("62616C4815AAC0DFFFFF" , vunpckhps(zmm29, zmm2, zmmword_ptr(rdx, -8256)));
+ TEST_INSTRUCTION("62616C58156A7F" , vunpckhps(zmm29, zmm2, dword_ptr(rdx, 508)._1to16()));
+ TEST_INSTRUCTION("62616C5815AA00020000" , vunpckhps(zmm29, zmm2, dword_ptr(rdx, 512)._1to16()));
+ TEST_INSTRUCTION("62616C58156A80" , vunpckhps(zmm29, zmm2, dword_ptr(rdx, -512)._1to16()));
+ TEST_INSTRUCTION("62616C5815AAFCFDFFFF" , vunpckhps(zmm29, zmm2, dword_ptr(rdx, -516)._1to16()));
+ TEST_INSTRUCTION("62C19D4014D0" , vunpcklpd(zmm18, zmm28, zmm8));
+ TEST_INSTRUCTION("62C19D4114D0" , k(k1).vunpcklpd(zmm18, zmm28, zmm8));
+ TEST_INSTRUCTION("62C19DC114D0" , k(k1).z().vunpcklpd(zmm18, zmm28, zmm8));
+ TEST_INSTRUCTION("62E19D401411" , vunpcklpd(zmm18, zmm28, zmmword_ptr(rcx)));
+ TEST_INSTRUCTION("62A19D401494F034120000" , vunpcklpd(zmm18, zmm28, zmmword_ptr(rax, r14, 3, 4660)));
+ TEST_INSTRUCTION("62E19D501411" , vunpcklpd(zmm18, zmm28, qword_ptr(rcx)._1to8()));
+ TEST_INSTRUCTION("62E19D4014527F" , vunpcklpd(zmm18, zmm28, zmmword_ptr(rdx, 8128)));
+ TEST_INSTRUCTION("62E19D40149200200000" , vunpcklpd(zmm18, zmm28, zmmword_ptr(rdx, 8192)));
+ TEST_INSTRUCTION("62E19D40145280" , vunpcklpd(zmm18, zmm28, zmmword_ptr(rdx, -8192)));
+ TEST_INSTRUCTION("62E19D401492C0DFFFFF" , vunpcklpd(zmm18, zmm28, zmmword_ptr(rdx, -8256)));
+ TEST_INSTRUCTION("62E19D5014527F" , vunpcklpd(zmm18, zmm28, qword_ptr(rdx, 1016)._1to8()));
+ TEST_INSTRUCTION("62E19D50149200040000" , vunpcklpd(zmm18, zmm28, qword_ptr(rdx, 1024)._1to8()));
+ TEST_INSTRUCTION("62E19D50145280" , vunpcklpd(zmm18, zmm28, qword_ptr(rdx, -1024)._1to8()));
+ TEST_INSTRUCTION("62E19D501492F8FBFFFF" , vunpcklpd(zmm18, zmm28, qword_ptr(rdx, -1032)._1to8()));
+ TEST_INSTRUCTION("62610C4814CE" , vunpcklps(zmm25, zmm14, zmm6));
+ TEST_INSTRUCTION("62610C4E14CE" , k(k6).vunpcklps(zmm25, zmm14, zmm6));
+ TEST_INSTRUCTION("62610CCE14CE" , k(k6).z().vunpcklps(zmm25, zmm14, zmm6));
+ TEST_INSTRUCTION("62610C481409" , vunpcklps(zmm25, zmm14, zmmword_ptr(rcx)));
+ TEST_INSTRUCTION("62210C48148CF034120000" , vunpcklps(zmm25, zmm14, zmmword_ptr(rax, r14, 3, 4660)));
+ TEST_INSTRUCTION("62610C581409" , vunpcklps(zmm25, zmm14, dword_ptr(rcx)._1to16()));
+ TEST_INSTRUCTION("62610C48144A7F" , vunpcklps(zmm25, zmm14, zmmword_ptr(rdx, 8128)));
+ TEST_INSTRUCTION("62610C48148A00200000" , vunpcklps(zmm25, zmm14, zmmword_ptr(rdx, 8192)));
+ TEST_INSTRUCTION("62610C48144A80" , vunpcklps(zmm25, zmm14, zmmword_ptr(rdx, -8192)));
+ TEST_INSTRUCTION("62610C48148AC0DFFFFF" , vunpcklps(zmm25, zmm14, zmmword_ptr(rdx, -8256)));
+ TEST_INSTRUCTION("62610C58144A7F" , vunpcklps(zmm25, zmm14, dword_ptr(rdx, 508)._1to16()));
+ TEST_INSTRUCTION("62610C58148A00020000" , vunpcklps(zmm25, zmm14, dword_ptr(rdx, 512)._1to16()));
+ TEST_INSTRUCTION("62610C58144A80" , vunpcklps(zmm25, zmm14, dword_ptr(rdx, -512)._1to16()));
+ TEST_INSTRUCTION("62610C58148AFCFDFFFF" , vunpcklps(zmm25, zmm14, dword_ptr(rdx, -516)._1to16()));
+ TEST_INSTRUCTION("6253154825D2AB" , vpternlogd(zmm10, zmm13, zmm10, 171));
+ TEST_INSTRUCTION("6253154F25D2AB" , k(k7).vpternlogd(zmm10, zmm13, zmm10, 171));
+ TEST_INSTRUCTION("625315CF25D2AB" , k(k7).z().vpternlogd(zmm10, zmm13, zmm10, 171));
+ TEST_INSTRUCTION("6253154825D27B" , vpternlogd(zmm10, zmm13, zmm10, 123));
+ TEST_INSTRUCTION("6273154825117B" , vpternlogd(zmm10, zmm13, zmmword_ptr(rcx), 123));
+ TEST_INSTRUCTION("623315482594F0341200007B" , vpternlogd(zmm10, zmm13, zmmword_ptr(rax, r14, 3, 4660), 123));
+ TEST_INSTRUCTION("6273155825117B" , vpternlogd(zmm10, zmm13, dword_ptr(rcx)._1to16(), 123));
+ TEST_INSTRUCTION("6273154825527F7B" , vpternlogd(zmm10, zmm13, zmmword_ptr(rdx, 8128), 123));
+ TEST_INSTRUCTION("627315482592002000007B" , vpternlogd(zmm10, zmm13, zmmword_ptr(rdx, 8192), 123));
+ TEST_INSTRUCTION("627315482552807B" , vpternlogd(zmm10, zmm13, zmmword_ptr(rdx, -8192), 123));
+ TEST_INSTRUCTION("627315482592C0DFFFFF7B" , vpternlogd(zmm10, zmm13, zmmword_ptr(rdx, -8256), 123));
+ TEST_INSTRUCTION("6273155825527F7B" , vpternlogd(zmm10, zmm13, dword_ptr(rdx, 508)._1to16(), 123));
+ TEST_INSTRUCTION("627315582592000200007B" , vpternlogd(zmm10, zmm13, dword_ptr(rdx, 512)._1to16(), 123));
+ TEST_INSTRUCTION("627315582552807B" , vpternlogd(zmm10, zmm13, dword_ptr(rdx, -512)._1to16(), 123));
+ TEST_INSTRUCTION("627315582592FCFDFFFF7B" , vpternlogd(zmm10, zmm13, dword_ptr(rdx, -516)._1to16(), 123));
+ TEST_INSTRUCTION("62C39D4825C5AB" , vpternlogq(zmm16, zmm12, zmm13, 171));
+ TEST_INSTRUCTION("62C39D4A25C5AB" , k(k2).vpternlogq(zmm16, zmm12, zmm13, 171));
+ TEST_INSTRUCTION("62C39DCA25C5AB" , k(k2).z().vpternlogq(zmm16, zmm12, zmm13, 171));
+ TEST_INSTRUCTION("62C39D4825C57B" , vpternlogq(zmm16, zmm12, zmm13, 123));
+ TEST_INSTRUCTION("62E39D4825017B" , vpternlogq(zmm16, zmm12, zmmword_ptr(rcx), 123));
+ TEST_INSTRUCTION("62A39D482584F0341200007B" , vpternlogq(zmm16, zmm12, zmmword_ptr(rax, r14, 3, 4660), 123));
+ TEST_INSTRUCTION("62E39D5825017B" , vpternlogq(zmm16, zmm12, qword_ptr(rcx)._1to8(), 123));
+ TEST_INSTRUCTION("62E39D4825427F7B" , vpternlogq(zmm16, zmm12, zmmword_ptr(rdx, 8128), 123));
+ TEST_INSTRUCTION("62E39D482582002000007B" , vpternlogq(zmm16, zmm12, zmmword_ptr(rdx, 8192), 123));
+ TEST_INSTRUCTION("62E39D482542807B" , vpternlogq(zmm16, zmm12, zmmword_ptr(rdx, -8192), 123));
+ TEST_INSTRUCTION("62E39D482582C0DFFFFF7B" , vpternlogq(zmm16, zmm12, zmmword_ptr(rdx, -8256), 123));
+ TEST_INSTRUCTION("62E39D5825427F7B" , vpternlogq(zmm16, zmm12, qword_ptr(rdx, 1016)._1to8(), 123));
+ TEST_INSTRUCTION("62E39D582582000400007B" , vpternlogq(zmm16, zmm12, qword_ptr(rdx, 1024)._1to8(), 123));
+ TEST_INSTRUCTION("62E39D582542807B" , vpternlogq(zmm16, zmm12, qword_ptr(rdx, -1024)._1to8(), 123));
+ TEST_INSTRUCTION("62E39D582582F8FBFFFF7B" , vpternlogq(zmm16, zmm12, qword_ptr(rdx, -1032)._1to8(), 123));
+ TEST_INSTRUCTION("62327E4832F7" , vpmovqb(xmm23, zmm14));
+ TEST_INSTRUCTION("62327E4A32F7" , k(k2).vpmovqb(xmm23, zmm14));
+ TEST_INSTRUCTION("62327ECA32F7" , k(k2).z().vpmovqb(xmm23, zmm14));
+ TEST_INSTRUCTION("62227E4822CC" , vpmovsqb(xmm20, zmm25));
+ TEST_INSTRUCTION("62227E4922CC" , k(k1).vpmovsqb(xmm20, zmm25));
+ TEST_INSTRUCTION("62227EC922CC" , k(k1).z().vpmovsqb(xmm20, zmm25));
+ TEST_INSTRUCTION("62D27E4812D0" , vpmovusqb(xmm8, zmm2));
+ TEST_INSTRUCTION("62D27E4C12D0" , k(k4).vpmovusqb(xmm8, zmm2));
+ TEST_INSTRUCTION("62D27ECC12D0" , k(k4).z().vpmovusqb(xmm8, zmm2));
+ TEST_INSTRUCTION("62A27E4834DD" , vpmovqw(xmm21, zmm19));
+ TEST_INSTRUCTION("62A27E4A34DD" , k(k2).vpmovqw(xmm21, zmm19));
+ TEST_INSTRUCTION("62A27ECA34DD" , k(k2).z().vpmovqw(xmm21, zmm19));
+ TEST_INSTRUCTION("62B27E4824E0" , vpmovsqw(xmm16, zmm4));
+ TEST_INSTRUCTION("62B27E4E24E0" , k(k6).vpmovsqw(xmm16, zmm4));
+ TEST_INSTRUCTION("62B27ECE24E0" , k(k6).z().vpmovsqw(xmm16, zmm4));
+ TEST_INSTRUCTION("62927E4814CD" , vpmovusqw(xmm29, zmm1));
+ TEST_INSTRUCTION("62927E4A14CD" , k(k2).vpmovusqw(xmm29, zmm1));
+ TEST_INSTRUCTION("62927ECA14CD" , k(k2).z().vpmovusqw(xmm29, zmm1));
+ TEST_INSTRUCTION("62027E4835EC" , vpmovqd(ymm28, zmm29));
+ TEST_INSTRUCTION("62027E4A35EC" , k(k2).vpmovqd(ymm28, zmm29));
+ TEST_INSTRUCTION("62027ECA35EC" , k(k2).z().vpmovqd(ymm28, zmm29));
+ TEST_INSTRUCTION("62327E4825CE" , vpmovsqd(ymm22, zmm9));
+ TEST_INSTRUCTION("62327E4C25CE" , k(k4).vpmovsqd(ymm22, zmm9));
+ TEST_INSTRUCTION("62327ECC25CE" , k(k4).z().vpmovsqd(ymm22, zmm9));
+ TEST_INSTRUCTION("62627E4815D2" , vpmovusqd(ymm2, zmm26));
+ TEST_INSTRUCTION("62627E4F15D2" , k(k7).vpmovusqd(ymm2, zmm26));
+ TEST_INSTRUCTION("62627ECF15D2" , k(k7).z().vpmovusqd(ymm2, zmm26));
+ TEST_INSTRUCTION("62727E4831D9" , vpmovdb(xmm1, zmm11));
+ TEST_INSTRUCTION("62727E4F31D9" , k(k7).vpmovdb(xmm1, zmm11));
+ TEST_INSTRUCTION("62727ECF31D9" , k(k7).z().vpmovdb(xmm1, zmm11));
+ TEST_INSTRUCTION("62927E4821CB" , vpmovsdb(xmm27, zmm1));
+ TEST_INSTRUCTION("62927E4F21CB" , k(k7).vpmovsdb(xmm27, zmm1));
+ TEST_INSTRUCTION("62927ECF21CB" , k(k7).z().vpmovsdb(xmm27, zmm1));
+ TEST_INSTRUCTION("62E27E4811DB" , vpmovusdb(xmm3, zmm19));
+ TEST_INSTRUCTION("62E27E4A11DB" , k(k2).vpmovusdb(xmm3, zmm19));
+ TEST_INSTRUCTION("62E27ECA11DB" , k(k2).z().vpmovusdb(xmm3, zmm19));
+ TEST_INSTRUCTION("62527E4833D1" , vpmovdw(ymm9, zmm10));
+ TEST_INSTRUCTION("62527E4C33D1" , k(k4).vpmovdw(ymm9, zmm10));
+ TEST_INSTRUCTION("62527ECC33D1" , k(k4).z().vpmovdw(ymm9, zmm10));
+ TEST_INSTRUCTION("62027E4823C0" , vpmovsdw(ymm24, zmm24));
+ TEST_INSTRUCTION("62027E4E23C0" , k(k6).vpmovsdw(ymm24, zmm24));
+ TEST_INSTRUCTION("62027ECE23C0" , k(k6).z().vpmovsdw(ymm24, zmm24));
+ TEST_INSTRUCTION("62C27E4813CF" , vpmovusdw(ymm15, zmm17));
+ TEST_INSTRUCTION("62C27E4F13CF" , k(k7).vpmovusdw(ymm15, zmm17));
+ TEST_INSTRUCTION("62C27ECF13CF" , k(k7).z().vpmovusdw(ymm15, zmm17));
+ TEST_INSTRUCTION("62E3254823CCAB" , vshuff32x4(zmm17, zmm11, zmm4, 171));
+ TEST_INSTRUCTION("62E3254E23CCAB" , k(k6).vshuff32x4(zmm17, zmm11, zmm4, 171));
+ TEST_INSTRUCTION("62E325CE23CCAB" , k(k6).z().vshuff32x4(zmm17, zmm11, zmm4, 171));
+ TEST_INSTRUCTION("62E3254823CC7B" , vshuff32x4(zmm17, zmm11, zmm4, 123));
+ TEST_INSTRUCTION("62E3254823097B" , vshuff32x4(zmm17, zmm11, zmmword_ptr(rcx), 123));
+ TEST_INSTRUCTION("62A32548238CF0341200007B" , vshuff32x4(zmm17, zmm11, zmmword_ptr(rax, r14, 3, 4660), 123));
+ TEST_INSTRUCTION("62E3255823097B" , vshuff32x4(zmm17, zmm11, dword_ptr(rcx)._1to16(), 123));
+ TEST_INSTRUCTION("62E32548234A7F7B" , vshuff32x4(zmm17, zmm11, zmmword_ptr(rdx, 8128), 123));
+ TEST_INSTRUCTION("62E32548238A002000007B" , vshuff32x4(zmm17, zmm11, zmmword_ptr(rdx, 8192), 123));
+ TEST_INSTRUCTION("62E32548234A807B" , vshuff32x4(zmm17, zmm11, zmmword_ptr(rdx, -8192), 123));
+ TEST_INSTRUCTION("62E32548238AC0DFFFFF7B" , vshuff32x4(zmm17, zmm11, zmmword_ptr(rdx, -8256), 123));
+ TEST_INSTRUCTION("62E32558234A7F7B" , vshuff32x4(zmm17, zmm11, dword_ptr(rdx, 508)._1to16(), 123));
+ TEST_INSTRUCTION("62E32558238A000200007B" , vshuff32x4(zmm17, zmm11, dword_ptr(rdx, 512)._1to16(), 123));
+ TEST_INSTRUCTION("62E32558234A807B" , vshuff32x4(zmm17, zmm11, dword_ptr(rdx, -512)._1to16(), 123));
+ TEST_INSTRUCTION("62E32558238AFCFDFFFF7B" , vshuff32x4(zmm17, zmm11, dword_ptr(rdx, -516)._1to16(), 123));
+ TEST_INSTRUCTION("62939D4823F0AB" , vshuff64x2(zmm6, zmm12, zmm24, 171));
+ TEST_INSTRUCTION("62939D4B23F0AB" , k(k3).vshuff64x2(zmm6, zmm12, zmm24, 171));
+ TEST_INSTRUCTION("62939DCB23F0AB" , k(k3).z().vshuff64x2(zmm6, zmm12, zmm24, 171));
+ TEST_INSTRUCTION("62939D4823F07B" , vshuff64x2(zmm6, zmm12, zmm24, 123));
+ TEST_INSTRUCTION("62F39D4823317B" , vshuff64x2(zmm6, zmm12, zmmword_ptr(rcx), 123));
+ TEST_INSTRUCTION("62B39D4823B4F0341200007B" , vshuff64x2(zmm6, zmm12, zmmword_ptr(rax, r14, 3, 4660), 123));
+ TEST_INSTRUCTION("62F39D5823317B" , vshuff64x2(zmm6, zmm12, qword_ptr(rcx)._1to8(), 123));
+ TEST_INSTRUCTION("62F39D4823727F7B" , vshuff64x2(zmm6, zmm12, zmmword_ptr(rdx, 8128), 123));
+ TEST_INSTRUCTION("62F39D4823B2002000007B" , vshuff64x2(zmm6, zmm12, zmmword_ptr(rdx, 8192), 123));
+ TEST_INSTRUCTION("62F39D482372807B" , vshuff64x2(zmm6, zmm12, zmmword_ptr(rdx, -8192), 123));
+ TEST_INSTRUCTION("62F39D4823B2C0DFFFFF7B" , vshuff64x2(zmm6, zmm12, zmmword_ptr(rdx, -8256), 123));
+ TEST_INSTRUCTION("62F39D5823727F7B" , vshuff64x2(zmm6, zmm12, qword_ptr(rdx, 1016)._1to8(), 123));
+ TEST_INSTRUCTION("62F39D5823B2000400007B" , vshuff64x2(zmm6, zmm12, qword_ptr(rdx, 1024)._1to8(), 123));
+ TEST_INSTRUCTION("62F39D582372807B" , vshuff64x2(zmm6, zmm12, qword_ptr(rdx, -1024)._1to8(), 123));
+ TEST_INSTRUCTION("62F39D5823B2F8FBFFFF7B" , vshuff64x2(zmm6, zmm12, qword_ptr(rdx, -1032)._1to8(), 123));
+ TEST_INSTRUCTION("62F33D4043DDAB" , vshufi32x4(zmm3, zmm24, zmm5, 171));
+ TEST_INSTRUCTION("62F33D4443DDAB" , k(k4).vshufi32x4(zmm3, zmm24, zmm5, 171));
+ TEST_INSTRUCTION("62F33DC443DDAB" , k(k4).z().vshufi32x4(zmm3, zmm24, zmm5, 171));
+ TEST_INSTRUCTION("62F33D4043DD7B" , vshufi32x4(zmm3, zmm24, zmm5, 123));
+ TEST_INSTRUCTION("62F33D4043197B" , vshufi32x4(zmm3, zmm24, zmmword_ptr(rcx), 123));
+ TEST_INSTRUCTION("62B33D40439CF0341200007B" , vshufi32x4(zmm3, zmm24, zmmword_ptr(rax, r14, 3, 4660), 123));
+ TEST_INSTRUCTION("62F33D5043197B" , vshufi32x4(zmm3, zmm24, dword_ptr(rcx)._1to16(), 123));
+ TEST_INSTRUCTION("62F33D40435A7F7B" , vshufi32x4(zmm3, zmm24, zmmword_ptr(rdx, 8128), 123));
+ TEST_INSTRUCTION("62F33D40439A002000007B" , vshufi32x4(zmm3, zmm24, zmmword_ptr(rdx, 8192), 123));
+ TEST_INSTRUCTION("62F33D40435A807B" , vshufi32x4(zmm3, zmm24, zmmword_ptr(rdx, -8192), 123));
+ TEST_INSTRUCTION("62F33D40439AC0DFFFFF7B" , vshufi32x4(zmm3, zmm24, zmmword_ptr(rdx, -8256), 123));
+ TEST_INSTRUCTION("62F33D50435A7F7B" , vshufi32x4(zmm3, zmm24, dword_ptr(rdx, 508)._1to16(), 123));
+ TEST_INSTRUCTION("62F33D50439A000200007B" , vshufi32x4(zmm3, zmm24, dword_ptr(rdx, 512)._1to16(), 123));
+ TEST_INSTRUCTION("62F33D50435A807B" , vshufi32x4(zmm3, zmm24, dword_ptr(rdx, -512)._1to16(), 123));
+ TEST_INSTRUCTION("62F33D50439AFCFDFFFF7B" , vshufi32x4(zmm3, zmm24, dword_ptr(rdx, -516)._1to16(), 123));
+ TEST_INSTRUCTION("62438D4843F1AB" , vshufi64x2(zmm30, zmm14, zmm9, 171));
+ TEST_INSTRUCTION("62438D4943F1AB" , k(k1).vshufi64x2(zmm30, zmm14, zmm9, 171));
+ TEST_INSTRUCTION("62438DC943F1AB" , k(k1).z().vshufi64x2(zmm30, zmm14, zmm9, 171));
+ TEST_INSTRUCTION("62438D4843F17B" , vshufi64x2(zmm30, zmm14, zmm9, 123));
+ TEST_INSTRUCTION("62638D4843317B" , vshufi64x2(zmm30, zmm14, zmmword_ptr(rcx), 123));
+ TEST_INSTRUCTION("62238D4843B4F0341200007B" , vshufi64x2(zmm30, zmm14, zmmword_ptr(rax, r14, 3, 4660), 123));
+ TEST_INSTRUCTION("62638D5843317B" , vshufi64x2(zmm30, zmm14, qword_ptr(rcx)._1to8(), 123));
+ TEST_INSTRUCTION("62638D4843727F7B" , vshufi64x2(zmm30, zmm14, zmmword_ptr(rdx, 8128), 123));
+ TEST_INSTRUCTION("62638D4843B2002000007B" , vshufi64x2(zmm30, zmm14, zmmword_ptr(rdx, 8192), 123));
+ TEST_INSTRUCTION("62638D484372807B" , vshufi64x2(zmm30, zmm14, zmmword_ptr(rdx, -8192), 123));
+ TEST_INSTRUCTION("62638D4843B2C0DFFFFF7B" , vshufi64x2(zmm30, zmm14, zmmword_ptr(rdx, -8256), 123));
+ TEST_INSTRUCTION("62638D5843727F7B" , vshufi64x2(zmm30, zmm14, qword_ptr(rdx, 1016)._1to8(), 123));
+ TEST_INSTRUCTION("62638D5843B2000400007B" , vshufi64x2(zmm30, zmm14, qword_ptr(rdx, 1024)._1to8(), 123));
+ TEST_INSTRUCTION("62638D584372807B" , vshufi64x2(zmm30, zmm14, qword_ptr(rdx, -1024)._1to8(), 123));
+ TEST_INSTRUCTION("62638D5843B2F8FBFFFF7B" , vshufi64x2(zmm30, zmm14, qword_ptr(rdx, -1032)._1to8(), 123));
+ TEST_INSTRUCTION("62A2CD4036D3" , vpermq(zmm18, zmm22, zmm19));
+ TEST_INSTRUCTION("62A2CD4736D3" , k(k7).vpermq(zmm18, zmm22, zmm19));
+ TEST_INSTRUCTION("62A2CDC736D3" , k(k7).z().vpermq(zmm18, zmm22, zmm19));
+ TEST_INSTRUCTION("62E2CD403611" , vpermq(zmm18, zmm22, zmmword_ptr(rcx)));
+ TEST_INSTRUCTION("62A2CD403694F034120000" , vpermq(zmm18, zmm22, zmmword_ptr(rax, r14, 3, 4660)));
+ TEST_INSTRUCTION("62E2CD503611" , vpermq(zmm18, zmm22, qword_ptr(rcx)._1to8()));
+ TEST_INSTRUCTION("62E2CD4036527F" , vpermq(zmm18, zmm22, zmmword_ptr(rdx, 8128)));
+ TEST_INSTRUCTION("62E2CD40369200200000" , vpermq(zmm18, zmm22, zmmword_ptr(rdx, 8192)));
+ TEST_INSTRUCTION("62E2CD40365280" , vpermq(zmm18, zmm22, zmmword_ptr(rdx, -8192)));
+ TEST_INSTRUCTION("62E2CD403692C0DFFFFF" , vpermq(zmm18, zmm22, zmmword_ptr(rdx, -8256)));
+ TEST_INSTRUCTION("62E2CD5036527F" , vpermq(zmm18, zmm22, qword_ptr(rdx, 1016)._1to8()));
+ TEST_INSTRUCTION("62E2CD50369200040000" , vpermq(zmm18, zmm22, qword_ptr(rdx, 1024)._1to8()));
+ TEST_INSTRUCTION("62E2CD50365280" , vpermq(zmm18, zmm22, qword_ptr(rdx, -1024)._1to8()));
+ TEST_INSTRUCTION("62E2CD503692F8FBFFFF" , vpermq(zmm18, zmm22, qword_ptr(rdx, -1032)._1to8()));
+ TEST_INSTRUCTION("62629D4816DA" , vpermpd(zmm27, zmm12, zmm2));
+ TEST_INSTRUCTION("62629D4B16DA" , k(k3).vpermpd(zmm27, zmm12, zmm2));
+ TEST_INSTRUCTION("62629DCB16DA" , k(k3).z().vpermpd(zmm27, zmm12, zmm2));
+ TEST_INSTRUCTION("62629D481619" , vpermpd(zmm27, zmm12, zmmword_ptr(rcx)));
+ TEST_INSTRUCTION("62229D48169CF034120000" , vpermpd(zmm27, zmm12, zmmword_ptr(rax, r14, 3, 4660)));
+ TEST_INSTRUCTION("62629D581619" , vpermpd(zmm27, zmm12, qword_ptr(rcx)._1to8()));
+ TEST_INSTRUCTION("62629D48165A7F" , vpermpd(zmm27, zmm12, zmmword_ptr(rdx, 8128)));
+ TEST_INSTRUCTION("62629D48169A00200000" , vpermpd(zmm27, zmm12, zmmword_ptr(rdx, 8192)));
+ TEST_INSTRUCTION("62629D48165A80" , vpermpd(zmm27, zmm12, zmmword_ptr(rdx, -8192)));
+ TEST_INSTRUCTION("62629D48169AC0DFFFFF" , vpermpd(zmm27, zmm12, zmmword_ptr(rdx, -8256)));
+ TEST_INSTRUCTION("62629D58165A7F" , vpermpd(zmm27, zmm12, qword_ptr(rdx, 1016)._1to8()));
+ TEST_INSTRUCTION("62629D58169A00040000" , vpermpd(zmm27, zmm12, qword_ptr(rdx, 1024)._1to8()));
+ TEST_INSTRUCTION("62629D58165A80" , vpermpd(zmm27, zmm12, qword_ptr(rdx, -1024)._1to8()));
+ TEST_INSTRUCTION("62629D58169AF8FBFFFF" , vpermpd(zmm27, zmm12, qword_ptr(rdx, -1032)._1to8()));
+ TEST_INSTRUCTION("628205487ED9" , vpermt2d(zmm19, zmm15, zmm25));
+ TEST_INSTRUCTION("6282054A7ED9" , k(k2).vpermt2d(zmm19, zmm15, zmm25));
+ TEST_INSTRUCTION("628205CA7ED9" , k(k2).z().vpermt2d(zmm19, zmm15, zmm25));
+ TEST_INSTRUCTION("62E205487E19" , vpermt2d(zmm19, zmm15, zmmword_ptr(rcx)));
+ TEST_INSTRUCTION("62A205487E9CF034120000" , vpermt2d(zmm19, zmm15, zmmword_ptr(rax, r14, 3, 4660)));
+ TEST_INSTRUCTION("62E205587E19" , vpermt2d(zmm19, zmm15, dword_ptr(rcx)._1to16()));
+ TEST_INSTRUCTION("62E205487E5A7F" , vpermt2d(zmm19, zmm15, zmmword_ptr(rdx, 8128)));
+ TEST_INSTRUCTION("62E205487E9A00200000" , vpermt2d(zmm19, zmm15, zmmword_ptr(rdx, 8192)));
+ TEST_INSTRUCTION("62E205487E5A80" , vpermt2d(zmm19, zmm15, zmmword_ptr(rdx, -8192)));
+ TEST_INSTRUCTION("62E205487E9AC0DFFFFF" , vpermt2d(zmm19, zmm15, zmmword_ptr(rdx, -8256)));
+ TEST_INSTRUCTION("62E205587E5A7F" , vpermt2d(zmm19, zmm15, dword_ptr(rdx, 508)._1to16()));
+ TEST_INSTRUCTION("62E205587E9A00020000" , vpermt2d(zmm19, zmm15, dword_ptr(rdx, 512)._1to16()));
+ TEST_INSTRUCTION("62E205587E5A80" , vpermt2d(zmm19, zmm15, dword_ptr(rdx, -512)._1to16()));
+ TEST_INSTRUCTION("62E205587E9AFCFDFFFF" , vpermt2d(zmm19, zmm15, dword_ptr(rdx, -516)._1to16()));
+ TEST_INSTRUCTION("62F2D5407ED4" , vpermt2q(zmm2, zmm21, zmm4));
+ TEST_INSTRUCTION("62F2D5477ED4" , k(k7).vpermt2q(zmm2, zmm21, zmm4));
+ TEST_INSTRUCTION("62F2D5C77ED4" , k(k7).z().vpermt2q(zmm2, zmm21, zmm4));
+ TEST_INSTRUCTION("62F2D5407E11" , vpermt2q(zmm2, zmm21, zmmword_ptr(rcx)));
+ TEST_INSTRUCTION("62B2D5407E94F034120000" , vpermt2q(zmm2, zmm21, zmmword_ptr(rax, r14, 3, 4660)));
+ TEST_INSTRUCTION("62F2D5507E11" , vpermt2q(zmm2, zmm21, qword_ptr(rcx)._1to8()));
+ TEST_INSTRUCTION("62F2D5407E527F" , vpermt2q(zmm2, zmm21, zmmword_ptr(rdx, 8128)));
+ TEST_INSTRUCTION("62F2D5407E9200200000" , vpermt2q(zmm2, zmm21, zmmword_ptr(rdx, 8192)));
+ TEST_INSTRUCTION("62F2D5407E5280" , vpermt2q(zmm2, zmm21, zmmword_ptr(rdx, -8192)));
+ TEST_INSTRUCTION("62F2D5407E92C0DFFFFF" , vpermt2q(zmm2, zmm21, zmmword_ptr(rdx, -8256)));
+ TEST_INSTRUCTION("62F2D5507E527F" , vpermt2q(zmm2, zmm21, qword_ptr(rdx, 1016)._1to8()));
+ TEST_INSTRUCTION("62F2D5507E9200040000" , vpermt2q(zmm2, zmm21, qword_ptr(rdx, 1024)._1to8()));
+ TEST_INSTRUCTION("62F2D5507E5280" , vpermt2q(zmm2, zmm21, qword_ptr(rdx, -1024)._1to8()));
+ TEST_INSTRUCTION("62F2D5507E92F8FBFFFF" , vpermt2q(zmm2, zmm21, qword_ptr(rdx, -1032)._1to8()));
+ TEST_INSTRUCTION("62F205487FFF" , vpermt2ps(zmm7, zmm15, zmm7));
+ TEST_INSTRUCTION("62F2054F7FFF" , k(k7).vpermt2ps(zmm7, zmm15, zmm7));
+ TEST_INSTRUCTION("62F205CF7FFF" , k(k7).z().vpermt2ps(zmm7, zmm15, zmm7));
+ TEST_INSTRUCTION("62F205487F39" , vpermt2ps(zmm7, zmm15, zmmword_ptr(rcx)));
+ TEST_INSTRUCTION("62B205487FBCF034120000" , vpermt2ps(zmm7, zmm15, zmmword_ptr(rax, r14, 3, 4660)));
+ TEST_INSTRUCTION("62F205587F39" , vpermt2ps(zmm7, zmm15, dword_ptr(rcx)._1to16()));
+ TEST_INSTRUCTION("62F205487F7A7F" , vpermt2ps(zmm7, zmm15, zmmword_ptr(rdx, 8128)));
+ TEST_INSTRUCTION("62F205487FBA00200000" , vpermt2ps(zmm7, zmm15, zmmword_ptr(rdx, 8192)));
+ TEST_INSTRUCTION("62F205487F7A80" , vpermt2ps(zmm7, zmm15, zmmword_ptr(rdx, -8192)));
+ TEST_INSTRUCTION("62F205487FBAC0DFFFFF" , vpermt2ps(zmm7, zmm15, zmmword_ptr(rdx, -8256)));
+ TEST_INSTRUCTION("62F205587F7A7F" , vpermt2ps(zmm7, zmm15, dword_ptr(rdx, 508)._1to16()));
+ TEST_INSTRUCTION("62F205587FBA00020000" , vpermt2ps(zmm7, zmm15, dword_ptr(rdx, 512)._1to16()));
+ TEST_INSTRUCTION("62F205587F7A80" , vpermt2ps(zmm7, zmm15, dword_ptr(rdx, -512)._1to16()));
+ TEST_INSTRUCTION("62F205587FBAFCFDFFFF" , vpermt2ps(zmm7, zmm15, dword_ptr(rdx, -516)._1to16()));
+ TEST_INSTRUCTION("6212CD407FE1" , vpermt2pd(zmm12, zmm22, zmm25));
+ TEST_INSTRUCTION("6212CD417FE1" , k(k1).vpermt2pd(zmm12, zmm22, zmm25));
+ TEST_INSTRUCTION("6212CDC17FE1" , k(k1).z().vpermt2pd(zmm12, zmm22, zmm25));
+ TEST_INSTRUCTION("6272CD407F21" , vpermt2pd(zmm12, zmm22, zmmword_ptr(rcx)));
+ TEST_INSTRUCTION("6232CD407FA4F034120000" , vpermt2pd(zmm12, zmm22, zmmword_ptr(rax, r14, 3, 4660)));
+ TEST_INSTRUCTION("6272CD507F21" , vpermt2pd(zmm12, zmm22, qword_ptr(rcx)._1to8()));
+ TEST_INSTRUCTION("6272CD407F627F" , vpermt2pd(zmm12, zmm22, zmmword_ptr(rdx, 8128)));
+ TEST_INSTRUCTION("6272CD407FA200200000" , vpermt2pd(zmm12, zmm22, zmmword_ptr(rdx, 8192)));
+ TEST_INSTRUCTION("6272CD407F6280" , vpermt2pd(zmm12, zmm22, zmmword_ptr(rdx, -8192)));
+ TEST_INSTRUCTION("6272CD407FA2C0DFFFFF" , vpermt2pd(zmm12, zmm22, zmmword_ptr(rdx, -8256)));
+ TEST_INSTRUCTION("6272CD507F627F" , vpermt2pd(zmm12, zmm22, qword_ptr(rdx, 1016)._1to8()));
+ TEST_INSTRUCTION("6272CD507FA200040000" , vpermt2pd(zmm12, zmm22, qword_ptr(rdx, 1024)._1to8()));
+ TEST_INSTRUCTION("6272CD507F6280" , vpermt2pd(zmm12, zmm22, qword_ptr(rdx, -1024)._1to8()));
+ TEST_INSTRUCTION("6272CD507FA2F8FBFFFF" , vpermt2pd(zmm12, zmm22, qword_ptr(rdx, -1032)._1to8()));
+ TEST_INSTRUCTION("6223F54003C8AB" , valignq(zmm25, zmm17, zmm16, 171));
+ TEST_INSTRUCTION("6223F54703C8AB" , k(k7).valignq(zmm25, zmm17, zmm16, 171));
+ TEST_INSTRUCTION("6223F5C703C8AB" , k(k7).z().valignq(zmm25, zmm17, zmm16, 171));
+ TEST_INSTRUCTION("6223F54003C87B" , valignq(zmm25, zmm17, zmm16, 123));
+ TEST_INSTRUCTION("6263F54003097B" , valignq(zmm25, zmm17, zmmword_ptr(rcx), 123));
+ TEST_INSTRUCTION("6223F540038CF0341200007B" , valignq(zmm25, zmm17, zmmword_ptr(rax, r14, 3, 4660), 123));
+ TEST_INSTRUCTION("6263F55003097B" , valignq(zmm25, zmm17, qword_ptr(rcx)._1to8(), 123));
+ TEST_INSTRUCTION("6263F540034A7F7B" , valignq(zmm25, zmm17, zmmword_ptr(rdx, 8128), 123));
+ TEST_INSTRUCTION("6263F540038A002000007B" , valignq(zmm25, zmm17, zmmword_ptr(rdx, 8192), 123));
+ TEST_INSTRUCTION("6263F540034A807B" , valignq(zmm25, zmm17, zmmword_ptr(rdx, -8192), 123));
+ TEST_INSTRUCTION("6263F540038AC0DFFFFF7B" , valignq(zmm25, zmm17, zmmword_ptr(rdx, -8256), 123));
+ TEST_INSTRUCTION("6263F550034A7F7B" , valignq(zmm25, zmm17, qword_ptr(rdx, 1016)._1to8(), 123));
+ TEST_INSTRUCTION("6263F550038A000400007B" , valignq(zmm25, zmm17, qword_ptr(rdx, 1024)._1to8(), 123));
+ TEST_INSTRUCTION("6263F550034A807B" , valignq(zmm25, zmm17, qword_ptr(rdx, -1024)._1to8(), 123));
+ TEST_INSTRUCTION("6263F550038AF8FBFFFF7B" , valignq(zmm25, zmm17, qword_ptr(rdx, -1032)._1to8(), 123));
+ TEST_INSTRUCTION("62D17F0879C3" , vcvtsd2usi(eax, xmm11));
+ TEST_INSTRUCTION("62D17F1879C3" , rn_sae().vcvtsd2usi(eax, xmm11));
+ TEST_INSTRUCTION("62D17F5879C3" , ru_sae().vcvtsd2usi(eax, xmm11));
+ TEST_INSTRUCTION("62D17F3879C3" , rd_sae().vcvtsd2usi(eax, xmm11));
+ TEST_INSTRUCTION("62D17F7879C3" , rz_sae().vcvtsd2usi(eax, xmm11));
+ TEST_INSTRUCTION("62F17F087901" , vcvtsd2usi(eax, qword_ptr(rcx)));
+ TEST_INSTRUCTION("62B17F087984F034120000" , vcvtsd2usi(eax, qword_ptr(rax, r14, 3, 4660)));
+ TEST_INSTRUCTION("62F17F0879427F" , vcvtsd2usi(eax, qword_ptr(rdx, 1016)));
+ TEST_INSTRUCTION("62F17F08798200040000" , vcvtsd2usi(eax, qword_ptr(rdx, 1024)));
+ TEST_INSTRUCTION("62F17F08794280" , vcvtsd2usi(eax, qword_ptr(rdx, -1024)));
+ TEST_INSTRUCTION("62F17F087982F8FBFFFF" , vcvtsd2usi(eax, qword_ptr(rdx, -1032)));
+ TEST_INSTRUCTION("62D17F0879EB" , vcvtsd2usi(ebp, xmm11));
+ TEST_INSTRUCTION("62D17F1879EB" , rn_sae().vcvtsd2usi(ebp, xmm11));
+ TEST_INSTRUCTION("62D17F5879EB" , ru_sae().vcvtsd2usi(ebp, xmm11));
+ TEST_INSTRUCTION("62D17F3879EB" , rd_sae().vcvtsd2usi(ebp, xmm11));
+ TEST_INSTRUCTION("62D17F7879EB" , rz_sae().vcvtsd2usi(ebp, xmm11));
+ TEST_INSTRUCTION("62F17F087929" , vcvtsd2usi(ebp, qword_ptr(rcx)));
+ TEST_INSTRUCTION("62B17F0879ACF034120000" , vcvtsd2usi(ebp, qword_ptr(rax, r14, 3, 4660)));
+ TEST_INSTRUCTION("62F17F08796A7F" , vcvtsd2usi(ebp, qword_ptr(rdx, 1016)));
+ TEST_INSTRUCTION("62F17F0879AA00040000" , vcvtsd2usi(ebp, qword_ptr(rdx, 1024)));
+ TEST_INSTRUCTION("62F17F08796A80" , vcvtsd2usi(ebp, qword_ptr(rdx, -1024)));
+ TEST_INSTRUCTION("62F17F0879AAF8FBFFFF" , vcvtsd2usi(ebp, qword_ptr(rdx, -1032)));
+ TEST_INSTRUCTION("62517F0879EB" , vcvtsd2usi(r13d, xmm11));
+ TEST_INSTRUCTION("62517F1879EB" , rn_sae().vcvtsd2usi(r13d, xmm11));
+ TEST_INSTRUCTION("62517F5879EB" , ru_sae().vcvtsd2usi(r13d, xmm11));
+ TEST_INSTRUCTION("62517F3879EB" , rd_sae().vcvtsd2usi(r13d, xmm11));
+ TEST_INSTRUCTION("62517F7879EB" , rz_sae().vcvtsd2usi(r13d, xmm11));
+ TEST_INSTRUCTION("62717F087929" , vcvtsd2usi(r13d, qword_ptr(rcx)));
+ TEST_INSTRUCTION("62317F0879ACF034120000" , vcvtsd2usi(r13d, qword_ptr(rax, r14, 3, 4660)));
+ TEST_INSTRUCTION("62717F08796A7F" , vcvtsd2usi(r13d, qword_ptr(rdx, 1016)));
+ TEST_INSTRUCTION("62717F0879AA00040000" , vcvtsd2usi(r13d, qword_ptr(rdx, 1024)));
+ TEST_INSTRUCTION("62717F08796A80" , vcvtsd2usi(r13d, qword_ptr(rdx, -1024)));
+ TEST_INSTRUCTION("62717F0879AAF8FBFFFF" , vcvtsd2usi(r13d, qword_ptr(rdx, -1032)));
+ TEST_INSTRUCTION("62D1FF0879C5" , vcvtsd2usi(rax, xmm13));
+ TEST_INSTRUCTION("62D1FF1879C5" , rn_sae().vcvtsd2usi(rax, xmm13));
+ TEST_INSTRUCTION("62D1FF5879C5" , ru_sae().vcvtsd2usi(rax, xmm13));
+ TEST_INSTRUCTION("62D1FF3879C5" , rd_sae().vcvtsd2usi(rax, xmm13));
+ TEST_INSTRUCTION("62D1FF7879C5" , rz_sae().vcvtsd2usi(rax, xmm13));
+ TEST_INSTRUCTION("62F1FF087901" , vcvtsd2usi(rax, qword_ptr(rcx)));
+ TEST_INSTRUCTION("62B1FF087984F034120000" , vcvtsd2usi(rax, qword_ptr(rax, r14, 3, 4660)));
+ TEST_INSTRUCTION("62F1FF0879427F" , vcvtsd2usi(rax, qword_ptr(rdx, 1016)));
+ TEST_INSTRUCTION("62F1FF08798200040000" , vcvtsd2usi(rax, qword_ptr(rdx, 1024)));
+ TEST_INSTRUCTION("62F1FF08794280" , vcvtsd2usi(rax, qword_ptr(rdx, -1024)));
+ TEST_INSTRUCTION("62F1FF087982F8FBFFFF" , vcvtsd2usi(rax, qword_ptr(rdx, -1032)));
+ TEST_INSTRUCTION("6251FF0879C5" , vcvtsd2usi(r8, xmm13));
+ TEST_INSTRUCTION("6251FF1879C5" , rn_sae().vcvtsd2usi(r8, xmm13));
+ TEST_INSTRUCTION("6251FF5879C5" , ru_sae().vcvtsd2usi(r8, xmm13));
+ TEST_INSTRUCTION("6251FF3879C5" , rd_sae().vcvtsd2usi(r8, xmm13));
+ TEST_INSTRUCTION("6251FF7879C5" , rz_sae().vcvtsd2usi(r8, xmm13));
+ TEST_INSTRUCTION("6271FF087901" , vcvtsd2usi(r8, qword_ptr(rcx)));
+ TEST_INSTRUCTION("6231FF087984F034120000" , vcvtsd2usi(r8, qword_ptr(rax, r14, 3, 4660)));
+ TEST_INSTRUCTION("6271FF0879427F" , vcvtsd2usi(r8, qword_ptr(rdx, 1016)));
+ TEST_INSTRUCTION("6271FF08798200040000" , vcvtsd2usi(r8, qword_ptr(rdx, 1024)));
+ TEST_INSTRUCTION("6271FF08794280" , vcvtsd2usi(r8, qword_ptr(rdx, -1024)));
+ TEST_INSTRUCTION("6271FF087982F8FBFFFF" , vcvtsd2usi(r8, qword_ptr(rdx, -1032)));
+ TEST_INSTRUCTION("62F17E0879C1" , vcvtss2usi(eax, xmm1));
+ TEST_INSTRUCTION("62F17E1879C1" , rn_sae().vcvtss2usi(eax, xmm1));
+ TEST_INSTRUCTION("62F17E5879C1" , ru_sae().vcvtss2usi(eax, xmm1));
+ TEST_INSTRUCTION("62F17E3879C1" , rd_sae().vcvtss2usi(eax, xmm1));
+ TEST_INSTRUCTION("62F17E7879C1" , rz_sae().vcvtss2usi(eax, xmm1));
+ TEST_INSTRUCTION("62F17E087901" , vcvtss2usi(eax, dword_ptr(rcx)));
+ TEST_INSTRUCTION("62B17E087984F034120000" , vcvtss2usi(eax, dword_ptr(rax, r14, 3, 4660)));
+ TEST_INSTRUCTION("62F17E0879427F" , vcvtss2usi(eax, dword_ptr(rdx, 508)));
+ TEST_INSTRUCTION("62F17E08798200020000" , vcvtss2usi(eax, dword_ptr(rdx, 512)));
+ TEST_INSTRUCTION("62F17E08794280" , vcvtss2usi(eax, dword_ptr(rdx, -512)));
+ TEST_INSTRUCTION("62F17E087982FCFDFFFF" , vcvtss2usi(eax, dword_ptr(rdx, -516)));
+ TEST_INSTRUCTION("62F17E0879E9" , vcvtss2usi(ebp, xmm1));
+ TEST_INSTRUCTION("62F17E1879E9" , rn_sae().vcvtss2usi(ebp, xmm1));
+ TEST_INSTRUCTION("62F17E5879E9" , ru_sae().vcvtss2usi(ebp, xmm1));
+ TEST_INSTRUCTION("62F17E3879E9" , rd_sae().vcvtss2usi(ebp, xmm1));
+ TEST_INSTRUCTION("62F17E7879E9" , rz_sae().vcvtss2usi(ebp, xmm1));
+ TEST_INSTRUCTION("62F17E087929" , vcvtss2usi(ebp, dword_ptr(rcx)));
+ TEST_INSTRUCTION("62B17E0879ACF034120000" , vcvtss2usi(ebp, dword_ptr(rax, r14, 3, 4660)));
+ TEST_INSTRUCTION("62F17E08796A7F" , vcvtss2usi(ebp, dword_ptr(rdx, 508)));
+ TEST_INSTRUCTION("62F17E0879AA00020000" , vcvtss2usi(ebp, dword_ptr(rdx, 512)));
+ TEST_INSTRUCTION("62F17E08796A80" , vcvtss2usi(ebp, dword_ptr(rdx, -512)));
+ TEST_INSTRUCTION("62F17E0879AAFCFDFFFF" , vcvtss2usi(ebp, dword_ptr(rdx, -516)));
+ TEST_INSTRUCTION("62717E0879E9" , vcvtss2usi(r13d, xmm1));
+ TEST_INSTRUCTION("62717E1879E9" , rn_sae().vcvtss2usi(r13d, xmm1));
+ TEST_INSTRUCTION("62717E5879E9" , ru_sae().vcvtss2usi(r13d, xmm1));
+ TEST_INSTRUCTION("62717E3879E9" , rd_sae().vcvtss2usi(r13d, xmm1));
+ TEST_INSTRUCTION("62717E7879E9" , rz_sae().vcvtss2usi(r13d, xmm1));
+ TEST_INSTRUCTION("62717E087929" , vcvtss2usi(r13d, dword_ptr(rcx)));
+ TEST_INSTRUCTION("62317E0879ACF034120000" , vcvtss2usi(r13d, dword_ptr(rax, r14, 3, 4660)));
+ TEST_INSTRUCTION("62717E08796A7F" , vcvtss2usi(r13d, dword_ptr(rdx, 508)));
+ TEST_INSTRUCTION("62717E0879AA00020000" , vcvtss2usi(r13d, dword_ptr(rdx, 512)));
+ TEST_INSTRUCTION("62717E08796A80" , vcvtss2usi(r13d, dword_ptr(rdx, -512)));
+ TEST_INSTRUCTION("62717E0879AAFCFDFFFF" , vcvtss2usi(r13d, dword_ptr(rdx, -516)));
+ TEST_INSTRUCTION("62F1FE0879C3" , vcvtss2usi(rax, xmm3));
+ TEST_INSTRUCTION("62F1FE1879C3" , rn_sae().vcvtss2usi(rax, xmm3));
+ TEST_INSTRUCTION("62F1FE5879C3" , ru_sae().vcvtss2usi(rax, xmm3));
+ TEST_INSTRUCTION("62F1FE3879C3" , rd_sae().vcvtss2usi(rax, xmm3));
+ TEST_INSTRUCTION("62F1FE7879C3" , rz_sae().vcvtss2usi(rax, xmm3));
+ TEST_INSTRUCTION("62F1FE087901" , vcvtss2usi(rax, dword_ptr(rcx)));
+ TEST_INSTRUCTION("62B1FE087984F034120000" , vcvtss2usi(rax, dword_ptr(rax, r14, 3, 4660)));
+ TEST_INSTRUCTION("62F1FE0879427F" , vcvtss2usi(rax, dword_ptr(rdx, 508)));
+ TEST_INSTRUCTION("62F1FE08798200020000" , vcvtss2usi(rax, dword_ptr(rdx, 512)));
+ TEST_INSTRUCTION("62F1FE08794280" , vcvtss2usi(rax, dword_ptr(rdx, -512)));
+ TEST_INSTRUCTION("62F1FE087982FCFDFFFF" , vcvtss2usi(rax, dword_ptr(rdx, -516)));
+ TEST_INSTRUCTION("6271FE0879C3" , vcvtss2usi(r8, xmm3));
+ TEST_INSTRUCTION("6271FE1879C3" , rn_sae().vcvtss2usi(r8, xmm3));
+ TEST_INSTRUCTION("6271FE5879C3" , ru_sae().vcvtss2usi(r8, xmm3));
+ TEST_INSTRUCTION("6271FE3879C3" , rd_sae().vcvtss2usi(r8, xmm3));
+ TEST_INSTRUCTION("6271FE7879C3" , rz_sae().vcvtss2usi(r8, xmm3));
+ TEST_INSTRUCTION("6271FE087901" , vcvtss2usi(r8, dword_ptr(rcx)));
+ TEST_INSTRUCTION("6231FE087984F034120000" , vcvtss2usi(r8, dword_ptr(rax, r14, 3, 4660)));
+ TEST_INSTRUCTION("6271FE0879427F" , vcvtss2usi(r8, dword_ptr(rdx, 508)));
+ TEST_INSTRUCTION("6271FE08798200020000" , vcvtss2usi(r8, dword_ptr(rdx, 512)));
+ TEST_INSTRUCTION("6271FE08794280" , vcvtss2usi(r8, dword_ptr(rdx, -512)));
+ TEST_INSTRUCTION("6271FE087982FCFDFFFF" , vcvtss2usi(r8, dword_ptr(rdx, -516)));
+ TEST_INSTRUCTION("626177007BD0" , vcvtusi2sd(xmm26, xmm17, eax));
+ TEST_INSTRUCTION("626177007BD5" , vcvtusi2sd(xmm26, xmm17, ebp));
+ TEST_INSTRUCTION("624177007BD5" , vcvtusi2sd(xmm26, xmm17, r13d));
+ TEST_INSTRUCTION("626177007B11" , vcvtusi2sd(xmm26, xmm17, dword_ptr(rcx)));
+ TEST_INSTRUCTION("622177007B94F034120000" , vcvtusi2sd(xmm26, xmm17, dword_ptr(rax, r14, 3, 4660)));
+ TEST_INSTRUCTION("626177007B527F" , vcvtusi2sd(xmm26, xmm17, dword_ptr(rdx, 508)));
+ TEST_INSTRUCTION("626177007B9200020000" , vcvtusi2sd(xmm26, xmm17, dword_ptr(rdx, 512)));
+ TEST_INSTRUCTION("626177007B5280" , vcvtusi2sd(xmm26, xmm17, dword_ptr(rdx, -512)));
+ TEST_INSTRUCTION("626177007B92FCFDFFFF" , vcvtusi2sd(xmm26, xmm17, dword_ptr(rdx, -516)));
+ TEST_INSTRUCTION("6271CF087BD8" , vcvtusi2sd(xmm11, xmm6, rax));
+ TEST_INSTRUCTION("6271CF187BD8" , rn_sae().vcvtusi2sd(xmm11, xmm6, rax));
+ TEST_INSTRUCTION("6271CF587BD8" , ru_sae().vcvtusi2sd(xmm11, xmm6, rax));
+ TEST_INSTRUCTION("6271CF387BD8" , rd_sae().vcvtusi2sd(xmm11, xmm6, rax));
+ TEST_INSTRUCTION("6271CF787BD8" , rz_sae().vcvtusi2sd(xmm11, xmm6, rax));
+ TEST_INSTRUCTION("6251CF087BD8" , vcvtusi2sd(xmm11, xmm6, r8));
+ TEST_INSTRUCTION("6251CF187BD8" , rn_sae().vcvtusi2sd(xmm11, xmm6, r8));
+ TEST_INSTRUCTION("6251CF587BD8" , ru_sae().vcvtusi2sd(xmm11, xmm6, r8));
+ TEST_INSTRUCTION("6251CF387BD8" , rd_sae().vcvtusi2sd(xmm11, xmm6, r8));
+ TEST_INSTRUCTION("6251CF787BD8" , rz_sae().vcvtusi2sd(xmm11, xmm6, r8));
+ TEST_INSTRUCTION("6271CF087B19" , vcvtusi2sd(xmm11, xmm6, qword_ptr(rcx)));
+ TEST_INSTRUCTION("6231CF087B9CF034120000" , vcvtusi2sd(xmm11, xmm6, qword_ptr(rax, r14, 3, 4660)));
+ TEST_INSTRUCTION("6271CF087B5A7F" , vcvtusi2sd(xmm11, xmm6, qword_ptr(rdx, 1016)));
+ TEST_INSTRUCTION("6271CF087B9A00040000" , vcvtusi2sd(xmm11, xmm6, qword_ptr(rdx, 1024)));
+ TEST_INSTRUCTION("6271CF087B5A80" , vcvtusi2sd(xmm11, xmm6, qword_ptr(rdx, -1024)));
+ TEST_INSTRUCTION("6271CF087B9AF8FBFFFF" , vcvtusi2sd(xmm11, xmm6, qword_ptr(rdx, -1032)));
+ TEST_INSTRUCTION("627146087BC8" , vcvtusi2ss(xmm9, xmm7, eax));
+ TEST_INSTRUCTION("627146187BC8" , rn_sae().vcvtusi2ss(xmm9, xmm7, eax));
+ TEST_INSTRUCTION("627146587BC8" , ru_sae().vcvtusi2ss(xmm9, xmm7, eax));
+ TEST_INSTRUCTION("627146387BC8" , rd_sae().vcvtusi2ss(xmm9, xmm7, eax));
+ TEST_INSTRUCTION("627146787BC8" , rz_sae().vcvtusi2ss(xmm9, xmm7, eax));
+ TEST_INSTRUCTION("627146087BCD" , vcvtusi2ss(xmm9, xmm7, ebp));
+ TEST_INSTRUCTION("627146187BCD" , rn_sae().vcvtusi2ss(xmm9, xmm7, ebp));
+ TEST_INSTRUCTION("627146587BCD" , ru_sae().vcvtusi2ss(xmm9, xmm7, ebp));
+ TEST_INSTRUCTION("627146387BCD" , rd_sae().vcvtusi2ss(xmm9, xmm7, ebp));
+ TEST_INSTRUCTION("627146787BCD" , rz_sae().vcvtusi2ss(xmm9, xmm7, ebp));
+ TEST_INSTRUCTION("625146087BCD" , vcvtusi2ss(xmm9, xmm7, r13d));
+ TEST_INSTRUCTION("625146187BCD" , rn_sae().vcvtusi2ss(xmm9, xmm7, r13d));
+ TEST_INSTRUCTION("625146587BCD" , ru_sae().vcvtusi2ss(xmm9, xmm7, r13d));
+ TEST_INSTRUCTION("625146387BCD" , rd_sae().vcvtusi2ss(xmm9, xmm7, r13d));
+ TEST_INSTRUCTION("625146787BCD" , rz_sae().vcvtusi2ss(xmm9, xmm7, r13d));
+ TEST_INSTRUCTION("627146087B09" , vcvtusi2ss(xmm9, xmm7, dword_ptr(rcx)));
+ TEST_INSTRUCTION("623146087B8CF034120000" , vcvtusi2ss(xmm9, xmm7, dword_ptr(rax, r14, 3, 4660)));
+ TEST_INSTRUCTION("627146087B4A7F" , vcvtusi2ss(xmm9, xmm7, dword_ptr(rdx, 508)));
+ TEST_INSTRUCTION("627146087B8A00020000" , vcvtusi2ss(xmm9, xmm7, dword_ptr(rdx, 512)));
+ TEST_INSTRUCTION("627146087B4A80" , vcvtusi2ss(xmm9, xmm7, dword_ptr(rdx, -512)));
+ TEST_INSTRUCTION("627146087B8AFCFDFFFF" , vcvtusi2ss(xmm9, xmm7, dword_ptr(rdx, -516)));
+ TEST_INSTRUCTION("62E1AE087BE8" , vcvtusi2ss(xmm21, xmm10, rax));
+ TEST_INSTRUCTION("62E1AE187BE8" , rn_sae().vcvtusi2ss(xmm21, xmm10, rax));
+ TEST_INSTRUCTION("62E1AE587BE8" , ru_sae().vcvtusi2ss(xmm21, xmm10, rax));
+ TEST_INSTRUCTION("62E1AE387BE8" , rd_sae().vcvtusi2ss(xmm21, xmm10, rax));
+ TEST_INSTRUCTION("62E1AE787BE8" , rz_sae().vcvtusi2ss(xmm21, xmm10, rax));
+ TEST_INSTRUCTION("62C1AE087BE8" , vcvtusi2ss(xmm21, xmm10, r8));
+ TEST_INSTRUCTION("62C1AE187BE8" , rn_sae().vcvtusi2ss(xmm21, xmm10, r8));
+ TEST_INSTRUCTION("62C1AE587BE8" , ru_sae().vcvtusi2ss(xmm21, xmm10, r8));
+ TEST_INSTRUCTION("62C1AE387BE8" , rd_sae().vcvtusi2ss(xmm21, xmm10, r8));
+ TEST_INSTRUCTION("62C1AE787BE8" , rz_sae().vcvtusi2ss(xmm21, xmm10, r8));
+ TEST_INSTRUCTION("62E1AE087B29" , vcvtusi2ss(xmm21, xmm10, qword_ptr(rcx)));
+ TEST_INSTRUCTION("62A1AE087BACF034120000" , vcvtusi2ss(xmm21, xmm10, qword_ptr(rax, r14, 3, 4660)));
+ TEST_INSTRUCTION("62E1AE087B6A7F" , vcvtusi2ss(xmm21, xmm10, qword_ptr(rdx, 1016)));
+ TEST_INSTRUCTION("62E1AE087BAA00040000" , vcvtusi2ss(xmm21, xmm10, qword_ptr(rdx, 1024)));
+ TEST_INSTRUCTION("62E1AE087B6A80" , vcvtusi2ss(xmm21, xmm10, qword_ptr(rdx, -1024)));
+ TEST_INSTRUCTION("62E1AE087BAAF8FBFFFF" , vcvtusi2ss(xmm21, xmm10, qword_ptr(rdx, -1032)));
+ TEST_INSTRUCTION("62B2DD482CF8" , vscalefpd(zmm7, zmm4, zmm16));
+ TEST_INSTRUCTION("62B2DD4D2CF8" , k(k5).vscalefpd(zmm7, zmm4, zmm16));
+ TEST_INSTRUCTION("62B2DDCD2CF8" , k(k5).z().vscalefpd(zmm7, zmm4, zmm16));
+ TEST_INSTRUCTION("62B2DD182CF8" , rn_sae().vscalefpd(zmm7, zmm4, zmm16));
+ TEST_INSTRUCTION("62B2DD582CF8" , ru_sae().vscalefpd(zmm7, zmm4, zmm16));
+ TEST_INSTRUCTION("62B2DD382CF8" , rd_sae().vscalefpd(zmm7, zmm4, zmm16));
+ TEST_INSTRUCTION("62B2DD782CF8" , rz_sae().vscalefpd(zmm7, zmm4, zmm16));
+ TEST_INSTRUCTION("62F2DD482C39" , vscalefpd(zmm7, zmm4, zmmword_ptr(rcx)));
+ TEST_INSTRUCTION("62B2DD482CBCF034120000" , vscalefpd(zmm7, zmm4, zmmword_ptr(rax, r14, 3, 4660)));
+ TEST_INSTRUCTION("62F2DD582C39" , vscalefpd(zmm7, zmm4, qword_ptr(rcx)._1to8()));
+ TEST_INSTRUCTION("62F2DD482C7A7F" , vscalefpd(zmm7, zmm4, zmmword_ptr(rdx, 8128)));
+ TEST_INSTRUCTION("62F2DD482CBA00200000" , vscalefpd(zmm7, zmm4, zmmword_ptr(rdx, 8192)));
+ TEST_INSTRUCTION("62F2DD482C7A80" , vscalefpd(zmm7, zmm4, zmmword_ptr(rdx, -8192)));
+ TEST_INSTRUCTION("62F2DD482CBAC0DFFFFF" , vscalefpd(zmm7, zmm4, zmmword_ptr(rdx, -8256)));
+ TEST_INSTRUCTION("62F2DD582C7A7F" , vscalefpd(zmm7, zmm4, qword_ptr(rdx, 1016)._1to8()));
+ TEST_INSTRUCTION("62F2DD582CBA00040000" , vscalefpd(zmm7, zmm4, qword_ptr(rdx, 1024)._1to8()));
+ TEST_INSTRUCTION("62F2DD582C7A80" , vscalefpd(zmm7, zmm4, qword_ptr(rdx, -1024)._1to8()));
+ TEST_INSTRUCTION("62F2DD582CBAF8FBFFFF" , vscalefpd(zmm7, zmm4, qword_ptr(rdx, -1032)._1to8()));
+ TEST_INSTRUCTION("62B225482CE3" , vscalefps(zmm4, zmm11, zmm19));
+ TEST_INSTRUCTION("62B2254A2CE3" , k(k2).vscalefps(zmm4, zmm11, zmm19));
+ TEST_INSTRUCTION("62B225CA2CE3" , k(k2).z().vscalefps(zmm4, zmm11, zmm19));
+ TEST_INSTRUCTION("62B225182CE3" , rn_sae().vscalefps(zmm4, zmm11, zmm19));
+ TEST_INSTRUCTION("62B225582CE3" , ru_sae().vscalefps(zmm4, zmm11, zmm19));
+ TEST_INSTRUCTION("62B225382CE3" , rd_sae().vscalefps(zmm4, zmm11, zmm19));
+ TEST_INSTRUCTION("62B225782CE3" , rz_sae().vscalefps(zmm4, zmm11, zmm19));
+ TEST_INSTRUCTION("62F225482C21" , vscalefps(zmm4, zmm11, zmmword_ptr(rcx)));
+ TEST_INSTRUCTION("62B225482CA4F034120000" , vscalefps(zmm4, zmm11, zmmword_ptr(rax, r14, 3, 4660)));
+ TEST_INSTRUCTION("62F225582C21" , vscalefps(zmm4, zmm11, dword_ptr(rcx)._1to16()));
+ TEST_INSTRUCTION("62F225482C627F" , vscalefps(zmm4, zmm11, zmmword_ptr(rdx, 8128)));
+ TEST_INSTRUCTION("62F225482CA200200000" , vscalefps(zmm4, zmm11, zmmword_ptr(rdx, 8192)));
+ TEST_INSTRUCTION("62F225482C6280" , vscalefps(zmm4, zmm11, zmmword_ptr(rdx, -8192)));
+ TEST_INSTRUCTION("62F225482CA2C0DFFFFF" , vscalefps(zmm4, zmm11, zmmword_ptr(rdx, -8256)));
+ TEST_INSTRUCTION("62F225582C627F" , vscalefps(zmm4, zmm11, dword_ptr(rdx, 508)._1to16()));
+ TEST_INSTRUCTION("62F225582CA200020000" , vscalefps(zmm4, zmm11, dword_ptr(rdx, 512)._1to16()));
+ TEST_INSTRUCTION("62F225582C6280" , vscalefps(zmm4, zmm11, dword_ptr(rdx, -512)._1to16()));
+ TEST_INSTRUCTION("62F225582CA2FCFDFFFF" , vscalefps(zmm4, zmm11, dword_ptr(rdx, -516)._1to16()));
+ TEST_INSTRUCTION("6222E5002DEE" , vscalefsd(xmm29, xmm19, xmm22));
+ TEST_INSTRUCTION("6222E5042DEE" , k(k4).vscalefsd(xmm29, xmm19, xmm22));
+ TEST_INSTRUCTION("6222E5842DEE" , k(k4).z().vscalefsd(xmm29, xmm19, xmm22));
+ TEST_INSTRUCTION("6222E5102DEE" , rn_sae().vscalefsd(xmm29, xmm19, xmm22));
+ TEST_INSTRUCTION("6222E5502DEE" , ru_sae().vscalefsd(xmm29, xmm19, xmm22));
+ TEST_INSTRUCTION("6222E5302DEE" , rd_sae().vscalefsd(xmm29, xmm19, xmm22));
+ TEST_INSTRUCTION("6222E5702DEE" , rz_sae().vscalefsd(xmm29, xmm19, xmm22));
+ TEST_INSTRUCTION("6262E5002D29" , vscalefsd(xmm29, xmm19, qword_ptr(rcx)));
+ TEST_INSTRUCTION("6222E5002DACF034120000" , vscalefsd(xmm29, xmm19, qword_ptr(rax, r14, 3, 4660)));
+ TEST_INSTRUCTION("6262E5002D6A7F" , vscalefsd(xmm29, xmm19, qword_ptr(rdx, 1016)));
+ TEST_INSTRUCTION("6262E5002DAA00040000" , vscalefsd(xmm29, xmm19, qword_ptr(rdx, 1024)));
+ TEST_INSTRUCTION("6262E5002D6A80" , vscalefsd(xmm29, xmm19, qword_ptr(rdx, -1024)));
+ TEST_INSTRUCTION("6262E5002DAAF8FBFFFF" , vscalefsd(xmm29, xmm19, qword_ptr(rdx, -1032)));
+ TEST_INSTRUCTION("62E21D082DE6" , vscalefss(xmm20, xmm12, xmm6));
+ TEST_INSTRUCTION("62E21D0A2DE6" , k(k2).vscalefss(xmm20, xmm12, xmm6));
+ TEST_INSTRUCTION("62E21D8A2DE6" , k(k2).z().vscalefss(xmm20, xmm12, xmm6));
+ TEST_INSTRUCTION("62E21D182DE6" , rn_sae().vscalefss(xmm20, xmm12, xmm6));
+ TEST_INSTRUCTION("62E21D582DE6" , ru_sae().vscalefss(xmm20, xmm12, xmm6));
+ TEST_INSTRUCTION("62E21D382DE6" , rd_sae().vscalefss(xmm20, xmm12, xmm6));
+ TEST_INSTRUCTION("62E21D782DE6" , rz_sae().vscalefss(xmm20, xmm12, xmm6));
+ TEST_INSTRUCTION("62E21D082D21" , vscalefss(xmm20, xmm12, dword_ptr(rcx)));
+ TEST_INSTRUCTION("62A21D082DA4F034120000" , vscalefss(xmm20, xmm12, dword_ptr(rax, r14, 3, 4660)));
+ TEST_INSTRUCTION("62E21D082D627F" , vscalefss(xmm20, xmm12, dword_ptr(rdx, 508)));
+ TEST_INSTRUCTION("62E21D082DA200020000" , vscalefss(xmm20, xmm12, dword_ptr(rdx, 512)));
+ TEST_INSTRUCTION("62E21D082D6280" , vscalefss(xmm20, xmm12, dword_ptr(rdx, -512)));
+ TEST_INSTRUCTION("62E21D082DA2FCFDFFFF" , vscalefss(xmm20, xmm12, dword_ptr(rdx, -516)));
+ TEST_INSTRUCTION("62F33D4854E7AB" , vfixupimmps(zmm4, zmm8, zmm7, 171));
+ TEST_INSTRUCTION("62F33D4F54E7AB" , k(k7).vfixupimmps(zmm4, zmm8, zmm7, 171));
+ TEST_INSTRUCTION("62F33DCF54E7AB" , k(k7).z().vfixupimmps(zmm4, zmm8, zmm7, 171));
+ TEST_INSTRUCTION("62F33D1854E7AB" , sae().vfixupimmps(zmm4, zmm8, zmm7, 171));
+ TEST_INSTRUCTION("62F33D4854E77B" , vfixupimmps(zmm4, zmm8, zmm7, 123));
+ TEST_INSTRUCTION("62F33D1854E77B" , sae().vfixupimmps(zmm4, zmm8, zmm7, 123));
+ TEST_INSTRUCTION("62F33D4854217B" , vfixupimmps(zmm4, zmm8, zmmword_ptr(rcx), 123));
+ TEST_INSTRUCTION("62B33D4854A4F0341200007B" , vfixupimmps(zmm4, zmm8, zmmword_ptr(rax, r14, 3, 4660), 123));
+ TEST_INSTRUCTION("62F33D5854217B" , vfixupimmps(zmm4, zmm8, dword_ptr(rcx)._1to16(), 123));
+ TEST_INSTRUCTION("62F33D4854627F7B" , vfixupimmps(zmm4, zmm8, zmmword_ptr(rdx, 8128), 123));
+ TEST_INSTRUCTION("62F33D4854A2002000007B" , vfixupimmps(zmm4, zmm8, zmmword_ptr(rdx, 8192), 123));
+ TEST_INSTRUCTION("62F33D485462807B" , vfixupimmps(zmm4, zmm8, zmmword_ptr(rdx, -8192), 123));
+ TEST_INSTRUCTION("62F33D4854A2C0DFFFFF7B" , vfixupimmps(zmm4, zmm8, zmmword_ptr(rdx, -8256), 123));
+ TEST_INSTRUCTION("62F33D5854627F7B" , vfixupimmps(zmm4, zmm8, dword_ptr(rdx, 508)._1to16(), 123));
+ TEST_INSTRUCTION("62F33D5854A2000200007B" , vfixupimmps(zmm4, zmm8, dword_ptr(rdx, 512)._1to16(), 123));
+ TEST_INSTRUCTION("62F33D585462807B" , vfixupimmps(zmm4, zmm8, dword_ptr(rdx, -512)._1to16(), 123));
+ TEST_INSTRUCTION("62F33D5854A2FCFDFFFF7B" , vfixupimmps(zmm4, zmm8, dword_ptr(rdx, -516)._1to16(), 123));
+ TEST_INSTRUCTION("6273D54854FDAB" , vfixupimmpd(zmm15, zmm5, zmm5, 171));
+ TEST_INSTRUCTION("6273D54D54FDAB" , k(k5).vfixupimmpd(zmm15, zmm5, zmm5, 171));
+ TEST_INSTRUCTION("6273D5CD54FDAB" , k(k5).z().vfixupimmpd(zmm15, zmm5, zmm5, 171));
+ TEST_INSTRUCTION("6273D51854FDAB" , sae().vfixupimmpd(zmm15, zmm5, zmm5, 171));
+ TEST_INSTRUCTION("6273D54854FD7B" , vfixupimmpd(zmm15, zmm5, zmm5, 123));
+ TEST_INSTRUCTION("6273D51854FD7B" , sae().vfixupimmpd(zmm15, zmm5, zmm5, 123));
+ TEST_INSTRUCTION("6273D54854397B" , vfixupimmpd(zmm15, zmm5, zmmword_ptr(rcx), 123));
+ TEST_INSTRUCTION("6233D54854BCF0341200007B" , vfixupimmpd(zmm15, zmm5, zmmword_ptr(rax, r14, 3, 4660), 123));
+ TEST_INSTRUCTION("6273D55854397B" , vfixupimmpd(zmm15, zmm5, qword_ptr(rcx)._1to8(), 123));
+ TEST_INSTRUCTION("6273D548547A7F7B" , vfixupimmpd(zmm15, zmm5, zmmword_ptr(rdx, 8128), 123));
+ TEST_INSTRUCTION("6273D54854BA002000007B" , vfixupimmpd(zmm15, zmm5, zmmword_ptr(rdx, 8192), 123));
+ TEST_INSTRUCTION("6273D548547A807B" , vfixupimmpd(zmm15, zmm5, zmmword_ptr(rdx, -8192), 123));
+ TEST_INSTRUCTION("6273D54854BAC0DFFFFF7B" , vfixupimmpd(zmm15, zmm5, zmmword_ptr(rdx, -8256), 123));
+ TEST_INSTRUCTION("6273D558547A7F7B" , vfixupimmpd(zmm15, zmm5, qword_ptr(rdx, 1016)._1to8(), 123));
+ TEST_INSTRUCTION("6273D55854BA000400007B" , vfixupimmpd(zmm15, zmm5, qword_ptr(rdx, 1024)._1to8(), 123));
+ TEST_INSTRUCTION("6273D558547A807B" , vfixupimmpd(zmm15, zmm5, qword_ptr(rdx, -1024)._1to8(), 123));
+ TEST_INSTRUCTION("6273D55854BAF8FBFFFF7B" , vfixupimmpd(zmm15, zmm5, qword_ptr(rdx, -1032)._1to8(), 123));
+ TEST_INSTRUCTION("62633D0055CFAB" , vfixupimmss(xmm25, xmm24, xmm7, 171));
+ TEST_INSTRUCTION("62633D0455CFAB" , k(k4).vfixupimmss(xmm25, xmm24, xmm7, 171));
+ TEST_INSTRUCTION("62633D8455CFAB" , k(k4).z().vfixupimmss(xmm25, xmm24, xmm7, 171));
+ TEST_INSTRUCTION("62633D1055CFAB" , sae().vfixupimmss(xmm25, xmm24, xmm7, 171));
+ TEST_INSTRUCTION("62633D0055CF7B" , vfixupimmss(xmm25, xmm24, xmm7, 123));
+ TEST_INSTRUCTION("62633D1055CF7B" , sae().vfixupimmss(xmm25, xmm24, xmm7, 123));
+ TEST_INSTRUCTION("62633D0055097B" , vfixupimmss(xmm25, xmm24, dword_ptr(rcx), 123));
+ TEST_INSTRUCTION("62233D00558CF0341200007B" , vfixupimmss(xmm25, xmm24, dword_ptr(rax, r14, 3, 4660), 123));
+ TEST_INSTRUCTION("62633D00554A7F7B" , vfixupimmss(xmm25, xmm24, dword_ptr(rdx, 508), 123));
+ TEST_INSTRUCTION("62633D00558A000200007B" , vfixupimmss(xmm25, xmm24, dword_ptr(rdx, 512), 123));
+ TEST_INSTRUCTION("62633D00554A807B" , vfixupimmss(xmm25, xmm24, dword_ptr(rdx, -512), 123));
+ TEST_INSTRUCTION("62633D00558AFCFDFFFF7B" , vfixupimmss(xmm25, xmm24, dword_ptr(rdx, -516), 123));
+ TEST_INSTRUCTION("62239D0855C0AB" , vfixupimmsd(xmm24, xmm12, xmm16, 171));
+ TEST_INSTRUCTION("62239D0A55C0AB" , k(k2).vfixupimmsd(xmm24, xmm12, xmm16, 171));
+ TEST_INSTRUCTION("62239D8A55C0AB" , k(k2).z().vfixupimmsd(xmm24, xmm12, xmm16, 171));
+ TEST_INSTRUCTION("62239D1855C0AB" , sae().vfixupimmsd(xmm24, xmm12, xmm16, 171));
+ TEST_INSTRUCTION("62239D0855C07B" , vfixupimmsd(xmm24, xmm12, xmm16, 123));
+ TEST_INSTRUCTION("62239D1855C07B" , sae().vfixupimmsd(xmm24, xmm12, xmm16, 123));
+ TEST_INSTRUCTION("62639D0855017B" , vfixupimmsd(xmm24, xmm12, qword_ptr(rcx), 123));
+ TEST_INSTRUCTION("62239D085584F0341200007B" , vfixupimmsd(xmm24, xmm12, qword_ptr(rax, r14, 3, 4660), 123));
+ TEST_INSTRUCTION("62639D0855427F7B" , vfixupimmsd(xmm24, xmm12, qword_ptr(rdx, 1016), 123));
+ TEST_INSTRUCTION("62639D085582000400007B" , vfixupimmsd(xmm24, xmm12, qword_ptr(rdx, 1024), 123));
+ TEST_INSTRUCTION("62639D085542807B" , vfixupimmsd(xmm24, xmm12, qword_ptr(rdx, -1024), 123));
+ TEST_INSTRUCTION("62639D085582F8FBFFFF7B" , vfixupimmsd(xmm24, xmm12, qword_ptr(rdx, -1032), 123));
+ TEST_INSTRUCTION("62F1254072F5AB" , vpslld(zmm27, zmm5, 171));
+ TEST_INSTRUCTION("62F1254172F5AB" , k(k1).vpslld(zmm27, zmm5, 171));
+ TEST_INSTRUCTION("62F125C172F5AB" , k(k1).z().vpslld(zmm27, zmm5, 171));
+ TEST_INSTRUCTION("62F1254072F57B" , vpslld(zmm27, zmm5, 123));
+ TEST_INSTRUCTION("62F1254072317B" , vpslld(zmm27, zmmword_ptr(rcx), 123));
+ TEST_INSTRUCTION("62B1254072B4F0341200007B" , vpslld(zmm27, zmmword_ptr(rax, r14, 3, 4660), 123));
+ TEST_INSTRUCTION("62F1255072317B" , vpslld(zmm27, dword_ptr(rcx)._1to16(), 123));
+ TEST_INSTRUCTION("62F1254072727F7B" , vpslld(zmm27, zmmword_ptr(rdx, 8128), 123));
+ TEST_INSTRUCTION("62F1254072B2002000007B" , vpslld(zmm27, zmmword_ptr(rdx, 8192), 123));
+ TEST_INSTRUCTION("62F125407272807B" , vpslld(zmm27, zmmword_ptr(rdx, -8192), 123));
+ TEST_INSTRUCTION("62F1254072B2C0DFFFFF7B" , vpslld(zmm27, zmmword_ptr(rdx, -8256), 123));
+ TEST_INSTRUCTION("62F1255072727F7B" , vpslld(zmm27, dword_ptr(rdx, 508)._1to16(), 123));
+ TEST_INSTRUCTION("62F1255072B2000200007B" , vpslld(zmm27, dword_ptr(rdx, 512)._1to16(), 123));
+ TEST_INSTRUCTION("62F125507272807B" , vpslld(zmm27, dword_ptr(rdx, -512)._1to16(), 123));
+ TEST_INSTRUCTION("62F1255072B2FCFDFFFF7B" , vpslld(zmm27, dword_ptr(rdx, -516)._1to16(), 123));
+ TEST_INSTRUCTION("62F1DD4873F6AB" , vpsllq(zmm4, zmm6, 171));
+ TEST_INSTRUCTION("62F1DD4C73F6AB" , k(k4).vpsllq(zmm4, zmm6, 171));
+ TEST_INSTRUCTION("62F1DDCC73F6AB" , k(k4).z().vpsllq(zmm4, zmm6, 171));
+ TEST_INSTRUCTION("62F1DD4873F67B" , vpsllq(zmm4, zmm6, 123));
+ TEST_INSTRUCTION("62F1DD4873317B" , vpsllq(zmm4, zmmword_ptr(rcx), 123));
+ TEST_INSTRUCTION("62B1DD4873B4F0341200007B" , vpsllq(zmm4, zmmword_ptr(rax, r14, 3, 4660), 123));
+ TEST_INSTRUCTION("62F1DD5873317B" , vpsllq(zmm4, qword_ptr(rcx)._1to8(), 123));
+ TEST_INSTRUCTION("62F1DD4873727F7B" , vpsllq(zmm4, zmmword_ptr(rdx, 8128), 123));
+ TEST_INSTRUCTION("62F1DD4873B2002000007B" , vpsllq(zmm4, zmmword_ptr(rdx, 8192), 123));
+ TEST_INSTRUCTION("62F1DD487372807B" , vpsllq(zmm4, zmmword_ptr(rdx, -8192), 123));
+ TEST_INSTRUCTION("62F1DD4873B2C0DFFFFF7B" , vpsllq(zmm4, zmmword_ptr(rdx, -8256), 123));
+ TEST_INSTRUCTION("62F1DD5873727F7B" , vpsllq(zmm4, qword_ptr(rdx, 1016)._1to8(), 123));
+ TEST_INSTRUCTION("62F1DD5873B2000400007B" , vpsllq(zmm4, qword_ptr(rdx, 1024)._1to8(), 123));
+ TEST_INSTRUCTION("62F1DD587372807B" , vpsllq(zmm4, qword_ptr(rdx, -1024)._1to8(), 123));
+ TEST_INSTRUCTION("62F1DD5873B2F8FBFFFF7B" , vpsllq(zmm4, qword_ptr(rdx, -1032)._1to8(), 123));
+ TEST_INSTRUCTION("62B13D4872E4AB" , vpsrad(zmm8, zmm20, 171));
+ TEST_INSTRUCTION("62B13D4A72E4AB" , k(k2).vpsrad(zmm8, zmm20, 171));
+ TEST_INSTRUCTION("62B13DCA72E4AB" , k(k2).z().vpsrad(zmm8, zmm20, 171));
+ TEST_INSTRUCTION("62B13D4872E47B" , vpsrad(zmm8, zmm20, 123));
+ TEST_INSTRUCTION("62F13D4872217B" , vpsrad(zmm8, zmmword_ptr(rcx), 123));
+ TEST_INSTRUCTION("62B13D4872A4F0341200007B" , vpsrad(zmm8, zmmword_ptr(rax, r14, 3, 4660), 123));
+ TEST_INSTRUCTION("62F13D5872217B" , vpsrad(zmm8, dword_ptr(rcx)._1to16(), 123));
+ TEST_INSTRUCTION("62F13D4872627F7B" , vpsrad(zmm8, zmmword_ptr(rdx, 8128), 123));
+ TEST_INSTRUCTION("62F13D4872A2002000007B" , vpsrad(zmm8, zmmword_ptr(rdx, 8192), 123));
+ TEST_INSTRUCTION("62F13D487262807B" , vpsrad(zmm8, zmmword_ptr(rdx, -8192), 123));
+ TEST_INSTRUCTION("62F13D4872A2C0DFFFFF7B" , vpsrad(zmm8, zmmword_ptr(rdx, -8256), 123));
+ TEST_INSTRUCTION("62F13D5872627F7B" , vpsrad(zmm8, dword_ptr(rdx, 508)._1to16(), 123));
+ TEST_INSTRUCTION("62F13D5872A2000200007B" , vpsrad(zmm8, dword_ptr(rdx, 512)._1to16(), 123));
+ TEST_INSTRUCTION("62F13D587262807B" , vpsrad(zmm8, dword_ptr(rdx, -512)._1to16(), 123));
+ TEST_INSTRUCTION("62F13D5872A2FCFDFFFF7B" , vpsrad(zmm8, dword_ptr(rdx, -516)._1to16(), 123));
+ TEST_INSTRUCTION("62B1E54872E2AB" , vpsraq(zmm3, zmm18, 171));
+ TEST_INSTRUCTION("62B1E54E72E2AB" , k(k6).vpsraq(zmm3, zmm18, 171));
+ TEST_INSTRUCTION("62B1E5CE72E2AB" , k(k6).z().vpsraq(zmm3, zmm18, 171));
+ TEST_INSTRUCTION("62B1E54872E27B" , vpsraq(zmm3, zmm18, 123));
+ TEST_INSTRUCTION("62F1E54872217B" , vpsraq(zmm3, zmmword_ptr(rcx), 123));
+ TEST_INSTRUCTION("62B1E54872A4F0341200007B" , vpsraq(zmm3, zmmword_ptr(rax, r14, 3, 4660), 123));
+ TEST_INSTRUCTION("62F1E55872217B" , vpsraq(zmm3, qword_ptr(rcx)._1to8(), 123));
+ TEST_INSTRUCTION("62F1E54872627F7B" , vpsraq(zmm3, zmmword_ptr(rdx, 8128), 123));
+ TEST_INSTRUCTION("62F1E54872A2002000007B" , vpsraq(zmm3, zmmword_ptr(rdx, 8192), 123));
+ TEST_INSTRUCTION("62F1E5487262807B" , vpsraq(zmm3, zmmword_ptr(rdx, -8192), 123));
+ TEST_INSTRUCTION("62F1E54872A2C0DFFFFF7B" , vpsraq(zmm3, zmmword_ptr(rdx, -8256), 123));
+ TEST_INSTRUCTION("62F1E55872627F7B" , vpsraq(zmm3, qword_ptr(rdx, 1016)._1to8(), 123));
+ TEST_INSTRUCTION("62F1E55872A2000400007B" , vpsraq(zmm3, qword_ptr(rdx, 1024)._1to8(), 123));
+ TEST_INSTRUCTION("62F1E5587262807B" , vpsraq(zmm3, qword_ptr(rdx, -1024)._1to8(), 123));
+ TEST_INSTRUCTION("62F1E55872A2F8FBFFFF7B" , vpsraq(zmm3, qword_ptr(rdx, -1032)._1to8(), 123));
+ TEST_INSTRUCTION("6242754815E2" , vprolvd(zmm28, zmm1, zmm10));
+ TEST_INSTRUCTION("6242754E15E2" , k(k6).vprolvd(zmm28, zmm1, zmm10));
+ TEST_INSTRUCTION("624275CE15E2" , k(k6).z().vprolvd(zmm28, zmm1, zmm10));
+ TEST_INSTRUCTION("626275481521" , vprolvd(zmm28, zmm1, zmmword_ptr(rcx)));
+ TEST_INSTRUCTION("6222754815A4F034120000" , vprolvd(zmm28, zmm1, zmmword_ptr(rax, r14, 3, 4660)));
+ TEST_INSTRUCTION("626275581521" , vprolvd(zmm28, zmm1, dword_ptr(rcx)._1to16()));
+ TEST_INSTRUCTION("6262754815627F" , vprolvd(zmm28, zmm1, zmmword_ptr(rdx, 8128)));
+ TEST_INSTRUCTION("6262754815A200200000" , vprolvd(zmm28, zmm1, zmmword_ptr(rdx, 8192)));
+ TEST_INSTRUCTION("62627548156280" , vprolvd(zmm28, zmm1, zmmword_ptr(rdx, -8192)));
+ TEST_INSTRUCTION("6262754815A2C0DFFFFF" , vprolvd(zmm28, zmm1, zmmword_ptr(rdx, -8256)));
+ TEST_INSTRUCTION("6262755815627F" , vprolvd(zmm28, zmm1, dword_ptr(rdx, 508)._1to16()));
+ TEST_INSTRUCTION("6262755815A200020000" , vprolvd(zmm28, zmm1, dword_ptr(rdx, 512)._1to16()));
+ TEST_INSTRUCTION("62627558156280" , vprolvd(zmm28, zmm1, dword_ptr(rdx, -512)._1to16()));
+ TEST_INSTRUCTION("6262755815A2FCFDFFFF" , vprolvd(zmm28, zmm1, dword_ptr(rdx, -516)._1to16()));
+ TEST_INSTRUCTION("6291654072CBAB" , vprold(zmm19, zmm27, 171));
+ TEST_INSTRUCTION("6291654472CBAB" , k(k4).vprold(zmm19, zmm27, 171));
+ TEST_INSTRUCTION("629165C472CBAB" , k(k4).z().vprold(zmm19, zmm27, 171));
+ TEST_INSTRUCTION("6291654072CB7B" , vprold(zmm19, zmm27, 123));
+ TEST_INSTRUCTION("62F1654072097B" , vprold(zmm19, zmmword_ptr(rcx), 123));
+ TEST_INSTRUCTION("62B16540728CF0341200007B" , vprold(zmm19, zmmword_ptr(rax, r14, 3, 4660), 123));
+ TEST_INSTRUCTION("62F1655072097B" , vprold(zmm19, dword_ptr(rcx)._1to16(), 123));
+ TEST_INSTRUCTION("62F16540724A7F7B" , vprold(zmm19, zmmword_ptr(rdx, 8128), 123));
+ TEST_INSTRUCTION("62F16540728A002000007B" , vprold(zmm19, zmmword_ptr(rdx, 8192), 123));
+ TEST_INSTRUCTION("62F16540724A807B" , vprold(zmm19, zmmword_ptr(rdx, -8192), 123));
+ TEST_INSTRUCTION("62F16540728AC0DFFFFF7B" , vprold(zmm19, zmmword_ptr(rdx, -8256), 123));
+ TEST_INSTRUCTION("62F16550724A7F7B" , vprold(zmm19, dword_ptr(rdx, 508)._1to16(), 123));
+ TEST_INSTRUCTION("62F16550728A000200007B" , vprold(zmm19, dword_ptr(rdx, 512)._1to16(), 123));
+ TEST_INSTRUCTION("62F16550724A807B" , vprold(zmm19, dword_ptr(rdx, -512)._1to16(), 123));
+ TEST_INSTRUCTION("62F16550728AFCFDFFFF7B" , vprold(zmm19, dword_ptr(rdx, -516)._1to16(), 123));
+ TEST_INSTRUCTION("6222F54815CE" , vprolvq(zmm25, zmm1, zmm22));
+ TEST_INSTRUCTION("6222F54F15CE" , k(k7).vprolvq(zmm25, zmm1, zmm22));
+ TEST_INSTRUCTION("6222F5CF15CE" , k(k7).z().vprolvq(zmm25, zmm1, zmm22));
+ TEST_INSTRUCTION("6262F5481509" , vprolvq(zmm25, zmm1, zmmword_ptr(rcx)));
+ TEST_INSTRUCTION("6222F548158CF034120000" , vprolvq(zmm25, zmm1, zmmword_ptr(rax, r14, 3, 4660)));
+ TEST_INSTRUCTION("6262F5581509" , vprolvq(zmm25, zmm1, qword_ptr(rcx)._1to8()));
+ TEST_INSTRUCTION("6262F548154A7F" , vprolvq(zmm25, zmm1, zmmword_ptr(rdx, 8128)));
+ TEST_INSTRUCTION("6262F548158A00200000" , vprolvq(zmm25, zmm1, zmmword_ptr(rdx, 8192)));
+ TEST_INSTRUCTION("6262F548154A80" , vprolvq(zmm25, zmm1, zmmword_ptr(rdx, -8192)));
+ TEST_INSTRUCTION("6262F548158AC0DFFFFF" , vprolvq(zmm25, zmm1, zmmword_ptr(rdx, -8256)));
+ TEST_INSTRUCTION("6262F558154A7F" , vprolvq(zmm25, zmm1, qword_ptr(rdx, 1016)._1to8()));
+ TEST_INSTRUCTION("6262F558158A00040000" , vprolvq(zmm25, zmm1, qword_ptr(rdx, 1024)._1to8()));
+ TEST_INSTRUCTION("6262F558154A80" , vprolvq(zmm25, zmm1, qword_ptr(rdx, -1024)._1to8()));
+ TEST_INSTRUCTION("6262F558158AF8FBFFFF" , vprolvq(zmm25, zmm1, qword_ptr(rdx, -1032)._1to8()));
+ TEST_INSTRUCTION("62D1F54072CAAB" , vprolq(zmm17, zmm10, 171));
+ TEST_INSTRUCTION("62D1F54472CAAB" , k(k4).vprolq(zmm17, zmm10, 171));
+ TEST_INSTRUCTION("62D1F5C472CAAB" , k(k4).z().vprolq(zmm17, zmm10, 171));
+ TEST_INSTRUCTION("62D1F54072CA7B" , vprolq(zmm17, zmm10, 123));
+ TEST_INSTRUCTION("62F1F54072097B" , vprolq(zmm17, zmmword_ptr(rcx), 123));
+ TEST_INSTRUCTION("62B1F540728CF0341200007B" , vprolq(zmm17, zmmword_ptr(rax, r14, 3, 4660), 123));
+ TEST_INSTRUCTION("62F1F55072097B" , vprolq(zmm17, qword_ptr(rcx)._1to8(), 123));
+ TEST_INSTRUCTION("62F1F540724A7F7B" , vprolq(zmm17, zmmword_ptr(rdx, 8128), 123));
+ TEST_INSTRUCTION("62F1F540728A002000007B" , vprolq(zmm17, zmmword_ptr(rdx, 8192), 123));
+ TEST_INSTRUCTION("62F1F540724A807B" , vprolq(zmm17, zmmword_ptr(rdx, -8192), 123));
+ TEST_INSTRUCTION("62F1F540728AC0DFFFFF7B" , vprolq(zmm17, zmmword_ptr(rdx, -8256), 123));
+ TEST_INSTRUCTION("62F1F550724A7F7B" , vprolq(zmm17, qword_ptr(rdx, 1016)._1to8(), 123));
+ TEST_INSTRUCTION("62F1F550728A000400007B" , vprolq(zmm17, qword_ptr(rdx, 1024)._1to8(), 123));
+ TEST_INSTRUCTION("62F1F550724A807B" , vprolq(zmm17, qword_ptr(rdx, -1024)._1to8(), 123));
+ TEST_INSTRUCTION("62F1F550728AF8FBFFFF7B" , vprolq(zmm17, qword_ptr(rdx, -1032)._1to8(), 123));
+ TEST_INSTRUCTION("62D23D4814CD" , vprorvd(zmm1, zmm8, zmm13));
+ TEST_INSTRUCTION("62D23D4A14CD" , k(k2).vprorvd(zmm1, zmm8, zmm13));
+ TEST_INSTRUCTION("62D23DCA14CD" , k(k2).z().vprorvd(zmm1, zmm8, zmm13));
+ TEST_INSTRUCTION("62F23D481409" , vprorvd(zmm1, zmm8, zmmword_ptr(rcx)));
+ TEST_INSTRUCTION("62B23D48148CF034120000" , vprorvd(zmm1, zmm8, zmmword_ptr(rax, r14, 3, 4660)));
+ TEST_INSTRUCTION("62F23D581409" , vprorvd(zmm1, zmm8, dword_ptr(rcx)._1to16()));
+ TEST_INSTRUCTION("62F23D48144A7F" , vprorvd(zmm1, zmm8, zmmword_ptr(rdx, 8128)));
+ TEST_INSTRUCTION("62F23D48148A00200000" , vprorvd(zmm1, zmm8, zmmword_ptr(rdx, 8192)));
+ TEST_INSTRUCTION("62F23D48144A80" , vprorvd(zmm1, zmm8, zmmword_ptr(rdx, -8192)));
+ TEST_INSTRUCTION("62F23D48148AC0DFFFFF" , vprorvd(zmm1, zmm8, zmmword_ptr(rdx, -8256)));
+ TEST_INSTRUCTION("62F23D58144A7F" , vprorvd(zmm1, zmm8, dword_ptr(rdx, 508)._1to16()));
+ TEST_INSTRUCTION("62F23D58148A00020000" , vprorvd(zmm1, zmm8, dword_ptr(rdx, 512)._1to16()));
+ TEST_INSTRUCTION("62F23D58144A80" , vprorvd(zmm1, zmm8, dword_ptr(rdx, -512)._1to16()));
+ TEST_INSTRUCTION("62F23D58148AFCFDFFFF" , vprorvd(zmm1, zmm8, dword_ptr(rdx, -516)._1to16()));
+ TEST_INSTRUCTION("62D1454872C7AB" , vprord(zmm7, zmm15, 171));
+ TEST_INSTRUCTION("62D1454972C7AB" , k(k1).vprord(zmm7, zmm15, 171));
+ TEST_INSTRUCTION("62D145C972C7AB" , k(k1).z().vprord(zmm7, zmm15, 171));
+ TEST_INSTRUCTION("62D1454872C77B" , vprord(zmm7, zmm15, 123));
+ TEST_INSTRUCTION("62F1454872017B" , vprord(zmm7, zmmword_ptr(rcx), 123));
+ TEST_INSTRUCTION("62B145487284F0341200007B" , vprord(zmm7, zmmword_ptr(rax, r14, 3, 4660), 123));
+ TEST_INSTRUCTION("62F1455872017B" , vprord(zmm7, dword_ptr(rcx)._1to16(), 123));
+ TEST_INSTRUCTION("62F1454872427F7B" , vprord(zmm7, zmmword_ptr(rdx, 8128), 123));
+ TEST_INSTRUCTION("62F145487282002000007B" , vprord(zmm7, zmmword_ptr(rdx, 8192), 123));
+ TEST_INSTRUCTION("62F145487242807B" , vprord(zmm7, zmmword_ptr(rdx, -8192), 123));
+ TEST_INSTRUCTION("62F145487282C0DFFFFF7B" , vprord(zmm7, zmmword_ptr(rdx, -8256), 123));
+ TEST_INSTRUCTION("62F1455872427F7B" , vprord(zmm7, dword_ptr(rdx, 508)._1to16(), 123));
+ TEST_INSTRUCTION("62F145587282000200007B" , vprord(zmm7, dword_ptr(rdx, 512)._1to16(), 123));
+ TEST_INSTRUCTION("62F145587242807B" , vprord(zmm7, dword_ptr(rdx, -512)._1to16(), 123));
+ TEST_INSTRUCTION("62F145587282FCFDFFFF7B" , vprord(zmm7, dword_ptr(rdx, -516)._1to16(), 123));
+ TEST_INSTRUCTION("6282C54014E8" , vprorvq(zmm21, zmm23, zmm24));
+ TEST_INSTRUCTION("6282C54714E8" , k(k7).vprorvq(zmm21, zmm23, zmm24));
+ TEST_INSTRUCTION("6282C5C714E8" , k(k7).z().vprorvq(zmm21, zmm23, zmm24));
+ TEST_INSTRUCTION("62E2C5401429" , vprorvq(zmm21, zmm23, zmmword_ptr(rcx)));
+ TEST_INSTRUCTION("62A2C54014ACF034120000" , vprorvq(zmm21, zmm23, zmmword_ptr(rax, r14, 3, 4660)));
+ TEST_INSTRUCTION("62E2C5501429" , vprorvq(zmm21, zmm23, qword_ptr(rcx)._1to8()));
+ TEST_INSTRUCTION("62E2C540146A7F" , vprorvq(zmm21, zmm23, zmmword_ptr(rdx, 8128)));
+ TEST_INSTRUCTION("62E2C54014AA00200000" , vprorvq(zmm21, zmm23, zmmword_ptr(rdx, 8192)));
+ TEST_INSTRUCTION("62E2C540146A80" , vprorvq(zmm21, zmm23, zmmword_ptr(rdx, -8192)));
+ TEST_INSTRUCTION("62E2C54014AAC0DFFFFF" , vprorvq(zmm21, zmm23, zmmword_ptr(rdx, -8256)));
+ TEST_INSTRUCTION("62E2C550146A7F" , vprorvq(zmm21, zmm23, qword_ptr(rdx, 1016)._1to8()));
+ TEST_INSTRUCTION("62E2C55014AA00040000" , vprorvq(zmm21, zmm23, qword_ptr(rdx, 1024)._1to8()));
+ TEST_INSTRUCTION("62E2C550146A80" , vprorvq(zmm21, zmm23, qword_ptr(rdx, -1024)._1to8()));
+ TEST_INSTRUCTION("62E2C55014AAF8FBFFFF" , vprorvq(zmm21, zmm23, qword_ptr(rdx, -1032)._1to8()));
+ TEST_INSTRUCTION("6291FD4072C3AB" , vprorq(zmm16, zmm27, 171));
+ TEST_INSTRUCTION("6291FD4372C3AB" , k(k3).vprorq(zmm16, zmm27, 171));
+ TEST_INSTRUCTION("6291FDC372C3AB" , k(k3).z().vprorq(zmm16, zmm27, 171));
+ TEST_INSTRUCTION("6291FD4072C37B" , vprorq(zmm16, zmm27, 123));
+ TEST_INSTRUCTION("62F1FD4072017B" , vprorq(zmm16, zmmword_ptr(rcx), 123));
+ TEST_INSTRUCTION("62B1FD407284F0341200007B" , vprorq(zmm16, zmmword_ptr(rax, r14, 3, 4660), 123));
+ TEST_INSTRUCTION("62F1FD5072017B" , vprorq(zmm16, qword_ptr(rcx)._1to8(), 123));
+ TEST_INSTRUCTION("62F1FD4072427F7B" , vprorq(zmm16, zmmword_ptr(rdx, 8128), 123));
+ TEST_INSTRUCTION("62F1FD407282002000007B" , vprorq(zmm16, zmmword_ptr(rdx, 8192), 123));
+ TEST_INSTRUCTION("62F1FD407242807B" , vprorq(zmm16, zmmword_ptr(rdx, -8192), 123));
+ TEST_INSTRUCTION("62F1FD407282C0DFFFFF7B" , vprorq(zmm16, zmmword_ptr(rdx, -8256), 123));
+ TEST_INSTRUCTION("62F1FD5072427F7B" , vprorq(zmm16, qword_ptr(rdx, 1016)._1to8(), 123));
+ TEST_INSTRUCTION("62F1FD507282000400007B" , vprorq(zmm16, qword_ptr(rdx, 1024)._1to8(), 123));
+ TEST_INSTRUCTION("62F1FD507242807B" , vprorq(zmm16, qword_ptr(rdx, -1024)._1to8(), 123));
+ TEST_INSTRUCTION("62F1FD507282F8FBFFFF7B" , vprorq(zmm16, qword_ptr(rdx, -1032)._1to8(), 123));
+ TEST_INSTRUCTION("6213FD4809EAAB" , vrndscalepd(zmm13, zmm26, 171));
+ TEST_INSTRUCTION("6213FD4A09EAAB" , k(k2).vrndscalepd(zmm13, zmm26, 171));
+ TEST_INSTRUCTION("6213FDCA09EAAB" , k(k2).z().vrndscalepd(zmm13, zmm26, 171));
+ TEST_INSTRUCTION("6213FD1809EAAB" , sae().vrndscalepd(zmm13, zmm26, 171));
+ TEST_INSTRUCTION("6213FD4809EA7B" , vrndscalepd(zmm13, zmm26, 123));
+ TEST_INSTRUCTION("6213FD1809EA7B" , sae().vrndscalepd(zmm13, zmm26, 123));
+ TEST_INSTRUCTION("6273FD4809297B" , vrndscalepd(zmm13, zmmword_ptr(rcx), 123));
+ TEST_INSTRUCTION("6233FD4809ACF0341200007B" , vrndscalepd(zmm13, zmmword_ptr(rax, r14, 3, 4660), 123));
+ TEST_INSTRUCTION("6273FD5809297B" , vrndscalepd(zmm13, qword_ptr(rcx)._1to8(), 123));
+ TEST_INSTRUCTION("6273FD48096A7F7B" , vrndscalepd(zmm13, zmmword_ptr(rdx, 8128), 123));
+ TEST_INSTRUCTION("6273FD4809AA002000007B" , vrndscalepd(zmm13, zmmword_ptr(rdx, 8192), 123));
+ TEST_INSTRUCTION("6273FD48096A807B" , vrndscalepd(zmm13, zmmword_ptr(rdx, -8192), 123));
+ TEST_INSTRUCTION("6273FD4809AAC0DFFFFF7B" , vrndscalepd(zmm13, zmmword_ptr(rdx, -8256), 123));
+ TEST_INSTRUCTION("6273FD58096A7F7B" , vrndscalepd(zmm13, qword_ptr(rdx, 1016)._1to8(), 123));
+ TEST_INSTRUCTION("6273FD5809AA000400007B" , vrndscalepd(zmm13, qword_ptr(rdx, 1024)._1to8(), 123));
+ TEST_INSTRUCTION("6273FD58096A807B" , vrndscalepd(zmm13, qword_ptr(rdx, -1024)._1to8(), 123));
+ TEST_INSTRUCTION("6273FD5809AAF8FBFFFF7B" , vrndscalepd(zmm13, qword_ptr(rdx, -1032)._1to8(), 123));
+ TEST_INSTRUCTION("62637D4808C7AB" , vrndscaleps(zmm24, zmm7, 171));
+ TEST_INSTRUCTION("62637D4908C7AB" , k(k1).vrndscaleps(zmm24, zmm7, 171));
+ TEST_INSTRUCTION("62637DC908C7AB" , k(k1).z().vrndscaleps(zmm24, zmm7, 171));
+ TEST_INSTRUCTION("62637D1808C7AB" , sae().vrndscaleps(zmm24, zmm7, 171));
+ TEST_INSTRUCTION("62637D4808C77B" , vrndscaleps(zmm24, zmm7, 123));
+ TEST_INSTRUCTION("62637D1808C77B" , sae().vrndscaleps(zmm24, zmm7, 123));
+ TEST_INSTRUCTION("62637D4808017B" , vrndscaleps(zmm24, zmmword_ptr(rcx), 123));
+ TEST_INSTRUCTION("62237D480884F0341200007B" , vrndscaleps(zmm24, zmmword_ptr(rax, r14, 3, 4660), 123));
+ TEST_INSTRUCTION("62637D5808017B" , vrndscaleps(zmm24, dword_ptr(rcx)._1to16(), 123));
+ TEST_INSTRUCTION("62637D4808427F7B" , vrndscaleps(zmm24, zmmword_ptr(rdx, 8128), 123));
+ TEST_INSTRUCTION("62637D480882002000007B" , vrndscaleps(zmm24, zmmword_ptr(rdx, 8192), 123));
+ TEST_INSTRUCTION("62637D480842807B" , vrndscaleps(zmm24, zmmword_ptr(rdx, -8192), 123));
+ TEST_INSTRUCTION("62637D480882C0DFFFFF7B" , vrndscaleps(zmm24, zmmword_ptr(rdx, -8256), 123));
+ TEST_INSTRUCTION("62637D5808427F7B" , vrndscaleps(zmm24, dword_ptr(rdx, 508)._1to16(), 123));
+ TEST_INSTRUCTION("62637D580882000200007B" , vrndscaleps(zmm24, dword_ptr(rdx, 512)._1to16(), 123));
+ TEST_INSTRUCTION("62637D580842807B" , vrndscaleps(zmm24, dword_ptr(rdx, -512)._1to16(), 123));
+ TEST_INSTRUCTION("62637D580882FCFDFFFF7B" , vrndscaleps(zmm24, dword_ptr(rdx, -516)._1to16(), 123));
+ TEST_INSTRUCTION("6223C5080BD2AB" , vrndscalesd(xmm26, xmm7, xmm18, 171));
+ TEST_INSTRUCTION("6223C5090BD2AB" , k(k1).vrndscalesd(xmm26, xmm7, xmm18, 171));
+ TEST_INSTRUCTION("6223C5890BD2AB" , k(k1).z().vrndscalesd(xmm26, xmm7, xmm18, 171));
+ TEST_INSTRUCTION("6223C5180BD2AB" , sae().vrndscalesd(xmm26, xmm7, xmm18, 171));
+ TEST_INSTRUCTION("6223C5080BD27B" , vrndscalesd(xmm26, xmm7, xmm18, 123));
+ TEST_INSTRUCTION("6223C5180BD27B" , sae().vrndscalesd(xmm26, xmm7, xmm18, 123));
+ TEST_INSTRUCTION("6263C5080B117B" , vrndscalesd(xmm26, xmm7, qword_ptr(rcx), 123));
+ TEST_INSTRUCTION("6223C5080B94F0341200007B" , vrndscalesd(xmm26, xmm7, qword_ptr(rax, r14, 3, 4660), 123));
+ TEST_INSTRUCTION("6263C5080B527F7B" , vrndscalesd(xmm26, xmm7, qword_ptr(rdx, 1016), 123));
+ TEST_INSTRUCTION("6263C5080B92000400007B" , vrndscalesd(xmm26, xmm7, qword_ptr(rdx, 1024), 123));
+ TEST_INSTRUCTION("6263C5080B52807B" , vrndscalesd(xmm26, xmm7, qword_ptr(rdx, -1024), 123));
+ TEST_INSTRUCTION("6263C5080B92F8FBFFFF7B" , vrndscalesd(xmm26, xmm7, qword_ptr(rdx, -1032), 123));
+ TEST_INSTRUCTION("62F345000AFEAB" , vrndscaless(xmm7, xmm23, xmm6, 171));
+ TEST_INSTRUCTION("62F345040AFEAB" , k(k4).vrndscaless(xmm7, xmm23, xmm6, 171));
+ TEST_INSTRUCTION("62F345840AFEAB" , k(k4).z().vrndscaless(xmm7, xmm23, xmm6, 171));
+ TEST_INSTRUCTION("62F345100AFEAB" , sae().vrndscaless(xmm7, xmm23, xmm6, 171));
+ TEST_INSTRUCTION("62F345000AFE7B" , vrndscaless(xmm7, xmm23, xmm6, 123));
+ TEST_INSTRUCTION("62F345100AFE7B" , sae().vrndscaless(xmm7, xmm23, xmm6, 123));
+ TEST_INSTRUCTION("62F345000A397B" , vrndscaless(xmm7, xmm23, dword_ptr(rcx), 123));
+ TEST_INSTRUCTION("62B345000ABCF0341200007B" , vrndscaless(xmm7, xmm23, dword_ptr(rax, r14, 3, 4660), 123));
+ TEST_INSTRUCTION("62F345000A7A7F7B" , vrndscaless(xmm7, xmm23, dword_ptr(rdx, 508), 123));
+ TEST_INSTRUCTION("62F345000ABA000200007B" , vrndscaless(xmm7, xmm23, dword_ptr(rdx, 512), 123));
+ TEST_INSTRUCTION("62F345000A7A807B" , vrndscaless(xmm7, xmm23, dword_ptr(rdx, -512), 123));
+ TEST_INSTRUCTION("62F345000ABAFCFDFFFF7B" , vrndscaless(xmm7, xmm23, dword_ptr(rdx, -516), 123));
+ TEST_INSTRUCTION("62E2FD488B19" , vpcompressq(zmmword_ptr(rcx), zmm19));
+ TEST_INSTRUCTION("62E2FD4B8B19" , k(k3).vpcompressq(zmmword_ptr(rcx), zmm19));
+ TEST_INSTRUCTION("62A2FD488B9CF034120000" , vpcompressq(zmmword_ptr(rax, r14, 3, 4660), zmm19));
+ TEST_INSTRUCTION("62E2FD488B5A7F" , vpcompressq(zmmword_ptr(rdx, 1016), zmm19));
+ TEST_INSTRUCTION("62E2FD488B9A00040000" , vpcompressq(zmmword_ptr(rdx, 1024), zmm19));
+ TEST_INSTRUCTION("62E2FD488B5A80" , vpcompressq(zmmword_ptr(rdx, -1024), zmm19));
+ TEST_INSTRUCTION("62E2FD488B9AF8FBFFFF" , vpcompressq(zmmword_ptr(rdx, -1032), zmm19));
+ TEST_INSTRUCTION("6252FD488BC4" , vpcompressq(zmm12, zmm8));
+ TEST_INSTRUCTION("6252FD4E8BC4" , k(k6).vpcompressq(zmm12, zmm8));
+ TEST_INSTRUCTION("6252FDCE8BC4" , k(k6).z().vpcompressq(zmm12, zmm8));
+ TEST_INSTRUCTION("C5DC41EE" , kandw(k5, k4, k6));
+ TEST_INSTRUCTION("C5DC42EE" , kandnw(k5, k4, k6));
+ TEST_INSTRUCTION("C5E445D5" , korw(k2, k3, k5));
+ TEST_INSTRUCTION("C5CC46D7" , kxnorw(k2, k6, k7));
+ TEST_INSTRUCTION("C5DC47DE" , kxorw(k3, k4, k6));
+ TEST_INSTRUCTION("C5F844E3" , knotw(k4, k3));
+ TEST_INSTRUCTION("C5F898DE" , kortestw(k3, k6));
+ TEST_INSTRUCTION("C4E3F930DDAB" , kshiftrw(k3, k5, 171));
+ TEST_INSTRUCTION("C4E3F930DD7B" , kshiftrw(k3, k5, 123));
+ TEST_INSTRUCTION("C4E3F932DBAB" , kshiftlw(k3, k3, 171));
+ TEST_INSTRUCTION("C4E3F932DB7B" , kshiftlw(k3, k3, 123));
+ TEST_INSTRUCTION("C5F890D5" , kmovw(k2, k5));
+ TEST_INSTRUCTION("C5F89011" , kmovw(k2, word_ptr(rcx)));
+ TEST_INSTRUCTION("C4A1789094F034120000" , kmovw(k2, word_ptr(rax, r14, 3, 4660)));
+ TEST_INSTRUCTION("C5F89129" , kmovw(word_ptr(rcx), k5));
+ TEST_INSTRUCTION("C4A17891ACF034120000" , kmovw(word_ptr(rax, r14, 3, 4660), k5));
+ TEST_INSTRUCTION("C5F892D8" , kmovw(k3, eax));
+ TEST_INSTRUCTION("C5F892DD" , kmovw(k3, ebp));
+ TEST_INSTRUCTION("C4C17892DD" , kmovw(k3, r13d));
+ TEST_INSTRUCTION("C5F893C3" , kmovw(eax, k3));
+ TEST_INSTRUCTION("C5F893EB" , kmovw(ebp, k3));
+ TEST_INSTRUCTION("C57893EB" , kmovw(r13d, k3));
+ TEST_INSTRUCTION("C5E54BD7" , kunpckbw(k2, k3, k7));
+ TEST_INSTRUCTION("62F37D481D31AB" , vcvtps2ph(ymmword_ptr(rcx), zmm6, 171));
+ TEST_INSTRUCTION("62F37D491D31AB" , k(k1).vcvtps2ph(ymmword_ptr(rcx), zmm6, 171));
+ TEST_INSTRUCTION("62F37D481D317B" , vcvtps2ph(ymmword_ptr(rcx), zmm6, 123));
+ TEST_INSTRUCTION("62B37D481DB4F0341200007B" , vcvtps2ph(ymmword_ptr(rax, r14, 3, 4660), zmm6, 123));
+ TEST_INSTRUCTION("62F37D481D727F7B" , vcvtps2ph(ymmword_ptr(rdx, 4064), zmm6, 123));
+ TEST_INSTRUCTION("62F37D481DB2001000007B" , vcvtps2ph(ymmword_ptr(rdx, 4096), zmm6, 123));
+ TEST_INSTRUCTION("62F37D481D72807B" , vcvtps2ph(ymmword_ptr(rdx, -4096), zmm6, 123));
+ TEST_INSTRUCTION("62F37D481DB2E0EFFFFF7B" , vcvtps2ph(ymmword_ptr(rdx, -4128), zmm6, 123));
+ TEST_INSTRUCTION("62E37D481931AB" , vextractf32x4(xmmword_ptr(rcx), zmm22, 171));
+ TEST_INSTRUCTION("62E37D4B1931AB" , k(k3).vextractf32x4(xmmword_ptr(rcx), zmm22, 171));
+ TEST_INSTRUCTION("62E37D4819317B" , vextractf32x4(xmmword_ptr(rcx), zmm22, 123));
+ TEST_INSTRUCTION("62A37D4819B4F0341200007B" , vextractf32x4(xmmword_ptr(rax, r14, 3, 4660), zmm22, 123));
+ TEST_INSTRUCTION("62E37D4819727F7B" , vextractf32x4(xmmword_ptr(rdx, 2032), zmm22, 123));
+ TEST_INSTRUCTION("62E37D4819B2000800007B" , vextractf32x4(xmmword_ptr(rdx, 2048), zmm22, 123));
+ TEST_INSTRUCTION("62E37D481972807B" , vextractf32x4(xmmword_ptr(rdx, -2048), zmm22, 123));
+ TEST_INSTRUCTION("62E37D4819B2F0F7FFFF7B" , vextractf32x4(xmmword_ptr(rdx, -2064), zmm22, 123));
+ TEST_INSTRUCTION("6273FD481B21AB" , vextractf64x4(ymmword_ptr(rcx), zmm12, 171));
+ TEST_INSTRUCTION("6273FD4F1B21AB" , k(k7).vextractf64x4(ymmword_ptr(rcx), zmm12, 171));
+ TEST_INSTRUCTION("6273FD481B217B" , vextractf64x4(ymmword_ptr(rcx), zmm12, 123));
+ TEST_INSTRUCTION("6233FD481BA4F0341200007B" , vextractf64x4(ymmword_ptr(rax, r14, 3, 4660), zmm12, 123));
+ TEST_INSTRUCTION("6273FD481B627F7B" , vextractf64x4(ymmword_ptr(rdx, 4064), zmm12, 123));
+ TEST_INSTRUCTION("6273FD481BA2001000007B" , vextractf64x4(ymmword_ptr(rdx, 4096), zmm12, 123));
+ TEST_INSTRUCTION("6273FD481B62807B" , vextractf64x4(ymmword_ptr(rdx, -4096), zmm12, 123));
+ TEST_INSTRUCTION("6273FD481BA2E0EFFFFF7B" , vextractf64x4(ymmword_ptr(rdx, -4128), zmm12, 123));
+ TEST_INSTRUCTION("62F37D483909AB" , vextracti32x4(xmmword_ptr(rcx), zmm1, 171));
+ TEST_INSTRUCTION("62F37D4B3909AB" , k(k3).vextracti32x4(xmmword_ptr(rcx), zmm1, 171));
+ TEST_INSTRUCTION("62F37D4839097B" , vextracti32x4(xmmword_ptr(rcx), zmm1, 123));
+ TEST_INSTRUCTION("62B37D48398CF0341200007B" , vextracti32x4(xmmword_ptr(rax, r14, 3, 4660), zmm1, 123));
+ TEST_INSTRUCTION("62F37D48394A7F7B" , vextracti32x4(xmmword_ptr(rdx, 2032), zmm1, 123));
+ TEST_INSTRUCTION("62F37D48398A000800007B" , vextracti32x4(xmmword_ptr(rdx, 2048), zmm1, 123));
+ TEST_INSTRUCTION("62F37D48394A807B" , vextracti32x4(xmmword_ptr(rdx, -2048), zmm1, 123));
+ TEST_INSTRUCTION("62F37D48398AF0F7FFFF7B" , vextracti32x4(xmmword_ptr(rdx, -2064), zmm1, 123));
+ TEST_INSTRUCTION("62F3FD483B11AB" , vextracti64x4(ymmword_ptr(rcx), zmm2, 171));
+ TEST_INSTRUCTION("62F3FD4A3B11AB" , k(k2).vextracti64x4(ymmword_ptr(rcx), zmm2, 171));
+ TEST_INSTRUCTION("62F3FD483B117B" , vextracti64x4(ymmword_ptr(rcx), zmm2, 123));
+ TEST_INSTRUCTION("62B3FD483B94F0341200007B" , vextracti64x4(ymmword_ptr(rax, r14, 3, 4660), zmm2, 123));
+ TEST_INSTRUCTION("62F3FD483B527F7B" , vextracti64x4(ymmword_ptr(rdx, 4064), zmm2, 123));
+ TEST_INSTRUCTION("62F3FD483B92001000007B" , vextracti64x4(ymmword_ptr(rdx, 4096), zmm2, 123));
+ TEST_INSTRUCTION("62F3FD483B52807B" , vextracti64x4(ymmword_ptr(rdx, -4096), zmm2, 123));
+ TEST_INSTRUCTION("62F3FD483B92E0EFFFFF7B" , vextracti64x4(ymmword_ptr(rdx, -4128), zmm2, 123));
+ TEST_INSTRUCTION("6261FD482919" , vmovapd(zmmword_ptr(rcx), zmm27));
+ TEST_INSTRUCTION("6261FD492919" , k(k1).vmovapd(zmmword_ptr(rcx), zmm27));
+ TEST_INSTRUCTION("6221FD48299CF034120000" , vmovapd(zmmword_ptr(rax, r14, 3, 4660), zmm27));
+ TEST_INSTRUCTION("6261FD48295A7F" , vmovapd(zmmword_ptr(rdx, 8128), zmm27));
+ TEST_INSTRUCTION("6261FD48299A00200000" , vmovapd(zmmword_ptr(rdx, 8192), zmm27));
+ TEST_INSTRUCTION("6261FD48295A80" , vmovapd(zmmword_ptr(rdx, -8192), zmm27));
+ TEST_INSTRUCTION("6261FD48299AC0DFFFFF" , vmovapd(zmmword_ptr(rdx, -8256), zmm27));
+ TEST_INSTRUCTION("62E17C482909" , vmovaps(zmmword_ptr(rcx), zmm17));
+ TEST_INSTRUCTION("62E17C4D2909" , k(k5).vmovaps(zmmword_ptr(rcx), zmm17));
+ TEST_INSTRUCTION("62A17C48298CF034120000" , vmovaps(zmmword_ptr(rax, r14, 3, 4660), zmm17));
+ TEST_INSTRUCTION("62E17C48294A7F" , vmovaps(zmmword_ptr(rdx, 8128), zmm17));
+ TEST_INSTRUCTION("62E17C48298A00200000" , vmovaps(zmmword_ptr(rdx, 8192), zmm17));
+ TEST_INSTRUCTION("62E17C48294A80" , vmovaps(zmmword_ptr(rdx, -8192), zmm17));
+ TEST_INSTRUCTION("62E17C48298AC0DFFFFF" , vmovaps(zmmword_ptr(rdx, -8256), zmm17));
+ TEST_INSTRUCTION("62F17D487F19" , vmovdqa32(zmmword_ptr(rcx), zmm3));
+ TEST_INSTRUCTION("62F17D497F19" , k(k1).vmovdqa32(zmmword_ptr(rcx), zmm3));
+ TEST_INSTRUCTION("62B17D487F9CF034120000" , vmovdqa32(zmmword_ptr(rax, r14, 3, 4660), zmm3));
+ TEST_INSTRUCTION("62F17D487F5A7F" , vmovdqa32(zmmword_ptr(rdx, 8128), zmm3));
+ TEST_INSTRUCTION("62F17D487F9A00200000" , vmovdqa32(zmmword_ptr(rdx, 8192), zmm3));
+ TEST_INSTRUCTION("62F17D487F5A80" , vmovdqa32(zmmword_ptr(rdx, -8192), zmm3));
+ TEST_INSTRUCTION("62F17D487F9AC0DFFFFF" , vmovdqa32(zmmword_ptr(rdx, -8256), zmm3));
+ TEST_INSTRUCTION("62E1FD487F11" , vmovdqa64(zmmword_ptr(rcx), zmm18));
+ TEST_INSTRUCTION("62E1FD497F11" , k(k1).vmovdqa64(zmmword_ptr(rcx), zmm18));
+ TEST_INSTRUCTION("62A1FD487F94F034120000" , vmovdqa64(zmmword_ptr(rax, r14, 3, 4660), zmm18));
+ TEST_INSTRUCTION("62E1FD487F527F" , vmovdqa64(zmmword_ptr(rdx, 8128), zmm18));
+ TEST_INSTRUCTION("62E1FD487F9200200000" , vmovdqa64(zmmword_ptr(rdx, 8192), zmm18));
+ TEST_INSTRUCTION("62E1FD487F5280" , vmovdqa64(zmmword_ptr(rdx, -8192), zmm18));
+ TEST_INSTRUCTION("62E1FD487F92C0DFFFFF" , vmovdqa64(zmmword_ptr(rdx, -8256), zmm18));
+ TEST_INSTRUCTION("62F17E487F11" , vmovdqu32(zmmword_ptr(rcx), zmm2));
+ TEST_INSTRUCTION("62F17E4F7F11" , k(k7).vmovdqu32(zmmword_ptr(rcx), zmm2));
+ TEST_INSTRUCTION("62B17E487F94F034120000" , vmovdqu32(zmmword_ptr(rax, r14, 3, 4660), zmm2));
+ TEST_INSTRUCTION("62F17E487F527F" , vmovdqu32(zmmword_ptr(rdx, 8128), zmm2));
+ TEST_INSTRUCTION("62F17E487F9200200000" , vmovdqu32(zmmword_ptr(rdx, 8192), zmm2));
+ TEST_INSTRUCTION("62F17E487F5280" , vmovdqu32(zmmword_ptr(rdx, -8192), zmm2));
+ TEST_INSTRUCTION("62F17E487F92C0DFFFFF" , vmovdqu32(zmmword_ptr(rdx, -8256), zmm2));
+ TEST_INSTRUCTION("62F1FE487F39" , vmovdqu64(zmmword_ptr(rcx), zmm7));
+ TEST_INSTRUCTION("62F1FE497F39" , k(k1).vmovdqu64(zmmword_ptr(rcx), zmm7));
+ TEST_INSTRUCTION("62B1FE487FBCF034120000" , vmovdqu64(zmmword_ptr(rax, r14, 3, 4660), zmm7));
+ TEST_INSTRUCTION("62F1FE487F7A7F" , vmovdqu64(zmmword_ptr(rdx, 8128), zmm7));
+ TEST_INSTRUCTION("62F1FE487FBA00200000" , vmovdqu64(zmmword_ptr(rdx, 8192), zmm7));
+ TEST_INSTRUCTION("62F1FE487F7A80" , vmovdqu64(zmmword_ptr(rdx, -8192), zmm7));
+ TEST_INSTRUCTION("62F1FE487FBAC0DFFFFF" , vmovdqu64(zmmword_ptr(rdx, -8256), zmm7));
+ TEST_INSTRUCTION("6271FD481101" , vmovupd(zmmword_ptr(rcx), zmm8));
+ TEST_INSTRUCTION("6271FD4C1101" , k(k4).vmovupd(zmmword_ptr(rcx), zmm8));
+ TEST_INSTRUCTION("6231FD481184F034120000" , vmovupd(zmmword_ptr(rax, r14, 3, 4660), zmm8));
+ TEST_INSTRUCTION("6271FD4811427F" , vmovupd(zmmword_ptr(rdx, 8128), zmm8));
+ TEST_INSTRUCTION("6271FD48118200200000" , vmovupd(zmmword_ptr(rdx, 8192), zmm8));
+ TEST_INSTRUCTION("6271FD48114280" , vmovupd(zmmword_ptr(rdx, -8192), zmm8));
+ TEST_INSTRUCTION("6271FD481182C0DFFFFF" , vmovupd(zmmword_ptr(rdx, -8256), zmm8));
+ TEST_INSTRUCTION("62F17C481121" , vmovups(zmmword_ptr(rcx), zmm4));
+ TEST_INSTRUCTION("62F17C491121" , k(k1).vmovups(zmmword_ptr(rcx), zmm4));
+ TEST_INSTRUCTION("62B17C4811A4F034120000" , vmovups(zmmword_ptr(rax, r14, 3, 4660), zmm4));
+ TEST_INSTRUCTION("62F17C4811627F" , vmovups(zmmword_ptr(rdx, 8128), zmm4));
+ TEST_INSTRUCTION("62F17C4811A200200000" , vmovups(zmmword_ptr(rdx, 8192), zmm4));
+ TEST_INSTRUCTION("62F17C48116280" , vmovups(zmmword_ptr(rdx, -8192), zmm4));
+ TEST_INSTRUCTION("62F17C4811A2C0DFFFFF" , vmovups(zmmword_ptr(rdx, -8256), zmm4));
+ TEST_INSTRUCTION("62727E483231" , vpmovqb(qword_ptr(rcx), zmm14));
+ TEST_INSTRUCTION("62727E4A3231" , k(k2).vpmovqb(qword_ptr(rcx), zmm14));
+ TEST_INSTRUCTION("62327E4832B4F034120000" , vpmovqb(qword_ptr(rax, r14, 3, 4660), zmm14));
+ TEST_INSTRUCTION("62727E4832727F" , vpmovqb(qword_ptr(rdx, 1016), zmm14));
+ TEST_INSTRUCTION("62727E4832B200040000" , vpmovqb(qword_ptr(rdx, 1024), zmm14));
+ TEST_INSTRUCTION("62727E48327280" , vpmovqb(qword_ptr(rdx, -1024), zmm14));
+ TEST_INSTRUCTION("62727E4832B2F8FBFFFF" , vpmovqb(qword_ptr(rdx, -1032), zmm14));
+ TEST_INSTRUCTION("62E27E482211" , vpmovsqb(qword_ptr(rcx), zmm18));
+ TEST_INSTRUCTION("62E27E4E2211" , k(k6).vpmovsqb(qword_ptr(rcx), zmm18));
+ TEST_INSTRUCTION("62A27E482294F034120000" , vpmovsqb(qword_ptr(rax, r14, 3, 4660), zmm18));
+ TEST_INSTRUCTION("62E27E4822527F" , vpmovsqb(qword_ptr(rdx, 1016), zmm18));
+ TEST_INSTRUCTION("62E27E48229200040000" , vpmovsqb(qword_ptr(rdx, 1024), zmm18));
+ TEST_INSTRUCTION("62E27E48225280" , vpmovsqb(qword_ptr(rdx, -1024), zmm18));
+ TEST_INSTRUCTION("62E27E482292F8FBFFFF" , vpmovsqb(qword_ptr(rdx, -1032), zmm18));
+ TEST_INSTRUCTION("62727E481229" , vpmovusqb(qword_ptr(rcx), zmm13));
+ TEST_INSTRUCTION("62727E4A1229" , k(k2).vpmovusqb(qword_ptr(rcx), zmm13));
+ TEST_INSTRUCTION("62327E4812ACF034120000" , vpmovusqb(qword_ptr(rax, r14, 3, 4660), zmm13));
+ TEST_INSTRUCTION("62727E48126A7F" , vpmovusqb(qword_ptr(rdx, 1016), zmm13));
+ TEST_INSTRUCTION("62727E4812AA00040000" , vpmovusqb(qword_ptr(rdx, 1024), zmm13));
+ TEST_INSTRUCTION("62727E48126A80" , vpmovusqb(qword_ptr(rdx, -1024), zmm13));
+ TEST_INSTRUCTION("62727E4812AAF8FBFFFF" , vpmovusqb(qword_ptr(rdx, -1032), zmm13));
+ TEST_INSTRUCTION("62E27E483431" , vpmovqw(xmmword_ptr(rcx), zmm22));
+ TEST_INSTRUCTION("62E27E4E3431" , k(k6).vpmovqw(xmmword_ptr(rcx), zmm22));
+ TEST_INSTRUCTION("62A27E4834B4F034120000" , vpmovqw(xmmword_ptr(rax, r14, 3, 4660), zmm22));
+ TEST_INSTRUCTION("62E27E4834727F" , vpmovqw(xmmword_ptr(rdx, 2032), zmm22));
+ TEST_INSTRUCTION("62E27E4834B200080000" , vpmovqw(xmmword_ptr(rdx, 2048), zmm22));
+ TEST_INSTRUCTION("62E27E48347280" , vpmovqw(xmmword_ptr(rdx, -2048), zmm22));
+ TEST_INSTRUCTION("62E27E4834B2F0F7FFFF" , vpmovqw(xmmword_ptr(rdx, -2064), zmm22));
+ TEST_INSTRUCTION("62627E482411" , vpmovsqw(xmmword_ptr(rcx), zmm26));
+ TEST_INSTRUCTION("62627E4A2411" , k(k2).vpmovsqw(xmmword_ptr(rcx), zmm26));
+ TEST_INSTRUCTION("62227E482494F034120000" , vpmovsqw(xmmword_ptr(rax, r14, 3, 4660), zmm26));
+ TEST_INSTRUCTION("62627E4824527F" , vpmovsqw(xmmword_ptr(rdx, 2032), zmm26));
+ TEST_INSTRUCTION("62627E48249200080000" , vpmovsqw(xmmword_ptr(rdx, 2048), zmm26));
+ TEST_INSTRUCTION("62627E48245280" , vpmovsqw(xmmword_ptr(rdx, -2048), zmm26));
+ TEST_INSTRUCTION("62627E482492F0F7FFFF" , vpmovsqw(xmmword_ptr(rdx, -2064), zmm26));
+ TEST_INSTRUCTION("62F27E481431" , vpmovusqw(xmmword_ptr(rcx), zmm6));
+ TEST_INSTRUCTION("62F27E4F1431" , k(k7).vpmovusqw(xmmword_ptr(rcx), zmm6));
+ TEST_INSTRUCTION("62B27E4814B4F034120000" , vpmovusqw(xmmword_ptr(rax, r14, 3, 4660), zmm6));
+ TEST_INSTRUCTION("62F27E4814727F" , vpmovusqw(xmmword_ptr(rdx, 2032), zmm6));
+ TEST_INSTRUCTION("62F27E4814B200080000" , vpmovusqw(xmmword_ptr(rdx, 2048), zmm6));
+ TEST_INSTRUCTION("62F27E48147280" , vpmovusqw(xmmword_ptr(rdx, -2048), zmm6));
+ TEST_INSTRUCTION("62F27E4814B2F0F7FFFF" , vpmovusqw(xmmword_ptr(rdx, -2064), zmm6));
+ TEST_INSTRUCTION("62727E483511" , vpmovqd(ymmword_ptr(rcx), zmm10));
+ TEST_INSTRUCTION("62727E4D3511" , k(k5).vpmovqd(ymmword_ptr(rcx), zmm10));
+ TEST_INSTRUCTION("62327E483594F034120000" , vpmovqd(ymmword_ptr(rax, r14, 3, 4660), zmm10));
+ TEST_INSTRUCTION("62727E4835527F" , vpmovqd(ymmword_ptr(rdx, 4064), zmm10));
+ TEST_INSTRUCTION("62727E48359200100000" , vpmovqd(ymmword_ptr(rdx, 4096), zmm10));
+ TEST_INSTRUCTION("62727E48355280" , vpmovqd(ymmword_ptr(rdx, -4096), zmm10));
+ TEST_INSTRUCTION("62727E483592E0EFFFFF" , vpmovqd(ymmword_ptr(rdx, -4128), zmm10));
+ TEST_INSTRUCTION("62E27E482511" , vpmovsqd(ymmword_ptr(rcx), zmm18));
+ TEST_INSTRUCTION("62E27E4D2511" , k(k5).vpmovsqd(ymmword_ptr(rcx), zmm18));
+ TEST_INSTRUCTION("62A27E482594F034120000" , vpmovsqd(ymmword_ptr(rax, r14, 3, 4660), zmm18));
+ TEST_INSTRUCTION("62E27E4825527F" , vpmovsqd(ymmword_ptr(rdx, 4064), zmm18));
+ TEST_INSTRUCTION("62E27E48259200100000" , vpmovsqd(ymmword_ptr(rdx, 4096), zmm18));
+ TEST_INSTRUCTION("62E27E48255280" , vpmovsqd(ymmword_ptr(rdx, -4096), zmm18));
+ TEST_INSTRUCTION("62E27E482592E0EFFFFF" , vpmovsqd(ymmword_ptr(rdx, -4128), zmm18));
+ TEST_INSTRUCTION("62E27E481509" , vpmovusqd(ymmword_ptr(rcx), zmm17));
+ TEST_INSTRUCTION("62E27E4C1509" , k(k4).vpmovusqd(ymmword_ptr(rcx), zmm17));
+ TEST_INSTRUCTION("62A27E48158CF034120000" , vpmovusqd(ymmword_ptr(rax, r14, 3, 4660), zmm17));
+ TEST_INSTRUCTION("62E27E48154A7F" , vpmovusqd(ymmword_ptr(rdx, 4064), zmm17));
+ TEST_INSTRUCTION("62E27E48158A00100000" , vpmovusqd(ymmword_ptr(rdx, 4096), zmm17));
+ TEST_INSTRUCTION("62E27E48154A80" , vpmovusqd(ymmword_ptr(rdx, -4096), zmm17));
+ TEST_INSTRUCTION("62E27E48158AE0EFFFFF" , vpmovusqd(ymmword_ptr(rdx, -4128), zmm17));
+ TEST_INSTRUCTION("62627E483129" , vpmovdb(xmmword_ptr(rcx), zmm29));
+ TEST_INSTRUCTION("62627E4C3129" , k(k4).vpmovdb(xmmword_ptr(rcx), zmm29));
+ TEST_INSTRUCTION("62227E4831ACF034120000" , vpmovdb(xmmword_ptr(rax, r14, 3, 4660), zmm29));
+ TEST_INSTRUCTION("62627E48316A7F" , vpmovdb(xmmword_ptr(rdx, 2032), zmm29));
+ TEST_INSTRUCTION("62627E4831AA00080000" , vpmovdb(xmmword_ptr(rdx, 2048), zmm29));
+ TEST_INSTRUCTION("62627E48316A80" , vpmovdb(xmmword_ptr(rdx, -2048), zmm29));
+ TEST_INSTRUCTION("62627E4831AAF0F7FFFF" , vpmovdb(xmmword_ptr(rdx, -2064), zmm29));
+ TEST_INSTRUCTION("62627E482121" , vpmovsdb(xmmword_ptr(rcx), zmm28));
+ TEST_INSTRUCTION("62627E4D2121" , k(k5).vpmovsdb(xmmword_ptr(rcx), zmm28));
+ TEST_INSTRUCTION("62227E4821A4F034120000" , vpmovsdb(xmmword_ptr(rax, r14, 3, 4660), zmm28));
+ TEST_INSTRUCTION("62627E4821627F" , vpmovsdb(xmmword_ptr(rdx, 2032), zmm28));
+ TEST_INSTRUCTION("62627E4821A200080000" , vpmovsdb(xmmword_ptr(rdx, 2048), zmm28));
+ TEST_INSTRUCTION("62627E48216280" , vpmovsdb(xmmword_ptr(rdx, -2048), zmm28));
+ TEST_INSTRUCTION("62627E4821A2F0F7FFFF" , vpmovsdb(xmmword_ptr(rdx, -2064), zmm28));
+ TEST_INSTRUCTION("62627E481131" , vpmovusdb(xmmword_ptr(rcx), zmm30));
+ TEST_INSTRUCTION("62627E491131" , k(k1).vpmovusdb(xmmword_ptr(rcx), zmm30));
+ TEST_INSTRUCTION("62227E4811B4F034120000" , vpmovusdb(xmmword_ptr(rax, r14, 3, 4660), zmm30));
+ TEST_INSTRUCTION("62627E4811727F" , vpmovusdb(xmmword_ptr(rdx, 2032), zmm30));
+ TEST_INSTRUCTION("62627E4811B200080000" , vpmovusdb(xmmword_ptr(rdx, 2048), zmm30));
+ TEST_INSTRUCTION("62627E48117280" , vpmovusdb(xmmword_ptr(rdx, -2048), zmm30));
+ TEST_INSTRUCTION("62627E4811B2F0F7FFFF" , vpmovusdb(xmmword_ptr(rdx, -2064), zmm30));
+ TEST_INSTRUCTION("62F27E483329" , vpmovdw(ymmword_ptr(rcx), zmm5));
+ TEST_INSTRUCTION("62F27E4F3329" , k(k7).vpmovdw(ymmword_ptr(rcx), zmm5));
+ TEST_INSTRUCTION("62B27E4833ACF034120000" , vpmovdw(ymmword_ptr(rax, r14, 3, 4660), zmm5));
+ TEST_INSTRUCTION("62F27E48336A7F" , vpmovdw(ymmword_ptr(rdx, 4064), zmm5));
+ TEST_INSTRUCTION("62F27E4833AA00100000" , vpmovdw(ymmword_ptr(rdx, 4096), zmm5));
+ TEST_INSTRUCTION("62F27E48336A80" , vpmovdw(ymmword_ptr(rdx, -4096), zmm5));
+ TEST_INSTRUCTION("62F27E4833AAE0EFFFFF" , vpmovdw(ymmword_ptr(rdx, -4128), zmm5));
+ TEST_INSTRUCTION("62E27E482311" , vpmovsdw(ymmword_ptr(rcx), zmm18));
+ TEST_INSTRUCTION("62E27E4F2311" , k(k7).vpmovsdw(ymmword_ptr(rcx), zmm18));
+ TEST_INSTRUCTION("62A27E482394F034120000" , vpmovsdw(ymmword_ptr(rax, r14, 3, 4660), zmm18));
+ TEST_INSTRUCTION("62E27E4823527F" , vpmovsdw(ymmword_ptr(rdx, 4064), zmm18));
+ TEST_INSTRUCTION("62E27E48239200100000" , vpmovsdw(ymmword_ptr(rdx, 4096), zmm18));
+ TEST_INSTRUCTION("62E27E48235280" , vpmovsdw(ymmword_ptr(rdx, -4096), zmm18));
+ TEST_INSTRUCTION("62E27E482392E0EFFFFF" , vpmovsdw(ymmword_ptr(rdx, -4128), zmm18));
+ TEST_INSTRUCTION("62F27E481329" , vpmovusdw(ymmword_ptr(rcx), zmm5));
+ TEST_INSTRUCTION("62F27E4C1329" , k(k4).vpmovusdw(ymmword_ptr(rcx), zmm5));
+ TEST_INSTRUCTION("62B27E4813ACF034120000" , vpmovusdw(ymmword_ptr(rax, r14, 3, 4660), zmm5));
+ TEST_INSTRUCTION("62F27E48136A7F" , vpmovusdw(ymmword_ptr(rdx, 4064), zmm5));
+ TEST_INSTRUCTION("62F27E4813AA00100000" , vpmovusdw(ymmword_ptr(rdx, 4096), zmm5));
+ TEST_INSTRUCTION("62F27E48136A80" , vpmovusdw(ymmword_ptr(rdx, -4096), zmm5));
+ TEST_INSTRUCTION("62F27E4813AAE0EFFFFF" , vpmovusdw(ymmword_ptr(rdx, -4128), zmm5));
+ TEST_INSTRUCTION("62C1FC4878E6" , vcvttpd2udq(ymm20, zmm14));
+ TEST_INSTRUCTION("62C1FC4B78E6" , k(k3).vcvttpd2udq(ymm20, zmm14));
+ TEST_INSTRUCTION("62C1FCCB78E6" , k(k3).z().vcvttpd2udq(ymm20, zmm14));
+ TEST_INSTRUCTION("62C1FC1878E6" , sae().vcvttpd2udq(ymm20, zmm14));
+ TEST_INSTRUCTION("62E1FC487821" , vcvttpd2udq(ymm20, zmmword_ptr(rcx)));
+ TEST_INSTRUCTION("62A1FC4878A4F034120000" , vcvttpd2udq(ymm20, zmmword_ptr(rax, r14, 3, 4660)));
+ TEST_INSTRUCTION("62E1FC587821" , vcvttpd2udq(ymm20, qword_ptr(rcx)._1to8()));
+ TEST_INSTRUCTION("62E1FC4878627F" , vcvttpd2udq(ymm20, zmmword_ptr(rdx, 8128)));
+ TEST_INSTRUCTION("62E1FC4878A200200000" , vcvttpd2udq(ymm20, zmmword_ptr(rdx, 8192)));
+ TEST_INSTRUCTION("62E1FC48786280" , vcvttpd2udq(ymm20, zmmword_ptr(rdx, -8192)));
+ TEST_INSTRUCTION("62E1FC4878A2C0DFFFFF" , vcvttpd2udq(ymm20, zmmword_ptr(rdx, -8256)));
+ TEST_INSTRUCTION("62E1FC5878627F" , vcvttpd2udq(ymm20, qword_ptr(rdx, 1016)._1to8()));
+ TEST_INSTRUCTION("62E1FC5878A200040000" , vcvttpd2udq(ymm20, qword_ptr(rdx, 1024)._1to8()));
+ TEST_INSTRUCTION("62E1FC58786280" , vcvttpd2udq(ymm20, qword_ptr(rdx, -1024)._1to8()));
+ TEST_INSTRUCTION("62E1FC5878A2F8FBFFFF" , vcvttpd2udq(ymm20, qword_ptr(rdx, -1032)._1to8()));
+ TEST_INSTRUCTION("62B17C4878EC" , vcvttps2udq(zmm5, zmm20));
+ TEST_INSTRUCTION("62B17C4A78EC" , k(k2).vcvttps2udq(zmm5, zmm20));
+ TEST_INSTRUCTION("62B17CCA78EC" , k(k2).z().vcvttps2udq(zmm5, zmm20));
+ TEST_INSTRUCTION("62B17C1878EC" , sae().vcvttps2udq(zmm5, zmm20));
+ TEST_INSTRUCTION("62F17C487829" , vcvttps2udq(zmm5, zmmword_ptr(rcx)));
+ TEST_INSTRUCTION("62B17C4878ACF034120000" , vcvttps2udq(zmm5, zmmword_ptr(rax, r14, 3, 4660)));
+ TEST_INSTRUCTION("62F17C587829" , vcvttps2udq(zmm5, dword_ptr(rcx)._1to16()));
+ TEST_INSTRUCTION("62F17C48786A7F" , vcvttps2udq(zmm5, zmmword_ptr(rdx, 8128)));
+ TEST_INSTRUCTION("62F17C4878AA00200000" , vcvttps2udq(zmm5, zmmword_ptr(rdx, 8192)));
+ TEST_INSTRUCTION("62F17C48786A80" , vcvttps2udq(zmm5, zmmword_ptr(rdx, -8192)));
+ TEST_INSTRUCTION("62F17C4878AAC0DFFFFF" , vcvttps2udq(zmm5, zmmword_ptr(rdx, -8256)));
+ TEST_INSTRUCTION("62F17C58786A7F" , vcvttps2udq(zmm5, dword_ptr(rdx, 508)._1to16()));
+ TEST_INSTRUCTION("62F17C5878AA00020000" , vcvttps2udq(zmm5, dword_ptr(rdx, 512)._1to16()));
+ TEST_INSTRUCTION("62F17C58786A80" , vcvttps2udq(zmm5, dword_ptr(rdx, -512)._1to16()));
+ TEST_INSTRUCTION("62F17C5878AAFCFDFFFF" , vcvttps2udq(zmm5, dword_ptr(rdx, -516)._1to16()));
+ TEST_INSTRUCTION("62B17F0878C7" , vcvttsd2usi(eax, xmm23));
+ TEST_INSTRUCTION("62B17F1878C7" , sae().vcvttsd2usi(eax, xmm23));
+ TEST_INSTRUCTION("62F17F087801" , vcvttsd2usi(eax, qword_ptr(rcx)));
+ TEST_INSTRUCTION("62B17F087884F034120000" , vcvttsd2usi(eax, qword_ptr(rax, r14, 3, 4660)));
+ TEST_INSTRUCTION("62F17F0878427F" , vcvttsd2usi(eax, qword_ptr(rdx, 1016)));
+ TEST_INSTRUCTION("62F17F08788200040000" , vcvttsd2usi(eax, qword_ptr(rdx, 1024)));
+ TEST_INSTRUCTION("62F17F08784280" , vcvttsd2usi(eax, qword_ptr(rdx, -1024)));
+ TEST_INSTRUCTION("62F17F087882F8FBFFFF" , vcvttsd2usi(eax, qword_ptr(rdx, -1032)));
+ TEST_INSTRUCTION("62B17F0878EF" , vcvttsd2usi(ebp, xmm23));
+ TEST_INSTRUCTION("62B17F1878EF" , sae().vcvttsd2usi(ebp, xmm23));
+ TEST_INSTRUCTION("62F17F087829" , vcvttsd2usi(ebp, qword_ptr(rcx)));
+ TEST_INSTRUCTION("62B17F0878ACF034120000" , vcvttsd2usi(ebp, qword_ptr(rax, r14, 3, 4660)));
+ TEST_INSTRUCTION("62F17F08786A7F" , vcvttsd2usi(ebp, qword_ptr(rdx, 1016)));
+ TEST_INSTRUCTION("62F17F0878AA00040000" , vcvttsd2usi(ebp, qword_ptr(rdx, 1024)));
+ TEST_INSTRUCTION("62F17F08786A80" , vcvttsd2usi(ebp, qword_ptr(rdx, -1024)));
+ TEST_INSTRUCTION("62F17F0878AAF8FBFFFF" , vcvttsd2usi(ebp, qword_ptr(rdx, -1032)));
+ TEST_INSTRUCTION("62317F0878EF" , vcvttsd2usi(r13d, xmm23));
+ TEST_INSTRUCTION("62317F1878EF" , sae().vcvttsd2usi(r13d, xmm23));
+ TEST_INSTRUCTION("62717F087829" , vcvttsd2usi(r13d, qword_ptr(rcx)));
+ TEST_INSTRUCTION("62317F0878ACF034120000" , vcvttsd2usi(r13d, qword_ptr(rax, r14, 3, 4660)));
+ TEST_INSTRUCTION("62717F08786A7F" , vcvttsd2usi(r13d, qword_ptr(rdx, 1016)));
+ TEST_INSTRUCTION("62717F0878AA00040000" , vcvttsd2usi(r13d, qword_ptr(rdx, 1024)));
+ TEST_INSTRUCTION("62717F08786A80" , vcvttsd2usi(r13d, qword_ptr(rdx, -1024)));
+ TEST_INSTRUCTION("62717F0878AAF8FBFFFF" , vcvttsd2usi(r13d, qword_ptr(rdx, -1032)));
+ TEST_INSTRUCTION("62B1FF0878C3" , vcvttsd2usi(rax, xmm19));
+ TEST_INSTRUCTION("62B1FF1878C3" , sae().vcvttsd2usi(rax, xmm19));
+ TEST_INSTRUCTION("62F1FF087801" , vcvttsd2usi(rax, qword_ptr(rcx)));
+ TEST_INSTRUCTION("62B1FF087884F034120000" , vcvttsd2usi(rax, qword_ptr(rax, r14, 3, 4660)));
+ TEST_INSTRUCTION("62F1FF0878427F" , vcvttsd2usi(rax, qword_ptr(rdx, 1016)));
+ TEST_INSTRUCTION("62F1FF08788200040000" , vcvttsd2usi(rax, qword_ptr(rdx, 1024)));
+ TEST_INSTRUCTION("62F1FF08784280" , vcvttsd2usi(rax, qword_ptr(rdx, -1024)));
+ TEST_INSTRUCTION("62F1FF087882F8FBFFFF" , vcvttsd2usi(rax, qword_ptr(rdx, -1032)));
+ TEST_INSTRUCTION("6231FF0878C3" , vcvttsd2usi(r8, xmm19));
+ TEST_INSTRUCTION("6231FF1878C3" , sae().vcvttsd2usi(r8, xmm19));
+ TEST_INSTRUCTION("6271FF087801" , vcvttsd2usi(r8, qword_ptr(rcx)));
+ TEST_INSTRUCTION("6231FF087884F034120000" , vcvttsd2usi(r8, qword_ptr(rax, r14, 3, 4660)));
+ TEST_INSTRUCTION("6271FF0878427F" , vcvttsd2usi(r8, qword_ptr(rdx, 1016)));
+ TEST_INSTRUCTION("6271FF08788200040000" , vcvttsd2usi(r8, qword_ptr(rdx, 1024)));
+ TEST_INSTRUCTION("6271FF08784280" , vcvttsd2usi(r8, qword_ptr(rdx, -1024)));
+ TEST_INSTRUCTION("6271FF087882F8FBFFFF" , vcvttsd2usi(r8, qword_ptr(rdx, -1032)));
+ TEST_INSTRUCTION("62B17E0878C5" , vcvttss2usi(eax, xmm21));
+ TEST_INSTRUCTION("62B17E1878C5" , sae().vcvttss2usi(eax, xmm21));
+ TEST_INSTRUCTION("62F17E087801" , vcvttss2usi(eax, dword_ptr(rcx)));
+ TEST_INSTRUCTION("62B17E087884F034120000" , vcvttss2usi(eax, dword_ptr(rax, r14, 3, 4660)));
+ TEST_INSTRUCTION("62F17E0878427F" , vcvttss2usi(eax, dword_ptr(rdx, 508)));
+ TEST_INSTRUCTION("62F17E08788200020000" , vcvttss2usi(eax, dword_ptr(rdx, 512)));
+ TEST_INSTRUCTION("62F17E08784280" , vcvttss2usi(eax, dword_ptr(rdx, -512)));
+ TEST_INSTRUCTION("62F17E087882FCFDFFFF" , vcvttss2usi(eax, dword_ptr(rdx, -516)));
+ TEST_INSTRUCTION("62B17E0878ED" , vcvttss2usi(ebp, xmm21));
+ TEST_INSTRUCTION("62B17E1878ED" , sae().vcvttss2usi(ebp, xmm21));
+ TEST_INSTRUCTION("62F17E087829" , vcvttss2usi(ebp, dword_ptr(rcx)));
+ TEST_INSTRUCTION("62B17E0878ACF034120000" , vcvttss2usi(ebp, dword_ptr(rax, r14, 3, 4660)));
+ TEST_INSTRUCTION("62F17E08786A7F" , vcvttss2usi(ebp, dword_ptr(rdx, 508)));
+ TEST_INSTRUCTION("62F17E0878AA00020000" , vcvttss2usi(ebp, dword_ptr(rdx, 512)));
+ TEST_INSTRUCTION("62F17E08786A80" , vcvttss2usi(ebp, dword_ptr(rdx, -512)));
+ TEST_INSTRUCTION("62F17E0878AAFCFDFFFF" , vcvttss2usi(ebp, dword_ptr(rdx, -516)));
+ TEST_INSTRUCTION("62317E0878ED" , vcvttss2usi(r13d, xmm21));
+ TEST_INSTRUCTION("62317E1878ED" , sae().vcvttss2usi(r13d, xmm21));
+ TEST_INSTRUCTION("62717E087829" , vcvttss2usi(r13d, dword_ptr(rcx)));
+ TEST_INSTRUCTION("62317E0878ACF034120000" , vcvttss2usi(r13d, dword_ptr(rax, r14, 3, 4660)));
+ TEST_INSTRUCTION("62717E08786A7F" , vcvttss2usi(r13d, dword_ptr(rdx, 508)));
+ TEST_INSTRUCTION("62717E0878AA00020000" , vcvttss2usi(r13d, dword_ptr(rdx, 512)));
+ TEST_INSTRUCTION("62717E08786A80" , vcvttss2usi(r13d, dword_ptr(rdx, -512)));
+ TEST_INSTRUCTION("62717E0878AAFCFDFFFF" , vcvttss2usi(r13d, dword_ptr(rdx, -516)));
+ TEST_INSTRUCTION("62F1FE0878C7" , vcvttss2usi(rax, xmm7));
+ TEST_INSTRUCTION("62F1FE1878C7" , sae().vcvttss2usi(rax, xmm7));
+ TEST_INSTRUCTION("62F1FE087801" , vcvttss2usi(rax, dword_ptr(rcx)));
+ TEST_INSTRUCTION("62B1FE087884F034120000" , vcvttss2usi(rax, dword_ptr(rax, r14, 3, 4660)));
+ TEST_INSTRUCTION("62F1FE0878427F" , vcvttss2usi(rax, dword_ptr(rdx, 508)));
+ TEST_INSTRUCTION("62F1FE08788200020000" , vcvttss2usi(rax, dword_ptr(rdx, 512)));
+ TEST_INSTRUCTION("62F1FE08784280" , vcvttss2usi(rax, dword_ptr(rdx, -512)));
+ TEST_INSTRUCTION("62F1FE087882FCFDFFFF" , vcvttss2usi(rax, dword_ptr(rdx, -516)));
+ TEST_INSTRUCTION("6271FE0878C7" , vcvttss2usi(r8, xmm7));
+ TEST_INSTRUCTION("6271FE1878C7" , sae().vcvttss2usi(r8, xmm7));
+ TEST_INSTRUCTION("6271FE087801" , vcvttss2usi(r8, dword_ptr(rcx)));
+ TEST_INSTRUCTION("6231FE087884F034120000" , vcvttss2usi(r8, dword_ptr(rax, r14, 3, 4660)));
+ TEST_INSTRUCTION("6271FE0878427F" , vcvttss2usi(r8, dword_ptr(rdx, 508)));
+ TEST_INSTRUCTION("6271FE08788200020000" , vcvttss2usi(r8, dword_ptr(rdx, 512)));
+ TEST_INSTRUCTION("6271FE08784280" , vcvttss2usi(r8, dword_ptr(rdx, -512)));
+ TEST_INSTRUCTION("6271FE087882FCFDFFFF" , vcvttss2usi(r8, dword_ptr(rdx, -516)));
+ TEST_INSTRUCTION("6252654876C9" , vpermi2d(zmm9, zmm3, zmm9));
+ TEST_INSTRUCTION("6252654976C9" , k(k1).vpermi2d(zmm9, zmm3, zmm9));
+ TEST_INSTRUCTION("625265C976C9" , k(k1).z().vpermi2d(zmm9, zmm3, zmm9));
+ TEST_INSTRUCTION("627265487609" , vpermi2d(zmm9, zmm3, zmmword_ptr(rcx)));
+ TEST_INSTRUCTION("62326548768CF034120000" , vpermi2d(zmm9, zmm3, zmmword_ptr(rax, r14, 3, 4660)));
+ TEST_INSTRUCTION("627265587609" , vpermi2d(zmm9, zmm3, dword_ptr(rcx)._1to16()));
+ TEST_INSTRUCTION("62726548764A7F" , vpermi2d(zmm9, zmm3, zmmword_ptr(rdx, 8128)));
+ TEST_INSTRUCTION("62726548768A00200000" , vpermi2d(zmm9, zmm3, zmmword_ptr(rdx, 8192)));
+ TEST_INSTRUCTION("62726548764A80" , vpermi2d(zmm9, zmm3, zmmword_ptr(rdx, -8192)));
+ TEST_INSTRUCTION("62726548768AC0DFFFFF" , vpermi2d(zmm9, zmm3, zmmword_ptr(rdx, -8256)));
+ TEST_INSTRUCTION("62726558764A7F" , vpermi2d(zmm9, zmm3, dword_ptr(rdx, 508)._1to16()));
+ TEST_INSTRUCTION("62726558768A00020000" , vpermi2d(zmm9, zmm3, dword_ptr(rdx, 512)._1to16()));
+ TEST_INSTRUCTION("62726558764A80" , vpermi2d(zmm9, zmm3, dword_ptr(rdx, -512)._1to16()));
+ TEST_INSTRUCTION("62726558768AFCFDFFFF" , vpermi2d(zmm9, zmm3, dword_ptr(rdx, -516)._1to16()));
+ TEST_INSTRUCTION("6282CD4076E9" , vpermi2q(zmm21, zmm22, zmm25));
+ TEST_INSTRUCTION("6282CD4276E9" , k(k2).vpermi2q(zmm21, zmm22, zmm25));
+ TEST_INSTRUCTION("6282CDC276E9" , k(k2).z().vpermi2q(zmm21, zmm22, zmm25));
+ TEST_INSTRUCTION("62E2CD407629" , vpermi2q(zmm21, zmm22, zmmword_ptr(rcx)));
+ TEST_INSTRUCTION("62A2CD4076ACF034120000" , vpermi2q(zmm21, zmm22, zmmword_ptr(rax, r14, 3, 4660)));
+ TEST_INSTRUCTION("62E2CD507629" , vpermi2q(zmm21, zmm22, qword_ptr(rcx)._1to8()));
+ TEST_INSTRUCTION("62E2CD40766A7F" , vpermi2q(zmm21, zmm22, zmmword_ptr(rdx, 8128)));
+ TEST_INSTRUCTION("62E2CD4076AA00200000" , vpermi2q(zmm21, zmm22, zmmword_ptr(rdx, 8192)));
+ TEST_INSTRUCTION("62E2CD40766A80" , vpermi2q(zmm21, zmm22, zmmword_ptr(rdx, -8192)));
+ TEST_INSTRUCTION("62E2CD4076AAC0DFFFFF" , vpermi2q(zmm21, zmm22, zmmword_ptr(rdx, -8256)));
+ TEST_INSTRUCTION("62E2CD50766A7F" , vpermi2q(zmm21, zmm22, qword_ptr(rdx, 1016)._1to8()));
+ TEST_INSTRUCTION("62E2CD5076AA00040000" , vpermi2q(zmm21, zmm22, qword_ptr(rdx, 1024)._1to8()));
+ TEST_INSTRUCTION("62E2CD50766A80" , vpermi2q(zmm21, zmm22, qword_ptr(rdx, -1024)._1to8()));
+ TEST_INSTRUCTION("62E2CD5076AAF8FBFFFF" , vpermi2q(zmm21, zmm22, qword_ptr(rdx, -1032)._1to8()));
+ TEST_INSTRUCTION("62622D4077D1" , vpermi2ps(zmm26, zmm26, zmm1));
+ TEST_INSTRUCTION("62622D4577D1" , k(k5).vpermi2ps(zmm26, zmm26, zmm1));
+ TEST_INSTRUCTION("62622DC577D1" , k(k5).z().vpermi2ps(zmm26, zmm26, zmm1));
+ TEST_INSTRUCTION("62622D407711" , vpermi2ps(zmm26, zmm26, zmmword_ptr(rcx)));
+ TEST_INSTRUCTION("62222D407794F034120000" , vpermi2ps(zmm26, zmm26, zmmword_ptr(rax, r14, 3, 4660)));
+ TEST_INSTRUCTION("62622D507711" , vpermi2ps(zmm26, zmm26, dword_ptr(rcx)._1to16()));
+ TEST_INSTRUCTION("62622D4077527F" , vpermi2ps(zmm26, zmm26, zmmword_ptr(rdx, 8128)));
+ TEST_INSTRUCTION("62622D40779200200000" , vpermi2ps(zmm26, zmm26, zmmword_ptr(rdx, 8192)));
+ TEST_INSTRUCTION("62622D40775280" , vpermi2ps(zmm26, zmm26, zmmword_ptr(rdx, -8192)));
+ TEST_INSTRUCTION("62622D407792C0DFFFFF" , vpermi2ps(zmm26, zmm26, zmmword_ptr(rdx, -8256)));
+ TEST_INSTRUCTION("62622D5077527F" , vpermi2ps(zmm26, zmm26, dword_ptr(rdx, 508)._1to16()));
+ TEST_INSTRUCTION("62622D50779200020000" , vpermi2ps(zmm26, zmm26, dword_ptr(rdx, 512)._1to16()));
+ TEST_INSTRUCTION("62622D50775280" , vpermi2ps(zmm26, zmm26, dword_ptr(rdx, -512)._1to16()));
+ TEST_INSTRUCTION("62622D507792FCFDFFFF" , vpermi2ps(zmm26, zmm26, dword_ptr(rdx, -516)._1to16()));
+ TEST_INSTRUCTION("62A2A54077ED" , vpermi2pd(zmm21, zmm27, zmm21));
+ TEST_INSTRUCTION("62A2A54477ED" , k(k4).vpermi2pd(zmm21, zmm27, zmm21));
+ TEST_INSTRUCTION("62A2A5C477ED" , k(k4).z().vpermi2pd(zmm21, zmm27, zmm21));
+ TEST_INSTRUCTION("62E2A5407729" , vpermi2pd(zmm21, zmm27, zmmword_ptr(rcx)));
+ TEST_INSTRUCTION("62A2A54077ACF034120000" , vpermi2pd(zmm21, zmm27, zmmword_ptr(rax, r14, 3, 4660)));
+ TEST_INSTRUCTION("62E2A5507729" , vpermi2pd(zmm21, zmm27, qword_ptr(rcx)._1to8()));
+ TEST_INSTRUCTION("62E2A540776A7F" , vpermi2pd(zmm21, zmm27, zmmword_ptr(rdx, 8128)));
+ TEST_INSTRUCTION("62E2A54077AA00200000" , vpermi2pd(zmm21, zmm27, zmmword_ptr(rdx, 8192)));
+ TEST_INSTRUCTION("62E2A540776A80" , vpermi2pd(zmm21, zmm27, zmmword_ptr(rdx, -8192)));
+ TEST_INSTRUCTION("62E2A54077AAC0DFFFFF" , vpermi2pd(zmm21, zmm27, zmmword_ptr(rdx, -8256)));
+ TEST_INSTRUCTION("62E2A550776A7F" , vpermi2pd(zmm21, zmm27, qword_ptr(rdx, 1016)._1to8()));
+ TEST_INSTRUCTION("62E2A55077AA00040000" , vpermi2pd(zmm21, zmm27, qword_ptr(rdx, 1024)._1to8()));
+ TEST_INSTRUCTION("62E2A550776A80" , vpermi2pd(zmm21, zmm27, qword_ptr(rdx, -1024)._1to8()));
+ TEST_INSTRUCTION("62E2A55077AAF8FBFFFF" , vpermi2pd(zmm21, zmm27, qword_ptr(rdx, -1032)._1to8()));
+ TEST_INSTRUCTION("62D2FD4192B4C67B000000" , k(k1).vgatherdpd(zmm6, zmmword_ptr(r14, ymm16, 3, 123)));
+ TEST_INSTRUCTION("62D2FD4192740120" , k(k1).vgatherdpd(zmm6, zmmword_ptr(r9, ymm16, 0, 256)));
+ TEST_INSTRUCTION("62F2FD4192B48100040000" , k(k1).vgatherdpd(zmm6, zmmword_ptr(rcx, ymm16, 2, 1024)));
+ TEST_INSTRUCTION("62527D41928CDE7B000000" , k(k1).vgatherdps(zmm9, zmmword_ptr(r14, zmm19, 3, 123)));
+ TEST_INSTRUCTION("62527D41924C1940" , k(k1).vgatherdps(zmm9, zmmword_ptr(r9, zmm19, 0, 256)));
+ TEST_INSTRUCTION("62727D41928C9900040000" , k(k1).vgatherdps(zmm9, zmmword_ptr(rcx, zmm19, 2, 1024)));
+ TEST_INSTRUCTION("6242FD4993ACD67B000000" , k(k1).vgatherqpd(zmm29, zmmword_ptr(r14, zmm2, 3, 123)));
+ TEST_INSTRUCTION("6242FD49936C1120" , k(k1).vgatherqpd(zmm29, zmmword_ptr(r9, zmm2, 0, 256)));
+ TEST_INSTRUCTION("6262FD4993AC9100040000" , k(k1).vgatherqpd(zmm29, zmmword_ptr(rcx, zmm2, 2, 1024)));
+ TEST_INSTRUCTION("62C27D499394E67B000000" , k(k1).vgatherqps(ymm18, ymmword_ptr(r14, zmm4, 3, 123)));
+ TEST_INSTRUCTION("62C27D4993542140" , k(k1).vgatherqps(ymm18, ymmword_ptr(r9, zmm4, 0, 256)));
+ TEST_INSTRUCTION("62E27D499394A100040000" , k(k1).vgatherqps(ymm18, ymmword_ptr(rcx, zmm4, 2, 1024)));
+ TEST_INSTRUCTION("62827D49908CDE7B000000" , k(k1).vpgatherdd(zmm17, zmmword_ptr(r14, zmm11, 3, 123)));
+ TEST_INSTRUCTION("62827D49904C1940" , k(k1).vpgatherdd(zmm17, zmmword_ptr(r9, zmm11, 0, 256)));
+ TEST_INSTRUCTION("62A27D49908C9900040000" , k(k1).vpgatherdd(zmm17, zmmword_ptr(rcx, zmm11, 2, 1024)));
+ TEST_INSTRUCTION("6212FD499084F67B000000" , k(k1).vpgatherdq(zmm8, zmmword_ptr(r14, ymm14, 3, 123)));
+ TEST_INSTRUCTION("6212FD4990443120" , k(k1).vpgatherdq(zmm8, zmmword_ptr(r9, ymm14, 0, 256)));
+ TEST_INSTRUCTION("6232FD499084B100040000" , k(k1).vpgatherdq(zmm8, zmmword_ptr(rcx, ymm14, 2, 1024)));
+ TEST_INSTRUCTION("62D27D41919CCE7B000000" , k(k1).vpgatherqd(ymm3, ymmword_ptr(r14, zmm17, 3, 123)));
+ TEST_INSTRUCTION("62D27D41915C0940" , k(k1).vpgatherqd(ymm3, ymmword_ptr(r9, zmm17, 0, 256)));
+ TEST_INSTRUCTION("62F27D41919C8900040000" , k(k1).vpgatherqd(ymm3, ymmword_ptr(rcx, zmm17, 2, 1024)));
+ TEST_INSTRUCTION("62C2FD41918CEE7B000000" , k(k1).vpgatherqq(zmm17, zmmword_ptr(r14, zmm21, 3, 123)));
+ TEST_INSTRUCTION("62C2FD41914C2920" , k(k1).vpgatherqq(zmm17, zmmword_ptr(r9, zmm21, 0, 256)));
+ TEST_INSTRUCTION("62E2FD41918CA900040000" , k(k1).vpgatherqq(zmm17, zmmword_ptr(rcx, zmm21, 2, 1024)));
+ TEST_INSTRUCTION("62C27D41A09CC67B000000" , k(k1).vpscatterdd(zmmword_ptr(r14, zmm16, 3, 123), zmm19));
+ TEST_INSTRUCTION("62C27D41A09CC67B000000" , k(k1).vpscatterdd(zmmword_ptr(r14, zmm16, 3, 123), zmm19));
+ TEST_INSTRUCTION("62C27D41A05C0140" , k(k1).vpscatterdd(zmmword_ptr(r9, zmm16, 0, 256), zmm19));
+ TEST_INSTRUCTION("62E27D41A09C8100040000" , k(k1).vpscatterdd(zmmword_ptr(rcx, zmm16, 2, 1024), zmm19));
+ TEST_INSTRUCTION("62D2FD49A0ACF67B000000" , k(k1).vpscatterdq(zmmword_ptr(r14, ymm6, 3, 123), zmm5));
+ TEST_INSTRUCTION("62D2FD49A0ACF67B000000" , k(k1).vpscatterdq(zmmword_ptr(r14, ymm6, 3, 123), zmm5));
+ TEST_INSTRUCTION("62D2FD49A06C3120" , k(k1).vpscatterdq(zmmword_ptr(r9, ymm6, 0, 256), zmm5));
+ TEST_INSTRUCTION("62F2FD49A0ACB100040000" , k(k1).vpscatterdq(zmmword_ptr(rcx, ymm6, 2, 1024), zmm5));
+ TEST_INSTRUCTION("62C27D49A1A4D67B000000" , k(k1).vpscatterqd(ymmword_ptr(r14, zmm2, 3, 123), ymm20));
+ TEST_INSTRUCTION("62C27D49A1A4D67B000000" , k(k1).vpscatterqd(ymmword_ptr(r14, zmm2, 3, 123), ymm20));
+ TEST_INSTRUCTION("62C27D49A1641140" , k(k1).vpscatterqd(ymmword_ptr(r9, zmm2, 0, 256), ymm20));
+ TEST_INSTRUCTION("62E27D49A1A49100040000" , k(k1).vpscatterqd(ymmword_ptr(rcx, zmm2, 2, 1024), ymm20));
+ TEST_INSTRUCTION("6252FD41A1B4E67B000000" , k(k1).vpscatterqq(zmmword_ptr(r14, zmm20, 3, 123), zmm14));
+ TEST_INSTRUCTION("6252FD41A1B4E67B000000" , k(k1).vpscatterqq(zmmword_ptr(r14, zmm20, 3, 123), zmm14));
+ TEST_INSTRUCTION("6252FD41A1742120" , k(k1).vpscatterqq(zmmword_ptr(r9, zmm20, 0, 256), zmm14));
+ TEST_INSTRUCTION("6272FD41A1B4A100040000" , k(k1).vpscatterqq(zmmword_ptr(rcx, zmm20, 2, 1024), zmm14));
+ TEST_INSTRUCTION("6282FD41A294C67B000000" , k(k1).vscatterdpd(zmmword_ptr(r14, ymm24, 3, 123), zmm18));
+ TEST_INSTRUCTION("6282FD41A294C67B000000" , k(k1).vscatterdpd(zmmword_ptr(r14, ymm24, 3, 123), zmm18));
+ TEST_INSTRUCTION("6282FD41A2540120" , k(k1).vscatterdpd(zmmword_ptr(r9, ymm24, 0, 256), zmm18));
+ TEST_INSTRUCTION("62A2FD41A2948100040000" , k(k1).vscatterdpd(zmmword_ptr(rcx, ymm24, 2, 1024), zmm18));
+ TEST_INSTRUCTION("62C27D41A28CDE7B000000" , k(k1).vscatterdps(zmmword_ptr(r14, zmm19, 3, 123), zmm17));
+ TEST_INSTRUCTION("62C27D41A28CDE7B000000" , k(k1).vscatterdps(zmmword_ptr(r14, zmm19, 3, 123), zmm17));
+ TEST_INSTRUCTION("62C27D41A24C1940" , k(k1).vscatterdps(zmmword_ptr(r9, zmm19, 0, 256), zmm17));
+ TEST_INSTRUCTION("62E27D41A28C9900040000" , k(k1).vscatterdps(zmmword_ptr(rcx, zmm19, 2, 1024), zmm17));
+ TEST_INSTRUCTION("6282FD41A3B4E67B000000" , k(k1).vscatterqpd(zmmword_ptr(r14, zmm28, 3, 123), zmm22));
+ TEST_INSTRUCTION("6282FD41A3B4E67B000000" , k(k1).vscatterqpd(zmmword_ptr(r14, zmm28, 3, 123), zmm22));
+ TEST_INSTRUCTION("6282FD41A3742120" , k(k1).vscatterqpd(zmmword_ptr(r9, zmm28, 0, 256), zmm22));
+ TEST_INSTRUCTION("62A2FD41A3B4A100040000" , k(k1).vscatterqpd(zmmword_ptr(rcx, zmm28, 2, 1024), zmm22));
+ TEST_INSTRUCTION("62927D41A3B4DE7B000000" , k(k1).vscatterqps(ymmword_ptr(r14, zmm27, 3, 123), ymm6));
+ TEST_INSTRUCTION("62927D41A3B4DE7B000000" , k(k1).vscatterqps(ymmword_ptr(r14, zmm27, 3, 123), ymm6));
+ TEST_INSTRUCTION("62927D41A3741940" , k(k1).vscatterqps(ymmword_ptr(r9, zmm27, 0, 256), ymm6));
+ TEST_INSTRUCTION("62B27D41A3B49900040000" , k(k1).vscatterqps(ymmword_ptr(rcx, zmm27, 2, 1024), ymm6));
+ TEST_INSTRUCTION("6282FD41A294DE85FFFFFF" , k(k1).vscatterdpd(zmmword_ptr(r14, ymm27, 3, -123), zmm18));
+ TEST_INSTRUCTION("6282FD41A294DE85FFFFFF" , k(k1).vscatterdpd(zmmword_ptr(r14, ymm27, 3, -123), zmm18));
+ TEST_INSTRUCTION("6282FD41A2541920" , k(k1).vscatterdpd(zmmword_ptr(r9, ymm27, 0, 256), zmm18));
+ TEST_INSTRUCTION("62A2FD41A2949900040000" , k(k1).vscatterdpd(zmmword_ptr(rcx, ymm27, 2, 1024), zmm18));
+ TEST_INSTRUCTION("62D27D41A28CCE85FFFFFF" , k(k1).vscatterdps(zmmword_ptr(r14, zmm17, 3, -123), zmm1));
+ TEST_INSTRUCTION("62D27D41A28CCE85FFFFFF" , k(k1).vscatterdps(zmmword_ptr(r14, zmm17, 3, -123), zmm1));
+ TEST_INSTRUCTION("62D27D41A24C0940" , k(k1).vscatterdps(zmmword_ptr(r9, zmm17, 0, 256), zmm1));
+ TEST_INSTRUCTION("62F27D41A28C8900040000" , k(k1).vscatterdps(zmmword_ptr(rcx, zmm17, 2, 1024), zmm1));
+ TEST_INSTRUCTION("6212FD41A384CE85FFFFFF" , k(k1).vscatterqpd(zmmword_ptr(r14, zmm25, 3, -123), zmm8));
+ TEST_INSTRUCTION("6212FD41A384CE85FFFFFF" , k(k1).vscatterqpd(zmmword_ptr(r14, zmm25, 3, -123), zmm8));
+ TEST_INSTRUCTION("6212FD41A3440920" , k(k1).vscatterqpd(zmmword_ptr(r9, zmm25, 0, 256), zmm8));
+ TEST_INSTRUCTION("6232FD41A3848900040000" , k(k1).vscatterqpd(zmmword_ptr(rcx, zmm25, 2, 1024), zmm8));
+ TEST_INSTRUCTION("62127D49A3ACD685FFFFFF" , k(k1).vscatterqps(ymmword_ptr(r14, zmm10, 3, -123), ymm13));
+ TEST_INSTRUCTION("62127D49A3ACD685FFFFFF" , k(k1).vscatterqps(ymmword_ptr(r14, zmm10, 3, -123), ymm13));
+ TEST_INSTRUCTION("62127D49A36C1140" , k(k1).vscatterqps(ymmword_ptr(r9, zmm10, 0, 256), ymm13));
+ TEST_INSTRUCTION("62327D49A3AC9100040000" , k(k1).vscatterqps(ymmword_ptr(rcx, zmm10, 2, 1024), ymm13));
+ TEST_INSTRUCTION("6242FD4992B4EE85FFFFFF" , k(k1).vgatherdpd(zmm30, zmmword_ptr(r14, ymm5, 3, -123)));
+ TEST_INSTRUCTION("6242FD4992742920" , k(k1).vgatherdpd(zmm30, zmmword_ptr(r9, ymm5, 0, 256)));
+ TEST_INSTRUCTION("6262FD4992B4A900040000" , k(k1).vgatherdpd(zmm30, zmmword_ptr(rcx, ymm5, 2, 1024)));
+ TEST_INSTRUCTION("62127D419284D685FFFFFF" , k(k1).vgatherdps(zmm8, zmmword_ptr(r14, zmm26, 3, -123)));
+ TEST_INSTRUCTION("62127D4192441140" , k(k1).vgatherdps(zmm8, zmmword_ptr(r9, zmm26, 0, 256)));
+ TEST_INSTRUCTION("62327D4192849100040000" , k(k1).vgatherdps(zmm8, zmmword_ptr(rcx, zmm26, 2, 1024)));
+ TEST_INSTRUCTION("6202FD49939CEE85FFFFFF" , k(k1).vgatherqpd(zmm27, zmmword_ptr(r14, zmm13, 3, -123)));
+ TEST_INSTRUCTION("6202FD49935C2920" , k(k1).vgatherqpd(zmm27, zmmword_ptr(r9, zmm13, 0, 256)));
+ TEST_INSTRUCTION("6222FD49939CA900040000" , k(k1).vgatherqpd(zmm27, zmmword_ptr(rcx, zmm13, 2, 1024)));
+ TEST_INSTRUCTION("62027D49939CF685FFFFFF" , k(k1).vgatherqps(ymm27, ymmword_ptr(r14, zmm14, 3, -123)));
+ TEST_INSTRUCTION("62027D49935C3140" , k(k1).vgatherqps(ymm27, ymmword_ptr(r9, zmm14, 0, 256)));
+ TEST_INSTRUCTION("62227D49939CB100040000" , k(k1).vgatherqps(ymm27, ymmword_ptr(rcx, zmm14, 2, 1024)));
+ TEST_INSTRUCTION("62D27D4190BCC685FFFFFF" , k(k1).vpgatherdd(zmm7, zmmword_ptr(r14, zmm16, 3, -123)));
+ TEST_INSTRUCTION("62D27D41907C0140" , k(k1).vpgatherdd(zmm7, zmmword_ptr(r9, zmm16, 0, 256)));
+ TEST_INSTRUCTION("62F27D4190BC8100040000" , k(k1).vpgatherdd(zmm7, zmmword_ptr(rcx, zmm16, 2, 1024)));
+ TEST_INSTRUCTION("6242FD49908CFE85FFFFFF" , k(k1).vpgatherdq(zmm25, zmmword_ptr(r14, ymm7, 3, -123)));
+ TEST_INSTRUCTION("6242FD49904C3920" , k(k1).vpgatherdq(zmm25, zmmword_ptr(r9, ymm7, 0, 256)));
+ TEST_INSTRUCTION("6262FD49908CB900040000" , k(k1).vpgatherdq(zmm25, zmmword_ptr(rcx, ymm7, 2, 1024)));
+ TEST_INSTRUCTION("62C27D41919CCE85FFFFFF" , k(k1).vpgatherqd(ymm19, ymmword_ptr(r14, zmm17, 3, -123)));
+ TEST_INSTRUCTION("62C27D41915C0940" , k(k1).vpgatherqd(ymm19, ymmword_ptr(r9, zmm17, 0, 256)));
+ TEST_INSTRUCTION("62E27D41919C8900040000" , k(k1).vpgatherqd(ymm19, ymmword_ptr(rcx, zmm17, 2, 1024)));
+ TEST_INSTRUCTION("6212FD499194EE85FFFFFF" , k(k1).vpgatherqq(zmm10, zmmword_ptr(r14, zmm13, 3, -123)));
+ TEST_INSTRUCTION("6212FD4991542920" , k(k1).vpgatherqq(zmm10, zmmword_ptr(r9, zmm13, 0, 256)));
+ TEST_INSTRUCTION("6232FD499194A900040000" , k(k1).vpgatherqq(zmm10, zmmword_ptr(rcx, zmm13, 2, 1024)));
+ TEST_INSTRUCTION("62C27D49A0BCE685FFFFFF" , k(k1).vpscatterdd(zmmword_ptr(r14, zmm4, 3, -123), zmm23));
+ TEST_INSTRUCTION("62C27D49A0BCE685FFFFFF" , k(k1).vpscatterdd(zmmword_ptr(r14, zmm4, 3, -123), zmm23));
+ TEST_INSTRUCTION("62C27D49A07C2140" , k(k1).vpscatterdd(zmmword_ptr(r9, zmm4, 0, 256), zmm23));
+ TEST_INSTRUCTION("62E27D49A0BCA100040000" , k(k1).vpscatterdd(zmmword_ptr(rcx, zmm4, 2, 1024), zmm23));
+ TEST_INSTRUCTION("6292FD41A08CCE85FFFFFF" , k(k1).vpscatterdq(zmmword_ptr(r14, ymm25, 3, -123), zmm1));
+ TEST_INSTRUCTION("6292FD41A08CCE85FFFFFF" , k(k1).vpscatterdq(zmmword_ptr(r14, ymm25, 3, -123), zmm1));
+ TEST_INSTRUCTION("6292FD41A04C0920" , k(k1).vpscatterdq(zmmword_ptr(r9, ymm25, 0, 256), zmm1));
+ TEST_INSTRUCTION("62B2FD41A08C8900040000" , k(k1).vpscatterdq(zmmword_ptr(rcx, ymm25, 2, 1024), zmm1));
+ TEST_INSTRUCTION("62C27D41A1BCF685FFFFFF" , k(k1).vpscatterqd(ymmword_ptr(r14, zmm22, 3, -123), ymm23));
+ TEST_INSTRUCTION("62C27D41A1BCF685FFFFFF" , k(k1).vpscatterqd(ymmword_ptr(r14, zmm22, 3, -123), ymm23));
+ TEST_INSTRUCTION("62C27D41A17C3140" , k(k1).vpscatterqd(ymmword_ptr(r9, zmm22, 0, 256), ymm23));
+ TEST_INSTRUCTION("62E27D41A1BCB100040000" , k(k1).vpscatterqd(ymmword_ptr(rcx, zmm22, 2, 1024), ymm23));
+ TEST_INSTRUCTION("6292FD49A194C685FFFFFF" , k(k1).vpscatterqq(zmmword_ptr(r14, zmm8, 3, -123), zmm2));
+ TEST_INSTRUCTION("6292FD49A194C685FFFFFF" , k(k1).vpscatterqq(zmmword_ptr(r14, zmm8, 3, -123), zmm2));
+ TEST_INSTRUCTION("6292FD49A1540120" , k(k1).vpscatterqq(zmmword_ptr(r9, zmm8, 0, 256), zmm2));
+ TEST_INSTRUCTION("62B2FD49A1948100040000" , k(k1).vpscatterqq(zmmword_ptr(rcx, zmm8, 2, 1024), zmm2));
+
+}
+
+static void ASMJIT_NOINLINE testX64AssemblerAMX(AssemblerTester<x86::Assembler>& tester) noexcept {
+ using namespace x86;
+
+ TEST_INSTRUCTION("C4E27849841180000000" , ldtilecfg(ptr(rcx, rdx, 0, 128)));
+ TEST_INSTRUCTION("C4E27849841180000000" , ldtilecfg(zmmword_ptr(rcx, rdx, 0, 128)));
+ TEST_INSTRUCTION("C4E27949841180000000" , sttilecfg(ptr(rcx, rdx, 0, 128)));
+ TEST_INSTRUCTION("C4E27949841180000000" , sttilecfg(zmmword_ptr(rcx, rdx, 0, 128)));
+ TEST_INSTRUCTION("C4E2625CCA" , tdpbf16ps(tmm1, tmm2, tmm3));
+ TEST_INSTRUCTION("C4E2635ECA" , tdpbssd(tmm1, tmm2, tmm3));
+ TEST_INSTRUCTION("C4E2625ECA" , tdpbsud(tmm1, tmm2, tmm3));
+ TEST_INSTRUCTION("C4E2615ECA" , tdpbusd(tmm1, tmm2, tmm3));
+ TEST_INSTRUCTION("C4E2605ECA" , tdpbuud(tmm1, tmm2, tmm3));
+ TEST_INSTRUCTION("C4E27B4B8C1A80000000" , tileloadd(tmm1, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("C4E2794B8C1A80000000" , tileloaddt1(tmm1, ptr(rdx, rbx, 0, 128)));
+ TEST_INSTRUCTION("C4E27849C0" , tilerelease());
+ TEST_INSTRUCTION("C4E27A4B9C1180000000" , tilestored(ptr(rcx, rdx, 0, 128), tmm3));
+ TEST_INSTRUCTION("C4E27B49C8" , tilezero(tmm1));
+}
+
+static void ASMJIT_NOINLINE testX64AssemblerExtras(AssemblerTester<x86::Assembler>& tester) noexcept {
+ using namespace x86;
+
+ // Extended X64 tests.
+ TEST_INSTRUCTION("01CB" , add(ebx, ecx));
+ TEST_INSTRUCTION("83C001" , add(eax, 1));
+ TEST_INSTRUCTION("0504030201" , add(eax, 0x01020304));
+ TEST_INSTRUCTION("66050201" , add(ax, 0x0102));
+ TEST_INSTRUCTION("6603849004030201" , add(ax, ptr(rax, rdx, 2, 0x01020304)));
+ TEST_INSTRUCTION("8D042500000000" , lea(eax, ptr(0)));
+ TEST_INSTRUCTION("488D042500000000" , lea(rax, ptr(0)));
+ TEST_INSTRUCTION("488D0433" , lea(rax, ptr(rbx, rsi)));
+ TEST_INSTRUCTION("488D043B" , lea(rax, ptr(rbx, rdi)));
+ TEST_INSTRUCTION("488D840000400000" , lea(rax, ptr(rax, rax, 0, 0x4000)));
+ TEST_INSTRUCTION("48BB8877665544332211" , mov(rbx, 0x001122334455667788));
+ TEST_INSTRUCTION("48BB0000000000000000" , long_().mov(rbx, 0));
+ TEST_INSTRUCTION("B8E8030000" , mov(eax, 1000));
+ TEST_INSTRUCTION("0F20C0" , mov(rax, cr0));
+ TEST_INSTRUCTION("440F20C0" , mov(rax, cr8));
+ TEST_INSTRUCTION("488B0500000000" , mov(rax, ptr(rip)));
+ TEST_INSTRUCTION("4A8B0460" , mov(rax, ptr(rax, r12, 1)));
+ TEST_INSTRUCTION("4A8B0468" , mov(rax, ptr(rax, r13, 1)));
+ TEST_INSTRUCTION("4A8B846000010000" , mov(rax, ptr(rax, r12, 1, 256)));
+ TEST_INSTRUCTION("89042544332211" , mov(ptr_abs(0x11223344), eax));
+ TEST_INSTRUCTION("891C2544332211" , mov(ptr_abs(0x11223344), ebx));
+ TEST_INSTRUCTION("A38877665544332211" , mov(ptr_abs(0x1122334455667788), eax));
+ TEST_INSTRUCTION("A34433221100000000" , movabs(ptr(0x0000000011223344), eax));
+ TEST_INSTRUCTION("A38877665544332211" , movabs(ptr(0x1122334455667788), eax));
+ TEST_INSTRUCTION("48A1EFCDAB8967452301" , movabs(rax, ptr(0x123456789ABCDEF)));
+ TEST_INSTRUCTION("0FBE07" , movsx(eax, byte_ptr(rdi)));
+ TEST_INSTRUCTION("480FBE07" , movsx(rax, byte_ptr(rdi)));
+ TEST_INSTRUCTION("0FBF07" , movsx(eax, word_ptr(rdi)));
+ TEST_INSTRUCTION("480FBF07" , movsx(rax, word_ptr(rdi)));
+ TEST_INSTRUCTION("486307" , movsxd(rax, ptr(rdi)));
+ TEST_INSTRUCTION("486307" , movsxd(rax, dword_ptr(rdi)));
+ TEST_INSTRUCTION("6663C3" , movsxd(ax, bx));
+ TEST_INSTRUCTION("63C3" , movsxd(eax, ebx));
+ TEST_INSTRUCTION("4863C3" , movsxd(rax, ebx));
+ TEST_INSTRUCTION("0FB6C6" , movzx(eax, dh));
+ TEST_INSTRUCTION("0FB607" , movzx(eax, byte_ptr(rdi)));
+ TEST_INSTRUCTION("480FB607" , movzx(rax, byte_ptr(rdi)));
+ TEST_INSTRUCTION("440FB6FA" , movzx(r15d, dl));
+ TEST_INSTRUCTION("440FB6FD" , movzx(r15d, bpl));
+ TEST_INSTRUCTION("0FB707" , movzx(eax, word_ptr(rdi)));
+ TEST_INSTRUCTION("480FB707" , movzx(rax, word_ptr(rdi)));
+ TEST_INSTRUCTION("411351FD" , adc(edx, dword_ptr(r9, -3)));
+ TEST_INSTRUCTION("F6D8" , neg(al));
+ TEST_INSTRUCTION("F6DC" , neg(ah));
+ TEST_INSTRUCTION("40F6DE" , neg(sil));
+ TEST_INSTRUCTION("F7D8" , neg(eax));
+ TEST_INSTRUCTION("F7D0" , not_(eax));
+ TEST_INSTRUCTION("0F95C3" , setnz(bl));
+ TEST_INSTRUCTION("0F94C7" , setz(bh));
+ TEST_INSTRUCTION("400F94C0" , rex().setz(al));
+ TEST_INSTRUCTION("410F94C7" , setz(r15b));
+ TEST_INSTRUCTION("F600FF" , test(byte_ptr(rax), 0xFF));
+ TEST_INSTRUCTION("66F700FF00" , test(word_ptr(rax), 0xFF));
+ TEST_INSTRUCTION("F700FF000000" , test(dword_ptr(rax), 0xFF));
+ TEST_INSTRUCTION("48F700FF000000" , test(qword_ptr(rax), 0xFF));
+ TEST_INSTRUCTION("A836" , test(al, 0x36));
+ TEST_INSTRUCTION("F6C436" , test(ah, 0x36));
+ TEST_INSTRUCTION("50" , push(rax));
+ TEST_INSTRUCTION("51" , push(rcx));
+ TEST_INSTRUCTION("52" , push(rdx));
+ TEST_INSTRUCTION("53" , push(rbx));
+ TEST_INSTRUCTION("54" , push(rsp));
+ TEST_INSTRUCTION("55" , push(rbp));
+ TEST_INSTRUCTION("56" , push(rsi));
+ TEST_INSTRUCTION("57" , push(rdi));
+ TEST_INSTRUCTION("4150" , push(r8));
+ TEST_INSTRUCTION("4151" , push(r9));
+ TEST_INSTRUCTION("4152" , push(r10));
+ TEST_INSTRUCTION("4153" , push(r11));
+ TEST_INSTRUCTION("4154" , push(r12));
+ TEST_INSTRUCTION("4155" , push(r13));
+ TEST_INSTRUCTION("4156" , push(r14));
+ TEST_INSTRUCTION("4157" , push(r15));
+ TEST_INSTRUCTION("0FA0" , push(fs));
+ TEST_INSTRUCTION("0FA8" , push(gs));
+ TEST_INSTRUCTION("400FA0" , rex().push(fs));
+ TEST_INSTRUCTION("400FA8" , rex().push(gs));
+ TEST_INSTRUCTION("C8010002" , enter(1, 2));
+ TEST_INSTRUCTION("40C8010002" , rex().enter(1, 2));
+ TEST_INSTRUCTION("FF10" , call(ptr(rax)));
+ TEST_INSTRUCTION("FF10" , call(qword_ptr(rax)));
+ TEST_INSTRUCTION("6690" , xchg(ax, ax));
+ TEST_INSTRUCTION("87C0" , xchg(eax, eax));
+ TEST_INSTRUCTION("90" , xchg(rax, rax));
+ TEST_INSTRUCTION("40863424" , xchg(ptr(rsp), sil));
+ TEST_INSTRUCTION("40863C24" , xchg(ptr(rsp), dil));
+
+ TEST_INSTRUCTION("F00118" , lock().add(ptr(rax), ebx));
+ TEST_INSTRUCTION("F0480FC138" , lock().xadd(ptr(rax), rdi));
+ TEST_INSTRUCTION("F2F0480108" , xacquire().lock().add(qword_ptr(rax), rcx));
+ TEST_INSTRUCTION("F3F0480108" , xrelease().lock().add(qword_ptr(rax), rcx));
+
+ // MOD RM & MR tests.
+ TEST_INSTRUCTION("01CB" , mod_mr().add(ebx, ecx));
+ TEST_INSTRUCTION("03D9" , mod_rm().add(ebx, ecx));
+ TEST_INSTRUCTION("88C4" , mod_mr().mov(ah, al));
+ TEST_INSTRUCTION("88C6" , mod_mr().mov(dh, al));
+ TEST_INSTRUCTION("89D8" , mod_mr().mov(eax, ebx));
+ TEST_INSTRUCTION("8AE0" , mod_rm().mov(ah, al));
+ TEST_INSTRUCTION("8AF0" , mod_rm().mov(dh, al));
+ TEST_INSTRUCTION("8BC3" , mod_rm().mov(eax, ebx));
+
+ // HRESET.
+ TEST_INSTRUCTION("F30F3AF0C001" , hreset(1));
+
+ // FPU.
+ TEST_INSTRUCTION("9B" , fwait());
+ TEST_INSTRUCTION("D800" , fadd(dword_ptr(rax)));
+ TEST_INSTRUCTION("DC00" , fadd(qword_ptr(rax)));
+
+ // AVX & AVX512.
+ TEST_INSTRUCTION("62F17D086EC0" , evex().vmovd(xmm0, eax));
+ TEST_INSTRUCTION("62F1FD086EC0" , evex().vmovq(xmm0, rax));
+ TEST_INSTRUCTION("62F17D087EC0" , evex().vmovd(eax, xmm0));
+ TEST_INSTRUCTION("62F1FD087EC0" , evex().vmovq(rax, xmm0));
+ TEST_INSTRUCTION("6271B5D95808" , k(k1).z().vaddpd(zmm9, zmm9, ptr(rax)._1to8()));
+ TEST_INSTRUCTION("62F1748858C2" , z().vaddps(xmm0, xmm1, xmm2));
+ TEST_INSTRUCTION("6201951058F4" , rn_sae().vaddpd(zmm30, zmm29, zmm28));
+ TEST_INSTRUCTION("6201953058F4" , rd_sae().vaddpd(zmm30, zmm29, zmm28));
+ TEST_INSTRUCTION("6201955058F4" , ru_sae().vaddpd(zmm30, zmm29, zmm28));
+ TEST_INSTRUCTION("6201957058F4" , rz_sae().vaddpd(zmm30, zmm29, zmm28));
+ TEST_INSTRUCTION("62F16C4FC25498040F" , k(k7).vcmpps(k2, zmm2, zmmword_ptr(rax, rbx, 2, 256), 15));
+ TEST_INSTRUCTION("62F16C1FC25498400F" , k(k7).vcmpps(k2, xmm2, dword_ptr(rax, rbx, 2, 256)._1to4(), 15));
+ TEST_INSTRUCTION("62F16C3FC25498400F" , k(k7).vcmpps(k2, ymm2, dword_ptr(rax, rbx, 2, 256)._1to8(), 15));
+ TEST_INSTRUCTION("62F16C5FC25498400F" , k(k7).vcmpps(k2, zmm2, dword_ptr(rax, rbx, 2, 256)._1to16(), 15));
+ TEST_INSTRUCTION("62F1FD18C2C100" , sae().vcmppd(k0, zmm0, zmm1, 0x00));
+ TEST_INSTRUCTION("6201FD182EF5" , sae().vucomisd(xmm30, xmm29));
+ TEST_INSTRUCTION("62017C182EF5" , sae().vucomiss(xmm30, xmm29));
+ TEST_INSTRUCTION("C4E2FD91040500000000" , vpgatherqq(ymm0, ptr(0, ymm0), ymm0));
+ TEST_INSTRUCTION("C4E2E9920C00" , vgatherdpd(xmm1, ptr(rax, xmm0), xmm2));
+ TEST_INSTRUCTION("C4E26990440D00" , vpgatherdd(xmm0, ptr(rbp, xmm1), xmm2));
+ TEST_INSTRUCTION("C4C26990040C" , vpgatherdd(xmm0, ptr(r12, xmm1), xmm2));
+ TEST_INSTRUCTION("C4C26990440D00" , vpgatherdd(xmm0, ptr(r13, xmm1), xmm2));
+ TEST_INSTRUCTION("62F26D48CF4C1101" , vgf2p8mulb(zmm1, zmm2, zmmword_ptr(rcx, rdx, 0, 64)));
+ TEST_INSTRUCTION("62F3ED48CE4C11010F" , vgf2p8affineqb(zmm1, zmm2, zmmword_ptr(rcx, rdx, 0, 64), 15));
+ TEST_INSTRUCTION("62F3ED48CF4C11010F" , vgf2p8affineinvqb(zmm1, zmm2, zmmword_ptr(rcx, rdx, 0, 64), 15));
+ TEST_INSTRUCTION("6292472068F0" , vp2intersectd(k6, k7, ymm23, ymm24));
+ TEST_INSTRUCTION("62B2472068B4F500000010" , vp2intersectd(k6, k7, ymm23, ptr(rbp, r14, 3, 268435456)));
+ TEST_INSTRUCTION("62F24730683500000000" , vp2intersectd(k6, k7, ymm23, dword_ptr(rip)._1to8()));
+ TEST_INSTRUCTION("62F2472068742DE0" , vp2intersectd(k6, k7, ymm23, ymmword_ptr(rbp, rbp, 0, -1024)));
+ TEST_INSTRUCTION("62F2472068717F" , vp2intersectd(k6, k7, ymm23, ymmword_ptr(rcx, 4064)));
+
+ // AVX_VNNI & AVX512_VNNI.
+ TEST_INSTRUCTION("C4E25550F4" , vex().vpdpbusd(ymm6, ymm5, ymm4));
+ TEST_INSTRUCTION("62F2552850F4" , vpdpbusd(ymm6, ymm5, ymm4));
+
+ // SVM.
+ TEST_INSTRUCTION("670F01DF" , invlpga(eax, ecx));
+ TEST_INSTRUCTION("0F01DF" , invlpga(rax, ecx));
+}
+
+bool testX64Assembler(const TestSettings& settings) noexcept {
+ using namespace x86;
+
+ AssemblerTester<Assembler> tester(Arch::kX64, settings);
+ tester.printHeader("X64");
+
+ TEST_INSTRUCTION("62919D18C2D2AB" , sae().vcmppd(k2, zmm12, zmm26, 171));
+
+ testX64AssemblerBase(tester);
+ testX64AssemblerMMX_SSE(tester);
+ testX64AssemblerAVX(tester);
+ testX64AssemblerAVX512_FP16(tester);
+ testX64AssemblerAVX512_LLVM(tester);
+ testX64AssemblerAMX(tester);
+ testX64AssemblerExtras(tester);
+
+ tester.printSummary();
+ return tester.didPass();
+}
+
+#undef TEST_INSTRUCTION
+
+#endif // !ASMJIT_NO_X86
diff --git a/3rdparty/asmjit/test/asmjit_test_assembler_x86.cpp b/3rdparty/asmjit/test/asmjit_test_assembler_x86.cpp
new file mode 100644
index 00000000000..a5ea03ae525
--- /dev/null
+++ b/3rdparty/asmjit/test/asmjit_test_assembler_x86.cpp
@@ -0,0 +1,8300 @@
+// This file is part of AsmJit project <https://asmjit.com>
+//
+// See asmjit.h or LICENSE.md for license and copyright information
+// SPDX-License-Identifier: Zlib
+
+#include <asmjit/core.h>
+#if !defined(ASMJIT_NO_X86)
+
+#include <asmjit/x86.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include "asmjit_test_assembler.h"
+#include "cmdline.h"
+
+using namespace asmjit;
+
+#define TEST_INSTRUCTION(OPCODE, ...) \
+ tester.testInstruction(OPCODE, #__VA_ARGS__, tester.assembler.__VA_ARGS__)
+
+static void ASMJIT_NOINLINE testX86AssemblerBase(AssemblerTester<x86::Assembler>& tester) noexcept {
+ using namespace x86;
+
+ TEST_INSTRUCTION("37" , aaa(ax));
+ TEST_INSTRUCTION("D501" , aad(ax, 1));
+ TEST_INSTRUCTION("D401" , aam(ax, 1));
+ TEST_INSTRUCTION("3F" , aas(ax));
+ TEST_INSTRUCTION("80D101" , adc(cl, 1));
+ TEST_INSTRUCTION("80D501" , adc(ch, 1));
+ TEST_INSTRUCTION("8094118000000001" , adc(byte_ptr(ecx, edx, 0, 128), 1));
+ TEST_INSTRUCTION("6683D101" , adc(cx, 1));
+ TEST_INSTRUCTION("668394118000000001" , adc(word_ptr(ecx, edx, 0, 128), 1));
+ TEST_INSTRUCTION("83D101" , adc(ecx, 1));
+ TEST_INSTRUCTION("8394118000000001" , adc(dword_ptr(ecx, edx, 0, 128), 1));
+ TEST_INSTRUCTION("10D1" , adc(cl, dl));
+ TEST_INSTRUCTION("10F1" , adc(cl, dh));
+ TEST_INSTRUCTION("10D5" , adc(ch, dl));
+ TEST_INSTRUCTION("10F5" , adc(ch, dh));
+ TEST_INSTRUCTION("109C1180000000" , adc(ptr(ecx, edx, 0, 128), bl));
+ TEST_INSTRUCTION("10BC1180000000" , adc(ptr(ecx, edx, 0, 128), bh));
+ TEST_INSTRUCTION("109C1180000000" , adc(byte_ptr(ecx, edx, 0, 128), bl));
+ TEST_INSTRUCTION("10BC1180000000" , adc(byte_ptr(ecx, edx, 0, 128), bh));
+ TEST_INSTRUCTION("6611D1" , adc(cx, dx));
+ TEST_INSTRUCTION("66119C1180000000" , adc(ptr(ecx, edx, 0, 128), bx));
+ TEST_INSTRUCTION("66119C1180000000" , adc(word_ptr(ecx, edx, 0, 128), bx));
+ TEST_INSTRUCTION("11D1" , adc(ecx, edx));
+ TEST_INSTRUCTION("119C1180000000" , adc(ptr(ecx, edx, 0, 128), ebx));
+ TEST_INSTRUCTION("119C1180000000" , adc(dword_ptr(ecx, edx, 0, 128), ebx));
+ TEST_INSTRUCTION("128C1A80000000" , adc(cl, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("128C1A80000000" , adc(cl, byte_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("12AC1A80000000" , adc(ch, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("12AC1A80000000" , adc(ch, byte_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("66138C1A80000000" , adc(cx, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("66138C1A80000000" , adc(cx, word_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("138C1A80000000" , adc(ecx, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("138C1A80000000" , adc(ecx, dword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("660F38F6CA" , adcx(ecx, edx));
+ TEST_INSTRUCTION("660F38F68C1A80000000" , adcx(ecx, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("660F38F68C1A80000000" , adcx(ecx, dword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("80C101" , add(cl, 1));
+ TEST_INSTRUCTION("80C501" , add(ch, 1));
+ TEST_INSTRUCTION("8084118000000001" , add(byte_ptr(ecx, edx, 0, 128), 1));
+ TEST_INSTRUCTION("6683C101" , add(cx, 1));
+ TEST_INSTRUCTION("668384118000000001" , add(word_ptr(ecx, edx, 0, 128), 1));
+ TEST_INSTRUCTION("83C101" , add(ecx, 1));
+ TEST_INSTRUCTION("8384118000000001" , add(dword_ptr(ecx, edx, 0, 128), 1));
+ TEST_INSTRUCTION("00D1" , add(cl, dl));
+ TEST_INSTRUCTION("00F1" , add(cl, dh));
+ TEST_INSTRUCTION("00D5" , add(ch, dl));
+ TEST_INSTRUCTION("00F5" , add(ch, dh));
+ TEST_INSTRUCTION("009C1180000000" , add(ptr(ecx, edx, 0, 128), bl));
+ TEST_INSTRUCTION("00BC1180000000" , add(ptr(ecx, edx, 0, 128), bh));
+ TEST_INSTRUCTION("009C1180000000" , add(byte_ptr(ecx, edx, 0, 128), bl));
+ TEST_INSTRUCTION("00BC1180000000" , add(byte_ptr(ecx, edx, 0, 128), bh));
+ TEST_INSTRUCTION("6601D1" , add(cx, dx));
+ TEST_INSTRUCTION("66019C1180000000" , add(ptr(ecx, edx, 0, 128), bx));
+ TEST_INSTRUCTION("66019C1180000000" , add(word_ptr(ecx, edx, 0, 128), bx));
+ TEST_INSTRUCTION("01D1" , add(ecx, edx));
+ TEST_INSTRUCTION("019C1180000000" , add(ptr(ecx, edx, 0, 128), ebx));
+ TEST_INSTRUCTION("019C1180000000" , add(dword_ptr(ecx, edx, 0, 128), ebx));
+ TEST_INSTRUCTION("028C1A80000000" , add(cl, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("028C1A80000000" , add(cl, byte_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("02AC1A80000000" , add(ch, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("02AC1A80000000" , add(ch, byte_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("66038C1A80000000" , add(cx, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("66038C1A80000000" , add(cx, word_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("038C1A80000000" , add(ecx, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("038C1A80000000" , add(ecx, dword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("80E101" , and_(cl, 1));
+ TEST_INSTRUCTION("80E501" , and_(ch, 1));
+ TEST_INSTRUCTION("6683E101" , and_(cx, 1));
+ TEST_INSTRUCTION("83E101" , and_(ecx, 1));
+ TEST_INSTRUCTION("80A4118000000001" , and_(byte_ptr(ecx, edx, 0, 128), 1));
+ TEST_INSTRUCTION("6683A4118000000001" , and_(word_ptr(ecx, edx, 0, 128), 1));
+ TEST_INSTRUCTION("83A4118000000001" , and_(dword_ptr(ecx, edx, 0, 128), 1));
+ TEST_INSTRUCTION("20D1" , and_(cl, dl));
+ TEST_INSTRUCTION("20F1" , and_(cl, dh));
+ TEST_INSTRUCTION("20D5" , and_(ch, dl));
+ TEST_INSTRUCTION("20F5" , and_(ch, dh));
+ TEST_INSTRUCTION("209C1180000000" , and_(ptr(ecx, edx, 0, 128), bl));
+ TEST_INSTRUCTION("20BC1180000000" , and_(ptr(ecx, edx, 0, 128), bh));
+ TEST_INSTRUCTION("209C1180000000" , and_(byte_ptr(ecx, edx, 0, 128), bl));
+ TEST_INSTRUCTION("20BC1180000000" , and_(byte_ptr(ecx, edx, 0, 128), bh));
+ TEST_INSTRUCTION("6621D1" , and_(cx, dx));
+ TEST_INSTRUCTION("66219C1180000000" , and_(ptr(ecx, edx, 0, 128), bx));
+ TEST_INSTRUCTION("66219C1180000000" , and_(word_ptr(ecx, edx, 0, 128), bx));
+ TEST_INSTRUCTION("21D1" , and_(ecx, edx));
+ TEST_INSTRUCTION("219C1180000000" , and_(ptr(ecx, edx, 0, 128), ebx));
+ TEST_INSTRUCTION("219C1180000000" , and_(dword_ptr(ecx, edx, 0, 128), ebx));
+ TEST_INSTRUCTION("228C1A80000000" , and_(cl, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("228C1A80000000" , and_(cl, byte_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("22AC1A80000000" , and_(ch, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("22AC1A80000000" , and_(ch, byte_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("66238C1A80000000" , and_(cx, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("66238C1A80000000" , and_(cx, word_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("238C1A80000000" , and_(ecx, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("238C1A80000000" , and_(ecx, dword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("C4E268F2CB" , andn(ecx, edx, ebx));
+ TEST_INSTRUCTION("C4E268F28C2B80000000" , andn(ecx, edx, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C4E268F28C2B80000000" , andn(ecx, edx, dword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("63D1" , arpl(cx, dx));
+ TEST_INSTRUCTION("639C1180000000" , arpl(ptr(ecx, edx, 0, 128), bx));
+ TEST_INSTRUCTION("639C1180000000" , arpl(word_ptr(ecx, edx, 0, 128), bx));
+ TEST_INSTRUCTION("C4E260F7CA" , bextr(ecx, edx, ebx));
+ TEST_INSTRUCTION("C4E258F78C1A80000000" , bextr(ecx, ptr(edx, ebx, 0, 128), esp));
+ TEST_INSTRUCTION("C4E258F78C1A80000000" , bextr(ecx, dword_ptr(edx, ebx, 0, 128), esp));
+ TEST_INSTRUCTION("8FE97001CA" , blcfill(ecx, edx));
+ TEST_INSTRUCTION("8FE970018C1A80000000" , blcfill(ecx, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("8FE970018C1A80000000" , blcfill(ecx, dword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("8FE97002F2" , blci(ecx, edx));
+ TEST_INSTRUCTION("8FE97002B41A80000000" , blci(ecx, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("8FE97002B41A80000000" , blci(ecx, dword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("8FE97001EA" , blcic(ecx, edx));
+ TEST_INSTRUCTION("8FE97001AC1A80000000" , blcic(ecx, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("8FE97001AC1A80000000" , blcic(ecx, dword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("8FE97002CA" , blcmsk(ecx, edx));
+ TEST_INSTRUCTION("8FE970028C1A80000000" , blcmsk(ecx, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("8FE970028C1A80000000" , blcmsk(ecx, dword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("8FE97001DA" , blcs(ecx, edx));
+ TEST_INSTRUCTION("8FE970019C1A80000000" , blcs(ecx, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("8FE970019C1A80000000" , blcs(ecx, dword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("8FE97001D2" , blsfill(ecx, edx));
+ TEST_INSTRUCTION("8FE97001941A80000000" , blsfill(ecx, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("8FE97001941A80000000" , blsfill(ecx, dword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("C4E270F3DA" , blsi(ecx, edx));
+ TEST_INSTRUCTION("C4E270F39C1A80000000" , blsi(ecx, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("C4E270F39C1A80000000" , blsi(ecx, dword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("8FE97001F2" , blsic(ecx, edx));
+ TEST_INSTRUCTION("8FE97001B41A80000000" , blsic(ecx, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("8FE97001B41A80000000" , blsic(ecx, dword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("C4E270F3D2" , blsmsk(ecx, edx));
+ TEST_INSTRUCTION("C4E270F3941A80000000" , blsmsk(ecx, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("C4E270F3941A80000000" , blsmsk(ecx, dword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("C4E270F3CA" , blsr(ecx, edx));
+ TEST_INSTRUCTION("C4E270F38C1A80000000" , blsr(ecx, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("C4E270F38C1A80000000" , blsr(ecx, dword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("F30F1ACA" , bndcl(bnd1, edx));
+ TEST_INSTRUCTION("F30F1A8C1A80000000" , bndcl(bnd1, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("F30F1A8C1A80000000" , bndcl(bnd1, dword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("F20F1BCA" , bndcn(bnd1, edx));
+ TEST_INSTRUCTION("F20F1B8C1A80000000" , bndcn(bnd1, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("F20F1B8C1A80000000" , bndcn(bnd1, dword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("F20F1ACA" , bndcu(bnd1, edx));
+ TEST_INSTRUCTION("F20F1A8C1A80000000" , bndcu(bnd1, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("F20F1A8C1A80000000" , bndcu(bnd1, dword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("0F1A8C1A80000000" , bndldx(bnd1, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("F30F1B8C1A80000000" , bndmk(bnd1, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("660F1ACA" , bndmov(bnd1, bnd2));
+ TEST_INSTRUCTION("660F1A8C1A80000000" , bndmov(bnd1, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("660F1B9C1180000000" , bndmov(ptr(ecx, edx, 0, 128), bnd3));
+ TEST_INSTRUCTION("0F1B9C1180000000" , bndstx(ptr(ecx, edx, 0, 128), bnd3));
+ TEST_INSTRUCTION("66628C1A80000000" , bound(cx, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("66628C1A80000000" , bound(cx, dword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("628C1A80000000" , bound(ecx, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("628C1A80000000" , bound(ecx, qword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("660FBCCA" , bsf(cx, dx));
+ TEST_INSTRUCTION("660FBC8C1A80000000" , bsf(cx, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("660FBC8C1A80000000" , bsf(cx, word_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("0FBCCA" , bsf(ecx, edx));
+ TEST_INSTRUCTION("0FBC8C1A80000000" , bsf(ecx, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("0FBC8C1A80000000" , bsf(ecx, dword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("660FBDCA" , bsr(cx, dx));
+ TEST_INSTRUCTION("660FBD8C1A80000000" , bsr(cx, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("660FBD8C1A80000000" , bsr(cx, word_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("0FBDCA" , bsr(ecx, edx));
+ TEST_INSTRUCTION("0FBD8C1A80000000" , bsr(ecx, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("0FBD8C1A80000000" , bsr(ecx, dword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("660FC9" , bswap(cx));
+ TEST_INSTRUCTION("0FC9" , bswap(ecx));
+ TEST_INSTRUCTION("660FBAE101" , bt(cx, 1));
+ TEST_INSTRUCTION("0FBAE101" , bt(ecx, 1));
+ TEST_INSTRUCTION("660FBAA4118000000001" , bt(word_ptr(ecx, edx, 0, 128), 1));
+ TEST_INSTRUCTION("0FBAA4118000000001" , bt(dword_ptr(ecx, edx, 0, 128), 1));
+ TEST_INSTRUCTION("660FA3D1" , bt(cx, dx));
+ TEST_INSTRUCTION("660FA39C1180000000" , bt(ptr(ecx, edx, 0, 128), bx));
+ TEST_INSTRUCTION("660FA39C1180000000" , bt(word_ptr(ecx, edx, 0, 128), bx));
+ TEST_INSTRUCTION("0FA3D1" , bt(ecx, edx));
+ TEST_INSTRUCTION("0FA39C1180000000" , bt(ptr(ecx, edx, 0, 128), ebx));
+ TEST_INSTRUCTION("0FA39C1180000000" , bt(dword_ptr(ecx, edx, 0, 128), ebx));
+ TEST_INSTRUCTION("660FBAF901" , btc(cx, 1));
+ TEST_INSTRUCTION("0FBAF901" , btc(ecx, 1));
+ TEST_INSTRUCTION("660FBABC118000000001" , btc(word_ptr(ecx, edx, 0, 128), 1));
+ TEST_INSTRUCTION("0FBABC118000000001" , btc(dword_ptr(ecx, edx, 0, 128), 1));
+ TEST_INSTRUCTION("660FBBD1" , btc(cx, dx));
+ TEST_INSTRUCTION("660FBB9C1180000000" , btc(ptr(ecx, edx, 0, 128), bx));
+ TEST_INSTRUCTION("660FBB9C1180000000" , btc(word_ptr(ecx, edx, 0, 128), bx));
+ TEST_INSTRUCTION("0FBBD1" , btc(ecx, edx));
+ TEST_INSTRUCTION("0FBB9C1180000000" , btc(ptr(ecx, edx, 0, 128), ebx));
+ TEST_INSTRUCTION("0FBB9C1180000000" , btc(dword_ptr(ecx, edx, 0, 128), ebx));
+ TEST_INSTRUCTION("660FBAF101" , btr(cx, 1));
+ TEST_INSTRUCTION("0FBAF101" , btr(ecx, 1));
+ TEST_INSTRUCTION("660FBAB4118000000001" , btr(word_ptr(ecx, edx, 0, 128), 1));
+ TEST_INSTRUCTION("0FBAB4118000000001" , btr(dword_ptr(ecx, edx, 0, 128), 1));
+ TEST_INSTRUCTION("660FB3D1" , btr(cx, dx));
+ TEST_INSTRUCTION("660FB39C1180000000" , btr(ptr(ecx, edx, 0, 128), bx));
+ TEST_INSTRUCTION("660FB39C1180000000" , btr(word_ptr(ecx, edx, 0, 128), bx));
+ TEST_INSTRUCTION("0FB3D1" , btr(ecx, edx));
+ TEST_INSTRUCTION("0FB39C1180000000" , btr(ptr(ecx, edx, 0, 128), ebx));
+ TEST_INSTRUCTION("0FB39C1180000000" , btr(dword_ptr(ecx, edx, 0, 128), ebx));
+ TEST_INSTRUCTION("660FBAE901" , bts(cx, 1));
+ TEST_INSTRUCTION("0FBAE901" , bts(ecx, 1));
+ TEST_INSTRUCTION("660FBAAC118000000001" , bts(word_ptr(ecx, edx, 0, 128), 1));
+ TEST_INSTRUCTION("0FBAAC118000000001" , bts(dword_ptr(ecx, edx, 0, 128), 1));
+ TEST_INSTRUCTION("660FABD1" , bts(cx, dx));
+ TEST_INSTRUCTION("660FAB9C1180000000" , bts(ptr(ecx, edx, 0, 128), bx));
+ TEST_INSTRUCTION("660FAB9C1180000000" , bts(word_ptr(ecx, edx, 0, 128), bx));
+ TEST_INSTRUCTION("0FABD1" , bts(ecx, edx));
+ TEST_INSTRUCTION("0FAB9C1180000000" , bts(ptr(ecx, edx, 0, 128), ebx));
+ TEST_INSTRUCTION("0FAB9C1180000000" , bts(dword_ptr(ecx, edx, 0, 128), ebx));
+ TEST_INSTRUCTION("C4E260F5CA" , bzhi(ecx, edx, ebx));
+ TEST_INSTRUCTION("C4E258F58C1A80000000" , bzhi(ecx, ptr(edx, ebx, 0, 128), esp));
+ TEST_INSTRUCTION("C4E258F58C1A80000000" , bzhi(ecx, dword_ptr(edx, ebx, 0, 128), esp));
+ TEST_INSTRUCTION("6698" , cbw(ax));
+ TEST_INSTRUCTION("99" , cdq(edx, eax));
+ TEST_INSTRUCTION("0F01CA" , clac());
+ TEST_INSTRUCTION("F8" , clc());
+ TEST_INSTRUCTION("FC" , cld());
+ TEST_INSTRUCTION("0F1C841180000000" , cldemote(ptr(ecx, edx, 0, 128)));
+ TEST_INSTRUCTION("0FAEBC1180000000" , clflush(ptr(ecx, edx, 0, 128)));
+ TEST_INSTRUCTION("660FAEBC1180000000" , clflushopt(ptr(ecx, edx, 0, 128)));
+ TEST_INSTRUCTION("0F01DD" , clgi());
+ TEST_INSTRUCTION("FA" , cli());
+ TEST_INSTRUCTION("F30FAEB41180000000" , clrssbsy(ptr(ecx, edx, 0, 128)));
+ TEST_INSTRUCTION("F30FAEB41180000000" , clrssbsy(qword_ptr(ecx, edx, 0, 128)));
+ TEST_INSTRUCTION("0F06" , clts());
+ TEST_INSTRUCTION("660FAEB41180000000" , clwb(ptr(ecx, edx, 0, 128)));
+ TEST_INSTRUCTION("0F01FC" , clzero(ptr(eax)));
+ TEST_INSTRUCTION("0F01FC" , clzero(zmmword_ptr(eax)));
+ TEST_INSTRUCTION("F5" , cmc());
+ TEST_INSTRUCTION("660F47CA" , cmova(cx, dx));
+ TEST_INSTRUCTION("660F478C1A80000000" , cmova(cx, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("660F478C1A80000000" , cmova(cx, word_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("0F47CA" , cmova(ecx, edx));
+ TEST_INSTRUCTION("0F478C1A80000000" , cmova(ecx, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("0F478C1A80000000" , cmova(ecx, dword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("660F43CA" , cmovae(cx, dx));
+ TEST_INSTRUCTION("660F438C1A80000000" , cmovae(cx, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("660F438C1A80000000" , cmovae(cx, word_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("0F43CA" , cmovae(ecx, edx));
+ TEST_INSTRUCTION("0F438C1A80000000" , cmovae(ecx, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("0F438C1A80000000" , cmovae(ecx, dword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("660F42CA" , cmovb(cx, dx));
+ TEST_INSTRUCTION("660F428C1A80000000" , cmovb(cx, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("660F428C1A80000000" , cmovb(cx, word_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("0F42CA" , cmovb(ecx, edx));
+ TEST_INSTRUCTION("0F428C1A80000000" , cmovb(ecx, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("0F428C1A80000000" , cmovb(ecx, dword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("660F46CA" , cmovbe(cx, dx));
+ TEST_INSTRUCTION("660F468C1A80000000" , cmovbe(cx, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("660F468C1A80000000" , cmovbe(cx, word_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("0F46CA" , cmovbe(ecx, edx));
+ TEST_INSTRUCTION("0F468C1A80000000" , cmovbe(ecx, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("0F468C1A80000000" , cmovbe(ecx, dword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("660F42CA" , cmovc(cx, dx));
+ TEST_INSTRUCTION("660F428C1A80000000" , cmovc(cx, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("660F428C1A80000000" , cmovc(cx, word_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("0F42CA" , cmovc(ecx, edx));
+ TEST_INSTRUCTION("0F428C1A80000000" , cmovc(ecx, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("0F428C1A80000000" , cmovc(ecx, dword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("660F44CA" , cmove(cx, dx));
+ TEST_INSTRUCTION("660F448C1A80000000" , cmove(cx, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("660F448C1A80000000" , cmove(cx, word_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("0F44CA" , cmove(ecx, edx));
+ TEST_INSTRUCTION("0F448C1A80000000" , cmove(ecx, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("0F448C1A80000000" , cmove(ecx, dword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("660F4FCA" , cmovg(cx, dx));
+ TEST_INSTRUCTION("660F4F8C1A80000000" , cmovg(cx, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("660F4F8C1A80000000" , cmovg(cx, word_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("0F4FCA" , cmovg(ecx, edx));
+ TEST_INSTRUCTION("0F4F8C1A80000000" , cmovg(ecx, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("0F4F8C1A80000000" , cmovg(ecx, dword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("660F4DCA" , cmovge(cx, dx));
+ TEST_INSTRUCTION("660F4D8C1A80000000" , cmovge(cx, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("660F4D8C1A80000000" , cmovge(cx, word_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("0F4DCA" , cmovge(ecx, edx));
+ TEST_INSTRUCTION("0F4D8C1A80000000" , cmovge(ecx, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("0F4D8C1A80000000" , cmovge(ecx, dword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("660F4CCA" , cmovl(cx, dx));
+ TEST_INSTRUCTION("660F4C8C1A80000000" , cmovl(cx, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("660F4C8C1A80000000" , cmovl(cx, word_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("0F4CCA" , cmovl(ecx, edx));
+ TEST_INSTRUCTION("0F4C8C1A80000000" , cmovl(ecx, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("0F4C8C1A80000000" , cmovl(ecx, dword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("660F4ECA" , cmovle(cx, dx));
+ TEST_INSTRUCTION("660F4E8C1A80000000" , cmovle(cx, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("660F4E8C1A80000000" , cmovle(cx, word_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("0F4ECA" , cmovle(ecx, edx));
+ TEST_INSTRUCTION("0F4E8C1A80000000" , cmovle(ecx, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("0F4E8C1A80000000" , cmovle(ecx, dword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("660F46CA" , cmovna(cx, dx));
+ TEST_INSTRUCTION("660F468C1A80000000" , cmovna(cx, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("660F468C1A80000000" , cmovna(cx, word_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("0F46CA" , cmovna(ecx, edx));
+ TEST_INSTRUCTION("0F468C1A80000000" , cmovna(ecx, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("0F468C1A80000000" , cmovna(ecx, dword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("660F42CA" , cmovnae(cx, dx));
+ TEST_INSTRUCTION("660F428C1A80000000" , cmovnae(cx, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("660F428C1A80000000" , cmovnae(cx, word_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("0F42CA" , cmovnae(ecx, edx));
+ TEST_INSTRUCTION("0F428C1A80000000" , cmovnae(ecx, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("0F428C1A80000000" , cmovnae(ecx, dword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("660F43CA" , cmovnb(cx, dx));
+ TEST_INSTRUCTION("660F438C1A80000000" , cmovnb(cx, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("660F438C1A80000000" , cmovnb(cx, word_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("0F43CA" , cmovnb(ecx, edx));
+ TEST_INSTRUCTION("0F438C1A80000000" , cmovnb(ecx, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("0F438C1A80000000" , cmovnb(ecx, dword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("660F47CA" , cmovnbe(cx, dx));
+ TEST_INSTRUCTION("660F478C1A80000000" , cmovnbe(cx, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("660F478C1A80000000" , cmovnbe(cx, word_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("0F47CA" , cmovnbe(ecx, edx));
+ TEST_INSTRUCTION("0F478C1A80000000" , cmovnbe(ecx, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("0F478C1A80000000" , cmovnbe(ecx, dword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("660F43CA" , cmovnc(cx, dx));
+ TEST_INSTRUCTION("660F438C1A80000000" , cmovnc(cx, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("660F438C1A80000000" , cmovnc(cx, word_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("0F43CA" , cmovnc(ecx, edx));
+ TEST_INSTRUCTION("0F438C1A80000000" , cmovnc(ecx, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("0F438C1A80000000" , cmovnc(ecx, dword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("660F45CA" , cmovne(cx, dx));
+ TEST_INSTRUCTION("660F458C1A80000000" , cmovne(cx, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("660F458C1A80000000" , cmovne(cx, word_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("0F45CA" , cmovne(ecx, edx));
+ TEST_INSTRUCTION("0F458C1A80000000" , cmovne(ecx, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("0F458C1A80000000" , cmovne(ecx, dword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("660F4ECA" , cmovng(cx, dx));
+ TEST_INSTRUCTION("660F4E8C1A80000000" , cmovng(cx, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("660F4E8C1A80000000" , cmovng(cx, word_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("0F4ECA" , cmovng(ecx, edx));
+ TEST_INSTRUCTION("0F4E8C1A80000000" , cmovng(ecx, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("0F4E8C1A80000000" , cmovng(ecx, dword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("660F4CCA" , cmovnge(cx, dx));
+ TEST_INSTRUCTION("660F4C8C1A80000000" , cmovnge(cx, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("660F4C8C1A80000000" , cmovnge(cx, word_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("0F4CCA" , cmovnge(ecx, edx));
+ TEST_INSTRUCTION("0F4C8C1A80000000" , cmovnge(ecx, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("0F4C8C1A80000000" , cmovnge(ecx, dword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("660F4DCA" , cmovnl(cx, dx));
+ TEST_INSTRUCTION("660F4D8C1A80000000" , cmovnl(cx, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("660F4D8C1A80000000" , cmovnl(cx, word_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("0F4DCA" , cmovnl(ecx, edx));
+ TEST_INSTRUCTION("0F4D8C1A80000000" , cmovnl(ecx, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("0F4D8C1A80000000" , cmovnl(ecx, dword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("660F4FCA" , cmovnle(cx, dx));
+ TEST_INSTRUCTION("660F4F8C1A80000000" , cmovnle(cx, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("660F4F8C1A80000000" , cmovnle(cx, word_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("0F4FCA" , cmovnle(ecx, edx));
+ TEST_INSTRUCTION("0F4F8C1A80000000" , cmovnle(ecx, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("0F4F8C1A80000000" , cmovnle(ecx, dword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("660F41CA" , cmovno(cx, dx));
+ TEST_INSTRUCTION("660F418C1A80000000" , cmovno(cx, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("660F418C1A80000000" , cmovno(cx, word_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("0F41CA" , cmovno(ecx, edx));
+ TEST_INSTRUCTION("0F418C1A80000000" , cmovno(ecx, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("0F418C1A80000000" , cmovno(ecx, dword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("660F4BCA" , cmovnp(cx, dx));
+ TEST_INSTRUCTION("660F4B8C1A80000000" , cmovnp(cx, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("660F4B8C1A80000000" , cmovnp(cx, word_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("0F4BCA" , cmovnp(ecx, edx));
+ TEST_INSTRUCTION("0F4B8C1A80000000" , cmovnp(ecx, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("0F4B8C1A80000000" , cmovnp(ecx, dword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("660F49CA" , cmovns(cx, dx));
+ TEST_INSTRUCTION("660F498C1A80000000" , cmovns(cx, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("660F498C1A80000000" , cmovns(cx, word_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("0F49CA" , cmovns(ecx, edx));
+ TEST_INSTRUCTION("0F498C1A80000000" , cmovns(ecx, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("0F498C1A80000000" , cmovns(ecx, dword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("660F45CA" , cmovnz(cx, dx));
+ TEST_INSTRUCTION("660F458C1A80000000" , cmovnz(cx, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("660F458C1A80000000" , cmovnz(cx, word_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("0F45CA" , cmovnz(ecx, edx));
+ TEST_INSTRUCTION("0F458C1A80000000" , cmovnz(ecx, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("0F458C1A80000000" , cmovnz(ecx, dword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("660F40CA" , cmovo(cx, dx));
+ TEST_INSTRUCTION("660F408C1A80000000" , cmovo(cx, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("660F408C1A80000000" , cmovo(cx, word_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("0F40CA" , cmovo(ecx, edx));
+ TEST_INSTRUCTION("0F408C1A80000000" , cmovo(ecx, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("0F408C1A80000000" , cmovo(ecx, dword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("660F4ACA" , cmovp(cx, dx));
+ TEST_INSTRUCTION("660F4A8C1A80000000" , cmovp(cx, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("660F4A8C1A80000000" , cmovp(cx, word_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("0F4ACA" , cmovp(ecx, edx));
+ TEST_INSTRUCTION("0F4A8C1A80000000" , cmovp(ecx, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("0F4A8C1A80000000" , cmovp(ecx, dword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("660F4ACA" , cmovpe(cx, dx));
+ TEST_INSTRUCTION("660F4A8C1A80000000" , cmovpe(cx, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("660F4A8C1A80000000" , cmovpe(cx, word_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("0F4ACA" , cmovpe(ecx, edx));
+ TEST_INSTRUCTION("0F4A8C1A80000000" , cmovpe(ecx, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("0F4A8C1A80000000" , cmovpe(ecx, dword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("660F4BCA" , cmovpo(cx, dx));
+ TEST_INSTRUCTION("660F4B8C1A80000000" , cmovpo(cx, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("660F4B8C1A80000000" , cmovpo(cx, word_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("0F4BCA" , cmovpo(ecx, edx));
+ TEST_INSTRUCTION("0F4B8C1A80000000" , cmovpo(ecx, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("0F4B8C1A80000000" , cmovpo(ecx, dword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("660F48CA" , cmovs(cx, dx));
+ TEST_INSTRUCTION("660F488C1A80000000" , cmovs(cx, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("660F488C1A80000000" , cmovs(cx, word_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("0F48CA" , cmovs(ecx, edx));
+ TEST_INSTRUCTION("0F488C1A80000000" , cmovs(ecx, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("0F488C1A80000000" , cmovs(ecx, dword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("660F44CA" , cmovz(cx, dx));
+ TEST_INSTRUCTION("660F448C1A80000000" , cmovz(cx, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("660F448C1A80000000" , cmovz(cx, word_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("0F44CA" , cmovz(ecx, edx));
+ TEST_INSTRUCTION("0F448C1A80000000" , cmovz(ecx, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("0F448C1A80000000" , cmovz(ecx, dword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("80F901" , cmp(cl, 1));
+ TEST_INSTRUCTION("80FD01" , cmp(ch, 1));
+ TEST_INSTRUCTION("80BC118000000001" , cmp(byte_ptr(ecx, edx, 0, 128), 1));
+ TEST_INSTRUCTION("6683F901" , cmp(cx, 1));
+ TEST_INSTRUCTION("6683BC118000000001" , cmp(word_ptr(ecx, edx, 0, 128), 1));
+ TEST_INSTRUCTION("83F901" , cmp(ecx, 1));
+ TEST_INSTRUCTION("83BC118000000001" , cmp(dword_ptr(ecx, edx, 0, 128), 1));
+ TEST_INSTRUCTION("38D1" , cmp(cl, dl));
+ TEST_INSTRUCTION("38F1" , cmp(cl, dh));
+ TEST_INSTRUCTION("38D5" , cmp(ch, dl));
+ TEST_INSTRUCTION("38F5" , cmp(ch, dh));
+ TEST_INSTRUCTION("389C1180000000" , cmp(ptr(ecx, edx, 0, 128), bl));
+ TEST_INSTRUCTION("38BC1180000000" , cmp(ptr(ecx, edx, 0, 128), bh));
+ TEST_INSTRUCTION("389C1180000000" , cmp(byte_ptr(ecx, edx, 0, 128), bl));
+ TEST_INSTRUCTION("38BC1180000000" , cmp(byte_ptr(ecx, edx, 0, 128), bh));
+ TEST_INSTRUCTION("6639D1" , cmp(cx, dx));
+ TEST_INSTRUCTION("66399C1180000000" , cmp(ptr(ecx, edx, 0, 128), bx));
+ TEST_INSTRUCTION("66399C1180000000" , cmp(word_ptr(ecx, edx, 0, 128), bx));
+ TEST_INSTRUCTION("39D1" , cmp(ecx, edx));
+ TEST_INSTRUCTION("399C1180000000" , cmp(ptr(ecx, edx, 0, 128), ebx));
+ TEST_INSTRUCTION("399C1180000000" , cmp(dword_ptr(ecx, edx, 0, 128), ebx));
+ TEST_INSTRUCTION("3A8C1A80000000" , cmp(cl, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("3A8C1A80000000" , cmp(cl, byte_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("3AAC1A80000000" , cmp(ch, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("3AAC1A80000000" , cmp(ch, byte_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("663B8C1A80000000" , cmp(cx, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("663B8C1A80000000" , cmp(cx, word_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("3B8C1A80000000" , cmp(ecx, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("3B8C1A80000000" , cmp(ecx, dword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("A6" , cmps(byte_ptr(esi), byte_ptr(edi)));
+ TEST_INSTRUCTION("66A7" , cmps(word_ptr(esi), word_ptr(edi)));
+ TEST_INSTRUCTION("A7" , cmps(dword_ptr(esi), dword_ptr(edi)));
+ TEST_INSTRUCTION("0FB0D1" , cmpxchg(cl, dl, al));
+ TEST_INSTRUCTION("0FB0F1" , cmpxchg(cl, dh, al));
+ TEST_INSTRUCTION("0FB0D5" , cmpxchg(ch, dl, al));
+ TEST_INSTRUCTION("0FB0F5" , cmpxchg(ch, dh, al));
+ TEST_INSTRUCTION("0FB09C1180000000" , cmpxchg(ptr(ecx, edx, 0, 128), bl, al));
+ TEST_INSTRUCTION("0FB0BC1180000000" , cmpxchg(ptr(ecx, edx, 0, 128), bh, al));
+ TEST_INSTRUCTION("0FB09C1180000000" , cmpxchg(byte_ptr(ecx, edx, 0, 128), bl, al));
+ TEST_INSTRUCTION("0FB0BC1180000000" , cmpxchg(byte_ptr(ecx, edx, 0, 128), bh, al));
+ TEST_INSTRUCTION("660FB1D1" , cmpxchg(cx, dx, ax));
+ TEST_INSTRUCTION("660FB19C1180000000" , cmpxchg(ptr(ecx, edx, 0, 128), bx, ax));
+ TEST_INSTRUCTION("660FB19C1180000000" , cmpxchg(word_ptr(ecx, edx, 0, 128), bx, ax));
+ TEST_INSTRUCTION("0FB1D1" , cmpxchg(ecx, edx, eax));
+ TEST_INSTRUCTION("0FB19C1180000000" , cmpxchg(ptr(ecx, edx, 0, 128), ebx, eax));
+ TEST_INSTRUCTION("0FB19C1180000000" , cmpxchg(dword_ptr(ecx, edx, 0, 128), ebx, eax));
+ TEST_INSTRUCTION("0FC78C1180000000" , cmpxchg8b(ptr(ecx, edx, 0, 128), edx, eax, ecx, ebx));
+ TEST_INSTRUCTION("0FC78C1180000000" , cmpxchg8b(qword_ptr(ecx, edx, 0, 128), edx, eax, ecx, ebx));
+ TEST_INSTRUCTION("0FA2" , cpuid(eax, ebx, ecx, edx));
+ TEST_INSTRUCTION("F20F38F0CA" , crc32(ecx, dl));
+ TEST_INSTRUCTION("F20F38F0CE" , crc32(ecx, dh));
+ TEST_INSTRUCTION("66F20F38F1CA" , crc32(ecx, dx));
+ TEST_INSTRUCTION("F20F38F1CA" , crc32(ecx, edx));
+ TEST_INSTRUCTION("F20F38F08C1A80000000" , crc32(ecx, byte_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("66F20F38F18C1A80000000" , crc32(ecx, word_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("F20F38F18C1A80000000" , crc32(ecx, dword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("6699" , cwd(dx, ax));
+ TEST_INSTRUCTION("98" , cwde(eax));
+ TEST_INSTRUCTION("27" , daa(ax));
+ TEST_INSTRUCTION("2F" , das(ax));
+ TEST_INSTRUCTION("6649" , dec(cx));
+ TEST_INSTRUCTION("49" , dec(ecx));
+ TEST_INSTRUCTION("FEC9" , dec(cl));
+ TEST_INSTRUCTION("FECD" , dec(ch));
+ TEST_INSTRUCTION("FE8C1180000000" , dec(byte_ptr(ecx, edx, 0, 128)));
+ TEST_INSTRUCTION("66FF8C1180000000" , dec(word_ptr(ecx, edx, 0, 128)));
+ TEST_INSTRUCTION("FF8C1180000000" , dec(dword_ptr(ecx, edx, 0, 128)));
+ TEST_INSTRUCTION("F6F1" , div(ax, cl));
+ TEST_INSTRUCTION("F6F5" , div(ax, ch));
+ TEST_INSTRUCTION("F6B41180000000" , div(ax, ptr(ecx, edx, 0, 128)));
+ TEST_INSTRUCTION("F6B41180000000" , div(ax, byte_ptr(ecx, edx, 0, 128)));
+ TEST_INSTRUCTION("66F7F1" , div(dx, ax, cx));
+ TEST_INSTRUCTION("66F7B41180000000" , div(dx, ax, ptr(ecx, edx, 0, 128)));
+ TEST_INSTRUCTION("66F7B41180000000" , div(dx, ax, word_ptr(ecx, edx, 0, 128)));
+ TEST_INSTRUCTION("F7F1" , div(edx, eax, ecx));
+ TEST_INSTRUCTION("F7B41180000000" , div(edx, eax, ptr(ecx, edx, 0, 128)));
+ TEST_INSTRUCTION("F7B41180000000" , div(edx, eax, dword_ptr(ecx, edx, 0, 128)));
+ TEST_INSTRUCTION("0F77" , emms());
+ TEST_INSTRUCTION("F30F1EFB" , endbr32());
+ TEST_INSTRUCTION("F30F1EFA" , endbr64());
+ TEST_INSTRUCTION("F20F38F88C1A80000000" , enqcmd(zmmword_ptr(ecx), zmmword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("F30F38F88C1A80000000" , enqcmds(zmmword_ptr(ecx), zmmword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("C8010002" , enter(1, 2));
+ TEST_INSTRUCTION("0FAE8C1180000000" , fxrstor(ptr(ecx, edx, 0, 128)));
+ TEST_INSTRUCTION("0FAE841180000000" , fxsave(ptr(ecx, edx, 0, 128)));
+ TEST_INSTRUCTION("D9F4" , fxtract());
+ TEST_INSTRUCTION("0F37" , getsec());
+ TEST_INSTRUCTION("F4" , hlt());
+ TEST_INSTRUCTION("F30F3AF0C001" , hreset(1, eax));
+ TEST_INSTRUCTION("F6F9" , idiv(ax, cl));
+ TEST_INSTRUCTION("F6FD" , idiv(ax, ch));
+ TEST_INSTRUCTION("F6BC1180000000" , idiv(ax, ptr(ecx, edx, 0, 128)));
+ TEST_INSTRUCTION("F6BC1180000000" , idiv(ax, byte_ptr(ecx, edx, 0, 128)));
+ TEST_INSTRUCTION("66F7F9" , idiv(dx, ax, cx));
+ TEST_INSTRUCTION("66F7BC1180000000" , idiv(dx, ax, ptr(ecx, edx, 0, 128)));
+ TEST_INSTRUCTION("66F7BC1180000000" , idiv(dx, ax, word_ptr(ecx, edx, 0, 128)));
+ TEST_INSTRUCTION("F7F9" , idiv(edx, eax, ecx));
+ TEST_INSTRUCTION("F7BC1180000000" , idiv(edx, eax, ptr(ecx, edx, 0, 128)));
+ TEST_INSTRUCTION("F7BC1180000000" , idiv(edx, eax, dword_ptr(ecx, edx, 0, 128)));
+ TEST_INSTRUCTION("F6E9" , imul(ax, cl));
+ TEST_INSTRUCTION("F6ED" , imul(ax, ch));
+ TEST_INSTRUCTION("660FAF841180000000" , imul(ax, ptr(ecx, edx, 0, 128)));
+ TEST_INSTRUCTION("F6AC1180000000" , imul(ax, byte_ptr(ecx, edx, 0, 128)));
+ TEST_INSTRUCTION("66F7E9" , imul(dx, ax, cx));
+ TEST_INSTRUCTION("66F7AC1180000000" , imul(dx, ax, ptr(ecx, edx, 0, 128)));
+ TEST_INSTRUCTION("66F7AC1180000000" , imul(dx, ax, word_ptr(ecx, edx, 0, 128)));
+ TEST_INSTRUCTION("F7E9" , imul(edx, eax, ecx));
+ TEST_INSTRUCTION("F7AC1180000000" , imul(edx, eax, ptr(ecx, edx, 0, 128)));
+ TEST_INSTRUCTION("F7AC1180000000" , imul(edx, eax, dword_ptr(ecx, edx, 0, 128)));
+ TEST_INSTRUCTION("660FAFCA" , imul(cx, dx));
+ TEST_INSTRUCTION("666BC901" , imul(cx, 1));
+ TEST_INSTRUCTION("660FAF8C1A80000000" , imul(cx, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("660FAF8C1A80000000" , imul(cx, word_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("0FAFCA" , imul(ecx, edx));
+ TEST_INSTRUCTION("6BC901" , imul(ecx, 1));
+ TEST_INSTRUCTION("0FAF8C1A80000000" , imul(ecx, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("0FAF8C1A80000000" , imul(ecx, dword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("666BCA01" , imul(cx, dx, 1));
+ TEST_INSTRUCTION("666B8C1A8000000001" , imul(cx, ptr(edx, ebx, 0, 128), 1));
+ TEST_INSTRUCTION("666B8C1A8000000001" , imul(cx, word_ptr(edx, ebx, 0, 128), 1));
+ TEST_INSTRUCTION("6BCA01" , imul(ecx, edx, 1));
+ TEST_INSTRUCTION("6B8C1A8000000001" , imul(ecx, ptr(edx, ebx, 0, 128), 1));
+ TEST_INSTRUCTION("6B8C1A8000000001" , imul(ecx, dword_ptr(edx, ebx, 0, 128), 1));
+ TEST_INSTRUCTION("EC" , in(al, dx));
+ TEST_INSTRUCTION("E401" , in(al, 1));
+ TEST_INSTRUCTION("66ED" , in(ax, dx));
+ TEST_INSTRUCTION("66E501" , in(ax, 1));
+ TEST_INSTRUCTION("ED" , in(eax, dx));
+ TEST_INSTRUCTION("E501" , in(eax, 1));
+ TEST_INSTRUCTION("6641" , inc(cx));
+ TEST_INSTRUCTION("41" , inc(ecx));
+ TEST_INSTRUCTION("FEC1" , inc(cl));
+ TEST_INSTRUCTION("FEC5" , inc(ch));
+ TEST_INSTRUCTION("FE841180000000" , inc(byte_ptr(ecx, edx, 0, 128)));
+ TEST_INSTRUCTION("66FF841180000000" , inc(word_ptr(ecx, edx, 0, 128)));
+ TEST_INSTRUCTION("FF841180000000" , inc(dword_ptr(ecx, edx, 0, 128)));
+ TEST_INSTRUCTION("F30FAEE9" , incsspd(ecx));
+ TEST_INSTRUCTION("6C" , ins(byte_ptr(edi), dx));
+ TEST_INSTRUCTION("666D" , ins(word_ptr(edi), dx));
+ TEST_INSTRUCTION("6D" , ins(dword_ptr(edi), dx));
+ TEST_INSTRUCTION("CD01" , int_(1));
+ TEST_INSTRUCTION("CC" , int3());
+ TEST_INSTRUCTION("CE" , into());
+ TEST_INSTRUCTION("0F08" , invd());
+ TEST_INSTRUCTION("660F38808C1A80000000" , invept(ecx, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("660F38808C1A80000000" , invept(ecx, xmmword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("0F01BC1180000000" , invlpg(ptr(ecx, edx, 0, 128)));
+ TEST_INSTRUCTION("0F01DF" , invlpga(eax, ecx));
+ TEST_INSTRUCTION("660F38828C1A80000000" , invpcid(ecx, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("660F38828C1A80000000" , invpcid(ecx, xmmword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("660F38818C1A80000000" , invvpid(ecx, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("660F38818C1A80000000" , invvpid(ecx, xmmword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("66CF" , iret());
+ TEST_INSTRUCTION("CF" , iretd());
+ TEST_INSTRUCTION("9F" , lahf(ah));
+ TEST_INSTRUCTION("660F02CA" , lar(cx, dx));
+ TEST_INSTRUCTION("660F028C1A80000000" , lar(cx, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("660F028C1A80000000" , lar(cx, word_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("0F02CA" , lar(ecx, edx));
+ TEST_INSTRUCTION("0F028C1A80000000" , lar(ecx, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("0F028C1A80000000" , lar(ecx, word_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("9A020000000100" , lcall(1, 2));
+ TEST_INSTRUCTION("FF9C1180000000" , lcall(ptr(ecx, edx, 0, 128)));
+ TEST_INSTRUCTION("66FF9C1180000000" , lcall(dword_ptr(ecx, edx, 0, 128)));
+ TEST_INSTRUCTION("FF9C1180000000" , lcall(fword_ptr(ecx, edx, 0, 128)));
+ TEST_INSTRUCTION("0FAE941180000000" , ldmxcsr(ptr(ecx, edx, 0, 128)));
+ TEST_INSTRUCTION("0FAE941180000000" , ldmxcsr(dword_ptr(ecx, edx, 0, 128)));
+ TEST_INSTRUCTION("66C58C1A80000000" , lds(cx, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("66C58C1A80000000" , lds(cx, dword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("C58C1A80000000" , lds(ecx, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("C58C1A80000000" , lds(ecx, fword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("668D8C1A80000000" , lea(cx, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("8D8C1A80000000" , lea(ecx, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("C9" , leave());
+ TEST_INSTRUCTION("66C48C1A80000000" , les(cx, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("66C48C1A80000000" , les(cx, dword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("C48C1A80000000" , les(ecx, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("C48C1A80000000" , les(ecx, fword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("0FAEE8" , lfence());
+ TEST_INSTRUCTION("660FB48C1A80000000" , lfs(cx, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("660FB48C1A80000000" , lfs(cx, dword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("0FB48C1A80000000" , lfs(ecx, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("0FB48C1A80000000" , lfs(ecx, fword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("0F01941180000000" , lgdt(ptr(ecx, edx, 0, 128)));
+ TEST_INSTRUCTION("660FB58C1A80000000" , lgs(cx, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("660FB58C1A80000000" , lgs(cx, dword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("0FB58C1A80000000" , lgs(ecx, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("0FB58C1A80000000" , lgs(ecx, fword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("0F019C1180000000" , lidt(ptr(ecx, edx, 0, 128)));
+ TEST_INSTRUCTION("EA020000000100" , ljmp(1, 2));
+ TEST_INSTRUCTION("FFAC1180000000" , ljmp(ptr(ecx, edx, 0, 128)));
+ TEST_INSTRUCTION("66FFAC1180000000" , ljmp(dword_ptr(ecx, edx, 0, 128)));
+ TEST_INSTRUCTION("FFAC1180000000" , ljmp(fword_ptr(ecx, edx, 0, 128)));
+ TEST_INSTRUCTION("0F00D1" , lldt(cx));
+ TEST_INSTRUCTION("0F00941180000000" , lldt(ptr(ecx, edx, 0, 128)));
+ TEST_INSTRUCTION("0F00941180000000" , lldt(word_ptr(ecx, edx, 0, 128)));
+ TEST_INSTRUCTION("8FE97812C1" , llwpcb(ecx));
+ TEST_INSTRUCTION("0F01F1" , lmsw(cx));
+ TEST_INSTRUCTION("0F01B41180000000" , lmsw(ptr(ecx, edx, 0, 128)));
+ TEST_INSTRUCTION("0F01B41180000000" , lmsw(word_ptr(ecx, edx, 0, 128)));
+ TEST_INSTRUCTION("AC" , lods(al, ptr(esi)));
+ TEST_INSTRUCTION("AC" , lods(al, byte_ptr(esi)));
+ TEST_INSTRUCTION("66AD" , lods(ax, ptr(esi)));
+ TEST_INSTRUCTION("66AD" , lods(ax, word_ptr(esi)));
+ TEST_INSTRUCTION("AD" , lods(eax, ptr(esi)));
+ TEST_INSTRUCTION("AD" , lods(eax, dword_ptr(esi)));
+ TEST_INSTRUCTION("660F03CA" , lsl(cx, dx));
+ TEST_INSTRUCTION("660F038C1A80000000" , lsl(cx, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("660F038C1A80000000" , lsl(cx, word_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("0F03CA" , lsl(ecx, edx));
+ TEST_INSTRUCTION("0F038C1A80000000" , lsl(ecx, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("0F038C1A80000000" , lsl(ecx, word_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("660FB28C1A80000000" , lss(cx, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("660FB28C1A80000000" , lss(cx, dword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("0FB28C1A80000000" , lss(ecx, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("0FB28C1A80000000" , lss(ecx, fword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("0F00D9" , ltr(cx));
+ TEST_INSTRUCTION("0F009C1180000000" , ltr(ptr(ecx, edx, 0, 128)));
+ TEST_INSTRUCTION("0F009C1180000000" , ltr(word_ptr(ecx, edx, 0, 128)));
+ TEST_INSTRUCTION("8FEA7012C201000000" , lwpins(ecx, edx, 1));
+ TEST_INSTRUCTION("8FEA7012841A8000000001000000" , lwpins(ecx, ptr(edx, ebx, 0, 128), 1));
+ TEST_INSTRUCTION("8FEA7012841A8000000001000000" , lwpins(ecx, dword_ptr(edx, ebx, 0, 128), 1));
+ TEST_INSTRUCTION("8FEA7012CA01000000" , lwpval(ecx, edx, 1));
+ TEST_INSTRUCTION("8FEA70128C1A8000000001000000" , lwpval(ecx, ptr(edx, ebx, 0, 128), 1));
+ TEST_INSTRUCTION("8FEA70128C1A8000000001000000" , lwpval(ecx, dword_ptr(edx, ebx, 0, 128), 1));
+ TEST_INSTRUCTION("66F30FBDCA" , lzcnt(cx, dx));
+ TEST_INSTRUCTION("66F30FBD8C1A80000000" , lzcnt(cx, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("66F30FBD8C1A80000000" , lzcnt(cx, word_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("F30FBDCA" , lzcnt(ecx, edx));
+ TEST_INSTRUCTION("F30FBD8C1A80000000" , lzcnt(ecx, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("F30FBD8C1A80000000" , lzcnt(ecx, dword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("F30F01FA" , mcommit());
+ TEST_INSTRUCTION("0FAEF0" , mfence());
+ TEST_INSTRUCTION("0F01C8" , monitor(ptr(eax), ecx, edx));
+ TEST_INSTRUCTION("0F01FA" , monitorx(ptr(eax), ecx, edx));
+ TEST_INSTRUCTION("88D1" , mov(cl, dl));
+ TEST_INSTRUCTION("88F1" , mov(cl, dh));
+ TEST_INSTRUCTION("88D5" , mov(ch, dl));
+ TEST_INSTRUCTION("88F5" , mov(ch, dh));
+ TEST_INSTRUCTION("889C1180000000" , mov(ptr(ecx, edx, 0, 128), bl));
+ TEST_INSTRUCTION("88BC1180000000" , mov(ptr(ecx, edx, 0, 128), bh));
+ TEST_INSTRUCTION("889C1180000000" , mov(byte_ptr(ecx, edx, 0, 128), bl));
+ TEST_INSTRUCTION("88BC1180000000" , mov(byte_ptr(ecx, edx, 0, 128), bh));
+ TEST_INSTRUCTION("6689D1" , mov(cx, dx));
+ TEST_INSTRUCTION("668EE2" , mov(fs, dx));
+ TEST_INSTRUCTION("66899C1180000000" , mov(ptr(ecx, edx, 0, 128), bx));
+ TEST_INSTRUCTION("66899C1180000000" , mov(word_ptr(ecx, edx, 0, 128), bx));
+ TEST_INSTRUCTION("89D1" , mov(ecx, edx));
+ TEST_INSTRUCTION("8EE2" , mov(fs, edx));
+ TEST_INSTRUCTION("899C1180000000" , mov(ptr(ecx, edx, 0, 128), ebx));
+ TEST_INSTRUCTION("899C1180000000" , mov(dword_ptr(ecx, edx, 0, 128), ebx));
+ TEST_INSTRUCTION("B101" , mov(cl, 1));
+ TEST_INSTRUCTION("B501" , mov(ch, 1));
+ TEST_INSTRUCTION("C684118000000001" , mov(byte_ptr(ecx, edx, 0, 128), 1));
+ TEST_INSTRUCTION("66B90100" , mov(cx, 1));
+ TEST_INSTRUCTION("66C78411800000000100" , mov(word_ptr(ecx, edx, 0, 128), 1));
+ TEST_INSTRUCTION("B901000000" , mov(ecx, 1));
+ TEST_INSTRUCTION("C784118000000001000000" , mov(dword_ptr(ecx, edx, 0, 128), 1));
+ TEST_INSTRUCTION("8A8C1A80000000" , mov(cl, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("8A8C1A80000000" , mov(cl, byte_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("8AAC1A80000000" , mov(ch, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("8AAC1A80000000" , mov(ch, byte_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("668CE1" , mov(cx, fs));
+ TEST_INSTRUCTION("668B8C1A80000000" , mov(cx, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("668B8C1A80000000" , mov(cx, word_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("8CE1" , mov(ecx, fs));
+ TEST_INSTRUCTION("8B8C1A80000000" , mov(ecx, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("8B8C1A80000000" , mov(ecx, dword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("8CA41180000000" , mov(ptr(ecx, edx, 0, 128), fs));
+ TEST_INSTRUCTION("668CA41180000000" , mov(word_ptr(ecx, edx, 0, 128), fs));
+ TEST_INSTRUCTION("8EA41A80000000" , mov(fs, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("668EA41A80000000" , mov(fs, word_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("0F20D1" , mov(ecx, cr2));
+ TEST_INSTRUCTION("0F21D1" , mov(ecx, dr2));
+ TEST_INSTRUCTION("0F22CA" , mov(cr1, edx));
+ TEST_INSTRUCTION("0F23CA" , mov(dr1, edx));
+ TEST_INSTRUCTION("660F38F08C1A80000000" , movbe(cx, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("660F38F08C1A80000000" , movbe(cx, word_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("0F38F08C1A80000000" , movbe(ecx, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("0F38F08C1A80000000" , movbe(ecx, dword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("660F38F19C1180000000" , movbe(ptr(ecx, edx, 0, 128), bx));
+ TEST_INSTRUCTION("660F38F19C1180000000" , movbe(word_ptr(ecx, edx, 0, 128), bx));
+ TEST_INSTRUCTION("0F38F19C1180000000" , movbe(ptr(ecx, edx, 0, 128), ebx));
+ TEST_INSTRUCTION("0F38F19C1180000000" , movbe(dword_ptr(ecx, edx, 0, 128), ebx));
+ TEST_INSTRUCTION("660F38F88C1A80000000" , movdir64b(zmmword_ptr(ecx), zmmword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("0F38F99C1180000000" , movdiri(ptr(ecx, edx, 0, 128), ebx));
+ TEST_INSTRUCTION("0F38F99C1180000000" , movdiri(dword_ptr(ecx, edx, 0, 128), ebx));
+ TEST_INSTRUCTION("0FC39C1180000000" , movnti(ptr(ecx, edx, 0, 128), ebx));
+ TEST_INSTRUCTION("0FC39C1180000000" , movnti(dword_ptr(ecx, edx, 0, 128), ebx));
+ TEST_INSTRUCTION("A4" , movs(byte_ptr(edi), byte_ptr(esi)));
+ TEST_INSTRUCTION("66A5" , movs(word_ptr(edi), word_ptr(esi)));
+ TEST_INSTRUCTION("A5" , movs(dword_ptr(edi), dword_ptr(esi)));
+ TEST_INSTRUCTION("660FBECA" , movsx(cx, dl));
+ TEST_INSTRUCTION("660FBECE" , movsx(cx, dh));
+ TEST_INSTRUCTION("660FBE8C1A80000000" , movsx(cx, byte_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("0FBECA" , movsx(ecx, dl));
+ TEST_INSTRUCTION("0FBECE" , movsx(ecx, dh));
+ TEST_INSTRUCTION("0FBFCA" , movsx(ecx, dx));
+ TEST_INSTRUCTION("0FBE8C1A80000000" , movsx(ecx, byte_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("0FBF8C1A80000000" , movsx(ecx, word_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("660FB6CA" , movzx(cx, dl));
+ TEST_INSTRUCTION("660FB6CE" , movzx(cx, dh));
+ TEST_INSTRUCTION("660FB68C1A80000000" , movzx(cx, byte_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("0FB6CA" , movzx(ecx, dl));
+ TEST_INSTRUCTION("0FB6CE" , movzx(ecx, dh));
+ TEST_INSTRUCTION("0FB7CA" , movzx(ecx, dx));
+ TEST_INSTRUCTION("0FB68C1A80000000" , movzx(ecx, byte_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("0FB78C1A80000000" , movzx(ecx, word_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("F6E1" , mul(ax, cl));
+ TEST_INSTRUCTION("F6E5" , mul(ax, ch));
+ TEST_INSTRUCTION("F6A41180000000" , mul(ax, ptr(ecx, edx, 0, 128)));
+ TEST_INSTRUCTION("F6A41180000000" , mul(ax, byte_ptr(ecx, edx, 0, 128)));
+ TEST_INSTRUCTION("66F7E1" , mul(dx, ax, cx));
+ TEST_INSTRUCTION("66F7A41180000000" , mul(dx, ax, ptr(ecx, edx, 0, 128)));
+ TEST_INSTRUCTION("66F7A41180000000" , mul(dx, ax, word_ptr(ecx, edx, 0, 128)));
+ TEST_INSTRUCTION("F7E1" , mul(edx, eax, ecx));
+ TEST_INSTRUCTION("F7A41180000000" , mul(edx, eax, ptr(ecx, edx, 0, 128)));
+ TEST_INSTRUCTION("F7A41180000000" , mul(edx, eax, dword_ptr(ecx, edx, 0, 128)));
+ TEST_INSTRUCTION("C4E26BF6CB" , mulx(ecx, edx, ebx, edx));
+ TEST_INSTRUCTION("C4E26BF68C2B80000000" , mulx(ecx, edx, ptr(ebx, ebp, 0, 128), edx));
+ TEST_INSTRUCTION("C4E26BF68C2B80000000" , mulx(ecx, edx, dword_ptr(ebx, ebp, 0, 128), edx));
+ TEST_INSTRUCTION("0F01C9" , mwait(eax, ecx));
+ TEST_INSTRUCTION("0F01FB" , mwaitx(eax, ecx, ebx));
+ TEST_INSTRUCTION("F6D9" , neg(cl));
+ TEST_INSTRUCTION("F6DD" , neg(ch));
+ TEST_INSTRUCTION("66F7D9" , neg(cx));
+ TEST_INSTRUCTION("F7D9" , neg(ecx));
+ TEST_INSTRUCTION("F69C1180000000" , neg(byte_ptr(ecx, edx, 0, 128)));
+ TEST_INSTRUCTION("66F79C1180000000" , neg(word_ptr(ecx, edx, 0, 128)));
+ TEST_INSTRUCTION("F79C1180000000" , neg(dword_ptr(ecx, edx, 0, 128)));
+ TEST_INSTRUCTION("90" , nop());
+ TEST_INSTRUCTION("660F1FC1" , nop(cx));
+ TEST_INSTRUCTION("0F1FC1" , nop(ecx));
+ TEST_INSTRUCTION("660F1F841180000000" , nop(word_ptr(ecx, edx, 0, 128)));
+ TEST_INSTRUCTION("0F1F841180000000" , nop(dword_ptr(ecx, edx, 0, 128)));
+ TEST_INSTRUCTION("660F1FD1" , nop(cx, dx));
+ TEST_INSTRUCTION("660F1F9C1180000000" , nop(ptr(ecx, edx, 0, 128), bx));
+ TEST_INSTRUCTION("660F1F9C1180000000" , nop(word_ptr(ecx, edx, 0, 128), bx));
+ TEST_INSTRUCTION("0F1FD1" , nop(ecx, edx));
+ TEST_INSTRUCTION("0F1F9C1180000000" , nop(ptr(ecx, edx, 0, 128), ebx));
+ TEST_INSTRUCTION("0F1F9C1180000000" , nop(dword_ptr(ecx, edx, 0, 128), ebx));
+ TEST_INSTRUCTION("F6D1" , not_(cl));
+ TEST_INSTRUCTION("F6D5" , not_(ch));
+ TEST_INSTRUCTION("66F7D1" , not_(cx));
+ TEST_INSTRUCTION("F7D1" , not_(ecx));
+ TEST_INSTRUCTION("F6941180000000" , not_(byte_ptr(ecx, edx, 0, 128)));
+ TEST_INSTRUCTION("66F7941180000000" , not_(word_ptr(ecx, edx, 0, 128)));
+ TEST_INSTRUCTION("F7941180000000" , not_(dword_ptr(ecx, edx, 0, 128)));
+ TEST_INSTRUCTION("80C901" , or_(cl, 1));
+ TEST_INSTRUCTION("80CD01" , or_(ch, 1));
+ TEST_INSTRUCTION("808C118000000001" , or_(byte_ptr(ecx, edx, 0, 128), 1));
+ TEST_INSTRUCTION("6683C901" , or_(cx, 1));
+ TEST_INSTRUCTION("66838C118000000001" , or_(word_ptr(ecx, edx, 0, 128), 1));
+ TEST_INSTRUCTION("83C901" , or_(ecx, 1));
+ TEST_INSTRUCTION("838C118000000001" , or_(dword_ptr(ecx, edx, 0, 128), 1));
+ TEST_INSTRUCTION("08D1" , or_(cl, dl));
+ TEST_INSTRUCTION("08F1" , or_(cl, dh));
+ TEST_INSTRUCTION("08D5" , or_(ch, dl));
+ TEST_INSTRUCTION("08F5" , or_(ch, dh));
+ TEST_INSTRUCTION("089C1180000000" , or_(ptr(ecx, edx, 0, 128), bl));
+ TEST_INSTRUCTION("08BC1180000000" , or_(ptr(ecx, edx, 0, 128), bh));
+ TEST_INSTRUCTION("089C1180000000" , or_(byte_ptr(ecx, edx, 0, 128), bl));
+ TEST_INSTRUCTION("08BC1180000000" , or_(byte_ptr(ecx, edx, 0, 128), bh));
+ TEST_INSTRUCTION("6609D1" , or_(cx, dx));
+ TEST_INSTRUCTION("66099C1180000000" , or_(ptr(ecx, edx, 0, 128), bx));
+ TEST_INSTRUCTION("66099C1180000000" , or_(word_ptr(ecx, edx, 0, 128), bx));
+ TEST_INSTRUCTION("09D1" , or_(ecx, edx));
+ TEST_INSTRUCTION("099C1180000000" , or_(ptr(ecx, edx, 0, 128), ebx));
+ TEST_INSTRUCTION("099C1180000000" , or_(dword_ptr(ecx, edx, 0, 128), ebx));
+ TEST_INSTRUCTION("0A8C1A80000000" , or_(cl, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("0A8C1A80000000" , or_(cl, byte_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("0AAC1A80000000" , or_(ch, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("0AAC1A80000000" , or_(ch, byte_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("660B8C1A80000000" , or_(cx, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("660B8C1A80000000" , or_(cx, word_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("0B8C1A80000000" , or_(ecx, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("0B8C1A80000000" , or_(ecx, dword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("EE" , out(dx, al));
+ TEST_INSTRUCTION("66EF" , out(dx, ax));
+ TEST_INSTRUCTION("EF" , out(dx, eax));
+ TEST_INSTRUCTION("E601" , out(1, al));
+ TEST_INSTRUCTION("66E701" , out(1, ax));
+ TEST_INSTRUCTION("E701" , out(1, eax));
+ TEST_INSTRUCTION("6E" , outs(dx, byte_ptr(esi)));
+ TEST_INSTRUCTION("666F" , outs(dx, word_ptr(esi)));
+ TEST_INSTRUCTION("6F" , outs(dx, dword_ptr(esi)));
+ TEST_INSTRUCTION("F390" , pause());
+ TEST_INSTRUCTION("0F01C5" , pconfig());
+ TEST_INSTRUCTION("C4E26BF5CB" , pdep(ecx, edx, ebx));
+ TEST_INSTRUCTION("C4E26BF58C2B80000000" , pdep(ecx, edx, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C4E26BF58C2B80000000" , pdep(ecx, edx, dword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C4E26AF5CB" , pext(ecx, edx, ebx));
+ TEST_INSTRUCTION("C4E26AF58C2B80000000" , pext(ecx, edx, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C4E26AF58C2B80000000" , pext(ecx, edx, dword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("6659" , pop(cx));
+ TEST_INSTRUCTION("668F841180000000" , pop(word_ptr(ecx, edx, 0, 128)));
+ TEST_INSTRUCTION("59" , pop(ecx));
+ TEST_INSTRUCTION("8F841180000000" , pop(dword_ptr(ecx, edx, 0, 128)));
+ TEST_INSTRUCTION("0FA1" , pop(fs));
+ TEST_INSTRUCTION("6661" , popa());
+ TEST_INSTRUCTION("61" , popad());
+ TEST_INSTRUCTION("66F30FB8CA" , popcnt(cx, dx));
+ TEST_INSTRUCTION("66F30FB88C1A80000000" , popcnt(cx, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("66F30FB88C1A80000000" , popcnt(cx, word_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("F30FB8CA" , popcnt(ecx, edx));
+ TEST_INSTRUCTION("F30FB88C1A80000000" , popcnt(ecx, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("F30FB88C1A80000000" , popcnt(ecx, dword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("669D" , popf());
+ TEST_INSTRUCTION("9D" , popfd());
+ TEST_INSTRUCTION("0F0D841180000000" , prefetch(ptr(ecx, edx, 0, 128)));
+ TEST_INSTRUCTION("0F18841180000000" , prefetchnta(ptr(ecx, edx, 0, 128)));
+ TEST_INSTRUCTION("0F188C1180000000" , prefetcht0(ptr(ecx, edx, 0, 128)));
+ TEST_INSTRUCTION("0F18941180000000" , prefetcht1(ptr(ecx, edx, 0, 128)));
+ TEST_INSTRUCTION("0F189C1180000000" , prefetcht2(ptr(ecx, edx, 0, 128)));
+ TEST_INSTRUCTION("0F0D8C1180000000" , prefetchw(ptr(ecx, edx, 0, 128)));
+ TEST_INSTRUCTION("0F0D941180000000" , prefetchwt1(ptr(ecx, edx, 0, 128)));
+ TEST_INSTRUCTION("F30FAEE1" , ptwrite(ecx));
+ TEST_INSTRUCTION("F30FAEA41180000000" , ptwrite(ptr(ecx, edx, 0, 128)));
+ TEST_INSTRUCTION("F30FAEA41180000000" , ptwrite(dword_ptr(ecx, edx, 0, 128)));
+ TEST_INSTRUCTION("6651" , push(cx));
+ TEST_INSTRUCTION("6A01" , push(1));
+ TEST_INSTRUCTION("66FFB41180000000" , push(word_ptr(ecx, edx, 0, 128)));
+ TEST_INSTRUCTION("51" , push(ecx));
+ TEST_INSTRUCTION("FFB41180000000" , push(dword_ptr(ecx, edx, 0, 128)));
+ TEST_INSTRUCTION("0FA0" , push(fs));
+ TEST_INSTRUCTION("6660" , pusha());
+ TEST_INSTRUCTION("60" , pushad());
+ TEST_INSTRUCTION("669C" , pushf());
+ TEST_INSTRUCTION("9C" , pushfd());
+ TEST_INSTRUCTION("F20F01FF" , pvalidate());
+ TEST_INSTRUCTION("D2D1" , rcl(cl, cl));
+ TEST_INSTRUCTION("D0D1" , rcl(cl, 1));
+ TEST_INSTRUCTION("D2D5" , rcl(ch, cl));
+ TEST_INSTRUCTION("D0D5" , rcl(ch, 1));
+ TEST_INSTRUCTION("66D3D1" , rcl(cx, cl));
+ TEST_INSTRUCTION("66D1D1" , rcl(cx, 1));
+ TEST_INSTRUCTION("D3D1" , rcl(ecx, cl));
+ TEST_INSTRUCTION("D1D1" , rcl(ecx, 1));
+ TEST_INSTRUCTION("D2941180000000" , rcl(byte_ptr(ecx, edx, 0, 128), cl));
+ TEST_INSTRUCTION("D0941180000000" , rcl(byte_ptr(ecx, edx, 0, 128), 1));
+ TEST_INSTRUCTION("66D3941180000000" , rcl(word_ptr(ecx, edx, 0, 128), cl));
+ TEST_INSTRUCTION("66D1941180000000" , rcl(word_ptr(ecx, edx, 0, 128), 1));
+ TEST_INSTRUCTION("D3941180000000" , rcl(dword_ptr(ecx, edx, 0, 128), cl));
+ TEST_INSTRUCTION("D1941180000000" , rcl(dword_ptr(ecx, edx, 0, 128), 1));
+ TEST_INSTRUCTION("D2D9" , rcr(cl, cl));
+ TEST_INSTRUCTION("D0D9" , rcr(cl, 1));
+ TEST_INSTRUCTION("D2DD" , rcr(ch, cl));
+ TEST_INSTRUCTION("D0DD" , rcr(ch, 1));
+ TEST_INSTRUCTION("66D3D9" , rcr(cx, cl));
+ TEST_INSTRUCTION("66D1D9" , rcr(cx, 1));
+ TEST_INSTRUCTION("D3D9" , rcr(ecx, cl));
+ TEST_INSTRUCTION("D1D9" , rcr(ecx, 1));
+ TEST_INSTRUCTION("D29C1180000000" , rcr(byte_ptr(ecx, edx, 0, 128), cl));
+ TEST_INSTRUCTION("D09C1180000000" , rcr(byte_ptr(ecx, edx, 0, 128), 1));
+ TEST_INSTRUCTION("66D39C1180000000" , rcr(word_ptr(ecx, edx, 0, 128), cl));
+ TEST_INSTRUCTION("66D19C1180000000" , rcr(word_ptr(ecx, edx, 0, 128), 1));
+ TEST_INSTRUCTION("D39C1180000000" , rcr(dword_ptr(ecx, edx, 0, 128), cl));
+ TEST_INSTRUCTION("D19C1180000000" , rcr(dword_ptr(ecx, edx, 0, 128), 1));
+ TEST_INSTRUCTION("0F32" , rdmsr(edx, eax, ecx));
+ TEST_INSTRUCTION("F30FC7F9" , rdpid(ecx));
+ TEST_INSTRUCTION("0F01EE" , rdpkru(edx, eax, ecx));
+ TEST_INSTRUCTION("0F33" , rdpmc(edx, eax, ecx));
+ TEST_INSTRUCTION("0F01FD" , rdpru(edx, eax, ecx));
+ TEST_INSTRUCTION("660FC7F1" , rdrand(cx));
+ TEST_INSTRUCTION("0FC7F1" , rdrand(ecx));
+ TEST_INSTRUCTION("660FC7F9" , rdseed(cx));
+ TEST_INSTRUCTION("0FC7F9" , rdseed(ecx));
+ TEST_INSTRUCTION("F30F1EC9" , rdsspd(ecx));
+ TEST_INSTRUCTION("0F31" , rdtsc(edx, eax));
+ TEST_INSTRUCTION("0F01F9" , rdtscp(edx, eax, ecx));
+ TEST_INSTRUCTION("C3" , ret());
+ TEST_INSTRUCTION("C20100" , ret(1));
+ TEST_INSTRUCTION("CB" , retf());
+ TEST_INSTRUCTION("CA0100" , retf(1));
+ TEST_INSTRUCTION("D2C1" , rol(cl, cl));
+ TEST_INSTRUCTION("D0C1" , rol(cl, 1));
+ TEST_INSTRUCTION("D2C5" , rol(ch, cl));
+ TEST_INSTRUCTION("D0C5" , rol(ch, 1));
+ TEST_INSTRUCTION("66D3C1" , rol(cx, cl));
+ TEST_INSTRUCTION("66D1C1" , rol(cx, 1));
+ TEST_INSTRUCTION("D3C1" , rol(ecx, cl));
+ TEST_INSTRUCTION("D1C1" , rol(ecx, 1));
+ TEST_INSTRUCTION("D2841180000000" , rol(byte_ptr(ecx, edx, 0, 128), cl));
+ TEST_INSTRUCTION("D0841180000000" , rol(byte_ptr(ecx, edx, 0, 128), 1));
+ TEST_INSTRUCTION("66D3841180000000" , rol(word_ptr(ecx, edx, 0, 128), cl));
+ TEST_INSTRUCTION("66D1841180000000" , rol(word_ptr(ecx, edx, 0, 128), 1));
+ TEST_INSTRUCTION("D3841180000000" , rol(dword_ptr(ecx, edx, 0, 128), cl));
+ TEST_INSTRUCTION("D1841180000000" , rol(dword_ptr(ecx, edx, 0, 128), 1));
+ TEST_INSTRUCTION("D2C9" , ror(cl, cl));
+ TEST_INSTRUCTION("D0C9" , ror(cl, 1));
+ TEST_INSTRUCTION("D2CD" , ror(ch, cl));
+ TEST_INSTRUCTION("D0CD" , ror(ch, 1));
+ TEST_INSTRUCTION("66D3C9" , ror(cx, cl));
+ TEST_INSTRUCTION("66D1C9" , ror(cx, 1));
+ TEST_INSTRUCTION("D3C9" , ror(ecx, cl));
+ TEST_INSTRUCTION("D1C9" , ror(ecx, 1));
+ TEST_INSTRUCTION("D28C1180000000" , ror(byte_ptr(ecx, edx, 0, 128), cl));
+ TEST_INSTRUCTION("D08C1180000000" , ror(byte_ptr(ecx, edx, 0, 128), 1));
+ TEST_INSTRUCTION("66D38C1180000000" , ror(word_ptr(ecx, edx, 0, 128), cl));
+ TEST_INSTRUCTION("66D18C1180000000" , ror(word_ptr(ecx, edx, 0, 128), 1));
+ TEST_INSTRUCTION("D38C1180000000" , ror(dword_ptr(ecx, edx, 0, 128), cl));
+ TEST_INSTRUCTION("D18C1180000000" , ror(dword_ptr(ecx, edx, 0, 128), 1));
+ TEST_INSTRUCTION("C4E37BF0CA01" , rorx(ecx, edx, 1));
+ TEST_INSTRUCTION("C4E37BF08C1A8000000001" , rorx(ecx, ptr(edx, ebx, 0, 128), 1));
+ TEST_INSTRUCTION("C4E37BF08C1A8000000001" , rorx(ecx, dword_ptr(edx, ebx, 0, 128), 1));
+ TEST_INSTRUCTION("0FAA" , rsm());
+ TEST_INSTRUCTION("F30F01AC1180000000" , rstorssp(ptr(ecx, edx, 0, 128)));
+ TEST_INSTRUCTION("F30F01AC1180000000" , rstorssp(qword_ptr(ecx, edx, 0, 128)));
+ TEST_INSTRUCTION("9E" , sahf(ah));
+ TEST_INSTRUCTION("D2E1" , sal(cl, cl));
+ TEST_INSTRUCTION("D0E1" , sal(cl, 1));
+ TEST_INSTRUCTION("D2E5" , sal(ch, cl));
+ TEST_INSTRUCTION("D0E5" , sal(ch, 1));
+ TEST_INSTRUCTION("66D3E1" , sal(cx, cl));
+ TEST_INSTRUCTION("66D1E1" , sal(cx, 1));
+ TEST_INSTRUCTION("D3E1" , sal(ecx, cl));
+ TEST_INSTRUCTION("D1E1" , sal(ecx, 1));
+ TEST_INSTRUCTION("D2A41180000000" , sal(byte_ptr(ecx, edx, 0, 128), cl));
+ TEST_INSTRUCTION("D0A41180000000" , sal(byte_ptr(ecx, edx, 0, 128), 1));
+ TEST_INSTRUCTION("66D3A41180000000" , sal(word_ptr(ecx, edx, 0, 128), cl));
+ TEST_INSTRUCTION("66D1A41180000000" , sal(word_ptr(ecx, edx, 0, 128), 1));
+ TEST_INSTRUCTION("D3A41180000000" , sal(dword_ptr(ecx, edx, 0, 128), cl));
+ TEST_INSTRUCTION("D1A41180000000" , sal(dword_ptr(ecx, edx, 0, 128), 1));
+ TEST_INSTRUCTION("D2F9" , sar(cl, cl));
+ TEST_INSTRUCTION("D0F9" , sar(cl, 1));
+ TEST_INSTRUCTION("D2FD" , sar(ch, cl));
+ TEST_INSTRUCTION("D0FD" , sar(ch, 1));
+ TEST_INSTRUCTION("66D3F9" , sar(cx, cl));
+ TEST_INSTRUCTION("66D1F9" , sar(cx, 1));
+ TEST_INSTRUCTION("D3F9" , sar(ecx, cl));
+ TEST_INSTRUCTION("D1F9" , sar(ecx, 1));
+ TEST_INSTRUCTION("D2BC1180000000" , sar(byte_ptr(ecx, edx, 0, 128), cl));
+ TEST_INSTRUCTION("D0BC1180000000" , sar(byte_ptr(ecx, edx, 0, 128), 1));
+ TEST_INSTRUCTION("66D3BC1180000000" , sar(word_ptr(ecx, edx, 0, 128), cl));
+ TEST_INSTRUCTION("66D1BC1180000000" , sar(word_ptr(ecx, edx, 0, 128), 1));
+ TEST_INSTRUCTION("D3BC1180000000" , sar(dword_ptr(ecx, edx, 0, 128), cl));
+ TEST_INSTRUCTION("D1BC1180000000" , sar(dword_ptr(ecx, edx, 0, 128), 1));
+ TEST_INSTRUCTION("C4E262F7CA" , sarx(ecx, edx, ebx));
+ TEST_INSTRUCTION("C4E25AF78C1A80000000" , sarx(ecx, ptr(edx, ebx, 0, 128), esp));
+ TEST_INSTRUCTION("C4E25AF78C1A80000000" , sarx(ecx, dword_ptr(edx, ebx, 0, 128), esp));
+ TEST_INSTRUCTION("F30F01EA" , saveprevssp());
+ TEST_INSTRUCTION("80D901" , sbb(cl, 1));
+ TEST_INSTRUCTION("80DD01" , sbb(ch, 1));
+ TEST_INSTRUCTION("809C118000000001" , sbb(byte_ptr(ecx, edx, 0, 128), 1));
+ TEST_INSTRUCTION("6683D901" , sbb(cx, 1));
+ TEST_INSTRUCTION("66839C118000000001" , sbb(word_ptr(ecx, edx, 0, 128), 1));
+ TEST_INSTRUCTION("83D901" , sbb(ecx, 1));
+ TEST_INSTRUCTION("839C118000000001" , sbb(dword_ptr(ecx, edx, 0, 128), 1));
+ TEST_INSTRUCTION("18D1" , sbb(cl, dl));
+ TEST_INSTRUCTION("18F1" , sbb(cl, dh));
+ TEST_INSTRUCTION("18D5" , sbb(ch, dl));
+ TEST_INSTRUCTION("18F5" , sbb(ch, dh));
+ TEST_INSTRUCTION("189C1180000000" , sbb(ptr(ecx, edx, 0, 128), bl));
+ TEST_INSTRUCTION("18BC1180000000" , sbb(ptr(ecx, edx, 0, 128), bh));
+ TEST_INSTRUCTION("189C1180000000" , sbb(byte_ptr(ecx, edx, 0, 128), bl));
+ TEST_INSTRUCTION("18BC1180000000" , sbb(byte_ptr(ecx, edx, 0, 128), bh));
+ TEST_INSTRUCTION("6619D1" , sbb(cx, dx));
+ TEST_INSTRUCTION("66199C1180000000" , sbb(ptr(ecx, edx, 0, 128), bx));
+ TEST_INSTRUCTION("66199C1180000000" , sbb(word_ptr(ecx, edx, 0, 128), bx));
+ TEST_INSTRUCTION("19D1" , sbb(ecx, edx));
+ TEST_INSTRUCTION("199C1180000000" , sbb(ptr(ecx, edx, 0, 128), ebx));
+ TEST_INSTRUCTION("199C1180000000" , sbb(dword_ptr(ecx, edx, 0, 128), ebx));
+ TEST_INSTRUCTION("1A8C1A80000000" , sbb(cl, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("1A8C1A80000000" , sbb(cl, byte_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("1AAC1A80000000" , sbb(ch, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("1AAC1A80000000" , sbb(ch, byte_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("661B8C1A80000000" , sbb(cx, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("661B8C1A80000000" , sbb(cx, word_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("1B8C1A80000000" , sbb(ecx, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("1B8C1A80000000" , sbb(ecx, dword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("AE" , scas(al, ptr(edi)));
+ TEST_INSTRUCTION("AE" , scas(al, byte_ptr(edi)));
+ TEST_INSTRUCTION("66AF" , scas(ax, ptr(edi)));
+ TEST_INSTRUCTION("66AF" , scas(ax, word_ptr(edi)));
+ TEST_INSTRUCTION("AF" , scas(eax, ptr(edi)));
+ TEST_INSTRUCTION("AF" , scas(eax, dword_ptr(edi)));
+ TEST_INSTRUCTION("0F01E8" , serialize());
+ TEST_INSTRUCTION("0F97C1" , seta(cl));
+ TEST_INSTRUCTION("0F97C5" , seta(ch));
+ TEST_INSTRUCTION("0F97841180000000" , seta(ptr(ecx, edx, 0, 128)));
+ TEST_INSTRUCTION("0F97841180000000" , seta(byte_ptr(ecx, edx, 0, 128)));
+ TEST_INSTRUCTION("0F93C1" , setae(cl));
+ TEST_INSTRUCTION("0F93C5" , setae(ch));
+ TEST_INSTRUCTION("0F93841180000000" , setae(ptr(ecx, edx, 0, 128)));
+ TEST_INSTRUCTION("0F93841180000000" , setae(byte_ptr(ecx, edx, 0, 128)));
+ TEST_INSTRUCTION("0F92C1" , setb(cl));
+ TEST_INSTRUCTION("0F92C5" , setb(ch));
+ TEST_INSTRUCTION("0F92841180000000" , setb(ptr(ecx, edx, 0, 128)));
+ TEST_INSTRUCTION("0F92841180000000" , setb(byte_ptr(ecx, edx, 0, 128)));
+ TEST_INSTRUCTION("0F96C1" , setbe(cl));
+ TEST_INSTRUCTION("0F96C5" , setbe(ch));
+ TEST_INSTRUCTION("0F96841180000000" , setbe(ptr(ecx, edx, 0, 128)));
+ TEST_INSTRUCTION("0F96841180000000" , setbe(byte_ptr(ecx, edx, 0, 128)));
+ TEST_INSTRUCTION("0F92C1" , setc(cl));
+ TEST_INSTRUCTION("0F92C5" , setc(ch));
+ TEST_INSTRUCTION("0F92841180000000" , setc(ptr(ecx, edx, 0, 128)));
+ TEST_INSTRUCTION("0F92841180000000" , setc(byte_ptr(ecx, edx, 0, 128)));
+ TEST_INSTRUCTION("0F94C1" , sete(cl));
+ TEST_INSTRUCTION("0F94C5" , sete(ch));
+ TEST_INSTRUCTION("0F94841180000000" , sete(ptr(ecx, edx, 0, 128)));
+ TEST_INSTRUCTION("0F94841180000000" , sete(byte_ptr(ecx, edx, 0, 128)));
+ TEST_INSTRUCTION("0F9FC1" , setg(cl));
+ TEST_INSTRUCTION("0F9FC5" , setg(ch));
+ TEST_INSTRUCTION("0F9F841180000000" , setg(ptr(ecx, edx, 0, 128)));
+ TEST_INSTRUCTION("0F9F841180000000" , setg(byte_ptr(ecx, edx, 0, 128)));
+ TEST_INSTRUCTION("0F9DC1" , setge(cl));
+ TEST_INSTRUCTION("0F9DC5" , setge(ch));
+ TEST_INSTRUCTION("0F9D841180000000" , setge(ptr(ecx, edx, 0, 128)));
+ TEST_INSTRUCTION("0F9D841180000000" , setge(byte_ptr(ecx, edx, 0, 128)));
+ TEST_INSTRUCTION("0F9CC1" , setl(cl));
+ TEST_INSTRUCTION("0F9CC5" , setl(ch));
+ TEST_INSTRUCTION("0F9C841180000000" , setl(ptr(ecx, edx, 0, 128)));
+ TEST_INSTRUCTION("0F9C841180000000" , setl(byte_ptr(ecx, edx, 0, 128)));
+ TEST_INSTRUCTION("0F9EC1" , setle(cl));
+ TEST_INSTRUCTION("0F9EC5" , setle(ch));
+ TEST_INSTRUCTION("0F9E841180000000" , setle(ptr(ecx, edx, 0, 128)));
+ TEST_INSTRUCTION("0F9E841180000000" , setle(byte_ptr(ecx, edx, 0, 128)));
+ TEST_INSTRUCTION("0F96C1" , setna(cl));
+ TEST_INSTRUCTION("0F96C5" , setna(ch));
+ TEST_INSTRUCTION("0F96841180000000" , setna(ptr(ecx, edx, 0, 128)));
+ TEST_INSTRUCTION("0F96841180000000" , setna(byte_ptr(ecx, edx, 0, 128)));
+ TEST_INSTRUCTION("0F92C1" , setnae(cl));
+ TEST_INSTRUCTION("0F92C5" , setnae(ch));
+ TEST_INSTRUCTION("0F92841180000000" , setnae(ptr(ecx, edx, 0, 128)));
+ TEST_INSTRUCTION("0F92841180000000" , setnae(byte_ptr(ecx, edx, 0, 128)));
+ TEST_INSTRUCTION("0F93C1" , setnb(cl));
+ TEST_INSTRUCTION("0F93C5" , setnb(ch));
+ TEST_INSTRUCTION("0F93841180000000" , setnb(ptr(ecx, edx, 0, 128)));
+ TEST_INSTRUCTION("0F93841180000000" , setnb(byte_ptr(ecx, edx, 0, 128)));
+ TEST_INSTRUCTION("0F97C1" , setnbe(cl));
+ TEST_INSTRUCTION("0F97C5" , setnbe(ch));
+ TEST_INSTRUCTION("0F97841180000000" , setnbe(ptr(ecx, edx, 0, 128)));
+ TEST_INSTRUCTION("0F97841180000000" , setnbe(byte_ptr(ecx, edx, 0, 128)));
+ TEST_INSTRUCTION("0F93C1" , setnc(cl));
+ TEST_INSTRUCTION("0F93C5" , setnc(ch));
+ TEST_INSTRUCTION("0F93841180000000" , setnc(ptr(ecx, edx, 0, 128)));
+ TEST_INSTRUCTION("0F93841180000000" , setnc(byte_ptr(ecx, edx, 0, 128)));
+ TEST_INSTRUCTION("0F95C1" , setne(cl));
+ TEST_INSTRUCTION("0F95C5" , setne(ch));
+ TEST_INSTRUCTION("0F95841180000000" , setne(ptr(ecx, edx, 0, 128)));
+ TEST_INSTRUCTION("0F95841180000000" , setne(byte_ptr(ecx, edx, 0, 128)));
+ TEST_INSTRUCTION("0F9EC1" , setng(cl));
+ TEST_INSTRUCTION("0F9EC5" , setng(ch));
+ TEST_INSTRUCTION("0F9E841180000000" , setng(ptr(ecx, edx, 0, 128)));
+ TEST_INSTRUCTION("0F9E841180000000" , setng(byte_ptr(ecx, edx, 0, 128)));
+ TEST_INSTRUCTION("0F9CC1" , setnge(cl));
+ TEST_INSTRUCTION("0F9CC5" , setnge(ch));
+ TEST_INSTRUCTION("0F9C841180000000" , setnge(ptr(ecx, edx, 0, 128)));
+ TEST_INSTRUCTION("0F9C841180000000" , setnge(byte_ptr(ecx, edx, 0, 128)));
+ TEST_INSTRUCTION("0F9DC1" , setnl(cl));
+ TEST_INSTRUCTION("0F9DC5" , setnl(ch));
+ TEST_INSTRUCTION("0F9D841180000000" , setnl(ptr(ecx, edx, 0, 128)));
+ TEST_INSTRUCTION("0F9D841180000000" , setnl(byte_ptr(ecx, edx, 0, 128)));
+ TEST_INSTRUCTION("0F9FC1" , setnle(cl));
+ TEST_INSTRUCTION("0F9FC5" , setnle(ch));
+ TEST_INSTRUCTION("0F9F841180000000" , setnle(ptr(ecx, edx, 0, 128)));
+ TEST_INSTRUCTION("0F9F841180000000" , setnle(byte_ptr(ecx, edx, 0, 128)));
+ TEST_INSTRUCTION("0F91C1" , setno(cl));
+ TEST_INSTRUCTION("0F91C5" , setno(ch));
+ TEST_INSTRUCTION("0F91841180000000" , setno(ptr(ecx, edx, 0, 128)));
+ TEST_INSTRUCTION("0F91841180000000" , setno(byte_ptr(ecx, edx, 0, 128)));
+ TEST_INSTRUCTION("0F9BC1" , setnp(cl));
+ TEST_INSTRUCTION("0F9BC5" , setnp(ch));
+ TEST_INSTRUCTION("0F9B841180000000" , setnp(ptr(ecx, edx, 0, 128)));
+ TEST_INSTRUCTION("0F9B841180000000" , setnp(byte_ptr(ecx, edx, 0, 128)));
+ TEST_INSTRUCTION("0F99C1" , setns(cl));
+ TEST_INSTRUCTION("0F99C5" , setns(ch));
+ TEST_INSTRUCTION("0F99841180000000" , setns(ptr(ecx, edx, 0, 128)));
+ TEST_INSTRUCTION("0F99841180000000" , setns(byte_ptr(ecx, edx, 0, 128)));
+ TEST_INSTRUCTION("0F95C1" , setnz(cl));
+ TEST_INSTRUCTION("0F95C5" , setnz(ch));
+ TEST_INSTRUCTION("0F95841180000000" , setnz(ptr(ecx, edx, 0, 128)));
+ TEST_INSTRUCTION("0F95841180000000" , setnz(byte_ptr(ecx, edx, 0, 128)));
+ TEST_INSTRUCTION("0F90C1" , seto(cl));
+ TEST_INSTRUCTION("0F90C5" , seto(ch));
+ TEST_INSTRUCTION("0F90841180000000" , seto(ptr(ecx, edx, 0, 128)));
+ TEST_INSTRUCTION("0F90841180000000" , seto(byte_ptr(ecx, edx, 0, 128)));
+ TEST_INSTRUCTION("0F9AC1" , setp(cl));
+ TEST_INSTRUCTION("0F9AC5" , setp(ch));
+ TEST_INSTRUCTION("0F9A841180000000" , setp(ptr(ecx, edx, 0, 128)));
+ TEST_INSTRUCTION("0F9A841180000000" , setp(byte_ptr(ecx, edx, 0, 128)));
+ TEST_INSTRUCTION("0F9AC1" , setpe(cl));
+ TEST_INSTRUCTION("0F9AC5" , setpe(ch));
+ TEST_INSTRUCTION("0F9A841180000000" , setpe(ptr(ecx, edx, 0, 128)));
+ TEST_INSTRUCTION("0F9A841180000000" , setpe(byte_ptr(ecx, edx, 0, 128)));
+ TEST_INSTRUCTION("0F9BC1" , setpo(cl));
+ TEST_INSTRUCTION("0F9BC5" , setpo(ch));
+ TEST_INSTRUCTION("0F9B841180000000" , setpo(ptr(ecx, edx, 0, 128)));
+ TEST_INSTRUCTION("0F9B841180000000" , setpo(byte_ptr(ecx, edx, 0, 128)));
+ TEST_INSTRUCTION("0F98C1" , sets(cl));
+ TEST_INSTRUCTION("0F98C5" , sets(ch));
+ TEST_INSTRUCTION("0F98841180000000" , sets(ptr(ecx, edx, 0, 128)));
+ TEST_INSTRUCTION("0F98841180000000" , sets(byte_ptr(ecx, edx, 0, 128)));
+ TEST_INSTRUCTION("F30F01E8" , setssbsy());
+ TEST_INSTRUCTION("0F94C1" , setz(cl));
+ TEST_INSTRUCTION("0F94C5" , setz(ch));
+ TEST_INSTRUCTION("0F94841180000000" , setz(ptr(ecx, edx, 0, 128)));
+ TEST_INSTRUCTION("0F94841180000000" , setz(byte_ptr(ecx, edx, 0, 128)));
+ TEST_INSTRUCTION("0FAEF8" , sfence());
+ TEST_INSTRUCTION("0F01841180000000" , sgdt(ptr(ecx, edx, 0, 128)));
+ TEST_INSTRUCTION("D2E1" , shl(cl, cl));
+ TEST_INSTRUCTION("D0E1" , shl(cl, 1));
+ TEST_INSTRUCTION("D2E5" , shl(ch, cl));
+ TEST_INSTRUCTION("D0E5" , shl(ch, 1));
+ TEST_INSTRUCTION("66D3E1" , shl(cx, cl));
+ TEST_INSTRUCTION("66D1E1" , shl(cx, 1));
+ TEST_INSTRUCTION("D3E1" , shl(ecx, cl));
+ TEST_INSTRUCTION("D1E1" , shl(ecx, 1));
+ TEST_INSTRUCTION("D2A41180000000" , shl(byte_ptr(ecx, edx, 0, 128), cl));
+ TEST_INSTRUCTION("D0A41180000000" , shl(byte_ptr(ecx, edx, 0, 128), 1));
+ TEST_INSTRUCTION("66D3A41180000000" , shl(word_ptr(ecx, edx, 0, 128), cl));
+ TEST_INSTRUCTION("66D1A41180000000" , shl(word_ptr(ecx, edx, 0, 128), 1));
+ TEST_INSTRUCTION("D3A41180000000" , shl(dword_ptr(ecx, edx, 0, 128), cl));
+ TEST_INSTRUCTION("D1A41180000000" , shl(dword_ptr(ecx, edx, 0, 128), 1));
+ TEST_INSTRUCTION("660FA5D1" , shld(cx, dx, cl));
+ TEST_INSTRUCTION("660FA4D101" , shld(cx, dx, 1));
+ TEST_INSTRUCTION("660FA59C1180000000" , shld(ptr(ecx, edx, 0, 128), bx, cl));
+ TEST_INSTRUCTION("660FA49C118000000001" , shld(ptr(ecx, edx, 0, 128), bx, 1));
+ TEST_INSTRUCTION("660FA59C1180000000" , shld(word_ptr(ecx, edx, 0, 128), bx, cl));
+ TEST_INSTRUCTION("660FA49C118000000001" , shld(word_ptr(ecx, edx, 0, 128), bx, 1));
+ TEST_INSTRUCTION("0FA5D1" , shld(ecx, edx, cl));
+ TEST_INSTRUCTION("0FA4D101" , shld(ecx, edx, 1));
+ TEST_INSTRUCTION("0FA59C1180000000" , shld(ptr(ecx, edx, 0, 128), ebx, cl));
+ TEST_INSTRUCTION("0FA49C118000000001" , shld(ptr(ecx, edx, 0, 128), ebx, 1));
+ TEST_INSTRUCTION("0FA59C1180000000" , shld(dword_ptr(ecx, edx, 0, 128), ebx, cl));
+ TEST_INSTRUCTION("0FA49C118000000001" , shld(dword_ptr(ecx, edx, 0, 128), ebx, 1));
+ TEST_INSTRUCTION("C4E261F7CA" , shlx(ecx, edx, ebx));
+ TEST_INSTRUCTION("C4E259F78C1A80000000" , shlx(ecx, ptr(edx, ebx, 0, 128), esp));
+ TEST_INSTRUCTION("C4E259F78C1A80000000" , shlx(ecx, dword_ptr(edx, ebx, 0, 128), esp));
+ TEST_INSTRUCTION("D2E9" , shr(cl, cl));
+ TEST_INSTRUCTION("D0E9" , shr(cl, 1));
+ TEST_INSTRUCTION("D2ED" , shr(ch, cl));
+ TEST_INSTRUCTION("D0ED" , shr(ch, 1));
+ TEST_INSTRUCTION("66D3E9" , shr(cx, cl));
+ TEST_INSTRUCTION("66D1E9" , shr(cx, 1));
+ TEST_INSTRUCTION("D3E9" , shr(ecx, cl));
+ TEST_INSTRUCTION("D1E9" , shr(ecx, 1));
+ TEST_INSTRUCTION("D2AC1180000000" , shr(byte_ptr(ecx, edx, 0, 128), cl));
+ TEST_INSTRUCTION("D0AC1180000000" , shr(byte_ptr(ecx, edx, 0, 128), 1));
+ TEST_INSTRUCTION("66D3AC1180000000" , shr(word_ptr(ecx, edx, 0, 128), cl));
+ TEST_INSTRUCTION("66D1AC1180000000" , shr(word_ptr(ecx, edx, 0, 128), 1));
+ TEST_INSTRUCTION("D3AC1180000000" , shr(dword_ptr(ecx, edx, 0, 128), cl));
+ TEST_INSTRUCTION("D1AC1180000000" , shr(dword_ptr(ecx, edx, 0, 128), 1));
+ TEST_INSTRUCTION("660FADD1" , shrd(cx, dx, cl));
+ TEST_INSTRUCTION("660FACD101" , shrd(cx, dx, 1));
+ TEST_INSTRUCTION("660FAD9C1180000000" , shrd(ptr(ecx, edx, 0, 128), bx, cl));
+ TEST_INSTRUCTION("660FAC9C118000000001" , shrd(ptr(ecx, edx, 0, 128), bx, 1));
+ TEST_INSTRUCTION("660FAD9C1180000000" , shrd(word_ptr(ecx, edx, 0, 128), bx, cl));
+ TEST_INSTRUCTION("660FAC9C118000000001" , shrd(word_ptr(ecx, edx, 0, 128), bx, 1));
+ TEST_INSTRUCTION("0FADD1" , shrd(ecx, edx, cl));
+ TEST_INSTRUCTION("0FACD101" , shrd(ecx, edx, 1));
+ TEST_INSTRUCTION("0FAD9C1180000000" , shrd(ptr(ecx, edx, 0, 128), ebx, cl));
+ TEST_INSTRUCTION("0FAC9C118000000001" , shrd(ptr(ecx, edx, 0, 128), ebx, 1));
+ TEST_INSTRUCTION("0FAD9C1180000000" , shrd(dword_ptr(ecx, edx, 0, 128), ebx, cl));
+ TEST_INSTRUCTION("0FAC9C118000000001" , shrd(dword_ptr(ecx, edx, 0, 128), ebx, 1));
+ TEST_INSTRUCTION("C4E263F7CA" , shrx(ecx, edx, ebx));
+ TEST_INSTRUCTION("C4E25BF78C1A80000000" , shrx(ecx, ptr(edx, ebx, 0, 128), esp));
+ TEST_INSTRUCTION("C4E25BF78C1A80000000" , shrx(ecx, dword_ptr(edx, ebx, 0, 128), esp));
+ TEST_INSTRUCTION("0F018C1180000000" , sidt(ptr(ecx, edx, 0, 128)));
+ TEST_INSTRUCTION("0F01DE" , skinit(eax));
+ TEST_INSTRUCTION("660F00C1" , sldt(cx));
+ TEST_INSTRUCTION("0F00C1" , sldt(ecx));
+ TEST_INSTRUCTION("0F00841180000000" , sldt(ptr(ecx, edx, 0, 128)));
+ TEST_INSTRUCTION("0F00841180000000" , sldt(word_ptr(ecx, edx, 0, 128)));
+ TEST_INSTRUCTION("8FE97812C9" , slwpcb(ecx));
+ TEST_INSTRUCTION("660F01E1" , smsw(cx));
+ TEST_INSTRUCTION("0F01E1" , smsw(ecx));
+ TEST_INSTRUCTION("0F01A41180000000" , smsw(ptr(ecx, edx, 0, 128)));
+ TEST_INSTRUCTION("0F01A41180000000" , smsw(word_ptr(ecx, edx, 0, 128)));
+ TEST_INSTRUCTION("0F01CB" , stac());
+ TEST_INSTRUCTION("F9" , stc());
+ TEST_INSTRUCTION("FD" , std());
+ TEST_INSTRUCTION("0F01DC" , stgi());
+ TEST_INSTRUCTION("FB" , sti());
+ TEST_INSTRUCTION("0FAE9C1180000000" , stmxcsr(ptr(ecx, edx, 0, 128)));
+ TEST_INSTRUCTION("0FAE9C1180000000" , stmxcsr(dword_ptr(ecx, edx, 0, 128)));
+ TEST_INSTRUCTION("AA" , stos(ptr(edi), al));
+ TEST_INSTRUCTION("AA" , stos(byte_ptr(edi), al));
+ TEST_INSTRUCTION("66AB" , stos(ptr(edi), ax));
+ TEST_INSTRUCTION("66AB" , stos(word_ptr(edi), ax));
+ TEST_INSTRUCTION("AB" , stos(ptr(edi), eax));
+ TEST_INSTRUCTION("AB" , stos(dword_ptr(edi), eax));
+ TEST_INSTRUCTION("660F00C9" , str(cx));
+ TEST_INSTRUCTION("0F00C9" , str(ecx));
+ TEST_INSTRUCTION("0F008C1180000000" , str(ptr(ecx, edx, 0, 128)));
+ TEST_INSTRUCTION("0F008C1180000000" , str(word_ptr(ecx, edx, 0, 128)));
+ TEST_INSTRUCTION("80E901" , sub(cl, 1));
+ TEST_INSTRUCTION("80ED01" , sub(ch, 1));
+ TEST_INSTRUCTION("80AC118000000001" , sub(byte_ptr(ecx, edx, 0, 128), 1));
+ TEST_INSTRUCTION("6683E901" , sub(cx, 1));
+ TEST_INSTRUCTION("6683AC118000000001" , sub(word_ptr(ecx, edx, 0, 128), 1));
+ TEST_INSTRUCTION("83E901" , sub(ecx, 1));
+ TEST_INSTRUCTION("83AC118000000001" , sub(dword_ptr(ecx, edx, 0, 128), 1));
+ TEST_INSTRUCTION("28D1" , sub(cl, dl));
+ TEST_INSTRUCTION("28F1" , sub(cl, dh));
+ TEST_INSTRUCTION("28D5" , sub(ch, dl));
+ TEST_INSTRUCTION("28F5" , sub(ch, dh));
+ TEST_INSTRUCTION("289C1180000000" , sub(ptr(ecx, edx, 0, 128), bl));
+ TEST_INSTRUCTION("28BC1180000000" , sub(ptr(ecx, edx, 0, 128), bh));
+ TEST_INSTRUCTION("289C1180000000" , sub(byte_ptr(ecx, edx, 0, 128), bl));
+ TEST_INSTRUCTION("28BC1180000000" , sub(byte_ptr(ecx, edx, 0, 128), bh));
+ TEST_INSTRUCTION("6629D1" , sub(cx, dx));
+ TEST_INSTRUCTION("66299C1180000000" , sub(ptr(ecx, edx, 0, 128), bx));
+ TEST_INSTRUCTION("66299C1180000000" , sub(word_ptr(ecx, edx, 0, 128), bx));
+ TEST_INSTRUCTION("29D1" , sub(ecx, edx));
+ TEST_INSTRUCTION("299C1180000000" , sub(ptr(ecx, edx, 0, 128), ebx));
+ TEST_INSTRUCTION("299C1180000000" , sub(dword_ptr(ecx, edx, 0, 128), ebx));
+ TEST_INSTRUCTION("2A8C1A80000000" , sub(cl, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("2A8C1A80000000" , sub(cl, byte_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("2AAC1A80000000" , sub(ch, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("2AAC1A80000000" , sub(ch, byte_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("662B8C1A80000000" , sub(cx, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("662B8C1A80000000" , sub(cx, word_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("2B8C1A80000000" , sub(ecx, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("2B8C1A80000000" , sub(ecx, dword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("0F34" , sysenter());
+ TEST_INSTRUCTION("0F35" , sysexit());
+ TEST_INSTRUCTION("8FE97001FA" , t1mskc(ecx, edx));
+ TEST_INSTRUCTION("8FE97001BC1A80000000" , t1mskc(ecx, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("8FE97001BC1A80000000" , t1mskc(ecx, dword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("F6C101" , test(cl, 1));
+ TEST_INSTRUCTION("F6C501" , test(ch, 1));
+ TEST_INSTRUCTION("F684118000000001" , test(byte_ptr(ecx, edx, 0, 128), 1));
+ TEST_INSTRUCTION("66F7C10100" , test(cx, 1));
+ TEST_INSTRUCTION("66F78411800000000100" , test(word_ptr(ecx, edx, 0, 128), 1));
+ TEST_INSTRUCTION("F7C101000000" , test(ecx, 1));
+ TEST_INSTRUCTION("F784118000000001000000" , test(dword_ptr(ecx, edx, 0, 128), 1));
+ TEST_INSTRUCTION("84D1" , test(cl, dl));
+ TEST_INSTRUCTION("84F1" , test(cl, dh));
+ TEST_INSTRUCTION("84D5" , test(ch, dl));
+ TEST_INSTRUCTION("84F5" , test(ch, dh));
+ TEST_INSTRUCTION("849C1180000000" , test(ptr(ecx, edx, 0, 128), bl));
+ TEST_INSTRUCTION("84BC1180000000" , test(ptr(ecx, edx, 0, 128), bh));
+ TEST_INSTRUCTION("849C1180000000" , test(byte_ptr(ecx, edx, 0, 128), bl));
+ TEST_INSTRUCTION("84BC1180000000" , test(byte_ptr(ecx, edx, 0, 128), bh));
+ TEST_INSTRUCTION("6685D1" , test(cx, dx));
+ TEST_INSTRUCTION("66859C1180000000" , test(ptr(ecx, edx, 0, 128), bx));
+ TEST_INSTRUCTION("66859C1180000000" , test(word_ptr(ecx, edx, 0, 128), bx));
+ TEST_INSTRUCTION("85D1" , test(ecx, edx));
+ TEST_INSTRUCTION("859C1180000000" , test(ptr(ecx, edx, 0, 128), ebx));
+ TEST_INSTRUCTION("859C1180000000" , test(dword_ptr(ecx, edx, 0, 128), ebx));
+ TEST_INSTRUCTION("660FAEF1" , tpause(ecx, edx, eax));
+ TEST_INSTRUCTION("66F30FBCCA" , tzcnt(cx, dx));
+ TEST_INSTRUCTION("66F30FBC8C1A80000000" , tzcnt(cx, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("66F30FBC8C1A80000000" , tzcnt(cx, word_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("F30FBCCA" , tzcnt(ecx, edx));
+ TEST_INSTRUCTION("F30FBC8C1A80000000" , tzcnt(ecx, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("F30FBC8C1A80000000" , tzcnt(ecx, dword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("8FE97001E2" , tzmsk(ecx, edx));
+ TEST_INSTRUCTION("8FE97001A41A80000000" , tzmsk(ecx, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("8FE97001A41A80000000" , tzmsk(ecx, dword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("0FFFCA" , ud0(ecx, edx));
+ TEST_INSTRUCTION("0FFF8C1A80000000" , ud0(ecx, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("0FFF8C1A80000000" , ud0(ecx, dword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("0FB9CA" , ud1(ecx, edx));
+ TEST_INSTRUCTION("0FB98C1A80000000" , ud1(ecx, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("0FB98C1A80000000" , ud1(ecx, dword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("0F0B" , ud2());
+ TEST_INSTRUCTION("F30FAEF1" , umonitor(ptr(ecx)));
+ TEST_INSTRUCTION("F20FAEF1" , umwait(ecx, edx, eax));
+ TEST_INSTRUCTION("0F00E1" , verr(cx));
+ TEST_INSTRUCTION("0F00A41180000000" , verr(ptr(ecx, edx, 0, 128)));
+ TEST_INSTRUCTION("0F00A41180000000" , verr(word_ptr(ecx, edx, 0, 128)));
+ TEST_INSTRUCTION("0F00E9" , verw(cx));
+ TEST_INSTRUCTION("0F00AC1180000000" , verw(ptr(ecx, edx, 0, 128)));
+ TEST_INSTRUCTION("0F00AC1180000000" , verw(word_ptr(ecx, edx, 0, 128)));
+ TEST_INSTRUCTION("0F01C1" , vmcall());
+ TEST_INSTRUCTION("660FC7B41180000000" , vmclear(ptr(ecx, edx, 0, 128)));
+ TEST_INSTRUCTION("660FC7B41180000000" , vmclear(qword_ptr(ecx, edx, 0, 128)));
+ TEST_INSTRUCTION("0F01D4" , vmfunc());
+ TEST_INSTRUCTION("0F01C2" , vmlaunch());
+ TEST_INSTRUCTION("0F01DA" , vmload(eax));
+ TEST_INSTRUCTION("0F01D9" , vmmcall());
+ TEST_INSTRUCTION("0FC7B41180000000" , vmptrld(ptr(ecx, edx, 0, 128)));
+ TEST_INSTRUCTION("0FC7B41180000000" , vmptrld(qword_ptr(ecx, edx, 0, 128)));
+ TEST_INSTRUCTION("0FC7BC1180000000" , vmptrst(ptr(ecx, edx, 0, 128)));
+ TEST_INSTRUCTION("0FC7BC1180000000" , vmptrst(qword_ptr(ecx, edx, 0, 128)));
+ TEST_INSTRUCTION("0F78D1" , vmread(ecx, edx));
+ TEST_INSTRUCTION("0F789C1180000000" , vmread(ptr(ecx, edx, 0, 128), ebx));
+ TEST_INSTRUCTION("0F789C1180000000" , vmread(dword_ptr(ecx, edx, 0, 128), ebx));
+ TEST_INSTRUCTION("0F01C3" , vmresume());
+ TEST_INSTRUCTION("0F01D8" , vmrun(eax));
+ TEST_INSTRUCTION("0F01DB" , vmsave(eax));
+ TEST_INSTRUCTION("0F79CA" , vmwrite(ecx, edx));
+ TEST_INSTRUCTION("0F798C1A80000000" , vmwrite(ecx, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("0F798C1A80000000" , vmwrite(ecx, dword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("F30FC7B41180000000" , vmxon(ptr(ecx, edx, 0, 128)));
+ TEST_INSTRUCTION("F30FC7B41180000000" , vmxon(qword_ptr(ecx, edx, 0, 128)));
+ TEST_INSTRUCTION("0F09" , wbinvd());
+ TEST_INSTRUCTION("F30F09" , wbnoinvd());
+ TEST_INSTRUCTION("0F30" , wrmsr(edx, eax, ecx));
+ TEST_INSTRUCTION("0F38F6D1" , wrssd(ecx, edx));
+ TEST_INSTRUCTION("0F38F69C1180000000" , wrssd(ptr(ecx, edx, 0, 128), ebx));
+ TEST_INSTRUCTION("0F38F69C1180000000" , wrssd(dword_ptr(ecx, edx, 0, 128), ebx));
+ TEST_INSTRUCTION("660F38F5D1" , wrussd(ecx, edx));
+ TEST_INSTRUCTION("660F38F59C1180000000" , wrussd(ptr(ecx, edx, 0, 128), ebx));
+ TEST_INSTRUCTION("660F38F59C1180000000" , wrussd(dword_ptr(ecx, edx, 0, 128), ebx));
+ TEST_INSTRUCTION("C6F801" , xabort(1));
+ TEST_INSTRUCTION("0FC0D1" , xadd(cl, dl));
+ TEST_INSTRUCTION("0FC0F1" , xadd(cl, dh));
+ TEST_INSTRUCTION("0FC0D5" , xadd(ch, dl));
+ TEST_INSTRUCTION("0FC0F5" , xadd(ch, dh));
+ TEST_INSTRUCTION("0FC09C1180000000" , xadd(ptr(ecx, edx, 0, 128), bl));
+ TEST_INSTRUCTION("0FC0BC1180000000" , xadd(ptr(ecx, edx, 0, 128), bh));
+ TEST_INSTRUCTION("0FC09C1180000000" , xadd(byte_ptr(ecx, edx, 0, 128), bl));
+ TEST_INSTRUCTION("0FC0BC1180000000" , xadd(byte_ptr(ecx, edx, 0, 128), bh));
+ TEST_INSTRUCTION("660FC1D1" , xadd(cx, dx));
+ TEST_INSTRUCTION("660FC19C1180000000" , xadd(ptr(ecx, edx, 0, 128), bx));
+ TEST_INSTRUCTION("660FC19C1180000000" , xadd(word_ptr(ecx, edx, 0, 128), bx));
+ TEST_INSTRUCTION("0FC1D1" , xadd(ecx, edx));
+ TEST_INSTRUCTION("0FC19C1180000000" , xadd(ptr(ecx, edx, 0, 128), ebx));
+ TEST_INSTRUCTION("0FC19C1180000000" , xadd(dword_ptr(ecx, edx, 0, 128), ebx));
+ TEST_INSTRUCTION("86D1" , xchg(cl, dl));
+ TEST_INSTRUCTION("86F1" , xchg(cl, dh));
+ TEST_INSTRUCTION("86D5" , xchg(ch, dl));
+ TEST_INSTRUCTION("86F5" , xchg(ch, dh));
+ TEST_INSTRUCTION("869C1180000000" , xchg(ptr(ecx, edx, 0, 128), bl));
+ TEST_INSTRUCTION("86BC1180000000" , xchg(ptr(ecx, edx, 0, 128), bh));
+ TEST_INSTRUCTION("869C1180000000" , xchg(byte_ptr(ecx, edx, 0, 128), bl));
+ TEST_INSTRUCTION("86BC1180000000" , xchg(byte_ptr(ecx, edx, 0, 128), bh));
+ TEST_INSTRUCTION("6687D1" , xchg(cx, dx));
+ TEST_INSTRUCTION("66879C1180000000" , xchg(ptr(ecx, edx, 0, 128), bx));
+ TEST_INSTRUCTION("66879C1180000000" , xchg(word_ptr(ecx, edx, 0, 128), bx));
+ TEST_INSTRUCTION("87D1" , xchg(ecx, edx));
+ TEST_INSTRUCTION("879C1180000000" , xchg(ptr(ecx, edx, 0, 128), ebx));
+ TEST_INSTRUCTION("879C1180000000" , xchg(dword_ptr(ecx, edx, 0, 128), ebx));
+ TEST_INSTRUCTION("868C1A80000000" , xchg(cl, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("868C1A80000000" , xchg(cl, byte_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("86AC1A80000000" , xchg(ch, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("86AC1A80000000" , xchg(ch, byte_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("66878C1A80000000" , xchg(cx, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("66878C1A80000000" , xchg(cx, word_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("878C1A80000000" , xchg(ecx, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("878C1A80000000" , xchg(ecx, dword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("0F01D5" , xend());
+ TEST_INSTRUCTION("0F01D0" , xgetbv(edx, eax, ecx));
+ TEST_INSTRUCTION("D7" , xlatb());
+ TEST_INSTRUCTION("80F101" , xor_(cl, 1));
+ TEST_INSTRUCTION("80F501" , xor_(ch, 1));
+ TEST_INSTRUCTION("80B4118000000001" , xor_(byte_ptr(ecx, edx, 0, 128), 1));
+ TEST_INSTRUCTION("6683F101" , xor_(cx, 1));
+ TEST_INSTRUCTION("6683B4118000000001" , xor_(word_ptr(ecx, edx, 0, 128), 1));
+ TEST_INSTRUCTION("83F101" , xor_(ecx, 1));
+ TEST_INSTRUCTION("83B4118000000001" , xor_(dword_ptr(ecx, edx, 0, 128), 1));
+ TEST_INSTRUCTION("30D1" , xor_(cl, dl));
+ TEST_INSTRUCTION("30F1" , xor_(cl, dh));
+ TEST_INSTRUCTION("30D5" , xor_(ch, dl));
+ TEST_INSTRUCTION("30F5" , xor_(ch, dh));
+ TEST_INSTRUCTION("309C1180000000" , xor_(ptr(ecx, edx, 0, 128), bl));
+ TEST_INSTRUCTION("30BC1180000000" , xor_(ptr(ecx, edx, 0, 128), bh));
+ TEST_INSTRUCTION("309C1180000000" , xor_(byte_ptr(ecx, edx, 0, 128), bl));
+ TEST_INSTRUCTION("30BC1180000000" , xor_(byte_ptr(ecx, edx, 0, 128), bh));
+ TEST_INSTRUCTION("6631D1" , xor_(cx, dx));
+ TEST_INSTRUCTION("66319C1180000000" , xor_(ptr(ecx, edx, 0, 128), bx));
+ TEST_INSTRUCTION("66319C1180000000" , xor_(word_ptr(ecx, edx, 0, 128), bx));
+ TEST_INSTRUCTION("31D1" , xor_(ecx, edx));
+ TEST_INSTRUCTION("319C1180000000" , xor_(ptr(ecx, edx, 0, 128), ebx));
+ TEST_INSTRUCTION("319C1180000000" , xor_(dword_ptr(ecx, edx, 0, 128), ebx));
+ TEST_INSTRUCTION("328C1A80000000" , xor_(cl, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("328C1A80000000" , xor_(cl, byte_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("32AC1A80000000" , xor_(ch, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("32AC1A80000000" , xor_(ch, byte_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("66338C1A80000000" , xor_(cx, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("66338C1A80000000" , xor_(cx, word_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("338C1A80000000" , xor_(ecx, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("338C1A80000000" , xor_(ecx, dword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("F20F01E9" , xresldtrk());
+ TEST_INSTRUCTION("0FAEAC1180000000" , xrstor(ptr(ecx, edx, 0, 128), edx, eax));
+ TEST_INSTRUCTION("0FC79C1180000000" , xrstors(ptr(ecx, edx, 0, 128), edx, eax));
+ TEST_INSTRUCTION("0FAEA41180000000" , xsave(ptr(ecx, edx, 0, 128), edx, eax));
+ TEST_INSTRUCTION("0FC7A41180000000" , xsavec(ptr(ecx, edx, 0, 128), edx, eax));
+ TEST_INSTRUCTION("0FAEB41180000000" , xsaveopt(ptr(ecx, edx, 0, 128), edx, eax));
+ TEST_INSTRUCTION("0FC7AC1180000000" , xsaves(ptr(ecx, edx, 0, 128), edx, eax));
+ TEST_INSTRUCTION("0F01D1" , xsetbv(edx, eax, ecx));
+ TEST_INSTRUCTION("F20F01E8" , xsusldtrk());
+ TEST_INSTRUCTION("0F01D6" , xtest());
+}
+
+static void ASMJIT_NOINLINE testX86AssemblerMMX_SSE(AssemblerTester<x86::Assembler>& tester) noexcept {
+ using namespace x86;
+
+ TEST_INSTRUCTION("660F58CA" , addpd(xmm1, xmm2));
+ TEST_INSTRUCTION("660F588C1A80000000" , addpd(xmm1, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("660F588C1A80000000" , addpd(xmm1, xmmword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("0F58CA" , addps(xmm1, xmm2));
+ TEST_INSTRUCTION("0F588C1A80000000" , addps(xmm1, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("0F588C1A80000000" , addps(xmm1, xmmword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("F20F58CA" , addsd(xmm1, xmm2));
+ TEST_INSTRUCTION("F20F588C1A80000000" , addsd(xmm1, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("F20F588C1A80000000" , addsd(xmm1, qword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("F30F58CA" , addss(xmm1, xmm2));
+ TEST_INSTRUCTION("F30F588C1A80000000" , addss(xmm1, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("F30F588C1A80000000" , addss(xmm1, dword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("660FD0CA" , addsubpd(xmm1, xmm2));
+ TEST_INSTRUCTION("660FD08C1A80000000" , addsubpd(xmm1, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("660FD08C1A80000000" , addsubpd(xmm1, xmmword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("F20FD0CA" , addsubps(xmm1, xmm2));
+ TEST_INSTRUCTION("F20FD08C1A80000000" , addsubps(xmm1, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("F20FD08C1A80000000" , addsubps(xmm1, xmmword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("F30F38F6CA" , adox(ecx, edx));
+ TEST_INSTRUCTION("F30F38F68C1A80000000" , adox(ecx, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("F30F38F68C1A80000000" , adox(ecx, dword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("660F38DECA" , aesdec(xmm1, xmm2));
+ TEST_INSTRUCTION("660F38DE8C1A80000000" , aesdec(xmm1, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("660F38DE8C1A80000000" , aesdec(xmm1, xmmword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("660F38DFCA" , aesdeclast(xmm1, xmm2));
+ TEST_INSTRUCTION("660F38DF8C1A80000000" , aesdeclast(xmm1, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("660F38DF8C1A80000000" , aesdeclast(xmm1, xmmword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("660F38DCCA" , aesenc(xmm1, xmm2));
+ TEST_INSTRUCTION("660F38DC8C1A80000000" , aesenc(xmm1, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("660F38DC8C1A80000000" , aesenc(xmm1, xmmword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("660F38DDCA" , aesenclast(xmm1, xmm2));
+ TEST_INSTRUCTION("660F38DD8C1A80000000" , aesenclast(xmm1, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("660F38DD8C1A80000000" , aesenclast(xmm1, xmmword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("660F38DBCA" , aesimc(xmm1, xmm2));
+ TEST_INSTRUCTION("660F38DB8C1A80000000" , aesimc(xmm1, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("660F38DB8C1A80000000" , aesimc(xmm1, xmmword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("660F3ADFCA01" , aeskeygenassist(xmm1, xmm2, 1));
+ TEST_INSTRUCTION("660F3ADF8C1A8000000001" , aeskeygenassist(xmm1, ptr(edx, ebx, 0, 128), 1));
+ TEST_INSTRUCTION("660F3ADF8C1A8000000001" , aeskeygenassist(xmm1, xmmword_ptr(edx, ebx, 0, 128), 1));
+ TEST_INSTRUCTION("660F55CA" , andnpd(xmm1, xmm2));
+ TEST_INSTRUCTION("660F558C1A80000000" , andnpd(xmm1, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("660F558C1A80000000" , andnpd(xmm1, xmmword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("0F55CA" , andnps(xmm1, xmm2));
+ TEST_INSTRUCTION("0F558C1A80000000" , andnps(xmm1, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("0F558C1A80000000" , andnps(xmm1, xmmword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("660F54CA" , andpd(xmm1, xmm2));
+ TEST_INSTRUCTION("660F548C1A80000000" , andpd(xmm1, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("660F548C1A80000000" , andpd(xmm1, xmmword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("0F54CA" , andps(xmm1, xmm2));
+ TEST_INSTRUCTION("0F548C1A80000000" , andps(xmm1, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("0F548C1A80000000" , andps(xmm1, xmmword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("660F3A0DCA01" , blendpd(xmm1, xmm2, 1));
+ TEST_INSTRUCTION("660F3A0D8C1A8000000001" , blendpd(xmm1, ptr(edx, ebx, 0, 128), 1));
+ TEST_INSTRUCTION("660F3A0D8C1A8000000001" , blendpd(xmm1, xmmword_ptr(edx, ebx, 0, 128), 1));
+ TEST_INSTRUCTION("660F3A0CCA01" , blendps(xmm1, xmm2, 1));
+ TEST_INSTRUCTION("660F3A0C8C1A8000000001" , blendps(xmm1, ptr(edx, ebx, 0, 128), 1));
+ TEST_INSTRUCTION("660F3A0C8C1A8000000001" , blendps(xmm1, xmmword_ptr(edx, ebx, 0, 128), 1));
+ TEST_INSTRUCTION("660F3815CA" , blendvpd(xmm1, xmm2, xmm0));
+ TEST_INSTRUCTION("660F38158C1A80000000" , blendvpd(xmm1, ptr(edx, ebx, 0, 128), xmm0));
+ TEST_INSTRUCTION("660F38158C1A80000000" , blendvpd(xmm1, xmmword_ptr(edx, ebx, 0, 128), xmm0));
+ TEST_INSTRUCTION("660F3814CA" , blendvps(xmm1, xmm2, xmm0));
+ TEST_INSTRUCTION("660F38148C1A80000000" , blendvps(xmm1, ptr(edx, ebx, 0, 128), xmm0));
+ TEST_INSTRUCTION("660F38148C1A80000000" , blendvps(xmm1, xmmword_ptr(edx, ebx, 0, 128), xmm0));
+ TEST_INSTRUCTION("660FC2CA01" , cmppd(xmm1, xmm2, 1));
+ TEST_INSTRUCTION("660FC28C1A8000000001" , cmppd(xmm1, ptr(edx, ebx, 0, 128), 1));
+ TEST_INSTRUCTION("660FC28C1A8000000001" , cmppd(xmm1, xmmword_ptr(edx, ebx, 0, 128), 1));
+ TEST_INSTRUCTION("0FC2CA01" , cmpps(xmm1, xmm2, 1));
+ TEST_INSTRUCTION("0FC28C1A8000000001" , cmpps(xmm1, ptr(edx, ebx, 0, 128), 1));
+ TEST_INSTRUCTION("0FC28C1A8000000001" , cmpps(xmm1, xmmword_ptr(edx, ebx, 0, 128), 1));
+ TEST_INSTRUCTION("F20FC2CA01" , cmpsd(xmm1, xmm2, 1));
+ TEST_INSTRUCTION("F20FC28C1A8000000001" , cmpsd(xmm1, ptr(edx, ebx, 0, 128), 1));
+ TEST_INSTRUCTION("F20FC28C1A8000000001" , cmpsd(xmm1, qword_ptr(edx, ebx, 0, 128), 1));
+ TEST_INSTRUCTION("F30FC2CA01" , cmpss(xmm1, xmm2, 1));
+ TEST_INSTRUCTION("F30FC28C1A8000000001" , cmpss(xmm1, ptr(edx, ebx, 0, 128), 1));
+ TEST_INSTRUCTION("F30FC28C1A8000000001" , cmpss(xmm1, dword_ptr(edx, ebx, 0, 128), 1));
+ TEST_INSTRUCTION("660F2FCA" , comisd(xmm1, xmm2));
+ TEST_INSTRUCTION("660F2F8C1A80000000" , comisd(xmm1, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("660F2F8C1A80000000" , comisd(xmm1, qword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("0F2FCA" , comiss(xmm1, xmm2));
+ TEST_INSTRUCTION("0F2F8C1A80000000" , comiss(xmm1, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("0F2F8C1A80000000" , comiss(xmm1, dword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("F30FE6CA" , cvtdq2pd(xmm1, xmm2));
+ TEST_INSTRUCTION("F30FE68C1A80000000" , cvtdq2pd(xmm1, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("F30FE68C1A80000000" , cvtdq2pd(xmm1, qword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("0F5BCA" , cvtdq2ps(xmm1, xmm2));
+ TEST_INSTRUCTION("0F5B8C1A80000000" , cvtdq2ps(xmm1, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("0F5B8C1A80000000" , cvtdq2ps(xmm1, xmmword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("F20FE6CA" , cvtpd2dq(xmm1, xmm2));
+ TEST_INSTRUCTION("F20FE68C1A80000000" , cvtpd2dq(xmm1, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("F20FE68C1A80000000" , cvtpd2dq(xmm1, xmmword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("660F2DCA" , cvtpd2pi(mm1, xmm2));
+ TEST_INSTRUCTION("660F2D8C1A80000000" , cvtpd2pi(mm1, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("660F2D8C1A80000000" , cvtpd2pi(mm1, xmmword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("660F5ACA" , cvtpd2ps(xmm1, xmm2));
+ TEST_INSTRUCTION("660F5A8C1A80000000" , cvtpd2ps(xmm1, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("660F5A8C1A80000000" , cvtpd2ps(xmm1, xmmword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("660F2ACA" , cvtpi2pd(xmm1, mm2));
+ TEST_INSTRUCTION("660F2A8C1A80000000" , cvtpi2pd(xmm1, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("660F2A8C1A80000000" , cvtpi2pd(xmm1, qword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("0F2ACA" , cvtpi2ps(xmm1, mm2));
+ TEST_INSTRUCTION("0F2A8C1A80000000" , cvtpi2ps(xmm1, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("0F2A8C1A80000000" , cvtpi2ps(xmm1, qword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("660F5BCA" , cvtps2dq(xmm1, xmm2));
+ TEST_INSTRUCTION("660F5B8C1A80000000" , cvtps2dq(xmm1, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("660F5B8C1A80000000" , cvtps2dq(xmm1, xmmword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("0F5ACA" , cvtps2pd(xmm1, xmm2));
+ TEST_INSTRUCTION("0F5A8C1A80000000" , cvtps2pd(xmm1, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("0F5A8C1A80000000" , cvtps2pd(xmm1, qword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("0F2DCA" , cvtps2pi(mm1, xmm2));
+ TEST_INSTRUCTION("0F2D8C1A80000000" , cvtps2pi(mm1, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("0F2D8C1A80000000" , cvtps2pi(mm1, qword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("F20F2DCA" , cvtsd2si(ecx, xmm2));
+ TEST_INSTRUCTION("F20F2D8C1A80000000" , cvtsd2si(ecx, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("F20F2D8C1A80000000" , cvtsd2si(ecx, qword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("F20F5ACA" , cvtsd2ss(xmm1, xmm2));
+ TEST_INSTRUCTION("F20F5A8C1A80000000" , cvtsd2ss(xmm1, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("F20F5A8C1A80000000" , cvtsd2ss(xmm1, qword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("F20F2ACA" , cvtsi2sd(xmm1, edx));
+ TEST_INSTRUCTION("F20F2A8C1A80000000" , cvtsi2sd(xmm1, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("F20F2A8C1A80000000" , cvtsi2sd(xmm1, dword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("F30F2ACA" , cvtsi2ss(xmm1, edx));
+ TEST_INSTRUCTION("F30F2A8C1A80000000" , cvtsi2ss(xmm1, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("F30F2A8C1A80000000" , cvtsi2ss(xmm1, dword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("F30F5ACA" , cvtss2sd(xmm1, xmm2));
+ TEST_INSTRUCTION("F30F5A8C1A80000000" , cvtss2sd(xmm1, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("F30F5A8C1A80000000" , cvtss2sd(xmm1, dword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("F30F2DCA" , cvtss2si(ecx, xmm2));
+ TEST_INSTRUCTION("F30F2D8C1A80000000" , cvtss2si(ecx, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("F30F2D8C1A80000000" , cvtss2si(ecx, dword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("660FE6CA" , cvttpd2dq(xmm1, xmm2));
+ TEST_INSTRUCTION("660FE68C1A80000000" , cvttpd2dq(xmm1, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("660FE68C1A80000000" , cvttpd2dq(xmm1, xmmword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("660F2CCA" , cvttpd2pi(mm1, xmm2));
+ TEST_INSTRUCTION("660F2C8C1A80000000" , cvttpd2pi(mm1, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("660F2C8C1A80000000" , cvttpd2pi(mm1, xmmword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("F30F5BCA" , cvttps2dq(xmm1, xmm2));
+ TEST_INSTRUCTION("F30F5B8C1A80000000" , cvttps2dq(xmm1, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("F30F5B8C1A80000000" , cvttps2dq(xmm1, xmmword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("0F2CCA" , cvttps2pi(mm1, xmm2));
+ TEST_INSTRUCTION("0F2C8C1A80000000" , cvttps2pi(mm1, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("0F2C8C1A80000000" , cvttps2pi(mm1, qword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("F20F2CCA" , cvttsd2si(ecx, xmm2));
+ TEST_INSTRUCTION("F20F2C8C1A80000000" , cvttsd2si(ecx, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("F20F2C8C1A80000000" , cvttsd2si(ecx, qword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("F30F2CCA" , cvttss2si(ecx, xmm2));
+ TEST_INSTRUCTION("F30F2C8C1A80000000" , cvttss2si(ecx, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("F30F2C8C1A80000000" , cvttss2si(ecx, dword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("660F5ECA" , divpd(xmm1, xmm2));
+ TEST_INSTRUCTION("660F5E8C1A80000000" , divpd(xmm1, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("660F5E8C1A80000000" , divpd(xmm1, xmmword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("0F5ECA" , divps(xmm1, xmm2));
+ TEST_INSTRUCTION("0F5E8C1A80000000" , divps(xmm1, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("0F5E8C1A80000000" , divps(xmm1, xmmword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("F20F5ECA" , divsd(xmm1, xmm2));
+ TEST_INSTRUCTION("F20F5E8C1A80000000" , divsd(xmm1, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("F20F5E8C1A80000000" , divsd(xmm1, qword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("F30F5ECA" , divss(xmm1, xmm2));
+ TEST_INSTRUCTION("F30F5E8C1A80000000" , divss(xmm1, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("F30F5E8C1A80000000" , divss(xmm1, dword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("660F3A41CA01" , dppd(xmm1, xmm2, 1));
+ TEST_INSTRUCTION("660F3A418C1A8000000001" , dppd(xmm1, ptr(edx, ebx, 0, 128), 1));
+ TEST_INSTRUCTION("660F3A418C1A8000000001" , dppd(xmm1, xmmword_ptr(edx, ebx, 0, 128), 1));
+ TEST_INSTRUCTION("660F3A40CA01" , dpps(xmm1, xmm2, 1));
+ TEST_INSTRUCTION("660F3A408C1A8000000001" , dpps(xmm1, ptr(edx, ebx, 0, 128), 1));
+ TEST_INSTRUCTION("660F3A408C1A8000000001" , dpps(xmm1, xmmword_ptr(edx, ebx, 0, 128), 1));
+ TEST_INSTRUCTION("660F3A17D101" , extractps(ecx, xmm2, 1));
+ TEST_INSTRUCTION("660F3A179C118000000001" , extractps(ptr(ecx, edx, 0, 128), xmm3, 1));
+ TEST_INSTRUCTION("660F3A179C118000000001" , extractps(dword_ptr(ecx, edx, 0, 128), xmm3, 1));
+ TEST_INSTRUCTION("660F78C10102" , extrq(xmm1, 1, 2));
+ TEST_INSTRUCTION("660F79CA" , extrq(xmm1, xmm2));
+ TEST_INSTRUCTION("660F3ACFCA01" , gf2p8affineinvqb(xmm1, xmm2, 1));
+ TEST_INSTRUCTION("660F3ACF8C1A8000000001" , gf2p8affineinvqb(xmm1, ptr(edx, ebx, 0, 128), 1));
+ TEST_INSTRUCTION("660F3ACF8C1A8000000001" , gf2p8affineinvqb(xmm1, xmmword_ptr(edx, ebx, 0, 128), 1));
+ TEST_INSTRUCTION("660F3ACECA01" , gf2p8affineqb(xmm1, xmm2, 1));
+ TEST_INSTRUCTION("660F3ACE8C1A8000000001" , gf2p8affineqb(xmm1, ptr(edx, ebx, 0, 128), 1));
+ TEST_INSTRUCTION("660F3ACE8C1A8000000001" , gf2p8affineqb(xmm1, xmmword_ptr(edx, ebx, 0, 128), 1));
+ TEST_INSTRUCTION("660F38CFCA" , gf2p8mulb(xmm1, xmm2));
+ TEST_INSTRUCTION("660F38CF8C1A80000000" , gf2p8mulb(xmm1, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("660F38CF8C1A80000000" , gf2p8mulb(xmm1, xmmword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("660F7CCA" , haddpd(xmm1, xmm2));
+ TEST_INSTRUCTION("660F7C8C1A80000000" , haddpd(xmm1, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("660F7C8C1A80000000" , haddpd(xmm1, xmmword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("F20F7CCA" , haddps(xmm1, xmm2));
+ TEST_INSTRUCTION("F20F7C8C1A80000000" , haddps(xmm1, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("F20F7C8C1A80000000" , haddps(xmm1, xmmword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("660F7DCA" , hsubpd(xmm1, xmm2));
+ TEST_INSTRUCTION("660F7D8C1A80000000" , hsubpd(xmm1, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("660F7D8C1A80000000" , hsubpd(xmm1, xmmword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("F20F7DCA" , hsubps(xmm1, xmm2));
+ TEST_INSTRUCTION("F20F7D8C1A80000000" , hsubps(xmm1, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("F20F7D8C1A80000000" , hsubps(xmm1, xmmword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("660F3A21CA01" , insertps(xmm1, xmm2, 1));
+ TEST_INSTRUCTION("660F3A218C1A8000000001" , insertps(xmm1, ptr(edx, ebx, 0, 128), 1));
+ TEST_INSTRUCTION("660F3A218C1A8000000001" , insertps(xmm1, dword_ptr(edx, ebx, 0, 128), 1));
+ TEST_INSTRUCTION("F20F79CA" , insertq(xmm1, xmm2));
+ TEST_INSTRUCTION("F20F78CA0102" , insertq(xmm1, xmm2, 1, 2));
+ TEST_INSTRUCTION("F20FF08C1A80000000" , lddqu(xmm1, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("F20FF08C1A80000000" , lddqu(xmm1, xmmword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("660FF7CA" , maskmovdqu(xmm1, xmm2, ptr(edi)));
+ TEST_INSTRUCTION("660FF7CA" , maskmovdqu(xmm1, xmm2, xmmword_ptr(edi)));
+ TEST_INSTRUCTION("0FF7CA" , maskmovq(mm1, mm2, ptr(edi)));
+ TEST_INSTRUCTION("0FF7CA" , maskmovq(mm1, mm2, qword_ptr(edi)));
+ TEST_INSTRUCTION("660F5FCA" , maxpd(xmm1, xmm2));
+ TEST_INSTRUCTION("660F5F8C1A80000000" , maxpd(xmm1, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("660F5F8C1A80000000" , maxpd(xmm1, xmmword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("0F5FCA" , maxps(xmm1, xmm2));
+ TEST_INSTRUCTION("0F5F8C1A80000000" , maxps(xmm1, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("0F5F8C1A80000000" , maxps(xmm1, xmmword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("F20F5FCA" , maxsd(xmm1, xmm2));
+ TEST_INSTRUCTION("F20F5F8C1A80000000" , maxsd(xmm1, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("F20F5F8C1A80000000" , maxsd(xmm1, qword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("F30F5FCA" , maxss(xmm1, xmm2));
+ TEST_INSTRUCTION("F30F5F8C1A80000000" , maxss(xmm1, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("F30F5F8C1A80000000" , maxss(xmm1, dword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("660F5DCA" , minpd(xmm1, xmm2));
+ TEST_INSTRUCTION("660F5D8C1A80000000" , minpd(xmm1, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("660F5D8C1A80000000" , minpd(xmm1, xmmword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("0F5DCA" , minps(xmm1, xmm2));
+ TEST_INSTRUCTION("0F5D8C1A80000000" , minps(xmm1, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("0F5D8C1A80000000" , minps(xmm1, xmmword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("F20F5DCA" , minsd(xmm1, xmm2));
+ TEST_INSTRUCTION("F20F5D8C1A80000000" , minsd(xmm1, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("F20F5D8C1A80000000" , minsd(xmm1, qword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("F30F5DCA" , minss(xmm1, xmm2));
+ TEST_INSTRUCTION("F30F5D8C1A80000000" , minss(xmm1, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("F30F5D8C1A80000000" , minss(xmm1, dword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("660F28CA" , movapd(xmm1, xmm2));
+ TEST_INSTRUCTION("660F288C1A80000000" , movapd(xmm1, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("660F288C1A80000000" , movapd(xmm1, xmmword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("660F299C1180000000" , movapd(ptr(ecx, edx, 0, 128), xmm3));
+ TEST_INSTRUCTION("660F299C1180000000" , movapd(xmmword_ptr(ecx, edx, 0, 128), xmm3));
+ TEST_INSTRUCTION("0F28CA" , movaps(xmm1, xmm2));
+ TEST_INSTRUCTION("0F288C1A80000000" , movaps(xmm1, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("0F288C1A80000000" , movaps(xmm1, xmmword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("0F299C1180000000" , movaps(ptr(ecx, edx, 0, 128), xmm3));
+ TEST_INSTRUCTION("0F299C1180000000" , movaps(xmmword_ptr(ecx, edx, 0, 128), xmm3));
+ TEST_INSTRUCTION("660F6ECA" , movd(xmm1, edx));
+ TEST_INSTRUCTION("660F6E8C1A80000000" , movd(xmm1, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("660F6E8C1A80000000" , movd(xmm1, dword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("0F6ECA" , movd(mm1, edx));
+ TEST_INSTRUCTION("0F6E8C1A80000000" , movd(mm1, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("0F6E8C1A80000000" , movd(mm1, dword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("660F7ED1" , movd(ecx, xmm2));
+ TEST_INSTRUCTION("0F7ED1" , movd(ecx, mm2));
+ TEST_INSTRUCTION("660F7E9C1180000000" , movd(ptr(ecx, edx, 0, 128), xmm3));
+ TEST_INSTRUCTION("0F7E9C1180000000" , movd(ptr(ecx, edx, 0, 128), mm3));
+ TEST_INSTRUCTION("660F7E9C1180000000" , movd(dword_ptr(ecx, edx, 0, 128), xmm3));
+ TEST_INSTRUCTION("0F7E9C1180000000" , movd(dword_ptr(ecx, edx, 0, 128), mm3));
+ TEST_INSTRUCTION("F20F12CA" , movddup(xmm1, xmm2));
+ TEST_INSTRUCTION("F20F128C1A80000000" , movddup(xmm1, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("F20F128C1A80000000" , movddup(xmm1, qword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("F20FD6CA" , movdq2q(mm1, xmm2));
+ TEST_INSTRUCTION("660F6FCA" , movdqa(xmm1, xmm2));
+ TEST_INSTRUCTION("660F6F8C1A80000000" , movdqa(xmm1, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("660F6F8C1A80000000" , movdqa(xmm1, xmmword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("660F7F9C1180000000" , movdqa(ptr(ecx, edx, 0, 128), xmm3));
+ TEST_INSTRUCTION("660F7F9C1180000000" , movdqa(xmmword_ptr(ecx, edx, 0, 128), xmm3));
+ TEST_INSTRUCTION("F30F6FCA" , movdqu(xmm1, xmm2));
+ TEST_INSTRUCTION("F30F6F8C1A80000000" , movdqu(xmm1, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("F30F6F8C1A80000000" , movdqu(xmm1, xmmword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("F30F7F9C1180000000" , movdqu(ptr(ecx, edx, 0, 128), xmm3));
+ TEST_INSTRUCTION("F30F7F9C1180000000" , movdqu(xmmword_ptr(ecx, edx, 0, 128), xmm3));
+ TEST_INSTRUCTION("0F12CA" , movhlps(xmm1, xmm2));
+ TEST_INSTRUCTION("660F179C1180000000" , movhpd(ptr(ecx, edx, 0, 128), xmm3));
+ TEST_INSTRUCTION("660F179C1180000000" , movhpd(qword_ptr(ecx, edx, 0, 128), xmm3));
+ TEST_INSTRUCTION("660F168C1A80000000" , movhpd(xmm1, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("660F168C1A80000000" , movhpd(xmm1, qword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("0F179C1180000000" , movhps(ptr(ecx, edx, 0, 128), xmm3));
+ TEST_INSTRUCTION("0F179C1180000000" , movhps(qword_ptr(ecx, edx, 0, 128), xmm3));
+ TEST_INSTRUCTION("0F168C1A80000000" , movhps(xmm1, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("0F168C1A80000000" , movhps(xmm1, qword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("0F16CA" , movlhps(xmm1, xmm2));
+ TEST_INSTRUCTION("660F139C1180000000" , movlpd(ptr(ecx, edx, 0, 128), xmm3));
+ TEST_INSTRUCTION("660F139C1180000000" , movlpd(qword_ptr(ecx, edx, 0, 128), xmm3));
+ TEST_INSTRUCTION("660F128C1A80000000" , movlpd(xmm1, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("660F128C1A80000000" , movlpd(xmm1, qword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("0F139C1180000000" , movlps(ptr(ecx, edx, 0, 128), xmm3));
+ TEST_INSTRUCTION("0F139C1180000000" , movlps(qword_ptr(ecx, edx, 0, 128), xmm3));
+ TEST_INSTRUCTION("0F128C1A80000000" , movlps(xmm1, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("0F128C1A80000000" , movlps(xmm1, qword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("660F50CA" , movmskpd(ecx, xmm2));
+ TEST_INSTRUCTION("0F50CA" , movmskps(ecx, xmm2));
+ TEST_INSTRUCTION("660FE79C1180000000" , movntdq(ptr(ecx, edx, 0, 128), xmm3));
+ TEST_INSTRUCTION("660FE79C1180000000" , movntdq(xmmword_ptr(ecx, edx, 0, 128), xmm3));
+ TEST_INSTRUCTION("660F382A8C1A80000000" , movntdqa(xmm1, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("660F382A8C1A80000000" , movntdqa(xmm1, xmmword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("660F2B9C1180000000" , movntpd(ptr(ecx, edx, 0, 128), xmm3));
+ TEST_INSTRUCTION("660F2B9C1180000000" , movntpd(xmmword_ptr(ecx, edx, 0, 128), xmm3));
+ TEST_INSTRUCTION("0F2B9C1180000000" , movntps(ptr(ecx, edx, 0, 128), xmm3));
+ TEST_INSTRUCTION("0F2B9C1180000000" , movntps(xmmword_ptr(ecx, edx, 0, 128), xmm3));
+ TEST_INSTRUCTION("0FE79C1180000000" , movntq(ptr(ecx, edx, 0, 128), mm3));
+ TEST_INSTRUCTION("0FE79C1180000000" , movntq(qword_ptr(ecx, edx, 0, 128), mm3));
+ TEST_INSTRUCTION("F20F2B9C1180000000" , movntsd(ptr(ecx, edx, 0, 128), xmm3));
+ TEST_INSTRUCTION("F20F2B9C1180000000" , movntsd(qword_ptr(ecx, edx, 0, 128), xmm3));
+ TEST_INSTRUCTION("F30F2B9C1180000000" , movntss(ptr(ecx, edx, 0, 128), xmm3));
+ TEST_INSTRUCTION("F30F2B9C1180000000" , movntss(dword_ptr(ecx, edx, 0, 128), xmm3));
+ TEST_INSTRUCTION("0F6FCA" , movq(mm1, mm2));
+ TEST_INSTRUCTION("0F6F8C1A80000000" , movq(mm1, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("0F6F8C1A80000000" , movq(mm1, qword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("660FD69C1180000000" , movq(ptr(ecx, edx, 0, 128), xmm3));
+ TEST_INSTRUCTION("0F7F9C1180000000" , movq(ptr(ecx, edx, 0, 128), mm3));
+ TEST_INSTRUCTION("660FD69C1180000000" , movq(qword_ptr(ecx, edx, 0, 128), xmm3));
+ TEST_INSTRUCTION("0F7F9C1180000000" , movq(qword_ptr(ecx, edx, 0, 128), mm3));
+ TEST_INSTRUCTION("F30F7ECA" , movq(xmm1, xmm2));
+ TEST_INSTRUCTION("F30F7E8C1A80000000" , movq(xmm1, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("F30F7E8C1A80000000" , movq(xmm1, qword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("F30FD6CA" , movq2dq(xmm1, mm2));
+ TEST_INSTRUCTION("F20F10CA" , movsd(xmm1, xmm2));
+ TEST_INSTRUCTION("F20F108C1A80000000" , movsd(xmm1, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("F20F108C1A80000000" , movsd(xmm1, qword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("F20F119C1180000000" , movsd(ptr(ecx, edx, 0, 128), xmm3));
+ TEST_INSTRUCTION("F20F119C1180000000" , movsd(qword_ptr(ecx, edx, 0, 128), xmm3));
+ TEST_INSTRUCTION("F30F16CA" , movshdup(xmm1, xmm2));
+ TEST_INSTRUCTION("F30F168C1A80000000" , movshdup(xmm1, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("F30F168C1A80000000" , movshdup(xmm1, xmmword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("F30F12CA" , movsldup(xmm1, xmm2));
+ TEST_INSTRUCTION("F30F128C1A80000000" , movsldup(xmm1, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("F30F128C1A80000000" , movsldup(xmm1, xmmword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("F30F10CA" , movss(xmm1, xmm2));
+ TEST_INSTRUCTION("F30F108C1A80000000" , movss(xmm1, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("F30F108C1A80000000" , movss(xmm1, dword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("F30F119C1180000000" , movss(ptr(ecx, edx, 0, 128), xmm3));
+ TEST_INSTRUCTION("F30F119C1180000000" , movss(dword_ptr(ecx, edx, 0, 128), xmm3));
+ TEST_INSTRUCTION("660F10CA" , movupd(xmm1, xmm2));
+ TEST_INSTRUCTION("660F108C1A80000000" , movupd(xmm1, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("660F108C1A80000000" , movupd(xmm1, xmmword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("660F119C1180000000" , movupd(ptr(ecx, edx, 0, 128), xmm3));
+ TEST_INSTRUCTION("660F119C1180000000" , movupd(xmmword_ptr(ecx, edx, 0, 128), xmm3));
+ TEST_INSTRUCTION("0F10CA" , movups(xmm1, xmm2));
+ TEST_INSTRUCTION("0F108C1A80000000" , movups(xmm1, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("0F108C1A80000000" , movups(xmm1, xmmword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("0F119C1180000000" , movups(ptr(ecx, edx, 0, 128), xmm3));
+ TEST_INSTRUCTION("0F119C1180000000" , movups(xmmword_ptr(ecx, edx, 0, 128), xmm3));
+ TEST_INSTRUCTION("660F3A42CA01" , mpsadbw(xmm1, xmm2, 1));
+ TEST_INSTRUCTION("660F3A428C1A8000000001" , mpsadbw(xmm1, ptr(edx, ebx, 0, 128), 1));
+ TEST_INSTRUCTION("660F3A428C1A8000000001" , mpsadbw(xmm1, xmmword_ptr(edx, ebx, 0, 128), 1));
+ TEST_INSTRUCTION("660F59CA" , mulpd(xmm1, xmm2));
+ TEST_INSTRUCTION("660F598C1A80000000" , mulpd(xmm1, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("660F598C1A80000000" , mulpd(xmm1, xmmword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("0F59CA" , mulps(xmm1, xmm2));
+ TEST_INSTRUCTION("0F598C1A80000000" , mulps(xmm1, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("0F598C1A80000000" , mulps(xmm1, xmmword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("F20F59CA" , mulsd(xmm1, xmm2));
+ TEST_INSTRUCTION("F20F598C1A80000000" , mulsd(xmm1, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("F20F598C1A80000000" , mulsd(xmm1, qword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("F30F59CA" , mulss(xmm1, xmm2));
+ TEST_INSTRUCTION("F30F598C1A80000000" , mulss(xmm1, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("F30F598C1A80000000" , mulss(xmm1, dword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("660F56CA" , orpd(xmm1, xmm2));
+ TEST_INSTRUCTION("660F568C1A80000000" , orpd(xmm1, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("660F568C1A80000000" , orpd(xmm1, xmmword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("0F56CA" , orps(xmm1, xmm2));
+ TEST_INSTRUCTION("0F568C1A80000000" , orps(xmm1, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("0F568C1A80000000" , orps(xmm1, xmmword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("0F381CCA" , pabsb(mm1, mm2));
+ TEST_INSTRUCTION("0F381C8C1A80000000" , pabsb(mm1, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("0F381C8C1A80000000" , pabsb(mm1, qword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("660F381CCA" , pabsb(xmm1, xmm2));
+ TEST_INSTRUCTION("660F381C8C1A80000000" , pabsb(xmm1, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("660F381C8C1A80000000" , pabsb(xmm1, xmmword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("0F381ECA" , pabsd(mm1, mm2));
+ TEST_INSTRUCTION("0F381E8C1A80000000" , pabsd(mm1, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("0F381E8C1A80000000" , pabsd(mm1, qword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("660F381ECA" , pabsd(xmm1, xmm2));
+ TEST_INSTRUCTION("660F381E8C1A80000000" , pabsd(xmm1, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("660F381E8C1A80000000" , pabsd(xmm1, xmmword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("0F381DCA" , pabsw(mm1, mm2));
+ TEST_INSTRUCTION("0F381D8C1A80000000" , pabsw(mm1, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("0F381D8C1A80000000" , pabsw(mm1, qword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("660F381DCA" , pabsw(xmm1, xmm2));
+ TEST_INSTRUCTION("660F381D8C1A80000000" , pabsw(xmm1, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("660F381D8C1A80000000" , pabsw(xmm1, xmmword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("0F6BCA" , packssdw(mm1, mm2));
+ TEST_INSTRUCTION("0F6B8C1A80000000" , packssdw(mm1, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("0F6B8C1A80000000" , packssdw(mm1, qword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("660F6BCA" , packssdw(xmm1, xmm2));
+ TEST_INSTRUCTION("660F6B8C1A80000000" , packssdw(xmm1, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("660F6B8C1A80000000" , packssdw(xmm1, xmmword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("0F63CA" , packsswb(mm1, mm2));
+ TEST_INSTRUCTION("0F638C1A80000000" , packsswb(mm1, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("0F638C1A80000000" , packsswb(mm1, qword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("660F63CA" , packsswb(xmm1, xmm2));
+ TEST_INSTRUCTION("660F638C1A80000000" , packsswb(xmm1, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("660F638C1A80000000" , packsswb(xmm1, xmmword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("660F382BCA" , packusdw(xmm1, xmm2));
+ TEST_INSTRUCTION("660F382B8C1A80000000" , packusdw(xmm1, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("660F382B8C1A80000000" , packusdw(xmm1, xmmword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("0F67CA" , packuswb(mm1, mm2));
+ TEST_INSTRUCTION("0F678C1A80000000" , packuswb(mm1, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("0F678C1A80000000" , packuswb(mm1, qword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("660F67CA" , packuswb(xmm1, xmm2));
+ TEST_INSTRUCTION("660F678C1A80000000" , packuswb(xmm1, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("660F678C1A80000000" , packuswb(xmm1, xmmword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("0FFCCA" , paddb(mm1, mm2));
+ TEST_INSTRUCTION("0FFC8C1A80000000" , paddb(mm1, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("0FFC8C1A80000000" , paddb(mm1, qword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("660FFCCA" , paddb(xmm1, xmm2));
+ TEST_INSTRUCTION("660FFC8C1A80000000" , paddb(xmm1, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("660FFC8C1A80000000" , paddb(xmm1, xmmword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("0FFECA" , paddd(mm1, mm2));
+ TEST_INSTRUCTION("0FFE8C1A80000000" , paddd(mm1, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("0FFE8C1A80000000" , paddd(mm1, qword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("660FFECA" , paddd(xmm1, xmm2));
+ TEST_INSTRUCTION("660FFE8C1A80000000" , paddd(xmm1, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("660FFE8C1A80000000" , paddd(xmm1, xmmword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("0FD4CA" , paddq(mm1, mm2));
+ TEST_INSTRUCTION("0FD48C1A80000000" , paddq(mm1, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("0FD48C1A80000000" , paddq(mm1, qword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("660FD4CA" , paddq(xmm1, xmm2));
+ TEST_INSTRUCTION("660FD48C1A80000000" , paddq(xmm1, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("660FD48C1A80000000" , paddq(xmm1, xmmword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("0FECCA" , paddsb(mm1, mm2));
+ TEST_INSTRUCTION("0FEC8C1A80000000" , paddsb(mm1, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("0FEC8C1A80000000" , paddsb(mm1, qword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("660FECCA" , paddsb(xmm1, xmm2));
+ TEST_INSTRUCTION("660FEC8C1A80000000" , paddsb(xmm1, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("660FEC8C1A80000000" , paddsb(xmm1, xmmword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("0FEDCA" , paddsw(mm1, mm2));
+ TEST_INSTRUCTION("0FED8C1A80000000" , paddsw(mm1, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("0FED8C1A80000000" , paddsw(mm1, qword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("660FEDCA" , paddsw(xmm1, xmm2));
+ TEST_INSTRUCTION("660FED8C1A80000000" , paddsw(xmm1, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("660FED8C1A80000000" , paddsw(xmm1, xmmword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("0FDCCA" , paddusb(mm1, mm2));
+ TEST_INSTRUCTION("0FDC8C1A80000000" , paddusb(mm1, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("0FDC8C1A80000000" , paddusb(mm1, qword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("660FDCCA" , paddusb(xmm1, xmm2));
+ TEST_INSTRUCTION("660FDC8C1A80000000" , paddusb(xmm1, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("660FDC8C1A80000000" , paddusb(xmm1, xmmword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("0FDDCA" , paddusw(mm1, mm2));
+ TEST_INSTRUCTION("0FDD8C1A80000000" , paddusw(mm1, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("0FDD8C1A80000000" , paddusw(mm1, qword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("660FDDCA" , paddusw(xmm1, xmm2));
+ TEST_INSTRUCTION("660FDD8C1A80000000" , paddusw(xmm1, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("660FDD8C1A80000000" , paddusw(xmm1, xmmword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("0FFDCA" , paddw(mm1, mm2));
+ TEST_INSTRUCTION("0FFD8C1A80000000" , paddw(mm1, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("0FFD8C1A80000000" , paddw(mm1, qword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("660FFDCA" , paddw(xmm1, xmm2));
+ TEST_INSTRUCTION("660FFD8C1A80000000" , paddw(xmm1, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("660FFD8C1A80000000" , paddw(xmm1, xmmword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("0F3A0FCA01" , palignr(mm1, mm2, 1));
+ TEST_INSTRUCTION("0F3A0F8C1A8000000001" , palignr(mm1, ptr(edx, ebx, 0, 128), 1));
+ TEST_INSTRUCTION("0F3A0F8C1A8000000001" , palignr(mm1, qword_ptr(edx, ebx, 0, 128), 1));
+ TEST_INSTRUCTION("660F3A0FCA01" , palignr(xmm1, xmm2, 1));
+ TEST_INSTRUCTION("660F3A0F8C1A8000000001" , palignr(xmm1, ptr(edx, ebx, 0, 128), 1));
+ TEST_INSTRUCTION("660F3A0F8C1A8000000001" , palignr(xmm1, xmmword_ptr(edx, ebx, 0, 128), 1));
+ TEST_INSTRUCTION("0FDBCA" , pand(mm1, mm2));
+ TEST_INSTRUCTION("0FDB8C1A80000000" , pand(mm1, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("0FDB8C1A80000000" , pand(mm1, qword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("660FDBCA" , pand(xmm1, xmm2));
+ TEST_INSTRUCTION("660FDB8C1A80000000" , pand(xmm1, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("660FDB8C1A80000000" , pand(xmm1, xmmword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("0FDFCA" , pandn(mm1, mm2));
+ TEST_INSTRUCTION("0FDF8C1A80000000" , pandn(mm1, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("0FDF8C1A80000000" , pandn(mm1, qword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("660FDFCA" , pandn(xmm1, xmm2));
+ TEST_INSTRUCTION("660FDF8C1A80000000" , pandn(xmm1, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("660FDF8C1A80000000" , pandn(xmm1, xmmword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("0FE0CA" , pavgb(mm1, mm2));
+ TEST_INSTRUCTION("0FE08C1A80000000" , pavgb(mm1, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("0FE08C1A80000000" , pavgb(mm1, qword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("660FE0CA" , pavgb(xmm1, xmm2));
+ TEST_INSTRUCTION("660FE08C1A80000000" , pavgb(xmm1, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("660FE08C1A80000000" , pavgb(xmm1, xmmword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("0F0FCABF" , pavgusb(mm1, mm2));
+ TEST_INSTRUCTION("0F0F8C1A80000000BF" , pavgusb(mm1, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("0F0F8C1A80000000BF" , pavgusb(mm1, qword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("0FE3CA" , pavgw(mm1, mm2));
+ TEST_INSTRUCTION("0FE38C1A80000000" , pavgw(mm1, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("0FE38C1A80000000" , pavgw(mm1, qword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("660FE3CA" , pavgw(xmm1, xmm2));
+ TEST_INSTRUCTION("660FE38C1A80000000" , pavgw(xmm1, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("660FE38C1A80000000" , pavgw(xmm1, xmmword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("660F3810CA" , pblendvb(xmm1, xmm2, xmm0));
+ TEST_INSTRUCTION("660F38108C1A80000000" , pblendvb(xmm1, ptr(edx, ebx, 0, 128), xmm0));
+ TEST_INSTRUCTION("660F38108C1A80000000" , pblendvb(xmm1, xmmword_ptr(edx, ebx, 0, 128), xmm0));
+ TEST_INSTRUCTION("660F3A0ECA01" , pblendw(xmm1, xmm2, 1));
+ TEST_INSTRUCTION("660F3A0E8C1A8000000001" , pblendw(xmm1, ptr(edx, ebx, 0, 128), 1));
+ TEST_INSTRUCTION("660F3A0E8C1A8000000001" , pblendw(xmm1, xmmword_ptr(edx, ebx, 0, 128), 1));
+ TEST_INSTRUCTION("660F3A44CA01" , pclmulqdq(xmm1, xmm2, 1));
+ TEST_INSTRUCTION("660F3A448C1A8000000001" , pclmulqdq(xmm1, ptr(edx, ebx, 0, 128), 1));
+ TEST_INSTRUCTION("660F3A448C1A8000000001" , pclmulqdq(xmm1, xmmword_ptr(edx, ebx, 0, 128), 1));
+ TEST_INSTRUCTION("0F74CA" , pcmpeqb(mm1, mm2));
+ TEST_INSTRUCTION("0F748C1A80000000" , pcmpeqb(mm1, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("0F748C1A80000000" , pcmpeqb(mm1, qword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("660F74CA" , pcmpeqb(xmm1, xmm2));
+ TEST_INSTRUCTION("660F748C1A80000000" , pcmpeqb(xmm1, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("660F748C1A80000000" , pcmpeqb(xmm1, xmmword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("0F76CA" , pcmpeqd(mm1, mm2));
+ TEST_INSTRUCTION("0F768C1A80000000" , pcmpeqd(mm1, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("0F768C1A80000000" , pcmpeqd(mm1, qword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("660F76CA" , pcmpeqd(xmm1, xmm2));
+ TEST_INSTRUCTION("660F768C1A80000000" , pcmpeqd(xmm1, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("660F768C1A80000000" , pcmpeqd(xmm1, xmmword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("660F3829CA" , pcmpeqq(xmm1, xmm2));
+ TEST_INSTRUCTION("660F38298C1A80000000" , pcmpeqq(xmm1, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("660F38298C1A80000000" , pcmpeqq(xmm1, xmmword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("0F75CA" , pcmpeqw(mm1, mm2));
+ TEST_INSTRUCTION("0F758C1A80000000" , pcmpeqw(mm1, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("0F758C1A80000000" , pcmpeqw(mm1, qword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("660F75CA" , pcmpeqw(xmm1, xmm2));
+ TEST_INSTRUCTION("660F758C1A80000000" , pcmpeqw(xmm1, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("660F758C1A80000000" , pcmpeqw(xmm1, xmmword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("660F3A61CA01" , pcmpestri(xmm1, xmm2, 1, ecx, eax, edx));
+ TEST_INSTRUCTION("660F3A618C1A8000000001" , pcmpestri(xmm1, ptr(edx, ebx, 0, 128), 1, ecx, eax, edx));
+ TEST_INSTRUCTION("660F3A618C1A8000000001" , pcmpestri(xmm1, xmmword_ptr(edx, ebx, 0, 128), 1, ecx, eax, edx));
+ TEST_INSTRUCTION("660F3A60CA01" , pcmpestrm(xmm1, xmm2, 1, xmm0, eax, edx));
+ TEST_INSTRUCTION("660F3A608C1A8000000001" , pcmpestrm(xmm1, ptr(edx, ebx, 0, 128), 1, xmm0, eax, edx));
+ TEST_INSTRUCTION("660F3A608C1A8000000001" , pcmpestrm(xmm1, xmmword_ptr(edx, ebx, 0, 128), 1, xmm0, eax, edx));
+ TEST_INSTRUCTION("0F64CA" , pcmpgtb(mm1, mm2));
+ TEST_INSTRUCTION("0F648C1A80000000" , pcmpgtb(mm1, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("0F648C1A80000000" , pcmpgtb(mm1, qword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("660F64CA" , pcmpgtb(xmm1, xmm2));
+ TEST_INSTRUCTION("660F648C1A80000000" , pcmpgtb(xmm1, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("660F648C1A80000000" , pcmpgtb(xmm1, xmmword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("0F66CA" , pcmpgtd(mm1, mm2));
+ TEST_INSTRUCTION("0F668C1A80000000" , pcmpgtd(mm1, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("0F668C1A80000000" , pcmpgtd(mm1, qword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("660F66CA" , pcmpgtd(xmm1, xmm2));
+ TEST_INSTRUCTION("660F668C1A80000000" , pcmpgtd(xmm1, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("660F668C1A80000000" , pcmpgtd(xmm1, xmmword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("660F3837CA" , pcmpgtq(xmm1, xmm2));
+ TEST_INSTRUCTION("660F38378C1A80000000" , pcmpgtq(xmm1, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("660F38378C1A80000000" , pcmpgtq(xmm1, xmmword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("0F65CA" , pcmpgtw(mm1, mm2));
+ TEST_INSTRUCTION("0F658C1A80000000" , pcmpgtw(mm1, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("0F658C1A80000000" , pcmpgtw(mm1, qword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("660F65CA" , pcmpgtw(xmm1, xmm2));
+ TEST_INSTRUCTION("660F658C1A80000000" , pcmpgtw(xmm1, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("660F658C1A80000000" , pcmpgtw(xmm1, xmmword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("660F3A63CA01" , pcmpistri(xmm1, xmm2, 1, ecx));
+ TEST_INSTRUCTION("660F3A638C1A8000000001" , pcmpistri(xmm1, ptr(edx, ebx, 0, 128), 1, ecx));
+ TEST_INSTRUCTION("660F3A638C1A8000000001" , pcmpistri(xmm1, xmmword_ptr(edx, ebx, 0, 128), 1, ecx));
+ TEST_INSTRUCTION("660F3A62CA01" , pcmpistrm(xmm1, xmm2, 1, xmm0));
+ TEST_INSTRUCTION("660F3A628C1A8000000001" , pcmpistrm(xmm1, ptr(edx, ebx, 0, 128), 1, xmm0));
+ TEST_INSTRUCTION("660F3A628C1A8000000001" , pcmpistrm(xmm1, xmmword_ptr(edx, ebx, 0, 128), 1, xmm0));
+ TEST_INSTRUCTION("660F3A14D101" , pextrb(ecx, xmm2, 1));
+ TEST_INSTRUCTION("660F3A149C118000000001" , pextrb(ptr(ecx, edx, 0, 128), xmm3, 1));
+ TEST_INSTRUCTION("660F3A149C118000000001" , pextrb(byte_ptr(ecx, edx, 0, 128), xmm3, 1));
+ TEST_INSTRUCTION("660F3A16D101" , pextrd(ecx, xmm2, 1));
+ TEST_INSTRUCTION("660F3A169C118000000001" , pextrd(ptr(ecx, edx, 0, 128), xmm3, 1));
+ TEST_INSTRUCTION("660F3A169C118000000001" , pextrd(dword_ptr(ecx, edx, 0, 128), xmm3, 1));
+ TEST_INSTRUCTION("660FC5CA01" , pextrw(ecx, xmm2, 1));
+ TEST_INSTRUCTION("0FC5CA01" , pextrw(ecx, mm2, 1));
+ TEST_INSTRUCTION("660F3A159C118000000001" , pextrw(ptr(ecx, edx, 0, 128), xmm3, 1));
+ TEST_INSTRUCTION("660F3A159C118000000001" , pextrw(word_ptr(ecx, edx, 0, 128), xmm3, 1));
+ TEST_INSTRUCTION("0F0FCA1D" , pf2id(mm1, mm2));
+ TEST_INSTRUCTION("0F0F8C1A800000001D" , pf2id(mm1, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("0F0F8C1A800000001D" , pf2id(mm1, qword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("0F0FCA1C" , pf2iw(mm1, mm2));
+ TEST_INSTRUCTION("0F0F8C1A800000001C" , pf2iw(mm1, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("0F0F8C1A800000001C" , pf2iw(mm1, qword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("0F0FCAAE" , pfacc(mm1, mm2));
+ TEST_INSTRUCTION("0F0F8C1A80000000AE" , pfacc(mm1, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("0F0F8C1A80000000AE" , pfacc(mm1, qword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("0F0FCA9E" , pfadd(mm1, mm2));
+ TEST_INSTRUCTION("0F0F8C1A800000009E" , pfadd(mm1, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("0F0F8C1A800000009E" , pfadd(mm1, qword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("0F0FCAB0" , pfcmpeq(mm1, mm2));
+ TEST_INSTRUCTION("0F0F8C1A80000000B0" , pfcmpeq(mm1, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("0F0F8C1A80000000B0" , pfcmpeq(mm1, qword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("0F0FCA90" , pfcmpge(mm1, mm2));
+ TEST_INSTRUCTION("0F0F8C1A8000000090" , pfcmpge(mm1, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("0F0F8C1A8000000090" , pfcmpge(mm1, qword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("0F0FCAA0" , pfcmpgt(mm1, mm2));
+ TEST_INSTRUCTION("0F0F8C1A80000000A0" , pfcmpgt(mm1, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("0F0F8C1A80000000A0" , pfcmpgt(mm1, qword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("0F0FCAA4" , pfmax(mm1, mm2));
+ TEST_INSTRUCTION("0F0F8C1A80000000A4" , pfmax(mm1, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("0F0F8C1A80000000A4" , pfmax(mm1, qword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("0F0FCA94" , pfmin(mm1, mm2));
+ TEST_INSTRUCTION("0F0F8C1A8000000094" , pfmin(mm1, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("0F0F8C1A8000000094" , pfmin(mm1, qword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("0F0FCAB4" , pfmul(mm1, mm2));
+ TEST_INSTRUCTION("0F0F8C1A80000000B4" , pfmul(mm1, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("0F0F8C1A80000000B4" , pfmul(mm1, qword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("0F0FCA8A" , pfnacc(mm1, mm2));
+ TEST_INSTRUCTION("0F0F8C1A800000008A" , pfnacc(mm1, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("0F0F8C1A800000008A" , pfnacc(mm1, qword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("0F0FCA8E" , pfpnacc(mm1, mm2));
+ TEST_INSTRUCTION("0F0F8C1A800000008E" , pfpnacc(mm1, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("0F0F8C1A800000008E" , pfpnacc(mm1, qword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("0F0FCA96" , pfrcp(mm1, mm2));
+ TEST_INSTRUCTION("0F0F8C1A8000000096" , pfrcp(mm1, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("0F0F8C1A8000000096" , pfrcp(mm1, qword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("0F0FCAA6" , pfrcpit1(mm1, mm2));
+ TEST_INSTRUCTION("0F0F8C1A80000000A6" , pfrcpit1(mm1, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("0F0F8C1A80000000A6" , pfrcpit1(mm1, qword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("0F0FCAB6" , pfrcpit2(mm1, mm2));
+ TEST_INSTRUCTION("0F0F8C1A80000000B6" , pfrcpit2(mm1, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("0F0F8C1A80000000B6" , pfrcpit2(mm1, qword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("0F0FCA86" , pfrcpv(mm1, mm2));
+ TEST_INSTRUCTION("0F0F8C1A8000000086" , pfrcpv(mm1, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("0F0F8C1A8000000086" , pfrcpv(mm1, qword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("0F0FCAA7" , pfrsqit1(mm1, mm2));
+ TEST_INSTRUCTION("0F0F8C1A80000000A7" , pfrsqit1(mm1, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("0F0F8C1A80000000A7" , pfrsqit1(mm1, qword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("0F0FCA97" , pfrsqrt(mm1, mm2));
+ TEST_INSTRUCTION("0F0F8C1A8000000097" , pfrsqrt(mm1, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("0F0F8C1A8000000097" , pfrsqrt(mm1, qword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("0F0FCA87" , pfrsqrtv(mm1, mm2));
+ TEST_INSTRUCTION("0F0F8C1A8000000087" , pfrsqrtv(mm1, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("0F0F8C1A8000000087" , pfrsqrtv(mm1, qword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("0F0FCA9A" , pfsub(mm1, mm2));
+ TEST_INSTRUCTION("0F0F8C1A800000009A" , pfsub(mm1, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("0F0F8C1A800000009A" , pfsub(mm1, qword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("0F0FCAAA" , pfsubr(mm1, mm2));
+ TEST_INSTRUCTION("0F0F8C1A80000000AA" , pfsubr(mm1, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("0F0F8C1A80000000AA" , pfsubr(mm1, qword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("0F3802CA" , phaddd(mm1, mm2));
+ TEST_INSTRUCTION("0F38028C1A80000000" , phaddd(mm1, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("0F38028C1A80000000" , phaddd(mm1, qword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("660F3802CA" , phaddd(xmm1, xmm2));
+ TEST_INSTRUCTION("660F38028C1A80000000" , phaddd(xmm1, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("660F38028C1A80000000" , phaddd(xmm1, xmmword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("0F3803CA" , phaddsw(mm1, mm2));
+ TEST_INSTRUCTION("0F38038C1A80000000" , phaddsw(mm1, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("0F38038C1A80000000" , phaddsw(mm1, qword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("660F3803CA" , phaddsw(xmm1, xmm2));
+ TEST_INSTRUCTION("660F38038C1A80000000" , phaddsw(xmm1, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("660F38038C1A80000000" , phaddsw(xmm1, xmmword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("0F3801CA" , phaddw(mm1, mm2));
+ TEST_INSTRUCTION("0F38018C1A80000000" , phaddw(mm1, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("0F38018C1A80000000" , phaddw(mm1, qword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("660F3801CA" , phaddw(xmm1, xmm2));
+ TEST_INSTRUCTION("660F38018C1A80000000" , phaddw(xmm1, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("660F38018C1A80000000" , phaddw(xmm1, xmmword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("660F3841CA" , phminposuw(xmm1, xmm2));
+ TEST_INSTRUCTION("660F38418C1A80000000" , phminposuw(xmm1, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("660F38418C1A80000000" , phminposuw(xmm1, xmmword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("0F3806CA" , phsubd(mm1, mm2));
+ TEST_INSTRUCTION("0F38068C1A80000000" , phsubd(mm1, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("0F38068C1A80000000" , phsubd(mm1, qword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("660F3806CA" , phsubd(xmm1, xmm2));
+ TEST_INSTRUCTION("660F38068C1A80000000" , phsubd(xmm1, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("660F38068C1A80000000" , phsubd(xmm1, xmmword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("0F3807CA" , phsubsw(mm1, mm2));
+ TEST_INSTRUCTION("0F38078C1A80000000" , phsubsw(mm1, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("0F38078C1A80000000" , phsubsw(mm1, qword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("660F3807CA" , phsubsw(xmm1, xmm2));
+ TEST_INSTRUCTION("660F38078C1A80000000" , phsubsw(xmm1, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("660F38078C1A80000000" , phsubsw(xmm1, xmmword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("0F3805CA" , phsubw(mm1, mm2));
+ TEST_INSTRUCTION("0F38058C1A80000000" , phsubw(mm1, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("0F38058C1A80000000" , phsubw(mm1, qword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("660F3805CA" , phsubw(xmm1, xmm2));
+ TEST_INSTRUCTION("660F38058C1A80000000" , phsubw(xmm1, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("660F38058C1A80000000" , phsubw(xmm1, xmmword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("0F0FCA0D" , pi2fd(mm1, mm2));
+ TEST_INSTRUCTION("0F0F8C1A800000000D" , pi2fd(mm1, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("0F0F8C1A800000000D" , pi2fd(mm1, qword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("0F0FCA0C" , pi2fw(mm1, mm2));
+ TEST_INSTRUCTION("0F0F8C1A800000000C" , pi2fw(mm1, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("0F0F8C1A800000000C" , pi2fw(mm1, qword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("660F3A20CA01" , pinsrb(xmm1, edx, 1));
+ TEST_INSTRUCTION("660F3A208C1A8000000001" , pinsrb(xmm1, ptr(edx, ebx, 0, 128), 1));
+ TEST_INSTRUCTION("660F3A208C1A8000000001" , pinsrb(xmm1, byte_ptr(edx, ebx, 0, 128), 1));
+ TEST_INSTRUCTION("660F3A22CA01" , pinsrd(xmm1, edx, 1));
+ TEST_INSTRUCTION("660F3A228C1A8000000001" , pinsrd(xmm1, ptr(edx, ebx, 0, 128), 1));
+ TEST_INSTRUCTION("660F3A228C1A8000000001" , pinsrd(xmm1, dword_ptr(edx, ebx, 0, 128), 1));
+ TEST_INSTRUCTION("660FC4CA01" , pinsrw(xmm1, edx, 1));
+ TEST_INSTRUCTION("660FC48C1A8000000001" , pinsrw(xmm1, ptr(edx, ebx, 0, 128), 1));
+ TEST_INSTRUCTION("660FC48C1A8000000001" , pinsrw(xmm1, word_ptr(edx, ebx, 0, 128), 1));
+ TEST_INSTRUCTION("0FC4CA01" , pinsrw(mm1, edx, 1));
+ TEST_INSTRUCTION("0FC48C1A8000000001" , pinsrw(mm1, ptr(edx, ebx, 0, 128), 1));
+ TEST_INSTRUCTION("0FC48C1A8000000001" , pinsrw(mm1, word_ptr(edx, ebx, 0, 128), 1));
+ TEST_INSTRUCTION("0F3804CA" , pmaddubsw(mm1, mm2));
+ TEST_INSTRUCTION("0F38048C1A80000000" , pmaddubsw(mm1, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("0F38048C1A80000000" , pmaddubsw(mm1, qword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("660F3804CA" , pmaddubsw(xmm1, xmm2));
+ TEST_INSTRUCTION("660F38048C1A80000000" , pmaddubsw(xmm1, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("660F38048C1A80000000" , pmaddubsw(xmm1, xmmword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("0FF5CA" , pmaddwd(mm1, mm2));
+ TEST_INSTRUCTION("0FF58C1A80000000" , pmaddwd(mm1, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("0FF58C1A80000000" , pmaddwd(mm1, qword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("660FF5CA" , pmaddwd(xmm1, xmm2));
+ TEST_INSTRUCTION("660FF58C1A80000000" , pmaddwd(xmm1, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("660FF58C1A80000000" , pmaddwd(xmm1, xmmword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("660F383CCA" , pmaxsb(xmm1, xmm2));
+ TEST_INSTRUCTION("660F383C8C1A80000000" , pmaxsb(xmm1, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("660F383C8C1A80000000" , pmaxsb(xmm1, xmmword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("660F383DCA" , pmaxsd(xmm1, xmm2));
+ TEST_INSTRUCTION("660F383D8C1A80000000" , pmaxsd(xmm1, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("660F383D8C1A80000000" , pmaxsd(xmm1, xmmword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("0FEECA" , pmaxsw(mm1, mm2));
+ TEST_INSTRUCTION("0FEE8C1A80000000" , pmaxsw(mm1, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("0FEE8C1A80000000" , pmaxsw(mm1, qword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("660FEECA" , pmaxsw(xmm1, xmm2));
+ TEST_INSTRUCTION("660FEE8C1A80000000" , pmaxsw(xmm1, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("660FEE8C1A80000000" , pmaxsw(xmm1, xmmword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("0FDECA" , pmaxub(mm1, mm2));
+ TEST_INSTRUCTION("0FDE8C1A80000000" , pmaxub(mm1, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("0FDE8C1A80000000" , pmaxub(mm1, qword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("660FDECA" , pmaxub(xmm1, xmm2));
+ TEST_INSTRUCTION("660FDE8C1A80000000" , pmaxub(xmm1, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("660FDE8C1A80000000" , pmaxub(xmm1, xmmword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("660F383FCA" , pmaxud(xmm1, xmm2));
+ TEST_INSTRUCTION("660F383F8C1A80000000" , pmaxud(xmm1, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("660F383F8C1A80000000" , pmaxud(xmm1, xmmword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("660F383ECA" , pmaxuw(xmm1, xmm2));
+ TEST_INSTRUCTION("660F383E8C1A80000000" , pmaxuw(xmm1, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("660F383E8C1A80000000" , pmaxuw(xmm1, xmmword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("660F3838CA" , pminsb(xmm1, xmm2));
+ TEST_INSTRUCTION("660F38388C1A80000000" , pminsb(xmm1, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("660F38388C1A80000000" , pminsb(xmm1, xmmword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("660F3839CA" , pminsd(xmm1, xmm2));
+ TEST_INSTRUCTION("660F38398C1A80000000" , pminsd(xmm1, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("660F38398C1A80000000" , pminsd(xmm1, xmmword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("0FEACA" , pminsw(mm1, mm2));
+ TEST_INSTRUCTION("0FEA8C1A80000000" , pminsw(mm1, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("0FEA8C1A80000000" , pminsw(mm1, qword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("660FEACA" , pminsw(xmm1, xmm2));
+ TEST_INSTRUCTION("660FEA8C1A80000000" , pminsw(xmm1, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("660FEA8C1A80000000" , pminsw(xmm1, xmmword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("0FDACA" , pminub(mm1, mm2));
+ TEST_INSTRUCTION("0FDA8C1A80000000" , pminub(mm1, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("0FDA8C1A80000000" , pminub(mm1, qword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("660FDACA" , pminub(xmm1, xmm2));
+ TEST_INSTRUCTION("660FDA8C1A80000000" , pminub(xmm1, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("660FDA8C1A80000000" , pminub(xmm1, xmmword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("660F383BCA" , pminud(xmm1, xmm2));
+ TEST_INSTRUCTION("660F383B8C1A80000000" , pminud(xmm1, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("660F383B8C1A80000000" , pminud(xmm1, xmmword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("660F383ACA" , pminuw(xmm1, xmm2));
+ TEST_INSTRUCTION("660F383A8C1A80000000" , pminuw(xmm1, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("660F383A8C1A80000000" , pminuw(xmm1, xmmword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("660FD7CA" , pmovmskb(ecx, xmm2));
+ TEST_INSTRUCTION("0FD7CA" , pmovmskb(ecx, mm2));
+ TEST_INSTRUCTION("660F3821CA" , pmovsxbd(xmm1, xmm2));
+ TEST_INSTRUCTION("660F38218C1A80000000" , pmovsxbd(xmm1, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("660F38218C1A80000000" , pmovsxbd(xmm1, dword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("660F3822CA" , pmovsxbq(xmm1, xmm2));
+ TEST_INSTRUCTION("660F38228C1A80000000" , pmovsxbq(xmm1, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("660F38228C1A80000000" , pmovsxbq(xmm1, word_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("660F3820CA" , pmovsxbw(xmm1, xmm2));
+ TEST_INSTRUCTION("660F38208C1A80000000" , pmovsxbw(xmm1, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("660F38208C1A80000000" , pmovsxbw(xmm1, qword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("660F3825CA" , pmovsxdq(xmm1, xmm2));
+ TEST_INSTRUCTION("660F38258C1A80000000" , pmovsxdq(xmm1, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("660F38258C1A80000000" , pmovsxdq(xmm1, qword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("660F3823CA" , pmovsxwd(xmm1, xmm2));
+ TEST_INSTRUCTION("660F38238C1A80000000" , pmovsxwd(xmm1, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("660F38238C1A80000000" , pmovsxwd(xmm1, qword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("660F3824CA" , pmovsxwq(xmm1, xmm2));
+ TEST_INSTRUCTION("660F38248C1A80000000" , pmovsxwq(xmm1, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("660F38248C1A80000000" , pmovsxwq(xmm1, dword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("660F3831CA" , pmovzxbd(xmm1, xmm2));
+ TEST_INSTRUCTION("660F38318C1A80000000" , pmovzxbd(xmm1, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("660F38318C1A80000000" , pmovzxbd(xmm1, dword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("660F3832CA" , pmovzxbq(xmm1, xmm2));
+ TEST_INSTRUCTION("660F38328C1A80000000" , pmovzxbq(xmm1, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("660F38328C1A80000000" , pmovzxbq(xmm1, word_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("660F3830CA" , pmovzxbw(xmm1, xmm2));
+ TEST_INSTRUCTION("660F38308C1A80000000" , pmovzxbw(xmm1, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("660F38308C1A80000000" , pmovzxbw(xmm1, qword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("660F3835CA" , pmovzxdq(xmm1, xmm2));
+ TEST_INSTRUCTION("660F38358C1A80000000" , pmovzxdq(xmm1, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("660F38358C1A80000000" , pmovzxdq(xmm1, qword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("660F3833CA" , pmovzxwd(xmm1, xmm2));
+ TEST_INSTRUCTION("660F38338C1A80000000" , pmovzxwd(xmm1, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("660F38338C1A80000000" , pmovzxwd(xmm1, qword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("660F3834CA" , pmovzxwq(xmm1, xmm2));
+ TEST_INSTRUCTION("660F38348C1A80000000" , pmovzxwq(xmm1, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("660F38348C1A80000000" , pmovzxwq(xmm1, dword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("660F3828CA" , pmuldq(xmm1, xmm2));
+ TEST_INSTRUCTION("660F38288C1A80000000" , pmuldq(xmm1, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("660F38288C1A80000000" , pmuldq(xmm1, xmmword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("0F380BCA" , pmulhrsw(mm1, mm2));
+ TEST_INSTRUCTION("0F380B8C1A80000000" , pmulhrsw(mm1, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("0F380B8C1A80000000" , pmulhrsw(mm1, qword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("660F380BCA" , pmulhrsw(xmm1, xmm2));
+ TEST_INSTRUCTION("660F380B8C1A80000000" , pmulhrsw(xmm1, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("660F380B8C1A80000000" , pmulhrsw(xmm1, xmmword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("0F0FCAB7" , pmulhrw(mm1, mm2));
+ TEST_INSTRUCTION("0F0F8C1A80000000B7" , pmulhrw(mm1, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("0F0F8C1A80000000B7" , pmulhrw(mm1, qword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("0FE4CA" , pmulhuw(mm1, mm2));
+ TEST_INSTRUCTION("0FE48C1A80000000" , pmulhuw(mm1, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("0FE48C1A80000000" , pmulhuw(mm1, qword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("660FE4CA" , pmulhuw(xmm1, xmm2));
+ TEST_INSTRUCTION("660FE48C1A80000000" , pmulhuw(xmm1, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("660FE48C1A80000000" , pmulhuw(xmm1, xmmword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("0FE5CA" , pmulhw(mm1, mm2));
+ TEST_INSTRUCTION("0FE58C1A80000000" , pmulhw(mm1, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("0FE58C1A80000000" , pmulhw(mm1, qword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("660FE5CA" , pmulhw(xmm1, xmm2));
+ TEST_INSTRUCTION("660FE58C1A80000000" , pmulhw(xmm1, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("660FE58C1A80000000" , pmulhw(xmm1, xmmword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("660F3840CA" , pmulld(xmm1, xmm2));
+ TEST_INSTRUCTION("660F38408C1A80000000" , pmulld(xmm1, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("660F38408C1A80000000" , pmulld(xmm1, xmmword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("0FD5CA" , pmullw(mm1, mm2));
+ TEST_INSTRUCTION("0FD58C1A80000000" , pmullw(mm1, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("0FD58C1A80000000" , pmullw(mm1, qword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("660FD5CA" , pmullw(xmm1, xmm2));
+ TEST_INSTRUCTION("660FD58C1A80000000" , pmullw(xmm1, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("660FD58C1A80000000" , pmullw(xmm1, xmmword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("0FF4CA" , pmuludq(mm1, mm2));
+ TEST_INSTRUCTION("0FF48C1A80000000" , pmuludq(mm1, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("0FF48C1A80000000" , pmuludq(mm1, qword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("660FF4CA" , pmuludq(xmm1, xmm2));
+ TEST_INSTRUCTION("660FF48C1A80000000" , pmuludq(xmm1, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("660FF48C1A80000000" , pmuludq(xmm1, xmmword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("0FEBCA" , por(mm1, mm2));
+ TEST_INSTRUCTION("0FEB8C1A80000000" , por(mm1, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("0FEB8C1A80000000" , por(mm1, qword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("660FEBCA" , por(xmm1, xmm2));
+ TEST_INSTRUCTION("660FEB8C1A80000000" , por(xmm1, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("660FEB8C1A80000000" , por(xmm1, xmmword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("0FF6CA" , psadbw(mm1, mm2));
+ TEST_INSTRUCTION("0FF68C1A80000000" , psadbw(mm1, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("0FF68C1A80000000" , psadbw(mm1, qword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("660FF6CA" , psadbw(xmm1, xmm2));
+ TEST_INSTRUCTION("660FF68C1A80000000" , psadbw(xmm1, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("660FF68C1A80000000" , psadbw(xmm1, xmmword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("0F3800CA" , pshufb(mm1, mm2));
+ TEST_INSTRUCTION("0F38008C1A80000000" , pshufb(mm1, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("0F38008C1A80000000" , pshufb(mm1, qword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("660F3800CA" , pshufb(xmm1, xmm2));
+ TEST_INSTRUCTION("660F38008C1A80000000" , pshufb(xmm1, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("660F38008C1A80000000" , pshufb(xmm1, xmmword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("660F70CA01" , pshufd(xmm1, xmm2, 1));
+ TEST_INSTRUCTION("660F708C1A8000000001" , pshufd(xmm1, ptr(edx, ebx, 0, 128), 1));
+ TEST_INSTRUCTION("660F708C1A8000000001" , pshufd(xmm1, xmmword_ptr(edx, ebx, 0, 128), 1));
+ TEST_INSTRUCTION("F30F70CA01" , pshufhw(xmm1, xmm2, 1));
+ TEST_INSTRUCTION("F30F708C1A8000000001" , pshufhw(xmm1, ptr(edx, ebx, 0, 128), 1));
+ TEST_INSTRUCTION("F30F708C1A8000000001" , pshufhw(xmm1, xmmword_ptr(edx, ebx, 0, 128), 1));
+ TEST_INSTRUCTION("F20F70CA01" , pshuflw(xmm1, xmm2, 1));
+ TEST_INSTRUCTION("F20F708C1A8000000001" , pshuflw(xmm1, ptr(edx, ebx, 0, 128), 1));
+ TEST_INSTRUCTION("F20F708C1A8000000001" , pshuflw(xmm1, xmmword_ptr(edx, ebx, 0, 128), 1));
+ TEST_INSTRUCTION("0F70CA01" , pshufw(mm1, mm2, 1));
+ TEST_INSTRUCTION("0F708C1A8000000001" , pshufw(mm1, ptr(edx, ebx, 0, 128), 1));
+ TEST_INSTRUCTION("0F708C1A8000000001" , pshufw(mm1, qword_ptr(edx, ebx, 0, 128), 1));
+ TEST_INSTRUCTION("0F3808CA" , psignb(mm1, mm2));
+ TEST_INSTRUCTION("0F38088C1A80000000" , psignb(mm1, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("0F38088C1A80000000" , psignb(mm1, qword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("660F3808CA" , psignb(xmm1, xmm2));
+ TEST_INSTRUCTION("660F38088C1A80000000" , psignb(xmm1, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("660F38088C1A80000000" , psignb(xmm1, xmmword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("0F380ACA" , psignd(mm1, mm2));
+ TEST_INSTRUCTION("0F380A8C1A80000000" , psignd(mm1, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("0F380A8C1A80000000" , psignd(mm1, qword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("660F380ACA" , psignd(xmm1, xmm2));
+ TEST_INSTRUCTION("660F380A8C1A80000000" , psignd(xmm1, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("660F380A8C1A80000000" , psignd(xmm1, xmmword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("0F3809CA" , psignw(mm1, mm2));
+ TEST_INSTRUCTION("0F38098C1A80000000" , psignw(mm1, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("0F38098C1A80000000" , psignw(mm1, qword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("660F3809CA" , psignw(xmm1, xmm2));
+ TEST_INSTRUCTION("660F38098C1A80000000" , psignw(xmm1, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("660F38098C1A80000000" , psignw(xmm1, xmmword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("0FF2CA" , pslld(mm1, mm2));
+ TEST_INSTRUCTION("0F72F101" , pslld(mm1, 1));
+ TEST_INSTRUCTION("0FF28C1A80000000" , pslld(mm1, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("0FF28C1A80000000" , pslld(mm1, qword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("660FF2CA" , pslld(xmm1, xmm2));
+ TEST_INSTRUCTION("660F72F101" , pslld(xmm1, 1));
+ TEST_INSTRUCTION("660FF28C1A80000000" , pslld(xmm1, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("660FF28C1A80000000" , pslld(xmm1, xmmword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("660F73F901" , pslldq(xmm1, 1));
+ TEST_INSTRUCTION("0FF3CA" , psllq(mm1, mm2));
+ TEST_INSTRUCTION("0F73F101" , psllq(mm1, 1));
+ TEST_INSTRUCTION("0FF38C1A80000000" , psllq(mm1, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("0FF38C1A80000000" , psllq(mm1, qword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("660FF3CA" , psllq(xmm1, xmm2));
+ TEST_INSTRUCTION("660F73F101" , psllq(xmm1, 1));
+ TEST_INSTRUCTION("660FF38C1A80000000" , psllq(xmm1, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("660FF38C1A80000000" , psllq(xmm1, xmmword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("0FF1CA" , psllw(mm1, mm2));
+ TEST_INSTRUCTION("0F71F101" , psllw(mm1, 1));
+ TEST_INSTRUCTION("0FF18C1A80000000" , psllw(mm1, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("0FF18C1A80000000" , psllw(mm1, qword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("660FF1CA" , psllw(xmm1, xmm2));
+ TEST_INSTRUCTION("660F71F101" , psllw(xmm1, 1));
+ TEST_INSTRUCTION("660FF18C1A80000000" , psllw(xmm1, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("660FF18C1A80000000" , psllw(xmm1, xmmword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("0FE2CA" , psrad(mm1, mm2));
+ TEST_INSTRUCTION("0F72E101" , psrad(mm1, 1));
+ TEST_INSTRUCTION("0FE28C1A80000000" , psrad(mm1, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("0FE28C1A80000000" , psrad(mm1, qword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("660FE2CA" , psrad(xmm1, xmm2));
+ TEST_INSTRUCTION("660F72E101" , psrad(xmm1, 1));
+ TEST_INSTRUCTION("660FE28C1A80000000" , psrad(xmm1, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("660FE28C1A80000000" , psrad(xmm1, xmmword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("0FE1CA" , psraw(mm1, mm2));
+ TEST_INSTRUCTION("0F71E101" , psraw(mm1, 1));
+ TEST_INSTRUCTION("0FE18C1A80000000" , psraw(mm1, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("0FE18C1A80000000" , psraw(mm1, qword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("660FE1CA" , psraw(xmm1, xmm2));
+ TEST_INSTRUCTION("660F71E101" , psraw(xmm1, 1));
+ TEST_INSTRUCTION("660FE18C1A80000000" , psraw(xmm1, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("660FE18C1A80000000" , psraw(xmm1, xmmword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("0FD2CA" , psrld(mm1, mm2));
+ TEST_INSTRUCTION("0F72D101" , psrld(mm1, 1));
+ TEST_INSTRUCTION("0FD28C1A80000000" , psrld(mm1, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("0FD28C1A80000000" , psrld(mm1, qword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("660FD2CA" , psrld(xmm1, xmm2));
+ TEST_INSTRUCTION("660F72D101" , psrld(xmm1, 1));
+ TEST_INSTRUCTION("660FD28C1A80000000" , psrld(xmm1, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("660FD28C1A80000000" , psrld(xmm1, xmmword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("660F73D901" , psrldq(xmm1, 1));
+ TEST_INSTRUCTION("0FD3CA" , psrlq(mm1, mm2));
+ TEST_INSTRUCTION("0F73D101" , psrlq(mm1, 1));
+ TEST_INSTRUCTION("0FD38C1A80000000" , psrlq(mm1, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("0FD38C1A80000000" , psrlq(mm1, qword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("660FD3CA" , psrlq(xmm1, xmm2));
+ TEST_INSTRUCTION("660F73D101" , psrlq(xmm1, 1));
+ TEST_INSTRUCTION("660FD38C1A80000000" , psrlq(xmm1, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("660FD38C1A80000000" , psrlq(xmm1, xmmword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("0FD1CA" , psrlw(mm1, mm2));
+ TEST_INSTRUCTION("0F71D101" , psrlw(mm1, 1));
+ TEST_INSTRUCTION("0FD18C1A80000000" , psrlw(mm1, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("0FD18C1A80000000" , psrlw(mm1, qword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("660FD1CA" , psrlw(xmm1, xmm2));
+ TEST_INSTRUCTION("660F71D101" , psrlw(xmm1, 1));
+ TEST_INSTRUCTION("660FD18C1A80000000" , psrlw(xmm1, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("660FD18C1A80000000" , psrlw(xmm1, xmmword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("0FF8CA" , psubb(mm1, mm2));
+ TEST_INSTRUCTION("0FF88C1A80000000" , psubb(mm1, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("0FF88C1A80000000" , psubb(mm1, qword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("660FF8CA" , psubb(xmm1, xmm2));
+ TEST_INSTRUCTION("660FF88C1A80000000" , psubb(xmm1, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("660FF88C1A80000000" , psubb(xmm1, xmmword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("0FFACA" , psubd(mm1, mm2));
+ TEST_INSTRUCTION("0FFA8C1A80000000" , psubd(mm1, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("0FFA8C1A80000000" , psubd(mm1, qword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("660FFACA" , psubd(xmm1, xmm2));
+ TEST_INSTRUCTION("660FFA8C1A80000000" , psubd(xmm1, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("660FFA8C1A80000000" , psubd(xmm1, xmmword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("0FFBCA" , psubq(mm1, mm2));
+ TEST_INSTRUCTION("0FFB8C1A80000000" , psubq(mm1, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("0FFB8C1A80000000" , psubq(mm1, qword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("660FFBCA" , psubq(xmm1, xmm2));
+ TEST_INSTRUCTION("660FFB8C1A80000000" , psubq(xmm1, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("660FFB8C1A80000000" , psubq(xmm1, xmmword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("0FE8CA" , psubsb(mm1, mm2));
+ TEST_INSTRUCTION("0FE88C1A80000000" , psubsb(mm1, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("0FE88C1A80000000" , psubsb(mm1, qword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("660FE8CA" , psubsb(xmm1, xmm2));
+ TEST_INSTRUCTION("660FE88C1A80000000" , psubsb(xmm1, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("660FE88C1A80000000" , psubsb(xmm1, xmmword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("0FE9CA" , psubsw(mm1, mm2));
+ TEST_INSTRUCTION("0FE98C1A80000000" , psubsw(mm1, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("0FE98C1A80000000" , psubsw(mm1, qword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("660FE9CA" , psubsw(xmm1, xmm2));
+ TEST_INSTRUCTION("660FE98C1A80000000" , psubsw(xmm1, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("660FE98C1A80000000" , psubsw(xmm1, xmmword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("0FD8CA" , psubusb(mm1, mm2));
+ TEST_INSTRUCTION("0FD88C1A80000000" , psubusb(mm1, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("0FD88C1A80000000" , psubusb(mm1, qword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("660FD8CA" , psubusb(xmm1, xmm2));
+ TEST_INSTRUCTION("660FD88C1A80000000" , psubusb(xmm1, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("660FD88C1A80000000" , psubusb(xmm1, xmmword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("0FD9CA" , psubusw(mm1, mm2));
+ TEST_INSTRUCTION("0FD98C1A80000000" , psubusw(mm1, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("0FD98C1A80000000" , psubusw(mm1, qword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("660FD9CA" , psubusw(xmm1, xmm2));
+ TEST_INSTRUCTION("660FD98C1A80000000" , psubusw(xmm1, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("660FD98C1A80000000" , psubusw(xmm1, xmmword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("0FF9CA" , psubw(mm1, mm2));
+ TEST_INSTRUCTION("0FF98C1A80000000" , psubw(mm1, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("0FF98C1A80000000" , psubw(mm1, qword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("660FF9CA" , psubw(xmm1, xmm2));
+ TEST_INSTRUCTION("660FF98C1A80000000" , psubw(xmm1, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("660FF98C1A80000000" , psubw(xmm1, xmmword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("0F0FCABB" , pswapd(mm1, mm2));
+ TEST_INSTRUCTION("0F0F8C1A80000000BB" , pswapd(mm1, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("0F0F8C1A80000000BB" , pswapd(mm1, qword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("660F3817CA" , ptest(xmm1, xmm2));
+ TEST_INSTRUCTION("660F38178C1A80000000" , ptest(xmm1, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("660F38178C1A80000000" , ptest(xmm1, xmmword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("0F68CA" , punpckhbw(mm1, mm2));
+ TEST_INSTRUCTION("0F688C1A80000000" , punpckhbw(mm1, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("0F688C1A80000000" , punpckhbw(mm1, qword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("660F68CA" , punpckhbw(xmm1, xmm2));
+ TEST_INSTRUCTION("660F688C1A80000000" , punpckhbw(xmm1, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("660F688C1A80000000" , punpckhbw(xmm1, xmmword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("0F6ACA" , punpckhdq(mm1, mm2));
+ TEST_INSTRUCTION("0F6A8C1A80000000" , punpckhdq(mm1, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("0F6A8C1A80000000" , punpckhdq(mm1, qword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("660F6ACA" , punpckhdq(xmm1, xmm2));
+ TEST_INSTRUCTION("660F6A8C1A80000000" , punpckhdq(xmm1, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("660F6A8C1A80000000" , punpckhdq(xmm1, xmmword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("660F6DCA" , punpckhqdq(xmm1, xmm2));
+ TEST_INSTRUCTION("660F6D8C1A80000000" , punpckhqdq(xmm1, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("660F6D8C1A80000000" , punpckhqdq(xmm1, xmmword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("0F69CA" , punpckhwd(mm1, mm2));
+ TEST_INSTRUCTION("0F698C1A80000000" , punpckhwd(mm1, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("0F698C1A80000000" , punpckhwd(mm1, qword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("660F69CA" , punpckhwd(xmm1, xmm2));
+ TEST_INSTRUCTION("660F698C1A80000000" , punpckhwd(xmm1, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("660F698C1A80000000" , punpckhwd(xmm1, xmmword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("0F60CA" , punpcklbw(mm1, mm2));
+ TEST_INSTRUCTION("0F608C1A80000000" , punpcklbw(mm1, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("0F608C1A80000000" , punpcklbw(mm1, dword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("660F60CA" , punpcklbw(xmm1, xmm2));
+ TEST_INSTRUCTION("660F608C1A80000000" , punpcklbw(xmm1, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("660F608C1A80000000" , punpcklbw(xmm1, xmmword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("0F62CA" , punpckldq(mm1, mm2));
+ TEST_INSTRUCTION("0F628C1A80000000" , punpckldq(mm1, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("0F628C1A80000000" , punpckldq(mm1, dword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("660F62CA" , punpckldq(xmm1, xmm2));
+ TEST_INSTRUCTION("660F628C1A80000000" , punpckldq(xmm1, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("660F628C1A80000000" , punpckldq(xmm1, xmmword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("660F6CCA" , punpcklqdq(xmm1, xmm2));
+ TEST_INSTRUCTION("660F6C8C1A80000000" , punpcklqdq(xmm1, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("660F6C8C1A80000000" , punpcklqdq(xmm1, xmmword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("0F61CA" , punpcklwd(mm1, mm2));
+ TEST_INSTRUCTION("0F618C1A80000000" , punpcklwd(mm1, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("0F618C1A80000000" , punpcklwd(mm1, dword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("660F61CA" , punpcklwd(xmm1, xmm2));
+ TEST_INSTRUCTION("660F618C1A80000000" , punpcklwd(xmm1, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("660F618C1A80000000" , punpcklwd(xmm1, xmmword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("0FEFCA" , pxor(mm1, mm2));
+ TEST_INSTRUCTION("0FEF8C1A80000000" , pxor(mm1, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("0FEF8C1A80000000" , pxor(mm1, qword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("660FEFCA" , pxor(xmm1, xmm2));
+ TEST_INSTRUCTION("660FEF8C1A80000000" , pxor(xmm1, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("660FEF8C1A80000000" , pxor(xmm1, xmmword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("0F53CA" , rcpps(xmm1, xmm2));
+ TEST_INSTRUCTION("0F538C1A80000000" , rcpps(xmm1, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("0F538C1A80000000" , rcpps(xmm1, xmmword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("F30F53CA" , rcpss(xmm1, xmm2));
+ TEST_INSTRUCTION("F30F538C1A80000000" , rcpss(xmm1, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("F30F538C1A80000000" , rcpss(xmm1, dword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("660F3A09CA01" , roundpd(xmm1, xmm2, 1));
+ TEST_INSTRUCTION("660F3A098C1A8000000001" , roundpd(xmm1, ptr(edx, ebx, 0, 128), 1));
+ TEST_INSTRUCTION("660F3A098C1A8000000001" , roundpd(xmm1, xmmword_ptr(edx, ebx, 0, 128), 1));
+ TEST_INSTRUCTION("660F3A08CA01" , roundps(xmm1, xmm2, 1));
+ TEST_INSTRUCTION("660F3A088C1A8000000001" , roundps(xmm1, ptr(edx, ebx, 0, 128), 1));
+ TEST_INSTRUCTION("660F3A088C1A8000000001" , roundps(xmm1, xmmword_ptr(edx, ebx, 0, 128), 1));
+ TEST_INSTRUCTION("660F3A0BCA01" , roundsd(xmm1, xmm2, 1));
+ TEST_INSTRUCTION("660F3A0B8C1A8000000001" , roundsd(xmm1, ptr(edx, ebx, 0, 128), 1));
+ TEST_INSTRUCTION("660F3A0B8C1A8000000001" , roundsd(xmm1, qword_ptr(edx, ebx, 0, 128), 1));
+ TEST_INSTRUCTION("660F3A0ACA01" , roundss(xmm1, xmm2, 1));
+ TEST_INSTRUCTION("660F3A0A8C1A8000000001" , roundss(xmm1, ptr(edx, ebx, 0, 128), 1));
+ TEST_INSTRUCTION("660F3A0A8C1A8000000001" , roundss(xmm1, dword_ptr(edx, ebx, 0, 128), 1));
+ TEST_INSTRUCTION("0F52CA" , rsqrtps(xmm1, xmm2));
+ TEST_INSTRUCTION("0F528C1A80000000" , rsqrtps(xmm1, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("0F528C1A80000000" , rsqrtps(xmm1, xmmword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("F30F52CA" , rsqrtss(xmm1, xmm2));
+ TEST_INSTRUCTION("F30F528C1A80000000" , rsqrtss(xmm1, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("F30F528C1A80000000" , rsqrtss(xmm1, dword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("0F38C9CA" , sha1msg1(xmm1, xmm2));
+ TEST_INSTRUCTION("0F38C98C1A80000000" , sha1msg1(xmm1, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("0F38C98C1A80000000" , sha1msg1(xmm1, xmmword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("0F38CACA" , sha1msg2(xmm1, xmm2));
+ TEST_INSTRUCTION("0F38CA8C1A80000000" , sha1msg2(xmm1, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("0F38CA8C1A80000000" , sha1msg2(xmm1, xmmword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("0F38C8CA" , sha1nexte(xmm1, xmm2));
+ TEST_INSTRUCTION("0F38C88C1A80000000" , sha1nexte(xmm1, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("0F38C88C1A80000000" , sha1nexte(xmm1, xmmword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("0F3ACCCA01" , sha1rnds4(xmm1, xmm2, 1));
+ TEST_INSTRUCTION("0F3ACC8C1A8000000001" , sha1rnds4(xmm1, ptr(edx, ebx, 0, 128), 1));
+ TEST_INSTRUCTION("0F3ACC8C1A8000000001" , sha1rnds4(xmm1, xmmword_ptr(edx, ebx, 0, 128), 1));
+ TEST_INSTRUCTION("0F38CCCA" , sha256msg1(xmm1, xmm2));
+ TEST_INSTRUCTION("0F38CC8C1A80000000" , sha256msg1(xmm1, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("0F38CC8C1A80000000" , sha256msg1(xmm1, xmmword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("0F38CDCA" , sha256msg2(xmm1, xmm2));
+ TEST_INSTRUCTION("0F38CD8C1A80000000" , sha256msg2(xmm1, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("0F38CD8C1A80000000" , sha256msg2(xmm1, xmmword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("0F38CBCA" , sha256rnds2(xmm1, xmm2, xmm0));
+ TEST_INSTRUCTION("0F38CB8C1A80000000" , sha256rnds2(xmm1, ptr(edx, ebx, 0, 128), xmm0));
+ TEST_INSTRUCTION("0F38CB8C1A80000000" , sha256rnds2(xmm1, xmmword_ptr(edx, ebx, 0, 128), xmm0));
+ TEST_INSTRUCTION("660FC6CA01" , shufpd(xmm1, xmm2, 1));
+ TEST_INSTRUCTION("660FC68C1A8000000001" , shufpd(xmm1, ptr(edx, ebx, 0, 128), 1));
+ TEST_INSTRUCTION("660FC68C1A8000000001" , shufpd(xmm1, xmmword_ptr(edx, ebx, 0, 128), 1));
+ TEST_INSTRUCTION("0FC6CA01" , shufps(xmm1, xmm2, 1));
+ TEST_INSTRUCTION("0FC68C1A8000000001" , shufps(xmm1, ptr(edx, ebx, 0, 128), 1));
+ TEST_INSTRUCTION("0FC68C1A8000000001" , shufps(xmm1, xmmword_ptr(edx, ebx, 0, 128), 1));
+ TEST_INSTRUCTION("660F51CA" , sqrtpd(xmm1, xmm2));
+ TEST_INSTRUCTION("660F518C1A80000000" , sqrtpd(xmm1, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("660F518C1A80000000" , sqrtpd(xmm1, xmmword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("0F51CA" , sqrtps(xmm1, xmm2));
+ TEST_INSTRUCTION("0F518C1A80000000" , sqrtps(xmm1, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("0F518C1A80000000" , sqrtps(xmm1, xmmword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("F20F51CA" , sqrtsd(xmm1, xmm2));
+ TEST_INSTRUCTION("F20F518C1A80000000" , sqrtsd(xmm1, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("F20F518C1A80000000" , sqrtsd(xmm1, qword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("F30F51CA" , sqrtss(xmm1, xmm2));
+ TEST_INSTRUCTION("F30F518C1A80000000" , sqrtss(xmm1, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("F30F518C1A80000000" , sqrtss(xmm1, dword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("660F5CCA" , subpd(xmm1, xmm2));
+ TEST_INSTRUCTION("660F5C8C1A80000000" , subpd(xmm1, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("660F5C8C1A80000000" , subpd(xmm1, xmmword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("0F5CCA" , subps(xmm1, xmm2));
+ TEST_INSTRUCTION("0F5C8C1A80000000" , subps(xmm1, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("0F5C8C1A80000000" , subps(xmm1, xmmword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("F20F5CCA" , subsd(xmm1, xmm2));
+ TEST_INSTRUCTION("F20F5C8C1A80000000" , subsd(xmm1, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("F20F5C8C1A80000000" , subsd(xmm1, qword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("F30F5CCA" , subss(xmm1, xmm2));
+ TEST_INSTRUCTION("F30F5C8C1A80000000" , subss(xmm1, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("F30F5C8C1A80000000" , subss(xmm1, dword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("660F2ECA" , ucomisd(xmm1, xmm2));
+ TEST_INSTRUCTION("660F2E8C1A80000000" , ucomisd(xmm1, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("660F2E8C1A80000000" , ucomisd(xmm1, qword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("0F2ECA" , ucomiss(xmm1, xmm2));
+ TEST_INSTRUCTION("0F2E8C1A80000000" , ucomiss(xmm1, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("0F2E8C1A80000000" , ucomiss(xmm1, dword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("660F15CA" , unpckhpd(xmm1, xmm2));
+ TEST_INSTRUCTION("660F158C1A80000000" , unpckhpd(xmm1, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("660F158C1A80000000" , unpckhpd(xmm1, xmmword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("0F15CA" , unpckhps(xmm1, xmm2));
+ TEST_INSTRUCTION("0F158C1A80000000" , unpckhps(xmm1, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("0F158C1A80000000" , unpckhps(xmm1, xmmword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("660F14CA" , unpcklpd(xmm1, xmm2));
+ TEST_INSTRUCTION("660F148C1A80000000" , unpcklpd(xmm1, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("660F148C1A80000000" , unpcklpd(xmm1, xmmword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("0F14CA" , unpcklps(xmm1, xmm2));
+ TEST_INSTRUCTION("0F148C1A80000000" , unpcklps(xmm1, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("0F148C1A80000000" , unpcklps(xmm1, xmmword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("660F57CA" , xorpd(xmm1, xmm2));
+ TEST_INSTRUCTION("660F578C1A80000000" , xorpd(xmm1, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("660F578C1A80000000" , xorpd(xmm1, xmmword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("0F57CA" , xorps(xmm1, xmm2));
+ TEST_INSTRUCTION("0F578C1A80000000" , xorps(xmm1, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("0F578C1A80000000" , xorps(xmm1, xmmword_ptr(edx, ebx, 0, 128)));
+}
+
+static void ASMJIT_NOINLINE testX86AssemblerAVX(AssemblerTester<x86::Assembler>& tester) noexcept {
+ using namespace x86;
+
+ TEST_INSTRUCTION("C5ED4ACB" , kaddb(k1, k2, k3));
+ TEST_INSTRUCTION("C4E1ED4ACB" , kaddd(k1, k2, k3));
+ TEST_INSTRUCTION("C4E1EC4ACB" , kaddq(k1, k2, k3));
+ TEST_INSTRUCTION("C5EC4ACB" , kaddw(k1, k2, k3));
+ TEST_INSTRUCTION("C5ED41CB" , kandb(k1, k2, k3));
+ TEST_INSTRUCTION("C4E1ED41CB" , kandd(k1, k2, k3));
+ TEST_INSTRUCTION("C5ED42CB" , kandnb(k1, k2, k3));
+ TEST_INSTRUCTION("C4E1ED42CB" , kandnd(k1, k2, k3));
+ TEST_INSTRUCTION("C4E1EC42CB" , kandnq(k1, k2, k3));
+ TEST_INSTRUCTION("C5EC42CB" , kandnw(k1, k2, k3));
+ TEST_INSTRUCTION("C4E1EC41CB" , kandq(k1, k2, k3));
+ TEST_INSTRUCTION("C5EC41CB" , kandw(k1, k2, k3));
+ TEST_INSTRUCTION("C5F992CA" , kmovb(k1, edx));
+ TEST_INSTRUCTION("C5F990CA" , kmovb(k1, k2));
+ TEST_INSTRUCTION("C5F9908C1A80000000" , kmovb(k1, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("C5F9908C1A80000000" , kmovb(k1, byte_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("C5F993CA" , kmovb(ecx, k2));
+ TEST_INSTRUCTION("C5F9919C1180000000" , kmovb(ptr(ecx, edx, 0, 128), k3));
+ TEST_INSTRUCTION("C5F9919C1180000000" , kmovb(byte_ptr(ecx, edx, 0, 128), k3));
+ TEST_INSTRUCTION("C5FB92CA" , kmovd(k1, edx));
+ TEST_INSTRUCTION("C4E1F990CA" , kmovd(k1, k2));
+ TEST_INSTRUCTION("C4E1F9908C1A80000000" , kmovd(k1, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("C4E1F9908C1A80000000" , kmovd(k1, dword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("C5FB93CA" , kmovd(ecx, k2));
+ TEST_INSTRUCTION("C4E1F9919C1180000000" , kmovd(ptr(ecx, edx, 0, 128), k3));
+ TEST_INSTRUCTION("C4E1F9919C1180000000" , kmovd(dword_ptr(ecx, edx, 0, 128), k3));
+ TEST_INSTRUCTION("C4E1F890CA" , kmovq(k1, k2));
+ TEST_INSTRUCTION("C4E1F8908C1A80000000" , kmovq(k1, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("C4E1F8908C1A80000000" , kmovq(k1, qword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("C4E1F8919C1180000000" , kmovq(ptr(ecx, edx, 0, 128), k3));
+ TEST_INSTRUCTION("C4E1F8919C1180000000" , kmovq(qword_ptr(ecx, edx, 0, 128), k3));
+ TEST_INSTRUCTION("C5F892CA" , kmovw(k1, edx));
+ TEST_INSTRUCTION("C5F890CA" , kmovw(k1, k2));
+ TEST_INSTRUCTION("C5F8908C1A80000000" , kmovw(k1, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("C5F8908C1A80000000" , kmovw(k1, word_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("C5F893CA" , kmovw(ecx, k2));
+ TEST_INSTRUCTION("C5F8919C1180000000" , kmovw(ptr(ecx, edx, 0, 128), k3));
+ TEST_INSTRUCTION("C5F8919C1180000000" , kmovw(word_ptr(ecx, edx, 0, 128), k3));
+ TEST_INSTRUCTION("C5F944CA" , knotb(k1, k2));
+ TEST_INSTRUCTION("C4E1F944CA" , knotd(k1, k2));
+ TEST_INSTRUCTION("C4E1F844CA" , knotq(k1, k2));
+ TEST_INSTRUCTION("C5F844CA" , knotw(k1, k2));
+ TEST_INSTRUCTION("C5ED45CB" , korb(k1, k2, k3));
+ TEST_INSTRUCTION("C4E1ED45CB" , kord(k1, k2, k3));
+ TEST_INSTRUCTION("C4E1EC45CB" , korq(k1, k2, k3));
+ TEST_INSTRUCTION("C5F998CA" , kortestb(k1, k2));
+ TEST_INSTRUCTION("C4E1F998CA" , kortestd(k1, k2));
+ TEST_INSTRUCTION("C4E1F898CA" , kortestq(k1, k2));
+ TEST_INSTRUCTION("C5F898CA" , kortestw(k1, k2));
+ TEST_INSTRUCTION("C5EC45CB" , korw(k1, k2, k3));
+ TEST_INSTRUCTION("C4E37932CA01" , kshiftlb(k1, k2, 1));
+ TEST_INSTRUCTION("C4E37933CA01" , kshiftld(k1, k2, 1));
+ TEST_INSTRUCTION("C4E3F933CA01" , kshiftlq(k1, k2, 1));
+ TEST_INSTRUCTION("C4E3F932CA01" , kshiftlw(k1, k2, 1));
+ TEST_INSTRUCTION("C4E37930CA01" , kshiftrb(k1, k2, 1));
+ TEST_INSTRUCTION("C4E37931CA01" , kshiftrd(k1, k2, 1));
+ TEST_INSTRUCTION("C4E3F931CA01" , kshiftrq(k1, k2, 1));
+ TEST_INSTRUCTION("C4E3F930CA01" , kshiftrw(k1, k2, 1));
+ TEST_INSTRUCTION("C5F999CA" , ktestb(k1, k2));
+ TEST_INSTRUCTION("C4E1F999CA" , ktestd(k1, k2));
+ TEST_INSTRUCTION("C4E1F899CA" , ktestq(k1, k2));
+ TEST_INSTRUCTION("C5F899CA" , ktestw(k1, k2));
+ TEST_INSTRUCTION("C5ED4BCB" , kunpckbw(k1, k2, k3));
+ TEST_INSTRUCTION("C4E1EC4BCB" , kunpckdq(k1, k2, k3));
+ TEST_INSTRUCTION("C5EC4BCB" , kunpckwd(k1, k2, k3));
+ TEST_INSTRUCTION("C5ED46CB" , kxnorb(k1, k2, k3));
+ TEST_INSTRUCTION("C4E1ED46CB" , kxnord(k1, k2, k3));
+ TEST_INSTRUCTION("C4E1EC46CB" , kxnorq(k1, k2, k3));
+ TEST_INSTRUCTION("C5EC46CB" , kxnorw(k1, k2, k3));
+ TEST_INSTRUCTION("C5ED47CB" , kxorb(k1, k2, k3));
+ TEST_INSTRUCTION("C4E1ED47CB" , kxord(k1, k2, k3));
+ TEST_INSTRUCTION("C4E1EC47CB" , kxorq(k1, k2, k3));
+ TEST_INSTRUCTION("C5EC47CB" , kxorw(k1, k2, k3));
+ TEST_INSTRUCTION("62F25F489A4C1A08" , v4fmaddps(zmm1, zmm4, zmm5, zmm6, zmm7, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("62F25F489A4C1A08" , v4fmaddps(zmm1, zmm4, zmm5, zmm6, zmm7, xmmword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("62F25F089B4C1A08" , v4fmaddss(xmm1, xmm4, xmm5, xmm6, xmm7, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("62F25F089B4C1A08" , v4fmaddss(xmm1, xmm4, xmm5, xmm6, xmm7, xmmword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("62F25F48AA4C1A08" , v4fnmaddps(zmm1, zmm4, zmm5, zmm6, zmm7, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("62F25F48AA4C1A08" , v4fnmaddps(zmm1, zmm4, zmm5, zmm6, zmm7, xmmword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("62F25F08AB4C1A08" , v4fnmaddss(xmm1, xmm4, xmm5, xmm6, xmm7, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("62F25F08AB4C1A08" , v4fnmaddss(xmm1, xmm4, xmm5, xmm6, xmm7, xmmword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("C5E958CB" , vaddpd(xmm1, xmm2, xmm3));
+ TEST_INSTRUCTION("C5E9588C2B80000000" , vaddpd(xmm1, xmm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C5E9588C2B80000000" , vaddpd(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C5ED58CB" , vaddpd(ymm1, ymm2, ymm3));
+ TEST_INSTRUCTION("C5ED588C2B80000000" , vaddpd(ymm1, ymm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C5ED588C2B80000000" , vaddpd(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F1ED4858CB" , vaddpd(zmm1, zmm2, zmm3));
+ TEST_INSTRUCTION("62F1ED48584C2B02" , vaddpd(zmm1, zmm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F1ED48584C2B02" , vaddpd(zmm1, zmm2, zmmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C5E858CB" , vaddps(xmm1, xmm2, xmm3));
+ TEST_INSTRUCTION("C5E8588C2B80000000" , vaddps(xmm1, xmm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C5E8588C2B80000000" , vaddps(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C5EC58CB" , vaddps(ymm1, ymm2, ymm3));
+ TEST_INSTRUCTION("C5EC588C2B80000000" , vaddps(ymm1, ymm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C5EC588C2B80000000" , vaddps(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F16C4858CB" , vaddps(zmm1, zmm2, zmm3));
+ TEST_INSTRUCTION("62F16C48584C2B02" , vaddps(zmm1, zmm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F16C48584C2B02" , vaddps(zmm1, zmm2, zmmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C5EB58CB" , vaddsd(xmm1, xmm2, xmm3));
+ TEST_INSTRUCTION("C5EB588C2B80000000" , vaddsd(xmm1, xmm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C5EB588C2B80000000" , vaddsd(xmm1, xmm2, qword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C5EA58CB" , vaddss(xmm1, xmm2, xmm3));
+ TEST_INSTRUCTION("C5EA588C2B80000000" , vaddss(xmm1, xmm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C5EA588C2B80000000" , vaddss(xmm1, xmm2, dword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C5E9D0CB" , vaddsubpd(xmm1, xmm2, xmm3));
+ TEST_INSTRUCTION("C5E9D08C2B80000000" , vaddsubpd(xmm1, xmm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C5E9D08C2B80000000" , vaddsubpd(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C5EDD0CB" , vaddsubpd(ymm1, ymm2, ymm3));
+ TEST_INSTRUCTION("C5EDD08C2B80000000" , vaddsubpd(ymm1, ymm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C5EDD08C2B80000000" , vaddsubpd(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C5EBD0CB" , vaddsubps(xmm1, xmm2, xmm3));
+ TEST_INSTRUCTION("C5EBD08C2B80000000" , vaddsubps(xmm1, xmm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C5EBD08C2B80000000" , vaddsubps(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C5EFD0CB" , vaddsubps(ymm1, ymm2, ymm3));
+ TEST_INSTRUCTION("C5EFD08C2B80000000" , vaddsubps(ymm1, ymm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C5EFD08C2B80000000" , vaddsubps(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C4E269DECB" , vaesdec(xmm1, xmm2, xmm3));
+ TEST_INSTRUCTION("C4E269DE8C2B80000000" , vaesdec(xmm1, xmm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C4E269DE8C2B80000000" , vaesdec(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C4E26DDECB" , vaesdec(ymm1, ymm2, ymm3));
+ TEST_INSTRUCTION("C4E26DDE8C2B80000000" , vaesdec(ymm1, ymm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C4E26DDE8C2B80000000" , vaesdec(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F26D48DECB" , vaesdec(zmm1, zmm2, zmm3));
+ TEST_INSTRUCTION("62F26D48DE4C2B02" , vaesdec(zmm1, zmm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F26D48DE4C2B02" , vaesdec(zmm1, zmm2, zmmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C4E269DFCB" , vaesdeclast(xmm1, xmm2, xmm3));
+ TEST_INSTRUCTION("C4E269DF8C2B80000000" , vaesdeclast(xmm1, xmm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C4E269DF8C2B80000000" , vaesdeclast(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C4E26DDFCB" , vaesdeclast(ymm1, ymm2, ymm3));
+ TEST_INSTRUCTION("C4E26DDF8C2B80000000" , vaesdeclast(ymm1, ymm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C4E26DDF8C2B80000000" , vaesdeclast(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F26D48DFCB" , vaesdeclast(zmm1, zmm2, zmm3));
+ TEST_INSTRUCTION("62F26D48DF4C2B02" , vaesdeclast(zmm1, zmm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F26D48DF4C2B02" , vaesdeclast(zmm1, zmm2, zmmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C4E269DCCB" , vaesenc(xmm1, xmm2, xmm3));
+ TEST_INSTRUCTION("C4E269DC8C2B80000000" , vaesenc(xmm1, xmm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C4E269DC8C2B80000000" , vaesenc(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C4E26DDCCB" , vaesenc(ymm1, ymm2, ymm3));
+ TEST_INSTRUCTION("C4E26DDC8C2B80000000" , vaesenc(ymm1, ymm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C4E26DDC8C2B80000000" , vaesenc(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F26D48DCCB" , vaesenc(zmm1, zmm2, zmm3));
+ TEST_INSTRUCTION("62F26D48DC4C2B02" , vaesenc(zmm1, zmm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F26D48DC4C2B02" , vaesenc(zmm1, zmm2, zmmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C4E269DDCB" , vaesenclast(xmm1, xmm2, xmm3));
+ TEST_INSTRUCTION("C4E269DD8C2B80000000" , vaesenclast(xmm1, xmm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C4E269DD8C2B80000000" , vaesenclast(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C4E26DDDCB" , vaesenclast(ymm1, ymm2, ymm3));
+ TEST_INSTRUCTION("C4E26DDD8C2B80000000" , vaesenclast(ymm1, ymm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C4E26DDD8C2B80000000" , vaesenclast(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F26D48DDCB" , vaesenclast(zmm1, zmm2, zmm3));
+ TEST_INSTRUCTION("62F26D48DD4C2B02" , vaesenclast(zmm1, zmm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F26D48DD4C2B02" , vaesenclast(zmm1, zmm2, zmmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C4E279DBCA" , vaesimc(xmm1, xmm2));
+ TEST_INSTRUCTION("C4E279DB8C1A80000000" , vaesimc(xmm1, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("C4E279DB8C1A80000000" , vaesimc(xmm1, xmmword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("C4E379DFCA01" , vaeskeygenassist(xmm1, xmm2, 1));
+ TEST_INSTRUCTION("C4E379DF8C1A8000000001" , vaeskeygenassist(xmm1, ptr(edx, ebx, 0, 128), 1));
+ TEST_INSTRUCTION("C4E379DF8C1A8000000001" , vaeskeygenassist(xmm1, xmmword_ptr(edx, ebx, 0, 128), 1));
+ TEST_INSTRUCTION("62F36D0803CB01" , valignd(xmm1, xmm2, xmm3, 1));
+ TEST_INSTRUCTION("62F36D08034C2B0801" , valignd(xmm1, xmm2, ptr(ebx, ebp, 0, 128), 1));
+ TEST_INSTRUCTION("62F36D08034C2B0801" , valignd(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128), 1));
+ TEST_INSTRUCTION("62F36D2803CB01" , valignd(ymm1, ymm2, ymm3, 1));
+ TEST_INSTRUCTION("62F36D28034C2B0401" , valignd(ymm1, ymm2, ptr(ebx, ebp, 0, 128), 1));
+ TEST_INSTRUCTION("62F36D28034C2B0401" , valignd(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128), 1));
+ TEST_INSTRUCTION("62F36D4803CB01" , valignd(zmm1, zmm2, zmm3, 1));
+ TEST_INSTRUCTION("62F36D48034C2B0201" , valignd(zmm1, zmm2, ptr(ebx, ebp, 0, 128), 1));
+ TEST_INSTRUCTION("62F36D48034C2B0201" , valignd(zmm1, zmm2, zmmword_ptr(ebx, ebp, 0, 128), 1));
+ TEST_INSTRUCTION("62F3ED0803CB01" , valignq(xmm1, xmm2, xmm3, 1));
+ TEST_INSTRUCTION("62F3ED08034C2B0801" , valignq(xmm1, xmm2, ptr(ebx, ebp, 0, 128), 1));
+ TEST_INSTRUCTION("62F3ED08034C2B0801" , valignq(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128), 1));
+ TEST_INSTRUCTION("62F3ED2803CB01" , valignq(ymm1, ymm2, ymm3, 1));
+ TEST_INSTRUCTION("62F3ED28034C2B0401" , valignq(ymm1, ymm2, ptr(ebx, ebp, 0, 128), 1));
+ TEST_INSTRUCTION("62F3ED28034C2B0401" , valignq(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128), 1));
+ TEST_INSTRUCTION("62F3ED4803CB01" , valignq(zmm1, zmm2, zmm3, 1));
+ TEST_INSTRUCTION("62F3ED48034C2B0201" , valignq(zmm1, zmm2, ptr(ebx, ebp, 0, 128), 1));
+ TEST_INSTRUCTION("62F3ED48034C2B0201" , valignq(zmm1, zmm2, zmmword_ptr(ebx, ebp, 0, 128), 1));
+ TEST_INSTRUCTION("C5E955CB" , vandnpd(xmm1, xmm2, xmm3));
+ TEST_INSTRUCTION("C5E9558C2B80000000" , vandnpd(xmm1, xmm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C5E9558C2B80000000" , vandnpd(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C5ED55CB" , vandnpd(ymm1, ymm2, ymm3));
+ TEST_INSTRUCTION("C5ED558C2B80000000" , vandnpd(ymm1, ymm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C5ED558C2B80000000" , vandnpd(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F1ED4855CB" , vandnpd(zmm1, zmm2, zmm3));
+ TEST_INSTRUCTION("62F1ED48554C2B02" , vandnpd(zmm1, zmm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F1ED48554C2B02" , vandnpd(zmm1, zmm2, zmmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C5E855CB" , vandnps(xmm1, xmm2, xmm3));
+ TEST_INSTRUCTION("C5E8558C2B80000000" , vandnps(xmm1, xmm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C5E8558C2B80000000" , vandnps(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C5EC55CB" , vandnps(ymm1, ymm2, ymm3));
+ TEST_INSTRUCTION("C5EC558C2B80000000" , vandnps(ymm1, ymm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C5EC558C2B80000000" , vandnps(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F16C4855CB" , vandnps(zmm1, zmm2, zmm3));
+ TEST_INSTRUCTION("62F16C48554C2B02" , vandnps(zmm1, zmm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F16C48554C2B02" , vandnps(zmm1, zmm2, zmmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C5E954CB" , vandpd(xmm1, xmm2, xmm3));
+ TEST_INSTRUCTION("C5E9548C2B80000000" , vandpd(xmm1, xmm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C5E9548C2B80000000" , vandpd(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C5ED54CB" , vandpd(ymm1, ymm2, ymm3));
+ TEST_INSTRUCTION("C5ED548C2B80000000" , vandpd(ymm1, ymm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C5ED548C2B80000000" , vandpd(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F1ED4854CB" , vandpd(zmm1, zmm2, zmm3));
+ TEST_INSTRUCTION("62F1ED48544C2B02" , vandpd(zmm1, zmm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F1ED48544C2B02" , vandpd(zmm1, zmm2, zmmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C5E854CB" , vandps(xmm1, xmm2, xmm3));
+ TEST_INSTRUCTION("C5E8548C2B80000000" , vandps(xmm1, xmm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C5E8548C2B80000000" , vandps(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C5EC54CB" , vandps(ymm1, ymm2, ymm3));
+ TEST_INSTRUCTION("C5EC548C2B80000000" , vandps(ymm1, ymm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C5EC548C2B80000000" , vandps(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F16C4854CB" , vandps(zmm1, zmm2, zmm3));
+ TEST_INSTRUCTION("62F16C48544C2B02" , vandps(zmm1, zmm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F16C48544C2B02" , vandps(zmm1, zmm2, zmmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F2ED0865CB" , vblendmpd(xmm1, xmm2, xmm3));
+ TEST_INSTRUCTION("62F2ED08654C2B08" , vblendmpd(xmm1, xmm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F2ED08654C2B08" , vblendmpd(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F2ED2865CB" , vblendmpd(ymm1, ymm2, ymm3));
+ TEST_INSTRUCTION("62F2ED28654C2B04" , vblendmpd(ymm1, ymm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F2ED28654C2B04" , vblendmpd(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F2ED4865CB" , vblendmpd(zmm1, zmm2, zmm3));
+ TEST_INSTRUCTION("62F2ED48654C2B02" , vblendmpd(zmm1, zmm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F2ED48654C2B02" , vblendmpd(zmm1, zmm2, zmmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F26D0865CB" , vblendmps(xmm1, xmm2, xmm3));
+ TEST_INSTRUCTION("62F26D08654C2B08" , vblendmps(xmm1, xmm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F26D08654C2B08" , vblendmps(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F26D2865CB" , vblendmps(ymm1, ymm2, ymm3));
+ TEST_INSTRUCTION("62F26D28654C2B04" , vblendmps(ymm1, ymm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F26D28654C2B04" , vblendmps(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F26D4865CB" , vblendmps(zmm1, zmm2, zmm3));
+ TEST_INSTRUCTION("62F26D48654C2B02" , vblendmps(zmm1, zmm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F26D48654C2B02" , vblendmps(zmm1, zmm2, zmmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C4E3690DCB01" , vblendpd(xmm1, xmm2, xmm3, 1));
+ TEST_INSTRUCTION("C4E3690D8C2B8000000001" , vblendpd(xmm1, xmm2, ptr(ebx, ebp, 0, 128), 1));
+ TEST_INSTRUCTION("C4E3690D8C2B8000000001" , vblendpd(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128), 1));
+ TEST_INSTRUCTION("C4E36D0DCB01" , vblendpd(ymm1, ymm2, ymm3, 1));
+ TEST_INSTRUCTION("C4E36D0D8C2B8000000001" , vblendpd(ymm1, ymm2, ptr(ebx, ebp, 0, 128), 1));
+ TEST_INSTRUCTION("C4E36D0D8C2B8000000001" , vblendpd(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128), 1));
+ TEST_INSTRUCTION("C4E3690CCB01" , vblendps(xmm1, xmm2, xmm3, 1));
+ TEST_INSTRUCTION("C4E3690C8C2B8000000001" , vblendps(xmm1, xmm2, ptr(ebx, ebp, 0, 128), 1));
+ TEST_INSTRUCTION("C4E3690C8C2B8000000001" , vblendps(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128), 1));
+ TEST_INSTRUCTION("C4E36D0CCB01" , vblendps(ymm1, ymm2, ymm3, 1));
+ TEST_INSTRUCTION("C4E36D0C8C2B8000000001" , vblendps(ymm1, ymm2, ptr(ebx, ebp, 0, 128), 1));
+ TEST_INSTRUCTION("C4E36D0C8C2B8000000001" , vblendps(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128), 1));
+ TEST_INSTRUCTION("C4E3694BCB40" , vblendvpd(xmm1, xmm2, xmm3, xmm4));
+ TEST_INSTRUCTION("C4E3694B8C2B8000000060" , vblendvpd(xmm1, xmm2, ptr(ebx, ebp, 0, 128), xmm6));
+ TEST_INSTRUCTION("C4E3694B8C2B8000000060" , vblendvpd(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128), xmm6));
+ TEST_INSTRUCTION("C4E36D4BCB40" , vblendvpd(ymm1, ymm2, ymm3, ymm4));
+ TEST_INSTRUCTION("C4E36D4B8C2B8000000060" , vblendvpd(ymm1, ymm2, ptr(ebx, ebp, 0, 128), ymm6));
+ TEST_INSTRUCTION("C4E36D4B8C2B8000000060" , vblendvpd(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128), ymm6));
+ TEST_INSTRUCTION("C4E3694ACB40" , vblendvps(xmm1, xmm2, xmm3, xmm4));
+ TEST_INSTRUCTION("C4E3694A8C2B8000000060" , vblendvps(xmm1, xmm2, ptr(ebx, ebp, 0, 128), xmm6));
+ TEST_INSTRUCTION("C4E3694A8C2B8000000060" , vblendvps(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128), xmm6));
+ TEST_INSTRUCTION("C4E36D4ACB40" , vblendvps(ymm1, ymm2, ymm3, ymm4));
+ TEST_INSTRUCTION("C4E36D4A8C2B8000000060" , vblendvps(ymm1, ymm2, ptr(ebx, ebp, 0, 128), ymm6));
+ TEST_INSTRUCTION("C4E36D4A8C2B8000000060" , vblendvps(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128), ymm6));
+ TEST_INSTRUCTION("C4E27D1A8C1A80000000" , vbroadcastf128(ymm1, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("C4E27D1A8C1A80000000" , vbroadcastf128(ymm1, xmmword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("62F27D2819CA" , vbroadcastf32x2(ymm1, xmm2));
+ TEST_INSTRUCTION("62F27D28194C1A10" , vbroadcastf32x2(ymm1, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("62F27D28194C1A10" , vbroadcastf32x2(ymm1, qword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("62F27D4819CA" , vbroadcastf32x2(zmm1, xmm2));
+ TEST_INSTRUCTION("62F27D48194C1A10" , vbroadcastf32x2(zmm1, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("62F27D48194C1A10" , vbroadcastf32x2(zmm1, qword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("62F27D281A4C1A08" , vbroadcastf32x4(ymm1, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("62F27D281A4C1A08" , vbroadcastf32x4(ymm1, xmmword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("62F27D481A4C1A08" , vbroadcastf32x4(zmm1, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("62F27D481A4C1A08" , vbroadcastf32x4(zmm1, xmmword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("62F27D481B4C1A04" , vbroadcastf32x8(zmm1, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("62F27D481B4C1A04" , vbroadcastf32x8(zmm1, ymmword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("62F2FD281A4C1A08" , vbroadcastf64x2(ymm1, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("62F2FD281A4C1A08" , vbroadcastf64x2(ymm1, xmmword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("62F2FD481A4C1A08" , vbroadcastf64x2(zmm1, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("62F2FD481A4C1A08" , vbroadcastf64x2(zmm1, xmmword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("62F2FD481B4C1A04" , vbroadcastf64x4(zmm1, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("62F2FD481B4C1A04" , vbroadcastf64x4(zmm1, ymmword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("C4E27D5A8C1A80000000" , vbroadcasti128(ymm1, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("C4E27D5A8C1A80000000" , vbroadcasti128(ymm1, xmmword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("62F27D0859CA" , vbroadcasti32x2(xmm1, xmm2));
+ TEST_INSTRUCTION("62F27D08594C1A10" , vbroadcasti32x2(xmm1, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("62F27D08594C1A10" , vbroadcasti32x2(xmm1, qword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("62F27D2859CA" , vbroadcasti32x2(ymm1, xmm2));
+ TEST_INSTRUCTION("62F27D28594C1A10" , vbroadcasti32x2(ymm1, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("62F27D28594C1A10" , vbroadcasti32x2(ymm1, qword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("62F27D4859CA" , vbroadcasti32x2(zmm1, xmm2));
+ TEST_INSTRUCTION("62F27D48594C1A10" , vbroadcasti32x2(zmm1, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("62F27D48594C1A10" , vbroadcasti32x2(zmm1, qword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("62F27D285A4C1A08" , vbroadcasti32x4(ymm1, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("62F27D285A4C1A08" , vbroadcasti32x4(ymm1, xmmword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("62F27D485A4C1A08" , vbroadcasti32x4(zmm1, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("62F27D485A4C1A08" , vbroadcasti32x4(zmm1, xmmword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("62F27D485B4C1A04" , vbroadcasti32x8(zmm1, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("62F27D485B4C1A04" , vbroadcasti32x8(zmm1, ymmword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("62F2FD285A4C1A08" , vbroadcasti64x2(ymm1, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("62F2FD285A4C1A08" , vbroadcasti64x2(ymm1, xmmword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("62F2FD485A4C1A08" , vbroadcasti64x2(zmm1, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("62F2FD485A4C1A08" , vbroadcasti64x2(zmm1, xmmword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("62F2FD485B4C1A04" , vbroadcasti64x4(zmm1, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("62F2FD485B4C1A04" , vbroadcasti64x4(zmm1, ymmword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("C4E27D19CA" , vbroadcastsd(ymm1, xmm2));
+ TEST_INSTRUCTION("C4E27D198C1A80000000" , vbroadcastsd(ymm1, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("C4E27D198C1A80000000" , vbroadcastsd(ymm1, qword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("62F2FD4819CA" , vbroadcastsd(zmm1, xmm2));
+ TEST_INSTRUCTION("62F2FD48194C1A10" , vbroadcastsd(zmm1, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("62F2FD48194C1A10" , vbroadcastsd(zmm1, qword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("C4E27918CA" , vbroadcastss(xmm1, xmm2));
+ TEST_INSTRUCTION("C4E279188C1A80000000" , vbroadcastss(xmm1, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("C4E279188C1A80000000" , vbroadcastss(xmm1, dword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("C4E27D18CA" , vbroadcastss(ymm1, xmm2));
+ TEST_INSTRUCTION("C4E27D188C1A80000000" , vbroadcastss(ymm1, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("C4E27D188C1A80000000" , vbroadcastss(ymm1, dword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("62F27D4818CA" , vbroadcastss(zmm1, xmm2));
+ TEST_INSTRUCTION("62F27D48184C1A20" , vbroadcastss(zmm1, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("62F27D48184C1A20" , vbroadcastss(zmm1, dword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("C5E9C2CB01" , vcmppd(xmm1, xmm2, xmm3, 1));
+ TEST_INSTRUCTION("C5E9C28C2B8000000001" , vcmppd(xmm1, xmm2, ptr(ebx, ebp, 0, 128), 1));
+ TEST_INSTRUCTION("C5E9C28C2B8000000001" , vcmppd(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128), 1));
+ TEST_INSTRUCTION("62F1ED08C2CB01" , vcmppd(k1, xmm2, xmm3, 1));
+ TEST_INSTRUCTION("62F1ED08C24C2B0801" , vcmppd(k1, xmm2, ptr(ebx, ebp, 0, 128), 1));
+ TEST_INSTRUCTION("62F1ED08C24C2B0801" , vcmppd(k1, xmm2, xmmword_ptr(ebx, ebp, 0, 128), 1));
+ TEST_INSTRUCTION("C5EDC2CB01" , vcmppd(ymm1, ymm2, ymm3, 1));
+ TEST_INSTRUCTION("C5EDC28C2B8000000001" , vcmppd(ymm1, ymm2, ptr(ebx, ebp, 0, 128), 1));
+ TEST_INSTRUCTION("C5EDC28C2B8000000001" , vcmppd(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128), 1));
+ TEST_INSTRUCTION("62F1ED28C2CB01" , vcmppd(k1, ymm2, ymm3, 1));
+ TEST_INSTRUCTION("62F1ED28C24C2B0401" , vcmppd(k1, ymm2, ptr(ebx, ebp, 0, 128), 1));
+ TEST_INSTRUCTION("62F1ED28C24C2B0401" , vcmppd(k1, ymm2, ymmword_ptr(ebx, ebp, 0, 128), 1));
+ TEST_INSTRUCTION("62F1ED48C2CB01" , vcmppd(k1, zmm2, zmm3, 1));
+ TEST_INSTRUCTION("62F1ED48C24C2B0201" , vcmppd(k1, zmm2, ptr(ebx, ebp, 0, 128), 1));
+ TEST_INSTRUCTION("62F1ED48C24C2B0201" , vcmppd(k1, zmm2, zmmword_ptr(ebx, ebp, 0, 128), 1));
+ TEST_INSTRUCTION("C5E8C2CB01" , vcmpps(xmm1, xmm2, xmm3, 1));
+ TEST_INSTRUCTION("C5E8C28C2B8000000001" , vcmpps(xmm1, xmm2, ptr(ebx, ebp, 0, 128), 1));
+ TEST_INSTRUCTION("C5E8C28C2B8000000001" , vcmpps(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128), 1));
+ TEST_INSTRUCTION("62F16C08C2CB01" , vcmpps(k1, xmm2, xmm3, 1));
+ TEST_INSTRUCTION("62F16C08C24C2B0801" , vcmpps(k1, xmm2, ptr(ebx, ebp, 0, 128), 1));
+ TEST_INSTRUCTION("62F16C08C24C2B0801" , vcmpps(k1, xmm2, xmmword_ptr(ebx, ebp, 0, 128), 1));
+ TEST_INSTRUCTION("C5ECC2CB01" , vcmpps(ymm1, ymm2, ymm3, 1));
+ TEST_INSTRUCTION("C5ECC28C2B8000000001" , vcmpps(ymm1, ymm2, ptr(ebx, ebp, 0, 128), 1));
+ TEST_INSTRUCTION("C5ECC28C2B8000000001" , vcmpps(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128), 1));
+ TEST_INSTRUCTION("62F16C28C2CB01" , vcmpps(k1, ymm2, ymm3, 1));
+ TEST_INSTRUCTION("62F16C28C24C2B0401" , vcmpps(k1, ymm2, ptr(ebx, ebp, 0, 128), 1));
+ TEST_INSTRUCTION("62F16C28C24C2B0401" , vcmpps(k1, ymm2, ymmword_ptr(ebx, ebp, 0, 128), 1));
+ TEST_INSTRUCTION("62F16C48C2CB01" , vcmpps(k1, zmm2, zmm3, 1));
+ TEST_INSTRUCTION("62F16C48C24C2B0201" , vcmpps(k1, zmm2, ptr(ebx, ebp, 0, 128), 1));
+ TEST_INSTRUCTION("62F16C48C24C2B0201" , vcmpps(k1, zmm2, zmmword_ptr(ebx, ebp, 0, 128), 1));
+ TEST_INSTRUCTION("C5EBC2CB01" , vcmpsd(xmm1, xmm2, xmm3, 1));
+ TEST_INSTRUCTION("C5EBC28C2B8000000001" , vcmpsd(xmm1, xmm2, ptr(ebx, ebp, 0, 128), 1));
+ TEST_INSTRUCTION("C5EBC28C2B8000000001" , vcmpsd(xmm1, xmm2, qword_ptr(ebx, ebp, 0, 128), 1));
+ TEST_INSTRUCTION("62F1EF08C2CB01" , vcmpsd(k1, xmm2, xmm3, 1));
+ TEST_INSTRUCTION("62F1EF08C24C2B1001" , vcmpsd(k1, xmm2, ptr(ebx, ebp, 0, 128), 1));
+ TEST_INSTRUCTION("62F1EF08C24C2B1001" , vcmpsd(k1, xmm2, qword_ptr(ebx, ebp, 0, 128), 1));
+ TEST_INSTRUCTION("C5EAC2CB01" , vcmpss(xmm1, xmm2, xmm3, 1));
+ TEST_INSTRUCTION("C5EAC28C2B8000000001" , vcmpss(xmm1, xmm2, ptr(ebx, ebp, 0, 128), 1));
+ TEST_INSTRUCTION("C5EAC28C2B8000000001" , vcmpss(xmm1, xmm2, dword_ptr(ebx, ebp, 0, 128), 1));
+ TEST_INSTRUCTION("62F16E08C2CB01" , vcmpss(k1, xmm2, xmm3, 1));
+ TEST_INSTRUCTION("62F16E08C24C2B2001" , vcmpss(k1, xmm2, ptr(ebx, ebp, 0, 128), 1));
+ TEST_INSTRUCTION("62F16E08C24C2B2001" , vcmpss(k1, xmm2, dword_ptr(ebx, ebp, 0, 128), 1));
+ TEST_INSTRUCTION("C5F92FCA" , vcomisd(xmm1, xmm2));
+ TEST_INSTRUCTION("C5F92F8C1A80000000" , vcomisd(xmm1, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("C5F92F8C1A80000000" , vcomisd(xmm1, qword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("C5F82FCA" , vcomiss(xmm1, xmm2));
+ TEST_INSTRUCTION("C5F82F8C1A80000000" , vcomiss(xmm1, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("C5F82F8C1A80000000" , vcomiss(xmm1, dword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("62F2FD088AD1" , vcompresspd(xmm1, xmm2));
+ TEST_INSTRUCTION("62F2FD088A5C1110" , vcompresspd(ptr(ecx, edx, 0, 128), xmm3));
+ TEST_INSTRUCTION("62F2FD088A5C1110" , vcompresspd(xmmword_ptr(ecx, edx, 0, 128), xmm3));
+ TEST_INSTRUCTION("62F2FD288AD1" , vcompresspd(ymm1, ymm2));
+ TEST_INSTRUCTION("62F2FD288A5C1110" , vcompresspd(ptr(ecx, edx, 0, 128), ymm3));
+ TEST_INSTRUCTION("62F2FD288A5C1110" , vcompresspd(ymmword_ptr(ecx, edx, 0, 128), ymm3));
+ TEST_INSTRUCTION("62F2FD488AD1" , vcompresspd(zmm1, zmm2));
+ TEST_INSTRUCTION("62F2FD488A5C1110" , vcompresspd(ptr(ecx, edx, 0, 128), zmm3));
+ TEST_INSTRUCTION("62F2FD488A5C1110" , vcompresspd(zmmword_ptr(ecx, edx, 0, 128), zmm3));
+ TEST_INSTRUCTION("62F27D088AD1" , vcompressps(xmm1, xmm2));
+ TEST_INSTRUCTION("62F27D088A5C1120" , vcompressps(ptr(ecx, edx, 0, 128), xmm3));
+ TEST_INSTRUCTION("62F27D088A5C1120" , vcompressps(xmmword_ptr(ecx, edx, 0, 128), xmm3));
+ TEST_INSTRUCTION("62F27D288AD1" , vcompressps(ymm1, ymm2));
+ TEST_INSTRUCTION("62F27D288A5C1120" , vcompressps(ptr(ecx, edx, 0, 128), ymm3));
+ TEST_INSTRUCTION("62F27D288A5C1120" , vcompressps(ymmword_ptr(ecx, edx, 0, 128), ymm3));
+ TEST_INSTRUCTION("62F27D488AD1" , vcompressps(zmm1, zmm2));
+ TEST_INSTRUCTION("62F27D488A5C1120" , vcompressps(ptr(ecx, edx, 0, 128), zmm3));
+ TEST_INSTRUCTION("62F27D488A5C1120" , vcompressps(zmmword_ptr(ecx, edx, 0, 128), zmm3));
+ TEST_INSTRUCTION("C5FAE6CA" , vcvtdq2pd(xmm1, xmm2));
+ TEST_INSTRUCTION("C5FAE68C1A80000000" , vcvtdq2pd(xmm1, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("C5FAE68C1A80000000" , vcvtdq2pd(xmm1, qword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("C5FEE6CA" , vcvtdq2pd(ymm1, xmm2));
+ TEST_INSTRUCTION("C5FEE68C1A80000000" , vcvtdq2pd(ymm1, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("C5FEE68C1A80000000" , vcvtdq2pd(ymm1, xmmword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("62F17E48E6CA" , vcvtdq2pd(zmm1, ymm2));
+ TEST_INSTRUCTION("62F17E48E64C1A04" , vcvtdq2pd(zmm1, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("62F17E48E64C1A04" , vcvtdq2pd(zmm1, ymmword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("C5F85BCA" , vcvtdq2ps(xmm1, xmm2));
+ TEST_INSTRUCTION("C5F85B8C1A80000000" , vcvtdq2ps(xmm1, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("C5F85B8C1A80000000" , vcvtdq2ps(xmm1, xmmword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("C5FC5BCA" , vcvtdq2ps(ymm1, ymm2));
+ TEST_INSTRUCTION("C5FC5B8C1A80000000" , vcvtdq2ps(ymm1, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("C5FC5B8C1A80000000" , vcvtdq2ps(ymm1, ymmword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("62F17C485BCA" , vcvtdq2ps(zmm1, zmm2));
+ TEST_INSTRUCTION("62F17C485B4C1A02" , vcvtdq2ps(zmm1, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("62F17C485B4C1A02" , vcvtdq2ps(zmm1, zmmword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("62F26F0872CB" , vcvtne2ps2bf16(xmm1, xmm2, xmm3));
+ TEST_INSTRUCTION("62F26F08724C2B08" , vcvtne2ps2bf16(xmm1, xmm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F26F08724C2B08" , vcvtne2ps2bf16(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F26F2872CB" , vcvtne2ps2bf16(ymm1, ymm2, ymm3));
+ TEST_INSTRUCTION("62F26F28724C2B04" , vcvtne2ps2bf16(ymm1, ymm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F26F28724C2B04" , vcvtne2ps2bf16(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F26F4872CB" , vcvtne2ps2bf16(zmm1, zmm2, zmm3));
+ TEST_INSTRUCTION("62F26F48724C2B02" , vcvtne2ps2bf16(zmm1, zmm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F26F48724C2B02" , vcvtne2ps2bf16(zmm1, zmm2, zmmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F27E0872CA" , vcvtneps2bf16(xmm1, xmm2));
+ TEST_INSTRUCTION("62F27E2872CA" , vcvtneps2bf16(xmm1, ymm2));
+ TEST_INSTRUCTION("62F27E08724C1A08" , vcvtneps2bf16(xmm1, xmmword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("62F27E28724C1A04" , vcvtneps2bf16(xmm1, ymmword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("62F27E4872CA" , vcvtneps2bf16(ymm1, zmm2));
+ TEST_INSTRUCTION("62F27E48724C1A02" , vcvtneps2bf16(ymm1, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("62F27E48724C1A02" , vcvtneps2bf16(ymm1, zmmword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("C5FBE6CA" , vcvtpd2dq(xmm1, xmm2));
+ TEST_INSTRUCTION("C5FFE6CA" , vcvtpd2dq(xmm1, ymm2));
+ TEST_INSTRUCTION("C5FBE68C1A80000000" , vcvtpd2dq(xmm1, xmmword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("C5FFE68C1A80000000" , vcvtpd2dq(xmm1, ymmword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("62F1FF48E6CA" , vcvtpd2dq(ymm1, zmm2));
+ TEST_INSTRUCTION("62F1FF48E64C1A02" , vcvtpd2dq(ymm1, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("62F1FF48E64C1A02" , vcvtpd2dq(ymm1, zmmword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("C5F95ACA" , vcvtpd2ps(xmm1, xmm2));
+ TEST_INSTRUCTION("C5FD5ACA" , vcvtpd2ps(xmm1, ymm2));
+ TEST_INSTRUCTION("C5F95A8C1A80000000" , vcvtpd2ps(xmm1, xmmword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("C5FD5A8C1A80000000" , vcvtpd2ps(xmm1, ymmword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("62F1FD485ACA" , vcvtpd2ps(ymm1, zmm2));
+ TEST_INSTRUCTION("62F1FD485A4C1A02" , vcvtpd2ps(ymm1, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("62F1FD485A4C1A02" , vcvtpd2ps(ymm1, zmmword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("62F1FD087BCA" , vcvtpd2qq(xmm1, xmm2));
+ TEST_INSTRUCTION("62F1FD087B4C1A08" , vcvtpd2qq(xmm1, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("62F1FD087B4C1A08" , vcvtpd2qq(xmm1, xmmword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("62F1FD287BCA" , vcvtpd2qq(ymm1, ymm2));
+ TEST_INSTRUCTION("62F1FD287B4C1A04" , vcvtpd2qq(ymm1, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("62F1FD287B4C1A04" , vcvtpd2qq(ymm1, ymmword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("62F1FD487BCA" , vcvtpd2qq(zmm1, zmm2));
+ TEST_INSTRUCTION("62F1FD487B4C1A02" , vcvtpd2qq(zmm1, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("62F1FD487B4C1A02" , vcvtpd2qq(zmm1, zmmword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("62F1FC0879CA" , vcvtpd2udq(xmm1, xmm2));
+ TEST_INSTRUCTION("62F1FC2879CA" , vcvtpd2udq(xmm1, ymm2));
+ TEST_INSTRUCTION("62F1FC08794C1A08" , vcvtpd2udq(xmm1, xmmword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("62F1FC28794C1A04" , vcvtpd2udq(xmm1, ymmword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("62F1FC4879CA" , vcvtpd2udq(ymm1, zmm2));
+ TEST_INSTRUCTION("62F1FC48794C1A02" , vcvtpd2udq(ymm1, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("62F1FC48794C1A02" , vcvtpd2udq(ymm1, zmmword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("62F1FD0879CA" , vcvtpd2uqq(xmm1, xmm2));
+ TEST_INSTRUCTION("62F1FD08794C1A08" , vcvtpd2uqq(xmm1, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("62F1FD08794C1A08" , vcvtpd2uqq(xmm1, xmmword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("62F1FD2879CA" , vcvtpd2uqq(ymm1, ymm2));
+ TEST_INSTRUCTION("62F1FD28794C1A04" , vcvtpd2uqq(ymm1, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("62F1FD28794C1A04" , vcvtpd2uqq(ymm1, ymmword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("62F1FD4879CA" , vcvtpd2uqq(zmm1, zmm2));
+ TEST_INSTRUCTION("62F1FD48794C1A02" , vcvtpd2uqq(zmm1, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("62F1FD48794C1A02" , vcvtpd2uqq(zmm1, zmmword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("C4E27913CA" , vcvtph2ps(xmm1, xmm2));
+ TEST_INSTRUCTION("C4E279138C1A80000000" , vcvtph2ps(xmm1, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("C4E279138C1A80000000" , vcvtph2ps(xmm1, qword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("C4E27D13CA" , vcvtph2ps(ymm1, xmm2));
+ TEST_INSTRUCTION("C4E27D138C1A80000000" , vcvtph2ps(ymm1, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("C4E27D138C1A80000000" , vcvtph2ps(ymm1, xmmword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("62F27D4813CA" , vcvtph2ps(zmm1, ymm2));
+ TEST_INSTRUCTION("62F27D48134C1A04" , vcvtph2ps(zmm1, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("62F27D48134C1A04" , vcvtph2ps(zmm1, ymmword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("C5F95BCA" , vcvtps2dq(xmm1, xmm2));
+ TEST_INSTRUCTION("C5F95B8C1A80000000" , vcvtps2dq(xmm1, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("C5F95B8C1A80000000" , vcvtps2dq(xmm1, xmmword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("C5FD5BCA" , vcvtps2dq(ymm1, ymm2));
+ TEST_INSTRUCTION("C5FD5B8C1A80000000" , vcvtps2dq(ymm1, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("C5FD5B8C1A80000000" , vcvtps2dq(ymm1, ymmword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("62F17D485BCA" , vcvtps2dq(zmm1, zmm2));
+ TEST_INSTRUCTION("62F17D485B4C1A02" , vcvtps2dq(zmm1, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("62F17D485B4C1A02" , vcvtps2dq(zmm1, zmmword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("C5F85ACA" , vcvtps2pd(xmm1, xmm2));
+ TEST_INSTRUCTION("C5F85A8C1A80000000" , vcvtps2pd(xmm1, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("C5F85A8C1A80000000" , vcvtps2pd(xmm1, qword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("C5FC5ACA" , vcvtps2pd(ymm1, xmm2));
+ TEST_INSTRUCTION("C5FC5A8C1A80000000" , vcvtps2pd(ymm1, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("C5FC5A8C1A80000000" , vcvtps2pd(ymm1, xmmword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("62F17C485ACA" , vcvtps2pd(zmm1, ymm2));
+ TEST_INSTRUCTION("62F17C485A4C1A04" , vcvtps2pd(zmm1, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("62F17C485A4C1A04" , vcvtps2pd(zmm1, ymmword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("C4E3791DD101" , vcvtps2ph(xmm1, xmm2, 1));
+ TEST_INSTRUCTION("C4E3791D9C118000000001" , vcvtps2ph(ptr(ecx, edx, 0, 128), xmm3, 1));
+ TEST_INSTRUCTION("C4E3791D9C118000000001" , vcvtps2ph(qword_ptr(ecx, edx, 0, 128), xmm3, 1));
+ TEST_INSTRUCTION("C4E37D1DD101" , vcvtps2ph(xmm1, ymm2, 1));
+ TEST_INSTRUCTION("C4E37D1D9C118000000001" , vcvtps2ph(ptr(ecx, edx, 0, 128), ymm3, 1));
+ TEST_INSTRUCTION("C4E37D1D9C118000000001" , vcvtps2ph(xmmword_ptr(ecx, edx, 0, 128), ymm3, 1));
+ TEST_INSTRUCTION("62F37D481DD101" , vcvtps2ph(ymm1, zmm2, 1));
+ TEST_INSTRUCTION("62F37D481D5C110401" , vcvtps2ph(ptr(ecx, edx, 0, 128), zmm3, 1));
+ TEST_INSTRUCTION("62F37D481D5C110401" , vcvtps2ph(ymmword_ptr(ecx, edx, 0, 128), zmm3, 1));
+ TEST_INSTRUCTION("62F17D087BCA" , vcvtps2qq(xmm1, xmm2));
+ TEST_INSTRUCTION("62F17D087B4C1A10" , vcvtps2qq(xmm1, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("62F17D087B4C1A10" , vcvtps2qq(xmm1, qword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("62F17D287BCA" , vcvtps2qq(ymm1, xmm2));
+ TEST_INSTRUCTION("62F17D287B4C1A08" , vcvtps2qq(ymm1, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("62F17D287B4C1A08" , vcvtps2qq(ymm1, xmmword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("62F17D487BCA" , vcvtps2qq(zmm1, ymm2));
+ TEST_INSTRUCTION("62F17D487B4C1A04" , vcvtps2qq(zmm1, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("62F17D487B4C1A04" , vcvtps2qq(zmm1, ymmword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("62F17C0879CA" , vcvtps2udq(xmm1, xmm2));
+ TEST_INSTRUCTION("62F17C08794C1A08" , vcvtps2udq(xmm1, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("62F17C08794C1A08" , vcvtps2udq(xmm1, xmmword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("62F17C2879CA" , vcvtps2udq(ymm1, ymm2));
+ TEST_INSTRUCTION("62F17C28794C1A04" , vcvtps2udq(ymm1, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("62F17C28794C1A04" , vcvtps2udq(ymm1, ymmword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("62F17C4879CA" , vcvtps2udq(zmm1, zmm2));
+ TEST_INSTRUCTION("62F17C48794C1A02" , vcvtps2udq(zmm1, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("62F17C48794C1A02" , vcvtps2udq(zmm1, zmmword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("62F17D0879CA" , vcvtps2uqq(xmm1, xmm2));
+ TEST_INSTRUCTION("62F17D08794C1A10" , vcvtps2uqq(xmm1, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("62F17D08794C1A10" , vcvtps2uqq(xmm1, qword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("62F17D2879CA" , vcvtps2uqq(ymm1, xmm2));
+ TEST_INSTRUCTION("62F17D28794C1A08" , vcvtps2uqq(ymm1, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("62F17D28794C1A08" , vcvtps2uqq(ymm1, xmmword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("62F17D4879CA" , vcvtps2uqq(zmm1, ymm2));
+ TEST_INSTRUCTION("62F17D48794C1A04" , vcvtps2uqq(zmm1, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("62F17D48794C1A04" , vcvtps2uqq(zmm1, ymmword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("62F1FE08E6CA" , vcvtqq2pd(xmm1, xmm2));
+ TEST_INSTRUCTION("62F1FE08E64C1A08" , vcvtqq2pd(xmm1, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("62F1FE08E64C1A08" , vcvtqq2pd(xmm1, xmmword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("62F1FE28E6CA" , vcvtqq2pd(ymm1, ymm2));
+ TEST_INSTRUCTION("62F1FE28E64C1A04" , vcvtqq2pd(ymm1, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("62F1FE28E64C1A04" , vcvtqq2pd(ymm1, ymmword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("62F1FE48E6CA" , vcvtqq2pd(zmm1, zmm2));
+ TEST_INSTRUCTION("62F1FE48E64C1A02" , vcvtqq2pd(zmm1, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("62F1FE48E64C1A02" , vcvtqq2pd(zmm1, zmmword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("62F1FC085BCA" , vcvtqq2ps(xmm1, xmm2));
+ TEST_INSTRUCTION("62F1FC285BCA" , vcvtqq2ps(xmm1, ymm2));
+ TEST_INSTRUCTION("62F1FC085B4C1A08" , vcvtqq2ps(xmm1, xmmword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("62F1FC285B4C1A04" , vcvtqq2ps(xmm1, ymmword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("62F1FC485BCA" , vcvtqq2ps(ymm1, zmm2));
+ TEST_INSTRUCTION("62F1FC485B4C1A02" , vcvtqq2ps(ymm1, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("62F1FC485B4C1A02" , vcvtqq2ps(ymm1, zmmword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("C5FB2DCA" , vcvtsd2si(ecx, xmm2));
+ TEST_INSTRUCTION("C5FB2D8C1A80000000" , vcvtsd2si(ecx, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("C5FB2D8C1A80000000" , vcvtsd2si(ecx, qword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("C5EB5ACB" , vcvtsd2ss(xmm1, xmm2, xmm3));
+ TEST_INSTRUCTION("C5EB5A8C2B80000000" , vcvtsd2ss(xmm1, xmm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C5EB5A8C2B80000000" , vcvtsd2ss(xmm1, xmm2, qword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F17F0879CA" , vcvtsd2usi(ecx, xmm2));
+ TEST_INSTRUCTION("62F17F08794C1A10" , vcvtsd2usi(ecx, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("62F17F08794C1A10" , vcvtsd2usi(ecx, qword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("C5EB2ACB" , vcvtsi2sd(xmm1, xmm2, ebx));
+ TEST_INSTRUCTION("C5EB2A8C2B80000000" , vcvtsi2sd(xmm1, xmm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C5EB2A8C2B80000000" , vcvtsi2sd(xmm1, xmm2, dword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C4E1EB2A8C2B80000000" , vcvtsi2sd(xmm1, xmm2, qword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C5EA2ACB" , vcvtsi2ss(xmm1, xmm2, ebx));
+ TEST_INSTRUCTION("C5EA2A8C2B80000000" , vcvtsi2ss(xmm1, xmm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C5EA2A8C2B80000000" , vcvtsi2ss(xmm1, xmm2, dword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C4E1EA2A8C2B80000000" , vcvtsi2ss(xmm1, xmm2, qword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C5EA5ACB" , vcvtss2sd(xmm1, xmm2, xmm3));
+ TEST_INSTRUCTION("C5EA5A8C2B80000000" , vcvtss2sd(xmm1, xmm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C5EA5A8C2B80000000" , vcvtss2sd(xmm1, xmm2, dword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C5FA2DCA" , vcvtss2si(ecx, xmm2));
+ TEST_INSTRUCTION("C5FA2D8C1A80000000" , vcvtss2si(ecx, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("C5FA2D8C1A80000000" , vcvtss2si(ecx, dword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("62F17E0879CA" , vcvtss2usi(ecx, xmm2));
+ TEST_INSTRUCTION("62F17E08794C1A20" , vcvtss2usi(ecx, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("62F17E08794C1A20" , vcvtss2usi(ecx, dword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("C5F9E6CA" , vcvttpd2dq(xmm1, xmm2));
+ TEST_INSTRUCTION("C5FDE6CA" , vcvttpd2dq(xmm1, ymm2));
+ TEST_INSTRUCTION("C5F9E68C1A80000000" , vcvttpd2dq(xmm1, xmmword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("C5FDE68C1A80000000" , vcvttpd2dq(xmm1, ymmword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("62F1FD48E6CA" , vcvttpd2dq(ymm1, zmm2));
+ TEST_INSTRUCTION("62F1FD48E64C1A02" , vcvttpd2dq(ymm1, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("62F1FD48E64C1A02" , vcvttpd2dq(ymm1, zmmword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("62F1FD087ACA" , vcvttpd2qq(xmm1, xmm2));
+ TEST_INSTRUCTION("62F1FD087A4C1A08" , vcvttpd2qq(xmm1, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("62F1FD087A4C1A08" , vcvttpd2qq(xmm1, xmmword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("62F1FD287ACA" , vcvttpd2qq(ymm1, ymm2));
+ TEST_INSTRUCTION("62F1FD287A4C1A04" , vcvttpd2qq(ymm1, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("62F1FD287A4C1A04" , vcvttpd2qq(ymm1, ymmword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("62F1FD487ACA" , vcvttpd2qq(zmm1, zmm2));
+ TEST_INSTRUCTION("62F1FD487A4C1A02" , vcvttpd2qq(zmm1, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("62F1FD487A4C1A02" , vcvttpd2qq(zmm1, zmmword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("62F1FC0878CA" , vcvttpd2udq(xmm1, xmm2));
+ TEST_INSTRUCTION("62F1FC2878CA" , vcvttpd2udq(xmm1, ymm2));
+ TEST_INSTRUCTION("62F1FC08784C1A08" , vcvttpd2udq(xmm1, xmmword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("62F1FC28784C1A04" , vcvttpd2udq(xmm1, ymmword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("62F1FC4878CA" , vcvttpd2udq(ymm1, zmm2));
+ TEST_INSTRUCTION("62F1FC48784C1A02" , vcvttpd2udq(ymm1, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("62F1FC48784C1A02" , vcvttpd2udq(ymm1, zmmword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("62F1FD0878CA" , vcvttpd2uqq(xmm1, xmm2));
+ TEST_INSTRUCTION("62F1FD08784C1A08" , vcvttpd2uqq(xmm1, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("62F1FD08784C1A08" , vcvttpd2uqq(xmm1, xmmword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("62F1FD2878CA" , vcvttpd2uqq(ymm1, ymm2));
+ TEST_INSTRUCTION("62F1FD28784C1A04" , vcvttpd2uqq(ymm1, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("62F1FD28784C1A04" , vcvttpd2uqq(ymm1, ymmword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("62F1FD4878CA" , vcvttpd2uqq(zmm1, zmm2));
+ TEST_INSTRUCTION("62F1FD48784C1A02" , vcvttpd2uqq(zmm1, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("62F1FD48784C1A02" , vcvttpd2uqq(zmm1, zmmword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("C5FA5BCA" , vcvttps2dq(xmm1, xmm2));
+ TEST_INSTRUCTION("C5FA5B8C1A80000000" , vcvttps2dq(xmm1, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("C5FA5B8C1A80000000" , vcvttps2dq(xmm1, xmmword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("C5FE5BCA" , vcvttps2dq(ymm1, ymm2));
+ TEST_INSTRUCTION("C5FE5B8C1A80000000" , vcvttps2dq(ymm1, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("C5FE5B8C1A80000000" , vcvttps2dq(ymm1, ymmword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("62F17E485BCA" , vcvttps2dq(zmm1, zmm2));
+ TEST_INSTRUCTION("62F17E485B4C1A02" , vcvttps2dq(zmm1, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("62F17E485B4C1A02" , vcvttps2dq(zmm1, zmmword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("62F17D087ACA" , vcvttps2qq(xmm1, xmm2));
+ TEST_INSTRUCTION("62F17D087A4C1A10" , vcvttps2qq(xmm1, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("62F17D087A4C1A10" , vcvttps2qq(xmm1, qword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("62F17D287ACA" , vcvttps2qq(ymm1, xmm2));
+ TEST_INSTRUCTION("62F17D287A4C1A08" , vcvttps2qq(ymm1, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("62F17D287A4C1A08" , vcvttps2qq(ymm1, xmmword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("62F17D487ACA" , vcvttps2qq(zmm1, ymm2));
+ TEST_INSTRUCTION("62F17D487A4C1A04" , vcvttps2qq(zmm1, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("62F17D487A4C1A04" , vcvttps2qq(zmm1, ymmword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("62F17C0878CA" , vcvttps2udq(xmm1, xmm2));
+ TEST_INSTRUCTION("62F17C08784C1A08" , vcvttps2udq(xmm1, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("62F17C08784C1A08" , vcvttps2udq(xmm1, xmmword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("62F17C2878CA" , vcvttps2udq(ymm1, ymm2));
+ TEST_INSTRUCTION("62F17C28784C1A04" , vcvttps2udq(ymm1, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("62F17C28784C1A04" , vcvttps2udq(ymm1, ymmword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("62F17C4878CA" , vcvttps2udq(zmm1, zmm2));
+ TEST_INSTRUCTION("62F17C48784C1A02" , vcvttps2udq(zmm1, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("62F17C48784C1A02" , vcvttps2udq(zmm1, zmmword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("62F17D0878CA" , vcvttps2uqq(xmm1, xmm2));
+ TEST_INSTRUCTION("62F17D08784C1A10" , vcvttps2uqq(xmm1, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("62F17D08784C1A10" , vcvttps2uqq(xmm1, qword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("62F17D2878CA" , vcvttps2uqq(ymm1, xmm2));
+ TEST_INSTRUCTION("62F17D28784C1A08" , vcvttps2uqq(ymm1, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("62F17D28784C1A08" , vcvttps2uqq(ymm1, xmmword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("62F17D4878CA" , vcvttps2uqq(zmm1, ymm2));
+ TEST_INSTRUCTION("62F17D48784C1A04" , vcvttps2uqq(zmm1, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("62F17D48784C1A04" , vcvttps2uqq(zmm1, ymmword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("C5FB2CCA" , vcvttsd2si(ecx, xmm2));
+ TEST_INSTRUCTION("C5FB2C8C1A80000000" , vcvttsd2si(ecx, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("C5FB2C8C1A80000000" , vcvttsd2si(ecx, qword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("62F17F0878CA" , vcvttsd2usi(ecx, xmm2));
+ TEST_INSTRUCTION("62F17F08784C1A10" , vcvttsd2usi(ecx, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("62F17F08784C1A10" , vcvttsd2usi(ecx, qword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("C5FA2CCA" , vcvttss2si(ecx, xmm2));
+ TEST_INSTRUCTION("C5FA2C8C1A80000000" , vcvttss2si(ecx, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("C5FA2C8C1A80000000" , vcvttss2si(ecx, dword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("62F17E0878CA" , vcvttss2usi(ecx, xmm2));
+ TEST_INSTRUCTION("62F17E08784C1A20" , vcvttss2usi(ecx, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("62F17E08784C1A20" , vcvttss2usi(ecx, dword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("62F17E087ACA" , vcvtudq2pd(xmm1, xmm2));
+ TEST_INSTRUCTION("62F17E087A4C1A10" , vcvtudq2pd(xmm1, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("62F17E087A4C1A10" , vcvtudq2pd(xmm1, qword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("62F17E287ACA" , vcvtudq2pd(ymm1, xmm2));
+ TEST_INSTRUCTION("62F17E287A4C1A08" , vcvtudq2pd(ymm1, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("62F17E287A4C1A08" , vcvtudq2pd(ymm1, xmmword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("62F17E487ACA" , vcvtudq2pd(zmm1, ymm2));
+ TEST_INSTRUCTION("62F17E487A4C1A04" , vcvtudq2pd(zmm1, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("62F17E487A4C1A04" , vcvtudq2pd(zmm1, ymmword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("62F17F087ACA" , vcvtudq2ps(xmm1, xmm2));
+ TEST_INSTRUCTION("62F17F087A4C1A08" , vcvtudq2ps(xmm1, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("62F17F087A4C1A08" , vcvtudq2ps(xmm1, xmmword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("62F17F287ACA" , vcvtudq2ps(ymm1, ymm2));
+ TEST_INSTRUCTION("62F17F287A4C1A04" , vcvtudq2ps(ymm1, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("62F17F287A4C1A04" , vcvtudq2ps(ymm1, ymmword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("62F17F487ACA" , vcvtudq2ps(zmm1, zmm2));
+ TEST_INSTRUCTION("62F17F487A4C1A02" , vcvtudq2ps(zmm1, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("62F17F487A4C1A02" , vcvtudq2ps(zmm1, zmmword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("62F1FE087ACA" , vcvtuqq2pd(xmm1, xmm2));
+ TEST_INSTRUCTION("62F1FE087A4C1A08" , vcvtuqq2pd(xmm1, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("62F1FE087A4C1A08" , vcvtuqq2pd(xmm1, xmmword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("62F1FE287ACA" , vcvtuqq2pd(ymm1, ymm2));
+ TEST_INSTRUCTION("62F1FE287A4C1A04" , vcvtuqq2pd(ymm1, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("62F1FE287A4C1A04" , vcvtuqq2pd(ymm1, ymmword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("62F1FE487ACA" , vcvtuqq2pd(zmm1, zmm2));
+ TEST_INSTRUCTION("62F1FE487A4C1A02" , vcvtuqq2pd(zmm1, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("62F1FE487A4C1A02" , vcvtuqq2pd(zmm1, zmmword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("62F1FF087ACA" , vcvtuqq2ps(xmm1, xmm2));
+ TEST_INSTRUCTION("62F1FF287ACA" , vcvtuqq2ps(xmm1, ymm2));
+ TEST_INSTRUCTION("62F1FF087A4C1A08" , vcvtuqq2ps(xmm1, xmmword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("62F1FF287A4C1A04" , vcvtuqq2ps(xmm1, ymmword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("62F1FF487ACA" , vcvtuqq2ps(ymm1, zmm2));
+ TEST_INSTRUCTION("62F1FF487A4C1A02" , vcvtuqq2ps(ymm1, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("62F1FF487A4C1A02" , vcvtuqq2ps(ymm1, zmmword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("62F16F087BCB" , vcvtusi2sd(xmm1, xmm2, ebx));
+ TEST_INSTRUCTION("62F16F087B4C2B20" , vcvtusi2sd(xmm1, xmm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F16F087B4C2B20" , vcvtusi2sd(xmm1, xmm2, dword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F1EF087B4C2B10" , vcvtusi2sd(xmm1, xmm2, qword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F16E087BCB" , vcvtusi2ss(xmm1, xmm2, ebx));
+ TEST_INSTRUCTION("62F16E087B4C2B20" , vcvtusi2ss(xmm1, xmm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F16E087B4C2B20" , vcvtusi2ss(xmm1, xmm2, dword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F1EE087B4C2B10" , vcvtusi2ss(xmm1, xmm2, qword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F36D0842CB01" , vdbpsadbw(xmm1, xmm2, xmm3, 1));
+ TEST_INSTRUCTION("62F36D08424C2B0801" , vdbpsadbw(xmm1, xmm2, ptr(ebx, ebp, 0, 128), 1));
+ TEST_INSTRUCTION("62F36D08424C2B0801" , vdbpsadbw(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128), 1));
+ TEST_INSTRUCTION("62F36D2842CB01" , vdbpsadbw(ymm1, ymm2, ymm3, 1));
+ TEST_INSTRUCTION("62F36D28424C2B0401" , vdbpsadbw(ymm1, ymm2, ptr(ebx, ebp, 0, 128), 1));
+ TEST_INSTRUCTION("62F36D28424C2B0401" , vdbpsadbw(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128), 1));
+ TEST_INSTRUCTION("62F36D4842CB01" , vdbpsadbw(zmm1, zmm2, zmm3, 1));
+ TEST_INSTRUCTION("62F36D48424C2B0201" , vdbpsadbw(zmm1, zmm2, ptr(ebx, ebp, 0, 128), 1));
+ TEST_INSTRUCTION("62F36D48424C2B0201" , vdbpsadbw(zmm1, zmm2, zmmword_ptr(ebx, ebp, 0, 128), 1));
+ TEST_INSTRUCTION("C5E95ECB" , vdivpd(xmm1, xmm2, xmm3));
+ TEST_INSTRUCTION("C5E95E8C2B80000000" , vdivpd(xmm1, xmm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C5E95E8C2B80000000" , vdivpd(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C5ED5ECB" , vdivpd(ymm1, ymm2, ymm3));
+ TEST_INSTRUCTION("C5ED5E8C2B80000000" , vdivpd(ymm1, ymm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C5ED5E8C2B80000000" , vdivpd(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F1ED485ECB" , vdivpd(zmm1, zmm2, zmm3));
+ TEST_INSTRUCTION("62F1ED485E4C2B02" , vdivpd(zmm1, zmm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F1ED485E4C2B02" , vdivpd(zmm1, zmm2, zmmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C5E85ECB" , vdivps(xmm1, xmm2, xmm3));
+ TEST_INSTRUCTION("C5E85E8C2B80000000" , vdivps(xmm1, xmm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C5E85E8C2B80000000" , vdivps(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C5EC5ECB" , vdivps(ymm1, ymm2, ymm3));
+ TEST_INSTRUCTION("C5EC5E8C2B80000000" , vdivps(ymm1, ymm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C5EC5E8C2B80000000" , vdivps(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F16C485ECB" , vdivps(zmm1, zmm2, zmm3));
+ TEST_INSTRUCTION("62F16C485E4C2B02" , vdivps(zmm1, zmm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F16C485E4C2B02" , vdivps(zmm1, zmm2, zmmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C5EB5ECB" , vdivsd(xmm1, xmm2, xmm3));
+ TEST_INSTRUCTION("C5EB5E8C2B80000000" , vdivsd(xmm1, xmm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C5EB5E8C2B80000000" , vdivsd(xmm1, xmm2, qword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C5EA5ECB" , vdivss(xmm1, xmm2, xmm3));
+ TEST_INSTRUCTION("C5EA5E8C2B80000000" , vdivss(xmm1, xmm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C5EA5E8C2B80000000" , vdivss(xmm1, xmm2, dword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F26E0852CB" , vdpbf16ps(xmm1, xmm2, xmm3));
+ TEST_INSTRUCTION("62F26E08524C2B08" , vdpbf16ps(xmm1, xmm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F26E08524C2B08" , vdpbf16ps(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F26E2852CB" , vdpbf16ps(ymm1, ymm2, ymm3));
+ TEST_INSTRUCTION("62F26E28524C2B04" , vdpbf16ps(ymm1, ymm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F26E28524C2B04" , vdpbf16ps(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F26E4852CB" , vdpbf16ps(zmm1, zmm2, zmm3));
+ TEST_INSTRUCTION("62F26E48524C2B02" , vdpbf16ps(zmm1, zmm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F26E48524C2B02" , vdpbf16ps(zmm1, zmm2, zmmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C4E36941CB01" , vdppd(xmm1, xmm2, xmm3, 1));
+ TEST_INSTRUCTION("C4E369418C2B8000000001" , vdppd(xmm1, xmm2, ptr(ebx, ebp, 0, 128), 1));
+ TEST_INSTRUCTION("C4E369418C2B8000000001" , vdppd(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128), 1));
+ TEST_INSTRUCTION("C4E36940CB01" , vdpps(xmm1, xmm2, xmm3, 1));
+ TEST_INSTRUCTION("C4E369408C2B8000000001" , vdpps(xmm1, xmm2, ptr(ebx, ebp, 0, 128), 1));
+ TEST_INSTRUCTION("C4E369408C2B8000000001" , vdpps(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128), 1));
+ TEST_INSTRUCTION("C4E36D40CB01" , vdpps(ymm1, ymm2, ymm3, 1));
+ TEST_INSTRUCTION("C4E36D408C2B8000000001" , vdpps(ymm1, ymm2, ptr(ebx, ebp, 0, 128), 1));
+ TEST_INSTRUCTION("C4E36D408C2B8000000001" , vdpps(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128), 1));
+ TEST_INSTRUCTION("62F2FD48C8CA" , vexp2pd(zmm1, zmm2));
+ TEST_INSTRUCTION("62F2FD48C84C1A02" , vexp2pd(zmm1, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("62F2FD48C84C1A02" , vexp2pd(zmm1, zmmword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("62F27D48C8CA" , vexp2ps(zmm1, zmm2));
+ TEST_INSTRUCTION("62F27D48C84C1A02" , vexp2ps(zmm1, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("62F27D48C84C1A02" , vexp2ps(zmm1, zmmword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("62F2FD0888CA" , vexpandpd(xmm1, xmm2));
+ TEST_INSTRUCTION("62F2FD08884C1A10" , vexpandpd(xmm1, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("62F2FD08884C1A10" , vexpandpd(xmm1, xmmword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("62F2FD2888CA" , vexpandpd(ymm1, ymm2));
+ TEST_INSTRUCTION("62F2FD28884C1A10" , vexpandpd(ymm1, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("62F2FD28884C1A10" , vexpandpd(ymm1, ymmword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("62F2FD4888CA" , vexpandpd(zmm1, zmm2));
+ TEST_INSTRUCTION("62F2FD48884C1A10" , vexpandpd(zmm1, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("62F2FD48884C1A10" , vexpandpd(zmm1, zmmword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("62F27D0888CA" , vexpandps(xmm1, xmm2));
+ TEST_INSTRUCTION("62F27D08884C1A20" , vexpandps(xmm1, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("62F27D08884C1A20" , vexpandps(xmm1, xmmword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("62F27D2888CA" , vexpandps(ymm1, ymm2));
+ TEST_INSTRUCTION("62F27D28884C1A20" , vexpandps(ymm1, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("62F27D28884C1A20" , vexpandps(ymm1, ymmword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("62F27D4888CA" , vexpandps(zmm1, zmm2));
+ TEST_INSTRUCTION("62F27D48884C1A20" , vexpandps(zmm1, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("62F27D48884C1A20" , vexpandps(zmm1, zmmword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("C4E37D19D101" , vextractf128(xmm1, ymm2, 1));
+ TEST_INSTRUCTION("C4E37D199C118000000001" , vextractf128(ptr(ecx, edx, 0, 128), ymm3, 1));
+ TEST_INSTRUCTION("C4E37D199C118000000001" , vextractf128(xmmword_ptr(ecx, edx, 0, 128), ymm3, 1));
+ TEST_INSTRUCTION("62F37D2819D101" , vextractf32x4(xmm1, ymm2, 1));
+ TEST_INSTRUCTION("62F37D4819D101" , vextractf32x4(xmm1, zmm2, 1));
+ TEST_INSTRUCTION("62F37D28195C110801" , vextractf32x4(ptr(ecx, edx, 0, 128), ymm3, 1));
+ TEST_INSTRUCTION("62F37D48195C110801" , vextractf32x4(ptr(ecx, edx, 0, 128), zmm3, 1));
+ TEST_INSTRUCTION("62F37D28195C110801" , vextractf32x4(xmmword_ptr(ecx, edx, 0, 128), ymm3, 1));
+ TEST_INSTRUCTION("62F37D48195C110801" , vextractf32x4(xmmword_ptr(ecx, edx, 0, 128), zmm3, 1));
+ TEST_INSTRUCTION("62F37D481BD101" , vextractf32x8(ymm1, zmm2, 1));
+ TEST_INSTRUCTION("62F37D481B5C110401" , vextractf32x8(ptr(ecx, edx, 0, 128), zmm3, 1));
+ TEST_INSTRUCTION("62F37D481B5C110401" , vextractf32x8(ymmword_ptr(ecx, edx, 0, 128), zmm3, 1));
+ TEST_INSTRUCTION("62F3FD2819D101" , vextractf64x2(xmm1, ymm2, 1));
+ TEST_INSTRUCTION("62F3FD4819D101" , vextractf64x2(xmm1, zmm2, 1));
+ TEST_INSTRUCTION("62F3FD28195C110801" , vextractf64x2(ptr(ecx, edx, 0, 128), ymm3, 1));
+ TEST_INSTRUCTION("62F3FD48195C110801" , vextractf64x2(ptr(ecx, edx, 0, 128), zmm3, 1));
+ TEST_INSTRUCTION("62F3FD28195C110801" , vextractf64x2(xmmword_ptr(ecx, edx, 0, 128), ymm3, 1));
+ TEST_INSTRUCTION("62F3FD48195C110801" , vextractf64x2(xmmword_ptr(ecx, edx, 0, 128), zmm3, 1));
+ TEST_INSTRUCTION("62F3FD481BD101" , vextractf64x4(ymm1, zmm2, 1));
+ TEST_INSTRUCTION("62F3FD481B5C110401" , vextractf64x4(ptr(ecx, edx, 0, 128), zmm3, 1));
+ TEST_INSTRUCTION("62F3FD481B5C110401" , vextractf64x4(ymmword_ptr(ecx, edx, 0, 128), zmm3, 1));
+ TEST_INSTRUCTION("C4E37D39D101" , vextracti128(xmm1, ymm2, 1));
+ TEST_INSTRUCTION("C4E37D399C118000000001" , vextracti128(ptr(ecx, edx, 0, 128), ymm3, 1));
+ TEST_INSTRUCTION("C4E37D399C118000000001" , vextracti128(xmmword_ptr(ecx, edx, 0, 128), ymm3, 1));
+ TEST_INSTRUCTION("62F37D2839D101" , vextracti32x4(xmm1, ymm2, 1));
+ TEST_INSTRUCTION("62F37D4839D101" , vextracti32x4(xmm1, zmm2, 1));
+ TEST_INSTRUCTION("62F37D28395C110801" , vextracti32x4(ptr(ecx, edx, 0, 128), ymm3, 1));
+ TEST_INSTRUCTION("62F37D48395C110801" , vextracti32x4(ptr(ecx, edx, 0, 128), zmm3, 1));
+ TEST_INSTRUCTION("62F37D28395C110801" , vextracti32x4(xmmword_ptr(ecx, edx, 0, 128), ymm3, 1));
+ TEST_INSTRUCTION("62F37D48395C110801" , vextracti32x4(xmmword_ptr(ecx, edx, 0, 128), zmm3, 1));
+ TEST_INSTRUCTION("62F37D483BD101" , vextracti32x8(ymm1, zmm2, 1));
+ TEST_INSTRUCTION("62F37D483B5C110401" , vextracti32x8(ptr(ecx, edx, 0, 128), zmm3, 1));
+ TEST_INSTRUCTION("62F37D483B5C110401" , vextracti32x8(ymmword_ptr(ecx, edx, 0, 128), zmm3, 1));
+ TEST_INSTRUCTION("62F3FD2839D101" , vextracti64x2(xmm1, ymm2, 1));
+ TEST_INSTRUCTION("62F3FD4839D101" , vextracti64x2(xmm1, zmm2, 1));
+ TEST_INSTRUCTION("62F3FD28395C110801" , vextracti64x2(ptr(ecx, edx, 0, 128), ymm3, 1));
+ TEST_INSTRUCTION("62F3FD48395C110801" , vextracti64x2(ptr(ecx, edx, 0, 128), zmm3, 1));
+ TEST_INSTRUCTION("62F3FD28395C110801" , vextracti64x2(xmmword_ptr(ecx, edx, 0, 128), ymm3, 1));
+ TEST_INSTRUCTION("62F3FD48395C110801" , vextracti64x2(xmmword_ptr(ecx, edx, 0, 128), zmm3, 1));
+ TEST_INSTRUCTION("62F3FD483BD101" , vextracti64x4(ymm1, zmm2, 1));
+ TEST_INSTRUCTION("62F3FD483B5C110401" , vextracti64x4(ptr(ecx, edx, 0, 128), zmm3, 1));
+ TEST_INSTRUCTION("62F3FD483B5C110401" , vextracti64x4(ymmword_ptr(ecx, edx, 0, 128), zmm3, 1));
+ TEST_INSTRUCTION("C4E37917D101" , vextractps(ecx, xmm2, 1));
+ TEST_INSTRUCTION("C4E379179C118000000001" , vextractps(ptr(ecx, edx, 0, 128), xmm3, 1));
+ TEST_INSTRUCTION("C4E379179C118000000001" , vextractps(dword_ptr(ecx, edx, 0, 128), xmm3, 1));
+ TEST_INSTRUCTION("62F3ED0854CB01" , vfixupimmpd(xmm1, xmm2, xmm3, 1));
+ TEST_INSTRUCTION("62F3ED08544C2B0801" , vfixupimmpd(xmm1, xmm2, ptr(ebx, ebp, 0, 128), 1));
+ TEST_INSTRUCTION("62F3ED08544C2B0801" , vfixupimmpd(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128), 1));
+ TEST_INSTRUCTION("62F3ED2854CB01" , vfixupimmpd(ymm1, ymm2, ymm3, 1));
+ TEST_INSTRUCTION("62F3ED28544C2B0401" , vfixupimmpd(ymm1, ymm2, ptr(ebx, ebp, 0, 128), 1));
+ TEST_INSTRUCTION("62F3ED28544C2B0401" , vfixupimmpd(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128), 1));
+ TEST_INSTRUCTION("62F3ED4854CB01" , vfixupimmpd(zmm1, zmm2, zmm3, 1));
+ TEST_INSTRUCTION("62F3ED48544C2B0201" , vfixupimmpd(zmm1, zmm2, ptr(ebx, ebp, 0, 128), 1));
+ TEST_INSTRUCTION("62F3ED48544C2B0201" , vfixupimmpd(zmm1, zmm2, zmmword_ptr(ebx, ebp, 0, 128), 1));
+ TEST_INSTRUCTION("62F36D0854CB01" , vfixupimmps(xmm1, xmm2, xmm3, 1));
+ TEST_INSTRUCTION("62F36D08544C2B0801" , vfixupimmps(xmm1, xmm2, ptr(ebx, ebp, 0, 128), 1));
+ TEST_INSTRUCTION("62F36D08544C2B0801" , vfixupimmps(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128), 1));
+ TEST_INSTRUCTION("62F36D2854CB01" , vfixupimmps(ymm1, ymm2, ymm3, 1));
+ TEST_INSTRUCTION("62F36D28544C2B0401" , vfixupimmps(ymm1, ymm2, ptr(ebx, ebp, 0, 128), 1));
+ TEST_INSTRUCTION("62F36D28544C2B0401" , vfixupimmps(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128), 1));
+ TEST_INSTRUCTION("62F36D4854CB01" , vfixupimmps(zmm1, zmm2, zmm3, 1));
+ TEST_INSTRUCTION("62F36D48544C2B0201" , vfixupimmps(zmm1, zmm2, ptr(ebx, ebp, 0, 128), 1));
+ TEST_INSTRUCTION("62F36D48544C2B0201" , vfixupimmps(zmm1, zmm2, zmmword_ptr(ebx, ebp, 0, 128), 1));
+ TEST_INSTRUCTION("62F3ED0855CB01" , vfixupimmsd(xmm1, xmm2, xmm3, 1));
+ TEST_INSTRUCTION("62F3ED08554C2B1001" , vfixupimmsd(xmm1, xmm2, ptr(ebx, ebp, 0, 128), 1));
+ TEST_INSTRUCTION("62F3ED08554C2B1001" , vfixupimmsd(xmm1, xmm2, qword_ptr(ebx, ebp, 0, 128), 1));
+ TEST_INSTRUCTION("62F36D0855CB01" , vfixupimmss(xmm1, xmm2, xmm3, 1));
+ TEST_INSTRUCTION("62F36D08554C2B2001" , vfixupimmss(xmm1, xmm2, ptr(ebx, ebp, 0, 128), 1));
+ TEST_INSTRUCTION("62F36D08554C2B2001" , vfixupimmss(xmm1, xmm2, dword_ptr(ebx, ebp, 0, 128), 1));
+ TEST_INSTRUCTION("C4E2E998CB" , vfmadd132pd(xmm1, xmm2, xmm3));
+ TEST_INSTRUCTION("C4E2E9988C2B80000000" , vfmadd132pd(xmm1, xmm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C4E2E9988C2B80000000" , vfmadd132pd(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C4E2ED98CB" , vfmadd132pd(ymm1, ymm2, ymm3));
+ TEST_INSTRUCTION("C4E2ED988C2B80000000" , vfmadd132pd(ymm1, ymm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C4E2ED988C2B80000000" , vfmadd132pd(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F2ED4898CB" , vfmadd132pd(zmm1, zmm2, zmm3));
+ TEST_INSTRUCTION("62F2ED48984C2B02" , vfmadd132pd(zmm1, zmm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F2ED48984C2B02" , vfmadd132pd(zmm1, zmm2, zmmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C4E26998CB" , vfmadd132ps(xmm1, xmm2, xmm3));
+ TEST_INSTRUCTION("C4E269988C2B80000000" , vfmadd132ps(xmm1, xmm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C4E269988C2B80000000" , vfmadd132ps(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C4E26D98CB" , vfmadd132ps(ymm1, ymm2, ymm3));
+ TEST_INSTRUCTION("C4E26D988C2B80000000" , vfmadd132ps(ymm1, ymm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C4E26D988C2B80000000" , vfmadd132ps(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F26D4898CB" , vfmadd132ps(zmm1, zmm2, zmm3));
+ TEST_INSTRUCTION("62F26D48984C2B02" , vfmadd132ps(zmm1, zmm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F26D48984C2B02" , vfmadd132ps(zmm1, zmm2, zmmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C4E2E999CB" , vfmadd132sd(xmm1, xmm2, xmm3));
+ TEST_INSTRUCTION("C4E2E9998C2B80000000" , vfmadd132sd(xmm1, xmm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C4E2E9998C2B80000000" , vfmadd132sd(xmm1, xmm2, qword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C4E26999CB" , vfmadd132ss(xmm1, xmm2, xmm3));
+ TEST_INSTRUCTION("C4E269998C2B80000000" , vfmadd132ss(xmm1, xmm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C4E269998C2B80000000" , vfmadd132ss(xmm1, xmm2, dword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C4E2E9A8CB" , vfmadd213pd(xmm1, xmm2, xmm3));
+ TEST_INSTRUCTION("C4E2E9A88C2B80000000" , vfmadd213pd(xmm1, xmm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C4E2E9A88C2B80000000" , vfmadd213pd(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C4E2EDA8CB" , vfmadd213pd(ymm1, ymm2, ymm3));
+ TEST_INSTRUCTION("C4E2EDA88C2B80000000" , vfmadd213pd(ymm1, ymm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C4E2EDA88C2B80000000" , vfmadd213pd(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F2ED48A8CB" , vfmadd213pd(zmm1, zmm2, zmm3));
+ TEST_INSTRUCTION("62F2ED48A84C2B02" , vfmadd213pd(zmm1, zmm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F2ED48A84C2B02" , vfmadd213pd(zmm1, zmm2, zmmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C4E269A8CB" , vfmadd213ps(xmm1, xmm2, xmm3));
+ TEST_INSTRUCTION("C4E269A88C2B80000000" , vfmadd213ps(xmm1, xmm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C4E269A88C2B80000000" , vfmadd213ps(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C4E26DA8CB" , vfmadd213ps(ymm1, ymm2, ymm3));
+ TEST_INSTRUCTION("C4E26DA88C2B80000000" , vfmadd213ps(ymm1, ymm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C4E26DA88C2B80000000" , vfmadd213ps(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F26D48A8CB" , vfmadd213ps(zmm1, zmm2, zmm3));
+ TEST_INSTRUCTION("62F26D48A84C2B02" , vfmadd213ps(zmm1, zmm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F26D48A84C2B02" , vfmadd213ps(zmm1, zmm2, zmmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C4E2E9A9CB" , vfmadd213sd(xmm1, xmm2, xmm3));
+ TEST_INSTRUCTION("C4E2E9A98C2B80000000" , vfmadd213sd(xmm1, xmm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C4E2E9A98C2B80000000" , vfmadd213sd(xmm1, xmm2, qword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C4E269A9CB" , vfmadd213ss(xmm1, xmm2, xmm3));
+ TEST_INSTRUCTION("C4E269A98C2B80000000" , vfmadd213ss(xmm1, xmm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C4E269A98C2B80000000" , vfmadd213ss(xmm1, xmm2, dword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C4E2E9B8CB" , vfmadd231pd(xmm1, xmm2, xmm3));
+ TEST_INSTRUCTION("C4E2E9B88C2B80000000" , vfmadd231pd(xmm1, xmm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C4E2E9B88C2B80000000" , vfmadd231pd(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C4E2EDB8CB" , vfmadd231pd(ymm1, ymm2, ymm3));
+ TEST_INSTRUCTION("C4E2EDB88C2B80000000" , vfmadd231pd(ymm1, ymm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C4E2EDB88C2B80000000" , vfmadd231pd(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F2ED48B8CB" , vfmadd231pd(zmm1, zmm2, zmm3));
+ TEST_INSTRUCTION("62F2ED48B84C2B02" , vfmadd231pd(zmm1, zmm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F2ED48B84C2B02" , vfmadd231pd(zmm1, zmm2, zmmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C4E269B8CB" , vfmadd231ps(xmm1, xmm2, xmm3));
+ TEST_INSTRUCTION("C4E269B88C2B80000000" , vfmadd231ps(xmm1, xmm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C4E269B88C2B80000000" , vfmadd231ps(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C4E26DB8CB" , vfmadd231ps(ymm1, ymm2, ymm3));
+ TEST_INSTRUCTION("C4E26DB88C2B80000000" , vfmadd231ps(ymm1, ymm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C4E26DB88C2B80000000" , vfmadd231ps(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F26D48B8CB" , vfmadd231ps(zmm1, zmm2, zmm3));
+ TEST_INSTRUCTION("62F26D48B84C2B02" , vfmadd231ps(zmm1, zmm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F26D48B84C2B02" , vfmadd231ps(zmm1, zmm2, zmmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C4E2E9B9CB" , vfmadd231sd(xmm1, xmm2, xmm3));
+ TEST_INSTRUCTION("C4E2E9B98C2B80000000" , vfmadd231sd(xmm1, xmm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C4E2E9B98C2B80000000" , vfmadd231sd(xmm1, xmm2, qword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C4E269B9CB" , vfmadd231ss(xmm1, xmm2, xmm3));
+ TEST_INSTRUCTION("C4E269B98C2B80000000" , vfmadd231ss(xmm1, xmm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C4E269B98C2B80000000" , vfmadd231ss(xmm1, xmm2, dword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C4E3E969CC30" , vfmaddpd(xmm1, xmm2, xmm3, xmm4));
+ TEST_INSTRUCTION("C4E3E9698C358000000030" , vfmaddpd(xmm1, xmm2, xmm3, ptr(ebp, esi, 0, 128)));
+ TEST_INSTRUCTION("C4E3E9698C358000000030" , vfmaddpd(xmm1, xmm2, xmm3, xmmword_ptr(ebp, esi, 0, 128)));
+ TEST_INSTRUCTION("C4E369698C2B8000000060" , vfmaddpd(xmm1, xmm2, ptr(ebx, ebp, 0, 128), xmm6));
+ TEST_INSTRUCTION("C4E369698C2B8000000060" , vfmaddpd(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128), xmm6));
+ TEST_INSTRUCTION("C4E3ED69CC30" , vfmaddpd(ymm1, ymm2, ymm3, ymm4));
+ TEST_INSTRUCTION("C4E3ED698C358000000030" , vfmaddpd(ymm1, ymm2, ymm3, ptr(ebp, esi, 0, 128)));
+ TEST_INSTRUCTION("C4E3ED698C358000000030" , vfmaddpd(ymm1, ymm2, ymm3, ymmword_ptr(ebp, esi, 0, 128)));
+ TEST_INSTRUCTION("C4E36D698C2B8000000060" , vfmaddpd(ymm1, ymm2, ptr(ebx, ebp, 0, 128), ymm6));
+ TEST_INSTRUCTION("C4E36D698C2B8000000060" , vfmaddpd(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128), ymm6));
+ TEST_INSTRUCTION("C4E3E968CC30" , vfmaddps(xmm1, xmm2, xmm3, xmm4));
+ TEST_INSTRUCTION("C4E3E9688C358000000030" , vfmaddps(xmm1, xmm2, xmm3, ptr(ebp, esi, 0, 128)));
+ TEST_INSTRUCTION("C4E3E9688C358000000030" , vfmaddps(xmm1, xmm2, xmm3, xmmword_ptr(ebp, esi, 0, 128)));
+ TEST_INSTRUCTION("C4E369688C2B8000000060" , vfmaddps(xmm1, xmm2, ptr(ebx, ebp, 0, 128), xmm6));
+ TEST_INSTRUCTION("C4E369688C2B8000000060" , vfmaddps(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128), xmm6));
+ TEST_INSTRUCTION("C4E3ED68CC30" , vfmaddps(ymm1, ymm2, ymm3, ymm4));
+ TEST_INSTRUCTION("C4E3ED688C358000000030" , vfmaddps(ymm1, ymm2, ymm3, ptr(ebp, esi, 0, 128)));
+ TEST_INSTRUCTION("C4E3ED688C358000000030" , vfmaddps(ymm1, ymm2, ymm3, ymmword_ptr(ebp, esi, 0, 128)));
+ TEST_INSTRUCTION("C4E36D688C2B8000000060" , vfmaddps(ymm1, ymm2, ptr(ebx, ebp, 0, 128), ymm6));
+ TEST_INSTRUCTION("C4E36D688C2B8000000060" , vfmaddps(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128), ymm6));
+ TEST_INSTRUCTION("C4E3E96BCC30" , vfmaddsd(xmm1, xmm2, xmm3, xmm4));
+ TEST_INSTRUCTION("C4E3E96B8C358000000030" , vfmaddsd(xmm1, xmm2, xmm3, ptr(ebp, esi, 0, 128)));
+ TEST_INSTRUCTION("C4E3E96B8C358000000030" , vfmaddsd(xmm1, xmm2, xmm3, qword_ptr(ebp, esi, 0, 128)));
+ TEST_INSTRUCTION("C4E3696B8C2B8000000060" , vfmaddsd(xmm1, xmm2, ptr(ebx, ebp, 0, 128), xmm6));
+ TEST_INSTRUCTION("C4E3696B8C2B8000000060" , vfmaddsd(xmm1, xmm2, qword_ptr(ebx, ebp, 0, 128), xmm6));
+ TEST_INSTRUCTION("C4E3E96ACC30" , vfmaddss(xmm1, xmm2, xmm3, xmm4));
+ TEST_INSTRUCTION("C4E3E96A8C358000000030" , vfmaddss(xmm1, xmm2, xmm3, ptr(ebp, esi, 0, 128)));
+ TEST_INSTRUCTION("C4E3E96A8C358000000030" , vfmaddss(xmm1, xmm2, xmm3, dword_ptr(ebp, esi, 0, 128)));
+ TEST_INSTRUCTION("C4E3696A8C2B8000000060" , vfmaddss(xmm1, xmm2, ptr(ebx, ebp, 0, 128), xmm6));
+ TEST_INSTRUCTION("C4E3696A8C2B8000000060" , vfmaddss(xmm1, xmm2, dword_ptr(ebx, ebp, 0, 128), xmm6));
+ TEST_INSTRUCTION("C4E2E996CB" , vfmaddsub132pd(xmm1, xmm2, xmm3));
+ TEST_INSTRUCTION("C4E2E9968C2B80000000" , vfmaddsub132pd(xmm1, xmm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C4E2E9968C2B80000000" , vfmaddsub132pd(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C4E2ED96CB" , vfmaddsub132pd(ymm1, ymm2, ymm3));
+ TEST_INSTRUCTION("C4E2ED968C2B80000000" , vfmaddsub132pd(ymm1, ymm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C4E2ED968C2B80000000" , vfmaddsub132pd(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F2ED4896CB" , vfmaddsub132pd(zmm1, zmm2, zmm3));
+ TEST_INSTRUCTION("62F2ED48964C2B02" , vfmaddsub132pd(zmm1, zmm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F2ED48964C2B02" , vfmaddsub132pd(zmm1, zmm2, zmmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C4E26996CB" , vfmaddsub132ps(xmm1, xmm2, xmm3));
+ TEST_INSTRUCTION("C4E269968C2B80000000" , vfmaddsub132ps(xmm1, xmm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C4E269968C2B80000000" , vfmaddsub132ps(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C4E26D96CB" , vfmaddsub132ps(ymm1, ymm2, ymm3));
+ TEST_INSTRUCTION("C4E26D968C2B80000000" , vfmaddsub132ps(ymm1, ymm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C4E26D968C2B80000000" , vfmaddsub132ps(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F26D4896CB" , vfmaddsub132ps(zmm1, zmm2, zmm3));
+ TEST_INSTRUCTION("62F26D48964C2B02" , vfmaddsub132ps(zmm1, zmm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F26D48964C2B02" , vfmaddsub132ps(zmm1, zmm2, zmmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C4E2E9A6CB" , vfmaddsub213pd(xmm1, xmm2, xmm3));
+ TEST_INSTRUCTION("C4E2E9A68C2B80000000" , vfmaddsub213pd(xmm1, xmm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C4E2E9A68C2B80000000" , vfmaddsub213pd(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C4E2EDA6CB" , vfmaddsub213pd(ymm1, ymm2, ymm3));
+ TEST_INSTRUCTION("C4E2EDA68C2B80000000" , vfmaddsub213pd(ymm1, ymm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C4E2EDA68C2B80000000" , vfmaddsub213pd(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F2ED48A6CB" , vfmaddsub213pd(zmm1, zmm2, zmm3));
+ TEST_INSTRUCTION("62F2ED48A64C2B02" , vfmaddsub213pd(zmm1, zmm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F2ED48A64C2B02" , vfmaddsub213pd(zmm1, zmm2, zmmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C4E269A6CB" , vfmaddsub213ps(xmm1, xmm2, xmm3));
+ TEST_INSTRUCTION("C4E269A68C2B80000000" , vfmaddsub213ps(xmm1, xmm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C4E269A68C2B80000000" , vfmaddsub213ps(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C4E26DA6CB" , vfmaddsub213ps(ymm1, ymm2, ymm3));
+ TEST_INSTRUCTION("C4E26DA68C2B80000000" , vfmaddsub213ps(ymm1, ymm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C4E26DA68C2B80000000" , vfmaddsub213ps(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F26D48A6CB" , vfmaddsub213ps(zmm1, zmm2, zmm3));
+ TEST_INSTRUCTION("62F26D48A64C2B02" , vfmaddsub213ps(zmm1, zmm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F26D48A64C2B02" , vfmaddsub213ps(zmm1, zmm2, zmmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C4E2E9B6CB" , vfmaddsub231pd(xmm1, xmm2, xmm3));
+ TEST_INSTRUCTION("C4E2E9B68C2B80000000" , vfmaddsub231pd(xmm1, xmm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C4E2E9B68C2B80000000" , vfmaddsub231pd(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C4E2EDB6CB" , vfmaddsub231pd(ymm1, ymm2, ymm3));
+ TEST_INSTRUCTION("C4E2EDB68C2B80000000" , vfmaddsub231pd(ymm1, ymm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C4E2EDB68C2B80000000" , vfmaddsub231pd(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F2ED48B6CB" , vfmaddsub231pd(zmm1, zmm2, zmm3));
+ TEST_INSTRUCTION("62F2ED48B64C2B02" , vfmaddsub231pd(zmm1, zmm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F2ED48B64C2B02" , vfmaddsub231pd(zmm1, zmm2, zmmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C4E269B6CB" , vfmaddsub231ps(xmm1, xmm2, xmm3));
+ TEST_INSTRUCTION("C4E269B68C2B80000000" , vfmaddsub231ps(xmm1, xmm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C4E269B68C2B80000000" , vfmaddsub231ps(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C4E26DB6CB" , vfmaddsub231ps(ymm1, ymm2, ymm3));
+ TEST_INSTRUCTION("C4E26DB68C2B80000000" , vfmaddsub231ps(ymm1, ymm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C4E26DB68C2B80000000" , vfmaddsub231ps(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F26D48B6CB" , vfmaddsub231ps(zmm1, zmm2, zmm3));
+ TEST_INSTRUCTION("62F26D48B64C2B02" , vfmaddsub231ps(zmm1, zmm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F26D48B64C2B02" , vfmaddsub231ps(zmm1, zmm2, zmmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C4E3E95DCC30" , vfmaddsubpd(xmm1, xmm2, xmm3, xmm4));
+ TEST_INSTRUCTION("C4E3E95D8C358000000030" , vfmaddsubpd(xmm1, xmm2, xmm3, ptr(ebp, esi, 0, 128)));
+ TEST_INSTRUCTION("C4E3E95D8C358000000030" , vfmaddsubpd(xmm1, xmm2, xmm3, xmmword_ptr(ebp, esi, 0, 128)));
+ TEST_INSTRUCTION("C4E3695D8C2B8000000060" , vfmaddsubpd(xmm1, xmm2, ptr(ebx, ebp, 0, 128), xmm6));
+ TEST_INSTRUCTION("C4E3695D8C2B8000000060" , vfmaddsubpd(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128), xmm6));
+ TEST_INSTRUCTION("C4E3ED5DCC30" , vfmaddsubpd(ymm1, ymm2, ymm3, ymm4));
+ TEST_INSTRUCTION("C4E3ED5D8C358000000030" , vfmaddsubpd(ymm1, ymm2, ymm3, ptr(ebp, esi, 0, 128)));
+ TEST_INSTRUCTION("C4E3ED5D8C358000000030" , vfmaddsubpd(ymm1, ymm2, ymm3, ymmword_ptr(ebp, esi, 0, 128)));
+ TEST_INSTRUCTION("C4E36D5D8C2B8000000060" , vfmaddsubpd(ymm1, ymm2, ptr(ebx, ebp, 0, 128), ymm6));
+ TEST_INSTRUCTION("C4E36D5D8C2B8000000060" , vfmaddsubpd(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128), ymm6));
+ TEST_INSTRUCTION("C4E3E95CCC30" , vfmaddsubps(xmm1, xmm2, xmm3, xmm4));
+ TEST_INSTRUCTION("C4E3E95C8C358000000030" , vfmaddsubps(xmm1, xmm2, xmm3, ptr(ebp, esi, 0, 128)));
+ TEST_INSTRUCTION("C4E3E95C8C358000000030" , vfmaddsubps(xmm1, xmm2, xmm3, xmmword_ptr(ebp, esi, 0, 128)));
+ TEST_INSTRUCTION("C4E3695C8C2B8000000060" , vfmaddsubps(xmm1, xmm2, ptr(ebx, ebp, 0, 128), xmm6));
+ TEST_INSTRUCTION("C4E3695C8C2B8000000060" , vfmaddsubps(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128), xmm6));
+ TEST_INSTRUCTION("C4E3ED5CCC30" , vfmaddsubps(ymm1, ymm2, ymm3, ymm4));
+ TEST_INSTRUCTION("C4E3ED5C8C358000000030" , vfmaddsubps(ymm1, ymm2, ymm3, ptr(ebp, esi, 0, 128)));
+ TEST_INSTRUCTION("C4E3ED5C8C358000000030" , vfmaddsubps(ymm1, ymm2, ymm3, ymmword_ptr(ebp, esi, 0, 128)));
+ TEST_INSTRUCTION("C4E36D5C8C2B8000000060" , vfmaddsubps(ymm1, ymm2, ptr(ebx, ebp, 0, 128), ymm6));
+ TEST_INSTRUCTION("C4E36D5C8C2B8000000060" , vfmaddsubps(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128), ymm6));
+ TEST_INSTRUCTION("C4E2E99ACB" , vfmsub132pd(xmm1, xmm2, xmm3));
+ TEST_INSTRUCTION("C4E2E99A8C2B80000000" , vfmsub132pd(xmm1, xmm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C4E2E99A8C2B80000000" , vfmsub132pd(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C4E2ED9ACB" , vfmsub132pd(ymm1, ymm2, ymm3));
+ TEST_INSTRUCTION("C4E2ED9A8C2B80000000" , vfmsub132pd(ymm1, ymm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C4E2ED9A8C2B80000000" , vfmsub132pd(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F2ED489ACB" , vfmsub132pd(zmm1, zmm2, zmm3));
+ TEST_INSTRUCTION("62F2ED489A4C2B02" , vfmsub132pd(zmm1, zmm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F2ED489A4C2B02" , vfmsub132pd(zmm1, zmm2, zmmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C4E2699ACB" , vfmsub132ps(xmm1, xmm2, xmm3));
+ TEST_INSTRUCTION("C4E2699A8C2B80000000" , vfmsub132ps(xmm1, xmm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C4E2699A8C2B80000000" , vfmsub132ps(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C4E26D9ACB" , vfmsub132ps(ymm1, ymm2, ymm3));
+ TEST_INSTRUCTION("C4E26D9A8C2B80000000" , vfmsub132ps(ymm1, ymm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C4E26D9A8C2B80000000" , vfmsub132ps(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F26D489ACB" , vfmsub132ps(zmm1, zmm2, zmm3));
+ TEST_INSTRUCTION("62F26D489A4C2B02" , vfmsub132ps(zmm1, zmm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F26D489A4C2B02" , vfmsub132ps(zmm1, zmm2, zmmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C4E2E99BCB" , vfmsub132sd(xmm1, xmm2, xmm3));
+ TEST_INSTRUCTION("C4E2E99B8C2B80000000" , vfmsub132sd(xmm1, xmm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C4E2E99B8C2B80000000" , vfmsub132sd(xmm1, xmm2, qword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C4E2699BCB" , vfmsub132ss(xmm1, xmm2, xmm3));
+ TEST_INSTRUCTION("C4E2699B8C2B80000000" , vfmsub132ss(xmm1, xmm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C4E2699B8C2B80000000" , vfmsub132ss(xmm1, xmm2, dword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C4E2E9AACB" , vfmsub213pd(xmm1, xmm2, xmm3));
+ TEST_INSTRUCTION("C4E2E9AA8C2B80000000" , vfmsub213pd(xmm1, xmm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C4E2E9AA8C2B80000000" , vfmsub213pd(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C4E2EDAACB" , vfmsub213pd(ymm1, ymm2, ymm3));
+ TEST_INSTRUCTION("C4E2EDAA8C2B80000000" , vfmsub213pd(ymm1, ymm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C4E2EDAA8C2B80000000" , vfmsub213pd(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F2ED48AACB" , vfmsub213pd(zmm1, zmm2, zmm3));
+ TEST_INSTRUCTION("62F2ED48AA4C2B02" , vfmsub213pd(zmm1, zmm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F2ED48AA4C2B02" , vfmsub213pd(zmm1, zmm2, zmmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C4E269AACB" , vfmsub213ps(xmm1, xmm2, xmm3));
+ TEST_INSTRUCTION("C4E269AA8C2B80000000" , vfmsub213ps(xmm1, xmm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C4E269AA8C2B80000000" , vfmsub213ps(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C4E26DAACB" , vfmsub213ps(ymm1, ymm2, ymm3));
+ TEST_INSTRUCTION("C4E26DAA8C2B80000000" , vfmsub213ps(ymm1, ymm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C4E26DAA8C2B80000000" , vfmsub213ps(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F26D48AACB" , vfmsub213ps(zmm1, zmm2, zmm3));
+ TEST_INSTRUCTION("62F26D48AA4C2B02" , vfmsub213ps(zmm1, zmm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F26D48AA4C2B02" , vfmsub213ps(zmm1, zmm2, zmmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C4E2E9ABCB" , vfmsub213sd(xmm1, xmm2, xmm3));
+ TEST_INSTRUCTION("C4E2E9AB8C2B80000000" , vfmsub213sd(xmm1, xmm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C4E2E9AB8C2B80000000" , vfmsub213sd(xmm1, xmm2, qword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C4E269ABCB" , vfmsub213ss(xmm1, xmm2, xmm3));
+ TEST_INSTRUCTION("C4E269AB8C2B80000000" , vfmsub213ss(xmm1, xmm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C4E269AB8C2B80000000" , vfmsub213ss(xmm1, xmm2, dword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C4E2E9BACB" , vfmsub231pd(xmm1, xmm2, xmm3));
+ TEST_INSTRUCTION("C4E2E9BA8C2B80000000" , vfmsub231pd(xmm1, xmm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C4E2E9BA8C2B80000000" , vfmsub231pd(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C4E2EDBACB" , vfmsub231pd(ymm1, ymm2, ymm3));
+ TEST_INSTRUCTION("C4E2EDBA8C2B80000000" , vfmsub231pd(ymm1, ymm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C4E2EDBA8C2B80000000" , vfmsub231pd(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F2ED48BACB" , vfmsub231pd(zmm1, zmm2, zmm3));
+ TEST_INSTRUCTION("62F2ED48BA4C2B02" , vfmsub231pd(zmm1, zmm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F2ED48BA4C2B02" , vfmsub231pd(zmm1, zmm2, zmmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C4E269BACB" , vfmsub231ps(xmm1, xmm2, xmm3));
+ TEST_INSTRUCTION("C4E269BA8C2B80000000" , vfmsub231ps(xmm1, xmm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C4E269BA8C2B80000000" , vfmsub231ps(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C4E26DBACB" , vfmsub231ps(ymm1, ymm2, ymm3));
+ TEST_INSTRUCTION("C4E26DBA8C2B80000000" , vfmsub231ps(ymm1, ymm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C4E26DBA8C2B80000000" , vfmsub231ps(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F26D48BACB" , vfmsub231ps(zmm1, zmm2, zmm3));
+ TEST_INSTRUCTION("62F26D48BA4C2B02" , vfmsub231ps(zmm1, zmm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F26D48BA4C2B02" , vfmsub231ps(zmm1, zmm2, zmmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C4E2E9BBCB" , vfmsub231sd(xmm1, xmm2, xmm3));
+ TEST_INSTRUCTION("C4E2E9BB8C2B80000000" , vfmsub231sd(xmm1, xmm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C4E2E9BB8C2B80000000" , vfmsub231sd(xmm1, xmm2, qword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C4E269BBCB" , vfmsub231ss(xmm1, xmm2, xmm3));
+ TEST_INSTRUCTION("C4E269BB8C2B80000000" , vfmsub231ss(xmm1, xmm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C4E269BB8C2B80000000" , vfmsub231ss(xmm1, xmm2, dword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C4E2E997CB" , vfmsubadd132pd(xmm1, xmm2, xmm3));
+ TEST_INSTRUCTION("C4E2E9978C2B80000000" , vfmsubadd132pd(xmm1, xmm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C4E2E9978C2B80000000" , vfmsubadd132pd(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C4E2ED97CB" , vfmsubadd132pd(ymm1, ymm2, ymm3));
+ TEST_INSTRUCTION("C4E2ED978C2B80000000" , vfmsubadd132pd(ymm1, ymm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C4E2ED978C2B80000000" , vfmsubadd132pd(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F2ED4897CB" , vfmsubadd132pd(zmm1, zmm2, zmm3));
+ TEST_INSTRUCTION("62F2ED48974C2B02" , vfmsubadd132pd(zmm1, zmm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F2ED48974C2B02" , vfmsubadd132pd(zmm1, zmm2, zmmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C4E26997CB" , vfmsubadd132ps(xmm1, xmm2, xmm3));
+ TEST_INSTRUCTION("C4E269978C2B80000000" , vfmsubadd132ps(xmm1, xmm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C4E269978C2B80000000" , vfmsubadd132ps(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C4E26D97CB" , vfmsubadd132ps(ymm1, ymm2, ymm3));
+ TEST_INSTRUCTION("C4E26D978C2B80000000" , vfmsubadd132ps(ymm1, ymm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C4E26D978C2B80000000" , vfmsubadd132ps(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F26D4897CB" , vfmsubadd132ps(zmm1, zmm2, zmm3));
+ TEST_INSTRUCTION("62F26D48974C2B02" , vfmsubadd132ps(zmm1, zmm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F26D48974C2B02" , vfmsubadd132ps(zmm1, zmm2, zmmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C4E2E9A7CB" , vfmsubadd213pd(xmm1, xmm2, xmm3));
+ TEST_INSTRUCTION("C4E2E9A78C2B80000000" , vfmsubadd213pd(xmm1, xmm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C4E2E9A78C2B80000000" , vfmsubadd213pd(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C4E2EDA7CB" , vfmsubadd213pd(ymm1, ymm2, ymm3));
+ TEST_INSTRUCTION("C4E2EDA78C2B80000000" , vfmsubadd213pd(ymm1, ymm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C4E2EDA78C2B80000000" , vfmsubadd213pd(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F2ED48A7CB" , vfmsubadd213pd(zmm1, zmm2, zmm3));
+ TEST_INSTRUCTION("62F2ED48A74C2B02" , vfmsubadd213pd(zmm1, zmm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F2ED48A74C2B02" , vfmsubadd213pd(zmm1, zmm2, zmmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C4E269A7CB" , vfmsubadd213ps(xmm1, xmm2, xmm3));
+ TEST_INSTRUCTION("C4E269A78C2B80000000" , vfmsubadd213ps(xmm1, xmm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C4E269A78C2B80000000" , vfmsubadd213ps(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C4E26DA7CB" , vfmsubadd213ps(ymm1, ymm2, ymm3));
+ TEST_INSTRUCTION("C4E26DA78C2B80000000" , vfmsubadd213ps(ymm1, ymm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C4E26DA78C2B80000000" , vfmsubadd213ps(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F26D48A7CB" , vfmsubadd213ps(zmm1, zmm2, zmm3));
+ TEST_INSTRUCTION("62F26D48A74C2B02" , vfmsubadd213ps(zmm1, zmm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F26D48A74C2B02" , vfmsubadd213ps(zmm1, zmm2, zmmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C4E2E9B7CB" , vfmsubadd231pd(xmm1, xmm2, xmm3));
+ TEST_INSTRUCTION("C4E2E9B78C2B80000000" , vfmsubadd231pd(xmm1, xmm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C4E2E9B78C2B80000000" , vfmsubadd231pd(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C4E2EDB7CB" , vfmsubadd231pd(ymm1, ymm2, ymm3));
+ TEST_INSTRUCTION("C4E2EDB78C2B80000000" , vfmsubadd231pd(ymm1, ymm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C4E2EDB78C2B80000000" , vfmsubadd231pd(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F2ED48B7CB" , vfmsubadd231pd(zmm1, zmm2, zmm3));
+ TEST_INSTRUCTION("62F2ED48B74C2B02" , vfmsubadd231pd(zmm1, zmm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F2ED48B74C2B02" , vfmsubadd231pd(zmm1, zmm2, zmmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C4E269B7CB" , vfmsubadd231ps(xmm1, xmm2, xmm3));
+ TEST_INSTRUCTION("C4E269B78C2B80000000" , vfmsubadd231ps(xmm1, xmm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C4E269B78C2B80000000" , vfmsubadd231ps(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C4E26DB7CB" , vfmsubadd231ps(ymm1, ymm2, ymm3));
+ TEST_INSTRUCTION("C4E26DB78C2B80000000" , vfmsubadd231ps(ymm1, ymm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C4E26DB78C2B80000000" , vfmsubadd231ps(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F26D48B7CB" , vfmsubadd231ps(zmm1, zmm2, zmm3));
+ TEST_INSTRUCTION("62F26D48B74C2B02" , vfmsubadd231ps(zmm1, zmm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F26D48B74C2B02" , vfmsubadd231ps(zmm1, zmm2, zmmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C4E3E95FCC30" , vfmsubaddpd(xmm1, xmm2, xmm3, xmm4));
+ TEST_INSTRUCTION("C4E3E95F8C358000000030" , vfmsubaddpd(xmm1, xmm2, xmm3, ptr(ebp, esi, 0, 128)));
+ TEST_INSTRUCTION("C4E3E95F8C358000000030" , vfmsubaddpd(xmm1, xmm2, xmm3, xmmword_ptr(ebp, esi, 0, 128)));
+ TEST_INSTRUCTION("C4E3695F8C2B8000000060" , vfmsubaddpd(xmm1, xmm2, ptr(ebx, ebp, 0, 128), xmm6));
+ TEST_INSTRUCTION("C4E3695F8C2B8000000060" , vfmsubaddpd(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128), xmm6));
+ TEST_INSTRUCTION("C4E3ED5FCC30" , vfmsubaddpd(ymm1, ymm2, ymm3, ymm4));
+ TEST_INSTRUCTION("C4E3ED5F8C358000000030" , vfmsubaddpd(ymm1, ymm2, ymm3, ptr(ebp, esi, 0, 128)));
+ TEST_INSTRUCTION("C4E3ED5F8C358000000030" , vfmsubaddpd(ymm1, ymm2, ymm3, ymmword_ptr(ebp, esi, 0, 128)));
+ TEST_INSTRUCTION("C4E36D5F8C2B8000000060" , vfmsubaddpd(ymm1, ymm2, ptr(ebx, ebp, 0, 128), ymm6));
+ TEST_INSTRUCTION("C4E36D5F8C2B8000000060" , vfmsubaddpd(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128), ymm6));
+ TEST_INSTRUCTION("C4E3E95ECC30" , vfmsubaddps(xmm1, xmm2, xmm3, xmm4));
+ TEST_INSTRUCTION("C4E3E95E8C358000000030" , vfmsubaddps(xmm1, xmm2, xmm3, ptr(ebp, esi, 0, 128)));
+ TEST_INSTRUCTION("C4E3E95E8C358000000030" , vfmsubaddps(xmm1, xmm2, xmm3, xmmword_ptr(ebp, esi, 0, 128)));
+ TEST_INSTRUCTION("C4E3695E8C2B8000000060" , vfmsubaddps(xmm1, xmm2, ptr(ebx, ebp, 0, 128), xmm6));
+ TEST_INSTRUCTION("C4E3695E8C2B8000000060" , vfmsubaddps(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128), xmm6));
+ TEST_INSTRUCTION("C4E3ED5ECC30" , vfmsubaddps(ymm1, ymm2, ymm3, ymm4));
+ TEST_INSTRUCTION("C4E3ED5E8C358000000030" , vfmsubaddps(ymm1, ymm2, ymm3, ptr(ebp, esi, 0, 128)));
+ TEST_INSTRUCTION("C4E3ED5E8C358000000030" , vfmsubaddps(ymm1, ymm2, ymm3, ymmword_ptr(ebp, esi, 0, 128)));
+ TEST_INSTRUCTION("C4E36D5E8C2B8000000060" , vfmsubaddps(ymm1, ymm2, ptr(ebx, ebp, 0, 128), ymm6));
+ TEST_INSTRUCTION("C4E36D5E8C2B8000000060" , vfmsubaddps(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128), ymm6));
+ TEST_INSTRUCTION("C4E3E96DCC30" , vfmsubpd(xmm1, xmm2, xmm3, xmm4));
+ TEST_INSTRUCTION("C4E3E96D8C358000000030" , vfmsubpd(xmm1, xmm2, xmm3, ptr(ebp, esi, 0, 128)));
+ TEST_INSTRUCTION("C4E3E96D8C358000000030" , vfmsubpd(xmm1, xmm2, xmm3, xmmword_ptr(ebp, esi, 0, 128)));
+ TEST_INSTRUCTION("C4E3696D8C2B8000000060" , vfmsubpd(xmm1, xmm2, ptr(ebx, ebp, 0, 128), xmm6));
+ TEST_INSTRUCTION("C4E3696D8C2B8000000060" , vfmsubpd(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128), xmm6));
+ TEST_INSTRUCTION("C4E3ED6DCC30" , vfmsubpd(ymm1, ymm2, ymm3, ymm4));
+ TEST_INSTRUCTION("C4E3ED6D8C358000000030" , vfmsubpd(ymm1, ymm2, ymm3, ptr(ebp, esi, 0, 128)));
+ TEST_INSTRUCTION("C4E3ED6D8C358000000030" , vfmsubpd(ymm1, ymm2, ymm3, ymmword_ptr(ebp, esi, 0, 128)));
+ TEST_INSTRUCTION("C4E36D6D8C2B8000000060" , vfmsubpd(ymm1, ymm2, ptr(ebx, ebp, 0, 128), ymm6));
+ TEST_INSTRUCTION("C4E36D6D8C2B8000000060" , vfmsubpd(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128), ymm6));
+ TEST_INSTRUCTION("C4E3E96CCC30" , vfmsubps(xmm1, xmm2, xmm3, xmm4));
+ TEST_INSTRUCTION("C4E3E96C8C358000000030" , vfmsubps(xmm1, xmm2, xmm3, ptr(ebp, esi, 0, 128)));
+ TEST_INSTRUCTION("C4E3E96C8C358000000030" , vfmsubps(xmm1, xmm2, xmm3, xmmword_ptr(ebp, esi, 0, 128)));
+ TEST_INSTRUCTION("C4E3696C8C2B8000000060" , vfmsubps(xmm1, xmm2, ptr(ebx, ebp, 0, 128), xmm6));
+ TEST_INSTRUCTION("C4E3696C8C2B8000000060" , vfmsubps(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128), xmm6));
+ TEST_INSTRUCTION("C4E3ED6CCC30" , vfmsubps(ymm1, ymm2, ymm3, ymm4));
+ TEST_INSTRUCTION("C4E3ED6C8C358000000030" , vfmsubps(ymm1, ymm2, ymm3, ptr(ebp, esi, 0, 128)));
+ TEST_INSTRUCTION("C4E3ED6C8C358000000030" , vfmsubps(ymm1, ymm2, ymm3, ymmword_ptr(ebp, esi, 0, 128)));
+ TEST_INSTRUCTION("C4E36D6C8C2B8000000060" , vfmsubps(ymm1, ymm2, ptr(ebx, ebp, 0, 128), ymm6));
+ TEST_INSTRUCTION("C4E36D6C8C2B8000000060" , vfmsubps(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128), ymm6));
+ TEST_INSTRUCTION("C4E3E96FCC30" , vfmsubsd(xmm1, xmm2, xmm3, xmm4));
+ TEST_INSTRUCTION("C4E3E96F8C358000000030" , vfmsubsd(xmm1, xmm2, xmm3, ptr(ebp, esi, 0, 128)));
+ TEST_INSTRUCTION("C4E3E96F8C358000000030" , vfmsubsd(xmm1, xmm2, xmm3, qword_ptr(ebp, esi, 0, 128)));
+ TEST_INSTRUCTION("C4E3696F8C2B8000000060" , vfmsubsd(xmm1, xmm2, ptr(ebx, ebp, 0, 128), xmm6));
+ TEST_INSTRUCTION("C4E3696F8C2B8000000060" , vfmsubsd(xmm1, xmm2, qword_ptr(ebx, ebp, 0, 128), xmm6));
+ TEST_INSTRUCTION("C4E3E96ECC30" , vfmsubss(xmm1, xmm2, xmm3, xmm4));
+ TEST_INSTRUCTION("C4E3E96E8C358000000030" , vfmsubss(xmm1, xmm2, xmm3, ptr(ebp, esi, 0, 128)));
+ TEST_INSTRUCTION("C4E3E96E8C358000000030" , vfmsubss(xmm1, xmm2, xmm3, dword_ptr(ebp, esi, 0, 128)));
+ TEST_INSTRUCTION("C4E3696E8C2B8000000060" , vfmsubss(xmm1, xmm2, ptr(ebx, ebp, 0, 128), xmm6));
+ TEST_INSTRUCTION("C4E3696E8C2B8000000060" , vfmsubss(xmm1, xmm2, dword_ptr(ebx, ebp, 0, 128), xmm6));
+ TEST_INSTRUCTION("C4E2E99CCB" , vfnmadd132pd(xmm1, xmm2, xmm3));
+ TEST_INSTRUCTION("C4E2E99C8C2B80000000" , vfnmadd132pd(xmm1, xmm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C4E2E99C8C2B80000000" , vfnmadd132pd(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C4E2ED9CCB" , vfnmadd132pd(ymm1, ymm2, ymm3));
+ TEST_INSTRUCTION("C4E2ED9C8C2B80000000" , vfnmadd132pd(ymm1, ymm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C4E2ED9C8C2B80000000" , vfnmadd132pd(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F2ED489CCB" , vfnmadd132pd(zmm1, zmm2, zmm3));
+ TEST_INSTRUCTION("62F2ED489C4C2B02" , vfnmadd132pd(zmm1, zmm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F2ED489C4C2B02" , vfnmadd132pd(zmm1, zmm2, zmmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C4E2699CCB" , vfnmadd132ps(xmm1, xmm2, xmm3));
+ TEST_INSTRUCTION("C4E2699C8C2B80000000" , vfnmadd132ps(xmm1, xmm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C4E2699C8C2B80000000" , vfnmadd132ps(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C4E26D9CCB" , vfnmadd132ps(ymm1, ymm2, ymm3));
+ TEST_INSTRUCTION("C4E26D9C8C2B80000000" , vfnmadd132ps(ymm1, ymm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C4E26D9C8C2B80000000" , vfnmadd132ps(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F26D489CCB" , vfnmadd132ps(zmm1, zmm2, zmm3));
+ TEST_INSTRUCTION("62F26D489C4C2B02" , vfnmadd132ps(zmm1, zmm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F26D489C4C2B02" , vfnmadd132ps(zmm1, zmm2, zmmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C4E2E99DCB" , vfnmadd132sd(xmm1, xmm2, xmm3));
+ TEST_INSTRUCTION("C4E2E99D8C2B80000000" , vfnmadd132sd(xmm1, xmm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C4E2E99D8C2B80000000" , vfnmadd132sd(xmm1, xmm2, qword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C4E2699DCB" , vfnmadd132ss(xmm1, xmm2, xmm3));
+ TEST_INSTRUCTION("C4E2699D8C2B80000000" , vfnmadd132ss(xmm1, xmm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C4E2699D8C2B80000000" , vfnmadd132ss(xmm1, xmm2, dword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C4E2E9ACCB" , vfnmadd213pd(xmm1, xmm2, xmm3));
+ TEST_INSTRUCTION("C4E2E9AC8C2B80000000" , vfnmadd213pd(xmm1, xmm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C4E2E9AC8C2B80000000" , vfnmadd213pd(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C4E2EDACCB" , vfnmadd213pd(ymm1, ymm2, ymm3));
+ TEST_INSTRUCTION("C4E2EDAC8C2B80000000" , vfnmadd213pd(ymm1, ymm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C4E2EDAC8C2B80000000" , vfnmadd213pd(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F2ED48ACCB" , vfnmadd213pd(zmm1, zmm2, zmm3));
+ TEST_INSTRUCTION("62F2ED48AC4C2B02" , vfnmadd213pd(zmm1, zmm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F2ED48AC4C2B02" , vfnmadd213pd(zmm1, zmm2, zmmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C4E269ACCB" , vfnmadd213ps(xmm1, xmm2, xmm3));
+ TEST_INSTRUCTION("C4E269AC8C2B80000000" , vfnmadd213ps(xmm1, xmm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C4E269AC8C2B80000000" , vfnmadd213ps(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C4E26DACCB" , vfnmadd213ps(ymm1, ymm2, ymm3));
+ TEST_INSTRUCTION("C4E26DAC8C2B80000000" , vfnmadd213ps(ymm1, ymm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C4E26DAC8C2B80000000" , vfnmadd213ps(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F26D48ACCB" , vfnmadd213ps(zmm1, zmm2, zmm3));
+ TEST_INSTRUCTION("62F26D48AC4C2B02" , vfnmadd213ps(zmm1, zmm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F26D48AC4C2B02" , vfnmadd213ps(zmm1, zmm2, zmmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C4E2E9ADCB" , vfnmadd213sd(xmm1, xmm2, xmm3));
+ TEST_INSTRUCTION("C4E2E9AD8C2B80000000" , vfnmadd213sd(xmm1, xmm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C4E2E9AD8C2B80000000" , vfnmadd213sd(xmm1, xmm2, qword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C4E269ADCB" , vfnmadd213ss(xmm1, xmm2, xmm3));
+ TEST_INSTRUCTION("C4E269AD8C2B80000000" , vfnmadd213ss(xmm1, xmm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C4E269AD8C2B80000000" , vfnmadd213ss(xmm1, xmm2, dword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C4E2E9BCCB" , vfnmadd231pd(xmm1, xmm2, xmm3));
+ TEST_INSTRUCTION("C4E2E9BC8C2B80000000" , vfnmadd231pd(xmm1, xmm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C4E2E9BC8C2B80000000" , vfnmadd231pd(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C4E2EDBCCB" , vfnmadd231pd(ymm1, ymm2, ymm3));
+ TEST_INSTRUCTION("C4E2EDBC8C2B80000000" , vfnmadd231pd(ymm1, ymm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C4E2EDBC8C2B80000000" , vfnmadd231pd(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F2ED48BCCB" , vfnmadd231pd(zmm1, zmm2, zmm3));
+ TEST_INSTRUCTION("62F2ED48BC4C2B02" , vfnmadd231pd(zmm1, zmm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F2ED48BC4C2B02" , vfnmadd231pd(zmm1, zmm2, zmmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C4E269BCCB" , vfnmadd231ps(xmm1, xmm2, xmm3));
+ TEST_INSTRUCTION("C4E269BC8C2B80000000" , vfnmadd231ps(xmm1, xmm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C4E269BC8C2B80000000" , vfnmadd231ps(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C4E26DBCCB" , vfnmadd231ps(ymm1, ymm2, ymm3));
+ TEST_INSTRUCTION("C4E26DBC8C2B80000000" , vfnmadd231ps(ymm1, ymm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C4E26DBC8C2B80000000" , vfnmadd231ps(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F26D48BCCB" , vfnmadd231ps(zmm1, zmm2, zmm3));
+ TEST_INSTRUCTION("62F26D48BC4C2B02" , vfnmadd231ps(zmm1, zmm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F26D48BC4C2B02" , vfnmadd231ps(zmm1, zmm2, zmmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C4E2E9BDCB" , vfnmadd231sd(xmm1, xmm2, xmm3));
+ TEST_INSTRUCTION("C4E2E9BD8C2B80000000" , vfnmadd231sd(xmm1, xmm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C4E2E9BD8C2B80000000" , vfnmadd231sd(xmm1, xmm2, qword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C4E269BDCB" , vfnmadd231ss(xmm1, xmm2, xmm3));
+ TEST_INSTRUCTION("C4E269BD8C2B80000000" , vfnmadd231ss(xmm1, xmm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C4E269BD8C2B80000000" , vfnmadd231ss(xmm1, xmm2, dword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C4E3E979CC30" , vfnmaddpd(xmm1, xmm2, xmm3, xmm4));
+ TEST_INSTRUCTION("C4E3E9798C358000000030" , vfnmaddpd(xmm1, xmm2, xmm3, ptr(ebp, esi, 0, 128)));
+ TEST_INSTRUCTION("C4E3E9798C358000000030" , vfnmaddpd(xmm1, xmm2, xmm3, xmmword_ptr(ebp, esi, 0, 128)));
+ TEST_INSTRUCTION("C4E369798C2B8000000060" , vfnmaddpd(xmm1, xmm2, ptr(ebx, ebp, 0, 128), xmm6));
+ TEST_INSTRUCTION("C4E369798C2B8000000060" , vfnmaddpd(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128), xmm6));
+ TEST_INSTRUCTION("C4E3ED79CC30" , vfnmaddpd(ymm1, ymm2, ymm3, ymm4));
+ TEST_INSTRUCTION("C4E3ED798C358000000030" , vfnmaddpd(ymm1, ymm2, ymm3, ptr(ebp, esi, 0, 128)));
+ TEST_INSTRUCTION("C4E3ED798C358000000030" , vfnmaddpd(ymm1, ymm2, ymm3, ymmword_ptr(ebp, esi, 0, 128)));
+ TEST_INSTRUCTION("C4E36D798C2B8000000060" , vfnmaddpd(ymm1, ymm2, ptr(ebx, ebp, 0, 128), ymm6));
+ TEST_INSTRUCTION("C4E36D798C2B8000000060" , vfnmaddpd(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128), ymm6));
+ TEST_INSTRUCTION("C4E3E978CC30" , vfnmaddps(xmm1, xmm2, xmm3, xmm4));
+ TEST_INSTRUCTION("C4E3E9788C358000000030" , vfnmaddps(xmm1, xmm2, xmm3, ptr(ebp, esi, 0, 128)));
+ TEST_INSTRUCTION("C4E3E9788C358000000030" , vfnmaddps(xmm1, xmm2, xmm3, xmmword_ptr(ebp, esi, 0, 128)));
+ TEST_INSTRUCTION("C4E369788C2B8000000060" , vfnmaddps(xmm1, xmm2, ptr(ebx, ebp, 0, 128), xmm6));
+ TEST_INSTRUCTION("C4E369788C2B8000000060" , vfnmaddps(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128), xmm6));
+ TEST_INSTRUCTION("C4E3ED78CC30" , vfnmaddps(ymm1, ymm2, ymm3, ymm4));
+ TEST_INSTRUCTION("C4E3ED788C358000000030" , vfnmaddps(ymm1, ymm2, ymm3, ptr(ebp, esi, 0, 128)));
+ TEST_INSTRUCTION("C4E3ED788C358000000030" , vfnmaddps(ymm1, ymm2, ymm3, ymmword_ptr(ebp, esi, 0, 128)));
+ TEST_INSTRUCTION("C4E36D788C2B8000000060" , vfnmaddps(ymm1, ymm2, ptr(ebx, ebp, 0, 128), ymm6));
+ TEST_INSTRUCTION("C4E36D788C2B8000000060" , vfnmaddps(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128), ymm6));
+ TEST_INSTRUCTION("C4E3E97BCC30" , vfnmaddsd(xmm1, xmm2, xmm3, xmm4));
+ TEST_INSTRUCTION("C4E3E97B8C358000000030" , vfnmaddsd(xmm1, xmm2, xmm3, ptr(ebp, esi, 0, 128)));
+ TEST_INSTRUCTION("C4E3E97B8C358000000030" , vfnmaddsd(xmm1, xmm2, xmm3, qword_ptr(ebp, esi, 0, 128)));
+ TEST_INSTRUCTION("C4E3697B8C2B8000000060" , vfnmaddsd(xmm1, xmm2, ptr(ebx, ebp, 0, 128), xmm6));
+ TEST_INSTRUCTION("C4E3697B8C2B8000000060" , vfnmaddsd(xmm1, xmm2, qword_ptr(ebx, ebp, 0, 128), xmm6));
+ TEST_INSTRUCTION("C4E3E97ACC30" , vfnmaddss(xmm1, xmm2, xmm3, xmm4));
+ TEST_INSTRUCTION("C4E3E97A8C358000000030" , vfnmaddss(xmm1, xmm2, xmm3, ptr(ebp, esi, 0, 128)));
+ TEST_INSTRUCTION("C4E3E97A8C358000000030" , vfnmaddss(xmm1, xmm2, xmm3, dword_ptr(ebp, esi, 0, 128)));
+ TEST_INSTRUCTION("C4E3697A8C2B8000000060" , vfnmaddss(xmm1, xmm2, ptr(ebx, ebp, 0, 128), xmm6));
+ TEST_INSTRUCTION("C4E3697A8C2B8000000060" , vfnmaddss(xmm1, xmm2, dword_ptr(ebx, ebp, 0, 128), xmm6));
+ TEST_INSTRUCTION("C4E2E99ECB" , vfnmsub132pd(xmm1, xmm2, xmm3));
+ TEST_INSTRUCTION("C4E2E99E8C2B80000000" , vfnmsub132pd(xmm1, xmm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C4E2E99E8C2B80000000" , vfnmsub132pd(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C4E2ED9ECB" , vfnmsub132pd(ymm1, ymm2, ymm3));
+ TEST_INSTRUCTION("C4E2ED9E8C2B80000000" , vfnmsub132pd(ymm1, ymm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C4E2ED9E8C2B80000000" , vfnmsub132pd(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F2ED489ECB" , vfnmsub132pd(zmm1, zmm2, zmm3));
+ TEST_INSTRUCTION("62F2ED489E4C2B02" , vfnmsub132pd(zmm1, zmm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F2ED489E4C2B02" , vfnmsub132pd(zmm1, zmm2, zmmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C4E2699ECB" , vfnmsub132ps(xmm1, xmm2, xmm3));
+ TEST_INSTRUCTION("C4E2699E8C2B80000000" , vfnmsub132ps(xmm1, xmm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C4E2699E8C2B80000000" , vfnmsub132ps(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C4E26D9ECB" , vfnmsub132ps(ymm1, ymm2, ymm3));
+ TEST_INSTRUCTION("C4E26D9E8C2B80000000" , vfnmsub132ps(ymm1, ymm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C4E26D9E8C2B80000000" , vfnmsub132ps(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F26D489ECB" , vfnmsub132ps(zmm1, zmm2, zmm3));
+ TEST_INSTRUCTION("62F26D489E4C2B02" , vfnmsub132ps(zmm1, zmm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F26D489E4C2B02" , vfnmsub132ps(zmm1, zmm2, zmmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C4E2E99FCB" , vfnmsub132sd(xmm1, xmm2, xmm3));
+ TEST_INSTRUCTION("C4E2E99F8C2B80000000" , vfnmsub132sd(xmm1, xmm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C4E2E99F8C2B80000000" , vfnmsub132sd(xmm1, xmm2, qword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C4E2699FCB" , vfnmsub132ss(xmm1, xmm2, xmm3));
+ TEST_INSTRUCTION("C4E2699F8C2B80000000" , vfnmsub132ss(xmm1, xmm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C4E2699F8C2B80000000" , vfnmsub132ss(xmm1, xmm2, dword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C4E2E9AECB" , vfnmsub213pd(xmm1, xmm2, xmm3));
+ TEST_INSTRUCTION("C4E2E9AE8C2B80000000" , vfnmsub213pd(xmm1, xmm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C4E2E9AE8C2B80000000" , vfnmsub213pd(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C4E2EDAECB" , vfnmsub213pd(ymm1, ymm2, ymm3));
+ TEST_INSTRUCTION("C4E2EDAE8C2B80000000" , vfnmsub213pd(ymm1, ymm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C4E2EDAE8C2B80000000" , vfnmsub213pd(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F2ED48AECB" , vfnmsub213pd(zmm1, zmm2, zmm3));
+ TEST_INSTRUCTION("62F2ED48AE4C2B02" , vfnmsub213pd(zmm1, zmm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F2ED48AE4C2B02" , vfnmsub213pd(zmm1, zmm2, zmmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C4E269AECB" , vfnmsub213ps(xmm1, xmm2, xmm3));
+ TEST_INSTRUCTION("C4E269AE8C2B80000000" , vfnmsub213ps(xmm1, xmm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C4E269AE8C2B80000000" , vfnmsub213ps(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C4E26DAECB" , vfnmsub213ps(ymm1, ymm2, ymm3));
+ TEST_INSTRUCTION("C4E26DAE8C2B80000000" , vfnmsub213ps(ymm1, ymm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C4E26DAE8C2B80000000" , vfnmsub213ps(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F26D48AECB" , vfnmsub213ps(zmm1, zmm2, zmm3));
+ TEST_INSTRUCTION("62F26D48AE4C2B02" , vfnmsub213ps(zmm1, zmm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F26D48AE4C2B02" , vfnmsub213ps(zmm1, zmm2, zmmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C4E2E9AFCB" , vfnmsub213sd(xmm1, xmm2, xmm3));
+ TEST_INSTRUCTION("C4E2E9AF8C2B80000000" , vfnmsub213sd(xmm1, xmm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C4E2E9AF8C2B80000000" , vfnmsub213sd(xmm1, xmm2, qword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C4E269AFCB" , vfnmsub213ss(xmm1, xmm2, xmm3));
+ TEST_INSTRUCTION("C4E269AF8C2B80000000" , vfnmsub213ss(xmm1, xmm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C4E269AF8C2B80000000" , vfnmsub213ss(xmm1, xmm2, dword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C4E2E9BECB" , vfnmsub231pd(xmm1, xmm2, xmm3));
+ TEST_INSTRUCTION("C4E2E9BE8C2B80000000" , vfnmsub231pd(xmm1, xmm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C4E2E9BE8C2B80000000" , vfnmsub231pd(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C4E2EDBECB" , vfnmsub231pd(ymm1, ymm2, ymm3));
+ TEST_INSTRUCTION("C4E2EDBE8C2B80000000" , vfnmsub231pd(ymm1, ymm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C4E2EDBE8C2B80000000" , vfnmsub231pd(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F2ED48BECB" , vfnmsub231pd(zmm1, zmm2, zmm3));
+ TEST_INSTRUCTION("62F2ED48BE4C2B02" , vfnmsub231pd(zmm1, zmm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F2ED48BE4C2B02" , vfnmsub231pd(zmm1, zmm2, zmmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C4E269BECB" , vfnmsub231ps(xmm1, xmm2, xmm3));
+ TEST_INSTRUCTION("C4E269BE8C2B80000000" , vfnmsub231ps(xmm1, xmm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C4E269BE8C2B80000000" , vfnmsub231ps(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C4E26DBECB" , vfnmsub231ps(ymm1, ymm2, ymm3));
+ TEST_INSTRUCTION("C4E26DBE8C2B80000000" , vfnmsub231ps(ymm1, ymm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C4E26DBE8C2B80000000" , vfnmsub231ps(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F26D48BECB" , vfnmsub231ps(zmm1, zmm2, zmm3));
+ TEST_INSTRUCTION("62F26D48BE4C2B02" , vfnmsub231ps(zmm1, zmm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F26D48BE4C2B02" , vfnmsub231ps(zmm1, zmm2, zmmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C4E2E9BFCB" , vfnmsub231sd(xmm1, xmm2, xmm3));
+ TEST_INSTRUCTION("C4E2E9BF8C2B80000000" , vfnmsub231sd(xmm1, xmm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C4E2E9BF8C2B80000000" , vfnmsub231sd(xmm1, xmm2, qword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C4E269BFCB" , vfnmsub231ss(xmm1, xmm2, xmm3));
+ TEST_INSTRUCTION("C4E269BF8C2B80000000" , vfnmsub231ss(xmm1, xmm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C4E269BF8C2B80000000" , vfnmsub231ss(xmm1, xmm2, dword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C4E3E97DCC30" , vfnmsubpd(xmm1, xmm2, xmm3, xmm4));
+ TEST_INSTRUCTION("C4E3E97D8C358000000030" , vfnmsubpd(xmm1, xmm2, xmm3, ptr(ebp, esi, 0, 128)));
+ TEST_INSTRUCTION("C4E3E97D8C358000000030" , vfnmsubpd(xmm1, xmm2, xmm3, xmmword_ptr(ebp, esi, 0, 128)));
+ TEST_INSTRUCTION("C4E3697D8C2B8000000060" , vfnmsubpd(xmm1, xmm2, ptr(ebx, ebp, 0, 128), xmm6));
+ TEST_INSTRUCTION("C4E3697D8C2B8000000060" , vfnmsubpd(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128), xmm6));
+ TEST_INSTRUCTION("C4E3ED7DCC30" , vfnmsubpd(ymm1, ymm2, ymm3, ymm4));
+ TEST_INSTRUCTION("C4E3ED7D8C358000000030" , vfnmsubpd(ymm1, ymm2, ymm3, ptr(ebp, esi, 0, 128)));
+ TEST_INSTRUCTION("C4E3ED7D8C358000000030" , vfnmsubpd(ymm1, ymm2, ymm3, ymmword_ptr(ebp, esi, 0, 128)));
+ TEST_INSTRUCTION("C4E36D7D8C2B8000000060" , vfnmsubpd(ymm1, ymm2, ptr(ebx, ebp, 0, 128), ymm6));
+ TEST_INSTRUCTION("C4E36D7D8C2B8000000060" , vfnmsubpd(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128), ymm6));
+ TEST_INSTRUCTION("C4E3E97CCC30" , vfnmsubps(xmm1, xmm2, xmm3, xmm4));
+ TEST_INSTRUCTION("C4E3E97C8C358000000030" , vfnmsubps(xmm1, xmm2, xmm3, ptr(ebp, esi, 0, 128)));
+ TEST_INSTRUCTION("C4E3E97C8C358000000030" , vfnmsubps(xmm1, xmm2, xmm3, xmmword_ptr(ebp, esi, 0, 128)));
+ TEST_INSTRUCTION("C4E3697C8C2B8000000060" , vfnmsubps(xmm1, xmm2, ptr(ebx, ebp, 0, 128), xmm6));
+ TEST_INSTRUCTION("C4E3697C8C2B8000000060" , vfnmsubps(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128), xmm6));
+ TEST_INSTRUCTION("C4E3ED7CCC30" , vfnmsubps(ymm1, ymm2, ymm3, ymm4));
+ TEST_INSTRUCTION("C4E3ED7C8C358000000030" , vfnmsubps(ymm1, ymm2, ymm3, ptr(ebp, esi, 0, 128)));
+ TEST_INSTRUCTION("C4E3ED7C8C358000000030" , vfnmsubps(ymm1, ymm2, ymm3, ymmword_ptr(ebp, esi, 0, 128)));
+ TEST_INSTRUCTION("C4E36D7C8C2B8000000060" , vfnmsubps(ymm1, ymm2, ptr(ebx, ebp, 0, 128), ymm6));
+ TEST_INSTRUCTION("C4E36D7C8C2B8000000060" , vfnmsubps(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128), ymm6));
+ TEST_INSTRUCTION("C4E3E97FCC30" , vfnmsubsd(xmm1, xmm2, xmm3, xmm4));
+ TEST_INSTRUCTION("C4E3E97F8C358000000030" , vfnmsubsd(xmm1, xmm2, xmm3, ptr(ebp, esi, 0, 128)));
+ TEST_INSTRUCTION("C4E3E97F8C358000000030" , vfnmsubsd(xmm1, xmm2, xmm3, qword_ptr(ebp, esi, 0, 128)));
+ TEST_INSTRUCTION("C4E3697F8C2B8000000060" , vfnmsubsd(xmm1, xmm2, ptr(ebx, ebp, 0, 128), xmm6));
+ TEST_INSTRUCTION("C4E3697F8C2B8000000060" , vfnmsubsd(xmm1, xmm2, qword_ptr(ebx, ebp, 0, 128), xmm6));
+ TEST_INSTRUCTION("C4E3E97ECC30" , vfnmsubss(xmm1, xmm2, xmm3, xmm4));
+ TEST_INSTRUCTION("C4E3E97E8C358000000030" , vfnmsubss(xmm1, xmm2, xmm3, ptr(ebp, esi, 0, 128)));
+ TEST_INSTRUCTION("C4E3E97E8C358000000030" , vfnmsubss(xmm1, xmm2, xmm3, dword_ptr(ebp, esi, 0, 128)));
+ TEST_INSTRUCTION("C4E3697E8C2B8000000060" , vfnmsubss(xmm1, xmm2, ptr(ebx, ebp, 0, 128), xmm6));
+ TEST_INSTRUCTION("C4E3697E8C2B8000000060" , vfnmsubss(xmm1, xmm2, dword_ptr(ebx, ebp, 0, 128), xmm6));
+ TEST_INSTRUCTION("62F3FD0866CA01" , vfpclasspd(k1, xmm2, 1));
+ TEST_INSTRUCTION("62F3FD2866CA01" , vfpclasspd(k1, ymm2, 1));
+ TEST_INSTRUCTION("62F3FD4866CA01" , vfpclasspd(k1, zmm2, 1));
+ TEST_INSTRUCTION("62F3FD08664C1A0801" , vfpclasspd(k1, xmmword_ptr(edx, ebx, 0, 128), 1));
+ TEST_INSTRUCTION("62F3FD28664C1A0401" , vfpclasspd(k1, ymmword_ptr(edx, ebx, 0, 128), 1));
+ TEST_INSTRUCTION("62F3FD48664C1A0201" , vfpclasspd(k1, zmmword_ptr(edx, ebx, 0, 128), 1));
+ TEST_INSTRUCTION("62F37D0866CA01" , vfpclassps(k1, xmm2, 1));
+ TEST_INSTRUCTION("62F37D2866CA01" , vfpclassps(k1, ymm2, 1));
+ TEST_INSTRUCTION("62F37D4866CA01" , vfpclassps(k1, zmm2, 1));
+ TEST_INSTRUCTION("62F37D08664C1A0801" , vfpclassps(k1, xmmword_ptr(edx, ebx, 0, 128), 1));
+ TEST_INSTRUCTION("62F37D28664C1A0401" , vfpclassps(k1, ymmword_ptr(edx, ebx, 0, 128), 1));
+ TEST_INSTRUCTION("62F37D48664C1A0201" , vfpclassps(k1, zmmword_ptr(edx, ebx, 0, 128), 1));
+ TEST_INSTRUCTION("62F3FD0867CA01" , vfpclasssd(k1, xmm2, 1));
+ TEST_INSTRUCTION("62F3FD08674C1A1001" , vfpclasssd(k1, ptr(edx, ebx, 0, 128), 1));
+ TEST_INSTRUCTION("62F3FD08674C1A1001" , vfpclasssd(k1, qword_ptr(edx, ebx, 0, 128), 1));
+ TEST_INSTRUCTION("62F37D0867CA01" , vfpclassss(k1, xmm2, 1));
+ TEST_INSTRUCTION("62F37D08674C1A2001" , vfpclassss(k1, ptr(edx, ebx, 0, 128), 1));
+ TEST_INSTRUCTION("62F37D08674C1A2001" , vfpclassss(k1, dword_ptr(edx, ebx, 0, 128), 1));
+ TEST_INSTRUCTION("8FE97881CA" , vfrczpd(xmm1, xmm2));
+ TEST_INSTRUCTION("8FE978818C1A80000000" , vfrczpd(xmm1, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("8FE978818C1A80000000" , vfrczpd(xmm1, xmmword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("8FE97C81CA" , vfrczpd(ymm1, ymm2));
+ TEST_INSTRUCTION("8FE97C818C1A80000000" , vfrczpd(ymm1, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("8FE97C818C1A80000000" , vfrczpd(ymm1, ymmword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("8FE97880CA" , vfrczps(xmm1, xmm2));
+ TEST_INSTRUCTION("8FE978808C1A80000000" , vfrczps(xmm1, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("8FE978808C1A80000000" , vfrczps(xmm1, xmmword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("8FE97C80CA" , vfrczps(ymm1, ymm2));
+ TEST_INSTRUCTION("8FE97C808C1A80000000" , vfrczps(ymm1, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("8FE97C808C1A80000000" , vfrczps(ymm1, ymmword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("8FE97883CA" , vfrczsd(xmm1, xmm2));
+ TEST_INSTRUCTION("8FE978838C1A80000000" , vfrczsd(xmm1, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("8FE978838C1A80000000" , vfrczsd(xmm1, qword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("8FE97882CA" , vfrczss(xmm1, xmm2));
+ TEST_INSTRUCTION("8FE978828C1A80000000" , vfrczss(xmm1, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("8FE978828C1A80000000" , vfrczss(xmm1, dword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("C4E2D9928C1A80000000" , vgatherdpd(xmm1, ptr(edx, xmm3, 0, 128), xmm4));
+ TEST_INSTRUCTION("C4E2DD928C1A80000000" , vgatherdpd(ymm1, ptr(edx, xmm3, 0, 128), ymm4));
+ TEST_INSTRUCTION("62F2FD09924C1A10" , k(k1).vgatherdpd(xmm1, ptr(edx, xmm3, 0, 128)));
+ TEST_INSTRUCTION("62F2FD29924C1A10" , k(k1).vgatherdpd(ymm1, ptr(edx, xmm3, 0, 128)));
+ TEST_INSTRUCTION("62F2FD49924C1A10" , k(k1).vgatherdpd(zmm1, ptr(edx, ymm3, 0, 128)));
+ TEST_INSTRUCTION("C4E259928C1A80000000" , vgatherdps(xmm1, ptr(edx, xmm3, 0, 128), xmm4));
+ TEST_INSTRUCTION("C4E25D928C1A80000000" , vgatherdps(ymm1, ptr(edx, ymm3, 0, 128), ymm4));
+ TEST_INSTRUCTION("62F27D09924C1A20" , k(k1).vgatherdps(xmm1, ptr(edx, xmm3, 0, 128)));
+ TEST_INSTRUCTION("62F27D29924C1A20" , k(k1).vgatherdps(ymm1, ptr(edx, ymm3, 0, 128)));
+ TEST_INSTRUCTION("62F27D49924C1A20" , k(k1).vgatherdps(zmm1, ptr(edx, zmm3, 0, 128)));
+ TEST_INSTRUCTION("62F2FD49C64C1110" , k(k1).vgatherpf0dpd(ptr(ecx, ymm2, 0, 128)));
+ TEST_INSTRUCTION("62F27D49C64C1120" , k(k1).vgatherpf0dps(ptr(ecx, zmm2, 0, 128)));
+ TEST_INSTRUCTION("62F2FD49C74C1110" , k(k1).vgatherpf0qpd(ptr(ecx, zmm2, 0, 128)));
+ TEST_INSTRUCTION("62F27D49C74C1120" , k(k1).vgatherpf0qps(ptr(ecx, zmm2, 0, 128)));
+ TEST_INSTRUCTION("62F2FD49C6541110" , k(k1).vgatherpf1dpd(ptr(ecx, ymm2, 0, 128)));
+ TEST_INSTRUCTION("62F27D49C6541120" , k(k1).vgatherpf1dps(ptr(ecx, zmm2, 0, 128)));
+ TEST_INSTRUCTION("62F2FD49C7541110" , k(k1).vgatherpf1qpd(ptr(ecx, zmm2, 0, 128)));
+ TEST_INSTRUCTION("62F27D49C7541120" , k(k1).vgatherpf1qps(ptr(ecx, zmm2, 0, 128)));
+ TEST_INSTRUCTION("C4E2D9938C1A80000000" , vgatherqpd(xmm1, ptr(edx, xmm3, 0, 128), xmm4));
+ TEST_INSTRUCTION("C4E2DD938C1A80000000" , vgatherqpd(ymm1, ptr(edx, ymm3, 0, 128), ymm4));
+ TEST_INSTRUCTION("62F2FD09934C1A10" , k(k1).vgatherqpd(xmm1, ptr(edx, xmm3, 0, 128)));
+ TEST_INSTRUCTION("62F2FD29934C1A10" , k(k1).vgatherqpd(ymm1, ptr(edx, ymm3, 0, 128)));
+ TEST_INSTRUCTION("62F2FD49934C1A10" , k(k1).vgatherqpd(zmm1, ptr(edx, zmm3, 0, 128)));
+ TEST_INSTRUCTION("C4E259938C1A80000000" , vgatherqps(xmm1, ptr(edx, xmm3, 0, 128), xmm4));
+ TEST_INSTRUCTION("C4E25D938C1A80000000" , vgatherqps(xmm1, ptr(edx, ymm3, 0, 128), xmm4));
+ TEST_INSTRUCTION("62F27D09934C1A20" , k(k1).vgatherqps(xmm1, ptr(edx, xmm3, 0, 128)));
+ TEST_INSTRUCTION("62F27D29934C1A20" , k(k1).vgatherqps(xmm1, ptr(edx, ymm3, 0, 128)));
+ TEST_INSTRUCTION("62F27D49934C1A20" , k(k1).vgatherqps(ymm1, ptr(edx, zmm3, 0, 128)));
+ TEST_INSTRUCTION("62F2FD0842CA" , vgetexppd(xmm1, xmm2));
+ TEST_INSTRUCTION("62F2FD08424C1A08" , vgetexppd(xmm1, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("62F2FD08424C1A08" , vgetexppd(xmm1, xmmword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("62F2FD2842CA" , vgetexppd(ymm1, ymm2));
+ TEST_INSTRUCTION("62F2FD28424C1A04" , vgetexppd(ymm1, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("62F2FD28424C1A04" , vgetexppd(ymm1, ymmword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("62F2FD4842CA" , vgetexppd(zmm1, zmm2));
+ TEST_INSTRUCTION("62F2FD48424C1A02" , vgetexppd(zmm1, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("62F2FD48424C1A02" , vgetexppd(zmm1, zmmword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("62F27D0842CA" , vgetexpps(xmm1, xmm2));
+ TEST_INSTRUCTION("62F27D08424C1A08" , vgetexpps(xmm1, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("62F27D08424C1A08" , vgetexpps(xmm1, xmmword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("62F27D2842CA" , vgetexpps(ymm1, ymm2));
+ TEST_INSTRUCTION("62F27D28424C1A04" , vgetexpps(ymm1, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("62F27D28424C1A04" , vgetexpps(ymm1, ymmword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("62F27D4842CA" , vgetexpps(zmm1, zmm2));
+ TEST_INSTRUCTION("62F27D48424C1A02" , vgetexpps(zmm1, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("62F27D48424C1A02" , vgetexpps(zmm1, zmmword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("62F2ED0843CB" , vgetexpsd(xmm1, xmm2, xmm3));
+ TEST_INSTRUCTION("62F2ED08434C2B10" , vgetexpsd(xmm1, xmm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F2ED08434C2B10" , vgetexpsd(xmm1, xmm2, qword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F26D0843CB" , vgetexpss(xmm1, xmm2, xmm3));
+ TEST_INSTRUCTION("62F26D08434C2B20" , vgetexpss(xmm1, xmm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F26D08434C2B20" , vgetexpss(xmm1, xmm2, dword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F3FD0826CA01" , vgetmantpd(xmm1, xmm2, 1));
+ TEST_INSTRUCTION("62F3FD08264C1A0801" , vgetmantpd(xmm1, ptr(edx, ebx, 0, 128), 1));
+ TEST_INSTRUCTION("62F3FD08264C1A0801" , vgetmantpd(xmm1, xmmword_ptr(edx, ebx, 0, 128), 1));
+ TEST_INSTRUCTION("62F3FD2826CA01" , vgetmantpd(ymm1, ymm2, 1));
+ TEST_INSTRUCTION("62F3FD28264C1A0401" , vgetmantpd(ymm1, ptr(edx, ebx, 0, 128), 1));
+ TEST_INSTRUCTION("62F3FD28264C1A0401" , vgetmantpd(ymm1, ymmword_ptr(edx, ebx, 0, 128), 1));
+ TEST_INSTRUCTION("62F3FD4826CA01" , vgetmantpd(zmm1, zmm2, 1));
+ TEST_INSTRUCTION("62F3FD48264C1A0201" , vgetmantpd(zmm1, ptr(edx, ebx, 0, 128), 1));
+ TEST_INSTRUCTION("62F3FD48264C1A0201" , vgetmantpd(zmm1, zmmword_ptr(edx, ebx, 0, 128), 1));
+ TEST_INSTRUCTION("62F37D0826CA01" , vgetmantps(xmm1, xmm2, 1));
+ TEST_INSTRUCTION("62F37D08264C1A0801" , vgetmantps(xmm1, ptr(edx, ebx, 0, 128), 1));
+ TEST_INSTRUCTION("62F37D08264C1A0801" , vgetmantps(xmm1, xmmword_ptr(edx, ebx, 0, 128), 1));
+ TEST_INSTRUCTION("62F37D2826CA01" , vgetmantps(ymm1, ymm2, 1));
+ TEST_INSTRUCTION("62F37D28264C1A0401" , vgetmantps(ymm1, ptr(edx, ebx, 0, 128), 1));
+ TEST_INSTRUCTION("62F37D28264C1A0401" , vgetmantps(ymm1, ymmword_ptr(edx, ebx, 0, 128), 1));
+ TEST_INSTRUCTION("62F37D4826CA01" , vgetmantps(zmm1, zmm2, 1));
+ TEST_INSTRUCTION("62F37D48264C1A0201" , vgetmantps(zmm1, ptr(edx, ebx, 0, 128), 1));
+ TEST_INSTRUCTION("62F37D48264C1A0201" , vgetmantps(zmm1, zmmword_ptr(edx, ebx, 0, 128), 1));
+ TEST_INSTRUCTION("62F3ED0827CB01" , vgetmantsd(xmm1, xmm2, xmm3, 1));
+ TEST_INSTRUCTION("62F3ED08274C2B1001" , vgetmantsd(xmm1, xmm2, ptr(ebx, ebp, 0, 128), 1));
+ TEST_INSTRUCTION("62F3ED08274C2B1001" , vgetmantsd(xmm1, xmm2, qword_ptr(ebx, ebp, 0, 128), 1));
+ TEST_INSTRUCTION("62F36D0827CB01" , vgetmantss(xmm1, xmm2, xmm3, 1));
+ TEST_INSTRUCTION("62F36D08274C2B2001" , vgetmantss(xmm1, xmm2, ptr(ebx, ebp, 0, 128), 1));
+ TEST_INSTRUCTION("62F36D08274C2B2001" , vgetmantss(xmm1, xmm2, dword_ptr(ebx, ebp, 0, 128), 1));
+ TEST_INSTRUCTION("C4E3E9CFCB01" , vgf2p8affineinvqb(xmm1, xmm2, xmm3, 1));
+ TEST_INSTRUCTION("C4E3E9CF8C2B8000000001" , vgf2p8affineinvqb(xmm1, xmm2, ptr(ebx, ebp, 0, 128), 1));
+ TEST_INSTRUCTION("C4E3E9CF8C2B8000000001" , vgf2p8affineinvqb(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128), 1));
+ TEST_INSTRUCTION("C4E3EDCFCB01" , vgf2p8affineinvqb(ymm1, ymm2, ymm3, 1));
+ TEST_INSTRUCTION("C4E3EDCF8C2B8000000001" , vgf2p8affineinvqb(ymm1, ymm2, ptr(ebx, ebp, 0, 128), 1));
+ TEST_INSTRUCTION("C4E3EDCF8C2B8000000001" , vgf2p8affineinvqb(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128), 1));
+ TEST_INSTRUCTION("62F3ED48CFCB01" , vgf2p8affineinvqb(zmm1, zmm2, zmm3, 1));
+ TEST_INSTRUCTION("62F3ED48CF4C2B0201" , vgf2p8affineinvqb(zmm1, zmm2, ptr(ebx, ebp, 0, 128), 1));
+ TEST_INSTRUCTION("62F3ED48CF4C2B0201" , vgf2p8affineinvqb(zmm1, zmm2, zmmword_ptr(ebx, ebp, 0, 128), 1));
+ TEST_INSTRUCTION("C4E3E9CECB01" , vgf2p8affineqb(xmm1, xmm2, xmm3, 1));
+ TEST_INSTRUCTION("C4E3E9CE8C2B8000000001" , vgf2p8affineqb(xmm1, xmm2, ptr(ebx, ebp, 0, 128), 1));
+ TEST_INSTRUCTION("C4E3E9CE8C2B8000000001" , vgf2p8affineqb(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128), 1));
+ TEST_INSTRUCTION("C4E3EDCECB01" , vgf2p8affineqb(ymm1, ymm2, ymm3, 1));
+ TEST_INSTRUCTION("C4E3EDCE8C2B8000000001" , vgf2p8affineqb(ymm1, ymm2, ptr(ebx, ebp, 0, 128), 1));
+ TEST_INSTRUCTION("C4E3EDCE8C2B8000000001" , vgf2p8affineqb(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128), 1));
+ TEST_INSTRUCTION("62F3ED48CECB01" , vgf2p8affineqb(zmm1, zmm2, zmm3, 1));
+ TEST_INSTRUCTION("62F3ED48CE4C2B0201" , vgf2p8affineqb(zmm1, zmm2, ptr(ebx, ebp, 0, 128), 1));
+ TEST_INSTRUCTION("62F3ED48CE4C2B0201" , vgf2p8affineqb(zmm1, zmm2, zmmword_ptr(ebx, ebp, 0, 128), 1));
+ TEST_INSTRUCTION("C4E269CFCB" , vgf2p8mulb(xmm1, xmm2, xmm3));
+ TEST_INSTRUCTION("C4E269CF8C2B80000000" , vgf2p8mulb(xmm1, xmm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C4E269CF8C2B80000000" , vgf2p8mulb(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C4E26DCFCB" , vgf2p8mulb(ymm1, ymm2, ymm3));
+ TEST_INSTRUCTION("C4E26DCF8C2B80000000" , vgf2p8mulb(ymm1, ymm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C4E26DCF8C2B80000000" , vgf2p8mulb(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F26D48CFCB" , vgf2p8mulb(zmm1, zmm2, zmm3));
+ TEST_INSTRUCTION("62F26D48CF4C2B02" , vgf2p8mulb(zmm1, zmm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F26D48CF4C2B02" , vgf2p8mulb(zmm1, zmm2, zmmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C5E97CCB" , vhaddpd(xmm1, xmm2, xmm3));
+ TEST_INSTRUCTION("C5E97C8C2B80000000" , vhaddpd(xmm1, xmm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C5E97C8C2B80000000" , vhaddpd(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C5ED7CCB" , vhaddpd(ymm1, ymm2, ymm3));
+ TEST_INSTRUCTION("C5ED7C8C2B80000000" , vhaddpd(ymm1, ymm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C5ED7C8C2B80000000" , vhaddpd(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C5EB7CCB" , vhaddps(xmm1, xmm2, xmm3));
+ TEST_INSTRUCTION("C5EB7C8C2B80000000" , vhaddps(xmm1, xmm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C5EB7C8C2B80000000" , vhaddps(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C5EF7CCB" , vhaddps(ymm1, ymm2, ymm3));
+ TEST_INSTRUCTION("C5EF7C8C2B80000000" , vhaddps(ymm1, ymm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C5EF7C8C2B80000000" , vhaddps(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C5E97DCB" , vhsubpd(xmm1, xmm2, xmm3));
+ TEST_INSTRUCTION("C5E97D8C2B80000000" , vhsubpd(xmm1, xmm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C5E97D8C2B80000000" , vhsubpd(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C5ED7DCB" , vhsubpd(ymm1, ymm2, ymm3));
+ TEST_INSTRUCTION("C5ED7D8C2B80000000" , vhsubpd(ymm1, ymm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C5ED7D8C2B80000000" , vhsubpd(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C5EB7DCB" , vhsubps(xmm1, xmm2, xmm3));
+ TEST_INSTRUCTION("C5EB7D8C2B80000000" , vhsubps(xmm1, xmm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C5EB7D8C2B80000000" , vhsubps(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C5EF7DCB" , vhsubps(ymm1, ymm2, ymm3));
+ TEST_INSTRUCTION("C5EF7D8C2B80000000" , vhsubps(ymm1, ymm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C5EF7D8C2B80000000" , vhsubps(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C4E36D18CB01" , vinsertf128(ymm1, ymm2, xmm3, 1));
+ TEST_INSTRUCTION("C4E36D188C2B8000000001" , vinsertf128(ymm1, ymm2, ptr(ebx, ebp, 0, 128), 1));
+ TEST_INSTRUCTION("C4E36D188C2B8000000001" , vinsertf128(ymm1, ymm2, xmmword_ptr(ebx, ebp, 0, 128), 1));
+ TEST_INSTRUCTION("62F36D2818CB01" , vinsertf32x4(ymm1, ymm2, xmm3, 1));
+ TEST_INSTRUCTION("62F36D28184C2B0801" , vinsertf32x4(ymm1, ymm2, ptr(ebx, ebp, 0, 128), 1));
+ TEST_INSTRUCTION("62F36D28184C2B0801" , vinsertf32x4(ymm1, ymm2, xmmword_ptr(ebx, ebp, 0, 128), 1));
+ TEST_INSTRUCTION("62F36D4818CB01" , vinsertf32x4(zmm1, zmm2, xmm3, 1));
+ TEST_INSTRUCTION("62F36D48184C2B0801" , vinsertf32x4(zmm1, zmm2, ptr(ebx, ebp, 0, 128), 1));
+ TEST_INSTRUCTION("62F36D48184C2B0801" , vinsertf32x4(zmm1, zmm2, xmmword_ptr(ebx, ebp, 0, 128), 1));
+ TEST_INSTRUCTION("62F36D481ACB01" , vinsertf32x8(zmm1, zmm2, ymm3, 1));
+ TEST_INSTRUCTION("62F36D481A4C2B0401" , vinsertf32x8(zmm1, zmm2, ptr(ebx, ebp, 0, 128), 1));
+ TEST_INSTRUCTION("62F36D481A4C2B0401" , vinsertf32x8(zmm1, zmm2, ymmword_ptr(ebx, ebp, 0, 128), 1));
+ TEST_INSTRUCTION("62F3ED2818CB01" , vinsertf64x2(ymm1, ymm2, xmm3, 1));
+ TEST_INSTRUCTION("62F3ED28184C2B0801" , vinsertf64x2(ymm1, ymm2, ptr(ebx, ebp, 0, 128), 1));
+ TEST_INSTRUCTION("62F3ED28184C2B0801" , vinsertf64x2(ymm1, ymm2, xmmword_ptr(ebx, ebp, 0, 128), 1));
+ TEST_INSTRUCTION("62F3ED4818CB01" , vinsertf64x2(zmm1, zmm2, xmm3, 1));
+ TEST_INSTRUCTION("62F3ED48184C2B0801" , vinsertf64x2(zmm1, zmm2, ptr(ebx, ebp, 0, 128), 1));
+ TEST_INSTRUCTION("62F3ED48184C2B0801" , vinsertf64x2(zmm1, zmm2, xmmword_ptr(ebx, ebp, 0, 128), 1));
+ TEST_INSTRUCTION("62F3ED481ACB01" , vinsertf64x4(zmm1, zmm2, ymm3, 1));
+ TEST_INSTRUCTION("62F3ED481A4C2B0401" , vinsertf64x4(zmm1, zmm2, ptr(ebx, ebp, 0, 128), 1));
+ TEST_INSTRUCTION("62F3ED481A4C2B0401" , vinsertf64x4(zmm1, zmm2, ymmword_ptr(ebx, ebp, 0, 128), 1));
+ TEST_INSTRUCTION("C4E36D38CB01" , vinserti128(ymm1, ymm2, xmm3, 1));
+ TEST_INSTRUCTION("C4E36D388C2B8000000001" , vinserti128(ymm1, ymm2, ptr(ebx, ebp, 0, 128), 1));
+ TEST_INSTRUCTION("C4E36D388C2B8000000001" , vinserti128(ymm1, ymm2, xmmword_ptr(ebx, ebp, 0, 128), 1));
+ TEST_INSTRUCTION("62F36D2838CB01" , vinserti32x4(ymm1, ymm2, xmm3, 1));
+ TEST_INSTRUCTION("62F36D28384C2B0801" , vinserti32x4(ymm1, ymm2, ptr(ebx, ebp, 0, 128), 1));
+ TEST_INSTRUCTION("62F36D28384C2B0801" , vinserti32x4(ymm1, ymm2, xmmword_ptr(ebx, ebp, 0, 128), 1));
+ TEST_INSTRUCTION("62F36D4838CB01" , vinserti32x4(zmm1, zmm2, xmm3, 1));
+ TEST_INSTRUCTION("62F36D48384C2B0801" , vinserti32x4(zmm1, zmm2, ptr(ebx, ebp, 0, 128), 1));
+ TEST_INSTRUCTION("62F36D48384C2B0801" , vinserti32x4(zmm1, zmm2, xmmword_ptr(ebx, ebp, 0, 128), 1));
+ TEST_INSTRUCTION("62F36D483ACB01" , vinserti32x8(zmm1, zmm2, ymm3, 1));
+ TEST_INSTRUCTION("62F36D483A4C2B0401" , vinserti32x8(zmm1, zmm2, ptr(ebx, ebp, 0, 128), 1));
+ TEST_INSTRUCTION("62F36D483A4C2B0401" , vinserti32x8(zmm1, zmm2, ymmword_ptr(ebx, ebp, 0, 128), 1));
+ TEST_INSTRUCTION("62F3ED2838CB01" , vinserti64x2(ymm1, ymm2, xmm3, 1));
+ TEST_INSTRUCTION("62F3ED28384C2B0801" , vinserti64x2(ymm1, ymm2, ptr(ebx, ebp, 0, 128), 1));
+ TEST_INSTRUCTION("62F3ED28384C2B0801" , vinserti64x2(ymm1, ymm2, xmmword_ptr(ebx, ebp, 0, 128), 1));
+ TEST_INSTRUCTION("62F3ED4838CB01" , vinserti64x2(zmm1, zmm2, xmm3, 1));
+ TEST_INSTRUCTION("62F3ED48384C2B0801" , vinserti64x2(zmm1, zmm2, ptr(ebx, ebp, 0, 128), 1));
+ TEST_INSTRUCTION("62F3ED48384C2B0801" , vinserti64x2(zmm1, zmm2, xmmword_ptr(ebx, ebp, 0, 128), 1));
+ TEST_INSTRUCTION("62F3ED483ACB01" , vinserti64x4(zmm1, zmm2, ymm3, 1));
+ TEST_INSTRUCTION("62F3ED483A4C2B0401" , vinserti64x4(zmm1, zmm2, ptr(ebx, ebp, 0, 128), 1));
+ TEST_INSTRUCTION("62F3ED483A4C2B0401" , vinserti64x4(zmm1, zmm2, ymmword_ptr(ebx, ebp, 0, 128), 1));
+ TEST_INSTRUCTION("C4E36921CB01" , vinsertps(xmm1, xmm2, xmm3, 1));
+ TEST_INSTRUCTION("C4E369218C2B8000000001" , vinsertps(xmm1, xmm2, ptr(ebx, ebp, 0, 128), 1));
+ TEST_INSTRUCTION("C4E369218C2B8000000001" , vinsertps(xmm1, xmm2, dword_ptr(ebx, ebp, 0, 128), 1));
+ TEST_INSTRUCTION("C5FBF08C1A80000000" , vlddqu(xmm1, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("C5FBF08C1A80000000" , vlddqu(xmm1, xmmword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("C5FFF08C1A80000000" , vlddqu(ymm1, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("C5FFF08C1A80000000" , vlddqu(ymm1, ymmword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("C5F8AE941180000000" , vldmxcsr(ptr(ecx, edx, 0, 128)));
+ TEST_INSTRUCTION("C5F8AE941180000000" , vldmxcsr(dword_ptr(ecx, edx, 0, 128)));
+ TEST_INSTRUCTION("C5F9F7CA" , vmaskmovdqu(xmm1, xmm2, ptr(edi)));
+ TEST_INSTRUCTION("C5F9F7CA" , vmaskmovdqu(xmm1, xmm2, xmmword_ptr(edi)));
+ TEST_INSTRUCTION("C4E2612FA41180000000" , vmaskmovpd(ptr(ecx, edx, 0, 128), xmm3, xmm4));
+ TEST_INSTRUCTION("C4E2612FA41180000000" , vmaskmovpd(xmmword_ptr(ecx, edx, 0, 128), xmm3, xmm4));
+ TEST_INSTRUCTION("C4E2652FA41180000000" , vmaskmovpd(ptr(ecx, edx, 0, 128), ymm3, ymm4));
+ TEST_INSTRUCTION("C4E2652FA41180000000" , vmaskmovpd(ymmword_ptr(ecx, edx, 0, 128), ymm3, ymm4));
+ TEST_INSTRUCTION("C4E2692D8C2B80000000" , vmaskmovpd(xmm1, xmm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C4E2692D8C2B80000000" , vmaskmovpd(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C4E26D2D8C2B80000000" , vmaskmovpd(ymm1, ymm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C4E26D2D8C2B80000000" , vmaskmovpd(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C4E2612EA41180000000" , vmaskmovps(ptr(ecx, edx, 0, 128), xmm3, xmm4));
+ TEST_INSTRUCTION("C4E2612EA41180000000" , vmaskmovps(xmmword_ptr(ecx, edx, 0, 128), xmm3, xmm4));
+ TEST_INSTRUCTION("C4E2652EA41180000000" , vmaskmovps(ptr(ecx, edx, 0, 128), ymm3, ymm4));
+ TEST_INSTRUCTION("C4E2652EA41180000000" , vmaskmovps(ymmword_ptr(ecx, edx, 0, 128), ymm3, ymm4));
+ TEST_INSTRUCTION("C4E2692C8C2B80000000" , vmaskmovps(xmm1, xmm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C4E2692C8C2B80000000" , vmaskmovps(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C4E26D2C8C2B80000000" , vmaskmovps(ymm1, ymm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C4E26D2C8C2B80000000" , vmaskmovps(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C5E95FCB" , vmaxpd(xmm1, xmm2, xmm3));
+ TEST_INSTRUCTION("C5E95F8C2B80000000" , vmaxpd(xmm1, xmm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C5E95F8C2B80000000" , vmaxpd(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C5ED5FCB" , vmaxpd(ymm1, ymm2, ymm3));
+ TEST_INSTRUCTION("C5ED5F8C2B80000000" , vmaxpd(ymm1, ymm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C5ED5F8C2B80000000" , vmaxpd(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F1ED485FCB" , vmaxpd(zmm1, zmm2, zmm3));
+ TEST_INSTRUCTION("62F1ED485F4C2B02" , vmaxpd(zmm1, zmm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F1ED485F4C2B02" , vmaxpd(zmm1, zmm2, zmmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C5E85FCB" , vmaxps(xmm1, xmm2, xmm3));
+ TEST_INSTRUCTION("C5E85F8C2B80000000" , vmaxps(xmm1, xmm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C5E85F8C2B80000000" , vmaxps(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C5EC5FCB" , vmaxps(ymm1, ymm2, ymm3));
+ TEST_INSTRUCTION("C5EC5F8C2B80000000" , vmaxps(ymm1, ymm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C5EC5F8C2B80000000" , vmaxps(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F16C485FCB" , vmaxps(zmm1, zmm2, zmm3));
+ TEST_INSTRUCTION("62F16C485F4C2B02" , vmaxps(zmm1, zmm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F16C485F4C2B02" , vmaxps(zmm1, zmm2, zmmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C5EB5FCB" , vmaxsd(xmm1, xmm2, xmm3));
+ TEST_INSTRUCTION("C5EB5F8C2B80000000" , vmaxsd(xmm1, xmm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C5EB5F8C2B80000000" , vmaxsd(xmm1, xmm2, qword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C5EA5FCB" , vmaxss(xmm1, xmm2, xmm3));
+ TEST_INSTRUCTION("C5EA5F8C2B80000000" , vmaxss(xmm1, xmm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C5EA5F8C2B80000000" , vmaxss(xmm1, xmm2, dword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C5E95DCB" , vminpd(xmm1, xmm2, xmm3));
+ TEST_INSTRUCTION("C5E95D8C2B80000000" , vminpd(xmm1, xmm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C5E95D8C2B80000000" , vminpd(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C5ED5DCB" , vminpd(ymm1, ymm2, ymm3));
+ TEST_INSTRUCTION("C5ED5D8C2B80000000" , vminpd(ymm1, ymm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C5ED5D8C2B80000000" , vminpd(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F1ED485DCB" , vminpd(zmm1, zmm2, zmm3));
+ TEST_INSTRUCTION("62F1ED485D4C2B02" , vminpd(zmm1, zmm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F1ED485D4C2B02" , vminpd(zmm1, zmm2, zmmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C5E85DCB" , vminps(xmm1, xmm2, xmm3));
+ TEST_INSTRUCTION("C5E85D8C2B80000000" , vminps(xmm1, xmm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C5E85D8C2B80000000" , vminps(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C5EC5DCB" , vminps(ymm1, ymm2, ymm3));
+ TEST_INSTRUCTION("C5EC5D8C2B80000000" , vminps(ymm1, ymm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C5EC5D8C2B80000000" , vminps(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F16C485DCB" , vminps(zmm1, zmm2, zmm3));
+ TEST_INSTRUCTION("62F16C485D4C2B02" , vminps(zmm1, zmm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F16C485D4C2B02" , vminps(zmm1, zmm2, zmmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C5EB5DCB" , vminsd(xmm1, xmm2, xmm3));
+ TEST_INSTRUCTION("C5EB5D8C2B80000000" , vminsd(xmm1, xmm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C5EB5D8C2B80000000" , vminsd(xmm1, xmm2, qword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C5EA5DCB" , vminss(xmm1, xmm2, xmm3));
+ TEST_INSTRUCTION("C5EA5D8C2B80000000" , vminss(xmm1, xmm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C5EA5D8C2B80000000" , vminss(xmm1, xmm2, dword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C5F928CA" , vmovapd(xmm1, xmm2));
+ TEST_INSTRUCTION("C5F9288C1A80000000" , vmovapd(xmm1, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("C5F9288C1A80000000" , vmovapd(xmm1, xmmword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("C5F9299C1180000000" , vmovapd(ptr(ecx, edx, 0, 128), xmm3));
+ TEST_INSTRUCTION("C5F9299C1180000000" , vmovapd(xmmword_ptr(ecx, edx, 0, 128), xmm3));
+ TEST_INSTRUCTION("C5FD28CA" , vmovapd(ymm1, ymm2));
+ TEST_INSTRUCTION("C5FD288C1A80000000" , vmovapd(ymm1, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("C5FD288C1A80000000" , vmovapd(ymm1, ymmword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("C5FD299C1180000000" , vmovapd(ptr(ecx, edx, 0, 128), ymm3));
+ TEST_INSTRUCTION("C5FD299C1180000000" , vmovapd(ymmword_ptr(ecx, edx, 0, 128), ymm3));
+ TEST_INSTRUCTION("62F1FD4828CA" , vmovapd(zmm1, zmm2));
+ TEST_INSTRUCTION("62F1FD48284C1A02" , vmovapd(zmm1, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("62F1FD48284C1A02" , vmovapd(zmm1, zmmword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("62F1FD48295C1102" , vmovapd(ptr(ecx, edx, 0, 128), zmm3));
+ TEST_INSTRUCTION("62F1FD48295C1102" , vmovapd(zmmword_ptr(ecx, edx, 0, 128), zmm3));
+ TEST_INSTRUCTION("C5F828CA" , vmovaps(xmm1, xmm2));
+ TEST_INSTRUCTION("C5F8288C1A80000000" , vmovaps(xmm1, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("C5F8288C1A80000000" , vmovaps(xmm1, xmmword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("C5F8299C1180000000" , vmovaps(ptr(ecx, edx, 0, 128), xmm3));
+ TEST_INSTRUCTION("C5F8299C1180000000" , vmovaps(xmmword_ptr(ecx, edx, 0, 128), xmm3));
+ TEST_INSTRUCTION("C5FC28CA" , vmovaps(ymm1, ymm2));
+ TEST_INSTRUCTION("C5FC288C1A80000000" , vmovaps(ymm1, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("C5FC288C1A80000000" , vmovaps(ymm1, ymmword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("C5FC299C1180000000" , vmovaps(ptr(ecx, edx, 0, 128), ymm3));
+ TEST_INSTRUCTION("C5FC299C1180000000" , vmovaps(ymmword_ptr(ecx, edx, 0, 128), ymm3));
+ TEST_INSTRUCTION("62F17C4828CA" , vmovaps(zmm1, zmm2));
+ TEST_INSTRUCTION("62F17C48284C1A02" , vmovaps(zmm1, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("62F17C48284C1A02" , vmovaps(zmm1, zmmword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("62F17C48295C1102" , vmovaps(ptr(ecx, edx, 0, 128), zmm3));
+ TEST_INSTRUCTION("62F17C48295C1102" , vmovaps(zmmword_ptr(ecx, edx, 0, 128), zmm3));
+ TEST_INSTRUCTION("C5F97ED1" , vmovd(ecx, xmm2));
+ TEST_INSTRUCTION("C5F97E9C1180000000" , vmovd(ptr(ecx, edx, 0, 128), xmm3));
+ TEST_INSTRUCTION("C5F97E9C1180000000" , vmovd(dword_ptr(ecx, edx, 0, 128), xmm3));
+ TEST_INSTRUCTION("C5F96ECA" , vmovd(xmm1, edx));
+ TEST_INSTRUCTION("C5F96E8C1A80000000" , vmovd(xmm1, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("C5F96E8C1A80000000" , vmovd(xmm1, dword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("C5FB12CA" , vmovddup(xmm1, xmm2));
+ TEST_INSTRUCTION("C5FB128C1A80000000" , vmovddup(xmm1, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("C5FB128C1A80000000" , vmovddup(xmm1, qword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("C5FF12CA" , vmovddup(ymm1, ymm2));
+ TEST_INSTRUCTION("C5FF128C1A80000000" , vmovddup(ymm1, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("C5FF128C1A80000000" , vmovddup(ymm1, ymmword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("62F1FF4812CA" , vmovddup(zmm1, zmm2));
+ TEST_INSTRUCTION("62F1FF48124C1A02" , vmovddup(zmm1, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("62F1FF48124C1A02" , vmovddup(zmm1, zmmword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("C5F96FCA" , vmovdqa(xmm1, xmm2));
+ TEST_INSTRUCTION("C5F96F8C1A80000000" , vmovdqa(xmm1, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("C5F96F8C1A80000000" , vmovdqa(xmm1, xmmword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("C5F97F9C1180000000" , vmovdqa(ptr(ecx, edx, 0, 128), xmm3));
+ TEST_INSTRUCTION("C5F97F9C1180000000" , vmovdqa(xmmword_ptr(ecx, edx, 0, 128), xmm3));
+ TEST_INSTRUCTION("C5FD6FCA" , vmovdqa(ymm1, ymm2));
+ TEST_INSTRUCTION("C5FD6F8C1A80000000" , vmovdqa(ymm1, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("C5FD6F8C1A80000000" , vmovdqa(ymm1, ymmword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("C5FD7F9C1180000000" , vmovdqa(ptr(ecx, edx, 0, 128), ymm3));
+ TEST_INSTRUCTION("C5FD7F9C1180000000" , vmovdqa(ymmword_ptr(ecx, edx, 0, 128), ymm3));
+ TEST_INSTRUCTION("62F17D086FCA" , vmovdqa32(xmm1, xmm2));
+ TEST_INSTRUCTION("62F17D086F4C1A08" , vmovdqa32(xmm1, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("62F17D086F4C1A08" , vmovdqa32(xmm1, xmmword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("62F17D087F5C1108" , vmovdqa32(ptr(ecx, edx, 0, 128), xmm3));
+ TEST_INSTRUCTION("62F17D087F5C1108" , vmovdqa32(xmmword_ptr(ecx, edx, 0, 128), xmm3));
+ TEST_INSTRUCTION("62F17D286FCA" , vmovdqa32(ymm1, ymm2));
+ TEST_INSTRUCTION("62F17D286F4C1A04" , vmovdqa32(ymm1, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("62F17D286F4C1A04" , vmovdqa32(ymm1, ymmword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("62F17D287F5C1104" , vmovdqa32(ptr(ecx, edx, 0, 128), ymm3));
+ TEST_INSTRUCTION("62F17D287F5C1104" , vmovdqa32(ymmword_ptr(ecx, edx, 0, 128), ymm3));
+ TEST_INSTRUCTION("62F17D486FCA" , vmovdqa32(zmm1, zmm2));
+ TEST_INSTRUCTION("62F17D486F4C1A02" , vmovdqa32(zmm1, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("62F17D486F4C1A02" , vmovdqa32(zmm1, zmmword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("62F17D487F5C1102" , vmovdqa32(ptr(ecx, edx, 0, 128), zmm3));
+ TEST_INSTRUCTION("62F17D487F5C1102" , vmovdqa32(zmmword_ptr(ecx, edx, 0, 128), zmm3));
+ TEST_INSTRUCTION("62F1FD086FCA" , vmovdqa64(xmm1, xmm2));
+ TEST_INSTRUCTION("62F1FD086F4C1A08" , vmovdqa64(xmm1, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("62F1FD086F4C1A08" , vmovdqa64(xmm1, xmmword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("62F1FD087F5C1108" , vmovdqa64(ptr(ecx, edx, 0, 128), xmm3));
+ TEST_INSTRUCTION("62F1FD087F5C1108" , vmovdqa64(xmmword_ptr(ecx, edx, 0, 128), xmm3));
+ TEST_INSTRUCTION("62F1FD286FCA" , vmovdqa64(ymm1, ymm2));
+ TEST_INSTRUCTION("62F1FD286F4C1A04" , vmovdqa64(ymm1, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("62F1FD286F4C1A04" , vmovdqa64(ymm1, ymmword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("62F1FD287F5C1104" , vmovdqa64(ptr(ecx, edx, 0, 128), ymm3));
+ TEST_INSTRUCTION("62F1FD287F5C1104" , vmovdqa64(ymmword_ptr(ecx, edx, 0, 128), ymm3));
+ TEST_INSTRUCTION("62F1FD486FCA" , vmovdqa64(zmm1, zmm2));
+ TEST_INSTRUCTION("62F1FD486F4C1A02" , vmovdqa64(zmm1, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("62F1FD486F4C1A02" , vmovdqa64(zmm1, zmmword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("62F1FD487F5C1102" , vmovdqa64(ptr(ecx, edx, 0, 128), zmm3));
+ TEST_INSTRUCTION("62F1FD487F5C1102" , vmovdqa64(zmmword_ptr(ecx, edx, 0, 128), zmm3));
+ TEST_INSTRUCTION("C5FA6FCA" , vmovdqu(xmm1, xmm2));
+ TEST_INSTRUCTION("C5FA6F8C1A80000000" , vmovdqu(xmm1, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("C5FA6F8C1A80000000" , vmovdqu(xmm1, xmmword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("C5FA7F9C1180000000" , vmovdqu(ptr(ecx, edx, 0, 128), xmm3));
+ TEST_INSTRUCTION("C5FA7F9C1180000000" , vmovdqu(xmmword_ptr(ecx, edx, 0, 128), xmm3));
+ TEST_INSTRUCTION("C5FE6FCA" , vmovdqu(ymm1, ymm2));
+ TEST_INSTRUCTION("C5FE6F8C1A80000000" , vmovdqu(ymm1, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("C5FE6F8C1A80000000" , vmovdqu(ymm1, ymmword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("C5FE7F9C1180000000" , vmovdqu(ptr(ecx, edx, 0, 128), ymm3));
+ TEST_INSTRUCTION("C5FE7F9C1180000000" , vmovdqu(ymmword_ptr(ecx, edx, 0, 128), ymm3));
+ TEST_INSTRUCTION("62F1FF086FCA" , vmovdqu16(xmm1, xmm2));
+ TEST_INSTRUCTION("62F1FF086F4C1A08" , vmovdqu16(xmm1, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("62F1FF086F4C1A08" , vmovdqu16(xmm1, xmmword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("62F1FF087F5C1108" , vmovdqu16(ptr(ecx, edx, 0, 128), xmm3));
+ TEST_INSTRUCTION("62F1FF087F5C1108" , vmovdqu16(xmmword_ptr(ecx, edx, 0, 128), xmm3));
+ TEST_INSTRUCTION("62F1FF286FCA" , vmovdqu16(ymm1, ymm2));
+ TEST_INSTRUCTION("62F1FF286F4C1A04" , vmovdqu16(ymm1, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("62F1FF286F4C1A04" , vmovdqu16(ymm1, ymmword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("62F1FF287F5C1104" , vmovdqu16(ptr(ecx, edx, 0, 128), ymm3));
+ TEST_INSTRUCTION("62F1FF287F5C1104" , vmovdqu16(ymmword_ptr(ecx, edx, 0, 128), ymm3));
+ TEST_INSTRUCTION("62F1FF486FCA" , vmovdqu16(zmm1, zmm2));
+ TEST_INSTRUCTION("62F1FF486F4C1A02" , vmovdqu16(zmm1, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("62F1FF486F4C1A02" , vmovdqu16(zmm1, zmmword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("62F1FF487F5C1102" , vmovdqu16(ptr(ecx, edx, 0, 128), zmm3));
+ TEST_INSTRUCTION("62F1FF487F5C1102" , vmovdqu16(zmmword_ptr(ecx, edx, 0, 128), zmm3));
+ TEST_INSTRUCTION("62F17E086FCA" , vmovdqu32(xmm1, xmm2));
+ TEST_INSTRUCTION("62F17E086F4C1A08" , vmovdqu32(xmm1, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("62F17E086F4C1A08" , vmovdqu32(xmm1, xmmword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("62F17E087F5C1108" , vmovdqu32(ptr(ecx, edx, 0, 128), xmm3));
+ TEST_INSTRUCTION("62F17E087F5C1108" , vmovdqu32(xmmword_ptr(ecx, edx, 0, 128), xmm3));
+ TEST_INSTRUCTION("62F17E286FCA" , vmovdqu32(ymm1, ymm2));
+ TEST_INSTRUCTION("62F17E286F4C1A04" , vmovdqu32(ymm1, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("62F17E286F4C1A04" , vmovdqu32(ymm1, ymmword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("62F17E287F5C1104" , vmovdqu32(ptr(ecx, edx, 0, 128), ymm3));
+ TEST_INSTRUCTION("62F17E287F5C1104" , vmovdqu32(ymmword_ptr(ecx, edx, 0, 128), ymm3));
+ TEST_INSTRUCTION("62F17E486FCA" , vmovdqu32(zmm1, zmm2));
+ TEST_INSTRUCTION("62F17E486F4C1A02" , vmovdqu32(zmm1, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("62F17E486F4C1A02" , vmovdqu32(zmm1, zmmword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("62F17E487F5C1102" , vmovdqu32(ptr(ecx, edx, 0, 128), zmm3));
+ TEST_INSTRUCTION("62F17E487F5C1102" , vmovdqu32(zmmword_ptr(ecx, edx, 0, 128), zmm3));
+ TEST_INSTRUCTION("62F1FE086FCA" , vmovdqu64(xmm1, xmm2));
+ TEST_INSTRUCTION("62F1FE086F4C1A08" , vmovdqu64(xmm1, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("62F1FE086F4C1A08" , vmovdqu64(xmm1, xmmword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("62F1FE087F5C1108" , vmovdqu64(ptr(ecx, edx, 0, 128), xmm3));
+ TEST_INSTRUCTION("62F1FE087F5C1108" , vmovdqu64(xmmword_ptr(ecx, edx, 0, 128), xmm3));
+ TEST_INSTRUCTION("62F1FE286FCA" , vmovdqu64(ymm1, ymm2));
+ TEST_INSTRUCTION("62F1FE286F4C1A04" , vmovdqu64(ymm1, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("62F1FE286F4C1A04" , vmovdqu64(ymm1, ymmword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("62F1FE287F5C1104" , vmovdqu64(ptr(ecx, edx, 0, 128), ymm3));
+ TEST_INSTRUCTION("62F1FE287F5C1104" , vmovdqu64(ymmword_ptr(ecx, edx, 0, 128), ymm3));
+ TEST_INSTRUCTION("62F1FE486FCA" , vmovdqu64(zmm1, zmm2));
+ TEST_INSTRUCTION("62F1FE486F4C1A02" , vmovdqu64(zmm1, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("62F1FE486F4C1A02" , vmovdqu64(zmm1, zmmword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("62F1FE487F5C1102" , vmovdqu64(ptr(ecx, edx, 0, 128), zmm3));
+ TEST_INSTRUCTION("62F1FE487F5C1102" , vmovdqu64(zmmword_ptr(ecx, edx, 0, 128), zmm3));
+ TEST_INSTRUCTION("62F17F086FCA" , vmovdqu8(xmm1, xmm2));
+ TEST_INSTRUCTION("62F17F086F4C1A08" , vmovdqu8(xmm1, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("62F17F086F4C1A08" , vmovdqu8(xmm1, xmmword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("62F17F087F5C1108" , vmovdqu8(ptr(ecx, edx, 0, 128), xmm3));
+ TEST_INSTRUCTION("62F17F087F5C1108" , vmovdqu8(xmmword_ptr(ecx, edx, 0, 128), xmm3));
+ TEST_INSTRUCTION("62F17F286FCA" , vmovdqu8(ymm1, ymm2));
+ TEST_INSTRUCTION("62F17F286F4C1A04" , vmovdqu8(ymm1, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("62F17F286F4C1A04" , vmovdqu8(ymm1, ymmword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("62F17F287F5C1104" , vmovdqu8(ptr(ecx, edx, 0, 128), ymm3));
+ TEST_INSTRUCTION("62F17F287F5C1104" , vmovdqu8(ymmword_ptr(ecx, edx, 0, 128), ymm3));
+ TEST_INSTRUCTION("62F17F486FCA" , vmovdqu8(zmm1, zmm2));
+ TEST_INSTRUCTION("62F17F486F4C1A02" , vmovdqu8(zmm1, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("62F17F486F4C1A02" , vmovdqu8(zmm1, zmmword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("62F17F487F5C1102" , vmovdqu8(ptr(ecx, edx, 0, 128), zmm3));
+ TEST_INSTRUCTION("62F17F487F5C1102" , vmovdqu8(zmmword_ptr(ecx, edx, 0, 128), zmm3));
+ TEST_INSTRUCTION("C5E812CB" , vmovhlps(xmm1, xmm2, xmm3));
+ TEST_INSTRUCTION("C5F9179C1180000000" , vmovhpd(ptr(ecx, edx, 0, 128), xmm3));
+ TEST_INSTRUCTION("C5F9179C1180000000" , vmovhpd(qword_ptr(ecx, edx, 0, 128), xmm3));
+ TEST_INSTRUCTION("C5E9168C2B80000000" , vmovhpd(xmm1, xmm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C5E9168C2B80000000" , vmovhpd(xmm1, xmm2, qword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C5F8179C1180000000" , vmovhps(ptr(ecx, edx, 0, 128), xmm3));
+ TEST_INSTRUCTION("C5F8179C1180000000" , vmovhps(qword_ptr(ecx, edx, 0, 128), xmm3));
+ TEST_INSTRUCTION("C5E8168C2B80000000" , vmovhps(xmm1, xmm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C5E8168C2B80000000" , vmovhps(xmm1, xmm2, qword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C5E816CB" , vmovlhps(xmm1, xmm2, xmm3));
+ TEST_INSTRUCTION("C5F9139C1180000000" , vmovlpd(ptr(ecx, edx, 0, 128), xmm3));
+ TEST_INSTRUCTION("C5F9139C1180000000" , vmovlpd(qword_ptr(ecx, edx, 0, 128), xmm3));
+ TEST_INSTRUCTION("C5E9128C2B80000000" , vmovlpd(xmm1, xmm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C5E9128C2B80000000" , vmovlpd(xmm1, xmm2, qword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C5F8139C1180000000" , vmovlps(ptr(ecx, edx, 0, 128), xmm3));
+ TEST_INSTRUCTION("C5F8139C1180000000" , vmovlps(qword_ptr(ecx, edx, 0, 128), xmm3));
+ TEST_INSTRUCTION("C5E8128C2B80000000" , vmovlps(xmm1, xmm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C5E8128C2B80000000" , vmovlps(xmm1, xmm2, qword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C5F950CA" , vmovmskpd(ecx, xmm2));
+ TEST_INSTRUCTION("C5FD50CA" , vmovmskpd(ecx, ymm2));
+ TEST_INSTRUCTION("C5F850CA" , vmovmskps(ecx, xmm2));
+ TEST_INSTRUCTION("C5FC50CA" , vmovmskps(ecx, ymm2));
+ TEST_INSTRUCTION("C5F9E79C1180000000" , vmovntdq(ptr(ecx, edx, 0, 128), xmm3));
+ TEST_INSTRUCTION("C5F9E79C1180000000" , vmovntdq(xmmword_ptr(ecx, edx, 0, 128), xmm3));
+ TEST_INSTRUCTION("C5FDE79C1180000000" , vmovntdq(ptr(ecx, edx, 0, 128), ymm3));
+ TEST_INSTRUCTION("C5FDE79C1180000000" , vmovntdq(ymmword_ptr(ecx, edx, 0, 128), ymm3));
+ TEST_INSTRUCTION("62F17D48E75C1102" , vmovntdq(ptr(ecx, edx, 0, 128), zmm3));
+ TEST_INSTRUCTION("62F17D48E75C1102" , vmovntdq(zmmword_ptr(ecx, edx, 0, 128), zmm3));
+ TEST_INSTRUCTION("C4E2792A8C1A80000000" , vmovntdqa(xmm1, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("C4E2792A8C1A80000000" , vmovntdqa(xmm1, xmmword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("C4E27D2A8C1A80000000" , vmovntdqa(ymm1, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("C4E27D2A8C1A80000000" , vmovntdqa(ymm1, ymmword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("62F27D482A4C1A02" , vmovntdqa(zmm1, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("62F27D482A4C1A02" , vmovntdqa(zmm1, zmmword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("C5F92B9C1180000000" , vmovntpd(ptr(ecx, edx, 0, 128), xmm3));
+ TEST_INSTRUCTION("C5F92B9C1180000000" , vmovntpd(xmmword_ptr(ecx, edx, 0, 128), xmm3));
+ TEST_INSTRUCTION("C5FD2B9C1180000000" , vmovntpd(ptr(ecx, edx, 0, 128), ymm3));
+ TEST_INSTRUCTION("C5FD2B9C1180000000" , vmovntpd(ymmword_ptr(ecx, edx, 0, 128), ymm3));
+ TEST_INSTRUCTION("62F1FD482B5C1102" , vmovntpd(ptr(ecx, edx, 0, 128), zmm3));
+ TEST_INSTRUCTION("62F1FD482B5C1102" , vmovntpd(zmmword_ptr(ecx, edx, 0, 128), zmm3));
+ TEST_INSTRUCTION("C5F82B9C1180000000" , vmovntps(ptr(ecx, edx, 0, 128), xmm3));
+ TEST_INSTRUCTION("C5F82B9C1180000000" , vmovntps(xmmword_ptr(ecx, edx, 0, 128), xmm3));
+ TEST_INSTRUCTION("C5FC2B9C1180000000" , vmovntps(ptr(ecx, edx, 0, 128), ymm3));
+ TEST_INSTRUCTION("C5FC2B9C1180000000" , vmovntps(ymmword_ptr(ecx, edx, 0, 128), ymm3));
+ TEST_INSTRUCTION("62F17C482B5C1102" , vmovntps(ptr(ecx, edx, 0, 128), zmm3));
+ TEST_INSTRUCTION("62F17C482B5C1102" , vmovntps(zmmword_ptr(ecx, edx, 0, 128), zmm3));
+ TEST_INSTRUCTION("C5FA7ECA" , vmovq(xmm1, xmm2));
+ TEST_INSTRUCTION("C5FA7E8C1A80000000" , vmovq(xmm1, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("C5FA7E8C1A80000000" , vmovq(xmm1, qword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("C5F9D69C1180000000" , vmovq(ptr(ecx, edx, 0, 128), xmm3));
+ TEST_INSTRUCTION("C5F9D69C1180000000" , vmovq(qword_ptr(ecx, edx, 0, 128), xmm3));
+ TEST_INSTRUCTION("C5FB119C1180000000" , vmovsd(ptr(ecx, edx, 0, 128), xmm3));
+ TEST_INSTRUCTION("C5FB119C1180000000" , vmovsd(qword_ptr(ecx, edx, 0, 128), xmm3));
+ TEST_INSTRUCTION("C5FB108C1A80000000" , vmovsd(xmm1, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("C5FB108C1A80000000" , vmovsd(xmm1, qword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("C5EB10CB" , vmovsd(xmm1, xmm2, xmm3));
+ TEST_INSTRUCTION("C5FA16CA" , vmovshdup(xmm1, xmm2));
+ TEST_INSTRUCTION("C5FA168C1A80000000" , vmovshdup(xmm1, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("C5FA168C1A80000000" , vmovshdup(xmm1, xmmword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("C5FE16CA" , vmovshdup(ymm1, ymm2));
+ TEST_INSTRUCTION("C5FE168C1A80000000" , vmovshdup(ymm1, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("C5FE168C1A80000000" , vmovshdup(ymm1, ymmword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("62F17E4816CA" , vmovshdup(zmm1, zmm2));
+ TEST_INSTRUCTION("62F17E48164C1A02" , vmovshdup(zmm1, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("62F17E48164C1A02" , vmovshdup(zmm1, zmmword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("C5FA12CA" , vmovsldup(xmm1, xmm2));
+ TEST_INSTRUCTION("C5FA128C1A80000000" , vmovsldup(xmm1, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("C5FA128C1A80000000" , vmovsldup(xmm1, xmmword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("C5FE12CA" , vmovsldup(ymm1, ymm2));
+ TEST_INSTRUCTION("C5FE128C1A80000000" , vmovsldup(ymm1, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("C5FE128C1A80000000" , vmovsldup(ymm1, ymmword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("62F17E4812CA" , vmovsldup(zmm1, zmm2));
+ TEST_INSTRUCTION("62F17E48124C1A02" , vmovsldup(zmm1, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("62F17E48124C1A02" , vmovsldup(zmm1, zmmword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("C5FA119C1180000000" , vmovss(ptr(ecx, edx, 0, 128), xmm3));
+ TEST_INSTRUCTION("C5FA119C1180000000" , vmovss(dword_ptr(ecx, edx, 0, 128), xmm3));
+ TEST_INSTRUCTION("C5FA108C1A80000000" , vmovss(xmm1, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("C5FA108C1A80000000" , vmovss(xmm1, dword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("C5EA10CB" , vmovss(xmm1, xmm2, xmm3));
+ TEST_INSTRUCTION("C5F910CA" , vmovupd(xmm1, xmm2));
+ TEST_INSTRUCTION("C5F9108C1A80000000" , vmovupd(xmm1, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("C5F9108C1A80000000" , vmovupd(xmm1, xmmword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("C5F9119C1180000000" , vmovupd(ptr(ecx, edx, 0, 128), xmm3));
+ TEST_INSTRUCTION("C5F9119C1180000000" , vmovupd(xmmword_ptr(ecx, edx, 0, 128), xmm3));
+ TEST_INSTRUCTION("C5FD10CA" , vmovupd(ymm1, ymm2));
+ TEST_INSTRUCTION("C5FD108C1A80000000" , vmovupd(ymm1, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("C5FD108C1A80000000" , vmovupd(ymm1, ymmword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("C5FD119C1180000000" , vmovupd(ptr(ecx, edx, 0, 128), ymm3));
+ TEST_INSTRUCTION("C5FD119C1180000000" , vmovupd(ymmword_ptr(ecx, edx, 0, 128), ymm3));
+ TEST_INSTRUCTION("62F1FD4810CA" , vmovupd(zmm1, zmm2));
+ TEST_INSTRUCTION("62F1FD48104C1A02" , vmovupd(zmm1, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("62F1FD48104C1A02" , vmovupd(zmm1, zmmword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("62F1FD48115C1102" , vmovupd(ptr(ecx, edx, 0, 128), zmm3));
+ TEST_INSTRUCTION("62F1FD48115C1102" , vmovupd(zmmword_ptr(ecx, edx, 0, 128), zmm3));
+ TEST_INSTRUCTION("C5F810CA" , vmovups(xmm1, xmm2));
+ TEST_INSTRUCTION("C5F8108C1A80000000" , vmovups(xmm1, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("C5F8108C1A80000000" , vmovups(xmm1, xmmword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("C5F8119C1180000000" , vmovups(ptr(ecx, edx, 0, 128), xmm3));
+ TEST_INSTRUCTION("C5F8119C1180000000" , vmovups(xmmword_ptr(ecx, edx, 0, 128), xmm3));
+ TEST_INSTRUCTION("C5FC10CA" , vmovups(ymm1, ymm2));
+ TEST_INSTRUCTION("C5FC108C1A80000000" , vmovups(ymm1, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("C5FC108C1A80000000" , vmovups(ymm1, ymmword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("C5FC119C1180000000" , vmovups(ptr(ecx, edx, 0, 128), ymm3));
+ TEST_INSTRUCTION("C5FC119C1180000000" , vmovups(ymmword_ptr(ecx, edx, 0, 128), ymm3));
+ TEST_INSTRUCTION("62F17C4810CA" , vmovups(zmm1, zmm2));
+ TEST_INSTRUCTION("62F17C48104C1A02" , vmovups(zmm1, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("62F17C48104C1A02" , vmovups(zmm1, zmmword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("62F17C48115C1102" , vmovups(ptr(ecx, edx, 0, 128), zmm3));
+ TEST_INSTRUCTION("62F17C48115C1102" , vmovups(zmmword_ptr(ecx, edx, 0, 128), zmm3));
+ TEST_INSTRUCTION("C4E36942CB01" , vmpsadbw(xmm1, xmm2, xmm3, 1));
+ TEST_INSTRUCTION("C4E369428C2B8000000001" , vmpsadbw(xmm1, xmm2, ptr(ebx, ebp, 0, 128), 1));
+ TEST_INSTRUCTION("C4E369428C2B8000000001" , vmpsadbw(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128), 1));
+ TEST_INSTRUCTION("C4E36D42CB01" , vmpsadbw(ymm1, ymm2, ymm3, 1));
+ TEST_INSTRUCTION("C4E36D428C2B8000000001" , vmpsadbw(ymm1, ymm2, ptr(ebx, ebp, 0, 128), 1));
+ TEST_INSTRUCTION("C4E36D428C2B8000000001" , vmpsadbw(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128), 1));
+ TEST_INSTRUCTION("C5E959CB" , vmulpd(xmm1, xmm2, xmm3));
+ TEST_INSTRUCTION("C5E9598C2B80000000" , vmulpd(xmm1, xmm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C5E9598C2B80000000" , vmulpd(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C5ED59CB" , vmulpd(ymm1, ymm2, ymm3));
+ TEST_INSTRUCTION("C5ED598C2B80000000" , vmulpd(ymm1, ymm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C5ED598C2B80000000" , vmulpd(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F1ED4859CB" , vmulpd(zmm1, zmm2, zmm3));
+ TEST_INSTRUCTION("62F1ED48594C2B02" , vmulpd(zmm1, zmm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F1ED48594C2B02" , vmulpd(zmm1, zmm2, zmmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C5E859CB" , vmulps(xmm1, xmm2, xmm3));
+ TEST_INSTRUCTION("C5E8598C2B80000000" , vmulps(xmm1, xmm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C5E8598C2B80000000" , vmulps(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C5EC59CB" , vmulps(ymm1, ymm2, ymm3));
+ TEST_INSTRUCTION("C5EC598C2B80000000" , vmulps(ymm1, ymm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C5EC598C2B80000000" , vmulps(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F16C4859CB" , vmulps(zmm1, zmm2, zmm3));
+ TEST_INSTRUCTION("62F16C48594C2B02" , vmulps(zmm1, zmm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F16C48594C2B02" , vmulps(zmm1, zmm2, zmmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C5EB59CB" , vmulsd(xmm1, xmm2, xmm3));
+ TEST_INSTRUCTION("C5EB598C2B80000000" , vmulsd(xmm1, xmm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C5EB598C2B80000000" , vmulsd(xmm1, xmm2, qword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C5EA59CB" , vmulss(xmm1, xmm2, xmm3));
+ TEST_INSTRUCTION("C5EA598C2B80000000" , vmulss(xmm1, xmm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C5EA598C2B80000000" , vmulss(xmm1, xmm2, dword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C5E956CB" , vorpd(xmm1, xmm2, xmm3));
+ TEST_INSTRUCTION("C5E9568C2B80000000" , vorpd(xmm1, xmm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C5E9568C2B80000000" , vorpd(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C5ED56CB" , vorpd(ymm1, ymm2, ymm3));
+ TEST_INSTRUCTION("C5ED568C2B80000000" , vorpd(ymm1, ymm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C5ED568C2B80000000" , vorpd(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F1ED4856CB" , vorpd(zmm1, zmm2, zmm3));
+ TEST_INSTRUCTION("62F1ED48564C2B02" , vorpd(zmm1, zmm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F1ED48564C2B02" , vorpd(zmm1, zmm2, zmmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C5E856CB" , vorps(xmm1, xmm2, xmm3));
+ TEST_INSTRUCTION("C5E8568C2B80000000" , vorps(xmm1, xmm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C5E8568C2B80000000" , vorps(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C5EC56CB" , vorps(ymm1, ymm2, ymm3));
+ TEST_INSTRUCTION("C5EC568C2B80000000" , vorps(ymm1, ymm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C5EC568C2B80000000" , vorps(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F16C4856CB" , vorps(zmm1, zmm2, zmm3));
+ TEST_INSTRUCTION("62F16C48564C2B02" , vorps(zmm1, zmm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F16C48564C2B02" , vorps(zmm1, zmm2, zmmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F25F0868D1" , vp2intersectd(k2, k3, xmm4, xmm1));
+ TEST_INSTRUCTION("62F25F0868541108" , vp2intersectd(k2, k3, xmm4, ptr(ecx, edx, 0, 128)));
+ TEST_INSTRUCTION("62F25F0868541108" , vp2intersectd(k2, k3, xmm4, xmmword_ptr(ecx, edx, 0, 128)));
+ TEST_INSTRUCTION("62F25F2868D1" , vp2intersectd(k2, k3, ymm4, ymm1));
+ TEST_INSTRUCTION("62F25F2868541104" , vp2intersectd(k2, k3, ymm4, ptr(ecx, edx, 0, 128)));
+ TEST_INSTRUCTION("62F25F2868541104" , vp2intersectd(k2, k3, ymm4, ymmword_ptr(ecx, edx, 0, 128)));
+ TEST_INSTRUCTION("62F25F4868D1" , vp2intersectd(k2, k3, zmm4, zmm1));
+ TEST_INSTRUCTION("62F25F4868541102" , vp2intersectd(k2, k3, zmm4, ptr(ecx, edx, 0, 128)));
+ TEST_INSTRUCTION("62F25F4868541102" , vp2intersectd(k2, k3, zmm4, zmmword_ptr(ecx, edx, 0, 128)));
+ TEST_INSTRUCTION("62F2DF0868D1" , vp2intersectq(k2, k3, xmm4, xmm1));
+ TEST_INSTRUCTION("62F2DF0868541108" , vp2intersectq(k2, k3, xmm4, ptr(ecx, edx, 0, 128)));
+ TEST_INSTRUCTION("62F2DF0868541108" , vp2intersectq(k2, k3, xmm4, xmmword_ptr(ecx, edx, 0, 128)));
+ TEST_INSTRUCTION("62F2DF2868D1" , vp2intersectq(k2, k3, ymm4, ymm1));
+ TEST_INSTRUCTION("62F2DF2868541104" , vp2intersectq(k2, k3, ymm4, ptr(ecx, edx, 0, 128)));
+ TEST_INSTRUCTION("62F2DF2868541104" , vp2intersectq(k2, k3, ymm4, ymmword_ptr(ecx, edx, 0, 128)));
+ TEST_INSTRUCTION("62F2DF4868D1" , vp2intersectq(k2, k3, zmm4, zmm1));
+ TEST_INSTRUCTION("62F2DF4868541102" , vp2intersectq(k2, k3, zmm4, ptr(ecx, edx, 0, 128)));
+ TEST_INSTRUCTION("62F2DF4868541102" , vp2intersectq(k2, k3, zmm4, zmmword_ptr(ecx, edx, 0, 128)));
+ TEST_INSTRUCTION("62F25F48524C1A08" , vp4dpwssd(zmm1, zmm4, zmm5, zmm6, zmm7, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("62F25F48524C1A08" , vp4dpwssd(zmm1, zmm4, zmm5, zmm6, zmm7, xmmword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("62F25F48534C1A08" , vp4dpwssds(zmm1, zmm4, zmm5, zmm6, zmm7, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("62F25F48534C1A08" , vp4dpwssds(zmm1, zmm4, zmm5, zmm6, zmm7, xmmword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("C4E2791CCA" , vpabsb(xmm1, xmm2));
+ TEST_INSTRUCTION("C4E2791C8C1A80000000" , vpabsb(xmm1, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("C4E2791C8C1A80000000" , vpabsb(xmm1, xmmword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("C4E27D1CCA" , vpabsb(ymm1, ymm2));
+ TEST_INSTRUCTION("C4E27D1C8C1A80000000" , vpabsb(ymm1, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("C4E27D1C8C1A80000000" , vpabsb(ymm1, ymmword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("62F27D481CCA" , vpabsb(zmm1, zmm2));
+ TEST_INSTRUCTION("62F27D481C4C1A02" , vpabsb(zmm1, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("62F27D481C4C1A02" , vpabsb(zmm1, zmmword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("C4E2791ECA" , vpabsd(xmm1, xmm2));
+ TEST_INSTRUCTION("C4E2791E8C1A80000000" , vpabsd(xmm1, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("C4E2791E8C1A80000000" , vpabsd(xmm1, xmmword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("C4E27D1ECA" , vpabsd(ymm1, ymm2));
+ TEST_INSTRUCTION("C4E27D1E8C1A80000000" , vpabsd(ymm1, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("C4E27D1E8C1A80000000" , vpabsd(ymm1, ymmword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("62F27D481ECA" , vpabsd(zmm1, zmm2));
+ TEST_INSTRUCTION("62F27D481E4C1A02" , vpabsd(zmm1, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("62F27D481E4C1A02" , vpabsd(zmm1, zmmword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("62F2FD081FCA" , vpabsq(xmm1, xmm2));
+ TEST_INSTRUCTION("62F2FD081F4C1A08" , vpabsq(xmm1, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("62F2FD081F4C1A08" , vpabsq(xmm1, xmmword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("62F2FD281FCA" , vpabsq(ymm1, ymm2));
+ TEST_INSTRUCTION("62F2FD281F4C1A04" , vpabsq(ymm1, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("62F2FD281F4C1A04" , vpabsq(ymm1, ymmword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("62F2FD481FCA" , vpabsq(zmm1, zmm2));
+ TEST_INSTRUCTION("62F2FD481F4C1A02" , vpabsq(zmm1, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("62F2FD481F4C1A02" , vpabsq(zmm1, zmmword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("C4E2791DCA" , vpabsw(xmm1, xmm2));
+ TEST_INSTRUCTION("C4E2791D8C1A80000000" , vpabsw(xmm1, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("C4E2791D8C1A80000000" , vpabsw(xmm1, xmmword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("C4E27D1DCA" , vpabsw(ymm1, ymm2));
+ TEST_INSTRUCTION("C4E27D1D8C1A80000000" , vpabsw(ymm1, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("C4E27D1D8C1A80000000" , vpabsw(ymm1, ymmword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("62F27D481DCA" , vpabsw(zmm1, zmm2));
+ TEST_INSTRUCTION("62F27D481D4C1A02" , vpabsw(zmm1, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("62F27D481D4C1A02" , vpabsw(zmm1, zmmword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("C5E96BCB" , vpackssdw(xmm1, xmm2, xmm3));
+ TEST_INSTRUCTION("C5E96B8C2B80000000" , vpackssdw(xmm1, xmm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C5E96B8C2B80000000" , vpackssdw(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C5ED6BCB" , vpackssdw(ymm1, ymm2, ymm3));
+ TEST_INSTRUCTION("C5ED6B8C2B80000000" , vpackssdw(ymm1, ymm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C5ED6B8C2B80000000" , vpackssdw(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F16D486BCB" , vpackssdw(zmm1, zmm2, zmm3));
+ TEST_INSTRUCTION("62F16D486B4C2B02" , vpackssdw(zmm1, zmm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F16D486B4C2B02" , vpackssdw(zmm1, zmm2, zmmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C5E963CB" , vpacksswb(xmm1, xmm2, xmm3));
+ TEST_INSTRUCTION("C5E9638C2B80000000" , vpacksswb(xmm1, xmm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C5E9638C2B80000000" , vpacksswb(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C5ED63CB" , vpacksswb(ymm1, ymm2, ymm3));
+ TEST_INSTRUCTION("C5ED638C2B80000000" , vpacksswb(ymm1, ymm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C5ED638C2B80000000" , vpacksswb(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F16D4863CB" , vpacksswb(zmm1, zmm2, zmm3));
+ TEST_INSTRUCTION("62F16D48634C2B02" , vpacksswb(zmm1, zmm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F16D48634C2B02" , vpacksswb(zmm1, zmm2, zmmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C4E2692BCB" , vpackusdw(xmm1, xmm2, xmm3));
+ TEST_INSTRUCTION("C4E2692B8C2B80000000" , vpackusdw(xmm1, xmm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C4E2692B8C2B80000000" , vpackusdw(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C4E26D2BCB" , vpackusdw(ymm1, ymm2, ymm3));
+ TEST_INSTRUCTION("C4E26D2B8C2B80000000" , vpackusdw(ymm1, ymm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C4E26D2B8C2B80000000" , vpackusdw(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F26D482BCB" , vpackusdw(zmm1, zmm2, zmm3));
+ TEST_INSTRUCTION("62F26D482B4C2B02" , vpackusdw(zmm1, zmm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F26D482B4C2B02" , vpackusdw(zmm1, zmm2, zmmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C5E967CB" , vpackuswb(xmm1, xmm2, xmm3));
+ TEST_INSTRUCTION("C5E9678C2B80000000" , vpackuswb(xmm1, xmm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C5E9678C2B80000000" , vpackuswb(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C5ED67CB" , vpackuswb(ymm1, ymm2, ymm3));
+ TEST_INSTRUCTION("C5ED678C2B80000000" , vpackuswb(ymm1, ymm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C5ED678C2B80000000" , vpackuswb(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F16D4867CB" , vpackuswb(zmm1, zmm2, zmm3));
+ TEST_INSTRUCTION("62F16D48674C2B02" , vpackuswb(zmm1, zmm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F16D48674C2B02" , vpackuswb(zmm1, zmm2, zmmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C5E9FCCB" , vpaddb(xmm1, xmm2, xmm3));
+ TEST_INSTRUCTION("C5E9FC8C2B80000000" , vpaddb(xmm1, xmm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C5E9FC8C2B80000000" , vpaddb(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C5EDFCCB" , vpaddb(ymm1, ymm2, ymm3));
+ TEST_INSTRUCTION("C5EDFC8C2B80000000" , vpaddb(ymm1, ymm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C5EDFC8C2B80000000" , vpaddb(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F16D48FCCB" , vpaddb(zmm1, zmm2, zmm3));
+ TEST_INSTRUCTION("62F16D48FC4C2B02" , vpaddb(zmm1, zmm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F16D48FC4C2B02" , vpaddb(zmm1, zmm2, zmmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C5E9FECB" , vpaddd(xmm1, xmm2, xmm3));
+ TEST_INSTRUCTION("C5E9FE8C2B80000000" , vpaddd(xmm1, xmm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C5E9FE8C2B80000000" , vpaddd(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C5EDFECB" , vpaddd(ymm1, ymm2, ymm3));
+ TEST_INSTRUCTION("C5EDFE8C2B80000000" , vpaddd(ymm1, ymm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C5EDFE8C2B80000000" , vpaddd(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F16D48FECB" , vpaddd(zmm1, zmm2, zmm3));
+ TEST_INSTRUCTION("62F16D48FE4C2B02" , vpaddd(zmm1, zmm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F16D48FE4C2B02" , vpaddd(zmm1, zmm2, zmmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C5E9D4CB" , vpaddq(xmm1, xmm2, xmm3));
+ TEST_INSTRUCTION("C5E9D48C2B80000000" , vpaddq(xmm1, xmm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C5E9D48C2B80000000" , vpaddq(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C5EDD4CB" , vpaddq(ymm1, ymm2, ymm3));
+ TEST_INSTRUCTION("C5EDD48C2B80000000" , vpaddq(ymm1, ymm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C5EDD48C2B80000000" , vpaddq(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F1ED48D4CB" , vpaddq(zmm1, zmm2, zmm3));
+ TEST_INSTRUCTION("62F1ED48D44C2B02" , vpaddq(zmm1, zmm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F1ED48D44C2B02" , vpaddq(zmm1, zmm2, zmmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C5E9ECCB" , vpaddsb(xmm1, xmm2, xmm3));
+ TEST_INSTRUCTION("C5E9EC8C2B80000000" , vpaddsb(xmm1, xmm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C5E9EC8C2B80000000" , vpaddsb(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C5EDECCB" , vpaddsb(ymm1, ymm2, ymm3));
+ TEST_INSTRUCTION("C5EDEC8C2B80000000" , vpaddsb(ymm1, ymm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C5EDEC8C2B80000000" , vpaddsb(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F16D48ECCB" , vpaddsb(zmm1, zmm2, zmm3));
+ TEST_INSTRUCTION("62F16D48EC4C2B02" , vpaddsb(zmm1, zmm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F16D48EC4C2B02" , vpaddsb(zmm1, zmm2, zmmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C5E9EDCB" , vpaddsw(xmm1, xmm2, xmm3));
+ TEST_INSTRUCTION("C5E9ED8C2B80000000" , vpaddsw(xmm1, xmm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C5E9ED8C2B80000000" , vpaddsw(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C5EDEDCB" , vpaddsw(ymm1, ymm2, ymm3));
+ TEST_INSTRUCTION("C5EDED8C2B80000000" , vpaddsw(ymm1, ymm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C5EDED8C2B80000000" , vpaddsw(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F16D48EDCB" , vpaddsw(zmm1, zmm2, zmm3));
+ TEST_INSTRUCTION("62F16D48ED4C2B02" , vpaddsw(zmm1, zmm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F16D48ED4C2B02" , vpaddsw(zmm1, zmm2, zmmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C5E9DCCB" , vpaddusb(xmm1, xmm2, xmm3));
+ TEST_INSTRUCTION("C5E9DC8C2B80000000" , vpaddusb(xmm1, xmm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C5E9DC8C2B80000000" , vpaddusb(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C5EDDCCB" , vpaddusb(ymm1, ymm2, ymm3));
+ TEST_INSTRUCTION("C5EDDC8C2B80000000" , vpaddusb(ymm1, ymm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C5EDDC8C2B80000000" , vpaddusb(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F16D48DCCB" , vpaddusb(zmm1, zmm2, zmm3));
+ TEST_INSTRUCTION("62F16D48DC4C2B02" , vpaddusb(zmm1, zmm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F16D48DC4C2B02" , vpaddusb(zmm1, zmm2, zmmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C5E9DDCB" , vpaddusw(xmm1, xmm2, xmm3));
+ TEST_INSTRUCTION("C5E9DD8C2B80000000" , vpaddusw(xmm1, xmm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C5E9DD8C2B80000000" , vpaddusw(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C5EDDDCB" , vpaddusw(ymm1, ymm2, ymm3));
+ TEST_INSTRUCTION("C5EDDD8C2B80000000" , vpaddusw(ymm1, ymm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C5EDDD8C2B80000000" , vpaddusw(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F16D48DDCB" , vpaddusw(zmm1, zmm2, zmm3));
+ TEST_INSTRUCTION("62F16D48DD4C2B02" , vpaddusw(zmm1, zmm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F16D48DD4C2B02" , vpaddusw(zmm1, zmm2, zmmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C5E9FDCB" , vpaddw(xmm1, xmm2, xmm3));
+ TEST_INSTRUCTION("C5E9FD8C2B80000000" , vpaddw(xmm1, xmm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C5E9FD8C2B80000000" , vpaddw(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C5EDFDCB" , vpaddw(ymm1, ymm2, ymm3));
+ TEST_INSTRUCTION("C5EDFD8C2B80000000" , vpaddw(ymm1, ymm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C5EDFD8C2B80000000" , vpaddw(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F16D48FDCB" , vpaddw(zmm1, zmm2, zmm3));
+ TEST_INSTRUCTION("62F16D48FD4C2B02" , vpaddw(zmm1, zmm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F16D48FD4C2B02" , vpaddw(zmm1, zmm2, zmmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C4E3690FCB01" , vpalignr(xmm1, xmm2, xmm3, 1));
+ TEST_INSTRUCTION("C4E3690F8C2B8000000001" , vpalignr(xmm1, xmm2, ptr(ebx, ebp, 0, 128), 1));
+ TEST_INSTRUCTION("C4E3690F8C2B8000000001" , vpalignr(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128), 1));
+ TEST_INSTRUCTION("C4E36D0FCB01" , vpalignr(ymm1, ymm2, ymm3, 1));
+ TEST_INSTRUCTION("C4E36D0F8C2B8000000001" , vpalignr(ymm1, ymm2, ptr(ebx, ebp, 0, 128), 1));
+ TEST_INSTRUCTION("C4E36D0F8C2B8000000001" , vpalignr(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128), 1));
+ TEST_INSTRUCTION("62F36D480FCB01" , vpalignr(zmm1, zmm2, zmm3, 1));
+ TEST_INSTRUCTION("62F36D480F4C2B0201" , vpalignr(zmm1, zmm2, ptr(ebx, ebp, 0, 128), 1));
+ TEST_INSTRUCTION("62F36D480F4C2B0201" , vpalignr(zmm1, zmm2, zmmword_ptr(ebx, ebp, 0, 128), 1));
+ TEST_INSTRUCTION("C5E9DBCB" , vpand(xmm1, xmm2, xmm3));
+ TEST_INSTRUCTION("C5E9DB8C2B80000000" , vpand(xmm1, xmm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C5E9DB8C2B80000000" , vpand(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C5EDDBCB" , vpand(ymm1, ymm2, ymm3));
+ TEST_INSTRUCTION("C5EDDB8C2B80000000" , vpand(ymm1, ymm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C5EDDB8C2B80000000" , vpand(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F16D08DBCB" , vpandd(xmm1, xmm2, xmm3));
+ TEST_INSTRUCTION("62F16D08DB4C2B08" , vpandd(xmm1, xmm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F16D08DB4C2B08" , vpandd(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F16D28DBCB" , vpandd(ymm1, ymm2, ymm3));
+ TEST_INSTRUCTION("62F16D28DB4C2B04" , vpandd(ymm1, ymm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F16D28DB4C2B04" , vpandd(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F16D48DBCB" , vpandd(zmm1, zmm2, zmm3));
+ TEST_INSTRUCTION("62F16D48DB4C2B02" , vpandd(zmm1, zmm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F16D48DB4C2B02" , vpandd(zmm1, zmm2, zmmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C5E9DFCB" , vpandn(xmm1, xmm2, xmm3));
+ TEST_INSTRUCTION("C5E9DF8C2B80000000" , vpandn(xmm1, xmm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C5E9DF8C2B80000000" , vpandn(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C5EDDFCB" , vpandn(ymm1, ymm2, ymm3));
+ TEST_INSTRUCTION("C5EDDF8C2B80000000" , vpandn(ymm1, ymm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C5EDDF8C2B80000000" , vpandn(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F16D08DFCB" , vpandnd(xmm1, xmm2, xmm3));
+ TEST_INSTRUCTION("62F16D08DF4C2B08" , vpandnd(xmm1, xmm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F16D08DF4C2B08" , vpandnd(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F16D28DFCB" , vpandnd(ymm1, ymm2, ymm3));
+ TEST_INSTRUCTION("62F16D28DF4C2B04" , vpandnd(ymm1, ymm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F16D28DF4C2B04" , vpandnd(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F16D48DFCB" , vpandnd(zmm1, zmm2, zmm3));
+ TEST_INSTRUCTION("62F16D48DF4C2B02" , vpandnd(zmm1, zmm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F16D48DF4C2B02" , vpandnd(zmm1, zmm2, zmmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F1ED08DFCB" , vpandnq(xmm1, xmm2, xmm3));
+ TEST_INSTRUCTION("62F1ED08DF4C2B08" , vpandnq(xmm1, xmm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F1ED08DF4C2B08" , vpandnq(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F1ED28DFCB" , vpandnq(ymm1, ymm2, ymm3));
+ TEST_INSTRUCTION("62F1ED28DF4C2B04" , vpandnq(ymm1, ymm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F1ED28DF4C2B04" , vpandnq(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F1ED48DFCB" , vpandnq(zmm1, zmm2, zmm3));
+ TEST_INSTRUCTION("62F1ED48DF4C2B02" , vpandnq(zmm1, zmm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F1ED48DF4C2B02" , vpandnq(zmm1, zmm2, zmmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F1ED08DBCB" , vpandq(xmm1, xmm2, xmm3));
+ TEST_INSTRUCTION("62F1ED08DB4C2B08" , vpandq(xmm1, xmm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F1ED08DB4C2B08" , vpandq(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F1ED28DBCB" , vpandq(ymm1, ymm2, ymm3));
+ TEST_INSTRUCTION("62F1ED28DB4C2B04" , vpandq(ymm1, ymm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F1ED28DB4C2B04" , vpandq(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F1ED48DBCB" , vpandq(zmm1, zmm2, zmm3));
+ TEST_INSTRUCTION("62F1ED48DB4C2B02" , vpandq(zmm1, zmm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F1ED48DB4C2B02" , vpandq(zmm1, zmm2, zmmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C5E9E0CB" , vpavgb(xmm1, xmm2, xmm3));
+ TEST_INSTRUCTION("C5E9E08C2B80000000" , vpavgb(xmm1, xmm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C5E9E08C2B80000000" , vpavgb(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C5EDE0CB" , vpavgb(ymm1, ymm2, ymm3));
+ TEST_INSTRUCTION("C5EDE08C2B80000000" , vpavgb(ymm1, ymm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C5EDE08C2B80000000" , vpavgb(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F16D48E0CB" , vpavgb(zmm1, zmm2, zmm3));
+ TEST_INSTRUCTION("62F16D48E04C2B02" , vpavgb(zmm1, zmm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F16D48E04C2B02" , vpavgb(zmm1, zmm2, zmmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C5E9E3CB" , vpavgw(xmm1, xmm2, xmm3));
+ TEST_INSTRUCTION("C5E9E38C2B80000000" , vpavgw(xmm1, xmm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C5E9E38C2B80000000" , vpavgw(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C5EDE3CB" , vpavgw(ymm1, ymm2, ymm3));
+ TEST_INSTRUCTION("C5EDE38C2B80000000" , vpavgw(ymm1, ymm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C5EDE38C2B80000000" , vpavgw(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F16D48E3CB" , vpavgw(zmm1, zmm2, zmm3));
+ TEST_INSTRUCTION("62F16D48E34C2B02" , vpavgw(zmm1, zmm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F16D48E34C2B02" , vpavgw(zmm1, zmm2, zmmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C4E36902CB01" , vpblendd(xmm1, xmm2, xmm3, 1));
+ TEST_INSTRUCTION("C4E369028C2B8000000001" , vpblendd(xmm1, xmm2, ptr(ebx, ebp, 0, 128), 1));
+ TEST_INSTRUCTION("C4E369028C2B8000000001" , vpblendd(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128), 1));
+ TEST_INSTRUCTION("C4E36D02CB01" , vpblendd(ymm1, ymm2, ymm3, 1));
+ TEST_INSTRUCTION("C4E36D028C2B8000000001" , vpblendd(ymm1, ymm2, ptr(ebx, ebp, 0, 128), 1));
+ TEST_INSTRUCTION("C4E36D028C2B8000000001" , vpblendd(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128), 1));
+ TEST_INSTRUCTION("62F26D0866CB" , vpblendmb(xmm1, xmm2, xmm3));
+ TEST_INSTRUCTION("62F26D08664C2B08" , vpblendmb(xmm1, xmm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F26D08664C2B08" , vpblendmb(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F26D2866CB" , vpblendmb(ymm1, ymm2, ymm3));
+ TEST_INSTRUCTION("62F26D28664C2B04" , vpblendmb(ymm1, ymm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F26D28664C2B04" , vpblendmb(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F26D4866CB" , vpblendmb(zmm1, zmm2, zmm3));
+ TEST_INSTRUCTION("62F26D48664C2B02" , vpblendmb(zmm1, zmm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F26D48664C2B02" , vpblendmb(zmm1, zmm2, zmmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F26D0864CB" , vpblendmd(xmm1, xmm2, xmm3));
+ TEST_INSTRUCTION("62F26D08644C2B08" , vpblendmd(xmm1, xmm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F26D08644C2B08" , vpblendmd(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F26D2864CB" , vpblendmd(ymm1, ymm2, ymm3));
+ TEST_INSTRUCTION("62F26D28644C2B04" , vpblendmd(ymm1, ymm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F26D28644C2B04" , vpblendmd(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F26D4864CB" , vpblendmd(zmm1, zmm2, zmm3));
+ TEST_INSTRUCTION("62F26D48644C2B02" , vpblendmd(zmm1, zmm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F26D48644C2B02" , vpblendmd(zmm1, zmm2, zmmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F2ED0864CB" , vpblendmq(xmm1, xmm2, xmm3));
+ TEST_INSTRUCTION("62F2ED08644C2B08" , vpblendmq(xmm1, xmm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F2ED08644C2B08" , vpblendmq(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F2ED2864CB" , vpblendmq(ymm1, ymm2, ymm3));
+ TEST_INSTRUCTION("62F2ED28644C2B04" , vpblendmq(ymm1, ymm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F2ED28644C2B04" , vpblendmq(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F2ED4864CB" , vpblendmq(zmm1, zmm2, zmm3));
+ TEST_INSTRUCTION("62F2ED48644C2B02" , vpblendmq(zmm1, zmm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F2ED48644C2B02" , vpblendmq(zmm1, zmm2, zmmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F2ED0866CB" , vpblendmw(xmm1, xmm2, xmm3));
+ TEST_INSTRUCTION("62F2ED08664C2B08" , vpblendmw(xmm1, xmm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F2ED08664C2B08" , vpblendmw(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F2ED2866CB" , vpblendmw(ymm1, ymm2, ymm3));
+ TEST_INSTRUCTION("62F2ED28664C2B04" , vpblendmw(ymm1, ymm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F2ED28664C2B04" , vpblendmw(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F2ED4866CB" , vpblendmw(zmm1, zmm2, zmm3));
+ TEST_INSTRUCTION("62F2ED48664C2B02" , vpblendmw(zmm1, zmm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F2ED48664C2B02" , vpblendmw(zmm1, zmm2, zmmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C4E3694CCB40" , vpblendvb(xmm1, xmm2, xmm3, xmm4));
+ TEST_INSTRUCTION("C4E3694C8C2B8000000060" , vpblendvb(xmm1, xmm2, ptr(ebx, ebp, 0, 128), xmm6));
+ TEST_INSTRUCTION("C4E3694C8C2B8000000060" , vpblendvb(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128), xmm6));
+ TEST_INSTRUCTION("C4E36D4CCB40" , vpblendvb(ymm1, ymm2, ymm3, ymm4));
+ TEST_INSTRUCTION("C4E36D4C8C2B8000000060" , vpblendvb(ymm1, ymm2, ptr(ebx, ebp, 0, 128), ymm6));
+ TEST_INSTRUCTION("C4E36D4C8C2B8000000060" , vpblendvb(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128), ymm6));
+ TEST_INSTRUCTION("C4E3690ECB01" , vpblendw(xmm1, xmm2, xmm3, 1));
+ TEST_INSTRUCTION("C4E3690E8C2B8000000001" , vpblendw(xmm1, xmm2, ptr(ebx, ebp, 0, 128), 1));
+ TEST_INSTRUCTION("C4E3690E8C2B8000000001" , vpblendw(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128), 1));
+ TEST_INSTRUCTION("C4E36D0ECB01" , vpblendw(ymm1, ymm2, ymm3, 1));
+ TEST_INSTRUCTION("C4E36D0E8C2B8000000001" , vpblendw(ymm1, ymm2, ptr(ebx, ebp, 0, 128), 1));
+ TEST_INSTRUCTION("C4E36D0E8C2B8000000001" , vpblendw(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128), 1));
+ TEST_INSTRUCTION("62F27D087ACA" , vpbroadcastb(xmm1, edx));
+ TEST_INSTRUCTION("C4E27978CA" , vpbroadcastb(xmm1, xmm2));
+ TEST_INSTRUCTION("C4E279788C1A80000000" , vpbroadcastb(xmm1, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("C4E279788C1A80000000" , vpbroadcastb(xmm1, byte_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("62F27D287ACA" , vpbroadcastb(ymm1, edx));
+ TEST_INSTRUCTION("C4E27D78CA" , vpbroadcastb(ymm1, xmm2));
+ TEST_INSTRUCTION("C4E27D788C1A80000000" , vpbroadcastb(ymm1, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("C4E27D788C1A80000000" , vpbroadcastb(ymm1, byte_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("62F27D487ACA" , vpbroadcastb(zmm1, edx));
+ TEST_INSTRUCTION("62F27D4878CA" , vpbroadcastb(zmm1, xmm2));
+ TEST_INSTRUCTION("62F27D48788C1A80000000" , vpbroadcastb(zmm1, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("62F27D48788C1A80000000" , vpbroadcastb(zmm1, byte_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("62F27D087CCA" , vpbroadcastd(xmm1, edx));
+ TEST_INSTRUCTION("C4E27958CA" , vpbroadcastd(xmm1, xmm2));
+ TEST_INSTRUCTION("C4E279588C1A80000000" , vpbroadcastd(xmm1, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("C4E279588C1A80000000" , vpbroadcastd(xmm1, dword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("62F27D287CCA" , vpbroadcastd(ymm1, edx));
+ TEST_INSTRUCTION("C4E27D58CA" , vpbroadcastd(ymm1, xmm2));
+ TEST_INSTRUCTION("C4E27D588C1A80000000" , vpbroadcastd(ymm1, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("C4E27D588C1A80000000" , vpbroadcastd(ymm1, dword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("62F27D487CCA" , vpbroadcastd(zmm1, edx));
+ TEST_INSTRUCTION("62F27D4858CA" , vpbroadcastd(zmm1, xmm2));
+ TEST_INSTRUCTION("62F27D48584C1A20" , vpbroadcastd(zmm1, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("62F27D48584C1A20" , vpbroadcastd(zmm1, dword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("62F2FE082ACA" , vpbroadcastmb2q(xmm1, k2));
+ TEST_INSTRUCTION("62F2FE282ACA" , vpbroadcastmb2q(ymm1, k2));
+ TEST_INSTRUCTION("62F2FE482ACA" , vpbroadcastmb2q(zmm1, k2));
+ TEST_INSTRUCTION("62F27E083ACA" , vpbroadcastmw2d(xmm1, k2));
+ TEST_INSTRUCTION("62F27E283ACA" , vpbroadcastmw2d(ymm1, k2));
+ TEST_INSTRUCTION("62F27E483ACA" , vpbroadcastmw2d(zmm1, k2));
+ TEST_INSTRUCTION("C4E27959CA" , vpbroadcastq(xmm1, xmm2));
+ TEST_INSTRUCTION("C4E279598C1A80000000" , vpbroadcastq(xmm1, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("C4E279598C1A80000000" , vpbroadcastq(xmm1, qword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("C4E27D59CA" , vpbroadcastq(ymm1, xmm2));
+ TEST_INSTRUCTION("C4E27D598C1A80000000" , vpbroadcastq(ymm1, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("C4E27D598C1A80000000" , vpbroadcastq(ymm1, qword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("62F2FD4859CA" , vpbroadcastq(zmm1, xmm2));
+ TEST_INSTRUCTION("62F2FD48594C1A10" , vpbroadcastq(zmm1, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("62F2FD48594C1A10" , vpbroadcastq(zmm1, qword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("62F27D087BCA" , vpbroadcastw(xmm1, edx));
+ TEST_INSTRUCTION("C4E27979CA" , vpbroadcastw(xmm1, xmm2));
+ TEST_INSTRUCTION("C4E279798C1A80000000" , vpbroadcastw(xmm1, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("C4E279798C1A80000000" , vpbroadcastw(xmm1, word_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("62F27D287BCA" , vpbroadcastw(ymm1, edx));
+ TEST_INSTRUCTION("C4E27D79CA" , vpbroadcastw(ymm1, xmm2));
+ TEST_INSTRUCTION("C4E27D798C1A80000000" , vpbroadcastw(ymm1, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("C4E27D798C1A80000000" , vpbroadcastw(ymm1, word_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("62F27D487BCA" , vpbroadcastw(zmm1, edx));
+ TEST_INSTRUCTION("62F27D4879CA" , vpbroadcastw(zmm1, xmm2));
+ TEST_INSTRUCTION("62F27D48794C1A40" , vpbroadcastw(zmm1, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("62F27D48794C1A40" , vpbroadcastw(zmm1, word_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("C4E36944CB01" , vpclmulqdq(xmm1, xmm2, xmm3, 1));
+ TEST_INSTRUCTION("C4E369448C2B8000000001" , vpclmulqdq(xmm1, xmm2, ptr(ebx, ebp, 0, 128), 1));
+ TEST_INSTRUCTION("C4E369448C2B8000000001" , vpclmulqdq(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128), 1));
+ TEST_INSTRUCTION("C4E36D44CB01" , vpclmulqdq(ymm1, ymm2, ymm3, 1));
+ TEST_INSTRUCTION("C4E36D448C2B8000000001" , vpclmulqdq(ymm1, ymm2, ptr(ebx, ebp, 0, 128), 1));
+ TEST_INSTRUCTION("C4E36D448C2B8000000001" , vpclmulqdq(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128), 1));
+ TEST_INSTRUCTION("62F36D4844CB01" , vpclmulqdq(zmm1, zmm2, zmm3, 1));
+ TEST_INSTRUCTION("62F36D48444C2B0201" , vpclmulqdq(zmm1, zmm2, ptr(ebx, ebp, 0, 128), 1));
+ TEST_INSTRUCTION("62F36D48444C2B0201" , vpclmulqdq(zmm1, zmm2, zmmword_ptr(ebx, ebp, 0, 128), 1));
+ TEST_INSTRUCTION("8FE868A2CB40" , vpcmov(xmm1, xmm2, xmm3, xmm4));
+ TEST_INSTRUCTION("8FE8E8A28C358000000030" , vpcmov(xmm1, xmm2, xmm3, ptr(ebp, esi, 0, 128)));
+ TEST_INSTRUCTION("8FE8E8A28C358000000030" , vpcmov(xmm1, xmm2, xmm3, xmmword_ptr(ebp, esi, 0, 128)));
+ TEST_INSTRUCTION("8FE868A28C2B8000000060" , vpcmov(xmm1, xmm2, ptr(ebx, ebp, 0, 128), xmm6));
+ TEST_INSTRUCTION("8FE868A28C2B8000000060" , vpcmov(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128), xmm6));
+ TEST_INSTRUCTION("8FE86CA2CB40" , vpcmov(ymm1, ymm2, ymm3, ymm4));
+ TEST_INSTRUCTION("8FE8ECA28C358000000030" , vpcmov(ymm1, ymm2, ymm3, ptr(ebp, esi, 0, 128)));
+ TEST_INSTRUCTION("8FE8ECA28C358000000030" , vpcmov(ymm1, ymm2, ymm3, ymmword_ptr(ebp, esi, 0, 128)));
+ TEST_INSTRUCTION("8FE86CA28C2B8000000060" , vpcmov(ymm1, ymm2, ptr(ebx, ebp, 0, 128), ymm6));
+ TEST_INSTRUCTION("8FE86CA28C2B8000000060" , vpcmov(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128), ymm6));
+ TEST_INSTRUCTION("62F36D083FCB01" , vpcmpb(k1, xmm2, xmm3, 1));
+ TEST_INSTRUCTION("62F36D083F4C2B0801" , vpcmpb(k1, xmm2, ptr(ebx, ebp, 0, 128), 1));
+ TEST_INSTRUCTION("62F36D083F4C2B0801" , vpcmpb(k1, xmm2, xmmword_ptr(ebx, ebp, 0, 128), 1));
+ TEST_INSTRUCTION("62F36D283FCB01" , vpcmpb(k1, ymm2, ymm3, 1));
+ TEST_INSTRUCTION("62F36D283F4C2B0401" , vpcmpb(k1, ymm2, ptr(ebx, ebp, 0, 128), 1));
+ TEST_INSTRUCTION("62F36D283F4C2B0401" , vpcmpb(k1, ymm2, ymmword_ptr(ebx, ebp, 0, 128), 1));
+ TEST_INSTRUCTION("62F36D483FCB01" , vpcmpb(k1, zmm2, zmm3, 1));
+ TEST_INSTRUCTION("62F36D483F4C2B0201" , vpcmpb(k1, zmm2, ptr(ebx, ebp, 0, 128), 1));
+ TEST_INSTRUCTION("62F36D483F4C2B0201" , vpcmpb(k1, zmm2, zmmword_ptr(ebx, ebp, 0, 128), 1));
+ TEST_INSTRUCTION("62F36D081FCB01" , vpcmpd(k1, xmm2, xmm3, 1));
+ TEST_INSTRUCTION("62F36D081F4C2B0801" , vpcmpd(k1, xmm2, ptr(ebx, ebp, 0, 128), 1));
+ TEST_INSTRUCTION("62F36D081F4C2B0801" , vpcmpd(k1, xmm2, xmmword_ptr(ebx, ebp, 0, 128), 1));
+ TEST_INSTRUCTION("62F36D281FCB01" , vpcmpd(k1, ymm2, ymm3, 1));
+ TEST_INSTRUCTION("62F36D281F4C2B0401" , vpcmpd(k1, ymm2, ptr(ebx, ebp, 0, 128), 1));
+ TEST_INSTRUCTION("62F36D281F4C2B0401" , vpcmpd(k1, ymm2, ymmword_ptr(ebx, ebp, 0, 128), 1));
+ TEST_INSTRUCTION("62F36D481FCB01" , vpcmpd(k1, zmm2, zmm3, 1));
+ TEST_INSTRUCTION("62F36D481F4C2B0201" , vpcmpd(k1, zmm2, ptr(ebx, ebp, 0, 128), 1));
+ TEST_INSTRUCTION("62F36D481F4C2B0201" , vpcmpd(k1, zmm2, zmmword_ptr(ebx, ebp, 0, 128), 1));
+ TEST_INSTRUCTION("C5E974CB" , vpcmpeqb(xmm1, xmm2, xmm3));
+ TEST_INSTRUCTION("C5E9748C2B80000000" , vpcmpeqb(xmm1, xmm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C5E9748C2B80000000" , vpcmpeqb(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F16D0874CB" , vpcmpeqb(k1, xmm2, xmm3));
+ TEST_INSTRUCTION("62F16D08744C2B08" , vpcmpeqb(k1, xmm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F16D08744C2B08" , vpcmpeqb(k1, xmm2, xmmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C5ED74CB" , vpcmpeqb(ymm1, ymm2, ymm3));
+ TEST_INSTRUCTION("C5ED748C2B80000000" , vpcmpeqb(ymm1, ymm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C5ED748C2B80000000" , vpcmpeqb(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F16D2874CB" , vpcmpeqb(k1, ymm2, ymm3));
+ TEST_INSTRUCTION("62F16D28744C2B04" , vpcmpeqb(k1, ymm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F16D28744C2B04" , vpcmpeqb(k1, ymm2, ymmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F16D4874CB" , vpcmpeqb(k1, zmm2, zmm3));
+ TEST_INSTRUCTION("62F16D48744C2B02" , vpcmpeqb(k1, zmm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F16D48744C2B02" , vpcmpeqb(k1, zmm2, zmmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C5E976CB" , vpcmpeqd(xmm1, xmm2, xmm3));
+ TEST_INSTRUCTION("C5E9768C2B80000000" , vpcmpeqd(xmm1, xmm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C5E9768C2B80000000" , vpcmpeqd(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F16D0876CB" , vpcmpeqd(k1, xmm2, xmm3));
+ TEST_INSTRUCTION("62F16D08764C2B08" , vpcmpeqd(k1, xmm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F16D08764C2B08" , vpcmpeqd(k1, xmm2, xmmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C5ED76CB" , vpcmpeqd(ymm1, ymm2, ymm3));
+ TEST_INSTRUCTION("C5ED768C2B80000000" , vpcmpeqd(ymm1, ymm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C5ED768C2B80000000" , vpcmpeqd(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F16D2876CB" , vpcmpeqd(k1, ymm2, ymm3));
+ TEST_INSTRUCTION("62F16D28764C2B04" , vpcmpeqd(k1, ymm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F16D28764C2B04" , vpcmpeqd(k1, ymm2, ymmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F16D4876CB" , vpcmpeqd(k1, zmm2, zmm3));
+ TEST_INSTRUCTION("62F16D48764C2B02" , vpcmpeqd(k1, zmm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F16D48764C2B02" , vpcmpeqd(k1, zmm2, zmmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C4E26929CB" , vpcmpeqq(xmm1, xmm2, xmm3));
+ TEST_INSTRUCTION("C4E269298C2B80000000" , vpcmpeqq(xmm1, xmm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C4E269298C2B80000000" , vpcmpeqq(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F2ED0829CB" , vpcmpeqq(k1, xmm2, xmm3));
+ TEST_INSTRUCTION("62F2ED08294C2B08" , vpcmpeqq(k1, xmm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F2ED08294C2B08" , vpcmpeqq(k1, xmm2, xmmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C4E26D29CB" , vpcmpeqq(ymm1, ymm2, ymm3));
+ TEST_INSTRUCTION("C4E26D298C2B80000000" , vpcmpeqq(ymm1, ymm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C4E26D298C2B80000000" , vpcmpeqq(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F2ED2829CB" , vpcmpeqq(k1, ymm2, ymm3));
+ TEST_INSTRUCTION("62F2ED28294C2B04" , vpcmpeqq(k1, ymm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F2ED28294C2B04" , vpcmpeqq(k1, ymm2, ymmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F2ED4829CB" , vpcmpeqq(k1, zmm2, zmm3));
+ TEST_INSTRUCTION("62F2ED48294C2B02" , vpcmpeqq(k1, zmm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F2ED48294C2B02" , vpcmpeqq(k1, zmm2, zmmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C5E975CB" , vpcmpeqw(xmm1, xmm2, xmm3));
+ TEST_INSTRUCTION("C5E9758C2B80000000" , vpcmpeqw(xmm1, xmm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C5E9758C2B80000000" , vpcmpeqw(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F16D0875CB" , vpcmpeqw(k1, xmm2, xmm3));
+ TEST_INSTRUCTION("62F16D08754C2B08" , vpcmpeqw(k1, xmm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F16D08754C2B08" , vpcmpeqw(k1, xmm2, xmmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C5ED75CB" , vpcmpeqw(ymm1, ymm2, ymm3));
+ TEST_INSTRUCTION("C5ED758C2B80000000" , vpcmpeqw(ymm1, ymm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C5ED758C2B80000000" , vpcmpeqw(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F16D2875CB" , vpcmpeqw(k1, ymm2, ymm3));
+ TEST_INSTRUCTION("62F16D28754C2B04" , vpcmpeqw(k1, ymm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F16D28754C2B04" , vpcmpeqw(k1, ymm2, ymmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F16D4875CB" , vpcmpeqw(k1, zmm2, zmm3));
+ TEST_INSTRUCTION("62F16D48754C2B02" , vpcmpeqw(k1, zmm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F16D48754C2B02" , vpcmpeqw(k1, zmm2, zmmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C4E37961CA01" , vpcmpestri(xmm1, xmm2, 1, ecx, eax, edx));
+ TEST_INSTRUCTION("C4E379618C1A8000000001" , vpcmpestri(xmm1, ptr(edx, ebx, 0, 128), 1, ecx, eax, edx));
+ TEST_INSTRUCTION("C4E379618C1A8000000001" , vpcmpestri(xmm1, xmmword_ptr(edx, ebx, 0, 128), 1, ecx, eax, edx));
+ TEST_INSTRUCTION("C4E37960CA01" , vpcmpestrm(xmm1, xmm2, 1, xmm0, eax, edx));
+ TEST_INSTRUCTION("C4E379608C1A8000000001" , vpcmpestrm(xmm1, ptr(edx, ebx, 0, 128), 1, xmm0, eax, edx));
+ TEST_INSTRUCTION("C4E379608C1A8000000001" , vpcmpestrm(xmm1, xmmword_ptr(edx, ebx, 0, 128), 1, xmm0, eax, edx));
+ TEST_INSTRUCTION("C5E964CB" , vpcmpgtb(xmm1, xmm2, xmm3));
+ TEST_INSTRUCTION("C5E9648C2B80000000" , vpcmpgtb(xmm1, xmm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C5E9648C2B80000000" , vpcmpgtb(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F16D0864CB" , vpcmpgtb(k1, xmm2, xmm3));
+ TEST_INSTRUCTION("62F16D08644C2B08" , vpcmpgtb(k1, xmm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F16D08644C2B08" , vpcmpgtb(k1, xmm2, xmmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C5ED64CB" , vpcmpgtb(ymm1, ymm2, ymm3));
+ TEST_INSTRUCTION("C5ED648C2B80000000" , vpcmpgtb(ymm1, ymm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C5ED648C2B80000000" , vpcmpgtb(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F16D2864CB" , vpcmpgtb(k1, ymm2, ymm3));
+ TEST_INSTRUCTION("62F16D28644C2B04" , vpcmpgtb(k1, ymm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F16D28644C2B04" , vpcmpgtb(k1, ymm2, ymmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F16D4864CB" , vpcmpgtb(k1, zmm2, zmm3));
+ TEST_INSTRUCTION("62F16D48644C2B02" , vpcmpgtb(k1, zmm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F16D48644C2B02" , vpcmpgtb(k1, zmm2, zmmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C5E966CB" , vpcmpgtd(xmm1, xmm2, xmm3));
+ TEST_INSTRUCTION("C5E9668C2B80000000" , vpcmpgtd(xmm1, xmm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C5E9668C2B80000000" , vpcmpgtd(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F16D0866CB" , vpcmpgtd(k1, xmm2, xmm3));
+ TEST_INSTRUCTION("62F16D08664C2B08" , vpcmpgtd(k1, xmm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F16D08664C2B08" , vpcmpgtd(k1, xmm2, xmmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C5ED66CB" , vpcmpgtd(ymm1, ymm2, ymm3));
+ TEST_INSTRUCTION("C5ED668C2B80000000" , vpcmpgtd(ymm1, ymm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C5ED668C2B80000000" , vpcmpgtd(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F16D2866CB" , vpcmpgtd(k1, ymm2, ymm3));
+ TEST_INSTRUCTION("62F16D28664C2B04" , vpcmpgtd(k1, ymm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F16D28664C2B04" , vpcmpgtd(k1, ymm2, ymmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F16D4866CB" , vpcmpgtd(k1, zmm2, zmm3));
+ TEST_INSTRUCTION("62F16D48664C2B02" , vpcmpgtd(k1, zmm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F16D48664C2B02" , vpcmpgtd(k1, zmm2, zmmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C4E26937CB" , vpcmpgtq(xmm1, xmm2, xmm3));
+ TEST_INSTRUCTION("C4E269378C2B80000000" , vpcmpgtq(xmm1, xmm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C4E269378C2B80000000" , vpcmpgtq(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F2ED0837CB" , vpcmpgtq(k1, xmm2, xmm3));
+ TEST_INSTRUCTION("62F2ED08374C2B08" , vpcmpgtq(k1, xmm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F2ED08374C2B08" , vpcmpgtq(k1, xmm2, xmmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C4E26D37CB" , vpcmpgtq(ymm1, ymm2, ymm3));
+ TEST_INSTRUCTION("C4E26D378C2B80000000" , vpcmpgtq(ymm1, ymm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C4E26D378C2B80000000" , vpcmpgtq(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F2ED2837CB" , vpcmpgtq(k1, ymm2, ymm3));
+ TEST_INSTRUCTION("62F2ED28374C2B04" , vpcmpgtq(k1, ymm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F2ED28374C2B04" , vpcmpgtq(k1, ymm2, ymmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F2ED4837CB" , vpcmpgtq(k1, zmm2, zmm3));
+ TEST_INSTRUCTION("62F2ED48374C2B02" , vpcmpgtq(k1, zmm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F2ED48374C2B02" , vpcmpgtq(k1, zmm2, zmmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C5E965CB" , vpcmpgtw(xmm1, xmm2, xmm3));
+ TEST_INSTRUCTION("C5E9658C2B80000000" , vpcmpgtw(xmm1, xmm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C5E9658C2B80000000" , vpcmpgtw(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F16D0865CB" , vpcmpgtw(k1, xmm2, xmm3));
+ TEST_INSTRUCTION("62F16D08654C2B08" , vpcmpgtw(k1, xmm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F16D08654C2B08" , vpcmpgtw(k1, xmm2, xmmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C5ED65CB" , vpcmpgtw(ymm1, ymm2, ymm3));
+ TEST_INSTRUCTION("C5ED658C2B80000000" , vpcmpgtw(ymm1, ymm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C5ED658C2B80000000" , vpcmpgtw(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F16D2865CB" , vpcmpgtw(k1, ymm2, ymm3));
+ TEST_INSTRUCTION("62F16D28654C2B04" , vpcmpgtw(k1, ymm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F16D28654C2B04" , vpcmpgtw(k1, ymm2, ymmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F16D4865CB" , vpcmpgtw(k1, zmm2, zmm3));
+ TEST_INSTRUCTION("62F16D48654C2B02" , vpcmpgtw(k1, zmm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F16D48654C2B02" , vpcmpgtw(k1, zmm2, zmmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C4E37963CA01" , vpcmpistri(xmm1, xmm2, 1, ecx));
+ TEST_INSTRUCTION("C4E379638C1A8000000001" , vpcmpistri(xmm1, ptr(edx, ebx, 0, 128), 1, ecx));
+ TEST_INSTRUCTION("C4E379638C1A8000000001" , vpcmpistri(xmm1, xmmword_ptr(edx, ebx, 0, 128), 1, ecx));
+ TEST_INSTRUCTION("C4E37962CA01" , vpcmpistrm(xmm1, xmm2, 1, xmm0));
+ TEST_INSTRUCTION("C4E379628C1A8000000001" , vpcmpistrm(xmm1, ptr(edx, ebx, 0, 128), 1, xmm0));
+ TEST_INSTRUCTION("C4E379628C1A8000000001" , vpcmpistrm(xmm1, xmmword_ptr(edx, ebx, 0, 128), 1, xmm0));
+ TEST_INSTRUCTION("62F3ED081FCB01" , vpcmpq(k1, xmm2, xmm3, 1));
+ TEST_INSTRUCTION("62F3ED081F4C2B0801" , vpcmpq(k1, xmm2, ptr(ebx, ebp, 0, 128), 1));
+ TEST_INSTRUCTION("62F3ED081F4C2B0801" , vpcmpq(k1, xmm2, xmmword_ptr(ebx, ebp, 0, 128), 1));
+ TEST_INSTRUCTION("62F3ED281FCB01" , vpcmpq(k1, ymm2, ymm3, 1));
+ TEST_INSTRUCTION("62F3ED281F4C2B0401" , vpcmpq(k1, ymm2, ptr(ebx, ebp, 0, 128), 1));
+ TEST_INSTRUCTION("62F3ED281F4C2B0401" , vpcmpq(k1, ymm2, ymmword_ptr(ebx, ebp, 0, 128), 1));
+ TEST_INSTRUCTION("62F3ED481FCB01" , vpcmpq(k1, zmm2, zmm3, 1));
+ TEST_INSTRUCTION("62F3ED481F4C2B0201" , vpcmpq(k1, zmm2, ptr(ebx, ebp, 0, 128), 1));
+ TEST_INSTRUCTION("62F3ED481F4C2B0201" , vpcmpq(k1, zmm2, zmmword_ptr(ebx, ebp, 0, 128), 1));
+ TEST_INSTRUCTION("62F36D083ECB01" , vpcmpub(k1, xmm2, xmm3, 1));
+ TEST_INSTRUCTION("62F36D083E4C2B0801" , vpcmpub(k1, xmm2, ptr(ebx, ebp, 0, 128), 1));
+ TEST_INSTRUCTION("62F36D083E4C2B0801" , vpcmpub(k1, xmm2, xmmword_ptr(ebx, ebp, 0, 128), 1));
+ TEST_INSTRUCTION("62F36D283ECB01" , vpcmpub(k1, ymm2, ymm3, 1));
+ TEST_INSTRUCTION("62F36D283E4C2B0401" , vpcmpub(k1, ymm2, ptr(ebx, ebp, 0, 128), 1));
+ TEST_INSTRUCTION("62F36D283E4C2B0401" , vpcmpub(k1, ymm2, ymmword_ptr(ebx, ebp, 0, 128), 1));
+ TEST_INSTRUCTION("62F36D483ECB01" , vpcmpub(k1, zmm2, zmm3, 1));
+ TEST_INSTRUCTION("62F36D483E4C2B0201" , vpcmpub(k1, zmm2, ptr(ebx, ebp, 0, 128), 1));
+ TEST_INSTRUCTION("62F36D483E4C2B0201" , vpcmpub(k1, zmm2, zmmword_ptr(ebx, ebp, 0, 128), 1));
+ TEST_INSTRUCTION("62F36D081ECB01" , vpcmpud(k1, xmm2, xmm3, 1));
+ TEST_INSTRUCTION("62F36D081E4C2B0801" , vpcmpud(k1, xmm2, ptr(ebx, ebp, 0, 128), 1));
+ TEST_INSTRUCTION("62F36D081E4C2B0801" , vpcmpud(k1, xmm2, xmmword_ptr(ebx, ebp, 0, 128), 1));
+ TEST_INSTRUCTION("62F36D281ECB01" , vpcmpud(k1, ymm2, ymm3, 1));
+ TEST_INSTRUCTION("62F36D281E4C2B0401" , vpcmpud(k1, ymm2, ptr(ebx, ebp, 0, 128), 1));
+ TEST_INSTRUCTION("62F36D281E4C2B0401" , vpcmpud(k1, ymm2, ymmword_ptr(ebx, ebp, 0, 128), 1));
+ TEST_INSTRUCTION("62F36D481ECB01" , vpcmpud(k1, zmm2, zmm3, 1));
+ TEST_INSTRUCTION("62F36D481E4C2B0201" , vpcmpud(k1, zmm2, ptr(ebx, ebp, 0, 128), 1));
+ TEST_INSTRUCTION("62F36D481E4C2B0201" , vpcmpud(k1, zmm2, zmmword_ptr(ebx, ebp, 0, 128), 1));
+ TEST_INSTRUCTION("62F3ED081ECB01" , vpcmpuq(k1, xmm2, xmm3, 1));
+ TEST_INSTRUCTION("62F3ED081E4C2B0801" , vpcmpuq(k1, xmm2, ptr(ebx, ebp, 0, 128), 1));
+ TEST_INSTRUCTION("62F3ED081E4C2B0801" , vpcmpuq(k1, xmm2, xmmword_ptr(ebx, ebp, 0, 128), 1));
+ TEST_INSTRUCTION("62F3ED281ECB01" , vpcmpuq(k1, ymm2, ymm3, 1));
+ TEST_INSTRUCTION("62F3ED281E4C2B0401" , vpcmpuq(k1, ymm2, ptr(ebx, ebp, 0, 128), 1));
+ TEST_INSTRUCTION("62F3ED281E4C2B0401" , vpcmpuq(k1, ymm2, ymmword_ptr(ebx, ebp, 0, 128), 1));
+ TEST_INSTRUCTION("62F3ED481ECB01" , vpcmpuq(k1, zmm2, zmm3, 1));
+ TEST_INSTRUCTION("62F3ED481E4C2B0201" , vpcmpuq(k1, zmm2, ptr(ebx, ebp, 0, 128), 1));
+ TEST_INSTRUCTION("62F3ED481E4C2B0201" , vpcmpuq(k1, zmm2, zmmword_ptr(ebx, ebp, 0, 128), 1));
+ TEST_INSTRUCTION("62F3ED083ECB01" , vpcmpuw(k1, xmm2, xmm3, 1));
+ TEST_INSTRUCTION("62F3ED083E4C2B0801" , vpcmpuw(k1, xmm2, ptr(ebx, ebp, 0, 128), 1));
+ TEST_INSTRUCTION("62F3ED083E4C2B0801" , vpcmpuw(k1, xmm2, xmmword_ptr(ebx, ebp, 0, 128), 1));
+ TEST_INSTRUCTION("62F3ED283ECB01" , vpcmpuw(k1, ymm2, ymm3, 1));
+ TEST_INSTRUCTION("62F3ED283E4C2B0401" , vpcmpuw(k1, ymm2, ptr(ebx, ebp, 0, 128), 1));
+ TEST_INSTRUCTION("62F3ED283E4C2B0401" , vpcmpuw(k1, ymm2, ymmword_ptr(ebx, ebp, 0, 128), 1));
+ TEST_INSTRUCTION("62F3ED483ECB01" , vpcmpuw(k1, zmm2, zmm3, 1));
+ TEST_INSTRUCTION("62F3ED483E4C2B0201" , vpcmpuw(k1, zmm2, ptr(ebx, ebp, 0, 128), 1));
+ TEST_INSTRUCTION("62F3ED483E4C2B0201" , vpcmpuw(k1, zmm2, zmmword_ptr(ebx, ebp, 0, 128), 1));
+ TEST_INSTRUCTION("62F3ED083FCB01" , vpcmpw(k1, xmm2, xmm3, 1));
+ TEST_INSTRUCTION("62F3ED083F4C2B0801" , vpcmpw(k1, xmm2, ptr(ebx, ebp, 0, 128), 1));
+ TEST_INSTRUCTION("62F3ED083F4C2B0801" , vpcmpw(k1, xmm2, xmmword_ptr(ebx, ebp, 0, 128), 1));
+ TEST_INSTRUCTION("62F3ED283FCB01" , vpcmpw(k1, ymm2, ymm3, 1));
+ TEST_INSTRUCTION("62F3ED283F4C2B0401" , vpcmpw(k1, ymm2, ptr(ebx, ebp, 0, 128), 1));
+ TEST_INSTRUCTION("62F3ED283F4C2B0401" , vpcmpw(k1, ymm2, ymmword_ptr(ebx, ebp, 0, 128), 1));
+ TEST_INSTRUCTION("62F3ED483FCB01" , vpcmpw(k1, zmm2, zmm3, 1));
+ TEST_INSTRUCTION("62F3ED483F4C2B0201" , vpcmpw(k1, zmm2, ptr(ebx, ebp, 0, 128), 1));
+ TEST_INSTRUCTION("62F3ED483F4C2B0201" , vpcmpw(k1, zmm2, zmmword_ptr(ebx, ebp, 0, 128), 1));
+ TEST_INSTRUCTION("8FE868CCCB01" , vpcomb(xmm1, xmm2, xmm3, 1));
+ TEST_INSTRUCTION("8FE868CC8C2B8000000001" , vpcomb(xmm1, xmm2, ptr(ebx, ebp, 0, 128), 1));
+ TEST_INSTRUCTION("8FE868CC8C2B8000000001" , vpcomb(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128), 1));
+ TEST_INSTRUCTION("8FE868CECB01" , vpcomd(xmm1, xmm2, xmm3, 1));
+ TEST_INSTRUCTION("8FE868CE8C2B8000000001" , vpcomd(xmm1, xmm2, ptr(ebx, ebp, 0, 128), 1));
+ TEST_INSTRUCTION("8FE868CE8C2B8000000001" , vpcomd(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128), 1));
+ TEST_INSTRUCTION("62F27D0863D1" , vpcompressb(xmm1, xmm2));
+ TEST_INSTRUCTION("62F27D08639C1180000000" , vpcompressb(ptr(ecx, edx, 0, 128), xmm3));
+ TEST_INSTRUCTION("62F27D08639C1180000000" , vpcompressb(xmmword_ptr(ecx, edx, 0, 128), xmm3));
+ TEST_INSTRUCTION("62F27D2863D1" , vpcompressb(ymm1, ymm2));
+ TEST_INSTRUCTION("62F27D28639C1180000000" , vpcompressb(ptr(ecx, edx, 0, 128), ymm3));
+ TEST_INSTRUCTION("62F27D28639C1180000000" , vpcompressb(ymmword_ptr(ecx, edx, 0, 128), ymm3));
+ TEST_INSTRUCTION("62F27D4863D1" , vpcompressb(zmm1, zmm2));
+ TEST_INSTRUCTION("62F27D48639C1180000000" , vpcompressb(ptr(ecx, edx, 0, 128), zmm3));
+ TEST_INSTRUCTION("62F27D48639C1180000000" , vpcompressb(zmmword_ptr(ecx, edx, 0, 128), zmm3));
+ TEST_INSTRUCTION("62F27D088BD1" , vpcompressd(xmm1, xmm2));
+ TEST_INSTRUCTION("62F27D088B5C1120" , vpcompressd(ptr(ecx, edx, 0, 128), xmm3));
+ TEST_INSTRUCTION("62F27D088B5C1120" , vpcompressd(xmmword_ptr(ecx, edx, 0, 128), xmm3));
+ TEST_INSTRUCTION("62F27D288BD1" , vpcompressd(ymm1, ymm2));
+ TEST_INSTRUCTION("62F27D288B5C1120" , vpcompressd(ptr(ecx, edx, 0, 128), ymm3));
+ TEST_INSTRUCTION("62F27D288B5C1120" , vpcompressd(ymmword_ptr(ecx, edx, 0, 128), ymm3));
+ TEST_INSTRUCTION("62F27D488BD1" , vpcompressd(zmm1, zmm2));
+ TEST_INSTRUCTION("62F27D488B5C1120" , vpcompressd(ptr(ecx, edx, 0, 128), zmm3));
+ TEST_INSTRUCTION("62F27D488B5C1120" , vpcompressd(zmmword_ptr(ecx, edx, 0, 128), zmm3));
+ TEST_INSTRUCTION("62F2FD088BD1" , vpcompressq(xmm1, xmm2));
+ TEST_INSTRUCTION("62F2FD088B5C1110" , vpcompressq(ptr(ecx, edx, 0, 128), xmm3));
+ TEST_INSTRUCTION("62F2FD088B5C1110" , vpcompressq(xmmword_ptr(ecx, edx, 0, 128), xmm3));
+ TEST_INSTRUCTION("62F2FD288BD1" , vpcompressq(ymm1, ymm2));
+ TEST_INSTRUCTION("62F2FD288B5C1110" , vpcompressq(ptr(ecx, edx, 0, 128), ymm3));
+ TEST_INSTRUCTION("62F2FD288B5C1110" , vpcompressq(ymmword_ptr(ecx, edx, 0, 128), ymm3));
+ TEST_INSTRUCTION("62F2FD488BD1" , vpcompressq(zmm1, zmm2));
+ TEST_INSTRUCTION("62F2FD488B5C1110" , vpcompressq(ptr(ecx, edx, 0, 128), zmm3));
+ TEST_INSTRUCTION("62F2FD488B5C1110" , vpcompressq(zmmword_ptr(ecx, edx, 0, 128), zmm3));
+ TEST_INSTRUCTION("62F2FD0863D1" , vpcompressw(xmm1, xmm2));
+ TEST_INSTRUCTION("62F2FD08635C1140" , vpcompressw(ptr(ecx, edx, 0, 128), xmm3));
+ TEST_INSTRUCTION("62F2FD08635C1140" , vpcompressw(xmmword_ptr(ecx, edx, 0, 128), xmm3));
+ TEST_INSTRUCTION("62F2FD2863D1" , vpcompressw(ymm1, ymm2));
+ TEST_INSTRUCTION("62F2FD28635C1140" , vpcompressw(ptr(ecx, edx, 0, 128), ymm3));
+ TEST_INSTRUCTION("62F2FD28635C1140" , vpcompressw(ymmword_ptr(ecx, edx, 0, 128), ymm3));
+ TEST_INSTRUCTION("62F2FD4863D1" , vpcompressw(zmm1, zmm2));
+ TEST_INSTRUCTION("62F2FD48635C1140" , vpcompressw(ptr(ecx, edx, 0, 128), zmm3));
+ TEST_INSTRUCTION("62F2FD48635C1140" , vpcompressw(zmmword_ptr(ecx, edx, 0, 128), zmm3));
+ TEST_INSTRUCTION("8FE868CFCB01" , vpcomq(xmm1, xmm2, xmm3, 1));
+ TEST_INSTRUCTION("8FE868CF8C2B8000000001" , vpcomq(xmm1, xmm2, ptr(ebx, ebp, 0, 128), 1));
+ TEST_INSTRUCTION("8FE868CF8C2B8000000001" , vpcomq(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128), 1));
+ TEST_INSTRUCTION("8FE868ECCB01" , vpcomub(xmm1, xmm2, xmm3, 1));
+ TEST_INSTRUCTION("8FE868EC8C2B8000000001" , vpcomub(xmm1, xmm2, ptr(ebx, ebp, 0, 128), 1));
+ TEST_INSTRUCTION("8FE868EC8C2B8000000001" , vpcomub(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128), 1));
+ TEST_INSTRUCTION("8FE868EECB01" , vpcomud(xmm1, xmm2, xmm3, 1));
+ TEST_INSTRUCTION("8FE868EE8C2B8000000001" , vpcomud(xmm1, xmm2, ptr(ebx, ebp, 0, 128), 1));
+ TEST_INSTRUCTION("8FE868EE8C2B8000000001" , vpcomud(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128), 1));
+ TEST_INSTRUCTION("8FE868EFCB01" , vpcomuq(xmm1, xmm2, xmm3, 1));
+ TEST_INSTRUCTION("8FE868EF8C2B8000000001" , vpcomuq(xmm1, xmm2, ptr(ebx, ebp, 0, 128), 1));
+ TEST_INSTRUCTION("8FE868EF8C2B8000000001" , vpcomuq(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128), 1));
+ TEST_INSTRUCTION("8FE868EDCB01" , vpcomuw(xmm1, xmm2, xmm3, 1));
+ TEST_INSTRUCTION("8FE868ED8C2B8000000001" , vpcomuw(xmm1, xmm2, ptr(ebx, ebp, 0, 128), 1));
+ TEST_INSTRUCTION("8FE868ED8C2B8000000001" , vpcomuw(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128), 1));
+ TEST_INSTRUCTION("8FE868CDCB01" , vpcomw(xmm1, xmm2, xmm3, 1));
+ TEST_INSTRUCTION("8FE868CD8C2B8000000001" , vpcomw(xmm1, xmm2, ptr(ebx, ebp, 0, 128), 1));
+ TEST_INSTRUCTION("8FE868CD8C2B8000000001" , vpcomw(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128), 1));
+ TEST_INSTRUCTION("62F27D08C4CA" , vpconflictd(xmm1, xmm2));
+ TEST_INSTRUCTION("62F27D08C44C1A08" , vpconflictd(xmm1, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("62F27D08C44C1A08" , vpconflictd(xmm1, xmmword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("62F27D28C4CA" , vpconflictd(ymm1, ymm2));
+ TEST_INSTRUCTION("62F27D28C44C1A04" , vpconflictd(ymm1, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("62F27D28C44C1A04" , vpconflictd(ymm1, ymmword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("62F27D48C4CA" , vpconflictd(zmm1, zmm2));
+ TEST_INSTRUCTION("62F27D48C44C1A02" , vpconflictd(zmm1, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("62F27D48C44C1A02" , vpconflictd(zmm1, zmmword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("62F2FD08C4CA" , vpconflictq(xmm1, xmm2));
+ TEST_INSTRUCTION("62F2FD08C44C1A08" , vpconflictq(xmm1, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("62F2FD08C44C1A08" , vpconflictq(xmm1, xmmword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("62F2FD28C4CA" , vpconflictq(ymm1, ymm2));
+ TEST_INSTRUCTION("62F2FD28C44C1A04" , vpconflictq(ymm1, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("62F2FD28C44C1A04" , vpconflictq(ymm1, ymmword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("62F2FD48C4CA" , vpconflictq(zmm1, zmm2));
+ TEST_INSTRUCTION("62F2FD48C44C1A02" , vpconflictq(zmm1, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("62F2FD48C44C1A02" , vpconflictq(zmm1, zmmword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("62F26D0850CB" , vpdpbusd(xmm1, xmm2, xmm3));
+ TEST_INSTRUCTION("62F26D08504C2B08" , vpdpbusd(xmm1, xmm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F26D08504C2B08" , vpdpbusd(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F26D2850CB" , vpdpbusd(ymm1, ymm2, ymm3));
+ TEST_INSTRUCTION("62F26D28504C2B04" , vpdpbusd(ymm1, ymm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F26D28504C2B04" , vpdpbusd(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F26D4850CB" , vpdpbusd(zmm1, zmm2, zmm3));
+ TEST_INSTRUCTION("62F26D48504C2B02" , vpdpbusd(zmm1, zmm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F26D48504C2B02" , vpdpbusd(zmm1, zmm2, zmmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F26D0851CB" , vpdpbusds(xmm1, xmm2, xmm3));
+ TEST_INSTRUCTION("62F26D08514C2B08" , vpdpbusds(xmm1, xmm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F26D08514C2B08" , vpdpbusds(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F26D2851CB" , vpdpbusds(ymm1, ymm2, ymm3));
+ TEST_INSTRUCTION("62F26D28514C2B04" , vpdpbusds(ymm1, ymm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F26D28514C2B04" , vpdpbusds(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F26D4851CB" , vpdpbusds(zmm1, zmm2, zmm3));
+ TEST_INSTRUCTION("62F26D48514C2B02" , vpdpbusds(zmm1, zmm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F26D48514C2B02" , vpdpbusds(zmm1, zmm2, zmmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F26D0852CB" , vpdpwssd(xmm1, xmm2, xmm3));
+ TEST_INSTRUCTION("62F26D08524C2B08" , vpdpwssd(xmm1, xmm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F26D08524C2B08" , vpdpwssd(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F26D2852CB" , vpdpwssd(ymm1, ymm2, ymm3));
+ TEST_INSTRUCTION("62F26D28524C2B04" , vpdpwssd(ymm1, ymm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F26D28524C2B04" , vpdpwssd(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F26D4852CB" , vpdpwssd(zmm1, zmm2, zmm3));
+ TEST_INSTRUCTION("62F26D48524C2B02" , vpdpwssd(zmm1, zmm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F26D48524C2B02" , vpdpwssd(zmm1, zmm2, zmmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F26D0853CB" , vpdpwssds(xmm1, xmm2, xmm3));
+ TEST_INSTRUCTION("62F26D08534C2B08" , vpdpwssds(xmm1, xmm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F26D08534C2B08" , vpdpwssds(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F26D2853CB" , vpdpwssds(ymm1, ymm2, ymm3));
+ TEST_INSTRUCTION("62F26D28534C2B04" , vpdpwssds(ymm1, ymm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F26D28534C2B04" , vpdpwssds(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F26D4853CB" , vpdpwssds(zmm1, zmm2, zmm3));
+ TEST_INSTRUCTION("62F26D48534C2B02" , vpdpwssds(zmm1, zmm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F26D48534C2B02" , vpdpwssds(zmm1, zmm2, zmmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C4E36D06CB01" , vperm2f128(ymm1, ymm2, ymm3, 1));
+ TEST_INSTRUCTION("C4E36D068C2B8000000001" , vperm2f128(ymm1, ymm2, ptr(ebx, ebp, 0, 128), 1));
+ TEST_INSTRUCTION("C4E36D068C2B8000000001" , vperm2f128(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128), 1));
+ TEST_INSTRUCTION("C4E36D46CB01" , vperm2i128(ymm1, ymm2, ymm3, 1));
+ TEST_INSTRUCTION("C4E36D468C2B8000000001" , vperm2i128(ymm1, ymm2, ptr(ebx, ebp, 0, 128), 1));
+ TEST_INSTRUCTION("C4E36D468C2B8000000001" , vperm2i128(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128), 1));
+ TEST_INSTRUCTION("62F26D088DCB" , vpermb(xmm1, xmm2, xmm3));
+ TEST_INSTRUCTION("62F26D088D4C2B08" , vpermb(xmm1, xmm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F26D088D4C2B08" , vpermb(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F26D288DCB" , vpermb(ymm1, ymm2, ymm3));
+ TEST_INSTRUCTION("62F26D288D4C2B04" , vpermb(ymm1, ymm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F26D288D4C2B04" , vpermb(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F26D488DCB" , vpermb(zmm1, zmm2, zmm3));
+ TEST_INSTRUCTION("62F26D488D4C2B02" , vpermb(zmm1, zmm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F26D488D4C2B02" , vpermb(zmm1, zmm2, zmmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C4E26D36CB" , vpermd(ymm1, ymm2, ymm3));
+ TEST_INSTRUCTION("C4E26D368C2B80000000" , vpermd(ymm1, ymm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C4E26D368C2B80000000" , vpermd(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F26D4836CB" , vpermd(zmm1, zmm2, zmm3));
+ TEST_INSTRUCTION("62F26D48364C2B02" , vpermd(zmm1, zmm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F26D48364C2B02" , vpermd(zmm1, zmm2, zmmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F26D0875CB" , vpermi2b(xmm1, xmm2, xmm3));
+ TEST_INSTRUCTION("62F26D08754C2B08" , vpermi2b(xmm1, xmm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F26D08754C2B08" , vpermi2b(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F26D2875CB" , vpermi2b(ymm1, ymm2, ymm3));
+ TEST_INSTRUCTION("62F26D28754C2B04" , vpermi2b(ymm1, ymm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F26D28754C2B04" , vpermi2b(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F26D4875CB" , vpermi2b(zmm1, zmm2, zmm3));
+ TEST_INSTRUCTION("62F26D48754C2B02" , vpermi2b(zmm1, zmm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F26D48754C2B02" , vpermi2b(zmm1, zmm2, zmmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F26D0876CB" , vpermi2d(xmm1, xmm2, xmm3));
+ TEST_INSTRUCTION("62F26D08764C2B08" , vpermi2d(xmm1, xmm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F26D08764C2B08" , vpermi2d(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F26D2876CB" , vpermi2d(ymm1, ymm2, ymm3));
+ TEST_INSTRUCTION("62F26D28764C2B04" , vpermi2d(ymm1, ymm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F26D28764C2B04" , vpermi2d(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F26D4876CB" , vpermi2d(zmm1, zmm2, zmm3));
+ TEST_INSTRUCTION("62F26D48764C2B02" , vpermi2d(zmm1, zmm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F26D48764C2B02" , vpermi2d(zmm1, zmm2, zmmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F2ED0877CB" , vpermi2pd(xmm1, xmm2, xmm3));
+ TEST_INSTRUCTION("62F2ED08774C2B08" , vpermi2pd(xmm1, xmm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F2ED08774C2B08" , vpermi2pd(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F2ED2877CB" , vpermi2pd(ymm1, ymm2, ymm3));
+ TEST_INSTRUCTION("62F2ED28774C2B04" , vpermi2pd(ymm1, ymm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F2ED28774C2B04" , vpermi2pd(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F2ED4877CB" , vpermi2pd(zmm1, zmm2, zmm3));
+ TEST_INSTRUCTION("62F2ED48774C2B02" , vpermi2pd(zmm1, zmm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F2ED48774C2B02" , vpermi2pd(zmm1, zmm2, zmmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F26D0877CB" , vpermi2ps(xmm1, xmm2, xmm3));
+ TEST_INSTRUCTION("62F26D08774C2B08" , vpermi2ps(xmm1, xmm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F26D08774C2B08" , vpermi2ps(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F26D2877CB" , vpermi2ps(ymm1, ymm2, ymm3));
+ TEST_INSTRUCTION("62F26D28774C2B04" , vpermi2ps(ymm1, ymm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F26D28774C2B04" , vpermi2ps(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F26D4877CB" , vpermi2ps(zmm1, zmm2, zmm3));
+ TEST_INSTRUCTION("62F26D48774C2B02" , vpermi2ps(zmm1, zmm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F26D48774C2B02" , vpermi2ps(zmm1, zmm2, zmmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F2ED0876CB" , vpermi2q(xmm1, xmm2, xmm3));
+ TEST_INSTRUCTION("62F2ED08764C2B08" , vpermi2q(xmm1, xmm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F2ED08764C2B08" , vpermi2q(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F2ED2876CB" , vpermi2q(ymm1, ymm2, ymm3));
+ TEST_INSTRUCTION("62F2ED28764C2B04" , vpermi2q(ymm1, ymm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F2ED28764C2B04" , vpermi2q(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F2ED4876CB" , vpermi2q(zmm1, zmm2, zmm3));
+ TEST_INSTRUCTION("62F2ED48764C2B02" , vpermi2q(zmm1, zmm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F2ED48764C2B02" , vpermi2q(zmm1, zmm2, zmmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F2ED0875CB" , vpermi2w(xmm1, xmm2, xmm3));
+ TEST_INSTRUCTION("62F2ED08754C2B08" , vpermi2w(xmm1, xmm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F2ED08754C2B08" , vpermi2w(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F2ED2875CB" , vpermi2w(ymm1, ymm2, ymm3));
+ TEST_INSTRUCTION("62F2ED28754C2B04" , vpermi2w(ymm1, ymm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F2ED28754C2B04" , vpermi2w(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F2ED4875CB" , vpermi2w(zmm1, zmm2, zmm3));
+ TEST_INSTRUCTION("62F2ED48754C2B02" , vpermi2w(zmm1, zmm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F2ED48754C2B02" , vpermi2w(zmm1, zmm2, zmmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C4E36949CB41" , vpermil2pd(xmm1, xmm2, xmm3, xmm4, 1));
+ TEST_INSTRUCTION("C4E369498C2B8000000061" , vpermil2pd(xmm1, xmm2, ptr(ebx, ebp, 0, 128), xmm6, 1));
+ TEST_INSTRUCTION("C4E369498C2B8000000061" , vpermil2pd(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128), xmm6, 1));
+ TEST_INSTRUCTION("C4E3E9498C358000000031" , vpermil2pd(xmm1, xmm2, xmm3, ptr(ebp, esi, 0, 128), 1));
+ TEST_INSTRUCTION("C4E3E9498C358000000031" , vpermil2pd(xmm1, xmm2, xmm3, xmmword_ptr(ebp, esi, 0, 128), 1));
+ TEST_INSTRUCTION("C4E36D49CB41" , vpermil2pd(ymm1, ymm2, ymm3, ymm4, 1));
+ TEST_INSTRUCTION("C4E36D498C2B8000000061" , vpermil2pd(ymm1, ymm2, ptr(ebx, ebp, 0, 128), ymm6, 1));
+ TEST_INSTRUCTION("C4E36D498C2B8000000061" , vpermil2pd(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128), ymm6, 1));
+ TEST_INSTRUCTION("C4E3ED498C358000000031" , vpermil2pd(ymm1, ymm2, ymm3, ptr(ebp, esi, 0, 128), 1));
+ TEST_INSTRUCTION("C4E3ED498C358000000031" , vpermil2pd(ymm1, ymm2, ymm3, ymmword_ptr(ebp, esi, 0, 128), 1));
+ TEST_INSTRUCTION("C4E36948CB41" , vpermil2ps(xmm1, xmm2, xmm3, xmm4, 1));
+ TEST_INSTRUCTION("C4E369488C2B8000000061" , vpermil2ps(xmm1, xmm2, ptr(ebx, ebp, 0, 128), xmm6, 1));
+ TEST_INSTRUCTION("C4E369488C2B8000000061" , vpermil2ps(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128), xmm6, 1));
+ TEST_INSTRUCTION("C4E3E9488C358000000031" , vpermil2ps(xmm1, xmm2, xmm3, ptr(ebp, esi, 0, 128), 1));
+ TEST_INSTRUCTION("C4E3E9488C358000000031" , vpermil2ps(xmm1, xmm2, xmm3, xmmword_ptr(ebp, esi, 0, 128), 1));
+ TEST_INSTRUCTION("C4E36D48CB41" , vpermil2ps(ymm1, ymm2, ymm3, ymm4, 1));
+ TEST_INSTRUCTION("C4E36D488C2B8000000061" , vpermil2ps(ymm1, ymm2, ptr(ebx, ebp, 0, 128), ymm6, 1));
+ TEST_INSTRUCTION("C4E36D488C2B8000000061" , vpermil2ps(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128), ymm6, 1));
+ TEST_INSTRUCTION("C4E3ED488C358000000031" , vpermil2ps(ymm1, ymm2, ymm3, ptr(ebp, esi, 0, 128), 1));
+ TEST_INSTRUCTION("C4E3ED488C358000000031" , vpermil2ps(ymm1, ymm2, ymm3, ymmword_ptr(ebp, esi, 0, 128), 1));
+ TEST_INSTRUCTION("C4E2690DCB" , vpermilpd(xmm1, xmm2, xmm3));
+ TEST_INSTRUCTION("C4E37905CA01" , vpermilpd(xmm1, xmm2, 1));
+ TEST_INSTRUCTION("C4E2690D8C2B80000000" , vpermilpd(xmm1, xmm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C4E2690D8C2B80000000" , vpermilpd(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C4E379058C1A8000000001" , vpermilpd(xmm1, ptr(edx, ebx, 0, 128), 1));
+ TEST_INSTRUCTION("C4E379058C1A8000000001" , vpermilpd(xmm1, xmmword_ptr(edx, ebx, 0, 128), 1));
+ TEST_INSTRUCTION("C4E26D0DCB" , vpermilpd(ymm1, ymm2, ymm3));
+ TEST_INSTRUCTION("C4E37D05CA01" , vpermilpd(ymm1, ymm2, 1));
+ TEST_INSTRUCTION("C4E26D0D8C2B80000000" , vpermilpd(ymm1, ymm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C4E26D0D8C2B80000000" , vpermilpd(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C4E37D058C1A8000000001" , vpermilpd(ymm1, ptr(edx, ebx, 0, 128), 1));
+ TEST_INSTRUCTION("C4E37D058C1A8000000001" , vpermilpd(ymm1, ymmword_ptr(edx, ebx, 0, 128), 1));
+ TEST_INSTRUCTION("62F2ED480DCB" , vpermilpd(zmm1, zmm2, zmm3));
+ TEST_INSTRUCTION("62F3FD4805CA01" , vpermilpd(zmm1, zmm2, 1));
+ TEST_INSTRUCTION("62F2ED480D4C2B02" , vpermilpd(zmm1, zmm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F2ED480D4C2B02" , vpermilpd(zmm1, zmm2, zmmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F3FD48054C1A0201" , vpermilpd(zmm1, ptr(edx, ebx, 0, 128), 1));
+ TEST_INSTRUCTION("62F3FD48054C1A0201" , vpermilpd(zmm1, zmmword_ptr(edx, ebx, 0, 128), 1));
+ TEST_INSTRUCTION("C4E2690CCB" , vpermilps(xmm1, xmm2, xmm3));
+ TEST_INSTRUCTION("C4E37904CA01" , vpermilps(xmm1, xmm2, 1));
+ TEST_INSTRUCTION("C4E2690C8C2B80000000" , vpermilps(xmm1, xmm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C4E2690C8C2B80000000" , vpermilps(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C4E379048C1A8000000001" , vpermilps(xmm1, ptr(edx, ebx, 0, 128), 1));
+ TEST_INSTRUCTION("C4E379048C1A8000000001" , vpermilps(xmm1, xmmword_ptr(edx, ebx, 0, 128), 1));
+ TEST_INSTRUCTION("C4E26D0CCB" , vpermilps(ymm1, ymm2, ymm3));
+ TEST_INSTRUCTION("C4E37D04CA01" , vpermilps(ymm1, ymm2, 1));
+ TEST_INSTRUCTION("C4E26D0C8C2B80000000" , vpermilps(ymm1, ymm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C4E26D0C8C2B80000000" , vpermilps(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C4E37D048C1A8000000001" , vpermilps(ymm1, ptr(edx, ebx, 0, 128), 1));
+ TEST_INSTRUCTION("C4E37D048C1A8000000001" , vpermilps(ymm1, ymmword_ptr(edx, ebx, 0, 128), 1));
+ TEST_INSTRUCTION("62F26D480CCB" , vpermilps(zmm1, zmm2, zmm3));
+ TEST_INSTRUCTION("62F37D4804CA01" , vpermilps(zmm1, zmm2, 1));
+ TEST_INSTRUCTION("62F26D480C4C2B02" , vpermilps(zmm1, zmm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F26D480C4C2B02" , vpermilps(zmm1, zmm2, zmmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F37D48044C1A0201" , vpermilps(zmm1, ptr(edx, ebx, 0, 128), 1));
+ TEST_INSTRUCTION("62F37D48044C1A0201" , vpermilps(zmm1, zmmword_ptr(edx, ebx, 0, 128), 1));
+ TEST_INSTRUCTION("C4E3FD01CA01" , vpermpd(ymm1, ymm2, 1));
+ TEST_INSTRUCTION("C4E3FD018C1A8000000001" , vpermpd(ymm1, ptr(edx, ebx, 0, 128), 1));
+ TEST_INSTRUCTION("C4E3FD018C1A8000000001" , vpermpd(ymm1, ymmword_ptr(edx, ebx, 0, 128), 1));
+ TEST_INSTRUCTION("62F2ED2816CB" , vpermpd(ymm1, ymm2, ymm3));
+ TEST_INSTRUCTION("62F2ED28164C2B04" , vpermpd(ymm1, ymm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F2ED28164C2B04" , vpermpd(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F2ED4816CB" , vpermpd(zmm1, zmm2, zmm3));
+ TEST_INSTRUCTION("62F3FD4801CA01" , vpermpd(zmm1, zmm2, 1));
+ TEST_INSTRUCTION("62F2ED48164C2B02" , vpermpd(zmm1, zmm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F2ED48164C2B02" , vpermpd(zmm1, zmm2, zmmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F3FD48014C1A0201" , vpermpd(zmm1, ptr(edx, ebx, 0, 128), 1));
+ TEST_INSTRUCTION("62F3FD48014C1A0201" , vpermpd(zmm1, zmmword_ptr(edx, ebx, 0, 128), 1));
+ TEST_INSTRUCTION("C4E26D16CB" , vpermps(ymm1, ymm2, ymm3));
+ TEST_INSTRUCTION("C4E26D168C2B80000000" , vpermps(ymm1, ymm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C4E26D168C2B80000000" , vpermps(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F26D4816CB" , vpermps(zmm1, zmm2, zmm3));
+ TEST_INSTRUCTION("62F26D48164C2B02" , vpermps(zmm1, zmm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F26D48164C2B02" , vpermps(zmm1, zmm2, zmmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C4E3FD00CA01" , vpermq(ymm1, ymm2, 1));
+ TEST_INSTRUCTION("C4E3FD008C1A8000000001" , vpermq(ymm1, ptr(edx, ebx, 0, 128), 1));
+ TEST_INSTRUCTION("C4E3FD008C1A8000000001" , vpermq(ymm1, ymmword_ptr(edx, ebx, 0, 128), 1));
+ TEST_INSTRUCTION("62F2ED2836CB" , vpermq(ymm1, ymm2, ymm3));
+ TEST_INSTRUCTION("62F2ED28364C2B04" , vpermq(ymm1, ymm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F2ED28364C2B04" , vpermq(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F2ED4836CB" , vpermq(zmm1, zmm2, zmm3));
+ TEST_INSTRUCTION("62F3FD4800CA01" , vpermq(zmm1, zmm2, 1));
+ TEST_INSTRUCTION("62F2ED48364C2B02" , vpermq(zmm1, zmm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F2ED48364C2B02" , vpermq(zmm1, zmm2, zmmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F3FD48004C1A0201" , vpermq(zmm1, ptr(edx, ebx, 0, 128), 1));
+ TEST_INSTRUCTION("62F3FD48004C1A0201" , vpermq(zmm1, zmmword_ptr(edx, ebx, 0, 128), 1));
+ TEST_INSTRUCTION("62F26D087DCB" , vpermt2b(xmm1, xmm2, xmm3));
+ TEST_INSTRUCTION("62F26D087D4C2B08" , vpermt2b(xmm1, xmm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F26D087D4C2B08" , vpermt2b(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F26D287DCB" , vpermt2b(ymm1, ymm2, ymm3));
+ TEST_INSTRUCTION("62F26D287D4C2B04" , vpermt2b(ymm1, ymm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F26D287D4C2B04" , vpermt2b(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F26D487DCB" , vpermt2b(zmm1, zmm2, zmm3));
+ TEST_INSTRUCTION("62F26D487D4C2B02" , vpermt2b(zmm1, zmm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F26D487D4C2B02" , vpermt2b(zmm1, zmm2, zmmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F26D087ECB" , vpermt2d(xmm1, xmm2, xmm3));
+ TEST_INSTRUCTION("62F26D087E4C2B08" , vpermt2d(xmm1, xmm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F26D087E4C2B08" , vpermt2d(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F26D287ECB" , vpermt2d(ymm1, ymm2, ymm3));
+ TEST_INSTRUCTION("62F26D287E4C2B04" , vpermt2d(ymm1, ymm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F26D287E4C2B04" , vpermt2d(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F26D487ECB" , vpermt2d(zmm1, zmm2, zmm3));
+ TEST_INSTRUCTION("62F26D487E4C2B02" , vpermt2d(zmm1, zmm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F26D487E4C2B02" , vpermt2d(zmm1, zmm2, zmmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F2ED087FCB" , vpermt2pd(xmm1, xmm2, xmm3));
+ TEST_INSTRUCTION("62F2ED087F4C2B08" , vpermt2pd(xmm1, xmm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F2ED087F4C2B08" , vpermt2pd(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F2ED287FCB" , vpermt2pd(ymm1, ymm2, ymm3));
+ TEST_INSTRUCTION("62F2ED287F4C2B04" , vpermt2pd(ymm1, ymm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F2ED287F4C2B04" , vpermt2pd(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F2ED487FCB" , vpermt2pd(zmm1, zmm2, zmm3));
+ TEST_INSTRUCTION("62F2ED487F4C2B02" , vpermt2pd(zmm1, zmm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F2ED487F4C2B02" , vpermt2pd(zmm1, zmm2, zmmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F26D087FCB" , vpermt2ps(xmm1, xmm2, xmm3));
+ TEST_INSTRUCTION("62F26D087F4C2B08" , vpermt2ps(xmm1, xmm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F26D087F4C2B08" , vpermt2ps(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F26D287FCB" , vpermt2ps(ymm1, ymm2, ymm3));
+ TEST_INSTRUCTION("62F26D287F4C2B04" , vpermt2ps(ymm1, ymm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F26D287F4C2B04" , vpermt2ps(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F26D487FCB" , vpermt2ps(zmm1, zmm2, zmm3));
+ TEST_INSTRUCTION("62F26D487F4C2B02" , vpermt2ps(zmm1, zmm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F26D487F4C2B02" , vpermt2ps(zmm1, zmm2, zmmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F2ED087ECB" , vpermt2q(xmm1, xmm2, xmm3));
+ TEST_INSTRUCTION("62F2ED087E4C2B08" , vpermt2q(xmm1, xmm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F2ED087E4C2B08" , vpermt2q(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F2ED287ECB" , vpermt2q(ymm1, ymm2, ymm3));
+ TEST_INSTRUCTION("62F2ED287E4C2B04" , vpermt2q(ymm1, ymm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F2ED287E4C2B04" , vpermt2q(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F2ED487ECB" , vpermt2q(zmm1, zmm2, zmm3));
+ TEST_INSTRUCTION("62F2ED487E4C2B02" , vpermt2q(zmm1, zmm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F2ED487E4C2B02" , vpermt2q(zmm1, zmm2, zmmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F2ED087DCB" , vpermt2w(xmm1, xmm2, xmm3));
+ TEST_INSTRUCTION("62F2ED087D4C2B08" , vpermt2w(xmm1, xmm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F2ED087D4C2B08" , vpermt2w(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F2ED287DCB" , vpermt2w(ymm1, ymm2, ymm3));
+ TEST_INSTRUCTION("62F2ED287D4C2B04" , vpermt2w(ymm1, ymm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F2ED287D4C2B04" , vpermt2w(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F2ED487DCB" , vpermt2w(zmm1, zmm2, zmm3));
+ TEST_INSTRUCTION("62F2ED487D4C2B02" , vpermt2w(zmm1, zmm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F2ED487D4C2B02" , vpermt2w(zmm1, zmm2, zmmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F2ED088DCB" , vpermw(xmm1, xmm2, xmm3));
+ TEST_INSTRUCTION("62F2ED088D4C2B08" , vpermw(xmm1, xmm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F2ED088D4C2B08" , vpermw(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F2ED288DCB" , vpermw(ymm1, ymm2, ymm3));
+ TEST_INSTRUCTION("62F2ED288D4C2B04" , vpermw(ymm1, ymm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F2ED288D4C2B04" , vpermw(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F2ED488DCB" , vpermw(zmm1, zmm2, zmm3));
+ TEST_INSTRUCTION("62F2ED488D4C2B02" , vpermw(zmm1, zmm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F2ED488D4C2B02" , vpermw(zmm1, zmm2, zmmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F27D0862CA" , vpexpandb(xmm1, xmm2));
+ TEST_INSTRUCTION("62F27D08628C1A80000000" , vpexpandb(xmm1, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("62F27D08628C1A80000000" , vpexpandb(xmm1, xmmword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("62F27D2862CA" , vpexpandb(ymm1, ymm2));
+ TEST_INSTRUCTION("62F27D28628C1A80000000" , vpexpandb(ymm1, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("62F27D28628C1A80000000" , vpexpandb(ymm1, ymmword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("62F27D4862CA" , vpexpandb(zmm1, zmm2));
+ TEST_INSTRUCTION("62F27D48628C1A80000000" , vpexpandb(zmm1, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("62F27D48628C1A80000000" , vpexpandb(zmm1, zmmword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("62F27D0889CA" , vpexpandd(xmm1, xmm2));
+ TEST_INSTRUCTION("62F27D08894C1A20" , vpexpandd(xmm1, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("62F27D08894C1A20" , vpexpandd(xmm1, xmmword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("62F27D2889CA" , vpexpandd(ymm1, ymm2));
+ TEST_INSTRUCTION("62F27D28894C1A20" , vpexpandd(ymm1, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("62F27D28894C1A20" , vpexpandd(ymm1, ymmword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("62F27D4889CA" , vpexpandd(zmm1, zmm2));
+ TEST_INSTRUCTION("62F27D48894C1A20" , vpexpandd(zmm1, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("62F27D48894C1A20" , vpexpandd(zmm1, zmmword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("62F2FD0889CA" , vpexpandq(xmm1, xmm2));
+ TEST_INSTRUCTION("62F2FD08894C1A10" , vpexpandq(xmm1, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("62F2FD08894C1A10" , vpexpandq(xmm1, xmmword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("62F2FD2889CA" , vpexpandq(ymm1, ymm2));
+ TEST_INSTRUCTION("62F2FD28894C1A10" , vpexpandq(ymm1, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("62F2FD28894C1A10" , vpexpandq(ymm1, ymmword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("62F2FD4889CA" , vpexpandq(zmm1, zmm2));
+ TEST_INSTRUCTION("62F2FD48894C1A10" , vpexpandq(zmm1, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("62F2FD48894C1A10" , vpexpandq(zmm1, zmmword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("62F2FD0862CA" , vpexpandw(xmm1, xmm2));
+ TEST_INSTRUCTION("62F2FD08624C1A40" , vpexpandw(xmm1, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("62F2FD08624C1A40" , vpexpandw(xmm1, xmmword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("62F2FD2862CA" , vpexpandw(ymm1, ymm2));
+ TEST_INSTRUCTION("62F2FD28624C1A40" , vpexpandw(ymm1, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("62F2FD28624C1A40" , vpexpandw(ymm1, ymmword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("62F2FD4862CA" , vpexpandw(zmm1, zmm2));
+ TEST_INSTRUCTION("62F2FD48624C1A40" , vpexpandw(zmm1, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("62F2FD48624C1A40" , vpexpandw(zmm1, zmmword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("C4E37914D101" , vpextrb(ecx, xmm2, 1));
+ TEST_INSTRUCTION("C4E379149C118000000001" , vpextrb(ptr(ecx, edx, 0, 128), xmm3, 1));
+ TEST_INSTRUCTION("C4E379149C118000000001" , vpextrb(byte_ptr(ecx, edx, 0, 128), xmm3, 1));
+ TEST_INSTRUCTION("C4E37916D101" , vpextrd(ecx, xmm2, 1));
+ TEST_INSTRUCTION("C4E379169C118000000001" , vpextrd(ptr(ecx, edx, 0, 128), xmm3, 1));
+ TEST_INSTRUCTION("C4E379169C118000000001" , vpextrd(dword_ptr(ecx, edx, 0, 128), xmm3, 1));
+ TEST_INSTRUCTION("C5F9C5CA01" , vpextrw(ecx, xmm2, 1));
+ TEST_INSTRUCTION("C4E379159C118000000001" , vpextrw(ptr(ecx, edx, 0, 128), xmm3, 1));
+ TEST_INSTRUCTION("C4E379159C118000000001" , vpextrw(word_ptr(ecx, edx, 0, 128), xmm3, 1));
+ TEST_INSTRUCTION("C4E259908C1A80000000" , vpgatherdd(xmm1, ptr(edx, xmm3, 0, 128), xmm4));
+ TEST_INSTRUCTION("C4E25D908C1A80000000" , vpgatherdd(ymm1, ptr(edx, ymm3, 0, 128), ymm4));
+ TEST_INSTRUCTION("62F27D09904C1A20" , k(k1).vpgatherdd(xmm1, ptr(edx, xmm3, 0, 128)));
+ TEST_INSTRUCTION("62F27D29904C1A20" , k(k1).vpgatherdd(ymm1, ptr(edx, ymm3, 0, 128)));
+ TEST_INSTRUCTION("62F27D49904C1A20" , k(k1).vpgatherdd(zmm1, ptr(edx, zmm3, 0, 128)));
+ TEST_INSTRUCTION("C4E2D9908C1A80000000" , vpgatherdq(xmm1, ptr(edx, xmm3, 0, 128), xmm4));
+ TEST_INSTRUCTION("C4E2DD908C1A80000000" , vpgatherdq(ymm1, ptr(edx, xmm3, 0, 128), ymm4));
+ TEST_INSTRUCTION("62F2FD09904C1A10" , k(k1).vpgatherdq(xmm1, ptr(edx, xmm3, 0, 128)));
+ TEST_INSTRUCTION("62F2FD29904C1A10" , k(k1).vpgatherdq(ymm1, ptr(edx, xmm3, 0, 128)));
+ TEST_INSTRUCTION("62F2FD49904C1A10" , k(k1).vpgatherdq(zmm1, ptr(edx, ymm3, 0, 128)));
+ TEST_INSTRUCTION("C4E259918C1A80000000" , vpgatherqd(xmm1, ptr(edx, xmm3, 0, 128), xmm4));
+ TEST_INSTRUCTION("C4E25D918C1A80000000" , vpgatherqd(xmm1, ptr(edx, ymm3, 0, 128), xmm4));
+ TEST_INSTRUCTION("62F27D09914C1A20" , k(k1).vpgatherqd(xmm1, ptr(edx, xmm3, 0, 128)));
+ TEST_INSTRUCTION("62F27D29914C1A20" , k(k1).vpgatherqd(xmm1, ptr(edx, ymm3, 0, 128)));
+ TEST_INSTRUCTION("62F27D49914C1A20" , k(k1).vpgatherqd(ymm1, ptr(edx, zmm3, 0, 128)));
+ TEST_INSTRUCTION("C4E2D9918C1A80000000" , vpgatherqq(xmm1, ptr(edx, xmm3, 0, 128), xmm4));
+ TEST_INSTRUCTION("C4E2DD918C1A80000000" , vpgatherqq(ymm1, ptr(edx, ymm3, 0, 128), ymm4));
+ TEST_INSTRUCTION("62F2FD09914C1A10" , k(k1).vpgatherqq(xmm1, ptr(edx, xmm3, 0, 128)));
+ TEST_INSTRUCTION("62F2FD29914C1A10" , k(k1).vpgatherqq(ymm1, ptr(edx, ymm3, 0, 128)));
+ TEST_INSTRUCTION("62F2FD49914C1A10" , k(k1).vpgatherqq(zmm1, ptr(edx, zmm3, 0, 128)));
+ TEST_INSTRUCTION("8FE978C2CA" , vphaddbd(xmm1, xmm2));
+ TEST_INSTRUCTION("8FE978C28C1A80000000" , vphaddbd(xmm1, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("8FE978C28C1A80000000" , vphaddbd(xmm1, xmmword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("8FE978C3CA" , vphaddbq(xmm1, xmm2));
+ TEST_INSTRUCTION("8FE978C38C1A80000000" , vphaddbq(xmm1, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("8FE978C38C1A80000000" , vphaddbq(xmm1, xmmword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("8FE978C1CA" , vphaddbw(xmm1, xmm2));
+ TEST_INSTRUCTION("8FE978C18C1A80000000" , vphaddbw(xmm1, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("8FE978C18C1A80000000" , vphaddbw(xmm1, xmmword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("C4E26902CB" , vphaddd(xmm1, xmm2, xmm3));
+ TEST_INSTRUCTION("C4E269028C2B80000000" , vphaddd(xmm1, xmm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C4E269028C2B80000000" , vphaddd(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C4E26D02CB" , vphaddd(ymm1, ymm2, ymm3));
+ TEST_INSTRUCTION("C4E26D028C2B80000000" , vphaddd(ymm1, ymm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C4E26D028C2B80000000" , vphaddd(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("8FE978CBCA" , vphadddq(xmm1, xmm2));
+ TEST_INSTRUCTION("8FE978CB8C1A80000000" , vphadddq(xmm1, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("8FE978CB8C1A80000000" , vphadddq(xmm1, xmmword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("C4E26903CB" , vphaddsw(xmm1, xmm2, xmm3));
+ TEST_INSTRUCTION("C4E269038C2B80000000" , vphaddsw(xmm1, xmm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C4E269038C2B80000000" , vphaddsw(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C4E26D03CB" , vphaddsw(ymm1, ymm2, ymm3));
+ TEST_INSTRUCTION("C4E26D038C2B80000000" , vphaddsw(ymm1, ymm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C4E26D038C2B80000000" , vphaddsw(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("8FE978D2CA" , vphaddubd(xmm1, xmm2));
+ TEST_INSTRUCTION("8FE978D28C1A80000000" , vphaddubd(xmm1, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("8FE978D28C1A80000000" , vphaddubd(xmm1, xmmword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("8FE978D3CA" , vphaddubq(xmm1, xmm2));
+ TEST_INSTRUCTION("8FE978D38C1A80000000" , vphaddubq(xmm1, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("8FE978D38C1A80000000" , vphaddubq(xmm1, xmmword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("8FE978D1CA" , vphaddubw(xmm1, xmm2));
+ TEST_INSTRUCTION("8FE978D18C1A80000000" , vphaddubw(xmm1, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("8FE978D18C1A80000000" , vphaddubw(xmm1, xmmword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("8FE978DBCA" , vphaddudq(xmm1, xmm2));
+ TEST_INSTRUCTION("8FE978DB8C1A80000000" , vphaddudq(xmm1, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("8FE978DB8C1A80000000" , vphaddudq(xmm1, xmmword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("8FE978D6CA" , vphadduwd(xmm1, xmm2));
+ TEST_INSTRUCTION("8FE978D68C1A80000000" , vphadduwd(xmm1, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("8FE978D68C1A80000000" , vphadduwd(xmm1, xmmword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("8FE978D7CA" , vphadduwq(xmm1, xmm2));
+ TEST_INSTRUCTION("8FE978D78C1A80000000" , vphadduwq(xmm1, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("8FE978D78C1A80000000" , vphadduwq(xmm1, xmmword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("C4E26901CB" , vphaddw(xmm1, xmm2, xmm3));
+ TEST_INSTRUCTION("C4E269018C2B80000000" , vphaddw(xmm1, xmm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C4E269018C2B80000000" , vphaddw(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C4E26D01CB" , vphaddw(ymm1, ymm2, ymm3));
+ TEST_INSTRUCTION("C4E26D018C2B80000000" , vphaddw(ymm1, ymm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C4E26D018C2B80000000" , vphaddw(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("8FE978C6CA" , vphaddwd(xmm1, xmm2));
+ TEST_INSTRUCTION("8FE978C68C1A80000000" , vphaddwd(xmm1, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("8FE978C68C1A80000000" , vphaddwd(xmm1, xmmword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("8FE978C7CA" , vphaddwq(xmm1, xmm2));
+ TEST_INSTRUCTION("8FE978C78C1A80000000" , vphaddwq(xmm1, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("8FE978C78C1A80000000" , vphaddwq(xmm1, xmmword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("C4E27941CA" , vphminposuw(xmm1, xmm2));
+ TEST_INSTRUCTION("C4E279418C1A80000000" , vphminposuw(xmm1, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("C4E279418C1A80000000" , vphminposuw(xmm1, xmmword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("8FE978E1CA" , vphsubbw(xmm1, xmm2));
+ TEST_INSTRUCTION("8FE978E18C1A80000000" , vphsubbw(xmm1, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("8FE978E18C1A80000000" , vphsubbw(xmm1, xmmword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("C4E26906CB" , vphsubd(xmm1, xmm2, xmm3));
+ TEST_INSTRUCTION("C4E269068C2B80000000" , vphsubd(xmm1, xmm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C4E269068C2B80000000" , vphsubd(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C4E26D06CB" , vphsubd(ymm1, ymm2, ymm3));
+ TEST_INSTRUCTION("C4E26D068C2B80000000" , vphsubd(ymm1, ymm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C4E26D068C2B80000000" , vphsubd(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("8FE978E3CA" , vphsubdq(xmm1, xmm2));
+ TEST_INSTRUCTION("8FE978E38C1A80000000" , vphsubdq(xmm1, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("8FE978E38C1A80000000" , vphsubdq(xmm1, xmmword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("C4E26907CB" , vphsubsw(xmm1, xmm2, xmm3));
+ TEST_INSTRUCTION("C4E269078C2B80000000" , vphsubsw(xmm1, xmm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C4E269078C2B80000000" , vphsubsw(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C4E26D07CB" , vphsubsw(ymm1, ymm2, ymm3));
+ TEST_INSTRUCTION("C4E26D078C2B80000000" , vphsubsw(ymm1, ymm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C4E26D078C2B80000000" , vphsubsw(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C4E26905CB" , vphsubw(xmm1, xmm2, xmm3));
+ TEST_INSTRUCTION("C4E269058C2B80000000" , vphsubw(xmm1, xmm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C4E269058C2B80000000" , vphsubw(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C4E26D05CB" , vphsubw(ymm1, ymm2, ymm3));
+ TEST_INSTRUCTION("C4E26D058C2B80000000" , vphsubw(ymm1, ymm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C4E26D058C2B80000000" , vphsubw(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("8FE978E2CA" , vphsubwd(xmm1, xmm2));
+ TEST_INSTRUCTION("8FE978E28C1A80000000" , vphsubwd(xmm1, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("8FE978E28C1A80000000" , vphsubwd(xmm1, xmmword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("C4E36920CB01" , vpinsrb(xmm1, xmm2, ebx, 1));
+ TEST_INSTRUCTION("C4E369208C2B8000000001" , vpinsrb(xmm1, xmm2, ptr(ebx, ebp, 0, 128), 1));
+ TEST_INSTRUCTION("C4E369208C2B8000000001" , vpinsrb(xmm1, xmm2, byte_ptr(ebx, ebp, 0, 128), 1));
+ TEST_INSTRUCTION("C4E36922CB01" , vpinsrd(xmm1, xmm2, ebx, 1));
+ TEST_INSTRUCTION("C4E369228C2B8000000001" , vpinsrd(xmm1, xmm2, ptr(ebx, ebp, 0, 128), 1));
+ TEST_INSTRUCTION("C4E369228C2B8000000001" , vpinsrd(xmm1, xmm2, dword_ptr(ebx, ebp, 0, 128), 1));
+ TEST_INSTRUCTION("C5E9C4CB01" , vpinsrw(xmm1, xmm2, ebx, 1));
+ TEST_INSTRUCTION("C5E9C48C2B8000000001" , vpinsrw(xmm1, xmm2, ptr(ebx, ebp, 0, 128), 1));
+ TEST_INSTRUCTION("C5E9C48C2B8000000001" , vpinsrw(xmm1, xmm2, word_ptr(ebx, ebp, 0, 128), 1));
+ TEST_INSTRUCTION("62F27D0844CA" , vplzcntd(xmm1, xmm2));
+ TEST_INSTRUCTION("62F27D08444C1A08" , vplzcntd(xmm1, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("62F27D08444C1A08" , vplzcntd(xmm1, xmmword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("62F27D2844CA" , vplzcntd(ymm1, ymm2));
+ TEST_INSTRUCTION("62F27D28444C1A04" , vplzcntd(ymm1, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("62F27D28444C1A04" , vplzcntd(ymm1, ymmword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("62F27D4844CA" , vplzcntd(zmm1, zmm2));
+ TEST_INSTRUCTION("62F27D48444C1A02" , vplzcntd(zmm1, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("62F27D48444C1A02" , vplzcntd(zmm1, zmmword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("62F2FD0844CA" , vplzcntq(xmm1, xmm2));
+ TEST_INSTRUCTION("62F2FD08444C1A08" , vplzcntq(xmm1, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("62F2FD08444C1A08" , vplzcntq(xmm1, xmmword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("62F2FD2844CA" , vplzcntq(ymm1, ymm2));
+ TEST_INSTRUCTION("62F2FD28444C1A04" , vplzcntq(ymm1, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("62F2FD28444C1A04" , vplzcntq(ymm1, ymmword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("62F2FD4844CA" , vplzcntq(zmm1, zmm2));
+ TEST_INSTRUCTION("62F2FD48444C1A02" , vplzcntq(zmm1, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("62F2FD48444C1A02" , vplzcntq(zmm1, zmmword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("8FE8689ECB40" , vpmacsdd(xmm1, xmm2, xmm3, xmm4));
+ TEST_INSTRUCTION("8FE8689E8C2B8000000060" , vpmacsdd(xmm1, xmm2, ptr(ebx, ebp, 0, 128), xmm6));
+ TEST_INSTRUCTION("8FE8689E8C2B8000000060" , vpmacsdd(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128), xmm6));
+ TEST_INSTRUCTION("8FE8689FCB40" , vpmacsdqh(xmm1, xmm2, xmm3, xmm4));
+ TEST_INSTRUCTION("8FE8689F8C2B8000000060" , vpmacsdqh(xmm1, xmm2, ptr(ebx, ebp, 0, 128), xmm6));
+ TEST_INSTRUCTION("8FE8689F8C2B8000000060" , vpmacsdqh(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128), xmm6));
+ TEST_INSTRUCTION("8FE86897CB40" , vpmacsdql(xmm1, xmm2, xmm3, xmm4));
+ TEST_INSTRUCTION("8FE868978C2B8000000060" , vpmacsdql(xmm1, xmm2, ptr(ebx, ebp, 0, 128), xmm6));
+ TEST_INSTRUCTION("8FE868978C2B8000000060" , vpmacsdql(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128), xmm6));
+ TEST_INSTRUCTION("8FE8688ECB40" , vpmacssdd(xmm1, xmm2, xmm3, xmm4));
+ TEST_INSTRUCTION("8FE8688E8C2B8000000060" , vpmacssdd(xmm1, xmm2, ptr(ebx, ebp, 0, 128), xmm6));
+ TEST_INSTRUCTION("8FE8688E8C2B8000000060" , vpmacssdd(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128), xmm6));
+ TEST_INSTRUCTION("8FE8688FCB40" , vpmacssdqh(xmm1, xmm2, xmm3, xmm4));
+ TEST_INSTRUCTION("8FE8688F8C2B8000000060" , vpmacssdqh(xmm1, xmm2, ptr(ebx, ebp, 0, 128), xmm6));
+ TEST_INSTRUCTION("8FE8688F8C2B8000000060" , vpmacssdqh(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128), xmm6));
+ TEST_INSTRUCTION("8FE86887CB40" , vpmacssdql(xmm1, xmm2, xmm3, xmm4));
+ TEST_INSTRUCTION("8FE868878C2B8000000060" , vpmacssdql(xmm1, xmm2, ptr(ebx, ebp, 0, 128), xmm6));
+ TEST_INSTRUCTION("8FE868878C2B8000000060" , vpmacssdql(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128), xmm6));
+ TEST_INSTRUCTION("8FE86886CB40" , vpmacsswd(xmm1, xmm2, xmm3, xmm4));
+ TEST_INSTRUCTION("8FE868868C2B8000000060" , vpmacsswd(xmm1, xmm2, ptr(ebx, ebp, 0, 128), xmm6));
+ TEST_INSTRUCTION("8FE868868C2B8000000060" , vpmacsswd(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128), xmm6));
+ TEST_INSTRUCTION("8FE86885CB40" , vpmacssww(xmm1, xmm2, xmm3, xmm4));
+ TEST_INSTRUCTION("8FE868858C2B8000000060" , vpmacssww(xmm1, xmm2, ptr(ebx, ebp, 0, 128), xmm6));
+ TEST_INSTRUCTION("8FE868858C2B8000000060" , vpmacssww(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128), xmm6));
+ TEST_INSTRUCTION("8FE86896CB40" , vpmacswd(xmm1, xmm2, xmm3, xmm4));
+ TEST_INSTRUCTION("8FE868968C2B8000000060" , vpmacswd(xmm1, xmm2, ptr(ebx, ebp, 0, 128), xmm6));
+ TEST_INSTRUCTION("8FE868968C2B8000000060" , vpmacswd(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128), xmm6));
+ TEST_INSTRUCTION("8FE86895CB40" , vpmacsww(xmm1, xmm2, xmm3, xmm4));
+ TEST_INSTRUCTION("8FE868958C2B8000000060" , vpmacsww(xmm1, xmm2, ptr(ebx, ebp, 0, 128), xmm6));
+ TEST_INSTRUCTION("8FE868958C2B8000000060" , vpmacsww(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128), xmm6));
+ TEST_INSTRUCTION("8FE868A6CB40" , vpmadcsswd(xmm1, xmm2, xmm3, xmm4));
+ TEST_INSTRUCTION("8FE868A68C2B8000000060" , vpmadcsswd(xmm1, xmm2, ptr(ebx, ebp, 0, 128), xmm6));
+ TEST_INSTRUCTION("8FE868A68C2B8000000060" , vpmadcsswd(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128), xmm6));
+ TEST_INSTRUCTION("8FE868B6CB40" , vpmadcswd(xmm1, xmm2, xmm3, xmm4));
+ TEST_INSTRUCTION("8FE868B68C2B8000000060" , vpmadcswd(xmm1, xmm2, ptr(ebx, ebp, 0, 128), xmm6));
+ TEST_INSTRUCTION("8FE868B68C2B8000000060" , vpmadcswd(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128), xmm6));
+ TEST_INSTRUCTION("62F2ED08B5CB" , vpmadd52huq(xmm1, xmm2, xmm3));
+ TEST_INSTRUCTION("62F2ED08B54C2B08" , vpmadd52huq(xmm1, xmm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F2ED08B54C2B08" , vpmadd52huq(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F2ED28B5CB" , vpmadd52huq(ymm1, ymm2, ymm3));
+ TEST_INSTRUCTION("62F2ED28B54C2B04" , vpmadd52huq(ymm1, ymm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F2ED28B54C2B04" , vpmadd52huq(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F2ED48B5CB" , vpmadd52huq(zmm1, zmm2, zmm3));
+ TEST_INSTRUCTION("62F2ED48B54C2B02" , vpmadd52huq(zmm1, zmm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F2ED48B54C2B02" , vpmadd52huq(zmm1, zmm2, zmmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F2ED08B4CB" , vpmadd52luq(xmm1, xmm2, xmm3));
+ TEST_INSTRUCTION("62F2ED08B44C2B08" , vpmadd52luq(xmm1, xmm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F2ED08B44C2B08" , vpmadd52luq(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F2ED28B4CB" , vpmadd52luq(ymm1, ymm2, ymm3));
+ TEST_INSTRUCTION("62F2ED28B44C2B04" , vpmadd52luq(ymm1, ymm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F2ED28B44C2B04" , vpmadd52luq(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F2ED48B4CB" , vpmadd52luq(zmm1, zmm2, zmm3));
+ TEST_INSTRUCTION("62F2ED48B44C2B02" , vpmadd52luq(zmm1, zmm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F2ED48B44C2B02" , vpmadd52luq(zmm1, zmm2, zmmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C4E26904CB" , vpmaddubsw(xmm1, xmm2, xmm3));
+ TEST_INSTRUCTION("C4E269048C2B80000000" , vpmaddubsw(xmm1, xmm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C4E269048C2B80000000" , vpmaddubsw(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C4E26D04CB" , vpmaddubsw(ymm1, ymm2, ymm3));
+ TEST_INSTRUCTION("C4E26D048C2B80000000" , vpmaddubsw(ymm1, ymm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C4E26D048C2B80000000" , vpmaddubsw(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F26D4804CB" , vpmaddubsw(zmm1, zmm2, zmm3));
+ TEST_INSTRUCTION("62F26D48044C2B02" , vpmaddubsw(zmm1, zmm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F26D48044C2B02" , vpmaddubsw(zmm1, zmm2, zmmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C5E9F5CB" , vpmaddwd(xmm1, xmm2, xmm3));
+ TEST_INSTRUCTION("C5E9F58C2B80000000" , vpmaddwd(xmm1, xmm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C5E9F58C2B80000000" , vpmaddwd(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C5EDF5CB" , vpmaddwd(ymm1, ymm2, ymm3));
+ TEST_INSTRUCTION("C5EDF58C2B80000000" , vpmaddwd(ymm1, ymm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C5EDF58C2B80000000" , vpmaddwd(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F16D48F5CB" , vpmaddwd(zmm1, zmm2, zmm3));
+ TEST_INSTRUCTION("62F16D48F54C2B02" , vpmaddwd(zmm1, zmm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F16D48F54C2B02" , vpmaddwd(zmm1, zmm2, zmmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C4E2618EA41180000000" , vpmaskmovd(ptr(ecx, edx, 0, 128), xmm3, xmm4));
+ TEST_INSTRUCTION("C4E2618EA41180000000" , vpmaskmovd(xmmword_ptr(ecx, edx, 0, 128), xmm3, xmm4));
+ TEST_INSTRUCTION("C4E2658EA41180000000" , vpmaskmovd(ptr(ecx, edx, 0, 128), ymm3, ymm4));
+ TEST_INSTRUCTION("C4E2658EA41180000000" , vpmaskmovd(ymmword_ptr(ecx, edx, 0, 128), ymm3, ymm4));
+ TEST_INSTRUCTION("C4E2698C8C2B80000000" , vpmaskmovd(xmm1, xmm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C4E2698C8C2B80000000" , vpmaskmovd(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C4E26D8C8C2B80000000" , vpmaskmovd(ymm1, ymm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C4E26D8C8C2B80000000" , vpmaskmovd(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C4E2E18EA41180000000" , vpmaskmovq(ptr(ecx, edx, 0, 128), xmm3, xmm4));
+ TEST_INSTRUCTION("C4E2E18EA41180000000" , vpmaskmovq(xmmword_ptr(ecx, edx, 0, 128), xmm3, xmm4));
+ TEST_INSTRUCTION("C4E2E58EA41180000000" , vpmaskmovq(ptr(ecx, edx, 0, 128), ymm3, ymm4));
+ TEST_INSTRUCTION("C4E2E58EA41180000000" , vpmaskmovq(ymmword_ptr(ecx, edx, 0, 128), ymm3, ymm4));
+ TEST_INSTRUCTION("C4E2E98C8C2B80000000" , vpmaskmovq(xmm1, xmm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C4E2E98C8C2B80000000" , vpmaskmovq(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C4E2ED8C8C2B80000000" , vpmaskmovq(ymm1, ymm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C4E2ED8C8C2B80000000" , vpmaskmovq(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C4E2693CCB" , vpmaxsb(xmm1, xmm2, xmm3));
+ TEST_INSTRUCTION("C4E2693C8C2B80000000" , vpmaxsb(xmm1, xmm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C4E2693C8C2B80000000" , vpmaxsb(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C4E26D3CCB" , vpmaxsb(ymm1, ymm2, ymm3));
+ TEST_INSTRUCTION("C4E26D3C8C2B80000000" , vpmaxsb(ymm1, ymm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C4E26D3C8C2B80000000" , vpmaxsb(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F26D483CCB" , vpmaxsb(zmm1, zmm2, zmm3));
+ TEST_INSTRUCTION("62F26D483C4C2B02" , vpmaxsb(zmm1, zmm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F26D483C4C2B02" , vpmaxsb(zmm1, zmm2, zmmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C4E2693DCB" , vpmaxsd(xmm1, xmm2, xmm3));
+ TEST_INSTRUCTION("C4E2693D8C2B80000000" , vpmaxsd(xmm1, xmm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C4E2693D8C2B80000000" , vpmaxsd(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C4E26D3DCB" , vpmaxsd(ymm1, ymm2, ymm3));
+ TEST_INSTRUCTION("C4E26D3D8C2B80000000" , vpmaxsd(ymm1, ymm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C4E26D3D8C2B80000000" , vpmaxsd(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F26D483DCB" , vpmaxsd(zmm1, zmm2, zmm3));
+ TEST_INSTRUCTION("62F26D483D4C2B02" , vpmaxsd(zmm1, zmm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F26D483D4C2B02" , vpmaxsd(zmm1, zmm2, zmmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F2ED083DCB" , vpmaxsq(xmm1, xmm2, xmm3));
+ TEST_INSTRUCTION("62F2ED083D4C2B08" , vpmaxsq(xmm1, xmm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F2ED083D4C2B08" , vpmaxsq(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F2ED283DCB" , vpmaxsq(ymm1, ymm2, ymm3));
+ TEST_INSTRUCTION("62F2ED283D4C2B04" , vpmaxsq(ymm1, ymm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F2ED283D4C2B04" , vpmaxsq(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F2ED483DCB" , vpmaxsq(zmm1, zmm2, zmm3));
+ TEST_INSTRUCTION("62F2ED483D4C2B02" , vpmaxsq(zmm1, zmm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F2ED483D4C2B02" , vpmaxsq(zmm1, zmm2, zmmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C5E9EECB" , vpmaxsw(xmm1, xmm2, xmm3));
+ TEST_INSTRUCTION("C5E9EE8C2B80000000" , vpmaxsw(xmm1, xmm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C5E9EE8C2B80000000" , vpmaxsw(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C5EDEECB" , vpmaxsw(ymm1, ymm2, ymm3));
+ TEST_INSTRUCTION("C5EDEE8C2B80000000" , vpmaxsw(ymm1, ymm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C5EDEE8C2B80000000" , vpmaxsw(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F16D48EECB" , vpmaxsw(zmm1, zmm2, zmm3));
+ TEST_INSTRUCTION("62F16D48EE4C2B02" , vpmaxsw(zmm1, zmm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F16D48EE4C2B02" , vpmaxsw(zmm1, zmm2, zmmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C5E9DECB" , vpmaxub(xmm1, xmm2, xmm3));
+ TEST_INSTRUCTION("C5E9DE8C2B80000000" , vpmaxub(xmm1, xmm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C5E9DE8C2B80000000" , vpmaxub(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C5EDDECB" , vpmaxub(ymm1, ymm2, ymm3));
+ TEST_INSTRUCTION("C5EDDE8C2B80000000" , vpmaxub(ymm1, ymm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C5EDDE8C2B80000000" , vpmaxub(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F16D48DECB" , vpmaxub(zmm1, zmm2, zmm3));
+ TEST_INSTRUCTION("62F16D48DE4C2B02" , vpmaxub(zmm1, zmm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F16D48DE4C2B02" , vpmaxub(zmm1, zmm2, zmmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C4E2693FCB" , vpmaxud(xmm1, xmm2, xmm3));
+ TEST_INSTRUCTION("C4E2693F8C2B80000000" , vpmaxud(xmm1, xmm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C4E2693F8C2B80000000" , vpmaxud(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C4E26D3FCB" , vpmaxud(ymm1, ymm2, ymm3));
+ TEST_INSTRUCTION("C4E26D3F8C2B80000000" , vpmaxud(ymm1, ymm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C4E26D3F8C2B80000000" , vpmaxud(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F26D483FCB" , vpmaxud(zmm1, zmm2, zmm3));
+ TEST_INSTRUCTION("62F26D483F4C2B02" , vpmaxud(zmm1, zmm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F26D483F4C2B02" , vpmaxud(zmm1, zmm2, zmmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F2ED083FCB" , vpmaxuq(xmm1, xmm2, xmm3));
+ TEST_INSTRUCTION("62F2ED083F4C2B08" , vpmaxuq(xmm1, xmm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F2ED083F4C2B08" , vpmaxuq(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F2ED283FCB" , vpmaxuq(ymm1, ymm2, ymm3));
+ TEST_INSTRUCTION("62F2ED283F4C2B04" , vpmaxuq(ymm1, ymm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F2ED283F4C2B04" , vpmaxuq(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F2ED483FCB" , vpmaxuq(zmm1, zmm2, zmm3));
+ TEST_INSTRUCTION("62F2ED483F4C2B02" , vpmaxuq(zmm1, zmm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F2ED483F4C2B02" , vpmaxuq(zmm1, zmm2, zmmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C4E2693ECB" , vpmaxuw(xmm1, xmm2, xmm3));
+ TEST_INSTRUCTION("C4E2693E8C2B80000000" , vpmaxuw(xmm1, xmm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C4E2693E8C2B80000000" , vpmaxuw(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C4E26D3ECB" , vpmaxuw(ymm1, ymm2, ymm3));
+ TEST_INSTRUCTION("C4E26D3E8C2B80000000" , vpmaxuw(ymm1, ymm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C4E26D3E8C2B80000000" , vpmaxuw(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F26D483ECB" , vpmaxuw(zmm1, zmm2, zmm3));
+ TEST_INSTRUCTION("62F26D483E4C2B02" , vpmaxuw(zmm1, zmm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F26D483E4C2B02" , vpmaxuw(zmm1, zmm2, zmmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C4E26938CB" , vpminsb(xmm1, xmm2, xmm3));
+ TEST_INSTRUCTION("C4E269388C2B80000000" , vpminsb(xmm1, xmm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C4E269388C2B80000000" , vpminsb(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C4E26D38CB" , vpminsb(ymm1, ymm2, ymm3));
+ TEST_INSTRUCTION("C4E26D388C2B80000000" , vpminsb(ymm1, ymm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C4E26D388C2B80000000" , vpminsb(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F26D4838CB" , vpminsb(zmm1, zmm2, zmm3));
+ TEST_INSTRUCTION("62F26D48384C2B02" , vpminsb(zmm1, zmm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F26D48384C2B02" , vpminsb(zmm1, zmm2, zmmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C4E26939CB" , vpminsd(xmm1, xmm2, xmm3));
+ TEST_INSTRUCTION("C4E269398C2B80000000" , vpminsd(xmm1, xmm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C4E269398C2B80000000" , vpminsd(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C4E26D39CB" , vpminsd(ymm1, ymm2, ymm3));
+ TEST_INSTRUCTION("C4E26D398C2B80000000" , vpminsd(ymm1, ymm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C4E26D398C2B80000000" , vpminsd(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F26D4839CB" , vpminsd(zmm1, zmm2, zmm3));
+ TEST_INSTRUCTION("62F26D48394C2B02" , vpminsd(zmm1, zmm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F26D48394C2B02" , vpminsd(zmm1, zmm2, zmmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F2ED0839CB" , vpminsq(xmm1, xmm2, xmm3));
+ TEST_INSTRUCTION("62F2ED08394C2B08" , vpminsq(xmm1, xmm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F2ED08394C2B08" , vpminsq(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F2ED2839CB" , vpminsq(ymm1, ymm2, ymm3));
+ TEST_INSTRUCTION("62F2ED28394C2B04" , vpminsq(ymm1, ymm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F2ED28394C2B04" , vpminsq(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F2ED4839CB" , vpminsq(zmm1, zmm2, zmm3));
+ TEST_INSTRUCTION("62F2ED48394C2B02" , vpminsq(zmm1, zmm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F2ED48394C2B02" , vpminsq(zmm1, zmm2, zmmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C5E9EACB" , vpminsw(xmm1, xmm2, xmm3));
+ TEST_INSTRUCTION("C5E9EA8C2B80000000" , vpminsw(xmm1, xmm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C5E9EA8C2B80000000" , vpminsw(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C5EDEACB" , vpminsw(ymm1, ymm2, ymm3));
+ TEST_INSTRUCTION("C5EDEA8C2B80000000" , vpminsw(ymm1, ymm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C5EDEA8C2B80000000" , vpminsw(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F16D48EACB" , vpminsw(zmm1, zmm2, zmm3));
+ TEST_INSTRUCTION("62F16D48EA4C2B02" , vpminsw(zmm1, zmm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F16D48EA4C2B02" , vpminsw(zmm1, zmm2, zmmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C5E9DACB" , vpminub(xmm1, xmm2, xmm3));
+ TEST_INSTRUCTION("C5E9DA8C2B80000000" , vpminub(xmm1, xmm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C5E9DA8C2B80000000" , vpminub(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C5EDDACB" , vpminub(ymm1, ymm2, ymm3));
+ TEST_INSTRUCTION("C5EDDA8C2B80000000" , vpminub(ymm1, ymm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C5EDDA8C2B80000000" , vpminub(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F16D48DACB" , vpminub(zmm1, zmm2, zmm3));
+ TEST_INSTRUCTION("62F16D48DA4C2B02" , vpminub(zmm1, zmm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F16D48DA4C2B02" , vpminub(zmm1, zmm2, zmmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C4E2693BCB" , vpminud(xmm1, xmm2, xmm3));
+ TEST_INSTRUCTION("C4E2693B8C2B80000000" , vpminud(xmm1, xmm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C4E2693B8C2B80000000" , vpminud(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C4E26D3BCB" , vpminud(ymm1, ymm2, ymm3));
+ TEST_INSTRUCTION("C4E26D3B8C2B80000000" , vpminud(ymm1, ymm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C4E26D3B8C2B80000000" , vpminud(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F26D483BCB" , vpminud(zmm1, zmm2, zmm3));
+ TEST_INSTRUCTION("62F26D483B4C2B02" , vpminud(zmm1, zmm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F26D483B4C2B02" , vpminud(zmm1, zmm2, zmmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F2ED083BCB" , vpminuq(xmm1, xmm2, xmm3));
+ TEST_INSTRUCTION("62F2ED083B4C2B08" , vpminuq(xmm1, xmm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F2ED083B4C2B08" , vpminuq(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F2ED283BCB" , vpminuq(ymm1, ymm2, ymm3));
+ TEST_INSTRUCTION("62F2ED283B4C2B04" , vpminuq(ymm1, ymm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F2ED283B4C2B04" , vpminuq(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F2ED483BCB" , vpminuq(zmm1, zmm2, zmm3));
+ TEST_INSTRUCTION("62F2ED483B4C2B02" , vpminuq(zmm1, zmm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F2ED483B4C2B02" , vpminuq(zmm1, zmm2, zmmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C4E2693ACB" , vpminuw(xmm1, xmm2, xmm3));
+ TEST_INSTRUCTION("C4E2693A8C2B80000000" , vpminuw(xmm1, xmm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C4E2693A8C2B80000000" , vpminuw(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C4E26D3ACB" , vpminuw(ymm1, ymm2, ymm3));
+ TEST_INSTRUCTION("C4E26D3A8C2B80000000" , vpminuw(ymm1, ymm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C4E26D3A8C2B80000000" , vpminuw(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F26D483ACB" , vpminuw(zmm1, zmm2, zmm3));
+ TEST_INSTRUCTION("62F26D483A4C2B02" , vpminuw(zmm1, zmm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F26D483A4C2B02" , vpminuw(zmm1, zmm2, zmmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F27E0829CA" , vpmovb2m(k1, xmm2));
+ TEST_INSTRUCTION("62F27E2829CA" , vpmovb2m(k1, ymm2));
+ TEST_INSTRUCTION("62F27E4829CA" , vpmovb2m(k1, zmm2));
+ TEST_INSTRUCTION("62F27E0839CA" , vpmovd2m(k1, xmm2));
+ TEST_INSTRUCTION("62F27E2839CA" , vpmovd2m(k1, ymm2));
+ TEST_INSTRUCTION("62F27E4839CA" , vpmovd2m(k1, zmm2));
+ TEST_INSTRUCTION("62F27E0831D1" , vpmovdb(xmm1, xmm2));
+ TEST_INSTRUCTION("62F27E08315C1120" , vpmovdb(ptr(ecx, edx, 0, 128), xmm3));
+ TEST_INSTRUCTION("62F27E08315C1120" , vpmovdb(dword_ptr(ecx, edx, 0, 128), xmm3));
+ TEST_INSTRUCTION("62F27E2831D1" , vpmovdb(xmm1, ymm2));
+ TEST_INSTRUCTION("62F27E28315C1110" , vpmovdb(ptr(ecx, edx, 0, 128), ymm3));
+ TEST_INSTRUCTION("62F27E28315C1110" , vpmovdb(qword_ptr(ecx, edx, 0, 128), ymm3));
+ TEST_INSTRUCTION("62F27E4831D1" , vpmovdb(xmm1, zmm2));
+ TEST_INSTRUCTION("62F27E48315C1108" , vpmovdb(ptr(ecx, edx, 0, 128), zmm3));
+ TEST_INSTRUCTION("62F27E48315C1108" , vpmovdb(xmmword_ptr(ecx, edx, 0, 128), zmm3));
+ TEST_INSTRUCTION("62F27E0833D1" , vpmovdw(xmm1, xmm2));
+ TEST_INSTRUCTION("62F27E08335C1110" , vpmovdw(ptr(ecx, edx, 0, 128), xmm3));
+ TEST_INSTRUCTION("62F27E08335C1110" , vpmovdw(qword_ptr(ecx, edx, 0, 128), xmm3));
+ TEST_INSTRUCTION("62F27E2833D1" , vpmovdw(xmm1, ymm2));
+ TEST_INSTRUCTION("62F27E28335C1108" , vpmovdw(ptr(ecx, edx, 0, 128), ymm3));
+ TEST_INSTRUCTION("62F27E28335C1108" , vpmovdw(xmmword_ptr(ecx, edx, 0, 128), ymm3));
+ TEST_INSTRUCTION("62F27E4833D1" , vpmovdw(ymm1, zmm2));
+ TEST_INSTRUCTION("62F27E48335C1104" , vpmovdw(ptr(ecx, edx, 0, 128), zmm3));
+ TEST_INSTRUCTION("62F27E48335C1104" , vpmovdw(ymmword_ptr(ecx, edx, 0, 128), zmm3));
+ TEST_INSTRUCTION("62F27E0828CA" , vpmovm2b(xmm1, k2));
+ TEST_INSTRUCTION("62F27E2828CA" , vpmovm2b(ymm1, k2));
+ TEST_INSTRUCTION("62F27E4828CA" , vpmovm2b(zmm1, k2));
+ TEST_INSTRUCTION("62F27E0838CA" , vpmovm2d(xmm1, k2));
+ TEST_INSTRUCTION("62F27E2838CA" , vpmovm2d(ymm1, k2));
+ TEST_INSTRUCTION("62F27E4838CA" , vpmovm2d(zmm1, k2));
+ TEST_INSTRUCTION("62F2FE0838CA" , vpmovm2q(xmm1, k2));
+ TEST_INSTRUCTION("62F2FE2838CA" , vpmovm2q(ymm1, k2));
+ TEST_INSTRUCTION("62F2FE4838CA" , vpmovm2q(zmm1, k2));
+ TEST_INSTRUCTION("62F2FE0828CA" , vpmovm2w(xmm1, k2));
+ TEST_INSTRUCTION("62F2FE2828CA" , vpmovm2w(ymm1, k2));
+ TEST_INSTRUCTION("62F2FE4828CA" , vpmovm2w(zmm1, k2));
+ TEST_INSTRUCTION("C5F9D7CA" , vpmovmskb(ecx, xmm2));
+ TEST_INSTRUCTION("C5FDD7CA" , vpmovmskb(ecx, ymm2));
+ TEST_INSTRUCTION("62F2FE0839CA" , vpmovq2m(k1, xmm2));
+ TEST_INSTRUCTION("62F2FE2839CA" , vpmovq2m(k1, ymm2));
+ TEST_INSTRUCTION("62F2FE4839CA" , vpmovq2m(k1, zmm2));
+ TEST_INSTRUCTION("62F27E0832D1" , vpmovqb(xmm1, xmm2));
+ TEST_INSTRUCTION("62F27E08325C1140" , vpmovqb(ptr(ecx, edx, 0, 128), xmm3));
+ TEST_INSTRUCTION("62F27E08325C1140" , vpmovqb(word_ptr(ecx, edx, 0, 128), xmm3));
+ TEST_INSTRUCTION("62F27E2832D1" , vpmovqb(xmm1, ymm2));
+ TEST_INSTRUCTION("62F27E28325C1120" , vpmovqb(ptr(ecx, edx, 0, 128), ymm3));
+ TEST_INSTRUCTION("62F27E28325C1120" , vpmovqb(dword_ptr(ecx, edx, 0, 128), ymm3));
+ TEST_INSTRUCTION("62F27E4832D1" , vpmovqb(xmm1, zmm2));
+ TEST_INSTRUCTION("62F27E48325C1110" , vpmovqb(ptr(ecx, edx, 0, 128), zmm3));
+ TEST_INSTRUCTION("62F27E48325C1110" , vpmovqb(qword_ptr(ecx, edx, 0, 128), zmm3));
+ TEST_INSTRUCTION("62F27E0835D1" , vpmovqd(xmm1, xmm2));
+ TEST_INSTRUCTION("62F27E08355C1110" , vpmovqd(ptr(ecx, edx, 0, 128), xmm3));
+ TEST_INSTRUCTION("62F27E08355C1110" , vpmovqd(qword_ptr(ecx, edx, 0, 128), xmm3));
+ TEST_INSTRUCTION("62F27E2835D1" , vpmovqd(xmm1, ymm2));
+ TEST_INSTRUCTION("62F27E28355C1108" , vpmovqd(ptr(ecx, edx, 0, 128), ymm3));
+ TEST_INSTRUCTION("62F27E28355C1108" , vpmovqd(xmmword_ptr(ecx, edx, 0, 128), ymm3));
+ TEST_INSTRUCTION("62F27E4835D1" , vpmovqd(ymm1, zmm2));
+ TEST_INSTRUCTION("62F27E48355C1104" , vpmovqd(ptr(ecx, edx, 0, 128), zmm3));
+ TEST_INSTRUCTION("62F27E48355C1104" , vpmovqd(ymmword_ptr(ecx, edx, 0, 128), zmm3));
+ TEST_INSTRUCTION("62F27E0834D1" , vpmovqw(xmm1, xmm2));
+ TEST_INSTRUCTION("62F27E08345C1120" , vpmovqw(ptr(ecx, edx, 0, 128), xmm3));
+ TEST_INSTRUCTION("62F27E08345C1120" , vpmovqw(dword_ptr(ecx, edx, 0, 128), xmm3));
+ TEST_INSTRUCTION("62F27E2834D1" , vpmovqw(xmm1, ymm2));
+ TEST_INSTRUCTION("62F27E28345C1110" , vpmovqw(ptr(ecx, edx, 0, 128), ymm3));
+ TEST_INSTRUCTION("62F27E28345C1110" , vpmovqw(qword_ptr(ecx, edx, 0, 128), ymm3));
+ TEST_INSTRUCTION("62F27E4834D1" , vpmovqw(xmm1, zmm2));
+ TEST_INSTRUCTION("62F27E48345C1108" , vpmovqw(ptr(ecx, edx, 0, 128), zmm3));
+ TEST_INSTRUCTION("62F27E48345C1108" , vpmovqw(xmmword_ptr(ecx, edx, 0, 128), zmm3));
+ TEST_INSTRUCTION("62F27E0821D1" , vpmovsdb(xmm1, xmm2));
+ TEST_INSTRUCTION("62F27E08215C1120" , vpmovsdb(ptr(ecx, edx, 0, 128), xmm3));
+ TEST_INSTRUCTION("62F27E08215C1120" , vpmovsdb(dword_ptr(ecx, edx, 0, 128), xmm3));
+ TEST_INSTRUCTION("62F27E2821D1" , vpmovsdb(xmm1, ymm2));
+ TEST_INSTRUCTION("62F27E28215C1110" , vpmovsdb(ptr(ecx, edx, 0, 128), ymm3));
+ TEST_INSTRUCTION("62F27E28215C1110" , vpmovsdb(qword_ptr(ecx, edx, 0, 128), ymm3));
+ TEST_INSTRUCTION("62F27E4821D1" , vpmovsdb(xmm1, zmm2));
+ TEST_INSTRUCTION("62F27E48215C1108" , vpmovsdb(ptr(ecx, edx, 0, 128), zmm3));
+ TEST_INSTRUCTION("62F27E48215C1108" , vpmovsdb(xmmword_ptr(ecx, edx, 0, 128), zmm3));
+ TEST_INSTRUCTION("62F27E0823D1" , vpmovsdw(xmm1, xmm2));
+ TEST_INSTRUCTION("62F27E08235C1110" , vpmovsdw(ptr(ecx, edx, 0, 128), xmm3));
+ TEST_INSTRUCTION("62F27E08235C1110" , vpmovsdw(qword_ptr(ecx, edx, 0, 128), xmm3));
+ TEST_INSTRUCTION("62F27E2823D1" , vpmovsdw(xmm1, ymm2));
+ TEST_INSTRUCTION("62F27E28235C1108" , vpmovsdw(ptr(ecx, edx, 0, 128), ymm3));
+ TEST_INSTRUCTION("62F27E28235C1108" , vpmovsdw(xmmword_ptr(ecx, edx, 0, 128), ymm3));
+ TEST_INSTRUCTION("62F27E4823D1" , vpmovsdw(ymm1, zmm2));
+ TEST_INSTRUCTION("62F27E48235C1104" , vpmovsdw(ptr(ecx, edx, 0, 128), zmm3));
+ TEST_INSTRUCTION("62F27E48235C1104" , vpmovsdw(ymmword_ptr(ecx, edx, 0, 128), zmm3));
+ TEST_INSTRUCTION("62F27E0822D1" , vpmovsqb(xmm1, xmm2));
+ TEST_INSTRUCTION("62F27E08225C1140" , vpmovsqb(ptr(ecx, edx, 0, 128), xmm3));
+ TEST_INSTRUCTION("62F27E08225C1140" , vpmovsqb(word_ptr(ecx, edx, 0, 128), xmm3));
+ TEST_INSTRUCTION("62F27E2822D1" , vpmovsqb(xmm1, ymm2));
+ TEST_INSTRUCTION("62F27E28225C1120" , vpmovsqb(ptr(ecx, edx, 0, 128), ymm3));
+ TEST_INSTRUCTION("62F27E28225C1120" , vpmovsqb(dword_ptr(ecx, edx, 0, 128), ymm3));
+ TEST_INSTRUCTION("62F27E4822D1" , vpmovsqb(xmm1, zmm2));
+ TEST_INSTRUCTION("62F27E48225C1110" , vpmovsqb(ptr(ecx, edx, 0, 128), zmm3));
+ TEST_INSTRUCTION("62F27E48225C1110" , vpmovsqb(qword_ptr(ecx, edx, 0, 128), zmm3));
+ TEST_INSTRUCTION("62F27E0825D1" , vpmovsqd(xmm1, xmm2));
+ TEST_INSTRUCTION("62F27E08255C1110" , vpmovsqd(ptr(ecx, edx, 0, 128), xmm3));
+ TEST_INSTRUCTION("62F27E08255C1110" , vpmovsqd(qword_ptr(ecx, edx, 0, 128), xmm3));
+ TEST_INSTRUCTION("62F27E2825D1" , vpmovsqd(xmm1, ymm2));
+ TEST_INSTRUCTION("62F27E28255C1108" , vpmovsqd(ptr(ecx, edx, 0, 128), ymm3));
+ TEST_INSTRUCTION("62F27E28255C1108" , vpmovsqd(xmmword_ptr(ecx, edx, 0, 128), ymm3));
+ TEST_INSTRUCTION("62F27E4825D1" , vpmovsqd(ymm1, zmm2));
+ TEST_INSTRUCTION("62F27E48255C1104" , vpmovsqd(ptr(ecx, edx, 0, 128), zmm3));
+ TEST_INSTRUCTION("62F27E48255C1104" , vpmovsqd(ymmword_ptr(ecx, edx, 0, 128), zmm3));
+ TEST_INSTRUCTION("62F27E0824D1" , vpmovsqw(xmm1, xmm2));
+ TEST_INSTRUCTION("62F27E08245C1120" , vpmovsqw(ptr(ecx, edx, 0, 128), xmm3));
+ TEST_INSTRUCTION("62F27E08245C1120" , vpmovsqw(dword_ptr(ecx, edx, 0, 128), xmm3));
+ TEST_INSTRUCTION("62F27E2824D1" , vpmovsqw(xmm1, ymm2));
+ TEST_INSTRUCTION("62F27E28245C1110" , vpmovsqw(ptr(ecx, edx, 0, 128), ymm3));
+ TEST_INSTRUCTION("62F27E28245C1110" , vpmovsqw(qword_ptr(ecx, edx, 0, 128), ymm3));
+ TEST_INSTRUCTION("62F27E4824D1" , vpmovsqw(xmm1, zmm2));
+ TEST_INSTRUCTION("62F27E48245C1108" , vpmovsqw(ptr(ecx, edx, 0, 128), zmm3));
+ TEST_INSTRUCTION("62F27E48245C1108" , vpmovsqw(xmmword_ptr(ecx, edx, 0, 128), zmm3));
+ TEST_INSTRUCTION("62F27E0820D1" , vpmovswb(xmm1, xmm2));
+ TEST_INSTRUCTION("62F27E08205C1110" , vpmovswb(ptr(ecx, edx, 0, 128), xmm3));
+ TEST_INSTRUCTION("62F27E08205C1110" , vpmovswb(qword_ptr(ecx, edx, 0, 128), xmm3));
+ TEST_INSTRUCTION("62F27E2820D1" , vpmovswb(xmm1, ymm2));
+ TEST_INSTRUCTION("62F27E28205C1108" , vpmovswb(ptr(ecx, edx, 0, 128), ymm3));
+ TEST_INSTRUCTION("62F27E28205C1108" , vpmovswb(xmmword_ptr(ecx, edx, 0, 128), ymm3));
+ TEST_INSTRUCTION("62F27E4820D1" , vpmovswb(ymm1, zmm2));
+ TEST_INSTRUCTION("62F27E48205C1104" , vpmovswb(ptr(ecx, edx, 0, 128), zmm3));
+ TEST_INSTRUCTION("62F27E48205C1104" , vpmovswb(ymmword_ptr(ecx, edx, 0, 128), zmm3));
+ TEST_INSTRUCTION("C4E27921CA" , vpmovsxbd(xmm1, xmm2));
+ TEST_INSTRUCTION("C4E279218C1A80000000" , vpmovsxbd(xmm1, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("C4E279218C1A80000000" , vpmovsxbd(xmm1, dword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("C4E27D21CA" , vpmovsxbd(ymm1, xmm2));
+ TEST_INSTRUCTION("C4E27D218C1A80000000" , vpmovsxbd(ymm1, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("C4E27D218C1A80000000" , vpmovsxbd(ymm1, qword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("62F27D4821CA" , vpmovsxbd(zmm1, xmm2));
+ TEST_INSTRUCTION("62F27D48214C1A08" , vpmovsxbd(zmm1, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("62F27D48214C1A08" , vpmovsxbd(zmm1, xmmword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("C4E27922CA" , vpmovsxbq(xmm1, xmm2));
+ TEST_INSTRUCTION("C4E279228C1A80000000" , vpmovsxbq(xmm1, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("C4E279228C1A80000000" , vpmovsxbq(xmm1, word_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("C4E27D22CA" , vpmovsxbq(ymm1, xmm2));
+ TEST_INSTRUCTION("C4E27D228C1A80000000" , vpmovsxbq(ymm1, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("C4E27D228C1A80000000" , vpmovsxbq(ymm1, dword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("62F27D4822CA" , vpmovsxbq(zmm1, xmm2));
+ TEST_INSTRUCTION("62F27D48224C1A10" , vpmovsxbq(zmm1, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("62F27D48224C1A10" , vpmovsxbq(zmm1, qword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("C4E27920CA" , vpmovsxbw(xmm1, xmm2));
+ TEST_INSTRUCTION("C4E279208C1A80000000" , vpmovsxbw(xmm1, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("C4E279208C1A80000000" , vpmovsxbw(xmm1, qword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("C4E27D20CA" , vpmovsxbw(ymm1, xmm2));
+ TEST_INSTRUCTION("C4E27D208C1A80000000" , vpmovsxbw(ymm1, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("C4E27D208C1A80000000" , vpmovsxbw(ymm1, xmmword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("62F27D4820CA" , vpmovsxbw(zmm1, ymm2));
+ TEST_INSTRUCTION("62F27D48204C1A04" , vpmovsxbw(zmm1, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("62F27D48204C1A04" , vpmovsxbw(zmm1, ymmword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("C4E27925CA" , vpmovsxdq(xmm1, xmm2));
+ TEST_INSTRUCTION("C4E279258C1A80000000" , vpmovsxdq(xmm1, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("C4E279258C1A80000000" , vpmovsxdq(xmm1, qword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("C4E27D25CA" , vpmovsxdq(ymm1, xmm2));
+ TEST_INSTRUCTION("C4E27D258C1A80000000" , vpmovsxdq(ymm1, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("C4E27D258C1A80000000" , vpmovsxdq(ymm1, xmmword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("62F27D4825CA" , vpmovsxdq(zmm1, ymm2));
+ TEST_INSTRUCTION("62F27D48254C1A04" , vpmovsxdq(zmm1, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("62F27D48254C1A04" , vpmovsxdq(zmm1, ymmword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("C4E27923CA" , vpmovsxwd(xmm1, xmm2));
+ TEST_INSTRUCTION("C4E279238C1A80000000" , vpmovsxwd(xmm1, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("C4E279238C1A80000000" , vpmovsxwd(xmm1, qword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("C4E27D23CA" , vpmovsxwd(ymm1, xmm2));
+ TEST_INSTRUCTION("C4E27D238C1A80000000" , vpmovsxwd(ymm1, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("C4E27D238C1A80000000" , vpmovsxwd(ymm1, xmmword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("62F27D4823CA" , vpmovsxwd(zmm1, ymm2));
+ TEST_INSTRUCTION("62F27D48234C1A04" , vpmovsxwd(zmm1, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("62F27D48234C1A04" , vpmovsxwd(zmm1, ymmword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("C4E27924CA" , vpmovsxwq(xmm1, xmm2));
+ TEST_INSTRUCTION("C4E279248C1A80000000" , vpmovsxwq(xmm1, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("C4E279248C1A80000000" , vpmovsxwq(xmm1, dword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("C4E27D24CA" , vpmovsxwq(ymm1, xmm2));
+ TEST_INSTRUCTION("C4E27D248C1A80000000" , vpmovsxwq(ymm1, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("C4E27D248C1A80000000" , vpmovsxwq(ymm1, qword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("62F27D4824CA" , vpmovsxwq(zmm1, xmm2));
+ TEST_INSTRUCTION("62F27D48244C1A08" , vpmovsxwq(zmm1, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("62F27D48244C1A08" , vpmovsxwq(zmm1, xmmword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("62F27E0811D1" , vpmovusdb(xmm1, xmm2));
+ TEST_INSTRUCTION("62F27E08115C1120" , vpmovusdb(ptr(ecx, edx, 0, 128), xmm3));
+ TEST_INSTRUCTION("62F27E08115C1120" , vpmovusdb(dword_ptr(ecx, edx, 0, 128), xmm3));
+ TEST_INSTRUCTION("62F27E2811D1" , vpmovusdb(xmm1, ymm2));
+ TEST_INSTRUCTION("62F27E28115C1110" , vpmovusdb(ptr(ecx, edx, 0, 128), ymm3));
+ TEST_INSTRUCTION("62F27E28115C1110" , vpmovusdb(qword_ptr(ecx, edx, 0, 128), ymm3));
+ TEST_INSTRUCTION("62F27E4811D1" , vpmovusdb(xmm1, zmm2));
+ TEST_INSTRUCTION("62F27E48115C1108" , vpmovusdb(ptr(ecx, edx, 0, 128), zmm3));
+ TEST_INSTRUCTION("62F27E48115C1108" , vpmovusdb(xmmword_ptr(ecx, edx, 0, 128), zmm3));
+ TEST_INSTRUCTION("62F27E0813D1" , vpmovusdw(xmm1, xmm2));
+ TEST_INSTRUCTION("62F27E08135C1110" , vpmovusdw(ptr(ecx, edx, 0, 128), xmm3));
+ TEST_INSTRUCTION("62F27E08135C1110" , vpmovusdw(qword_ptr(ecx, edx, 0, 128), xmm3));
+ TEST_INSTRUCTION("62F27E2813D1" , vpmovusdw(xmm1, ymm2));
+ TEST_INSTRUCTION("62F27E28135C1108" , vpmovusdw(ptr(ecx, edx, 0, 128), ymm3));
+ TEST_INSTRUCTION("62F27E28135C1108" , vpmovusdw(xmmword_ptr(ecx, edx, 0, 128), ymm3));
+ TEST_INSTRUCTION("62F27E4813D1" , vpmovusdw(ymm1, zmm2));
+ TEST_INSTRUCTION("62F27E48135C1104" , vpmovusdw(ptr(ecx, edx, 0, 128), zmm3));
+ TEST_INSTRUCTION("62F27E48135C1104" , vpmovusdw(ymmword_ptr(ecx, edx, 0, 128), zmm3));
+ TEST_INSTRUCTION("62F27E0812D1" , vpmovusqb(xmm1, xmm2));
+ TEST_INSTRUCTION("62F27E08125C1140" , vpmovusqb(ptr(ecx, edx, 0, 128), xmm3));
+ TEST_INSTRUCTION("62F27E08125C1140" , vpmovusqb(word_ptr(ecx, edx, 0, 128), xmm3));
+ TEST_INSTRUCTION("62F27E2812D1" , vpmovusqb(xmm1, ymm2));
+ TEST_INSTRUCTION("62F27E28125C1120" , vpmovusqb(ptr(ecx, edx, 0, 128), ymm3));
+ TEST_INSTRUCTION("62F27E28125C1120" , vpmovusqb(dword_ptr(ecx, edx, 0, 128), ymm3));
+ TEST_INSTRUCTION("62F27E4812D1" , vpmovusqb(xmm1, zmm2));
+ TEST_INSTRUCTION("62F27E48125C1110" , vpmovusqb(ptr(ecx, edx, 0, 128), zmm3));
+ TEST_INSTRUCTION("62F27E48125C1110" , vpmovusqb(qword_ptr(ecx, edx, 0, 128), zmm3));
+ TEST_INSTRUCTION("62F27E0815D1" , vpmovusqd(xmm1, xmm2));
+ TEST_INSTRUCTION("62F27E08155C1110" , vpmovusqd(ptr(ecx, edx, 0, 128), xmm3));
+ TEST_INSTRUCTION("62F27E08155C1110" , vpmovusqd(qword_ptr(ecx, edx, 0, 128), xmm3));
+ TEST_INSTRUCTION("62F27E2815D1" , vpmovusqd(xmm1, ymm2));
+ TEST_INSTRUCTION("62F27E28155C1108" , vpmovusqd(ptr(ecx, edx, 0, 128), ymm3));
+ TEST_INSTRUCTION("62F27E28155C1108" , vpmovusqd(xmmword_ptr(ecx, edx, 0, 128), ymm3));
+ TEST_INSTRUCTION("62F27E4815D1" , vpmovusqd(ymm1, zmm2));
+ TEST_INSTRUCTION("62F27E48155C1104" , vpmovusqd(ptr(ecx, edx, 0, 128), zmm3));
+ TEST_INSTRUCTION("62F27E48155C1104" , vpmovusqd(ymmword_ptr(ecx, edx, 0, 128), zmm3));
+ TEST_INSTRUCTION("62F27E0814D1" , vpmovusqw(xmm1, xmm2));
+ TEST_INSTRUCTION("62F27E08145C1120" , vpmovusqw(ptr(ecx, edx, 0, 128), xmm3));
+ TEST_INSTRUCTION("62F27E08145C1120" , vpmovusqw(dword_ptr(ecx, edx, 0, 128), xmm3));
+ TEST_INSTRUCTION("62F27E2814D1" , vpmovusqw(xmm1, ymm2));
+ TEST_INSTRUCTION("62F27E28145C1110" , vpmovusqw(ptr(ecx, edx, 0, 128), ymm3));
+ TEST_INSTRUCTION("62F27E28145C1110" , vpmovusqw(qword_ptr(ecx, edx, 0, 128), ymm3));
+ TEST_INSTRUCTION("62F27E4814D1" , vpmovusqw(xmm1, zmm2));
+ TEST_INSTRUCTION("62F27E48145C1108" , vpmovusqw(ptr(ecx, edx, 0, 128), zmm3));
+ TEST_INSTRUCTION("62F27E48145C1108" , vpmovusqw(xmmword_ptr(ecx, edx, 0, 128), zmm3));
+ TEST_INSTRUCTION("62F27E0810D1" , vpmovuswb(xmm1, xmm2));
+ TEST_INSTRUCTION("62F27E08105C1110" , vpmovuswb(ptr(ecx, edx, 0, 128), xmm3));
+ TEST_INSTRUCTION("62F27E08105C1110" , vpmovuswb(qword_ptr(ecx, edx, 0, 128), xmm3));
+ TEST_INSTRUCTION("62F27E2810D1" , vpmovuswb(xmm1, ymm2));
+ TEST_INSTRUCTION("62F27E28105C1108" , vpmovuswb(ptr(ecx, edx, 0, 128), ymm3));
+ TEST_INSTRUCTION("62F27E28105C1108" , vpmovuswb(xmmword_ptr(ecx, edx, 0, 128), ymm3));
+ TEST_INSTRUCTION("62F27E4810D1" , vpmovuswb(ymm1, zmm2));
+ TEST_INSTRUCTION("62F27E48105C1104" , vpmovuswb(ptr(ecx, edx, 0, 128), zmm3));
+ TEST_INSTRUCTION("62F27E48105C1104" , vpmovuswb(ymmword_ptr(ecx, edx, 0, 128), zmm3));
+ TEST_INSTRUCTION("62F2FE0829CA" , vpmovw2m(k1, xmm2));
+ TEST_INSTRUCTION("62F2FE2829CA" , vpmovw2m(k1, ymm2));
+ TEST_INSTRUCTION("62F2FE4829CA" , vpmovw2m(k1, zmm2));
+ TEST_INSTRUCTION("62F27E0830D1" , vpmovwb(xmm1, xmm2));
+ TEST_INSTRUCTION("62F27E08305C1110" , vpmovwb(ptr(ecx, edx, 0, 128), xmm3));
+ TEST_INSTRUCTION("62F27E08305C1110" , vpmovwb(qword_ptr(ecx, edx, 0, 128), xmm3));
+ TEST_INSTRUCTION("62F27E2830D1" , vpmovwb(xmm1, ymm2));
+ TEST_INSTRUCTION("62F27E28305C1108" , vpmovwb(ptr(ecx, edx, 0, 128), ymm3));
+ TEST_INSTRUCTION("62F27E28305C1108" , vpmovwb(xmmword_ptr(ecx, edx, 0, 128), ymm3));
+ TEST_INSTRUCTION("62F27E4830D1" , vpmovwb(ymm1, zmm2));
+ TEST_INSTRUCTION("62F27E48305C1104" , vpmovwb(ptr(ecx, edx, 0, 128), zmm3));
+ TEST_INSTRUCTION("62F27E48305C1104" , vpmovwb(ymmword_ptr(ecx, edx, 0, 128), zmm3));
+ TEST_INSTRUCTION("C4E27931CA" , vpmovzxbd(xmm1, xmm2));
+ TEST_INSTRUCTION("C4E279318C1A80000000" , vpmovzxbd(xmm1, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("C4E279318C1A80000000" , vpmovzxbd(xmm1, dword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("C4E27D31CA" , vpmovzxbd(ymm1, xmm2));
+ TEST_INSTRUCTION("C4E27D318C1A80000000" , vpmovzxbd(ymm1, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("C4E27D318C1A80000000" , vpmovzxbd(ymm1, qword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("62F27D4831CA" , vpmovzxbd(zmm1, xmm2));
+ TEST_INSTRUCTION("62F27D48314C1A08" , vpmovzxbd(zmm1, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("62F27D48314C1A08" , vpmovzxbd(zmm1, xmmword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("C4E27932CA" , vpmovzxbq(xmm1, xmm2));
+ TEST_INSTRUCTION("C4E279328C1A80000000" , vpmovzxbq(xmm1, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("C4E279328C1A80000000" , vpmovzxbq(xmm1, word_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("C4E27D32CA" , vpmovzxbq(ymm1, xmm2));
+ TEST_INSTRUCTION("C4E27D328C1A80000000" , vpmovzxbq(ymm1, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("C4E27D328C1A80000000" , vpmovzxbq(ymm1, dword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("62F27D4832CA" , vpmovzxbq(zmm1, xmm2));
+ TEST_INSTRUCTION("62F27D48324C1A10" , vpmovzxbq(zmm1, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("62F27D48324C1A10" , vpmovzxbq(zmm1, qword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("C4E27930CA" , vpmovzxbw(xmm1, xmm2));
+ TEST_INSTRUCTION("C4E279308C1A80000000" , vpmovzxbw(xmm1, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("C4E279308C1A80000000" , vpmovzxbw(xmm1, qword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("C4E27D30CA" , vpmovzxbw(ymm1, xmm2));
+ TEST_INSTRUCTION("C4E27D308C1A80000000" , vpmovzxbw(ymm1, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("C4E27D308C1A80000000" , vpmovzxbw(ymm1, xmmword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("62F27D4830CA" , vpmovzxbw(zmm1, ymm2));
+ TEST_INSTRUCTION("62F27D48304C1A04" , vpmovzxbw(zmm1, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("62F27D48304C1A04" , vpmovzxbw(zmm1, ymmword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("C4E27935CA" , vpmovzxdq(xmm1, xmm2));
+ TEST_INSTRUCTION("C4E279358C1A80000000" , vpmovzxdq(xmm1, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("C4E279358C1A80000000" , vpmovzxdq(xmm1, qword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("C4E27D35CA" , vpmovzxdq(ymm1, xmm2));
+ TEST_INSTRUCTION("C4E27D358C1A80000000" , vpmovzxdq(ymm1, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("C4E27D358C1A80000000" , vpmovzxdq(ymm1, xmmword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("62F27D4835CA" , vpmovzxdq(zmm1, ymm2));
+ TEST_INSTRUCTION("62F27D48354C1A04" , vpmovzxdq(zmm1, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("62F27D48354C1A04" , vpmovzxdq(zmm1, ymmword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("C4E27933CA" , vpmovzxwd(xmm1, xmm2));
+ TEST_INSTRUCTION("C4E279338C1A80000000" , vpmovzxwd(xmm1, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("C4E279338C1A80000000" , vpmovzxwd(xmm1, qword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("C4E27D33CA" , vpmovzxwd(ymm1, xmm2));
+ TEST_INSTRUCTION("C4E27D338C1A80000000" , vpmovzxwd(ymm1, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("C4E27D338C1A80000000" , vpmovzxwd(ymm1, xmmword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("62F27D4833CA" , vpmovzxwd(zmm1, ymm2));
+ TEST_INSTRUCTION("62F27D48334C1A04" , vpmovzxwd(zmm1, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("62F27D48334C1A04" , vpmovzxwd(zmm1, ymmword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("C4E27934CA" , vpmovzxwq(xmm1, xmm2));
+ TEST_INSTRUCTION("C4E279348C1A80000000" , vpmovzxwq(xmm1, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("C4E279348C1A80000000" , vpmovzxwq(xmm1, dword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("C4E27D34CA" , vpmovzxwq(ymm1, xmm2));
+ TEST_INSTRUCTION("C4E27D348C1A80000000" , vpmovzxwq(ymm1, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("C4E27D348C1A80000000" , vpmovzxwq(ymm1, qword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("62F27D4834CA" , vpmovzxwq(zmm1, xmm2));
+ TEST_INSTRUCTION("62F27D48344C1A08" , vpmovzxwq(zmm1, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("62F27D48344C1A08" , vpmovzxwq(zmm1, xmmword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("C4E26928CB" , vpmuldq(xmm1, xmm2, xmm3));
+ TEST_INSTRUCTION("C4E269288C2B80000000" , vpmuldq(xmm1, xmm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C4E269288C2B80000000" , vpmuldq(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C4E26D28CB" , vpmuldq(ymm1, ymm2, ymm3));
+ TEST_INSTRUCTION("C4E26D288C2B80000000" , vpmuldq(ymm1, ymm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C4E26D288C2B80000000" , vpmuldq(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F2ED4828CB" , vpmuldq(zmm1, zmm2, zmm3));
+ TEST_INSTRUCTION("62F2ED48284C2B02" , vpmuldq(zmm1, zmm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F2ED48284C2B02" , vpmuldq(zmm1, zmm2, zmmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C4E2690BCB" , vpmulhrsw(xmm1, xmm2, xmm3));
+ TEST_INSTRUCTION("C4E2690B8C2B80000000" , vpmulhrsw(xmm1, xmm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C4E2690B8C2B80000000" , vpmulhrsw(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C4E26D0BCB" , vpmulhrsw(ymm1, ymm2, ymm3));
+ TEST_INSTRUCTION("C4E26D0B8C2B80000000" , vpmulhrsw(ymm1, ymm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C4E26D0B8C2B80000000" , vpmulhrsw(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F26D480BCB" , vpmulhrsw(zmm1, zmm2, zmm3));
+ TEST_INSTRUCTION("62F26D480B4C2B02" , vpmulhrsw(zmm1, zmm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F26D480B4C2B02" , vpmulhrsw(zmm1, zmm2, zmmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C5E9E4CB" , vpmulhuw(xmm1, xmm2, xmm3));
+ TEST_INSTRUCTION("C5E9E48C2B80000000" , vpmulhuw(xmm1, xmm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C5E9E48C2B80000000" , vpmulhuw(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C5EDE4CB" , vpmulhuw(ymm1, ymm2, ymm3));
+ TEST_INSTRUCTION("C5EDE48C2B80000000" , vpmulhuw(ymm1, ymm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C5EDE48C2B80000000" , vpmulhuw(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F16D48E4CB" , vpmulhuw(zmm1, zmm2, zmm3));
+ TEST_INSTRUCTION("62F16D48E44C2B02" , vpmulhuw(zmm1, zmm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F16D48E44C2B02" , vpmulhuw(zmm1, zmm2, zmmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C5E9E5CB" , vpmulhw(xmm1, xmm2, xmm3));
+ TEST_INSTRUCTION("C5E9E58C2B80000000" , vpmulhw(xmm1, xmm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C5E9E58C2B80000000" , vpmulhw(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C5EDE5CB" , vpmulhw(ymm1, ymm2, ymm3));
+ TEST_INSTRUCTION("C5EDE58C2B80000000" , vpmulhw(ymm1, ymm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C5EDE58C2B80000000" , vpmulhw(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F16D48E5CB" , vpmulhw(zmm1, zmm2, zmm3));
+ TEST_INSTRUCTION("62F16D48E54C2B02" , vpmulhw(zmm1, zmm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F16D48E54C2B02" , vpmulhw(zmm1, zmm2, zmmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C4E26940CB" , vpmulld(xmm1, xmm2, xmm3));
+ TEST_INSTRUCTION("C4E269408C2B80000000" , vpmulld(xmm1, xmm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C4E269408C2B80000000" , vpmulld(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C4E26D40CB" , vpmulld(ymm1, ymm2, ymm3));
+ TEST_INSTRUCTION("C4E26D408C2B80000000" , vpmulld(ymm1, ymm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C4E26D408C2B80000000" , vpmulld(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F26D4840CB" , vpmulld(zmm1, zmm2, zmm3));
+ TEST_INSTRUCTION("62F26D48404C2B02" , vpmulld(zmm1, zmm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F26D48404C2B02" , vpmulld(zmm1, zmm2, zmmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F2ED0840CB" , vpmullq(xmm1, xmm2, xmm3));
+ TEST_INSTRUCTION("62F2ED08404C2B08" , vpmullq(xmm1, xmm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F2ED08404C2B08" , vpmullq(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F2ED2840CB" , vpmullq(ymm1, ymm2, ymm3));
+ TEST_INSTRUCTION("62F2ED28404C2B04" , vpmullq(ymm1, ymm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F2ED28404C2B04" , vpmullq(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F2ED4840CB" , vpmullq(zmm1, zmm2, zmm3));
+ TEST_INSTRUCTION("62F2ED48404C2B02" , vpmullq(zmm1, zmm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F2ED48404C2B02" , vpmullq(zmm1, zmm2, zmmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C5E9D5CB" , vpmullw(xmm1, xmm2, xmm3));
+ TEST_INSTRUCTION("C5E9D58C2B80000000" , vpmullw(xmm1, xmm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C5E9D58C2B80000000" , vpmullw(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C5EDD5CB" , vpmullw(ymm1, ymm2, ymm3));
+ TEST_INSTRUCTION("C5EDD58C2B80000000" , vpmullw(ymm1, ymm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C5EDD58C2B80000000" , vpmullw(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F16D48D5CB" , vpmullw(zmm1, zmm2, zmm3));
+ TEST_INSTRUCTION("62F16D48D54C2B02" , vpmullw(zmm1, zmm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F16D48D54C2B02" , vpmullw(zmm1, zmm2, zmmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F2ED0883CB" , vpmultishiftqb(xmm1, xmm2, xmm3));
+ TEST_INSTRUCTION("62F2ED08834C2B08" , vpmultishiftqb(xmm1, xmm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F2ED08834C2B08" , vpmultishiftqb(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F2ED2883CB" , vpmultishiftqb(ymm1, ymm2, ymm3));
+ TEST_INSTRUCTION("62F2ED28834C2B04" , vpmultishiftqb(ymm1, ymm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F2ED28834C2B04" , vpmultishiftqb(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F2ED4883CB" , vpmultishiftqb(zmm1, zmm2, zmm3));
+ TEST_INSTRUCTION("62F2ED48834C2B02" , vpmultishiftqb(zmm1, zmm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F2ED48834C2B02" , vpmultishiftqb(zmm1, zmm2, zmmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C5E9F4CB" , vpmuludq(xmm1, xmm2, xmm3));
+ TEST_INSTRUCTION("C5E9F48C2B80000000" , vpmuludq(xmm1, xmm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C5E9F48C2B80000000" , vpmuludq(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C5EDF4CB" , vpmuludq(ymm1, ymm2, ymm3));
+ TEST_INSTRUCTION("C5EDF48C2B80000000" , vpmuludq(ymm1, ymm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C5EDF48C2B80000000" , vpmuludq(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F1ED48F4CB" , vpmuludq(zmm1, zmm2, zmm3));
+ TEST_INSTRUCTION("62F1ED48F44C2B02" , vpmuludq(zmm1, zmm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F1ED48F44C2B02" , vpmuludq(zmm1, zmm2, zmmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F27D0854CA" , vpopcntb(xmm1, xmm2));
+ TEST_INSTRUCTION("62F27D08544C1A08" , vpopcntb(xmm1, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("62F27D08544C1A08" , vpopcntb(xmm1, xmmword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("62F27D2854CA" , vpopcntb(ymm1, ymm2));
+ TEST_INSTRUCTION("62F27D28544C1A04" , vpopcntb(ymm1, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("62F27D28544C1A04" , vpopcntb(ymm1, ymmword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("62F27D4854CA" , vpopcntb(zmm1, zmm2));
+ TEST_INSTRUCTION("62F27D48544C1A02" , vpopcntb(zmm1, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("62F27D48544C1A02" , vpopcntb(zmm1, zmmword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("62F27D0855CA" , vpopcntd(xmm1, xmm2));
+ TEST_INSTRUCTION("62F27D08554C1A08" , vpopcntd(xmm1, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("62F27D08554C1A08" , vpopcntd(xmm1, xmmword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("62F27D2855CA" , vpopcntd(ymm1, ymm2));
+ TEST_INSTRUCTION("62F27D28554C1A04" , vpopcntd(ymm1, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("62F27D28554C1A04" , vpopcntd(ymm1, ymmword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("62F27D4855CA" , vpopcntd(zmm1, zmm2));
+ TEST_INSTRUCTION("62F27D48554C1A02" , vpopcntd(zmm1, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("62F27D48554C1A02" , vpopcntd(zmm1, zmmword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("62F2FD0855CA" , vpopcntq(xmm1, xmm2));
+ TEST_INSTRUCTION("62F2FD08554C1A08" , vpopcntq(xmm1, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("62F2FD08554C1A08" , vpopcntq(xmm1, xmmword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("62F2FD2855CA" , vpopcntq(ymm1, ymm2));
+ TEST_INSTRUCTION("62F2FD28554C1A04" , vpopcntq(ymm1, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("62F2FD28554C1A04" , vpopcntq(ymm1, ymmword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("62F2FD4855CA" , vpopcntq(zmm1, zmm2));
+ TEST_INSTRUCTION("62F2FD48554C1A02" , vpopcntq(zmm1, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("62F2FD48554C1A02" , vpopcntq(zmm1, zmmword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("62F2FD0854CA" , vpopcntw(xmm1, xmm2));
+ TEST_INSTRUCTION("62F2FD08544C1A08" , vpopcntw(xmm1, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("62F2FD08544C1A08" , vpopcntw(xmm1, xmmword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("62F2FD2854CA" , vpopcntw(ymm1, ymm2));
+ TEST_INSTRUCTION("62F2FD28544C1A04" , vpopcntw(ymm1, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("62F2FD28544C1A04" , vpopcntw(ymm1, ymmword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("62F2FD4854CA" , vpopcntw(zmm1, zmm2));
+ TEST_INSTRUCTION("62F2FD48544C1A02" , vpopcntw(zmm1, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("62F2FD48544C1A02" , vpopcntw(zmm1, zmmword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("C5E9EBCB" , vpor(xmm1, xmm2, xmm3));
+ TEST_INSTRUCTION("C5E9EB8C2B80000000" , vpor(xmm1, xmm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C5E9EB8C2B80000000" , vpor(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C5EDEBCB" , vpor(ymm1, ymm2, ymm3));
+ TEST_INSTRUCTION("C5EDEB8C2B80000000" , vpor(ymm1, ymm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C5EDEB8C2B80000000" , vpor(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F16D08EBCB" , vpord(xmm1, xmm2, xmm3));
+ TEST_INSTRUCTION("62F16D08EB4C2B08" , vpord(xmm1, xmm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F16D08EB4C2B08" , vpord(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F16D28EBCB" , vpord(ymm1, ymm2, ymm3));
+ TEST_INSTRUCTION("62F16D28EB4C2B04" , vpord(ymm1, ymm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F16D28EB4C2B04" , vpord(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F16D48EBCB" , vpord(zmm1, zmm2, zmm3));
+ TEST_INSTRUCTION("62F16D48EB4C2B02" , vpord(zmm1, zmm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F16D48EB4C2B02" , vpord(zmm1, zmm2, zmmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F1ED08EBCB" , vporq(xmm1, xmm2, xmm3));
+ TEST_INSTRUCTION("62F1ED08EB4C2B08" , vporq(xmm1, xmm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F1ED08EB4C2B08" , vporq(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F1ED28EBCB" , vporq(ymm1, ymm2, ymm3));
+ TEST_INSTRUCTION("62F1ED28EB4C2B04" , vporq(ymm1, ymm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F1ED28EB4C2B04" , vporq(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F1ED48EBCB" , vporq(zmm1, zmm2, zmm3));
+ TEST_INSTRUCTION("62F1ED48EB4C2B02" , vporq(zmm1, zmm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F1ED48EB4C2B02" , vporq(zmm1, zmm2, zmmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("8FE868A3CB40" , vpperm(xmm1, xmm2, xmm3, xmm4));
+ TEST_INSTRUCTION("8FE8E8A38C358000000030" , vpperm(xmm1, xmm2, xmm3, ptr(ebp, esi, 0, 128)));
+ TEST_INSTRUCTION("8FE8E8A38C358000000030" , vpperm(xmm1, xmm2, xmm3, xmmword_ptr(ebp, esi, 0, 128)));
+ TEST_INSTRUCTION("8FE868A38C2B8000000060" , vpperm(xmm1, xmm2, ptr(ebx, ebp, 0, 128), xmm6));
+ TEST_INSTRUCTION("8FE868A38C2B8000000060" , vpperm(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128), xmm6));
+ TEST_INSTRUCTION("62F1750872CA01" , vprold(xmm1, xmm2, 1));
+ TEST_INSTRUCTION("62F17508724C1A0801" , vprold(xmm1, ptr(edx, ebx, 0, 128), 1));
+ TEST_INSTRUCTION("62F17508724C1A0801" , vprold(xmm1, xmmword_ptr(edx, ebx, 0, 128), 1));
+ TEST_INSTRUCTION("62F1752872CA01" , vprold(ymm1, ymm2, 1));
+ TEST_INSTRUCTION("62F17528724C1A0401" , vprold(ymm1, ptr(edx, ebx, 0, 128), 1));
+ TEST_INSTRUCTION("62F17528724C1A0401" , vprold(ymm1, ymmword_ptr(edx, ebx, 0, 128), 1));
+ TEST_INSTRUCTION("62F1754872CA01" , vprold(zmm1, zmm2, 1));
+ TEST_INSTRUCTION("62F17548724C1A0201" , vprold(zmm1, ptr(edx, ebx, 0, 128), 1));
+ TEST_INSTRUCTION("62F17548724C1A0201" , vprold(zmm1, zmmword_ptr(edx, ebx, 0, 128), 1));
+ TEST_INSTRUCTION("62F1F50872CA01" , vprolq(xmm1, xmm2, 1));
+ TEST_INSTRUCTION("62F1F508724C1A0801" , vprolq(xmm1, ptr(edx, ebx, 0, 128), 1));
+ TEST_INSTRUCTION("62F1F508724C1A0801" , vprolq(xmm1, xmmword_ptr(edx, ebx, 0, 128), 1));
+ TEST_INSTRUCTION("62F1F52872CA01" , vprolq(ymm1, ymm2, 1));
+ TEST_INSTRUCTION("62F1F528724C1A0401" , vprolq(ymm1, ptr(edx, ebx, 0, 128), 1));
+ TEST_INSTRUCTION("62F1F528724C1A0401" , vprolq(ymm1, ymmword_ptr(edx, ebx, 0, 128), 1));
+ TEST_INSTRUCTION("62F1F54872CA01" , vprolq(zmm1, zmm2, 1));
+ TEST_INSTRUCTION("62F1F548724C1A0201" , vprolq(zmm1, ptr(edx, ebx, 0, 128), 1));
+ TEST_INSTRUCTION("62F1F548724C1A0201" , vprolq(zmm1, zmmword_ptr(edx, ebx, 0, 128), 1));
+ TEST_INSTRUCTION("62F26D0815CB" , vprolvd(xmm1, xmm2, xmm3));
+ TEST_INSTRUCTION("62F26D08154C2B08" , vprolvd(xmm1, xmm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F26D08154C2B08" , vprolvd(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F26D2815CB" , vprolvd(ymm1, ymm2, ymm3));
+ TEST_INSTRUCTION("62F26D28154C2B04" , vprolvd(ymm1, ymm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F26D28154C2B04" , vprolvd(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F26D4815CB" , vprolvd(zmm1, zmm2, zmm3));
+ TEST_INSTRUCTION("62F26D48154C2B02" , vprolvd(zmm1, zmm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F26D48154C2B02" , vprolvd(zmm1, zmm2, zmmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F2ED0815CB" , vprolvq(xmm1, xmm2, xmm3));
+ TEST_INSTRUCTION("62F2ED08154C2B08" , vprolvq(xmm1, xmm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F2ED08154C2B08" , vprolvq(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F2ED2815CB" , vprolvq(ymm1, ymm2, ymm3));
+ TEST_INSTRUCTION("62F2ED28154C2B04" , vprolvq(ymm1, ymm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F2ED28154C2B04" , vprolvq(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F2ED4815CB" , vprolvq(zmm1, zmm2, zmm3));
+ TEST_INSTRUCTION("62F2ED48154C2B02" , vprolvq(zmm1, zmm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F2ED48154C2B02" , vprolvq(zmm1, zmm2, zmmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F1750872C201" , vprord(xmm1, xmm2, 1));
+ TEST_INSTRUCTION("62F1750872441A0801" , vprord(xmm1, ptr(edx, ebx, 0, 128), 1));
+ TEST_INSTRUCTION("62F1750872441A0801" , vprord(xmm1, xmmword_ptr(edx, ebx, 0, 128), 1));
+ TEST_INSTRUCTION("62F1752872C201" , vprord(ymm1, ymm2, 1));
+ TEST_INSTRUCTION("62F1752872441A0401" , vprord(ymm1, ptr(edx, ebx, 0, 128), 1));
+ TEST_INSTRUCTION("62F1752872441A0401" , vprord(ymm1, ymmword_ptr(edx, ebx, 0, 128), 1));
+ TEST_INSTRUCTION("62F1754872C201" , vprord(zmm1, zmm2, 1));
+ TEST_INSTRUCTION("62F1754872441A0201" , vprord(zmm1, ptr(edx, ebx, 0, 128), 1));
+ TEST_INSTRUCTION("62F1754872441A0201" , vprord(zmm1, zmmword_ptr(edx, ebx, 0, 128), 1));
+ TEST_INSTRUCTION("62F1F50872C201" , vprorq(xmm1, xmm2, 1));
+ TEST_INSTRUCTION("62F1F50872441A0801" , vprorq(xmm1, ptr(edx, ebx, 0, 128), 1));
+ TEST_INSTRUCTION("62F1F50872441A0801" , vprorq(xmm1, xmmword_ptr(edx, ebx, 0, 128), 1));
+ TEST_INSTRUCTION("62F1F52872C201" , vprorq(ymm1, ymm2, 1));
+ TEST_INSTRUCTION("62F1F52872441A0401" , vprorq(ymm1, ptr(edx, ebx, 0, 128), 1));
+ TEST_INSTRUCTION("62F1F52872441A0401" , vprorq(ymm1, ymmword_ptr(edx, ebx, 0, 128), 1));
+ TEST_INSTRUCTION("62F1F54872C201" , vprorq(zmm1, zmm2, 1));
+ TEST_INSTRUCTION("62F1F54872441A0201" , vprorq(zmm1, ptr(edx, ebx, 0, 128), 1));
+ TEST_INSTRUCTION("62F1F54872441A0201" , vprorq(zmm1, zmmword_ptr(edx, ebx, 0, 128), 1));
+ TEST_INSTRUCTION("62F26D0814CB" , vprorvd(xmm1, xmm2, xmm3));
+ TEST_INSTRUCTION("62F26D08144C2B08" , vprorvd(xmm1, xmm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F26D08144C2B08" , vprorvd(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F26D2814CB" , vprorvd(ymm1, ymm2, ymm3));
+ TEST_INSTRUCTION("62F26D28144C2B04" , vprorvd(ymm1, ymm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F26D28144C2B04" , vprorvd(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F26D4814CB" , vprorvd(zmm1, zmm2, zmm3));
+ TEST_INSTRUCTION("62F26D48144C2B02" , vprorvd(zmm1, zmm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F26D48144C2B02" , vprorvd(zmm1, zmm2, zmmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F2ED0814CB" , vprorvq(xmm1, xmm2, xmm3));
+ TEST_INSTRUCTION("62F2ED08144C2B08" , vprorvq(xmm1, xmm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F2ED08144C2B08" , vprorvq(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F2ED2814CB" , vprorvq(ymm1, ymm2, ymm3));
+ TEST_INSTRUCTION("62F2ED28144C2B04" , vprorvq(ymm1, ymm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F2ED28144C2B04" , vprorvq(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F2ED4814CB" , vprorvq(zmm1, zmm2, zmm3));
+ TEST_INSTRUCTION("62F2ED48144C2B02" , vprorvq(zmm1, zmm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F2ED48144C2B02" , vprorvq(zmm1, zmm2, zmmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("8FE96090CA" , vprotb(xmm1, xmm2, xmm3));
+ TEST_INSTRUCTION("8FE878C0CA01" , vprotb(xmm1, xmm2, 1));
+ TEST_INSTRUCTION("8FE9E8908C2B80000000" , vprotb(xmm1, xmm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("8FE9E8908C2B80000000" , vprotb(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("8FE958908C1A80000000" , vprotb(xmm1, ptr(edx, ebx, 0, 128), xmm4));
+ TEST_INSTRUCTION("8FE878C08C1A8000000001" , vprotb(xmm1, ptr(edx, ebx, 0, 128), 1));
+ TEST_INSTRUCTION("8FE958908C1A80000000" , vprotb(xmm1, xmmword_ptr(edx, ebx, 0, 128), xmm4));
+ TEST_INSTRUCTION("8FE878C08C1A8000000001" , vprotb(xmm1, xmmword_ptr(edx, ebx, 0, 128), 1));
+ TEST_INSTRUCTION("8FE96092CA" , vprotd(xmm1, xmm2, xmm3));
+ TEST_INSTRUCTION("8FE878C2CA01" , vprotd(xmm1, xmm2, 1));
+ TEST_INSTRUCTION("8FE9E8928C2B80000000" , vprotd(xmm1, xmm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("8FE9E8928C2B80000000" , vprotd(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("8FE958928C1A80000000" , vprotd(xmm1, ptr(edx, ebx, 0, 128), xmm4));
+ TEST_INSTRUCTION("8FE878C28C1A8000000001" , vprotd(xmm1, ptr(edx, ebx, 0, 128), 1));
+ TEST_INSTRUCTION("8FE958928C1A80000000" , vprotd(xmm1, xmmword_ptr(edx, ebx, 0, 128), xmm4));
+ TEST_INSTRUCTION("8FE878C28C1A8000000001" , vprotd(xmm1, xmmword_ptr(edx, ebx, 0, 128), 1));
+ TEST_INSTRUCTION("8FE96093CA" , vprotq(xmm1, xmm2, xmm3));
+ TEST_INSTRUCTION("8FE878C3CA01" , vprotq(xmm1, xmm2, 1));
+ TEST_INSTRUCTION("8FE9E8938C2B80000000" , vprotq(xmm1, xmm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("8FE9E8938C2B80000000" , vprotq(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("8FE958938C1A80000000" , vprotq(xmm1, ptr(edx, ebx, 0, 128), xmm4));
+ TEST_INSTRUCTION("8FE878C38C1A8000000001" , vprotq(xmm1, ptr(edx, ebx, 0, 128), 1));
+ TEST_INSTRUCTION("8FE958938C1A80000000" , vprotq(xmm1, xmmword_ptr(edx, ebx, 0, 128), xmm4));
+ TEST_INSTRUCTION("8FE878C38C1A8000000001" , vprotq(xmm1, xmmword_ptr(edx, ebx, 0, 128), 1));
+ TEST_INSTRUCTION("8FE96091CA" , vprotw(xmm1, xmm2, xmm3));
+ TEST_INSTRUCTION("8FE878C1CA01" , vprotw(xmm1, xmm2, 1));
+ TEST_INSTRUCTION("8FE9E8918C2B80000000" , vprotw(xmm1, xmm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("8FE9E8918C2B80000000" , vprotw(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("8FE958918C1A80000000" , vprotw(xmm1, ptr(edx, ebx, 0, 128), xmm4));
+ TEST_INSTRUCTION("8FE878C18C1A8000000001" , vprotw(xmm1, ptr(edx, ebx, 0, 128), 1));
+ TEST_INSTRUCTION("8FE958918C1A80000000" , vprotw(xmm1, xmmword_ptr(edx, ebx, 0, 128), xmm4));
+ TEST_INSTRUCTION("8FE878C18C1A8000000001" , vprotw(xmm1, xmmword_ptr(edx, ebx, 0, 128), 1));
+ TEST_INSTRUCTION("C5E9F6CB" , vpsadbw(xmm1, xmm2, xmm3));
+ TEST_INSTRUCTION("C5E9F68C2B80000000" , vpsadbw(xmm1, xmm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C5E9F68C2B80000000" , vpsadbw(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C5EDF6CB" , vpsadbw(ymm1, ymm2, ymm3));
+ TEST_INSTRUCTION("C5EDF68C2B80000000" , vpsadbw(ymm1, ymm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C5EDF68C2B80000000" , vpsadbw(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F16D48F6CB" , vpsadbw(zmm1, zmm2, zmm3));
+ TEST_INSTRUCTION("62F16D48F64C2B02" , vpsadbw(zmm1, zmm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F16D48F64C2B02" , vpsadbw(zmm1, zmm2, zmmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F27D09A05C1120" , k(k1).vpscatterdd(ptr(ecx, xmm2, 0, 128), xmm3));
+ TEST_INSTRUCTION("62F27D29A05C1120" , k(k1).vpscatterdd(ptr(ecx, ymm2, 0, 128), ymm3));
+ TEST_INSTRUCTION("62F27D49A05C1120" , k(k1).vpscatterdd(ptr(ecx, zmm2, 0, 128), zmm3));
+ TEST_INSTRUCTION("62F2FD09A05C1110" , k(k1).vpscatterdq(ptr(ecx, xmm2, 0, 128), xmm3));
+ TEST_INSTRUCTION("62F2FD29A05C1110" , k(k1).vpscatterdq(ptr(ecx, xmm2, 0, 128), ymm3));
+ TEST_INSTRUCTION("62F2FD49A05C1110" , k(k1).vpscatterdq(ptr(ecx, ymm2, 0, 128), zmm3));
+ TEST_INSTRUCTION("62F27D09A15C1120" , k(k1).vpscatterqd(ptr(ecx, xmm2, 0, 128), xmm3));
+ TEST_INSTRUCTION("62F27D29A15C1120" , k(k1).vpscatterqd(ptr(ecx, ymm2, 0, 128), xmm3));
+ TEST_INSTRUCTION("62F27D49A15C1120" , k(k1).vpscatterqd(ptr(ecx, zmm2, 0, 128), ymm3));
+ TEST_INSTRUCTION("62F2FD09A15C1110" , k(k1).vpscatterqq(ptr(ecx, xmm2, 0, 128), xmm3));
+ TEST_INSTRUCTION("62F2FD29A15C1110" , k(k1).vpscatterqq(ptr(ecx, ymm2, 0, 128), ymm3));
+ TEST_INSTRUCTION("62F2FD49A15C1110" , k(k1).vpscatterqq(ptr(ecx, zmm2, 0, 128), zmm3));
+ TEST_INSTRUCTION("8FE96098CA" , vpshab(xmm1, xmm2, xmm3));
+ TEST_INSTRUCTION("8FE9E8988C2B80000000" , vpshab(xmm1, xmm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("8FE9E8988C2B80000000" , vpshab(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("8FE958988C1A80000000" , vpshab(xmm1, ptr(edx, ebx, 0, 128), xmm4));
+ TEST_INSTRUCTION("8FE958988C1A80000000" , vpshab(xmm1, xmmword_ptr(edx, ebx, 0, 128), xmm4));
+ TEST_INSTRUCTION("8FE9609ACA" , vpshad(xmm1, xmm2, xmm3));
+ TEST_INSTRUCTION("8FE9E89A8C2B80000000" , vpshad(xmm1, xmm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("8FE9E89A8C2B80000000" , vpshad(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("8FE9589A8C1A80000000" , vpshad(xmm1, ptr(edx, ebx, 0, 128), xmm4));
+ TEST_INSTRUCTION("8FE9589A8C1A80000000" , vpshad(xmm1, xmmword_ptr(edx, ebx, 0, 128), xmm4));
+ TEST_INSTRUCTION("8FE9609BCA" , vpshaq(xmm1, xmm2, xmm3));
+ TEST_INSTRUCTION("8FE9E89B8C2B80000000" , vpshaq(xmm1, xmm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("8FE9E89B8C2B80000000" , vpshaq(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("8FE9589B8C1A80000000" , vpshaq(xmm1, ptr(edx, ebx, 0, 128), xmm4));
+ TEST_INSTRUCTION("8FE9589B8C1A80000000" , vpshaq(xmm1, xmmword_ptr(edx, ebx, 0, 128), xmm4));
+ TEST_INSTRUCTION("8FE96099CA" , vpshaw(xmm1, xmm2, xmm3));
+ TEST_INSTRUCTION("8FE9E8998C2B80000000" , vpshaw(xmm1, xmm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("8FE9E8998C2B80000000" , vpshaw(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("8FE958998C1A80000000" , vpshaw(xmm1, ptr(edx, ebx, 0, 128), xmm4));
+ TEST_INSTRUCTION("8FE958998C1A80000000" , vpshaw(xmm1, xmmword_ptr(edx, ebx, 0, 128), xmm4));
+ TEST_INSTRUCTION("8FE96094CA" , vpshlb(xmm1, xmm2, xmm3));
+ TEST_INSTRUCTION("8FE9E8948C2B80000000" , vpshlb(xmm1, xmm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("8FE9E8948C2B80000000" , vpshlb(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("8FE958948C1A80000000" , vpshlb(xmm1, ptr(edx, ebx, 0, 128), xmm4));
+ TEST_INSTRUCTION("8FE958948C1A80000000" , vpshlb(xmm1, xmmword_ptr(edx, ebx, 0, 128), xmm4));
+ TEST_INSTRUCTION("8FE96096CA" , vpshld(xmm1, xmm2, xmm3));
+ TEST_INSTRUCTION("8FE9E8968C2B80000000" , vpshld(xmm1, xmm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("8FE9E8968C2B80000000" , vpshld(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("8FE958968C1A80000000" , vpshld(xmm1, ptr(edx, ebx, 0, 128), xmm4));
+ TEST_INSTRUCTION("8FE958968C1A80000000" , vpshld(xmm1, xmmword_ptr(edx, ebx, 0, 128), xmm4));
+ TEST_INSTRUCTION("62F36D0871CB01" , vpshldd(xmm1, xmm2, xmm3, 1));
+ TEST_INSTRUCTION("62F36D08714C2B0801" , vpshldd(xmm1, xmm2, ptr(ebx, ebp, 0, 128), 1));
+ TEST_INSTRUCTION("62F36D08714C2B0801" , vpshldd(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128), 1));
+ TEST_INSTRUCTION("62F36D2871CB01" , vpshldd(ymm1, ymm2, ymm3, 1));
+ TEST_INSTRUCTION("62F36D28714C2B0401" , vpshldd(ymm1, ymm2, ptr(ebx, ebp, 0, 128), 1));
+ TEST_INSTRUCTION("62F36D28714C2B0401" , vpshldd(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128), 1));
+ TEST_INSTRUCTION("62F36D4871CB01" , vpshldd(zmm1, zmm2, zmm3, 1));
+ TEST_INSTRUCTION("62F36D48714C2B0201" , vpshldd(zmm1, zmm2, ptr(ebx, ebp, 0, 128), 1));
+ TEST_INSTRUCTION("62F36D48714C2B0201" , vpshldd(zmm1, zmm2, zmmword_ptr(ebx, ebp, 0, 128), 1));
+ TEST_INSTRUCTION("62F3ED0871CB01" , vpshldq(xmm1, xmm2, xmm3, 1));
+ TEST_INSTRUCTION("62F3ED08714C2B0801" , vpshldq(xmm1, xmm2, ptr(ebx, ebp, 0, 128), 1));
+ TEST_INSTRUCTION("62F3ED08714C2B0801" , vpshldq(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128), 1));
+ TEST_INSTRUCTION("62F3ED2871CB01" , vpshldq(ymm1, ymm2, ymm3, 1));
+ TEST_INSTRUCTION("62F3ED28714C2B0401" , vpshldq(ymm1, ymm2, ptr(ebx, ebp, 0, 128), 1));
+ TEST_INSTRUCTION("62F3ED28714C2B0401" , vpshldq(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128), 1));
+ TEST_INSTRUCTION("62F3ED4871CB01" , vpshldq(zmm1, zmm2, zmm3, 1));
+ TEST_INSTRUCTION("62F3ED48714C2B0201" , vpshldq(zmm1, zmm2, ptr(ebx, ebp, 0, 128), 1));
+ TEST_INSTRUCTION("62F3ED48714C2B0201" , vpshldq(zmm1, zmm2, zmmword_ptr(ebx, ebp, 0, 128), 1));
+ TEST_INSTRUCTION("62F26D0871CB" , vpshldvd(xmm1, xmm2, xmm3));
+ TEST_INSTRUCTION("62F26D08714C2B08" , vpshldvd(xmm1, xmm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F26D08714C2B08" , vpshldvd(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F26D2871CB" , vpshldvd(ymm1, ymm2, ymm3));
+ TEST_INSTRUCTION("62F26D28714C2B04" , vpshldvd(ymm1, ymm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F26D28714C2B04" , vpshldvd(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F26D4871CB" , vpshldvd(zmm1, zmm2, zmm3));
+ TEST_INSTRUCTION("62F26D48714C2B02" , vpshldvd(zmm1, zmm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F26D48714C2B02" , vpshldvd(zmm1, zmm2, zmmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F2ED0871CB" , vpshldvq(xmm1, xmm2, xmm3));
+ TEST_INSTRUCTION("62F2ED08714C2B08" , vpshldvq(xmm1, xmm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F2ED08714C2B08" , vpshldvq(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F2ED2871CB" , vpshldvq(ymm1, ymm2, ymm3));
+ TEST_INSTRUCTION("62F2ED28714C2B04" , vpshldvq(ymm1, ymm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F2ED28714C2B04" , vpshldvq(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F2ED4871CB" , vpshldvq(zmm1, zmm2, zmm3));
+ TEST_INSTRUCTION("62F2ED48714C2B02" , vpshldvq(zmm1, zmm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F2ED48714C2B02" , vpshldvq(zmm1, zmm2, zmmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F2ED0870CB" , vpshldvw(xmm1, xmm2, xmm3));
+ TEST_INSTRUCTION("62F2ED08704C2B08" , vpshldvw(xmm1, xmm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F2ED08704C2B08" , vpshldvw(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F2ED2870CB" , vpshldvw(ymm1, ymm2, ymm3));
+ TEST_INSTRUCTION("62F2ED28704C2B04" , vpshldvw(ymm1, ymm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F2ED28704C2B04" , vpshldvw(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F2ED4870CB" , vpshldvw(zmm1, zmm2, zmm3));
+ TEST_INSTRUCTION("62F2ED48704C2B02" , vpshldvw(zmm1, zmm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F2ED48704C2B02" , vpshldvw(zmm1, zmm2, zmmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F3ED0870CB01" , vpshldw(xmm1, xmm2, xmm3, 1));
+ TEST_INSTRUCTION("62F3ED08704C2B0801" , vpshldw(xmm1, xmm2, ptr(ebx, ebp, 0, 128), 1));
+ TEST_INSTRUCTION("62F3ED08704C2B0801" , vpshldw(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128), 1));
+ TEST_INSTRUCTION("62F3ED2870CB01" , vpshldw(ymm1, ymm2, ymm3, 1));
+ TEST_INSTRUCTION("62F3ED28704C2B0401" , vpshldw(ymm1, ymm2, ptr(ebx, ebp, 0, 128), 1));
+ TEST_INSTRUCTION("62F3ED28704C2B0401" , vpshldw(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128), 1));
+ TEST_INSTRUCTION("62F3ED4870CB01" , vpshldw(zmm1, zmm2, zmm3, 1));
+ TEST_INSTRUCTION("62F3ED48704C2B0201" , vpshldw(zmm1, zmm2, ptr(ebx, ebp, 0, 128), 1));
+ TEST_INSTRUCTION("62F3ED48704C2B0201" , vpshldw(zmm1, zmm2, zmmword_ptr(ebx, ebp, 0, 128), 1));
+ TEST_INSTRUCTION("8FE96097CA" , vpshlq(xmm1, xmm2, xmm3));
+ TEST_INSTRUCTION("8FE9E8978C2B80000000" , vpshlq(xmm1, xmm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("8FE9E8978C2B80000000" , vpshlq(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("8FE958978C1A80000000" , vpshlq(xmm1, ptr(edx, ebx, 0, 128), xmm4));
+ TEST_INSTRUCTION("8FE958978C1A80000000" , vpshlq(xmm1, xmmword_ptr(edx, ebx, 0, 128), xmm4));
+ TEST_INSTRUCTION("8FE96095CA" , vpshlw(xmm1, xmm2, xmm3));
+ TEST_INSTRUCTION("8FE9E8958C2B80000000" , vpshlw(xmm1, xmm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("8FE9E8958C2B80000000" , vpshlw(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("8FE958958C1A80000000" , vpshlw(xmm1, ptr(edx, ebx, 0, 128), xmm4));
+ TEST_INSTRUCTION("8FE958958C1A80000000" , vpshlw(xmm1, xmmword_ptr(edx, ebx, 0, 128), xmm4));
+ TEST_INSTRUCTION("62F36D0873CB01" , vpshrdd(xmm1, xmm2, xmm3, 1));
+ TEST_INSTRUCTION("62F36D08734C2B0801" , vpshrdd(xmm1, xmm2, ptr(ebx, ebp, 0, 128), 1));
+ TEST_INSTRUCTION("62F36D08734C2B0801" , vpshrdd(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128), 1));
+ TEST_INSTRUCTION("62F36D2873CB01" , vpshrdd(ymm1, ymm2, ymm3, 1));
+ TEST_INSTRUCTION("62F36D28734C2B0401" , vpshrdd(ymm1, ymm2, ptr(ebx, ebp, 0, 128), 1));
+ TEST_INSTRUCTION("62F36D28734C2B0401" , vpshrdd(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128), 1));
+ TEST_INSTRUCTION("62F36D4873CB01" , vpshrdd(zmm1, zmm2, zmm3, 1));
+ TEST_INSTRUCTION("62F36D48734C2B0201" , vpshrdd(zmm1, zmm2, ptr(ebx, ebp, 0, 128), 1));
+ TEST_INSTRUCTION("62F36D48734C2B0201" , vpshrdd(zmm1, zmm2, zmmword_ptr(ebx, ebp, 0, 128), 1));
+ TEST_INSTRUCTION("62F3ED0873CB01" , vpshrdq(xmm1, xmm2, xmm3, 1));
+ TEST_INSTRUCTION("62F3ED08734C2B0801" , vpshrdq(xmm1, xmm2, ptr(ebx, ebp, 0, 128), 1));
+ TEST_INSTRUCTION("62F3ED08734C2B0801" , vpshrdq(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128), 1));
+ TEST_INSTRUCTION("62F3ED2873CB01" , vpshrdq(ymm1, ymm2, ymm3, 1));
+ TEST_INSTRUCTION("62F3ED28734C2B0401" , vpshrdq(ymm1, ymm2, ptr(ebx, ebp, 0, 128), 1));
+ TEST_INSTRUCTION("62F3ED28734C2B0401" , vpshrdq(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128), 1));
+ TEST_INSTRUCTION("62F3ED4873CB01" , vpshrdq(zmm1, zmm2, zmm3, 1));
+ TEST_INSTRUCTION("62F3ED48734C2B0201" , vpshrdq(zmm1, zmm2, ptr(ebx, ebp, 0, 128), 1));
+ TEST_INSTRUCTION("62F3ED48734C2B0201" , vpshrdq(zmm1, zmm2, zmmword_ptr(ebx, ebp, 0, 128), 1));
+ TEST_INSTRUCTION("62F26D0873CB" , vpshrdvd(xmm1, xmm2, xmm3));
+ TEST_INSTRUCTION("62F26D08734C2B08" , vpshrdvd(xmm1, xmm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F26D08734C2B08" , vpshrdvd(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F26D2873CB" , vpshrdvd(ymm1, ymm2, ymm3));
+ TEST_INSTRUCTION("62F26D28734C2B04" , vpshrdvd(ymm1, ymm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F26D28734C2B04" , vpshrdvd(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F26D4873CB" , vpshrdvd(zmm1, zmm2, zmm3));
+ TEST_INSTRUCTION("62F26D48734C2B02" , vpshrdvd(zmm1, zmm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F26D48734C2B02" , vpshrdvd(zmm1, zmm2, zmmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F2ED0873CB" , vpshrdvq(xmm1, xmm2, xmm3));
+ TEST_INSTRUCTION("62F2ED08734C2B08" , vpshrdvq(xmm1, xmm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F2ED08734C2B08" , vpshrdvq(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F2ED2873CB" , vpshrdvq(ymm1, ymm2, ymm3));
+ TEST_INSTRUCTION("62F2ED28734C2B04" , vpshrdvq(ymm1, ymm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F2ED28734C2B04" , vpshrdvq(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F2ED4873CB" , vpshrdvq(zmm1, zmm2, zmm3));
+ TEST_INSTRUCTION("62F2ED48734C2B02" , vpshrdvq(zmm1, zmm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F2ED48734C2B02" , vpshrdvq(zmm1, zmm2, zmmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F2ED0872CB" , vpshrdvw(xmm1, xmm2, xmm3));
+ TEST_INSTRUCTION("62F2ED08724C2B08" , vpshrdvw(xmm1, xmm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F2ED08724C2B08" , vpshrdvw(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F2ED2872CB" , vpshrdvw(ymm1, ymm2, ymm3));
+ TEST_INSTRUCTION("62F2ED28724C2B04" , vpshrdvw(ymm1, ymm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F2ED28724C2B04" , vpshrdvw(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F2ED4872CB" , vpshrdvw(zmm1, zmm2, zmm3));
+ TEST_INSTRUCTION("62F2ED48724C2B02" , vpshrdvw(zmm1, zmm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F2ED48724C2B02" , vpshrdvw(zmm1, zmm2, zmmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F3ED0872CB01" , vpshrdw(xmm1, xmm2, xmm3, 1));
+ TEST_INSTRUCTION("62F3ED08724C2B0801" , vpshrdw(xmm1, xmm2, ptr(ebx, ebp, 0, 128), 1));
+ TEST_INSTRUCTION("62F3ED08724C2B0801" , vpshrdw(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128), 1));
+ TEST_INSTRUCTION("62F3ED2872CB01" , vpshrdw(ymm1, ymm2, ymm3, 1));
+ TEST_INSTRUCTION("62F3ED28724C2B0401" , vpshrdw(ymm1, ymm2, ptr(ebx, ebp, 0, 128), 1));
+ TEST_INSTRUCTION("62F3ED28724C2B0401" , vpshrdw(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128), 1));
+ TEST_INSTRUCTION("62F3ED4872CB01" , vpshrdw(zmm1, zmm2, zmm3, 1));
+ TEST_INSTRUCTION("62F3ED48724C2B0201" , vpshrdw(zmm1, zmm2, ptr(ebx, ebp, 0, 128), 1));
+ TEST_INSTRUCTION("62F3ED48724C2B0201" , vpshrdw(zmm1, zmm2, zmmword_ptr(ebx, ebp, 0, 128), 1));
+ TEST_INSTRUCTION("C4E26900CB" , vpshufb(xmm1, xmm2, xmm3));
+ TEST_INSTRUCTION("C4E269008C2B80000000" , vpshufb(xmm1, xmm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C4E269008C2B80000000" , vpshufb(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C4E26D00CB" , vpshufb(ymm1, ymm2, ymm3));
+ TEST_INSTRUCTION("C4E26D008C2B80000000" , vpshufb(ymm1, ymm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C4E26D008C2B80000000" , vpshufb(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F26D4800CB" , vpshufb(zmm1, zmm2, zmm3));
+ TEST_INSTRUCTION("62F26D48004C2B02" , vpshufb(zmm1, zmm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F26D48004C2B02" , vpshufb(zmm1, zmm2, zmmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F26D088FCB" , vpshufbitqmb(k1, xmm2, xmm3));
+ TEST_INSTRUCTION("62F26D088F4C2B08" , vpshufbitqmb(k1, xmm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F26D088F4C2B08" , vpshufbitqmb(k1, xmm2, xmmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F26D288FCB" , vpshufbitqmb(k1, ymm2, ymm3));
+ TEST_INSTRUCTION("62F26D288F4C2B04" , vpshufbitqmb(k1, ymm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F26D288F4C2B04" , vpshufbitqmb(k1, ymm2, ymmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F26D488FCB" , vpshufbitqmb(k1, zmm2, zmm3));
+ TEST_INSTRUCTION("62F26D488F4C2B02" , vpshufbitqmb(k1, zmm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F26D488F4C2B02" , vpshufbitqmb(k1, zmm2, zmmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C5F970CA01" , vpshufd(xmm1, xmm2, 1));
+ TEST_INSTRUCTION("C5F9708C1A8000000001" , vpshufd(xmm1, ptr(edx, ebx, 0, 128), 1));
+ TEST_INSTRUCTION("C5F9708C1A8000000001" , vpshufd(xmm1, xmmword_ptr(edx, ebx, 0, 128), 1));
+ TEST_INSTRUCTION("C5FD70CA01" , vpshufd(ymm1, ymm2, 1));
+ TEST_INSTRUCTION("C5FD708C1A8000000001" , vpshufd(ymm1, ptr(edx, ebx, 0, 128), 1));
+ TEST_INSTRUCTION("C5FD708C1A8000000001" , vpshufd(ymm1, ymmword_ptr(edx, ebx, 0, 128), 1));
+ TEST_INSTRUCTION("62F17D4870CA01" , vpshufd(zmm1, zmm2, 1));
+ TEST_INSTRUCTION("62F17D48704C1A0201" , vpshufd(zmm1, ptr(edx, ebx, 0, 128), 1));
+ TEST_INSTRUCTION("62F17D48704C1A0201" , vpshufd(zmm1, zmmword_ptr(edx, ebx, 0, 128), 1));
+ TEST_INSTRUCTION("C5FA70CA01" , vpshufhw(xmm1, xmm2, 1));
+ TEST_INSTRUCTION("C5FA708C1A8000000001" , vpshufhw(xmm1, ptr(edx, ebx, 0, 128), 1));
+ TEST_INSTRUCTION("C5FA708C1A8000000001" , vpshufhw(xmm1, xmmword_ptr(edx, ebx, 0, 128), 1));
+ TEST_INSTRUCTION("C5FE70CA01" , vpshufhw(ymm1, ymm2, 1));
+ TEST_INSTRUCTION("C5FE708C1A8000000001" , vpshufhw(ymm1, ptr(edx, ebx, 0, 128), 1));
+ TEST_INSTRUCTION("C5FE708C1A8000000001" , vpshufhw(ymm1, ymmword_ptr(edx, ebx, 0, 128), 1));
+ TEST_INSTRUCTION("62F17E4870CA01" , vpshufhw(zmm1, zmm2, 1));
+ TEST_INSTRUCTION("62F17E48704C1A0201" , vpshufhw(zmm1, ptr(edx, ebx, 0, 128), 1));
+ TEST_INSTRUCTION("62F17E48704C1A0201" , vpshufhw(zmm1, zmmword_ptr(edx, ebx, 0, 128), 1));
+ TEST_INSTRUCTION("C5FB70CA01" , vpshuflw(xmm1, xmm2, 1));
+ TEST_INSTRUCTION("C5FB708C1A8000000001" , vpshuflw(xmm1, ptr(edx, ebx, 0, 128), 1));
+ TEST_INSTRUCTION("C5FB708C1A8000000001" , vpshuflw(xmm1, xmmword_ptr(edx, ebx, 0, 128), 1));
+ TEST_INSTRUCTION("C5FF70CA01" , vpshuflw(ymm1, ymm2, 1));
+ TEST_INSTRUCTION("C5FF708C1A8000000001" , vpshuflw(ymm1, ptr(edx, ebx, 0, 128), 1));
+ TEST_INSTRUCTION("C5FF708C1A8000000001" , vpshuflw(ymm1, ymmword_ptr(edx, ebx, 0, 128), 1));
+ TEST_INSTRUCTION("62F17F4870CA01" , vpshuflw(zmm1, zmm2, 1));
+ TEST_INSTRUCTION("62F17F48704C1A0201" , vpshuflw(zmm1, ptr(edx, ebx, 0, 128), 1));
+ TEST_INSTRUCTION("62F17F48704C1A0201" , vpshuflw(zmm1, zmmword_ptr(edx, ebx, 0, 128), 1));
+ TEST_INSTRUCTION("C4E26908CB" , vpsignb(xmm1, xmm2, xmm3));
+ TEST_INSTRUCTION("C4E269088C2B80000000" , vpsignb(xmm1, xmm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C4E269088C2B80000000" , vpsignb(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C4E26D08CB" , vpsignb(ymm1, ymm2, ymm3));
+ TEST_INSTRUCTION("C4E26D088C2B80000000" , vpsignb(ymm1, ymm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C4E26D088C2B80000000" , vpsignb(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C4E2690ACB" , vpsignd(xmm1, xmm2, xmm3));
+ TEST_INSTRUCTION("C4E2690A8C2B80000000" , vpsignd(xmm1, xmm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C4E2690A8C2B80000000" , vpsignd(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C4E26D0ACB" , vpsignd(ymm1, ymm2, ymm3));
+ TEST_INSTRUCTION("C4E26D0A8C2B80000000" , vpsignd(ymm1, ymm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C4E26D0A8C2B80000000" , vpsignd(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C4E26909CB" , vpsignw(xmm1, xmm2, xmm3));
+ TEST_INSTRUCTION("C4E269098C2B80000000" , vpsignw(xmm1, xmm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C4E269098C2B80000000" , vpsignw(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C4E26D09CB" , vpsignw(ymm1, ymm2, ymm3));
+ TEST_INSTRUCTION("C4E26D098C2B80000000" , vpsignw(ymm1, ymm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C4E26D098C2B80000000" , vpsignw(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C5E9F2CB" , vpslld(xmm1, xmm2, xmm3));
+ TEST_INSTRUCTION("C5F172F201" , vpslld(xmm1, xmm2, 1));
+ TEST_INSTRUCTION("C5E9F28C2B80000000" , vpslld(xmm1, xmm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C5E9F28C2B80000000" , vpslld(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C5EDF2CB" , vpslld(ymm1, ymm2, xmm3));
+ TEST_INSTRUCTION("C5F572F201" , vpslld(ymm1, ymm2, 1));
+ TEST_INSTRUCTION("C5EDF28C2B80000000" , vpslld(ymm1, ymm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C5EDF28C2B80000000" , vpslld(ymm1, ymm2, xmmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F1750872741A0801" , vpslld(xmm1, ptr(edx, ebx, 0, 128), 1));
+ TEST_INSTRUCTION("62F1750872741A0801" , vpslld(xmm1, xmmword_ptr(edx, ebx, 0, 128), 1));
+ TEST_INSTRUCTION("62F1752872741A0401" , vpslld(ymm1, ptr(edx, ebx, 0, 128), 1));
+ TEST_INSTRUCTION("62F1752872741A0401" , vpslld(ymm1, ymmword_ptr(edx, ebx, 0, 128), 1));
+ TEST_INSTRUCTION("62F16D48F2CB" , vpslld(zmm1, zmm2, xmm3));
+ TEST_INSTRUCTION("62F1754872F201" , vpslld(zmm1, zmm2, 1));
+ TEST_INSTRUCTION("62F16D48F24C2B08" , vpslld(zmm1, zmm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F16D48F24C2B08" , vpslld(zmm1, zmm2, xmmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F1754872741A0201" , vpslld(zmm1, ptr(edx, ebx, 0, 128), 1));
+ TEST_INSTRUCTION("62F1754872741A0201" , vpslld(zmm1, zmmword_ptr(edx, ebx, 0, 128), 1));
+ TEST_INSTRUCTION("C5F173FA01" , vpslldq(xmm1, xmm2, 1));
+ TEST_INSTRUCTION("62F17508737C1A0801" , vpslldq(xmm1, ptr(edx, ebx, 0, 128), 1));
+ TEST_INSTRUCTION("62F17508737C1A0801" , vpslldq(xmm1, xmmword_ptr(edx, ebx, 0, 128), 1));
+ TEST_INSTRUCTION("C5F573FA01" , vpslldq(ymm1, ymm2, 1));
+ TEST_INSTRUCTION("62F17528737C1A0401" , vpslldq(ymm1, ptr(edx, ebx, 0, 128), 1));
+ TEST_INSTRUCTION("62F17528737C1A0401" , vpslldq(ymm1, ymmword_ptr(edx, ebx, 0, 128), 1));
+ TEST_INSTRUCTION("62F1754873FA01" , vpslldq(zmm1, zmm2, 1));
+ TEST_INSTRUCTION("62F17548737C1A0201" , vpslldq(zmm1, ptr(edx, ebx, 0, 128), 1));
+ TEST_INSTRUCTION("62F17548737C1A0201" , vpslldq(zmm1, zmmword_ptr(edx, ebx, 0, 128), 1));
+ TEST_INSTRUCTION("C5E9F3CB" , vpsllq(xmm1, xmm2, xmm3));
+ TEST_INSTRUCTION("C5F173F201" , vpsllq(xmm1, xmm2, 1));
+ TEST_INSTRUCTION("C5E9F38C2B80000000" , vpsllq(xmm1, xmm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C5E9F38C2B80000000" , vpsllq(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C5EDF3CB" , vpsllq(ymm1, ymm2, xmm3));
+ TEST_INSTRUCTION("C5F573F201" , vpsllq(ymm1, ymm2, 1));
+ TEST_INSTRUCTION("C5EDF38C2B80000000" , vpsllq(ymm1, ymm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C5EDF38C2B80000000" , vpsllq(ymm1, ymm2, xmmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F1F50873741A0801" , vpsllq(xmm1, ptr(edx, ebx, 0, 128), 1));
+ TEST_INSTRUCTION("62F1F50873741A0801" , vpsllq(xmm1, xmmword_ptr(edx, ebx, 0, 128), 1));
+ TEST_INSTRUCTION("62F1F52873741A0401" , vpsllq(ymm1, ptr(edx, ebx, 0, 128), 1));
+ TEST_INSTRUCTION("62F1F52873741A0401" , vpsllq(ymm1, ymmword_ptr(edx, ebx, 0, 128), 1));
+ TEST_INSTRUCTION("62F1ED48F3CB" , vpsllq(zmm1, zmm2, xmm3));
+ TEST_INSTRUCTION("62F1F54873F201" , vpsllq(zmm1, zmm2, 1));
+ TEST_INSTRUCTION("62F1ED48F34C2B08" , vpsllq(zmm1, zmm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F1ED48F34C2B08" , vpsllq(zmm1, zmm2, xmmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F1F54873741A0201" , vpsllq(zmm1, ptr(edx, ebx, 0, 128), 1));
+ TEST_INSTRUCTION("62F1F54873741A0201" , vpsllq(zmm1, zmmword_ptr(edx, ebx, 0, 128), 1));
+ TEST_INSTRUCTION("C4E26947CB" , vpsllvd(xmm1, xmm2, xmm3));
+ TEST_INSTRUCTION("C4E269478C2B80000000" , vpsllvd(xmm1, xmm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C4E269478C2B80000000" , vpsllvd(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C4E26D47CB" , vpsllvd(ymm1, ymm2, ymm3));
+ TEST_INSTRUCTION("C4E26D478C2B80000000" , vpsllvd(ymm1, ymm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C4E26D478C2B80000000" , vpsllvd(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F26D4847CB" , vpsllvd(zmm1, zmm2, zmm3));
+ TEST_INSTRUCTION("62F26D48474C2B02" , vpsllvd(zmm1, zmm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F26D48474C2B02" , vpsllvd(zmm1, zmm2, zmmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C4E2E947CB" , vpsllvq(xmm1, xmm2, xmm3));
+ TEST_INSTRUCTION("C4E2E9478C2B80000000" , vpsllvq(xmm1, xmm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C4E2E9478C2B80000000" , vpsllvq(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C4E2ED47CB" , vpsllvq(ymm1, ymm2, ymm3));
+ TEST_INSTRUCTION("C4E2ED478C2B80000000" , vpsllvq(ymm1, ymm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C4E2ED478C2B80000000" , vpsllvq(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F2ED4847CB" , vpsllvq(zmm1, zmm2, zmm3));
+ TEST_INSTRUCTION("62F2ED48474C2B02" , vpsllvq(zmm1, zmm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F2ED48474C2B02" , vpsllvq(zmm1, zmm2, zmmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F2ED0812CB" , vpsllvw(xmm1, xmm2, xmm3));
+ TEST_INSTRUCTION("62F2ED08124C2B08" , vpsllvw(xmm1, xmm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F2ED08124C2B08" , vpsllvw(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F2ED2812CB" , vpsllvw(ymm1, ymm2, ymm3));
+ TEST_INSTRUCTION("62F2ED28124C2B04" , vpsllvw(ymm1, ymm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F2ED28124C2B04" , vpsllvw(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F2ED4812CB" , vpsllvw(zmm1, zmm2, zmm3));
+ TEST_INSTRUCTION("62F2ED48124C2B02" , vpsllvw(zmm1, zmm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F2ED48124C2B02" , vpsllvw(zmm1, zmm2, zmmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C5E9F1CB" , vpsllw(xmm1, xmm2, xmm3));
+ TEST_INSTRUCTION("C5F171F201" , vpsllw(xmm1, xmm2, 1));
+ TEST_INSTRUCTION("C5E9F18C2B80000000" , vpsllw(xmm1, xmm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C5E9F18C2B80000000" , vpsllw(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C5EDF1CB" , vpsllw(ymm1, ymm2, xmm3));
+ TEST_INSTRUCTION("C5F571F201" , vpsllw(ymm1, ymm2, 1));
+ TEST_INSTRUCTION("C5EDF18C2B80000000" , vpsllw(ymm1, ymm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C5EDF18C2B80000000" , vpsllw(ymm1, ymm2, xmmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F1750871741A0801" , vpsllw(xmm1, ptr(edx, ebx, 0, 128), 1));
+ TEST_INSTRUCTION("62F1750871741A0801" , vpsllw(xmm1, xmmword_ptr(edx, ebx, 0, 128), 1));
+ TEST_INSTRUCTION("62F1752871741A0401" , vpsllw(ymm1, ptr(edx, ebx, 0, 128), 1));
+ TEST_INSTRUCTION("62F1752871741A0401" , vpsllw(ymm1, ymmword_ptr(edx, ebx, 0, 128), 1));
+ TEST_INSTRUCTION("62F16D48F1CB" , vpsllw(zmm1, zmm2, xmm3));
+ TEST_INSTRUCTION("62F1754871F201" , vpsllw(zmm1, zmm2, 1));
+ TEST_INSTRUCTION("62F16D48F14C2B08" , vpsllw(zmm1, zmm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F16D48F14C2B08" , vpsllw(zmm1, zmm2, xmmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F1754871741A0201" , vpsllw(zmm1, ptr(edx, ebx, 0, 128), 1));
+ TEST_INSTRUCTION("62F1754871741A0201" , vpsllw(zmm1, zmmword_ptr(edx, ebx, 0, 128), 1));
+ TEST_INSTRUCTION("C5E9E2CB" , vpsrad(xmm1, xmm2, xmm3));
+ TEST_INSTRUCTION("C5F172E201" , vpsrad(xmm1, xmm2, 1));
+ TEST_INSTRUCTION("C5E9E28C2B80000000" , vpsrad(xmm1, xmm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C5E9E28C2B80000000" , vpsrad(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C5EDE2CB" , vpsrad(ymm1, ymm2, xmm3));
+ TEST_INSTRUCTION("C5F572E201" , vpsrad(ymm1, ymm2, 1));
+ TEST_INSTRUCTION("C5EDE28C2B80000000" , vpsrad(ymm1, ymm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C5EDE28C2B80000000" , vpsrad(ymm1, ymm2, xmmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F1750872641A0801" , vpsrad(xmm1, ptr(edx, ebx, 0, 128), 1));
+ TEST_INSTRUCTION("62F1750872641A0801" , vpsrad(xmm1, xmmword_ptr(edx, ebx, 0, 128), 1));
+ TEST_INSTRUCTION("62F1752872641A0401" , vpsrad(ymm1, ptr(edx, ebx, 0, 128), 1));
+ TEST_INSTRUCTION("62F1752872641A0401" , vpsrad(ymm1, ymmword_ptr(edx, ebx, 0, 128), 1));
+ TEST_INSTRUCTION("62F16D48E2CB" , vpsrad(zmm1, zmm2, xmm3));
+ TEST_INSTRUCTION("62F1754872E201" , vpsrad(zmm1, zmm2, 1));
+ TEST_INSTRUCTION("62F16D48E24C2B08" , vpsrad(zmm1, zmm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F16D48E24C2B08" , vpsrad(zmm1, zmm2, xmmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F1754872641A0201" , vpsrad(zmm1, ptr(edx, ebx, 0, 128), 1));
+ TEST_INSTRUCTION("62F1754872641A0201" , vpsrad(zmm1, zmmword_ptr(edx, ebx, 0, 128), 1));
+ TEST_INSTRUCTION("62F1ED08E2CB" , vpsraq(xmm1, xmm2, xmm3));
+ TEST_INSTRUCTION("62F1F50872E201" , vpsraq(xmm1, xmm2, 1));
+ TEST_INSTRUCTION("62F1ED08E24C2B08" , vpsraq(xmm1, xmm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F1ED08E24C2B08" , vpsraq(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F1F50872641A0801" , vpsraq(xmm1, ptr(edx, ebx, 0, 128), 1));
+ TEST_INSTRUCTION("62F1F50872641A0801" , vpsraq(xmm1, xmmword_ptr(edx, ebx, 0, 128), 1));
+ TEST_INSTRUCTION("62F1ED28E2CB" , vpsraq(ymm1, ymm2, xmm3));
+ TEST_INSTRUCTION("62F1F52872E201" , vpsraq(ymm1, ymm2, 1));
+ TEST_INSTRUCTION("62F1ED28E24C2B08" , vpsraq(ymm1, ymm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F1ED28E24C2B08" , vpsraq(ymm1, ymm2, xmmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F1F52872641A0401" , vpsraq(ymm1, ptr(edx, ebx, 0, 128), 1));
+ TEST_INSTRUCTION("62F1F52872641A0401" , vpsraq(ymm1, ymmword_ptr(edx, ebx, 0, 128), 1));
+ TEST_INSTRUCTION("62F1ED48E2CB" , vpsraq(zmm1, zmm2, xmm3));
+ TEST_INSTRUCTION("62F1F54872E201" , vpsraq(zmm1, zmm2, 1));
+ TEST_INSTRUCTION("62F1ED48E24C2B08" , vpsraq(zmm1, zmm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F1ED48E24C2B08" , vpsraq(zmm1, zmm2, xmmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F1F54872641A0201" , vpsraq(zmm1, ptr(edx, ebx, 0, 128), 1));
+ TEST_INSTRUCTION("62F1F54872641A0201" , vpsraq(zmm1, zmmword_ptr(edx, ebx, 0, 128), 1));
+ TEST_INSTRUCTION("C4E26946CB" , vpsravd(xmm1, xmm2, xmm3));
+ TEST_INSTRUCTION("C4E269468C2B80000000" , vpsravd(xmm1, xmm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C4E269468C2B80000000" , vpsravd(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C4E26D46CB" , vpsravd(ymm1, ymm2, ymm3));
+ TEST_INSTRUCTION("C4E26D468C2B80000000" , vpsravd(ymm1, ymm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C4E26D468C2B80000000" , vpsravd(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F26D4846CB" , vpsravd(zmm1, zmm2, zmm3));
+ TEST_INSTRUCTION("62F26D48464C2B02" , vpsravd(zmm1, zmm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F26D48464C2B02" , vpsravd(zmm1, zmm2, zmmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F2ED0846CB" , vpsravq(xmm1, xmm2, xmm3));
+ TEST_INSTRUCTION("62F2ED08464C2B08" , vpsravq(xmm1, xmm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F2ED08464C2B08" , vpsravq(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F2ED2846CB" , vpsravq(ymm1, ymm2, ymm3));
+ TEST_INSTRUCTION("62F2ED28464C2B04" , vpsravq(ymm1, ymm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F2ED28464C2B04" , vpsravq(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F2ED4846CB" , vpsravq(zmm1, zmm2, zmm3));
+ TEST_INSTRUCTION("62F2ED48464C2B02" , vpsravq(zmm1, zmm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F2ED48464C2B02" , vpsravq(zmm1, zmm2, zmmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F2ED0811CB" , vpsravw(xmm1, xmm2, xmm3));
+ TEST_INSTRUCTION("62F2ED08114C2B08" , vpsravw(xmm1, xmm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F2ED08114C2B08" , vpsravw(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F2ED2811CB" , vpsravw(ymm1, ymm2, ymm3));
+ TEST_INSTRUCTION("62F2ED28114C2B04" , vpsravw(ymm1, ymm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F2ED28114C2B04" , vpsravw(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F2ED4811CB" , vpsravw(zmm1, zmm2, zmm3));
+ TEST_INSTRUCTION("62F2ED48114C2B02" , vpsravw(zmm1, zmm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F2ED48114C2B02" , vpsravw(zmm1, zmm2, zmmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C5E9E1CB" , vpsraw(xmm1, xmm2, xmm3));
+ TEST_INSTRUCTION("C5F171E201" , vpsraw(xmm1, xmm2, 1));
+ TEST_INSTRUCTION("C5E9E18C2B80000000" , vpsraw(xmm1, xmm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C5E9E18C2B80000000" , vpsraw(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C5EDE1CB" , vpsraw(ymm1, ymm2, xmm3));
+ TEST_INSTRUCTION("C5F571E201" , vpsraw(ymm1, ymm2, 1));
+ TEST_INSTRUCTION("C5EDE18C2B80000000" , vpsraw(ymm1, ymm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C5EDE18C2B80000000" , vpsraw(ymm1, ymm2, xmmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F1750871641A0801" , vpsraw(xmm1, ptr(edx, ebx, 0, 128), 1));
+ TEST_INSTRUCTION("62F1750871641A0801" , vpsraw(xmm1, xmmword_ptr(edx, ebx, 0, 128), 1));
+ TEST_INSTRUCTION("62F1752871641A0401" , vpsraw(ymm1, ptr(edx, ebx, 0, 128), 1));
+ TEST_INSTRUCTION("62F1752871641A0401" , vpsraw(ymm1, ymmword_ptr(edx, ebx, 0, 128), 1));
+ TEST_INSTRUCTION("62F16D48E1CB" , vpsraw(zmm1, zmm2, xmm3));
+ TEST_INSTRUCTION("62F1754871E201" , vpsraw(zmm1, zmm2, 1));
+ TEST_INSTRUCTION("62F16D48E14C2B08" , vpsraw(zmm1, zmm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F16D48E14C2B08" , vpsraw(zmm1, zmm2, xmmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F1754871641A0201" , vpsraw(zmm1, ptr(edx, ebx, 0, 128), 1));
+ TEST_INSTRUCTION("62F1754871641A0201" , vpsraw(zmm1, zmmword_ptr(edx, ebx, 0, 128), 1));
+ TEST_INSTRUCTION("C5E9D2CB" , vpsrld(xmm1, xmm2, xmm3));
+ TEST_INSTRUCTION("C5F172D201" , vpsrld(xmm1, xmm2, 1));
+ TEST_INSTRUCTION("C5E9D28C2B80000000" , vpsrld(xmm1, xmm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C5E9D28C2B80000000" , vpsrld(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C5EDD2CB" , vpsrld(ymm1, ymm2, xmm3));
+ TEST_INSTRUCTION("C5F572D201" , vpsrld(ymm1, ymm2, 1));
+ TEST_INSTRUCTION("C5EDD28C2B80000000" , vpsrld(ymm1, ymm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C5EDD28C2B80000000" , vpsrld(ymm1, ymm2, xmmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F1750872541A0801" , vpsrld(xmm1, ptr(edx, ebx, 0, 128), 1));
+ TEST_INSTRUCTION("62F1750872541A0801" , vpsrld(xmm1, xmmword_ptr(edx, ebx, 0, 128), 1));
+ TEST_INSTRUCTION("62F1752872541A0401" , vpsrld(ymm1, ptr(edx, ebx, 0, 128), 1));
+ TEST_INSTRUCTION("62F1752872541A0401" , vpsrld(ymm1, ymmword_ptr(edx, ebx, 0, 128), 1));
+ TEST_INSTRUCTION("62F16D48D2CB" , vpsrld(zmm1, zmm2, xmm3));
+ TEST_INSTRUCTION("62F1754872D201" , vpsrld(zmm1, zmm2, 1));
+ TEST_INSTRUCTION("62F16D48D24C2B08" , vpsrld(zmm1, zmm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F16D48D24C2B08" , vpsrld(zmm1, zmm2, xmmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F1754872541A0201" , vpsrld(zmm1, ptr(edx, ebx, 0, 128), 1));
+ TEST_INSTRUCTION("62F1754872541A0201" , vpsrld(zmm1, zmmword_ptr(edx, ebx, 0, 128), 1));
+ TEST_INSTRUCTION("C5F173DA01" , vpsrldq(xmm1, xmm2, 1));
+ TEST_INSTRUCTION("62F17508735C1A0801" , vpsrldq(xmm1, ptr(edx, ebx, 0, 128), 1));
+ TEST_INSTRUCTION("62F17508735C1A0801" , vpsrldq(xmm1, xmmword_ptr(edx, ebx, 0, 128), 1));
+ TEST_INSTRUCTION("C5F573DA01" , vpsrldq(ymm1, ymm2, 1));
+ TEST_INSTRUCTION("62F17528735C1A0401" , vpsrldq(ymm1, ptr(edx, ebx, 0, 128), 1));
+ TEST_INSTRUCTION("62F17528735C1A0401" , vpsrldq(ymm1, ymmword_ptr(edx, ebx, 0, 128), 1));
+ TEST_INSTRUCTION("62F1754873DA01" , vpsrldq(zmm1, zmm2, 1));
+ TEST_INSTRUCTION("62F17548735C1A0201" , vpsrldq(zmm1, ptr(edx, ebx, 0, 128), 1));
+ TEST_INSTRUCTION("62F17548735C1A0201" , vpsrldq(zmm1, zmmword_ptr(edx, ebx, 0, 128), 1));
+ TEST_INSTRUCTION("C5E9D3CB" , vpsrlq(xmm1, xmm2, xmm3));
+ TEST_INSTRUCTION("C5F173D201" , vpsrlq(xmm1, xmm2, 1));
+ TEST_INSTRUCTION("C5E9D38C2B80000000" , vpsrlq(xmm1, xmm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C5E9D38C2B80000000" , vpsrlq(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C5EDD3CB" , vpsrlq(ymm1, ymm2, xmm3));
+ TEST_INSTRUCTION("C5F573D201" , vpsrlq(ymm1, ymm2, 1));
+ TEST_INSTRUCTION("C5EDD38C2B80000000" , vpsrlq(ymm1, ymm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C5EDD38C2B80000000" , vpsrlq(ymm1, ymm2, xmmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F1F50873541A0801" , vpsrlq(xmm1, ptr(edx, ebx, 0, 128), 1));
+ TEST_INSTRUCTION("62F1F50873541A0801" , vpsrlq(xmm1, xmmword_ptr(edx, ebx, 0, 128), 1));
+ TEST_INSTRUCTION("62F1F52873541A0401" , vpsrlq(ymm1, ptr(edx, ebx, 0, 128), 1));
+ TEST_INSTRUCTION("62F1F52873541A0401" , vpsrlq(ymm1, ymmword_ptr(edx, ebx, 0, 128), 1));
+ TEST_INSTRUCTION("62F1ED48D3CB" , vpsrlq(zmm1, zmm2, xmm3));
+ TEST_INSTRUCTION("62F1F54873D201" , vpsrlq(zmm1, zmm2, 1));
+ TEST_INSTRUCTION("62F1ED48D34C2B08" , vpsrlq(zmm1, zmm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F1ED48D34C2B08" , vpsrlq(zmm1, zmm2, xmmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F1F54873541A0201" , vpsrlq(zmm1, ptr(edx, ebx, 0, 128), 1));
+ TEST_INSTRUCTION("62F1F54873541A0201" , vpsrlq(zmm1, zmmword_ptr(edx, ebx, 0, 128), 1));
+ TEST_INSTRUCTION("C4E26945CB" , vpsrlvd(xmm1, xmm2, xmm3));
+ TEST_INSTRUCTION("C4E269458C2B80000000" , vpsrlvd(xmm1, xmm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C4E269458C2B80000000" , vpsrlvd(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C4E26D45CB" , vpsrlvd(ymm1, ymm2, ymm3));
+ TEST_INSTRUCTION("C4E26D458C2B80000000" , vpsrlvd(ymm1, ymm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C4E26D458C2B80000000" , vpsrlvd(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F26D4845CB" , vpsrlvd(zmm1, zmm2, zmm3));
+ TEST_INSTRUCTION("62F26D48454C2B02" , vpsrlvd(zmm1, zmm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F26D48454C2B02" , vpsrlvd(zmm1, zmm2, zmmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C4E2E945CB" , vpsrlvq(xmm1, xmm2, xmm3));
+ TEST_INSTRUCTION("C4E2E9458C2B80000000" , vpsrlvq(xmm1, xmm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C4E2E9458C2B80000000" , vpsrlvq(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C4E2ED45CB" , vpsrlvq(ymm1, ymm2, ymm3));
+ TEST_INSTRUCTION("C4E2ED458C2B80000000" , vpsrlvq(ymm1, ymm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C4E2ED458C2B80000000" , vpsrlvq(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F2ED4845CB" , vpsrlvq(zmm1, zmm2, zmm3));
+ TEST_INSTRUCTION("62F2ED48454C2B02" , vpsrlvq(zmm1, zmm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F2ED48454C2B02" , vpsrlvq(zmm1, zmm2, zmmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F2ED0810CB" , vpsrlvw(xmm1, xmm2, xmm3));
+ TEST_INSTRUCTION("62F2ED08104C2B08" , vpsrlvw(xmm1, xmm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F2ED08104C2B08" , vpsrlvw(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F2ED2810CB" , vpsrlvw(ymm1, ymm2, ymm3));
+ TEST_INSTRUCTION("62F2ED28104C2B04" , vpsrlvw(ymm1, ymm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F2ED28104C2B04" , vpsrlvw(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F2ED4810CB" , vpsrlvw(zmm1, zmm2, zmm3));
+ TEST_INSTRUCTION("62F2ED48104C2B02" , vpsrlvw(zmm1, zmm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F2ED48104C2B02" , vpsrlvw(zmm1, zmm2, zmmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C5E9D1CB" , vpsrlw(xmm1, xmm2, xmm3));
+ TEST_INSTRUCTION("C5F171D201" , vpsrlw(xmm1, xmm2, 1));
+ TEST_INSTRUCTION("C5E9D18C2B80000000" , vpsrlw(xmm1, xmm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C5E9D18C2B80000000" , vpsrlw(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C5EDD1CB" , vpsrlw(ymm1, ymm2, xmm3));
+ TEST_INSTRUCTION("C5F571D201" , vpsrlw(ymm1, ymm2, 1));
+ TEST_INSTRUCTION("C5EDD18C2B80000000" , vpsrlw(ymm1, ymm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C5EDD18C2B80000000" , vpsrlw(ymm1, ymm2, xmmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F1750871541A0801" , vpsrlw(xmm1, ptr(edx, ebx, 0, 128), 1));
+ TEST_INSTRUCTION("62F1750871541A0801" , vpsrlw(xmm1, xmmword_ptr(edx, ebx, 0, 128), 1));
+ TEST_INSTRUCTION("62F1752871541A0401" , vpsrlw(ymm1, ptr(edx, ebx, 0, 128), 1));
+ TEST_INSTRUCTION("62F1752871541A0401" , vpsrlw(ymm1, ymmword_ptr(edx, ebx, 0, 128), 1));
+ TEST_INSTRUCTION("62F16D48D1CB" , vpsrlw(zmm1, zmm2, xmm3));
+ TEST_INSTRUCTION("62F1754871D201" , vpsrlw(zmm1, zmm2, 1));
+ TEST_INSTRUCTION("62F16D48D14C2B08" , vpsrlw(zmm1, zmm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F16D48D14C2B08" , vpsrlw(zmm1, zmm2, xmmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F1754871541A0201" , vpsrlw(zmm1, ptr(edx, ebx, 0, 128), 1));
+ TEST_INSTRUCTION("62F1754871541A0201" , vpsrlw(zmm1, zmmword_ptr(edx, ebx, 0, 128), 1));
+ TEST_INSTRUCTION("C5E9F8CB" , vpsubb(xmm1, xmm2, xmm3));
+ TEST_INSTRUCTION("C5E9F88C2B80000000" , vpsubb(xmm1, xmm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C5E9F88C2B80000000" , vpsubb(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C5EDF8CB" , vpsubb(ymm1, ymm2, ymm3));
+ TEST_INSTRUCTION("C5EDF88C2B80000000" , vpsubb(ymm1, ymm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C5EDF88C2B80000000" , vpsubb(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F16D48F8CB" , vpsubb(zmm1, zmm2, zmm3));
+ TEST_INSTRUCTION("62F16D48F84C2B02" , vpsubb(zmm1, zmm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F16D48F84C2B02" , vpsubb(zmm1, zmm2, zmmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C5E9FACB" , vpsubd(xmm1, xmm2, xmm3));
+ TEST_INSTRUCTION("C5E9FA8C2B80000000" , vpsubd(xmm1, xmm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C5E9FA8C2B80000000" , vpsubd(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C5EDFACB" , vpsubd(ymm1, ymm2, ymm3));
+ TEST_INSTRUCTION("C5EDFA8C2B80000000" , vpsubd(ymm1, ymm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C5EDFA8C2B80000000" , vpsubd(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F16D48FACB" , vpsubd(zmm1, zmm2, zmm3));
+ TEST_INSTRUCTION("62F16D48FA4C2B02" , vpsubd(zmm1, zmm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F16D48FA4C2B02" , vpsubd(zmm1, zmm2, zmmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C5E9FBCB" , vpsubq(xmm1, xmm2, xmm3));
+ TEST_INSTRUCTION("C5E9FB8C2B80000000" , vpsubq(xmm1, xmm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C5E9FB8C2B80000000" , vpsubq(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C5EDFBCB" , vpsubq(ymm1, ymm2, ymm3));
+ TEST_INSTRUCTION("C5EDFB8C2B80000000" , vpsubq(ymm1, ymm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C5EDFB8C2B80000000" , vpsubq(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F1ED48FBCB" , vpsubq(zmm1, zmm2, zmm3));
+ TEST_INSTRUCTION("62F1ED48FB4C2B02" , vpsubq(zmm1, zmm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F1ED48FB4C2B02" , vpsubq(zmm1, zmm2, zmmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C5E9E8CB" , vpsubsb(xmm1, xmm2, xmm3));
+ TEST_INSTRUCTION("C5E9E88C2B80000000" , vpsubsb(xmm1, xmm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C5E9E88C2B80000000" , vpsubsb(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C5EDE8CB" , vpsubsb(ymm1, ymm2, ymm3));
+ TEST_INSTRUCTION("C5EDE88C2B80000000" , vpsubsb(ymm1, ymm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C5EDE88C2B80000000" , vpsubsb(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F16D48E8CB" , vpsubsb(zmm1, zmm2, zmm3));
+ TEST_INSTRUCTION("62F16D48E84C2B02" , vpsubsb(zmm1, zmm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F16D48E84C2B02" , vpsubsb(zmm1, zmm2, zmmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C5E9E9CB" , vpsubsw(xmm1, xmm2, xmm3));
+ TEST_INSTRUCTION("C5E9E98C2B80000000" , vpsubsw(xmm1, xmm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C5E9E98C2B80000000" , vpsubsw(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C5EDE9CB" , vpsubsw(ymm1, ymm2, ymm3));
+ TEST_INSTRUCTION("C5EDE98C2B80000000" , vpsubsw(ymm1, ymm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C5EDE98C2B80000000" , vpsubsw(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F16D48E9CB" , vpsubsw(zmm1, zmm2, zmm3));
+ TEST_INSTRUCTION("62F16D48E94C2B02" , vpsubsw(zmm1, zmm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F16D48E94C2B02" , vpsubsw(zmm1, zmm2, zmmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C5E9D8CB" , vpsubusb(xmm1, xmm2, xmm3));
+ TEST_INSTRUCTION("C5E9D88C2B80000000" , vpsubusb(xmm1, xmm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C5E9D88C2B80000000" , vpsubusb(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C5EDD8CB" , vpsubusb(ymm1, ymm2, ymm3));
+ TEST_INSTRUCTION("C5EDD88C2B80000000" , vpsubusb(ymm1, ymm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C5EDD88C2B80000000" , vpsubusb(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F16D48D8CB" , vpsubusb(zmm1, zmm2, zmm3));
+ TEST_INSTRUCTION("62F16D48D84C2B02" , vpsubusb(zmm1, zmm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F16D48D84C2B02" , vpsubusb(zmm1, zmm2, zmmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C5E9D9CB" , vpsubusw(xmm1, xmm2, xmm3));
+ TEST_INSTRUCTION("C5E9D98C2B80000000" , vpsubusw(xmm1, xmm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C5E9D98C2B80000000" , vpsubusw(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C5EDD9CB" , vpsubusw(ymm1, ymm2, ymm3));
+ TEST_INSTRUCTION("C5EDD98C2B80000000" , vpsubusw(ymm1, ymm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C5EDD98C2B80000000" , vpsubusw(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F16D48D9CB" , vpsubusw(zmm1, zmm2, zmm3));
+ TEST_INSTRUCTION("62F16D48D94C2B02" , vpsubusw(zmm1, zmm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F16D48D94C2B02" , vpsubusw(zmm1, zmm2, zmmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C5E9F9CB" , vpsubw(xmm1, xmm2, xmm3));
+ TEST_INSTRUCTION("C5E9F98C2B80000000" , vpsubw(xmm1, xmm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C5E9F98C2B80000000" , vpsubw(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C5EDF9CB" , vpsubw(ymm1, ymm2, ymm3));
+ TEST_INSTRUCTION("C5EDF98C2B80000000" , vpsubw(ymm1, ymm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C5EDF98C2B80000000" , vpsubw(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F16D48F9CB" , vpsubw(zmm1, zmm2, zmm3));
+ TEST_INSTRUCTION("62F16D48F94C2B02" , vpsubw(zmm1, zmm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F16D48F94C2B02" , vpsubw(zmm1, zmm2, zmmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F36D0825CB01" , vpternlogd(xmm1, xmm2, xmm3, 1));
+ TEST_INSTRUCTION("62F36D08254C2B0801" , vpternlogd(xmm1, xmm2, ptr(ebx, ebp, 0, 128), 1));
+ TEST_INSTRUCTION("62F36D08254C2B0801" , vpternlogd(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128), 1));
+ TEST_INSTRUCTION("62F36D2825CB01" , vpternlogd(ymm1, ymm2, ymm3, 1));
+ TEST_INSTRUCTION("62F36D28254C2B0401" , vpternlogd(ymm1, ymm2, ptr(ebx, ebp, 0, 128), 1));
+ TEST_INSTRUCTION("62F36D28254C2B0401" , vpternlogd(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128), 1));
+ TEST_INSTRUCTION("62F36D4825CB01" , vpternlogd(zmm1, zmm2, zmm3, 1));
+ TEST_INSTRUCTION("62F36D48254C2B0201" , vpternlogd(zmm1, zmm2, ptr(ebx, ebp, 0, 128), 1));
+ TEST_INSTRUCTION("62F36D48254C2B0201" , vpternlogd(zmm1, zmm2, zmmword_ptr(ebx, ebp, 0, 128), 1));
+ TEST_INSTRUCTION("62F3ED0825CB01" , vpternlogq(xmm1, xmm2, xmm3, 1));
+ TEST_INSTRUCTION("62F3ED08254C2B0801" , vpternlogq(xmm1, xmm2, ptr(ebx, ebp, 0, 128), 1));
+ TEST_INSTRUCTION("62F3ED08254C2B0801" , vpternlogq(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128), 1));
+ TEST_INSTRUCTION("62F3ED2825CB01" , vpternlogq(ymm1, ymm2, ymm3, 1));
+ TEST_INSTRUCTION("62F3ED28254C2B0401" , vpternlogq(ymm1, ymm2, ptr(ebx, ebp, 0, 128), 1));
+ TEST_INSTRUCTION("62F3ED28254C2B0401" , vpternlogq(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128), 1));
+ TEST_INSTRUCTION("62F3ED4825CB01" , vpternlogq(zmm1, zmm2, zmm3, 1));
+ TEST_INSTRUCTION("62F3ED48254C2B0201" , vpternlogq(zmm1, zmm2, ptr(ebx, ebp, 0, 128), 1));
+ TEST_INSTRUCTION("62F3ED48254C2B0201" , vpternlogq(zmm1, zmm2, zmmword_ptr(ebx, ebp, 0, 128), 1));
+ TEST_INSTRUCTION("C4E27917CA" , vptest(xmm1, xmm2));
+ TEST_INSTRUCTION("C4E279178C1A80000000" , vptest(xmm1, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("C4E279178C1A80000000" , vptest(xmm1, xmmword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("C4E27D17CA" , vptest(ymm1, ymm2));
+ TEST_INSTRUCTION("C4E27D178C1A80000000" , vptest(ymm1, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("C4E27D178C1A80000000" , vptest(ymm1, ymmword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("62F26D0826CB" , vptestmb(k1, xmm2, xmm3));
+ TEST_INSTRUCTION("62F26D08264C2B08" , vptestmb(k1, xmm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F26D08264C2B08" , vptestmb(k1, xmm2, xmmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F26D2826CB" , vptestmb(k1, ymm2, ymm3));
+ TEST_INSTRUCTION("62F26D28264C2B04" , vptestmb(k1, ymm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F26D28264C2B04" , vptestmb(k1, ymm2, ymmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F26D4826CB" , vptestmb(k1, zmm2, zmm3));
+ TEST_INSTRUCTION("62F26D48264C2B02" , vptestmb(k1, zmm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F26D48264C2B02" , vptestmb(k1, zmm2, zmmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F26D0827CB" , vptestmd(k1, xmm2, xmm3));
+ TEST_INSTRUCTION("62F26D08274C2B08" , vptestmd(k1, xmm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F26D08274C2B08" , vptestmd(k1, xmm2, xmmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F26D2827CB" , vptestmd(k1, ymm2, ymm3));
+ TEST_INSTRUCTION("62F26D28274C2B04" , vptestmd(k1, ymm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F26D28274C2B04" , vptestmd(k1, ymm2, ymmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F26D4827CB" , vptestmd(k1, zmm2, zmm3));
+ TEST_INSTRUCTION("62F26D48274C2B02" , vptestmd(k1, zmm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F26D48274C2B02" , vptestmd(k1, zmm2, zmmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F2ED0827CB" , vptestmq(k1, xmm2, xmm3));
+ TEST_INSTRUCTION("62F2ED08274C2B08" , vptestmq(k1, xmm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F2ED08274C2B08" , vptestmq(k1, xmm2, xmmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F2ED2827CB" , vptestmq(k1, ymm2, ymm3));
+ TEST_INSTRUCTION("62F2ED28274C2B04" , vptestmq(k1, ymm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F2ED28274C2B04" , vptestmq(k1, ymm2, ymmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F2ED4827CB" , vptestmq(k1, zmm2, zmm3));
+ TEST_INSTRUCTION("62F2ED48274C2B02" , vptestmq(k1, zmm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F2ED48274C2B02" , vptestmq(k1, zmm2, zmmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F2ED0826CB" , vptestmw(k1, xmm2, xmm3));
+ TEST_INSTRUCTION("62F2ED08264C2B08" , vptestmw(k1, xmm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F2ED08264C2B08" , vptestmw(k1, xmm2, xmmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F2ED2826CB" , vptestmw(k1, ymm2, ymm3));
+ TEST_INSTRUCTION("62F2ED28264C2B04" , vptestmw(k1, ymm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F2ED28264C2B04" , vptestmw(k1, ymm2, ymmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F2ED4826CB" , vptestmw(k1, zmm2, zmm3));
+ TEST_INSTRUCTION("62F2ED48264C2B02" , vptestmw(k1, zmm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F2ED48264C2B02" , vptestmw(k1, zmm2, zmmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F26E0826CB" , vptestnmb(k1, xmm2, xmm3));
+ TEST_INSTRUCTION("62F26E08264C2B08" , vptestnmb(k1, xmm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F26E08264C2B08" , vptestnmb(k1, xmm2, xmmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F26E2826CB" , vptestnmb(k1, ymm2, ymm3));
+ TEST_INSTRUCTION("62F26E28264C2B04" , vptestnmb(k1, ymm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F26E28264C2B04" , vptestnmb(k1, ymm2, ymmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F26E4826CB" , vptestnmb(k1, zmm2, zmm3));
+ TEST_INSTRUCTION("62F26E48264C2B02" , vptestnmb(k1, zmm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F26E48264C2B02" , vptestnmb(k1, zmm2, zmmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F26E0827CB" , vptestnmd(k1, xmm2, xmm3));
+ TEST_INSTRUCTION("62F26E08274C2B08" , vptestnmd(k1, xmm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F26E08274C2B08" , vptestnmd(k1, xmm2, xmmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F26E2827CB" , vptestnmd(k1, ymm2, ymm3));
+ TEST_INSTRUCTION("62F26E28274C2B04" , vptestnmd(k1, ymm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F26E28274C2B04" , vptestnmd(k1, ymm2, ymmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F26E4827CB" , vptestnmd(k1, zmm2, zmm3));
+ TEST_INSTRUCTION("62F26E48274C2B02" , vptestnmd(k1, zmm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F26E48274C2B02" , vptestnmd(k1, zmm2, zmmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F2EE0827CB" , vptestnmq(k1, xmm2, xmm3));
+ TEST_INSTRUCTION("62F2EE08274C2B08" , vptestnmq(k1, xmm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F2EE08274C2B08" , vptestnmq(k1, xmm2, xmmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F2EE2827CB" , vptestnmq(k1, ymm2, ymm3));
+ TEST_INSTRUCTION("62F2EE28274C2B04" , vptestnmq(k1, ymm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F2EE28274C2B04" , vptestnmq(k1, ymm2, ymmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F2EE4827CB" , vptestnmq(k1, zmm2, zmm3));
+ TEST_INSTRUCTION("62F2EE48274C2B02" , vptestnmq(k1, zmm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F2EE48274C2B02" , vptestnmq(k1, zmm2, zmmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F2EE0826CB" , vptestnmw(k1, xmm2, xmm3));
+ TEST_INSTRUCTION("62F2EE08264C2B08" , vptestnmw(k1, xmm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F2EE08264C2B08" , vptestnmw(k1, xmm2, xmmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F2EE2826CB" , vptestnmw(k1, ymm2, ymm3));
+ TEST_INSTRUCTION("62F2EE28264C2B04" , vptestnmw(k1, ymm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F2EE28264C2B04" , vptestnmw(k1, ymm2, ymmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F2EE4826CB" , vptestnmw(k1, zmm2, zmm3));
+ TEST_INSTRUCTION("62F2EE48264C2B02" , vptestnmw(k1, zmm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F2EE48264C2B02" , vptestnmw(k1, zmm2, zmmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C5E968CB" , vpunpckhbw(xmm1, xmm2, xmm3));
+ TEST_INSTRUCTION("C5E9688C2B80000000" , vpunpckhbw(xmm1, xmm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C5E9688C2B80000000" , vpunpckhbw(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C5ED68CB" , vpunpckhbw(ymm1, ymm2, ymm3));
+ TEST_INSTRUCTION("C5ED688C2B80000000" , vpunpckhbw(ymm1, ymm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C5ED688C2B80000000" , vpunpckhbw(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F16D4868CB" , vpunpckhbw(zmm1, zmm2, zmm3));
+ TEST_INSTRUCTION("62F16D48684C2B02" , vpunpckhbw(zmm1, zmm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F16D48684C2B02" , vpunpckhbw(zmm1, zmm2, zmmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C5E96ACB" , vpunpckhdq(xmm1, xmm2, xmm3));
+ TEST_INSTRUCTION("C5E96A8C2B80000000" , vpunpckhdq(xmm1, xmm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C5E96A8C2B80000000" , vpunpckhdq(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C5ED6ACB" , vpunpckhdq(ymm1, ymm2, ymm3));
+ TEST_INSTRUCTION("C5ED6A8C2B80000000" , vpunpckhdq(ymm1, ymm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C5ED6A8C2B80000000" , vpunpckhdq(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F16D486ACB" , vpunpckhdq(zmm1, zmm2, zmm3));
+ TEST_INSTRUCTION("62F16D486A4C2B02" , vpunpckhdq(zmm1, zmm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F16D486A4C2B02" , vpunpckhdq(zmm1, zmm2, zmmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C5E96DCB" , vpunpckhqdq(xmm1, xmm2, xmm3));
+ TEST_INSTRUCTION("C5E96D8C2B80000000" , vpunpckhqdq(xmm1, xmm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C5E96D8C2B80000000" , vpunpckhqdq(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C5ED6DCB" , vpunpckhqdq(ymm1, ymm2, ymm3));
+ TEST_INSTRUCTION("C5ED6D8C2B80000000" , vpunpckhqdq(ymm1, ymm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C5ED6D8C2B80000000" , vpunpckhqdq(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F1ED486DCB" , vpunpckhqdq(zmm1, zmm2, zmm3));
+ TEST_INSTRUCTION("62F1ED486D4C2B02" , vpunpckhqdq(zmm1, zmm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F1ED486D4C2B02" , vpunpckhqdq(zmm1, zmm2, zmmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C5E969CB" , vpunpckhwd(xmm1, xmm2, xmm3));
+ TEST_INSTRUCTION("C5E9698C2B80000000" , vpunpckhwd(xmm1, xmm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C5E9698C2B80000000" , vpunpckhwd(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C5ED69CB" , vpunpckhwd(ymm1, ymm2, ymm3));
+ TEST_INSTRUCTION("C5ED698C2B80000000" , vpunpckhwd(ymm1, ymm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C5ED698C2B80000000" , vpunpckhwd(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F16D4869CB" , vpunpckhwd(zmm1, zmm2, zmm3));
+ TEST_INSTRUCTION("62F16D48694C2B02" , vpunpckhwd(zmm1, zmm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F16D48694C2B02" , vpunpckhwd(zmm1, zmm2, zmmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C5E960CB" , vpunpcklbw(xmm1, xmm2, xmm3));
+ TEST_INSTRUCTION("C5E9608C2B80000000" , vpunpcklbw(xmm1, xmm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C5E9608C2B80000000" , vpunpcklbw(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C5ED60CB" , vpunpcklbw(ymm1, ymm2, ymm3));
+ TEST_INSTRUCTION("C5ED608C2B80000000" , vpunpcklbw(ymm1, ymm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C5ED608C2B80000000" , vpunpcklbw(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F16D4860CB" , vpunpcklbw(zmm1, zmm2, zmm3));
+ TEST_INSTRUCTION("62F16D48604C2B02" , vpunpcklbw(zmm1, zmm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F16D48604C2B02" , vpunpcklbw(zmm1, zmm2, zmmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C5E962CB" , vpunpckldq(xmm1, xmm2, xmm3));
+ TEST_INSTRUCTION("C5E9628C2B80000000" , vpunpckldq(xmm1, xmm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C5E9628C2B80000000" , vpunpckldq(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C5ED62CB" , vpunpckldq(ymm1, ymm2, ymm3));
+ TEST_INSTRUCTION("C5ED628C2B80000000" , vpunpckldq(ymm1, ymm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C5ED628C2B80000000" , vpunpckldq(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F16D4862CB" , vpunpckldq(zmm1, zmm2, zmm3));
+ TEST_INSTRUCTION("62F16D48624C2B02" , vpunpckldq(zmm1, zmm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F16D48624C2B02" , vpunpckldq(zmm1, zmm2, zmmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C5E96CCB" , vpunpcklqdq(xmm1, xmm2, xmm3));
+ TEST_INSTRUCTION("C5E96C8C2B80000000" , vpunpcklqdq(xmm1, xmm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C5E96C8C2B80000000" , vpunpcklqdq(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C5ED6CCB" , vpunpcklqdq(ymm1, ymm2, ymm3));
+ TEST_INSTRUCTION("C5ED6C8C2B80000000" , vpunpcklqdq(ymm1, ymm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C5ED6C8C2B80000000" , vpunpcklqdq(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F1ED486CCB" , vpunpcklqdq(zmm1, zmm2, zmm3));
+ TEST_INSTRUCTION("62F1ED486C4C2B02" , vpunpcklqdq(zmm1, zmm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F1ED486C4C2B02" , vpunpcklqdq(zmm1, zmm2, zmmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C5E961CB" , vpunpcklwd(xmm1, xmm2, xmm3));
+ TEST_INSTRUCTION("C5E9618C2B80000000" , vpunpcklwd(xmm1, xmm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C5E9618C2B80000000" , vpunpcklwd(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C5ED61CB" , vpunpcklwd(ymm1, ymm2, ymm3));
+ TEST_INSTRUCTION("C5ED618C2B80000000" , vpunpcklwd(ymm1, ymm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C5ED618C2B80000000" , vpunpcklwd(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F16D4861CB" , vpunpcklwd(zmm1, zmm2, zmm3));
+ TEST_INSTRUCTION("62F16D48614C2B02" , vpunpcklwd(zmm1, zmm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F16D48614C2B02" , vpunpcklwd(zmm1, zmm2, zmmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C5E9EFCB" , vpxor(xmm1, xmm2, xmm3));
+ TEST_INSTRUCTION("C5E9EF8C2B80000000" , vpxor(xmm1, xmm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C5E9EF8C2B80000000" , vpxor(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C5EDEFCB" , vpxor(ymm1, ymm2, ymm3));
+ TEST_INSTRUCTION("C5EDEF8C2B80000000" , vpxor(ymm1, ymm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C5EDEF8C2B80000000" , vpxor(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F16D08EFCB" , vpxord(xmm1, xmm2, xmm3));
+ TEST_INSTRUCTION("62F16D08EF4C2B08" , vpxord(xmm1, xmm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F16D08EF4C2B08" , vpxord(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F16D28EFCB" , vpxord(ymm1, ymm2, ymm3));
+ TEST_INSTRUCTION("62F16D28EF4C2B04" , vpxord(ymm1, ymm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F16D28EF4C2B04" , vpxord(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F16D48EFCB" , vpxord(zmm1, zmm2, zmm3));
+ TEST_INSTRUCTION("62F16D48EF4C2B02" , vpxord(zmm1, zmm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F16D48EF4C2B02" , vpxord(zmm1, zmm2, zmmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F1ED08EFCB" , vpxorq(xmm1, xmm2, xmm3));
+ TEST_INSTRUCTION("62F1ED08EF4C2B08" , vpxorq(xmm1, xmm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F1ED08EF4C2B08" , vpxorq(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F1ED28EFCB" , vpxorq(ymm1, ymm2, ymm3));
+ TEST_INSTRUCTION("62F1ED28EF4C2B04" , vpxorq(ymm1, ymm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F1ED28EF4C2B04" , vpxorq(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F1ED48EFCB" , vpxorq(zmm1, zmm2, zmm3));
+ TEST_INSTRUCTION("62F1ED48EF4C2B02" , vpxorq(zmm1, zmm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F1ED48EF4C2B02" , vpxorq(zmm1, zmm2, zmmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F3ED0850CB01" , vrangepd(xmm1, xmm2, xmm3, 1));
+ TEST_INSTRUCTION("62F3ED08504C2B0801" , vrangepd(xmm1, xmm2, ptr(ebx, ebp, 0, 128), 1));
+ TEST_INSTRUCTION("62F3ED08504C2B0801" , vrangepd(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128), 1));
+ TEST_INSTRUCTION("62F3ED2850CB01" , vrangepd(ymm1, ymm2, ymm3, 1));
+ TEST_INSTRUCTION("62F3ED28504C2B0401" , vrangepd(ymm1, ymm2, ptr(ebx, ebp, 0, 128), 1));
+ TEST_INSTRUCTION("62F3ED28504C2B0401" , vrangepd(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128), 1));
+ TEST_INSTRUCTION("62F3ED4850CB01" , vrangepd(zmm1, zmm2, zmm3, 1));
+ TEST_INSTRUCTION("62F3ED48504C2B0201" , vrangepd(zmm1, zmm2, ptr(ebx, ebp, 0, 128), 1));
+ TEST_INSTRUCTION("62F3ED48504C2B0201" , vrangepd(zmm1, zmm2, zmmword_ptr(ebx, ebp, 0, 128), 1));
+ TEST_INSTRUCTION("62F36D0850CB01" , vrangeps(xmm1, xmm2, xmm3, 1));
+ TEST_INSTRUCTION("62F36D08504C2B0801" , vrangeps(xmm1, xmm2, ptr(ebx, ebp, 0, 128), 1));
+ TEST_INSTRUCTION("62F36D08504C2B0801" , vrangeps(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128), 1));
+ TEST_INSTRUCTION("62F36D2850CB01" , vrangeps(ymm1, ymm2, ymm3, 1));
+ TEST_INSTRUCTION("62F36D28504C2B0401" , vrangeps(ymm1, ymm2, ptr(ebx, ebp, 0, 128), 1));
+ TEST_INSTRUCTION("62F36D28504C2B0401" , vrangeps(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128), 1));
+ TEST_INSTRUCTION("62F36D4850CB01" , vrangeps(zmm1, zmm2, zmm3, 1));
+ TEST_INSTRUCTION("62F36D48504C2B0201" , vrangeps(zmm1, zmm2, ptr(ebx, ebp, 0, 128), 1));
+ TEST_INSTRUCTION("62F36D48504C2B0201" , vrangeps(zmm1, zmm2, zmmword_ptr(ebx, ebp, 0, 128), 1));
+ TEST_INSTRUCTION("62F3ED0851CB01" , vrangesd(xmm1, xmm2, xmm3, 1));
+ TEST_INSTRUCTION("62F3ED08514C2B1001" , vrangesd(xmm1, xmm2, ptr(ebx, ebp, 0, 128), 1));
+ TEST_INSTRUCTION("62F3ED08514C2B1001" , vrangesd(xmm1, xmm2, qword_ptr(ebx, ebp, 0, 128), 1));
+ TEST_INSTRUCTION("62F36D0851CB01" , vrangess(xmm1, xmm2, xmm3, 1));
+ TEST_INSTRUCTION("62F36D08514C2B2001" , vrangess(xmm1, xmm2, ptr(ebx, ebp, 0, 128), 1));
+ TEST_INSTRUCTION("62F36D08514C2B2001" , vrangess(xmm1, xmm2, dword_ptr(ebx, ebp, 0, 128), 1));
+ TEST_INSTRUCTION("62F2FD084CCA" , vrcp14pd(xmm1, xmm2));
+ TEST_INSTRUCTION("62F2FD084C4C1A08" , vrcp14pd(xmm1, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("62F2FD084C4C1A08" , vrcp14pd(xmm1, xmmword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("62F2FD284CCA" , vrcp14pd(ymm1, ymm2));
+ TEST_INSTRUCTION("62F2FD284C4C1A04" , vrcp14pd(ymm1, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("62F2FD284C4C1A04" , vrcp14pd(ymm1, ymmword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("62F2FD484CCA" , vrcp14pd(zmm1, zmm2));
+ TEST_INSTRUCTION("62F2FD484C4C1A02" , vrcp14pd(zmm1, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("62F2FD484C4C1A02" , vrcp14pd(zmm1, zmmword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("62F27D084CCA" , vrcp14ps(xmm1, xmm2));
+ TEST_INSTRUCTION("62F27D084C4C1A08" , vrcp14ps(xmm1, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("62F27D084C4C1A08" , vrcp14ps(xmm1, xmmword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("62F27D284CCA" , vrcp14ps(ymm1, ymm2));
+ TEST_INSTRUCTION("62F27D284C4C1A04" , vrcp14ps(ymm1, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("62F27D284C4C1A04" , vrcp14ps(ymm1, ymmword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("62F27D484CCA" , vrcp14ps(zmm1, zmm2));
+ TEST_INSTRUCTION("62F27D484C4C1A02" , vrcp14ps(zmm1, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("62F27D484C4C1A02" , vrcp14ps(zmm1, zmmword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("62F2ED084DCB" , vrcp14sd(xmm1, xmm2, xmm3));
+ TEST_INSTRUCTION("62F2ED084D4C2B10" , vrcp14sd(xmm1, xmm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F2ED084D4C2B10" , vrcp14sd(xmm1, xmm2, qword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F26D084DCB" , vrcp14ss(xmm1, xmm2, xmm3));
+ TEST_INSTRUCTION("62F26D084D4C2B20" , vrcp14ss(xmm1, xmm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F26D084D4C2B20" , vrcp14ss(xmm1, xmm2, dword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F2FD48CACA" , vrcp28pd(zmm1, zmm2));
+ TEST_INSTRUCTION("62F2FD48CA4C1A02" , vrcp28pd(zmm1, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("62F2FD48CA4C1A02" , vrcp28pd(zmm1, zmmword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("62F27D48CACA" , vrcp28ps(zmm1, zmm2));
+ TEST_INSTRUCTION("62F27D48CA4C1A02" , vrcp28ps(zmm1, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("62F27D48CA4C1A02" , vrcp28ps(zmm1, zmmword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("62F2ED08CBCB" , vrcp28sd(xmm1, xmm2, xmm3));
+ TEST_INSTRUCTION("62F2ED08CB4C2B10" , vrcp28sd(xmm1, xmm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F2ED08CB4C2B10" , vrcp28sd(xmm1, xmm2, qword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F26D08CBCB" , vrcp28ss(xmm1, xmm2, xmm3));
+ TEST_INSTRUCTION("62F26D08CB4C2B20" , vrcp28ss(xmm1, xmm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F26D08CB4C2B20" , vrcp28ss(xmm1, xmm2, dword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C5F853CA" , vrcpps(xmm1, xmm2));
+ TEST_INSTRUCTION("C5F8538C1A80000000" , vrcpps(xmm1, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("C5F8538C1A80000000" , vrcpps(xmm1, xmmword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("C5FC53CA" , vrcpps(ymm1, ymm2));
+ TEST_INSTRUCTION("C5FC538C1A80000000" , vrcpps(ymm1, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("C5FC538C1A80000000" , vrcpps(ymm1, ymmword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("C5EA53CB" , vrcpss(xmm1, xmm2, xmm3));
+ TEST_INSTRUCTION("C5EA538C2B80000000" , vrcpss(xmm1, xmm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C5EA538C2B80000000" , vrcpss(xmm1, xmm2, dword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F3FD0856CA01" , vreducepd(xmm1, xmm2, 1));
+ TEST_INSTRUCTION("62F3FD08564C1A0801" , vreducepd(xmm1, ptr(edx, ebx, 0, 128), 1));
+ TEST_INSTRUCTION("62F3FD08564C1A0801" , vreducepd(xmm1, xmmword_ptr(edx, ebx, 0, 128), 1));
+ TEST_INSTRUCTION("62F3FD2856CA01" , vreducepd(ymm1, ymm2, 1));
+ TEST_INSTRUCTION("62F3FD28564C1A0401" , vreducepd(ymm1, ptr(edx, ebx, 0, 128), 1));
+ TEST_INSTRUCTION("62F3FD28564C1A0401" , vreducepd(ymm1, ymmword_ptr(edx, ebx, 0, 128), 1));
+ TEST_INSTRUCTION("62F3FD4856CA01" , vreducepd(zmm1, zmm2, 1));
+ TEST_INSTRUCTION("62F3FD48564C1A0201" , vreducepd(zmm1, ptr(edx, ebx, 0, 128), 1));
+ TEST_INSTRUCTION("62F3FD48564C1A0201" , vreducepd(zmm1, zmmword_ptr(edx, ebx, 0, 128), 1));
+ TEST_INSTRUCTION("62F37D0856CA01" , vreduceps(xmm1, xmm2, 1));
+ TEST_INSTRUCTION("62F37D08564C1A0801" , vreduceps(xmm1, ptr(edx, ebx, 0, 128), 1));
+ TEST_INSTRUCTION("62F37D08564C1A0801" , vreduceps(xmm1, xmmword_ptr(edx, ebx, 0, 128), 1));
+ TEST_INSTRUCTION("62F37D2856CA01" , vreduceps(ymm1, ymm2, 1));
+ TEST_INSTRUCTION("62F37D28564C1A0401" , vreduceps(ymm1, ptr(edx, ebx, 0, 128), 1));
+ TEST_INSTRUCTION("62F37D28564C1A0401" , vreduceps(ymm1, ymmword_ptr(edx, ebx, 0, 128), 1));
+ TEST_INSTRUCTION("62F37D4856CA01" , vreduceps(zmm1, zmm2, 1));
+ TEST_INSTRUCTION("62F37D48564C1A0201" , vreduceps(zmm1, ptr(edx, ebx, 0, 128), 1));
+ TEST_INSTRUCTION("62F37D48564C1A0201" , vreduceps(zmm1, zmmword_ptr(edx, ebx, 0, 128), 1));
+ TEST_INSTRUCTION("62F3ED0857CB01" , vreducesd(xmm1, xmm2, xmm3, 1));
+ TEST_INSTRUCTION("62F3ED08574C2B1001" , vreducesd(xmm1, xmm2, ptr(ebx, ebp, 0, 128), 1));
+ TEST_INSTRUCTION("62F3ED08574C2B1001" , vreducesd(xmm1, xmm2, qword_ptr(ebx, ebp, 0, 128), 1));
+ TEST_INSTRUCTION("62F36D0857CB01" , vreducess(xmm1, xmm2, xmm3, 1));
+ TEST_INSTRUCTION("62F36D08574C2B2001" , vreducess(xmm1, xmm2, ptr(ebx, ebp, 0, 128), 1));
+ TEST_INSTRUCTION("62F36D08574C2B2001" , vreducess(xmm1, xmm2, dword_ptr(ebx, ebp, 0, 128), 1));
+ TEST_INSTRUCTION("62F3FD0809CA01" , vrndscalepd(xmm1, xmm2, 1));
+ TEST_INSTRUCTION("62F3FD08094C1A0801" , vrndscalepd(xmm1, ptr(edx, ebx, 0, 128), 1));
+ TEST_INSTRUCTION("62F3FD08094C1A0801" , vrndscalepd(xmm1, xmmword_ptr(edx, ebx, 0, 128), 1));
+ TEST_INSTRUCTION("62F3FD2809CA01" , vrndscalepd(ymm1, ymm2, 1));
+ TEST_INSTRUCTION("62F3FD28094C1A0401" , vrndscalepd(ymm1, ptr(edx, ebx, 0, 128), 1));
+ TEST_INSTRUCTION("62F3FD28094C1A0401" , vrndscalepd(ymm1, ymmword_ptr(edx, ebx, 0, 128), 1));
+ TEST_INSTRUCTION("62F3FD4809CA01" , vrndscalepd(zmm1, zmm2, 1));
+ TEST_INSTRUCTION("62F3FD48094C1A0201" , vrndscalepd(zmm1, ptr(edx, ebx, 0, 128), 1));
+ TEST_INSTRUCTION("62F3FD48094C1A0201" , vrndscalepd(zmm1, zmmword_ptr(edx, ebx, 0, 128), 1));
+ TEST_INSTRUCTION("62F37D0808CA01" , vrndscaleps(xmm1, xmm2, 1));
+ TEST_INSTRUCTION("62F37D08084C1A0801" , vrndscaleps(xmm1, ptr(edx, ebx, 0, 128), 1));
+ TEST_INSTRUCTION("62F37D08084C1A0801" , vrndscaleps(xmm1, xmmword_ptr(edx, ebx, 0, 128), 1));
+ TEST_INSTRUCTION("62F37D2808CA01" , vrndscaleps(ymm1, ymm2, 1));
+ TEST_INSTRUCTION("62F37D28084C1A0401" , vrndscaleps(ymm1, ptr(edx, ebx, 0, 128), 1));
+ TEST_INSTRUCTION("62F37D28084C1A0401" , vrndscaleps(ymm1, ymmword_ptr(edx, ebx, 0, 128), 1));
+ TEST_INSTRUCTION("62F37D4808CA01" , vrndscaleps(zmm1, zmm2, 1));
+ TEST_INSTRUCTION("62F37D48084C1A0201" , vrndscaleps(zmm1, ptr(edx, ebx, 0, 128), 1));
+ TEST_INSTRUCTION("62F37D48084C1A0201" , vrndscaleps(zmm1, zmmword_ptr(edx, ebx, 0, 128), 1));
+ TEST_INSTRUCTION("62F3ED080BCB01" , vrndscalesd(xmm1, xmm2, xmm3, 1));
+ TEST_INSTRUCTION("62F3ED080B4C2B1001" , vrndscalesd(xmm1, xmm2, ptr(ebx, ebp, 0, 128), 1));
+ TEST_INSTRUCTION("62F3ED080B4C2B1001" , vrndscalesd(xmm1, xmm2, qword_ptr(ebx, ebp, 0, 128), 1));
+ TEST_INSTRUCTION("62F36D080ACB01" , vrndscaless(xmm1, xmm2, xmm3, 1));
+ TEST_INSTRUCTION("62F36D080A4C2B2001" , vrndscaless(xmm1, xmm2, ptr(ebx, ebp, 0, 128), 1));
+ TEST_INSTRUCTION("62F36D080A4C2B2001" , vrndscaless(xmm1, xmm2, dword_ptr(ebx, ebp, 0, 128), 1));
+ TEST_INSTRUCTION("C4E37909CA01" , vroundpd(xmm1, xmm2, 1));
+ TEST_INSTRUCTION("C4E379098C1A8000000001" , vroundpd(xmm1, ptr(edx, ebx, 0, 128), 1));
+ TEST_INSTRUCTION("C4E379098C1A8000000001" , vroundpd(xmm1, xmmword_ptr(edx, ebx, 0, 128), 1));
+ TEST_INSTRUCTION("C4E37D09CA01" , vroundpd(ymm1, ymm2, 1));
+ TEST_INSTRUCTION("C4E37D098C1A8000000001" , vroundpd(ymm1, ptr(edx, ebx, 0, 128), 1));
+ TEST_INSTRUCTION("C4E37D098C1A8000000001" , vroundpd(ymm1, ymmword_ptr(edx, ebx, 0, 128), 1));
+ TEST_INSTRUCTION("C4E37908CA01" , vroundps(xmm1, xmm2, 1));
+ TEST_INSTRUCTION("C4E379088C1A8000000001" , vroundps(xmm1, ptr(edx, ebx, 0, 128), 1));
+ TEST_INSTRUCTION("C4E379088C1A8000000001" , vroundps(xmm1, xmmword_ptr(edx, ebx, 0, 128), 1));
+ TEST_INSTRUCTION("C4E37D08CA01" , vroundps(ymm1, ymm2, 1));
+ TEST_INSTRUCTION("C4E37D088C1A8000000001" , vroundps(ymm1, ptr(edx, ebx, 0, 128), 1));
+ TEST_INSTRUCTION("C4E37D088C1A8000000001" , vroundps(ymm1, ymmword_ptr(edx, ebx, 0, 128), 1));
+ TEST_INSTRUCTION("C4E3690BCB01" , vroundsd(xmm1, xmm2, xmm3, 1));
+ TEST_INSTRUCTION("C4E3690B8C2B8000000001" , vroundsd(xmm1, xmm2, ptr(ebx, ebp, 0, 128), 1));
+ TEST_INSTRUCTION("C4E3690B8C2B8000000001" , vroundsd(xmm1, xmm2, qword_ptr(ebx, ebp, 0, 128), 1));
+ TEST_INSTRUCTION("C4E3690ACB01" , vroundss(xmm1, xmm2, xmm3, 1));
+ TEST_INSTRUCTION("C4E3690A8C2B8000000001" , vroundss(xmm1, xmm2, ptr(ebx, ebp, 0, 128), 1));
+ TEST_INSTRUCTION("C4E3690A8C2B8000000001" , vroundss(xmm1, xmm2, dword_ptr(ebx, ebp, 0, 128), 1));
+ TEST_INSTRUCTION("62F2FD084ECA" , vrsqrt14pd(xmm1, xmm2));
+ TEST_INSTRUCTION("62F2FD084E4C1A08" , vrsqrt14pd(xmm1, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("62F2FD084E4C1A08" , vrsqrt14pd(xmm1, xmmword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("62F2FD284ECA" , vrsqrt14pd(ymm1, ymm2));
+ TEST_INSTRUCTION("62F2FD284E4C1A04" , vrsqrt14pd(ymm1, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("62F2FD284E4C1A04" , vrsqrt14pd(ymm1, ymmword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("62F2FD484ECA" , vrsqrt14pd(zmm1, zmm2));
+ TEST_INSTRUCTION("62F2FD484E4C1A02" , vrsqrt14pd(zmm1, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("62F2FD484E4C1A02" , vrsqrt14pd(zmm1, zmmword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("62F27D084ECA" , vrsqrt14ps(xmm1, xmm2));
+ TEST_INSTRUCTION("62F27D084E4C1A08" , vrsqrt14ps(xmm1, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("62F27D084E4C1A08" , vrsqrt14ps(xmm1, xmmword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("62F27D284ECA" , vrsqrt14ps(ymm1, ymm2));
+ TEST_INSTRUCTION("62F27D284E4C1A04" , vrsqrt14ps(ymm1, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("62F27D284E4C1A04" , vrsqrt14ps(ymm1, ymmword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("62F27D484ECA" , vrsqrt14ps(zmm1, zmm2));
+ TEST_INSTRUCTION("62F27D484E4C1A02" , vrsqrt14ps(zmm1, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("62F27D484E4C1A02" , vrsqrt14ps(zmm1, zmmword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("62F2ED084FCB" , vrsqrt14sd(xmm1, xmm2, xmm3));
+ TEST_INSTRUCTION("62F2ED084F4C2B10" , vrsqrt14sd(xmm1, xmm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F2ED084F4C2B10" , vrsqrt14sd(xmm1, xmm2, qword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F26D084FCB" , vrsqrt14ss(xmm1, xmm2, xmm3));
+ TEST_INSTRUCTION("62F26D084F4C2B20" , vrsqrt14ss(xmm1, xmm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F26D084F4C2B20" , vrsqrt14ss(xmm1, xmm2, dword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F2FD48CCCA" , vrsqrt28pd(zmm1, zmm2));
+ TEST_INSTRUCTION("62F2FD48CC4C1A02" , vrsqrt28pd(zmm1, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("62F2FD48CC4C1A02" , vrsqrt28pd(zmm1, zmmword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("62F27D48CCCA" , vrsqrt28ps(zmm1, zmm2));
+ TEST_INSTRUCTION("62F27D48CC4C1A02" , vrsqrt28ps(zmm1, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("62F27D48CC4C1A02" , vrsqrt28ps(zmm1, zmmword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("62F2ED08CDCB" , vrsqrt28sd(xmm1, xmm2, xmm3));
+ TEST_INSTRUCTION("62F2ED08CD4C2B10" , vrsqrt28sd(xmm1, xmm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F2ED08CD4C2B10" , vrsqrt28sd(xmm1, xmm2, qword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F26D08CDCB" , vrsqrt28ss(xmm1, xmm2, xmm3));
+ TEST_INSTRUCTION("62F26D08CD4C2B20" , vrsqrt28ss(xmm1, xmm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F26D08CD4C2B20" , vrsqrt28ss(xmm1, xmm2, dword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C5F852CA" , vrsqrtps(xmm1, xmm2));
+ TEST_INSTRUCTION("C5F8528C1A80000000" , vrsqrtps(xmm1, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("C5F8528C1A80000000" , vrsqrtps(xmm1, xmmword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("C5FC52CA" , vrsqrtps(ymm1, ymm2));
+ TEST_INSTRUCTION("C5FC528C1A80000000" , vrsqrtps(ymm1, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("C5FC528C1A80000000" , vrsqrtps(ymm1, ymmword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("C5EA52CB" , vrsqrtss(xmm1, xmm2, xmm3));
+ TEST_INSTRUCTION("C5EA528C2B80000000" , vrsqrtss(xmm1, xmm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C5EA528C2B80000000" , vrsqrtss(xmm1, xmm2, dword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F2ED082CCB" , vscalefpd(xmm1, xmm2, xmm3));
+ TEST_INSTRUCTION("62F2ED082C4C2B08" , vscalefpd(xmm1, xmm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F2ED082C4C2B08" , vscalefpd(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F2ED282CCB" , vscalefpd(ymm1, ymm2, ymm3));
+ TEST_INSTRUCTION("62F2ED282C4C2B04" , vscalefpd(ymm1, ymm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F2ED282C4C2B04" , vscalefpd(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F2ED482CCB" , vscalefpd(zmm1, zmm2, zmm3));
+ TEST_INSTRUCTION("62F2ED482C4C2B02" , vscalefpd(zmm1, zmm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F2ED482C4C2B02" , vscalefpd(zmm1, zmm2, zmmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F26D082CCB" , vscalefps(xmm1, xmm2, xmm3));
+ TEST_INSTRUCTION("62F26D082C4C2B08" , vscalefps(xmm1, xmm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F26D082C4C2B08" , vscalefps(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F26D282CCB" , vscalefps(ymm1, ymm2, ymm3));
+ TEST_INSTRUCTION("62F26D282C4C2B04" , vscalefps(ymm1, ymm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F26D282C4C2B04" , vscalefps(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F26D482CCB" , vscalefps(zmm1, zmm2, zmm3));
+ TEST_INSTRUCTION("62F26D482C4C2B02" , vscalefps(zmm1, zmm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F26D482C4C2B02" , vscalefps(zmm1, zmm2, zmmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F2ED082DCB" , vscalefsd(xmm1, xmm2, xmm3));
+ TEST_INSTRUCTION("62F2ED082D4C2B10" , vscalefsd(xmm1, xmm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F2ED082D4C2B10" , vscalefsd(xmm1, xmm2, qword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F26D082DCB" , vscalefss(xmm1, xmm2, xmm3));
+ TEST_INSTRUCTION("62F26D082D4C2B20" , vscalefss(xmm1, xmm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F26D082D4C2B20" , vscalefss(xmm1, xmm2, dword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F2FD09A25C1110" , k(k1).vscatterdpd(ptr(ecx, xmm2, 0, 128), xmm3));
+ TEST_INSTRUCTION("62F2FD29A25C1110" , k(k1).vscatterdpd(ptr(ecx, xmm2, 0, 128), ymm3));
+ TEST_INSTRUCTION("62F2FD49A25C1110" , k(k1).vscatterdpd(ptr(ecx, ymm2, 0, 128), zmm3));
+ TEST_INSTRUCTION("62F27D09A25C1120" , k(k1).vscatterdps(ptr(ecx, xmm2, 0, 128), xmm3));
+ TEST_INSTRUCTION("62F27D29A25C1120" , k(k1).vscatterdps(ptr(ecx, ymm2, 0, 128), ymm3));
+ TEST_INSTRUCTION("62F27D49A25C1120" , k(k1).vscatterdps(ptr(ecx, zmm2, 0, 128), zmm3));
+ TEST_INSTRUCTION("62F2FD49C66C1110" , k(k1).vscatterpf0dpd(ptr(ecx, ymm2, 0, 128)));
+ TEST_INSTRUCTION("62F27D49C66C1120" , k(k1).vscatterpf0dps(ptr(ecx, zmm2, 0, 128)));
+ TEST_INSTRUCTION("62F2FD49C76C1110" , k(k1).vscatterpf0qpd(ptr(ecx, zmm2, 0, 128)));
+ TEST_INSTRUCTION("62F27D49C76C1120" , k(k1).vscatterpf0qps(ptr(ecx, zmm2, 0, 128)));
+ TEST_INSTRUCTION("62F2FD49C6741110" , k(k1).vscatterpf1dpd(ptr(ecx, ymm2, 0, 128)));
+ TEST_INSTRUCTION("62F27D49C6741120" , k(k1).vscatterpf1dps(ptr(ecx, zmm2, 0, 128)));
+ TEST_INSTRUCTION("62F2FD49C7741110" , k(k1).vscatterpf1qpd(ptr(ecx, zmm2, 0, 128)));
+ TEST_INSTRUCTION("62F27D49C7741120" , k(k1).vscatterpf1qps(ptr(ecx, zmm2, 0, 128)));
+ TEST_INSTRUCTION("62F2FD09A35C1110" , k(k1).vscatterqpd(ptr(ecx, xmm2, 0, 128), xmm3));
+ TEST_INSTRUCTION("62F2FD29A35C1110" , k(k1).vscatterqpd(ptr(ecx, ymm2, 0, 128), ymm3));
+ TEST_INSTRUCTION("62F2FD49A35C1110" , k(k1).vscatterqpd(ptr(ecx, zmm2, 0, 128), zmm3));
+ TEST_INSTRUCTION("62F27D09A35C1120" , k(k1).vscatterqps(ptr(ecx, xmm2, 0, 128), xmm3));
+ TEST_INSTRUCTION("62F27D29A35C1120" , k(k1).vscatterqps(ptr(ecx, ymm2, 0, 128), xmm3));
+ TEST_INSTRUCTION("62F27D49A35C1120" , k(k1).vscatterqps(ptr(ecx, zmm2, 0, 128), ymm3));
+ TEST_INSTRUCTION("62F36D2823CB01" , vshuff32x4(ymm1, ymm2, ymm3, 1));
+ TEST_INSTRUCTION("62F36D28234C2B0401" , vshuff32x4(ymm1, ymm2, ptr(ebx, ebp, 0, 128), 1));
+ TEST_INSTRUCTION("62F36D28234C2B0401" , vshuff32x4(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128), 1));
+ TEST_INSTRUCTION("62F36D4823CB01" , vshuff32x4(zmm1, zmm2, zmm3, 1));
+ TEST_INSTRUCTION("62F36D48234C2B0201" , vshuff32x4(zmm1, zmm2, ptr(ebx, ebp, 0, 128), 1));
+ TEST_INSTRUCTION("62F36D48234C2B0201" , vshuff32x4(zmm1, zmm2, zmmword_ptr(ebx, ebp, 0, 128), 1));
+ TEST_INSTRUCTION("62F3ED2823CB01" , vshuff64x2(ymm1, ymm2, ymm3, 1));
+ TEST_INSTRUCTION("62F3ED28234C2B0401" , vshuff64x2(ymm1, ymm2, ptr(ebx, ebp, 0, 128), 1));
+ TEST_INSTRUCTION("62F3ED28234C2B0401" , vshuff64x2(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128), 1));
+ TEST_INSTRUCTION("62F3ED4823CB01" , vshuff64x2(zmm1, zmm2, zmm3, 1));
+ TEST_INSTRUCTION("62F3ED48234C2B0201" , vshuff64x2(zmm1, zmm2, ptr(ebx, ebp, 0, 128), 1));
+ TEST_INSTRUCTION("62F3ED48234C2B0201" , vshuff64x2(zmm1, zmm2, zmmword_ptr(ebx, ebp, 0, 128), 1));
+ TEST_INSTRUCTION("62F36D2843CB01" , vshufi32x4(ymm1, ymm2, ymm3, 1));
+ TEST_INSTRUCTION("62F36D28434C2B0401" , vshufi32x4(ymm1, ymm2, ptr(ebx, ebp, 0, 128), 1));
+ TEST_INSTRUCTION("62F36D28434C2B0401" , vshufi32x4(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128), 1));
+ TEST_INSTRUCTION("62F36D4843CB01" , vshufi32x4(zmm1, zmm2, zmm3, 1));
+ TEST_INSTRUCTION("62F36D48434C2B0201" , vshufi32x4(zmm1, zmm2, ptr(ebx, ebp, 0, 128), 1));
+ TEST_INSTRUCTION("62F36D48434C2B0201" , vshufi32x4(zmm1, zmm2, zmmword_ptr(ebx, ebp, 0, 128), 1));
+ TEST_INSTRUCTION("62F3ED2843CB01" , vshufi64x2(ymm1, ymm2, ymm3, 1));
+ TEST_INSTRUCTION("62F3ED28434C2B0401" , vshufi64x2(ymm1, ymm2, ptr(ebx, ebp, 0, 128), 1));
+ TEST_INSTRUCTION("62F3ED28434C2B0401" , vshufi64x2(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128), 1));
+ TEST_INSTRUCTION("62F3ED4843CB01" , vshufi64x2(zmm1, zmm2, zmm3, 1));
+ TEST_INSTRUCTION("62F3ED48434C2B0201" , vshufi64x2(zmm1, zmm2, ptr(ebx, ebp, 0, 128), 1));
+ TEST_INSTRUCTION("62F3ED48434C2B0201" , vshufi64x2(zmm1, zmm2, zmmword_ptr(ebx, ebp, 0, 128), 1));
+ TEST_INSTRUCTION("C5E9C6CB01" , vshufpd(xmm1, xmm2, xmm3, 1));
+ TEST_INSTRUCTION("C5E9C68C2B8000000001" , vshufpd(xmm1, xmm2, ptr(ebx, ebp, 0, 128), 1));
+ TEST_INSTRUCTION("C5E9C68C2B8000000001" , vshufpd(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128), 1));
+ TEST_INSTRUCTION("C5EDC6CB01" , vshufpd(ymm1, ymm2, ymm3, 1));
+ TEST_INSTRUCTION("C5EDC68C2B8000000001" , vshufpd(ymm1, ymm2, ptr(ebx, ebp, 0, 128), 1));
+ TEST_INSTRUCTION("C5EDC68C2B8000000001" , vshufpd(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128), 1));
+ TEST_INSTRUCTION("62F1ED48C6CB01" , vshufpd(zmm1, zmm2, zmm3, 1));
+ TEST_INSTRUCTION("62F1ED48C64C2B0201" , vshufpd(zmm1, zmm2, ptr(ebx, ebp, 0, 128), 1));
+ TEST_INSTRUCTION("62F1ED48C64C2B0201" , vshufpd(zmm1, zmm2, zmmword_ptr(ebx, ebp, 0, 128), 1));
+ TEST_INSTRUCTION("C5E8C6CB01" , vshufps(xmm1, xmm2, xmm3, 1));
+ TEST_INSTRUCTION("C5E8C68C2B8000000001" , vshufps(xmm1, xmm2, ptr(ebx, ebp, 0, 128), 1));
+ TEST_INSTRUCTION("C5E8C68C2B8000000001" , vshufps(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128), 1));
+ TEST_INSTRUCTION("C5ECC6CB01" , vshufps(ymm1, ymm2, ymm3, 1));
+ TEST_INSTRUCTION("C5ECC68C2B8000000001" , vshufps(ymm1, ymm2, ptr(ebx, ebp, 0, 128), 1));
+ TEST_INSTRUCTION("C5ECC68C2B8000000001" , vshufps(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128), 1));
+ TEST_INSTRUCTION("62F16C48C6CB01" , vshufps(zmm1, zmm2, zmm3, 1));
+ TEST_INSTRUCTION("62F16C48C64C2B0201" , vshufps(zmm1, zmm2, ptr(ebx, ebp, 0, 128), 1));
+ TEST_INSTRUCTION("62F16C48C64C2B0201" , vshufps(zmm1, zmm2, zmmword_ptr(ebx, ebp, 0, 128), 1));
+ TEST_INSTRUCTION("C5F951CA" , vsqrtpd(xmm1, xmm2));
+ TEST_INSTRUCTION("C5F9518C1A80000000" , vsqrtpd(xmm1, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("C5F9518C1A80000000" , vsqrtpd(xmm1, xmmword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("C5FD51CA" , vsqrtpd(ymm1, ymm2));
+ TEST_INSTRUCTION("C5FD518C1A80000000" , vsqrtpd(ymm1, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("C5FD518C1A80000000" , vsqrtpd(ymm1, ymmword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("62F1FD4851CA" , vsqrtpd(zmm1, zmm2));
+ TEST_INSTRUCTION("62F1FD48514C1A02" , vsqrtpd(zmm1, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("62F1FD48514C1A02" , vsqrtpd(zmm1, zmmword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("C5F851CA" , vsqrtps(xmm1, xmm2));
+ TEST_INSTRUCTION("C5F8518C1A80000000" , vsqrtps(xmm1, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("C5F8518C1A80000000" , vsqrtps(xmm1, xmmword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("C5FC51CA" , vsqrtps(ymm1, ymm2));
+ TEST_INSTRUCTION("C5FC518C1A80000000" , vsqrtps(ymm1, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("C5FC518C1A80000000" , vsqrtps(ymm1, ymmword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("62F17C4851CA" , vsqrtps(zmm1, zmm2));
+ TEST_INSTRUCTION("62F17C48514C1A02" , vsqrtps(zmm1, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("62F17C48514C1A02" , vsqrtps(zmm1, zmmword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("C5EB51CB" , vsqrtsd(xmm1, xmm2, xmm3));
+ TEST_INSTRUCTION("C5EB518C2B80000000" , vsqrtsd(xmm1, xmm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C5EB518C2B80000000" , vsqrtsd(xmm1, xmm2, qword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C5EA51CB" , vsqrtss(xmm1, xmm2, xmm3));
+ TEST_INSTRUCTION("C5EA518C2B80000000" , vsqrtss(xmm1, xmm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C5EA518C2B80000000" , vsqrtss(xmm1, xmm2, dword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C5F8AE9C1180000000" , vstmxcsr(ptr(ecx, edx, 0, 128)));
+ TEST_INSTRUCTION("C5F8AE9C1180000000" , vstmxcsr(dword_ptr(ecx, edx, 0, 128)));
+ TEST_INSTRUCTION("C5E95CCB" , vsubpd(xmm1, xmm2, xmm3));
+ TEST_INSTRUCTION("C5E95C8C2B80000000" , vsubpd(xmm1, xmm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C5E95C8C2B80000000" , vsubpd(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C5ED5CCB" , vsubpd(ymm1, ymm2, ymm3));
+ TEST_INSTRUCTION("C5ED5C8C2B80000000" , vsubpd(ymm1, ymm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C5ED5C8C2B80000000" , vsubpd(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F1ED485CCB" , vsubpd(zmm1, zmm2, zmm3));
+ TEST_INSTRUCTION("62F1ED485C4C2B02" , vsubpd(zmm1, zmm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F1ED485C4C2B02" , vsubpd(zmm1, zmm2, zmmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C5E85CCB" , vsubps(xmm1, xmm2, xmm3));
+ TEST_INSTRUCTION("C5E85C8C2B80000000" , vsubps(xmm1, xmm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C5E85C8C2B80000000" , vsubps(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C5EC5CCB" , vsubps(ymm1, ymm2, ymm3));
+ TEST_INSTRUCTION("C5EC5C8C2B80000000" , vsubps(ymm1, ymm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C5EC5C8C2B80000000" , vsubps(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F16C485CCB" , vsubps(zmm1, zmm2, zmm3));
+ TEST_INSTRUCTION("62F16C485C4C2B02" , vsubps(zmm1, zmm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F16C485C4C2B02" , vsubps(zmm1, zmm2, zmmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C5EB5CCB" , vsubsd(xmm1, xmm2, xmm3));
+ TEST_INSTRUCTION("C5EB5C8C2B80000000" , vsubsd(xmm1, xmm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C5EB5C8C2B80000000" , vsubsd(xmm1, xmm2, qword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C5EA5CCB" , vsubss(xmm1, xmm2, xmm3));
+ TEST_INSTRUCTION("C5EA5C8C2B80000000" , vsubss(xmm1, xmm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C5EA5C8C2B80000000" , vsubss(xmm1, xmm2, dword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C4E2790FCA" , vtestpd(xmm1, xmm2));
+ TEST_INSTRUCTION("C4E2790F8C1A80000000" , vtestpd(xmm1, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("C4E2790F8C1A80000000" , vtestpd(xmm1, xmmword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("C4E27D0FCA" , vtestpd(ymm1, ymm2));
+ TEST_INSTRUCTION("C4E27D0F8C1A80000000" , vtestpd(ymm1, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("C4E27D0F8C1A80000000" , vtestpd(ymm1, ymmword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("C4E2790ECA" , vtestps(xmm1, xmm2));
+ TEST_INSTRUCTION("C4E2790E8C1A80000000" , vtestps(xmm1, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("C4E2790E8C1A80000000" , vtestps(xmm1, xmmword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("C4E27D0ECA" , vtestps(ymm1, ymm2));
+ TEST_INSTRUCTION("C4E27D0E8C1A80000000" , vtestps(ymm1, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("C4E27D0E8C1A80000000" , vtestps(ymm1, ymmword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("C5F92ECA" , vucomisd(xmm1, xmm2));
+ TEST_INSTRUCTION("C5F92E8C1A80000000" , vucomisd(xmm1, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("C5F92E8C1A80000000" , vucomisd(xmm1, qword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("C5F82ECA" , vucomiss(xmm1, xmm2));
+ TEST_INSTRUCTION("C5F82E8C1A80000000" , vucomiss(xmm1, ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("C5F82E8C1A80000000" , vucomiss(xmm1, dword_ptr(edx, ebx, 0, 128)));
+ TEST_INSTRUCTION("C5E915CB" , vunpckhpd(xmm1, xmm2, xmm3));
+ TEST_INSTRUCTION("C5E9158C2B80000000" , vunpckhpd(xmm1, xmm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C5E9158C2B80000000" , vunpckhpd(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C5ED15CB" , vunpckhpd(ymm1, ymm2, ymm3));
+ TEST_INSTRUCTION("C5ED158C2B80000000" , vunpckhpd(ymm1, ymm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C5ED158C2B80000000" , vunpckhpd(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F1ED4815CB" , vunpckhpd(zmm1, zmm2, zmm3));
+ TEST_INSTRUCTION("62F1ED48154C2B02" , vunpckhpd(zmm1, zmm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F1ED48154C2B02" , vunpckhpd(zmm1, zmm2, zmmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C5E815CB" , vunpckhps(xmm1, xmm2, xmm3));
+ TEST_INSTRUCTION("C5E8158C2B80000000" , vunpckhps(xmm1, xmm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C5E8158C2B80000000" , vunpckhps(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C5EC15CB" , vunpckhps(ymm1, ymm2, ymm3));
+ TEST_INSTRUCTION("C5EC158C2B80000000" , vunpckhps(ymm1, ymm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C5EC158C2B80000000" , vunpckhps(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F16C4815CB" , vunpckhps(zmm1, zmm2, zmm3));
+ TEST_INSTRUCTION("62F16C48154C2B02" , vunpckhps(zmm1, zmm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F16C48154C2B02" , vunpckhps(zmm1, zmm2, zmmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C5E914CB" , vunpcklpd(xmm1, xmm2, xmm3));
+ TEST_INSTRUCTION("C5E9148C2B80000000" , vunpcklpd(xmm1, xmm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C5E9148C2B80000000" , vunpcklpd(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C5ED14CB" , vunpcklpd(ymm1, ymm2, ymm3));
+ TEST_INSTRUCTION("C5ED148C2B80000000" , vunpcklpd(ymm1, ymm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C5ED148C2B80000000" , vunpcklpd(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F1ED4814CB" , vunpcklpd(zmm1, zmm2, zmm3));
+ TEST_INSTRUCTION("62F1ED48144C2B02" , vunpcklpd(zmm1, zmm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F1ED48144C2B02" , vunpcklpd(zmm1, zmm2, zmmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C5E814CB" , vunpcklps(xmm1, xmm2, xmm3));
+ TEST_INSTRUCTION("C5E8148C2B80000000" , vunpcklps(xmm1, xmm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C5E8148C2B80000000" , vunpcklps(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C5EC14CB" , vunpcklps(ymm1, ymm2, ymm3));
+ TEST_INSTRUCTION("C5EC148C2B80000000" , vunpcklps(ymm1, ymm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C5EC148C2B80000000" , vunpcklps(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F16C4814CB" , vunpcklps(zmm1, zmm2, zmm3));
+ TEST_INSTRUCTION("62F16C48144C2B02" , vunpcklps(zmm1, zmm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F16C48144C2B02" , vunpcklps(zmm1, zmm2, zmmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C5E957CB" , vxorpd(xmm1, xmm2, xmm3));
+ TEST_INSTRUCTION("C5E9578C2B80000000" , vxorpd(xmm1, xmm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C5E9578C2B80000000" , vxorpd(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C5ED57CB" , vxorpd(ymm1, ymm2, ymm3));
+ TEST_INSTRUCTION("C5ED578C2B80000000" , vxorpd(ymm1, ymm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C5ED578C2B80000000" , vxorpd(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F1ED4857CB" , vxorpd(zmm1, zmm2, zmm3));
+ TEST_INSTRUCTION("62F1ED48574C2B02" , vxorpd(zmm1, zmm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F1ED48574C2B02" , vxorpd(zmm1, zmm2, zmmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C5E857CB" , vxorps(xmm1, xmm2, xmm3));
+ TEST_INSTRUCTION("C5E8578C2B80000000" , vxorps(xmm1, xmm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C5E8578C2B80000000" , vxorps(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C5EC57CB" , vxorps(ymm1, ymm2, ymm3));
+ TEST_INSTRUCTION("C5EC578C2B80000000" , vxorps(ymm1, ymm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C5EC578C2B80000000" , vxorps(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F16C4857CB" , vxorps(zmm1, zmm2, zmm3));
+ TEST_INSTRUCTION("62F16C48574C2B02" , vxorps(zmm1, zmm2, ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("62F16C48574C2B02" , vxorps(zmm1, zmm2, zmmword_ptr(ebx, ebp, 0, 128)));
+ TEST_INSTRUCTION("C5FC77" , vzeroall());
+ TEST_INSTRUCTION("C5F877" , vzeroupper());
+}
+
+static void ASMJIT_NOINLINE testX86AssemblerAVX512_FP16(AssemblerTester<x86::Assembler>& tester) noexcept {
+ using namespace x86;
+
+ TEST_INSTRUCTION("62F5560810F4" , vmovsh(xmm6, xmm5, xmm4));
+ TEST_INSTRUCTION("62F57E0F10B4F400000010" , k(k7).vmovsh(xmm6, word_ptr(esp, esi, 3, 268435456)));
+ TEST_INSTRUCTION("62F57E081031" , vmovsh(xmm6, word_ptr(ecx)));
+ TEST_INSTRUCTION("62F57E0810717F" , vmovsh(xmm6, word_ptr(ecx, 254)));
+ TEST_INSTRUCTION("62F57E8F107280" , k(k7).z().vmovsh(xmm6, word_ptr(edx, -256)));
+ TEST_INSTRUCTION("62F57E0F11B4F400000010" , k(k7).vmovsh(word_ptr(esp, esi, 3, 268435456), xmm6));
+ TEST_INSTRUCTION("62F57E081131" , vmovsh(word_ptr(ecx), xmm6));
+ TEST_INSTRUCTION("62F57E0811717F" , vmovsh(word_ptr(ecx, 254), xmm6));
+ TEST_INSTRUCTION("62F57E0F117280" , k(k7).vmovsh(word_ptr(edx, -256), xmm6));
+ TEST_INSTRUCTION("62F57D086EF2" , vmovw(xmm6, edx));
+ TEST_INSTRUCTION("62F57D087EF2" , vmovw(edx, xmm6));
+ TEST_INSTRUCTION("62F57D086EB4F400000010" , vmovw(xmm6, word_ptr(esp, esi, 3, 268435456)));
+ TEST_INSTRUCTION("62F57D086E31" , vmovw(xmm6, word_ptr(ecx)));
+ TEST_INSTRUCTION("62F57D086E717F" , vmovw(xmm6, word_ptr(ecx, 254)));
+ TEST_INSTRUCTION("62F57D086E717F" , vmovw(xmm6, word_ptr(ecx, 254)));
+ TEST_INSTRUCTION("62F57D086E7280" , vmovw(xmm6, word_ptr(edx, -256)));
+ TEST_INSTRUCTION("62F57D087EB4F400000010" , vmovw(word_ptr(esp, esi, 3, 268435456), xmm6));
+ TEST_INSTRUCTION("62F57D087E31" , vmovw(word_ptr(ecx), xmm6));
+ TEST_INSTRUCTION("62F57D087E717F" , vmovw(word_ptr(ecx, 254), xmm6));
+ TEST_INSTRUCTION("62F57D087E7280" , vmovw(word_ptr(edx, -256), xmm6));
+
+ TEST_INSTRUCTION("62F5544858F4" , vaddph(zmm6, zmm5, zmm4));
+ TEST_INSTRUCTION("62F5541858F4" , rn_sae().vaddph(zmm6, zmm5, zmm4));
+ TEST_INSTRUCTION("62F5544F58B4F400000010" , k(k7).vaddph(zmm6, zmm5, zmmword_ptr(esp, esi, 3, 268435456)));
+ TEST_INSTRUCTION("62F554585831" , vaddph(zmm6, zmm5, word_ptr(ecx)._1to32()));
+ TEST_INSTRUCTION("62F5544858717F" , vaddph(zmm6, zmm5, zmmword_ptr(ecx, 8128)));
+ TEST_INSTRUCTION("62F554DF587280" , k(k7).z().vaddph(zmm6, zmm5, word_ptr(edx, -256)._1to32()));
+ TEST_INSTRUCTION("62F5560858F4" , vaddsh(xmm6, xmm5, xmm4));
+ TEST_INSTRUCTION("62F5561858F4" , rn_sae().vaddsh(xmm6, xmm5, xmm4));
+ TEST_INSTRUCTION("62F5560F58B4F400000010" , k(k7).vaddsh(xmm6, xmm5, word_ptr(esp, esi, 3, 268435456)));
+ TEST_INSTRUCTION("62F556085831" , vaddsh(xmm6, xmm5, word_ptr(ecx)));
+ TEST_INSTRUCTION("62F5560858717F" , vaddsh(xmm6, xmm5, word_ptr(ecx, 254)));
+ TEST_INSTRUCTION("62F5568F587280" , k(k7).z().vaddsh(xmm6, xmm5, word_ptr(edx, -256)));
+ TEST_INSTRUCTION("62F35448C2EC7B" , vcmpph(k5, zmm5, zmm4, 123));
+ TEST_INSTRUCTION("62F35418C2EC7B" , sae().vcmpph(k5, zmm5, zmm4, 123));
+ TEST_INSTRUCTION("62F3544FC2ACF4000000107B" , k(k7).vcmpph(k5, zmm5, zmmword_ptr(esp, esi, 3, 268435456), 123));
+ TEST_INSTRUCTION("62F35458C2297B" , vcmpph(k5, zmm5, word_ptr(ecx)._1to32(), 123));
+ TEST_INSTRUCTION("62F35448C2697F7B" , vcmpph(k5, zmm5, zmmword_ptr(ecx, 8128), 123));
+ TEST_INSTRUCTION("62F3545FC26A807B" , k(k7).vcmpph(k5, zmm5, word_ptr(edx, -256)._1to32(), 123));
+ TEST_INSTRUCTION("62F35608C2EC7B" , vcmpsh(k5, xmm5, xmm4, 123));
+ TEST_INSTRUCTION("62F35618C2EC7B" , sae().vcmpsh(k5, xmm5, xmm4, 123));
+ TEST_INSTRUCTION("62F3560FC2ACF4000000107B" , k(k7).vcmpsh(k5, xmm5, word_ptr(esp, esi, 3, 268435456), 123));
+ TEST_INSTRUCTION("62F35608C2297B" , vcmpsh(k5, xmm5, word_ptr(ecx), 123));
+ TEST_INSTRUCTION("62F35608C2697F7B" , vcmpsh(k5, xmm5, word_ptr(ecx, 254), 123));
+ TEST_INSTRUCTION("62F3560FC26A807B" , k(k7).vcmpsh(k5, xmm5, word_ptr(edx, -256), 123));
+ TEST_INSTRUCTION("62F57C082FF5" , vcomish(xmm6, xmm5));
+ TEST_INSTRUCTION("62F57C182FF5" , sae().vcomish(xmm6, xmm5));
+ TEST_INSTRUCTION("62F57C082FB4F400000010" , vcomish(xmm6, word_ptr(esp, esi, 3, 268435456)));
+ TEST_INSTRUCTION("62F57C082F31" , vcomish(xmm6, word_ptr(ecx)));
+ TEST_INSTRUCTION("62F57C082F717F" , vcomish(xmm6, word_ptr(ecx, 254)));
+ TEST_INSTRUCTION("62F57C082F7280" , vcomish(xmm6, word_ptr(edx, -256)));
+ TEST_INSTRUCTION("62F57C485BF5" , vcvtdq2ph(ymm6, zmm5));
+ TEST_INSTRUCTION("62F57C185BF5" , rn_sae().vcvtdq2ph(ymm6, zmm5));
+ TEST_INSTRUCTION("62F57C4F5BB4F400000010" , k(k7).vcvtdq2ph(ymm6, zmmword_ptr(esp, esi, 3, 268435456)));
+ TEST_INSTRUCTION("62F57C585B31" , vcvtdq2ph(ymm6, dword_ptr(ecx)._1to16()));
+ TEST_INSTRUCTION("62F57C485B717F" , vcvtdq2ph(ymm6, zmmword_ptr(ecx, 8128)));
+ TEST_INSTRUCTION("62F57CDF5B7280" , k(k7).z().vcvtdq2ph(ymm6, dword_ptr(edx, -512)._1to16()));
+ TEST_INSTRUCTION("62F5FD485AF5" , vcvtpd2ph(xmm6, zmm5));
+ TEST_INSTRUCTION("62F5FD185AF5" , rn_sae().vcvtpd2ph(xmm6, zmm5));
+ TEST_INSTRUCTION("62F5FD4F5AB4F400000010" , k(k7).vcvtpd2ph(xmm6, zmmword_ptr(esp, esi, 3, 268435456)));
+ TEST_INSTRUCTION("62F5FD585A31" , vcvtpd2ph(xmm6, qword_ptr(ecx)._1to8()));
+ TEST_INSTRUCTION("62F5FD485A717F" , vcvtpd2ph(xmm6, zmmword_ptr(ecx, 8128)));
+ TEST_INSTRUCTION("62F5FDDF5A7280" , k(k7).z().vcvtpd2ph(xmm6, qword_ptr(edx, -1024)._1to8()));
+ TEST_INSTRUCTION("62F57D485BF5" , vcvtph2dq(zmm6, ymm5));
+ TEST_INSTRUCTION("62F57D185BF5" , rn_sae().vcvtph2dq(zmm6, ymm5));
+ TEST_INSTRUCTION("62F57D4F5BB4F400000010" , k(k7).vcvtph2dq(zmm6, ymmword_ptr(esp, esi, 3, 268435456)));
+ TEST_INSTRUCTION("62F57D585B31" , vcvtph2dq(zmm6, word_ptr(ecx)._1to16()));
+ TEST_INSTRUCTION("62F57D485B717F" , vcvtph2dq(zmm6, ymmword_ptr(ecx, 4064)));
+ TEST_INSTRUCTION("62F57DDF5B7280" , k(k7).z().vcvtph2dq(zmm6, word_ptr(edx, -256)._1to16()));
+ TEST_INSTRUCTION("62F57C485AF5" , vcvtph2pd(zmm6, xmm5));
+ TEST_INSTRUCTION("62F57C185AF5" , sae().vcvtph2pd(zmm6, xmm5));
+ TEST_INSTRUCTION("62F57C4F5AB4F400000010" , k(k7).vcvtph2pd(zmm6, xmmword_ptr(esp, esi, 3, 268435456)));
+ TEST_INSTRUCTION("62F57C585A31" , vcvtph2pd(zmm6, word_ptr(ecx)._1to8()));
+ TEST_INSTRUCTION("62F57C485A717F" , vcvtph2pd(zmm6, xmmword_ptr(ecx, 2032)));
+ TEST_INSTRUCTION("62F57CDF5A7280" , k(k7).z().vcvtph2pd(zmm6, word_ptr(edx, -256)._1to8()));
+ TEST_INSTRUCTION("62F67D4813F5" , vcvtph2psx(zmm6, ymm5));
+ TEST_INSTRUCTION("62F67D1813F5" , sae().vcvtph2psx(zmm6, ymm5));
+ TEST_INSTRUCTION("62F67D4F13B4F400000010" , k(k7).vcvtph2psx(zmm6, ymmword_ptr(esp, esi, 3, 268435456)));
+ TEST_INSTRUCTION("62F67D581331" , vcvtph2psx(zmm6, word_ptr(ecx)._1to16()));
+ TEST_INSTRUCTION("62F67D4813717F" , vcvtph2psx(zmm6, ymmword_ptr(ecx, 4064)));
+ TEST_INSTRUCTION("62F67DDF137280" , k(k7).z().vcvtph2psx(zmm6, word_ptr(edx, -256)._1to16()));
+ TEST_INSTRUCTION("62F57D487BF5" , vcvtph2qq(zmm6, xmm5));
+ TEST_INSTRUCTION("62F57D187BF5" , rn_sae().vcvtph2qq(zmm6, xmm5));
+ TEST_INSTRUCTION("62F57D4F7BB4F400000010" , k(k7).vcvtph2qq(zmm6, xmmword_ptr(esp, esi, 3, 268435456)));
+ TEST_INSTRUCTION("62F57D587B31" , vcvtph2qq(zmm6, word_ptr(ecx)._1to8()));
+ TEST_INSTRUCTION("62F57D487B717F" , vcvtph2qq(zmm6, xmmword_ptr(ecx, 2032)));
+ TEST_INSTRUCTION("62F57DDF7B7280" , k(k7).z().vcvtph2qq(zmm6, word_ptr(edx, -256)._1to8()));
+ TEST_INSTRUCTION("62F57C4879F5" , vcvtph2udq(zmm6, ymm5));
+ TEST_INSTRUCTION("62F57C1879F5" , rn_sae().vcvtph2udq(zmm6, ymm5));
+ TEST_INSTRUCTION("62F57C4F79B4F400000010" , k(k7).vcvtph2udq(zmm6, ymmword_ptr(esp, esi, 3, 268435456)));
+ TEST_INSTRUCTION("62F57C587931" , vcvtph2udq(zmm6, word_ptr(ecx)._1to16()));
+ TEST_INSTRUCTION("62F57C4879717F" , vcvtph2udq(zmm6, ymmword_ptr(ecx, 4064)));
+ TEST_INSTRUCTION("62F57CDF797280" , k(k7).z().vcvtph2udq(zmm6, word_ptr(edx, -256)._1to16()));
+ TEST_INSTRUCTION("62F57D4879F5" , vcvtph2uqq(zmm6, xmm5));
+ TEST_INSTRUCTION("62F57D1879F5" , rn_sae().vcvtph2uqq(zmm6, xmm5));
+ TEST_INSTRUCTION("62F57D4F79B4F400000010" , k(k7).vcvtph2uqq(zmm6, xmmword_ptr(esp, esi, 3, 268435456)));
+ TEST_INSTRUCTION("62F57D587931" , vcvtph2uqq(zmm6, word_ptr(ecx)._1to8()));
+ TEST_INSTRUCTION("62F57D4879717F" , vcvtph2uqq(zmm6, xmmword_ptr(ecx, 2032)));
+ TEST_INSTRUCTION("62F57DDF797280" , k(k7).z().vcvtph2uqq(zmm6, word_ptr(edx, -256)._1to8()));
+ TEST_INSTRUCTION("62F57C487DF5" , vcvtph2uw(zmm6, zmm5));
+ TEST_INSTRUCTION("62F57C187DF5" , rn_sae().vcvtph2uw(zmm6, zmm5));
+ TEST_INSTRUCTION("62F57C4F7DB4F400000010" , k(k7).vcvtph2uw(zmm6, zmmword_ptr(esp, esi, 3, 268435456)));
+ TEST_INSTRUCTION("62F57C587D31" , vcvtph2uw(zmm6, word_ptr(ecx)._1to32()));
+ TEST_INSTRUCTION("62F57C487D717F" , vcvtph2uw(zmm6, zmmword_ptr(ecx, 8128)));
+ TEST_INSTRUCTION("62F57CDF7D7280" , k(k7).z().vcvtph2uw(zmm6, word_ptr(edx, -256)._1to32()));
+ TEST_INSTRUCTION("62F57D487DF5" , vcvtph2w(zmm6, zmm5));
+ TEST_INSTRUCTION("62F57D187DF5" , rn_sae().vcvtph2w(zmm6, zmm5));
+ TEST_INSTRUCTION("62F57D4F7DB4F400000010" , k(k7).vcvtph2w(zmm6, zmmword_ptr(esp, esi, 3, 268435456)));
+ TEST_INSTRUCTION("62F57D587D31" , vcvtph2w(zmm6, word_ptr(ecx)._1to32()));
+ TEST_INSTRUCTION("62F57D487D717F" , vcvtph2w(zmm6, zmmword_ptr(ecx, 8128)));
+ TEST_INSTRUCTION("62F57DDF7D7280" , k(k7).z().vcvtph2w(zmm6, word_ptr(edx, -256)._1to32()));
+ TEST_INSTRUCTION("62F57D481DF5" , vcvtps2phx(ymm6, zmm5));
+ TEST_INSTRUCTION("62F57D181DF5" , rn_sae().vcvtps2phx(ymm6, zmm5));
+ TEST_INSTRUCTION("62F57D4F1DB4F400000010" , k(k7).vcvtps2phx(ymm6, zmmword_ptr(esp, esi, 3, 268435456)));
+ TEST_INSTRUCTION("62F57D581D31" , vcvtps2phx(ymm6, dword_ptr(ecx)._1to16()));
+ TEST_INSTRUCTION("62F57D481D717F" , vcvtps2phx(ymm6, zmmword_ptr(ecx, 8128)));
+ TEST_INSTRUCTION("62F57DDF1D7280" , k(k7).z().vcvtps2phx(ymm6, dword_ptr(edx, -512)._1to16()));
+ TEST_INSTRUCTION("62F5FC485BF5" , vcvtqq2ph(xmm6, zmm5));
+ TEST_INSTRUCTION("62F5FC185BF5" , rn_sae().vcvtqq2ph(xmm6, zmm5));
+ TEST_INSTRUCTION("62F5FC4F5BB4F400000010" , k(k7).vcvtqq2ph(xmm6, zmmword_ptr(esp, esi, 3, 268435456)));
+ TEST_INSTRUCTION("62F5FC585B31" , vcvtqq2ph(xmm6, qword_ptr(ecx)._1to8()));
+ TEST_INSTRUCTION("62F5FC485B717F" , vcvtqq2ph(xmm6, zmmword_ptr(ecx, 8128)));
+ TEST_INSTRUCTION("62F5FCDF5B7280" , k(k7).z().vcvtqq2ph(xmm6, qword_ptr(edx, -1024)._1to8()));
+ TEST_INSTRUCTION("62F5D7085AF4" , vcvtsd2sh(xmm6, xmm5, xmm4));
+ TEST_INSTRUCTION("62F5D7185AF4" , rn_sae().vcvtsd2sh(xmm6, xmm5, xmm4));
+ TEST_INSTRUCTION("62F5D70F5AB4F400000010" , k(k7).vcvtsd2sh(xmm6, xmm5, qword_ptr(esp, esi, 3, 268435456)));
+ TEST_INSTRUCTION("62F5D7085A31" , vcvtsd2sh(xmm6, xmm5, qword_ptr(ecx)));
+ TEST_INSTRUCTION("62F5D7085A717F" , vcvtsd2sh(xmm6, xmm5, qword_ptr(ecx, 1016)));
+ TEST_INSTRUCTION("62F5D78F5A7280" , k(k7).z().vcvtsd2sh(xmm6, xmm5, qword_ptr(edx, -1024)));
+ TEST_INSTRUCTION("62F556085AF4" , vcvtsh2sd(xmm6, xmm5, xmm4));
+ TEST_INSTRUCTION("62F556185AF4" , sae().vcvtsh2sd(xmm6, xmm5, xmm4));
+ TEST_INSTRUCTION("62F5560F5AB4F400000010" , k(k7).vcvtsh2sd(xmm6, xmm5, word_ptr(esp, esi, 3, 268435456)));
+ TEST_INSTRUCTION("62F556085A31" , vcvtsh2sd(xmm6, xmm5, word_ptr(ecx)));
+ TEST_INSTRUCTION("62F556085A717F" , vcvtsh2sd(xmm6, xmm5, word_ptr(ecx, 254)));
+ TEST_INSTRUCTION("62F5568F5A7280" , k(k7).z().vcvtsh2sd(xmm6, xmm5, word_ptr(edx, -256)));
+ TEST_INSTRUCTION("62F57E082DD6" , vcvtsh2si(edx, xmm6));
+ TEST_INSTRUCTION("62F57E182DD6" , rn_sae().vcvtsh2si(edx, xmm6));
+ TEST_INSTRUCTION("62F57E082D94F400000010" , vcvtsh2si(edx, word_ptr(esp, esi, 3, 268435456)));
+ TEST_INSTRUCTION("62F57E082D11" , vcvtsh2si(edx, word_ptr(ecx)));
+ TEST_INSTRUCTION("62F57E082D517F" , vcvtsh2si(edx, word_ptr(ecx, 254)));
+ TEST_INSTRUCTION("62F57E082D5280" , vcvtsh2si(edx, word_ptr(edx, -256)));
+ TEST_INSTRUCTION("62F6540813F4" , vcvtsh2ss(xmm6, xmm5, xmm4));
+ TEST_INSTRUCTION("62F6541813F4" , sae().vcvtsh2ss(xmm6, xmm5, xmm4));
+ TEST_INSTRUCTION("62F6540F13B4F400000010" , k(k7).vcvtsh2ss(xmm6, xmm5, word_ptr(esp, esi, 3, 268435456)));
+ TEST_INSTRUCTION("62F654081331" , vcvtsh2ss(xmm6, xmm5, word_ptr(ecx)));
+ TEST_INSTRUCTION("62F6540813717F" , vcvtsh2ss(xmm6, xmm5, word_ptr(ecx, 254)));
+ TEST_INSTRUCTION("62F6548F137280" , k(k7).z().vcvtsh2ss(xmm6, xmm5, word_ptr(edx, -256)));
+ TEST_INSTRUCTION("62F57E0879D6" , vcvtsh2usi(edx, xmm6));
+ TEST_INSTRUCTION("62F57E1879D6" , rn_sae().vcvtsh2usi(edx, xmm6));
+ TEST_INSTRUCTION("62F57E087994F400000010" , vcvtsh2usi(edx, word_ptr(esp, esi, 3, 268435456)));
+ TEST_INSTRUCTION("62F57E087911" , vcvtsh2usi(edx, word_ptr(ecx)));
+ TEST_INSTRUCTION("62F57E0879517F" , vcvtsh2usi(edx, word_ptr(ecx, 254)));
+ TEST_INSTRUCTION("62F57E08795280" , vcvtsh2usi(edx, word_ptr(edx, -256)));
+ TEST_INSTRUCTION("62F556082AF2" , vcvtsi2sh(xmm6, xmm5, edx));
+ TEST_INSTRUCTION("62F556182AF2" , rn_sae().vcvtsi2sh(xmm6, xmm5, edx));
+ TEST_INSTRUCTION("62F556082AB4F400000010" , vcvtsi2sh(xmm6, xmm5, dword_ptr(esp, esi, 3, 268435456)));
+ TEST_INSTRUCTION("62F556082A31" , vcvtsi2sh(xmm6, xmm5, dword_ptr(ecx)));
+ TEST_INSTRUCTION("62F556082A717F" , vcvtsi2sh(xmm6, xmm5, dword_ptr(ecx, 508)));
+ TEST_INSTRUCTION("62F556082A7280" , vcvtsi2sh(xmm6, xmm5, dword_ptr(edx, -512)));
+ TEST_INSTRUCTION("62F554081DF4" , vcvtss2sh(xmm6, xmm5, xmm4));
+ TEST_INSTRUCTION("62F554181DF4" , rn_sae().vcvtss2sh(xmm6, xmm5, xmm4));
+ TEST_INSTRUCTION("62F5540F1DB4F400000010" , k(k7).vcvtss2sh(xmm6, xmm5, dword_ptr(esp, esi, 3, 268435456)));
+ TEST_INSTRUCTION("62F554081D31" , vcvtss2sh(xmm6, xmm5, dword_ptr(ecx)));
+ TEST_INSTRUCTION("62F554081D717F" , vcvtss2sh(xmm6, xmm5, dword_ptr(ecx, 508)));
+ TEST_INSTRUCTION("62F5548F1D7280" , k(k7).z().vcvtss2sh(xmm6, xmm5, dword_ptr(edx, -512)));
+ TEST_INSTRUCTION("62F57E485BF5" , vcvttph2dq(zmm6, ymm5));
+ TEST_INSTRUCTION("62F57E185BF5" , sae().vcvttph2dq(zmm6, ymm5));
+ TEST_INSTRUCTION("62F57E4F5BB4F400000010" , k(k7).vcvttph2dq(zmm6, ymmword_ptr(esp, esi, 3, 268435456)));
+ TEST_INSTRUCTION("62F57E585B31" , vcvttph2dq(zmm6, word_ptr(ecx)._1to16()));
+ TEST_INSTRUCTION("62F57E485B717F" , vcvttph2dq(zmm6, ymmword_ptr(ecx, 4064)));
+ TEST_INSTRUCTION("62F57EDF5B7280" , k(k7).z().vcvttph2dq(zmm6, word_ptr(edx, -256)._1to16()));
+ TEST_INSTRUCTION("62F57D487AF5" , vcvttph2qq(zmm6, xmm5));
+ TEST_INSTRUCTION("62F57D187AF5" , sae().vcvttph2qq(zmm6, xmm5));
+ TEST_INSTRUCTION("62F57D4F7AB4F400000010" , k(k7).vcvttph2qq(zmm6, xmmword_ptr(esp, esi, 3, 268435456)));
+ TEST_INSTRUCTION("62F57D587A31" , vcvttph2qq(zmm6, word_ptr(ecx)._1to8()));
+ TEST_INSTRUCTION("62F57D487A717F" , vcvttph2qq(zmm6, xmmword_ptr(ecx, 2032)));
+ TEST_INSTRUCTION("62F57DDF7A7280" , k(k7).z().vcvttph2qq(zmm6, word_ptr(edx, -256)._1to8()));
+ TEST_INSTRUCTION("62F57C4878F5" , vcvttph2udq(zmm6, ymm5));
+ TEST_INSTRUCTION("62F57C1878F5" , sae().vcvttph2udq(zmm6, ymm5));
+ TEST_INSTRUCTION("62F57C4F78B4F400000010" , k(k7).vcvttph2udq(zmm6, ymmword_ptr(esp, esi, 3, 268435456)));
+ TEST_INSTRUCTION("62F57C587831" , vcvttph2udq(zmm6, word_ptr(ecx)._1to16()));
+ TEST_INSTRUCTION("62F57C4878717F" , vcvttph2udq(zmm6, ymmword_ptr(ecx, 4064)));
+ TEST_INSTRUCTION("62F57CDF787280" , k(k7).z().vcvttph2udq(zmm6, word_ptr(edx, -256)._1to16()));
+ TEST_INSTRUCTION("62F57D4878F5" , vcvttph2uqq(zmm6, xmm5));
+ TEST_INSTRUCTION("62F57D1878F5" , sae().vcvttph2uqq(zmm6, xmm5));
+ TEST_INSTRUCTION("62F57D4F78B4F400000010" , k(k7).vcvttph2uqq(zmm6, xmmword_ptr(esp, esi, 3, 268435456)));
+ TEST_INSTRUCTION("62F57D587831" , vcvttph2uqq(zmm6, word_ptr(ecx)._1to8()));
+ TEST_INSTRUCTION("62F57D4878717F" , vcvttph2uqq(zmm6, xmmword_ptr(ecx, 2032)));
+ TEST_INSTRUCTION("62F57DDF787280" , k(k7).z().vcvttph2uqq(zmm6, word_ptr(edx, -256)._1to8()));
+ TEST_INSTRUCTION("62F57C487CF5" , vcvttph2uw(zmm6, zmm5));
+ TEST_INSTRUCTION("62F57C187CF5" , sae().vcvttph2uw(zmm6, zmm5));
+ TEST_INSTRUCTION("62F57C4F7CB4F400000010" , k(k7).vcvttph2uw(zmm6, zmmword_ptr(esp, esi, 3, 268435456)));
+ TEST_INSTRUCTION("62F57C587C31" , vcvttph2uw(zmm6, word_ptr(ecx)._1to32()));
+ TEST_INSTRUCTION("62F57C487C717F" , vcvttph2uw(zmm6, zmmword_ptr(ecx, 8128)));
+ TEST_INSTRUCTION("62F57CDF7C7280" , k(k7).z().vcvttph2uw(zmm6, word_ptr(edx, -256)._1to32()));
+ TEST_INSTRUCTION("62F57D487CF5" , vcvttph2w(zmm6, zmm5));
+ TEST_INSTRUCTION("62F57D187CF5" , sae().vcvttph2w(zmm6, zmm5));
+ TEST_INSTRUCTION("62F57D4F7CB4F400000010" , k(k7).vcvttph2w(zmm6, zmmword_ptr(esp, esi, 3, 268435456)));
+ TEST_INSTRUCTION("62F57D587C31" , vcvttph2w(zmm6, word_ptr(ecx)._1to32()));
+ TEST_INSTRUCTION("62F57D487C717F" , vcvttph2w(zmm6, zmmword_ptr(ecx, 8128)));
+ TEST_INSTRUCTION("62F57DDF7C7280" , k(k7).z().vcvttph2w(zmm6, word_ptr(edx, -256)._1to32()));
+ TEST_INSTRUCTION("62F57E082CD6" , vcvttsh2si(edx, xmm6));
+ TEST_INSTRUCTION("62F57E182CD6" , sae().vcvttsh2si(edx, xmm6));
+ TEST_INSTRUCTION("62F57E082C94F400000010" , vcvttsh2si(edx, word_ptr(esp, esi, 3, 268435456)));
+ TEST_INSTRUCTION("62F57E082C11" , vcvttsh2si(edx, word_ptr(ecx)));
+ TEST_INSTRUCTION("62F57E082C517F" , vcvttsh2si(edx, word_ptr(ecx, 254)));
+ TEST_INSTRUCTION("62F57E082C5280" , vcvttsh2si(edx, word_ptr(edx, -256)));
+ TEST_INSTRUCTION("62F57E0878D6" , vcvttsh2usi(edx, xmm6));
+ TEST_INSTRUCTION("62F57E1878D6" , sae().vcvttsh2usi(edx, xmm6));
+ TEST_INSTRUCTION("62F57E087894F400000010" , vcvttsh2usi(edx, word_ptr(esp, esi, 3, 268435456)));
+ TEST_INSTRUCTION("62F57E087811" , vcvttsh2usi(edx, word_ptr(ecx)));
+ TEST_INSTRUCTION("62F57E0878517F" , vcvttsh2usi(edx, word_ptr(ecx, 254)));
+ TEST_INSTRUCTION("62F57E08785280" , vcvttsh2usi(edx, word_ptr(edx, -256)));
+ TEST_INSTRUCTION("62F57F487AF5" , vcvtudq2ph(ymm6, zmm5));
+ TEST_INSTRUCTION("62F57F187AF5" , rn_sae().vcvtudq2ph(ymm6, zmm5));
+ TEST_INSTRUCTION("62F57F4F7AB4F400000010" , k(k7).vcvtudq2ph(ymm6, zmmword_ptr(esp, esi, 3, 268435456)));
+ TEST_INSTRUCTION("62F57F587A31" , vcvtudq2ph(ymm6, dword_ptr(ecx)._1to16()));
+ TEST_INSTRUCTION("62F57F487A717F" , vcvtudq2ph(ymm6, zmmword_ptr(ecx, 8128)));
+ TEST_INSTRUCTION("62F57FDF7A7280" , k(k7).z().vcvtudq2ph(ymm6, dword_ptr(edx, -512)._1to16()));
+ TEST_INSTRUCTION("62F5FF487AF5" , vcvtuqq2ph(xmm6, zmm5));
+ TEST_INSTRUCTION("62F5FF187AF5" , rn_sae().vcvtuqq2ph(xmm6, zmm5));
+ TEST_INSTRUCTION("62F5FF4F7AB4F400000010" , k(k7).vcvtuqq2ph(xmm6, zmmword_ptr(esp, esi, 3, 268435456)));
+ TEST_INSTRUCTION("62F5FF587A31" , vcvtuqq2ph(xmm6, qword_ptr(ecx)._1to8()));
+ TEST_INSTRUCTION("62F5FF487A717F" , vcvtuqq2ph(xmm6, zmmword_ptr(ecx, 8128)));
+ TEST_INSTRUCTION("62F5FFDF7A7280" , k(k7).z().vcvtuqq2ph(xmm6, qword_ptr(edx, -1024)._1to8()));
+ TEST_INSTRUCTION("62F556087BF2" , vcvtusi2sh(xmm6, xmm5, edx));
+ TEST_INSTRUCTION("62F556187BF2" , rn_sae().vcvtusi2sh(xmm6, xmm5, edx));
+ TEST_INSTRUCTION("62F556087BB4F400000010" , vcvtusi2sh(xmm6, xmm5, dword_ptr(esp, esi, 3, 268435456)));
+ TEST_INSTRUCTION("62F556087B31" , vcvtusi2sh(xmm6, xmm5, dword_ptr(ecx)));
+ TEST_INSTRUCTION("62F556087B717F" , vcvtusi2sh(xmm6, xmm5, dword_ptr(ecx, 508)));
+ TEST_INSTRUCTION("62F556087B7280" , vcvtusi2sh(xmm6, xmm5, dword_ptr(edx, -512)));
+ TEST_INSTRUCTION("62F57F487DF5" , vcvtuw2ph(zmm6, zmm5));
+ TEST_INSTRUCTION("62F57F187DF5" , rn_sae().vcvtuw2ph(zmm6, zmm5));
+ TEST_INSTRUCTION("62F57F4F7DB4F400000010" , k(k7).vcvtuw2ph(zmm6, zmmword_ptr(esp, esi, 3, 268435456)));
+ TEST_INSTRUCTION("62F57F587D31" , vcvtuw2ph(zmm6, word_ptr(ecx)._1to32()));
+ TEST_INSTRUCTION("62F57F487D717F" , vcvtuw2ph(zmm6, zmmword_ptr(ecx, 8128)));
+ TEST_INSTRUCTION("62F57FDF7D7280" , k(k7).z().vcvtuw2ph(zmm6, word_ptr(edx, -256)._1to32()));
+ TEST_INSTRUCTION("62F57E487DF5" , vcvtw2ph(zmm6, zmm5));
+ TEST_INSTRUCTION("62F57E187DF5" , rn_sae().vcvtw2ph(zmm6, zmm5));
+ TEST_INSTRUCTION("62F57E4F7DB4F400000010" , k(k7).vcvtw2ph(zmm6, zmmword_ptr(esp, esi, 3, 268435456)));
+ TEST_INSTRUCTION("62F57E587D31" , vcvtw2ph(zmm6, word_ptr(ecx)._1to32()));
+ TEST_INSTRUCTION("62F57E487D717F" , vcvtw2ph(zmm6, zmmword_ptr(ecx, 8128)));
+ TEST_INSTRUCTION("62F57EDF7D7280" , k(k7).z().vcvtw2ph(zmm6, word_ptr(edx, -256)._1to32()));
+ TEST_INSTRUCTION("62F554485EF4" , vdivph(zmm6, zmm5, zmm4));
+ TEST_INSTRUCTION("62F554185EF4" , rn_sae().vdivph(zmm6, zmm5, zmm4));
+ TEST_INSTRUCTION("62F5544F5EB4F400000010" , k(k7).vdivph(zmm6, zmm5, zmmword_ptr(esp, esi, 3, 268435456)));
+ TEST_INSTRUCTION("62F554585E31" , vdivph(zmm6, zmm5, word_ptr(ecx)._1to32()));
+ TEST_INSTRUCTION("62F554485E717F" , vdivph(zmm6, zmm5, zmmword_ptr(ecx, 8128)));
+ TEST_INSTRUCTION("62F554DF5E7280" , k(k7).z().vdivph(zmm6, zmm5, word_ptr(edx, -256)._1to32()));
+ TEST_INSTRUCTION("62F556085EF4" , vdivsh(xmm6, xmm5, xmm4));
+ TEST_INSTRUCTION("62F556185EF4" , rn_sae().vdivsh(xmm6, xmm5, xmm4));
+ TEST_INSTRUCTION("62F5560F5EB4F400000010" , k(k7).vdivsh(xmm6, xmm5, word_ptr(esp, esi, 3, 268435456)));
+ TEST_INSTRUCTION("62F556085E31" , vdivsh(xmm6, xmm5, word_ptr(ecx)));
+ TEST_INSTRUCTION("62F556085E717F" , vdivsh(xmm6, xmm5, word_ptr(ecx, 254)));
+ TEST_INSTRUCTION("62F5568F5E7280" , k(k7).z().vdivsh(xmm6, xmm5, word_ptr(edx, -256)));
+ TEST_INSTRUCTION("62F554485FF4" , vmaxph(zmm6, zmm5, zmm4));
+ TEST_INSTRUCTION("62F554185FF4" , sae().vmaxph(zmm6, zmm5, zmm4));
+ TEST_INSTRUCTION("62F5544F5FB4F400000010" , k(k7).vmaxph(zmm6, zmm5, zmmword_ptr(esp, esi, 3, 268435456)));
+ TEST_INSTRUCTION("62F554585F31" , vmaxph(zmm6, zmm5, word_ptr(ecx)._1to32()));
+ TEST_INSTRUCTION("62F554485F717F" , vmaxph(zmm6, zmm5, zmmword_ptr(ecx, 8128)));
+ TEST_INSTRUCTION("62F554DF5F7280" , k(k7).z().vmaxph(zmm6, zmm5, word_ptr(edx, -256)._1to32()));
+ TEST_INSTRUCTION("62F556085FF4" , vmaxsh(xmm6, xmm5, xmm4));
+ TEST_INSTRUCTION("62F556185FF4" , sae().vmaxsh(xmm6, xmm5, xmm4));
+ TEST_INSTRUCTION("62F5560F5FB4F400000010" , k(k7).vmaxsh(xmm6, xmm5, word_ptr(esp, esi, 3, 268435456)));
+ TEST_INSTRUCTION("62F556085F31" , vmaxsh(xmm6, xmm5, word_ptr(ecx)));
+ TEST_INSTRUCTION("62F556085F717F" , vmaxsh(xmm6, xmm5, word_ptr(ecx, 254)));
+ TEST_INSTRUCTION("62F5568F5F7280" , k(k7).z().vmaxsh(xmm6, xmm5, word_ptr(edx, -256)));
+ TEST_INSTRUCTION("62F554485DF4" , vminph(zmm6, zmm5, zmm4));
+ TEST_INSTRUCTION("62F554185DF4" , sae().vminph(zmm6, zmm5, zmm4));
+ TEST_INSTRUCTION("62F5544F5DB4F400000010" , k(k7).vminph(zmm6, zmm5, zmmword_ptr(esp, esi, 3, 268435456)));
+ TEST_INSTRUCTION("62F554585D31" , vminph(zmm6, zmm5, word_ptr(ecx)._1to32()));
+ TEST_INSTRUCTION("62F554485D717F" , vminph(zmm6, zmm5, zmmword_ptr(ecx, 8128)));
+ TEST_INSTRUCTION("62F554DF5D7280" , k(k7).z().vminph(zmm6, zmm5, word_ptr(edx, -256)._1to32()));
+ TEST_INSTRUCTION("62F556085DF4" , vminsh(xmm6, xmm5, xmm4));
+ TEST_INSTRUCTION("62F556185DF4" , sae().vminsh(xmm6, xmm5, xmm4));
+ TEST_INSTRUCTION("62F5560F5DB4F400000010" , k(k7).vminsh(xmm6, xmm5, word_ptr(esp, esi, 3, 268435456)));
+ TEST_INSTRUCTION("62F556085D31" , vminsh(xmm6, xmm5, word_ptr(ecx)));
+ TEST_INSTRUCTION("62F556085D717F" , vminsh(xmm6, xmm5, word_ptr(ecx, 254)));
+ TEST_INSTRUCTION("62F5568F5D7280" , k(k7).z().vminsh(xmm6, xmm5, word_ptr(edx, -256)));
+ TEST_INSTRUCTION("62F5544859F4" , vmulph(zmm6, zmm5, zmm4));
+ TEST_INSTRUCTION("62F5541859F4" , rn_sae().vmulph(zmm6, zmm5, zmm4));
+ TEST_INSTRUCTION("62F5544F59B4F400000010" , k(k7).vmulph(zmm6, zmm5, zmmword_ptr(esp, esi, 3, 268435456)));
+ TEST_INSTRUCTION("62F554585931" , vmulph(zmm6, zmm5, word_ptr(ecx)._1to32()));
+ TEST_INSTRUCTION("62F5544859717F" , vmulph(zmm6, zmm5, zmmword_ptr(ecx, 8128)));
+ TEST_INSTRUCTION("62F554DF597280" , k(k7).z().vmulph(zmm6, zmm5, word_ptr(edx, -256)._1to32()));
+ TEST_INSTRUCTION("62F5560859F4" , vmulsh(xmm6, xmm5, xmm4));
+ TEST_INSTRUCTION("62F5561859F4" , rn_sae().vmulsh(xmm6, xmm5, xmm4));
+ TEST_INSTRUCTION("62F5560F59B4F400000010" , k(k7).vmulsh(xmm6, xmm5, word_ptr(esp, esi, 3, 268435456)));
+ TEST_INSTRUCTION("62F556085931" , vmulsh(xmm6, xmm5, word_ptr(ecx)));
+ TEST_INSTRUCTION("62F5560859717F" , vmulsh(xmm6, xmm5, word_ptr(ecx, 254)));
+ TEST_INSTRUCTION("62F5568F597280" , k(k7).z().vmulsh(xmm6, xmm5, word_ptr(edx, -256)));
+ TEST_INSTRUCTION("62F554485CF4" , vsubph(zmm6, zmm5, zmm4));
+ TEST_INSTRUCTION("62F554185CF4" , rn_sae().vsubph(zmm6, zmm5, zmm4));
+ TEST_INSTRUCTION("62F5544F5CB4F400000010" , k(k7).vsubph(zmm6, zmm5, zmmword_ptr(esp, esi, 3, 268435456)));
+ TEST_INSTRUCTION("62F554585C31" , vsubph(zmm6, zmm5, word_ptr(ecx)._1to32()));
+ TEST_INSTRUCTION("62F554485C717F" , vsubph(zmm6, zmm5, zmmword_ptr(ecx, 8128)));
+ TEST_INSTRUCTION("62F554DF5C7280" , k(k7).z().vsubph(zmm6, zmm5, word_ptr(edx, -256)._1to32()));
+ TEST_INSTRUCTION("62F556085CF4" , vsubsh(xmm6, xmm5, xmm4));
+ TEST_INSTRUCTION("62F556185CF4" , rn_sae().vsubsh(xmm6, xmm5, xmm4));
+ TEST_INSTRUCTION("62F5560F5CB4F400000010" , k(k7).vsubsh(xmm6, xmm5, word_ptr(esp, esi, 3, 268435456)));
+ TEST_INSTRUCTION("62F556085C31" , vsubsh(xmm6, xmm5, word_ptr(ecx)));
+ TEST_INSTRUCTION("62F556085C717F" , vsubsh(xmm6, xmm5, word_ptr(ecx, 254)));
+ TEST_INSTRUCTION("62F5568F5C7280" , k(k7).z().vsubsh(xmm6, xmm5, word_ptr(edx, -256)));
+ TEST_INSTRUCTION("62F57C082EF5" , vucomish(xmm6, xmm5));
+ TEST_INSTRUCTION("62F57C182EF5" , sae().vucomish(xmm6, xmm5));
+ TEST_INSTRUCTION("62F57C082EB4F400000010" , vucomish(xmm6, word_ptr(esp, esi, 3, 268435456)));
+ TEST_INSTRUCTION("62F57C082E31" , vucomish(xmm6, word_ptr(ecx)));
+ TEST_INSTRUCTION("62F57C082E717F" , vucomish(xmm6, word_ptr(ecx, 254)));
+ TEST_INSTRUCTION("62F57C082E7280" , vucomish(xmm6, word_ptr(edx, -256)));
+ TEST_INSTRUCTION("62F37C4866EE7B" , vfpclassph(k5, zmm6, 123));
+ TEST_INSTRUCTION("62F37C4F66ACF4000000107B" , k(k7).vfpclassph(k5, zmmword_ptr(esp, esi, 3, 268435456), 123));
+ TEST_INSTRUCTION("62F37C5866297B" , vfpclassph(k5, word_ptr(ecx)._1to32(), 123));
+ TEST_INSTRUCTION("62F37C4866697F7B" , vfpclassph(k5, zmmword_ptr(ecx, 8128), 123));
+ TEST_INSTRUCTION("62F37C5F666A807B" , k(k7).vfpclassph(k5, word_ptr(edx, -256)._1to32(), 123));
+ TEST_INSTRUCTION("62F37C0867EE7B" , vfpclasssh(k5, xmm6, 123));
+ TEST_INSTRUCTION("62F37C0F67ACF4000000107B" , k(k7).vfpclasssh(k5, word_ptr(esp, esi, 3, 268435456), 123));
+ TEST_INSTRUCTION("62F37C0867297B" , vfpclasssh(k5, word_ptr(ecx), 123));
+ TEST_INSTRUCTION("62F37C0867697F7B" , vfpclasssh(k5, word_ptr(ecx, 254), 123));
+ TEST_INSTRUCTION("62F37C0F676A807B" , k(k7).vfpclasssh(k5, word_ptr(edx, -256), 123));
+ TEST_INSTRUCTION("62F67D4842F5" , vgetexpph(zmm6, zmm5));
+ TEST_INSTRUCTION("62F67D1842F5" , sae().vgetexpph(zmm6, zmm5));
+ TEST_INSTRUCTION("62F67D4F42B4F400000010" , k(k7).vgetexpph(zmm6, zmmword_ptr(esp, esi, 3, 268435456)));
+ TEST_INSTRUCTION("62F67D584231" , vgetexpph(zmm6, word_ptr(ecx)._1to32()));
+ TEST_INSTRUCTION("62F67D4842717F" , vgetexpph(zmm6, zmmword_ptr(ecx, 8128)));
+ TEST_INSTRUCTION("62F67DDF427280" , k(k7).z().vgetexpph(zmm6, word_ptr(edx, -256)._1to32()));
+ TEST_INSTRUCTION("62F6550843F4" , vgetexpsh(xmm6, xmm5, xmm4));
+ TEST_INSTRUCTION("62F6551843F4" , sae().vgetexpsh(xmm6, xmm5, xmm4));
+ TEST_INSTRUCTION("62F6550F43B4F400000010" , k(k7).vgetexpsh(xmm6, xmm5, word_ptr(esp, esi, 3, 268435456)));
+ TEST_INSTRUCTION("62F655084331" , vgetexpsh(xmm6, xmm5, word_ptr(ecx)));
+ TEST_INSTRUCTION("62F6550843717F" , vgetexpsh(xmm6, xmm5, word_ptr(ecx, 254)));
+ TEST_INSTRUCTION("62F6558F437280" , k(k7).z().vgetexpsh(xmm6, xmm5, word_ptr(edx, -256)));
+ TEST_INSTRUCTION("62F37C4826F57B" , vgetmantph(zmm6, zmm5, 123));
+ TEST_INSTRUCTION("62F37C1826F57B" , sae().vgetmantph(zmm6, zmm5, 123));
+ TEST_INSTRUCTION("62F37C4F26B4F4000000107B" , k(k7).vgetmantph(zmm6, zmmword_ptr(esp, esi, 3, 268435456), 123));
+ TEST_INSTRUCTION("62F37C5826317B" , vgetmantph(zmm6, word_ptr(ecx)._1to32(), 123));
+ TEST_INSTRUCTION("62F37C4826717F7B" , vgetmantph(zmm6, zmmword_ptr(ecx, 8128), 123));
+ TEST_INSTRUCTION("62F37CDF2672807B" , k(k7).z().vgetmantph(zmm6, word_ptr(edx, -256)._1to32(), 123));
+ TEST_INSTRUCTION("62F3540827F47B" , vgetmantsh(xmm6, xmm5, xmm4, 123));
+ TEST_INSTRUCTION("62F3541827F47B" , sae().vgetmantsh(xmm6, xmm5, xmm4, 123));
+ TEST_INSTRUCTION("62F3540F27B4F4000000107B" , k(k7).vgetmantsh(xmm6, xmm5, word_ptr(esp, esi, 3, 268435456), 123));
+ TEST_INSTRUCTION("62F3540827317B" , vgetmantsh(xmm6, xmm5, word_ptr(ecx), 123));
+ TEST_INSTRUCTION("62F3540827717F7B" , vgetmantsh(xmm6, xmm5, word_ptr(ecx, 254), 123));
+ TEST_INSTRUCTION("62F3548F2772807B" , k(k7).z().vgetmantsh(xmm6, xmm5, word_ptr(edx, -256), 123));
+ TEST_INSTRUCTION("62F67D484CF5" , vrcpph(zmm6, zmm5));
+ TEST_INSTRUCTION("62F67D4F4CB4F400000010" , k(k7).vrcpph(zmm6, zmmword_ptr(esp, esi, 3, 268435456)));
+ TEST_INSTRUCTION("62F67D584C31" , vrcpph(zmm6, word_ptr(ecx)._1to32()));
+ TEST_INSTRUCTION("62F67D484C717F" , vrcpph(zmm6, zmmword_ptr(ecx, 8128)));
+ TEST_INSTRUCTION("62F67DDF4C7280" , k(k7).z().vrcpph(zmm6, word_ptr(edx, -256)._1to32()));
+ TEST_INSTRUCTION("62F655084DF4" , vrcpsh(xmm6, xmm5, xmm4));
+ TEST_INSTRUCTION("62F6550F4DB4F400000010" , k(k7).vrcpsh(xmm6, xmm5, word_ptr(esp, esi, 3, 268435456)));
+ TEST_INSTRUCTION("62F655084D31" , vrcpsh(xmm6, xmm5, word_ptr(ecx)));
+ TEST_INSTRUCTION("62F655084D717F" , vrcpsh(xmm6, xmm5, word_ptr(ecx, 254)));
+ TEST_INSTRUCTION("62F6558F4D7280" , k(k7).z().vrcpsh(xmm6, xmm5, word_ptr(edx, -256)));
+ TEST_INSTRUCTION("62F37C4856F57B" , vreduceph(zmm6, zmm5, 123));
+ TEST_INSTRUCTION("62F37C1856F57B" , sae().vreduceph(zmm6, zmm5, 123));
+ TEST_INSTRUCTION("62F37C4F56B4F4000000107B" , k(k7).vreduceph(zmm6, zmmword_ptr(esp, esi, 3, 268435456), 123));
+ TEST_INSTRUCTION("62F37C5856317B" , vreduceph(zmm6, word_ptr(ecx)._1to32(), 123));
+ TEST_INSTRUCTION("62F37C4856717F7B" , vreduceph(zmm6, zmmword_ptr(ecx, 8128), 123));
+ TEST_INSTRUCTION("62F37CDF5672807B" , k(k7).z().vreduceph(zmm6, word_ptr(edx, -256)._1to32(), 123));
+ TEST_INSTRUCTION("62F3540857F47B" , vreducesh(xmm6, xmm5, xmm4, 123));
+ TEST_INSTRUCTION("62F3541857F47B" , sae().vreducesh(xmm6, xmm5, xmm4, 123));
+ TEST_INSTRUCTION("62F3540F57B4F4000000107B" , k(k7).vreducesh(xmm6, xmm5, word_ptr(esp, esi, 3, 268435456), 123));
+ TEST_INSTRUCTION("62F3540857317B" , vreducesh(xmm6, xmm5, word_ptr(ecx), 123));
+ TEST_INSTRUCTION("62F3540857717F7B" , vreducesh(xmm6, xmm5, word_ptr(ecx, 254), 123));
+ TEST_INSTRUCTION("62F3548F5772807B" , k(k7).z().vreducesh(xmm6, xmm5, word_ptr(edx, -256), 123));
+ TEST_INSTRUCTION("62F37C4808F57B" , vrndscaleph(zmm6, zmm5, 123));
+ TEST_INSTRUCTION("62F37C1808F57B" , sae().vrndscaleph(zmm6, zmm5, 123));
+ TEST_INSTRUCTION("62F37C4F08B4F4000000107B" , k(k7).vrndscaleph(zmm6, zmmword_ptr(esp, esi, 3, 268435456), 123));
+ TEST_INSTRUCTION("62F37C5808317B" , vrndscaleph(zmm6, word_ptr(ecx)._1to32(), 123));
+ TEST_INSTRUCTION("62F37C4808717F7B" , vrndscaleph(zmm6, zmmword_ptr(ecx, 8128), 123));
+ TEST_INSTRUCTION("62F37CDF0872807B" , k(k7).z().vrndscaleph(zmm6, word_ptr(edx, -256)._1to32(), 123));
+ TEST_INSTRUCTION("62F354080AF47B" , vrndscalesh(xmm6, xmm5, xmm4, 123));
+ TEST_INSTRUCTION("62F354180AF47B" , sae().vrndscalesh(xmm6, xmm5, xmm4, 123));
+ TEST_INSTRUCTION("62F3540F0AB4F4000000107B" , k(k7).vrndscalesh(xmm6, xmm5, word_ptr(esp, esi, 3, 268435456), 123));
+ TEST_INSTRUCTION("62F354080A317B" , vrndscalesh(xmm6, xmm5, word_ptr(ecx), 123));
+ TEST_INSTRUCTION("62F354080A717F7B" , vrndscalesh(xmm6, xmm5, word_ptr(ecx, 254), 123));
+ TEST_INSTRUCTION("62F3548F0A72807B" , k(k7).z().vrndscalesh(xmm6, xmm5, word_ptr(edx, -256), 123));
+ TEST_INSTRUCTION("62F67D484EF5" , vrsqrtph(zmm6, zmm5));
+ TEST_INSTRUCTION("62F67D4F4EB4F400000010" , k(k7).vrsqrtph(zmm6, zmmword_ptr(esp, esi, 3, 268435456)));
+ TEST_INSTRUCTION("62F67D584E31" , vrsqrtph(zmm6, word_ptr(ecx)._1to32()));
+ TEST_INSTRUCTION("62F67D484E717F" , vrsqrtph(zmm6, zmmword_ptr(ecx, 8128)));
+ TEST_INSTRUCTION("62F67DDF4E7280" , k(k7).z().vrsqrtph(zmm6, word_ptr(edx, -256)._1to32()));
+ TEST_INSTRUCTION("62F655084FF4" , vrsqrtsh(xmm6, xmm5, xmm4));
+ TEST_INSTRUCTION("62F6550F4FB4F400000010" , k(k7).vrsqrtsh(xmm6, xmm5, word_ptr(esp, esi, 3, 268435456)));
+ TEST_INSTRUCTION("62F655084F31" , vrsqrtsh(xmm6, xmm5, word_ptr(ecx)));
+ TEST_INSTRUCTION("62F655084F717F" , vrsqrtsh(xmm6, xmm5, word_ptr(ecx, 254)));
+ TEST_INSTRUCTION("62F6558F4F7280" , k(k7).z().vrsqrtsh(xmm6, xmm5, word_ptr(edx, -256)));
+ TEST_INSTRUCTION("62F655482CF4" , vscalefph(zmm6, zmm5, zmm4));
+ TEST_INSTRUCTION("62F655182CF4" , rn_sae().vscalefph(zmm6, zmm5, zmm4));
+ TEST_INSTRUCTION("62F6554F2CB4F400000010" , k(k7).vscalefph(zmm6, zmm5, zmmword_ptr(esp, esi, 3, 268435456)));
+ TEST_INSTRUCTION("62F655582C31" , vscalefph(zmm6, zmm5, word_ptr(ecx)._1to32()));
+ TEST_INSTRUCTION("62F655482C717F" , vscalefph(zmm6, zmm5, zmmword_ptr(ecx, 8128)));
+ TEST_INSTRUCTION("62F655DF2C7280" , k(k7).z().vscalefph(zmm6, zmm5, word_ptr(edx, -256)._1to32()));
+ TEST_INSTRUCTION("62F655082DF4" , vscalefsh(xmm6, xmm5, xmm4));
+ TEST_INSTRUCTION("62F655182DF4" , rn_sae().vscalefsh(xmm6, xmm5, xmm4));
+ TEST_INSTRUCTION("62F6550F2DB4F400000010" , k(k7).vscalefsh(xmm6, xmm5, word_ptr(esp, esi, 3, 268435456)));
+ TEST_INSTRUCTION("62F655082D31" , vscalefsh(xmm6, xmm5, word_ptr(ecx)));
+ TEST_INSTRUCTION("62F655082D717F" , vscalefsh(xmm6, xmm5, word_ptr(ecx, 254)));
+ TEST_INSTRUCTION("62F6558F2D7280" , k(k7).z().vscalefsh(xmm6, xmm5, word_ptr(edx, -256)));
+ TEST_INSTRUCTION("62F57C4851F5" , vsqrtph(zmm6, zmm5));
+ TEST_INSTRUCTION("62F57C1851F5" , rn_sae().vsqrtph(zmm6, zmm5));
+ TEST_INSTRUCTION("62F57C4F51B4F400000010" , k(k7).vsqrtph(zmm6, zmmword_ptr(esp, esi, 3, 268435456)));
+ TEST_INSTRUCTION("62F57C585131" , vsqrtph(zmm6, word_ptr(ecx)._1to32()));
+ TEST_INSTRUCTION("62F57C4851717F" , vsqrtph(zmm6, zmmword_ptr(ecx, 8128)));
+ TEST_INSTRUCTION("62F57CDF517280" , k(k7).z().vsqrtph(zmm6, word_ptr(edx, -256)._1to32()));
+ TEST_INSTRUCTION("62F5560851F4" , vsqrtsh(xmm6, xmm5, xmm4));
+ TEST_INSTRUCTION("62F5561851F4" , rn_sae().vsqrtsh(xmm6, xmm5, xmm4));
+ TEST_INSTRUCTION("62F5560F51B4F400000010" , k(k7).vsqrtsh(xmm6, xmm5, word_ptr(esp, esi, 3, 268435456)));
+ TEST_INSTRUCTION("62F556085131" , vsqrtsh(xmm6, xmm5, word_ptr(ecx)));
+ TEST_INSTRUCTION("62F5560851717F" , vsqrtsh(xmm6, xmm5, word_ptr(ecx, 254)));
+ TEST_INSTRUCTION("62F5568F517280" , k(k7).z().vsqrtsh(xmm6, xmm5, word_ptr(edx, -256)));
+ TEST_INSTRUCTION("62F6554898F4" , vfmadd132ph(zmm6, zmm5, zmm4));
+ TEST_INSTRUCTION("62F6551898F4" , rn_sae().vfmadd132ph(zmm6, zmm5, zmm4));
+ TEST_INSTRUCTION("62F6554F98B4F400000010" , k(k7).vfmadd132ph(zmm6, zmm5, zmmword_ptr(esp, esi, 3, 268435456)));
+ TEST_INSTRUCTION("62F655589831" , vfmadd132ph(zmm6, zmm5, word_ptr(ecx)._1to32()));
+ TEST_INSTRUCTION("62F6554898717F" , vfmadd132ph(zmm6, zmm5, zmmword_ptr(ecx, 8128)));
+ TEST_INSTRUCTION("62F655DF987280" , k(k7).z().vfmadd132ph(zmm6, zmm5, word_ptr(edx, -256)._1to32()));
+ TEST_INSTRUCTION("62F6550899F4" , vfmadd132sh(xmm6, xmm5, xmm4));
+ TEST_INSTRUCTION("62F6551899F4" , rn_sae().vfmadd132sh(xmm6, xmm5, xmm4));
+ TEST_INSTRUCTION("62F6550F99B4F400000010" , k(k7).vfmadd132sh(xmm6, xmm5, word_ptr(esp, esi, 3, 268435456)));
+ TEST_INSTRUCTION("62F655089931" , vfmadd132sh(xmm6, xmm5, word_ptr(ecx)));
+ TEST_INSTRUCTION("62F6550899717F" , vfmadd132sh(xmm6, xmm5, word_ptr(ecx, 254)));
+ TEST_INSTRUCTION("62F6558F997280" , k(k7).z().vfmadd132sh(xmm6, xmm5, word_ptr(edx, -256)));
+ TEST_INSTRUCTION("62F65548A8F4" , vfmadd213ph(zmm6, zmm5, zmm4));
+ TEST_INSTRUCTION("62F65518A8F4" , rn_sae().vfmadd213ph(zmm6, zmm5, zmm4));
+ TEST_INSTRUCTION("62F6554FA8B4F400000010" , k(k7).vfmadd213ph(zmm6, zmm5, zmmword_ptr(esp, esi, 3, 268435456)));
+ TEST_INSTRUCTION("62F65558A831" , vfmadd213ph(zmm6, zmm5, word_ptr(ecx)._1to32()));
+ TEST_INSTRUCTION("62F65548A8717F" , vfmadd213ph(zmm6, zmm5, zmmword_ptr(ecx, 8128)));
+ TEST_INSTRUCTION("62F655DFA87280" , k(k7).z().vfmadd213ph(zmm6, zmm5, word_ptr(edx, -256)._1to32()));
+ TEST_INSTRUCTION("62F65508A9F4" , vfmadd213sh(xmm6, xmm5, xmm4));
+ TEST_INSTRUCTION("62F65518A9F4" , rn_sae().vfmadd213sh(xmm6, xmm5, xmm4));
+ TEST_INSTRUCTION("62F6550FA9B4F400000010" , k(k7).vfmadd213sh(xmm6, xmm5, word_ptr(esp, esi, 3, 268435456)));
+ TEST_INSTRUCTION("62F65508A931" , vfmadd213sh(xmm6, xmm5, word_ptr(ecx)));
+ TEST_INSTRUCTION("62F65508A9717F" , vfmadd213sh(xmm6, xmm5, word_ptr(ecx, 254)));
+ TEST_INSTRUCTION("62F6558FA97280" , k(k7).z().vfmadd213sh(xmm6, xmm5, word_ptr(edx, -256)));
+ TEST_INSTRUCTION("62F65548B8F4" , vfmadd231ph(zmm6, zmm5, zmm4));
+ TEST_INSTRUCTION("62F65518B8F4" , rn_sae().vfmadd231ph(zmm6, zmm5, zmm4));
+ TEST_INSTRUCTION("62F6554FB8B4F400000010" , k(k7).vfmadd231ph(zmm6, zmm5, zmmword_ptr(esp, esi, 3, 268435456)));
+ TEST_INSTRUCTION("62F65558B831" , vfmadd231ph(zmm6, zmm5, word_ptr(ecx)._1to32()));
+ TEST_INSTRUCTION("62F65548B8717F" , vfmadd231ph(zmm6, zmm5, zmmword_ptr(ecx, 8128)));
+ TEST_INSTRUCTION("62F655DFB87280" , k(k7).z().vfmadd231ph(zmm6, zmm5, word_ptr(edx, -256)._1to32()));
+ TEST_INSTRUCTION("62F65508B9F4" , vfmadd231sh(xmm6, xmm5, xmm4));
+ TEST_INSTRUCTION("62F65518B9F4" , rn_sae().vfmadd231sh(xmm6, xmm5, xmm4));
+ TEST_INSTRUCTION("62F6550FB9B4F400000010" , k(k7).vfmadd231sh(xmm6, xmm5, word_ptr(esp, esi, 3, 268435456)));
+ TEST_INSTRUCTION("62F65508B931" , vfmadd231sh(xmm6, xmm5, word_ptr(ecx)));
+ TEST_INSTRUCTION("62F65508B9717F" , vfmadd231sh(xmm6, xmm5, word_ptr(ecx, 254)));
+ TEST_INSTRUCTION("62F6558FB97280" , k(k7).z().vfmadd231sh(xmm6, xmm5, word_ptr(edx, -256)));
+ TEST_INSTRUCTION("62F6554896F4" , vfmaddsub132ph(zmm6, zmm5, zmm4));
+ TEST_INSTRUCTION("62F6551896F4" , rn_sae().vfmaddsub132ph(zmm6, zmm5, zmm4));
+ TEST_INSTRUCTION("62F6554F96B4F400000010" , k(k7).vfmaddsub132ph(zmm6, zmm5, zmmword_ptr(esp, esi, 3, 268435456)));
+ TEST_INSTRUCTION("62F655589631" , vfmaddsub132ph(zmm6, zmm5, word_ptr(ecx)._1to32()));
+ TEST_INSTRUCTION("62F6554896717F" , vfmaddsub132ph(zmm6, zmm5, zmmword_ptr(ecx, 8128)));
+ TEST_INSTRUCTION("62F655DF967280" , k(k7).z().vfmaddsub132ph(zmm6, zmm5, word_ptr(edx, -256)._1to32()));
+ TEST_INSTRUCTION("62F65548A6F4" , vfmaddsub213ph(zmm6, zmm5, zmm4));
+ TEST_INSTRUCTION("62F65518A6F4" , rn_sae().vfmaddsub213ph(zmm6, zmm5, zmm4));
+ TEST_INSTRUCTION("62F6554FA6B4F400000010" , k(k7).vfmaddsub213ph(zmm6, zmm5, zmmword_ptr(esp, esi, 3, 268435456)));
+ TEST_INSTRUCTION("62F65558A631" , vfmaddsub213ph(zmm6, zmm5, word_ptr(ecx)._1to32()));
+ TEST_INSTRUCTION("62F65548A6717F" , vfmaddsub213ph(zmm6, zmm5, zmmword_ptr(ecx, 8128)));
+ TEST_INSTRUCTION("62F655DFA67280" , k(k7).z().vfmaddsub213ph(zmm6, zmm5, word_ptr(edx, -256)._1to32()));
+ TEST_INSTRUCTION("62F65548B6F4" , vfmaddsub231ph(zmm6, zmm5, zmm4));
+ TEST_INSTRUCTION("62F65518B6F4" , rn_sae().vfmaddsub231ph(zmm6, zmm5, zmm4));
+ TEST_INSTRUCTION("62F6554FB6B4F400000010" , k(k7).vfmaddsub231ph(zmm6, zmm5, zmmword_ptr(esp, esi, 3, 268435456)));
+ TEST_INSTRUCTION("62F65558B631" , vfmaddsub231ph(zmm6, zmm5, word_ptr(ecx)._1to32()));
+ TEST_INSTRUCTION("62F65548B6717F" , vfmaddsub231ph(zmm6, zmm5, zmmword_ptr(ecx, 8128)));
+ TEST_INSTRUCTION("62F655DFB67280" , k(k7).z().vfmaddsub231ph(zmm6, zmm5, word_ptr(edx, -256)._1to32()));
+ TEST_INSTRUCTION("62F655489AF4" , vfmsub132ph(zmm6, zmm5, zmm4));
+ TEST_INSTRUCTION("62F655189AF4" , rn_sae().vfmsub132ph(zmm6, zmm5, zmm4));
+ TEST_INSTRUCTION("62F6554F9AB4F400000010" , k(k7).vfmsub132ph(zmm6, zmm5, zmmword_ptr(esp, esi, 3, 268435456)));
+ TEST_INSTRUCTION("62F655589A31" , vfmsub132ph(zmm6, zmm5, word_ptr(ecx)._1to32()));
+ TEST_INSTRUCTION("62F655489A717F" , vfmsub132ph(zmm6, zmm5, zmmword_ptr(ecx, 8128)));
+ TEST_INSTRUCTION("62F655DF9A7280" , k(k7).z().vfmsub132ph(zmm6, zmm5, word_ptr(edx, -256)._1to32()));
+ TEST_INSTRUCTION("62F655089BF4" , vfmsub132sh(xmm6, xmm5, xmm4));
+ TEST_INSTRUCTION("62F655189BF4" , rn_sae().vfmsub132sh(xmm6, xmm5, xmm4));
+ TEST_INSTRUCTION("62F6550F9BB4F400000010" , k(k7).vfmsub132sh(xmm6, xmm5, word_ptr(esp, esi, 3, 268435456)));
+ TEST_INSTRUCTION("62F655089B31" , vfmsub132sh(xmm6, xmm5, word_ptr(ecx)));
+ TEST_INSTRUCTION("62F655089B717F" , vfmsub132sh(xmm6, xmm5, word_ptr(ecx, 254)));
+ TEST_INSTRUCTION("62F6558F9B7280" , k(k7).z().vfmsub132sh(xmm6, xmm5, word_ptr(edx, -256)));
+ TEST_INSTRUCTION("62F65548AAF4" , vfmsub213ph(zmm6, zmm5, zmm4));
+ TEST_INSTRUCTION("62F65518AAF4" , rn_sae().vfmsub213ph(zmm6, zmm5, zmm4));
+ TEST_INSTRUCTION("62F6554FAAB4F400000010" , k(k7).vfmsub213ph(zmm6, zmm5, zmmword_ptr(esp, esi, 3, 268435456)));
+ TEST_INSTRUCTION("62F65558AA31" , vfmsub213ph(zmm6, zmm5, word_ptr(ecx)._1to32()));
+ TEST_INSTRUCTION("62F65548AA717F" , vfmsub213ph(zmm6, zmm5, zmmword_ptr(ecx, 8128)));
+ TEST_INSTRUCTION("62F655DFAA7280" , k(k7).z().vfmsub213ph(zmm6, zmm5, word_ptr(edx, -256)._1to32()));
+ TEST_INSTRUCTION("62F65508ABF4" , vfmsub213sh(xmm6, xmm5, xmm4));
+ TEST_INSTRUCTION("62F65518ABF4" , rn_sae().vfmsub213sh(xmm6, xmm5, xmm4));
+ TEST_INSTRUCTION("62F6550FABB4F400000010" , k(k7).vfmsub213sh(xmm6, xmm5, word_ptr(esp, esi, 3, 268435456)));
+ TEST_INSTRUCTION("62F65508AB31" , vfmsub213sh(xmm6, xmm5, word_ptr(ecx)));
+ TEST_INSTRUCTION("62F65508AB717F" , vfmsub213sh(xmm6, xmm5, word_ptr(ecx, 254)));
+ TEST_INSTRUCTION("62F6558FAB7280" , k(k7).z().vfmsub213sh(xmm6, xmm5, word_ptr(edx, -256)));
+ TEST_INSTRUCTION("62F65548BAF4" , vfmsub231ph(zmm6, zmm5, zmm4));
+ TEST_INSTRUCTION("62F65518BAF4" , rn_sae().vfmsub231ph(zmm6, zmm5, zmm4));
+ TEST_INSTRUCTION("62F6554FBAB4F400000010" , k(k7).vfmsub231ph(zmm6, zmm5, zmmword_ptr(esp, esi, 3, 268435456)));
+ TEST_INSTRUCTION("62F65558BA31" , vfmsub231ph(zmm6, zmm5, word_ptr(ecx)._1to32()));
+ TEST_INSTRUCTION("62F65548BA717F" , vfmsub231ph(zmm6, zmm5, zmmword_ptr(ecx, 8128)));
+ TEST_INSTRUCTION("62F655DFBA7280" , k(k7).z().vfmsub231ph(zmm6, zmm5, word_ptr(edx, -256)._1to32()));
+ TEST_INSTRUCTION("62F65508BBF4" , vfmsub231sh(xmm6, xmm5, xmm4));
+ TEST_INSTRUCTION("62F65518BBF4" , rn_sae().vfmsub231sh(xmm6, xmm5, xmm4));
+ TEST_INSTRUCTION("62F6550FBBB4F400000010" , k(k7).vfmsub231sh(xmm6, xmm5, word_ptr(esp, esi, 3, 268435456)));
+ TEST_INSTRUCTION("62F65508BB31" , vfmsub231sh(xmm6, xmm5, word_ptr(ecx)));
+ TEST_INSTRUCTION("62F65508BB717F" , vfmsub231sh(xmm6, xmm5, word_ptr(ecx, 254)));
+ TEST_INSTRUCTION("62F6558FBB7280" , k(k7).z().vfmsub231sh(xmm6, xmm5, word_ptr(edx, -256)));
+ TEST_INSTRUCTION("62F6554897F4" , vfmsubadd132ph(zmm6, zmm5, zmm4));
+ TEST_INSTRUCTION("62F6551897F4" , rn_sae().vfmsubadd132ph(zmm6, zmm5, zmm4));
+ TEST_INSTRUCTION("62F6554F97B4F400000010" , k(k7).vfmsubadd132ph(zmm6, zmm5, zmmword_ptr(esp, esi, 3, 268435456)));
+ TEST_INSTRUCTION("62F655589731" , vfmsubadd132ph(zmm6, zmm5, word_ptr(ecx)._1to32()));
+ TEST_INSTRUCTION("62F6554897717F" , vfmsubadd132ph(zmm6, zmm5, zmmword_ptr(ecx, 8128)));
+ TEST_INSTRUCTION("62F655DF977280" , k(k7).z().vfmsubadd132ph(zmm6, zmm5, word_ptr(edx, -256)._1to32()));
+ TEST_INSTRUCTION("62F65548A7F4" , vfmsubadd213ph(zmm6, zmm5, zmm4));
+ TEST_INSTRUCTION("62F65518A7F4" , rn_sae().vfmsubadd213ph(zmm6, zmm5, zmm4));
+ TEST_INSTRUCTION("62F6554FA7B4F400000010" , k(k7).vfmsubadd213ph(zmm6, zmm5, zmmword_ptr(esp, esi, 3, 268435456)));
+ TEST_INSTRUCTION("62F65558A731" , vfmsubadd213ph(zmm6, zmm5, word_ptr(ecx)._1to32()));
+ TEST_INSTRUCTION("62F65548A7717F" , vfmsubadd213ph(zmm6, zmm5, zmmword_ptr(ecx, 8128)));
+ TEST_INSTRUCTION("62F655DFA77280" , k(k7).z().vfmsubadd213ph(zmm6, zmm5, word_ptr(edx, -256)._1to32()));
+ TEST_INSTRUCTION("62F65548B7F4" , vfmsubadd231ph(zmm6, zmm5, zmm4));
+ TEST_INSTRUCTION("62F65518B7F4" , rn_sae().vfmsubadd231ph(zmm6, zmm5, zmm4));
+ TEST_INSTRUCTION("62F6554FB7B4F400000010" , k(k7).vfmsubadd231ph(zmm6, zmm5, zmmword_ptr(esp, esi, 3, 268435456)));
+ TEST_INSTRUCTION("62F65558B731" , vfmsubadd231ph(zmm6, zmm5, word_ptr(ecx)._1to32()));
+ TEST_INSTRUCTION("62F65548B7717F" , vfmsubadd231ph(zmm6, zmm5, zmmword_ptr(ecx, 8128)));
+ TEST_INSTRUCTION("62F655DFB77280" , k(k7).z().vfmsubadd231ph(zmm6, zmm5, word_ptr(edx, -256)._1to32()));
+ TEST_INSTRUCTION("62F655489CF4" , vfnmadd132ph(zmm6, zmm5, zmm4));
+ TEST_INSTRUCTION("62F655189CF4" , rn_sae().vfnmadd132ph(zmm6, zmm5, zmm4));
+ TEST_INSTRUCTION("62F6554F9CB4F400000010" , k(k7).vfnmadd132ph(zmm6, zmm5, zmmword_ptr(esp, esi, 3, 268435456)));
+ TEST_INSTRUCTION("62F655589C31" , vfnmadd132ph(zmm6, zmm5, word_ptr(ecx)._1to32()));
+ TEST_INSTRUCTION("62F655489C717F" , vfnmadd132ph(zmm6, zmm5, zmmword_ptr(ecx, 8128)));
+ TEST_INSTRUCTION("62F655DF9C7280" , k(k7).z().vfnmadd132ph(zmm6, zmm5, word_ptr(edx, -256)._1to32()));
+ TEST_INSTRUCTION("62F655089DF4" , vfnmadd132sh(xmm6, xmm5, xmm4));
+ TEST_INSTRUCTION("62F655189DF4" , rn_sae().vfnmadd132sh(xmm6, xmm5, xmm4));
+ TEST_INSTRUCTION("62F6550F9DB4F400000010" , k(k7).vfnmadd132sh(xmm6, xmm5, word_ptr(esp, esi, 3, 268435456)));
+ TEST_INSTRUCTION("62F655089D31" , vfnmadd132sh(xmm6, xmm5, word_ptr(ecx)));
+ TEST_INSTRUCTION("62F655089D717F" , vfnmadd132sh(xmm6, xmm5, word_ptr(ecx, 254)));
+ TEST_INSTRUCTION("62F6558F9D7280" , k(k7).z().vfnmadd132sh(xmm6, xmm5, word_ptr(edx, -256)));
+ TEST_INSTRUCTION("62F65548ACF4" , vfnmadd213ph(zmm6, zmm5, zmm4));
+ TEST_INSTRUCTION("62F65518ACF4" , rn_sae().vfnmadd213ph(zmm6, zmm5, zmm4));
+ TEST_INSTRUCTION("62F6554FACB4F400000010" , k(k7).vfnmadd213ph(zmm6, zmm5, zmmword_ptr(esp, esi, 3, 268435456)));
+ TEST_INSTRUCTION("62F65558AC31" , vfnmadd213ph(zmm6, zmm5, word_ptr(ecx)._1to32()));
+ TEST_INSTRUCTION("62F65548AC717F" , vfnmadd213ph(zmm6, zmm5, zmmword_ptr(ecx, 8128)));
+ TEST_INSTRUCTION("62F655DFAC7280" , k(k7).z().vfnmadd213ph(zmm6, zmm5, word_ptr(edx, -256)._1to32()));
+ TEST_INSTRUCTION("62F65508ADF4" , vfnmadd213sh(xmm6, xmm5, xmm4));
+ TEST_INSTRUCTION("62F65518ADF4" , rn_sae().vfnmadd213sh(xmm6, xmm5, xmm4));
+ TEST_INSTRUCTION("62F6550FADB4F400000010" , k(k7).vfnmadd213sh(xmm6, xmm5, word_ptr(esp, esi, 3, 268435456)));
+ TEST_INSTRUCTION("62F65508AD31" , vfnmadd213sh(xmm6, xmm5, word_ptr(ecx)));
+ TEST_INSTRUCTION("62F65508AD717F" , vfnmadd213sh(xmm6, xmm5, word_ptr(ecx, 254)));
+ TEST_INSTRUCTION("62F6558FAD7280" , k(k7).z().vfnmadd213sh(xmm6, xmm5, word_ptr(edx, -256)));
+ TEST_INSTRUCTION("62F65548BCF4" , vfnmadd231ph(zmm6, zmm5, zmm4));
+ TEST_INSTRUCTION("62F65518BCF4" , rn_sae().vfnmadd231ph(zmm6, zmm5, zmm4));
+ TEST_INSTRUCTION("62F6554FBCB4F400000010" , k(k7).vfnmadd231ph(zmm6, zmm5, zmmword_ptr(esp, esi, 3, 268435456)));
+ TEST_INSTRUCTION("62F65558BC31" , vfnmadd231ph(zmm6, zmm5, word_ptr(ecx)._1to32()));
+ TEST_INSTRUCTION("62F65548BC717F" , vfnmadd231ph(zmm6, zmm5, zmmword_ptr(ecx, 8128)));
+ TEST_INSTRUCTION("62F655DFBC7280" , k(k7).z().vfnmadd231ph(zmm6, zmm5, word_ptr(edx, -256)._1to32()));
+ TEST_INSTRUCTION("62F65508BDF4" , vfnmadd231sh(xmm6, xmm5, xmm4));
+ TEST_INSTRUCTION("62F65518BDF4" , rn_sae().vfnmadd231sh(xmm6, xmm5, xmm4));
+ TEST_INSTRUCTION("62F6550FBDB4F400000010" , k(k7).vfnmadd231sh(xmm6, xmm5, word_ptr(esp, esi, 3, 268435456)));
+ TEST_INSTRUCTION("62F65508BD31" , vfnmadd231sh(xmm6, xmm5, word_ptr(ecx)));
+ TEST_INSTRUCTION("62F65508BD717F" , vfnmadd231sh(xmm6, xmm5, word_ptr(ecx, 254)));
+ TEST_INSTRUCTION("62F6558FBD7280" , k(k7).z().vfnmadd231sh(xmm6, xmm5, word_ptr(edx, -256)));
+ TEST_INSTRUCTION("62F655489EF4" , vfnmsub132ph(zmm6, zmm5, zmm4));
+ TEST_INSTRUCTION("62F655189EF4" , rn_sae().vfnmsub132ph(zmm6, zmm5, zmm4));
+ TEST_INSTRUCTION("62F6554F9EB4F400000010" , k(k7).vfnmsub132ph(zmm6, zmm5, zmmword_ptr(esp, esi, 3, 268435456)));
+ TEST_INSTRUCTION("62F655589E31" , vfnmsub132ph(zmm6, zmm5, word_ptr(ecx)._1to32()));
+ TEST_INSTRUCTION("62F655489E717F" , vfnmsub132ph(zmm6, zmm5, zmmword_ptr(ecx, 8128)));
+ TEST_INSTRUCTION("62F655DF9E7280" , k(k7).z().vfnmsub132ph(zmm6, zmm5, word_ptr(edx, -256)._1to32()));
+ TEST_INSTRUCTION("62F655089FF4" , vfnmsub132sh(xmm6, xmm5, xmm4));
+ TEST_INSTRUCTION("62F655189FF4" , rn_sae().vfnmsub132sh(xmm6, xmm5, xmm4));
+ TEST_INSTRUCTION("62F6550F9FB4F400000010" , k(k7).vfnmsub132sh(xmm6, xmm5, word_ptr(esp, esi, 3, 268435456)));
+ TEST_INSTRUCTION("62F655089F31" , vfnmsub132sh(xmm6, xmm5, word_ptr(ecx)));
+ TEST_INSTRUCTION("62F655089F717F" , vfnmsub132sh(xmm6, xmm5, word_ptr(ecx, 254)));
+ TEST_INSTRUCTION("62F6558F9F7280" , k(k7).z().vfnmsub132sh(xmm6, xmm5, word_ptr(edx, -256)));
+ TEST_INSTRUCTION("62F65548AEF4" , vfnmsub213ph(zmm6, zmm5, zmm4));
+ TEST_INSTRUCTION("62F65518AEF4" , rn_sae().vfnmsub213ph(zmm6, zmm5, zmm4));
+ TEST_INSTRUCTION("62F6554FAEB4F400000010" , k(k7).vfnmsub213ph(zmm6, zmm5, zmmword_ptr(esp, esi, 3, 268435456)));
+ TEST_INSTRUCTION("62F65558AE31" , vfnmsub213ph(zmm6, zmm5, word_ptr(ecx)._1to32()));
+ TEST_INSTRUCTION("62F65548AE717F" , vfnmsub213ph(zmm6, zmm5, zmmword_ptr(ecx, 8128)));
+ TEST_INSTRUCTION("62F655DFAE7280" , k(k7).z().vfnmsub213ph(zmm6, zmm5, word_ptr(edx, -256)._1to32()));
+ TEST_INSTRUCTION("62F65508AFF4" , vfnmsub213sh(xmm6, xmm5, xmm4));
+ TEST_INSTRUCTION("62F65518AFF4" , rn_sae().vfnmsub213sh(xmm6, xmm5, xmm4));
+ TEST_INSTRUCTION("62F6550FAFB4F400000010" , k(k7).vfnmsub213sh(xmm6, xmm5, word_ptr(esp, esi, 3, 268435456)));
+ TEST_INSTRUCTION("62F65508AF31" , vfnmsub213sh(xmm6, xmm5, word_ptr(ecx)));
+ TEST_INSTRUCTION("62F65508AF717F" , vfnmsub213sh(xmm6, xmm5, word_ptr(ecx, 254)));
+ TEST_INSTRUCTION("62F6558FAF7280" , k(k7).z().vfnmsub213sh(xmm6, xmm5, word_ptr(edx, -256)));
+ TEST_INSTRUCTION("62F65548BEF4" , vfnmsub231ph(zmm6, zmm5, zmm4));
+ TEST_INSTRUCTION("62F65518BEF4" , rn_sae().vfnmsub231ph(zmm6, zmm5, zmm4));
+ TEST_INSTRUCTION("62F6554FBEB4F400000010" , k(k7).vfnmsub231ph(zmm6, zmm5, zmmword_ptr(esp, esi, 3, 268435456)));
+ TEST_INSTRUCTION("62F65558BE31" , vfnmsub231ph(zmm6, zmm5, word_ptr(ecx)._1to32()));
+ TEST_INSTRUCTION("62F65548BE717F" , vfnmsub231ph(zmm6, zmm5, zmmword_ptr(ecx, 8128)));
+ TEST_INSTRUCTION("62F655DFBE7280" , k(k7).z().vfnmsub231ph(zmm6, zmm5, word_ptr(edx, -256)._1to32()));
+ TEST_INSTRUCTION("62F65508BFF4" , vfnmsub231sh(xmm6, xmm5, xmm4));
+ TEST_INSTRUCTION("62F65518BFF4" , rn_sae().vfnmsub231sh(xmm6, xmm5, xmm4));
+ TEST_INSTRUCTION("62F6550FBFB4F400000010" , k(k7).vfnmsub231sh(xmm6, xmm5, word_ptr(esp, esi, 3, 268435456)));
+ TEST_INSTRUCTION("62F65508BF31" , vfnmsub231sh(xmm6, xmm5, word_ptr(ecx)));
+ TEST_INSTRUCTION("62F65508BF717F" , vfnmsub231sh(xmm6, xmm5, word_ptr(ecx, 254)));
+ TEST_INSTRUCTION("62F6558FBF7280" , k(k7).z().vfnmsub231sh(xmm6, xmm5, word_ptr(edx, -256)));
+ TEST_INSTRUCTION("62F6574856F4" , vfcmaddcph(zmm6, zmm5, zmm4));
+ TEST_INSTRUCTION("62F6571856F4" , rn_sae().vfcmaddcph(zmm6, zmm5, zmm4));
+ TEST_INSTRUCTION("62F6574F56B4F400000010" , k(k7).vfcmaddcph(zmm6, zmm5, zmmword_ptr(esp, esi, 3, 268435456)));
+ TEST_INSTRUCTION("62F657585631" , vfcmaddcph(zmm6, zmm5, dword_ptr(ecx)._1to16()));
+ TEST_INSTRUCTION("62F6574856717F" , vfcmaddcph(zmm6, zmm5, zmmword_ptr(ecx, 8128)));
+ TEST_INSTRUCTION("62F657DF567280" , k(k7).z().vfcmaddcph(zmm6, zmm5, dword_ptr(edx, -512)._1to16()));
+ TEST_INSTRUCTION("62F6570857F4" , vfcmaddcsh(xmm6, xmm5, xmm4));
+ TEST_INSTRUCTION("62F6571857F4" , rn_sae().vfcmaddcsh(xmm6, xmm5, xmm4));
+ TEST_INSTRUCTION("62F6570F57B4F400000010" , k(k7).vfcmaddcsh(xmm6, xmm5, dword_ptr(esp, esi, 3, 268435456)));
+ TEST_INSTRUCTION("62F657085731" , vfcmaddcsh(xmm6, xmm5, dword_ptr(ecx)));
+ TEST_INSTRUCTION("62F6570857717F" , vfcmaddcsh(xmm6, xmm5, dword_ptr(ecx, 508)));
+ TEST_INSTRUCTION("62F6578F577280" , k(k7).z().vfcmaddcsh(xmm6, xmm5, dword_ptr(edx, -512)));
+ TEST_INSTRUCTION("62F65748D6F4" , vfcmulcph(zmm6, zmm5, zmm4));
+ TEST_INSTRUCTION("62F65718D6F4" , rn_sae().vfcmulcph(zmm6, zmm5, zmm4));
+ TEST_INSTRUCTION("62F6574FD6B4F400000010" , k(k7).vfcmulcph(zmm6, zmm5, zmmword_ptr(esp, esi, 3, 268435456)));
+ TEST_INSTRUCTION("62F65758D631" , vfcmulcph(zmm6, zmm5, dword_ptr(ecx)._1to16()));
+ TEST_INSTRUCTION("62F65748D6717F" , vfcmulcph(zmm6, zmm5, zmmword_ptr(ecx, 8128)));
+ TEST_INSTRUCTION("62F657DFD67280" , k(k7).z().vfcmulcph(zmm6, zmm5, dword_ptr(edx, -512)._1to16()));
+ TEST_INSTRUCTION("62F65708D7F4" , vfcmulcsh(xmm6, xmm5, xmm4));
+ TEST_INSTRUCTION("62F65718D7F4" , rn_sae().vfcmulcsh(xmm6, xmm5, xmm4));
+ TEST_INSTRUCTION("62F6570FD7B4F400000010" , k(k7).vfcmulcsh(xmm6, xmm5, dword_ptr(esp, esi, 3, 268435456)));
+ TEST_INSTRUCTION("62F65708D731" , vfcmulcsh(xmm6, xmm5, dword_ptr(ecx)));
+ TEST_INSTRUCTION("62F65708D7717F" , vfcmulcsh(xmm6, xmm5, dword_ptr(ecx, 508)));
+ TEST_INSTRUCTION("62F6578FD77280" , k(k7).z().vfcmulcsh(xmm6, xmm5, dword_ptr(edx, -512)));
+ TEST_INSTRUCTION("62F6564856F4" , vfmaddcph(zmm6, zmm5, zmm4));
+ TEST_INSTRUCTION("62F6561856F4" , rn_sae().vfmaddcph(zmm6, zmm5, zmm4));
+ TEST_INSTRUCTION("62F6564F56B4F400000010" , k(k7).vfmaddcph(zmm6, zmm5, zmmword_ptr(esp, esi, 3, 268435456)));
+ TEST_INSTRUCTION("62F656585631" , vfmaddcph(zmm6, zmm5, dword_ptr(ecx)._1to16()));
+ TEST_INSTRUCTION("62F6564856717F" , vfmaddcph(zmm6, zmm5, zmmword_ptr(ecx, 8128)));
+ TEST_INSTRUCTION("62F656DF567280" , k(k7).z().vfmaddcph(zmm6, zmm5, dword_ptr(edx, -512)._1to16()));
+ TEST_INSTRUCTION("62F6560857F4" , vfmaddcsh(xmm6, xmm5, xmm4));
+ TEST_INSTRUCTION("62F6561857F4" , rn_sae().vfmaddcsh(xmm6, xmm5, xmm4));
+ TEST_INSTRUCTION("62F6560F57B4F400000010" , k(k7).vfmaddcsh(xmm6, xmm5, dword_ptr(esp, esi, 3, 268435456)));
+ TEST_INSTRUCTION("62F656085731" , vfmaddcsh(xmm6, xmm5, dword_ptr(ecx)));
+ TEST_INSTRUCTION("62F6560857717F" , vfmaddcsh(xmm6, xmm5, dword_ptr(ecx, 508)));
+ TEST_INSTRUCTION("62F6568F577280" , k(k7).z().vfmaddcsh(xmm6, xmm5, dword_ptr(edx, -512)));
+ TEST_INSTRUCTION("62F65648D6F4" , vfmulcph(zmm6, zmm5, zmm4));
+ TEST_INSTRUCTION("62F65618D6F4" , rn_sae().vfmulcph(zmm6, zmm5, zmm4));
+ TEST_INSTRUCTION("62F6564FD6B4F400000010" , k(k7).vfmulcph(zmm6, zmm5, zmmword_ptr(esp, esi, 3, 268435456)));
+ TEST_INSTRUCTION("62F65658D631" , vfmulcph(zmm6, zmm5, dword_ptr(ecx)._1to16()));
+ TEST_INSTRUCTION("62F65648D6717F" , vfmulcph(zmm6, zmm5, zmmword_ptr(ecx, 8128)));
+ TEST_INSTRUCTION("62F656DFD67280" , k(k7).z().vfmulcph(zmm6, zmm5, dword_ptr(edx, -512)._1to16()));
+ TEST_INSTRUCTION("62F65608D7F4" , vfmulcsh(xmm6, xmm5, xmm4));
+ TEST_INSTRUCTION("62F65618D7F4" , rn_sae().vfmulcsh(xmm6, xmm5, xmm4));
+ TEST_INSTRUCTION("62F6560FD7B4F400000010" , k(k7).vfmulcsh(xmm6, xmm5, dword_ptr(esp, esi, 3, 268435456)));
+ TEST_INSTRUCTION("62F65608D731" , vfmulcsh(xmm6, xmm5, dword_ptr(ecx)));
+ TEST_INSTRUCTION("62F65608D7717F" , vfmulcsh(xmm6, xmm5, dword_ptr(ecx, 508)));
+ TEST_INSTRUCTION("62F6568FD77280" , k(k7).z().vfmulcsh(xmm6, xmm5, dword_ptr(edx, -512)));
+}
+
+static void ASMJIT_NOINLINE testX86AssemblerExtras(AssemblerTester<x86::Assembler>& tester) noexcept {
+ using namespace x86;
+
+ // Extended X86 tests.
+ TEST_INSTRUCTION("66050201" , add(ax, 0x0102));
+ TEST_INSTRUCTION("6603849004030201" , add(ax, ptr(eax, edx, 2, 0x01020304)));
+ TEST_INSTRUCTION("0504030201" , add(eax, 0x01020304));
+ TEST_INSTRUCTION("67668D00" , lea(ax, ptr(bx, si)));
+ TEST_INSTRUCTION("67668D01" , lea(ax, ptr(bx, di)));
+ TEST_INSTRUCTION("67668D02" , lea(ax, ptr(bp, si)));
+ TEST_INSTRUCTION("67668D03" , lea(ax, ptr(bp, di)));
+ TEST_INSTRUCTION("67668D04" , lea(ax, ptr(si)));
+ TEST_INSTRUCTION("67668D05" , lea(ax, ptr(di)));
+ TEST_INSTRUCTION("67668D4600" , lea(ax, ptr(bp)));
+ TEST_INSTRUCTION("67668D07" , lea(ax, ptr(bx)));
+ TEST_INSTRUCTION("67668D4010" , lea(ax, ptr(bx, si, 0, 0x10)));
+ TEST_INSTRUCTION("67668D4120" , lea(ax, ptr(bx, di, 0, 0x20)));
+ TEST_INSTRUCTION("67668D4240" , lea(ax, ptr(bp, si, 0, 0x40)));
+ TEST_INSTRUCTION("67668D4360" , lea(ax, ptr(bp, di, 0, 0x60)));
+ TEST_INSTRUCTION("67668D848000" , lea(ax, ptr(si, 0x80)));
+ TEST_INSTRUCTION("67668D85A000" , lea(ax, ptr(di, 0xA0)));
+ TEST_INSTRUCTION("67668D86C000" , lea(ax, ptr(bp, 0xC0)));
+ TEST_INSTRUCTION("67668D87FF01" , lea(ax, ptr(bx, 0x01FF)));
+ TEST_INSTRUCTION("678D00" , lea(eax, ptr(bx, si)));
+ TEST_INSTRUCTION("678D01" , lea(eax, ptr(bx, di)));
+ TEST_INSTRUCTION("8D0433" , lea(eax, ptr(ebx, esi)));
+ TEST_INSTRUCTION("8D043B" , lea(eax, ptr(ebx, edi)));
+ TEST_INSTRUCTION("8D0500000000" , lea(eax, ptr(0)));
+ TEST_INSTRUCTION("B8FFFFFFFF" , mov(eax, 0xFFFFFFFF));
+ TEST_INSTRUCTION("8B10" , mov(edx, ptr(eax)));
+ TEST_INSTRUCTION("8B10" , mov(edx, ptr(eax, 0)));
+ TEST_INSTRUCTION("8B9080000000" , mov(edx, ptr(eax, 128)));
+ TEST_INSTRUCTION("8B1408" , mov(edx, ptr(eax, ecx)));
+ TEST_INSTRUCTION("8B940880000000" , mov(edx, ptr(eax, ecx, 0, 128)));
+ TEST_INSTRUCTION("8B1408" , mov(edx, ptr(eax, ecx)));
+ TEST_INSTRUCTION("8B544820" , mov(edx, ptr(eax, ecx, 1, 32)));
+ TEST_INSTRUCTION("8B548840" , mov(edx, ptr(eax, ecx, 2, 64)));
+ TEST_INSTRUCTION("8B94C800010000" , mov(edx, ptr(eax, ecx, 3, 128 + 128)));
+ TEST_INSTRUCTION("8B1408" , mov(edx, ptr(eax, ecx)));
+ TEST_INSTRUCTION("8B940880000000" , mov(edx, ptr(eax, ecx, 0, 128)));
+ TEST_INSTRUCTION("8B1408" , mov(edx, ptr(eax, ecx)));
+ TEST_INSTRUCTION("8B544820" , mov(edx, ptr(eax, ecx, 1, 32)));
+ TEST_INSTRUCTION("8B54C802" , mov(edx, ptr(eax, ecx, 3, 2)));
+ TEST_INSTRUCTION("0F20C0" , mov(eax, cr0));
+ TEST_INSTRUCTION("F00F20C0" , mov(eax, cr8));
+ TEST_INSTRUCTION("A344332211" , mov(ptr(0x11223344), eax));
+ TEST_INSTRUCTION("890544332211" , mod_mr().mov(ptr(0x11223344), eax));
+ TEST_INSTRUCTION("891D44332211" , mov(ptr(0x11223344), ebx));
+ TEST_INSTRUCTION("0FBE07" , movsx(eax, byte_ptr(edi)));
+ TEST_INSTRUCTION("0FBF07" , movsx(eax, word_ptr(edi)));
+ TEST_INSTRUCTION("0FB607" , movzx(eax, byte_ptr(edi)));
+ TEST_INSTRUCTION("0FB6C6" , movzx(eax, dh));
+ TEST_INSTRUCTION("0FB707" , movzx(eax, word_ptr(edi)));
+ TEST_INSTRUCTION("0F95C3" , setnz(bl));
+ TEST_INSTRUCTION("0F94C7" , setz(bh));
+ TEST_INSTRUCTION("F600FF" , test(byte_ptr(eax), 0xFF));
+ TEST_INSTRUCTION("66F700FF00" , test(word_ptr(eax), 0xFF));
+ TEST_INSTRUCTION("F700FF000000" , test(dword_ptr(eax), 0xFF));
+ TEST_INSTRUCTION("A836" , test(al, 0x36));
+ TEST_INSTRUCTION("F6C436" , test(ah, 0x36));
+ TEST_INSTRUCTION("50" , push(eax));
+ TEST_INSTRUCTION("51" , push(ecx));
+ TEST_INSTRUCTION("52" , push(edx));
+ TEST_INSTRUCTION("53" , push(ebx));
+ TEST_INSTRUCTION("54" , push(esp));
+ TEST_INSTRUCTION("55" , push(ebp));
+ TEST_INSTRUCTION("56" , push(esi));
+ TEST_INSTRUCTION("57" , push(edi));
+ TEST_INSTRUCTION("0E" , push(cs));
+ TEST_INSTRUCTION("16" , push(ss));
+ TEST_INSTRUCTION("1E" , push(ds));
+ TEST_INSTRUCTION("06" , push(es));
+ TEST_INSTRUCTION("0FA0" , push(fs));
+ TEST_INSTRUCTION("0FA8" , push(gs));
+ TEST_INSTRUCTION("C8010002" , enter(1, 2));
+ TEST_INSTRUCTION("FF10" , call(ptr(eax)));
+ TEST_INSTRUCTION("FF10" , call(dword_ptr(eax)));
+ TEST_INSTRUCTION("6690" , xchg(ax, ax));
+ TEST_INSTRUCTION("90" , xchg(eax, eax));
+
+ TEST_INSTRUCTION("F00118" , lock().add(ptr(eax), ebx));
+ TEST_INSTRUCTION("F00FC138" , lock().xadd(ptr(eax), edi));
+ TEST_INSTRUCTION("F2F00108" , xacquire().lock().add(dword_ptr(eax), ecx));
+ TEST_INSTRUCTION("F3F00108" , xrelease().lock().add(dword_ptr(eax), ecx));
+
+ // MOD RM & MR tests.
+ TEST_INSTRUCTION("01CB" , mod_mr().add(ebx, ecx));
+ TEST_INSTRUCTION("03D9" , mod_rm().add(ebx, ecx));
+ TEST_INSTRUCTION("88C4" , mod_mr().mov(ah, al));
+ TEST_INSTRUCTION("88C6" , mod_mr().mov(dh, al));
+ TEST_INSTRUCTION("89D8" , mod_mr().mov(eax, ebx));
+ TEST_INSTRUCTION("8AE0" , mod_rm().mov(ah, al));
+ TEST_INSTRUCTION("8AF0" , mod_rm().mov(dh, al));
+ TEST_INSTRUCTION("8BC3" , mod_rm().mov(eax, ebx));
+
+ // FPU.
+ TEST_INSTRUCTION("9B" , fwait());
+ TEST_INSTRUCTION("D800" , fadd(dword_ptr(eax)));
+ TEST_INSTRUCTION("DC00" , fadd(qword_ptr(eax)));
+
+ // AVX & AVX512.
+ TEST_INSTRUCTION("62F17D086EC0" , evex().vmovd(xmm0, eax));
+ TEST_INSTRUCTION("62F17D087EC0" , evex().vmovd(eax, xmm0));
+ TEST_INSTRUCTION("62F1F5D95800" , k(k1).z().vaddpd(zmm0, zmm1, ptr(eax)._1to8()));
+ TEST_INSTRUCTION("62F1748858C2" , z().vaddps(xmm0, xmm1, xmm2));
+ TEST_INSTRUCTION("62F1748958C2" , k(k1).z().vaddps(xmm0, xmm1, xmm2));
+ TEST_INSTRUCTION("62F16C4FC25498040F" , k(k7).vcmpps(k2, zmm2, zmmword_ptr(eax, ebx, 2, 256), 15));
+ TEST_INSTRUCTION("62F16C5FC25498400F" , k(k7).vcmpps(k2, zmm2, dword_ptr(eax, ebx, 2, 256)._1to16(), 15));
+ TEST_INSTRUCTION("C4E2F990040500000000" , vpgatherdq(xmm0, ptr(0, xmm0), xmm0));
+ TEST_INSTRUCTION("C4E2FD91040500000000" , vpgatherqq(ymm0, ptr(0, ymm0), ymm0));
+ TEST_INSTRUCTION("C4E2E9920C00" , vgatherdpd(xmm1, ptr(eax, xmm0), xmm2));
+ TEST_INSTRUCTION("62F26D48CF4C1101" , vgf2p8mulb(zmm1, zmm2, zmmword_ptr(ecx, edx, 0, 64)));
+ TEST_INSTRUCTION("62F3ED48CE4C11010F" , vgf2p8affineqb(zmm1, zmm2, zmmword_ptr(ecx, edx, 0, 64), 15));
+ TEST_INSTRUCTION("62F3ED48CF4C11010F" , vgf2p8affineinvqb(zmm1, zmm2, zmmword_ptr(ecx, edx, 0, 64), 15));
+ TEST_INSTRUCTION("62F2674868246D00F8FFFF" , vp2intersectd(k4, k5, zmm3, zmmword_ptr(0xFFFFF800, ebp, 1)));
+
+ // AVX_VNNI & AVX512_VNNI.
+ TEST_INSTRUCTION("C4E25550F4" , vex().vpdpbusd(ymm6, ymm5, ymm4));
+ TEST_INSTRUCTION("62F2552850F4" , vpdpbusd(ymm6, ymm5, ymm4));
+}
+
+bool testX86Assembler(const TestSettings& settings) noexcept {
+ using namespace x86;
+
+ AssemblerTester<Assembler> tester(Arch::kX86, settings);
+ tester.printHeader("X86");
+
+ testX86AssemblerBase(tester);
+ testX86AssemblerMMX_SSE(tester);
+ testX86AssemblerAVX(tester);
+ testX86AssemblerAVX512_FP16(tester);
+ testX86AssemblerExtras(tester);
+
+ tester.printSummary();
+ return tester.didPass();
+}
+
+#undef TEST_INSTRUCTION
+
+#endif // !ASMJIT_NO_X86
diff --git a/3rdparty/asmjit/test/asmjit_test_compiler.cpp b/3rdparty/asmjit/test/asmjit_test_compiler.cpp
new file mode 100644
index 00000000000..f2bc306c6df
--- /dev/null
+++ b/3rdparty/asmjit/test/asmjit_test_compiler.cpp
@@ -0,0 +1,253 @@
+// This file is part of AsmJit project <https://asmjit.com>
+//
+// See asmjit.h or LICENSE.md for license and copyright information
+// SPDX-License-Identifier: Zlib
+
+#include <asmjit/core.h>
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include <memory>
+#include <vector>
+#include <chrono>
+
+#include "cmdline.h"
+#include "asmjitutils.h"
+#include "performancetimer.h"
+
+#include "asmjit_test_compiler.h"
+
+#if !defined(ASMJIT_NO_X86) && ASMJIT_ARCH_X86
+#include <asmjit/x86.h>
+void compiler_add_x86_tests(TestApp& app);
+#endif
+
+#if !defined(ASMJIT_NO_AARCH64) && ASMJIT_ARCH_ARM == 64
+#include <asmjit/a64.h>
+void compiler_add_a64_tests(TestApp& app);
+#endif
+
+#if !defined(ASMJIT_NO_X86) && ASMJIT_ARCH_X86
+ #define ASMJIT_HAVE_WORKING_JIT
+#endif
+
+#if !defined(ASMJIT_NO_AARCH64) && ASMJIT_ARCH_ARM == 64
+ #define ASMJIT_HAVE_WORKING_JIT
+#endif
+
+using namespace asmjit;
+
+int TestApp::handleArgs(int argc, const char* const* argv) {
+ CmdLine cmd(argc, argv);
+
+ if (cmd.hasArg("--verbose")) _verbose = true;
+ if (cmd.hasArg("--dump-asm")) _dumpAsm = true;
+ if (cmd.hasArg("--dump-hex")) _dumpHex = true;
+
+ return 0;
+}
+
+void TestApp::showInfo() {
+ printf("AsmJit Compiler Test-Suite v%u.%u.%u (Arch=%s):\n",
+ unsigned((ASMJIT_LIBRARY_VERSION >> 16) ),
+ unsigned((ASMJIT_LIBRARY_VERSION >> 8) & 0xFF),
+ unsigned((ASMJIT_LIBRARY_VERSION ) & 0xFF),
+ asmjitArchAsString(Arch::kHost));
+ printf(" [%s] Verbose (use --verbose to turn verbose output ON)\n", _verbose ? "x" : " ");
+ printf(" [%s] DumpAsm (use --dump-asm to turn assembler dumps ON)\n", _dumpAsm ? "x" : " ");
+ printf(" [%s] DumpHex (use --dump-hex to dump binary in hexadecimal)\n", _dumpHex ? "x" : " ");
+ printf("\n");
+}
+
+int TestApp::run() {
+#ifndef ASMJIT_HAVE_WORKING_JIT
+ return 0;
+#else
+#ifndef ASMJIT_NO_LOGGING
+ FormatOptions formatOptions;
+ formatOptions.addFlags(
+ FormatFlags::kMachineCode |
+ FormatFlags::kExplainImms |
+ FormatFlags::kRegCasts );
+
+ FileLogger fileLogger(stdout);
+ fileLogger.setOptions(formatOptions);
+
+ StringLogger stringLogger;
+ stringLogger.setOptions(formatOptions);
+#endif
+
+ JitRuntime runtime;
+
+ PerformanceTimer compileTimer;
+ PerformanceTimer finalizeTimer;
+ double compileTime = 0;
+ double finalizeTime = 0;
+
+ for (std::unique_ptr<TestCase>& test : _tests) {
+ for (uint32_t pass = 0; pass < 2; pass++) {
+ CodeHolder code;
+ SimpleErrorHandler errorHandler;
+
+ code.init(runtime.environment());
+ code.setErrorHandler(&errorHandler);
+
+ if (pass != 0) {
+#ifndef ASMJIT_NO_LOGGING
+ if (_verbose) {
+ code.setLogger(&fileLogger);
+ }
+ else {
+ stringLogger.clear();
+ code.setLogger(&stringLogger);
+ }
+#endif
+
+ printf("[Test] %s", test->name());
+
+#ifndef ASMJIT_NO_LOGGING
+ if (_verbose)
+ printf("\n");
+#endif
+ }
+
+
+#if !defined(ASMJIT_NO_X86) && ASMJIT_ARCH_X86
+ x86::Compiler cc(&code);
+#endif
+
+#if !defined(ASMJIT_NO_AARCH64) && ASMJIT_ARCH_ARM == 64
+ a64::Compiler cc(&code);
+#endif
+
+#ifndef ASMJIT_NO_LOGGING
+ cc.addDiagnosticOptions(DiagnosticOptions::kRAAnnotate | DiagnosticOptions::kRADebugAll);
+#endif
+
+ compileTimer.start();
+ test->compile(cc);
+ compileTimer.stop();
+
+ void* func = nullptr;
+ Error err = errorHandler._err;
+
+ if (!err) {
+ finalizeTimer.start();
+ err = cc.finalize();
+ finalizeTimer.stop();
+ }
+
+ // The first pass is only for timing serialization and compilation, because otherwise it would be biased by
+ // logging, which takes much more time than finalize() does. We want to benchmark Compiler the way it would
+ // be used in production.
+ if (pass == 0) {
+ compileTime += compileTimer.duration();
+ finalizeTime += finalizeTimer.duration();
+ continue;
+ }
+
+#ifndef ASMJIT_NO_LOGGING
+ if (_dumpAsm) {
+ if (!_verbose)
+ printf("\n");
+
+ String sb;
+ Formatter::formatNodeList(sb, formatOptions, &cc);
+ printf("%s", sb.data());
+ }
+#endif
+
+ if (err == kErrorOk)
+ err = runtime.add(&func, &code);
+
+ if (err == kErrorOk && _dumpHex) {
+ String sb;
+ sb.appendHex((void*)func, code.codeSize());
+ printf("\n (HEX: %s)\n", sb.data());
+ }
+
+ if (_verbose)
+ fflush(stdout);
+
+ if (err == kErrorOk) {
+ _outputSize += code.codeSize();
+
+ StringTmp<128> result;
+ StringTmp<128> expect;
+
+ if (test->run(func, result, expect)) {
+ if (!_verbose)
+ printf(" [OK]\n");
+ }
+ else {
+ if (!_verbose)
+ printf(" [FAILED]\n");
+
+#ifndef ASMJIT_NO_LOGGING
+ if (!_verbose)
+ printf("%s", stringLogger.data());
+#endif
+
+ printf("[Status]\n");
+ printf(" Returned: %s\n", result.data());
+ printf(" Expected: %s\n", expect.data());
+
+ _nFailed++;
+ }
+
+ if (_dumpAsm)
+ printf("\n");
+
+ runtime.release(func);
+ }
+ else {
+ if (!_verbose)
+ printf(" [FAILED]\n");
+
+#ifndef ASMJIT_NO_LOGGING
+ if (!_verbose)
+ printf("%s", stringLogger.data());
+#endif
+
+ printf("[Status]\n");
+ printf(" ERROR 0x%08X: %s\n", unsigned(err), errorHandler._message.data());
+
+ _nFailed++;
+ }
+ }
+ }
+
+ printf("\n");
+ printf("Summary:\n");
+ printf(" OutputSize: %zu bytes\n", _outputSize);
+ printf(" CompileTime: %.2f ms\n", compileTime);
+ printf(" FinalizeTime: %.2f ms\n", finalizeTime);
+ printf("\n");
+
+ if (_nFailed == 0)
+ printf("** SUCCESS: All %u tests passed **\n", unsigned(_tests.size()));
+ else
+ printf("** FAILURE: %u of %u tests failed **\n", _nFailed, unsigned(_tests.size()));
+
+ return _nFailed == 0 ? 0 : 1;
+#endif
+}
+
+int main(int argc, char* argv[]) {
+ TestApp app;
+
+ app.handleArgs(argc, argv);
+ app.showInfo();
+
+#if !defined(ASMJIT_NO_X86) && ASMJIT_ARCH_X86
+ compiler_add_x86_tests(app);
+#endif
+
+#if !defined(ASMJIT_NO_AARCH64) && ASMJIT_ARCH_ARM == 64
+ compiler_add_a64_tests(app);
+#endif
+
+ return app.run();
+}
diff --git a/3rdparty/asmjit/test/asmjit_test_compiler.h b/3rdparty/asmjit/test/asmjit_test_compiler.h
new file mode 100644
index 00000000000..e694b379e11
--- /dev/null
+++ b/3rdparty/asmjit/test/asmjit_test_compiler.h
@@ -0,0 +1,73 @@
+// This file is part of AsmJit project <https://asmjit.com>
+//
+// See asmjit.h or LICENSE.md for license and copyright information
+// SPDX-License-Identifier: Zlib
+
+#ifndef ASMJIT_TEST_COMPILER_H_INCLUDED
+#define ASMJIT_TEST_COMPILER_H_INCLUDED
+
+#include <asmjit/core.h>
+
+#include <memory>
+#include <vector>
+
+class SimpleErrorHandler : public asmjit::ErrorHandler {
+public:
+ SimpleErrorHandler()
+ : _err(asmjit::kErrorOk) {}
+
+ virtual void handleError(asmjit::Error err, const char* message, asmjit::BaseEmitter* origin) {
+ asmjit::DebugUtils::unused(origin);
+ _err = err;
+ _message.assign(message);
+ }
+
+ asmjit::Error _err;
+ asmjit::String _message;
+};
+
+//! A test case interface for testing AsmJit's Compiler.
+class TestCase {
+public:
+ TestCase(const char* name = nullptr) {
+ if (name)
+ _name.assign(name);
+ }
+
+ virtual ~TestCase() {}
+
+ inline const char* name() const { return _name.data(); }
+
+ virtual void compile(asmjit::BaseCompiler& cc) = 0;
+ virtual bool run(void* func, asmjit::String& result, asmjit::String& expect) = 0;
+
+ asmjit::String _name;
+};
+
+class TestApp {
+public:
+ std::vector<std::unique_ptr<TestCase>> _tests;
+
+ unsigned _nFailed = 0;
+ size_t _outputSize = 0;
+
+ bool _verbose = false;
+ bool _dumpAsm = false;
+ bool _dumpHex = false;
+
+ TestApp() noexcept {}
+ ~TestApp() noexcept {}
+
+ void add(TestCase* test) noexcept {
+ _tests.push_back(std::unique_ptr<TestCase>(test));
+ }
+
+ template<class T>
+ inline void addT() { T::add(*this); }
+
+ int handleArgs(int argc, const char* const* argv);
+ void showInfo();
+ int run();
+};
+
+#endif // ASMJIT_TEST_COMPILER_H_INCLUDED
diff --git a/3rdparty/asmjit/test/asmjit_test_compiler_a64.cpp b/3rdparty/asmjit/test/asmjit_test_compiler_a64.cpp
new file mode 100644
index 00000000000..4fc362e7230
--- /dev/null
+++ b/3rdparty/asmjit/test/asmjit_test_compiler_a64.cpp
@@ -0,0 +1,690 @@
+// This file is part of AsmJit project <https://asmjit.com>
+//
+// See asmjit.h or LICENSE.md for license and copyright information
+// SPDX-License-Identifier: Zlib
+
+#include <asmjit/core.h>
+#if !defined(ASMJIT_NO_AARCH64) && ASMJIT_ARCH_ARM == 64
+
+#include <asmjit/a64.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include "./asmjit_test_compiler.h"
+
+using namespace asmjit;
+
+// a64::Compiler - A64TestCase
+// ===========================
+
+class A64TestCase : public TestCase {
+public:
+ A64TestCase(const char* name = nullptr)
+ : TestCase(name) {}
+
+ virtual void compile(BaseCompiler& cc) override {
+ compile(static_cast<a64::Compiler&>(cc));
+ }
+
+ virtual void compile(a64::Compiler& cc) = 0;
+};
+
+// a64::Compiler - A64Test_GpArgs
+// ==============================
+
+class A64Test_GpArgs : public A64TestCase {
+public:
+ uint32_t _argCount;
+ bool _preserveFP;
+
+ A64Test_GpArgs(uint32_t argCount, bool preserveFP)
+ : _argCount(argCount),
+ _preserveFP(preserveFP) {
+ _name.assignFormat("GpArgs {NumArgs=%u PreserveFP=%c}", argCount, preserveFP ? 'Y' : 'N');
+ }
+
+ static void add(TestApp& app) {
+ for (uint32_t i = 0; i <= 16; i++) {
+ app.add(new A64Test_GpArgs(i, true));
+ app.add(new A64Test_GpArgs(i, false));
+ }
+ }
+
+ virtual void compile(a64::Compiler& cc) {
+ uint32_t i;
+ uint32_t argCount = _argCount;
+
+ FuncSignatureBuilder signature;
+ signature.setRetT<int>();
+ for (i = 0; i < argCount; i++)
+ signature.addArgT<int>();
+
+ FuncNode* funcNode = cc.addFunc(signature);
+ if (_preserveFP)
+ funcNode->frame().setPreservedFP();
+
+ arm::Gp sum;
+
+ if (argCount) {
+ for (i = 0; i < argCount; i++) {
+ arm::Gp iReg = cc.newInt32("i%u", i);
+ funcNode->setArg(i, iReg);
+
+ if (i == 0)
+ sum = iReg;
+ else
+ cc.add(sum, sum, iReg);
+ }
+ }
+ else {
+ sum = cc.newInt32("i");
+ cc.mov(sum, 0);
+ }
+
+ cc.ret(sum);
+ cc.endFunc();
+ }
+
+ virtual bool run(void* _func, String& result, String& expect) {
+ typedef unsigned int U;
+
+ typedef U (*Func0)();
+ typedef U (*Func1)(U);
+ typedef U (*Func2)(U, U);
+ typedef U (*Func3)(U, U, U);
+ typedef U (*Func4)(U, U, U, U);
+ typedef U (*Func5)(U, U, U, U, U);
+ typedef U (*Func6)(U, U, U, U, U, U);
+ typedef U (*Func7)(U, U, U, U, U, U, U);
+ typedef U (*Func8)(U, U, U, U, U, U, U, U);
+ typedef U (*Func9)(U, U, U, U, U, U, U, U, U);
+ typedef U (*Func10)(U, U, U, U, U, U, U, U, U, U);
+ typedef U (*Func11)(U, U, U, U, U, U, U, U, U, U, U);
+ typedef U (*Func12)(U, U, U, U, U, U, U, U, U, U, U, U);
+ typedef U (*Func13)(U, U, U, U, U, U, U, U, U, U, U, U, U);
+ typedef U (*Func14)(U, U, U, U, U, U, U, U, U, U, U, U, U, U);
+ typedef U (*Func15)(U, U, U, U, U, U, U, U, U, U, U, U, U, U, U);
+ typedef U (*Func16)(U, U, U, U, U, U, U, U, U, U, U, U, U, U, U, U);
+
+ unsigned int resultRet = 0;
+ unsigned int expectRet = 0;
+
+ switch (_argCount) {
+ case 0:
+ resultRet = ptr_as_func<Func0>(_func)();
+ expectRet = 0;
+ break;
+ case 1:
+ resultRet = ptr_as_func<Func1>(_func)(1);
+ expectRet = 1;
+ break;
+ case 2:
+ resultRet = ptr_as_func<Func2>(_func)(1, 2);
+ expectRet = 1 + 2;
+ break;
+ case 3:
+ resultRet = ptr_as_func<Func3>(_func)(1, 2, 3);
+ expectRet = 1 + 2 + 3;
+ break;
+ case 4:
+ resultRet = ptr_as_func<Func4>(_func)(1, 2, 3, 4);
+ expectRet = 1 + 2 + 3 + 4;
+ break;
+ case 5:
+ resultRet = ptr_as_func<Func5>(_func)(1, 2, 3, 4, 5);
+ expectRet = 1 + 2 + 3 + 4 + 5;
+ break;
+ case 6:
+ resultRet = ptr_as_func<Func6>(_func)(1, 2, 3, 4, 5, 6);
+ expectRet = 1 + 2 + 3 + 4 + 5 + 6;
+ break;
+ case 7:
+ resultRet = ptr_as_func<Func7>(_func)(1, 2, 3, 4, 5, 6, 7);
+ expectRet = 1 + 2 + 3 + 4 + 5 + 6 + 7;
+ break;
+ case 8:
+ resultRet = ptr_as_func<Func8>(_func)(1, 2, 3, 4, 5, 6, 7, 8);
+ expectRet = 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8;
+ break;
+ case 9:
+ resultRet = ptr_as_func<Func9>(_func)(1, 2, 3, 4, 5, 6, 7, 8, 9);
+ expectRet = 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9;
+ break;
+ case 10:
+ resultRet = ptr_as_func<Func10>(_func)(1, 2, 3, 4, 5, 6, 7, 8, 9, 10);
+ expectRet = 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10;
+ break;
+ case 11:
+ resultRet = ptr_as_func<Func11>(_func)(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11);
+ expectRet = 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10 + 11;
+ break;
+ case 12:
+ resultRet = ptr_as_func<Func12>(_func)(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12);
+ expectRet = 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10 + 11 + 12;
+ break;
+ case 13:
+ resultRet = ptr_as_func<Func13>(_func)(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13);
+ expectRet = 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10 + 11 + 12 + 13;
+ break;
+ case 14:
+ resultRet = ptr_as_func<Func14>(_func)(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14);
+ expectRet = 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10 + 11 + 12 + 13 + 14;
+ break;
+ case 15:
+ resultRet = ptr_as_func<Func15>(_func)(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15);
+ expectRet = 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10 + 11 + 12 + 13 + 14 + 15;
+ break;
+ case 16:
+ resultRet = ptr_as_func<Func16>(_func)(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16);
+ expectRet = 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10 + 11 + 12 + 13 + 14 + 15 + 16;
+ break;
+ }
+
+ result.assignFormat("ret={%u, %u}", resultRet >> 28, resultRet & 0x0FFFFFFFu);
+ expect.assignFormat("ret={%u, %u}", expectRet >> 28, expectRet & 0x0FFFFFFFu);
+
+ return resultRet == expectRet;
+ }
+};
+
+// a64::Compiler - A64Test_Simd1
+// =============================
+
+class A64Test_Simd1 : public A64TestCase {
+public:
+ A64Test_Simd1()
+ : A64TestCase("Simd1") {}
+
+ static void add(TestApp& app) {
+ app.add(new A64Test_Simd1());
+ }
+
+ virtual void compile(a64::Compiler& cc) {
+ FuncNode* funcNode = cc.addFunc(FuncSignatureT<void, void*, const void*, const void*>());
+
+ arm::Gp dst = cc.newUIntPtr("dst");
+ arm::Gp src1 = cc.newUIntPtr("src1");
+ arm::Gp src2 = cc.newUIntPtr("src2");
+
+ funcNode->setArg(0, dst);
+ funcNode->setArg(1, src1);
+ funcNode->setArg(2, src2);
+
+ arm::Vec v1 = cc.newVecQ("vec1");
+ arm::Vec v2 = cc.newVecQ("vec2");
+ arm::Vec v3 = cc.newVecQ("vec3");
+
+ cc.ldr(v2, arm::ptr(src1));
+ cc.ldr(v3, arm::ptr(src2));
+ cc.add(v1.b16(), v2.b16(), v3.b16());
+ cc.str(v1, arm::ptr(dst));
+
+ cc.endFunc();
+ }
+
+ virtual bool run(void* _func, String& result, String& expect) {
+ typedef void (*Func)(void*, const void*, const void*);
+
+ uint32_t dst[4];
+ uint32_t aSrc[4] = { 0 , 1 , 2 , 255 };
+ uint32_t bSrc[4] = { 99, 17, 33, 1 };
+
+ // NOTE: It's a byte-add, so uint8_t(255+1) == 0.
+ uint32_t ref[4] = { 99, 18, 35, 0 };
+
+ ptr_as_func<Func>(_func)(dst, aSrc, bSrc);
+
+ unsigned int resultRet = 0;
+ unsigned int expectRet = 0;
+
+ result.assignFormat("ret={%u, %u, %u, %u}", dst[0], dst[1], dst[2], dst[3]);
+ expect.assignFormat("ret={%u, %u, %u, %u}", ref[0], ref[1], ref[2], ref[3]);
+
+ return resultRet == expectRet;
+ }
+};
+
+// a64::Compiler - A64Test_ManyRegs
+// ================================
+
+class A64Test_ManyRegs : public A64TestCase {
+public:
+ uint32_t _regCount;
+
+ A64Test_ManyRegs(uint32_t n)
+ : A64TestCase(),
+ _regCount(n) {
+ _name.assignFormat("GpRegs {NumRegs=%u}", n);
+ }
+
+ static void add(TestApp& app) {
+ for (uint32_t i = 2; i < 64; i++)
+ app.add(new A64Test_ManyRegs(i));
+ }
+
+ virtual void compile(a64::Compiler& cc) {
+ cc.addFunc(FuncSignatureT<int>());
+
+ arm::Gp* regs = static_cast<arm::Gp*>(malloc(_regCount * sizeof(arm::Gp)));
+
+ for (uint32_t i = 0; i < _regCount; i++) {
+ regs[i] = cc.newUInt32("reg%u", i);
+ cc.mov(regs[i], i + 1);
+ }
+
+ arm::Gp sum = cc.newUInt32("sum");
+ cc.mov(sum, 0);
+
+ for (uint32_t i = 0; i < _regCount; i++) {
+ cc.add(sum, sum, regs[i]);
+ }
+
+ cc.ret(sum);
+ cc.endFunc();
+
+ free(regs);
+ }
+
+ virtual bool run(void* _func, String& result, String& expect) {
+ typedef int (*Func)(void);
+ Func func = ptr_as_func<Func>(_func);
+
+ result.assignFormat("ret={%d}", func());
+ expect.assignFormat("ret={%d}", calcSum());
+
+ return result == expect;
+ }
+
+ uint32_t calcSum() const {
+ return (_regCount | 1) * ((_regCount + 1) / 2);
+ }
+};
+
+// a64::Compiler - A64Test_Adr
+// ===========================
+
+class A64Test_Adr : public A64TestCase {
+public:
+ A64Test_Adr()
+ : A64TestCase("Adr") {}
+
+ static void add(TestApp& app) {
+ app.add(new A64Test_Adr());
+ }
+
+ virtual void compile(a64::Compiler& cc) {
+ cc.addFunc(FuncSignatureT<int>());
+
+ arm::Gp addr = cc.newIntPtr("addr");
+ arm::Gp val = cc.newIntPtr("val");
+
+ Label L_Table = cc.newLabel();
+
+ cc.adr(addr, L_Table);
+ cc.ldrsw(val, arm::ptr(addr, 8));
+ cc.ret(val);
+ cc.endFunc();
+
+ cc.bind(L_Table);
+ cc.embedInt32(1);
+ cc.embedInt32(2);
+ cc.embedInt32(3);
+ cc.embedInt32(4);
+ cc.embedInt32(5);
+ }
+
+ virtual bool run(void* _func, String& result, String& expect) {
+ typedef int (*Func)(void);
+ Func func = ptr_as_func<Func>(_func);
+
+ result.assignFormat("ret={%d}", func());
+ expect.assignFormat("ret={%d}", 3);
+
+ return result == expect;
+ }
+};
+
+// a64::Compiler - A64Test_Branch1
+// ===============================
+
+class A64Test_Branch1 : public A64TestCase {
+public:
+ A64Test_Branch1()
+ : A64TestCase("Branch1") {}
+
+ static void add(TestApp& app) {
+ app.add(new A64Test_Branch1());
+ }
+
+ virtual void compile(a64::Compiler& cc) {
+ FuncNode* funcNode = cc.addFunc(FuncSignatureT<void, void*, size_t>());
+
+ arm::Gp p = cc.newIntPtr("p");
+ arm::Gp count = cc.newIntPtr("count");
+ arm::Gp i = cc.newIntPtr("i");
+ Label L = cc.newLabel();
+
+ funcNode->setArg(0, p);
+ funcNode->setArg(1, count);
+
+ cc.mov(i, 0);
+
+ cc.bind(L);
+ cc.strb(i.w(), a64::ptr(p, i));
+ cc.add(i, i, 1);
+ cc.cmp(i, count);
+ cc.b_ne(L);
+
+ cc.endFunc();
+ }
+
+ virtual bool run(void* _func, String& result, String& expect) {
+ typedef void (*Func)(void* p, size_t n);
+ Func func = ptr_as_func<Func>(_func);
+
+ uint8_t array[16];
+ func(array, 16);
+
+ expect.assign("ret={0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15}");
+
+ result.assign("ret={");
+ for (size_t i = 0; i < 16; i++) {
+ if (i)
+ result.append(", ");
+ result.appendFormat("%d", int(array[i]));
+ }
+ result.append("}");
+
+ return result == expect;
+ }
+};
+
+// a64::Compiler - A64Test_Invoke1
+// ===============================
+
+class A64Test_Invoke1 : public A64TestCase {
+public:
+ A64Test_Invoke1()
+ : A64TestCase("Invoke1") {}
+
+ static void add(TestApp& app) {
+ app.add(new A64Test_Invoke1());
+ }
+
+ virtual void compile(a64::Compiler& cc) {
+ FuncNode* funcNode = cc.addFunc(FuncSignatureT<uint32_t, uint32_t, uint32_t>());
+
+ arm::Gp x = cc.newUInt32("x");
+ arm::Gp y = cc.newUInt32("y");
+ arm::Gp r = cc.newUInt32("r");
+ arm::Gp fn = cc.newUIntPtr("fn");
+
+ funcNode->setArg(0, x);
+ funcNode->setArg(1, y);
+
+ cc.mov(fn, (uint64_t)calledFunc);
+
+ InvokeNode* invokeNode;
+ cc.invoke(&invokeNode, fn, FuncSignatureT<uint32_t, uint32_t, uint32_t>(CallConvId::kHost));
+ invokeNode->setArg(0, x);
+ invokeNode->setArg(1, y);
+ invokeNode->setRet(0, r);
+
+ cc.ret(r);
+ cc.endFunc();
+ }
+
+ virtual bool run(void* _func, String& result, String& expect) {
+ typedef uint32_t (*Func)(uint32_t, uint32_t);
+ Func func = ptr_as_func<Func>(_func);
+
+ uint32_t x = 49;
+ uint32_t y = 7;
+
+ result.assignFormat("ret={%u}", func(x, y));
+ expect.assignFormat("ret={%u}", x - y);
+
+ return result == expect;
+ }
+
+ static uint32_t calledFunc(uint32_t x, uint32_t y) {
+ return x - y;
+ }
+};
+
+// a64::Compiler - A64Test_Invoke2
+// ===============================
+
+class A64Test_Invoke2 : public A64TestCase {
+public:
+ A64Test_Invoke2()
+ : A64TestCase("Invoke2") {}
+
+ static void add(TestApp& app) {
+ app.add(new A64Test_Invoke2());
+ }
+
+ virtual void compile(a64::Compiler& cc) {
+ FuncNode* funcNode = cc.addFunc(FuncSignatureT<double, double, double>());
+
+ arm::Vec x = cc.newVecD("x");
+ arm::Vec y = cc.newVecD("y");
+ arm::Vec r = cc.newVecD("r");
+ arm::Gp fn = cc.newUIntPtr("fn");
+
+ funcNode->setArg(0, x);
+ funcNode->setArg(1, y);
+ cc.mov(fn, (uint64_t)calledFunc);
+
+ InvokeNode* invokeNode;
+ cc.invoke(&invokeNode, fn, FuncSignatureT<double, double, double>(CallConvId::kHost));
+ invokeNode->setArg(0, x);
+ invokeNode->setArg(1, y);
+ invokeNode->setRet(0, r);
+
+ cc.ret(r);
+ cc.endFunc();
+ }
+
+ virtual bool run(void* _func, String& result, String& expect) {
+ typedef double (*Func)(double, double);
+ Func func = ptr_as_func<Func>(_func);
+
+ double x = 49;
+ double y = 7;
+
+ result.assignFormat("ret={%f}", func(x, y));
+ expect.assignFormat("ret={%f}", calledFunc(x, y));
+
+ return result == expect;
+ }
+
+ static double calledFunc(double x, double y) {
+ return x - y;
+ }
+};
+
+// a64::Compiler - A64Test_Invoke3
+// ===============================
+
+class A64Test_Invoke3 : public A64TestCase {
+public:
+ A64Test_Invoke3()
+ : A64TestCase("Invoke3") {}
+
+ static void add(TestApp& app) {
+ app.add(new A64Test_Invoke3());
+ }
+
+ virtual void compile(a64::Compiler& cc) {
+ FuncNode* funcNode = cc.addFunc(FuncSignatureT<double, double, double>());
+
+ arm::Vec x = cc.newVecD("x");
+ arm::Vec y = cc.newVecD("y");
+ arm::Vec r = cc.newVecD("r");
+ arm::Gp fn = cc.newUIntPtr("fn");
+
+ funcNode->setArg(0, x);
+ funcNode->setArg(1, y);
+ cc.mov(fn, (uint64_t)calledFunc);
+
+ InvokeNode* invokeNode;
+ cc.invoke(&invokeNode, fn, FuncSignatureT<double, double, double>(CallConvId::kHost));
+ invokeNode->setArg(0, y);
+ invokeNode->setArg(1, x);
+ invokeNode->setRet(0, r);
+
+ cc.ret(r);
+ cc.endFunc();
+ }
+
+ virtual bool run(void* _func, String& result, String& expect) {
+ typedef double (*Func)(double, double);
+ Func func = ptr_as_func<Func>(_func);
+
+ double x = 49;
+ double y = 7;
+
+ result.assignFormat("ret={%f}", func(x, y));
+ expect.assignFormat("ret={%f}", calledFunc(y, x));
+
+ return result == expect;
+ }
+
+ static double calledFunc(double x, double y) {
+ return x - y;
+ }
+};
+
+// a64::Compiler - A64Test_JumpTable
+// =================================
+
+class A64Test_JumpTable : public A64TestCase {
+public:
+ bool _annotated;
+
+ A64Test_JumpTable(bool annotated)
+ : A64TestCase("A64Test_JumpTable"),
+ _annotated(annotated) {
+ _name.assignFormat("JumpTable {%s}", annotated ? "Annotated" : "Unknown Target");
+ }
+
+ enum Operator {
+ kOperatorAdd = 0,
+ kOperatorSub = 1,
+ kOperatorMul = 2,
+ kOperatorDiv = 3
+ };
+
+ static void add(TestApp& app) {
+ app.add(new A64Test_JumpTable(false));
+ app.add(new A64Test_JumpTable(true));
+ }
+
+ virtual void compile(a64::Compiler& cc) {
+ FuncNode* funcNode = cc.addFunc(FuncSignatureT<float, float, float, uint32_t>());
+
+ arm::Vec a = cc.newVecS("a");
+ arm::Vec b = cc.newVecS("b");
+ arm::Gp op = cc.newUInt32("op");
+
+ arm::Gp target = cc.newIntPtr("target");
+ arm::Gp offset = cc.newIntPtr("offset");
+
+ Label L_End = cc.newLabel();
+
+ Label L_Table = cc.newLabel();
+ Label L_Add = cc.newLabel();
+ Label L_Sub = cc.newLabel();
+ Label L_Mul = cc.newLabel();
+ Label L_Div = cc.newLabel();
+
+ funcNode->setArg(0, a);
+ funcNode->setArg(1, b);
+ funcNode->setArg(2, op);
+
+ cc.adr(target, L_Table);
+ cc.ldrsw(offset, arm::ptr(target, op, arm::sxtw(2)));
+ cc.add(target, target, offset);
+
+ // JumpAnnotation allows to annotate all possible jump targets of
+ // instructions where it cannot be deduced from operands.
+ if (_annotated) {
+ JumpAnnotation* annotation = cc.newJumpAnnotation();
+ annotation->addLabel(L_Add);
+ annotation->addLabel(L_Sub);
+ annotation->addLabel(L_Mul);
+ annotation->addLabel(L_Div);
+ cc.br(target, annotation);
+ }
+ else {
+ cc.br(target);
+ }
+
+ cc.bind(L_Add);
+ cc.fadd(a, a, b);
+ cc.b(L_End);
+
+ cc.bind(L_Sub);
+ cc.fsub(a, a, b);
+ cc.b(L_End);
+
+ cc.bind(L_Mul);
+ cc.fmul(a, a, b);
+ cc.b(L_End);
+
+ cc.bind(L_Div);
+ cc.fdiv(a, a, b);
+
+ cc.bind(L_End);
+ cc.ret(a);
+ cc.endFunc();
+
+ cc.bind(L_Table);
+ cc.embedLabelDelta(L_Add, L_Table, 4);
+ cc.embedLabelDelta(L_Sub, L_Table, 4);
+ cc.embedLabelDelta(L_Mul, L_Table, 4);
+ cc.embedLabelDelta(L_Div, L_Table, 4);
+ }
+
+ virtual bool run(void* _func, String& result, String& expect) {
+ typedef float (*Func)(float, float, uint32_t);
+ Func func = ptr_as_func<Func>(_func);
+
+ float dst[4];
+ float ref[4];
+
+ dst[0] = func(33.0f, 14.0f, kOperatorAdd);
+ dst[1] = func(33.0f, 14.0f, kOperatorSub);
+ dst[2] = func(10.0f, 6.0f, kOperatorMul);
+ dst[3] = func(80.0f, 8.0f, kOperatorDiv);
+
+ ref[0] = 47.0f;
+ ref[1] = 19.0f;
+ ref[2] = 60.0f;
+ ref[3] = 10.0f;
+
+ result.assignFormat("ret={%f, %f, %f, %f}", dst[0], dst[1], dst[2], dst[3]);
+ expect.assignFormat("ret={%f, %f, %f, %f}", ref[0], ref[1], ref[2], ref[3]);
+
+ return result == expect;
+ }
+};
+
+// a64::Compiler - Export
+// ======================
+
+void compiler_add_a64_tests(TestApp& app) {
+ app.addT<A64Test_GpArgs>();
+ app.addT<A64Test_ManyRegs>();
+ app.addT<A64Test_Simd1>();
+ app.addT<A64Test_Adr>();
+ app.addT<A64Test_Branch1>();
+ app.addT<A64Test_Invoke1>();
+ app.addT<A64Test_Invoke2>();
+ app.addT<A64Test_Invoke3>();
+ app.addT<A64Test_JumpTable>();
+}
+
+#endif // !ASMJIT_NO_AARCH64 && ASMJIT_ARCH_ARM == 64
diff --git a/3rdparty/asmjit/test/asmjit_test_x86_cc.cpp b/3rdparty/asmjit/test/asmjit_test_compiler_x86.cpp
index 9e80d871978..7dbe95599b4 100644
--- a/3rdparty/asmjit/test/asmjit_test_x86_cc.cpp
+++ b/3rdparty/asmjit/test/asmjit_test_compiler_x86.cpp
@@ -1,25 +1,10 @@
-// AsmJit - Machine code generation for C++
+// This file is part of AsmJit project <https://asmjit.com>
//
-// * Official AsmJit Home Page: https://asmjit.com
-// * Official Github Repository: https://github.com/asmjit/asmjit
-//
-// Copyright (c) 2008-2020 The AsmJit Authors
-//
-// This software is provided 'as-is', without any express or implied
-// warranty. In no event will the authors be held liable for any damages
-// arising from the use of this software.
-//
-// Permission is granted to anyone to use this software for any purpose,
-// including commercial applications, and to alter it and redistribute it
-// freely, subject to the following restrictions:
-//
-// 1. The origin of this software must not be misrepresented; you must not
-// claim that you wrote the original software. If you use this software
-// in a product, an acknowledgment in the product documentation would be
-// appreciated but is not required.
-// 2. Altered source versions must be plainly marked as such, and must not be
-// misrepresented as being the original software.
-// 3. This notice may not be removed or altered from any source distribution.
+// See asmjit.h or LICENSE.md for license and copyright information
+// SPDX-License-Identifier: Zlib
+
+#include <asmjit/core.h>
+#if !defined(ASMJIT_NO_X86) && ASMJIT_ARCH_X86
#include <asmjit/x86.h>
#include <setjmp.h>
@@ -27,13 +12,11 @@
#include <stdlib.h>
#include <string.h>
-#include <memory>
-#include <vector>
-
// Required for function tests that pass / return XMM registers.
#include <emmintrin.h>
-#include "./asmjit_test_misc.h"
+#include "asmjit_test_misc.h"
+#include "asmjit_test_compiler.h"
#ifdef _MSC_VER
// Interaction between '_setjmp' and C++ object destruction is non-portable.
@@ -42,239 +25,25 @@
using namespace asmjit;
-// ============================================================================
-// [CmdLine]
-// ============================================================================
+// x86::Compiler - X86TestCase
+// ===========================
-class CmdLine {
+class X86TestCase : public TestCase {
public:
- CmdLine(int argc, const char* const* argv) noexcept
- : _argc(argc),
- _argv(argv) {}
+ X86TestCase(const char* name = nullptr)
+ : TestCase(name) {}
- bool hasArg(const char* arg) noexcept {
- for (int i = 1; i < _argc; i++)
- if (strcmp(_argv[i], arg) == 0)
- return true;
- return false;
+ virtual void compile(BaseCompiler& cc) override {
+ compile(static_cast<x86::Compiler&>(cc));
}
- int _argc;
- const char* const* _argv;
+ virtual void compile(x86::Compiler& cc) = 0;
};
-// ============================================================================
-// [SimpleErrorHandler]
-// ============================================================================
+// x86::Compiler - X86Test_AlignBase
+// =================================
-class SimpleErrorHandler : public ErrorHandler {
-public:
- SimpleErrorHandler() : _err(kErrorOk) {}
- virtual void handleError(Error err, const char* message, BaseEmitter* origin) {
- DebugUtils::unused(origin);
- _err = err;
- _message.assign(message);
- }
-
- Error _err;
- String _message;
-};
-
-// ============================================================================
-// [X86Test]
-// ============================================================================
-
-//! Base test interface for testing `x86::Compiler`.
-class X86Test {
-public:
- X86Test(const char* name = nullptr) { _name.assign(name); }
- virtual ~X86Test() {}
-
- inline const char* name() const { return _name.data(); }
-
- virtual void compile(x86::Compiler& c) = 0;
- virtual bool run(void* func, String& result, String& expect) = 0;
-
- String _name;
-};
-
-// ============================================================================
-// [X86TestApp]
-// ============================================================================
-
-class X86TestApp {
-public:
- std::vector<std::unique_ptr<X86Test>> _tests;
-
- unsigned _nFailed;
- size_t _outputSize;
-
- bool _verbose;
- bool _dumpAsm;
-
- X86TestApp() noexcept
- : _nFailed(0),
- _outputSize(0),
- _verbose(false),
- _dumpAsm(false) {}
-
- ~X86TestApp() noexcept {}
-
- void add(X86Test* test) noexcept {
- _tests.push_back(std::unique_ptr<X86Test>(test));
- }
-
- template<class T>
- inline void addT() { T::add(*this); }
-
- int handleArgs(int argc, const char* const* argv);
- void showInfo();
- int run();
-};
-
-int X86TestApp::handleArgs(int argc, const char* const* argv) {
- CmdLine cmd(argc, argv);
-
- if (cmd.hasArg("--verbose")) _verbose = true;
- if (cmd.hasArg("--dump-asm")) _dumpAsm = true;
-
- return 0;
-}
-
-void X86TestApp::showInfo() {
- printf("AsmJit Compiler Test-Suite v%u.%u.%u [Arch=%s]:\n",
- unsigned((ASMJIT_LIBRARY_VERSION >> 16) ),
- unsigned((ASMJIT_LIBRARY_VERSION >> 8) & 0xFF),
- unsigned((ASMJIT_LIBRARY_VERSION ) & 0xFF),
- sizeof(void*) == 8 ? "X64" : "X86");
- printf(" [%s] Verbose (use --verbose to turn verbose output ON)\n", _verbose ? "x" : " ");
- printf(" [%s] DumpAsm (use --dump-asm to turn assembler dumps ON)\n", _dumpAsm ? "x" : " ");
- printf("\n");
-}
-
-int X86TestApp::run() {
-#ifndef ASMJIT_NO_LOGGING
- uint32_t kFormatFlags = FormatOptions::kFlagMachineCode |
- FormatOptions::kFlagExplainImms |
- FormatOptions::kFlagRegCasts |
- FormatOptions::kFlagAnnotations |
- FormatOptions::kFlagDebugPasses |
- FormatOptions::kFlagDebugRA ;
-
- FileLogger fileLogger(stdout);
- fileLogger.addFlags(kFormatFlags);
-
- StringLogger stringLogger;
- stringLogger.addFlags(kFormatFlags);
-#endif
-
- for (std::unique_ptr<X86Test>& test : _tests) {
- JitRuntime runtime;
- CodeHolder code;
- SimpleErrorHandler errorHandler;
-
- code.init(runtime.environment());
- code.setErrorHandler(&errorHandler);
-
-#ifndef ASMJIT_NO_LOGGING
- if (_verbose) {
- code.setLogger(&fileLogger);
- }
- else {
- stringLogger.clear();
- code.setLogger(&stringLogger);
- }
-#endif
-
- printf("[Test] %s", test->name());
-
-#ifndef ASMJIT_NO_LOGGING
- if (_verbose) printf("\n");
-#endif
-
- x86::Compiler cc(&code);
- test->compile(cc);
-
- void* func = nullptr;
- Error err = errorHandler._err;
-
- if (!err)
- err = cc.finalize();
-
-#ifndef ASMJIT_NO_LOGGING
- if (_dumpAsm) {
- if (!_verbose) printf("\n");
-
- String sb;
- Formatter::formatNodeList(sb, kFormatFlags, &cc);
- printf("%s", sb.data());
- }
-#endif
-
- if (err == kErrorOk)
- err = runtime.add(&func, &code);
-
- if (_verbose)
- fflush(stdout);
-
- if (err == kErrorOk) {
- _outputSize += code.codeSize();
-
- StringTmp<128> result;
- StringTmp<128> expect;
-
- if (test->run(func, result, expect)) {
- if (!_verbose) printf(" [OK]\n");
- }
- else {
- if (!_verbose) printf(" [FAILED]\n");
-
-#ifndef ASMJIT_NO_LOGGING
- if (!_verbose) printf("%s", stringLogger.data());
-#endif
-
- printf("[Status]\n");
- printf(" Returned: %s\n", result.data());
- printf(" Expected: %s\n", expect.data());
-
- _nFailed++;
- }
-
- if (_dumpAsm)
- printf("\n");
-
- runtime.release(func);
- }
- else {
- if (!_verbose) printf(" [FAILED]\n");
-
-#ifndef ASMJIT_NO_LOGGING
- if (!_verbose) printf("%s", stringLogger.data());
-#endif
-
- printf("[Status]\n");
- printf(" ERROR 0x%08X: %s\n", unsigned(err), errorHandler._message.data());
-
- _nFailed++;
- }
- }
-
- if (_nFailed == 0)
- printf("\nSuccess:\n All %u tests passed\n", unsigned(_tests.size()));
- else
- printf("\nFailure:\n %u %s of %u failed\n", _nFailed, _nFailed == 1 ? "test" : "tests", unsigned(_tests.size()));
-
- printf(" OutputSize=%zu\n", _outputSize);
- printf("\n");
-
- return _nFailed == 0 ? 0 : 1;
-}
-
-// ============================================================================
-// [X86Test_AlignBase]
-// ============================================================================
-
-class X86Test_AlignBase : public X86Test {
+class X86Test_AlignBase : public X86TestCase {
public:
X86Test_AlignBase(uint32_t argCount, uint32_t alignment, bool preserveFP)
: _argCount(argCount),
@@ -283,7 +52,7 @@ public:
_name.assignFormat("AlignBase {NumArgs=%u Alignment=%u PreserveFP=%c}", argCount, alignment, preserveFP ? 'Y' : 'N');
}
- static void add(X86TestApp& app) {
+ static void add(TestApp& app) {
for (uint32_t i = 0; i <= 16; i++) {
for (uint32_t a = 16; a <= 32; a += 16) {
app.add(new X86Test_AlignBase(i, a, true));
@@ -296,14 +65,14 @@ public:
uint32_t i;
uint32_t argCount = _argCount;
- FuncSignatureBuilder signature(CallConv::kIdHost);
+ FuncSignatureBuilder signature(CallConvId::kHost);
signature.setRetT<int>();
for (i = 0; i < argCount; i++)
signature.addArgT<int>();
- cc.addFunc(signature);
+ FuncNode* funcNode = cc.addFunc(signature);
if (_preserveFP)
- cc.func()->frame().setPreservedFP();
+ funcNode->frame().setPreservedFP();
x86::Gp gpVar = cc.newIntPtr("gpVar");
x86::Gp gpSum;
@@ -313,7 +82,7 @@ public:
if (argCount) {
for (i = 0; i < argCount; i++) {
x86::Gp gpArg = cc.newInt32("gpArg%u", i);
- cc.setArg(i, gpArg);
+ funcNode->setArg(i, gpArg);
if (i == 0)
gpSum = gpArg;
@@ -440,20 +209,19 @@ public:
bool _preserveFP;
};
-// ============================================================================
-// [X86Test_NoCode]
-// ============================================================================
+// x86::Compiler - X86Test_NoCode
+// ==============================
-class X86Test_NoCode : public X86Test {
+class X86Test_NoCode : public X86TestCase {
public:
- X86Test_NoCode() : X86Test("NoCode") {}
+ X86Test_NoCode() : X86TestCase("NoCode") {}
- static void add(X86TestApp& app) {
+ static void add(TestApp& app) {
app.add(new X86Test_NoCode());
}
virtual void compile(x86::Compiler& cc) {
- cc.addFunc(FuncSignatureT<void>(CallConv::kIdHost));
+ cc.addFunc(FuncSignatureT<void>(CallConvId::kHost));
cc.endFunc();
}
@@ -468,22 +236,21 @@ public:
}
};
-// ============================================================================
-// [X86Test_AlignNone]
-// ============================================================================
+// x86::Compiler - X86Test_AlignNone
+// =================================
-class X86Test_NoAlign : public X86Test {
+class X86Test_NoAlign : public X86TestCase {
public:
- X86Test_NoAlign() : X86Test("NoAlign") {}
+ X86Test_NoAlign() : X86TestCase("NoAlign") {}
- static void add(X86TestApp& app) {
+ static void add(TestApp& app) {
app.add(new X86Test_NoAlign());
}
virtual void compile(x86::Compiler& cc) {
- cc.addFunc(FuncSignatureT<void>(CallConv::kIdHost));
- cc.align(kAlignCode, 0);
- cc.align(kAlignCode, 1);
+ cc.addFunc(FuncSignatureT<void>(CallConvId::kHost));
+ cc.align(AlignMode::kCode, 0);
+ cc.align(AlignMode::kCode, 1);
cc.endFunc();
}
@@ -498,22 +265,19 @@ public:
}
};
-// ============================================================================
-// [X86Test_JumpMerge]
-// ============================================================================
+// x86::Compiler - X86Test_JumpMerge
+// =================================
-class X86Test_JumpMerge : public X86Test {
+class X86Test_JumpMerge : public X86TestCase {
public:
- X86Test_JumpMerge() : X86Test("JumpMerge") {}
+ X86Test_JumpMerge() : X86TestCase("JumpMerge") {}
- static void add(X86TestApp& app) {
+ static void add(TestApp& app) {
app.add(new X86Test_JumpMerge());
}
virtual void compile(x86::Compiler& cc) {
- cc.addFunc(FuncSignatureT<void, int*, int>(CallConv::kIdHost));
-
- Label L0 = cc.newLabel();
+ Label L0 = cc.newLabel();
Label L1 = cc.newLabel();
Label L2 = cc.newLabel();
Label LEnd = cc.newLabel();
@@ -521,8 +285,9 @@ public:
x86::Gp dst = cc.newIntPtr("dst");
x86::Gp val = cc.newInt32("val");
- cc.setArg(0, dst);
- cc.setArg(1, val);
+ FuncNode* funcNode = cc.addFunc(FuncSignatureT<void, int*, int>(CallConvId::kHost));
+ funcNode->setArg(0, dst);
+ funcNode->setArg(1, val);
cc.cmp(val, 0);
cc.je(L2);
@@ -564,20 +329,19 @@ public:
}
};
-// ============================================================================
-// [X86Test_JumpCross]
-// ============================================================================
+// x86::Compiler - X86Test_JumpCross
+// =================================
-class X86Test_JumpCross : public X86Test {
+class X86Test_JumpCross : public X86TestCase {
public:
- X86Test_JumpCross() : X86Test("JumpCross") {}
+ X86Test_JumpCross() : X86TestCase("JumpCross") {}
- static void add(X86TestApp& app) {
+ static void add(TestApp& app) {
app.add(new X86Test_JumpCross());
}
virtual void compile(x86::Compiler& cc) {
- cc.addFunc(FuncSignatureT<void>(CallConv::kIdHost));
+ cc.addFunc(FuncSignatureT<void>(CallConvId::kHost));
Label L1 = cc.newLabel();
Label L2 = cc.newLabel();
@@ -606,20 +370,19 @@ public:
}
};
-// ============================================================================
-// [X86Test_JumpMany]
-// ============================================================================
+// x86::Compiler - X86Test_JumpMany
+// ================================
-class X86Test_JumpMany : public X86Test {
+class X86Test_JumpMany : public X86TestCase {
public:
- X86Test_JumpMany() : X86Test("JumpMany") {}
+ X86Test_JumpMany() : X86TestCase("JumpMany") {}
- static void add(X86TestApp& app) {
+ static void add(TestApp& app) {
app.add(new X86Test_JumpMany());
}
virtual void compile(x86::Compiler& cc) {
- cc.addFunc(FuncSignatureT<int>(CallConv::kIdHost));
+ cc.addFunc(FuncSignatureT<int>(CallConvId::kHost));
for (uint32_t i = 0; i < 1000; i++) {
Label L = cc.newLabel();
cc.jmp(L);
@@ -647,20 +410,19 @@ public:
}
};
-// ============================================================================
-// [X86Test_JumpUnreachable1]
-// ============================================================================
+// x86::Compiler - X86Test_JumpUnreachable1
+// ========================================
-class X86Test_JumpUnreachable1 : public X86Test {
+class X86Test_JumpUnreachable1 : public X86TestCase {
public:
- X86Test_JumpUnreachable1() : X86Test("JumpUnreachable1") {}
+ X86Test_JumpUnreachable1() : X86TestCase("JumpUnreachable1") {}
- static void add(X86TestApp& app) {
+ static void add(TestApp& app) {
app.add(new X86Test_JumpUnreachable1());
}
virtual void compile(x86::Compiler& cc) {
- cc.addFunc(FuncSignatureT<void>(CallConv::kIdHost));
+ cc.addFunc(FuncSignatureT<void>(CallConvId::kHost));
Label L_1 = cc.newLabel();
Label L_2 = cc.newLabel();
@@ -691,7 +453,7 @@ public:
cc.bind(L_7);
cc.add(v0, v1);
- cc.align(kAlignCode, 16);
+ cc.align(AlignMode::kCode, 16);
cc.bind(L_1);
cc.ret();
cc.endFunc();
@@ -710,20 +472,19 @@ public:
}
};
-// ============================================================================
-// [X86Test_JumpUnreachable2]
-// ============================================================================
+// x86::Compiler - X86Test_JumpUnreachable2
+// ========================================
-class X86Test_JumpUnreachable2 : public X86Test {
+class X86Test_JumpUnreachable2 : public X86TestCase {
public:
- X86Test_JumpUnreachable2() : X86Test("JumpUnreachable2") {}
+ X86Test_JumpUnreachable2() : X86TestCase("JumpUnreachable2") {}
- static void add(X86TestApp& app) {
+ static void add(TestApp& app) {
app.add(new X86Test_JumpUnreachable2());
}
virtual void compile(x86::Compiler& cc) {
- cc.addFunc(FuncSignatureT<void>(CallConv::kIdHost));
+ cc.addFunc(FuncSignatureT<void>(CallConvId::kHost));
Label L_1 = cc.newLabel();
Label L_2 = cc.newLabel();
@@ -757,16 +518,15 @@ public:
}
};
-// ============================================================================
-// [X86Test_JumpTable]
-// ============================================================================
+// x86::Compiler - X86Test_JumpTable1
+// ==================================
-class X86Test_JumpTable : public X86Test {
+class X86Test_JumpTable1 : public X86TestCase {
public:
bool _annotated;
- X86Test_JumpTable(bool annotated)
- : X86Test("X86Test_JumpTable"),
+ X86Test_JumpTable1(bool annotated)
+ : X86TestCase("X86Test_JumpTable1"),
_annotated(annotated) {
_name.assignFormat("JumpTable {%s}", annotated ? "Annotated" : "Unknown Reg/Mem");
}
@@ -778,31 +538,29 @@ public:
kOperatorDiv = 3
};
- static void add(X86TestApp& app) {
- app.add(new X86Test_JumpTable(false));
- app.add(new X86Test_JumpTable(true));
+ static void add(TestApp& app) {
+ app.add(new X86Test_JumpTable1(false));
+ app.add(new X86Test_JumpTable1(true));
}
virtual void compile(x86::Compiler& cc) {
- cc.addFunc(FuncSignatureT<float, float, float, uint32_t>(CallConv::kIdHost));
-
x86::Xmm a = cc.newXmmSs("a");
x86::Xmm b = cc.newXmmSs("b");
x86::Gp op = cc.newUInt32("op");
x86::Gp target = cc.newIntPtr("target");
x86::Gp offset = cc.newIntPtr("offset");
- Label L_End = cc.newLabel();
-
Label L_Table = cc.newLabel();
Label L_Add = cc.newLabel();
Label L_Sub = cc.newLabel();
Label L_Mul = cc.newLabel();
Label L_Div = cc.newLabel();
+ Label L_End = cc.newLabel();
- cc.setArg(0, a);
- cc.setArg(1, b);
- cc.setArg(2, op);
+ FuncNode* funcNode = cc.addFunc(FuncSignatureT<float, float, float, uint32_t>(CallConvId::kHost));
+ funcNode->setArg(0, a);
+ funcNode->setArg(1, b);
+ funcNode->setArg(2, op);
cc.lea(offset, x86::ptr(L_Table));
if (cc.is64Bit())
@@ -876,20 +634,100 @@ public:
}
};
-// ============================================================================
-// [X86Test_AllocBase]
-// ============================================================================
+// x86::Compiler - X86Test_JumpTable2
+// ==================================
+
+class X86Test_JumpTable2 : public X86TestCase {
+public:
+ X86Test_JumpTable2()
+ : X86TestCase("JumpTable {Jumping to Begin}") {}
+
+ static void add(TestApp& app) {
+ app.add(new X86Test_JumpTable2());
+ }
+
+ virtual void compile(x86::Compiler& cc) {
+ x86::Gp result = cc.newUInt32("result");
+ x86::Gp value = cc.newUInt32("value");
+ x86::Gp target = cc.newIntPtr("target");
+ x86::Gp offset = cc.newIntPtr("offset");
+
+ Label L_Table = cc.newLabel();
+ Label L_Begin = cc.newLabel();
+ Label L_Case0 = cc.newLabel();
+ Label L_Case1 = cc.newLabel();
+ Label L_End = cc.newLabel();
+
+ FuncNode* funcNode = cc.addFunc(FuncSignatureT<int, int>(CallConvId::kHost));
+ funcNode->setArg(0, value);
+
+ cc.bind(L_Begin);
+ cc.lea(offset, x86::ptr(L_Table));
+ if (cc.is64Bit())
+ cc.movsxd(target, x86::dword_ptr(offset, value.cloneAs(offset), 2));
+ else
+ cc.mov(target, x86::dword_ptr(offset, value.cloneAs(offset), 2));
+ cc.add(target, offset);
+
+ {
+ JumpAnnotation* annotation = cc.newJumpAnnotation();
+ annotation->addLabel(L_Case0);
+ annotation->addLabel(L_Case1);
+ annotation->addLabel(L_Begin); // Never used, just for the purpose of the test.
+ cc.jmp(target, annotation);
+
+ cc.bind(L_Case0);
+ cc.mov(result, 0);
+ cc.jmp(L_End);
+
+ cc.bind(L_Case1);
+ cc.mov(result, 1);
+ cc.jmp(L_End);
+ }
+
+ cc.bind(L_End);
+ cc.ret(result);
+
+ cc.endFunc();
+
+ cc.bind(L_Table);
+ cc.embedLabelDelta(L_Case0, L_Table, 4);
+ cc.embedLabelDelta(L_Case1, L_Table, 4);
+ }
+
+ virtual bool run(void* _func, String& result, String& expect) {
+ typedef int (*Func)(int);
+ Func func = ptr_as_func<Func>(_func);
+
+ int results[2];
+ int expected[2];
+
+ results[0] = func(0);
+ results[1] = func(1);
+
+ expected[0] = 0;
+ expected[1] = 1;
+
+ result.assignFormat("ret={%d, %d}", results[0], results[1]);
+ expect.assignFormat("ret={%d, %d}", expected[0], expected[1]);
+
+ return result == expect;
+ }
+};
+
+// x86::Compiler - X86Test_AllocBase
+// =================================
-class X86Test_AllocBase : public X86Test {
+class X86Test_AllocBase : public X86TestCase {
public:
- X86Test_AllocBase() : X86Test("AllocBase") {}
+ X86Test_AllocBase() : X86TestCase("AllocBase") {}
- static void add(X86TestApp& app) {
+ static void add(TestApp& app) {
app.add(new X86Test_AllocBase());
}
virtual void compile(x86::Compiler& cc) {
- cc.addFunc(FuncSignatureT<int>(CallConv::kIdHost));
+ cc.addFunc(FuncSignatureT<int>(CallConvId::kHost));
x86::Gp v0 = cc.newInt32("v0");
x86::Gp v1 = cc.newInt32("v1");
@@ -927,28 +765,26 @@ public:
}
};
-// ============================================================================
-// [X86Test_AllocMany1]
-// ============================================================================
+// x86::Compiler - X86Test_AllocMany1
+// ==================================
-class X86Test_AllocMany1 : public X86Test {
+class X86Test_AllocMany1 : public X86TestCase {
public:
- X86Test_AllocMany1() : X86Test("AllocMany1") {}
+ X86Test_AllocMany1() : X86TestCase("AllocMany1") {}
enum { kCount = 8 };
- static void add(X86TestApp& app) {
+ static void add(TestApp& app) {
app.add(new X86Test_AllocMany1());
}
virtual void compile(x86::Compiler& cc) {
- cc.addFunc(FuncSignatureT<void, int*, int*>(CallConv::kIdHost));
-
x86::Gp a0 = cc.newIntPtr("a0");
x86::Gp a1 = cc.newIntPtr("a1");
- cc.setArg(0, a0);
- cc.setArg(1, a1);
+ FuncNode* funcNode = cc.addFunc(FuncSignatureT<void, int*, int*>(CallConvId::kHost));
+ funcNode->setArg(0, a0);
+ funcNode->setArg(1, a1);
// Create some variables.
x86::Gp t = cc.newInt32("t");
@@ -999,40 +835,37 @@ public:
}
};
-// ============================================================================
-// [X86Test_AllocMany2]
-// ============================================================================
+// x86::Compiler - X86Test_AllocMany2
+// ==================================
-class X86Test_AllocMany2 : public X86Test {
+class X86Test_AllocMany2 : public X86TestCase {
public:
- X86Test_AllocMany2() : X86Test("AllocMany2") {}
+ X86Test_AllocMany2() : X86TestCase("AllocMany2") {}
- static void add(X86TestApp& app) {
+ static void add(TestApp& app) {
app.add(new X86Test_AllocMany2());
}
virtual void compile(x86::Compiler& cc) {
- cc.addFunc(FuncSignatureT<void, uint32_t*>(CallConv::kIdHost));
-
x86::Gp a = cc.newIntPtr("a");
x86::Gp v[32];
- uint32_t i;
- cc.setArg(0, a);
+ FuncNode* funcNode = cc.addFunc(FuncSignatureT<void, uint32_t*>(CallConvId::kHost));
+ funcNode->setArg(0, a);
- for (i = 0; i < ASMJIT_ARRAY_SIZE(v); i++) v[i] = cc.newInt32("v%d", i);
- for (i = 0; i < ASMJIT_ARRAY_SIZE(v); i++) cc.xor_(v[i], v[i]);
+ for (uint32_t i = 0; i < ASMJIT_ARRAY_SIZE(v); i++) v[i] = cc.newInt32("v%d", i);
+ for (uint32_t i = 0; i < ASMJIT_ARRAY_SIZE(v); i++) cc.xor_(v[i], v[i]);
x86::Gp x = cc.newInt32("x");
Label L = cc.newLabel();
cc.mov(x, 32);
cc.bind(L);
- for (i = 0; i < ASMJIT_ARRAY_SIZE(v); i++) cc.add(v[i], i);
+ for (uint32_t i = 0; i < ASMJIT_ARRAY_SIZE(v); i++) cc.add(v[i], i);
cc.dec(x);
cc.jnz(L);
- for (i = 0; i < ASMJIT_ARRAY_SIZE(v); i++) cc.mov(x86::dword_ptr(a, int(i * 4)), v[i]);
+ for (uint32_t i = 0; i < ASMJIT_ARRAY_SIZE(v); i++) cc.mov(x86::dword_ptr(a, int(i * 4)), v[i]);
cc.endFunc();
}
@@ -1063,21 +896,18 @@ public:
}
};
-// ============================================================================
-// [X86Test_AllocImul1]
-// ============================================================================
+// x86::Compiler - X86Test_AllocImul1
+// ==================================
-class X86Test_AllocImul1 : public X86Test {
+class X86Test_AllocImul1 : public X86TestCase {
public:
- X86Test_AllocImul1() : X86Test("AllocImul1") {}
+ X86Test_AllocImul1() : X86TestCase("AllocImul1") {}
- static void add(X86TestApp& app) {
+ static void add(TestApp& app) {
app.add(new X86Test_AllocImul1());
}
virtual void compile(x86::Compiler& cc) {
- cc.addFunc(FuncSignatureT<void, int*, int*, int, int>(CallConv::kIdHost));
-
x86::Gp dstHi = cc.newIntPtr("dstHi");
x86::Gp dstLo = cc.newIntPtr("dstLo");
@@ -1085,13 +915,13 @@ public:
x86::Gp vLo = cc.newInt32("vLo");
x86::Gp src = cc.newInt32("src");
- cc.setArg(0, dstHi);
- cc.setArg(1, dstLo);
- cc.setArg(2, vLo);
- cc.setArg(3, src);
+ FuncNode* funcNode = cc.addFunc(FuncSignatureT<void, int*, int*, int, int>(CallConvId::kHost));
+ funcNode->setArg(0, dstHi);
+ funcNode->setArg(1, dstLo);
+ funcNode->setArg(2, vLo);
+ funcNode->setArg(3, src);
cc.imul(vHi, vLo, src);
-
cc.mov(x86::dword_ptr(dstHi), vHi);
cc.mov(x86::dword_ptr(dstLo), vLo);
cc.endFunc();
@@ -1119,26 +949,24 @@ public:
}
};
-// ============================================================================
-// [X86Test_AllocImul2]
-// ============================================================================
+// x86::Compiler - X86Test_AllocImul2
+// ==================================
-class X86Test_AllocImul2 : public X86Test {
+class X86Test_AllocImul2 : public X86TestCase {
public:
- X86Test_AllocImul2() : X86Test("AllocImul2") {}
+ X86Test_AllocImul2() : X86TestCase("AllocImul2") {}
- static void add(X86TestApp& app) {
+ static void add(TestApp& app) {
app.add(new X86Test_AllocImul2());
}
virtual void compile(x86::Compiler& cc) {
- cc.addFunc(FuncSignatureT<void, int*, const int*>(CallConv::kIdHost));
-
x86::Gp dst = cc.newIntPtr("dst");
x86::Gp src = cc.newIntPtr("src");
- cc.setArg(0, dst);
- cc.setArg(1, src);
+ FuncNode* funcNode = cc.addFunc(FuncSignatureT<void, int*, const int*>(CallConvId::kHost));
+ funcNode->setArg(0, dst);
+ funcNode->setArg(1, src);
for (unsigned int i = 0; i < 4; i++) {
x86::Gp x = cc.newInt32("x");
@@ -1173,27 +1001,25 @@ public:
}
};
-// ============================================================================
-// [X86Test_AllocIdiv1]
-// ============================================================================
+// x86::Compiler - X86Test_AllocIdiv1
+// ==================================
-class X86Test_AllocIdiv1 : public X86Test {
+class X86Test_AllocIdiv1 : public X86TestCase {
public:
- X86Test_AllocIdiv1() : X86Test("AllocIdiv1") {}
+ X86Test_AllocIdiv1() : X86TestCase("AllocIdiv1") {}
- static void add(X86TestApp& app) {
+ static void add(TestApp& app) {
app.add(new X86Test_AllocIdiv1());
}
virtual void compile(x86::Compiler& cc) {
- cc.addFunc(FuncSignatureT<int, int, int>(CallConv::kIdHost));
-
x86::Gp a = cc.newInt32("a");
x86::Gp b = cc.newInt32("b");
x86::Gp dummy = cc.newInt32("dummy");
- cc.setArg(0, a);
- cc.setArg(1, b);
+ FuncNode* funcNode = cc.addFunc(FuncSignatureT<int, int, int>(CallConvId::kHost));
+ funcNode->setArg(0, a);
+ funcNode->setArg(1, b);
cc.xor_(dummy, dummy);
cc.idiv(dummy, a, b);
@@ -1219,28 +1045,26 @@ public:
}
};
-// ============================================================================
-// [X86Test_AllocSetz]
-// ============================================================================
+// x86::Compiler - X86Test_AllocSetz
+// =================================
-class X86Test_AllocSetz : public X86Test {
+class X86Test_AllocSetz : public X86TestCase {
public:
- X86Test_AllocSetz() : X86Test("AllocSetz") {}
+ X86Test_AllocSetz() : X86TestCase("AllocSetz") {}
- static void add(X86TestApp& app) {
+ static void add(TestApp& app) {
app.add(new X86Test_AllocSetz());
}
virtual void compile(x86::Compiler& cc) {
- cc.addFunc(FuncSignatureT<void, int, int, char*>(CallConv::kIdHost));
-
x86::Gp src0 = cc.newInt32("src0");
x86::Gp src1 = cc.newInt32("src1");
x86::Gp dst0 = cc.newIntPtr("dst0");
- cc.setArg(0, src0);
- cc.setArg(1, src1);
- cc.setArg(2, dst0);
+ FuncNode* funcNode = cc.addFunc(FuncSignatureT<void, int, int, char*>(CallConvId::kHost));
+ funcNode->setArg(0, src0);
+ funcNode->setArg(1, src1);
+ funcNode->setArg(2, dst0);
cc.cmp(src0, src1);
cc.setz(x86::byte_ptr(dst0));
@@ -1270,34 +1094,31 @@ public:
}
};
-// ============================================================================
-// [X86Test_AllocShlRor]
-// ============================================================================
+// x86::Compiler - X86Test_AllocShlRor
+// ===================================
-class X86Test_AllocShlRor : public X86Test {
+class X86Test_AllocShlRor : public X86TestCase {
public:
- X86Test_AllocShlRor() : X86Test("AllocShlRor") {}
+ X86Test_AllocShlRor() : X86TestCase("AllocShlRor") {}
- static void add(X86TestApp& app) {
+ static void add(TestApp& app) {
app.add(new X86Test_AllocShlRor());
}
virtual void compile(x86::Compiler& cc) {
- cc.addFunc(FuncSignatureT<void, int*, int, int, int>(CallConv::kIdHost));
-
x86::Gp dst = cc.newIntPtr("dst");
x86::Gp var = cc.newInt32("var");
x86::Gp vShlParam = cc.newInt32("vShlParam");
x86::Gp vRorParam = cc.newInt32("vRorParam");
- cc.setArg(0, dst);
- cc.setArg(1, var);
- cc.setArg(2, vShlParam);
- cc.setArg(3, vRorParam);
+ FuncNode* funcNode = cc.addFunc(FuncSignatureT<void, int*, int, int, int>(CallConvId::kHost));
+ funcNode->setArg(0, dst);
+ funcNode->setArg(1, var);
+ funcNode->setArg(2, vShlParam);
+ funcNode->setArg(3, vRorParam);
cc.shl(var, vShlParam);
cc.ror(var, vRorParam);
-
cc.mov(x86::dword_ptr(dst), var);
cc.endFunc();
}
@@ -1320,41 +1141,37 @@ public:
}
};
-// ============================================================================
-// [X86Test_AllocGpbLo]
-// ============================================================================
+// x86::Compiler - X86Test_AllocGpbLo
+// ==================================
-class X86Test_AllocGpbLo1 : public X86Test {
+class X86Test_AllocGpbLo1 : public X86TestCase {
public:
- X86Test_AllocGpbLo1() : X86Test("AllocGpbLo1") {}
+ X86Test_AllocGpbLo1() : X86TestCase("AllocGpbLo1") {}
- enum { kCount = 32 };
+ enum : uint32_t { kCount = 32 };
- static void add(X86TestApp& app) {
+ static void add(TestApp& app) {
app.add(new X86Test_AllocGpbLo1());
}
virtual void compile(x86::Compiler& cc) {
- cc.addFunc(FuncSignatureT<uint32_t, uint32_t*>(CallConv::kIdHost));
-
x86::Gp rPtr = cc.newUIntPtr("rPtr");
x86::Gp rSum = cc.newUInt32("rSum");
-
- cc.setArg(0, rPtr);
-
x86::Gp x[kCount];
- uint32_t i;
- for (i = 0; i < kCount; i++) {
+ FuncNode* funcNode = cc.addFunc(FuncSignatureT<uint32_t, uint32_t*>(CallConvId::kHost));
+ funcNode->setArg(0, rPtr);
+
+ for (uint32_t i = 0; i < kCount; i++) {
x[i] = cc.newUInt32("x%u", i);
}
// Init pseudo-regs with values from our array.
- for (i = 0; i < kCount; i++) {
+ for (uint32_t i = 0; i < kCount; i++) {
cc.mov(x[i], x86::dword_ptr(rPtr, int(i * 4)));
}
- for (i = 2; i < kCount; i++) {
+ for (uint32_t i = 2; i < kCount; i++) {
// Add and truncate to 8 bit; no purpose, just mess with jit.
cc.add (x[i ], x[i-1]);
cc.movzx(x[i ], x[i ].r8());
@@ -1364,7 +1181,7 @@ public:
// Sum up all computed values.
cc.mov(rSum, 0);
- for (i = 0; i < kCount; i++) {
+ for (uint32_t i = 0; i < kCount; i++) {
cc.add(rSum, x[i]);
}
@@ -1410,23 +1227,23 @@ public:
}
};
-// ============================================================================
-// [X86Test_AllocGpbLo2]
-// ============================================================================
+// x86::Compiler - X86Test_AllocGpbLo2
+// ===================================
-class X86Test_AllocGpbLo2 : public X86Test {
+class X86Test_AllocGpbLo2 : public X86TestCase {
public:
- X86Test_AllocGpbLo2() : X86Test("AllocGpbLo2") {}
+ X86Test_AllocGpbLo2() : X86TestCase("AllocGpbLo2") {}
- static void add(X86TestApp& app) {
+ static void add(TestApp& app) {
app.add(new X86Test_AllocGpbLo2());
}
virtual void compile(x86::Compiler& cc) {
- cc.addFunc(FuncSignatureT<uint32_t, uint32_t>(CallConv::kIdHost));
-
x86::Gp v = cc.newUInt32("v");
- cc.setArg(0, v);
+
+ FuncNode* funcNode = cc.addFunc(FuncSignatureT<uint32_t, uint32_t>(CallConvId::kHost));
+ funcNode->setArg(0, v);
+
cc.mov(v.r8(), 0xFF);
cc.ret(v);
cc.endFunc();
@@ -1446,28 +1263,26 @@ public:
}
};
-// ============================================================================
-// [X86Test_AllocRepMovsb]
-// ============================================================================
+// x86::Compiler - X86Test_AllocRepMovsb
+// =====================================
-class X86Test_AllocRepMovsb : public X86Test {
+class X86Test_AllocRepMovsb : public X86TestCase {
public:
- X86Test_AllocRepMovsb() : X86Test("AllocRepMovsb") {}
+ X86Test_AllocRepMovsb() : X86TestCase("AllocRepMovsb") {}
- static void add(X86TestApp& app) {
+ static void add(TestApp& app) {
app.add(new X86Test_AllocRepMovsb());
}
virtual void compile(x86::Compiler& cc) {
- cc.addFunc(FuncSignatureT<void, void*, void*, size_t>(CallConv::kIdHost));
-
x86::Gp dst = cc.newIntPtr("dst");
x86::Gp src = cc.newIntPtr("src");
x86::Gp cnt = cc.newIntPtr("cnt");
- cc.setArg(0, dst);
- cc.setArg(1, src);
- cc.setArg(2, cnt);
+ FuncNode* funcNode = cc.addFunc(FuncSignatureT<void, void*, void*, size_t>(CallConvId::kHost));
+ funcNode->setArg(0, dst);
+ funcNode->setArg(1, src);
+ funcNode->setArg(2, cnt);
cc.rep(cnt).movs(x86::byte_ptr(dst), x86::byte_ptr(src));
cc.endFunc();
@@ -1488,29 +1303,27 @@ public:
}
};
-// ============================================================================
-// [X86Test_AllocIfElse1]
-// ============================================================================
+// x86::Compiler - X86Test_AllocIfElse1
+// ====================================
-class X86Test_AllocIfElse1 : public X86Test {
+class X86Test_AllocIfElse1 : public X86TestCase {
public:
- X86Test_AllocIfElse1() : X86Test("AllocIfElse1") {}
+ X86Test_AllocIfElse1() : X86TestCase("AllocIfElse1") {}
- static void add(X86TestApp& app) {
+ static void add(TestApp& app) {
app.add(new X86Test_AllocIfElse1());
}
virtual void compile(x86::Compiler& cc) {
- cc.addFunc(FuncSignatureT<int, int, int>(CallConv::kIdHost));
-
x86::Gp v1 = cc.newInt32("v1");
x86::Gp v2 = cc.newInt32("v2");
Label L_1 = cc.newLabel();
Label L_2 = cc.newLabel();
- cc.setArg(0, v1);
- cc.setArg(1, v2);
+ FuncNode* funcNode = cc.addFunc(FuncSignatureT<int, int, int>(CallConvId::kHost));
+ funcNode->setArg(0, v1);
+ funcNode->setArg(1, v2);
cc.cmp(v1, v2);
cc.jg(L_1);
@@ -1540,21 +1353,18 @@ public:
}
};
-// ============================================================================
-// [X86Test_AllocIfElse2]
-// ============================================================================
+// x86::Compiler - X86Test_AllocIfElse2
+// ====================================
-class X86Test_AllocIfElse2 : public X86Test {
+class X86Test_AllocIfElse2 : public X86TestCase {
public:
- X86Test_AllocIfElse2() : X86Test("AllocIfElse2") {}
+ X86Test_AllocIfElse2() : X86TestCase("AllocIfElse2") {}
- static void add(X86TestApp& app) {
+ static void add(TestApp& app) {
app.add(new X86Test_AllocIfElse2());
}
virtual void compile(x86::Compiler& cc) {
- cc.addFunc(FuncSignatureT<int, int, int>(CallConv::kIdHost));
-
x86::Gp v1 = cc.newInt32("v1");
x86::Gp v2 = cc.newInt32("v2");
@@ -1563,8 +1373,9 @@ public:
Label L_3 = cc.newLabel();
Label L_4 = cc.newLabel();
- cc.setArg(0, v1);
- cc.setArg(1, v2);
+ FuncNode* funcNode = cc.addFunc(FuncSignatureT<int, int, int>(CallConvId::kHost));
+ funcNode->setArg(0, v1);
+ funcNode->setArg(1, v2);
cc.jmp(L_1);
cc.bind(L_2);
@@ -1601,21 +1412,18 @@ public:
}
};
-// ============================================================================
-// [X86Test_AllocIfElse3]
-// ============================================================================
+// x86::Compiler - X86Test_AllocIfElse3
+// ====================================
-class X86Test_AllocIfElse3 : public X86Test {
+class X86Test_AllocIfElse3 : public X86TestCase {
public:
- X86Test_AllocIfElse3() : X86Test("AllocIfElse3") {}
+ X86Test_AllocIfElse3() : X86TestCase("AllocIfElse3") {}
- static void add(X86TestApp& app) {
+ static void add(TestApp& app) {
app.add(new X86Test_AllocIfElse3());
}
virtual void compile(x86::Compiler& cc) {
- cc.addFunc(FuncSignatureT<int, int, int>(CallConv::kIdHost));
-
x86::Gp v1 = cc.newInt32("v1");
x86::Gp v2 = cc.newInt32("v2");
x86::Gp counter = cc.newInt32("counter");
@@ -1624,8 +1432,9 @@ public:
Label L_Loop = cc.newLabel();
Label L_Exit = cc.newLabel();
- cc.setArg(0, v1);
- cc.setArg(1, v2);
+ FuncNode* funcNode = cc.addFunc(FuncSignatureT<int, int, int>(CallConvId::kHost));
+ funcNode->setArg(0, v1);
+ funcNode->setArg(1, v2);
cc.cmp(v1, v2);
cc.jg(L_1);
@@ -1662,21 +1471,18 @@ public:
}
};
-// ============================================================================
-// [X86Test_AllocIfElse4]
-// ============================================================================
+// x86::Compiler - X86Test_AllocIfElse4
+// ====================================
-class X86Test_AllocIfElse4 : public X86Test {
+class X86Test_AllocIfElse4 : public X86TestCase {
public:
- X86Test_AllocIfElse4() : X86Test("AllocIfElse4") {}
+ X86Test_AllocIfElse4() : X86TestCase("AllocIfElse4") {}
- static void add(X86TestApp& app) {
+ static void add(TestApp& app) {
app.add(new X86Test_AllocIfElse4());
}
virtual void compile(x86::Compiler& cc) {
- cc.addFunc(FuncSignatureT<int, int, int>(CallConv::kIdHost));
-
x86::Gp v1 = cc.newInt32("v1");
x86::Gp v2 = cc.newInt32("v2");
x86::Gp counter = cc.newInt32("counter");
@@ -1686,11 +1492,11 @@ public:
Label L_Loop2 = cc.newLabel();
Label L_Exit = cc.newLabel();
- cc.mov(counter, 0);
-
- cc.setArg(0, v1);
- cc.setArg(1, v2);
+ FuncNode* funcNode = cc.addFunc(FuncSignatureT<int, int, int>(CallConvId::kHost));
+ funcNode->setArg(0, v1);
+ funcNode->setArg(1, v2);
+ cc.mov(counter, 0);
cc.cmp(v1, v2);
cc.jg(L_1);
@@ -1728,15 +1534,14 @@ public:
}
};
-// ============================================================================
-// [X86Test_AllocInt8]
-// ============================================================================
+// x86::Compiler - X86Test_AllocInt8
+// =================================
-class X86Test_AllocInt8 : public X86Test {
+class X86Test_AllocInt8 : public X86TestCase {
public:
- X86Test_AllocInt8() : X86Test("AllocInt8") {}
+ X86Test_AllocInt8() : X86TestCase("AllocInt8") {}
- static void add(X86TestApp& app) {
+ static void add(TestApp& app) {
app.add(new X86Test_AllocInt8());
}
@@ -1744,8 +1549,8 @@ public:
x86::Gp x = cc.newInt8("x");
x86::Gp y = cc.newInt32("y");
- cc.addFunc(FuncSignatureT<int, char>(CallConv::kIdHost));
- cc.setArg(0, x);
+ FuncNode* funcNode = cc.addFunc(FuncSignatureT<int, char>(CallConvId::kHost));
+ funcNode->setArg(0, x);
cc.movsx(y, x);
@@ -1767,25 +1572,24 @@ public:
}
};
-// ============================================================================
-// [X86Test_AllocUnhandledArg]
-// ============================================================================
+// x86::Compiler - X86Test_AllocUnhandledArg
+// =========================================
-class X86Test_AllocUnhandledArg : public X86Test {
+class X86Test_AllocUnhandledArg : public X86TestCase {
public:
- X86Test_AllocUnhandledArg() : X86Test("AllocUnhandledArg") {}
+ X86Test_AllocUnhandledArg() : X86TestCase("AllocUnhandledArg") {}
- static void add(X86TestApp& app) {
+ static void add(TestApp& app) {
app.add(new X86Test_AllocUnhandledArg());
}
virtual void compile(x86::Compiler& cc) {
- cc.addFunc(FuncSignatureT<int, int, int, int>(CallConv::kIdHost));
-
x86::Gp x = cc.newInt32("x");
- cc.setArg(2, x);
- cc.ret(x);
+ FuncNode* funcNode = cc.addFunc(FuncSignatureT<int, int, int, int>(CallConvId::kHost));
+ funcNode->setArg(2, x);
+
+ cc.ret(x);
cc.endFunc();
}
@@ -1803,36 +1607,33 @@ public:
}
};
-// ============================================================================
-// [X86Test_AllocArgsIntPtr]
-// ============================================================================
+// x86::Compiler - X86Test_AllocArgsIntPtr
+// =======================================
-class X86Test_AllocArgsIntPtr : public X86Test {
+class X86Test_AllocArgsIntPtr : public X86TestCase {
public:
- X86Test_AllocArgsIntPtr() : X86Test("AllocArgsIntPtr") {}
+ X86Test_AllocArgsIntPtr() : X86TestCase("AllocArgsIntPtr") {}
- static void add(X86TestApp& app) {
+ static void add(TestApp& app) {
app.add(new X86Test_AllocArgsIntPtr());
}
virtual void compile(x86::Compiler& cc) {
- cc.addFunc(FuncSignatureT<void, void*, void*, void*, void*, void*, void*, void*, void*>(CallConv::kIdHost));
-
- uint32_t i;
+ FuncNode* funcNode = cc.addFunc(FuncSignatureT<void, void*, void*, void*, void*, void*, void*, void*, void*>(CallConvId::kHost));
x86::Gp var[8];
- for (i = 0; i < 8; i++) {
+ for (uint32_t i = 0; i < 8; i++) {
var[i] = cc.newIntPtr("var%u", i);
- cc.setArg(i, var[i]);
+ funcNode->setArg(i, var[i]);
}
- for (i = 0; i < 8; i++) {
+ for (uint32_t i = 0; i < 8; i++) {
cc.add(var[i], int(i + 1));
}
// Move some data into buffer provided by arguments so we can verify if it
// really works without looking into assembler output.
- for (i = 0; i < 8; i++) {
+ for (uint32_t i = 0; i < 8; i++) {
cc.add(x86::byte_ptr(var[i]), int(i + 1));
}
@@ -1862,32 +1663,29 @@ public:
}
};
-// ============================================================================
-// [X86Test_AllocArgsFloat]
-// ============================================================================
+// x86::Compiler - X86Test_AllocArgsFloat
+// ======================================
-class X86Test_AllocArgsFloat : public X86Test {
+class X86Test_AllocArgsFloat : public X86TestCase {
public:
- X86Test_AllocArgsFloat() : X86Test("AllocArgsFloat") {}
+ X86Test_AllocArgsFloat() : X86TestCase("AllocArgsFloat") {}
- static void add(X86TestApp& app) {
+ static void add(TestApp& app) {
app.add(new X86Test_AllocArgsFloat());
}
virtual void compile(x86::Compiler& cc) {
- cc.addFunc(FuncSignatureT<void, float, float, float, float, float, float, float, void*>(CallConv::kIdHost));
-
- uint32_t i;
+ FuncNode* funcNode = cc.addFunc(FuncSignatureT<void, float, float, float, float, float, float, float, void*>(CallConvId::kHost));
x86::Gp p = cc.newIntPtr("p");
x86::Xmm xv[7];
- for (i = 0; i < 7; i++) {
+ for (uint32_t i = 0; i < 7; i++) {
xv[i] = cc.newXmmSs("xv%u", i);
- cc.setArg(i, xv[i]);
+ funcNode->setArg(i, xv[i]);
}
- cc.setArg(7, p);
+ funcNode->setArg(7, p);
cc.addss(xv[0], xv[1]);
cc.addss(xv[0], xv[2]);
@@ -1916,32 +1714,29 @@ public:
}
};
-// ============================================================================
-// [X86Test_AllocArgsDouble]
-// ============================================================================
+// x86::Compiler - X86Test_AllocArgsDouble
+// =======================================
-class X86Test_AllocArgsDouble : public X86Test {
+class X86Test_AllocArgsDouble : public X86TestCase {
public:
- X86Test_AllocArgsDouble() : X86Test("AllocArgsDouble") {}
+ X86Test_AllocArgsDouble() : X86TestCase("AllocArgsDouble") {}
- static void add(X86TestApp& app) {
+ static void add(TestApp& app) {
app.add(new X86Test_AllocArgsDouble());
}
virtual void compile(x86::Compiler& cc) {
- cc.addFunc(FuncSignatureT<void, double, double, double, double, double, double, double, void*>(CallConv::kIdHost));
-
- uint32_t i;
+ FuncNode* funcNode = cc.addFunc(FuncSignatureT<void, double, double, double, double, double, double, double, void*>(CallConvId::kHost));
x86::Gp p = cc.newIntPtr("p");
x86::Xmm xv[7];
- for (i = 0; i < 7; i++) {
+ for (uint32_t i = 0; i < 7; i++) {
xv[i] = cc.newXmmSd("xv%u", i);
- cc.setArg(i, xv[i]);
+ funcNode->setArg(i, xv[i]);
}
- cc.setArg(7, p);
+ funcNode->setArg(7, p);
cc.addsd(xv[0], xv[1]);
cc.addsd(xv[0], xv[2]);
@@ -1970,29 +1765,29 @@ public:
}
};
-// ============================================================================
-// [X86Test_AllocArgsVec]
-// ============================================================================
+// x86::Compiler - X86Test_AllocArgsVec
+// ====================================
-class X86Test_AllocArgsVec : public X86Test {
+class X86Test_AllocArgsVec : public X86TestCase {
public:
- X86Test_AllocArgsVec() : X86Test("AllocArgsVec") {}
+ X86Test_AllocArgsVec() : X86TestCase("AllocArgsVec") {}
- static void add(X86TestApp& app) {
+ static void add(TestApp& app) {
// Not supported on Windows.
#ifndef _WIN32
app.add(new X86Test_AllocArgsVec());
+#else
+ DebugUtils::unused(app);
#endif
}
virtual void compile(x86::Compiler& cc) {
- cc.addFunc(FuncSignatureT<x86::Xmm, x86::Xmm, x86::Xmm>(CallConv::kIdHost));
-
x86::Xmm a = cc.newXmm("aXmm");
x86::Xmm b = cc.newXmm("bXmm");
- cc.setArg(0, a);
- cc.setArg(1, b);
+ FuncNode* funcNode = cc.addFunc(FuncSignatureT<x86::Xmm, x86::Xmm, x86::Xmm>(CallConvId::kHost));
+ funcNode->setArg(0, a);
+ funcNode->setArg(1, b);
cc.paddb(a, b);
cc.ret(a);
@@ -2023,25 +1818,24 @@ public:
}
};
-// ============================================================================
-// [X86Test_AllocRetFloat1]
-// ============================================================================
+// x86::Compiler - X86Test_AllocRetFloat1
+// ======================================
-class X86Test_AllocRetFloat1 : public X86Test {
+class X86Test_AllocRetFloat1 : public X86TestCase {
public:
- X86Test_AllocRetFloat1() : X86Test("AllocRetFloat1") {}
+ X86Test_AllocRetFloat1() : X86TestCase("AllocRetFloat1") {}
- static void add(X86TestApp& app) {
+ static void add(TestApp& app) {
app.add(new X86Test_AllocRetFloat1());
}
virtual void compile(x86::Compiler& cc) {
- cc.addFunc(FuncSignatureT<float, float>(CallConv::kIdHost));
-
x86::Xmm x = cc.newXmmSs("x");
- cc.setArg(0, x);
- cc.ret(x);
+ FuncNode* funcNode = cc.addFunc(FuncSignatureT<float, float>(CallConvId::kHost));
+ funcNode->setArg(0, x);
+
+ cc.ret(x);
cc.endFunc();
}
@@ -2059,26 +1853,24 @@ public:
}
};
-// ============================================================================
-// [X86Test_AllocRetFloat2]
-// ============================================================================
+// x86::Compiler - X86Test_AllocRetFloat2
+// ======================================
-class X86Test_AllocRetFloat2 : public X86Test {
+class X86Test_AllocRetFloat2 : public X86TestCase {
public:
- X86Test_AllocRetFloat2() : X86Test("AllocRetFloat2") {}
+ X86Test_AllocRetFloat2() : X86TestCase("AllocRetFloat2") {}
- static void add(X86TestApp& app) {
+ static void add(TestApp& app) {
app.add(new X86Test_AllocRetFloat2());
}
virtual void compile(x86::Compiler& cc) {
- cc.addFunc(FuncSignatureT<float, float, float>(CallConv::kIdHost));
-
x86::Xmm x = cc.newXmmSs("x");
x86::Xmm y = cc.newXmmSs("y");
- cc.setArg(0, x);
- cc.setArg(1, y);
+ FuncNode* funcNode = cc.addFunc(FuncSignatureT<float, float, float>(CallConvId::kHost));
+ funcNode->setArg(0, x);
+ funcNode->setArg(1, y);
cc.addss(x, y);
cc.ret(x);
@@ -2100,25 +1892,24 @@ public:
}
};
-// ============================================================================
-// [X86Test_AllocRetDouble1]
-// ============================================================================
+// x86::Compiler - X86Test_AllocRetDouble1
+// =======================================
-class X86Test_AllocRetDouble1 : public X86Test {
+class X86Test_AllocRetDouble1 : public X86TestCase {
public:
- X86Test_AllocRetDouble1() : X86Test("AllocRetDouble1") {}
+ X86Test_AllocRetDouble1() : X86TestCase("AllocRetDouble1") {}
- static void add(X86TestApp& app) {
+ static void add(TestApp& app) {
app.add(new X86Test_AllocRetDouble1());
}
virtual void compile(x86::Compiler& cc) {
- cc.addFunc(FuncSignatureT<double, double>(CallConv::kIdHost));
-
x86::Xmm x = cc.newXmmSd("x");
- cc.setArg(0, x);
- cc.ret(x);
+ FuncNode* funcNode = cc.addFunc(FuncSignatureT<double, double>(CallConvId::kHost));
+ funcNode->setArg(0, x);
+
+ cc.ret(x);
cc.endFunc();
}
@@ -2135,26 +1926,25 @@ public:
return resultRet == expectRet;
}
};
-// ============================================================================
-// [X86Test_AllocRetDouble2]
-// ============================================================================
-class X86Test_AllocRetDouble2 : public X86Test {
+// x86::Compiler - X86Test_AllocRetDouble2
+// =======================================
+
+class X86Test_AllocRetDouble2 : public X86TestCase {
public:
- X86Test_AllocRetDouble2() : X86Test("AllocRetDouble2") {}
+ X86Test_AllocRetDouble2() : X86TestCase("AllocRetDouble2") {}
- static void add(X86TestApp& app) {
+ static void add(TestApp& app) {
app.add(new X86Test_AllocRetDouble2());
}
virtual void compile(x86::Compiler& cc) {
- cc.addFunc(FuncSignatureT<double, double, double>(CallConv::kIdHost));
-
x86::Xmm x = cc.newXmmSd("x");
x86::Xmm y = cc.newXmmSd("y");
- cc.setArg(0, x);
- cc.setArg(1, y);
+ FuncNode* funcNode = cc.addFunc(FuncSignatureT<double, double, double>(CallConvId::kHost));
+ funcNode->setArg(0, x);
+ funcNode->setArg(1, y);
cc.addsd(x, y);
cc.ret(x);
@@ -2176,22 +1966,21 @@ public:
}
};
-// ============================================================================
-// [X86Test_AllocStack]
-// ============================================================================
+// x86::Compiler - X86Test_AllocStack
+// ==================================
-class X86Test_AllocStack : public X86Test {
+class X86Test_AllocStack : public X86TestCase {
public:
- X86Test_AllocStack() : X86Test("AllocStack") {}
+ X86Test_AllocStack() : X86TestCase("AllocStack") {}
enum { kSize = 256 };
- static void add(X86TestApp& app) {
+ static void add(TestApp& app) {
app.add(new X86Test_AllocStack());
}
virtual void compile(x86::Compiler& cc) {
- cc.addFunc(FuncSignatureT<int>(CallConv::kIdHost));
+ cc.addFunc(FuncSignatureT<int>(CallConvId::kHost));
x86::Mem stack = cc.newStack(kSize, 1);
stack.setSize(1);
@@ -2244,17 +2033,16 @@ public:
}
};
-// ============================================================================
-// [X86Test_AllocMemcpy]
-// ============================================================================
+// x86::Compiler - X86Test_AllocMemcpy
+// ===================================
-class X86Test_AllocMemcpy : public X86Test {
+class X86Test_AllocMemcpy : public X86TestCase {
public:
- X86Test_AllocMemcpy() : X86Test("AllocMemcpy") {}
+ X86Test_AllocMemcpy() : X86TestCase("AllocMemcpy") {}
enum { kCount = 32 };
- static void add(X86TestApp& app) {
+ static void add(TestApp& app) {
app.add(new X86Test_AllocMemcpy());
}
@@ -2266,10 +2054,10 @@ public:
Label L_Loop = cc.newLabel(); // Create base labels we use
Label L_Exit = cc.newLabel(); // in our function.
- cc.addFunc(FuncSignatureT<void, uint32_t*, const uint32_t*, size_t>(CallConv::kIdHost));
- cc.setArg(0, dst);
- cc.setArg(1, src);
- cc.setArg(2, cnt);
+ FuncNode* funcNode = cc.addFunc(FuncSignatureT<void, uint32_t*, const uint32_t*, size_t>(CallConvId::kHost));
+ funcNode->setArg(0, dst);
+ funcNode->setArg(1, src);
+ funcNode->setArg(2, cnt);
cc.test(cnt, cnt); // Exit if the size is zero.
cc.jz(L_Exit);
@@ -2326,15 +2114,14 @@ public:
}
};
-// ============================================================================
-// [X86Test_AllocExtraBlock]
-// ============================================================================
+// x86::Compiler - X86Test_AllocExtraBlock
+// =======================================
-class X86Test_AllocExtraBlock : public X86Test {
+class X86Test_AllocExtraBlock : public X86TestCase {
public:
- X86Test_AllocExtraBlock() : X86Test("AllocExtraBlock") {}
+ X86Test_AllocExtraBlock() : X86TestCase("AllocExtraBlock") {}
- static void add(X86TestApp& app) {
+ static void add(TestApp& app) {
app.add(new X86Test_AllocExtraBlock());
}
@@ -2344,10 +2131,10 @@ public:
x86::Gp a = cc.newInt32("a");
x86::Gp b = cc.newInt32("b");
- cc.addFunc(FuncSignatureT<int, int, int, int>(CallConv::kIdHost));
- cc.setArg(0, cond);
- cc.setArg(1, a);
- cc.setArg(2, b);
+ FuncNode* funcNode = cc.addFunc(FuncSignatureT<int, int, int, int>(CallConvId::kHost));
+ funcNode->setArg(0, cond);
+ funcNode->setArg(1, a);
+ funcNode->setArg(2, b);
Label L_Ret = cc.newLabel();
Label L_Extra = cc.newLabel();
@@ -2362,7 +2149,7 @@ public:
cc.ret(ret);
// Emit code sequence at the end of the function.
- BaseNode* prevCursor = cc.setCursor(cc.func()->endNode()->prev());
+ BaseNode* prevCursor = cc.setCursor(funcNode->endNode()->prev());
cc.bind(L_Extra);
cc.mov(ret, a);
cc.sub(ret, b);
@@ -2389,17 +2176,16 @@ public:
}
};
-// ============================================================================
-// [X86Test_AllocAlphaBlend]
-// ============================================================================
+// x86::Compiler - X86Test_AllocAlphaBlend
+// =======================================
-class X86Test_AllocAlphaBlend : public X86Test {
+class X86Test_AllocAlphaBlend : public X86TestCase {
public:
- X86Test_AllocAlphaBlend() : X86Test("AllocAlphaBlend") {}
+ X86Test_AllocAlphaBlend() : X86TestCase("AllocAlphaBlend") {}
enum { kCount = 17 };
- static void add(X86TestApp& app) {
+ static void add(TestApp& app) {
app.add(new X86Test_AllocAlphaBlend());
}
@@ -2419,7 +2205,7 @@ public:
}
virtual void compile(x86::Compiler& cc) {
- asmtest::generateAlphaBlend(cc);
+ asmtest::generateSseAlphaBlend(cc, true);
}
virtual bool run(void* _func, String& result, String& expect) {
@@ -2468,15 +2254,14 @@ public:
}
};
-// ============================================================================
-// [X86Test_FuncCallBase1]
-// ============================================================================
+// x86::Compiler - X86Test_FuncCallBase1
+// =====================================
-class X86Test_FuncCallBase1 : public X86Test {
+class X86Test_FuncCallBase1 : public X86TestCase {
public:
- X86Test_FuncCallBase1() : X86Test("FuncCallBase1") {}
+ X86Test_FuncCallBase1() : X86TestCase("FuncCallBase1") {}
- static void add(X86TestApp& app) {
+ static void add(TestApp& app) {
app.add(new X86Test_FuncCallBase1());
}
@@ -2485,10 +2270,10 @@ public:
x86::Gp v1 = cc.newInt32("v1");
x86::Gp v2 = cc.newInt32("v2");
- cc.addFunc(FuncSignatureT<int, int, int, int>(CallConv::kIdHost));
- cc.setArg(0, v0);
- cc.setArg(1, v1);
- cc.setArg(2, v2);
+ FuncNode* funcNode = cc.addFunc(FuncSignatureT<int, int, int, int>(CallConvId::kHost));
+ funcNode->setArg(0, v0);
+ funcNode->setArg(1, v1);
+ funcNode->setArg(2, v2);
// Just do something.
cc.shl(v0, 1);
@@ -2497,7 +2282,7 @@ public:
// Call a function.
InvokeNode* invokeNode;
- cc.invoke(&invokeNode, imm((void*)calledFunc), FuncSignatureT<int, int, int, int>(CallConv::kIdHost));
+ cc.invoke(&invokeNode, imm((void*)calledFunc), FuncSignatureT<int, int, int, int>(CallConvId::kHost));
invokeNode->setArg(0, v2);
invokeNode->setArg(1, v1);
invokeNode->setArg(2, v0);
@@ -2523,22 +2308,21 @@ public:
static int calledFunc(int a, int b, int c) { return (a + b) * c; }
};
-// ============================================================================
-// [X86Test_FuncCallBase2]
-// ============================================================================
+// x86::Compiler - X86Test_FuncCallBase2
+// =====================================
-class X86Test_FuncCallBase2 : public X86Test {
+class X86Test_FuncCallBase2 : public X86TestCase {
public:
- X86Test_FuncCallBase2() : X86Test("FuncCallBase2") {}
+ X86Test_FuncCallBase2() : X86TestCase("FuncCallBase2") {}
enum { kSize = 256 };
- static void add(X86TestApp& app) {
+ static void add(TestApp& app) {
app.add(new X86Test_FuncCallBase2());
}
virtual void compile(x86::Compiler& cc) {
- cc.addFunc(FuncSignatureT<int>(CallConv::kIdHost));
+ cc.addFunc(FuncSignatureT<int>(CallConvId::kHost));
const int kTokenSize = 32;
@@ -2558,19 +2342,19 @@ public:
cc.lea(p2, s2);
// Try to corrupt the stack if wrongly allocated.
- cc.invoke(&invokeNode, imm((void*)memcpy), FuncSignatureT<void*, void*, void*, size_t>(CallConv::kIdCDecl));
+ cc.invoke(&invokeNode, imm((void*)memcpy), FuncSignatureT<void*, void*, void*, size_t>(CallConvId::kCDecl));
invokeNode->setArg(0, p1);
invokeNode->setArg(1, imm(token));
invokeNode->setArg(2, imm(kTokenSize));
invokeNode->setRet(0, p1);
- cc.invoke(&invokeNode, imm((void*)memcpy), FuncSignatureT<void*, void*, void*, size_t>(CallConv::kIdCDecl));
+ cc.invoke(&invokeNode, imm((void*)memcpy), FuncSignatureT<void*, void*, void*, size_t>(CallConvId::kCDecl));
invokeNode->setArg(0, p2);
invokeNode->setArg(1, imm(token));
invokeNode->setArg(2, imm(kTokenSize));
invokeNode->setRet(0, p2);
- cc.invoke(&invokeNode, imm((void*)memcmp), FuncSignatureT<int, void*, void*, size_t>(CallConv::kIdCDecl));
+ cc.invoke(&invokeNode, imm((void*)memcmp), FuncSignatureT<int, void*, void*, size_t>(CallConvId::kCDecl));
invokeNode->setArg(0, p1);
invokeNode->setArg(1, p2);
invokeNode->setArg(2, imm(kTokenSize));
@@ -2605,15 +2389,14 @@ public:
}
};
-// ============================================================================
-// [X86Test_FuncCallStd]
-// ============================================================================
+// x86::Compiler - X86Test_FuncCallStd
+// ===================================
-class X86Test_FuncCallStd : public X86Test {
+class X86Test_FuncCallStd : public X86TestCase {
public:
- X86Test_FuncCallStd() : X86Test("FuncCallStd") {}
+ X86Test_FuncCallStd() : X86TestCase("FuncCallStd") {}
- static void add(X86TestApp& app) {
+ static void add(TestApp& app) {
app.add(new X86Test_FuncCallStd());
}
@@ -2622,15 +2405,15 @@ public:
x86::Gp y = cc.newInt32("y");
x86::Gp z = cc.newInt32("z");
- cc.addFunc(FuncSignatureT<int, int, int, int>(CallConv::kIdHost));
- cc.setArg(0, x);
- cc.setArg(1, y);
- cc.setArg(2, z);
+ FuncNode* funcNode = cc.addFunc(FuncSignatureT<int, int, int, int>(CallConvId::kHost));
+ funcNode->setArg(0, x);
+ funcNode->setArg(1, y);
+ funcNode->setArg(2, z);
InvokeNode* invokeNode;
cc.invoke(&invokeNode,
imm((void*)calledFunc),
- FuncSignatureT<int, int, int, int>(CallConv::kIdStdCall));
+ FuncSignatureT<int, int, int, int>(CallConvId::kStdCall));
invokeNode->setArg(0, x);
invokeNode->setArg(1, y);
invokeNode->setArg(2, z);
@@ -2659,31 +2442,30 @@ public:
}
};
-// ============================================================================
-// [X86Test_FuncCallFast]
-// ============================================================================
+// x86::Compiler - X86Test_FuncCallFast
+// ====================================
-class X86Test_FuncCallFast : public X86Test {
+class X86Test_FuncCallFast : public X86TestCase {
public:
- X86Test_FuncCallFast() : X86Test("FuncCallFast") {}
+ X86Test_FuncCallFast() : X86TestCase("FuncCallFast") {}
- static void add(X86TestApp& app) {
+ static void add(TestApp& app) {
app.add(new X86Test_FuncCallFast());
}
virtual void compile(x86::Compiler& cc) {
x86::Gp var = cc.newInt32("var");
- cc.addFunc(FuncSignatureT<int, int>(CallConv::kIdHost));
- cc.setArg(0, var);
+ FuncNode* funcNode = cc.addFunc(FuncSignatureT<int, int>(CallConvId::kHost));
+ funcNode->setArg(0, var);
InvokeNode* invokeNode;
- cc.invoke(&invokeNode, imm((void*)calledFunc), FuncSignatureT<int, int>(CallConv::kIdFastCall));
+ cc.invoke(&invokeNode, imm((void*)calledFunc), FuncSignatureT<int, int>(CallConvId::kFastCall));
invokeNode->setArg(0, var);
invokeNode->setRet(0, var);
- cc.invoke(&invokeNode, imm((void*)calledFunc), FuncSignatureT<int, int>(CallConv::kIdFastCall));
+ cc.invoke(&invokeNode, imm((void*)calledFunc), FuncSignatureT<int, int>(CallConvId::kFastCall));
invokeNode->setArg(0, var);
invokeNode->setRet(0, var);
@@ -2710,21 +2492,20 @@ public:
}
};
-// ============================================================================
-// [X86Test_FuncCallSIMD]
-// ============================================================================
+// x86::Compiler - X86Test_FuncCallSIMD
+// ====================================
-class X86Test_FuncCallSIMD : public X86Test {
+class X86Test_FuncCallSIMD : public X86TestCase {
public:
bool _useVectorCall;
X86Test_FuncCallSIMD(bool useVectorCall)
- : X86Test(),
+ : X86TestCase(),
_useVectorCall(useVectorCall) {
_name.assignFormat("FuncCallSIMD {%s}", _useVectorCall ? "__vectorcall" : "__cdecl");
}
- static void add(X86TestApp& app) {
+ static void add(TestApp& app) {
app.add(new X86Test_FuncCallSIMD(false));
#ifdef _MSC_VER
app.add(new X86Test_FuncCallSIMD(true));
@@ -2732,7 +2513,7 @@ public:
}
virtual void compile(x86::Compiler& cc) {
- cc.addFunc(FuncSignatureT<void, void*, const void*, const void*>(CallConv::kIdHost));
+ FuncNode* funcNode = cc.addFunc(FuncSignatureT<void, void*, const void*, const void*>(CallConvId::kHost));
x86::Gp resultPtr = cc.newIntPtr("resultPtr");
x86::Gp aPtr = cc.newIntPtr("aPtr");
@@ -2742,16 +2523,16 @@ public:
x86::Xmm aXmm = cc.newXmm("aXmm");
x86::Xmm bXmm = cc.newXmm("bXmm");
- cc.setArg(0, resultPtr);
- cc.setArg(1, aPtr);
- cc.setArg(2, bPtr);
+ funcNode->setArg(0, resultPtr);
+ funcNode->setArg(1, aPtr);
+ funcNode->setArg(2, bPtr);
- uint32_t ccId = CallConv::kIdCDecl;
+ CallConvId ccId = CallConvId::kCDecl;
Imm pFnImm = imm((void*)calledFunc_cdecl);
#ifdef _MSC_VER
if (_useVectorCall) {
- ccId = CallConv::kIdVectorCall;
+ ccId = CallConvId::kVectorCall;
pFnImm = imm((void*)calledFunc_vcall);
}
#endif
@@ -2801,24 +2582,23 @@ public:
#endif
};
-// ============================================================================
-// [X86Test_FuncCallLight]
-// ============================================================================
+// x86::Compiler - X86Test_FuncCallLight
+// =====================================
-class X86Test_FuncCallLight : public X86Test {
+class X86Test_FuncCallLight : public X86TestCase {
public:
- X86Test_FuncCallLight() : X86Test("FuncCallLight") {}
+ X86Test_FuncCallLight() : X86TestCase("FuncCallLight") {}
- static void add(X86TestApp& app) {
+ static void add(TestApp& app) {
app.add(new X86Test_FuncCallLight());
}
virtual void compile(x86::Compiler& cc) {
- FuncSignatureT<void, const void*, const void*, const void*, const void*, void*> funcSig(CallConv::kIdCDecl);
- FuncSignatureT<x86::Xmm, x86::Xmm, x86::Xmm> fastSig(CallConv::kIdLightCall2);
+ FuncSignatureT<void, const void*, const void*, const void*, const void*, void*> f1Sig(CallConvId::kCDecl);
+ FuncSignatureT<x86::Xmm, x86::Xmm, x86::Xmm> f2Sig(CallConvId::kLightCall2);
- FuncNode* func = cc.newFunc(funcSig);
- FuncNode* fast = cc.newFunc(fastSig);
+ FuncNode* f1Node = cc.newFunc(f1Sig);
+ FuncNode* f2Node = cc.newFunc(f2Sig);
{
x86::Gp aPtr = cc.newIntPtr("aPtr");
@@ -2832,13 +2612,12 @@ public:
x86::Xmm cXmm = cc.newXmm("cXmm");
x86::Xmm dXmm = cc.newXmm("dXmm");
- cc.addFunc(func);
-
- cc.setArg(0, aPtr);
- cc.setArg(1, bPtr);
- cc.setArg(2, cPtr);
- cc.setArg(3, dPtr);
- cc.setArg(4, pOut);
+ cc.addFunc(f1Node);
+ f1Node->setArg(0, aPtr);
+ f1Node->setArg(1, bPtr);
+ f1Node->setArg(2, cPtr);
+ f1Node->setArg(3, dPtr);
+ f1Node->setArg(4, pOut);
cc.movups(aXmm, x86::ptr(aPtr));
cc.movups(bXmm, x86::ptr(bPtr));
@@ -2850,12 +2629,12 @@ public:
InvokeNode* invokeNode;
- cc.invoke(&invokeNode, fast->label(), fastSig);
+ cc.invoke(&invokeNode, f2Node->label(), f2Sig);
invokeNode->setArg(0, aXmm);
invokeNode->setArg(1, bXmm);
invokeNode->setRet(0, xXmm);
- cc.invoke(&invokeNode, fast->label(), fastSig);
+ cc.invoke(&invokeNode, f2Node->label(), f2Sig);
invokeNode->setArg(0, cXmm);
invokeNode->setArg(1, dXmm);
invokeNode->setRet(0, yXmm);
@@ -2870,9 +2649,9 @@ public:
x86::Xmm aXmm = cc.newXmm("aXmm");
x86::Xmm bXmm = cc.newXmm("bXmm");
- cc.addFunc(fast);
- cc.setArg(0, aXmm);
- cc.setArg(1, bXmm);
+ cc.addFunc(f2Node);
+ f2Node->setArg(0, aXmm);
+ f2Node->setArg(1, bXmm);
cc.paddw(aXmm, bXmm);
cc.ret(aXmm);
cc.endFunc();
@@ -2901,15 +2680,14 @@ public:
}
};
-// ============================================================================
-// [X86Test_FuncCallManyArgs]
-// ============================================================================
+// x86::Compiler - X86Test_FuncCallManyArgs
+// ========================================
-class X86Test_FuncCallManyArgs : public X86Test {
+class X86Test_FuncCallManyArgs : public X86TestCase {
public:
- X86Test_FuncCallManyArgs() : X86Test("FuncCallManyArgs") {}
+ X86Test_FuncCallManyArgs() : X86TestCase("FuncCallManyArgs") {}
- static void add(X86TestApp& app) {
+ static void add(TestApp& app) {
app.add(new X86Test_FuncCallManyArgs());
}
@@ -2918,7 +2696,7 @@ public:
}
virtual void compile(x86::Compiler& cc) {
- cc.addFunc(FuncSignatureT<int>(CallConv::kIdHost));
+ cc.addFunc(FuncSignatureT<int>(CallConvId::kHost));
// Prepare.
x86::Gp va = cc.newInt32("va");
@@ -2947,7 +2725,7 @@ public:
InvokeNode* invokeNode;
cc.invoke(&invokeNode,
imm((void*)calledFunc),
- FuncSignatureT<int, int, int, int, int, int, int, int, int, int, int>(CallConv::kIdHost));
+ FuncSignatureT<int, int, int, int, int, int, int, int, int, int, int>(CallConvId::kHost));
invokeNode->setArg(0, va);
invokeNode->setArg(1, vb);
invokeNode->setArg(2, vc);
@@ -2978,15 +2756,14 @@ public:
}
};
-// ============================================================================
-// [X86Test_FuncCallDuplicateArgs]
-// ============================================================================
+// x86::Compiler - X86Test_FuncCallDuplicateArgs
+// =============================================
-class X86Test_FuncCallDuplicateArgs : public X86Test {
+class X86Test_FuncCallDuplicateArgs : public X86TestCase {
public:
- X86Test_FuncCallDuplicateArgs() : X86Test("FuncCallDuplicateArgs") {}
+ X86Test_FuncCallDuplicateArgs() : X86TestCase("FuncCallDuplicateArgs") {}
- static void add(X86TestApp& app) {
+ static void add(TestApp& app) {
app.add(new X86Test_FuncCallDuplicateArgs());
}
@@ -2995,7 +2772,7 @@ public:
}
virtual void compile(x86::Compiler& cc) {
- cc.addFunc(FuncSignatureT<int>(CallConv::kIdHost));
+ cc.addFunc(FuncSignatureT<int>(CallConvId::kHost));
// Prepare.
x86::Gp a = cc.newInt32("a");
@@ -3005,7 +2782,7 @@ public:
InvokeNode* invokeNode;
cc.invoke(&invokeNode,
imm((void*)calledFunc),
- FuncSignatureT<int, int, int, int, int, int, int, int, int, int, int>(CallConv::kIdHost));
+ FuncSignatureT<int, int, int, int, int, int, int, int, int, int, int>(CallConvId::kHost));
invokeNode->setArg(0, a);
invokeNode->setArg(1, a);
invokeNode->setArg(2, a);
@@ -3036,20 +2813,19 @@ public:
}
};
-// ============================================================================
-// [X86Test_FuncCallImmArgs]
-// ============================================================================
+// x86::Compiler - X86Test_FuncCallImmArgs
+// =======================================
-class X86Test_FuncCallImmArgs : public X86Test {
+class X86Test_FuncCallImmArgs : public X86TestCase {
public:
- X86Test_FuncCallImmArgs() : X86Test("FuncCallImmArgs") {}
+ X86Test_FuncCallImmArgs() : X86TestCase("FuncCallImmArgs") {}
- static void add(X86TestApp& app) {
+ static void add(TestApp& app) {
app.add(new X86Test_FuncCallImmArgs());
}
virtual void compile(x86::Compiler& cc) {
- cc.addFunc(FuncSignatureT<int>(CallConv::kIdHost));
+ cc.addFunc(FuncSignatureT<int>(CallConvId::kHost));
// Prepare.
x86::Gp rv = cc.newInt32("rv");
@@ -3058,7 +2834,7 @@ public:
InvokeNode* invokeNode;
cc.invoke(&invokeNode,
imm((void*)X86Test_FuncCallManyArgs::calledFunc),
- FuncSignatureT<int, int, int, int, int, int, int, int, int, int, int>(CallConv::kIdHost));
+ FuncSignatureT<int, int, int, int, int, int, int, int, int, int, int>(CallConvId::kHost));
invokeNode->setArg(0, imm(0x03));
invokeNode->setArg(1, imm(0x12));
@@ -3090,15 +2866,14 @@ public:
}
};
-// ============================================================================
-// [X86Test_FuncCallPtrArgs]
-// ============================================================================
+// x86::Compiler - X86Test_FuncCallPtrArgs
+// =======================================
-class X86Test_FuncCallPtrArgs : public X86Test {
+class X86Test_FuncCallPtrArgs : public X86TestCase {
public:
- X86Test_FuncCallPtrArgs() : X86Test("FuncCallPtrArgs") {}
+ X86Test_FuncCallPtrArgs() : X86TestCase("FuncCallPtrArgs") {}
- static void add(X86TestApp& app) {
+ static void add(TestApp& app) {
app.add(new X86Test_FuncCallPtrArgs());
}
@@ -3116,7 +2891,7 @@ public:
}
virtual void compile(x86::Compiler& cc) {
- cc.addFunc(FuncSignatureT<int>(CallConv::kIdHost));
+ cc.addFunc(FuncSignatureT<int>(CallConvId::kHost));
// Prepare.
x86::Gp rv = cc.newInt32("rv");
@@ -3125,7 +2900,7 @@ public:
InvokeNode* invokeNode;
cc.invoke(&invokeNode,
imm((void*)calledFunc),
- FuncSignatureT<int, void*, void*, void*, void*, void*, void*, void*, void*, void*, void*>(CallConv::kIdHost));
+ FuncSignatureT<int, void*, void*, void*, void*, void*, void*, void*, void*, void*, void*>(CallConvId::kHost));
invokeNode->setArg(0, imm(0x01));
invokeNode->setArg(1, imm(0x02));
@@ -3157,15 +2932,14 @@ public:
}
};
-// ============================================================================
-// [X86Test_FuncCallRefArgs]
-// ============================================================================
+// x86::Compiler - X86Test_FuncCallRefArgs
+// =======================================
-class X86Test_FuncCallRefArgs : public X86Test {
+class X86Test_FuncCallRefArgs : public X86TestCase {
public:
- X86Test_FuncCallRefArgs() : X86Test("FuncCallRefArgs") {}
+ X86Test_FuncCallRefArgs() : X86TestCase("FuncCallRefArgs") {}
- static void add(X86TestApp& app) {
+ static void add(TestApp& app) {
app.add(new X86Test_FuncCallRefArgs());
}
@@ -3178,7 +2952,7 @@ public:
}
virtual void compile(x86::Compiler& cc) {
- cc.addFunc(FuncSignatureT<int, int&, int&, int&, int&>(CallConv::kIdHost));
+ FuncNode* funcNode = cc.addFunc(FuncSignatureT<int, int&, int&, int&, int&>(CallConvId::kHost));
// Prepare.
x86::Gp arg1 = cc.newInt32();
@@ -3187,16 +2961,16 @@ public:
x86::Gp arg4 = cc.newInt32();
x86::Gp rv = cc.newInt32("rv");
- cc.setArg(0, arg1);
- cc.setArg(1, arg2);
- cc.setArg(2, arg3);
- cc.setArg(3, arg4);
+ funcNode->setArg(0, arg1);
+ funcNode->setArg(1, arg2);
+ funcNode->setArg(2, arg3);
+ funcNode->setArg(3, arg4);
// Call function.
InvokeNode* invokeNode;
cc.invoke(&invokeNode,
imm((void*)calledFunc),
- FuncSignatureT<int, int&, int&, int&, int&>(CallConv::kIdHost));
+ FuncSignatureT<int, int&, int&, int&, int&>(CallConvId::kHost));
invokeNode->setArg(0, arg1);
invokeNode->setArg(1, arg2);
@@ -3224,15 +2998,14 @@ public:
}
};
-// ============================================================================
-// [X86Test_FuncCallFloatAsXmmRet]
-// ============================================================================
+// x86::Compiler - X86Test_FuncCallFloatAsXmmRet
+// =============================================
-class X86Test_FuncCallFloatAsXmmRet : public X86Test {
+class X86Test_FuncCallFloatAsXmmRet : public X86TestCase {
public:
- X86Test_FuncCallFloatAsXmmRet() : X86Test("FuncCallFloatAsXmmRet") {}
+ X86Test_FuncCallFloatAsXmmRet() : X86TestCase("FuncCallFloatAsXmmRet") {}
- static void add(X86TestApp& app) {
+ static void add(TestApp& app) {
app.add(new X86Test_FuncCallFloatAsXmmRet());
}
@@ -3241,18 +3014,18 @@ public:
}
virtual void compile(x86::Compiler& cc) {
- cc.addFunc(FuncSignatureT<float, float, float>(CallConv::kIdHost));
+ FuncNode* funcNode = cc.addFunc(FuncSignatureT<float, float, float>(CallConvId::kHost));
x86::Xmm a = cc.newXmmSs("a");
x86::Xmm b = cc.newXmmSs("b");
x86::Xmm ret = cc.newXmmSs("ret");
- cc.setArg(0, a);
- cc.setArg(1, b);
+ funcNode->setArg(0, a);
+ funcNode->setArg(1, b);
// Call function.
InvokeNode* invokeNode;
- cc.invoke(&invokeNode, imm((void*)calledFunc), FuncSignatureT<float, float, float>(CallConv::kIdHost));
+ cc.invoke(&invokeNode, imm((void*)calledFunc), FuncSignatureT<float, float, float>(CallConvId::kHost));
invokeNode->setArg(0, a);
invokeNode->setArg(1, b);
invokeNode->setRet(0, ret);
@@ -3275,15 +3048,14 @@ public:
}
};
-// ============================================================================
-// [X86Test_FuncCallDoubleAsXmmRet]
-// ============================================================================
+// x86::Compiler - X86Test_FuncCallDoubleAsXmmRet
+// ==============================================
-class X86Test_FuncCallDoubleAsXmmRet : public X86Test {
+class X86Test_FuncCallDoubleAsXmmRet : public X86TestCase {
public:
- X86Test_FuncCallDoubleAsXmmRet() : X86Test("FuncCallDoubleAsXmmRet") {}
+ X86Test_FuncCallDoubleAsXmmRet() : X86TestCase("FuncCallDoubleAsXmmRet") {}
- static void add(X86TestApp& app) {
+ static void add(TestApp& app) {
app.add(new X86Test_FuncCallDoubleAsXmmRet());
}
@@ -3292,17 +3064,17 @@ public:
}
virtual void compile(x86::Compiler& cc) {
- cc.addFunc(FuncSignatureT<double, double, double>(CallConv::kIdHost));
+ FuncNode* funcNode = cc.addFunc(FuncSignatureT<double, double, double>(CallConvId::kHost));
x86::Xmm a = cc.newXmmSd("a");
x86::Xmm b = cc.newXmmSd("b");
x86::Xmm ret = cc.newXmmSd("ret");
- cc.setArg(0, a);
- cc.setArg(1, b);
+ funcNode->setArg(0, a);
+ funcNode->setArg(1, b);
InvokeNode* invokeNode;
- cc.invoke(&invokeNode, imm((void*)calledFunc), FuncSignatureT<double, double, double>(CallConv::kIdHost));
+ cc.invoke(&invokeNode, imm((void*)calledFunc), FuncSignatureT<double, double, double>(CallConvId::kHost));
invokeNode->setArg(0, a);
invokeNode->setArg(1, b);
invokeNode->setRet(0, ret);
@@ -3325,15 +3097,14 @@ public:
}
};
-// ============================================================================
-// [X86Test_FuncCallConditional]
-// ============================================================================
+// x86::Compiler - X86Test_FuncCallConditional
+// ===========================================
-class X86Test_FuncCallConditional : public X86Test {
+class X86Test_FuncCallConditional : public X86TestCase {
public:
- X86Test_FuncCallConditional() : X86Test("FuncCallConditional") {}
+ X86Test_FuncCallConditional() : X86TestCase("FuncCallConditional") {}
- static void add(X86TestApp& app) {
+ static void add(TestApp& app) {
app.add(new X86Test_FuncCallConditional());
}
@@ -3345,10 +3116,10 @@ public:
InvokeNode* invokeNode;
x86::Gp result;
- cc.addFunc(FuncSignatureT<int, int, int, int>(CallConv::kIdHost));
- cc.setArg(0, x);
- cc.setArg(1, y);
- cc.setArg(2, op);
+ FuncNode* funcNode = cc.addFunc(FuncSignatureT<int, int, int, int>(CallConvId::kHost));
+ funcNode->setArg(0, x);
+ funcNode->setArg(1, y);
+ funcNode->setArg(2, op);
Label opAdd = cc.newLabel();
Label opMul = cc.newLabel();
@@ -3365,7 +3136,7 @@ public:
cc.bind(opAdd);
result = cc.newInt32("result_1");
- cc.invoke(&invokeNode, (uint64_t)calledFuncAdd, FuncSignatureT<int, int, int>(CallConv::kIdHost));
+ cc.invoke(&invokeNode, (uint64_t)calledFuncAdd, FuncSignatureT<int, int, int>(CallConvId::kHost));
invokeNode->setArg(0, x);
invokeNode->setArg(1, y);
invokeNode->setRet(0, result);
@@ -3374,7 +3145,7 @@ public:
cc.bind(opMul);
result = cc.newInt32("result_2");
- cc.invoke(&invokeNode, (uint64_t)calledFuncMul, FuncSignatureT<int, int, int>(CallConv::kIdHost));
+ cc.invoke(&invokeNode, (uint64_t)calledFuncMul, FuncSignatureT<int, int, int>(CallConvId::kHost));
invokeNode->setArg(0, x);
invokeNode->setArg(1, y);
invokeNode->setRet(0, result);
@@ -3406,15 +3177,14 @@ public:
static int calledFuncMul(int x, int y) { return x * y; }
};
-// ============================================================================
-// [X86Test_FuncCallMultiple]
-// ============================================================================
+// x86::Compiler - X86Test_FuncCallMultiple
+// ========================================
-class X86Test_FuncCallMultiple : public X86Test {
+class X86Test_FuncCallMultiple : public X86TestCase {
public:
- X86Test_FuncCallMultiple() : X86Test("FuncCallMultiple") {}
+ X86Test_FuncCallMultiple() : X86TestCase("FuncCallMultiple") {}
- static void add(X86TestApp& app) {
+ static void add(TestApp& app) {
app.add(new X86Test_FuncCallMultiple());
}
@@ -3429,8 +3199,8 @@ public:
x86::Gp acc0 = cc.newInt32("acc0");
x86::Gp acc1 = cc.newInt32("acc1");
- cc.addFunc(FuncSignatureT<int, int*>(CallConv::kIdHost));
- cc.setArg(0, buf);
+ FuncNode* funcNode = cc.addFunc(FuncSignatureT<int, int*>(CallConvId::kHost));
+ funcNode->setArg(0, buf);
cc.mov(acc0, 0);
cc.mov(acc1, 0);
@@ -3444,7 +3214,7 @@ public:
cc.mov(ptr, buf);
cc.mov(idx, int(i));
- cc.invoke(&invokeNode, (uint64_t)calledFunc, FuncSignatureT<int, int*, int>(CallConv::kIdFastCall));
+ cc.invoke(&invokeNode, (uint64_t)calledFunc, FuncSignatureT<int, int*, int>(CallConvId::kFastCall));
invokeNode->setArg(0, ptr);
invokeNode->setArg(1, idx);
invokeNode->setRet(0, ret);
@@ -3454,7 +3224,7 @@ public:
cc.mov(ptr, buf);
cc.mov(idx, int(i));
- cc.invoke(&invokeNode, (uint64_t)calledFunc, FuncSignatureT<int, int*, int>(CallConv::kIdFastCall));
+ cc.invoke(&invokeNode, (uint64_t)calledFunc, FuncSignatureT<int, int*, int>(CallConvId::kFastCall));
invokeNode->setArg(0, ptr);
invokeNode->setArg(1, idx);
invokeNode->setRet(0, ret);
@@ -3483,15 +3253,14 @@ public:
}
};
-// ============================================================================
-// [X86Test_FuncCallRecursive]
-// ============================================================================
+// x86::Compiler - X86Test_FuncCallRecursive
+// =========================================
-class X86Test_FuncCallRecursive : public X86Test {
+class X86Test_FuncCallRecursive : public X86TestCase {
public:
- X86Test_FuncCallRecursive() : X86Test("FuncCallRecursive") {}
+ X86Test_FuncCallRecursive() : X86TestCase("FuncCallRecursive") {}
- static void add(X86TestApp& app) {
+ static void add(TestApp& app) {
app.add(new X86Test_FuncCallRecursive());
}
@@ -3499,8 +3268,8 @@ public:
x86::Gp val = cc.newInt32("val");
Label skip = cc.newLabel();
- FuncNode* func = cc.addFunc(FuncSignatureT<int, int>(CallConv::kIdHost));
- cc.setArg(0, val);
+ FuncNode* funcNode = cc.addFunc(FuncSignatureT<int, int>(CallConvId::kHost));
+ funcNode->setArg(0, val);
cc.cmp(val, 1);
cc.jle(skip);
@@ -3511,7 +3280,7 @@ public:
InvokeNode* invokeNode;
- cc.invoke(&invokeNode, func->label(), FuncSignatureT<int, int>(CallConv::kIdHost));
+ cc.invoke(&invokeNode, funcNode->label(), FuncSignatureT<int, int>(CallConvId::kHost));
invokeNode->setArg(0, tmp);
invokeNode->setRet(0, tmp);
cc.mul(cc.newInt32(), val, tmp);
@@ -3535,30 +3304,29 @@ public:
}
};
-// ============================================================================
-// [X86Test_FuncCallVarArg1]
-// ============================================================================
+// x86::Compiler - X86Test_FuncCallVarArg1
+// =======================================
-class X86Test_FuncCallVarArg1 : public X86Test {
+class X86Test_FuncCallVarArg1 : public X86TestCase {
public:
- X86Test_FuncCallVarArg1() : X86Test("FuncCallVarArg1") {}
+ X86Test_FuncCallVarArg1() : X86TestCase("FuncCallVarArg1") {}
- static void add(X86TestApp& app) {
+ static void add(TestApp& app) {
app.add(new X86Test_FuncCallVarArg1());
}
virtual void compile(x86::Compiler& cc) {
- cc.addFunc(FuncSignatureT<int, int, int, int, int>(CallConv::kIdHost));
+ FuncNode* funcNode = cc.addFunc(FuncSignatureT<int, int, int, int, int>(CallConvId::kHost));
x86::Gp a0 = cc.newInt32("a0");
x86::Gp a1 = cc.newInt32("a1");
x86::Gp a2 = cc.newInt32("a2");
x86::Gp a3 = cc.newInt32("a3");
- cc.setArg(0, a0);
- cc.setArg(1, a1);
- cc.setArg(2, a2);
- cc.setArg(3, a3);
+ funcNode->setArg(0, a0);
+ funcNode->setArg(1, a1);
+ funcNode->setArg(2, a2);
+ funcNode->setArg(3, a3);
// We call `int func(size_t, ...)`
// - The `vaIndex` must be 1 (first argument after size_t).
@@ -3566,7 +3334,7 @@ public:
InvokeNode* invokeNode;
cc.invoke(&invokeNode,
imm((void*)calledFunc),
- FuncSignatureT<int, size_t, int, int, int, int>(CallConv::kIdHost, 1));
+ FuncSignatureT<int, size_t, int, int, int, int>(CallConvId::kHost, 1));
invokeNode->setArg(0, imm(4));
invokeNode->setArg(1, a0);
invokeNode->setArg(2, a1);
@@ -3604,30 +3372,29 @@ public:
}
};
-// ============================================================================
-// [X86Test_FuncCallVarArg2]
-// ============================================================================
+// x86::Compiler - X86Test_FuncCallVarArg2
+// =======================================
-class X86Test_FuncCallVarArg2 : public X86Test {
+class X86Test_FuncCallVarArg2 : public X86TestCase {
public:
- X86Test_FuncCallVarArg2() : X86Test("FuncCallVarArg2") {}
+ X86Test_FuncCallVarArg2() : X86TestCase("FuncCallVarArg2") {}
- static void add(X86TestApp& app) {
+ static void add(TestApp& app) {
app.add(new X86Test_FuncCallVarArg2());
}
virtual void compile(x86::Compiler& cc) {
- cc.addFunc(FuncSignatureT<double, double, double, double, double>(CallConv::kIdHost));
+ FuncNode* funcNode = cc.addFunc(FuncSignatureT<double, double, double, double, double>(CallConvId::kHost));
x86::Xmm a0 = cc.newXmmSd("a0");
x86::Xmm a1 = cc.newXmmSd("a1");
x86::Xmm a2 = cc.newXmmSd("a2");
x86::Xmm a3 = cc.newXmmSd("a3");
- cc.setArg(0, a0);
- cc.setArg(1, a1);
- cc.setArg(2, a2);
- cc.setArg(3, a3);
+ funcNode->setArg(0, a0);
+ funcNode->setArg(1, a1);
+ funcNode->setArg(2, a2);
+ funcNode->setArg(3, a3);
// We call `double func(size_t, ...)`
// - The `vaIndex` must be 1 (first argument after size_t).
@@ -3635,7 +3402,7 @@ public:
InvokeNode* invokeNode;
cc.invoke(&invokeNode,
imm((void*)calledFunc),
- FuncSignatureT<double, size_t, double, double, double, double>(CallConv::kIdHost, 1));
+ FuncSignatureT<double, size_t, double, double, double, double>(CallConvId::kHost, 1));
invokeNode->setArg(0, imm(4));
invokeNode->setArg(1, a0);
invokeNode->setArg(2, a1);
@@ -3673,34 +3440,94 @@ public:
}
};
-// ============================================================================
-// [X86Test_FuncCallMisc1]
-// ============================================================================
+// x86::Compiler - X86Test_FuncCallInt64Arg
+// ========================================
-class X86Test_FuncCallMisc1 : public X86Test {
+class X86Test_FuncCallInt64Arg : public X86TestCase {
public:
- X86Test_FuncCallMisc1() : X86Test("FuncCallMisc1") {}
+ X86Test_FuncCallInt64Arg() : X86TestCase("FuncCallInt64Arg") {}
+
+ static void add(TestApp& app) {
+ app.add(new X86Test_FuncCallInt64Arg());
+ }
+
+ virtual void compile(x86::Compiler& cc) {
+ FuncNode* funcNode = cc.addFunc(FuncSignatureT<uint64_t, uint64_t>(CallConvId::kHost));
+
+ if (cc.is64Bit()) {
+ x86::Gp reg = cc.newUInt64();
+ funcNode->setArg(0, reg);
+ cc.add(reg, 1);
+ cc.ret(reg);
+ }
+ else {
+ x86::Gp hi = cc.newUInt32("hi");
+ x86::Gp lo = cc.newUInt32("lo");
+
+ funcNode->setArg(0, 0, lo);
+ funcNode->setArg(0, 1, hi);
+
+ cc.add(lo, 1);
+ cc.adc(hi, 0);
+ cc.ret(lo, hi);
+ }
- static void add(X86TestApp& app) {
+ cc.endFunc();
+ }
+
+ virtual bool run(void* _func, String& result, String& expect) {
+ typedef uint64_t (*Func)(uint64_t);
+ Func func = ptr_as_func<Func>(_func);
+
+ uint64_t resultRet = func(uint64_t(0xFFFFFFFF));
+ uint64_t expectRet = 0x100000000;
+
+ result.assignFormat("ret=%llu", (unsigned long long)resultRet);
+ expect.assignFormat("ret=%llu", (unsigned long long)expectRet);
+
+ return resultRet == expectRet;
+ }
+
+ static double calledFunc(size_t n, ...) {
+ double sum = 0;
+ va_list ap;
+ va_start(ap, n);
+ for (size_t i = 0; i < n; i++) {
+ double arg = va_arg(ap, double);
+ sum += arg;
+ }
+ va_end(ap);
+ return sum;
+ }
+};
+
+// x86::Compiler - X86Test_FuncCallMisc1
+// =====================================
+
+class X86Test_FuncCallMisc1 : public X86TestCase {
+public:
+ X86Test_FuncCallMisc1() : X86TestCase("FuncCallMisc1") {}
+
+ static void add(TestApp& app) {
app.add(new X86Test_FuncCallMisc1());
}
static void dummy(int, int) {}
virtual void compile(x86::Compiler& cc) {
- cc.addFunc(FuncSignatureT<int, int, int>(CallConv::kIdHost));
+ FuncNode* funcNode = cc.addFunc(FuncSignatureT<int, int, int>(CallConvId::kHost));
x86::Gp a = cc.newInt32("a");
x86::Gp b = cc.newInt32("b");
x86::Gp r = cc.newInt32("r");
- cc.setArg(0, a);
- cc.setArg(1, b);
+ funcNode->setArg(0, a);
+ funcNode->setArg(1, b);
InvokeNode* invokeNode;
cc.invoke(&invokeNode,
imm((void*)dummy),
- FuncSignatureT<void, int, int>(CallConv::kIdHost));
+ FuncSignatureT<void, int, int>(CallConvId::kHost));
invokeNode->setArg(0, a);
invokeNode->setArg(1, b);
@@ -3724,32 +3551,31 @@ public:
}
};
-// ============================================================================
-// [X86Test_FuncCallMisc2]
-// ============================================================================
+// x86::Compiler - X86Test_FuncCallMisc2
+// =====================================
-class X86Test_FuncCallMisc2 : public X86Test {
+class X86Test_FuncCallMisc2 : public X86TestCase {
public:
- X86Test_FuncCallMisc2() : X86Test("FuncCallMisc2") {}
+ X86Test_FuncCallMisc2() : X86TestCase("FuncCallMisc2") {}
- static void add(X86TestApp& app) {
+ static void add(TestApp& app) {
app.add(new X86Test_FuncCallMisc2());
}
virtual void compile(x86::Compiler& cc) {
- cc.addFunc(FuncSignatureT<double, const double*>(CallConv::kIdHost));
+ FuncNode* funcNode = cc.addFunc(FuncSignatureT<double, const double*>(CallConvId::kHost));
x86::Gp p = cc.newIntPtr("p");
x86::Xmm arg = cc.newXmmSd("arg");
x86::Xmm ret = cc.newXmmSd("ret");
- cc.setArg(0, p);
+ funcNode->setArg(0, p);
cc.movsd(arg, x86::ptr(p));
InvokeNode* invokeNode;
cc.invoke(&invokeNode,
imm((void*)op),
- FuncSignatureT<double, double>(CallConv::kIdHost));
+ FuncSignatureT<double, double>(CallConvId::kHost));
invokeNode->setArg(0, arg);
invokeNode->setRet(0, ret);
@@ -3775,32 +3601,31 @@ public:
static double op(double a) { return a * a; }
};
-// ============================================================================
-// [X86Test_FuncCallMisc3]
-// ============================================================================
+// x86::Compiler - X86Test_FuncCallMisc3
+// =====================================
-class X86Test_FuncCallMisc3 : public X86Test {
+class X86Test_FuncCallMisc3 : public X86TestCase {
public:
- X86Test_FuncCallMisc3() : X86Test("FuncCallMisc3") {}
+ X86Test_FuncCallMisc3() : X86TestCase("FuncCallMisc3") {}
- static void add(X86TestApp& app) {
+ static void add(TestApp& app) {
app.add(new X86Test_FuncCallMisc3());
}
virtual void compile(x86::Compiler& cc) {
- cc.addFunc(FuncSignatureT<double, const double*>(CallConv::kIdHost));
+ FuncNode* funcNode = cc.addFunc(FuncSignatureT<double, const double*>(CallConvId::kHost));
x86::Gp p = cc.newIntPtr("p");
x86::Xmm arg = cc.newXmmSd("arg");
x86::Xmm ret = cc.newXmmSd("ret");
- cc.setArg(0, p);
+ funcNode->setArg(0, p);
cc.movsd(arg, x86::ptr(p));
InvokeNode* invokeNode;
cc.invoke(&invokeNode,
imm((void*)op),
- FuncSignatureT<double, double>(CallConv::kIdHost));
+ FuncSignatureT<double, double>(CallConvId::kHost));
invokeNode->setArg(0, arg);
invokeNode->setRet(0, ret);
@@ -3829,15 +3654,14 @@ public:
static double op(double a) { return a * a; }
};
-// ============================================================================
-// [X86Test_FuncCallMisc4]
-// ============================================================================
+// x86::Compiler - X86Test_FuncCallMisc4
+// =====================================
-class X86Test_FuncCallMisc4 : public X86Test {
+class X86Test_FuncCallMisc4 : public X86TestCase {
public:
- X86Test_FuncCallMisc4() : X86Test("FuncCallMisc4") {}
+ X86Test_FuncCallMisc4() : X86TestCase("FuncCallMisc4") {}
- static void add(X86TestApp& app) {
+ static void add(TestApp& app) {
app.add(new X86Test_FuncCallMisc4());
}
@@ -3845,13 +3669,13 @@ public:
InvokeNode* invokeNode;
FuncSignatureBuilder funcSignature;
- funcSignature.setCallConv(CallConv::kIdHost);
- funcSignature.setRet(Type::kIdF64);
+ funcSignature.setCallConvId(CallConvId::kHost);
+ funcSignature.setRet(TypeId::kFloat64);
cc.addFunc(funcSignature);
FuncSignatureBuilder invokeSignature;
- invokeSignature.setCallConv(CallConv::kIdHost);
- invokeSignature.setRet(Type::kIdF64);
+ invokeSignature.setCallConvId(CallConvId::kHost);
+ invokeSignature.setRet(TypeId::kFloat64);
cc.invoke(&invokeNode, imm((void*)calledFunc), invokeSignature);
x86::Xmm ret = cc.newXmmSd("ret");
@@ -3877,26 +3701,25 @@ public:
static double calledFunc() { return 3.14; }
};
-// ============================================================================
-// [X86Test_FuncCallMisc5]
-// ============================================================================
+// x86::Compiler - X86Test_FuncCallMisc5
+// =====================================
// The register allocator should clobber the register used by the `call` itself.
-class X86Test_FuncCallMisc5 : public X86Test {
+class X86Test_FuncCallMisc5 : public X86TestCase {
public:
- X86Test_FuncCallMisc5() : X86Test("FuncCallMisc5") {}
+ X86Test_FuncCallMisc5() : X86TestCase("FuncCallMisc5") {}
- static void add(X86TestApp& app) {
+ static void add(TestApp& app) {
app.add(new X86Test_FuncCallMisc5());
}
virtual void compile(x86::Compiler& cc) {
- cc.addFunc(FuncSignatureT<int>(CallConv::kIdHost));
+ cc.addFunc(FuncSignatureT<int>(CallConvId::kHost));
x86::Gp pFn = cc.newIntPtr("pFn");
x86::Gp vars[16];
- uint32_t i, regCount = cc.arch() == Environment::kArchX86 ? 8 : 16;
+ uint32_t i, regCount = cc.arch() == Arch::kX86 ? 8 : 16;
ASMJIT_ASSERT(regCount <= ASMJIT_ARRAY_SIZE(vars));
cc.mov(pFn, imm((void*)calledFunc));
@@ -3910,7 +3733,7 @@ public:
}
InvokeNode* invokeNode;
- cc.invoke(&invokeNode, pFn, FuncSignatureT<void>(CallConv::kIdHost));
+ cc.invoke(&invokeNode, pFn, FuncSignatureT<void>(CallConvId::kHost));
for (i = 1; i < regCount; i++)
if (vars[i].isValid())
@@ -3936,26 +3759,85 @@ public:
static void calledFunc() {}
};
-// ============================================================================
-// [X86Test_MiscLocalConstPool]
-// ============================================================================
+// x86::Compiler - X86Test_FuncCallMisc6
+// =====================================
-class X86Test_MiscLocalConstPool : public X86Test {
+class X86Test_FuncCallMisc6 : public X86TestCase {
public:
- X86Test_MiscLocalConstPool() : X86Test("MiscLocalConstPool") {}
+ X86Test_FuncCallMisc6() : X86TestCase("FuncCallMisc6") {}
+
+ static void add(TestApp& app) {
+ app.add(new X86Test_FuncCallMisc6());
+ }
- static void add(X86TestApp& app) {
+ virtual void compile(x86::Compiler& cc) {
+ FuncNode* funcNode = cc.addFunc(FuncSignatureT<uint32_t, uint32_t>(CallConvId::kHost));
+
+ constexpr uint32_t kCount = 16;
+
+ x86::Gp v[kCount];
+ x86::Gp argVal = cc.newUInt32("argVal");
+ x86::Gp retVal = cc.newUInt32("retVal");
+ uint32_t i;
+
+ funcNode->setArg(0, argVal);
+ cc.add(argVal, 1);
+
+ for (i = 0; i < kCount; i++)
+ v[i] = cc.newUInt32("v%u", i);
+
+ InvokeNode* invokeNode;
+ cc.invoke(&invokeNode, imm((void*)calledFunc), FuncSignatureT<uint32_t, uint32_t>(CallConvId::kHost));
+ invokeNode->setArg(0, argVal);
+ invokeNode->setRet(0, retVal);
+
+ for (i = 0; i < kCount; i++)
+ cc.mov(v[i], i + 1);
+
+ for (i = 0; i < kCount; i++)
+ cc.add(argVal, v[i]);
+
+ cc.add(retVal, argVal);
+ cc.ret(retVal);
+
+ cc.endFunc();
+ }
+
+ virtual bool run(void* _func, String& result, String& expect) {
+ typedef uint32_t (*Func)(uint32_t x);
+ Func func = ptr_as_func<Func>(_func);
+
+ uint32_t resultRet = func(111);
+ uint32_t expectRet = 111 + 112 + 2 + (1 + 16) * 8;
+
+ result.assignFormat("ret=%u", resultRet);
+ expect.assignFormat("ret=%u", expectRet);
+
+ return resultRet == expectRet;
+ }
+
+ static uint32_t calledFunc(uint32_t x) { return x + 1; }
+};
+
+// x86::Compiler - X86Test_MiscLocalConstPool
+// ==========================================
+
+class X86Test_MiscLocalConstPool : public X86TestCase {
+public:
+ X86Test_MiscLocalConstPool() : X86TestCase("MiscLocalConstPool") {}
+
+ static void add(TestApp& app) {
app.add(new X86Test_MiscLocalConstPool());
}
virtual void compile(x86::Compiler& cc) {
- cc.addFunc(FuncSignatureT<int>(CallConv::kIdHost));
+ cc.addFunc(FuncSignatureT<int>(CallConvId::kHost));
x86::Gp v0 = cc.newInt32("v0");
x86::Gp v1 = cc.newInt32("v1");
- x86::Mem c0 = cc.newInt32Const(ConstPool::kScopeLocal, 200);
- x86::Mem c1 = cc.newInt32Const(ConstPool::kScopeLocal, 33);
+ x86::Mem c0 = cc.newInt32Const(ConstPoolScope::kLocal, 200);
+ x86::Mem c1 = cc.newInt32Const(ConstPoolScope::kLocal, 33);
cc.mov(v0, c0);
cc.mov(v1, c1);
@@ -3979,26 +3861,25 @@ public:
}
};
-// ============================================================================
-// [X86Test_MiscGlobalConstPool]
-// ============================================================================
+// x86::Compiler - X86Test_MiscGlobalConstPool
+// ===========================================
-class X86Test_MiscGlobalConstPool : public X86Test {
+class X86Test_MiscGlobalConstPool : public X86TestCase {
public:
- X86Test_MiscGlobalConstPool() : X86Test("MiscGlobalConstPool") {}
+ X86Test_MiscGlobalConstPool() : X86TestCase("MiscGlobalConstPool") {}
- static void add(X86TestApp& app) {
+ static void add(TestApp& app) {
app.add(new X86Test_MiscGlobalConstPool());
}
virtual void compile(x86::Compiler& cc) {
- cc.addFunc(FuncSignatureT<int>(CallConv::kIdHost));
+ cc.addFunc(FuncSignatureT<int>(CallConvId::kHost));
x86::Gp v0 = cc.newInt32("v0");
x86::Gp v1 = cc.newInt32("v1");
- x86::Mem c0 = cc.newInt32Const(ConstPool::kScopeGlobal, 200);
- x86::Mem c1 = cc.newInt32Const(ConstPool::kScopeGlobal, 33);
+ x86::Mem c0 = cc.newInt32Const(ConstPoolScope::kGlobal, 200);
+ x86::Mem c1 = cc.newInt32Const(ConstPoolScope::kGlobal, 33);
cc.mov(v0, c0);
cc.mov(v1, c1);
@@ -4022,19 +3903,18 @@ public:
}
};
-// ============================================================================
-// [X86Test_MiscMultiRet]
-// ============================================================================
+// x86::Compiler - X86Test_MiscMultiRet
+// ====================================
-struct X86Test_MiscMultiRet : public X86Test {
- X86Test_MiscMultiRet() : X86Test("MiscMultiRet") {}
+struct X86Test_MiscMultiRet : public X86TestCase {
+ X86Test_MiscMultiRet() : X86TestCase("MiscMultiRet") {}
- static void add(X86TestApp& app) {
+ static void add(TestApp& app) {
app.add(new X86Test_MiscMultiRet());
}
virtual void compile(x86::Compiler& cc) {
- cc.addFunc(FuncSignatureT<int, int, int, int>(CallConv::kIdHost));
+ FuncNode* funcNode = cc.addFunc(FuncSignatureT<int, int, int, int>(CallConvId::kHost));
x86::Gp op = cc.newInt32("op");
x86::Gp a = cc.newInt32("a");
@@ -4046,9 +3926,9 @@ struct X86Test_MiscMultiRet : public X86Test {
Label L_Mul = cc.newLabel();
Label L_Div = cc.newLabel();
- cc.setArg(0, op);
- cc.setArg(1, a);
- cc.setArg(2, b);
+ funcNode->setArg(0, op);
+ funcNode->setArg(1, a);
+ funcNode->setArg(2, b);
cc.cmp(op, 0);
cc.jz(L_Add);
@@ -4114,32 +3994,31 @@ struct X86Test_MiscMultiRet : public X86Test {
}
};
-// ============================================================================
-// [X86Test_MiscMultiFunc]
-// ============================================================================
+// x86::Compiler - X86Test_MiscMultiFunc
+// =====================================
-class X86Test_MiscMultiFunc : public X86Test {
+class X86Test_MiscMultiFunc : public X86TestCase {
public:
- X86Test_MiscMultiFunc() : X86Test("MiscMultiFunc") {}
+ X86Test_MiscMultiFunc() : X86TestCase("MiscMultiFunc") {}
- static void add(X86TestApp& app) {
+ static void add(TestApp& app) {
app.add(new X86Test_MiscMultiFunc());
}
virtual void compile(x86::Compiler& cc) {
- FuncNode* f1 = cc.newFunc(FuncSignatureT<int, int, int>(CallConv::kIdHost));
- FuncNode* f2 = cc.newFunc(FuncSignatureT<int, int, int>(CallConv::kIdHost));
+ FuncNode* f1Node = cc.newFunc(FuncSignatureT<int, int, int>(CallConvId::kHost));
+ FuncNode* f2Node = cc.newFunc(FuncSignatureT<int, int, int>(CallConvId::kHost));
{
x86::Gp a = cc.newInt32("a");
x86::Gp b = cc.newInt32("b");
- cc.addFunc(f1);
- cc.setArg(0, a);
- cc.setArg(1, b);
+ cc.addFunc(f1Node);
+ f1Node->setArg(0, a);
+ f1Node->setArg(1, b);
InvokeNode* invokeNode;
- cc.invoke(&invokeNode, f2->label(), FuncSignatureT<int, int, int>(CallConv::kIdHost));
+ cc.invoke(&invokeNode, f2Node->label(), FuncSignatureT<int, int, int>(CallConvId::kHost));
invokeNode->setArg(0, a);
invokeNode->setArg(1, b);
invokeNode->setRet(0, a);
@@ -4152,9 +4031,9 @@ public:
x86::Gp a = cc.newInt32("a");
x86::Gp b = cc.newInt32("b");
- cc.addFunc(f2);
- cc.setArg(0, a);
- cc.setArg(1, b);
+ cc.addFunc(f2Node);
+ f2Node->setArg(0, a);
+ f2Node->setArg(1, b);
cc.add(a, b);
cc.ret(a);
@@ -4177,43 +4056,36 @@ public:
}
};
-// ============================================================================
-// [X86Test_MiscUnfollow]
-// ============================================================================
+// x86::Compiler - X86Test_MiscUnfollow
+// ====================================
// Global (I didn't find a better way to test this).
static jmp_buf globalJmpBuf;
-class X86Test_MiscUnfollow : public X86Test {
+class X86Test_MiscUnfollow : public X86TestCase {
public:
- X86Test_MiscUnfollow() : X86Test("MiscUnfollow") {}
+ X86Test_MiscUnfollow() : X86TestCase("MiscUnfollow") {}
- static void add(X86TestApp& app) {
+ static void add(TestApp& app) {
app.add(new X86Test_MiscUnfollow());
}
virtual void compile(x86::Compiler& cc) {
- // NOTE: Fastcall calling convention is the most appropriate here, as all
- // arguments will be passed by registers and there won't be any stack
- // misalignment when we call the `handler()`. This was failing on OSX
- // when targeting 32-bit.
- cc.addFunc(FuncSignatureT<int, int, void*>(CallConv::kIdFastCall));
-
+ // NOTE: Fastcall calling convention is the most appropriate here as all arguments are passed via registers and
+ // there won't be any stack misalignment in the `handler()`. This was failing on MacOS when targeting 32-bit mode.
x86::Gp a = cc.newInt32("a");
x86::Gp b = cc.newIntPtr("b");
Label tramp = cc.newLabel();
- cc.setArg(0, a);
- cc.setArg(1, b);
+ FuncNode* funcNode = cc.addFunc(FuncSignatureT<int, int, void*>(CallConvId::kFastCall));
+ funcNode->setArg(0, a);
+ funcNode->setArg(1, b);
cc.cmp(a, 0);
cc.jz(tramp);
-
cc.ret(a);
-
cc.bind(tramp);
cc.unfollow().jmp(b);
-
cc.endFunc();
}
@@ -4239,16 +4111,10 @@ public:
static void ASMJIT_FASTCALL handler() { longjmp(globalJmpBuf, 1); }
};
-// ============================================================================
-// [Main]
-// ============================================================================
-
-int main(int argc, char* argv[]) {
- X86TestApp app;
-
- app.handleArgs(argc, argv);
- app.showInfo();
+// x86::Compiler - Tests
+// =====================
+void compiler_add_x86_tests(TestApp& app) {
// Base tests.
app.addT<X86Test_NoCode>();
app.addT<X86Test_NoAlign>();
@@ -4260,7 +4126,8 @@ int main(int argc, char* argv[]) {
app.addT<X86Test_JumpMany>();
app.addT<X86Test_JumpUnreachable1>();
app.addT<X86Test_JumpUnreachable2>();
- app.addT<X86Test_JumpTable>();
+ app.addT<X86Test_JumpTable1>();
+ app.addT<X86Test_JumpTable2>();
// Alloc tests.
app.addT<X86Test_AllocBase>();
@@ -4312,11 +4179,13 @@ int main(int argc, char* argv[]) {
app.addT<X86Test_FuncCallRecursive>();
app.addT<X86Test_FuncCallVarArg1>();
app.addT<X86Test_FuncCallVarArg2>();
+ app.addT<X86Test_FuncCallInt64Arg>();
app.addT<X86Test_FuncCallMisc1>();
app.addT<X86Test_FuncCallMisc2>();
app.addT<X86Test_FuncCallMisc3>();
app.addT<X86Test_FuncCallMisc4>();
app.addT<X86Test_FuncCallMisc5>();
+ app.addT<X86Test_FuncCallMisc6>();
// Miscellaneous tests.
app.addT<X86Test_MiscLocalConstPool>();
@@ -4324,6 +4193,6 @@ int main(int argc, char* argv[]) {
app.addT<X86Test_MiscMultiRet>();
app.addT<X86Test_MiscMultiFunc>();
app.addT<X86Test_MiscUnfollow>();
-
- return app.run();
}
+
+#endif // !ASMJIT_NO_X86 && ASMJIT_ARCH_X86
diff --git a/3rdparty/asmjit/test/asmjit_test_x86_asm.cpp b/3rdparty/asmjit/test/asmjit_test_emitters.cpp
index ba85100dae0..63c14a6c2e2 100644
--- a/3rdparty/asmjit/test/asmjit_test_x86_asm.cpp
+++ b/3rdparty/asmjit/test/asmjit_test_emitters.cpp
@@ -1,27 +1,13 @@
-// AsmJit - Machine code generation for C++
+// This file is part of AsmJit project <https://asmjit.com>
//
-// * Official AsmJit Home Page: https://asmjit.com
-// * Official Github Repository: https://github.com/asmjit/asmjit
-//
-// Copyright (c) 2008-2020 The AsmJit Authors
-//
-// This software is provided 'as-is', without any express or implied
-// warranty. In no event will the authors be held liable for any damages
-// arising from the use of this software.
-//
-// Permission is granted to anyone to use this software for any purpose,
-// including commercial applications, and to alter it and redistribute it
-// freely, subject to the following restrictions:
-//
-// 1. The origin of this software must not be misrepresented; you must not
-// claim that you wrote the original software. If you use this software
-// in a product, an acknowledgment in the product documentation would be
-// appreciated but is not required.
-// 2. Altered source versions must be plainly marked as such, and must not be
-// misrepresented as being the original software.
-// 3. This notice may not be removed or altered from any source distribution.
+// See asmjit.h or LICENSE.md for license and copyright information
+// SPDX-License-Identifier: Zlib
+
+#include <asmjit/core.h>
+#if !defined(ASMJIT_NO_X86) && ASMJIT_ARCH_X86
#include <asmjit/x86.h>
+
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
@@ -48,7 +34,7 @@ static void makeRawFunc(x86::Emitter* emitter) noexcept {
// Create and initialize `FuncDetail` and `FuncFrame`.
FuncDetail func;
- func.init(FuncSignatureT<void, int*, const int*, const int*>(CallConv::kIdHost), emitter->environment());
+ func.init(FuncSignatureT<void, int*, const int*, const int*>(CallConvId::kHost), emitter->environment());
FuncFrame frame;
frame.init(func);
@@ -78,17 +64,16 @@ static void makeRawFunc(x86::Emitter* emitter) noexcept {
#ifndef ASMJIT_NO_COMPILER
// This function works with x86::Compiler, provided for comparison.
static void makeCompiledFunc(x86::Compiler* cc) noexcept {
- x86::Gp dst = cc->newIntPtr();
- x86::Gp src_a = cc->newIntPtr();
- x86::Gp src_b = cc->newIntPtr();
+ x86::Gp dst = cc->newIntPtr("dst");
+ x86::Gp src_a = cc->newIntPtr("src_a");
+ x86::Gp src_b = cc->newIntPtr("src_b");
+ x86::Xmm vec0 = cc->newXmm("vec0");
+ x86::Xmm vec1 = cc->newXmm("vec1");
- x86::Xmm vec0 = cc->newXmm();
- x86::Xmm vec1 = cc->newXmm();
-
- cc->addFunc(FuncSignatureT<void, int*, const int*, const int*>(CallConv::kIdHost));
- cc->setArg(0, dst);
- cc->setArg(1, src_a);
- cc->setArg(2, src_b);
+ FuncNode* funcNode = cc->addFunc(FuncSignatureT<void, int*, const int*, const int*>(CallConvId::kHost));
+ funcNode->setArg(0, dst);
+ funcNode->setArg(1, src_a);
+ funcNode->setArg(2, src_b);
cc->movdqu(vec0, x86::ptr(src_a));
cc->movdqu(vec1, x86::ptr(src_b));
@@ -98,10 +83,10 @@ static void makeCompiledFunc(x86::Compiler* cc) noexcept {
}
#endif
-static uint32_t testFunc(JitRuntime& rt, uint32_t emitterType) noexcept {
+static uint32_t testFunc(JitRuntime& rt, EmitterType emitterType) noexcept {
#ifndef ASMJIT_NO_LOGGING
FileLogger logger(stdout);
- logger.setIndentation(FormatOptions::kIndentationCode, 2);
+ logger.setIndentation(FormatIndentationGroup::kCode, 2);
#endif
CodeHolder code;
@@ -113,7 +98,11 @@ static uint32_t testFunc(JitRuntime& rt, uint32_t emitterType) noexcept {
Error err = kErrorOk;
switch (emitterType) {
- case BaseEmitter::kTypeAssembler: {
+ case EmitterType::kNone: {
+ break;
+ }
+
+ case EmitterType::kAssembler: {
printf("Using x86::Assembler:\n");
x86::Assembler a(&code);
makeRawFunc(a.as<x86::Emitter>());
@@ -121,14 +110,14 @@ static uint32_t testFunc(JitRuntime& rt, uint32_t emitterType) noexcept {
}
#ifndef ASMJIT_NO_BUILDER
- case BaseEmitter::kTypeBuilder: {
+ case EmitterType::kBuilder: {
printf("Using x86::Builder:\n");
x86::Builder cb(&code);
makeRawFunc(cb.as<x86::Emitter>());
err = cb.finalize();
if (err) {
- printf("x86::Builder::finalize() failed: %s\n", DebugUtils::errorAsString(err));
+ printf("** FAILURE: x86::Builder::finalize() failed (%s) **\n", DebugUtils::errorAsString(err));
return 1;
}
break;
@@ -136,14 +125,14 @@ static uint32_t testFunc(JitRuntime& rt, uint32_t emitterType) noexcept {
#endif
#ifndef ASMJIT_NO_COMPILER
- case BaseEmitter::kTypeCompiler: {
+ case EmitterType::kCompiler: {
printf("Using x86::Compiler:\n");
x86::Compiler cc(&code);
makeCompiledFunc(&cc);
err = cc.finalize();
if (err) {
- printf("x86::Compiler::finalize() failed: %s\n", DebugUtils::errorAsString(err));
+ printf("** FAILURE: x86::Compiler::finalize() failed (%s) **\n", DebugUtils::errorAsString(err));
return 1;
}
break;
@@ -156,7 +145,7 @@ static uint32_t testFunc(JitRuntime& rt, uint32_t emitterType) noexcept {
err = rt.add(&fn, &code);
if (err) {
- printf("JitRuntime::add() failed: %s\n", DebugUtils::errorAsString(err));
+ printf("** FAILURE: JitRuntime::add() failed (%s) **\n", DebugUtils::errorAsString(err));
return 1;
}
@@ -174,25 +163,35 @@ static uint32_t testFunc(JitRuntime& rt, uint32_t emitterType) noexcept {
}
int main() {
- printf("AsmJit X86 Emitter Test\n\n");
+ printf("AsmJit Emitters Test-Suite v%u.%u.%u\n",
+ unsigned((ASMJIT_LIBRARY_VERSION >> 16) ),
+ unsigned((ASMJIT_LIBRARY_VERSION >> 8) & 0xFF),
+ unsigned((ASMJIT_LIBRARY_VERSION ) & 0xFF));
+ printf("\n");
JitRuntime rt;
unsigned nFailed = 0;
- nFailed += testFunc(rt, BaseEmitter::kTypeAssembler);
+ nFailed += testFunc(rt, EmitterType::kAssembler);
#ifndef ASMJIT_NO_BUILDER
- nFailed += testFunc(rt, BaseEmitter::kTypeBuilder);
+ nFailed += testFunc(rt, EmitterType::kBuilder);
#endif
#ifndef ASMJIT_NO_COMPILER
- nFailed += testFunc(rt, BaseEmitter::kTypeCompiler);
+ nFailed += testFunc(rt, EmitterType::kCompiler);
#endif
if (!nFailed)
- printf("Success:\n All tests passed\n");
+ printf("** SUCCESS **\n");
else
- printf("Failure:\n %u %s failed\n", nFailed, nFailed == 1 ? "test" : "tests");
+ printf("** FAILURE - %u %s failed ** \n", nFailed, nFailed == 1 ? "test" : "tests");
return nFailed ? 1 : 0;
}
+#else
+int main() {
+ printf("AsmJit X86 Emitter Test is disabled on non-x86 host\n\n");
+ return 0;
+}
+#endif // !ASMJIT_NO_X86 && ASMJIT_ARCH_X86
diff --git a/3rdparty/asmjit/test/asmjit_test_instinfo.cpp b/3rdparty/asmjit/test/asmjit_test_instinfo.cpp
new file mode 100644
index 00000000000..3d51edcab14
--- /dev/null
+++ b/3rdparty/asmjit/test/asmjit_test_instinfo.cpp
@@ -0,0 +1,181 @@
+// This file is part of AsmJit project <https://asmjit.com>
+//
+// See asmjit.h or LICENSE.md for license and copyright information
+// SPDX-License-Identifier: Zlib
+
+#include <asmjit/core.h>
+
+#if !defined(ASMJIT_NO_X86)
+#include <asmjit/x86.h>
+#endif
+
+#include <stdio.h>
+
+using namespace asmjit;
+
+static char accessLetter(bool r, bool w) noexcept {
+ return r && w ? 'X' : r ? 'R' : w ? 'W' : '_';
+}
+
+static void printInfo(Arch arch, const BaseInst& inst, const Operand_* operands, size_t opCount) {
+ StringTmp<512> sb;
+
+ // Read & Write Information
+ // ------------------------
+
+ InstRWInfo rw;
+ InstAPI::queryRWInfo(arch, inst, operands, opCount, &rw);
+
+#ifndef ASMJIT_NO_LOGGING
+ Formatter::formatInstruction(sb, FormatFlags::kNone, nullptr, arch, inst, operands, opCount);
+#else
+ sb.append("<Logging-Not-Available>");
+#endif
+ sb.append("\n");
+
+ sb.append(" Operands:\n");
+ for (uint32_t i = 0; i < rw.opCount(); i++) {
+ const OpRWInfo& op = rw.operand(i);
+
+ sb.appendFormat(" [%u] Op=%c Read=%016llX Write=%016llX Extend=%016llX",
+ i,
+ accessLetter(op.isRead(), op.isWrite()),
+ op.readByteMask(),
+ op.writeByteMask(),
+ op.extendByteMask());
+
+ if (op.isMemBaseUsed()) {
+ sb.appendFormat(" Base=%c", accessLetter(op.isMemBaseRead(), op.isMemBaseWrite()));
+ if (op.isMemBasePreModify())
+ sb.appendFormat(" <PRE>");
+ if (op.isMemBasePostModify())
+ sb.appendFormat(" <POST>");
+ }
+
+ if (op.isMemIndexUsed()) {
+ sb.appendFormat(" Index=%c", accessLetter(op.isMemIndexRead(), op.isMemIndexWrite()));
+ }
+
+ sb.append("\n");
+ }
+
+ // CPU Flags (Read/Write)
+ // ----------------------
+
+ if ((rw.readFlags() | rw.writeFlags()) != CpuRWFlags::kNone) {
+ sb.append(" Flags: \n");
+
+ struct FlagMap {
+ CpuRWFlags flag;
+ char name[4];
+ };
+
+ static const FlagMap flagMap[] = {
+ { CpuRWFlags::kX86_CF, "CF" },
+ { CpuRWFlags::kX86_OF, "OF" },
+ { CpuRWFlags::kX86_SF, "SF" },
+ { CpuRWFlags::kX86_ZF, "ZF" },
+ { CpuRWFlags::kX86_AF, "AF" },
+ { CpuRWFlags::kX86_PF, "PF" },
+ { CpuRWFlags::kX86_DF, "DF" },
+ { CpuRWFlags::kX86_IF, "IF" },
+ { CpuRWFlags::kX86_AC, "AC" },
+ { CpuRWFlags::kX86_C0, "C0" },
+ { CpuRWFlags::kX86_C1, "C1" },
+ { CpuRWFlags::kX86_C2, "C2" },
+ { CpuRWFlags::kX86_C3, "C3" }
+ };
+
+ sb.append(" ");
+ for (uint32_t f = 0; f < 13; f++) {
+ char c = accessLetter((rw.readFlags() & flagMap[f].flag) != CpuRWFlags::kNone,
+ (rw.writeFlags() & flagMap[f].flag) != CpuRWFlags::kNone);
+ if (c != '_')
+ sb.appendFormat("%s=%c ", flagMap[f].name, c);
+ }
+
+ sb.append("\n");
+ }
+
+ // CPU Features
+ // ------------
+
+ CpuFeatures features;
+ InstAPI::queryFeatures(arch, inst, operands, opCount, &features);
+
+#ifndef ASMJIT_NO_LOGGING
+ if (!features.empty()) {
+ sb.append(" Features:\n");
+ sb.append(" ");
+
+ bool first = true;
+ CpuFeatures::Iterator it(features.iterator());
+ while (it.hasNext()) {
+ uint32_t featureId = uint32_t(it.next());
+ if (!first)
+ sb.append(" & ");
+ Formatter::formatFeature(sb, arch, featureId);
+ first = false;
+ }
+ sb.append("\n");
+ }
+#endif
+
+ printf("%s\n", sb.data());
+}
+
+template<typename... Args>
+static void printInfoSimple(Arch arch,InstId instId, InstOptions options, Args&&... args) {
+ BaseInst inst(instId);
+ inst.addOptions(options);
+ Operand_ opArray[] = { std::forward<Args>(args)... };
+ printInfo(arch, inst, opArray, sizeof...(args));
+}
+
+template<typename... Args>
+static void printInfoExtra(Arch arch, InstId instId, InstOptions options, const BaseReg& extraReg, Args&&... args) {
+ BaseInst inst(instId);
+ inst.addOptions(options);
+ inst.setExtraReg(extraReg);
+ Operand_ opArray[] = { std::forward<Args>(args)... };
+ printInfo(arch, inst, opArray, sizeof...(args));
+}
+
+static void testX86Arch() {
+#if !defined(ASMJIT_NO_X86)
+ using namespace x86;
+ Arch arch = Arch::kX64;
+
+ printInfoSimple(arch, Inst::kIdAdd, InstOptions::kNone, eax, ebx);
+ printInfoSimple(arch, Inst::kIdLods, InstOptions::kNone, eax, dword_ptr(rsi));
+
+ printInfoSimple(arch, Inst::kIdPshufd, InstOptions::kNone, xmm0, xmm1, imm(0));
+ printInfoSimple(arch, Inst::kIdPabsb, InstOptions::kNone, mm1, mm2);
+ printInfoSimple(arch, Inst::kIdPabsb, InstOptions::kNone, xmm1, xmm2);
+ printInfoSimple(arch, Inst::kIdPextrw, InstOptions::kNone, eax, mm1, imm(0));
+ printInfoSimple(arch, Inst::kIdPextrw, InstOptions::kNone, eax, xmm1, imm(0));
+ printInfoSimple(arch, Inst::kIdPextrw, InstOptions::kNone, ptr(rax), xmm1, imm(0));
+
+ printInfoSimple(arch, Inst::kIdVpdpbusd, InstOptions::kNone, xmm0, xmm1, xmm2);
+ printInfoSimple(arch, Inst::kIdVpdpbusd, InstOptions::kX86_Vex, xmm0, xmm1, xmm2);
+
+ printInfoSimple(arch, Inst::kIdVaddpd, InstOptions::kNone, ymm0, ymm1, ymm2);
+ printInfoSimple(arch, Inst::kIdVaddpd, InstOptions::kNone, ymm0, ymm30, ymm31);
+ printInfoSimple(arch, Inst::kIdVaddpd, InstOptions::kNone, zmm0, zmm1, zmm2);
+
+ printInfoExtra(arch, Inst::kIdVaddpd, InstOptions::kNone, k1, zmm0, zmm1, zmm2);
+ printInfoExtra(arch, Inst::kIdVaddpd, InstOptions::kX86_ZMask, k1, zmm0, zmm1, zmm2);
+#endif
+}
+
+int main() {
+ printf("AsmJit Instruction Info Test-Suite v%u.%u.%u\n",
+ unsigned((ASMJIT_LIBRARY_VERSION >> 16) ),
+ unsigned((ASMJIT_LIBRARY_VERSION >> 8) & 0xFF),
+ unsigned((ASMJIT_LIBRARY_VERSION ) & 0xFF));
+ printf("\n");
+
+ testX86Arch();
+
+ return 0;
+}
diff --git a/3rdparty/asmjit/test/asmjit_test_misc.h b/3rdparty/asmjit/test/asmjit_test_misc.h
index 03273272d1b..0839d30ac00 100644
--- a/3rdparty/asmjit/test/asmjit_test_misc.h
+++ b/3rdparty/asmjit/test/asmjit_test_misc.h
@@ -1,25 +1,7 @@
-// AsmJit - Machine code generation for C++
+// This file is part of AsmJit project <https://asmjit.com>
//
-// * Official AsmJit Home Page: https://asmjit.com
-// * Official Github Repository: https://github.com/asmjit/asmjit
-//
-// Copyright (c) 2008-2020 The AsmJit Authors
-//
-// This software is provided 'as-is', without any express or implied
-// warranty. In no event will the authors be held liable for any damages
-// arising from the use of this software.
-//
-// Permission is granted to anyone to use this software for any purpose,
-// including commercial applications, and to alter it and redistribute it
-// freely, subject to the following restrictions:
-//
-// 1. The origin of this software must not be misrepresented; you must not
-// claim that you wrote the original software. If you use this software
-// in a product, an acknowledgment in the product documentation would be
-// appreciated but is not required.
-// 2. Altered source versions must be plainly marked as such, and must not be
-// misrepresented as being the original software.
-// 3. This notice may not be removed or altered from any source distribution.
+// See asmjit.h or LICENSE.md for license and copyright information
+// SPDX-License-Identifier: Zlib
#ifndef ASMJIT_TEST_MISC_H_INCLUDED
#define ASMJIT_TEST_MISC_H_INCLUDED
@@ -28,42 +10,42 @@
namespace asmtest {
-// Generate a typical alpha blend function using SSE2 instruction set. Used
-// for benchmarking and also in test86. The generated code should be stable
-// and fully functional.
-static void generateAlphaBlend(asmjit::x86::Compiler& cc) {
- using namespace asmjit;
- using namespace asmjit::x86;
+using namespace asmjit;
- Gp dst = cc.newIntPtr("dst");
- Gp src = cc.newIntPtr("src");
+// Generates a typical alpha blend function that uses SSE2 instruction set.
+// This function combines emitting instructions with control flow constructs
+// like binding Labels and jumping to them. This should be pretty representative.
+template<typename Emitter>
+static void generateSseAlphaBlendInternal(
+ Emitter& cc,
+ const x86::Gp& dst, const x86::Gp& src, const x86::Gp& n,
+ const x86::Gp& gp0,
+ const x86::Xmm& simd0, const x86::Xmm& simd1, const x86::Xmm& simd2, const x86::Xmm& simd3,
+ const x86::Xmm& simd4, const x86::Xmm& simd5, const x86::Xmm& simd6, const x86::Xmm& simd7) {
- Gp i = cc.newIntPtr("i");
- Gp j = cc.newIntPtr("j");
- Gp t = cc.newIntPtr("t");
+ x86::Gp i = n;
+ x86::Gp j = gp0;
- Xmm vzero = cc.newXmm("vzero");
- Xmm v0080 = cc.newXmm("v0080");
- Xmm v0101 = cc.newXmm("v0101");
+ x86::Xmm vzero = simd0;
+ x86::Xmm v0080 = simd1;
+ x86::Xmm v0101 = simd2;
Label L_SmallLoop = cc.newLabel();
Label L_SmallEnd = cc.newLabel();
Label L_LargeLoop = cc.newLabel();
Label L_LargeEnd = cc.newLabel();
- Label L_DataPool = cc.newLabel();
-
- cc.addFunc(FuncSignatureT<void, void*, const void*, size_t>(CallConv::kIdHost));
+ Label L_Done = cc.newLabel();
- cc.setArg(0, dst);
- cc.setArg(1, src);
- cc.setArg(2, i);
-
- // How many pixels have to be processed to make the loop aligned.
- cc.lea(t, x86::ptr(L_DataPool));
+ // Load SIMD Constants.
cc.xorps(vzero, vzero);
- cc.movaps(v0080, x86::ptr(t, 0));
- cc.movaps(v0101, x86::ptr(t, 16));
+ cc.mov(gp0.r32(), 0x00800080);
+ cc.movd(v0080, gp0.r32());
+ cc.mov(gp0.r32(), 0x01010101);
+ cc.movd(v0101, gp0.r32());
+ cc.pshufd(v0080, v0080, x86::shuffleImm(0, 0, 0, 0));
+ cc.pshufd(v0101, v0101, x86::shuffleImm(0, 0, 0, 0));
+ // How many pixels have to be processed to make the loop aligned.
cc.xor_(j, j);
cc.sub(j, dst);
cc.and_(j, 15);
@@ -71,15 +53,15 @@ static void generateAlphaBlend(asmjit::x86::Compiler& cc) {
cc.jz(L_SmallEnd);
cc.cmp(j, i);
- cc.cmovg(j, i); // j = min(i, j).
- cc.sub(i, j); // i -= j.
+ cc.cmovg(j, i); // j = min(i, j)
+ cc.sub(i, j); // i -= j
// Small loop.
cc.bind(L_SmallLoop);
{
- Xmm x0 = cc.newXmm("x0");
- Xmm y0 = cc.newXmm("y0");
- Xmm a0 = cc.newXmm("a0");
+ x86::Xmm x0 = simd3;
+ x86::Xmm y0 = simd4;
+ x86::Xmm a0 = simd5;
cc.movd(y0, x86::ptr(src));
cc.movd(x0, x86::ptr(dst));
@@ -89,7 +71,7 @@ static void generateAlphaBlend(asmjit::x86::Compiler& cc) {
cc.psrlw(a0, 8);
cc.punpcklbw(x0, vzero);
- cc.pshuflw(a0, a0, x86::Predicate::shuf(1, 1, 1, 1));
+ cc.pshuflw(a0, a0, x86::shuffleImm(1, 1, 1, 1));
cc.punpcklbw(y0, vzero);
cc.pmullw(x0, a0);
@@ -113,7 +95,7 @@ static void generateAlphaBlend(asmjit::x86::Compiler& cc) {
cc.test(i, i);
cc.mov(j, i);
- cc.jz(cc.func()->exitLabel());
+ cc.jz(L_Done);
cc.and_(j, 3);
cc.shr(i, 2);
@@ -122,11 +104,11 @@ static void generateAlphaBlend(asmjit::x86::Compiler& cc) {
// Aligned loop.
cc.bind(L_LargeLoop);
{
- Xmm x0 = cc.newXmm("x0");
- Xmm x1 = cc.newXmm("x1");
- Xmm y0 = cc.newXmm("y0");
- Xmm a0 = cc.newXmm("a0");
- Xmm a1 = cc.newXmm("a1");
+ x86::Xmm x0 = simd3;
+ x86::Xmm x1 = simd4;
+ x86::Xmm y0 = simd5;
+ x86::Xmm a0 = simd6;
+ x86::Xmm a1 = simd7;
cc.movups(y0, x86::ptr(src));
cc.movaps(x0, x86::ptr(dst));
@@ -144,8 +126,8 @@ static void generateAlphaBlend(asmjit::x86::Compiler& cc) {
cc.punpckhbw(x1, vzero);
cc.punpckhwd(a1, a1);
- cc.pshufd(a0, a0, x86::Predicate::shuf(3, 3, 1, 1));
- cc.pshufd(a1, a1, x86::Predicate::shuf(3, 3, 1, 1));
+ cc.pshufd(a0, a0, x86::shuffleImm(3, 3, 1, 1));
+ cc.pshufd(a1, a1, x86::shuffleImm(3, 3, 1, 1));
cc.pmullw(x0, a0);
cc.pmullw(x1, a1);
@@ -172,13 +154,102 @@ static void generateAlphaBlend(asmjit::x86::Compiler& cc) {
cc.test(j, j);
cc.jnz(L_SmallLoop);
- cc.endFunc();
+ cc.bind(L_Done);
+}
+
+static void generateSseAlphaBlend(asmjit::BaseEmitter& emitter, bool emitPrologEpilog) {
+ using namespace asmjit::x86;
- // Data.
- cc.align(kAlignData, 16);
- cc.bind(L_DataPool);
- cc.embedUInt16(uint16_t(0x0080u), 8);
- cc.embedUInt16(uint16_t(0x0101u), 8);
+ if (emitter.isAssembler()) {
+ Assembler& cc = *emitter.as<Assembler>();
+
+ x86::Gp dst = cc.zax();
+ x86::Gp src = cc.zcx();
+ x86::Gp i = cc.zdx();
+ x86::Gp j = cc.zdi();
+
+ if (emitPrologEpilog) {
+ FuncDetail func;
+ func.init(FuncSignatureT<void, void*, const void*, size_t>(CallConvId::kHost), cc.environment());
+
+ FuncFrame frame;
+ frame.init(func);
+ frame.addDirtyRegs(dst, src, i, j);
+ frame.addDirtyRegs(xmm0, xmm1, xmm2, xmm3, xmm4, xmm5, xmm6, xmm7);
+
+ FuncArgsAssignment args(&func);
+ args.assignAll(dst, src, i);
+ args.updateFuncFrame(frame);
+ frame.finalize();
+
+ cc.emitProlog(frame);
+ cc.emitArgsAssignment(frame, args);
+ generateSseAlphaBlendInternal(cc, dst, src, i, j, xmm0, xmm1, xmm2, xmm3, xmm4, xmm5, xmm6, xmm7);
+ cc.emitEpilog(frame);
+ }
+ else {
+ generateSseAlphaBlendInternal(cc, dst, src, i, j, xmm0, xmm1, xmm2, xmm3, xmm4, xmm5, xmm6, xmm7);
+ }
+ }
+#ifndef ASMJIT_NO_BUILDER
+ else if (emitter.isBuilder()) {
+ Builder& cc = *emitter.as<Builder>();
+
+ x86::Gp dst = cc.zax();
+ x86::Gp src = cc.zcx();
+ x86::Gp i = cc.zdx();
+ x86::Gp j = cc.zdi();
+
+ if (emitPrologEpilog) {
+ FuncDetail func;
+ func.init(FuncSignatureT<void, void*, const void*, size_t>(CallConvId::kHost), cc.environment());
+
+ FuncFrame frame;
+ frame.init(func);
+ frame.addDirtyRegs(dst, src, i, j);
+ frame.addDirtyRegs(xmm0, xmm1, xmm2, xmm3, xmm4, xmm5, xmm6, xmm7);
+
+ FuncArgsAssignment args(&func);
+ args.assignAll(dst, src, i);
+ args.updateFuncFrame(frame);
+ frame.finalize();
+
+ cc.emitProlog(frame);
+ cc.emitArgsAssignment(frame, args);
+ generateSseAlphaBlendInternal(cc, dst, src, i, j, xmm0, xmm1, xmm2, xmm3, xmm4, xmm5, xmm6, xmm7);
+ cc.emitEpilog(frame);
+ }
+ else {
+ generateSseAlphaBlendInternal(cc, dst, src, i, j, xmm0, xmm1, xmm2, xmm3, xmm4, xmm5, xmm6, xmm7);
+ }
+ }
+#endif
+#ifndef ASMJIT_NO_COMPILER
+ else if (emitter.isCompiler()) {
+ Compiler& cc = *emitter.as<Compiler>();
+
+ Gp dst = cc.newIntPtr("dst");
+ Gp src = cc.newIntPtr("src");
+ Gp i = cc.newIntPtr("i");
+ Gp j = cc.newIntPtr("j");
+
+ Xmm v0 = cc.newXmm("v0");
+ Xmm v1 = cc.newXmm("v1");
+ Xmm v2 = cc.newXmm("v2");
+ Xmm v3 = cc.newXmm("v3");
+ Xmm v4 = cc.newXmm("v4");
+ Xmm v5 = cc.newXmm("v5");
+ Xmm v6 = cc.newXmm("v6");
+ Xmm v7 = cc.newXmm("v7");
+
+ FuncNode* funcNode = cc.addFunc(FuncSignatureT<void, void*, const void*, size_t>(CallConvId::kHost));
+ funcNode->setArg(0, dst);
+ funcNode->setArg(1, src);
+ funcNode->setArg(2, i);
+ generateSseAlphaBlendInternal(cc, dst, src, i, j, v0, v1, v2, v3, v4, v5, v6, v7);
+ cc.endFunc();
+ }
+#endif
}
} // {asmtest}
diff --git a/3rdparty/asmjit/test/asmjit_test_opcode.cpp b/3rdparty/asmjit/test/asmjit_test_opcode.cpp
deleted file mode 100644
index d61a6e4bc29..00000000000
--- a/3rdparty/asmjit/test/asmjit_test_opcode.cpp
+++ /dev/null
@@ -1,110 +0,0 @@
-// AsmJit - Machine code generation for C++
-//
-// * Official AsmJit Home Page: https://asmjit.com
-// * Official Github Repository: https://github.com/asmjit/asmjit
-//
-// Copyright (c) 2008-2020 The AsmJit Authors
-//
-// This software is provided 'as-is', without any express or implied
-// warranty. In no event will the authors be held liable for any damages
-// arising from the use of this software.
-//
-// Permission is granted to anyone to use this software for any purpose,
-// including commercial applications, and to alter it and redistribute it
-// freely, subject to the following restrictions:
-//
-// 1. The origin of this software must not be misrepresented; you must not
-// claim that you wrote the original software. If you use this software
-// in a product, an acknowledgment in the product documentation would be
-// appreciated but is not required.
-// 2. Altered source versions must be plainly marked as such, and must not be
-// misrepresented as being the original software.
-// 3. This notice may not be removed or altered from any source distribution.
-
-// ----------------------------------------------------------------------------
-// This file is used to test opcodes generated by AsmJit. Output can be
-// disassembled in your IDE or by your favorite disassembler. Instructions
-// are grouped by category and then sorted alphabetically.
-// ----------------------------------------------------------------------------
-
-#include <asmjit/x86.h>
-#include <stdio.h>
-#include <stdlib.h>
-
-#include "./asmjit_test_opcode.h"
-
-using namespace asmjit;
-
-struct OpcodeDumpInfo {
- uint32_t arch;
- bool useRex1;
- bool useRex2;
-};
-
-static const char* archToString(uint32_t arch) noexcept {
- switch (arch & ~Environment::kArchBigEndianMask) {
- case Environment::kArchX86 : return "X86";
- case Environment::kArchX64 : return "X64";
- case Environment::kArchARM : return "ARM";
- case Environment::kArchThumb : return "Thumb";
- case Environment::kArchAArch64 : return "AArch64";
- case Environment::kArchMIPS_LE : return "MIPS";
- case Environment::kArchMIPS64_LE: return "MIPS64";
- default: return "Unknown";
- }
-}
-
-struct TestErrorHandler : public ErrorHandler {
- virtual void handleError(Error err, const char* message, BaseEmitter* origin) {
- (void)origin;
- printf("ERROR 0x%08X: %s\n", err, message);
- }
-};
-
-typedef void (*VoidFunc)(void);
-
-int main() {
- TestErrorHandler eh;
-
- OpcodeDumpInfo infoList[] = {
- { Environment::kArchX86, false, false },
- { Environment::kArchX64, false, false },
- { Environment::kArchX64, false, true },
- { Environment::kArchX64, true , false },
- { Environment::kArchX64, true , true }
- };
-
- for (uint32_t i = 0; i < ASMJIT_ARRAY_SIZE(infoList); i++) {
- const OpcodeDumpInfo& info = infoList[i];
-
- printf("Opcodes [ARCH=%s REX1=%s REX2=%s]\n",
- archToString(info.arch),
- info.useRex1 ? "true" : "false",
- info.useRex2 ? "true" : "false");
-
- CodeHolder code;
- code.init(Environment(info.arch));
- code.setErrorHandler(&eh);
-
-#ifndef ASMJIT_NO_LOGGING
- FileLogger logger(stdout);
- logger.addFlags(FormatOptions::kFlagMachineCode);
- code.setLogger(&logger);
-#endif
-
- x86::Assembler a(&code);
- asmtest::generateOpcodes(a.as<x86::Emitter>(), info.useRex1, info.useRex2);
-
- // If this is the host architecture the code generated can be executed
- // for debugging purposes (the first instruction is ret anyway).
- if (code.arch() == Environment::kArchHost) {
- JitRuntime runtime;
- VoidFunc p;
-
- Error err = runtime.add(&p, &code);
- if (err == kErrorOk) p();
- }
- }
-
- return 0;
-}
diff --git a/3rdparty/asmjit/test/asmjit_test_opcode.h b/3rdparty/asmjit/test/asmjit_test_opcode.h
deleted file mode 100644
index 6f052f526b8..00000000000
--- a/3rdparty/asmjit/test/asmjit_test_opcode.h
+++ /dev/null
@@ -1,6059 +0,0 @@
-// AsmJit - Machine code generation for C++
-//
-// * Official AsmJit Home Page: https://asmjit.com
-// * Official Github Repository: https://github.com/asmjit/asmjit
-//
-// Copyright (c) 2008-2020 The AsmJit Authors
-//
-// This software is provided 'as-is', without any express or implied
-// warranty. In no event will the authors be held liable for any damages
-// arising from the use of this software.
-//
-// Permission is granted to anyone to use this software for any purpose,
-// including commercial applications, and to alter it and redistribute it
-// freely, subject to the following restrictions:
-//
-// 1. The origin of this software must not be misrepresented; you must not
-// claim that you wrote the original software. If you use this software
-// in a product, an acknowledgment in the product documentation would be
-// appreciated but is not required.
-// 2. Altered source versions must be plainly marked as such, and must not be
-// misrepresented as being the original software.
-// 3. This notice may not be removed or altered from any source distribution.
-
-#ifndef ASMJIT_TEST_OPCODE_H_INCLUDED
-#define ASMJIT_TEST_OPCODE_H_INCLUDED
-
-#include <asmjit/x86.h>
-
-namespace asmtest {
-
-// Generate all instructions asmjit can emit.
-static void generateOpcodes(asmjit::x86::Emitter* e, bool useRex1 = false, bool useRex2 = false) {
- using namespace asmjit;
- using namespace asmjit::x86;
-
- bool isX64 = e->is64Bit();
-
- // Prevent a crash when the generated function is called to see the disassembly.
- e->ret();
-
- // All instructions use the following register that can be changed to see if
- // `x86::Assembler` can properly encode all possible combinations. If the given
- // `useRexRegs` argument is true the `A` version will in most cases contain
- // a register having index 8 or greater to force REX prefix.
- Gp gLoA = useRex1 ? r8b : al;
- Gp gLoB = useRex2 ? r9b : bl;
-
- Gp gHiA = ah;
- Gp gHiB = bh;
-
- Gp gwA = useRex1 ? r8w : ax;
- Gp gwB = useRex2 ? r9w : bx;
-
- Gp gdA = useRex1 ? r8d : eax;
- Gp gdB = useRex2 ? r9d : ebx;
- Gp gdC = useRex2 ? r10d : ecx;
-
- Gp gzA = useRex1 ? r8 : e->zax();
- Gp gzB = useRex2 ? r9 : e->zbx();
- Gp gzC = useRex2 ? r10 : e->zcx();
- Gp gzD = useRex2 ? r11 : e->zdx();
-
- KReg kA = k1;
- KReg kB = k2;
- KReg kC = k3;
-
- Mem anyptr_gpA = ptr(gzA);
- Mem anyptr_gpB = ptr(gzB);
- Mem anyptr_gpC = ptr(gzC);
- Mem anyptr_gpD = ptr(gzD);
-
- Mem intptr_gpA = e->intptr_ptr(gzA);
- Mem intptr_gpB = e->intptr_ptr(gzB);
-
- St stA = st0;
- St stB = st7;
-
- Mm mmA = mm0;
- Mm mmB = mm1;
-
- Xmm xmmA = useRex1 ? xmm8 : xmm0;
- Xmm xmmB = useRex2 ? xmm9 : xmm1;
- Xmm xmmC = useRex2 ? xmm10 : xmm2;
- Xmm xmmD = useRex2 ? xmm11 : xmm3;
-
- Ymm ymmA = useRex1 ? ymm8 : ymm0;
- Ymm ymmB = useRex2 ? ymm9 : ymm1;
- Ymm ymmC = useRex2 ? ymm10 : ymm2;
- Ymm ymmD = useRex2 ? ymm11 : ymm3;
-
- Zmm zmmA = useRex1 ? zmm8 : zmm0;
- Zmm zmmB = useRex2 ? zmm9 : zmm1;
- Zmm zmmC = useRex2 ? zmm10 : zmm2;
-
- Mem vx_ptr = ptr(gzB, xmmB);
- Mem vy_ptr = ptr(gzB, ymmB);
- Mem vz_ptr = ptr(gzB, zmmB);
-
- Label L;
-
- // Base.
- e->adc(gLoA, 1);
- e->adc(gLoB, 1);
- e->adc(gHiA, 1);
- e->adc(gHiB, 1);
- e->adc(gwA, 1);
- e->adc(gwB, 1);
- e->adc(gdA, 1);
- e->adc(gdB, 1);
- e->adc(gzA, 1);
- e->adc(gzA, gzB);
- e->adc(gzA, intptr_gpB);
- e->adc(intptr_gpA, 1);
- e->adc(intptr_gpA, gzB);
- e->add(gLoA, 1);
- e->add(gLoB, 1);
- e->add(gHiA, 1);
- e->add(gHiB, 1);
- e->add(gwA, 1);
- e->add(gwB, 1);
- e->add(gdA, 1);
- e->add(gdB, 1);
- e->add(gzA, 1);
- e->add(gzA, gzB);
- e->add(gzA, intptr_gpB);
- e->add(intptr_gpA, 1);
- e->add(intptr_gpA, gzB);
- e->and_(gLoA, 1);
- e->and_(gLoB, 1);
- e->and_(gHiA, 1);
- e->and_(gHiB, 1);
- e->and_(gwA, 1);
- e->and_(gwB, 1);
- e->and_(gdA, 1);
- e->and_(gdB, 1);
- e->and_(gzA, 1);
- e->and_(gzA, gzB);
- e->and_(gzA, intptr_gpB);
- e->and_(intptr_gpA, 1);
- e->and_(intptr_gpA, gzB);
- e->bswap(gzA);
- e->bt(gdA, 1);
- e->bt(gzA, 1);
- e->bt(gdA, gdB);
- e->bt(gzA, gzB);
- e->bt(intptr_gpA, 1);
- e->bt(anyptr_gpA, gdB);
- e->bt(intptr_gpA, gzB);
- e->btc(gdA, 1);
- e->btc(gzA, 1);
- e->btc(gdA, gdB);
- e->btc(gzA, gzB);
- e->btc(intptr_gpA, 1);
- e->btc(anyptr_gpA, gdB);
- e->btc(intptr_gpA, gzB);
- e->btr(gdA, 1);
- e->btr(gzA, 1);
- e->btr(gdA, gdB);
- e->btr(gzA, gzB);
- e->btr(intptr_gpA, 1);
- e->btr(anyptr_gpA, gdB);
- e->btr(intptr_gpA, gzB);
- e->bts(gdA, 1);
- e->bts(gzA, 1);
- e->bts(gdA, gdB);
- e->bts(gzA, gzB);
- e->bts(intptr_gpA, 1);
- e->bts(anyptr_gpA, gdB);
- e->bts(intptr_gpA, gzB);
- e->call(gzA);
- e->call(intptr_gpA);
- e->cbw(); // Implicit AX <- Sign Extend AL.
- e->cbw(ax); // Explicit AX <- Sign Extend AL.
- e->cdq(); // Implicit EDX:EAX <- Sign Extend EAX.
- e->cdq(edx, eax); // Explicit EDX:EAX <- Sign Extend EAX.
- if (isX64) e->cdqe(); // Implicit RAX <- Sign Extend EAX.
- if (isX64) e->cdqe(eax); // Explicit RAX <- Sign Extend EAX.
- e->cwd(); // Implicit DX:AX <- Sign Extend AX.
- e->cwd(dx, ax); // Explicit DX:AX <- Sign Extend AX.
- e->cwde(); // Implicit EAX <- Sign Extend AX.
- e->cwde(eax); // Explicit EAX <- Sign Extend AX.
- if (isX64) e->cqo(); // Implicit RDX:RAX <- Sign Extend RAX.
- if (isX64) e->cqo(rdx, rax); // Explicit RDX:RAX <- Sign Extend RAX.
- e->clc();
- e->cld();
- e->cmc();
- e->cmp(gLoA, 1);
- e->cmp(gLoB, 1);
- e->cmp(gHiA, 1);
- e->cmp(gHiB, 1);
- e->cmp(gwA, 1);
- e->cmp(gwB, 1);
- e->cmp(gdA, 1);
- e->cmp(gdB, 1);
- e->cmp(gzA, 1);
- e->cmp(gLoA, gLoB);
- e->cmp(gHiA, gHiB);
- e->cmp(gwA, gwB);
- e->cmp(gdA, gdB);
- e->cmp(gzA, gzB);
- e->cmp(gdA, anyptr_gpB);
- e->cmp(gzA, intptr_gpB);
- e->cmp(intptr_gpA, 1);
- e->cmp(anyptr_gpA, gdB);
- e->cmp(intptr_gpA, gzB);
- e->cmpxchg(gdA, gdB); // Implicit regA, regB, <EAX>
- e->cmpxchg(gzA, gzB); // Implicit regA, regB, <ZAX>
- e->cmpxchg(gdA, gdB, eax); // Explicit regA, regB, <EAX>
- e->cmpxchg(gzA, gzB, e->zax()); // Explicit regA, regB, <ZAX>
- e->cmpxchg(anyptr_gpA, gdB); // Implicit mem , regB, <EAX>
- e->cmpxchg(anyptr_gpA, gzB); // Implicit mem , regB, <ZAX>
- e->cmpxchg(anyptr_gpA, gdB, eax); // Explicit mem , regB, <EAX>
- e->cmpxchg(anyptr_gpA, gzB, e->zax()); // Explicit mem , regB, <ZAX>
- e->cmpxchg8b(anyptr_gpA); // Implicit mem , <EDX>, <EAX>, <ECX>, <EBX>
- e->cmpxchg8b(anyptr_gpA,
- x86::edx, x86::eax,
- x86::ecx, x86::ebx); // Explicit mem , <EDX>, <EAX>, <ECX>, <EBX>
- if (isX64) e->cmpxchg16b(anyptr_gpA); // Implicit mem , <RDX>, <RAX>, <RCX>, <RBX>
- if (isX64) e->cmpxchg16b(anyptr_gpA,
- x86::rdx, x86::rax,
- x86::rcx, x86::rbx); // Explicit mem , <EDX>, <EAX>, <ECX>, <EBX>
- e->cpuid(); // Implicit <EAX>, <EBX>, <ECX>, <EDX>
- e->cpuid(eax, ebx, ecx, edx); // Explicit <EAX>, <EBX>, <ECX>, <EDX>
- e->crc32(gdA, byte_ptr(gzB));
- e->crc32(gdA, word_ptr(gzB));
- e->crc32(gdA, dword_ptr(gzB));
- if (isX64) e->crc32(gdA, qword_ptr(gzB));
- if (isX64) e->crc32(gzA, qword_ptr(gzB));
- e->dec(gLoA);
- e->dec(gHiA);
- e->dec(gwA);
- e->dec(gdA);
- e->dec(gzA);
- e->dec(intptr_gpA);
- e->inc(gLoA);
- e->inc(gwA);
- e->inc(gdA);
- e->inc(gzA);
- e->inc(intptr_gpA);
- e->int_(13);
- e->int3();
- e->into();
- e->lea(gzA, intptr_gpB);
- e->mov(gLoA, 1);
- e->mov(gHiA, 1);
- e->mov(gwA, 1);
- e->mov(gdA, 1);
- e->mov(gzA, 1);
- e->mov(gLoA, gLoB);
- e->mov(gHiA, gHiB);
- e->mov(gwA, gwB);
- e->mov(gdA, gdB);
- e->mov(gzA, gzB);
- e->mov(gLoA, anyptr_gpB);
- e->mov(gwA, anyptr_gpB);
- e->mov(gdA, anyptr_gpB);
- e->mov(gzA, intptr_gpB);
- e->mov(anyptr_gpA, gLoB);
- e->mov(anyptr_gpA, gwB);
- e->mov(anyptr_gpA, gdB);
- e->mov(intptr_gpA, 1);
- e->mov(intptr_gpA, gzB);
- e->movsx(gzA, gLoB);
- e->movsx(gzA, byte_ptr(gzB));
- e->movzx(gzA, gLoB);
- e->movzx(gzA, byte_ptr(gzB));
- e->movbe(gzA, anyptr_gpB);
- e->movbe(anyptr_gpA, gzB);
- e->neg(gzA);
- e->neg(intptr_gpA);
- e->nop();
- e->not_(gzA);
- e->not_(intptr_gpA);
- e->or_(gLoA, 1);
- e->or_(gLoB, 1);
- e->or_(gHiA, 1);
- e->or_(gHiB, 1);
- e->or_(gwA, 1);
- e->or_(gwB, 1);
- e->or_(gdA, 1);
- e->or_(gdB, 1);
- e->or_(gzA, 1);
- e->or_(gzA, gzB);
- e->or_(gzA, intptr_gpB);
- e->or_(intptr_gpA, 1);
- e->or_(intptr_gpA, gzB);
- e->pop(gzA);
- e->pop(intptr_gpA);
- if (!isX64) e->popa();
- if (!isX64) e->popad();
- e->popf();
- if (!isX64) e->popfd();
- if ( isX64) e->popfq();
- e->push(gzA);
- e->push(intptr_gpA);
- e->push(0);
- if (!isX64) e->pusha();
- if (!isX64) e->pushad();
- e->pushf();
- if (!isX64) e->pushfd();
- if ( isX64) e->pushfq();
- e->rcl(gdA, 0);
- e->rcl(gzA, 0);
- e->rcl(gdA, 1);
- e->rcl(gzA, 1);
- e->rcl(gdA, cl);
- e->rcl(gzA, cl);
- e->rcl(intptr_gpA, 0);
- e->rcl(intptr_gpA, 1);
- e->rcl(intptr_gpA, cl);
- e->rcr(gdA, 0);
- e->rcr(gzA, 0);
- e->rcr(gdA, 1);
- e->rcr(gzA, 1);
- e->rcr(gdA, cl);
- e->rcr(gzA, cl);
- e->rcr(intptr_gpA, 0);
- e->rcr(intptr_gpA, 1);
- e->rcr(intptr_gpA, cl);
- e->rdtsc(); // Implicit <EDX:EAX>
- e->rdtsc(edx, eax); // Explicit <EDX:EAX>
- e->rdtscp(); // Implicit <EDX:EAX>, <ECX>
- e->rdtscp(edx, eax, ecx); // Implicit <EDX:EAX>, <ECX>
- e->ret();
- e->ret(0);
- e->rol(gdA, 0);
- e->rol(gzA, 0);
- e->rol(gdA, 1);
- e->rol(gzA, 1);
- e->rol(gdA, cl);
- e->rol(gzA, cl);
- e->rol(intptr_gpA, 0);
- e->rol(intptr_gpA, 1);
- e->rol(intptr_gpA, cl);
- e->ror(gdA, 0);
- e->ror(gzA, 0);
- e->ror(gdA, 1);
- e->ror(gzA, 1);
- e->ror(gdA, cl);
- e->ror(gzA, cl);
- e->ror(intptr_gpA, 0);
- e->ror(intptr_gpA, 1);
- e->ror(intptr_gpA, cl);
- e->sbb(gLoA, 1);
- e->sbb(gLoB, 1);
- e->sbb(gHiA, 1);
- e->sbb(gHiB, 1);
- e->sbb(gwA, 1);
- e->sbb(gwB, 1);
- e->sbb(gdA, 1);
- e->sbb(gdB, 1);
- e->sbb(gzA, 1);
- e->sbb(gzA, gzB);
- e->sbb(gzA, intptr_gpB);
- e->sbb(intptr_gpA, 1);
- e->sbb(intptr_gpA, gzB);
- e->sal(gdA, 0);
- e->sal(gzA, 0);
- e->sal(gdA, 1);
- e->sal(gzA, 1);
- e->sal(gdA, cl);
- e->sal(gzA, cl);
- e->sal(intptr_gpA, 0);
- e->sal(intptr_gpA, 1);
- e->sal(intptr_gpA, cl);
- e->sar(gdA, 0);
- e->sar(gzA, 0);
- e->sar(gdA, 1);
- e->sar(gzA, 1);
- e->sar(gdA, cl);
- e->sar(gzA, cl);
- e->sar(intptr_gpA, 0);
- e->sar(intptr_gpA, 1);
- e->sar(intptr_gpA, cl);
- e->shl(gdA, 0);
- e->shl(gzA, 0);
- e->shl(gdA, 1);
- e->shl(gzA, 1);
- e->shl(gdA, cl);
- e->shl(gzA, cl);
- e->shl(intptr_gpA, 0);
- e->shl(intptr_gpA, 1);
- e->shl(intptr_gpA, cl);
- e->shr(gdA, 0);
- e->shr(gzA, 0);
- e->shr(gdA, 1);
- e->shr(gzA, 1);
- e->shr(gdA, cl);
- e->shr(gzA, cl);
- e->shr(intptr_gpA, 0);
- e->shr(intptr_gpA, 1);
- e->shr(intptr_gpA, cl);
- e->shld(gdA, gdB, 0);
- e->shld(gzA, gzB, 0);
- e->shld(gdA, gdB, cl);
- e->shld(gzA, gzB, cl);
- e->shld(anyptr_gpA, gdB, 0);
- e->shld(intptr_gpA, gzB, 0);
- e->shld(anyptr_gpA, gdB, cl);
- e->shld(intptr_gpA, gzB, cl);
- e->shrd(gdA, gdB, 0);
- e->shrd(gzA, gzB, 0);
- e->shrd(gdA, gdB, cl);
- e->shrd(gzA, gzB, cl);
- e->shrd(anyptr_gpA, gdB, 0);
- e->shrd(intptr_gpA, gzB, 0);
- e->shrd(anyptr_gpA, gdB, cl);
- e->shrd(intptr_gpA, gzB, cl);
- e->stc();
- e->std();
- e->sti();
- e->sub(gLoA, 1);
- e->sub(gLoB, 1);
- e->sub(gHiA, 1);
- e->sub(gHiB, 1);
- e->sub(gwA, 1);
- e->sub(gwB, 1);
- e->sub(gdA, 1);
- e->sub(gdB, 1);
- e->sub(gzA, 1);
- e->sub(gzA, gzB);
- e->sub(gzA, intptr_gpB);
- e->sub(intptr_gpA, 1);
- e->sub(intptr_gpA, gzB);
- e->swapgs();
- e->test(gzA, 1);
- e->test(gzA, gzB);
- e->test(intptr_gpA, 1);
- e->test(intptr_gpA, gzB);
- e->ud2();
- e->xadd(gzA, gzB);
- e->xadd(intptr_gpA, gzB);
- e->xchg(gzA, gzB);
- e->xchg(intptr_gpA, gzB);
- e->xchg(gzA, intptr_gpB);
- e->xor_(gLoA, 1);
- e->xor_(gLoB, 1);
- e->xor_(gHiA, 1);
- e->xor_(gHiB, 1);
- e->xor_(gwA, 1);
- e->xor_(gwB, 1);
- e->xor_(gdA, 1);
- e->xor_(gdB, 1);
- e->xor_(gzA, 1);
- e->xor_(gzA, gzB);
- e->xor_(gzA, intptr_gpB);
- e->xor_(intptr_gpA, 1);
- e->xor_(intptr_gpA, gzB);
-
- // Special case - div|mul.
- e->div(cl); // Implicit AH:AL <- AX * r8
- e->div(byte_ptr(gzA)); // Implicit AH:AL <- AX * m8
- e->div(ax, cl); // Explicit AH:AL <- AX * r8
- e->div(ax, anyptr_gpA); // Explicit AH:AL <- AX * m8
-
- e->div(cx); // Implicit DX:AX <- DX:AX * r16
- e->div(word_ptr(gzA)); // Implicit DX:AX <- DX:AX * m16
- e->div(dx, ax, cx); // Explicit DX:AX <- DX:AX * r16
- e->div(dx, ax, anyptr_gpA); // Explicit DX:AX <- DX:AX * m16
-
- e->div(ecx); // Implicit EDX:EAX <- EDX:EAX * r32
- e->div(dword_ptr(gzA)); // Implicit EDX:EAX <- EDX:EAX * m32
- e->div(edx, eax, ecx); // Explicit EDX:EAX <- EDX:EAX * r32
- e->div(edx, eax, anyptr_gpA); // Explicit EDX:EAX <- EDX:EAX * m32
-
- if (isX64) e->div(rcx); // Implicit RDX|RAX <- RDX:RAX * r64
- if (isX64) e->div(qword_ptr(gzA)); // Implicit RDX|RAX <- RDX:RAX * m64
- if (isX64) e->div(rdx, rax, rcx); // Explicit RDX|RAX <- RDX:RAX * r64
- if (isX64) e->div(rdx, rax, anyptr_gpA); // Explicit RDX|RAX <- RDX:RAX * m64
-
- e->idiv(cl); // Implicit AH:AL <- AX * r8
- e->idiv(byte_ptr(gzA)); // Implicit AH:AL <- AX * m8
- e->idiv(ax, cl); // Explicit AH:AL <- AX * r8
- e->idiv(ax, anyptr_gpA); // Explicit AH:AL <- AX * m8
-
- e->idiv(cx); // Implicit DX:AX <- DX:AX * r16
- e->idiv(word_ptr(gzA)); // Implicit DX:AX <- DX:AX * m16
- e->idiv(dx, ax, cx); // Explicit DX:AX <- DX:AX * r16
- e->idiv(dx, ax, anyptr_gpA); // Explicit DX:AX <- DX:AX * m16
-
- e->idiv(ecx); // Implicit EDX:EAX <- EDX:EAX * r32
- e->idiv(dword_ptr(gzA)); // Implicit EDX:EAX <- EDX:EAX * m32
- e->idiv(edx, eax, ecx); // Explicit EDX:EAX <- EDX:EAX * r32
- e->idiv(edx, eax, anyptr_gpA); // Explicit EDX:EAX <- EDX:EAX * m32
-
- if (isX64) e->idiv(rcx); // Implicit RDX|RAX <- RDX:RAX * r64
- if (isX64) e->idiv(qword_ptr(gzA)); // Implicit RDX|RAX <- RDX:RAX * m64
- if (isX64) e->idiv(rdx, rax, rcx); // Explicit RDX|RAX <- RDX:RAX * r64
- if (isX64) e->idiv(rdx, rax, anyptr_gpA); // Explicit RDX|RAX <- RDX:RAX * m64
-
- e->mul(cl); // Implicit AX <- AL * r8
- e->mul(byte_ptr(gzA)); // Implicit AX <- AL * m8
- e->mul(ax, cl); // Explicit AX <- AL * r8
- e->mul(ax, anyptr_gpA); // Explicit AX <- AL * m8
-
- e->mul(cx); // Implicit DX:AX <- AX * r16
- e->mul(word_ptr(gzA)); // Implicit DX:AX <- AX * m16
- e->mul(dx, ax, cx); // Explicit DX:AX <- AX * r16
- e->mul(dx, ax, anyptr_gpA); // Explicit DX:AX <- AX * m16
-
- e->mul(ecx); // Implicit EDX:EAX <- EAX * r32
- e->mul(dword_ptr(gzA)); // Implicit EDX:EAX <- EAX * m32
- e->mul(edx, eax, ecx); // Explicit EDX:EAX <- EAX * r32
- e->mul(edx, eax, anyptr_gpA); // Explicit EDX:EAX <- EAX * m32
-
- if (isX64) e->mul(rcx); // Implicit RDX|RAX <- RAX * r64
- if (isX64) e->mul(qword_ptr(gzA)); // Implicit RDX|RAX <- RAX * m64
- if (isX64) e->mul(rdx, rax, rcx); // Explicit RDX|RAX <- RAX * r64
- if (isX64) e->mul(rdx, rax, anyptr_gpA); // Explicit RDX|RAX <- RAX * m64
-
- e->imul(gdA);
- e->imul(gzA);
- e->imul(intptr_gpA);
- e->imul(gdA, 1);
- e->imul(gzA, 1);
- e->imul(gdA, gdB);
- e->imul(gzA, gzB);
- e->imul(gdA, gdB, 1);
- e->imul(gzA, gzB, 1);
- e->imul(gdA, anyptr_gpB);
- e->imul(gzA, intptr_gpB);
- e->imul(gdA, anyptr_gpB, 1);
- e->imul(gzA, intptr_gpB, 1);
-
- // Special case - zero-extend 32-bit immediate instead of sign-extend:
- if (isX64) e->mov(gzA, uint32_t(0xFEEDFEED));
- if (isX64) e->and_(gzA, uint32_t(0xFEEDFEED));
-
- // Special case - mov with absolute 32-bit address.
- e->mov(al , ptr(0x01020304u));
- e->mov(ax , ptr(0x01020304u));
- e->mov(eax, ptr(0x01020304u));
- e->mov(ptr(0x01020304u), al );
- e->mov(ptr(0x01020304u), ax );
- e->mov(ptr(0x01020304u), eax);
-
- // Special case - mov with absolute 64-bit address.
- if (isX64) e->mov(al , ptr(0x0102030405060708u));
- if (isX64) e->mov(ax , ptr(0x0102030405060708u));
- if (isX64) e->mov(eax, ptr(0x0102030405060708u));
- if (isX64) e->mov(rax, ptr(0x0102030405060708u));
- if (isX64) e->mov(ptr(0x0102030405060708u), al );
- if (isX64) e->mov(ptr(0x0102030405060708u), ax );
- if (isX64) e->mov(ptr(0x0102030405060708u), eax);
- if (isX64) e->mov(ptr(0x0102030405060708u), rax);
-
- // Control registers.
- e->nop();
-
- e->mov(gzA, cr0);
- e->mov(cr0, gzA);
- if (isX64) e->mov(gzA, cr8);
- if (isX64) e->mov(cr8, gzA);
-
- // Debug registers.
- e->nop();
-
- e->mov(gzA, dr0);
- e->mov(dr0, gzA);
-
- // Segment registers.
- e->nop();
-
- if (!isX64) e->mov(es, ax);
- if (!isX64) e->mov(es, bx);
- if (!isX64) e->mov(ax, es);
- if (!isX64) e->mov(bx, es);
-
- if (!isX64) e->mov(cs, ax);
- if (!isX64) e->mov(cs, bx);
- if (!isX64) e->mov(ax, cs);
- if (!isX64) e->mov(bx, cs);
-
- if (!isX64) e->mov(ss, ax);
- if (!isX64) e->mov(ss, bx);
- if (!isX64) e->mov(ax, ss);
- if (!isX64) e->mov(bx, ss);
-
- if (!isX64) e->mov(ds, ax);
- if (!isX64) e->mov(ds, bx);
- if (!isX64) e->mov(ax, ds);
- if (!isX64) e->mov(bx, ds);
-
- e->mov(fs, ax);
- e->mov(fs, bx);
- e->mov(ax, fs);
- e->mov(bx, fs);
-
- e->mov(gs, ax);
- e->mov(gs, bx);
- e->mov(ax, gs);
- e->mov(bx, gs);
-
- // Instructions using REP prefix.
- e->nop();
-
- e->in(al, 0);
- e->in(al, dx);
- e->in(ax, 0);
- e->in(ax, dx);
- e->in(eax, 0);
- e->in(eax, dx);
- e->rep().ins(byte_ptr(e->zdi()), dx);
- e->rep().ins(word_ptr(e->zdi()), dx);
- e->rep().ins(dword_ptr(e->zdi()), dx);
-
- e->out(imm(0), al);
- e->out(dx, al);
- e->out(imm(0), ax);
- e->out(dx, ax);
- e->out(imm(0), eax);
- e->out(dx, eax);
- e->rep().outs(dx, byte_ptr(e->zsi()));
- e->rep().outs(dx, word_ptr(e->zsi()));
- e->rep().outs(dx, dword_ptr(e->zsi()));
-
- e->lodsb();
- e->lodsd();
- e->lodsw();
- e->rep().lodsb();
- e->rep().lodsd();
- e->rep().lodsw();
- if (isX64) e->rep().lodsq();
-
- e->movsb();
- e->movsd();
- e->movsw();
- e->rep().movsb();
- e->rep().movsd();
- e->rep().movsw();
- if (isX64) e->rep().movsq();
-
- e->stosb();
- e->stosd();
- e->stosw();
- e->rep().stosb();
- e->rep().stosd();
- e->rep().stosw();
- if (isX64) e->rep().stosq();
-
- e->cmpsb();
- e->cmpsd();
- e->cmpsw();
- e->repz().cmpsb();
- e->repz().cmpsd();
- e->repz().cmpsw();
- if (isX64) e->repz().cmpsq();
- e->repnz().cmpsb();
- e->repnz().cmpsd();
- e->repnz().cmpsw();
- if (isX64) e->repnz().cmpsq();
-
- e->scasb();
- e->scasd();
- e->scasw();
- e->repz().scasb();
- e->repz().scasd();
- e->repz().scasw();
- if (isX64) e->repz().scasq();
- e->repnz().scasb();
- e->repnz().scasd();
- e->repnz().scasw();
- if (isX64) e->repnz().scasq();
-
- // Label...Jcc/Jecxz/Jmp.
- e->nop();
-
- L = e->newLabel();
- e->bind(L);
- e->ja(L);
- e->jae(L);
- e->jb(L);
- e->jbe(L);
- e->jc(L);
- e->je(L);
- e->jg(L);
- e->jge(L);
- e->jl(L);
- e->jle(L);
- e->jna(L);
- e->jnae(L);
- e->jnb(L);
- e->jnbe(L);
- e->jnc(L);
- e->jne(L);
- e->jng(L);
- e->jnge(L);
- e->jnl(L);
- e->jnle(L);
- e->jno(L);
- e->jnp(L);
- e->jns(L);
- e->jnz(L);
- e->jo(L);
- e->jp(L);
- e->jpe(L);
- e->jpo(L);
- e->js(L);
- e->jz(L);
- e->jecxz(ecx, L);
- e->jmp(L);
-
- // Jcc/Jecxz/Jmp...Label.
- e->nop();
-
- L = e->newLabel();
- e->ja(L);
- e->jae(L);
- e->jb(L);
- e->jbe(L);
- e->jc(L);
- e->je(L);
- e->jg(L);
- e->jge(L);
- e->jl(L);
- e->jle(L);
- e->jna(L);
- e->jnae(L);
- e->jnb(L);
- e->jnbe(L);
- e->jnc(L);
- e->jne(L);
- e->jng(L);
- e->jnge(L);
- e->jnl(L);
- e->jnle(L);
- e->jno(L);
- e->jnp(L);
- e->jns(L);
- e->jnz(L);
- e->jo(L);
- e->jp(L);
- e->jpe(L);
- e->jpo(L);
- e->js(L);
- e->jz(L);
- e->jecxz(ecx, L);
- e->jmp(L);
- e->bind(L);
-
- // FPU.
- e->nop();
-
- e->f2xm1();
- e->fabs();
- e->fadd(stA, stB);
- e->fadd(stB, stA);
- e->fadd(dword_ptr(gzA));
- e->fadd(qword_ptr(gzA));
- e->faddp(stB);
- e->faddp();
- e->fbld(dword_ptr(gzA));
- e->fbstp(dword_ptr(gzA));
- e->fchs();
- e->fclex();
- e->fcom(stB);
- e->fcom();
- e->fcom(dword_ptr(gzA));
- e->fcom(qword_ptr(gzA));
- e->fcomp(stB);
- e->fcomp();
- e->fcomp(dword_ptr(gzA));
- e->fcomp(qword_ptr(gzA));
- e->fcompp();
- e->fcos();
- e->fdecstp();
- e->fdiv(stA, stB);
- e->fdiv(stB, stA);
- e->fdiv(dword_ptr(gzA));
- e->fdiv(qword_ptr(gzA));
- e->fdivp(stB);
- e->fdivp();
- e->fdivr(stA, stB);
- e->fdivr(stB, stA);
- e->fdivr(dword_ptr(gzA));
- e->fdivr(qword_ptr(gzA));
- e->fdivrp(stB);
- e->fdivrp();
- e->fiadd(dword_ptr(gzA));
- e->ficom(word_ptr(gzA));
- e->ficom(dword_ptr(gzA));
- e->ficomp(word_ptr(gzA));
- e->ficomp(dword_ptr(gzA));
- e->fidiv(word_ptr(gzA));
- e->fidiv(dword_ptr(gzA));
- e->fidivr(word_ptr(gzA));
- e->fidivr(dword_ptr(gzA));
- e->fild(word_ptr(gzA));
- e->fild(dword_ptr(gzA));
- e->fild(qword_ptr(gzA));
- e->fimul(word_ptr(gzA));
- e->fimul(dword_ptr(gzA));
- e->fincstp();
- e->finit();
- e->fninit();
- e->fisub(word_ptr(gzA));
- e->fisub(dword_ptr(gzA));
- e->fisubr(word_ptr(gzA));
- e->fisubr(dword_ptr(gzA));
- e->fist(word_ptr(gzA));
- e->fist(dword_ptr(gzA));
- e->fistp(word_ptr(gzA));
- e->fistp(dword_ptr(gzA));
- e->fistp(qword_ptr(gzA));
- e->fld(dword_ptr(gzA));
- e->fld(qword_ptr(gzA));
- e->fld(tword_ptr(gzA));
- e->fld1();
- e->fldl2t();
- e->fldl2e();
- e->fldpi();
- e->fldlg2();
- e->fldln2();
- e->fldz();
- e->fldcw(anyptr_gpA);
- e->fldenv(anyptr_gpA);
- e->fmul(stA, stB);
- e->fmul(stB, stA);
- e->fmul(dword_ptr(gzA));
- e->fmul(qword_ptr(gzA));
- e->fmulp(stB);
- e->fmulp();
- e->fnclex();
- e->fnop();
- e->fnsave(anyptr_gpA);
- e->fnstenv(anyptr_gpA);
- e->fnstcw(anyptr_gpA);
- e->fpatan();
- e->fprem();
- e->fprem1();
- e->fptan();
- e->frndint();
- e->frstor(anyptr_gpA);
- e->fsave(anyptr_gpA);
- e->fscale();
- e->fsin();
- e->fsincos();
- e->fsqrt();
- e->fst(dword_ptr(gzA));
- e->fst(qword_ptr(gzA));
- e->fstp(dword_ptr(gzA));
- e->fstp(qword_ptr(gzA));
- e->fstp(tword_ptr(gzA));
- e->fstcw(anyptr_gpA);
- e->fstenv(anyptr_gpA);
- e->fsub(stA, stB);
- e->fsub(stB, stA);
- e->fsub(dword_ptr(gzA));
- e->fsub(qword_ptr(gzA));
- e->fsubp(stB);
- e->fsubp();
- e->fsubr(stA, stB);
- e->fsubr(stB, stA);
- e->fsubr(dword_ptr(gzA));
- e->fsubr(qword_ptr(gzA));
- e->fsubrp(stB);
- e->fsubrp();
- e->ftst();
- e->fucom(stB);
- e->fucom();
- e->fucom(stB);
- e->fucomi(stB);
- e->fucomip(stB);
- e->fucomp(stB);
- e->fucompp();
- e->fxam();
- e->fxtract();
- e->fyl2x();
- e->fyl2xp1();
-
- // LAHF/SAHF
- e->lahf(); // Implicit <AH>
- e->lahf(ah); // Explicit <AH>
- e->sahf(); // Implicit <AH>
- e->sahf(ah); // Explicit <AH>
-
- // FXSR.
- e->fxrstor(anyptr_gpA);
- e->fxsave(anyptr_gpA);
-
- // XSAVE.
- e->nop();
-
- e->xgetbv(); // Implicit <EDX:EAX>, <ECX>
- e->xgetbv(edx, eax, ecx); // Explicit <EDX:EAX>, <ECX>
-
- e->xsetbv(); // Implicit <EDX:EAX>, <ECX>
- e->xsetbv(edx, eax, ecx); // Explicit <EDX:EAX>, <ECX>
-
- e->xrstor(anyptr_gpA); // Implicit <EDX:EAX>
- e->xrstors(anyptr_gpA); // Implicit <EDX:EAX>
- e->xsave(anyptr_gpA); // Implicit <EDX:EAX>
- e->xsavec(anyptr_gpA); // Implicit <EDX:EAX>
- e->xsaveopt(anyptr_gpA); // Implicit <EDX:EAX>
- e->xsaves(anyptr_gpA); // Implicit <EDX:EAX>
-
- if (isX64) e->xrstor64(anyptr_gpA); // Implicit <EDX:EAX>
- if (isX64) e->xrstors64(anyptr_gpA); // Implicit <EDX:EAX>
- if (isX64) e->xsave64(anyptr_gpA); // Implicit <EDX:EAX>
- if (isX64) e->xsavec64(anyptr_gpA); // Implicit <EDX:EAX>
- if (isX64) e->xsaveopt64(anyptr_gpA); // Implicit <EDX:EAX>
- if (isX64) e->xsaves64(anyptr_gpA); // Implicit <EDX:EAX>
-
- // POPCNT.
- e->nop();
-
- e->popcnt(gdA, gdB);
- e->popcnt(gzA, gzB);
- e->popcnt(gdA, anyptr_gpB);
- e->popcnt(gzA, anyptr_gpB);
-
- // LZCNT.
- e->nop();
-
- e->lzcnt(gdA, gdB);
- e->lzcnt(gzA, gzB);
- e->lzcnt(gdA, anyptr_gpB);
- e->lzcnt(gzA, anyptr_gpB);
-
- // BMI.
- e->nop();
-
- e->andn(gdA, gdB, gdC);
- e->andn(gzA, gzB, gzC);
- e->andn(gdA, gdB, anyptr_gpC);
- e->andn(gzA, gzB, anyptr_gpC);
- e->bextr(gdA, gdB, gdC);
- e->bextr(gzA, gzB, gzC);
- e->bextr(gdA, anyptr_gpB, gdC);
- e->bextr(gzA, anyptr_gpB, gzC);
- e->blsi(gdA, gdB);
- e->blsi(gzA, gzB);
- e->blsi(gdA, anyptr_gpB);
- e->blsi(gzA, anyptr_gpB);
- e->blsmsk(gdA, gdB);
- e->blsmsk(gzA, gzB);
- e->blsmsk(gdA, anyptr_gpB);
- e->blsmsk(gzA, anyptr_gpB);
- e->blsr(gdA, gdB);
- e->blsr(gzA, gzB);
- e->blsr(gdA, anyptr_gpB);
- e->blsr(gzA, anyptr_gpB);
- e->tzcnt(gdA, gdB);
- e->tzcnt(gzA, gzB);
- e->tzcnt(gdA, anyptr_gpB);
- e->tzcnt(gzA, anyptr_gpB);
-
- // BMI2.
- e->nop();
-
- e->bzhi(gdA, gdB, gdC);
- e->bzhi(gzA, gzB, gzC);
- e->bzhi(gdA, anyptr_gpB, gdC);
- e->bzhi(gzA, anyptr_gpB, gzC);
- e->mulx(gdA, gdB, gdC); // Implicit gpA, gpB, gpC, <EDX>
- e->mulx(gdA, gdB, gdC, edx); // Explicit gpA, gpB, gpC, <EDX>
- e->mulx(gzA, gzB, gzC); // Implicit gpA, gpB, gpC, <EDX|RDX>
- e->mulx(gzA, gzB, gzC, e->zdx()); // Explicit gpA, gpB, gpC, <EDX|RDX>
- e->mulx(gdA, gdB, anyptr_gpC); // Implicit gpA, gpB, mem, <EDX>
- e->mulx(gdA, gdB, anyptr_gpC, edx); // Explicit gpA, gpB, mem, <EDX>
- e->mulx(gzA, gzB, anyptr_gpC); // Implicit gpA, gpB, mem, <EDX|RDX>
- e->mulx(gzA, gzB, anyptr_gpC, e->zdx()); // Explicit gpA, gpB, mem, <EDX|RDX>
- e->pdep(gdA, gdB, gdC);
- e->pdep(gzA, gzB, gzC);
- e->pdep(gdA, gdB, anyptr_gpC);
- e->pdep(gzA, gzB, anyptr_gpC);
- e->pext(gdA, gdB, gdC);
- e->pext(gzA, gzB, gzC);
- e->pext(gdA, gdB, anyptr_gpC);
- e->pext(gzA, gzB, anyptr_gpC);
- e->rorx(gdA, gdB, 0);
- e->rorx(gzA, gzB, 0);
- e->rorx(gdA, anyptr_gpB, 0);
- e->rorx(gzA, anyptr_gpB, 0);
- e->sarx(gdA, gdB, gdC);
- e->sarx(gzA, gzB, gzC);
- e->sarx(gdA, anyptr_gpB, gdC);
- e->sarx(gzA, anyptr_gpB, gzC);
- e->shlx(gdA, gdB, gdC);
- e->shlx(gzA, gzB, gzC);
- e->shlx(gdA, anyptr_gpB, gdC);
- e->shlx(gzA, anyptr_gpB, gzC);
- e->shrx(gdA, gdB, gdC);
- e->shrx(gzA, gzB, gzC);
- e->shrx(gdA, anyptr_gpB, gdC);
- e->shrx(gzA, anyptr_gpB, gzC);
-
- // ADX.
- e->nop();
-
- e->adcx(gdA, gdB);
- e->adcx(gzA, gzB);
- e->adcx(gdA, anyptr_gpB);
- e->adcx(gzA, anyptr_gpB);
- e->adox(gdA, gdB);
- e->adox(gzA, gzB);
- e->adox(gdA, anyptr_gpB);
- e->adox(gzA, anyptr_gpB);
-
- // TBM.
- e->nop();
-
- e->blcfill(gdA, gdB);
- e->blcfill(gzA, gzB);
- e->blcfill(gdA, anyptr_gpB);
- e->blcfill(gzA, anyptr_gpB);
-
- e->blci(gdA, gdB);
- e->blci(gzA, gzB);
- e->blci(gdA, anyptr_gpB);
- e->blci(gzA, anyptr_gpB);
-
- e->blcic(gdA, gdB);
- e->blcic(gzA, gzB);
- e->blcic(gdA, anyptr_gpB);
- e->blcic(gzA, anyptr_gpB);
-
- e->blcmsk(gdA, gdB);
- e->blcmsk(gzA, gzB);
- e->blcmsk(gdA, anyptr_gpB);
- e->blcmsk(gzA, anyptr_gpB);
-
- e->blcs(gdA, gdB);
- e->blcs(gzA, gzB);
- e->blcs(gdA, anyptr_gpB);
- e->blcs(gzA, anyptr_gpB);
-
- e->blsfill(gdA, gdB);
- e->blsfill(gzA, gzB);
- e->blsfill(gdA, anyptr_gpB);
- e->blsfill(gzA, anyptr_gpB);
-
- e->blsic(gdA, gdB);
- e->blsic(gzA, gzB);
- e->blsic(gdA, anyptr_gpB);
- e->blsic(gzA, anyptr_gpB);
-
- e->t1mskc(gdA, gdB);
- e->t1mskc(gzA, gzB);
- e->t1mskc(gdA, anyptr_gpB);
- e->t1mskc(gzA, anyptr_gpB);
-
- e->tzmsk(gdA, gdB);
- e->tzmsk(gzA, gzB);
- e->tzmsk(gdA, anyptr_gpB);
- e->tzmsk(gzA, anyptr_gpB);
-
- // CLFLUSH / CLFLUSH_OPT.
- e->nop();
- e->clflush(anyptr_gpA);
- e->clflushopt(anyptr_gpA);
-
- // CLWB.
- e->nop();
- e->clwb(anyptr_gpA);
-
- // CLZERO.
- e->nop();
- e->clzero(); // Implicit <ds:[EAX|RAX]>
- e->clzero(ptr(e->zax())); // Explicit <ds:[EAX|RAX]>
-
- // MONITOR[X] / MWAIT[X].
- e->nop();
- e->monitor(); // Implicit <ds:[EAX|RAX]>, <ECX>, <EDX>
- e->monitorx(); // Implicit <ds:[EAX|RAX]>, <ECX>, <EDX>
- e->mwait(); // Implicit <EAX>, <ECX>
- e->mwaitx(); // Implicit <EAX>, <ECX>, <EBX>
-
- // PCOMMIT.
- e->nop();
- e->pcommit();
-
- // PREFETCH / PREFETCHW / PREFETCHWT1.
- e->nop();
- e->prefetch(anyptr_gpA); // 3DNOW.
- e->prefetchnta(anyptr_gpA); // MMX+SSE.
- e->prefetcht0(anyptr_gpA); // MMX+SSE.
- e->prefetcht1(anyptr_gpA); // MMX+SSE.
- e->prefetcht2(anyptr_gpA); // MMX+SSE.
- e->prefetchw(anyptr_gpA); // PREFETCHW.
- e->prefetchwt1(anyptr_gpA); // PREFETCHWT1.
-
- // RDRAND / RDSEED.
- e->nop();
-
- e->rdrand(gdA);
- e->rdrand(gzA);
- e->rdseed(gdA);
- e->rdseed(gzA);
-
- // MMX/MMX2.
- e->nop();
-
- e->movd(anyptr_gpA, mmB);
- e->movd(gdA, mmB);
- e->movd(mmA, anyptr_gpB);
- e->movd(mmA, gdB);
- e->movq(mmA, mmB);
- e->movq(anyptr_gpA, mmB);
- e->movq(mmA, anyptr_gpB);
- e->packuswb(mmA, mmB);
- e->packuswb(mmA, anyptr_gpB);
- e->paddb(mmA, mmB);
- e->paddb(mmA, anyptr_gpB);
- e->paddw(mmA, mmB);
- e->paddw(mmA, anyptr_gpB);
- e->paddd(mmA, mmB);
- e->paddd(mmA, anyptr_gpB);
- e->paddsb(mmA, mmB);
- e->paddsb(mmA, anyptr_gpB);
- e->paddsw(mmA, mmB);
- e->paddsw(mmA, anyptr_gpB);
- e->paddusb(mmA, mmB);
- e->paddusb(mmA, anyptr_gpB);
- e->paddusw(mmA, mmB);
- e->paddusw(mmA, anyptr_gpB);
- e->pand(mmA, mmB);
- e->pand(mmA, anyptr_gpB);
- e->pandn(mmA, mmB);
- e->pandn(mmA, anyptr_gpB);
- e->pcmpeqb(mmA, mmB);
- e->pcmpeqb(mmA, anyptr_gpB);
- e->pcmpeqw(mmA, mmB);
- e->pcmpeqw(mmA, anyptr_gpB);
- e->pcmpeqd(mmA, mmB);
- e->pcmpeqd(mmA, anyptr_gpB);
- e->pcmpgtb(mmA, mmB);
- e->pcmpgtb(mmA, anyptr_gpB);
- e->pcmpgtw(mmA, mmB);
- e->pcmpgtw(mmA, anyptr_gpB);
- e->pcmpgtd(mmA, mmB);
- e->pcmpgtd(mmA, anyptr_gpB);
- e->pmulhw(mmA, mmB);
- e->pmulhw(mmA, anyptr_gpB);
- e->pmullw(mmA, mmB);
- e->pmullw(mmA, anyptr_gpB);
- e->por(mmA, mmB);
- e->por(mmA, anyptr_gpB);
- e->pmaddwd(mmA, mmB);
- e->pmaddwd(mmA, anyptr_gpB);
- e->pslld(mmA, mmB);
- e->pslld(mmA, anyptr_gpB);
- e->pslld(mmA, 0);
- e->psllq(mmA, mmB);
- e->psllq(mmA, anyptr_gpB);
- e->psllq(mmA, 0);
- e->psllw(mmA, mmB);
- e->psllw(mmA, anyptr_gpB);
- e->psllw(mmA, 0);
- e->psrad(mmA, mmB);
- e->psrad(mmA, anyptr_gpB);
- e->psrad(mmA, 0);
- e->psraw(mmA, mmB);
- e->psraw(mmA, anyptr_gpB);
- e->psraw(mmA, 0);
- e->psrld(mmA, mmB);
- e->psrld(mmA, anyptr_gpB);
- e->psrld(mmA, 0);
- e->psrlq(mmA, mmB);
- e->psrlq(mmA, anyptr_gpB);
- e->psrlq(mmA, 0);
- e->psrlw(mmA, mmB);
- e->psrlw(mmA, anyptr_gpB);
- e->psrlw(mmA, 0);
- e->psubb(mmA, mmB);
- e->psubb(mmA, anyptr_gpB);
- e->psubw(mmA, mmB);
- e->psubw(mmA, anyptr_gpB);
- e->psubd(mmA, mmB);
- e->psubd(mmA, anyptr_gpB);
- e->psubsb(mmA, mmB);
- e->psubsb(mmA, anyptr_gpB);
- e->psubsw(mmA, mmB);
- e->psubsw(mmA, anyptr_gpB);
- e->psubusb(mmA, mmB);
- e->psubusb(mmA, anyptr_gpB);
- e->psubusw(mmA, mmB);
- e->psubusw(mmA, anyptr_gpB);
- e->punpckhbw(mmA, mmB);
- e->punpckhbw(mmA, anyptr_gpB);
- e->punpckhwd(mmA, mmB);
- e->punpckhwd(mmA, anyptr_gpB);
- e->punpckhdq(mmA, mmB);
- e->punpckhdq(mmA, anyptr_gpB);
- e->punpcklbw(mmA, mmB);
- e->punpcklbw(mmA, anyptr_gpB);
- e->punpcklwd(mmA, mmB);
- e->punpcklwd(mmA, anyptr_gpB);
- e->punpckldq(mmA, mmB);
- e->punpckldq(mmA, anyptr_gpB);
- e->pxor(mmA, mmB);
- e->pxor(mmA, anyptr_gpB);
- e->emms();
-
- // 3DNOW.
- e->nop();
-
- e->pavgusb(mmA, mmB);
- e->pavgusb(mmA, anyptr_gpB);
- e->pf2id(mmA, mmB);
- e->pf2id(mmA, anyptr_gpB);
- e->pf2iw(mmA, mmB);
- e->pf2iw(mmA, anyptr_gpB);
- e->pfacc(mmA, mmB);
- e->pfacc(mmA, anyptr_gpB);
- e->pfadd(mmA, mmB);
- e->pfadd(mmA, anyptr_gpB);
- e->pfcmpeq(mmA, mmB);
- e->pfcmpeq(mmA, anyptr_gpB);
- e->pfcmpge(mmA, mmB);
- e->pfcmpge(mmA, anyptr_gpB);
- e->pfcmpgt(mmA, mmB);
- e->pfcmpgt(mmA, anyptr_gpB);
- e->pfmax(mmA, mmB);
- e->pfmax(mmA, anyptr_gpB);
- e->pfmin(mmA, mmB);
- e->pfmin(mmA, anyptr_gpB);
- e->pfmul(mmA, mmB);
- e->pfmul(mmA, anyptr_gpB);
- e->pfnacc(mmA, mmB);
- e->pfnacc(mmA, anyptr_gpB);
- e->pfpnacc(mmA, mmB);
- e->pfpnacc(mmA, anyptr_gpB);
- e->pfrcp(mmA, mmB);
- e->pfrcp(mmA, anyptr_gpB);
- e->pfrcpit1(mmA, mmB);
- e->pfrcpit1(mmA, anyptr_gpB);
- e->pfrcpit2(mmA, mmB);
- e->pfrcpit2(mmA, anyptr_gpB);
- e->pfrcpv(mmA, mmB);
- e->pfrcpv(mmA, anyptr_gpB);
- e->pfrsqit1(mmA, mmB);
- e->pfrsqit1(mmA, anyptr_gpB);
- e->pfrsqrt(mmA, mmB);
- e->pfrsqrt(mmA, anyptr_gpB);
- e->pfrsqrtv(mmA, mmB);
- e->pfrsqrtv(mmA, anyptr_gpB);
- e->pfsub(mmA, mmB);
- e->pfsub(mmA, anyptr_gpB);
- e->pfsubr(mmA, mmB);
- e->pfsubr(mmA, anyptr_gpB);
- e->pi2fd(mmA, mmB);
- e->pi2fd(mmA, anyptr_gpB);
- e->pi2fw(mmA, mmB);
- e->pi2fw(mmA, anyptr_gpB);
- e->pmulhrw(mmA, mmB);
- e->pmulhrw(mmA, anyptr_gpB);
- e->pswapd(mmA, mmB);
- e->pswapd(mmA, anyptr_gpB);
- e->femms();
-
- // SSE.
- e->nop();
-
- e->addps(xmmA, xmmB);
- e->addps(xmmA, anyptr_gpB);
- e->addss(xmmA, xmmB);
- e->addss(xmmA, anyptr_gpB);
- e->andnps(xmmA, xmmB);
- e->andnps(xmmA, anyptr_gpB);
- e->andps(xmmA, xmmB);
- e->andps(xmmA, anyptr_gpB);
- e->cmpps(xmmA, xmmB, 0);
- e->cmpps(xmmA, anyptr_gpB, 0);
- e->cmpss(xmmA, xmmB, 0);
- e->cmpss(xmmA, anyptr_gpB, 0);
- e->comiss(xmmA, xmmB);
- e->comiss(xmmA, anyptr_gpB);
- e->cvtpi2ps(xmmA, mmB);
- e->cvtpi2ps(xmmA, anyptr_gpB);
- e->cvtps2pi(mmA, xmmB);
- e->cvtps2pi(mmA, anyptr_gpB);
- e->cvtsi2ss(xmmA, gdB);
- e->cvtsi2ss(xmmA, gzB);
- e->cvtsi2ss(xmmA, anyptr_gpB);
- e->cvtss2si(gdA, xmmB);
- e->cvtss2si(gzA, xmmB);
- e->cvtss2si(gdA, anyptr_gpB);
- e->cvtss2si(gzA, anyptr_gpB);
- e->cvttps2pi(mmA, xmmB);
- e->cvttps2pi(mmA, anyptr_gpB);
- e->cvttss2si(gdA, xmmB);
- e->cvttss2si(gzA, xmmB);
- e->cvttss2si(gdA, anyptr_gpB);
- e->cvttss2si(gzA, anyptr_gpB);
- e->divps(xmmA, xmmB);
- e->divps(xmmA, anyptr_gpB);
- e->divss(xmmA, xmmB);
- e->divss(xmmA, anyptr_gpB);
- e->ldmxcsr(anyptr_gpA);
- e->maskmovq(mmA, mmB); // Implicit mmA, mmB, <ds:[EDI|RDI]>
- e->maskmovq(mmA, mmB, ptr(e->zdi())); // Explicit mmA, mmB, <ds:[EDI|RDI]>
- e->maxps(xmmA, xmmB);
- e->maxps(xmmA, anyptr_gpB);
- e->maxss(xmmA, xmmB);
- e->maxss(xmmA, anyptr_gpB);
- e->minps(xmmA, xmmB);
- e->minps(xmmA, anyptr_gpB);
- e->minss(xmmA, xmmB);
- e->minss(xmmA, anyptr_gpB);
- e->movaps(xmmA, xmmB);
- e->movaps(xmmA, anyptr_gpB);
- e->movaps(anyptr_gpA, xmmB);
- e->movd(anyptr_gpA, xmmB);
- e->movd(gdA, xmmB);
- e->movd(gzA, xmmB);
- e->movd(xmmA, anyptr_gpB);
- e->movd(xmmA, gdB);
- e->movd(xmmA, gzB);
- e->movq(mmA, mmB);
- e->movq(xmmA, xmmB);
- e->movq(anyptr_gpA, xmmB);
- e->movq(xmmA, anyptr_gpB);
- e->movntq(anyptr_gpA, mmB);
- e->movhlps(xmmA, xmmB);
- e->movhps(xmmA, anyptr_gpB);
- e->movhps(anyptr_gpA, xmmB);
- e->movlhps(xmmA, xmmB);
- e->movlps(xmmA, anyptr_gpB);
- e->movlps(anyptr_gpA, xmmB);
- e->movntps(anyptr_gpA, xmmB);
- e->movss(xmmA, anyptr_gpB);
- e->movss(anyptr_gpA, xmmB);
- e->movups(xmmA, xmmB);
- e->movups(xmmA, anyptr_gpB);
- e->movups(anyptr_gpA, xmmB);
- e->mulps(xmmA, xmmB);
- e->mulps(xmmA, anyptr_gpB);
- e->mulss(xmmA, xmmB);
- e->mulss(xmmA, anyptr_gpB);
- e->orps(xmmA, xmmB);
- e->orps(xmmA, anyptr_gpB);
- e->pavgb(mmA, mmB);
- e->pavgb(mmA, anyptr_gpB);
- e->pavgw(mmA, mmB);
- e->pavgw(mmA, anyptr_gpB);
- e->pextrw(gdA, mmB, 0);
- e->pextrw(gzA, mmB, 0);
- e->pinsrw(mmA, gdB, 0);
- e->pinsrw(mmA, gzB, 0);
- e->pinsrw(mmA, anyptr_gpB, 0);
- e->pmaxsw(mmA, mmB);
- e->pmaxsw(mmA, anyptr_gpB);
- e->pmaxub(mmA, mmB);
- e->pmaxub(mmA, anyptr_gpB);
- e->pminsw(mmA, mmB);
- e->pminsw(mmA, anyptr_gpB);
- e->pminub(mmA, mmB);
- e->pminub(mmA, anyptr_gpB);
- e->pmovmskb(gdA, mmB);
- e->pmovmskb(gzA, mmB);
- e->pmulhuw(mmA, mmB);
- e->pmulhuw(mmA, anyptr_gpB);
- e->psadbw(mmA, mmB);
- e->psadbw(mmA, anyptr_gpB);
- e->pshufw(mmA, mmB, 0);
- e->pshufw(mmA, anyptr_gpB, 0);
- e->rcpps(xmmA, xmmB);
- e->rcpps(xmmA, anyptr_gpB);
- e->rcpss(xmmA, xmmB);
- e->rcpss(xmmA, anyptr_gpB);
- e->psadbw(xmmA, xmmB);
- e->psadbw(xmmA, anyptr_gpB);
- e->rsqrtps(xmmA, xmmB);
- e->rsqrtps(xmmA, anyptr_gpB);
- e->rsqrtss(xmmA, xmmB);
- e->rsqrtss(xmmA, anyptr_gpB);
- e->sfence();
- e->shufps(xmmA, xmmB, 0);
- e->shufps(xmmA, anyptr_gpB, 0);
- e->sqrtps(xmmA, xmmB);
- e->sqrtps(xmmA, anyptr_gpB);
- e->sqrtss(xmmA, xmmB);
- e->sqrtss(xmmA, anyptr_gpB);
- e->stmxcsr(anyptr_gpA);
- e->subps(xmmA, xmmB);
- e->subps(xmmA, anyptr_gpB);
- e->subss(xmmA, xmmB);
- e->subss(xmmA, anyptr_gpB);
- e->ucomiss(xmmA, xmmB);
- e->ucomiss(xmmA, anyptr_gpB);
- e->unpckhps(xmmA, xmmB);
- e->unpckhps(xmmA, anyptr_gpB);
- e->unpcklps(xmmA, xmmB);
- e->unpcklps(xmmA, anyptr_gpB);
- e->xorps(xmmA, xmmB);
- e->xorps(xmmA, anyptr_gpB);
-
- // SSE2.
- e->nop();
-
- e->addpd(xmmA, xmmB);
- e->addpd(xmmA, anyptr_gpB);
- e->addsd(xmmA, xmmB);
- e->addsd(xmmA, anyptr_gpB);
- e->andnpd(xmmA, xmmB);
- e->andnpd(xmmA, anyptr_gpB);
- e->andpd(xmmA, xmmB);
- e->andpd(xmmA, anyptr_gpB);
- e->cmppd(xmmA, xmmB, 0);
- e->cmppd(xmmA, anyptr_gpB, 0);
- e->cmpsd(xmmA, xmmB, 0);
- e->cmpsd(xmmA, anyptr_gpB, 0);
- e->comisd(xmmA, xmmB);
- e->comisd(xmmA, anyptr_gpB);
- e->cvtdq2pd(xmmA, xmmB);
- e->cvtdq2pd(xmmA, anyptr_gpB);
- e->cvtdq2ps(xmmA, xmmB);
- e->cvtdq2ps(xmmA, anyptr_gpB);
- e->cvtpd2dq(xmmA, xmmB);
- e->cvtpd2dq(xmmA, anyptr_gpB);
- e->cvtpd2pi(mmA, xmmB);
- e->cvtpd2pi(mmA, anyptr_gpB);
- e->cvtpd2ps(xmmA, xmmB);
- e->cvtpd2ps(xmmA, anyptr_gpB);
- e->cvtpi2pd(xmmA, mmB);
- e->cvtpi2pd(xmmA, anyptr_gpB);
- e->cvtps2dq(xmmA, xmmB);
- e->cvtps2dq(xmmA, anyptr_gpB);
- e->cvtps2pd(xmmA, xmmB);
- e->cvtps2pd(xmmA, anyptr_gpB);
- e->cvtsd2si(gdA, xmmB);
- e->cvtsd2si(gzA, xmmB);
- e->cvtsd2si(gdA, anyptr_gpB);
- e->cvtsd2si(gzA, anyptr_gpB);
- e->cvtsd2ss(xmmA, xmmB);
- e->cvtsd2ss(xmmA, anyptr_gpB);
- e->cvtsi2sd(xmmA, gdB);
- e->cvtsi2sd(xmmA, gzB);
- e->cvtsi2sd(xmmA, anyptr_gpB);
- e->cvtss2sd(xmmA, xmmB);
- e->cvtss2sd(xmmA, anyptr_gpB);
- e->cvtss2si(gdA, xmmB);
- e->cvtss2si(gzA, xmmB);
- e->cvtss2si(gdA, anyptr_gpB);
- e->cvtss2si(gzA, anyptr_gpB);
- e->cvttpd2pi(mmA, xmmB);
- e->cvttpd2pi(mmA, anyptr_gpB);
- e->cvttpd2dq(xmmA, xmmB);
- e->cvttpd2dq(xmmA, anyptr_gpB);
- e->cvttps2dq(xmmA, xmmB);
- e->cvttps2dq(xmmA, anyptr_gpB);
- e->cvttsd2si(gdA, xmmB);
- e->cvttsd2si(gzA, xmmB);
- e->cvttsd2si(gdA, anyptr_gpB);
- e->cvttsd2si(gzA, anyptr_gpB);
- e->divpd(xmmA, xmmB);
- e->divpd(xmmA, anyptr_gpB);
- e->divsd(xmmA, xmmB);
- e->divsd(xmmA, anyptr_gpB);
- e->lfence();
- e->maskmovdqu(xmmA, xmmB); // Implicit xmmA, xmmB, <ds:[EDI|RDI]>
- e->maskmovdqu(xmmA, xmmB, ptr(e->zdi())); // Explicit xmmA, xmmB, <ds:[EDI|RDI]>
- e->maxpd(xmmA, xmmB);
- e->maxpd(xmmA, anyptr_gpB);
- e->maxsd(xmmA, xmmB);
- e->maxsd(xmmA, anyptr_gpB);
- e->mfence();
- e->minpd(xmmA, xmmB);
- e->minpd(xmmA, anyptr_gpB);
- e->minsd(xmmA, xmmB);
- e->minsd(xmmA, anyptr_gpB);
- e->movdqa(xmmA, xmmB);
- e->movdqa(xmmA, anyptr_gpB);
- e->movdqa(anyptr_gpA, xmmB);
- e->movdqu(xmmA, xmmB);
- e->movdqu(xmmA, anyptr_gpB);
- e->movdqu(anyptr_gpA, xmmB);
- e->movmskps(gdA, xmmB);
- e->movmskps(gzA, xmmB);
- e->movmskpd(gdA, xmmB);
- e->movmskpd(gzA, xmmB);
- e->movsd(xmmA, xmmB);
- e->movsd(xmmA, anyptr_gpB);
- e->movsd(anyptr_gpA, xmmB);
- e->movapd(xmmA, anyptr_gpB);
- e->movapd(anyptr_gpA, xmmB);
- e->movdq2q(mmA, xmmB);
- e->movq2dq(xmmA, mmB);
- e->movhpd(xmmA, anyptr_gpB);
- e->movhpd(anyptr_gpA, xmmB);
- e->movlpd(xmmA, anyptr_gpB);
- e->movlpd(anyptr_gpA, xmmB);
- e->movntdq(anyptr_gpA, xmmB);
- e->movnti(anyptr_gpA, gdB);
- e->movnti(anyptr_gpA, gzB);
- e->movntpd(anyptr_gpA, xmmB);
- e->movupd(xmmA, anyptr_gpB);
- e->movupd(anyptr_gpA, xmmB);
- e->mulpd(xmmA, xmmB);
- e->mulpd(xmmA, anyptr_gpB);
- e->mulsd(xmmA, xmmB);
- e->mulsd(xmmA, anyptr_gpB);
- e->orpd(xmmA, xmmB);
- e->orpd(xmmA, anyptr_gpB);
- e->packsswb(xmmA, xmmB);
- e->packsswb(xmmA, anyptr_gpB);
- e->packssdw(xmmA, xmmB);
- e->packssdw(xmmA, anyptr_gpB);
- e->packuswb(xmmA, xmmB);
- e->packuswb(xmmA, anyptr_gpB);
- e->paddb(xmmA, xmmB);
- e->paddb(xmmA, anyptr_gpB);
- e->paddw(xmmA, xmmB);
- e->paddw(xmmA, anyptr_gpB);
- e->paddd(xmmA, xmmB);
- e->paddd(xmmA, anyptr_gpB);
- e->paddq(mmA, mmB);
- e->paddq(mmA, anyptr_gpB);
- e->paddq(xmmA, xmmB);
- e->paddq(xmmA, anyptr_gpB);
- e->paddsb(xmmA, xmmB);
- e->paddsb(xmmA, anyptr_gpB);
- e->paddsw(xmmA, xmmB);
- e->paddsw(xmmA, anyptr_gpB);
- e->paddusb(xmmA, xmmB);
- e->paddusb(xmmA, anyptr_gpB);
- e->paddusw(xmmA, xmmB);
- e->paddusw(xmmA, anyptr_gpB);
- e->pand(xmmA, xmmB);
- e->pand(xmmA, anyptr_gpB);
- e->pandn(xmmA, xmmB);
- e->pandn(xmmA, anyptr_gpB);
- e->pause();
- e->pavgb(xmmA, xmmB);
- e->pavgb(xmmA, anyptr_gpB);
- e->pavgw(xmmA, xmmB);
- e->pavgw(xmmA, anyptr_gpB);
- e->pcmpeqb(xmmA, xmmB);
- e->pcmpeqb(xmmA, anyptr_gpB);
- e->pcmpeqw(xmmA, xmmB);
- e->pcmpeqw(xmmA, anyptr_gpB);
- e->pcmpeqd(xmmA, xmmB);
- e->pcmpeqd(xmmA, anyptr_gpB);
- e->pcmpgtb(xmmA, xmmB);
- e->pcmpgtb(xmmA, anyptr_gpB);
- e->pcmpgtw(xmmA, xmmB);
- e->pcmpgtw(xmmA, anyptr_gpB);
- e->pcmpgtd(xmmA, xmmB);
- e->pcmpgtd(xmmA, anyptr_gpB);
- e->pmaxsw(xmmA, xmmB);
- e->pmaxsw(xmmA, anyptr_gpB);
- e->pmaxub(xmmA, xmmB);
- e->pmaxub(xmmA, anyptr_gpB);
- e->pminsw(xmmA, xmmB);
- e->pminsw(xmmA, anyptr_gpB);
- e->pminub(xmmA, xmmB);
- e->pminub(xmmA, anyptr_gpB);
- e->pmovmskb(gdA, xmmB);
- e->pmovmskb(gzA, xmmB);
- e->pmulhw(xmmA, xmmB);
- e->pmulhw(xmmA, anyptr_gpB);
- e->pmulhuw(xmmA, xmmB);
- e->pmulhuw(xmmA, anyptr_gpB);
- e->pmullw(xmmA, xmmB);
- e->pmullw(xmmA, anyptr_gpB);
- e->pmuludq(mmA, mmB);
- e->pmuludq(mmA, anyptr_gpB);
- e->pmuludq(xmmA, xmmB);
- e->pmuludq(xmmA, anyptr_gpB);
- e->por(xmmA, xmmB);
- e->por(xmmA, anyptr_gpB);
- e->pslld(xmmA, xmmB);
- e->pslld(xmmA, anyptr_gpB);
- e->pslld(xmmA, 0);
- e->psllq(xmmA, xmmB);
- e->psllq(xmmA, anyptr_gpB);
- e->psllq(xmmA, 0);
- e->psllw(xmmA, xmmB);
- e->psllw(xmmA, anyptr_gpB);
- e->psllw(xmmA, 0);
- e->pslldq(xmmA, 0);
- e->psrad(xmmA, xmmB);
- e->psrad(xmmA, anyptr_gpB);
- e->psrad(xmmA, 0);
- e->psraw(xmmA, xmmB);
- e->psraw(xmmA, anyptr_gpB);
- e->psraw(xmmA, 0);
- e->psubb(xmmA, xmmB);
- e->psubb(xmmA, anyptr_gpB);
- e->psubw(xmmA, xmmB);
- e->psubw(xmmA, anyptr_gpB);
- e->psubd(xmmA, xmmB);
- e->psubd(xmmA, anyptr_gpB);
- e->psubq(mmA, mmB);
- e->psubq(mmA, anyptr_gpB);
- e->psubq(xmmA, xmmB);
- e->psubq(xmmA, anyptr_gpB);
- e->pmaddwd(xmmA, xmmB);
- e->pmaddwd(xmmA, anyptr_gpB);
- e->pshufd(xmmA, xmmB, 0);
- e->pshufd(xmmA, anyptr_gpB, 0);
- e->pshufhw(xmmA, xmmB, 0);
- e->pshufhw(xmmA, anyptr_gpB, 0);
- e->pshuflw(xmmA, xmmB, 0);
- e->pshuflw(xmmA, anyptr_gpB, 0);
- e->psrld(xmmA, xmmB);
- e->psrld(xmmA, anyptr_gpB);
- e->psrld(xmmA, 0);
- e->psrlq(xmmA, xmmB);
- e->psrlq(xmmA, anyptr_gpB);
- e->psrlq(xmmA, 0);
- e->psrldq(xmmA, 0);
- e->psrlw(xmmA, xmmB);
- e->psrlw(xmmA, anyptr_gpB);
- e->psrlw(xmmA, 0);
- e->psubsb(xmmA, xmmB);
- e->psubsb(xmmA, anyptr_gpB);
- e->psubsw(xmmA, xmmB);
- e->psubsw(xmmA, anyptr_gpB);
- e->psubusb(xmmA, xmmB);
- e->psubusb(xmmA, anyptr_gpB);
- e->psubusw(xmmA, xmmB);
- e->psubusw(xmmA, anyptr_gpB);
- e->punpckhbw(xmmA, xmmB);
- e->punpckhbw(xmmA, anyptr_gpB);
- e->punpckhwd(xmmA, xmmB);
- e->punpckhwd(xmmA, anyptr_gpB);
- e->punpckhdq(xmmA, xmmB);
- e->punpckhdq(xmmA, anyptr_gpB);
- e->punpckhqdq(xmmA, xmmB);
- e->punpckhqdq(xmmA, anyptr_gpB);
- e->punpcklbw(xmmA, xmmB);
- e->punpcklbw(xmmA, anyptr_gpB);
- e->punpcklwd(xmmA, xmmB);
- e->punpcklwd(xmmA, anyptr_gpB);
- e->punpckldq(xmmA, xmmB);
- e->punpckldq(xmmA, anyptr_gpB);
- e->punpcklqdq(xmmA, xmmB);
- e->punpcklqdq(xmmA, anyptr_gpB);
- e->pxor(xmmA, xmmB);
- e->pxor(xmmA, anyptr_gpB);
- e->sqrtpd(xmmA, xmmB);
- e->sqrtpd(xmmA, anyptr_gpB);
- e->sqrtsd(xmmA, xmmB);
- e->sqrtsd(xmmA, anyptr_gpB);
- e->subpd(xmmA, xmmB);
- e->subpd(xmmA, anyptr_gpB);
- e->subsd(xmmA, xmmB);
- e->subsd(xmmA, anyptr_gpB);
- e->ucomisd(xmmA, xmmB);
- e->ucomisd(xmmA, anyptr_gpB);
- e->unpckhpd(xmmA, xmmB);
- e->unpckhpd(xmmA, anyptr_gpB);
- e->unpcklpd(xmmA, xmmB);
- e->unpcklpd(xmmA, anyptr_gpB);
- e->xorpd(xmmA, xmmB);
- e->xorpd(xmmA, anyptr_gpB);
-
- // SSE3.
- e->nop();
-
- e->addsubpd(xmmA, xmmB);
- e->addsubpd(xmmA, anyptr_gpB);
- e->addsubps(xmmA, xmmB);
- e->addsubps(xmmA, anyptr_gpB);
- e->fisttp(dword_ptr(gzA));
- e->haddpd(xmmA, xmmB);
- e->haddpd(xmmA, anyptr_gpB);
- e->haddps(xmmA, xmmB);
- e->haddps(xmmA, anyptr_gpB);
- e->hsubpd(xmmA, xmmB);
- e->hsubpd(xmmA, anyptr_gpB);
- e->hsubps(xmmA, xmmB);
- e->hsubps(xmmA, anyptr_gpB);
- e->lddqu(xmmA, anyptr_gpB);
- e->movddup(xmmA, xmmB);
- e->movddup(xmmA, anyptr_gpB);
- e->movshdup(xmmA, xmmB);
- e->movshdup(xmmA, anyptr_gpB);
- e->movsldup(xmmA, xmmB);
- e->movsldup(xmmA, anyptr_gpB);
-
- // SSSE3.
- e->nop();
-
- e->psignb(mmA, mmB);
- e->psignb(mmA, anyptr_gpB);
- e->psignb(xmmA, xmmB);
- e->psignb(xmmA, anyptr_gpB);
- e->psignw(mmA, mmB);
- e->psignw(mmA, anyptr_gpB);
- e->psignw(xmmA, xmmB);
- e->psignw(xmmA, anyptr_gpB);
- e->psignd(mmA, mmB);
- e->psignd(mmA, anyptr_gpB);
- e->psignd(xmmA, xmmB);
- e->psignd(xmmA, anyptr_gpB);
- e->phaddw(mmA, mmB);
- e->phaddw(mmA, anyptr_gpB);
- e->phaddw(xmmA, xmmB);
- e->phaddw(xmmA, anyptr_gpB);
- e->phaddd(mmA, mmB);
- e->phaddd(mmA, anyptr_gpB);
- e->phaddd(xmmA, xmmB);
- e->phaddd(xmmA, anyptr_gpB);
- e->phaddsw(mmA, mmB);
- e->phaddsw(mmA, anyptr_gpB);
- e->phaddsw(xmmA, xmmB);
- e->phaddsw(xmmA, anyptr_gpB);
- e->phsubw(mmA, mmB);
- e->phsubw(mmA, anyptr_gpB);
- e->phsubw(xmmA, xmmB);
- e->phsubw(xmmA, anyptr_gpB);
- e->phsubd(mmA, mmB);
- e->phsubd(mmA, anyptr_gpB);
- e->phsubd(xmmA, xmmB);
- e->phsubd(xmmA, anyptr_gpB);
- e->phsubsw(mmA, mmB);
- e->phsubsw(mmA, anyptr_gpB);
- e->phsubsw(xmmA, xmmB);
- e->phsubsw(xmmA, anyptr_gpB);
- e->pmaddubsw(mmA, mmB);
- e->pmaddubsw(mmA, anyptr_gpB);
- e->pmaddubsw(xmmA, xmmB);
- e->pmaddubsw(xmmA, anyptr_gpB);
- e->pabsb(mmA, mmB);
- e->pabsb(mmA, anyptr_gpB);
- e->pabsb(xmmA, xmmB);
- e->pabsb(xmmA, anyptr_gpB);
- e->pabsw(mmA, mmB);
- e->pabsw(mmA, anyptr_gpB);
- e->pabsw(xmmA, xmmB);
- e->pabsw(xmmA, anyptr_gpB);
- e->pabsd(mmA, mmB);
- e->pabsd(mmA, anyptr_gpB);
- e->pabsd(xmmA, xmmB);
- e->pabsd(xmmA, anyptr_gpB);
- e->pmulhrsw(mmA, mmB);
- e->pmulhrsw(mmA, anyptr_gpB);
- e->pmulhrsw(xmmA, xmmB);
- e->pmulhrsw(xmmA, anyptr_gpB);
- e->pshufb(mmA, mmB);
- e->pshufb(mmA, anyptr_gpB);
- e->pshufb(xmmA, xmmB);
- e->pshufb(xmmA, anyptr_gpB);
- e->palignr(mmA, mmB, 0);
- e->palignr(mmA, anyptr_gpB, 0);
- e->palignr(xmmA, xmmB, 0);
- e->palignr(xmmA, anyptr_gpB, 0);
-
- // SSE4.1.
- e->nop();
-
- e->blendpd(xmmA, xmmB, 0);
- e->blendpd(xmmA, anyptr_gpB, 0);
- e->blendps(xmmA, xmmB, 0);
- e->blendps(xmmA, anyptr_gpB, 0);
- e->blendvpd(xmmA, xmmB); // Implicit xmmA, xmmB, <XMM0>
- e->blendvpd(xmmA, xmmB, xmm0); // Explicit xmmA, xmmB, <XMM0>
- e->blendvpd(xmmA, anyptr_gpB); // Implicit xmmA, mem , <XMM0>
- e->blendvpd(xmmA, anyptr_gpB, xmm0); // Explicit xmmA, mem , <XMM0>
- e->blendvps(xmmA, xmmB); // Implicit xmmA, xmmB, <XMM0>
- e->blendvps(xmmA, xmmB, xmm0); // Explicit xmmA, xmmB, <XMM0>
- e->blendvps(xmmA, anyptr_gpB); // Implicit xmmA, mem , <XMM0>
- e->blendvps(xmmA, anyptr_gpB, xmm0); // Explicit xmmA, mem , <XMM0>
-
- e->dppd(xmmA, xmmB, 0);
- e->dppd(xmmA, anyptr_gpB, 0);
- e->dpps(xmmA, xmmB, 0);
- e->dpps(xmmA, anyptr_gpB, 0);
- e->extractps(gdA, xmmB, 0);
- e->extractps(gzA, xmmB, 0);
- e->extractps(anyptr_gpA, xmmB, 0);
- e->insertps(xmmA, xmmB, 0);
- e->insertps(xmmA, anyptr_gpB, 0);
- e->movntdqa(xmmA, anyptr_gpB);
- e->mpsadbw(xmmA, xmmB, 0);
- e->mpsadbw(xmmA, anyptr_gpB, 0);
- e->packusdw(xmmA, xmmB);
- e->packusdw(xmmA, anyptr_gpB);
- e->pblendvb(xmmA, xmmB); // Implicit xmmA, xmmB, <XMM0>
- e->pblendvb(xmmA, xmmB, xmm0); // Explicit xmmA, xmmB, <XMM0>
- e->pblendvb(xmmA, anyptr_gpB); // Implicit xmmA, mem, <XMM0>
- e->pblendvb(xmmA, anyptr_gpB, xmm0); // Implicit xmmA, mem, <XMM0>
- e->pblendw(xmmA, xmmB, 0);
- e->pblendw(xmmA, anyptr_gpB, 0);
- e->pcmpeqq(xmmA, xmmB);
- e->pcmpeqq(xmmA, anyptr_gpB);
- e->pextrb(gdA, xmmB, 0);
- e->pextrb(gzA, xmmB, 0);
- e->pextrb(anyptr_gpA, xmmB, 0);
- e->pextrd(gdA, xmmB, 0);
- e->pextrd(gzA, xmmB, 0);
- e->pextrd(anyptr_gpA, xmmB, 0);
- if (isX64) e->pextrq(gzA, xmmB, 0);
- if (isX64) e->pextrq(anyptr_gpA, xmmB, 0);
- e->pextrw(gdA, xmmB, 0);
- e->pextrw(gzA, xmmB, 0);
- e->pextrw(anyptr_gpA, xmmB, 0);
- e->phminposuw(xmmA, xmmB);
- e->phminposuw(xmmA, anyptr_gpB);
- e->pinsrb(xmmA, gdB, 0);
- e->pinsrb(xmmA, gzB, 0);
- e->pinsrb(xmmA, anyptr_gpB, 0);
- e->pinsrd(xmmA, gdB, 0);
- e->pinsrd(xmmA, gzB, 0);
- e->pinsrd(xmmA, anyptr_gpB, 0);
- e->pinsrw(xmmA, gdB, 0);
- e->pinsrw(xmmA, gzB, 0);
- e->pinsrw(xmmA, anyptr_gpB, 0);
- e->pmaxuw(xmmA, xmmB);
- e->pmaxuw(xmmA, anyptr_gpB);
- e->pmaxsb(xmmA, xmmB);
- e->pmaxsb(xmmA, anyptr_gpB);
- e->pmaxsd(xmmA, xmmB);
- e->pmaxsd(xmmA, anyptr_gpB);
- e->pmaxud(xmmA, xmmB);
- e->pmaxud(xmmA, anyptr_gpB);
- e->pminsb(xmmA, xmmB);
- e->pminsb(xmmA, anyptr_gpB);
- e->pminuw(xmmA, xmmB);
- e->pminuw(xmmA, anyptr_gpB);
- e->pminud(xmmA, xmmB);
- e->pminud(xmmA, anyptr_gpB);
- e->pminsd(xmmA, xmmB);
- e->pminsd(xmmA, anyptr_gpB);
- e->pmovsxbw(xmmA, xmmB);
- e->pmovsxbw(xmmA, anyptr_gpB);
- e->pmovsxbd(xmmA, xmmB);
- e->pmovsxbd(xmmA, anyptr_gpB);
- e->pmovsxbq(xmmA, xmmB);
- e->pmovsxbq(xmmA, anyptr_gpB);
- e->pmovsxwd(xmmA, xmmB);
- e->pmovsxwd(xmmA, anyptr_gpB);
- e->pmovsxwq(xmmA, xmmB);
- e->pmovsxwq(xmmA, anyptr_gpB);
- e->pmovsxdq(xmmA, xmmB);
- e->pmovsxdq(xmmA, anyptr_gpB);
- e->pmovzxbw(xmmA, xmmB);
- e->pmovzxbw(xmmA, anyptr_gpB);
- e->pmovzxbd(xmmA, xmmB);
- e->pmovzxbd(xmmA, anyptr_gpB);
- e->pmovzxbq(xmmA, xmmB);
- e->pmovzxbq(xmmA, anyptr_gpB);
- e->pmovzxwd(xmmA, xmmB);
- e->pmovzxwd(xmmA, anyptr_gpB);
- e->pmovzxwq(xmmA, xmmB);
- e->pmovzxwq(xmmA, anyptr_gpB);
- e->pmovzxdq(xmmA, xmmB);
- e->pmovzxdq(xmmA, anyptr_gpB);
- e->pmuldq(xmmA, xmmB);
- e->pmuldq(xmmA, anyptr_gpB);
- e->pmulld(xmmA, xmmB);
- e->pmulld(xmmA, anyptr_gpB);
- e->ptest(xmmA, xmmB);
- e->ptest(xmmA, anyptr_gpB);
- e->roundps(xmmA, xmmB, 0);
- e->roundps(xmmA, anyptr_gpB, 0);
- e->roundss(xmmA, xmmB, 0);
- e->roundss(xmmA, anyptr_gpB, 0);
- e->roundpd(xmmA, xmmB, 0);
- e->roundpd(xmmA, anyptr_gpB, 0);
- e->roundsd(xmmA, xmmB, 0);
- e->roundsd(xmmA, anyptr_gpB, 0);
-
- // SSE4.2.
- e->nop();
-
- e->pcmpestri(xmmA, xmmB , imm(0)); // Implicit xmmA, xmmB, imm, <ECX>, <EAX>, <EDX>
- e->pcmpestri(xmmA, xmmB , imm(0), ecx, eax, edx); // Explicit xmmA, xmmB, imm, <ECX>, <EAX>, <EDX>
- e->pcmpestri(xmmA, anyptr_gpB, imm(0)); // Implicit xmmA, mem , imm, <ECX>, <EAX>, <EDX>
- e->pcmpestri(xmmA, anyptr_gpB, imm(0), ecx, eax, edx); // Explicit xmmA, mem , imm, <ECX>, <EAX>, <EDX>
- e->pcmpestrm(xmmA, xmmB , imm(0)); // Implicit xmmA, xmmB, imm, <XMM0>, <EAX>, <EDX>
- e->pcmpestrm(xmmA, xmmB , imm(0), xmm0, eax, edx); // Explicit xmmA, xmmB, imm, <XMM0>, <EAX>, <EDX>
- e->pcmpestrm(xmmA, anyptr_gpB, imm(0)); // Implicit xmmA, mem , imm, <XMM0>, <EAX>, <EDX>
- e->pcmpestrm(xmmA, anyptr_gpB, imm(0), xmm0, eax, edx); // Explicit xmmA, mem , imm, <XMM0>, <EAX>, <EDX>
- e->pcmpistri(xmmA, xmmB , imm(0)); // Implicit xmmA, xmmB, imm, <ECX>
- e->pcmpistri(xmmA, xmmB , imm(0), ecx); // Explicit xmmA, xmmB, imm, <ECX>
- e->pcmpistri(xmmA, anyptr_gpB, imm(0)); // Implicit xmmA, mem , imm, <ECX>
- e->pcmpistri(xmmA, anyptr_gpB, imm(0), ecx); // Explicit xmmA, mem , imm, <ECX>
- e->pcmpistrm(xmmA, xmmB , imm(0)); // Implicit xmmA, xmmB, imm, <XMM0>
- e->pcmpistrm(xmmA, xmmB , imm(0), xmm0); // Explicit xmmA, xmmB, imm, <XMM0>
- e->pcmpistrm(xmmA, anyptr_gpB, imm(0)); // Implicit xmmA, mem , imm, <XMM0>
- e->pcmpistrm(xmmA, anyptr_gpB, imm(0), xmm0); // Explicit xmmA, mem , imm, <XMM0>
-
- e->pcmpgtq(xmmA, xmmB);
- e->pcmpgtq(xmmA, anyptr_gpB);
-
- // SSE4A.
- e->nop();
-
- e->extrq(xmmA, xmmB);
- e->extrq(xmmA, 0x1, 0x2);
- e->extrq(xmmB, 0x1, 0x2);
- e->insertq(xmmA, xmmB);
- e->insertq(xmmA, xmmB, 0x1, 0x2);
- e->movntsd(anyptr_gpA, xmmB);
- e->movntss(anyptr_gpA, xmmB);
-
- // AESNI.
- e->nop();
-
- e->aesdec(xmmA, xmmB);
- e->aesdec(xmmA, anyptr_gpB);
- e->aesdeclast(xmmA, xmmB);
- e->aesdeclast(xmmA, anyptr_gpB);
- e->aesenc(xmmA, xmmB);
- e->aesenc(xmmA, anyptr_gpB);
- e->aesenclast(xmmA, xmmB);
- e->aesenclast(xmmA, anyptr_gpB);
- e->aesimc(xmmA, xmmB);
- e->aesimc(xmmA, anyptr_gpB);
- e->aeskeygenassist(xmmA, xmmB, 0);
- e->aeskeygenassist(xmmA, anyptr_gpB, 0);
-
- // SHA.
- e->nop();
-
- e->sha1msg1(xmmA, xmmB);
- e->sha1msg1(xmmA, anyptr_gpB);
- e->sha1msg2(xmmA, xmmB);
- e->sha1msg2(xmmA, anyptr_gpB);
- e->sha1nexte(xmmA, xmmB);
- e->sha1nexte(xmmA, anyptr_gpB);
- e->sha1rnds4(xmmA, xmmB, 0);
- e->sha1rnds4(xmmA, anyptr_gpB, 0);
- e->sha256msg1(xmmA, xmmB);
- e->sha256msg1(xmmA, anyptr_gpB);
- e->sha256msg2(xmmA, xmmB);
- e->sha256msg2(xmmA, anyptr_gpB);
- e->sha256rnds2(xmmA, xmmB); // Implicit xmmA, xmmB, <XMM0>
- e->sha256rnds2(xmmA, xmmB, xmm0); // Explicit xmmA, xmmB, <XMM0>
- e->sha256rnds2(xmmA, anyptr_gpB); // Implicit xmmA, mem, <XMM0>
- e->sha256rnds2(xmmA, anyptr_gpB, xmm0); // Explicit xmmA, mem, <XMM0>
-
- // PCLMULQDQ.
- e->nop();
-
- e->pclmulqdq(xmmA, xmmB, 0);
- e->pclmulqdq(xmmA, anyptr_gpB, 0);
-
- // AVX.
- e->nop();
-
- e->vaddpd(xmmA, xmmB, xmmC);
- e->vaddpd(xmmA, xmmB, anyptr_gpC);
- e->vaddpd(ymmA, ymmB, ymmC);
- e->vaddpd(ymmA, ymmB, anyptr_gpC);
- e->vaddps(xmmA, xmmB, xmmC);
- e->vaddps(xmmA, xmmB, anyptr_gpC);
- e->vaddps(ymmA, ymmB, ymmC);
- e->vaddps(ymmA, ymmB, anyptr_gpC);
- e->vaddsd(xmmA, xmmB, xmmC);
- e->vaddsd(xmmA, xmmB, anyptr_gpC);
- e->vaddss(xmmA, xmmB, xmmC);
- e->vaddss(xmmA, xmmB, anyptr_gpC);
- e->vaddsubpd(xmmA, xmmB, xmmC);
- e->vaddsubpd(xmmA, xmmB, anyptr_gpC);
- e->vaddsubpd(ymmA, ymmB, ymmC);
- e->vaddsubpd(ymmA, ymmB, anyptr_gpC);
- e->vaddsubps(xmmA, xmmB, xmmC);
- e->vaddsubps(xmmA, xmmB, anyptr_gpC);
- e->vaddsubps(ymmA, ymmB, ymmC);
- e->vaddsubps(ymmA, ymmB, anyptr_gpC);
- e->vandpd(xmmA, xmmB, xmmC);
- e->vandpd(xmmA, xmmB, anyptr_gpC);
- e->vandpd(ymmA, ymmB, ymmC);
- e->vandpd(ymmA, ymmB, anyptr_gpC);
- e->vandps(xmmA, xmmB, xmmC);
- e->vandps(xmmA, xmmB, anyptr_gpC);
- e->vandps(ymmA, ymmB, ymmC);
- e->vandps(ymmA, ymmB, anyptr_gpC);
- e->vandnpd(xmmA, xmmB, xmmC);
- e->vandnpd(xmmA, xmmB, anyptr_gpC);
- e->vandnpd(ymmA, ymmB, ymmC);
- e->vandnpd(ymmA, ymmB, anyptr_gpC);
- e->vandnps(xmmA, xmmB, xmmC);
- e->vandnps(xmmA, xmmB, anyptr_gpC);
- e->vandnps(ymmA, ymmB, ymmC);
- e->vandnps(ymmA, ymmB, anyptr_gpC);
- e->vblendpd(xmmA, xmmB, xmmC, 0);
- e->vblendpd(xmmA, xmmB, anyptr_gpC, 0);
- e->vblendpd(ymmA, ymmB, ymmC, 0);
- e->vblendpd(ymmA, ymmB, anyptr_gpC, 0);
- e->vblendps(xmmA, xmmB, xmmC, 0);
- e->vblendps(xmmA, xmmB, anyptr_gpC, 0);
- e->vblendps(ymmA, ymmB, ymmC, 0);
- e->vblendps(ymmA, ymmB, anyptr_gpC, 0);
- e->vblendvpd(xmmA, xmmB, xmmC, xmmD);
- e->vblendvpd(xmmA, xmmB, anyptr_gpC, xmmD);
- e->vblendvpd(ymmA, ymmB, ymmC, ymmD);
- e->vblendvpd(ymmA, ymmB, anyptr_gpC, ymmD);
- e->vbroadcastf128(ymmA, anyptr_gpB);
- e->vbroadcastsd(ymmA, anyptr_gpB);
- e->vbroadcastss(xmmA, anyptr_gpB);
- e->vbroadcastss(ymmA, anyptr_gpB);
- e->vcmppd(xmmA, xmmB, xmmC, 0);
- e->vcmppd(xmmA, xmmB, anyptr_gpC, 0);
- e->vcmppd(ymmA, ymmB, ymmC, 0);
- e->vcmppd(ymmA, ymmB, anyptr_gpC, 0);
- e->vcmpps(xmmA, xmmB, xmmC, 0);
- e->vcmpps(xmmA, xmmB, anyptr_gpC, 0);
- e->vcmpps(ymmA, ymmB, ymmC, 0);
- e->vcmpps(ymmA, ymmB, anyptr_gpC, 0);
- e->vcmpsd(xmmA, xmmB, xmmC, 0);
- e->vcmpsd(xmmA, xmmB, anyptr_gpC, 0);
- e->vcmpss(xmmA, xmmB, xmmC, 0);
- e->vcmpss(xmmA, xmmB, anyptr_gpC, 0);
- e->vcomisd(xmmA, xmmB);
- e->vcomisd(xmmA, anyptr_gpB);
- e->vcomiss(xmmA, xmmB);
- e->vcomiss(xmmA, anyptr_gpB);
- e->vcvtdq2pd(xmmA, xmmB);
- e->vcvtdq2pd(xmmA, anyptr_gpB);
- e->vcvtdq2pd(ymmA, xmmB);
- e->vcvtdq2pd(ymmA, anyptr_gpB);
- e->vcvtdq2ps(xmmA, xmmB);
- e->vcvtdq2ps(xmmA, anyptr_gpB);
- e->vcvtdq2ps(ymmA, ymmB);
- e->vcvtdq2ps(ymmA, anyptr_gpB);
- e->vcvtpd2dq(xmmA, xmmB);
- e->vcvtpd2dq(xmmA, ymmB);
- e->vcvtpd2dq(xmmA, anyptr_gpB);
- e->vcvtpd2ps(xmmA, xmmB);
- e->vcvtpd2ps(xmmA, ymmB);
- e->vcvtpd2ps(xmmA, anyptr_gpB);
- e->vcvtps2dq(xmmA, xmmB);
- e->vcvtps2dq(xmmA, anyptr_gpB);
- e->vcvtps2dq(ymmA, ymmB);
- e->vcvtps2dq(ymmA, anyptr_gpB);
- e->vcvtps2pd(xmmA, xmmB);
- e->vcvtps2pd(xmmA, anyptr_gpB);
- e->vcvtps2pd(ymmA, xmmB);
- e->vcvtps2pd(ymmA, anyptr_gpB);
- e->vcvtsd2si(gzA, xmmB);
- e->vcvtsd2si(gzA, anyptr_gpB);
- e->vcvtsd2ss(xmmA, xmmB, xmmC);
- e->vcvtsd2ss(xmmA, xmmB, anyptr_gpC);
- e->vcvtsi2sd(xmmA, xmmB, gzC);
- e->vcvtsi2sd(xmmA, xmmB, anyptr_gpC);
- e->vcvtsi2ss(xmmA, xmmB, gzC);
- e->vcvtsi2ss(xmmA, xmmB, anyptr_gpC);
- e->vcvtss2sd(xmmA, xmmB, xmmC);
- e->vcvtss2sd(xmmA, xmmB, anyptr_gpC);
- e->vcvtss2si(gzA, xmmB);
- e->vcvtss2si(gzA, anyptr_gpB);
- e->vcvttpd2dq(xmmA, xmmB);
- e->vcvttpd2dq(xmmA, ymmB);
- e->vcvttpd2dq(xmmA, anyptr_gpB);
- e->vcvttps2dq(xmmA, xmmB);
- e->vcvttps2dq(xmmA, anyptr_gpB);
- e->vcvttps2dq(ymmA, ymmB);
- e->vcvttps2dq(ymmA, anyptr_gpB);
- e->vcvttsd2si(gzA, xmmB);
- e->vcvttsd2si(gzA, anyptr_gpB);
- e->vcvttss2si(gzA, xmmB);
- e->vcvttss2si(gzA, anyptr_gpB);
- e->vdivpd(xmmA, xmmB, xmmC);
- e->vdivpd(xmmA, xmmB, anyptr_gpC);
- e->vdivpd(ymmA, ymmB, ymmC);
- e->vdivpd(ymmA, ymmB, anyptr_gpC);
- e->vdivps(xmmA, xmmB, xmmC);
- e->vdivps(xmmA, xmmB, anyptr_gpC);
- e->vdivps(ymmA, ymmB, ymmC);
- e->vdivps(ymmA, ymmB, anyptr_gpC);
- e->vdivsd(xmmA, xmmB, xmmC);
- e->vdivsd(xmmA, xmmB, anyptr_gpC);
- e->vdivss(xmmA, xmmB, xmmC);
- e->vdivss(xmmA, xmmB, anyptr_gpC);
- e->vdppd(xmmA, xmmB, xmmC, 0);
- e->vdppd(xmmA, xmmB, anyptr_gpC, 0);
- e->vdpps(xmmA, xmmB, xmmC, 0);
- e->vdpps(xmmA, xmmB, anyptr_gpC, 0);
- e->vdpps(ymmA, ymmB, ymmC, 0);
- e->vdpps(ymmA, ymmB, anyptr_gpC, 0);
- e->vextractf128(xmmA, ymmB, 0);
- e->vextractf128(anyptr_gpA, ymmB, 0);
- e->vextractps(gzA, xmmB, 0);
- e->vextractps(anyptr_gpA, xmmB, 0);
- e->vhaddpd(xmmA, xmmB, xmmC);
- e->vhaddpd(xmmA, xmmB, anyptr_gpC);
- e->vhaddpd(ymmA, ymmB, ymmC);
- e->vhaddpd(ymmA, ymmB, anyptr_gpC);
- e->vhaddps(xmmA, xmmB, xmmC);
- e->vhaddps(xmmA, xmmB, anyptr_gpC);
- e->vhaddps(ymmA, ymmB, ymmC);
- e->vhaddps(ymmA, ymmB, anyptr_gpC);
- e->vhsubpd(xmmA, xmmB, xmmC);
- e->vhsubpd(xmmA, xmmB, anyptr_gpC);
- e->vhsubpd(ymmA, ymmB, ymmC);
- e->vhsubpd(ymmA, ymmB, anyptr_gpC);
- e->vhsubps(xmmA, xmmB, xmmC);
- e->vhsubps(xmmA, xmmB, anyptr_gpC);
- e->vhsubps(ymmA, ymmB, ymmC);
- e->vhsubps(ymmA, ymmB, anyptr_gpC);
- e->vinsertf128(ymmA, ymmB, xmmC, 0);
- e->vinsertf128(ymmA, ymmB, anyptr_gpC, 0);
- e->vinsertps(xmmA, xmmB, xmmC, 0);
- e->vinsertps(xmmA, xmmB, anyptr_gpC, 0);
- e->vlddqu(xmmA, anyptr_gpB);
- e->vlddqu(ymmA, anyptr_gpB);
- e->vldmxcsr(anyptr_gpA);
- e->vmaskmovdqu(xmmA, xmmB); // Implicit xmmA, xmmB, <ds:[EDI|RDI]>
- e->vmaskmovdqu(xmmA, xmmB, ptr(e->zdi())); // Explicit xmmA, xmmB, <ds:[EDI|RDI]>
- e->vmaskmovps(xmmA, xmmB, anyptr_gpC);
- e->vmaskmovps(ymmA, ymmB, anyptr_gpC);
- e->vmaskmovps(anyptr_gpA, xmmB, xmmC);
- e->vmaskmovps(anyptr_gpA, ymmB, ymmC);
- e->vmaskmovpd(xmmA, xmmB, anyptr_gpC);
- e->vmaskmovpd(ymmA, ymmB, anyptr_gpC);
- e->vmaskmovpd(anyptr_gpA, xmmB, xmmC);
- e->vmaskmovpd(anyptr_gpA, ymmB, ymmC);
- e->vmaxpd(xmmA, xmmB, xmmC);
- e->vmaxpd(xmmA, xmmB, anyptr_gpC);
- e->vmaxpd(ymmA, ymmB, ymmC);
- e->vmaxpd(ymmA, ymmB, anyptr_gpC);
- e->vmaxps(xmmA, xmmB, xmmC);
- e->vmaxps(xmmA, xmmB, anyptr_gpC);
- e->vmaxps(ymmA, ymmB, ymmC);
- e->vmaxps(ymmA, ymmB, anyptr_gpC);
- e->vmaxsd(xmmA, xmmB, xmmC);
- e->vmaxsd(xmmA, xmmB, anyptr_gpC);
- e->vmaxss(xmmA, xmmB, xmmC);
- e->vmaxss(xmmA, xmmB, anyptr_gpC);
- e->vminpd(xmmA, xmmB, xmmC);
- e->vminpd(xmmA, xmmB, anyptr_gpC);
- e->vminpd(ymmA, ymmB, ymmC);
- e->vminpd(ymmA, ymmB, anyptr_gpC);
- e->vminps(xmmA, xmmB, xmmC);
- e->vminps(xmmA, xmmB, anyptr_gpC);
- e->vminps(ymmA, ymmB, ymmC);
- e->vminps(ymmA, ymmB, anyptr_gpC);
- e->vminsd(xmmA, xmmB, xmmC);
- e->vminsd(xmmA, xmmB, anyptr_gpC);
- e->vminss(xmmA, xmmB, xmmC);
- e->vminss(xmmA, xmmB, anyptr_gpC);
- e->vmovapd(xmmA, xmmB);
- e->vmovapd(xmmA, anyptr_gpB);
- e->vmovapd(anyptr_gpA, xmmB);
- e->vmovapd(ymmA, ymmB);
- e->vmovapd(ymmA, anyptr_gpB);
- e->vmovapd(anyptr_gpA, ymmB);
- e->vmovaps(xmmA, xmmB);
- e->vmovaps(xmmA, anyptr_gpB);
- e->vmovaps(anyptr_gpA, xmmB);
- e->vmovaps(ymmA, ymmB);
- e->vmovaps(ymmA, anyptr_gpB);
- e->vmovaps(anyptr_gpA, ymmB);
- e->vmovd(xmmA, gzB);
- e->vmovd(xmmA, anyptr_gpB);
- e->vmovd(gzA, xmmB);
- e->vmovd(anyptr_gpA, xmmB);
- e->vmovddup(xmmA, xmmB);
- e->vmovddup(xmmA, anyptr_gpB);
- e->vmovddup(ymmA, ymmB);
- e->vmovddup(ymmA, anyptr_gpB);
- e->vmovdqa(xmmA, xmmB);
- e->vmovdqa(xmmA, anyptr_gpB);
- e->vmovdqa(anyptr_gpA, xmmB);
- e->vmovdqa(ymmA, ymmB);
- e->vmovdqa(ymmA, anyptr_gpB);
- e->vmovdqa(anyptr_gpA, ymmB);
- e->vmovdqu(xmmA, xmmB);
- e->vmovdqu(xmmA, anyptr_gpB);
- e->vmovdqu(anyptr_gpA, xmmB);
- e->vmovdqu(ymmA, ymmB);
- e->vmovdqu(ymmA, anyptr_gpB);
- e->vmovdqu(anyptr_gpA, ymmB);
- e->vmovhlps(xmmA, xmmB, xmmC);
- e->vmovhpd(xmmA, xmmB, anyptr_gpC);
- e->vmovhpd(anyptr_gpA, xmmB);
- e->vmovhps(xmmA, xmmB, anyptr_gpC);
- e->vmovhps(anyptr_gpA, xmmB);
- e->vmovlhps(xmmA, xmmB, xmmC);
- e->vmovlpd(xmmA, xmmB, anyptr_gpC);
- e->vmovlpd(anyptr_gpA, xmmB);
- e->vmovlps(xmmA, xmmB, anyptr_gpC);
- e->vmovlps(anyptr_gpA, xmmB);
- e->vmovmskpd(gzA, xmmB);
- e->vmovmskpd(gzA, ymmB);
- e->vmovmskps(gzA, xmmB);
- e->vmovmskps(gzA, ymmB);
- e->vmovntdq(anyptr_gpA, xmmB);
- e->vmovntdq(anyptr_gpA, ymmB);
- e->vmovntdqa(xmmA, anyptr_gpB);
- e->vmovntpd(anyptr_gpA, xmmB);
- e->vmovntpd(anyptr_gpA, ymmB);
- e->vmovntps(anyptr_gpA, xmmB);
- e->vmovntps(anyptr_gpA, ymmB);
- e->vmovsd(xmmA, xmmB, xmmC);
- e->vmovsd(xmmA, anyptr_gpB);
- e->vmovsd(anyptr_gpA, xmmB);
- e->vmovshdup(xmmA, xmmB);
- e->vmovshdup(xmmA, anyptr_gpB);
- e->vmovshdup(ymmA, ymmB);
- e->vmovshdup(ymmA, anyptr_gpB);
- e->vmovsldup(xmmA, xmmB);
- e->vmovsldup(xmmA, anyptr_gpB);
- e->vmovsldup(ymmA, ymmB);
- e->vmovsldup(ymmA, anyptr_gpB);
- e->vmovss(xmmA, xmmB, xmmC);
- e->vmovss(xmmA, anyptr_gpB);
- e->vmovss(anyptr_gpA, xmmB);
- e->vmovupd(xmmA, xmmB);
- e->vmovupd(xmmA, anyptr_gpB);
- e->vmovupd(anyptr_gpA, xmmB);
- e->vmovupd(ymmA, ymmB);
- e->vmovupd(ymmA, anyptr_gpB);
- e->vmovupd(anyptr_gpA, ymmB);
- e->vmovups(xmmA, xmmB);
- e->vmovups(xmmA, anyptr_gpB);
- e->vmovups(anyptr_gpA, xmmB);
- e->vmovups(ymmA, ymmB);
- e->vmovups(ymmA, anyptr_gpB);
- e->vmovups(anyptr_gpA, ymmB);
- e->vmpsadbw(xmmA, xmmB, xmmC, 0);
- e->vmpsadbw(xmmA, xmmB, anyptr_gpC, 0);
- e->vmulpd(xmmA, xmmB, xmmC);
- e->vmulpd(xmmA, xmmB, anyptr_gpC);
- e->vmulpd(ymmA, ymmB, ymmC);
- e->vmulpd(ymmA, ymmB, anyptr_gpC);
- e->vmulps(xmmA, xmmB, xmmC);
- e->vmulps(xmmA, xmmB, anyptr_gpC);
- e->vmulps(ymmA, ymmB, ymmC);
- e->vmulps(ymmA, ymmB, anyptr_gpC);
- e->vmulsd(xmmA, xmmB, xmmC);
- e->vmulsd(xmmA, xmmB, anyptr_gpC);
- e->vmulss(xmmA, xmmB, xmmC);
- e->vmulss(xmmA, xmmB, anyptr_gpC);
- e->vorpd(xmmA, xmmB, xmmC);
- e->vorpd(xmmA, xmmB, anyptr_gpC);
- e->vorpd(ymmA, ymmB, ymmC);
- e->vorpd(ymmA, ymmB, anyptr_gpC);
- e->vorps(xmmA, xmmB, xmmC);
- e->vorps(xmmA, xmmB, anyptr_gpC);
- e->vorps(ymmA, ymmB, ymmC);
- e->vorps(ymmA, ymmB, anyptr_gpC);
- e->vpabsb(xmmA, xmmB);
- e->vpabsb(xmmA, anyptr_gpB);
- e->vpabsd(xmmA, xmmB);
- e->vpabsd(xmmA, anyptr_gpB);
- e->vpabsw(xmmA, xmmB);
- e->vpabsw(xmmA, anyptr_gpB);
- e->vpackssdw(xmmA, xmmB, xmmC);
- e->vpackssdw(xmmA, xmmB, anyptr_gpC);
- e->vpacksswb(xmmA, xmmB, xmmC);
- e->vpacksswb(xmmA, xmmB, anyptr_gpC);
- e->vpackusdw(xmmA, xmmB, xmmC);
- e->vpackusdw(xmmA, xmmB, anyptr_gpC);
- e->vpackuswb(xmmA, xmmB, xmmC);
- e->vpackuswb(xmmA, xmmB, anyptr_gpC);
- e->vpaddb(xmmA, xmmB, xmmC);
- e->vpaddb(xmmA, xmmB, anyptr_gpC);
- e->vpaddd(xmmA, xmmB, xmmC);
- e->vpaddd(xmmA, xmmB, anyptr_gpC);
- e->vpaddq(xmmA, xmmB, xmmC);
- e->vpaddq(xmmA, xmmB, anyptr_gpC);
- e->vpaddw(xmmA, xmmB, xmmC);
- e->vpaddw(xmmA, xmmB, anyptr_gpC);
- e->vpaddsb(xmmA, xmmB, xmmC);
- e->vpaddsb(xmmA, xmmB, anyptr_gpC);
- e->vpaddsw(xmmA, xmmB, xmmC);
- e->vpaddsw(xmmA, xmmB, anyptr_gpC);
- e->vpaddusb(xmmA, xmmB, xmmC);
- e->vpaddusb(xmmA, xmmB, anyptr_gpC);
- e->vpaddusw(xmmA, xmmB, xmmC);
- e->vpaddusw(xmmA, xmmB, anyptr_gpC);
- e->vpalignr(xmmA, xmmB, xmmC, 0);
- e->vpalignr(xmmA, xmmB, anyptr_gpC, 0);
- e->vpand(xmmA, xmmB, xmmC);
- e->vpand(xmmA, xmmB, anyptr_gpC);
- e->vpandn(xmmA, xmmB, xmmC);
- e->vpandn(xmmA, xmmB, anyptr_gpC);
- e->vpavgb(xmmA, xmmB, xmmC);
- e->vpavgb(xmmA, xmmB, anyptr_gpC);
- e->vpavgw(xmmA, xmmB, xmmC);
- e->vpavgw(xmmA, xmmB, anyptr_gpC);
- e->vpblendvb(xmmA, xmmB, xmmC, xmmD);
- e->vpblendvb(xmmA, xmmB, anyptr_gpC, xmmD);
- e->vpblendw(xmmA, xmmB, xmmC, 0);
- e->vpblendw(xmmA, xmmB, anyptr_gpC, 0);
- e->vpcmpeqb(xmmA, xmmB, xmmC);
- e->vpcmpeqb(xmmA, xmmB, anyptr_gpC);
- e->vpcmpeqd(xmmA, xmmB, xmmC);
- e->vpcmpeqd(xmmA, xmmB, anyptr_gpC);
- e->vpcmpeqq(xmmA, xmmB, xmmC);
- e->vpcmpeqq(xmmA, xmmB, anyptr_gpC);
- e->vpcmpeqw(xmmA, xmmB, xmmC);
- e->vpcmpeqw(xmmA, xmmB, anyptr_gpC);
- e->vpcmpgtb(xmmA, xmmB, xmmC);
- e->vpcmpgtb(xmmA, xmmB, anyptr_gpC);
- e->vpcmpgtd(xmmA, xmmB, xmmC);
- e->vpcmpgtd(xmmA, xmmB, anyptr_gpC);
- e->vpcmpgtq(xmmA, xmmB, xmmC);
- e->vpcmpgtq(xmmA, xmmB, anyptr_gpC);
- e->vpcmpgtw(xmmA, xmmB, xmmC);
- e->vpcmpgtw(xmmA, xmmB, anyptr_gpC);
- e->vpcmpestri(xmmA, xmmB, 0);
- e->vpcmpestri(xmmA, anyptr_gpB, 0);
- e->vpcmpestrm(xmmA, xmmB, 0);
- e->vpcmpestrm(xmmA, anyptr_gpB, 0);
- e->vpcmpistri(xmmA, xmmB, 0);
- e->vpcmpistri(xmmA, anyptr_gpB, 0);
- e->vpcmpistrm(xmmA, xmmB, 0);
- e->vpcmpistrm(xmmA, anyptr_gpB, 0);
- e->vpermilpd(xmmA, xmmB, xmmC);
- e->vpermilpd(xmmA, xmmB, anyptr_gpC);
- e->vpermilpd(ymmA, ymmB, ymmC);
- e->vpermilpd(ymmA, ymmB, anyptr_gpC);
- e->vpermilpd(xmmA, xmmB, 0);
- e->vpermilpd(xmmA, anyptr_gpB, 0);
- e->vpermilpd(ymmA, ymmB, 0);
- e->vpermilpd(ymmA, anyptr_gpB, 0);
- e->vpermilps(xmmA, xmmB, xmmC);
- e->vpermilps(xmmA, xmmB, anyptr_gpC);
- e->vpermilps(ymmA, ymmB, ymmC);
- e->vpermilps(ymmA, ymmB, anyptr_gpC);
- e->vpermilps(xmmA, xmmB, 0);
- e->vpermilps(xmmA, anyptr_gpB, 0);
- e->vpermilps(ymmA, ymmB, 0);
- e->vpermilps(ymmA, anyptr_gpB, 0);
- e->vperm2f128(ymmA, ymmB, ymmC, 0);
- e->vperm2f128(ymmA, ymmB, anyptr_gpC, 0);
- e->vpextrb(gzA, xmmB, 0);
- e->vpextrb(anyptr_gpA, xmmB, 0);
- e->vpextrd(gzA, xmmB, 0);
- e->vpextrd(anyptr_gpA, xmmB, 0);
- if (isX64) e->vpextrq(gzA, xmmB, 0);
- if (isX64) e->vpextrq(anyptr_gpA, xmmB, 0);
- e->vpextrw(gzA, xmmB, 0);
- e->vpextrw(anyptr_gpA, xmmB, 0);
- e->vphaddd(xmmA, xmmB, xmmC);
- e->vphaddd(xmmA, xmmB, anyptr_gpC);
- e->vphaddsw(xmmA, xmmB, xmmC);
- e->vphaddsw(xmmA, xmmB, anyptr_gpC);
- e->vphaddw(xmmA, xmmB, xmmC);
- e->vphaddw(xmmA, xmmB, anyptr_gpC);
- e->vphminposuw(xmmA, xmmB);
- e->vphminposuw(xmmA, anyptr_gpB);
- e->vphsubd(xmmA, xmmB, xmmC);
- e->vphsubd(xmmA, xmmB, anyptr_gpC);
- e->vphsubsw(xmmA, xmmB, xmmC);
- e->vphsubsw(xmmA, xmmB, anyptr_gpC);
- e->vphsubw(xmmA, xmmB, xmmC);
- e->vphsubw(xmmA, xmmB, anyptr_gpC);
- e->vpinsrb(xmmA, xmmB, gzC, 0);
- e->vpinsrb(xmmA, xmmB, anyptr_gpC, 0);
- e->vpinsrd(xmmA, xmmB, gzC, 0);
- e->vpinsrd(xmmA, xmmB, anyptr_gpC, 0);
- e->vpinsrw(xmmA, xmmB, gzC, 0);
- e->vpinsrw(xmmA, xmmB, anyptr_gpC, 0);
- e->vpmaddubsw(xmmA, xmmB, xmmC);
- e->vpmaddubsw(xmmA, xmmB, anyptr_gpC);
- e->vpmaddwd(xmmA, xmmB, xmmC);
- e->vpmaddwd(xmmA, xmmB, anyptr_gpC);
- e->vpmaxsb(xmmA, xmmB, xmmC);
- e->vpmaxsb(xmmA, xmmB, anyptr_gpC);
- e->vpmaxsd(xmmA, xmmB, xmmC);
- e->vpmaxsd(xmmA, xmmB, anyptr_gpC);
- e->vpmaxsw(xmmA, xmmB, xmmC);
- e->vpmaxsw(xmmA, xmmB, anyptr_gpC);
- e->vpmaxub(xmmA, xmmB, xmmC);
- e->vpmaxub(xmmA, xmmB, anyptr_gpC);
- e->vpmaxud(xmmA, xmmB, xmmC);
- e->vpmaxud(xmmA, xmmB, anyptr_gpC);
- e->vpmaxuw(xmmA, xmmB, xmmC);
- e->vpmaxuw(xmmA, xmmB, anyptr_gpC);
- e->vpminsb(xmmA, xmmB, xmmC);
- e->vpminsb(xmmA, xmmB, anyptr_gpC);
- e->vpminsd(xmmA, xmmB, xmmC);
- e->vpminsd(xmmA, xmmB, anyptr_gpC);
- e->vpminsw(xmmA, xmmB, xmmC);
- e->vpminsw(xmmA, xmmB, anyptr_gpC);
- e->vpminub(xmmA, xmmB, xmmC);
- e->vpminub(xmmA, xmmB, anyptr_gpC);
- e->vpminud(xmmA, xmmB, xmmC);
- e->vpminud(xmmA, xmmB, anyptr_gpC);
- e->vpminuw(xmmA, xmmB, xmmC);
- e->vpminuw(xmmA, xmmB, anyptr_gpC);
- e->vpmovmskb(gzA, xmmB);
- e->vpmovsxbd(xmmA, xmmB);
- e->vpmovsxbd(xmmA, anyptr_gpB);
- e->vpmovsxbq(xmmA, xmmB);
- e->vpmovsxbq(xmmA, anyptr_gpB);
- e->vpmovsxbw(xmmA, xmmB);
- e->vpmovsxbw(xmmA, anyptr_gpB);
- e->vpmovsxdq(xmmA, xmmB);
- e->vpmovsxdq(xmmA, anyptr_gpB);
- e->vpmovsxwd(xmmA, xmmB);
- e->vpmovsxwd(xmmA, anyptr_gpB);
- e->vpmovsxwq(xmmA, xmmB);
- e->vpmovsxwq(xmmA, anyptr_gpB);
- e->vpmovzxbd(xmmA, xmmB);
- e->vpmovzxbd(xmmA, anyptr_gpB);
- e->vpmovzxbq(xmmA, xmmB);
- e->vpmovzxbq(xmmA, anyptr_gpB);
- e->vpmovzxbw(xmmA, xmmB);
- e->vpmovzxbw(xmmA, anyptr_gpB);
- e->vpmovzxdq(xmmA, xmmB);
- e->vpmovzxdq(xmmA, anyptr_gpB);
- e->vpmovzxwd(xmmA, xmmB);
- e->vpmovzxwd(xmmA, anyptr_gpB);
- e->vpmovzxwq(xmmA, xmmB);
- e->vpmovzxwq(xmmA, anyptr_gpB);
- e->vpmuldq(xmmA, xmmB, xmmC);
- e->vpmuldq(xmmA, xmmB, anyptr_gpC);
- e->vpmulhrsw(xmmA, xmmB, xmmC);
- e->vpmulhrsw(xmmA, xmmB, anyptr_gpC);
- e->vpmulhuw(xmmA, xmmB, xmmC);
- e->vpmulhuw(xmmA, xmmB, anyptr_gpC);
- e->vpmulhw(xmmA, xmmB, xmmC);
- e->vpmulhw(xmmA, xmmB, anyptr_gpC);
- e->vpmulld(xmmA, xmmB, xmmC);
- e->vpmulld(xmmA, xmmB, anyptr_gpC);
- e->vpmullw(xmmA, xmmB, xmmC);
- e->vpmullw(xmmA, xmmB, anyptr_gpC);
- e->vpmuludq(xmmA, xmmB, xmmC);
- e->vpmuludq(xmmA, xmmB, anyptr_gpC);
- e->vpor(xmmA, xmmB, xmmC);
- e->vpor(xmmA, xmmB, anyptr_gpC);
- e->vpsadbw(xmmA, xmmB, xmmC);
- e->vpsadbw(xmmA, xmmB, anyptr_gpC);
- e->vpshufb(xmmA, xmmB, xmmC);
- e->vpshufb(xmmA, xmmB, anyptr_gpC);
- e->vpshufd(xmmA, xmmB, 0);
- e->vpshufd(xmmA, anyptr_gpB, 0);
- e->vpshufhw(xmmA, xmmB, 0);
- e->vpshufhw(xmmA, anyptr_gpB, 0);
- e->vpshuflw(xmmA, xmmB, 0);
- e->vpshuflw(xmmA, anyptr_gpB, 0);
- e->vpsignb(xmmA, xmmB, xmmC);
- e->vpsignb(xmmA, xmmB, anyptr_gpC);
- e->vpsignd(xmmA, xmmB, xmmC);
- e->vpsignd(xmmA, xmmB, anyptr_gpC);
- e->vpsignw(xmmA, xmmB, xmmC);
- e->vpsignw(xmmA, xmmB, anyptr_gpC);
- e->vpslld(xmmA, xmmB, xmmC);
- e->vpslld(xmmA, xmmB, anyptr_gpC);
- e->vpslld(xmmA, xmmB, 0);
- e->vpslldq(xmmA, xmmB, 0);
- e->vpsllq(xmmA, xmmB, xmmC);
- e->vpsllq(xmmA, xmmB, anyptr_gpC);
- e->vpsllq(xmmA, xmmB, 0);
- e->vpsllw(xmmA, xmmB, xmmC);
- e->vpsllw(xmmA, xmmB, anyptr_gpC);
- e->vpsllw(xmmA, xmmB, 0);
- e->vpsrad(xmmA, xmmB, xmmC);
- e->vpsrad(xmmA, xmmB, anyptr_gpC);
- e->vpsrad(xmmA, xmmB, 0);
- e->vpsraw(xmmA, xmmB, xmmC);
- e->vpsraw(xmmA, xmmB, anyptr_gpC);
- e->vpsraw(xmmA, xmmB, 0);
- e->vpsrld(xmmA, xmmB, xmmC);
- e->vpsrld(xmmA, xmmB, anyptr_gpC);
- e->vpsrld(xmmA, xmmB, 0);
- e->vpsrldq(xmmA, xmmB, 0);
- e->vpsrlq(xmmA, xmmB, xmmC);
- e->vpsrlq(xmmA, xmmB, anyptr_gpC);
- e->vpsrlq(xmmA, xmmB, 0);
- e->vpsrlw(xmmA, xmmB, xmmC);
- e->vpsrlw(xmmA, xmmB, anyptr_gpC);
- e->vpsrlw(xmmA, xmmB, 0);
- e->vpsubb(xmmA, xmmB, xmmC);
- e->vpsubb(xmmA, xmmB, anyptr_gpC);
- e->vpsubd(xmmA, xmmB, xmmC);
- e->vpsubd(xmmA, xmmB, anyptr_gpC);
- e->vpsubq(xmmA, xmmB, xmmC);
- e->vpsubq(xmmA, xmmB, anyptr_gpC);
- e->vpsubw(xmmA, xmmB, xmmC);
- e->vpsubw(xmmA, xmmB, anyptr_gpC);
- e->vpsubsb(xmmA, xmmB, xmmC);
- e->vpsubsb(xmmA, xmmB, anyptr_gpC);
- e->vpsubsw(xmmA, xmmB, xmmC);
- e->vpsubsw(xmmA, xmmB, anyptr_gpC);
- e->vpsubusb(xmmA, xmmB, xmmC);
- e->vpsubusb(xmmA, xmmB, anyptr_gpC);
- e->vpsubusw(xmmA, xmmB, xmmC);
- e->vpsubusw(xmmA, xmmB, anyptr_gpC);
- e->vptest(xmmA, xmmB);
- e->vptest(xmmA, anyptr_gpB);
- e->vptest(ymmA, ymmB);
- e->vptest(ymmA, anyptr_gpB);
- e->vpunpckhbw(xmmA, xmmB, xmmC);
- e->vpunpckhbw(xmmA, xmmB, anyptr_gpC);
- e->vpunpckhdq(xmmA, xmmB, xmmC);
- e->vpunpckhdq(xmmA, xmmB, anyptr_gpC);
- e->vpunpckhqdq(xmmA, xmmB, xmmC);
- e->vpunpckhqdq(xmmA, xmmB, anyptr_gpC);
- e->vpunpckhwd(xmmA, xmmB, xmmC);
- e->vpunpckhwd(xmmA, xmmB, anyptr_gpC);
- e->vpunpcklbw(xmmA, xmmB, xmmC);
- e->vpunpcklbw(xmmA, xmmB, anyptr_gpC);
- e->vpunpckldq(xmmA, xmmB, xmmC);
- e->vpunpckldq(xmmA, xmmB, anyptr_gpC);
- e->vpunpcklqdq(xmmA, xmmB, xmmC);
- e->vpunpcklqdq(xmmA, xmmB, anyptr_gpC);
- e->vpunpcklwd(xmmA, xmmB, xmmC);
- e->vpunpcklwd(xmmA, xmmB, anyptr_gpC);
- e->vpxor(xmmA, xmmB, xmmC);
- e->vpxor(xmmA, xmmB, anyptr_gpC);
- e->vrcpps(xmmA, xmmB);
- e->vrcpps(xmmA, anyptr_gpB);
- e->vrcpps(ymmA, ymmB);
- e->vrcpps(ymmA, anyptr_gpB);
- e->vrcpss(xmmA, xmmB, xmmC);
- e->vrcpss(xmmA, xmmB, anyptr_gpC);
- e->vrsqrtps(xmmA, xmmB);
- e->vrsqrtps(xmmA, anyptr_gpB);
- e->vrsqrtps(ymmA, ymmB);
- e->vrsqrtps(ymmA, anyptr_gpB);
- e->vrsqrtss(xmmA, xmmB, xmmC);
- e->vrsqrtss(xmmA, xmmB, anyptr_gpC);
- e->vroundpd(xmmA, xmmB, 0);
- e->vroundpd(xmmA, anyptr_gpB, 0);
- e->vroundpd(ymmA, ymmB, 0);
- e->vroundpd(ymmA, anyptr_gpB, 0);
- e->vroundps(xmmA, xmmB, 0);
- e->vroundps(xmmA, anyptr_gpB, 0);
- e->vroundps(ymmA, ymmB, 0);
- e->vroundps(ymmA, anyptr_gpB, 0);
- e->vroundsd(xmmA, xmmB, xmmC, 0);
- e->vroundsd(xmmA, xmmB, anyptr_gpC, 0);
- e->vroundss(xmmA, xmmB, xmmC, 0);
- e->vroundss(xmmA, xmmB, anyptr_gpC, 0);
- e->vshufpd(xmmA, xmmB, xmmC, 0);
- e->vshufpd(xmmA, xmmB, anyptr_gpC, 0);
- e->vshufpd(ymmA, ymmB, ymmC, 0);
- e->vshufpd(ymmA, ymmB, anyptr_gpC, 0);
- e->vshufps(xmmA, xmmB, xmmC, 0);
- e->vshufps(xmmA, xmmB, anyptr_gpC, 0);
- e->vshufps(ymmA, ymmB, ymmC, 0);
- e->vshufps(ymmA, ymmB, anyptr_gpC, 0);
- e->vsqrtpd(xmmA, xmmB);
- e->vsqrtpd(xmmA, anyptr_gpB);
- e->vsqrtpd(ymmA, ymmB);
- e->vsqrtpd(ymmA, anyptr_gpB);
- e->vsqrtps(xmmA, xmmB);
- e->vsqrtps(xmmA, anyptr_gpB);
- e->vsqrtps(ymmA, ymmB);
- e->vsqrtps(ymmA, anyptr_gpB);
- e->vsqrtsd(xmmA, xmmB, xmmC);
- e->vsqrtsd(xmmA, xmmB, anyptr_gpC);
- e->vsqrtss(xmmA, xmmB, xmmC);
- e->vsqrtss(xmmA, xmmB, anyptr_gpC);
- e->vstmxcsr(anyptr_gpA);
- e->vsubpd(xmmA, xmmB, xmmC);
- e->vsubpd(xmmA, xmmB, anyptr_gpC);
- e->vsubpd(ymmA, ymmB, ymmC);
- e->vsubpd(ymmA, ymmB, anyptr_gpC);
- e->vsubps(xmmA, xmmB, xmmC);
- e->vsubps(xmmA, xmmB, anyptr_gpC);
- e->vsubps(ymmA, ymmB, ymmC);
- e->vsubps(ymmA, ymmB, anyptr_gpC);
- e->vsubsd(xmmA, xmmB, xmmC);
- e->vsubsd(xmmA, xmmB, anyptr_gpC);
- e->vsubss(xmmA, xmmB, xmmC);
- e->vsubss(xmmA, xmmB, anyptr_gpC);
- e->vtestps(xmmA, xmmB);
- e->vtestps(xmmA, anyptr_gpB);
- e->vtestps(ymmA, ymmB);
- e->vtestps(ymmA, anyptr_gpB);
- e->vtestpd(xmmA, xmmB);
- e->vtestpd(xmmA, anyptr_gpB);
- e->vtestpd(ymmA, ymmB);
- e->vtestpd(ymmA, anyptr_gpB);
- e->vucomisd(xmmA, xmmB);
- e->vucomisd(xmmA, anyptr_gpB);
- e->vucomiss(xmmA, xmmB);
- e->vucomiss(xmmA, anyptr_gpB);
- e->vunpckhpd(xmmA, xmmB, xmmC);
- e->vunpckhpd(xmmA, xmmB, anyptr_gpC);
- e->vunpckhpd(ymmA, ymmB, ymmC);
- e->vunpckhpd(ymmA, ymmB, anyptr_gpC);
- e->vunpckhps(xmmA, xmmB, xmmC);
- e->vunpckhps(xmmA, xmmB, anyptr_gpC);
- e->vunpckhps(ymmA, ymmB, ymmC);
- e->vunpckhps(ymmA, ymmB, anyptr_gpC);
- e->vunpcklpd(xmmA, xmmB, xmmC);
- e->vunpcklpd(xmmA, xmmB, anyptr_gpC);
- e->vunpcklpd(ymmA, ymmB, ymmC);
- e->vunpcklpd(ymmA, ymmB, anyptr_gpC);
- e->vunpcklps(xmmA, xmmB, xmmC);
- e->vunpcklps(xmmA, xmmB, anyptr_gpC);
- e->vunpcklps(ymmA, ymmB, ymmC);
- e->vunpcklps(ymmA, ymmB, anyptr_gpC);
- e->vxorpd(xmmA, xmmB, xmmC);
- e->vxorpd(xmmA, xmmB, anyptr_gpC);
- e->vxorpd(ymmA, ymmB, ymmC);
- e->vxorpd(ymmA, ymmB, anyptr_gpC);
- e->vxorps(xmmA, xmmB, xmmC);
- e->vxorps(xmmA, xmmB, anyptr_gpC);
- e->vxorps(ymmA, ymmB, ymmC);
- e->vxorps(ymmA, ymmB, anyptr_gpC);
- e->vzeroall();
- e->vex3().vzeroall();
- e->vzeroupper();
- e->vex3().vzeroupper();
-
- // AVX+AESNI.
- e->nop();
-
- e->vaesdec(xmmA, xmmB, xmmC);
- e->vaesdec(xmmA, xmmB, anyptr_gpC);
- e->vaesdeclast(xmmA, xmmB, xmmC);
- e->vaesdeclast(xmmA, xmmB, anyptr_gpC);
- e->vaesenc(xmmA, xmmB, xmmC);
- e->vaesenc(xmmA, xmmB, anyptr_gpC);
- e->vaesenclast(xmmA, xmmB, xmmC);
- e->vaesenclast(xmmA, xmmB, anyptr_gpC);
- e->vaesimc(xmmA, xmmB);
- e->vaesimc(xmmA, anyptr_gpB);
- e->vaeskeygenassist(xmmA, xmmB, 0);
- e->vaeskeygenassist(xmmA, anyptr_gpB, 0);
-
- // AVX+PCLMULQDQ.
- e->nop();
-
- e->vpclmulqdq(xmmA, xmmB, xmmC, 0);
- e->vpclmulqdq(xmmA, xmmB, anyptr_gpC, 0);
-
- // AVX2.
- e->nop();
-
- e->vbroadcasti128(ymmA, anyptr_gpB);
- e->vbroadcastsd(ymmA, xmmB);
- e->vbroadcastss(xmmA, xmmB);
- e->vbroadcastss(ymmA, xmmB);
- e->vextracti128(xmmA, ymmB, 0);
- e->vextracti128(anyptr_gpA, ymmB, 0);
- e->vgatherdpd(xmmA, vx_ptr, xmmC);
- e->vgatherdpd(ymmA, vx_ptr, ymmC);
- e->vgatherdps(xmmA, vx_ptr, xmmC);
- e->vgatherdps(ymmA, vy_ptr, ymmC);
- e->vgatherqpd(xmmA, vx_ptr, xmmC);
- e->vgatherqpd(ymmA, vy_ptr, ymmC);
- e->vgatherqps(xmmA, vx_ptr, xmmC);
- e->vgatherqps(xmmA, vy_ptr, xmmC);
- e->vinserti128(ymmA, ymmB, xmmC, 0);
- e->vinserti128(ymmA, ymmB, anyptr_gpC, 0);
- e->vmovntdqa(ymmA, anyptr_gpB);
- e->vmpsadbw(ymmA, ymmB, ymmC, 0);
- e->vmpsadbw(ymmA, ymmB, anyptr_gpC, 0);
- e->vpabsb(ymmA, ymmB);
- e->vpabsb(ymmA, anyptr_gpB);
- e->vpabsd(ymmA, ymmB);
- e->vpabsd(ymmA, anyptr_gpB);
- e->vpabsw(ymmA, ymmB);
- e->vpabsw(ymmA, anyptr_gpB);
- e->vpackssdw(ymmA, ymmB, ymmC);
- e->vpackssdw(ymmA, ymmB, anyptr_gpC);
- e->vpacksswb(ymmA, ymmB, ymmC);
- e->vpacksswb(ymmA, ymmB, anyptr_gpC);
- e->vpackusdw(ymmA, ymmB, ymmC);
- e->vpackusdw(ymmA, ymmB, anyptr_gpC);
- e->vpackuswb(ymmA, ymmB, ymmC);
- e->vpackuswb(ymmA, ymmB, anyptr_gpC);
- e->vpaddb(ymmA, ymmB, ymmC);
- e->vpaddb(ymmA, ymmB, anyptr_gpC);
- e->vpaddd(ymmA, ymmB, ymmC);
- e->vpaddd(ymmA, ymmB, anyptr_gpC);
- e->vpaddq(ymmA, ymmB, ymmC);
- e->vpaddq(ymmA, ymmB, anyptr_gpC);
- e->vpaddw(ymmA, ymmB, ymmC);
- e->vpaddw(ymmA, ymmB, anyptr_gpC);
- e->vpaddsb(ymmA, ymmB, ymmC);
- e->vpaddsb(ymmA, ymmB, anyptr_gpC);
- e->vpaddsw(ymmA, ymmB, ymmC);
- e->vpaddsw(ymmA, ymmB, anyptr_gpC);
- e->vpaddusb(ymmA, ymmB, ymmC);
- e->vpaddusb(ymmA, ymmB, anyptr_gpC);
- e->vpaddusw(ymmA, ymmB, ymmC);
- e->vpaddusw(ymmA, ymmB, anyptr_gpC);
- e->vpalignr(ymmA, ymmB, ymmC, 0);
- e->vpalignr(ymmA, ymmB, anyptr_gpC, 0);
- e->vpand(ymmA, ymmB, ymmC);
- e->vpand(ymmA, ymmB, anyptr_gpC);
- e->vpandn(ymmA, ymmB, ymmC);
- e->vpandn(ymmA, ymmB, anyptr_gpC);
- e->vpavgb(ymmA, ymmB, ymmC);
- e->vpavgb(ymmA, ymmB, anyptr_gpC);
- e->vpavgw(ymmA, ymmB, ymmC);
- e->vpavgw(ymmA, ymmB, anyptr_gpC);
- e->vpblendd(xmmA, xmmB, xmmC, 0);
- e->vpblendd(xmmA, xmmB, anyptr_gpC, 0);
- e->vpblendd(ymmA, ymmB, ymmC, 0);
- e->vpblendd(ymmA, ymmB, anyptr_gpC, 0);
- e->vpblendvb(ymmA, ymmB, ymmC, ymmD);
- e->vpblendvb(ymmA, ymmB, anyptr_gpC, ymmD);
- e->vpblendw(ymmA, ymmB, ymmC, 0);
- e->vpblendw(ymmA, ymmB, anyptr_gpC, 0);
- e->vpbroadcastb(xmmA, xmmB);
- e->vpbroadcastb(xmmA, anyptr_gpB);
- e->vpbroadcastb(ymmA, xmmB);
- e->vpbroadcastb(ymmA, anyptr_gpB);
- e->vpbroadcastd(xmmA, xmmB);
- e->vpbroadcastd(xmmA, anyptr_gpB);
- e->vpbroadcastd(ymmA, xmmB);
- e->vpbroadcastd(ymmA, anyptr_gpB);
- e->vpbroadcastq(xmmA, xmmB);
- e->vpbroadcastq(xmmA, anyptr_gpB);
- e->vpbroadcastq(ymmA, xmmB);
- e->vpbroadcastq(ymmA, anyptr_gpB);
- e->vpbroadcastw(xmmA, xmmB);
- e->vpbroadcastw(xmmA, anyptr_gpB);
- e->vpbroadcastw(ymmA, xmmB);
- e->vpbroadcastw(ymmA, anyptr_gpB);
- e->vpcmpeqb(ymmA, ymmB, ymmC);
- e->vpcmpeqb(ymmA, ymmB, anyptr_gpC);
- e->vpcmpeqd(ymmA, ymmB, ymmC);
- e->vpcmpeqd(ymmA, ymmB, anyptr_gpC);
- e->vpcmpeqq(ymmA, ymmB, ymmC);
- e->vpcmpeqq(ymmA, ymmB, anyptr_gpC);
- e->vpcmpeqw(ymmA, ymmB, ymmC);
- e->vpcmpeqw(ymmA, ymmB, anyptr_gpC);
- e->vpcmpgtb(ymmA, ymmB, ymmC);
- e->vpcmpgtb(ymmA, ymmB, anyptr_gpC);
- e->vpcmpgtd(ymmA, ymmB, ymmC);
- e->vpcmpgtd(ymmA, ymmB, anyptr_gpC);
- e->vpcmpgtq(ymmA, ymmB, ymmC);
- e->vpcmpgtq(ymmA, ymmB, anyptr_gpC);
- e->vpcmpgtw(ymmA, ymmB, ymmC);
- e->vpcmpgtw(ymmA, ymmB, anyptr_gpC);
- e->vperm2i128(ymmA, ymmB, ymmC, 0);
- e->vperm2i128(ymmA, ymmB, anyptr_gpC, 0);
- e->vpermd(ymmA, ymmB, ymmC);
- e->vpermd(ymmA, ymmB, anyptr_gpC);
- e->vpermps(ymmA, ymmB, ymmC);
- e->vpermps(ymmA, ymmB, anyptr_gpC);
- e->vpermpd(ymmA, ymmB, 0);
- e->vpermpd(ymmA, anyptr_gpB, 0);
- e->vpermq(ymmA, ymmB, 0);
- e->vpermq(ymmA, anyptr_gpB, 0);
- e->vpgatherdd(xmmA, vx_ptr, xmmC);
- e->vpgatherdd(ymmA, vy_ptr, ymmC);
- e->vpgatherdq(xmmA, vx_ptr, xmmC);
- e->vpgatherdq(ymmA, vx_ptr, ymmC);
- e->vpgatherqd(xmmA, vx_ptr, xmmC);
- e->vpgatherqd(xmmA, vy_ptr, xmmC);
- e->vpgatherqq(xmmA, vx_ptr, xmmC);
- e->vpgatherqq(ymmA, vy_ptr, ymmC);
- e->vpmovmskb(gzA, ymmB);
- e->vpmovsxbd(ymmA, anyptr_gpB);
- e->vpmovsxbd(ymmA, xmmB);
- e->vpmovsxbq(ymmA, anyptr_gpB);
- e->vpmovsxbq(ymmA, xmmB);
- e->vpmovsxbw(ymmA, anyptr_gpB);
- e->vpmovsxbw(ymmA, xmmB);
- e->vpmovsxdq(ymmA, anyptr_gpB);
- e->vpmovsxdq(ymmA, xmmB);
- e->vpmovsxwd(ymmA, anyptr_gpB);
- e->vpmovsxwd(ymmA, xmmB);
- e->vpmovsxwq(ymmA, anyptr_gpB);
- e->vpmovsxwq(ymmA, xmmB);
- e->vpmovzxbd(ymmA, anyptr_gpB);
- e->vpmovzxbd(ymmA, xmmB);
- e->vpmovzxbq(ymmA, anyptr_gpB);
- e->vpmovzxbq(ymmA, xmmB);
- e->vpmovzxbw(ymmA, anyptr_gpB);
- e->vpmovzxbw(ymmA, xmmB);
- e->vpmovzxdq(ymmA, anyptr_gpB);
- e->vpmovzxdq(ymmA, xmmB);
- e->vpmovzxwd(ymmA, anyptr_gpB);
- e->vpmovzxwd(ymmA, xmmB);
- e->vpmovzxwq(ymmA, anyptr_gpB);
- e->vpmovzxwq(ymmA, xmmB);
- e->vpshufd(ymmA, anyptr_gpB, 0);
- e->vpshufd(ymmA, ymmB, 0);
- e->vpshufhw(ymmA, anyptr_gpB, 0);
- e->vpshufhw(ymmA, ymmB, 0);
- e->vpshuflw(ymmA, anyptr_gpB, 0);
- e->vpshuflw(ymmA, ymmB, 0);
- e->vpslld(ymmA, ymmB, 0);
- e->vpslldq(ymmA, ymmB, 0);
- e->vpsllq(ymmA, ymmB, 0);
- e->vpsllw(ymmA, ymmB, 0);
- e->vpsrad(ymmA, ymmB, 0);
- e->vpsraw(ymmA, ymmB, 0);
- e->vpsrld(ymmA, ymmB, 0);
- e->vpsrldq(ymmA, ymmB, 0);
- e->vpsrlq(ymmA, ymmB, 0);
- e->vpsrlw(ymmA, ymmB, 0);
- e->vphaddd(ymmA, ymmB, anyptr_gpC);
- e->vphaddd(ymmA, ymmB, ymmC);
- e->vphaddsw(ymmA, ymmB, anyptr_gpC);
- e->vphaddsw(ymmA, ymmB, ymmC);
- e->vphaddw(ymmA, ymmB, anyptr_gpC);
- e->vphaddw(ymmA, ymmB, ymmC);
- e->vphsubd(ymmA, ymmB, anyptr_gpC);
- e->vphsubd(ymmA, ymmB, ymmC);
- e->vphsubsw(ymmA, ymmB, anyptr_gpC);
- e->vphsubsw(ymmA, ymmB, ymmC);
- e->vphsubw(ymmA, ymmB, anyptr_gpC);
- e->vphsubw(ymmA, ymmB, ymmC);
- e->vpmaddubsw(ymmA, ymmB, anyptr_gpC);
- e->vpmaddubsw(ymmA, ymmB, ymmC);
- e->vpmaddwd(ymmA, ymmB, anyptr_gpC);
- e->vpmaddwd(ymmA, ymmB, ymmC);
- e->vpmaskmovd(anyptr_gpA, xmmB, xmmC);
- e->vpmaskmovd(anyptr_gpA, ymmB, ymmC);
- e->vpmaskmovd(xmmA, xmmB, anyptr_gpC);
- e->vpmaskmovd(ymmA, ymmB, anyptr_gpC);
- e->vpmaskmovq(anyptr_gpA, xmmB, xmmC);
- e->vpmaskmovq(anyptr_gpA, ymmB, ymmC);
- e->vpmaskmovq(xmmA, xmmB, anyptr_gpC);
- e->vpmaskmovq(ymmA, ymmB, anyptr_gpC);
- e->vpmaxsb(ymmA, ymmB, anyptr_gpC);
- e->vpmaxsb(ymmA, ymmB, ymmC);
- e->vpmaxsd(ymmA, ymmB, anyptr_gpC);
- e->vpmaxsd(ymmA, ymmB, ymmC);
- e->vpmaxsw(ymmA, ymmB, anyptr_gpC);
- e->vpmaxsw(ymmA, ymmB, ymmC);
- e->vpmaxub(ymmA, ymmB, anyptr_gpC);
- e->vpmaxub(ymmA, ymmB, ymmC);
- e->vpmaxud(ymmA, ymmB, anyptr_gpC);
- e->vpmaxud(ymmA, ymmB, ymmC);
- e->vpmaxuw(ymmA, ymmB, anyptr_gpC);
- e->vpmaxuw(ymmA, ymmB, ymmC);
- e->vpminsb(ymmA, ymmB, anyptr_gpC);
- e->vpminsb(ymmA, ymmB, ymmC);
- e->vpminsd(ymmA, ymmB, anyptr_gpC);
- e->vpminsd(ymmA, ymmB, ymmC);
- e->vpminsw(ymmA, ymmB, anyptr_gpC);
- e->vpminsw(ymmA, ymmB, ymmC);
- e->vpminub(ymmA, ymmB, anyptr_gpC);
- e->vpminub(ymmA, ymmB, ymmC);
- e->vpminud(ymmA, ymmB, anyptr_gpC);
- e->vpminud(ymmA, ymmB, ymmC);
- e->vpminuw(ymmA, ymmB, anyptr_gpC);
- e->vpminuw(ymmA, ymmB, ymmC);
- e->vpmuldq(ymmA, ymmB, anyptr_gpC);
- e->vpmuldq(ymmA, ymmB, ymmC);
- e->vpmulhrsw(ymmA, ymmB, anyptr_gpC);
- e->vpmulhrsw(ymmA, ymmB, ymmC);
- e->vpmulhuw(ymmA, ymmB, anyptr_gpC);
- e->vpmulhuw(ymmA, ymmB, ymmC);
- e->vpmulhw(ymmA, ymmB, anyptr_gpC);
- e->vpmulhw(ymmA, ymmB, ymmC);
- e->vpmulld(ymmA, ymmB, anyptr_gpC);
- e->vpmulld(ymmA, ymmB, ymmC);
- e->vpmullw(ymmA, ymmB, anyptr_gpC);
- e->vpmullw(ymmA, ymmB, ymmC);
- e->vpmuludq(ymmA, ymmB, anyptr_gpC);
- e->vpmuludq(ymmA, ymmB, ymmC);
- e->vpor(ymmA, ymmB, anyptr_gpC);
- e->vpor(ymmA, ymmB, ymmC);
- e->vpsadbw(ymmA, ymmB, anyptr_gpC);
- e->vpsadbw(ymmA, ymmB, ymmC);
- e->vpshufb(ymmA, ymmB, anyptr_gpC);
- e->vpshufb(ymmA, ymmB, ymmC);
- e->vpsignb(ymmA, ymmB, anyptr_gpC);
- e->vpsignb(ymmA, ymmB, ymmC);
- e->vpsignd(ymmA, ymmB, anyptr_gpC);
- e->vpsignd(ymmA, ymmB, ymmC);
- e->vpsignw(ymmA, ymmB, anyptr_gpC);
- e->vpsignw(ymmA, ymmB, ymmC);
- e->vpslld(ymmA, ymmB, anyptr_gpC);
- e->vpslld(ymmA, ymmB, xmmC);
- e->vpsllq(ymmA, ymmB, anyptr_gpC);
- e->vpsllq(ymmA, ymmB, xmmC);
- e->vpsllvd(xmmA, xmmB, anyptr_gpC);
- e->vpsllvd(xmmA, xmmB, xmmC);
- e->vpsllvd(ymmA, ymmB, anyptr_gpC);
- e->vpsllvd(ymmA, ymmB, ymmC);
- e->vpsllvq(xmmA, xmmB, anyptr_gpC);
- e->vpsllvq(xmmA, xmmB, xmmC);
- e->vpsllvq(ymmA, ymmB, anyptr_gpC);
- e->vpsllvq(ymmA, ymmB, ymmC);
- e->vpsllw(ymmA, ymmB, anyptr_gpC);
- e->vpsllw(ymmA, ymmB, xmmC);
- e->vpsrad(ymmA, ymmB, anyptr_gpC);
- e->vpsrad(ymmA, ymmB, xmmC);
- e->vpsravd(xmmA, xmmB, anyptr_gpC);
- e->vpsravd(xmmA, xmmB, xmmC);
- e->vpsravd(ymmA, ymmB, anyptr_gpC);
- e->vpsravd(ymmA, ymmB, ymmC);
- e->vpsraw(ymmA, ymmB, anyptr_gpC);
- e->vpsraw(ymmA, ymmB, xmmC);
- e->vpsrld(ymmA, ymmB, anyptr_gpC);
- e->vpsrld(ymmA, ymmB, xmmC);
- e->vpsrlq(ymmA, ymmB, anyptr_gpC);
- e->vpsrlq(ymmA, ymmB, xmmC);
- e->vpsrlvd(xmmA, xmmB, anyptr_gpC);
- e->vpsrlvd(xmmA, xmmB, xmmC);
- e->vpsrlvd(ymmA, ymmB, anyptr_gpC);
- e->vpsrlvd(ymmA, ymmB, ymmC);
- e->vpsrlvq(xmmA, xmmB, anyptr_gpC);
- e->vpsrlvq(xmmA, xmmB, xmmC);
- e->vpsrlvq(ymmA, ymmB, anyptr_gpC);
- e->vpsrlvq(ymmA, ymmB, ymmC);
- e->vpsrlw(ymmA, ymmB, anyptr_gpC);
- e->vpsrlw(ymmA, ymmB, xmmC);
- e->vpsubb(ymmA, ymmB, anyptr_gpC);
- e->vpsubb(ymmA, ymmB, ymmC);
- e->vpsubd(ymmA, ymmB, anyptr_gpC);
- e->vpsubd(ymmA, ymmB, ymmC);
- e->vpsubq(ymmA, ymmB, anyptr_gpC);
- e->vpsubq(ymmA, ymmB, ymmC);
- e->vpsubsb(ymmA, ymmB, anyptr_gpC);
- e->vpsubsb(ymmA, ymmB, ymmC);
- e->vpsubsw(ymmA, ymmB, anyptr_gpC);
- e->vpsubsw(ymmA, ymmB, ymmC);
- e->vpsubusb(ymmA, ymmB, anyptr_gpC);
- e->vpsubusb(ymmA, ymmB, ymmC);
- e->vpsubusw(ymmA, ymmB, anyptr_gpC);
- e->vpsubusw(ymmA, ymmB, ymmC);
- e->vpsubw(ymmA, ymmB, anyptr_gpC);
- e->vpsubw(ymmA, ymmB, ymmC);
- e->vpunpckhbw(ymmA, ymmB, anyptr_gpC);
- e->vpunpckhbw(ymmA, ymmB, ymmC);
- e->vpunpckhdq(ymmA, ymmB, anyptr_gpC);
- e->vpunpckhdq(ymmA, ymmB, ymmC);
- e->vpunpckhqdq(ymmA, ymmB, anyptr_gpC);
- e->vpunpckhqdq(ymmA, ymmB, ymmC);
- e->vpunpckhwd(ymmA, ymmB, anyptr_gpC);
- e->vpunpckhwd(ymmA, ymmB, ymmC);
- e->vpunpcklbw(ymmA, ymmB, anyptr_gpC);
- e->vpunpcklbw(ymmA, ymmB, ymmC);
- e->vpunpckldq(ymmA, ymmB, anyptr_gpC);
- e->vpunpckldq(ymmA, ymmB, ymmC);
- e->vpunpcklqdq(ymmA, ymmB, anyptr_gpC);
- e->vpunpcklqdq(ymmA, ymmB, ymmC);
- e->vpunpcklwd(ymmA, ymmB, anyptr_gpC);
- e->vpunpcklwd(ymmA, ymmB, ymmC);
- e->vpxor(ymmA, ymmB, anyptr_gpC);
- e->vpxor(ymmA, ymmB, ymmC);
-
- // FMA.
- e->nop();
-
- e->vfmadd132pd(xmmA, xmmB, anyptr_gpC);
- e->vfmadd132pd(xmmA, xmmB, xmmC);
- e->vfmadd132pd(ymmA, ymmB, anyptr_gpC);
- e->vfmadd132pd(ymmA, ymmB, ymmC);
- e->vfmadd132ps(xmmA, xmmB, anyptr_gpC);
- e->vfmadd132ps(xmmA, xmmB, xmmC);
- e->vfmadd132ps(ymmA, ymmB, anyptr_gpC);
- e->vfmadd132ps(ymmA, ymmB, ymmC);
- e->vfmadd132sd(xmmA, xmmB, anyptr_gpC);
- e->vfmadd132sd(xmmA, xmmB, xmmC);
- e->vfmadd132ss(xmmA, xmmB, anyptr_gpC);
- e->vfmadd132ss(xmmA, xmmB, xmmC);
- e->vfmadd213pd(xmmA, xmmB, anyptr_gpC);
- e->vfmadd213pd(xmmA, xmmB, xmmC);
- e->vfmadd213pd(ymmA, ymmB, anyptr_gpC);
- e->vfmadd213pd(ymmA, ymmB, ymmC);
- e->vfmadd213ps(xmmA, xmmB, anyptr_gpC);
- e->vfmadd213ps(xmmA, xmmB, xmmC);
- e->vfmadd213ps(ymmA, ymmB, anyptr_gpC);
- e->vfmadd213ps(ymmA, ymmB, ymmC);
- e->vfmadd213sd(xmmA, xmmB, anyptr_gpC);
- e->vfmadd213sd(xmmA, xmmB, xmmC);
- e->vfmadd213ss(xmmA, xmmB, anyptr_gpC);
- e->vfmadd213ss(xmmA, xmmB, xmmC);
- e->vfmadd231pd(xmmA, xmmB, anyptr_gpC);
- e->vfmadd231pd(xmmA, xmmB, xmmC);
- e->vfmadd231pd(ymmA, ymmB, anyptr_gpC);
- e->vfmadd231pd(ymmA, ymmB, ymmC);
- e->vfmadd231ps(xmmA, xmmB, anyptr_gpC);
- e->vfmadd231ps(xmmA, xmmB, xmmC);
- e->vfmadd231ps(ymmA, ymmB, anyptr_gpC);
- e->vfmadd231ps(ymmA, ymmB, ymmC);
- e->vfmadd231sd(xmmA, xmmB, anyptr_gpC);
- e->vfmadd231sd(xmmA, xmmB, xmmC);
- e->vfmadd231ss(xmmA, xmmB, anyptr_gpC);
- e->vfmadd231ss(xmmA, xmmB, xmmC);
- e->vfmaddsub132pd(xmmA, xmmB, anyptr_gpC);
- e->vfmaddsub132pd(xmmA, xmmB, xmmC);
- e->vfmaddsub132pd(ymmA, ymmB, anyptr_gpC);
- e->vfmaddsub132pd(ymmA, ymmB, ymmC);
- e->vfmaddsub132ps(xmmA, xmmB, anyptr_gpC);
- e->vfmaddsub132ps(xmmA, xmmB, xmmC);
- e->vfmaddsub132ps(ymmA, ymmB, anyptr_gpC);
- e->vfmaddsub132ps(ymmA, ymmB, ymmC);
- e->vfmaddsub213pd(xmmA, xmmB, anyptr_gpC);
- e->vfmaddsub213pd(xmmA, xmmB, xmmC);
- e->vfmaddsub213pd(ymmA, ymmB, anyptr_gpC);
- e->vfmaddsub213pd(ymmA, ymmB, ymmC);
- e->vfmaddsub213ps(xmmA, xmmB, anyptr_gpC);
- e->vfmaddsub213ps(xmmA, xmmB, xmmC);
- e->vfmaddsub213ps(ymmA, ymmB, anyptr_gpC);
- e->vfmaddsub213ps(ymmA, ymmB, ymmC);
- e->vfmaddsub231pd(xmmA, xmmB, anyptr_gpC);
- e->vfmaddsub231pd(xmmA, xmmB, xmmC);
- e->vfmaddsub231pd(ymmA, ymmB, anyptr_gpC);
- e->vfmaddsub231pd(ymmA, ymmB, ymmC);
- e->vfmaddsub231ps(xmmA, xmmB, anyptr_gpC);
- e->vfmaddsub231ps(xmmA, xmmB, xmmC);
- e->vfmaddsub231ps(ymmA, ymmB, anyptr_gpC);
- e->vfmaddsub231ps(ymmA, ymmB, ymmC);
- e->vfmsub132pd(xmmA, xmmB, anyptr_gpC);
- e->vfmsub132pd(xmmA, xmmB, xmmC);
- e->vfmsub132pd(ymmA, ymmB, anyptr_gpC);
- e->vfmsub132pd(ymmA, ymmB, ymmC);
- e->vfmsub132ps(xmmA, xmmB, anyptr_gpC);
- e->vfmsub132ps(xmmA, xmmB, xmmC);
- e->vfmsub132ps(ymmA, ymmB, anyptr_gpC);
- e->vfmsub132ps(ymmA, ymmB, ymmC);
- e->vfmsub132sd(xmmA, xmmB, anyptr_gpC);
- e->vfmsub132sd(xmmA, xmmB, xmmC);
- e->vfmsub132ss(xmmA, xmmB, anyptr_gpC);
- e->vfmsub132ss(xmmA, xmmB, xmmC);
- e->vfmsub213pd(xmmA, xmmB, anyptr_gpC);
- e->vfmsub213pd(xmmA, xmmB, xmmC);
- e->vfmsub213pd(ymmA, ymmB, anyptr_gpC);
- e->vfmsub213pd(ymmA, ymmB, ymmC);
- e->vfmsub213ps(xmmA, xmmB, anyptr_gpC);
- e->vfmsub213ps(xmmA, xmmB, xmmC);
- e->vfmsub213ps(ymmA, ymmB, anyptr_gpC);
- e->vfmsub213ps(ymmA, ymmB, ymmC);
- e->vfmsub213sd(xmmA, xmmB, anyptr_gpC);
- e->vfmsub213sd(xmmA, xmmB, xmmC);
- e->vfmsub213ss(xmmA, xmmB, anyptr_gpC);
- e->vfmsub213ss(xmmA, xmmB, xmmC);
- e->vfmsub231pd(xmmA, xmmB, anyptr_gpC);
- e->vfmsub231pd(xmmA, xmmB, xmmC);
- e->vfmsub231pd(ymmA, ymmB, anyptr_gpC);
- e->vfmsub231pd(ymmA, ymmB, ymmC);
- e->vfmsub231ps(xmmA, xmmB, anyptr_gpC);
- e->vfmsub231ps(xmmA, xmmB, xmmC);
- e->vfmsub231ps(ymmA, ymmB, anyptr_gpC);
- e->vfmsub231ps(ymmA, ymmB, ymmC);
- e->vfmsub231sd(xmmA, xmmB, anyptr_gpC);
- e->vfmsub231sd(xmmA, xmmB, xmmC);
- e->vfmsub231ss(xmmA, xmmB, anyptr_gpC);
- e->vfmsub231ss(xmmA, xmmB, xmmC);
- e->vfmsubadd132pd(xmmA, xmmB, anyptr_gpC);
- e->vfmsubadd132pd(xmmA, xmmB, xmmC);
- e->vfmsubadd132pd(ymmA, ymmB, anyptr_gpC);
- e->vfmsubadd132pd(ymmA, ymmB, ymmC);
- e->vfmsubadd132ps(xmmA, xmmB, anyptr_gpC);
- e->vfmsubadd132ps(xmmA, xmmB, xmmC);
- e->vfmsubadd132ps(ymmA, ymmB, anyptr_gpC);
- e->vfmsubadd132ps(ymmA, ymmB, ymmC);
- e->vfmsubadd213pd(xmmA, xmmB, anyptr_gpC);
- e->vfmsubadd213pd(xmmA, xmmB, xmmC);
- e->vfmsubadd213pd(ymmA, ymmB, anyptr_gpC);
- e->vfmsubadd213pd(ymmA, ymmB, ymmC);
- e->vfmsubadd213ps(xmmA, xmmB, anyptr_gpC);
- e->vfmsubadd213ps(xmmA, xmmB, xmmC);
- e->vfmsubadd213ps(ymmA, ymmB, anyptr_gpC);
- e->vfmsubadd213ps(ymmA, ymmB, ymmC);
- e->vfmsubadd231pd(xmmA, xmmB, anyptr_gpC);
- e->vfmsubadd231pd(xmmA, xmmB, xmmC);
- e->vfmsubadd231pd(ymmA, ymmB, anyptr_gpC);
- e->vfmsubadd231pd(ymmA, ymmB, ymmC);
- e->vfmsubadd231ps(xmmA, xmmB, anyptr_gpC);
- e->vfmsubadd231ps(xmmA, xmmB, xmmC);
- e->vfmsubadd231ps(ymmA, ymmB, anyptr_gpC);
- e->vfmsubadd231ps(ymmA, ymmB, ymmC);
- e->vfnmadd132pd(xmmA, xmmB, anyptr_gpC);
- e->vfnmadd132pd(xmmA, xmmB, xmmC);
- e->vfnmadd132pd(ymmA, ymmB, anyptr_gpC);
- e->vfnmadd132pd(ymmA, ymmB, ymmC);
- e->vfnmadd132ps(xmmA, xmmB, anyptr_gpC);
- e->vfnmadd132ps(xmmA, xmmB, xmmC);
- e->vfnmadd132ps(ymmA, ymmB, anyptr_gpC);
- e->vfnmadd132ps(ymmA, ymmB, ymmC);
- e->vfnmadd132sd(xmmA, xmmB, anyptr_gpC);
- e->vfnmadd132sd(xmmA, xmmB, xmmC);
- e->vfnmadd132ss(xmmA, xmmB, anyptr_gpC);
- e->vfnmadd132ss(xmmA, xmmB, xmmC);
- e->vfnmadd213pd(xmmA, xmmB, anyptr_gpC);
- e->vfnmadd213pd(xmmA, xmmB, xmmC);
- e->vfnmadd213pd(ymmA, ymmB, anyptr_gpC);
- e->vfnmadd213pd(ymmA, ymmB, ymmC);
- e->vfnmadd213ps(xmmA, xmmB, anyptr_gpC);
- e->vfnmadd213ps(xmmA, xmmB, xmmC);
- e->vfnmadd213ps(ymmA, ymmB, anyptr_gpC);
- e->vfnmadd213ps(ymmA, ymmB, ymmC);
- e->vfnmadd213sd(xmmA, xmmB, anyptr_gpC);
- e->vfnmadd213sd(xmmA, xmmB, xmmC);
- e->vfnmadd213ss(xmmA, xmmB, anyptr_gpC);
- e->vfnmadd213ss(xmmA, xmmB, xmmC);
- e->vfnmadd231pd(xmmA, xmmB, anyptr_gpC);
- e->vfnmadd231pd(xmmA, xmmB, xmmC);
- e->vfnmadd231pd(ymmA, ymmB, anyptr_gpC);
- e->vfnmadd231pd(ymmA, ymmB, ymmC);
- e->vfnmadd231ps(xmmA, xmmB, anyptr_gpC);
- e->vfnmadd231ps(xmmA, xmmB, xmmC);
- e->vfnmadd231ps(ymmA, ymmB, anyptr_gpC);
- e->vfnmadd231ps(ymmA, ymmB, ymmC);
- e->vfnmadd231sd(xmmA, xmmB, anyptr_gpC);
- e->vfnmadd231sd(xmmA, xmmB, xmmC);
- e->vfnmadd231ss(xmmA, xmmB, anyptr_gpC);
- e->vfnmadd231ss(xmmA, xmmB, xmmC);
- e->vfnmsub132pd(xmmA, xmmB, anyptr_gpC);
- e->vfnmsub132pd(xmmA, xmmB, xmmC);
- e->vfnmsub132pd(ymmA, ymmB, anyptr_gpC);
- e->vfnmsub132pd(ymmA, ymmB, ymmC);
- e->vfnmsub132ps(xmmA, xmmB, anyptr_gpC);
- e->vfnmsub132ps(xmmA, xmmB, xmmC);
- e->vfnmsub132ps(ymmA, ymmB, anyptr_gpC);
- e->vfnmsub132ps(ymmA, ymmB, ymmC);
- e->vfnmsub132sd(xmmA, xmmB, anyptr_gpC);
- e->vfnmsub132sd(xmmA, xmmB, xmmC);
- e->vfnmsub132ss(xmmA, xmmB, anyptr_gpC);
- e->vfnmsub132ss(xmmA, xmmB, xmmC);
- e->vfnmsub213pd(xmmA, xmmB, anyptr_gpC);
- e->vfnmsub213pd(xmmA, xmmB, xmmC);
- e->vfnmsub213pd(ymmA, ymmB, anyptr_gpC);
- e->vfnmsub213pd(ymmA, ymmB, ymmC);
- e->vfnmsub213ps(xmmA, xmmB, anyptr_gpC);
- e->vfnmsub213ps(xmmA, xmmB, xmmC);
- e->vfnmsub213ps(ymmA, ymmB, anyptr_gpC);
- e->vfnmsub213ps(ymmA, ymmB, ymmC);
- e->vfnmsub213sd(xmmA, xmmB, anyptr_gpC);
- e->vfnmsub213sd(xmmA, xmmB, xmmC);
- e->vfnmsub213ss(xmmA, xmmB, anyptr_gpC);
- e->vfnmsub213ss(xmmA, xmmB, xmmC);
- e->vfnmsub231pd(xmmA, xmmB, anyptr_gpC);
- e->vfnmsub231pd(xmmA, xmmB, xmmC);
- e->vfnmsub231pd(ymmA, ymmB, anyptr_gpC);
- e->vfnmsub231pd(ymmA, ymmB, ymmC);
- e->vfnmsub231ps(xmmA, xmmB, anyptr_gpC);
- e->vfnmsub231ps(xmmA, xmmB, xmmC);
- e->vfnmsub231ps(ymmA, ymmB, anyptr_gpC);
- e->vfnmsub231ps(ymmA, ymmB, ymmC);
- e->vfnmsub231sd(xmmA, xmmB, anyptr_gpC);
- e->vfnmsub231sd(xmmA, xmmB, xmmC);
- e->vfnmsub231ss(xmmA, xmmB, anyptr_gpC);
- e->vfnmsub231ss(xmmA, xmmB, xmmC);
-
- // FMA4.
- e->nop();
-
- e->vfmaddpd(xmmA, xmmB, xmmC, xmmD);
- e->vfmaddpd(xmmA, xmmB, anyptr_gpC, xmmD);
- e->vfmaddpd(xmmA, xmmB, xmmC, anyptr_gpD);
- e->vfmaddpd(ymmA, ymmB, ymmC, ymmD);
- e->vfmaddpd(ymmA, ymmB, anyptr_gpC, ymmD);
- e->vfmaddpd(ymmA, ymmB, ymmC, anyptr_gpD);
- e->vfmaddps(xmmA, xmmB, xmmC, xmmD);
- e->vfmaddps(xmmA, xmmB, anyptr_gpC, xmmD);
- e->vfmaddps(xmmA, xmmB, xmmC, anyptr_gpD);
- e->vfmaddps(ymmA, ymmB, ymmC, ymmD);
- e->vfmaddps(ymmA, ymmB, anyptr_gpC, ymmD);
- e->vfmaddps(ymmA, ymmB, ymmC, anyptr_gpD);
- e->vfmaddsd(xmmA, xmmB, xmmC, xmmD);
- e->vfmaddsd(xmmA, xmmB, anyptr_gpC, xmmD);
- e->vfmaddsd(xmmA, xmmB, xmmC, anyptr_gpD);
- e->vfmaddss(xmmA, xmmB, xmmC, xmmD);
- e->vfmaddss(xmmA, xmmB, anyptr_gpC, xmmD);
- e->vfmaddss(xmmA, xmmB, xmmC, anyptr_gpD);
- e->vfmaddsubpd(xmmA, xmmB, xmmC, xmmD);
- e->vfmaddsubpd(xmmA, xmmB, anyptr_gpC, xmmD);
- e->vfmaddsubpd(xmmA, xmmB, xmmC, anyptr_gpD);
- e->vfmaddsubpd(ymmA, ymmB, ymmC, ymmD);
- e->vfmaddsubpd(ymmA, ymmB, anyptr_gpC, ymmD);
- e->vfmaddsubpd(ymmA, ymmB, ymmC, anyptr_gpD);
- e->vfmaddsubps(xmmA, xmmB, xmmC, xmmD);
- e->vfmaddsubps(xmmA, xmmB, anyptr_gpC, xmmD);
- e->vfmaddsubps(xmmA, xmmB, xmmC, anyptr_gpD);
- e->vfmaddsubps(ymmA, ymmB, ymmC, ymmD);
- e->vfmaddsubps(ymmA, ymmB, anyptr_gpC, ymmD);
- e->vfmaddsubps(ymmA, ymmB, ymmC, anyptr_gpD);
- e->vfmsubaddpd(xmmA, xmmB, xmmC, xmmD);
- e->vfmsubaddpd(xmmA, xmmB, anyptr_gpC, xmmD);
- e->vfmsubaddpd(xmmA, xmmB, xmmC, anyptr_gpD);
- e->vfmsubaddpd(ymmA, ymmB, ymmC, ymmD);
- e->vfmsubaddpd(ymmA, ymmB, anyptr_gpC, ymmD);
- e->vfmsubaddpd(ymmA, ymmB, ymmC, anyptr_gpD);
- e->vfmsubaddps(xmmA, xmmB, xmmC, xmmD);
- e->vfmsubaddps(xmmA, xmmB, anyptr_gpC, xmmD);
- e->vfmsubaddps(xmmA, xmmB, xmmC, anyptr_gpD);
- e->vfmsubaddps(ymmA, ymmB, ymmC, ymmD);
- e->vfmsubaddps(ymmA, ymmB, anyptr_gpC, ymmD);
- e->vfmsubaddps(ymmA, ymmB, ymmC, anyptr_gpD);
- e->vfmsubpd(xmmA, xmmB, xmmC, xmmD);
- e->vfmsubpd(xmmA, xmmB, anyptr_gpC, xmmD);
- e->vfmsubpd(xmmA, xmmB, xmmC, anyptr_gpD);
- e->vfmsubpd(ymmA, ymmB, ymmC, ymmD);
- e->vfmsubpd(ymmA, ymmB, anyptr_gpC, ymmD);
- e->vfmsubpd(ymmA, ymmB, ymmC, anyptr_gpD);
- e->vfmsubps(xmmA, xmmB, xmmC, xmmD);
- e->vfmsubps(xmmA, xmmB, anyptr_gpC, xmmD);
- e->vfmsubps(xmmA, xmmB, xmmC, anyptr_gpD);
- e->vfmsubps(ymmA, ymmB, ymmC, ymmD);
- e->vfmsubps(ymmA, ymmB, anyptr_gpC, ymmD);
- e->vfmsubps(ymmA, ymmB, ymmC, anyptr_gpD);
- e->vfmsubsd(xmmA, xmmB, xmmC, xmmD);
- e->vfmsubsd(xmmA, xmmB, anyptr_gpC, xmmD);
- e->vfmsubsd(xmmA, xmmB, xmmC, anyptr_gpD);
- e->vfmsubss(xmmA, xmmB, xmmC, xmmD);
- e->vfmsubss(xmmA, xmmB, anyptr_gpC, xmmD);
- e->vfmsubss(xmmA, xmmB, xmmC, anyptr_gpD);
- e->vfnmaddpd(xmmA, xmmB, xmmC, xmmD);
- e->vfnmaddpd(xmmA, xmmB, anyptr_gpC, xmmD);
- e->vfnmaddpd(xmmA, xmmB, xmmC, anyptr_gpD);
- e->vfnmaddpd(ymmA, ymmB, ymmC, ymmD);
- e->vfnmaddpd(ymmA, ymmB, anyptr_gpC, ymmD);
- e->vfnmaddpd(ymmA, ymmB, ymmC, anyptr_gpD);
- e->vfnmaddps(xmmA, xmmB, xmmC, xmmD);
- e->vfnmaddps(xmmA, xmmB, anyptr_gpC, xmmD);
- e->vfnmaddps(xmmA, xmmB, xmmC, anyptr_gpD);
- e->vfnmaddps(ymmA, ymmB, ymmC, ymmD);
- e->vfnmaddps(ymmA, ymmB, anyptr_gpC, ymmD);
- e->vfnmaddps(ymmA, ymmB, ymmC, anyptr_gpD);
- e->vfnmaddsd(xmmA, xmmB, xmmC, xmmD);
- e->vfnmaddsd(xmmA, xmmB, anyptr_gpC, xmmD);
- e->vfnmaddsd(xmmA, xmmB, xmmC, anyptr_gpD);
- e->vfnmaddss(xmmA, xmmB, xmmC, xmmD);
- e->vfnmaddss(xmmA, xmmB, anyptr_gpC, xmmD);
- e->vfnmaddss(xmmA, xmmB, xmmC, anyptr_gpD);
- e->vfnmsubpd(xmmA, xmmB, xmmC, xmmD);
- e->vfnmsubpd(xmmA, xmmB, anyptr_gpC, xmmD);
- e->vfnmsubpd(xmmA, xmmB, xmmC, anyptr_gpD);
- e->vfnmsubpd(ymmA, ymmB, ymmC, ymmD);
- e->vfnmsubpd(ymmA, ymmB, anyptr_gpC, ymmD);
- e->vfnmsubpd(ymmA, ymmB, ymmC, anyptr_gpD);
- e->vfnmsubps(xmmA, xmmB, xmmC, xmmD);
- e->vfnmsubps(xmmA, xmmB, anyptr_gpC, xmmD);
- e->vfnmsubps(xmmA, xmmB, xmmC, anyptr_gpD);
- e->vfnmsubps(ymmA, ymmB, ymmC, ymmD);
- e->vfnmsubps(ymmA, ymmB, anyptr_gpC, ymmD);
- e->vfnmsubps(ymmA, ymmB, ymmC, anyptr_gpD);
- e->vfnmsubsd(xmmA, xmmB, xmmC, xmmD);
- e->vfnmsubsd(xmmA, xmmB, anyptr_gpC, xmmD);
- e->vfnmsubsd(xmmA, xmmB, xmmC, anyptr_gpD);
- e->vfnmsubss(xmmA, xmmB, xmmC, xmmD);
- e->vfnmsubss(xmmA, xmmB, anyptr_gpC, xmmD);
- e->vfnmsubss(xmmA, xmmB, xmmC, anyptr_gpD);
-
- // XOP.
- e->nop();
-
- e->vfrczpd(xmmA, xmmB);
- e->vfrczpd(xmmA, anyptr_gpB);
- e->vfrczpd(ymmA, ymmB);
- e->vfrczpd(ymmA, anyptr_gpB);
- e->vfrczps(xmmA, xmmB);
- e->vfrczps(xmmA, anyptr_gpB);
- e->vfrczps(ymmA, ymmB);
- e->vfrczps(ymmA, anyptr_gpB);
- e->vfrczsd(xmmA, xmmB);
- e->vfrczsd(xmmA, anyptr_gpB);
- e->vfrczss(xmmA, xmmB);
- e->vfrczss(xmmA, anyptr_gpB);
- e->vpcmov(xmmA, xmmB, xmmC, xmmD);
- e->vpcmov(xmmA, xmmB, anyptr_gpC, xmmD);
- e->vpcmov(xmmA, xmmB, xmmC, anyptr_gpD);
- e->vpcmov(ymmA, ymmB, ymmC, ymmD);
- e->vpcmov(ymmA, ymmB, anyptr_gpC, ymmD);
- e->vpcmov(ymmA, ymmB, ymmC, anyptr_gpD);
- e->vpcomb(xmmA, xmmB, xmmC, 0);
- e->vpcomb(xmmA, xmmB, anyptr_gpC, 0);
- e->vpcomd(xmmA, xmmB, xmmC, 0);
- e->vpcomd(xmmA, xmmB, anyptr_gpC, 0);
- e->vpcomq(xmmA, xmmB, xmmC, 0);
- e->vpcomq(xmmA, xmmB, anyptr_gpC, 0);
- e->vpcomw(xmmA, xmmB, xmmC, 0);
- e->vpcomw(xmmA, xmmB, anyptr_gpC, 0);
- e->vpcomub(xmmA, xmmB, xmmC, 0);
- e->vpcomub(xmmA, xmmB, anyptr_gpC, 0);
- e->vpcomud(xmmA, xmmB, xmmC, 0);
- e->vpcomud(xmmA, xmmB, anyptr_gpC, 0);
- e->vpcomuq(xmmA, xmmB, xmmC, 0);
- e->vpcomuq(xmmA, xmmB, anyptr_gpC, 0);
- e->vpcomuw(xmmA, xmmB, xmmC, 0);
- e->vpcomuw(xmmA, xmmB, anyptr_gpC, 0);
- e->vpermil2pd(xmmA, xmmB, xmmC, xmmD, 0);
- e->vpermil2pd(xmmA, xmmB, anyptr_gpC, xmmD, 0);
- e->vpermil2pd(xmmA, xmmB, xmmC, anyptr_gpD, 0);
- e->vpermil2pd(ymmA, ymmB, ymmC, ymmD, 0);
- e->vpermil2pd(ymmA, ymmB, anyptr_gpC, ymmD, 0);
- e->vpermil2pd(ymmA, ymmB, ymmC, anyptr_gpD, 0);
- e->vpermil2ps(xmmA, xmmB, xmmC, xmmD, 0);
- e->vpermil2ps(xmmA, xmmB, anyptr_gpC, xmmD, 0);
- e->vpermil2ps(xmmA, xmmB, xmmC, anyptr_gpD, 0);
- e->vpermil2ps(ymmA, ymmB, ymmC, ymmD, 0);
- e->vpermil2ps(ymmA, ymmB, anyptr_gpC, ymmD, 0);
- e->vpermil2ps(ymmA, ymmB, ymmC, anyptr_gpD, 0);
- e->vphaddbd(xmmA, xmmB);
- e->vphaddbd(xmmA, anyptr_gpB);
- e->vphaddbq(xmmA, xmmB);
- e->vphaddbq(xmmA, anyptr_gpB);
- e->vphaddbw(xmmA, xmmB);
- e->vphaddbw(xmmA, anyptr_gpB);
- e->vphadddq(xmmA, xmmB);
- e->vphadddq(xmmA, anyptr_gpB);
- e->vphaddwd(xmmA, xmmB);
- e->vphaddwd(xmmA, anyptr_gpB);
- e->vphaddwq(xmmA, xmmB);
- e->vphaddwq(xmmA, anyptr_gpB);
- e->vphaddubd(xmmA, xmmB);
- e->vphaddubd(xmmA, anyptr_gpB);
- e->vphaddubq(xmmA, xmmB);
- e->vphaddubq(xmmA, anyptr_gpB);
- e->vphaddubw(xmmA, xmmB);
- e->vphaddubw(xmmA, anyptr_gpB);
- e->vphaddudq(xmmA, xmmB);
- e->vphaddudq(xmmA, anyptr_gpB);
- e->vphadduwd(xmmA, xmmB);
- e->vphadduwd(xmmA, anyptr_gpB);
- e->vphadduwq(xmmA, xmmB);
- e->vphadduwq(xmmA, anyptr_gpB);
- e->vphsubbw(xmmA, xmmB);
- e->vphsubbw(xmmA, anyptr_gpB);
- e->vphsubdq(xmmA, xmmB);
- e->vphsubdq(xmmA, anyptr_gpB);
- e->vphsubwd(xmmA, xmmB);
- e->vphsubwd(xmmA, anyptr_gpB);
- e->vpmacsdd(xmmA, xmmB, xmmC, xmmD);
- e->vpmacsdd(xmmA, xmmB, anyptr_gpC, xmmD);
- e->vpmacsdqh(xmmA, xmmB, xmmC, xmmD);
- e->vpmacsdqh(xmmA, xmmB, anyptr_gpC, xmmD);
- e->vpmacsdql(xmmA, xmmB, xmmC, xmmD);
- e->vpmacsdql(xmmA, xmmB, anyptr_gpC, xmmD);
- e->vpmacswd(xmmA, xmmB, xmmC, xmmD);
- e->vpmacswd(xmmA, xmmB, anyptr_gpC, xmmD);
- e->vpmacsww(xmmA, xmmB, xmmC, xmmD);
- e->vpmacsww(xmmA, xmmB, anyptr_gpC, xmmD);
- e->vpmacssdd(xmmA, xmmB, xmmC, xmmD);
- e->vpmacssdd(xmmA, xmmB, anyptr_gpC, xmmD);
- e->vpmacssdqh(xmmA, xmmB, xmmC, xmmD);
- e->vpmacssdqh(xmmA, xmmB, anyptr_gpC, xmmD);
- e->vpmacssdql(xmmA, xmmB, xmmC, xmmD);
- e->vpmacssdql(xmmA, xmmB, anyptr_gpC, xmmD);
- e->vpmacsswd(xmmA, xmmB, xmmC, xmmD);
- e->vpmacsswd(xmmA, xmmB, anyptr_gpC, xmmD);
- e->vpmacssww(xmmA, xmmB, xmmC, xmmD);
- e->vpmacssww(xmmA, xmmB, anyptr_gpC, xmmD);
- e->vpmadcsswd(xmmA, xmmB, xmmC, xmmD);
- e->vpmadcsswd(xmmA, xmmB, anyptr_gpC, xmmD);
- e->vpmadcswd(xmmA, xmmB, xmmC, xmmD);
- e->vpmadcswd(xmmA, xmmB, anyptr_gpC, xmmD);
- e->vpperm(xmmA, xmmB, xmmC, xmmD);
- e->vpperm(xmmA, xmmB, anyptr_gpC, xmmD);
- e->vpperm(xmmA, xmmB, xmmC, anyptr_gpD);
- e->vprotb(xmmA, xmmB, xmmC);
- e->vprotb(xmmA, anyptr_gpB, xmmC);
- e->vprotb(xmmA, xmmB, anyptr_gpC);
- e->vprotb(xmmA, xmmB, 0);
- e->vprotb(xmmA, anyptr_gpB, 0);
- e->vprotd(xmmA, xmmB, xmmC);
- e->vprotd(xmmA, anyptr_gpB, xmmC);
- e->vprotd(xmmA, xmmB, anyptr_gpC);
- e->vprotd(xmmA, xmmB, 0);
- e->vprotd(xmmA, anyptr_gpB, 0);
- e->vprotq(xmmA, xmmB, xmmC);
- e->vprotq(xmmA, anyptr_gpB, xmmC);
- e->vprotq(xmmA, xmmB, anyptr_gpC);
- e->vprotq(xmmA, xmmB, 0);
- e->vprotq(xmmA, anyptr_gpB, 0);
- e->vprotw(xmmA, xmmB, xmmC);
- e->vprotw(xmmA, anyptr_gpB, xmmC);
- e->vprotw(xmmA, xmmB, anyptr_gpC);
- e->vprotw(xmmA, xmmB, 0);
- e->vprotw(xmmA, anyptr_gpB, 0);
- e->vpshab(xmmA, xmmB, xmmC);
- e->vpshab(xmmA, anyptr_gpB, xmmC);
- e->vpshab(xmmA, xmmB, anyptr_gpC);
- e->vpshad(xmmA, xmmB, xmmC);
- e->vpshad(xmmA, anyptr_gpB, xmmC);
- e->vpshad(xmmA, xmmB, anyptr_gpC);
- e->vpshaq(xmmA, xmmB, xmmC);
- e->vpshaq(xmmA, anyptr_gpB, xmmC);
- e->vpshaq(xmmA, xmmB, anyptr_gpC);
- e->vpshaw(xmmA, xmmB, xmmC);
- e->vpshaw(xmmA, anyptr_gpB, xmmC);
- e->vpshaw(xmmA, xmmB, anyptr_gpC);
- e->vpshlb(xmmA, xmmB, xmmC);
- e->vpshlb(xmmA, anyptr_gpB, xmmC);
- e->vpshlb(xmmA, xmmB, anyptr_gpC);
- e->vpshld(xmmA, xmmB, xmmC);
- e->vpshld(xmmA, anyptr_gpB, xmmC);
- e->vpshld(xmmA, xmmB, anyptr_gpC);
- e->vpshlq(xmmA, xmmB, xmmC);
- e->vpshlq(xmmA, anyptr_gpB, xmmC);
- e->vpshlq(xmmA, xmmB, anyptr_gpC);
- e->vpshlw(xmmA, xmmB, xmmC);
- e->vpshlw(xmmA, anyptr_gpB, xmmC);
- e->vpshlw(xmmA, xmmB, anyptr_gpC);
-
- // F16C.
- e->nop();
-
- e->vcvtph2ps(xmmA, xmmB);
- e->vcvtph2ps(xmmA, anyptr_gpB);
- e->vcvtph2ps(ymmA, xmmB);
- e->vcvtph2ps(ymmA, anyptr_gpB);
- e->vcvtps2ph(xmmA, xmmB, 0);
- e->vcvtps2ph(anyptr_gpA, xmmB, 0);
- e->vcvtps2ph(xmmA, ymmB, 0);
- e->vcvtps2ph(anyptr_gpA, ymmB, 0);
-
- // AVX512.
- e->nop();
-
- e->kaddb(kA, kB, kC);
- e->kaddd(kA, kB, kC);
- e->kaddq(kA, kB, kC);
- e->kaddw(kA, kB, kC);
- e->kandb(kA, kB, kC);
- e->kandd(kA, kB, kC);
- e->kandnb(kA, kB, kC);
- e->kandnd(kA, kB, kC);
- e->kandnq(kA, kB, kC);
- e->kandnw(kA, kB, kC);
- e->kandq(kA, kB, kC);
- e->kandw(kA, kB, kC);
- e->kmovb(kA, kB);
- e->kmovb(kA, anyptr_gpB);
- e->kmovb(kA, gdB);
- if (isX64) e->kmovb(kA, gzB);
- e->kmovb(anyptr_gpA, kB);
- e->kmovb(gdA, kB);
- if (isX64) e->kmovb(gzA, kB);
- e->kmovd(kA, kB);
- e->kmovd(kA, anyptr_gpB);
- e->kmovd(kA, gdB);
- if (isX64) e->kmovd(kA, gzB);
- e->kmovd(anyptr_gpA, kB);
- e->kmovd(gdA, kB);
- if (isX64) e->kmovd(gzA, kB);
- e->kmovq(kA, kB);
- e->kmovq(kA, anyptr_gpB);
- if (isX64) e->kmovq(kA, gzB);
- e->kmovq(anyptr_gpA, kB);
- if (isX64) e->kmovq(gzA, kB);
- e->kmovw(kA, kB);
- e->kmovw(kA, anyptr_gpB);
- e->kmovw(kA, gdB);
- if (isX64) e->kmovw(kA, gzB);
- e->kmovw(anyptr_gpA, kB);
- e->kmovw(gdA, kB);
- if (isX64) e->kmovw(gzA, kB);
- e->knotb(kA, kB);
- e->knotd(kA, kB);
- e->knotq(kA, kB);
- e->knotw(kA, kB);
- e->korb(kA, kB, kC);
- e->kord(kA, kB, kC);
- e->korq(kA, kB, kC);
- e->kortestb(kA, kB);
- e->kortestd(kA, kB);
- e->kortestq(kA, kB);
- e->kortestw(kA, kB);
- e->korw(kA, kB, kC);
- e->kshiftlb(kA, kB, 0);
- e->kshiftld(kA, kB, 0);
- e->kshiftlq(kA, kB, 0);
- e->kshiftlw(kA, kB, 0);
- e->kshiftrb(kA, kB, 0);
- e->kshiftrd(kA, kB, 0);
- e->kshiftrq(kA, kB, 0);
- e->kshiftrw(kA, kB, 0);
- e->ktestb(kA, kB);
- e->ktestd(kA, kB);
- e->ktestq(kA, kB);
- e->ktestw(kA, kB);
- e->kunpckbw(kA, kB, kC);
- e->kunpckdq(kA, kB, kC);
- e->kunpckwd(kA, kB, kC);
- e->kxnorb(kA, kB, kC);
- e->kxnord(kA, kB, kC);
- e->kxnorq(kA, kB, kC);
- e->kxnorw(kA, kB, kC);
- e->kxorb(kA, kB, kC);
- e->kxord(kA, kB, kC);
- e->kxorq(kA, kB, kC);
- e->kxorw(kA, kB, kC);
- e->nop();
-
- e->vaddpd(xmmA, xmmB, xmmC);
- e->vaddpd(xmmA, xmmB, anyptr_gpC);
- e->vaddpd(ymmA, ymmB, ymmC);
- e->vaddpd(ymmA, ymmB, anyptr_gpC);
- e->vaddpd(zmmA, zmmB, zmmC);
- e->vaddpd(zmmA, zmmB, anyptr_gpC);
- e->vaddps(xmmA, xmmB, xmmC);
- e->vaddps(xmmA, xmmB, anyptr_gpC);
- e->vaddps(ymmA, ymmB, ymmC);
- e->vaddps(ymmA, ymmB, anyptr_gpC);
- e->vaddps(zmmA, zmmB, zmmC);
- e->vaddps(zmmA, zmmB, anyptr_gpC);
- e->vaddsd(xmmA, xmmB, xmmC);
- e->vaddsd(xmmA, xmmB, anyptr_gpC);
- e->vaddss(xmmA, xmmB, xmmC);
- e->vaddss(xmmA, xmmB, anyptr_gpC);
- e->valignd(xmmA, xmmB, xmmC, 0);
- e->valignd(xmmA, xmmB, anyptr_gpC, 0);
- e->valignd(ymmA, ymmB, ymmC, 0);
- e->valignd(ymmA, ymmB, anyptr_gpC, 0);
- e->valignd(zmmA, zmmB, zmmC, 0);
- e->valignd(zmmA, zmmB, anyptr_gpC, 0);
- e->valignq(xmmA, xmmB, xmmC, 0);
- e->valignq(xmmA, xmmB, anyptr_gpC, 0);
- e->valignq(ymmA, ymmB, ymmC, 0);
- e->valignq(ymmA, ymmB, anyptr_gpC, 0);
- e->valignq(zmmA, zmmB, zmmC, 0);
- e->valignq(zmmA, zmmB, anyptr_gpC, 0);
- e->vandnpd(xmmA, xmmB, xmmC);
- e->vandnpd(xmmA, xmmB, anyptr_gpC);
- e->vandnpd(ymmA, ymmB, ymmC);
- e->vandnpd(ymmA, ymmB, anyptr_gpC);
- e->vandnpd(zmmA, zmmB, zmmC);
- e->vandnpd(zmmA, zmmB, anyptr_gpC);
- e->vandnps(xmmA, xmmB, xmmC);
- e->vandnps(xmmA, xmmB, anyptr_gpC);
- e->vandnps(ymmA, ymmB, ymmC);
- e->vandnps(ymmA, ymmB, anyptr_gpC);
- e->vandnps(zmmA, zmmB, zmmC);
- e->vandnps(zmmA, zmmB, anyptr_gpC);
- e->vandpd(xmmA, xmmB, xmmC);
- e->vandpd(xmmA, xmmB, anyptr_gpC);
- e->vandpd(ymmA, ymmB, ymmC);
- e->vandpd(ymmA, ymmB, anyptr_gpC);
- e->vandpd(zmmA, zmmB, zmmC);
- e->vandpd(zmmA, zmmB, anyptr_gpC);
- e->vandps(xmmA, xmmB, xmmC);
- e->vandps(xmmA, xmmB, anyptr_gpC);
- e->vandps(ymmA, ymmB, ymmC);
- e->vandps(ymmA, ymmB, anyptr_gpC);
- e->vandps(zmmA, zmmB, zmmC);
- e->vandps(zmmA, zmmB, anyptr_gpC);
- e->vblendmb(xmmA, xmmB, xmmC);
- e->vblendmb(xmmA, xmmB, anyptr_gpC);
- e->vblendmb(ymmA, ymmB, ymmC);
- e->vblendmb(ymmA, ymmB, anyptr_gpC);
- e->vblendmb(zmmA, zmmB, zmmC);
- e->vblendmb(zmmA, zmmB, anyptr_gpC);
- e->vblendmd(xmmA, xmmB, xmmC);
- e->vblendmd(xmmA, xmmB, anyptr_gpC);
- e->vblendmd(ymmA, ymmB, ymmC);
- e->vblendmd(ymmA, ymmB, anyptr_gpC);
- e->vblendmd(zmmA, zmmB, zmmC);
- e->vblendmd(zmmA, zmmB, anyptr_gpC);
- e->vblendmpd(xmmA, xmmB, xmmC);
- e->vblendmpd(xmmA, xmmB, anyptr_gpC);
- e->vblendmpd(ymmA, ymmB, ymmC);
- e->vblendmpd(ymmA, ymmB, anyptr_gpC);
- e->vblendmpd(zmmA, zmmB, zmmC);
- e->vblendmpd(zmmA, zmmB, anyptr_gpC);
- e->vblendmps(xmmA, xmmB, xmmC);
- e->vblendmps(xmmA, xmmB, anyptr_gpC);
- e->vblendmps(ymmA, ymmB, ymmC);
- e->vblendmps(ymmA, ymmB, anyptr_gpC);
- e->vblendmps(zmmA, zmmB, zmmC);
- e->vblendmps(zmmA, zmmB, anyptr_gpC);
- e->vblendmq(xmmA, xmmB, xmmC);
- e->vblendmq(xmmA, xmmB, anyptr_gpC);
- e->vblendmq(ymmA, ymmB, ymmC);
- e->vblendmq(ymmA, ymmB, anyptr_gpC);
- e->vblendmq(zmmA, zmmB, zmmC);
- e->vblendmq(zmmA, zmmB, anyptr_gpC);
- e->vblendmw(xmmA, xmmB, xmmC);
- e->vblendmw(xmmA, xmmB, anyptr_gpC);
- e->vblendmw(ymmA, ymmB, ymmC);
- e->vblendmw(ymmA, ymmB, anyptr_gpC);
- e->vblendmw(zmmA, zmmB, zmmC);
- e->vblendmw(zmmA, zmmB, anyptr_gpC);
- e->vbroadcastf32x2(ymmA, xmmB);
- e->vbroadcastf32x2(ymmA, anyptr_gpB);
- e->vbroadcastf32x2(zmmA, xmmB);
- e->vbroadcastf32x2(zmmA, anyptr_gpB);
- e->vbroadcastf32x4(ymmA, anyptr_gpB);
- e->vbroadcastf32x4(zmmA, anyptr_gpB);
- e->vbroadcastf32x8(zmmA, anyptr_gpB);
- e->vbroadcastf64x2(ymmA, anyptr_gpB);
- e->vbroadcastf64x2(zmmA, anyptr_gpB);
- e->vbroadcastf64x4(zmmA, anyptr_gpB);
- e->vbroadcasti32x2(xmmA, xmmB);
- e->vbroadcasti32x2(xmmA, anyptr_gpB);
- e->vbroadcasti32x2(ymmA, xmmB);
- e->vbroadcasti32x2(ymmA, anyptr_gpB);
- e->vbroadcasti32x2(zmmA, xmmB);
- e->vbroadcasti32x2(zmmA, anyptr_gpB);
- e->vbroadcasti32x4(ymmA, anyptr_gpB);
- e->vbroadcasti32x4(zmmA, anyptr_gpB);
- e->vbroadcasti32x8(zmmA, anyptr_gpB);
- e->vbroadcasti64x2(ymmA, anyptr_gpB);
- e->vbroadcasti64x2(zmmA, anyptr_gpB);
- e->vbroadcasti64x4(zmmA, anyptr_gpB);
- e->vbroadcastsd(ymmA, xmmB);
- e->vbroadcastsd(ymmA, anyptr_gpB);
- e->vbroadcastsd(zmmA, xmmB);
- e->vbroadcastsd(zmmA, anyptr_gpB);
- e->vbroadcastss(xmmA, xmmB);
- e->vbroadcastss(xmmA, anyptr_gpB);
- e->vbroadcastss(ymmA, xmmB);
- e->vbroadcastss(ymmA, anyptr_gpB);
- e->vbroadcastss(zmmA, xmmB);
- e->vbroadcastss(zmmA, anyptr_gpB);
- e->vcmppd(kA, xmmB, xmmC, 0);
- e->vcmppd(kA, xmmB, anyptr_gpC, 0);
- e->vcmppd(kA, ymmB, ymmC, 0);
- e->vcmppd(kA, ymmB, anyptr_gpC, 0);
- e->vcmppd(kA, zmmB, zmmC, 0);
- e->vcmppd(kA, zmmB, anyptr_gpC, 0);
- e->vcmpps(kA, xmmB, xmmC, 0);
- e->vcmpps(kA, xmmB, anyptr_gpC, 0);
- e->vcmpps(kA, ymmB, ymmC, 0);
- e->vcmpps(kA, ymmB, anyptr_gpC, 0);
- e->vcmpps(kA, zmmB, zmmC, 0);
- e->vcmpps(kA, zmmB, anyptr_gpC, 0);
- e->vcmpsd(kA, xmmB, xmmC, 0);
- e->vcmpsd(kA, xmmB, anyptr_gpC, 0);
- e->vcmpss(kA, xmmB, xmmC, 0);
- e->vcmpss(kA, xmmB, anyptr_gpC, 0);
- e->vcomisd(xmmA, xmmB);
- e->vcomisd(xmmA, anyptr_gpB);
- e->vcomiss(xmmA, xmmB);
- e->vcomiss(xmmA, anyptr_gpB);
- e->vcompresspd(xmmA, xmmB);
- e->vcompresspd(anyptr_gpA, xmmB);
- e->vcompresspd(ymmA, ymmB);
- e->vcompresspd(anyptr_gpA, ymmB);
- e->vcompresspd(zmmA, zmmB);
- e->vcompresspd(anyptr_gpA, zmmB);
- e->vcompressps(xmmA, xmmB);
- e->vcompressps(anyptr_gpA, xmmB);
- e->vcompressps(ymmA, ymmB);
- e->vcompressps(anyptr_gpA, ymmB);
- e->vcompressps(zmmA, zmmB);
- e->vcompressps(anyptr_gpA, zmmB);
- e->vcvtdq2pd(xmmA, xmmB);
- e->vcvtdq2pd(xmmA, anyptr_gpB);
- e->vcvtdq2pd(ymmA, xmmB);
- e->vcvtdq2pd(ymmA, anyptr_gpB);
- e->vcvtdq2pd(zmmA, ymmB);
- e->vcvtdq2pd(zmmA, anyptr_gpB);
- e->vcvtdq2ps(xmmA, xmmB);
- e->vcvtdq2ps(xmmA, anyptr_gpB);
- e->vcvtdq2ps(ymmA, ymmB);
- e->vcvtdq2ps(ymmA, anyptr_gpB);
- e->vcvtdq2ps(zmmA, zmmB);
- e->vcvtdq2ps(zmmA, anyptr_gpB);
- e->vcvtpd2dq(xmmA, xmmB);
- e->vcvtpd2dq(xmmA, anyptr_gpB);
- e->vcvtpd2dq(xmmA, ymmB);
- e->vcvtpd2dq(xmmA, anyptr_gpB);
- e->vcvtpd2dq(ymmA, zmmB);
- e->vcvtpd2dq(ymmA, anyptr_gpB);
- e->vcvtpd2qq(xmmA, xmmB);
- e->vcvtpd2qq(xmmA, anyptr_gpB);
- e->vcvtpd2qq(ymmA, ymmB);
- e->vcvtpd2qq(ymmA, anyptr_gpB);
- e->vcvtpd2qq(zmmA, zmmB);
- e->vcvtpd2qq(zmmA, anyptr_gpB);
- e->vcvtpd2udq(xmmA, xmmB);
- e->vcvtpd2udq(xmmA, anyptr_gpB);
- e->vcvtpd2udq(xmmA, ymmB);
- e->vcvtpd2udq(xmmA, anyptr_gpB);
- e->vcvtpd2udq(ymmA, zmmB);
- e->vcvtpd2udq(ymmA, anyptr_gpB);
- e->vcvtpd2uqq(xmmA, xmmB);
- e->vcvtpd2uqq(xmmA, anyptr_gpB);
- e->vcvtpd2uqq(ymmA, ymmB);
- e->vcvtpd2uqq(ymmA, anyptr_gpB);
- e->vcvtpd2uqq(zmmA, zmmB);
- e->vcvtpd2uqq(zmmA, anyptr_gpB);
- e->vcvtph2ps(xmmA, xmmB);
- e->vcvtph2ps(xmmA, anyptr_gpB);
- e->vcvtph2ps(ymmA, xmmB);
- e->vcvtph2ps(ymmA, anyptr_gpB);
- e->vcvtph2ps(zmmA, ymmB);
- e->vcvtph2ps(zmmA, anyptr_gpB);
- e->vcvtps2dq(xmmA, xmmB);
- e->vcvtps2dq(xmmA, anyptr_gpB);
- e->vcvtps2dq(ymmA, ymmB);
- e->vcvtps2dq(ymmA, anyptr_gpB);
- e->vcvtps2dq(zmmA, zmmB);
- e->vcvtps2dq(zmmA, anyptr_gpB);
- e->vcvtps2pd(xmmA, xmmB);
- e->vcvtps2pd(xmmA, anyptr_gpB);
- e->vcvtps2pd(ymmA, xmmB);
- e->vcvtps2pd(ymmA, anyptr_gpB);
- e->vcvtps2pd(zmmA, ymmB);
- e->vcvtps2pd(zmmA, anyptr_gpB);
- e->vcvtps2ph(xmmA, xmmB, 0);
- e->vcvtps2ph(anyptr_gpA, xmmB, 0);
- e->vcvtps2ph(xmmA, ymmB, 0);
- e->vcvtps2ph(anyptr_gpA, ymmB, 0);
- e->vcvtps2ph(ymmA, zmmB, 0);
- e->vcvtps2ph(anyptr_gpA, zmmB, 0);
- e->vcvtps2qq(xmmA, xmmB);
- e->vcvtps2qq(xmmA, anyptr_gpB);
- e->vcvtps2qq(ymmA, xmmB);
- e->vcvtps2qq(ymmA, anyptr_gpB);
- e->vcvtps2qq(zmmA, ymmB);
- e->vcvtps2qq(zmmA, anyptr_gpB);
- e->vcvtps2udq(xmmA, xmmB);
- e->vcvtps2udq(xmmA, anyptr_gpB);
- e->vcvtps2udq(ymmA, ymmB);
- e->vcvtps2udq(ymmA, anyptr_gpB);
- e->vcvtps2udq(zmmA, zmmB);
- e->vcvtps2udq(zmmA, anyptr_gpB);
- e->vcvtps2uqq(xmmA, xmmB);
- e->vcvtps2uqq(xmmA, anyptr_gpB);
- e->vcvtps2uqq(ymmA, xmmB);
- e->vcvtps2uqq(ymmA, anyptr_gpB);
- e->vcvtps2uqq(zmmA, ymmB);
- e->vcvtps2uqq(zmmA, anyptr_gpB);
- e->vcvtqq2pd(xmmA, xmmB);
- e->vcvtqq2pd(xmmA, anyptr_gpB);
- e->vcvtqq2pd(ymmA, ymmB);
- e->vcvtqq2pd(ymmA, anyptr_gpB);
- e->vcvtqq2pd(zmmA, zmmB);
- e->vcvtqq2pd(zmmA, anyptr_gpB);
- e->vcvtqq2ps(xmmA, xmmB);
- e->vcvtqq2ps(xmmA, anyptr_gpB);
- e->vcvtqq2ps(xmmA, ymmB);
- e->vcvtqq2ps(xmmA, anyptr_gpB);
- e->vcvtqq2ps(ymmA, zmmB);
- e->vcvtqq2ps(ymmA, anyptr_gpB);
- e->vcvtsd2si(gdA, xmmB);
- e->vcvtsd2si(gdA, anyptr_gpB);
- if (isX64) e->vcvtsd2si(gzA, xmmB);
- if (isX64) e->vcvtsd2si(gzA, anyptr_gpB);
- e->vcvtsd2ss(xmmA, xmmB, xmmC);
- e->vcvtsd2ss(xmmA, xmmB, anyptr_gpC);
- e->vcvtsd2usi(gdA, xmmB);
- e->vcvtsd2usi(gdA, anyptr_gpB);
- if (isX64) e->vcvtsd2usi(gzA, xmmB);
- if (isX64) e->vcvtsd2usi(gzA, anyptr_gpB);
- e->vcvtsi2sd(xmmA, xmmB, gdC);
- e->vcvtsi2sd(xmmA, xmmB, dword_ptr(gzC));
- if (isX64) e->vcvtsi2sd(xmmA, xmmB, gzC);
- if (isX64) e->vcvtsi2sd(xmmA, xmmB, qword_ptr(gzC));
- e->vcvtsi2ss(xmmA, xmmB, gdC);
- e->vcvtsi2ss(xmmA, xmmB, dword_ptr(gzC));
- if (isX64) e->vcvtsi2ss(xmmA, xmmB, gzC);
- if (isX64) e->vcvtsi2ss(xmmA, xmmB, qword_ptr(gzC));
- e->vcvtss2sd(xmmA, xmmB, xmmC);
- e->vcvtss2sd(xmmA, xmmB, anyptr_gpC);
- e->vcvtss2si(gdA, xmmB);
- e->vcvtss2si(gdA, anyptr_gpB);
- if (isX64) e->vcvtss2si(gzA, xmmB);
- if (isX64) e->vcvtss2si(gzA, anyptr_gpB);
- e->vcvtss2usi(gdA, xmmB);
- e->vcvtss2usi(gdA, anyptr_gpB);
- if (isX64) e->vcvtss2usi(gzA, xmmB);
- if (isX64) e->vcvtss2usi(gzA, anyptr_gpB);
- e->vcvttpd2dq(xmmA, xmmB);
- e->vcvttpd2dq(xmmA, anyptr_gpB);
- e->vcvttpd2dq(xmmA, ymmB);
- e->vcvttpd2dq(xmmA, anyptr_gpB);
- e->vcvttpd2dq(ymmA, zmmB);
- e->vcvttpd2dq(ymmA, anyptr_gpB);
- e->vcvttpd2qq(xmmA, xmmB);
- e->vcvttpd2qq(xmmA, anyptr_gpB);
- e->vcvttpd2qq(ymmA, ymmB);
- e->vcvttpd2qq(ymmA, anyptr_gpB);
- e->vcvttpd2qq(zmmA, zmmB);
- e->vcvttpd2qq(zmmA, anyptr_gpB);
- e->vcvttpd2udq(xmmA, xmmB);
- e->vcvttpd2udq(xmmA, anyptr_gpB);
- e->vcvttpd2udq(xmmA, ymmB);
- e->vcvttpd2udq(xmmA, anyptr_gpB);
- e->vcvttpd2udq(ymmA, zmmB);
- e->vcvttpd2udq(ymmA, anyptr_gpB);
- e->vcvttpd2uqq(xmmA, xmmB);
- e->vcvttpd2uqq(xmmA, anyptr_gpB);
- e->vcvttpd2uqq(ymmA, ymmB);
- e->vcvttpd2uqq(ymmA, anyptr_gpB);
- e->vcvttpd2uqq(zmmA, zmmB);
- e->vcvttpd2uqq(zmmA, anyptr_gpB);
- e->vcvttps2dq(xmmA, xmmB);
- e->vcvttps2dq(xmmA, anyptr_gpB);
- e->vcvttps2dq(ymmA, ymmB);
- e->vcvttps2dq(ymmA, anyptr_gpB);
- e->vcvttps2dq(zmmA, zmmB);
- e->vcvttps2dq(zmmA, anyptr_gpB);
- e->vcvttps2qq(xmmA, xmmB);
- e->vcvttps2qq(xmmA, anyptr_gpB);
- e->vcvttps2qq(ymmA, xmmB);
- e->vcvttps2qq(ymmA, anyptr_gpB);
- e->vcvttps2qq(zmmA, ymmB);
- e->vcvttps2qq(zmmA, anyptr_gpB);
- e->vcvttps2udq(xmmA, xmmB);
- e->vcvttps2udq(xmmA, anyptr_gpB);
- e->vcvttps2udq(ymmA, ymmB);
- e->vcvttps2udq(ymmA, anyptr_gpB);
- e->vcvttps2udq(zmmA, zmmB);
- e->vcvttps2udq(zmmA, anyptr_gpB);
- e->vcvttps2uqq(xmmA, xmmB);
- e->vcvttps2uqq(xmmA, anyptr_gpB);
- e->vcvttps2uqq(ymmA, xmmB);
- e->vcvttps2uqq(ymmA, anyptr_gpB);
- e->vcvttps2uqq(zmmA, ymmB);
- e->vcvttps2uqq(zmmA, anyptr_gpB);
- e->vcvttsd2si(gdA, xmmB);
- e->vcvttsd2si(gdA, anyptr_gpB);
- if (isX64) e->vcvttsd2si(gzA, xmmB);
- if (isX64) e->vcvttsd2si(gzA, anyptr_gpB);
- e->vcvttsd2usi(gdA, xmmB);
- e->vcvttsd2usi(gdA, anyptr_gpB);
- if (isX64) e->vcvttsd2usi(gzA, xmmB);
- if (isX64) e->vcvttsd2usi(gzA, anyptr_gpB);
- e->vcvttss2si(gdA, xmmB);
- e->vcvttss2si(gdA, anyptr_gpB);
- if (isX64) e->vcvttss2si(gzA, xmmB);
- if (isX64) e->vcvttss2si(gzA, anyptr_gpB);
- e->vcvttss2usi(gdA, xmmB);
- e->vcvttss2usi(gdA, anyptr_gpB);
- if (isX64) e->vcvttss2usi(gzA, xmmB);
- if (isX64) e->vcvttss2usi(gzA, anyptr_gpB);
- e->vcvtudq2pd(xmmA, xmmB);
- e->vcvtudq2pd(xmmA, anyptr_gpB);
- e->vcvtudq2pd(ymmA, xmmB);
- e->vcvtudq2pd(ymmA, anyptr_gpB);
- e->vcvtudq2pd(zmmA, ymmB);
- e->vcvtudq2pd(zmmA, anyptr_gpB);
- e->vcvtudq2ps(xmmA, xmmB);
- e->vcvtudq2ps(xmmA, anyptr_gpB);
- e->vcvtudq2ps(ymmA, ymmB);
- e->vcvtudq2ps(ymmA, anyptr_gpB);
- e->vcvtudq2ps(zmmA, zmmB);
- e->vcvtudq2ps(zmmA, anyptr_gpB);
- e->vcvtuqq2pd(xmmA, xmmB);
- e->vcvtuqq2pd(xmmA, anyptr_gpB);
- e->vcvtuqq2pd(ymmA, ymmB);
- e->vcvtuqq2pd(ymmA, anyptr_gpB);
- e->vcvtuqq2pd(zmmA, zmmB);
- e->vcvtuqq2pd(zmmA, anyptr_gpB);
- e->vcvtuqq2ps(xmmA, xmmB);
- e->vcvtuqq2ps(xmmA, anyptr_gpB);
- e->vcvtuqq2ps(xmmA, ymmB);
- e->vcvtuqq2ps(xmmA, anyptr_gpB);
- e->vcvtuqq2ps(ymmA, zmmB);
- e->vcvtuqq2ps(ymmA, anyptr_gpB);
- e->vcvtusi2sd(xmmA, xmmB, gdC);
- e->vcvtusi2sd(xmmA, xmmB, dword_ptr(gzC));
- if (isX64) e->vcvtusi2sd(xmmA, xmmB, gzC);
- if (isX64) e->vcvtusi2sd(xmmA, xmmB, qword_ptr(gzC));
- e->vcvtusi2ss(xmmA, xmmB, gdC);
- e->vcvtusi2ss(xmmA, xmmB, dword_ptr(gzC));
- if (isX64) e->vcvtusi2ss(xmmA, xmmB, gzC);
- if (isX64) e->vcvtusi2ss(xmmA, xmmB, qword_ptr(gzC));
- e->vdbpsadbw(xmmA, xmmB, xmmC, 0);
- e->vdbpsadbw(xmmA, xmmB, anyptr_gpC, 0);
- e->vdbpsadbw(ymmA, ymmB, ymmC, 0);
- e->vdbpsadbw(ymmA, ymmB, anyptr_gpC, 0);
- e->vdbpsadbw(zmmA, zmmB, zmmC, 0);
- e->vdbpsadbw(zmmA, zmmB, anyptr_gpC, 0);
- e->vdivpd(xmmA, xmmB, xmmC);
- e->vdivpd(xmmA, xmmB, anyptr_gpC);
- e->vdivpd(ymmA, ymmB, ymmC);
- e->vdivpd(ymmA, ymmB, anyptr_gpC);
- e->vdivpd(zmmA, zmmB, zmmC);
- e->vdivpd(zmmA, zmmB, anyptr_gpC);
- e->vdivps(xmmA, xmmB, xmmC);
- e->vdivps(xmmA, xmmB, anyptr_gpC);
- e->vdivps(ymmA, ymmB, ymmC);
- e->vdivps(ymmA, ymmB, anyptr_gpC);
- e->vdivps(zmmA, zmmB, zmmC);
- e->vdivps(zmmA, zmmB, anyptr_gpC);
- e->vdivsd(xmmA, xmmB, xmmC);
- e->vdivsd(xmmA, xmmB, anyptr_gpC);
- e->vdivss(xmmA, xmmB, xmmC);
- e->vdivss(xmmA, xmmB, anyptr_gpC);
- e->vexp2pd(zmmA, zmmB);
- e->vexp2pd(zmmA, anyptr_gpB);
- e->vexp2ps(zmmA, zmmB);
- e->vexp2ps(zmmA, anyptr_gpB);
- e->vexpandpd(xmmA, xmmB);
- e->vexpandpd(xmmA, anyptr_gpB);
- e->vexpandpd(ymmA, ymmB);
- e->vexpandpd(ymmA, anyptr_gpB);
- e->vexpandpd(zmmA, zmmB);
- e->vexpandpd(zmmA, anyptr_gpB);
- e->vexpandps(xmmA, xmmB);
- e->vexpandps(xmmA, anyptr_gpB);
- e->vexpandps(ymmA, ymmB);
- e->vexpandps(ymmA, anyptr_gpB);
- e->vexpandps(zmmA, zmmB);
- e->vexpandps(zmmA, anyptr_gpB);
- e->vextractf32x4(xmmA, ymmB, 0);
- e->vextractf32x4(anyptr_gpA, ymmB, 0);
- e->vextractf32x4(xmmA, zmmB, 0);
- e->vextractf32x4(anyptr_gpA, zmmB, 0);
- e->vextractf32x8(ymmA, zmmB, 0);
- e->vextractf32x8(anyptr_gpA, zmmB, 0);
- e->vextractf64x2(xmmA, ymmB, 0);
- e->vextractf64x2(anyptr_gpA, ymmB, 0);
- e->vextractf64x2(xmmA, zmmB, 0);
- e->vextractf64x2(anyptr_gpA, zmmB, 0);
- e->vextractf64x4(ymmA, zmmB, 0);
- e->vextractf64x4(anyptr_gpA, zmmB, 0);
- e->vextracti32x4(xmmA, ymmB, 0);
- e->vextracti32x4(anyptr_gpA, ymmB, 0);
- e->vextracti32x4(xmmA, zmmB, 0);
- e->vextracti32x4(anyptr_gpA, zmmB, 0);
- e->vextracti32x8(ymmA, zmmB, 0);
- e->vextracti32x8(anyptr_gpA, zmmB, 0);
- e->vextracti64x2(xmmA, ymmB, 0);
- e->vextracti64x2(anyptr_gpA, ymmB, 0);
- e->vextracti64x2(xmmA, zmmB, 0);
- e->vextracti64x2(anyptr_gpA, zmmB, 0);
- e->vextracti64x4(ymmA, zmmB, 0);
- e->vextracti64x4(anyptr_gpA, zmmB, 0);
- e->vextractps(gdA, xmmB, 0);
- e->vextractps(gzA, xmmB, 0);
- e->vextractps(anyptr_gpA, xmmB, 0);
- e->vfixupimmpd(xmmA, xmmB, xmmC, 0);
- e->vfixupimmpd(xmmA, xmmB, anyptr_gpC, 0);
- e->vfixupimmpd(ymmA, ymmB, ymmC, 0);
- e->vfixupimmpd(ymmA, ymmB, anyptr_gpC, 0);
- e->vfixupimmpd(zmmA, zmmB, zmmC, 0);
- e->vfixupimmpd(zmmA, zmmB, anyptr_gpC, 0);
- e->vfixupimmps(xmmA, xmmB, xmmC, 0);
- e->vfixupimmps(xmmA, xmmB, anyptr_gpC, 0);
- e->vfixupimmps(ymmA, ymmB, ymmC, 0);
- e->vfixupimmps(ymmA, ymmB, anyptr_gpC, 0);
- e->vfixupimmps(zmmA, zmmB, zmmC, 0);
- e->vfixupimmps(zmmA, zmmB, anyptr_gpC, 0);
- e->vfixupimmsd(xmmA, xmmB, xmmC, 0);
- e->vfixupimmsd(xmmA, xmmB, anyptr_gpC, 0);
- e->vfixupimmss(xmmA, xmmB, xmmC, 0);
- e->vfixupimmss(xmmA, xmmB, anyptr_gpC, 0);
- e->vfmadd132pd(xmmA, xmmB, xmmC);
- e->vfmadd132pd(xmmA, xmmB, anyptr_gpC);
- e->vfmadd132pd(ymmA, ymmB, ymmC);
- e->vfmadd132pd(ymmA, ymmB, anyptr_gpC);
- e->vfmadd132pd(zmmA, zmmB, zmmC);
- e->vfmadd132pd(zmmA, zmmB, anyptr_gpC);
- e->vfmadd132ps(xmmA, xmmB, xmmC);
- e->vfmadd132ps(xmmA, xmmB, anyptr_gpC);
- e->vfmadd132ps(ymmA, ymmB, ymmC);
- e->vfmadd132ps(ymmA, ymmB, anyptr_gpC);
- e->vfmadd132ps(zmmA, zmmB, zmmC);
- e->vfmadd132ps(zmmA, zmmB, anyptr_gpC);
- e->vfmadd132sd(xmmA, xmmB, xmmC);
- e->vfmadd132sd(xmmA, xmmB, anyptr_gpC);
- e->vfmadd132ss(xmmA, xmmB, xmmC);
- e->vfmadd132ss(xmmA, xmmB, anyptr_gpC);
- e->vfmadd213pd(xmmA, xmmB, xmmC);
- e->vfmadd213pd(xmmA, xmmB, anyptr_gpC);
- e->vfmadd213pd(ymmA, ymmB, ymmC);
- e->vfmadd213pd(ymmA, ymmB, anyptr_gpC);
- e->vfmadd213pd(zmmA, zmmB, zmmC);
- e->vfmadd213pd(zmmA, zmmB, anyptr_gpC);
- e->vfmadd213ps(xmmA, xmmB, xmmC);
- e->vfmadd213ps(xmmA, xmmB, anyptr_gpC);
- e->vfmadd213ps(ymmA, ymmB, ymmC);
- e->vfmadd213ps(ymmA, ymmB, anyptr_gpC);
- e->vfmadd213ps(zmmA, zmmB, zmmC);
- e->vfmadd213ps(zmmA, zmmB, anyptr_gpC);
- e->vfmadd213sd(xmmA, xmmB, xmmC);
- e->vfmadd213sd(xmmA, xmmB, anyptr_gpC);
- e->vfmadd213ss(xmmA, xmmB, xmmC);
- e->vfmadd213ss(xmmA, xmmB, anyptr_gpC);
- e->vfmadd231pd(xmmA, xmmB, xmmC);
- e->vfmadd231pd(xmmA, xmmB, anyptr_gpC);
- e->vfmadd231pd(ymmA, ymmB, ymmC);
- e->vfmadd231pd(ymmA, ymmB, anyptr_gpC);
- e->vfmadd231pd(zmmA, zmmB, zmmC);
- e->vfmadd231pd(zmmA, zmmB, anyptr_gpC);
- e->vfmadd231ps(xmmA, xmmB, xmmC);
- e->vfmadd231ps(xmmA, xmmB, anyptr_gpC);
- e->vfmadd231ps(ymmA, ymmB, ymmC);
- e->vfmadd231ps(ymmA, ymmB, anyptr_gpC);
- e->vfmadd231ps(zmmA, zmmB, zmmC);
- e->vfmadd231ps(zmmA, zmmB, anyptr_gpC);
- e->vfmadd231sd(xmmA, xmmB, xmmC);
- e->vfmadd231sd(xmmA, xmmB, anyptr_gpC);
- e->vfmadd231ss(xmmA, xmmB, xmmC);
- e->vfmadd231ss(xmmA, xmmB, anyptr_gpC);
- e->vfmaddsub132pd(xmmA, xmmB, xmmC);
- e->vfmaddsub132pd(xmmA, xmmB, anyptr_gpC);
- e->vfmaddsub132pd(ymmA, ymmB, ymmC);
- e->vfmaddsub132pd(ymmA, ymmB, anyptr_gpC);
- e->vfmaddsub132pd(zmmA, zmmB, zmmC);
- e->vfmaddsub132pd(zmmA, zmmB, anyptr_gpC);
- e->vfmaddsub132ps(xmmA, xmmB, xmmC);
- e->vfmaddsub132ps(xmmA, xmmB, anyptr_gpC);
- e->vfmaddsub132ps(ymmA, ymmB, ymmC);
- e->vfmaddsub132ps(ymmA, ymmB, anyptr_gpC);
- e->vfmaddsub132ps(zmmA, zmmB, zmmC);
- e->vfmaddsub132ps(zmmA, zmmB, anyptr_gpC);
- e->vfmaddsub213pd(xmmA, xmmB, xmmC);
- e->vfmaddsub213pd(xmmA, xmmB, anyptr_gpC);
- e->vfmaddsub213pd(ymmA, ymmB, ymmC);
- e->vfmaddsub213pd(ymmA, ymmB, anyptr_gpC);
- e->vfmaddsub213pd(zmmA, zmmB, zmmC);
- e->vfmaddsub213pd(zmmA, zmmB, anyptr_gpC);
- e->vfmaddsub213ps(xmmA, xmmB, xmmC);
- e->vfmaddsub213ps(xmmA, xmmB, anyptr_gpC);
- e->vfmaddsub213ps(ymmA, ymmB, ymmC);
- e->vfmaddsub213ps(ymmA, ymmB, anyptr_gpC);
- e->vfmaddsub213ps(zmmA, zmmB, zmmC);
- e->vfmaddsub213ps(zmmA, zmmB, anyptr_gpC);
- e->vfmaddsub231pd(xmmA, xmmB, xmmC);
- e->vfmaddsub231pd(xmmA, xmmB, anyptr_gpC);
- e->vfmaddsub231pd(ymmA, ymmB, ymmC);
- e->vfmaddsub231pd(ymmA, ymmB, anyptr_gpC);
- e->vfmaddsub231pd(zmmA, zmmB, zmmC);
- e->vfmaddsub231pd(zmmA, zmmB, anyptr_gpC);
- e->vfmaddsub231ps(xmmA, xmmB, xmmC);
- e->vfmaddsub231ps(xmmA, xmmB, anyptr_gpC);
- e->vfmaddsub231ps(ymmA, ymmB, ymmC);
- e->vfmaddsub231ps(ymmA, ymmB, anyptr_gpC);
- e->vfmaddsub231ps(zmmA, zmmB, zmmC);
- e->vfmaddsub231ps(zmmA, zmmB, anyptr_gpC);
- e->vfmsub132pd(xmmA, xmmB, xmmC);
- e->vfmsub132pd(xmmA, xmmB, anyptr_gpC);
- e->vfmsub132pd(ymmA, ymmB, ymmC);
- e->vfmsub132pd(ymmA, ymmB, anyptr_gpC);
- e->vfmsub132pd(zmmA, zmmB, zmmC);
- e->vfmsub132pd(zmmA, zmmB, anyptr_gpC);
- e->vfmsub132ps(xmmA, xmmB, xmmC);
- e->vfmsub132ps(xmmA, xmmB, anyptr_gpC);
- e->vfmsub132ps(ymmA, ymmB, ymmC);
- e->vfmsub132ps(ymmA, ymmB, anyptr_gpC);
- e->vfmsub132ps(zmmA, zmmB, zmmC);
- e->vfmsub132ps(zmmA, zmmB, anyptr_gpC);
- e->vfmsub132sd(xmmA, xmmB, xmmC);
- e->vfmsub132sd(xmmA, xmmB, anyptr_gpC);
- e->vfmsub132ss(xmmA, xmmB, xmmC);
- e->vfmsub132ss(xmmA, xmmB, anyptr_gpC);
- e->vfmsub213pd(xmmA, xmmB, xmmC);
- e->vfmsub213pd(xmmA, xmmB, anyptr_gpC);
- e->vfmsub213pd(ymmA, ymmB, ymmC);
- e->vfmsub213pd(ymmA, ymmB, anyptr_gpC);
- e->vfmsub213pd(zmmA, zmmB, zmmC);
- e->vfmsub213pd(zmmA, zmmB, anyptr_gpC);
- e->vfmsub213ps(xmmA, xmmB, xmmC);
- e->vfmsub213ps(xmmA, xmmB, anyptr_gpC);
- e->vfmsub213ps(ymmA, ymmB, ymmC);
- e->vfmsub213ps(ymmA, ymmB, anyptr_gpC);
- e->vfmsub213ps(zmmA, zmmB, zmmC);
- e->vfmsub213ps(zmmA, zmmB, anyptr_gpC);
- e->vfmsub213sd(xmmA, xmmB, xmmC);
- e->vfmsub213sd(xmmA, xmmB, anyptr_gpC);
- e->vfmsub213ss(xmmA, xmmB, xmmC);
- e->vfmsub213ss(xmmA, xmmB, anyptr_gpC);
- e->vfmsub231pd(xmmA, xmmB, xmmC);
- e->vfmsub231pd(xmmA, xmmB, anyptr_gpC);
- e->vfmsub231pd(ymmA, ymmB, ymmC);
- e->vfmsub231pd(ymmA, ymmB, anyptr_gpC);
- e->vfmsub231pd(zmmA, zmmB, zmmC);
- e->vfmsub231pd(zmmA, zmmB, anyptr_gpC);
- e->vfmsub231ps(xmmA, xmmB, xmmC);
- e->vfmsub231ps(xmmA, xmmB, anyptr_gpC);
- e->vfmsub231ps(ymmA, ymmB, ymmC);
- e->vfmsub231ps(ymmA, ymmB, anyptr_gpC);
- e->vfmsub231ps(zmmA, zmmB, zmmC);
- e->vfmsub231ps(zmmA, zmmB, anyptr_gpC);
- e->vfmsub231sd(xmmA, xmmB, xmmC);
- e->vfmsub231sd(xmmA, xmmB, anyptr_gpC);
- e->vfmsub231ss(xmmA, xmmB, xmmC);
- e->vfmsub231ss(xmmA, xmmB, anyptr_gpC);
- e->vfmsubadd132pd(xmmA, xmmB, xmmC);
- e->vfmsubadd132pd(xmmA, xmmB, anyptr_gpC);
- e->vfmsubadd132pd(ymmA, ymmB, ymmC);
- e->vfmsubadd132pd(ymmA, ymmB, anyptr_gpC);
- e->vfmsubadd132pd(zmmA, zmmB, zmmC);
- e->vfmsubadd132pd(zmmA, zmmB, anyptr_gpC);
- e->vfmsubadd132ps(xmmA, xmmB, xmmC);
- e->vfmsubadd132ps(xmmA, xmmB, anyptr_gpC);
- e->vfmsubadd132ps(ymmA, ymmB, ymmC);
- e->vfmsubadd132ps(ymmA, ymmB, anyptr_gpC);
- e->vfmsubadd132ps(zmmA, zmmB, zmmC);
- e->vfmsubadd132ps(zmmA, zmmB, anyptr_gpC);
- e->vfmsubadd213pd(xmmA, xmmB, xmmC);
- e->vfmsubadd213pd(xmmA, xmmB, anyptr_gpC);
- e->vfmsubadd213pd(ymmA, ymmB, ymmC);
- e->vfmsubadd213pd(ymmA, ymmB, anyptr_gpC);
- e->vfmsubadd213pd(zmmA, zmmB, zmmC);
- e->vfmsubadd213pd(zmmA, zmmB, anyptr_gpC);
- e->vfmsubadd213ps(xmmA, xmmB, xmmC);
- e->vfmsubadd213ps(xmmA, xmmB, anyptr_gpC);
- e->vfmsubadd213ps(ymmA, ymmB, ymmC);
- e->vfmsubadd213ps(ymmA, ymmB, anyptr_gpC);
- e->vfmsubadd213ps(zmmA, zmmB, zmmC);
- e->vfmsubadd213ps(zmmA, zmmB, anyptr_gpC);
- e->vfmsubadd231pd(xmmA, xmmB, xmmC);
- e->vfmsubadd231pd(xmmA, xmmB, anyptr_gpC);
- e->vfmsubadd231pd(ymmA, ymmB, ymmC);
- e->vfmsubadd231pd(ymmA, ymmB, anyptr_gpC);
- e->vfmsubadd231pd(zmmA, zmmB, zmmC);
- e->vfmsubadd231pd(zmmA, zmmB, anyptr_gpC);
- e->vfmsubadd231ps(xmmA, xmmB, xmmC);
- e->vfmsubadd231ps(xmmA, xmmB, anyptr_gpC);
- e->vfmsubadd231ps(ymmA, ymmB, ymmC);
- e->vfmsubadd231ps(ymmA, ymmB, anyptr_gpC);
- e->vfmsubadd231ps(zmmA, zmmB, zmmC);
- e->vfmsubadd231ps(zmmA, zmmB, anyptr_gpC);
- e->vfnmadd132pd(xmmA, xmmB, xmmC);
- e->vfnmadd132pd(xmmA, xmmB, anyptr_gpC);
- e->vfnmadd132pd(ymmA, ymmB, ymmC);
- e->vfnmadd132pd(ymmA, ymmB, anyptr_gpC);
- e->vfnmadd132pd(zmmA, zmmB, zmmC);
- e->vfnmadd132pd(zmmA, zmmB, anyptr_gpC);
- e->vfnmadd132ps(xmmA, xmmB, xmmC);
- e->vfnmadd132ps(xmmA, xmmB, anyptr_gpC);
- e->vfnmadd132ps(ymmA, ymmB, ymmC);
- e->vfnmadd132ps(ymmA, ymmB, anyptr_gpC);
- e->vfnmadd132ps(zmmA, zmmB, zmmC);
- e->vfnmadd132ps(zmmA, zmmB, anyptr_gpC);
- e->vfnmadd132sd(xmmA, xmmB, xmmC);
- e->vfnmadd132sd(xmmA, xmmB, anyptr_gpC);
- e->vfnmadd132ss(xmmA, xmmB, xmmC);
- e->vfnmadd132ss(xmmA, xmmB, anyptr_gpC);
- e->vfnmadd213pd(xmmA, xmmB, xmmC);
- e->vfnmadd213pd(xmmA, xmmB, anyptr_gpC);
- e->vfnmadd213pd(ymmA, ymmB, ymmC);
- e->vfnmadd213pd(ymmA, ymmB, anyptr_gpC);
- e->vfnmadd213pd(zmmA, zmmB, zmmC);
- e->vfnmadd213pd(zmmA, zmmB, anyptr_gpC);
- e->vfnmadd213ps(xmmA, xmmB, xmmC);
- e->vfnmadd213ps(xmmA, xmmB, anyptr_gpC);
- e->vfnmadd213ps(ymmA, ymmB, ymmC);
- e->vfnmadd213ps(ymmA, ymmB, anyptr_gpC);
- e->vfnmadd213ps(zmmA, zmmB, zmmC);
- e->vfnmadd213ps(zmmA, zmmB, anyptr_gpC);
- e->vfnmadd213sd(xmmA, xmmB, xmmC);
- e->vfnmadd213sd(xmmA, xmmB, anyptr_gpC);
- e->vfnmadd213ss(xmmA, xmmB, xmmC);
- e->vfnmadd213ss(xmmA, xmmB, anyptr_gpC);
- e->vfnmadd231pd(xmmA, xmmB, xmmC);
- e->vfnmadd231pd(xmmA, xmmB, anyptr_gpC);
- e->vfnmadd231pd(ymmA, ymmB, ymmC);
- e->vfnmadd231pd(ymmA, ymmB, anyptr_gpC);
- e->vfnmadd231pd(zmmA, zmmB, zmmC);
- e->vfnmadd231pd(zmmA, zmmB, anyptr_gpC);
- e->vfnmadd231ps(xmmA, xmmB, xmmC);
- e->vfnmadd231ps(xmmA, xmmB, anyptr_gpC);
- e->vfnmadd231ps(ymmA, ymmB, ymmC);
- e->vfnmadd231ps(ymmA, ymmB, anyptr_gpC);
- e->vfnmadd231ps(zmmA, zmmB, zmmC);
- e->vfnmadd231ps(zmmA, zmmB, anyptr_gpC);
- e->vfnmadd231sd(xmmA, xmmB, xmmC);
- e->vfnmadd231sd(xmmA, xmmB, anyptr_gpC);
- e->vfnmadd231ss(xmmA, xmmB, xmmC);
- e->vfnmadd231ss(xmmA, xmmB, anyptr_gpC);
- e->vfnmsub132pd(xmmA, xmmB, xmmC);
- e->vfnmsub132pd(xmmA, xmmB, anyptr_gpC);
- e->vfnmsub132pd(ymmA, ymmB, ymmC);
- e->vfnmsub132pd(ymmA, ymmB, anyptr_gpC);
- e->vfnmsub132pd(zmmA, zmmB, zmmC);
- e->vfnmsub132pd(zmmA, zmmB, anyptr_gpC);
- e->vfnmsub132ps(xmmA, xmmB, xmmC);
- e->vfnmsub132ps(xmmA, xmmB, anyptr_gpC);
- e->vfnmsub132ps(ymmA, ymmB, ymmC);
- e->vfnmsub132ps(ymmA, ymmB, anyptr_gpC);
- e->vfnmsub132ps(zmmA, zmmB, zmmC);
- e->vfnmsub132ps(zmmA, zmmB, anyptr_gpC);
- e->vfnmsub132sd(xmmA, xmmB, xmmC);
- e->vfnmsub132sd(xmmA, xmmB, anyptr_gpC);
- e->vfnmsub132ss(xmmA, xmmB, xmmC);
- e->vfnmsub132ss(xmmA, xmmB, anyptr_gpC);
- e->vfnmsub213pd(xmmA, xmmB, xmmC);
- e->vfnmsub213pd(xmmA, xmmB, anyptr_gpC);
- e->vfnmsub213pd(ymmA, ymmB, ymmC);
- e->vfnmsub213pd(ymmA, ymmB, anyptr_gpC);
- e->vfnmsub213pd(zmmA, zmmB, zmmC);
- e->vfnmsub213pd(zmmA, zmmB, anyptr_gpC);
- e->vfnmsub213ps(xmmA, xmmB, xmmC);
- e->vfnmsub213ps(xmmA, xmmB, anyptr_gpC);
- e->vfnmsub213ps(ymmA, ymmB, ymmC);
- e->vfnmsub213ps(ymmA, ymmB, anyptr_gpC);
- e->vfnmsub213ps(zmmA, zmmB, zmmC);
- e->vfnmsub213ps(zmmA, zmmB, anyptr_gpC);
- e->vfnmsub213sd(xmmA, xmmB, xmmC);
- e->vfnmsub213sd(xmmA, xmmB, anyptr_gpC);
- e->vfnmsub213ss(xmmA, xmmB, xmmC);
- e->vfnmsub213ss(xmmA, xmmB, anyptr_gpC);
- e->vfnmsub231pd(xmmA, xmmB, xmmC);
- e->vfnmsub231pd(xmmA, xmmB, anyptr_gpC);
- e->vfnmsub231pd(ymmA, ymmB, ymmC);
- e->vfnmsub231pd(ymmA, ymmB, anyptr_gpC);
- e->vfnmsub231pd(zmmA, zmmB, zmmC);
- e->vfnmsub231pd(zmmA, zmmB, anyptr_gpC);
- e->vfnmsub231ps(xmmA, xmmB, xmmC);
- e->vfnmsub231ps(xmmA, xmmB, anyptr_gpC);
- e->vfnmsub231ps(ymmA, ymmB, ymmC);
- e->vfnmsub231ps(ymmA, ymmB, anyptr_gpC);
- e->vfnmsub231ps(zmmA, zmmB, zmmC);
- e->vfnmsub231ps(zmmA, zmmB, anyptr_gpC);
- e->vfnmsub231sd(xmmA, xmmB, xmmC);
- e->vfnmsub231sd(xmmA, xmmB, anyptr_gpC);
- e->vfnmsub231ss(xmmA, xmmB, xmmC);
- e->vfnmsub231ss(xmmA, xmmB, anyptr_gpC);
- e->vfpclasspd(kA, xmmB, 0);
- e->vfpclasspd(kA, anyptr_gpB, 0);
- e->vfpclasspd(kA, ymmB, 0);
- e->vfpclasspd(kA, anyptr_gpB, 0);
- e->vfpclasspd(kA, zmmB, 0);
- e->vfpclasspd(kA, anyptr_gpB, 0);
- e->vfpclassps(kA, xmmB, 0);
- e->vfpclassps(kA, anyptr_gpB, 0);
- e->vfpclassps(kA, ymmB, 0);
- e->vfpclassps(kA, anyptr_gpB, 0);
- e->vfpclassps(kA, zmmB, 0);
- e->vfpclassps(kA, anyptr_gpB, 0);
- e->vfpclasssd(kA, xmmB, 0);
- e->vfpclasssd(kA, anyptr_gpB, 0);
- e->vfpclassss(kA, xmmB, 0);
- e->vfpclassss(kA, anyptr_gpB, 0);
- e->vgatherdpd(xmmA, vx_ptr);
- e->vgatherdpd(ymmA, vy_ptr);
- e->vgatherdpd(zmmA, vz_ptr);
- e->vgatherdps(xmmA, vx_ptr);
- e->vgatherdps(ymmA, vy_ptr);
- e->vgatherdps(zmmA, vz_ptr);
- e->vgatherpf0dpd(vy_ptr);
- e->vgatherpf0dps(vz_ptr);
- e->vgatherpf0qpd(vz_ptr);
- e->vgatherpf0qps(vz_ptr);
- e->vgatherpf1dpd(vy_ptr);
- e->vgatherpf1dps(vz_ptr);
- e->vgatherpf1qpd(vz_ptr);
- e->vgatherpf1qps(vz_ptr);
- e->vgatherqpd(xmmA, vx_ptr);
- e->vgatherqpd(ymmA, vy_ptr);
- e->vgatherqpd(zmmA, vz_ptr);
- e->vgatherqps(xmmA, vx_ptr);
- e->vgatherqps(ymmA, vy_ptr);
- e->vgatherqps(zmmA, vz_ptr);
- e->vgetexppd(xmmA, xmmB);
- e->vgetexppd(xmmA, anyptr_gpB);
- e->vgetexppd(ymmA, ymmB);
- e->vgetexppd(ymmA, anyptr_gpB);
- e->vgetexppd(zmmA, zmmB);
- e->vgetexppd(zmmA, anyptr_gpB);
- e->vgetexpps(xmmA, xmmB);
- e->vgetexpps(xmmA, anyptr_gpB);
- e->vgetexpps(ymmA, ymmB);
- e->vgetexpps(ymmA, anyptr_gpB);
- e->vgetexpps(zmmA, zmmB);
- e->vgetexpps(zmmA, anyptr_gpB);
- e->vgetexpsd(xmmA, xmmB, xmmC);
- e->vgetexpsd(xmmA, xmmB, anyptr_gpB);
- e->vgetexpss(xmmA, xmmB, xmmC);
- e->vgetexpss(xmmA, xmmB, anyptr_gpB);
- e->vgetmantpd(xmmA, xmmB, 0);
- e->vgetmantpd(xmmA, anyptr_gpB, 0);
- e->vgetmantpd(ymmA, ymmB, 0);
- e->vgetmantpd(ymmA, anyptr_gpB, 0);
- e->vgetmantpd(zmmA, zmmB, 0);
- e->vgetmantpd(zmmA, anyptr_gpB, 0);
- e->vgetmantps(xmmA, xmmB, 0);
- e->vgetmantps(xmmA, anyptr_gpB, 0);
- e->vgetmantps(ymmA, ymmB, 0);
- e->vgetmantps(ymmA, anyptr_gpB, 0);
- e->vgetmantps(zmmA, zmmB, 0);
- e->vgetmantps(zmmA, anyptr_gpB, 0);
- e->vgetmantsd(xmmA, xmmB, xmmC, 0);
- e->vgetmantsd(xmmA, xmmB, anyptr_gpB, 0);
- e->vgetmantss(xmmA, xmmB, xmmC, 0);
- e->vgetmantss(xmmA, xmmB, anyptr_gpB, 0);
- e->vinsertf32x4(ymmA, ymmB, xmmC, 0);
- e->vinsertf32x4(ymmA, ymmB, anyptr_gpC, 0);
- e->vinsertf32x4(zmmA, zmmB, xmmC, 0);
- e->vinsertf32x4(zmmA, zmmB, anyptr_gpC, 0);
- e->vinsertf32x8(zmmA, zmmB, ymmC, 0);
- e->vinsertf32x8(zmmA, zmmB, anyptr_gpC, 0);
- e->vinsertf64x2(ymmA, ymmB, xmmC, 0);
- e->vinsertf64x2(ymmA, ymmB, anyptr_gpC, 0);
- e->vinsertf64x2(zmmA, zmmB, xmmC, 0);
- e->vinsertf64x2(zmmA, zmmB, anyptr_gpC, 0);
- e->vinsertf64x4(zmmA, zmmB, ymmC, 0);
- e->vinsertf64x4(zmmA, zmmB, anyptr_gpC, 0);
- e->vinserti32x4(ymmA, ymmB, xmmC, 0);
- e->vinserti32x4(ymmA, ymmB, anyptr_gpC, 0);
- e->vinserti32x4(zmmA, zmmB, xmmC, 0);
- e->vinserti32x4(zmmA, zmmB, anyptr_gpC, 0);
- e->vinserti32x8(zmmA, zmmB, ymmC, 0);
- e->vinserti32x8(zmmA, zmmB, anyptr_gpC, 0);
- e->vinserti64x2(ymmA, ymmB, xmmC, 0);
- e->vinserti64x2(ymmA, ymmB, anyptr_gpC, 0);
- e->vinserti64x2(zmmA, zmmB, xmmC, 0);
- e->vinserti64x2(zmmA, zmmB, anyptr_gpC, 0);
- e->vinserti64x4(zmmA, zmmB, ymmC, 0);
- e->vinserti64x4(zmmA, zmmB, anyptr_gpC, 0);
- e->vinsertps(xmmA, xmmB, xmmC, 0);
- e->vinsertps(xmmA, xmmB, anyptr_gpC, 0);
- e->vmaxpd(xmmA, xmmB, xmmC);
- e->vmaxpd(xmmA, xmmB, anyptr_gpC);
- e->vmaxpd(ymmA, ymmB, ymmC);
- e->vmaxpd(ymmA, ymmB, anyptr_gpC);
- e->vmaxpd(zmmA, zmmB, zmmC);
- e->vmaxpd(zmmA, zmmB, anyptr_gpC);
- e->vmaxps(xmmA, xmmB, xmmC);
- e->vmaxps(xmmA, xmmB, anyptr_gpC);
- e->vmaxps(ymmA, ymmB, ymmC);
- e->vmaxps(ymmA, ymmB, anyptr_gpC);
- e->vmaxps(zmmA, zmmB, zmmC);
- e->vmaxps(zmmA, zmmB, anyptr_gpC);
- e->vmaxsd(xmmA, xmmB, xmmC);
- e->vmaxsd(xmmA, xmmB, anyptr_gpC);
- e->vmaxss(xmmA, xmmB, xmmC);
- e->vmaxss(xmmA, xmmB, anyptr_gpC);
- e->vminpd(xmmA, xmmB, xmmC);
- e->vminpd(xmmA, xmmB, anyptr_gpC);
- e->vminpd(ymmA, ymmB, ymmC);
- e->vminpd(ymmA, ymmB, anyptr_gpC);
- e->vminpd(zmmA, zmmB, zmmC);
- e->vminpd(zmmA, zmmB, anyptr_gpC);
- e->vminps(xmmA, xmmB, xmmC);
- e->vminps(xmmA, xmmB, anyptr_gpC);
- e->vminps(ymmA, ymmB, ymmC);
- e->vminps(ymmA, ymmB, anyptr_gpC);
- e->vminps(zmmA, zmmB, zmmC);
- e->vminps(zmmA, zmmB, anyptr_gpC);
- e->vminsd(xmmA, xmmB, xmmC);
- e->vminsd(xmmA, xmmB, anyptr_gpC);
- e->vminss(xmmA, xmmB, xmmC);
- e->vminss(xmmA, xmmB, anyptr_gpC);
- e->vmovapd(xmmA, xmmB);
- e->vmovapd(xmmA, anyptr_gpB);
- e->vmovapd(xmmA, xmmB);
- e->vmovapd(anyptr_gpA, xmmB);
- e->vmovapd(ymmA, ymmB);
- e->vmovapd(ymmA, anyptr_gpB);
- e->vmovapd(ymmA, ymmB);
- e->vmovapd(anyptr_gpA, ymmB);
- e->vmovapd(zmmA, zmmB);
- e->vmovapd(zmmA, anyptr_gpB);
- e->vmovapd(zmmA, zmmB);
- e->vmovapd(anyptr_gpA, zmmB);
- e->vmovaps(xmmA, xmmB);
- e->vmovaps(xmmA, anyptr_gpB);
- e->vmovaps(xmmA, xmmB);
- e->vmovaps(anyptr_gpA, xmmB);
- e->vmovaps(ymmA, ymmB);
- e->vmovaps(ymmA, anyptr_gpB);
- e->vmovaps(ymmA, ymmB);
- e->vmovaps(anyptr_gpA, ymmB);
- e->vmovaps(zmmA, zmmB);
- e->vmovaps(zmmA, anyptr_gpB);
- e->vmovaps(zmmA, zmmB);
- e->vmovaps(anyptr_gpA, zmmB);
- e->vmovd(gdA, xmmB);
- e->vmovd(gzA, xmmB);
- e->vmovd(anyptr_gpA, xmmB);
- e->vmovd(xmmA, gdB);
- e->vmovd(xmmA, gzB);
- e->vmovd(xmmA, anyptr_gpB);
- e->vmovddup(xmmA, xmmB);
- e->vmovddup(xmmA, anyptr_gpB);
- e->vmovddup(ymmA, ymmB);
- e->vmovddup(ymmA, anyptr_gpB);
- e->vmovddup(zmmA, zmmB);
- e->vmovddup(zmmA, anyptr_gpB);
- e->vmovdqa32(xmmA, xmmB);
- e->vmovdqa32(xmmA, anyptr_gpB);
- e->vmovdqa32(xmmA, xmmB);
- e->vmovdqa32(anyptr_gpA, xmmB);
- e->vmovdqa32(ymmA, ymmB);
- e->vmovdqa32(ymmA, anyptr_gpB);
- e->vmovdqa32(ymmA, ymmB);
- e->vmovdqa32(anyptr_gpA, ymmB);
- e->vmovdqa32(zmmA, zmmB);
- e->vmovdqa32(zmmA, anyptr_gpB);
- e->vmovdqa32(zmmA, zmmB);
- e->vmovdqa32(anyptr_gpA, zmmB);
- e->vmovdqa64(xmmA, xmmB);
- e->vmovdqa64(xmmA, anyptr_gpB);
- e->vmovdqa64(xmmA, xmmB);
- e->vmovdqa64(anyptr_gpA, xmmB);
- e->vmovdqa64(ymmA, ymmB);
- e->vmovdqa64(ymmA, anyptr_gpB);
- e->vmovdqa64(ymmA, ymmB);
- e->vmovdqa64(anyptr_gpA, ymmB);
- e->vmovdqa64(zmmA, zmmB);
- e->vmovdqa64(zmmA, anyptr_gpB);
- e->vmovdqa64(zmmA, zmmB);
- e->vmovdqa64(anyptr_gpA, zmmB);
- e->vmovdqu16(xmmA, xmmB);
- e->vmovdqu16(xmmA, anyptr_gpB);
- e->vmovdqu16(xmmA, xmmB);
- e->vmovdqu16(anyptr_gpA, xmmB);
- e->vmovdqu16(ymmA, ymmB);
- e->vmovdqu16(ymmA, anyptr_gpB);
- e->vmovdqu16(ymmA, ymmB);
- e->vmovdqu16(anyptr_gpA, ymmB);
- e->vmovdqu16(zmmA, zmmB);
- e->vmovdqu16(zmmA, anyptr_gpB);
- e->vmovdqu16(zmmA, zmmB);
- e->vmovdqu16(anyptr_gpA, zmmB);
- e->vmovdqu32(xmmA, xmmB);
- e->vmovdqu32(xmmA, anyptr_gpB);
- e->vmovdqu32(xmmA, xmmB);
- e->vmovdqu32(anyptr_gpA, xmmB);
- e->vmovdqu32(ymmA, ymmB);
- e->vmovdqu32(ymmA, anyptr_gpB);
- e->vmovdqu32(ymmA, ymmB);
- e->vmovdqu32(anyptr_gpA, ymmB);
- e->vmovdqu32(zmmA, zmmB);
- e->vmovdqu32(zmmA, anyptr_gpB);
- e->vmovdqu32(zmmA, zmmB);
- e->vmovdqu32(anyptr_gpA, zmmB);
- e->vmovdqu64(xmmA, xmmB);
- e->vmovdqu64(xmmA, anyptr_gpB);
- e->vmovdqu64(xmmA, xmmB);
- e->vmovdqu64(anyptr_gpA, xmmB);
- e->vmovdqu64(ymmA, ymmB);
- e->vmovdqu64(ymmA, anyptr_gpB);
- e->vmovdqu64(ymmA, ymmB);
- e->vmovdqu64(anyptr_gpA, ymmB);
- e->vmovdqu64(zmmA, zmmB);
- e->vmovdqu64(zmmA, anyptr_gpB);
- e->vmovdqu64(zmmA, zmmB);
- e->vmovdqu64(anyptr_gpA, zmmB);
- e->vmovdqu8(xmmA, xmmB);
- e->vmovdqu8(xmmA, anyptr_gpB);
- e->vmovdqu8(xmmA, xmmB);
- e->vmovdqu8(anyptr_gpA, xmmB);
- e->vmovdqu8(ymmA, ymmB);
- e->vmovdqu8(ymmA, anyptr_gpB);
- e->vmovdqu8(ymmA, ymmB);
- e->vmovdqu8(anyptr_gpA, ymmB);
- e->vmovdqu8(zmmA, zmmB);
- e->vmovdqu8(zmmA, anyptr_gpB);
- e->vmovdqu8(zmmA, zmmB);
- e->vmovdqu8(anyptr_gpA, zmmB);
- e->vmovhlps(xmmA, xmmB, xmmC);
- e->vmovhpd(anyptr_gpA, xmmB);
- e->vmovhpd(xmmA, xmmB, anyptr_gpC);
- e->vmovhps(anyptr_gpA, xmmB);
- e->vmovhps(xmmA, xmmB, anyptr_gpC);
- e->vmovlhps(xmmA, xmmB, xmmC);
- e->vmovlpd(anyptr_gpA, xmmB);
- e->vmovlpd(xmmA, xmmB, anyptr_gpC);
- e->vmovlps(anyptr_gpA, xmmB);
- e->vmovlps(xmmA, xmmB, anyptr_gpC);
- e->vmovntdq(anyptr_gpA, xmmB);
- e->vmovntdq(anyptr_gpA, ymmB);
- e->vmovntdq(anyptr_gpA, zmmB);
- e->vmovntdqa(xmmA, anyptr_gpB);
- e->vmovntdqa(ymmA, anyptr_gpB);
- e->vmovntdqa(zmmA, anyptr_gpB);
- e->vmovntpd(anyptr_gpA, xmmB);
- e->vmovntpd(anyptr_gpA, ymmB);
- e->vmovntpd(anyptr_gpA, zmmB);
- e->vmovntps(anyptr_gpA, xmmB);
- e->vmovntps(anyptr_gpA, ymmB);
- e->vmovntps(anyptr_gpA, zmmB);
- if (isX64) e->vmovq(gzA, xmmB);
- if (isX64) e->vmovq(xmmA, gzB);
- e->vmovq(anyptr_gpA, xmmB);
- e->vmovq(xmmA, anyptr_gpB);
- e->vmovq(xmmA, xmmB);
- e->vmovq(xmmA, anyptr_gpB);
- e->vmovq(xmmA, xmmB);
- e->vmovq(anyptr_gpA, xmmB);
- e->vmovsd(anyptr_gpA, xmmB);
- e->vmovsd(xmmA, anyptr_gpB);
- e->vmovsd(xmmA, xmmB, xmmC);
- e->vmovsd(xmmA, xmmB, xmmC);
- e->vmovshdup(xmmA, xmmB);
- e->vmovshdup(xmmA, anyptr_gpB);
- e->vmovshdup(ymmA, ymmB);
- e->vmovshdup(ymmA, anyptr_gpB);
- e->vmovshdup(zmmA, zmmB);
- e->vmovshdup(zmmA, anyptr_gpB);
- e->vmovsldup(xmmA, xmmB);
- e->vmovsldup(xmmA, anyptr_gpB);
- e->vmovsldup(ymmA, ymmB);
- e->vmovsldup(ymmA, anyptr_gpB);
- e->vmovsldup(zmmA, zmmB);
- e->vmovsldup(zmmA, anyptr_gpB);
- e->vmovss(anyptr_gpA, xmmB);
- e->vmovss(xmmA, anyptr_gpB);
- e->vmovss(xmmA, xmmB, xmmC);
- e->vmovss(xmmA, xmmB, xmmC);
- e->vmovupd(xmmA, xmmB);
- e->vmovupd(xmmA, anyptr_gpB);
- e->vmovupd(xmmA, xmmB);
- e->vmovupd(anyptr_gpA, xmmB);
- e->vmovupd(ymmA, ymmB);
- e->vmovupd(ymmA, anyptr_gpB);
- e->vmovupd(ymmA, ymmB);
- e->vmovupd(anyptr_gpA, ymmB);
- e->vmovupd(zmmA, zmmB);
- e->vmovupd(zmmA, anyptr_gpB);
- e->vmovupd(zmmA, zmmB);
- e->vmovupd(anyptr_gpA, zmmB);
- e->vmovups(xmmA, xmmB);
- e->vmovups(xmmA, anyptr_gpB);
- e->vmovups(xmmA, xmmB);
- e->vmovups(anyptr_gpA, xmmB);
- e->vmovups(ymmA, ymmB);
- e->vmovups(ymmA, anyptr_gpB);
- e->vmovups(ymmA, ymmB);
- e->vmovups(anyptr_gpA, ymmB);
- e->vmovups(zmmA, zmmB);
- e->vmovups(zmmA, anyptr_gpB);
- e->vmovups(zmmA, zmmB);
- e->vmovups(anyptr_gpA, zmmB);
- e->vmulpd(xmmA, xmmB, xmmC);
- e->vmulpd(xmmA, xmmB, anyptr_gpC);
- e->vmulpd(ymmA, ymmB, ymmC);
- e->vmulpd(ymmA, ymmB, anyptr_gpC);
- e->vmulpd(zmmA, zmmB, zmmC);
- e->vmulpd(zmmA, zmmB, anyptr_gpC);
- e->vmulps(xmmA, xmmB, xmmC);
- e->vmulps(xmmA, xmmB, anyptr_gpC);
- e->vmulps(ymmA, ymmB, ymmC);
- e->vmulps(ymmA, ymmB, anyptr_gpC);
- e->vmulps(zmmA, zmmB, zmmC);
- e->vmulps(zmmA, zmmB, anyptr_gpC);
- e->vmulsd(xmmA, xmmB, xmmC);
- e->vmulsd(xmmA, xmmB, anyptr_gpC);
- e->vmulss(xmmA, xmmB, xmmC);
- e->vmulss(xmmA, xmmB, anyptr_gpC);
- e->vorpd(xmmA, xmmB, xmmC);
- e->vorpd(xmmA, xmmB, anyptr_gpC);
- e->vorpd(ymmA, ymmB, ymmC);
- e->vorpd(ymmA, ymmB, anyptr_gpC);
- e->vorpd(zmmA, zmmB, zmmC);
- e->vorpd(zmmA, zmmB, anyptr_gpC);
- e->vorps(xmmA, xmmB, xmmC);
- e->vorps(xmmA, xmmB, anyptr_gpC);
- e->vorps(ymmA, ymmB, ymmC);
- e->vorps(ymmA, ymmB, anyptr_gpC);
- e->vorps(zmmA, zmmB, zmmC);
- e->vorps(zmmA, zmmB, anyptr_gpC);
- e->vpabsb(xmmA, xmmB);
- e->vpabsb(xmmA, anyptr_gpB);
- e->vpabsb(ymmA, ymmB);
- e->vpabsb(ymmA, anyptr_gpB);
- e->vpabsb(zmmA, zmmB);
- e->vpabsb(zmmA, anyptr_gpB);
- e->vpabsd(xmmA, xmmB);
- e->vpabsd(xmmA, anyptr_gpB);
- e->vpabsd(ymmA, ymmB);
- e->vpabsd(ymmA, anyptr_gpB);
- e->vpabsd(zmmA, zmmB);
- e->vpabsd(zmmA, anyptr_gpB);
- e->vpabsq(xmmA, xmmB);
- e->vpabsq(xmmA, anyptr_gpB);
- e->vpabsq(ymmA, ymmB);
- e->vpabsq(ymmA, anyptr_gpB);
- e->vpabsq(zmmA, zmmB);
- e->vpabsq(zmmA, anyptr_gpB);
- e->vpabsw(xmmA, xmmB);
- e->vpabsw(xmmA, anyptr_gpB);
- e->vpabsw(ymmA, ymmB);
- e->vpabsw(ymmA, anyptr_gpB);
- e->vpabsw(zmmA, zmmB);
- e->vpabsw(zmmA, anyptr_gpB);
- e->vpackssdw(xmmA, xmmB, xmmC);
- e->vpackssdw(xmmA, xmmB, anyptr_gpC);
- e->vpackssdw(ymmA, ymmB, ymmC);
- e->vpackssdw(ymmA, ymmB, anyptr_gpC);
- e->vpackssdw(zmmA, zmmB, zmmC);
- e->vpackssdw(zmmA, zmmB, anyptr_gpC);
- e->vpacksswb(xmmA, xmmB, xmmC);
- e->vpacksswb(xmmA, xmmB, anyptr_gpC);
- e->vpacksswb(ymmA, ymmB, ymmC);
- e->vpacksswb(ymmA, ymmB, anyptr_gpC);
- e->vpacksswb(zmmA, zmmB, zmmC);
- e->vpacksswb(zmmA, zmmB, anyptr_gpC);
- e->vpackusdw(xmmA, xmmB, xmmC);
- e->vpackusdw(xmmA, xmmB, anyptr_gpC);
- e->vpackusdw(ymmA, ymmB, ymmC);
- e->vpackusdw(ymmA, ymmB, anyptr_gpC);
- e->vpackusdw(zmmA, zmmB, zmmC);
- e->vpackusdw(zmmA, zmmB, anyptr_gpC);
- e->vpackuswb(xmmA, xmmB, xmmC);
- e->vpackuswb(xmmA, xmmB, anyptr_gpC);
- e->vpackuswb(ymmA, ymmB, ymmC);
- e->vpackuswb(ymmA, ymmB, anyptr_gpC);
- e->vpackuswb(zmmA, zmmB, zmmC);
- e->vpackuswb(zmmA, zmmB, anyptr_gpC);
- e->vpaddb(xmmA, xmmB, xmmC);
- e->vpaddb(xmmA, xmmB, anyptr_gpC);
- e->vpaddb(ymmA, ymmB, ymmC);
- e->vpaddb(ymmA, ymmB, anyptr_gpC);
- e->vpaddb(zmmA, zmmB, zmmC);
- e->vpaddb(zmmA, zmmB, anyptr_gpC);
- e->vpaddd(xmmA, xmmB, xmmC);
- e->vpaddd(xmmA, xmmB, anyptr_gpC);
- e->vpaddd(ymmA, ymmB, ymmC);
- e->vpaddd(ymmA, ymmB, anyptr_gpC);
- e->vpaddd(zmmA, zmmB, zmmC);
- e->vpaddd(zmmA, zmmB, anyptr_gpC);
- e->vpaddq(xmmA, xmmB, xmmC);
- e->vpaddq(xmmA, xmmB, anyptr_gpC);
- e->vpaddq(ymmA, ymmB, ymmC);
- e->vpaddq(ymmA, ymmB, anyptr_gpC);
- e->vpaddq(zmmA, zmmB, zmmC);
- e->vpaddq(zmmA, zmmB, anyptr_gpC);
- e->vpaddsb(xmmA, xmmB, xmmC);
- e->vpaddsb(xmmA, xmmB, anyptr_gpC);
- e->vpaddsb(ymmA, ymmB, ymmC);
- e->vpaddsb(ymmA, ymmB, anyptr_gpC);
- e->vpaddsb(zmmA, zmmB, zmmC);
- e->vpaddsb(zmmA, zmmB, anyptr_gpC);
- e->vpaddsw(xmmA, xmmB, xmmC);
- e->vpaddsw(xmmA, xmmB, anyptr_gpC);
- e->vpaddsw(ymmA, ymmB, ymmC);
- e->vpaddsw(ymmA, ymmB, anyptr_gpC);
- e->vpaddsw(zmmA, zmmB, zmmC);
- e->vpaddsw(zmmA, zmmB, anyptr_gpC);
- e->vpaddusb(xmmA, xmmB, xmmC);
- e->vpaddusb(xmmA, xmmB, anyptr_gpC);
- e->vpaddusb(ymmA, ymmB, ymmC);
- e->vpaddusb(ymmA, ymmB, anyptr_gpC);
- e->vpaddusb(zmmA, zmmB, zmmC);
- e->vpaddusb(zmmA, zmmB, anyptr_gpC);
- e->vpaddusw(xmmA, xmmB, xmmC);
- e->vpaddusw(xmmA, xmmB, anyptr_gpC);
- e->vpaddusw(ymmA, ymmB, ymmC);
- e->vpaddusw(ymmA, ymmB, anyptr_gpC);
- e->vpaddusw(zmmA, zmmB, zmmC);
- e->vpaddusw(zmmA, zmmB, anyptr_gpC);
- e->vpaddw(xmmA, xmmB, xmmC);
- e->vpaddw(xmmA, xmmB, anyptr_gpC);
- e->vpaddw(ymmA, ymmB, ymmC);
- e->vpaddw(ymmA, ymmB, anyptr_gpC);
- e->vpaddw(zmmA, zmmB, zmmC);
- e->vpaddw(zmmA, zmmB, anyptr_gpC);
- e->vpalignr(xmmA, xmmB, xmmC, 0);
- e->vpalignr(xmmA, xmmB, anyptr_gpC, 0);
- e->vpalignr(ymmA, ymmB, ymmC, 0);
- e->vpalignr(ymmA, ymmB, anyptr_gpC, 0);
- e->vpalignr(zmmA, zmmB, zmmC, 0);
- e->vpalignr(zmmA, zmmB, anyptr_gpC, 0);
- e->vpandd(xmmA, xmmB, xmmC);
- e->vpandd(xmmA, xmmB, anyptr_gpC);
- e->vpandd(ymmA, ymmB, ymmC);
- e->vpandd(ymmA, ymmB, anyptr_gpC);
- e->vpandd(zmmA, zmmB, zmmC);
- e->vpandd(zmmA, zmmB, anyptr_gpC);
- e->vpandnd(xmmA, xmmB, xmmC);
- e->vpandnd(xmmA, xmmB, anyptr_gpC);
- e->vpandnd(ymmA, ymmB, ymmC);
- e->vpandnd(ymmA, ymmB, anyptr_gpC);
- e->vpandnd(zmmA, zmmB, zmmC);
- e->vpandnd(zmmA, zmmB, anyptr_gpC);
- e->vpandnq(xmmA, xmmB, xmmC);
- e->vpandnq(xmmA, xmmB, anyptr_gpC);
- e->vpandnq(ymmA, ymmB, ymmC);
- e->vpandnq(ymmA, ymmB, anyptr_gpC);
- e->vpandnq(zmmA, zmmB, zmmC);
- e->vpandnq(zmmA, zmmB, anyptr_gpC);
- e->vpandq(xmmA, xmmB, xmmC);
- e->vpandq(xmmA, xmmB, anyptr_gpC);
- e->vpandq(ymmA, ymmB, ymmC);
- e->vpandq(ymmA, ymmB, anyptr_gpC);
- e->vpandq(zmmA, zmmB, zmmC);
- e->vpandq(zmmA, zmmB, anyptr_gpC);
- e->vpavgb(xmmA, xmmB, xmmC);
- e->vpavgb(xmmA, xmmB, anyptr_gpC);
- e->vpavgb(ymmA, ymmB, ymmC);
- e->vpavgb(ymmA, ymmB, anyptr_gpC);
- e->vpavgb(zmmA, zmmB, zmmC);
- e->vpavgb(zmmA, zmmB, anyptr_gpC);
- e->vpavgw(xmmA, xmmB, xmmC);
- e->vpavgw(xmmA, xmmB, anyptr_gpC);
- e->vpavgw(ymmA, ymmB, ymmC);
- e->vpavgw(ymmA, ymmB, anyptr_gpC);
- e->vpavgw(zmmA, zmmB, zmmC);
- e->vpavgw(zmmA, zmmB, anyptr_gpC);
- e->vpbroadcastb(xmmA, gdB);
- e->vpbroadcastb(xmmA, gzB);
- e->vpbroadcastb(xmmA, xmmB);
- e->vpbroadcastb(xmmA, anyptr_gpB);
- e->vpbroadcastb(ymmA, gdB);
- e->vpbroadcastb(ymmA, gzB);
- e->vpbroadcastb(ymmA, xmmB);
- e->vpbroadcastb(ymmA, anyptr_gpB);
- e->vpbroadcastb(zmmA, gdB);
- e->vpbroadcastb(zmmA, gzB);
- e->vpbroadcastb(zmmA, xmmB);
- e->vpbroadcastb(zmmA, anyptr_gpB);
- e->vpbroadcastd(xmmA, gdB);
- e->vpbroadcastd(xmmA, gzB);
- e->vpbroadcastd(xmmA, xmmB);
- e->vpbroadcastd(xmmA, anyptr_gpB);
- e->vpbroadcastd(ymmA, gdB);
- e->vpbroadcastd(ymmA, gzB);
- e->vpbroadcastd(ymmA, xmmB);
- e->vpbroadcastd(ymmA, anyptr_gpB);
- e->vpbroadcastd(zmmA, gdB);
- e->vpbroadcastd(zmmA, gzB);
- e->vpbroadcastd(zmmA, xmmB);
- e->vpbroadcastd(zmmA, anyptr_gpB);
- e->vpbroadcastmb2d(xmmA, kB);
- e->vpbroadcastmb2d(ymmA, kB);
- e->vpbroadcastmb2d(zmmA, kB);
- e->vpbroadcastmb2q(xmmA, kB);
- e->vpbroadcastmb2q(ymmA, kB);
- e->vpbroadcastmb2q(zmmA, kB);
- if (isX64) e->vpbroadcastq(xmmA, gzB);
- e->vpbroadcastq(xmmA, xmmB);
- e->vpbroadcastq(xmmA, anyptr_gpB);
- if (isX64) e->vpbroadcastq(ymmA, gzB);
- e->vpbroadcastq(ymmA, xmmB);
- e->vpbroadcastq(ymmA, anyptr_gpB);
- if (isX64) e->vpbroadcastq(zmmA, gzB);
- e->vpbroadcastq(zmmA, xmmB);
- e->vpbroadcastq(zmmA, anyptr_gpB);
- e->vpbroadcastw(xmmA, gdB);
- e->vpbroadcastw(xmmA, gzB);
- e->vpbroadcastw(xmmA, xmmB);
- e->vpbroadcastw(xmmA, anyptr_gpB);
- e->vpbroadcastw(ymmA, gdB);
- e->vpbroadcastw(ymmA, gzB);
- e->vpbroadcastw(ymmA, xmmB);
- e->vpbroadcastw(ymmA, anyptr_gpB);
- e->vpbroadcastw(zmmA, gdB);
- e->vpbroadcastw(zmmA, gzB);
- e->vpbroadcastw(zmmA, xmmB);
- e->vpbroadcastw(zmmA, anyptr_gpB);
- e->vpcmpb(kA, xmmB, xmmC, 0);
- e->vpcmpb(kA, xmmB, anyptr_gpC, 0);
- e->vpcmpb(kA, ymmB, ymmC, 0);
- e->vpcmpb(kA, ymmB, anyptr_gpC, 0);
- e->vpcmpb(kA, zmmB, zmmC, 0);
- e->vpcmpb(kA, zmmB, anyptr_gpC, 0);
- e->vpcmpd(kA, xmmB, xmmC, 0);
- e->vpcmpd(kA, xmmB, anyptr_gpC, 0);
- e->vpcmpd(kA, ymmB, ymmC, 0);
- e->vpcmpd(kA, ymmB, anyptr_gpC, 0);
- e->vpcmpd(kA, zmmB, zmmC, 0);
- e->vpcmpd(kA, zmmB, anyptr_gpC, 0);
- e->vpcmpeqb(kA, xmmB, xmmC);
- e->vpcmpeqb(kA, xmmB, anyptr_gpC);
- e->vpcmpeqb(kA, ymmB, ymmC);
- e->vpcmpeqb(kA, ymmB, anyptr_gpC);
- e->vpcmpeqb(kA, zmmB, zmmC);
- e->vpcmpeqb(kA, zmmB, anyptr_gpC);
- e->vpcmpeqd(kA, xmmB, xmmC);
- e->vpcmpeqd(kA, xmmB, anyptr_gpC);
- e->vpcmpeqd(kA, ymmB, ymmC);
- e->vpcmpeqd(kA, ymmB, anyptr_gpC);
- e->vpcmpeqd(kA, zmmB, zmmC);
- e->vpcmpeqd(kA, zmmB, anyptr_gpC);
- e->vpcmpeqq(kA, xmmB, xmmC);
- e->vpcmpeqq(kA, xmmB, anyptr_gpC);
- e->vpcmpeqq(kA, ymmB, ymmC);
- e->vpcmpeqq(kA, ymmB, anyptr_gpC);
- e->vpcmpeqq(kA, zmmB, zmmC);
- e->vpcmpeqq(kA, zmmB, anyptr_gpC);
- e->vpcmpeqw(kA, xmmB, xmmC);
- e->vpcmpeqw(kA, xmmB, anyptr_gpC);
- e->vpcmpeqw(kA, ymmB, ymmC);
- e->vpcmpeqw(kA, ymmB, anyptr_gpC);
- e->vpcmpeqw(kA, zmmB, zmmC);
- e->vpcmpeqw(kA, zmmB, anyptr_gpC);
- e->vpcmpgtb(kA, xmmB, xmmC);
- e->vpcmpgtb(kA, xmmB, anyptr_gpC);
- e->vpcmpgtb(kA, ymmB, ymmC);
- e->vpcmpgtb(kA, ymmB, anyptr_gpC);
- e->vpcmpgtb(kA, zmmB, zmmC);
- e->vpcmpgtb(kA, zmmB, anyptr_gpC);
- e->vpcmpgtd(kA, xmmB, xmmC);
- e->vpcmpgtd(kA, xmmB, anyptr_gpC);
- e->vpcmpgtd(kA, ymmB, ymmC);
- e->vpcmpgtd(kA, ymmB, anyptr_gpC);
- e->vpcmpgtd(kA, zmmB, zmmC);
- e->vpcmpgtd(kA, zmmB, anyptr_gpC);
- e->vpcmpgtq(kA, xmmB, xmmC);
- e->vpcmpgtq(kA, xmmB, anyptr_gpC);
- e->vpcmpgtq(kA, ymmB, ymmC);
- e->vpcmpgtq(kA, ymmB, anyptr_gpC);
- e->vpcmpgtq(kA, zmmB, zmmC);
- e->vpcmpgtq(kA, zmmB, anyptr_gpC);
- e->vpcmpgtw(kA, xmmB, xmmC);
- e->vpcmpgtw(kA, xmmB, anyptr_gpC);
- e->vpcmpgtw(kA, ymmB, ymmC);
- e->vpcmpgtw(kA, ymmB, anyptr_gpC);
- e->vpcmpgtw(kA, zmmB, zmmC);
- e->vpcmpgtw(kA, zmmB, anyptr_gpC);
- e->vpcmpq(kA, xmmB, xmmC, 0);
- e->vpcmpq(kA, xmmB, anyptr_gpC, 0);
- e->vpcmpq(kA, ymmB, ymmC, 0);
- e->vpcmpq(kA, ymmB, anyptr_gpC, 0);
- e->vpcmpq(kA, zmmB, zmmC, 0);
- e->vpcmpq(kA, zmmB, anyptr_gpC, 0);
- e->vpcmpub(kA, xmmB, xmmC, 0);
- e->vpcmpub(kA, xmmB, anyptr_gpC, 0);
- e->vpcmpub(kA, ymmB, ymmC, 0);
- e->vpcmpub(kA, ymmB, anyptr_gpC, 0);
- e->vpcmpub(kA, zmmB, zmmC, 0);
- e->vpcmpub(kA, zmmB, anyptr_gpC, 0);
- e->vpcmpud(kA, xmmB, xmmC, 0);
- e->vpcmpud(kA, xmmB, anyptr_gpC, 0);
- e->vpcmpud(kA, ymmB, ymmC, 0);
- e->vpcmpud(kA, ymmB, anyptr_gpC, 0);
- e->vpcmpud(kA, zmmB, zmmC, 0);
- e->vpcmpud(kA, zmmB, anyptr_gpC, 0);
- e->vpcmpuq(kA, xmmB, xmmC, 0);
- e->vpcmpuq(kA, xmmB, anyptr_gpC, 0);
- e->vpcmpuq(kA, ymmB, ymmC, 0);
- e->vpcmpuq(kA, ymmB, anyptr_gpC, 0);
- e->vpcmpuq(kA, zmmB, zmmC, 0);
- e->vpcmpuq(kA, zmmB, anyptr_gpC, 0);
- e->vpcmpuw(kA, xmmB, xmmC, 0);
- e->vpcmpuw(kA, xmmB, anyptr_gpC, 0);
- e->vpcmpuw(kA, ymmB, ymmC, 0);
- e->vpcmpuw(kA, ymmB, anyptr_gpC, 0);
- e->vpcmpuw(kA, zmmB, zmmC, 0);
- e->vpcmpuw(kA, zmmB, anyptr_gpC, 0);
- e->vpcmpw(kA, xmmB, xmmC, 0);
- e->vpcmpw(kA, xmmB, anyptr_gpC, 0);
- e->vpcmpw(kA, ymmB, ymmC, 0);
- e->vpcmpw(kA, ymmB, anyptr_gpC, 0);
- e->vpcmpw(kA, zmmB, zmmC, 0);
- e->vpcmpw(kA, zmmB, anyptr_gpC, 0);
- e->vpcompressd(xmmA, xmmB);
- e->vpcompressd(anyptr_gpA, xmmB);
- e->vpcompressd(ymmA, ymmB);
- e->vpcompressd(anyptr_gpA, ymmB);
- e->vpcompressd(zmmA, zmmB);
- e->vpcompressd(anyptr_gpA, zmmB);
- e->vpcompressq(xmmA, xmmB);
- e->vpcompressq(anyptr_gpA, xmmB);
- e->vpcompressq(ymmA, ymmB);
- e->vpcompressq(anyptr_gpA, ymmB);
- e->vpcompressq(zmmA, zmmB);
- e->vpcompressq(anyptr_gpA, zmmB);
- e->vpconflictd(xmmA, xmmB);
- e->vpconflictd(xmmA, anyptr_gpB);
- e->vpconflictd(ymmA, ymmB);
- e->vpconflictd(ymmA, anyptr_gpB);
- e->vpconflictd(zmmA, zmmB);
- e->vpconflictd(zmmA, anyptr_gpB);
- e->vpconflictq(xmmA, xmmB);
- e->vpconflictq(xmmA, anyptr_gpB);
- e->vpconflictq(ymmA, ymmB);
- e->vpconflictq(ymmA, anyptr_gpB);
- e->vpconflictq(zmmA, zmmB);
- e->vpconflictq(zmmA, anyptr_gpB);
- e->vpermb(xmmA, xmmB, xmmC);
- e->vpermb(xmmA, xmmB, anyptr_gpC);
- e->vpermb(ymmA, ymmB, ymmC);
- e->vpermb(ymmA, ymmB, anyptr_gpC);
- e->vpermb(zmmA, zmmB, zmmC);
- e->vpermb(zmmA, zmmB, anyptr_gpC);
- e->vpermd(ymmA, ymmB, ymmC);
- e->vpermd(ymmA, ymmB, anyptr_gpC);
- e->vpermd(zmmA, zmmB, zmmC);
- e->vpermd(zmmA, zmmB, anyptr_gpC);
- e->vpermi2b(xmmA, xmmB, xmmC);
- e->vpermi2b(xmmA, xmmB, anyptr_gpC);
- e->vpermi2b(ymmA, ymmB, ymmC);
- e->vpermi2b(ymmA, ymmB, anyptr_gpC);
- e->vpermi2b(zmmA, zmmB, zmmC);
- e->vpermi2b(zmmA, zmmB, anyptr_gpC);
- e->vpermi2d(xmmA, xmmB, xmmC);
- e->vpermi2d(xmmA, xmmB, anyptr_gpC);
- e->vpermi2d(ymmA, ymmB, ymmC);
- e->vpermi2d(ymmA, ymmB, anyptr_gpC);
- e->vpermi2d(zmmA, zmmB, zmmC);
- e->vpermi2d(zmmA, zmmB, anyptr_gpC);
- e->vpermi2pd(xmmA, xmmB, xmmC);
- e->vpermi2pd(xmmA, xmmB, anyptr_gpC);
- e->vpermi2pd(ymmA, ymmB, ymmC);
- e->vpermi2pd(ymmA, ymmB, anyptr_gpC);
- e->vpermi2pd(zmmA, zmmB, zmmC);
- e->vpermi2pd(zmmA, zmmB, anyptr_gpC);
- e->vpermi2ps(xmmA, xmmB, xmmC);
- e->vpermi2ps(xmmA, xmmB, anyptr_gpC);
- e->vpermi2ps(ymmA, ymmB, ymmC);
- e->vpermi2ps(ymmA, ymmB, anyptr_gpC);
- e->vpermi2ps(zmmA, zmmB, zmmC);
- e->vpermi2ps(zmmA, zmmB, anyptr_gpC);
- e->vpermi2q(xmmA, xmmB, xmmC);
- e->vpermi2q(xmmA, xmmB, anyptr_gpC);
- e->vpermi2q(ymmA, ymmB, ymmC);
- e->vpermi2q(ymmA, ymmB, anyptr_gpC);
- e->vpermi2q(zmmA, zmmB, zmmC);
- e->vpermi2q(zmmA, zmmB, anyptr_gpC);
- e->vpermi2w(xmmA, xmmB, xmmC);
- e->vpermi2w(xmmA, xmmB, anyptr_gpC);
- e->vpermi2w(ymmA, ymmB, ymmC);
- e->vpermi2w(ymmA, ymmB, anyptr_gpC);
- e->vpermi2w(zmmA, zmmB, zmmC);
- e->vpermi2w(zmmA, zmmB, anyptr_gpC);
- e->vpermilpd(xmmA, xmmB, xmmC);
- e->vpermilpd(xmmA, xmmB, anyptr_gpC);
- e->vpermilpd(ymmA, ymmB, ymmC);
- e->vpermilpd(ymmA, ymmB, anyptr_gpC);
- e->vpermilpd(zmmA, zmmB, zmmC);
- e->vpermilpd(zmmA, zmmB, anyptr_gpC);
- e->vpermilpd(xmmA, xmmB, 0);
- e->vpermilpd(xmmA, anyptr_gpB, 0);
- e->vpermilpd(ymmA, ymmB, 0);
- e->vpermilpd(ymmA, anyptr_gpB, 0);
- e->vpermilpd(zmmA, zmmB, 0);
- e->vpermilpd(zmmA, anyptr_gpB, 0);
- e->vpermilps(xmmA, xmmB, xmmC);
- e->vpermilps(xmmA, xmmB, anyptr_gpC);
- e->vpermilps(ymmA, ymmB, ymmC);
- e->vpermilps(ymmA, ymmB, anyptr_gpC);
- e->vpermilps(zmmA, zmmB, zmmC);
- e->vpermilps(zmmA, zmmB, anyptr_gpC);
- e->vpermilps(xmmA, xmmB, 0);
- e->vpermilps(xmmA, anyptr_gpB, 0);
- e->vpermilps(ymmA, ymmB, 0);
- e->vpermilps(ymmA, anyptr_gpB, 0);
- e->vpermilps(zmmA, zmmB, 0);
- e->vpermilps(zmmA, anyptr_gpB, 0);
- e->vpermq(ymmA, ymmB, ymmC);
- e->vpermq(ymmA, ymmB, anyptr_gpC);
- e->vpermq(zmmA, zmmB, zmmC);
- e->vpermq(zmmA, zmmB, anyptr_gpC);
- e->vpermq(ymmA, ymmB, 0);
- e->vpermq(ymmA, anyptr_gpB, 0);
- e->vpermq(zmmA, zmmB, 0);
- e->vpermq(zmmA, anyptr_gpB, 0);
- e->vpermt2b(xmmA, xmmB, xmmC);
- e->vpermt2b(xmmA, xmmB, anyptr_gpC);
- e->vpermt2b(ymmA, ymmB, ymmC);
- e->vpermt2b(ymmA, ymmB, anyptr_gpC);
- e->vpermt2b(zmmA, zmmB, zmmC);
- e->vpermt2b(zmmA, zmmB, anyptr_gpC);
- e->vpermt2d(xmmA, xmmB, xmmC);
- e->vpermt2d(xmmA, xmmB, anyptr_gpC);
- e->vpermt2d(ymmA, ymmB, ymmC);
- e->vpermt2d(ymmA, ymmB, anyptr_gpC);
- e->vpermt2d(zmmA, zmmB, zmmC);
- e->vpermt2d(zmmA, zmmB, anyptr_gpC);
- e->vpermt2pd(xmmA, xmmB, xmmC);
- e->vpermt2pd(xmmA, xmmB, anyptr_gpC);
- e->vpermt2pd(ymmA, ymmB, ymmC);
- e->vpermt2pd(ymmA, ymmB, anyptr_gpC);
- e->vpermt2pd(zmmA, zmmB, zmmC);
- e->vpermt2pd(zmmA, zmmB, anyptr_gpC);
- e->vpermt2ps(xmmA, xmmB, xmmC);
- e->vpermt2ps(xmmA, xmmB, anyptr_gpC);
- e->vpermt2ps(ymmA, ymmB, ymmC);
- e->vpermt2ps(ymmA, ymmB, anyptr_gpC);
- e->vpermt2ps(zmmA, zmmB, zmmC);
- e->vpermt2ps(zmmA, zmmB, anyptr_gpC);
- e->vpermt2q(xmmA, xmmB, xmmC);
- e->vpermt2q(xmmA, xmmB, anyptr_gpC);
- e->vpermt2q(ymmA, ymmB, ymmC);
- e->vpermt2q(ymmA, ymmB, anyptr_gpC);
- e->vpermt2q(zmmA, zmmB, zmmC);
- e->vpermt2q(zmmA, zmmB, anyptr_gpC);
- e->vpermt2w(xmmA, xmmB, xmmC);
- e->vpermt2w(xmmA, xmmB, anyptr_gpC);
- e->vpermt2w(ymmA, ymmB, ymmC);
- e->vpermt2w(ymmA, ymmB, anyptr_gpC);
- e->vpermt2w(zmmA, zmmB, zmmC);
- e->vpermt2w(zmmA, zmmB, anyptr_gpC);
- e->vpermw(xmmA, xmmB, xmmC);
- e->vpermw(xmmA, xmmB, anyptr_gpC);
- e->vpermw(ymmA, ymmB, ymmC);
- e->vpermw(ymmA, ymmB, anyptr_gpC);
- e->vpermw(zmmA, zmmB, zmmC);
- e->vpermw(zmmA, zmmB, anyptr_gpC);
- e->vpexpandd(xmmA, xmmB);
- e->vpexpandd(xmmA, anyptr_gpB);
- e->vpexpandd(ymmA, ymmB);
- e->vpexpandd(ymmA, anyptr_gpB);
- e->vpexpandd(zmmA, zmmB);
- e->vpexpandd(zmmA, anyptr_gpB);
- e->vpexpandq(xmmA, xmmB);
- e->vpexpandq(xmmA, anyptr_gpB);
- e->vpexpandq(ymmA, ymmB);
- e->vpexpandq(ymmA, anyptr_gpB);
- e->vpexpandq(zmmA, zmmB);
- e->vpexpandq(zmmA, anyptr_gpB);
- e->vpextrb(gdA, xmmB, 0);
- e->vpextrb(anyptr_gpA, xmmB, 0);
- e->vpextrb(gzA, xmmB, 0);
- e->vpextrd(gdA, xmmB, 0);
- e->vpextrd(anyptr_gpA, xmmB, 0);
- if (isX64) e->vpextrd(gzA, xmmB, 0);
- if (isX64) e->vpextrq(gzA, xmmB, 0);
- e->vpextrq(anyptr_gpA, xmmB, 0);
- e->vpextrw(gdA, xmmB, 0);
- e->vpextrw(gzA, xmmB, 0);
- e->vpextrw(gdA, xmmB, 0);
- e->vpextrw(anyptr_gpA, xmmB, 0);
- e->vpextrw(gzA, xmmB, 0);
- e->vpgatherdd(xmmA, vx_ptr);
- e->vpgatherdd(ymmA, vy_ptr);
- e->vpgatherdd(zmmA, vz_ptr);
- e->vpgatherdq(xmmA, vx_ptr);
- e->vpgatherdq(ymmA, vy_ptr);
- e->vpgatherdq(zmmA, vz_ptr);
- e->vpgatherqd(xmmA, vx_ptr);
- e->vpgatherqd(ymmA, vy_ptr);
- e->vpgatherqd(zmmA, vz_ptr);
- e->vpgatherqq(xmmA, vx_ptr);
- e->vpgatherqq(ymmA, vy_ptr);
- e->vpgatherqq(zmmA, vz_ptr);
- e->vpinsrb(xmmA, xmmB, gdC, 0);
- e->vpinsrb(xmmA, xmmB, anyptr_gpC, 0);
- e->vpinsrb(xmmA, xmmB, gzC, 0);
- e->vpinsrd(xmmA, xmmB, gdC, 0);
- e->vpinsrd(xmmA, xmmB, anyptr_gpC, 0);
- e->vpinsrd(xmmA, xmmB, gzC, 0);
- if (isX64) e->vpinsrq(xmmA, xmmB, gzC, 0);
- e->vpinsrq(xmmA, xmmB, anyptr_gpC, 0);
- e->vpinsrw(xmmA, xmmB, gdC, 0);
- e->vpinsrw(xmmA, xmmB, anyptr_gpC, 0);
- e->vpinsrw(xmmA, xmmB, gzC, 0);
- e->vplzcntd(xmmA, xmmB);
- e->vplzcntd(xmmA, anyptr_gpB);
- e->vplzcntd(ymmA, ymmB);
- e->vplzcntd(ymmA, anyptr_gpB);
- e->vplzcntd(zmmA, zmmB);
- e->vplzcntd(zmmA, anyptr_gpB);
- e->vplzcntq(xmmA, xmmB);
- e->vplzcntq(xmmA, anyptr_gpB);
- e->vplzcntq(ymmA, ymmB);
- e->vplzcntq(ymmA, anyptr_gpB);
- e->vplzcntq(zmmA, zmmB);
- e->vplzcntq(zmmA, anyptr_gpB);
- e->vpmadd52huq(xmmA, xmmB, xmmC);
- e->vpmadd52huq(xmmA, xmmB, anyptr_gpC);
- e->vpmadd52huq(ymmA, ymmB, ymmC);
- e->vpmadd52huq(ymmA, ymmB, anyptr_gpC);
- e->vpmadd52huq(zmmA, zmmB, zmmC);
- e->vpmadd52huq(zmmA, zmmB, anyptr_gpC);
- e->vpmadd52luq(xmmA, xmmB, xmmC);
- e->vpmadd52luq(xmmA, xmmB, anyptr_gpC);
- e->vpmadd52luq(ymmA, ymmB, ymmC);
- e->vpmadd52luq(ymmA, ymmB, anyptr_gpC);
- e->vpmadd52luq(zmmA, zmmB, zmmC);
- e->vpmadd52luq(zmmA, zmmB, anyptr_gpC);
- e->vpmaddubsw(xmmA, xmmB, xmmC);
- e->vpmaddubsw(xmmA, xmmB, anyptr_gpC);
- e->vpmaddubsw(ymmA, ymmB, ymmC);
- e->vpmaddubsw(ymmA, ymmB, anyptr_gpC);
- e->vpmaddubsw(zmmA, zmmB, zmmC);
- e->vpmaddubsw(zmmA, zmmB, anyptr_gpC);
- e->vpmaddwd(xmmA, xmmB, xmmC);
- e->vpmaddwd(xmmA, xmmB, anyptr_gpC);
- e->vpmaddwd(ymmA, ymmB, ymmC);
- e->vpmaddwd(ymmA, ymmB, anyptr_gpC);
- e->vpmaddwd(zmmA, zmmB, zmmC);
- e->vpmaddwd(zmmA, zmmB, anyptr_gpC);
- e->vpmaxsb(xmmA, xmmB, xmmC);
- e->vpmaxsb(xmmA, xmmB, anyptr_gpC);
- e->vpmaxsb(ymmA, ymmB, ymmC);
- e->vpmaxsb(ymmA, ymmB, anyptr_gpC);
- e->vpmaxsb(zmmA, zmmB, zmmC);
- e->vpmaxsb(zmmA, zmmB, anyptr_gpC);
- e->vpmaxsd(xmmA, xmmB, xmmC);
- e->vpmaxsd(xmmA, xmmB, anyptr_gpC);
- e->vpmaxsd(ymmA, ymmB, ymmC);
- e->vpmaxsd(ymmA, ymmB, anyptr_gpC);
- e->vpmaxsd(zmmA, zmmB, zmmC);
- e->vpmaxsd(zmmA, zmmB, anyptr_gpC);
- e->vpmaxsq(xmmA, xmmB, xmmC);
- e->vpmaxsq(xmmA, xmmB, anyptr_gpC);
- e->vpmaxsq(ymmA, ymmB, ymmC);
- e->vpmaxsq(ymmA, ymmB, anyptr_gpC);
- e->vpmaxsq(zmmA, zmmB, zmmC);
- e->vpmaxsq(zmmA, zmmB, anyptr_gpC);
- e->vpmaxsw(xmmA, xmmB, xmmC);
- e->vpmaxsw(xmmA, xmmB, anyptr_gpC);
- e->vpmaxsw(ymmA, ymmB, ymmC);
- e->vpmaxsw(ymmA, ymmB, anyptr_gpC);
- e->vpmaxsw(zmmA, zmmB, zmmC);
- e->vpmaxsw(zmmA, zmmB, anyptr_gpC);
- e->vpmaxub(xmmA, xmmB, xmmC);
- e->vpmaxub(xmmA, xmmB, anyptr_gpC);
- e->vpmaxub(ymmA, ymmB, ymmC);
- e->vpmaxub(ymmA, ymmB, anyptr_gpC);
- e->vpmaxub(zmmA, zmmB, zmmC);
- e->vpmaxub(zmmA, zmmB, anyptr_gpC);
- e->vpmaxud(xmmA, xmmB, xmmC);
- e->vpmaxud(xmmA, xmmB, anyptr_gpC);
- e->vpmaxud(ymmA, ymmB, ymmC);
- e->vpmaxud(ymmA, ymmB, anyptr_gpC);
- e->vpmaxud(zmmA, zmmB, zmmC);
- e->vpmaxud(zmmA, zmmB, anyptr_gpC);
- e->vpmaxuq(xmmA, xmmB, xmmC);
- e->vpmaxuq(xmmA, xmmB, anyptr_gpC);
- e->vpmaxuq(ymmA, ymmB, ymmC);
- e->vpmaxuq(ymmA, ymmB, anyptr_gpC);
- e->vpmaxuq(zmmA, zmmB, zmmC);
- e->vpmaxuq(zmmA, zmmB, anyptr_gpC);
- e->vpmaxuw(xmmA, xmmB, xmmC);
- e->vpmaxuw(xmmA, xmmB, anyptr_gpC);
- e->vpmaxuw(ymmA, ymmB, ymmC);
- e->vpmaxuw(ymmA, ymmB, anyptr_gpC);
- e->vpmaxuw(zmmA, zmmB, zmmC);
- e->vpmaxuw(zmmA, zmmB, anyptr_gpC);
- e->vpminsb(xmmA, xmmB, xmmC);
- e->vpminsb(xmmA, xmmB, anyptr_gpC);
- e->vpminsb(ymmA, ymmB, ymmC);
- e->vpminsb(ymmA, ymmB, anyptr_gpC);
- e->vpminsb(zmmA, zmmB, zmmC);
- e->vpminsb(zmmA, zmmB, anyptr_gpC);
- e->vpminsd(xmmA, xmmB, xmmC);
- e->vpminsd(xmmA, xmmB, anyptr_gpC);
- e->vpminsd(ymmA, ymmB, ymmC);
- e->vpminsd(ymmA, ymmB, anyptr_gpC);
- e->vpminsd(zmmA, zmmB, zmmC);
- e->vpminsd(zmmA, zmmB, anyptr_gpC);
- e->vpminsq(xmmA, xmmB, xmmC);
- e->vpminsq(xmmA, xmmB, anyptr_gpC);
- e->vpminsq(ymmA, ymmB, ymmC);
- e->vpminsq(ymmA, ymmB, anyptr_gpC);
- e->vpminsq(zmmA, zmmB, zmmC);
- e->vpminsq(zmmA, zmmB, anyptr_gpC);
- e->vpminsw(xmmA, xmmB, xmmC);
- e->vpminsw(xmmA, xmmB, anyptr_gpC);
- e->vpminsw(ymmA, ymmB, ymmC);
- e->vpminsw(ymmA, ymmB, anyptr_gpC);
- e->vpminsw(zmmA, zmmB, zmmC);
- e->vpminsw(zmmA, zmmB, anyptr_gpC);
- e->vpminub(xmmA, xmmB, xmmC);
- e->vpminub(xmmA, xmmB, anyptr_gpC);
- e->vpminub(ymmA, ymmB, ymmC);
- e->vpminub(ymmA, ymmB, anyptr_gpC);
- e->vpminub(zmmA, zmmB, zmmC);
- e->vpminub(zmmA, zmmB, anyptr_gpC);
- e->vpminud(xmmA, xmmB, xmmC);
- e->vpminud(xmmA, xmmB, anyptr_gpC);
- e->vpminud(ymmA, ymmB, ymmC);
- e->vpminud(ymmA, ymmB, anyptr_gpC);
- e->vpminud(zmmA, zmmB, zmmC);
- e->vpminud(zmmA, zmmB, anyptr_gpC);
- e->vpminuq(xmmA, xmmB, xmmC);
- e->vpminuq(xmmA, xmmB, anyptr_gpC);
- e->vpminuq(ymmA, ymmB, ymmC);
- e->vpminuq(ymmA, ymmB, anyptr_gpC);
- e->vpminuq(zmmA, zmmB, zmmC);
- e->vpminuq(zmmA, zmmB, anyptr_gpC);
- e->vpminuw(xmmA, xmmB, xmmC);
- e->vpminuw(xmmA, xmmB, anyptr_gpC);
- e->vpminuw(ymmA, ymmB, ymmC);
- e->vpminuw(ymmA, ymmB, anyptr_gpC);
- e->vpminuw(zmmA, zmmB, zmmC);
- e->vpminuw(zmmA, zmmB, anyptr_gpC);
- e->vpmovb2m(kA, xmmB);
- e->vpmovb2m(kA, ymmB);
- e->vpmovb2m(kA, zmmB);
- e->vpmovd2m(kA, xmmB);
- e->vpmovd2m(kA, ymmB);
- e->vpmovd2m(kA, zmmB);
- e->vpmovdb(xmmA, xmmB);
- e->vpmovdb(anyptr_gpA, xmmB);
- e->vpmovdb(xmmA, ymmB);
- e->vpmovdb(anyptr_gpA, ymmB);
- e->vpmovdb(xmmA, zmmB);
- e->vpmovdb(anyptr_gpA, zmmB);
- e->vpmovdw(xmmA, xmmB);
- e->vpmovdw(anyptr_gpA, xmmB);
- e->vpmovdw(xmmA, ymmB);
- e->vpmovdw(anyptr_gpA, ymmB);
- e->vpmovdw(ymmA, zmmB);
- e->vpmovdw(anyptr_gpA, zmmB);
- e->vpmovm2b(xmmA, kB);
- e->vpmovm2b(ymmA, kB);
- e->vpmovm2b(zmmA, kB);
- e->vpmovm2d(xmmA, kB);
- e->vpmovm2d(ymmA, kB);
- e->vpmovm2d(zmmA, kB);
- e->vpmovm2q(xmmA, kB);
- e->vpmovm2q(ymmA, kB);
- e->vpmovm2q(zmmA, kB);
- e->vpmovm2w(xmmA, kB);
- e->vpmovm2w(ymmA, kB);
- e->vpmovm2w(zmmA, kB);
- e->vpmovq2m(kA, xmmB);
- e->vpmovq2m(kA, ymmB);
- e->vpmovq2m(kA, zmmB);
- e->vpmovqb(xmmA, xmmB);
- e->vpmovqb(anyptr_gpA, xmmB);
- e->vpmovqb(xmmA, ymmB);
- e->vpmovqb(anyptr_gpA, ymmB);
- e->vpmovqb(xmmA, zmmB);
- e->vpmovqb(anyptr_gpA, zmmB);
- e->vpmovqd(xmmA, xmmB);
- e->vpmovqd(anyptr_gpA, xmmB);
- e->vpmovqd(xmmA, ymmB);
- e->vpmovqd(anyptr_gpA, ymmB);
- e->vpmovqd(ymmA, zmmB);
- e->vpmovqd(anyptr_gpA, zmmB);
- e->vpmovqw(xmmA, xmmB);
- e->vpmovqw(anyptr_gpA, xmmB);
- e->vpmovqw(xmmA, ymmB);
- e->vpmovqw(anyptr_gpA, ymmB);
- e->vpmovqw(xmmA, zmmB);
- e->vpmovqw(anyptr_gpA, zmmB);
- e->vpmovsdb(xmmA, xmmB);
- e->vpmovsdb(anyptr_gpA, xmmB);
- e->vpmovsdb(xmmA, ymmB);
- e->vpmovsdb(anyptr_gpA, ymmB);
- e->vpmovsdb(xmmA, zmmB);
- e->vpmovsdb(anyptr_gpA, zmmB);
- e->vpmovsdw(xmmA, xmmB);
- e->vpmovsdw(anyptr_gpA, xmmB);
- e->vpmovsdw(xmmA, ymmB);
- e->vpmovsdw(anyptr_gpA, ymmB);
- e->vpmovsdw(ymmA, zmmB);
- e->vpmovsdw(anyptr_gpA, zmmB);
- e->vpmovsqb(xmmA, xmmB);
- e->vpmovsqb(anyptr_gpA, xmmB);
- e->vpmovsqb(xmmA, ymmB);
- e->vpmovsqb(anyptr_gpA, ymmB);
- e->vpmovsqb(xmmA, zmmB);
- e->vpmovsqb(anyptr_gpA, zmmB);
- e->vpmovsqd(xmmA, xmmB);
- e->vpmovsqd(anyptr_gpA, xmmB);
- e->vpmovsqd(xmmA, ymmB);
- e->vpmovsqd(anyptr_gpA, ymmB);
- e->vpmovsqd(ymmA, zmmB);
- e->vpmovsqd(anyptr_gpA, zmmB);
- e->vpmovsqw(xmmA, xmmB);
- e->vpmovsqw(anyptr_gpA, xmmB);
- e->vpmovsqw(xmmA, ymmB);
- e->vpmovsqw(anyptr_gpA, ymmB);
- e->vpmovsqw(xmmA, zmmB);
- e->vpmovsqw(anyptr_gpA, zmmB);
- e->vpmovswb(xmmA, xmmB);
- e->vpmovswb(anyptr_gpA, xmmB);
- e->vpmovswb(xmmA, ymmB);
- e->vpmovswb(anyptr_gpA, ymmB);
- e->vpmovswb(ymmA, zmmB);
- e->vpmovswb(anyptr_gpA, zmmB);
- e->vpmovsxbd(xmmA, xmmB);
- e->vpmovsxbd(xmmA, anyptr_gpB);
- e->vpmovsxbd(ymmA, xmmB);
- e->vpmovsxbd(ymmA, anyptr_gpB);
- e->vpmovsxbd(zmmA, xmmB);
- e->vpmovsxbd(zmmA, anyptr_gpB);
- e->vpmovsxbq(xmmA, xmmB);
- e->vpmovsxbq(xmmA, anyptr_gpB);
- e->vpmovsxbq(ymmA, xmmB);
- e->vpmovsxbq(ymmA, anyptr_gpB);
- e->vpmovsxbq(zmmA, xmmB);
- e->vpmovsxbq(zmmA, anyptr_gpB);
- e->vpmovsxbw(xmmA, xmmB);
- e->vpmovsxbw(xmmA, anyptr_gpB);
- e->vpmovsxbw(ymmA, xmmB);
- e->vpmovsxbw(ymmA, anyptr_gpB);
- e->vpmovsxbw(zmmA, ymmB);
- e->vpmovsxbw(zmmA, anyptr_gpB);
- e->vpmovsxdq(xmmA, xmmB);
- e->vpmovsxdq(xmmA, anyptr_gpB);
- e->vpmovsxdq(ymmA, xmmB);
- e->vpmovsxdq(ymmA, anyptr_gpB);
- e->vpmovsxdq(zmmA, ymmB);
- e->vpmovsxdq(zmmA, anyptr_gpB);
- e->vpmovsxwd(xmmA, xmmB);
- e->vpmovsxwd(xmmA, anyptr_gpB);
- e->vpmovsxwd(ymmA, xmmB);
- e->vpmovsxwd(ymmA, anyptr_gpB);
- e->vpmovsxwd(zmmA, ymmB);
- e->vpmovsxwd(zmmA, anyptr_gpB);
- e->vpmovsxwq(xmmA, xmmB);
- e->vpmovsxwq(xmmA, anyptr_gpB);
- e->vpmovsxwq(ymmA, xmmB);
- e->vpmovsxwq(ymmA, anyptr_gpB);
- e->vpmovsxwq(zmmA, xmmB);
- e->vpmovsxwq(zmmA, anyptr_gpB);
- e->vpmovusdb(xmmA, xmmB);
- e->vpmovusdb(anyptr_gpA, xmmB);
- e->vpmovusdb(xmmA, ymmB);
- e->vpmovusdb(anyptr_gpA, ymmB);
- e->vpmovusdb(xmmA, zmmB);
- e->vpmovusdb(anyptr_gpA, zmmB);
- e->vpmovusdw(xmmA, xmmB);
- e->vpmovusdw(anyptr_gpA, xmmB);
- e->vpmovusdw(xmmA, ymmB);
- e->vpmovusdw(anyptr_gpA, ymmB);
- e->vpmovusdw(ymmA, zmmB);
- e->vpmovusdw(anyptr_gpA, zmmB);
- e->vpmovusqb(xmmA, xmmB);
- e->vpmovusqb(anyptr_gpA, xmmB);
- e->vpmovusqb(xmmA, ymmB);
- e->vpmovusqb(anyptr_gpA, ymmB);
- e->vpmovusqb(xmmA, zmmB);
- e->vpmovusqb(anyptr_gpA, zmmB);
- e->vpmovusqd(xmmA, xmmB);
- e->vpmovusqd(anyptr_gpA, xmmB);
- e->vpmovusqd(xmmA, ymmB);
- e->vpmovusqd(anyptr_gpA, ymmB);
- e->vpmovusqd(ymmA, zmmB);
- e->vpmovusqd(anyptr_gpA, zmmB);
- e->vpmovusqw(xmmA, xmmB);
- e->vpmovusqw(anyptr_gpA, xmmB);
- e->vpmovusqw(xmmA, ymmB);
- e->vpmovusqw(anyptr_gpA, ymmB);
- e->vpmovusqw(xmmA, zmmB);
- e->vpmovusqw(anyptr_gpA, zmmB);
- e->vpmovuswb(xmmA, xmmB);
- e->vpmovuswb(anyptr_gpA, xmmB);
- e->vpmovuswb(xmmA, ymmB);
- e->vpmovuswb(anyptr_gpA, ymmB);
- e->vpmovuswb(ymmA, zmmB);
- e->vpmovuswb(anyptr_gpA, zmmB);
- e->vpmovw2m(kA, xmmB);
- e->vpmovw2m(kA, ymmB);
- e->vpmovw2m(kA, zmmB);
- e->vpmovwb(xmmA, xmmB);
- e->vpmovwb(anyptr_gpA, xmmB);
- e->vpmovwb(xmmA, ymmB);
- e->vpmovwb(anyptr_gpA, ymmB);
- e->vpmovwb(ymmA, zmmB);
- e->vpmovwb(anyptr_gpA, zmmB);
- e->vpmovzxbd(xmmA, xmmB);
- e->vpmovzxbd(xmmA, anyptr_gpB);
- e->vpmovzxbd(ymmA, xmmB);
- e->vpmovzxbd(ymmA, anyptr_gpB);
- e->vpmovzxbd(zmmA, xmmB);
- e->vpmovzxbd(zmmA, anyptr_gpB);
- e->vpmovzxbq(xmmA, xmmB);
- e->vpmovzxbq(xmmA, anyptr_gpB);
- e->vpmovzxbq(ymmA, xmmB);
- e->vpmovzxbq(ymmA, anyptr_gpB);
- e->vpmovzxbq(zmmA, xmmB);
- e->vpmovzxbq(zmmA, anyptr_gpB);
- e->vpmovzxbw(xmmA, xmmB);
- e->vpmovzxbw(xmmA, anyptr_gpB);
- e->vpmovzxbw(ymmA, xmmB);
- e->vpmovzxbw(ymmA, anyptr_gpB);
- e->vpmovzxbw(zmmA, ymmB);
- e->vpmovzxbw(zmmA, anyptr_gpB);
- e->vpmovzxdq(xmmA, xmmB);
- e->vpmovzxdq(xmmA, anyptr_gpB);
- e->vpmovzxdq(ymmA, xmmB);
- e->vpmovzxdq(ymmA, anyptr_gpB);
- e->vpmovzxdq(zmmA, ymmB);
- e->vpmovzxdq(zmmA, anyptr_gpB);
- e->vpmovzxwd(xmmA, xmmB);
- e->vpmovzxwd(xmmA, anyptr_gpB);
- e->vpmovzxwd(ymmA, xmmB);
- e->vpmovzxwd(ymmA, anyptr_gpB);
- e->vpmovzxwd(zmmA, ymmB);
- e->vpmovzxwd(zmmA, anyptr_gpB);
- e->vpmovzxwq(xmmA, xmmB);
- e->vpmovzxwq(xmmA, anyptr_gpB);
- e->vpmovzxwq(ymmA, xmmB);
- e->vpmovzxwq(ymmA, anyptr_gpB);
- e->vpmovzxwq(zmmA, xmmB);
- e->vpmovzxwq(zmmA, anyptr_gpB);
- e->vpmuldq(xmmA, xmmB, xmmC);
- e->vpmuldq(xmmA, xmmB, anyptr_gpC);
- e->vpmuldq(ymmA, ymmB, ymmC);
- e->vpmuldq(ymmA, ymmB, anyptr_gpC);
- e->vpmuldq(zmmA, zmmB, zmmC);
- e->vpmuldq(zmmA, zmmB, anyptr_gpC);
- e->vpmulhrsw(xmmA, xmmB, xmmC);
- e->vpmulhrsw(xmmA, xmmB, anyptr_gpC);
- e->vpmulhrsw(ymmA, ymmB, ymmC);
- e->vpmulhrsw(ymmA, ymmB, anyptr_gpC);
- e->vpmulhrsw(zmmA, zmmB, zmmC);
- e->vpmulhrsw(zmmA, zmmB, anyptr_gpC);
- e->vpmulhuw(xmmA, xmmB, xmmC);
- e->vpmulhuw(xmmA, xmmB, anyptr_gpC);
- e->vpmulhuw(ymmA, ymmB, ymmC);
- e->vpmulhuw(ymmA, ymmB, anyptr_gpC);
- e->vpmulhuw(zmmA, zmmB, zmmC);
- e->vpmulhuw(zmmA, zmmB, anyptr_gpC);
- e->vpmulhw(xmmA, xmmB, xmmC);
- e->vpmulhw(xmmA, xmmB, anyptr_gpC);
- e->vpmulhw(ymmA, ymmB, ymmC);
- e->vpmulhw(ymmA, ymmB, anyptr_gpC);
- e->vpmulhw(zmmA, zmmB, zmmC);
- e->vpmulhw(zmmA, zmmB, anyptr_gpC);
- e->vpmulld(xmmA, xmmB, xmmC);
- e->vpmulld(xmmA, xmmB, anyptr_gpC);
- e->vpmulld(ymmA, ymmB, ymmC);
- e->vpmulld(ymmA, ymmB, anyptr_gpC);
- e->vpmulld(zmmA, zmmB, zmmC);
- e->vpmulld(zmmA, zmmB, anyptr_gpC);
- e->vpmullq(xmmA, xmmB, xmmC);
- e->vpmullq(xmmA, xmmB, anyptr_gpC);
- e->vpmullq(ymmA, ymmB, ymmC);
- e->vpmullq(ymmA, ymmB, anyptr_gpC);
- e->vpmullq(zmmA, zmmB, zmmC);
- e->vpmullq(zmmA, zmmB, anyptr_gpC);
- e->vpmullw(xmmA, xmmB, xmmC);
- e->vpmullw(xmmA, xmmB, anyptr_gpC);
- e->vpmullw(ymmA, ymmB, ymmC);
- e->vpmullw(ymmA, ymmB, anyptr_gpC);
- e->vpmullw(zmmA, zmmB, zmmC);
- e->vpmullw(zmmA, zmmB, anyptr_gpC);
- e->vpmultishiftqb(xmmA, xmmB, xmmC);
- e->vpmultishiftqb(xmmA, xmmB, anyptr_gpC);
- e->vpmultishiftqb(ymmA, ymmB, ymmC);
- e->vpmultishiftqb(ymmA, ymmB, anyptr_gpC);
- e->vpmultishiftqb(zmmA, zmmB, zmmC);
- e->vpmultishiftqb(zmmA, zmmB, anyptr_gpC);
- e->vpmuludq(xmmA, xmmB, xmmC);
- e->vpmuludq(xmmA, xmmB, anyptr_gpC);
- e->vpmuludq(ymmA, ymmB, ymmC);
- e->vpmuludq(ymmA, ymmB, anyptr_gpC);
- e->vpmuludq(zmmA, zmmB, zmmC);
- e->vpmuludq(zmmA, zmmB, anyptr_gpC);
- e->vpopcntd(zmmA, zmmB);
- e->vpopcntd(zmmA, anyptr_gpB);
- e->vpopcntq(zmmA, zmmB);
- e->vpopcntq(zmmA, anyptr_gpB);
- e->vpord(xmmA, xmmB, xmmC);
- e->vpord(xmmA, xmmB, anyptr_gpC);
- e->vpord(ymmA, ymmB, ymmC);
- e->vpord(ymmA, ymmB, anyptr_gpC);
- e->vpord(zmmA, zmmB, zmmC);
- e->vpord(zmmA, zmmB, anyptr_gpC);
- e->vporq(xmmA, xmmB, xmmC);
- e->vporq(xmmA, xmmB, anyptr_gpC);
- e->vporq(ymmA, ymmB, ymmC);
- e->vporq(ymmA, ymmB, anyptr_gpC);
- e->vporq(zmmA, zmmB, zmmC);
- e->vporq(zmmA, zmmB, anyptr_gpC);
- e->vprold(xmmA, xmmB, 0);
- e->vprold(xmmA, anyptr_gpB, 0);
- e->vprold(ymmA, ymmB, 0);
- e->vprold(ymmA, anyptr_gpB, 0);
- e->vprold(zmmA, zmmB, 0);
- e->vprold(zmmA, anyptr_gpB, 0);
- e->vprolq(xmmA, xmmB, 0);
- e->vprolq(xmmA, anyptr_gpB, 0);
- e->vprolq(ymmA, ymmB, 0);
- e->vprolq(ymmA, anyptr_gpB, 0);
- e->vprolq(zmmA, zmmB, 0);
- e->vprolq(zmmA, anyptr_gpB, 0);
- e->vprolvd(xmmA, xmmB, xmmC);
- e->vprolvd(xmmA, xmmB, anyptr_gpC);
- e->vprolvd(ymmA, ymmB, ymmC);
- e->vprolvd(ymmA, ymmB, anyptr_gpC);
- e->vprolvd(zmmA, zmmB, zmmC);
- e->vprolvd(zmmA, zmmB, anyptr_gpC);
- e->vprolvq(xmmA, xmmB, xmmC);
- e->vprolvq(xmmA, xmmB, anyptr_gpC);
- e->vprolvq(ymmA, ymmB, ymmC);
- e->vprolvq(ymmA, ymmB, anyptr_gpC);
- e->vprolvq(zmmA, zmmB, zmmC);
- e->vprolvq(zmmA, zmmB, anyptr_gpC);
- e->vprord(xmmA, xmmB, 0);
- e->vprord(xmmA, anyptr_gpB, 0);
- e->vprord(ymmA, ymmB, 0);
- e->vprord(ymmA, anyptr_gpB, 0);
- e->vprord(zmmA, zmmB, 0);
- e->vprord(zmmA, anyptr_gpB, 0);
- e->vprorq(xmmA, xmmB, 0);
- e->vprorq(xmmA, anyptr_gpB, 0);
- e->vprorq(ymmA, ymmB, 0);
- e->vprorq(ymmA, anyptr_gpB, 0);
- e->vprorq(zmmA, zmmB, 0);
- e->vprorq(zmmA, anyptr_gpB, 0);
- e->vprorvd(xmmA, xmmB, xmmC);
- e->vprorvd(xmmA, xmmB, anyptr_gpC);
- e->vprorvd(ymmA, ymmB, ymmC);
- e->vprorvd(ymmA, ymmB, anyptr_gpC);
- e->vprorvd(zmmA, zmmB, zmmC);
- e->vprorvd(zmmA, zmmB, anyptr_gpC);
- e->vprorvq(xmmA, xmmB, xmmC);
- e->vprorvq(xmmA, xmmB, anyptr_gpC);
- e->vprorvq(ymmA, ymmB, ymmC);
- e->vprorvq(ymmA, ymmB, anyptr_gpC);
- e->vprorvq(zmmA, zmmB, zmmC);
- e->vprorvq(zmmA, zmmB, anyptr_gpC);
- e->vpsadbw(xmmA, xmmB, xmmC);
- e->vpsadbw(xmmA, xmmB, anyptr_gpC);
- e->vpsadbw(ymmA, ymmB, ymmC);
- e->vpsadbw(ymmA, ymmB, anyptr_gpC);
- e->vpsadbw(zmmA, zmmB, zmmC);
- e->vpsadbw(zmmA, zmmB, anyptr_gpC);
- e->vpscatterdd(vx_ptr, xmmB);
- e->vpscatterdd(vy_ptr, ymmB);
- e->vpscatterdd(vz_ptr, zmmB);
- e->vpscatterdq(vx_ptr, xmmB);
- e->vpscatterdq(vy_ptr, ymmB);
- e->vpscatterdq(vz_ptr, zmmB);
- e->vpscatterqd(vx_ptr, xmmB);
- e->vpscatterqd(vy_ptr, xmmB);
- e->vpscatterqd(vz_ptr, ymmB);
- e->vpscatterqq(vx_ptr, xmmB);
- e->vpscatterqq(vy_ptr, ymmB);
- e->vpscatterqq(vz_ptr, zmmB);
- e->vpshufb(xmmA, xmmB, xmmC);
- e->vpshufb(xmmA, xmmB, anyptr_gpC);
- e->vpshufb(ymmA, ymmB, ymmC);
- e->vpshufb(ymmA, ymmB, anyptr_gpC);
- e->vpshufb(zmmA, zmmB, zmmC);
- e->vpshufb(zmmA, zmmB, anyptr_gpC);
- e->vpshufd(xmmA, xmmB, 0);
- e->vpshufd(xmmA, anyptr_gpB, 0);
- e->vpshufd(ymmA, ymmB, 0);
- e->vpshufd(ymmA, anyptr_gpB, 0);
- e->vpshufd(zmmA, zmmB, 0);
- e->vpshufd(zmmA, anyptr_gpB, 0);
- e->vpshufhw(xmmA, xmmB, 0);
- e->vpshufhw(xmmA, anyptr_gpB, 0);
- e->vpshufhw(ymmA, ymmB, 0);
- e->vpshufhw(ymmA, anyptr_gpB, 0);
- e->vpshufhw(zmmA, zmmB, 0);
- e->vpshufhw(zmmA, anyptr_gpB, 0);
- e->vpshuflw(xmmA, xmmB, 0);
- e->vpshuflw(xmmA, anyptr_gpB, 0);
- e->vpshuflw(ymmA, ymmB, 0);
- e->vpshuflw(ymmA, anyptr_gpB, 0);
- e->vpshuflw(zmmA, zmmB, 0);
- e->vpshuflw(zmmA, anyptr_gpB, 0);
- e->vpslld(xmmA, xmmB, xmmC);
- e->vpslld(xmmA, xmmB, anyptr_gpC);
- e->vpslld(xmmA, xmmB, 0);
- e->vpslld(xmmA, anyptr_gpB, 0);
- e->vpslld(ymmA, ymmB, xmmC);
- e->vpslld(ymmA, ymmB, anyptr_gpC);
- e->vpslld(ymmA, ymmB, 0);
- e->vpslld(ymmA, anyptr_gpB, 0);
- e->vpslld(zmmA, zmmB, xmmC);
- e->vpslld(zmmA, zmmB, anyptr_gpC);
- e->vpslld(zmmA, zmmB, 0);
- e->vpslld(zmmA, anyptr_gpB, 0);
- e->vpslldq(xmmA, xmmB, 0);
- e->vpslldq(xmmA, anyptr_gpB, 0);
- e->vpslldq(ymmA, ymmB, 0);
- e->vpslldq(ymmA, anyptr_gpB, 0);
- e->vpslldq(zmmA, zmmB, 0);
- e->vpslldq(zmmA, anyptr_gpB, 0);
- e->vpsllq(xmmA, xmmB, xmmC);
- e->vpsllq(xmmA, xmmB, anyptr_gpC);
- e->vpsllq(xmmA, xmmB, 0);
- e->vpsllq(xmmA, anyptr_gpB, 0);
- e->vpsllq(ymmA, ymmB, xmmC);
- e->vpsllq(ymmA, ymmB, anyptr_gpC);
- e->vpsllq(ymmA, ymmB, 0);
- e->vpsllq(ymmA, anyptr_gpB, 0);
- e->vpsllq(zmmA, zmmB, xmmC);
- e->vpsllq(zmmA, zmmB, anyptr_gpC);
- e->vpsllq(zmmA, zmmB, 0);
- e->vpsllq(zmmA, anyptr_gpB, 0);
- e->vpsllvd(xmmA, xmmB, xmmC);
- e->vpsllvd(xmmA, xmmB, anyptr_gpC);
- e->vpsllvd(ymmA, ymmB, ymmC);
- e->vpsllvd(ymmA, ymmB, anyptr_gpC);
- e->vpsllvd(zmmA, zmmB, zmmC);
- e->vpsllvd(zmmA, zmmB, anyptr_gpC);
- e->vpsllvq(xmmA, xmmB, xmmC);
- e->vpsllvq(xmmA, xmmB, anyptr_gpC);
- e->vpsllvq(ymmA, ymmB, ymmC);
- e->vpsllvq(ymmA, ymmB, anyptr_gpC);
- e->vpsllvq(zmmA, zmmB, zmmC);
- e->vpsllvq(zmmA, zmmB, anyptr_gpC);
- e->vpsllvw(xmmA, xmmB, xmmC);
- e->vpsllvw(xmmA, xmmB, anyptr_gpC);
- e->vpsllvw(ymmA, ymmB, ymmC);
- e->vpsllvw(ymmA, ymmB, anyptr_gpC);
- e->vpsllvw(zmmA, zmmB, zmmC);
- e->vpsllvw(zmmA, zmmB, anyptr_gpC);
- e->vpsllw(xmmA, xmmB, xmmC);
- e->vpsllw(xmmA, xmmB, anyptr_gpC);
- e->vpsllw(xmmA, xmmB, 0);
- e->vpsllw(xmmA, anyptr_gpB, 0);
- e->vpsllw(ymmA, ymmB, xmmC);
- e->vpsllw(ymmA, ymmB, anyptr_gpC);
- e->vpsllw(ymmA, ymmB, 0);
- e->vpsllw(ymmA, anyptr_gpB, 0);
- e->vpsllw(zmmA, zmmB, xmmC);
- e->vpsllw(zmmA, zmmB, anyptr_gpC);
- e->vpsllw(zmmA, zmmB, 0);
- e->vpsllw(zmmA, anyptr_gpB, 0);
- e->vpsrad(xmmA, xmmB, xmmC);
- e->vpsrad(xmmA, xmmB, anyptr_gpC);
- e->vpsrad(xmmA, xmmB, 0);
- e->vpsrad(xmmA, anyptr_gpB, 0);
- e->vpsrad(ymmA, ymmB, xmmC);
- e->vpsrad(ymmA, ymmB, anyptr_gpC);
- e->vpsrad(ymmA, ymmB, 0);
- e->vpsrad(ymmA, anyptr_gpB, 0);
- e->vpsrad(zmmA, zmmB, xmmC);
- e->vpsrad(zmmA, zmmB, anyptr_gpC);
- e->vpsrad(zmmA, zmmB, 0);
- e->vpsrad(zmmA, anyptr_gpB, 0);
- e->vpsraq(xmmA, xmmB, xmmC);
- e->vpsraq(xmmA, xmmB, anyptr_gpC);
- e->vpsraq(xmmA, xmmB, 0);
- e->vpsraq(xmmA, anyptr_gpB, 0);
- e->vpsraq(ymmA, ymmB, xmmC);
- e->vpsraq(ymmA, ymmB, anyptr_gpC);
- e->vpsraq(ymmA, ymmB, 0);
- e->vpsraq(ymmA, anyptr_gpB, 0);
- e->vpsraq(zmmA, zmmB, xmmC);
- e->vpsraq(zmmA, zmmB, anyptr_gpC);
- e->vpsraq(zmmA, zmmB, 0);
- e->vpsraq(zmmA, anyptr_gpB, 0);
- e->vpsravd(xmmA, xmmB, xmmC);
- e->vpsravd(xmmA, xmmB, anyptr_gpC);
- e->vpsravd(ymmA, ymmB, ymmC);
- e->vpsravd(ymmA, ymmB, anyptr_gpC);
- e->vpsravd(zmmA, zmmB, zmmC);
- e->vpsravd(zmmA, zmmB, anyptr_gpC);
- e->vpsravq(xmmA, xmmB, xmmC);
- e->vpsravq(xmmA, xmmB, anyptr_gpC);
- e->vpsravq(ymmA, ymmB, ymmC);
- e->vpsravq(ymmA, ymmB, anyptr_gpC);
- e->vpsravq(zmmA, zmmB, zmmC);
- e->vpsravq(zmmA, zmmB, anyptr_gpC);
- e->vpsravw(xmmA, xmmB, xmmC);
- e->vpsravw(xmmA, xmmB, anyptr_gpC);
- e->vpsravw(ymmA, ymmB, ymmC);
- e->vpsravw(ymmA, ymmB, anyptr_gpC);
- e->vpsravw(zmmA, zmmB, zmmC);
- e->vpsravw(zmmA, zmmB, anyptr_gpC);
- e->vpsraw(xmmA, xmmB, xmmC);
- e->vpsraw(xmmA, xmmB, anyptr_gpC);
- e->vpsraw(xmmA, xmmB, 0);
- e->vpsraw(xmmA, anyptr_gpB, 0);
- e->vpsraw(ymmA, ymmB, xmmC);
- e->vpsraw(ymmA, ymmB, anyptr_gpC);
- e->vpsraw(ymmA, ymmB, 0);
- e->vpsraw(ymmA, anyptr_gpB, 0);
- e->vpsraw(zmmA, zmmB, xmmC);
- e->vpsraw(zmmA, zmmB, anyptr_gpC);
- e->vpsraw(zmmA, zmmB, 0);
- e->vpsraw(zmmA, anyptr_gpB, 0);
- e->vpsrld(xmmA, xmmB, xmmC);
- e->vpsrld(xmmA, xmmB, anyptr_gpC);
- e->vpsrld(xmmA, xmmB, 0);
- e->vpsrld(xmmA, anyptr_gpB, 0);
- e->vpsrld(ymmA, ymmB, xmmC);
- e->vpsrld(ymmA, ymmB, anyptr_gpC);
- e->vpsrld(ymmA, ymmB, 0);
- e->vpsrld(ymmA, anyptr_gpB, 0);
- e->vpsrld(zmmA, zmmB, xmmC);
- e->vpsrld(zmmA, zmmB, anyptr_gpC);
- e->vpsrld(zmmA, zmmB, 0);
- e->vpsrld(zmmA, anyptr_gpB, 0);
- e->vpsrldq(xmmA, xmmB, 0);
- e->vpsrldq(xmmA, anyptr_gpB, 0);
- e->vpsrldq(ymmA, ymmB, 0);
- e->vpsrldq(ymmA, anyptr_gpB, 0);
- e->vpsrldq(zmmA, zmmB, 0);
- e->vpsrldq(zmmA, anyptr_gpB, 0);
- e->vpsrlq(xmmA, xmmB, xmmC);
- e->vpsrlq(xmmA, xmmB, anyptr_gpC);
- e->vpsrlq(xmmA, xmmB, 0);
- e->vpsrlq(xmmA, anyptr_gpB, 0);
- e->vpsrlq(ymmA, ymmB, xmmC);
- e->vpsrlq(ymmA, ymmB, anyptr_gpC);
- e->vpsrlq(ymmA, ymmB, 0);
- e->vpsrlq(ymmA, anyptr_gpB, 0);
- e->vpsrlq(zmmA, zmmB, xmmC);
- e->vpsrlq(zmmA, zmmB, anyptr_gpC);
- e->vpsrlq(zmmA, zmmB, 0);
- e->vpsrlq(zmmA, anyptr_gpB, 0);
- e->vpsrlvd(xmmA, xmmB, xmmC);
- e->vpsrlvd(xmmA, xmmB, anyptr_gpC);
- e->vpsrlvd(ymmA, ymmB, ymmC);
- e->vpsrlvd(ymmA, ymmB, anyptr_gpC);
- e->vpsrlvd(zmmA, zmmB, zmmC);
- e->vpsrlvd(zmmA, zmmB, anyptr_gpC);
- e->vpsrlvq(xmmA, xmmB, xmmC);
- e->vpsrlvq(xmmA, xmmB, anyptr_gpC);
- e->vpsrlvq(ymmA, ymmB, ymmC);
- e->vpsrlvq(ymmA, ymmB, anyptr_gpC);
- e->vpsrlvq(zmmA, zmmB, zmmC);
- e->vpsrlvq(zmmA, zmmB, anyptr_gpC);
- e->vpsrlvw(xmmA, xmmB, xmmC);
- e->vpsrlvw(xmmA, xmmB, anyptr_gpC);
- e->vpsrlvw(ymmA, ymmB, ymmC);
- e->vpsrlvw(ymmA, ymmB, anyptr_gpC);
- e->vpsrlvw(zmmA, zmmB, zmmC);
- e->vpsrlvw(zmmA, zmmB, anyptr_gpC);
- e->vpsrlw(xmmA, xmmB, xmmC);
- e->vpsrlw(xmmA, xmmB, anyptr_gpC);
- e->vpsrlw(xmmA, xmmB, 0);
- e->vpsrlw(xmmA, anyptr_gpB, 0);
- e->vpsrlw(ymmA, ymmB, xmmC);
- e->vpsrlw(ymmA, ymmB, anyptr_gpC);
- e->vpsrlw(ymmA, ymmB, 0);
- e->vpsrlw(ymmA, anyptr_gpB, 0);
- e->vpsrlw(zmmA, zmmB, xmmC);
- e->vpsrlw(zmmA, zmmB, anyptr_gpC);
- e->vpsrlw(zmmA, zmmB, 0);
- e->vpsrlw(zmmA, anyptr_gpB, 0);
- e->vpsubb(xmmA, xmmB, xmmC);
- e->vpsubb(xmmA, xmmB, anyptr_gpC);
- e->vpsubb(ymmA, ymmB, ymmC);
- e->vpsubb(ymmA, ymmB, anyptr_gpC);
- e->vpsubb(zmmA, zmmB, zmmC);
- e->vpsubb(zmmA, zmmB, anyptr_gpC);
- e->vpsubd(xmmA, xmmB, xmmC);
- e->vpsubd(xmmA, xmmB, anyptr_gpC);
- e->vpsubd(ymmA, ymmB, ymmC);
- e->vpsubd(ymmA, ymmB, anyptr_gpC);
- e->vpsubd(zmmA, zmmB, zmmC);
- e->vpsubd(zmmA, zmmB, anyptr_gpC);
- e->vpsubq(xmmA, xmmB, xmmC);
- e->vpsubq(xmmA, xmmB, anyptr_gpC);
- e->vpsubq(ymmA, ymmB, ymmC);
- e->vpsubq(ymmA, ymmB, anyptr_gpC);
- e->vpsubq(zmmA, zmmB, zmmC);
- e->vpsubq(zmmA, zmmB, anyptr_gpC);
- e->vpsubsb(xmmA, xmmB, xmmC);
- e->vpsubsb(xmmA, xmmB, anyptr_gpC);
- e->vpsubsb(ymmA, ymmB, ymmC);
- e->vpsubsb(ymmA, ymmB, anyptr_gpC);
- e->vpsubsb(zmmA, zmmB, zmmC);
- e->vpsubsb(zmmA, zmmB, anyptr_gpC);
- e->vpsubsw(xmmA, xmmB, xmmC);
- e->vpsubsw(xmmA, xmmB, anyptr_gpC);
- e->vpsubsw(ymmA, ymmB, ymmC);
- e->vpsubsw(ymmA, ymmB, anyptr_gpC);
- e->vpsubsw(zmmA, zmmB, zmmC);
- e->vpsubsw(zmmA, zmmB, anyptr_gpC);
- e->vpsubusb(xmmA, xmmB, xmmC);
- e->vpsubusb(xmmA, xmmB, anyptr_gpC);
- e->vpsubusb(ymmA, ymmB, ymmC);
- e->vpsubusb(ymmA, ymmB, anyptr_gpC);
- e->vpsubusb(zmmA, zmmB, zmmC);
- e->vpsubusb(zmmA, zmmB, anyptr_gpC);
- e->vpsubusw(xmmA, xmmB, xmmC);
- e->vpsubusw(xmmA, xmmB, anyptr_gpC);
- e->vpsubusw(ymmA, ymmB, ymmC);
- e->vpsubusw(ymmA, ymmB, anyptr_gpC);
- e->vpsubusw(zmmA, zmmB, zmmC);
- e->vpsubusw(zmmA, zmmB, anyptr_gpC);
- e->vpsubw(xmmA, xmmB, xmmC);
- e->vpsubw(xmmA, xmmB, anyptr_gpC);
- e->vpsubw(ymmA, ymmB, ymmC);
- e->vpsubw(ymmA, ymmB, anyptr_gpC);
- e->vpsubw(zmmA, zmmB, zmmC);
- e->vpsubw(zmmA, zmmB, anyptr_gpC);
- e->vpternlogd(xmmA, xmmB, xmmC, 0);
- e->vpternlogd(xmmA, xmmB, anyptr_gpC, 0);
- e->vpternlogd(ymmA, ymmB, ymmC, 0);
- e->vpternlogd(ymmA, ymmB, anyptr_gpC, 0);
- e->vpternlogd(zmmA, zmmB, zmmC, 0);
- e->vpternlogd(zmmA, zmmB, anyptr_gpC, 0);
- e->vpternlogq(xmmA, xmmB, xmmC, 0);
- e->vpternlogq(xmmA, xmmB, anyptr_gpC, 0);
- e->vpternlogq(ymmA, ymmB, ymmC, 0);
- e->vpternlogq(ymmA, ymmB, anyptr_gpC, 0);
- e->vpternlogq(zmmA, zmmB, zmmC, 0);
- e->vpternlogq(zmmA, zmmB, anyptr_gpC, 0);
- e->vptestmb(kA, xmmB, xmmC);
- e->vptestmb(kA, xmmB, anyptr_gpC);
- e->vptestmb(kA, ymmB, ymmC);
- e->vptestmb(kA, ymmB, anyptr_gpC);
- e->vptestmb(kA, zmmB, zmmC);
- e->vptestmb(kA, zmmB, anyptr_gpC);
- e->vptestmd(kA, xmmB, xmmC);
- e->vptestmd(kA, xmmB, anyptr_gpC);
- e->vptestmd(kA, ymmB, ymmC);
- e->vptestmd(kA, ymmB, anyptr_gpC);
- e->vptestmd(kA, zmmB, zmmC);
- e->vptestmd(kA, zmmB, anyptr_gpC);
- e->vptestmq(kA, xmmB, xmmC);
- e->vptestmq(kA, xmmB, anyptr_gpC);
- e->vptestmq(kA, ymmB, ymmC);
- e->vptestmq(kA, ymmB, anyptr_gpC);
- e->vptestmq(kA, zmmB, zmmC);
- e->vptestmq(kA, zmmB, anyptr_gpC);
- e->vptestmw(kA, xmmB, xmmC);
- e->vptestmw(kA, xmmB, anyptr_gpC);
- e->vptestmw(kA, ymmB, ymmC);
- e->vptestmw(kA, ymmB, anyptr_gpC);
- e->vptestmw(kA, zmmB, zmmC);
- e->vptestmw(kA, zmmB, anyptr_gpC);
- e->vptestnmb(kA, xmmB, xmmC);
- e->vptestnmb(kA, xmmB, anyptr_gpC);
- e->vptestnmb(kA, ymmB, ymmC);
- e->vptestnmb(kA, ymmB, anyptr_gpC);
- e->vptestnmb(kA, zmmB, zmmC);
- e->vptestnmb(kA, zmmB, anyptr_gpC);
- e->vptestnmd(kA, xmmB, xmmC);
- e->vptestnmd(kA, xmmB, anyptr_gpC);
- e->vptestnmd(kA, ymmB, ymmC);
- e->vptestnmd(kA, ymmB, anyptr_gpC);
- e->vptestnmd(kA, zmmB, zmmC);
- e->vptestnmd(kA, zmmB, anyptr_gpC);
- e->vptestnmq(kA, xmmB, xmmC);
- e->vptestnmq(kA, xmmB, anyptr_gpC);
- e->vptestnmq(kA, ymmB, ymmC);
- e->vptestnmq(kA, ymmB, anyptr_gpC);
- e->vptestnmq(kA, zmmB, zmmC);
- e->vptestnmq(kA, zmmB, anyptr_gpC);
- e->vptestnmw(kA, xmmB, xmmC);
- e->vptestnmw(kA, xmmB, anyptr_gpC);
- e->vptestnmw(kA, ymmB, ymmC);
- e->vptestnmw(kA, ymmB, anyptr_gpC);
- e->vptestnmw(kA, zmmB, zmmC);
- e->vptestnmw(kA, zmmB, anyptr_gpC);
- e->vpunpckhbw(xmmA, xmmB, xmmC);
- e->vpunpckhbw(xmmA, xmmB, anyptr_gpC);
- e->vpunpckhbw(ymmA, ymmB, ymmC);
- e->vpunpckhbw(ymmA, ymmB, anyptr_gpC);
- e->vpunpckhbw(zmmA, zmmB, zmmC);
- e->vpunpckhbw(zmmA, zmmB, anyptr_gpC);
- e->vpunpckhdq(xmmA, xmmB, xmmC);
- e->vpunpckhdq(xmmA, xmmB, anyptr_gpC);
- e->vpunpckhdq(ymmA, ymmB, ymmC);
- e->vpunpckhdq(ymmA, ymmB, anyptr_gpC);
- e->vpunpckhdq(zmmA, zmmB, zmmC);
- e->vpunpckhdq(zmmA, zmmB, anyptr_gpC);
- e->vpunpckhqdq(xmmA, xmmB, xmmC);
- e->vpunpckhqdq(xmmA, xmmB, anyptr_gpC);
- e->vpunpckhqdq(ymmA, ymmB, ymmC);
- e->vpunpckhqdq(ymmA, ymmB, anyptr_gpC);
- e->vpunpckhqdq(zmmA, zmmB, zmmC);
- e->vpunpckhqdq(zmmA, zmmB, anyptr_gpC);
- e->vpunpckhwd(xmmA, xmmB, xmmC);
- e->vpunpckhwd(xmmA, xmmB, anyptr_gpC);
- e->vpunpckhwd(ymmA, ymmB, ymmC);
- e->vpunpckhwd(ymmA, ymmB, anyptr_gpC);
- e->vpunpckhwd(zmmA, zmmB, zmmC);
- e->vpunpckhwd(zmmA, zmmB, anyptr_gpC);
- e->vpunpcklbw(xmmA, xmmB, xmmC);
- e->vpunpcklbw(xmmA, xmmB, anyptr_gpC);
- e->vpunpcklbw(ymmA, ymmB, ymmC);
- e->vpunpcklbw(ymmA, ymmB, anyptr_gpC);
- e->vpunpcklbw(zmmA, zmmB, zmmC);
- e->vpunpcklbw(zmmA, zmmB, anyptr_gpC);
- e->vpunpckldq(xmmA, xmmB, xmmC);
- e->vpunpckldq(xmmA, xmmB, anyptr_gpC);
- e->vpunpckldq(ymmA, ymmB, ymmC);
- e->vpunpckldq(ymmA, ymmB, anyptr_gpC);
- e->vpunpckldq(zmmA, zmmB, zmmC);
- e->vpunpckldq(zmmA, zmmB, anyptr_gpC);
- e->vpunpcklqdq(xmmA, xmmB, xmmC);
- e->vpunpcklqdq(xmmA, xmmB, anyptr_gpC);
- e->vpunpcklqdq(ymmA, ymmB, ymmC);
- e->vpunpcklqdq(ymmA, ymmB, anyptr_gpC);
- e->vpunpcklqdq(zmmA, zmmB, zmmC);
- e->vpunpcklqdq(zmmA, zmmB, anyptr_gpC);
- e->vpunpcklwd(xmmA, xmmB, xmmC);
- e->vpunpcklwd(xmmA, xmmB, anyptr_gpC);
- e->vpunpcklwd(ymmA, ymmB, ymmC);
- e->vpunpcklwd(ymmA, ymmB, anyptr_gpC);
- e->vpunpcklwd(zmmA, zmmB, zmmC);
- e->vpunpcklwd(zmmA, zmmB, anyptr_gpC);
- e->vpxord(xmmA, xmmB, xmmC);
- e->vpxord(xmmA, xmmB, anyptr_gpC);
- e->vpxord(ymmA, ymmB, ymmC);
- e->vpxord(ymmA, ymmB, anyptr_gpC);
- e->vpxord(zmmA, zmmB, zmmC);
- e->vpxord(zmmA, zmmB, anyptr_gpC);
- e->vpxorq(xmmA, xmmB, xmmC);
- e->vpxorq(xmmA, xmmB, anyptr_gpC);
- e->vpxorq(ymmA, ymmB, ymmC);
- e->vpxorq(ymmA, ymmB, anyptr_gpC);
- e->vpxorq(zmmA, zmmB, zmmC);
- e->vpxorq(zmmA, zmmB, anyptr_gpC);
- e->vrangepd(xmmA, xmmB, xmmC, 0);
- e->vrangepd(xmmA, xmmB, anyptr_gpC, 0);
- e->vrangepd(ymmA, ymmB, ymmC, 0);
- e->vrangepd(ymmA, ymmB, anyptr_gpC, 0);
- e->vrangepd(zmmA, zmmB, zmmC, 0);
- e->vrangepd(zmmA, zmmB, anyptr_gpC, 0);
- e->vrangeps(xmmA, xmmB, xmmC, 0);
- e->vrangeps(xmmA, xmmB, anyptr_gpC, 0);
- e->vrangeps(ymmA, ymmB, ymmC, 0);
- e->vrangeps(ymmA, ymmB, anyptr_gpC, 0);
- e->vrangeps(zmmA, zmmB, zmmC, 0);
- e->vrangeps(zmmA, zmmB, anyptr_gpC, 0);
- e->vrangesd(xmmA, xmmB, xmmC, 0);
- e->vrangesd(xmmA, xmmB, anyptr_gpC, 0);
- e->vrangess(xmmA, xmmB, xmmC, 0);
- e->vrangess(xmmA, xmmB, anyptr_gpC, 0);
- e->vrcp14pd(xmmA, xmmB);
- e->vrcp14pd(xmmA, anyptr_gpB);
- e->vrcp14pd(ymmA, ymmB);
- e->vrcp14pd(ymmA, anyptr_gpB);
- e->vrcp14pd(zmmA, zmmB);
- e->vrcp14pd(zmmA, anyptr_gpB);
- e->vrcp14ps(xmmA, xmmB);
- e->vrcp14ps(xmmA, anyptr_gpB);
- e->vrcp14ps(ymmA, ymmB);
- e->vrcp14ps(ymmA, anyptr_gpB);
- e->vrcp14ps(zmmA, zmmB);
- e->vrcp14ps(zmmA, anyptr_gpB);
- e->vrcp14sd(xmmA, xmmB, xmmC);
- e->vrcp14sd(xmmA, xmmB, anyptr_gpC);
- e->vrcp14ss(xmmA, xmmB, xmmC);
- e->vrcp14ss(xmmA, xmmB, anyptr_gpC);
- e->vrcp28pd(zmmA, zmmB);
- e->vrcp28pd(zmmA, anyptr_gpB);
- e->vrcp28ps(zmmA, zmmB);
- e->vrcp28ps(zmmA, anyptr_gpB);
- e->vrcp28sd(xmmA, xmmB, xmmC);
- e->vrcp28sd(xmmA, xmmB, anyptr_gpC);
- e->vrcp28ss(xmmA, xmmB, xmmC);
- e->vrcp28ss(xmmA, xmmB, anyptr_gpC);
- e->vreducepd(xmmA, xmmB, 0);
- e->vreducepd(xmmA, anyptr_gpB, 0);
- e->vreducepd(ymmA, ymmB, 0);
- e->vreducepd(ymmA, anyptr_gpB, 0);
- e->vreducepd(zmmA, zmmB, 0);
- e->vreducepd(zmmA, anyptr_gpB, 0);
- e->vreduceps(xmmA, xmmB, 0);
- e->vreduceps(xmmA, anyptr_gpB, 0);
- e->vreduceps(ymmA, ymmB, 0);
- e->vreduceps(ymmA, anyptr_gpB, 0);
- e->vreduceps(zmmA, zmmB, 0);
- e->vreduceps(zmmA, anyptr_gpB, 0);
- e->vreducesd(xmmA, xmmB, xmmC, 0);
- e->vreducesd(xmmA, xmmB, anyptr_gpC, 0);
- e->vreducess(xmmA, xmmB, xmmC, 0);
- e->vreducess(xmmA, xmmB, anyptr_gpC, 0);
- e->vrndscalepd(xmmA, xmmB, 0);
- e->vrndscalepd(xmmA, anyptr_gpB, 0);
- e->vrndscalepd(ymmA, ymmB, 0);
- e->vrndscalepd(ymmA, anyptr_gpB, 0);
- e->vrndscalepd(zmmA, zmmB, 0);
- e->vrndscalepd(zmmA, anyptr_gpB, 0);
- e->vrndscaleps(xmmA, xmmB, 0);
- e->vrndscaleps(xmmA, anyptr_gpB, 0);
- e->vrndscaleps(ymmA, ymmB, 0);
- e->vrndscaleps(ymmA, anyptr_gpB, 0);
- e->vrndscaleps(zmmA, zmmB, 0);
- e->vrndscaleps(zmmA, anyptr_gpB, 0);
- e->vrndscalesd(xmmA, xmmB, xmmC, 0);
- e->vrndscalesd(xmmA, xmmB, anyptr_gpC, 0);
- e->vrndscaless(xmmA, xmmB, xmmC, 0);
- e->vrndscaless(xmmA, xmmB, anyptr_gpC, 0);
- e->vrsqrt14pd(xmmA, xmmB);
- e->vrsqrt14pd(xmmA, anyptr_gpB);
- e->vrsqrt14pd(ymmA, ymmB);
- e->vrsqrt14pd(ymmA, anyptr_gpB);
- e->vrsqrt14pd(zmmA, zmmB);
- e->vrsqrt14pd(zmmA, anyptr_gpB);
- e->vrsqrt14ps(xmmA, xmmB);
- e->vrsqrt14ps(xmmA, anyptr_gpB);
- e->vrsqrt14ps(ymmA, ymmB);
- e->vrsqrt14ps(ymmA, anyptr_gpB);
- e->vrsqrt14ps(zmmA, zmmB);
- e->vrsqrt14ps(zmmA, anyptr_gpB);
- e->vrsqrt14sd(xmmA, xmmB, xmmC);
- e->vrsqrt14sd(xmmA, xmmB, anyptr_gpC);
- e->vrsqrt14ss(xmmA, xmmB, xmmC);
- e->vrsqrt14ss(xmmA, xmmB, anyptr_gpC);
- e->vrsqrt28pd(zmmA, zmmB);
- e->vrsqrt28pd(zmmA, anyptr_gpB);
- e->vrsqrt28ps(zmmA, zmmB);
- e->vrsqrt28ps(zmmA, anyptr_gpB);
- e->vrsqrt28sd(xmmA, xmmB, xmmC);
- e->vrsqrt28sd(xmmA, xmmB, anyptr_gpC);
- e->vrsqrt28ss(xmmA, xmmB, xmmC);
- e->vrsqrt28ss(xmmA, xmmB, anyptr_gpC);
- e->vscalefpd(xmmA, xmmB, xmmC);
- e->vscalefpd(xmmA, xmmB, anyptr_gpC);
- e->vscalefpd(ymmA, ymmB, ymmC);
- e->vscalefpd(ymmA, ymmB, anyptr_gpC);
- e->vscalefpd(zmmA, zmmB, zmmC);
- e->vscalefpd(zmmA, zmmB, anyptr_gpC);
- e->vscalefps(xmmA, xmmB, xmmC);
- e->vscalefps(xmmA, xmmB, anyptr_gpC);
- e->vscalefps(ymmA, ymmB, ymmC);
- e->vscalefps(ymmA, ymmB, anyptr_gpC);
- e->vscalefps(zmmA, zmmB, zmmC);
- e->vscalefps(zmmA, zmmB, anyptr_gpC);
- e->vscalefsd(xmmA, xmmB, xmmC);
- e->vscalefsd(xmmA, xmmB, anyptr_gpC);
- e->vscalefss(xmmA, xmmB, xmmC);
- e->vscalefss(xmmA, xmmB, anyptr_gpC);
- e->vscatterdpd(vx_ptr, xmmB);
- e->vscatterdpd(vx_ptr, ymmB);
- e->vscatterdpd(vy_ptr, zmmB);
- e->vscatterdps(vx_ptr, xmmB);
- e->vscatterdps(vy_ptr, ymmB);
- e->vscatterdps(vz_ptr, zmmB);
- e->vscatterpf0dpd(vy_ptr);
- e->vscatterpf0dps(vz_ptr);
- e->vscatterpf0qpd(vz_ptr);
- e->vscatterpf0qps(vz_ptr);
- e->vscatterpf1dpd(vy_ptr);
- e->vscatterpf1dps(vz_ptr);
- e->vscatterpf1qpd(vz_ptr);
- e->vscatterpf1qps(vz_ptr);
- e->vscatterqpd(vx_ptr, xmmB);
- e->vscatterqpd(vy_ptr, ymmB);
- e->vscatterqpd(vz_ptr, zmmB);
- e->vscatterqps(vx_ptr, xmmB);
- e->vscatterqps(vy_ptr, xmmB);
- e->vscatterqps(vz_ptr, ymmB);
- e->vshuff32x4(ymmA, ymmB, ymmC, 0);
- e->vshuff32x4(ymmA, ymmB, anyptr_gpC, 0);
- e->vshuff32x4(zmmA, zmmB, zmmC, 0);
- e->vshuff32x4(zmmA, zmmB, anyptr_gpC, 0);
- e->vshuff64x2(ymmA, ymmB, ymmC, 0);
- e->vshuff64x2(ymmA, ymmB, anyptr_gpC, 0);
- e->vshuff64x2(zmmA, zmmB, zmmC, 0);
- e->vshuff64x2(zmmA, zmmB, anyptr_gpC, 0);
- e->vshufi32x4(ymmA, ymmB, ymmC, 0);
- e->vshufi32x4(ymmA, ymmB, anyptr_gpC, 0);
- e->vshufi32x4(zmmA, zmmB, zmmC, 0);
- e->vshufi32x4(zmmA, zmmB, anyptr_gpC, 0);
- e->vshufi64x2(ymmA, ymmB, ymmC, 0);
- e->vshufi64x2(ymmA, ymmB, anyptr_gpC, 0);
- e->vshufi64x2(zmmA, zmmB, zmmC, 0);
- e->vshufi64x2(zmmA, zmmB, anyptr_gpC, 0);
- e->vshufpd(xmmA, xmmB, xmmC, 0);
- e->vshufpd(xmmA, xmmB, anyptr_gpC, 0);
- e->vshufpd(ymmA, ymmB, ymmC, 0);
- e->vshufpd(ymmA, ymmB, anyptr_gpC, 0);
- e->vshufpd(zmmA, zmmB, zmmC, 0);
- e->vshufpd(zmmA, zmmB, anyptr_gpC, 0);
- e->vshufps(xmmA, xmmB, xmmC, 0);
- e->vshufps(xmmA, xmmB, anyptr_gpC, 0);
- e->vshufps(ymmA, ymmB, ymmC, 0);
- e->vshufps(ymmA, ymmB, anyptr_gpC, 0);
- e->vshufps(zmmA, zmmB, zmmC, 0);
- e->vshufps(zmmA, zmmB, anyptr_gpC, 0);
- e->vsqrtpd(xmmA, xmmB);
- e->vsqrtpd(xmmA, anyptr_gpB);
- e->vsqrtpd(ymmA, ymmB);
- e->vsqrtpd(ymmA, anyptr_gpB);
- e->vsqrtpd(zmmA, zmmB);
- e->vsqrtpd(zmmA, anyptr_gpB);
- e->vsqrtps(xmmA, xmmB);
- e->vsqrtps(xmmA, anyptr_gpB);
- e->vsqrtps(ymmA, ymmB);
- e->vsqrtps(ymmA, anyptr_gpB);
- e->vsqrtps(zmmA, zmmB);
- e->vsqrtps(zmmA, anyptr_gpB);
- e->vsqrtsd(xmmA, xmmB, xmmC);
- e->vsqrtsd(xmmA, xmmB, anyptr_gpC);
- e->vsqrtss(xmmA, xmmB, xmmC);
- e->vsqrtss(xmmA, xmmB, anyptr_gpC);
- e->vsubpd(xmmA, xmmB, xmmC);
- e->vsubpd(xmmA, xmmB, anyptr_gpC);
- e->vsubpd(ymmA, ymmB, ymmC);
- e->vsubpd(ymmA, ymmB, anyptr_gpC);
- e->vsubpd(zmmA, zmmB, zmmC);
- e->vsubpd(zmmA, zmmB, anyptr_gpC);
- e->vsubps(xmmA, xmmB, xmmC);
- e->vsubps(xmmA, xmmB, anyptr_gpC);
- e->vsubps(ymmA, ymmB, ymmC);
- e->vsubps(ymmA, ymmB, anyptr_gpC);
- e->vsubps(zmmA, zmmB, zmmC);
- e->vsubps(zmmA, zmmB, anyptr_gpC);
- e->vsubsd(xmmA, xmmB, xmmC);
- e->vsubsd(xmmA, xmmB, anyptr_gpC);
- e->vsubss(xmmA, xmmB, xmmC);
- e->vsubss(xmmA, xmmB, anyptr_gpC);
- e->vucomisd(xmmA, xmmB);
- e->vucomisd(xmmA, anyptr_gpB);
- e->vucomiss(xmmA, xmmB);
- e->vucomiss(xmmA, anyptr_gpB);
- e->vunpckhpd(xmmA, xmmB, xmmC);
- e->vunpckhpd(xmmA, xmmB, anyptr_gpC);
- e->vunpckhpd(ymmA, ymmB, ymmC);
- e->vunpckhpd(ymmA, ymmB, anyptr_gpC);
- e->vunpckhpd(zmmA, zmmB, zmmC);
- e->vunpckhpd(zmmA, zmmB, anyptr_gpC);
- e->vunpckhps(xmmA, xmmB, xmmC);
- e->vunpckhps(xmmA, xmmB, anyptr_gpC);
- e->vunpckhps(ymmA, ymmB, ymmC);
- e->vunpckhps(ymmA, ymmB, anyptr_gpC);
- e->vunpckhps(zmmA, zmmB, zmmC);
- e->vunpckhps(zmmA, zmmB, anyptr_gpC);
- e->vunpcklpd(xmmA, xmmB, xmmC);
- e->vunpcklpd(xmmA, xmmB, anyptr_gpC);
- e->vunpcklpd(ymmA, ymmB, ymmC);
- e->vunpcklpd(ymmA, ymmB, anyptr_gpC);
- e->vunpcklpd(zmmA, zmmB, zmmC);
- e->vunpcklpd(zmmA, zmmB, anyptr_gpC);
- e->vunpcklps(xmmA, xmmB, xmmC);
- e->vunpcklps(xmmA, xmmB, anyptr_gpC);
- e->vunpcklps(ymmA, ymmB, ymmC);
- e->vunpcklps(ymmA, ymmB, anyptr_gpC);
- e->vunpcklps(zmmA, zmmB, zmmC);
- e->vunpcklps(zmmA, zmmB, anyptr_gpC);
- e->vxorpd(xmmA, xmmB, xmmC);
- e->vxorpd(xmmA, xmmB, anyptr_gpC);
- e->vxorpd(ymmA, ymmB, ymmC);
- e->vxorpd(ymmA, ymmB, anyptr_gpC);
- e->vxorpd(zmmA, zmmB, zmmC);
- e->vxorpd(zmmA, zmmB, anyptr_gpC);
- e->vxorps(xmmA, xmmB, xmmC);
- e->vxorps(xmmA, xmmB, anyptr_gpC);
- e->vxorps(ymmA, ymmB, ymmC);
- e->vxorps(ymmA, ymmB, anyptr_gpC);
- e->vxorps(zmmA, zmmB, zmmC);
- e->vxorps(zmmA, zmmB, anyptr_gpC);
-
- // Mark the end.
- e->nop();
- e->nop();
- e->nop();
- e->nop();
-}
-
-} // {asmtest}
-
-#endif // ASMJIT_TEST_OPCODE_H_INCLUDED
diff --git a/3rdparty/asmjit/test/asmjit_test_perf.cpp b/3rdparty/asmjit/test/asmjit_test_perf.cpp
new file mode 100644
index 00000000000..ab965948f40
--- /dev/null
+++ b/3rdparty/asmjit/test/asmjit_test_perf.cpp
@@ -0,0 +1,62 @@
+// This file is part of AsmJit project <https://asmjit.com>
+//
+// See asmjit.h or LICENSE.md for license and copyright information
+// SPDX-License-Identifier: Zlib
+
+#include <asmjit/core.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include "cmdline.h"
+
+using namespace asmjit;
+
+#if !defined(ASMJIT_NO_X86)
+void benchmarkX86Emitters(uint32_t numIterations, bool testX86, bool testX64) noexcept;
+#endif
+
+#if !defined(ASMJIT_NO_AARCH64)
+void benchmarkA64Emitters(uint32_t numIterations);
+#endif
+
+int main(int argc, char* argv[]) {
+ CmdLine cmdLine(argc, argv);
+ uint32_t numIterations = 20000;
+
+ printf("AsmJit Performance Suite v%u.%u.%u:\n\n",
+ unsigned((ASMJIT_LIBRARY_VERSION >> 16) ),
+ unsigned((ASMJIT_LIBRARY_VERSION >> 8) & 0xFF),
+ unsigned((ASMJIT_LIBRARY_VERSION ) & 0xFF));
+
+ printf("Usage:\n");
+ printf(" --help Show usage only\n");
+ printf(" --quick Decrease the number of iterations to make tests quicker\n");
+ printf(" --arch=<ARCH> Select architecture to run ('all' by default)\n");
+ printf("\n");
+
+ if (cmdLine.hasArg("--help"))
+ return 0;
+
+ if (cmdLine.hasArg("--quick"))
+ numIterations = 1000;
+
+ const char* arch = cmdLine.valueOf("--arch", "all");
+
+#if !defined(ASMJIT_NO_X86)
+ bool testX86 = strcmp(arch, "all") == 0 || strcmp(arch, "x86") == 0;
+ bool testX64 = strcmp(arch, "all") == 0 || strcmp(arch, "x64") == 0;
+
+ if (testX86 || testX64)
+ benchmarkX86Emitters(numIterations, testX86, testX64);
+#endif
+
+#if !defined(ASMJIT_NO_AARCH64)
+ bool testAArch64 = strcmp(arch, "all") == 0 || strcmp(arch, "aarch64") == 0;
+
+ if (testAArch64)
+ benchmarkA64Emitters(numIterations);
+#endif
+
+ return 0;
+}
diff --git a/3rdparty/asmjit/test/asmjit_test_perf.h b/3rdparty/asmjit/test/asmjit_test_perf.h
new file mode 100644
index 00000000000..2ab0038ed31
--- /dev/null
+++ b/3rdparty/asmjit/test/asmjit_test_perf.h
@@ -0,0 +1,61 @@
+// This file is part of AsmJit project <https://asmjit.com>
+//
+// See asmjit.h or LICENSE.md for license and copyright information
+// SPDX-License-Identifier: Zlib
+
+#ifndef ASMJIT_TEST_PERF_H_INCLUDED
+#define ASMJIT_TEST_PERF_H_INCLUDED
+
+#include <asmjit/core.h>
+#include "asmjitutils.h"
+#include "performancetimer.h"
+
+class MyErrorHandler : public asmjit::ErrorHandler {
+ void handleError(asmjit::Error err, const char* message, asmjit::BaseEmitter* origin) {
+ (void)err;
+ (void)origin;
+ printf("ERROR: %s\n", message);
+ abort();
+ }
+};
+
+template<typename EmitterT, typename FuncT>
+static void bench(asmjit::CodeHolder& code, asmjit::Arch arch, uint32_t numIterations, const char* testName, const FuncT& func) noexcept {
+ EmitterT emitter;
+ MyErrorHandler eh;
+
+ const char* archName = asmjitArchAsString(arch);
+ const char* emitterName =
+ emitter.isAssembler() ? "Assembler" :
+ emitter.isCompiler() ? "Compiler" :
+ emitter.isBuilder() ? "Builder" : "Unknown";
+
+ uint64_t codeSize = 0;
+ asmjit::Environment env(arch);
+
+ PerformanceTimer timer;
+ double duration = std::numeric_limits<double>::infinity();
+
+ for (uint32_t r = 0; r < numIterations; r++) {
+ codeSize = 0;
+ code.init(env);
+ code.setErrorHandler(&eh);
+ code.attach(&emitter);
+
+ timer.start();
+ func(emitter);
+ timer.stop();
+
+ codeSize += code.codeSize();
+
+ code.reset();
+ duration = asmjit::Support::min(duration, timer.duration());
+ }
+
+ printf(" [%s] %-9s %-16s | CodeSize:%5llu [B] | Time:%8.4f [ms]", archName, emitterName, testName, (unsigned long long)codeSize, duration);
+ if (codeSize)
+ printf(" | Speed:%8.3f [MB/s]", mbps(duration, codeSize));
+ printf("\n");
+}
+
+#endif // ASMJIT_TEST_PERF_H_INCLUDED
diff --git a/3rdparty/asmjit/test/asmjit_test_perf_a64.cpp b/3rdparty/asmjit/test/asmjit_test_perf_a64.cpp
new file mode 100644
index 00000000000..4f4aebb6e72
--- /dev/null
+++ b/3rdparty/asmjit/test/asmjit_test_perf_a64.cpp
@@ -0,0 +1,699 @@
+// This file is part of AsmJit project <https://asmjit.com>
+//
+// See asmjit.h or LICENSE.md for license and copyright information
+// SPDX-License-Identifier: Zlib
+
+#include <asmjit/core.h>
+
+#if !defined(ASMJIT_NO_AARCH64)
+#include <asmjit/a64.h>
+
+#include <limits>
+#include <stdio.h>
+#include <string.h>
+
+#include "asmjit_test_perf.h"
+
+using namespace asmjit;
+
+// Generates a long sequence of GP instructions.
+template<typename Emitter>
+static void generateGpSequenceInternal(
+ Emitter& cc,
+ const a64::Gp& a, const a64::Gp& b, const a64::Gp& c, const a64::Gp& d) {
+
+ using namespace asmjit::a64;
+
+ Gp wA = a.w();
+ Gp wB = b.w();
+ Gp wC = c.w();
+ Gp wD = d.w();
+
+ Gp xA = a.x();
+ Gp xB = b.x();
+ Gp xC = c.x();
+ Gp xD = d.x();
+
+ Mem m = ptr(xD);
+
+ cc.mov(wA, 0);
+ cc.mov(wB, 1);
+ cc.mov(wC, 2);
+ cc.mov(wD, 3);
+
+ cc.adc(wA, wB, wC);
+ cc.adc(xA, xB, xC);
+ cc.adc(wA, wzr, wC);
+ cc.adc(xA, xzr, xC);
+ cc.adc(wzr, wB, wC);
+ cc.adc(xzr, xB, xC);
+ cc.adcs(wA, wB, wC);
+ cc.adcs(xA, xB, xC);
+ cc.add(wA, wB, wC);
+ cc.add(xA, xB, xC);
+ cc.add(wA, wB, wC, lsl(3));
+ cc.add(xA, xB, xC, lsl(3));
+ cc.add(wA, wzr, wC);
+ cc.add(xA, xzr, xC);
+ cc.add(wzr, wB, wC);
+ cc.add(xzr, xB, xC);
+ cc.add(wC, wD, 0, lsl(12));
+ cc.add(xC, xD, 0, lsl(12));
+ cc.add(wC, wD, 1024, lsl(12));
+ cc.add(xC, xD, 1024, lsl(12));
+ cc.add(wC, wD, 1024, lsl(12));
+ cc.add(xC, xD, 1024, lsl(12));
+ cc.adds(wA, wB, wC);
+ cc.adds(xA, xB, xC);
+ cc.adr(xA, 0);
+ cc.adr(xA, 256);
+ cc.adrp(xA, 4096);
+ cc.and_(wA, wB, wC);
+ cc.and_(xA, xB, xC);
+ cc.and_(wA, wB, 1);
+ cc.and_(xA, xB, 1);
+ cc.and_(wA, wB, 15);
+ cc.and_(xA, xB, 15);
+ cc.and_(wA, wzr, wC);
+ cc.and_(xA, xzr, xC);
+ cc.and_(wzr, wB, wC);
+ cc.and_(xzr, xB, xC);
+ cc.and_(wA, wB, 0x1);
+ cc.and_(xA, xB, 0x1);
+ cc.and_(wA, wB, 0xf);
+ cc.and_(xA, xB, 0xf);
+ cc.ands(wA, wB, wC);
+ cc.ands(xA, xB, xC);
+ cc.ands(wA, wzr, wC);
+ cc.ands(xA, xzr, xC);
+ cc.ands(wzr, wB, wC);
+ cc.ands(xzr, xB, xC);
+ cc.ands(wA, wB, 0x1);
+ cc.ands(xA, xB, 0x1);
+ cc.ands(wA, wB, 0xf);
+ cc.ands(xA, xB, 0xf);
+ cc.asr(wA, wB, 15);
+ cc.asr(xA, xB, 15);
+ cc.asrv(wA, wB, wC);
+ cc.asrv(xA, xB, xC);
+ cc.bfc(wA, 8, 16);
+ cc.bfc(xA, 8, 16);
+ cc.bfi(wA, wB, 8, 16);
+ cc.bfi(xA, xB, 8, 16);
+ cc.bfm(wA, wB, 8, 16);
+ cc.bfm(xA, xB, 8, 16);
+ cc.bfxil(wA, wB, 8, 16);
+ cc.bfxil(xA, xB, 8, 16);
+ cc.bic(wA, wB, wC, lsl(4));
+ cc.bic(xA, xB, xC, lsl(4));
+ cc.bic(wA, wzr, wC);
+ cc.bic(xA, xzr, xC);
+ cc.bics(wA, wB, wC, lsl(4));
+ cc.bics(xA, xB, xC, lsl(4));
+ cc.bics(wA, wzr, wC);
+ cc.bics(xA, xzr, xC);
+ cc.cas(wA, wB, m);
+ cc.cas(xA, xB, m);
+ cc.casa(wA, wB, m);
+ cc.casa(xA, xB, m);
+ cc.casab(wA, wB, m);
+ cc.casah(wA, wB, m);
+ cc.casal(wA, wB, m);
+ cc.casal(xA, xB, m);
+ cc.casalb(wA, wB, m);
+ cc.casalh(wA, wB, m);
+ cc.casb(wA, wB, m);
+ cc.cash(wA, wB, m);
+ cc.casl(wA, wB, m);
+ cc.casl(xA, xB, m);
+ cc.caslb(wA, wB, m);
+ cc.caslh(wA, wB, m);
+ cc.casp(wA, wB, wC, wD, m);
+ cc.casp(xA, xB, xC, xD, m);
+ cc.caspa(wA, wB, wC, wD, m);
+ cc.caspa(xA, xB, xC, xD, m);
+ cc.caspal(wA, wB, wC, wD, m);
+ cc.caspal(xA, xB, xC, xD, m);
+ cc.caspl(wA, wB, wC, wD, m);
+ cc.caspl(xA, xB, xC, xD, m);
+ cc.ccmn(wA, wB, 3, CondCode::kEQ);
+ cc.ccmn(xA, xB, 3, CondCode::kEQ);
+ cc.ccmn(wA, 2, 3, CondCode::kEQ);
+ cc.ccmn(xA, 2, 3, CondCode::kEQ);
+ cc.ccmn(wA, wzr, 3, CondCode::kEQ);
+ cc.ccmn(xA, xzr, 3, CondCode::kEQ);
+ cc.ccmp(wA, wB, 3, CondCode::kEQ);
+ cc.ccmp(xA, xB, 3, CondCode::kEQ);
+ cc.ccmp(wA, 2, 3, CondCode::kEQ);
+ cc.ccmp(xA, 2, 3, CondCode::kEQ);
+ cc.ccmp(wA, wzr, 3, CondCode::kEQ);
+ cc.ccmp(xA, xzr, 3, CondCode::kEQ);
+ cc.cinc(wA, wB, CondCode::kEQ);
+ cc.cinc(xA, xB, CondCode::kEQ);
+ cc.cinc(wzr, wB, CondCode::kEQ);
+ cc.cinc(wA, wzr, CondCode::kEQ);
+ cc.cinc(xzr, xB, CondCode::kEQ);
+ cc.cinc(xA, xzr, CondCode::kEQ);
+ cc.cinv(wA, wB, CondCode::kEQ);
+ cc.cinv(xA, xB, CondCode::kEQ);
+ cc.cinv(wzr, wB, CondCode::kEQ);
+ cc.cinv(wA, wzr, CondCode::kEQ);
+ cc.cinv(xzr, xB, CondCode::kEQ);
+ cc.cinv(xA, xzr, CondCode::kEQ);
+ cc.cls(wA, wB);
+ cc.cls(xA, xB);
+ cc.cls(wA, wzr);
+ cc.cls(xA, xzr);
+ cc.cls(wzr, wB);
+ cc.cls(xzr, xB);
+ cc.clz(wA, wB);
+ cc.clz(xA, xB);
+ cc.clz(wA, wzr);
+ cc.clz(xA, xzr);
+ cc.clz(wzr, wB);
+ cc.clz(xzr, xB);
+ cc.cmn(wA, 33);
+ cc.cmn(xA, 33);
+ cc.cmn(wA, wB);
+ cc.cmn(xA, xB);
+ cc.cmn(wA, wB, uxtb(2));
+ cc.cmn(xA, xB, uxtb(2));
+ cc.cmp(wA, 33);
+ cc.cmp(xA, 33);
+ cc.cmp(wA, wB);
+ cc.cmp(xA, xB);
+ cc.cmp(wA, wB, uxtb(2));
+ cc.cmp(xA, xB, uxtb(2));
+ cc.crc32b(wA, wB, wC);
+ cc.crc32b(wzr, wB, wC);
+ cc.crc32b(wA, wzr, wC);
+ cc.crc32b(wA, wB, wzr);
+ cc.crc32cb(wA, wB, wC);
+ cc.crc32cb(wzr, wB, wC);
+ cc.crc32cb(wA, wzr, wC);
+ cc.crc32cb(wA, wB, wzr);
+ cc.crc32ch(wA, wB, wC);
+ cc.crc32ch(wzr, wB, wC);
+ cc.crc32ch(wA, wzr, wC);
+ cc.crc32ch(wA, wB, wzr);
+ cc.crc32cw(wA, wB, wC);
+ cc.crc32cw(wzr, wB, wC);
+ cc.crc32cw(wA, wzr, wC);
+ cc.crc32cw(wA, wB, wzr);
+ cc.crc32cx(wA, wB, xC);
+ cc.crc32cx(wzr, wB, xC);
+ cc.crc32cx(wA, wzr, xC);
+ cc.crc32cx(wA, wB, xzr);
+ cc.crc32h(wA, wB, wC);
+ cc.crc32h(wzr, wB, wC);
+ cc.crc32h(wA, wzr, wC);
+ cc.crc32h(wA, wB, wzr);
+ cc.crc32w(wA, wB, wC);
+ cc.crc32w(wzr, wB, wC);
+ cc.crc32w(wA, wzr, wC);
+ cc.crc32w(wA, wB, wzr);
+ cc.crc32x(wA, wB, xC);
+ cc.crc32x(wzr, wB, xC);
+ cc.crc32x(wA, wzr, xC);
+ cc.crc32x(wA, wB, xzr);
+ cc.csel(wA, wB, wC, CondCode::kEQ);
+ cc.csel(xA, xB, xC, CondCode::kEQ);
+ cc.cset(wA, CondCode::kEQ);
+ cc.cset(xA, CondCode::kEQ);
+ cc.cset(wA, CondCode::kEQ);
+ cc.cset(xA, CondCode::kEQ);
+ cc.csetm(wA, CondCode::kEQ);
+ cc.csetm(xA, CondCode::kEQ);
+ cc.csinc(wA, wB, wC, CondCode::kEQ);
+ cc.csinc(xA, xB, xC, CondCode::kEQ);
+ cc.csinv(wA, wB, wC, CondCode::kEQ);
+ cc.csinv(xA, xB, xC, CondCode::kEQ);
+ cc.csneg(wA, wB, wC, CondCode::kEQ);
+ cc.csneg(xA, xB, xC, CondCode::kEQ);
+ cc.eon(wA, wB, wC);
+ cc.eon(wzr, wB, wC);
+ cc.eon(wA, wzr, wC);
+ cc.eon(wA, wB, wzr);
+ cc.eon(wA, wB, wC, lsl(4));
+ cc.eon(xA, xB, xC);
+ cc.eon(xzr, xB, xC);
+ cc.eon(xA, xzr, xC);
+ cc.eon(xA, xB, xzr);
+ cc.eon(xA, xB, xC, lsl(4));
+ cc.eor(wA, wB, wC);
+ cc.eor(wzr, wB, wC);
+ cc.eor(wA, wzr, wC);
+ cc.eor(wA, wB, wzr);
+ cc.eor(xA, xB, xC);
+ cc.eor(xzr, xB, xC);
+ cc.eor(xA, xzr, xC);
+ cc.eor(xA, xB, xzr);
+ cc.eor(wA, wB, wC, lsl(4));
+ cc.eor(xA, xB, xC, lsl(4));
+ cc.eor(wA, wB, 0x4000);
+ cc.eor(xA, xB, 0x8000);
+ cc.extr(wA, wB, wC, 15);
+ cc.extr(wzr, wB, wC, 15);
+ cc.extr(wA, wzr, wC, 15);
+ cc.extr(wA, wB, wzr, 15);
+ cc.extr(xA, xB, xC, 15);
+ cc.extr(xzr, xB, xC, 15);
+ cc.extr(xA, xzr, xC, 15);
+ cc.extr(xA, xB, xzr, 15);
+ cc.ldadd(wA, wB, m);
+ cc.ldadd(xA, xB, m);
+ cc.ldadda(wA, wB, m);
+ cc.ldadda(xA, xB, m);
+ cc.ldaddab(wA, wB, m);
+ cc.ldaddah(wA, wB, m);
+ cc.ldaddal(wA, wB, m);
+ cc.ldaddal(xA, xB, m);
+ cc.ldaddalb(wA, wB, m);
+ cc.ldaddalh(wA, wB, m);
+ cc.ldaddb(wA, wB, m);
+ cc.ldaddh(wA, wB, m);
+ cc.ldaddl(wA, wB, m);
+ cc.ldaddl(xA, xB, m);
+ cc.ldaddlb(wA, wB, m);
+ cc.ldaddlh(wA, wB, m);
+ cc.ldclr(wA, wB, m);
+ cc.ldclr(xA, xB, m);
+ cc.ldclra(wA, wB, m);
+ cc.ldclra(xA, xB, m);
+ cc.ldclrab(wA, wB, m);
+ cc.ldclrah(wA, wB, m);
+ cc.ldclral(wA, wB, m);
+ cc.ldclral(xA, xB, m);
+ cc.ldclralb(wA, wB, m);
+ cc.ldclralh(wA, wB, m);
+ cc.ldclrb(wA, wB, m);
+ cc.ldclrh(wA, wB, m);
+ cc.ldclrl(wA, wB, m);
+ cc.ldclrl(xA, xB, m);
+ cc.ldclrlb(wA, wB, m);
+ cc.ldclrlh(wA, wB, m);
+ cc.ldeor(wA, wB, m);
+ cc.ldeor(xA, xB, m);
+ cc.ldeora(wA, wB, m);
+ cc.ldeora(xA, xB, m);
+ cc.ldeorab(wA, wB, m);
+ cc.ldeorah(wA, wB, m);
+ cc.ldeoral(wA, wB, m);
+ cc.ldeoral(xA, xB, m);
+ cc.ldeoralb(wA, wB, m);
+ cc.ldeoralh(wA, wB, m);
+ cc.ldeorb(wA, wB, m);
+ cc.ldeorh(wA, wB, m);
+ cc.ldeorl(wA, wB, m);
+ cc.ldeorl(xA, xB, m);
+ cc.ldeorlb(wA, wB, m);
+ cc.ldeorlh(wA, wB, m);
+ cc.ldlar(wA, m);
+ cc.ldlar(xA, m);
+ cc.ldlarb(wA, m);
+ cc.ldlarh(wA, m);
+ cc.ldnp(wA, wB, m);
+ cc.ldnp(xA, xB, m);
+ cc.ldp(wA, wB, m);
+ cc.ldp(xA, xB, m);
+ cc.ldpsw(xA, xB, m);
+ cc.ldr(wA, m);
+ cc.ldr(xA, m);
+ cc.ldrb(wA, m);
+ cc.ldrh(wA, m);
+ cc.ldrsw(xA, m);
+ cc.ldraa(xA, m);
+ cc.ldrab(xA, m);
+ cc.ldset(wA, wB, m);
+ cc.ldset(xA, xB, m);
+ cc.ldseta(wA, wB, m);
+ cc.ldseta(xA, xB, m);
+ cc.ldsetab(wA, wB, m);
+ cc.ldsetah(wA, wB, m);
+ cc.ldsetal(wA, wB, m);
+ cc.ldsetal(xA, xB, m);
+ cc.ldsetalh(wA, wB, m);
+ cc.ldsetalb(wA, wB, m);
+ cc.ldsetb(wA, wB, m);
+ cc.ldseth(wA, wB, m);
+ cc.ldsetl(wA, wB, m);
+ cc.ldsetl(xA, xB, m);
+ cc.ldsetlb(wA, wB, m);
+ cc.ldsetlh(wA, wB, m);
+ cc.ldsmax(wA, wB, m);
+ cc.ldsmax(xA, xB, m);
+ cc.ldsmaxa(wA, wB, m);
+ cc.ldsmaxa(xA, xB, m);
+ cc.ldsmaxab(wA, wB, m);
+ cc.ldsmaxah(wA, wB, m);
+ cc.ldsmaxal(wA, wB, m);
+ cc.ldsmaxal(xA, xB, m);
+ cc.ldsmaxalb(wA, wB, m);
+ cc.ldsmaxalh(wA, wB, m);
+ cc.ldsmaxb(wA, wB, m);
+ cc.ldsmaxh(wA, wB, m);
+ cc.ldsmaxl(wA, wB, m);
+ cc.ldsmaxl(xA, xB, m);
+ cc.ldsmaxlb(wA, wB, m);
+ cc.ldsmaxlh(wA, wB, m);
+ cc.ldsmin(wA, wB, m);
+ cc.ldsmin(xA, xB, m);
+ cc.ldsmina(wA, wB, m);
+ cc.ldsmina(xA, xB, m);
+ cc.ldsminab(wA, wB, m);
+ cc.ldsminah(wA, wB, m);
+ cc.ldsminal(wA, wB, m);
+ cc.ldsminal(xA, xB, m);
+ cc.ldsminalb(wA, wB, m);
+ cc.ldsminalh(wA, wB, m);
+ cc.ldsminb(wA, wB, m);
+ cc.ldsminh(wA, wB, m);
+ cc.ldsminl(wA, wB, m);
+ cc.ldsminl(xA, xB, m);
+ cc.ldsminlb(wA, wB, m);
+ cc.ldsminlh(wA, wB, m);
+ cc.ldtr(wA, m);
+ cc.ldtr(xA, m);
+ cc.ldtrb(wA, m);
+ cc.ldtrh(wA, m);
+ cc.ldtrsb(wA, m);
+ cc.ldtrsh(wA, m);
+ cc.ldtrsw(xA, m);
+ cc.ldumax(wA, wB, m);
+ cc.ldumax(xA, xB, m);
+ cc.ldumaxa(wA, wB, m);
+ cc.ldumaxa(xA, xB, m);
+ cc.ldumaxab(wA, wB, m);
+ cc.ldumaxah(wA, wB, m);
+ cc.ldumaxal(wA, wB, m);
+ cc.ldumaxal(xA, xB, m);
+ cc.ldumaxalb(wA, wB, m);
+ cc.ldumaxalh(wA, wB, m);
+ cc.ldumaxb(wA, wB, m);
+ cc.ldumaxh(wA, wB, m);
+ cc.ldumaxl(wA, wB, m);
+ cc.ldumaxl(xA, xB, m);
+ cc.ldumaxlb(wA, wB, m);
+ cc.ldumaxlh(wA, wB, m);
+ cc.ldumin(wA, wB, m);
+ cc.ldumin(xA, xB, m);
+ cc.ldumina(wA, wB, m);
+ cc.ldumina(xA, xB, m);
+ cc.lduminab(wA, wB, m);
+ cc.lduminah(wA, wB, m);
+ cc.lduminal(wA, wB, m);
+ cc.lduminal(xA, xB, m);
+ cc.lduminalb(wA, wB, m);
+ cc.lduminalh(wA, wB, m);
+ cc.lduminb(wA, wB, m);
+ cc.lduminh(wA, wB, m);
+ cc.lduminl(wA, wB, m);
+ cc.lduminl(xA, xB, m);
+ cc.lduminlb(wA, wB, m);
+ cc.lduminlh(wA, wB, m);
+ cc.ldur(wA, m);
+ cc.ldur(xA, m);
+ cc.ldurb(wA, m);
+ cc.ldurh(wA, m);
+ cc.ldursb(wA, m);
+ cc.ldursh(wA, m);
+ cc.ldursw(xA, m);
+ cc.ldxp(wA, wB, m);
+ cc.ldxp(xA, xB, m);
+ cc.ldxr(wA, m);
+ cc.ldxr(xA, m);
+ cc.ldxrb(wA, m);
+ cc.ldxrh(wA, m);
+ cc.lsl(wA, wB, wC);
+ cc.lsl(xA, xB, xC);
+ cc.lsl(wA, wB, 15);
+ cc.lsl(xA, xB, 15);
+ cc.lslv(wA, wB, wC);
+ cc.lslv(xA, xB, xC);
+ cc.lsr(wA, wB, wC);
+ cc.lsr(xA, xB, xC);
+ cc.lsr(wA, wB, 15);
+ cc.lsr(xA, xB, 15);
+ cc.lsrv(wA, wB, wC);
+ cc.lsrv(xA, xB, xC);
+ cc.madd(wA, wB, wC, wD);
+ cc.madd(xA, xB, xC, xD);
+ cc.mneg(wA, wB, wC);
+ cc.mneg(xA, xB, xC);
+ cc.mov(wA, wB);
+ cc.mov(xA, xB);
+ cc.mov(wA, 0);
+ cc.mov(wA, 1);
+ cc.mov(wA, 2);
+ cc.mov(wA, 3);
+ cc.mov(wA, 4);
+ cc.mov(wA, 5);
+ cc.mov(wA, 6);
+ cc.mov(wA, 7);
+ cc.mov(wA, 8);
+ cc.mov(wA, 9);
+ cc.mov(wA, 10);
+ cc.mov(wA, 0xA234);
+ cc.mov(xA, 0xA23400000000);
+ cc.msub(wA, wB, wC, wD);
+ cc.msub(xA, xB, xC, xD);
+ cc.mul(wA, wB, wC);
+ cc.mul(xA, xB, xC);
+ cc.mvn(wA, wB);
+ cc.mvn(xA, xB);
+ cc.mvn(wA, wB, lsl(4));
+ cc.mvn(xA, xB, lsl(4));
+ cc.neg(wA, wB);
+ cc.neg(xA, xB);
+ cc.neg(wA, wB, lsl(4));
+ cc.neg(xA, xB, lsl(4));
+ cc.negs(wA, wB);
+ cc.negs(xA, xB);
+ cc.negs(wA, wB, lsl(4));
+ cc.negs(xA, xB, lsl(4));
+ cc.ngc(wA, wB);
+ cc.ngc(xA, xB);
+ cc.ngcs(wA, wB);
+ cc.ngcs(xA, xB);
+ cc.orn(wA, wB, wC);
+ cc.orn(xA, xB, xC);
+ cc.orn(wA, wB, wC, lsl(4));
+ cc.orn(xA, xB, xC, lsl(4));
+ cc.orr(wA, wB, wC);
+ cc.orr(xA, xB, xC);
+ cc.orr(wA, wB, wC, lsl(4));
+ cc.orr(xA, xB, xC, lsl(4));
+ cc.orr(wA, wB, 0x4000);
+ cc.orr(xA, xB, 0x8000);
+ cc.rbit(wA, wB);
+ cc.rbit(xA, xB);
+ cc.rev(wA, wB);
+ cc.rev(xA, xB);
+ cc.rev16(wA, wB);
+ cc.rev16(xA, xB);
+ cc.rev32(xA, xB);
+ cc.rev64(xA, xB);
+ cc.ror(wA, wB, wC);
+ cc.ror(xA, xB, xC);
+ cc.ror(wA, wB, 15);
+ cc.ror(xA, xB, 15);
+ cc.rorv(wA, wB, wC);
+ cc.rorv(xA, xB, xC);
+ cc.sbc(wA, wB, wC);
+ cc.sbc(xA, xB, xC);
+ cc.sbcs(wA, wB, wC);
+ cc.sbcs(xA, xB, xC);
+ cc.sbfiz(wA, wB, 5, 10);
+ cc.sbfiz(xA, xB, 5, 10);
+ cc.sbfm(wA, wB, 5, 10);
+ cc.sbfm(xA, xB, 5, 10);
+ cc.sbfx(wA, wB, 5, 10);
+ cc.sbfx(xA, xB, 5, 10);
+ cc.sdiv(wA, wB, wC);
+ cc.sdiv(xA, xB, xC);
+ cc.smaddl(xA, wB, wC, xD);
+ cc.smnegl(xA, wB, wC);
+ cc.smsubl(xA, wB, wC, xD);
+ cc.smulh(xA, xB, xC);
+ cc.smull(xA, wB, wC);
+ cc.stp(wA, wB, m);
+ cc.stp(xA, xB, m);
+ cc.sttr(wA, m);
+ cc.sttr(xA, m);
+ cc.sttrb(wA, m);
+ cc.sttrh(wA, m);
+ cc.stur(wA, m);
+ cc.stur(xA, m);
+ cc.sturb(wA, m);
+ cc.sturh(wA, m);
+ cc.stxp(wA, wB, wC, m);
+ cc.stxp(wA, xB, xC, m);
+ cc.stxr(wA, wB, m);
+ cc.stxr(wA, xB, m);
+ cc.stxrb(wA, wB, m);
+ cc.stxrh(wA, wB, m);
+ cc.sub(wA, wB, wC);
+ cc.sub(xA, xB, xC);
+ cc.sub(wA, wB, wC, lsl(3));
+ cc.sub(xA, xB, xC, lsl(3));
+ cc.subg(xA, xB, 32, 11);
+ cc.subp(xA, xB, xC);
+ cc.subps(xA, xB, xC);
+ cc.subs(wA, wB, wC);
+ cc.subs(xA, xB, xC);
+ cc.subs(wA, wB, wC, lsl(3));
+ cc.subs(xA, xB, xC, lsl(3));
+ cc.sxtb(wA, wB);
+ cc.sxtb(xA, wB);
+ cc.sxth(wA, wB);
+ cc.sxth(xA, wB);
+ cc.sxtw(xA, wB);
+ cc.tst(wA, 1);
+ cc.tst(xA, 1);
+ cc.tst(wA, wB);
+ cc.tst(xA, xB);
+ cc.tst(wA, wB, lsl(4));
+ cc.tst(xA, xB, lsl(4));
+ cc.udiv(wA, wB, wC);
+ cc.udiv(xA, xB, xC);
+ cc.ubfiz(wA, wB, 5, 10);
+ cc.ubfiz(xA, xB, 5, 10);
+ cc.ubfm(wA, wB, 5, 10);
+ cc.ubfm(xA, xB, 5, 10);
+ cc.ubfx(wA, wB, 5, 10);
+ cc.ubfx(xA, xB, 5, 10);
+ cc.umaddl(xA, wB, wC, xD);
+ cc.umnegl(xA, wB, wC);
+ cc.umsubl(xA, wB, wC, xD);
+ cc.umulh(xA, xB, xC);
+ cc.umull(xA, wB, wC);
+ cc.uxtb(wA, wB);
+ cc.uxth(wA, wB);
+}
+
+static void generateGpSequence(BaseEmitter& emitter, bool emitPrologEpilog) {
+ if (emitter.isAssembler()) {
+ a64::Assembler& cc = *emitter.as<a64::Assembler>();
+
+ a64::Gp a = a64::x0;
+ a64::Gp b = a64::x1;
+ a64::Gp c = a64::x2;
+ a64::Gp d = a64::x3;
+
+ if (emitPrologEpilog) {
+ FuncDetail func;
+ func.init(FuncSignatureT<void, void*, const void*, size_t>(CallConvId::kHost), cc.environment());
+
+ FuncFrame frame;
+ frame.init(func);
+ frame.addDirtyRegs(a, b, c, d);
+ frame.finalize();
+
+ cc.emitProlog(frame);
+ generateGpSequenceInternal(cc, a, b, c, d);
+ cc.emitEpilog(frame);
+ }
+ else {
+ generateGpSequenceInternal(cc, a, b, c, d);
+ }
+ }
+#ifndef ASMJIT_NO_BUILDER
+ else if (emitter.isBuilder()) {
+ a64::Builder& cc = *emitter.as<a64::Builder>();
+
+ a64::Gp a = a64::x0;
+ a64::Gp b = a64::x1;
+ a64::Gp c = a64::x2;
+ a64::Gp d = a64::x3;
+
+ if (emitPrologEpilog) {
+ FuncDetail func;
+ func.init(FuncSignatureT<void, void*, const void*, size_t>(CallConvId::kHost), cc.environment());
+
+ FuncFrame frame;
+ frame.init(func);
+ frame.addDirtyRegs(a, b, c, d);
+ frame.finalize();
+
+ cc.emitProlog(frame);
+ generateGpSequenceInternal(cc, a, b, c, d);
+ cc.emitEpilog(frame);
+ }
+ else {
+ generateGpSequenceInternal(cc, a, b, c, d);
+ }
+ }
+#endif
+#ifndef ASMJIT_NO_COMPILER
+ else if (emitter.isCompiler()) {
+ a64::Compiler& cc = *emitter.as<a64::Compiler>();
+
+ a64::Gp a = cc.newIntPtr("a");
+ a64::Gp b = cc.newIntPtr("b");
+ a64::Gp c = cc.newIntPtr("c");
+ a64::Gp d = cc.newIntPtr("d");
+
+ cc.addFunc(FuncSignatureT<void>(CallConvId::kHost));
+ generateGpSequenceInternal(cc, a, b, c, d);
+ cc.endFunc();
+ }
+#endif
+}
+
+template<typename EmitterFn>
+static void benchmarkA64Function(Arch arch, uint32_t numIterations, const char* description, const EmitterFn& emitterFn) noexcept {
+ CodeHolder code;
+ printf("%s:\n", description);
+
+ bench<a64::Assembler>(code, arch, numIterations, "[raw]", [&](a64::Assembler& cc) {
+ emitterFn(cc, false);
+ });
+
+ bench<a64::Assembler>(code, arch, numIterations, "[validated]", [&](a64::Assembler& cc) {
+ cc.addDiagnosticOptions(DiagnosticOptions::kValidateAssembler);
+ emitterFn(cc, false);
+ });
+
+ bench<a64::Assembler>(code, arch, numIterations, "[prolog/epilog]", [&](a64::Assembler& cc) {
+ cc.addDiagnosticOptions(DiagnosticOptions::kValidateAssembler);
+ emitterFn(cc, true);
+ });
+
+#ifndef ASMJIT_NO_BUILDER
+ bench<a64::Builder>(code, arch, numIterations, "[no-asm]", [&](a64::Builder& cc) {
+ emitterFn(cc, false);
+ });
+
+ bench<a64::Builder>(code, arch, numIterations, "[finalized]", [&](a64::Builder& cc) {
+ emitterFn(cc, false);
+ cc.finalize();
+ });
+
+ bench<a64::Builder>(code, arch, numIterations, "[prolog/epilog]", [&](a64::Builder& cc) {
+ emitterFn(cc, true);
+ cc.finalize();
+ });
+#endif
+
+#ifndef ASMJIT_NO_COMPILER
+ bench<a64::Compiler>(code, arch, numIterations, "[no-asm]", [&](a64::Compiler& cc) {
+ emitterFn(cc, true);
+ });
+
+ bench<a64::Compiler>(code, arch, numIterations, "[finalized]", [&](a64::Compiler& cc) {
+ emitterFn(cc, true);
+ cc.finalize();
+ });
+#endif
+
+ printf("\n");
+}
+
+void benchmarkA64Emitters(uint32_t numIterations) {
+ static const char description[] = "GpSequence (Sequence of GP instructions - reg/mem)";
+ benchmarkA64Function(Arch::kAArch64, numIterations, description, [](BaseEmitter& emitter, bool emitPrologEpilog) {
+ generateGpSequence(emitter, emitPrologEpilog);
+ });
+}
+
+#endif // !ASMJIT_NO_AARCH64
diff --git a/3rdparty/asmjit/test/asmjit_test_perf_x86.cpp b/3rdparty/asmjit/test/asmjit_test_perf_x86.cpp
new file mode 100644
index 00000000000..e2720b7c50a
--- /dev/null
+++ b/3rdparty/asmjit/test/asmjit_test_perf_x86.cpp
@@ -0,0 +1,5032 @@
+// This file is part of AsmJit project <https://asmjit.com>
+//
+// See asmjit.h or LICENSE.md for license and copyright information
+// SPDX-License-Identifier: Zlib
+
+#include <asmjit/core.h>
+
+#if !defined(ASMJIT_NO_X86)
+#include <asmjit/x86.h>
+
+#include <limits>
+#include <stdio.h>
+#include <string.h>
+
+#include "asmjit_test_misc.h"
+#include "asmjit_test_perf.h"
+
+using namespace asmjit;
+
+enum class InstForm {
+ kReg,
+ kMem
+};
+
+// Generates a long sequence of GP instructions.
+template<typename Emitter>
+static void generateGpSequenceInternal(
+ Emitter& cc,
+ InstForm form,
+ const x86::Gp& a, const x86::Gp& b, const x86::Gp& c, const x86::Gp& d) {
+
+ cc.mov(a, 0xAAAAAAAA);
+ cc.mov(b, 0xBBBBBBBB);
+ cc.mov(c, 0xCCCCCCCC);
+ cc.mov(d, 0xFFFFFFFF);
+
+ if (form == InstForm::kReg) {
+ cc.adc(a, b);
+ cc.adc(b, c);
+ cc.adc(c, d);
+ cc.add(a, b);
+ cc.add(b, c);
+ cc.add(c, d);
+ cc.and_(a, b);
+ cc.and_(b, c);
+ cc.and_(c, d);
+ cc.bsf(a, b);
+ cc.bsf(b, c);
+ cc.bsf(c, d);
+ cc.bsr(a, b);
+ cc.bsr(b, c);
+ cc.bsr(c, d);
+ cc.bswap(a);
+ cc.bswap(b);
+ cc.bswap(c);
+ cc.bt(a, b);
+ cc.bt(b, c);
+ cc.bt(c, d);
+ cc.btc(a, b);
+ cc.btc(b, c);
+ cc.btc(c, d);
+ cc.btr(a, b);
+ cc.btr(b, c);
+ cc.btr(c, d);
+ cc.bts(a, b);
+ cc.bts(b, c);
+ cc.bts(c, d);
+ cc.cmp(a, b);
+ cc.cmovc(a, b);
+ cc.cmp(b, c);
+ cc.cmovc(b, c);
+ cc.cmp(c, d);
+ cc.cmovc(c, d);
+ cc.dec(a);
+ cc.dec(b);
+ cc.dec(c);
+ cc.imul(a, b);
+ cc.imul(b, c);
+ cc.imul(c, d);
+ cc.movsx(a, b.r8Lo());
+ cc.movsx(b, c.r8Lo());
+ cc.movsx(c, d.r8Lo());
+ cc.movzx(a, b.r8Lo());
+ cc.movzx(b, c.r8Lo());
+ cc.movzx(c, d.r8Lo());
+ cc.neg(a);
+ cc.neg(b);
+ cc.neg(c);
+ cc.not_(a);
+ cc.not_(b);
+ cc.not_(c);
+ cc.or_(a, b);
+ cc.or_(b, c);
+ cc.or_(c, d);
+ cc.sbb(a, b);
+ cc.sbb(b, c);
+ cc.sbb(c, d);
+ cc.sub(a, b);
+ cc.sub(b, c);
+ cc.sub(c, d);
+ cc.test(a, b);
+ cc.test(b, c);
+ cc.test(c, d);
+ cc.xchg(a, b);
+ cc.xchg(b, c);
+ cc.xchg(c, d);
+ cc.xor_(a, b);
+ cc.xor_(b, c);
+ cc.xor_(c, d);
+
+ cc.rcl(a, c.r8Lo());
+ cc.rcl(b, c.r8Lo());
+ cc.rcl(d, c.r8Lo());
+ cc.rcr(a, c.r8Lo());
+ cc.rcr(b, c.r8Lo());
+ cc.rcr(d, c.r8Lo());
+ cc.rol(a, c.r8Lo());
+ cc.rol(b, c.r8Lo());
+ cc.rol(d, c.r8Lo());
+ cc.ror(a, c.r8Lo());
+ cc.ror(b, c.r8Lo());
+ cc.ror(d, c.r8Lo());
+ cc.shl(a, c.r8Lo());
+ cc.shl(b, c.r8Lo());
+ cc.shl(d, c.r8Lo());
+ cc.shr(a, c.r8Lo());
+ cc.shr(b, c.r8Lo());
+ cc.shr(d, c.r8Lo());
+ cc.sar(a, c.r8Lo());
+ cc.sar(b, c.r8Lo());
+ cc.sar(d, c.r8Lo());
+ cc.shld(a, b, c.r8Lo());
+ cc.shld(b, d, c.r8Lo());
+ cc.shld(d, a, c.r8Lo());
+ cc.shrd(a, b, c.r8Lo());
+ cc.shrd(b, d, c.r8Lo());
+ cc.shrd(d, a, c.r8Lo());
+
+ cc.adcx(a, b);
+ cc.adox(a, b);
+ cc.adcx(b, c);
+ cc.adox(b, c);
+ cc.adcx(c, d);
+ cc.adox(c, d);
+ cc.andn(a, b, c);
+ cc.andn(b, c, d);
+ cc.andn(c, d, a);
+ cc.bextr(a, b, c);
+ cc.bextr(b, c, d);
+ cc.bextr(c, d, a);
+ cc.blsi(a, b);
+ cc.blsi(b, c);
+ cc.blsi(c, d);
+ cc.blsmsk(a, b);
+ cc.blsmsk(b, c);
+ cc.blsmsk(c, d);
+ cc.blsr(a, b);
+ cc.blsr(b, c);
+ cc.blsr(c, d);
+ cc.bzhi(a, b, c);
+ cc.bzhi(b, c, d);
+ cc.bzhi(c, d, a);
+ cc.lzcnt(a, b);
+ cc.lzcnt(b, c);
+ cc.lzcnt(c, d);
+ cc.pdep(a, b, c);
+ cc.pdep(b, c, d);
+ cc.pdep(c, d, a);
+ cc.pext(a, b, c);
+ cc.pext(b, c, d);
+ cc.pext(c, d, a);
+ cc.popcnt(a, b);
+ cc.popcnt(b, c);
+ cc.popcnt(c, d);
+ cc.rorx(a, b, 8);
+ cc.rorx(b, c, 8);
+ cc.rorx(c, d, 8);
+ cc.sarx(a, b, c);
+ cc.sarx(b, c, d);
+ cc.sarx(c, d, a);
+ cc.shlx(a, b, c);
+ cc.shlx(b, c, d);
+ cc.shlx(c, d, a);
+ cc.shrx(a, b, c);
+ cc.shrx(b, c, d);
+ cc.shrx(c, d, a);
+ cc.tzcnt(a, b);
+ cc.tzcnt(b, c);
+ cc.tzcnt(c, d);
+ }
+ else {
+ uint32_t regSize = cc.registerSize();
+ x86::Mem m = x86::ptr(c, 0, regSize);
+ x86::Mem m8 = x86::byte_ptr(c);
+
+ cc.adc(a, m);
+ cc.adc(b, m);
+ cc.adc(c, m);
+ cc.add(a, m);
+ cc.add(b, m);
+ cc.add(c, m);
+ cc.and_(a, m);
+ cc.and_(b, m);
+ cc.and_(c, m);
+ cc.bsf(a, m);
+ cc.bsf(b, m);
+ cc.bsf(c, m);
+ cc.bsr(a, m);
+ cc.bsr(b, m);
+ cc.bsr(c, m);
+ cc.bt(m, a);
+ cc.bt(m, b);
+ cc.bt(m, c);
+ cc.btc(m, a);
+ cc.btc(m, b);
+ cc.btc(m, c);
+ cc.btr(m, a);
+ cc.btr(m, b);
+ cc.btr(m, c);
+ cc.bts(m, a);
+ cc.bts(m, b);
+ cc.bts(m, c);
+ cc.cmp(a, m);
+ cc.cmovc(a, m);
+ cc.cmp(b, m);
+ cc.cmovc(b, m);
+ cc.cmp(c, m);
+ cc.cmovc(c, m);
+ cc.dec(m);
+ cc.movsx(a, m8);
+ cc.movsx(b, m8);
+ cc.movsx(c, m8);
+ cc.movzx(a, m8);
+ cc.movzx(b, m8);
+ cc.movzx(c, m8);
+ cc.neg(m);
+ cc.not_(m);
+ cc.or_(a, m);
+ cc.or_(b, m);
+ cc.or_(c, m);
+ cc.sbb(a, m);
+ cc.sbb(b, m);
+ cc.sbb(c, m);
+ cc.sub(a, m);
+ cc.sub(b, m);
+ cc.sub(c, m);
+ cc.test(m, a);
+ cc.test(m, b);
+ cc.test(m, c);
+ cc.xchg(a, m);
+ cc.xchg(b, m);
+ cc.xchg(c, m);
+ cc.xor_(a, m);
+ cc.xor_(b, m);
+ cc.xor_(c, m);
+
+ cc.rcl(m, c.r8Lo());
+ cc.rcr(m, c.r8Lo());
+ cc.rol(m, c.r8Lo());
+ cc.ror(m, c.r8Lo());
+ cc.shl(m, c.r8Lo());
+ cc.shr(m, c.r8Lo());
+ cc.sar(m, c.r8Lo());
+ cc.shld(m, b, c.r8Lo());
+ cc.shld(m, d, c.r8Lo());
+ cc.shld(m, a, c.r8Lo());
+ cc.shrd(m, b, c.r8Lo());
+ cc.shrd(m, d, c.r8Lo());
+ cc.shrd(m, a, c.r8Lo());
+
+ cc.adcx(a, m);
+ cc.adox(a, m);
+ cc.adcx(b, m);
+ cc.adox(b, m);
+ cc.adcx(c, m);
+ cc.adox(c, m);
+ cc.andn(a, b, m);
+ cc.andn(b, c, m);
+ cc.andn(c, d, m);
+ cc.bextr(a, m, c);
+ cc.bextr(b, m, d);
+ cc.bextr(c, m, a);
+ cc.blsi(a, m);
+ cc.blsi(b, m);
+ cc.blsi(c, m);
+ cc.blsmsk(a, m);
+ cc.blsmsk(b, m);
+ cc.blsmsk(c, m);
+ cc.blsr(a, m);
+ cc.blsr(b, m);
+ cc.blsr(c, m);
+ cc.bzhi(a, m, c);
+ cc.bzhi(b, m, d);
+ cc.bzhi(c, m, a);
+ cc.lzcnt(a, m);
+ cc.lzcnt(b, m);
+ cc.lzcnt(c, m);
+ cc.pdep(a, b, m);
+ cc.pdep(b, c, m);
+ cc.pdep(c, d, m);
+ cc.pext(a, b, m);
+ cc.pext(b, c, m);
+ cc.pext(c, d, m);
+ cc.popcnt(a, m);
+ cc.popcnt(b, m);
+ cc.popcnt(c, m);
+ cc.rorx(a, m, 8);
+ cc.rorx(b, m, 8);
+ cc.rorx(c, m, 8);
+ cc.sarx(a, m, c);
+ cc.sarx(b, m, d);
+ cc.sarx(c, m, a);
+ cc.shlx(a, m, c);
+ cc.shlx(b, m, d);
+ cc.shlx(c, m, a);
+ cc.shrx(a, m, c);
+ cc.shrx(b, m, d);
+ cc.shrx(c, m, a);
+ cc.tzcnt(a, m);
+ cc.tzcnt(b, m);
+ cc.tzcnt(c, m);
+ }
+}
+
+static void generateGpSequence(BaseEmitter& emitter, InstForm form, bool emitPrologEpilog) {
+ using namespace asmjit::x86;
+
+ if (emitter.isAssembler()) {
+ Assembler& cc = *emitter.as<Assembler>();
+
+ x86::Gp a = cc.zax();
+ x86::Gp b = cc.zbx();
+ x86::Gp c = cc.zcx();
+ x86::Gp d = cc.zdx();
+
+ if (emitPrologEpilog) {
+ FuncDetail func;
+ func.init(FuncSignatureT<void, void*, const void*, size_t>(CallConvId::kHost), cc.environment());
+
+ FuncFrame frame;
+ frame.init(func);
+ frame.addDirtyRegs(a, b, c, d);
+ frame.finalize();
+
+ cc.emitProlog(frame);
+ generateGpSequenceInternal(cc, form, a, b, c, d);
+ cc.emitEpilog(frame);
+ }
+ else {
+ generateGpSequenceInternal(cc, form, a, b, c, d);
+ }
+ }
+#ifndef ASMJIT_NO_BUILDER
+ else if (emitter.isBuilder()) {
+ Builder& cc = *emitter.as<Builder>();
+
+ x86::Gp a = cc.zax();
+ x86::Gp b = cc.zbx();
+ x86::Gp c = cc.zcx();
+ x86::Gp d = cc.zdx();
+
+ if (emitPrologEpilog) {
+ FuncDetail func;
+ func.init(FuncSignatureT<void, void*, const void*, size_t>(CallConvId::kHost), cc.environment());
+
+ FuncFrame frame;
+ frame.init(func);
+ frame.addDirtyRegs(a, b, c, d);
+ frame.finalize();
+
+ cc.emitProlog(frame);
+ generateGpSequenceInternal(cc, form, a, b, c, d);
+ cc.emitEpilog(frame);
+ }
+ else {
+ generateGpSequenceInternal(cc, form, a, b, c, d);
+ }
+ }
+#endif
+#ifndef ASMJIT_NO_COMPILER
+ else if (emitter.isCompiler()) {
+ Compiler& cc = *emitter.as<Compiler>();
+
+ Gp a = cc.newIntPtr("a");
+ Gp b = cc.newIntPtr("b");
+ Gp c = cc.newIntPtr("c");
+ Gp d = cc.newIntPtr("d");
+
+ cc.addFunc(FuncSignatureT<void>(CallConvId::kHost));
+ generateGpSequenceInternal(cc, form, a, b, c, d);
+ cc.endFunc();
+ }
+#endif
+}
+
+// Generates a long sequence of SSE instructions using only registers.
+template<typename Emitter>
+static void generateSseSequenceInternal(
+ Emitter& cc,
+ InstForm form,
+ const x86::Gp& gp,
+ const x86::Xmm& xmmA, const x86::Xmm& xmmB, const x86::Xmm& xmmC, const x86::Xmm& xmmD) {
+
+ x86::Gp gpd = gp.r32();
+ x86::Gp gpq = gp.r64();
+ x86::Gp gpz = cc.is32Bit() ? gpd : gpq;
+
+ cc.xor_(gpd, gpd);
+ cc.xorps(xmmA, xmmA);
+ cc.xorps(xmmB, xmmB);
+ cc.xorps(xmmC, xmmC);
+ cc.xorps(xmmD, xmmD);
+
+ if (form == InstForm::kReg) {
+ // SSE.
+ cc.addps(xmmA, xmmB);
+ cc.addss(xmmA, xmmB);
+ cc.andnps(xmmA, xmmB);
+ cc.andps(xmmA, xmmB);
+ cc.cmpps(xmmA, xmmB, 0);
+ cc.cmpss(xmmA, xmmB, 0);
+ cc.comiss(xmmA, xmmB);
+ cc.cvtsi2ss(xmmA, gpd);
+ cc.cvtsi2ss(xmmA, gpz);
+ cc.cvtss2si(gpd, xmmB);
+ cc.cvtss2si(gpz, xmmB);
+ cc.cvttss2si(gpd, xmmB);
+ cc.cvttss2si(gpz, xmmB);
+ cc.divps(xmmA, xmmB);
+ cc.divss(xmmA, xmmB);
+ cc.maxps(xmmA, xmmB);
+ cc.maxss(xmmA, xmmB);
+ cc.minps(xmmA, xmmB);
+ cc.minss(xmmA, xmmB);
+ cc.movaps(xmmA, xmmB);
+ cc.movd(gpd, xmmB);
+ cc.movd(xmmA, gpd);
+ cc.movq(xmmA, xmmB);
+ cc.movhlps(xmmA, xmmB);
+ cc.movlhps(xmmA, xmmB);
+ cc.movups(xmmA, xmmB);
+ cc.mulps(xmmA, xmmB);
+ cc.mulss(xmmA, xmmB);
+ cc.orps(xmmA, xmmB);
+ cc.rcpps(xmmA, xmmB);
+ cc.rcpss(xmmA, xmmB);
+ cc.psadbw(xmmA, xmmB);
+ cc.rsqrtps(xmmA, xmmB);
+ cc.rsqrtss(xmmA, xmmB);
+ cc.sfence();
+ cc.shufps(xmmA, xmmB, 0);
+ cc.sqrtps(xmmA, xmmB);
+ cc.sqrtss(xmmA, xmmB);
+ cc.subps(xmmA, xmmB);
+ cc.subss(xmmA, xmmB);
+ cc.ucomiss(xmmA, xmmB);
+ cc.unpckhps(xmmA, xmmB);
+ cc.unpcklps(xmmA, xmmB);
+ cc.xorps(xmmA, xmmB);
+
+ // SSE2.
+ cc.addpd(xmmA, xmmB);
+ cc.addsd(xmmA, xmmB);
+ cc.andnpd(xmmA, xmmB);
+ cc.andpd(xmmA, xmmB);
+ cc.cmppd(xmmA, xmmB, 0);
+ cc.cmpsd(xmmA, xmmB, 0);
+ cc.comisd(xmmA, xmmB);
+ cc.cvtdq2pd(xmmA, xmmB);
+ cc.cvtdq2ps(xmmA, xmmB);
+ cc.cvtpd2dq(xmmA, xmmB);
+ cc.cvtpd2ps(xmmA, xmmB);
+ cc.cvtps2dq(xmmA, xmmB);
+ cc.cvtps2pd(xmmA, xmmB);
+ cc.cvtsd2si(gpd, xmmB);
+ cc.cvtsd2si(gpz, xmmB);
+ cc.cvtsd2ss(xmmA, xmmB);
+ cc.cvtsi2sd(xmmA, gpd);
+ cc.cvtsi2sd(xmmA, gpz);
+ cc.cvtss2sd(xmmA, xmmB);
+ cc.cvtss2si(gpd, xmmB);
+ cc.cvtss2si(gpz, xmmB);
+ cc.cvttpd2dq(xmmA, xmmB);
+ cc.cvttps2dq(xmmA, xmmB);
+ cc.cvttsd2si(gpd, xmmB);
+ cc.cvttsd2si(gpz, xmmB);
+ cc.divpd(xmmA, xmmB);
+ cc.divsd(xmmA, xmmB);
+ cc.maxpd(xmmA, xmmB);
+ cc.maxsd(xmmA, xmmB);
+ cc.minpd(xmmA, xmmB);
+ cc.minsd(xmmA, xmmB);
+ cc.movdqa(xmmA, xmmB);
+ cc.movdqu(xmmA, xmmB);
+ cc.movmskps(gpd, xmmB);
+ cc.movmskpd(gpd, xmmB);
+ cc.movsd(xmmA, xmmB);
+ cc.mulpd(xmmA, xmmB);
+ cc.mulsd(xmmA, xmmB);
+ cc.orpd(xmmA, xmmB);
+ cc.packsswb(xmmA, xmmB);
+ cc.packssdw(xmmA, xmmB);
+ cc.packuswb(xmmA, xmmB);
+ cc.paddb(xmmA, xmmB);
+ cc.paddw(xmmA, xmmB);
+ cc.paddd(xmmA, xmmB);
+ cc.paddq(xmmA, xmmB);
+ cc.paddsb(xmmA, xmmB);
+ cc.paddsw(xmmA, xmmB);
+ cc.paddusb(xmmA, xmmB);
+ cc.paddusw(xmmA, xmmB);
+ cc.pand(xmmA, xmmB);
+ cc.pandn(xmmA, xmmB);
+ cc.pavgb(xmmA, xmmB);
+ cc.pavgw(xmmA, xmmB);
+ cc.pcmpeqb(xmmA, xmmB);
+ cc.pcmpeqw(xmmA, xmmB);
+ cc.pcmpeqd(xmmA, xmmB);
+ cc.pcmpgtb(xmmA, xmmB);
+ cc.pcmpgtw(xmmA, xmmB);
+ cc.pcmpgtd(xmmA, xmmB);
+ cc.pmaxsw(xmmA, xmmB);
+ cc.pmaxub(xmmA, xmmB);
+ cc.pminsw(xmmA, xmmB);
+ cc.pminub(xmmA, xmmB);
+ cc.pmovmskb(gpd, xmmB);
+ cc.pmulhw(xmmA, xmmB);
+ cc.pmulhuw(xmmA, xmmB);
+ cc.pmullw(xmmA, xmmB);
+ cc.pmuludq(xmmA, xmmB);
+ cc.por(xmmA, xmmB);
+ cc.pslld(xmmA, xmmB);
+ cc.pslld(xmmA, 0);
+ cc.psllq(xmmA, xmmB);
+ cc.psllq(xmmA, 0);
+ cc.psllw(xmmA, xmmB);
+ cc.psllw(xmmA, 0);
+ cc.pslldq(xmmA, 0);
+ cc.psrad(xmmA, xmmB);
+ cc.psrad(xmmA, 0);
+ cc.psraw(xmmA, xmmB);
+ cc.psraw(xmmA, 0);
+ cc.psubb(xmmA, xmmB);
+ cc.psubw(xmmA, xmmB);
+ cc.psubd(xmmA, xmmB);
+ cc.psubq(xmmA, xmmB);
+ cc.pmaddwd(xmmA, xmmB);
+ cc.pshufd(xmmA, xmmB, 0);
+ cc.pshufhw(xmmA, xmmB, 0);
+ cc.pshuflw(xmmA, xmmB, 0);
+ cc.psrld(xmmA, xmmB);
+ cc.psrld(xmmA, 0);
+ cc.psrlq(xmmA, xmmB);
+ cc.psrlq(xmmA, 0);
+ cc.psrldq(xmmA, 0);
+ cc.psrlw(xmmA, xmmB);
+ cc.psrlw(xmmA, 0);
+ cc.psubsb(xmmA, xmmB);
+ cc.psubsw(xmmA, xmmB);
+ cc.psubusb(xmmA, xmmB);
+ cc.psubusw(xmmA, xmmB);
+ cc.punpckhbw(xmmA, xmmB);
+ cc.punpckhwd(xmmA, xmmB);
+ cc.punpckhdq(xmmA, xmmB);
+ cc.punpckhqdq(xmmA, xmmB);
+ cc.punpcklbw(xmmA, xmmB);
+ cc.punpcklwd(xmmA, xmmB);
+ cc.punpckldq(xmmA, xmmB);
+ cc.punpcklqdq(xmmA, xmmB);
+ cc.pxor(xmmA, xmmB);
+ cc.sqrtpd(xmmA, xmmB);
+ cc.sqrtsd(xmmA, xmmB);
+ cc.subpd(xmmA, xmmB);
+ cc.subsd(xmmA, xmmB);
+ cc.ucomisd(xmmA, xmmB);
+ cc.unpckhpd(xmmA, xmmB);
+ cc.unpcklpd(xmmA, xmmB);
+ cc.xorpd(xmmA, xmmB);
+
+ // SSE3.
+ cc.addsubpd(xmmA, xmmB);
+ cc.addsubps(xmmA, xmmB);
+ cc.haddpd(xmmA, xmmB);
+ cc.haddps(xmmA, xmmB);
+ cc.hsubpd(xmmA, xmmB);
+ cc.hsubps(xmmA, xmmB);
+ cc.movddup(xmmA, xmmB);
+ cc.movshdup(xmmA, xmmB);
+ cc.movsldup(xmmA, xmmB);
+
+ // SSSE3.
+ cc.psignb(xmmA, xmmB);
+ cc.psignw(xmmA, xmmB);
+ cc.psignd(xmmA, xmmB);
+ cc.phaddw(xmmA, xmmB);
+ cc.phaddd(xmmA, xmmB);
+ cc.phaddsw(xmmA, xmmB);
+ cc.phsubw(xmmA, xmmB);
+ cc.phsubd(xmmA, xmmB);
+ cc.phsubsw(xmmA, xmmB);
+ cc.pmaddubsw(xmmA, xmmB);
+ cc.pabsb(xmmA, xmmB);
+ cc.pabsw(xmmA, xmmB);
+ cc.pabsd(xmmA, xmmB);
+ cc.pmulhrsw(xmmA, xmmB);
+ cc.pshufb(xmmA, xmmB);
+ cc.palignr(xmmA, xmmB, 0);
+
+ // SSE4.1.
+ cc.blendpd(xmmA, xmmB, 0);
+ cc.blendps(xmmA, xmmB, 0);
+ cc.blendvpd(xmmA, xmmB, xmmA);
+ cc.blendvps(xmmA, xmmB, xmmA);
+
+ cc.dppd(xmmA, xmmB, 0);
+ cc.dpps(xmmA, xmmB, 0);
+ cc.extractps(gpd, xmmB, 0);
+ cc.insertps(xmmA, xmmB, 0);
+ cc.mpsadbw(xmmA, xmmB, 0);
+ cc.packusdw(xmmA, xmmB);
+ cc.pblendvb(xmmA, xmmB, xmmA);
+ cc.pblendw(xmmA, xmmB, 0);
+ cc.pcmpeqq(xmmA, xmmB);
+ cc.pextrb(gpd, xmmB, 0);
+ cc.pextrd(gpd, xmmB, 0);
+ if (cc.is64Bit()) cc.pextrq(gpq, xmmB, 0);
+ cc.pextrw(gpd, xmmB, 0);
+ cc.phminposuw(xmmA, xmmB);
+ cc.pinsrb(xmmA, gpd, 0);
+ cc.pinsrd(xmmA, gpd, 0);
+ cc.pinsrw(xmmA, gpd, 0);
+ cc.pmaxuw(xmmA, xmmB);
+ cc.pmaxsb(xmmA, xmmB);
+ cc.pmaxsd(xmmA, xmmB);
+ cc.pmaxud(xmmA, xmmB);
+ cc.pminsb(xmmA, xmmB);
+ cc.pminuw(xmmA, xmmB);
+ cc.pminud(xmmA, xmmB);
+ cc.pminsd(xmmA, xmmB);
+ cc.pmovsxbw(xmmA, xmmB);
+ cc.pmovsxbd(xmmA, xmmB);
+ cc.pmovsxbq(xmmA, xmmB);
+ cc.pmovsxwd(xmmA, xmmB);
+ cc.pmovsxwq(xmmA, xmmB);
+ cc.pmovsxdq(xmmA, xmmB);
+ cc.pmovzxbw(xmmA, xmmB);
+ cc.pmovzxbd(xmmA, xmmB);
+ cc.pmovzxbq(xmmA, xmmB);
+ cc.pmovzxwd(xmmA, xmmB);
+ cc.pmovzxwq(xmmA, xmmB);
+ cc.pmovzxdq(xmmA, xmmB);
+ cc.pmuldq(xmmA, xmmB);
+ cc.pmulld(xmmA, xmmB);
+ cc.ptest(xmmA, xmmB);
+ cc.roundps(xmmA, xmmB, 0);
+ cc.roundss(xmmA, xmmB, 0);
+ cc.roundpd(xmmA, xmmB, 0);
+ cc.roundsd(xmmA, xmmB, 0);
+ }
+ else {
+ x86::Mem m = x86::ptr(gpz);
+
+ cc.addps(xmmA, m);
+ cc.addss(xmmA, m);
+ cc.andnps(xmmA, m);
+ cc.andps(xmmA, m);
+ cc.cmpps(xmmA, m, 0);
+ cc.cmpss(xmmA, m, 0);
+ cc.comiss(xmmA, m);
+ cc.cvtpi2ps(xmmA, m);
+ cc.cvtsi2ss(xmmA, m);
+ cc.cvtss2si(gpd, m);
+ if (cc.is64Bit()) cc.cvtss2si(gpq, m);
+ cc.cvttss2si(gpd, m);
+ if (cc.is64Bit()) cc.cvttss2si(gpq, m);
+ cc.divps(xmmA, m);
+ cc.divss(xmmA, m);
+ cc.maxps(xmmA, m);
+ cc.maxss(xmmA, m);
+ cc.minps(xmmA, m);
+ cc.minss(xmmA, m);
+ cc.movaps(xmmA, m);
+ cc.movaps(m, xmmB);
+ cc.movd(m, xmmB);
+ cc.movd(xmmA, m);
+ cc.movq(m, xmmB);
+ cc.movq(xmmA, m);
+ cc.movhps(xmmA, m);
+ cc.movhps(m, xmmB);
+ cc.movlps(xmmA, m);
+ cc.movlps(m, xmmB);
+ cc.movntps(m, xmmB);
+ cc.movss(xmmA, m);
+ cc.movss(m, xmmB);
+ cc.movups(xmmA, m);
+ cc.movups(m, xmmB);
+ cc.mulps(xmmA, m);
+ cc.mulss(xmmA, m);
+ cc.orps(xmmA, m);
+ cc.rcpps(xmmA, m);
+ cc.rcpss(xmmA, m);
+ cc.psadbw(xmmA, m);
+ cc.rsqrtps(xmmA, m);
+ cc.rsqrtss(xmmA, m);
+ cc.shufps(xmmA, m, 0);
+ cc.sqrtps(xmmA, m);
+ cc.sqrtss(xmmA, m);
+ cc.stmxcsr(m);
+ cc.subps(xmmA, m);
+ cc.subss(xmmA, m);
+ cc.ucomiss(xmmA, m);
+ cc.unpckhps(xmmA, m);
+ cc.unpcklps(xmmA, m);
+ cc.xorps(xmmA, m);
+
+ // SSE2.
+ cc.addpd(xmmA, m);
+ cc.addsd(xmmA, m);
+ cc.andnpd(xmmA, m);
+ cc.andpd(xmmA, m);
+ cc.cmppd(xmmA, m, 0);
+ cc.cmpsd(xmmA, m, 0);
+ cc.comisd(xmmA, m);
+ cc.cvtdq2pd(xmmA, m);
+ cc.cvtdq2ps(xmmA, m);
+ cc.cvtpd2dq(xmmA, m);
+ cc.cvtpd2ps(xmmA, m);
+ cc.cvtpi2pd(xmmA, m);
+ cc.cvtps2dq(xmmA, m);
+ cc.cvtps2pd(xmmA, m);
+ cc.cvtsd2si(gpd, m);
+ if (cc.is64Bit()) cc.cvtsd2si(gpq, m);
+ cc.cvtsd2ss(xmmA, m);
+ cc.cvtsi2sd(xmmA, m);
+ cc.cvtss2sd(xmmA, m);
+ cc.cvtss2si(gpd, m);
+ if (cc.is64Bit()) cc.cvtss2si(gpq, m);
+ cc.cvttpd2dq(xmmA, m);
+ cc.cvttps2dq(xmmA, m);
+ cc.cvttsd2si(gpd, m);
+ if (cc.is64Bit()) cc.cvttsd2si(gpq, m);
+ cc.divpd(xmmA, m);
+ cc.divsd(xmmA, m);
+ cc.maxpd(xmmA, m);
+ cc.maxsd(xmmA, m);
+ cc.minpd(xmmA, m);
+ cc.minsd(xmmA, m);
+ cc.movdqa(xmmA, m);
+ cc.movdqa(m, xmmB);
+ cc.movdqu(xmmA, m);
+ cc.movdqu(m, xmmB);
+ cc.movsd(xmmA, m);
+ cc.movsd(m, xmmB);
+ cc.movapd(xmmA, m);
+ cc.movapd(m, xmmB);
+ cc.movhpd(xmmA, m);
+ cc.movhpd(m, xmmB);
+ cc.movlpd(xmmA, m);
+ cc.movlpd(m, xmmB);
+ cc.movntdq(m, xmmB);
+ cc.movntpd(m, xmmB);
+ cc.movupd(xmmA, m);
+ cc.movupd(m, xmmB);
+ cc.mulpd(xmmA, m);
+ cc.mulsd(xmmA, m);
+ cc.orpd(xmmA, m);
+ cc.packsswb(xmmA, m);
+ cc.packssdw(xmmA, m);
+ cc.packuswb(xmmA, m);
+ cc.paddb(xmmA, m);
+ cc.paddw(xmmA, m);
+ cc.paddd(xmmA, m);
+ cc.paddq(xmmA, m);
+ cc.paddsb(xmmA, m);
+ cc.paddsw(xmmA, m);
+ cc.paddusb(xmmA, m);
+ cc.paddusw(xmmA, m);
+ cc.pand(xmmA, m);
+ cc.pandn(xmmA, m);
+ cc.pavgb(xmmA, m);
+ cc.pavgw(xmmA, m);
+ cc.pcmpeqb(xmmA, m);
+ cc.pcmpeqw(xmmA, m);
+ cc.pcmpeqd(xmmA, m);
+ cc.pcmpgtb(xmmA, m);
+ cc.pcmpgtw(xmmA, m);
+ cc.pcmpgtd(xmmA, m);
+ cc.pmaxsw(xmmA, m);
+ cc.pmaxub(xmmA, m);
+ cc.pminsw(xmmA, m);
+ cc.pminub(xmmA, m);
+ cc.pmulhw(xmmA, m);
+ cc.pmulhuw(xmmA, m);
+ cc.pmullw(xmmA, m);
+ cc.pmuludq(xmmA, m);
+ cc.por(xmmA, m);
+ cc.pslld(xmmA, m);
+ cc.psllq(xmmA, m);
+ cc.psllw(xmmA, m);
+ cc.psrad(xmmA, m);
+ cc.psraw(xmmA, m);
+ cc.psubb(xmmA, m);
+ cc.psubw(xmmA, m);
+ cc.psubd(xmmA, m);
+ cc.psubq(xmmA, m);
+ cc.pmaddwd(xmmA, m);
+ cc.pshufd(xmmA, m, 0);
+ cc.pshufhw(xmmA, m, 0);
+ cc.pshuflw(xmmA, m, 0);
+ cc.psrld(xmmA, m);
+ cc.psrlq(xmmA, m);
+ cc.psrlw(xmmA, m);
+ cc.psubsb(xmmA, m);
+ cc.psubsw(xmmA, m);
+ cc.psubusb(xmmA, m);
+ cc.psubusw(xmmA, m);
+ cc.punpckhbw(xmmA, m);
+ cc.punpckhwd(xmmA, m);
+ cc.punpckhdq(xmmA, m);
+ cc.punpckhqdq(xmmA, m);
+ cc.punpcklbw(xmmA, m);
+ cc.punpcklwd(xmmA, m);
+ cc.punpckldq(xmmA, m);
+ cc.punpcklqdq(xmmA, m);
+ cc.pxor(xmmA, m);
+ cc.sqrtpd(xmmA, m);
+ cc.sqrtsd(xmmA, m);
+ cc.subpd(xmmA, m);
+ cc.subsd(xmmA, m);
+ cc.ucomisd(xmmA, m);
+ cc.unpckhpd(xmmA, m);
+ cc.unpcklpd(xmmA, m);
+ cc.xorpd(xmmA, m);
+
+ // SSE3.
+ cc.addsubpd(xmmA, m);
+ cc.addsubps(xmmA, m);
+ cc.haddpd(xmmA, m);
+ cc.haddps(xmmA, m);
+ cc.hsubpd(xmmA, m);
+ cc.hsubps(xmmA, m);
+ cc.lddqu(xmmA, m);
+ cc.movddup(xmmA, m);
+ cc.movshdup(xmmA, m);
+ cc.movsldup(xmmA, m);
+
+ // SSSE3.
+ cc.psignb(xmmA, m);
+ cc.psignw(xmmA, m);
+ cc.psignd(xmmA, m);
+ cc.phaddw(xmmA, m);
+ cc.phaddd(xmmA, m);
+ cc.phaddsw(xmmA, m);
+ cc.phsubw(xmmA, m);
+ cc.phsubd(xmmA, m);
+ cc.phsubsw(xmmA, m);
+ cc.pmaddubsw(xmmA, m);
+ cc.pabsb(xmmA, m);
+ cc.pabsw(xmmA, m);
+ cc.pabsd(xmmA, m);
+ cc.pmulhrsw(xmmA, m);
+ cc.pshufb(xmmA, m);
+ cc.palignr(xmmA, m, 0);
+
+ // SSE4.1.
+ cc.blendpd(xmmA, m, 0);
+ cc.blendps(xmmA, m, 0);
+ cc.blendvpd(xmmA, m, xmmA);
+ cc.blendvps(xmmA, m, xmmA);
+
+ cc.dppd(xmmA, m, 0);
+ cc.dpps(xmmA, m, 0);
+ cc.extractps(m, xmmB, 0);
+ cc.insertps(xmmA, m, 0);
+ cc.movntdqa(xmmA, m);
+ cc.mpsadbw(xmmA, m, 0);
+ cc.packusdw(xmmA, m);
+ cc.pblendvb(xmmA, m, xmmA);
+ cc.pblendw(xmmA, m, 0);
+ cc.pcmpeqq(xmmA, m);
+ cc.pextrb(m, xmmB, 0);
+ cc.pextrd(m, xmmB, 0);
+ if (cc.is64Bit()) cc.pextrq(m, xmmB, 0);
+ cc.pextrw(m, xmmB, 0);
+ cc.phminposuw(xmmA, m);
+ cc.pinsrb(xmmA, m, 0);
+ cc.pinsrd(xmmA, m, 0);
+ cc.pinsrw(xmmA, m, 0);
+ cc.pmaxuw(xmmA, m);
+ cc.pmaxsb(xmmA, m);
+ cc.pmaxsd(xmmA, m);
+ cc.pmaxud(xmmA, m);
+ cc.pminsb(xmmA, m);
+ cc.pminuw(xmmA, m);
+ cc.pminud(xmmA, m);
+ cc.pminsd(xmmA, m);
+ cc.pmovsxbw(xmmA, m);
+ cc.pmovsxbd(xmmA, m);
+ cc.pmovsxbq(xmmA, m);
+ cc.pmovsxwd(xmmA, m);
+ cc.pmovsxwq(xmmA, m);
+ cc.pmovsxdq(xmmA, m);
+ cc.pmovzxbw(xmmA, m);
+ cc.pmovzxbd(xmmA, m);
+ cc.pmovzxbq(xmmA, m);
+ cc.pmovzxwd(xmmA, m);
+ cc.pmovzxwq(xmmA, m);
+ cc.pmovzxdq(xmmA, m);
+ cc.pmuldq(xmmA, m);
+ cc.pmulld(xmmA, m);
+ cc.ptest(xmmA, m);
+ cc.roundps(xmmA, m, 0);
+ cc.roundss(xmmA, m, 0);
+ cc.roundpd(xmmA, m, 0);
+ cc.roundsd(xmmA, m, 0);
+
+ // SSE4.2.
+ cc.pcmpgtq(xmmA, m);
+ }
+}
+
+static void generateSseSequence(BaseEmitter& emitter, InstForm form, bool emitPrologEpilog) {
+ using namespace asmjit::x86;
+
+ if (emitter.isAssembler()) {
+ Assembler& cc = *emitter.as<Assembler>();
+
+ if (emitPrologEpilog) {
+ FuncDetail func;
+ func.init(FuncSignatureT<void, void*, const void*, size_t>(CallConvId::kHost), cc.environment());
+
+ FuncFrame frame;
+ frame.init(func);
+ frame.addDirtyRegs(eax, xmm0, xmm1, xmm2, xmm3);
+ frame.finalize();
+
+ cc.emitProlog(frame);
+ generateSseSequenceInternal(cc, form, eax, xmm0, xmm1, xmm2, xmm3);
+ cc.emitEpilog(frame);
+ }
+ else {
+ generateSseSequenceInternal(cc, form, eax, xmm0, xmm1, xmm2, xmm3);
+ }
+ }
+#ifndef ASMJIT_NO_BUILDER
+ else if (emitter.isBuilder()) {
+ Builder& cc = *emitter.as<Builder>();
+
+ if (emitPrologEpilog) {
+ FuncDetail func;
+ func.init(FuncSignatureT<void, void*, const void*, size_t>(CallConvId::kHost), cc.environment());
+
+ FuncFrame frame;
+ frame.init(func);
+ frame.addDirtyRegs(eax, xmm0, xmm1, xmm2, xmm3);
+ frame.finalize();
+
+ cc.emitProlog(frame);
+ generateSseSequenceInternal(cc, form, eax, xmm0, xmm1, xmm2, xmm3);
+ cc.emitEpilog(frame);
+ }
+ else {
+ generateSseSequenceInternal(cc, form, eax, xmm0, xmm1, xmm2, xmm3);
+ }
+ }
+#endif
+#ifndef ASMJIT_NO_COMPILER
+ else if (emitter.isCompiler()) {
+ Compiler& cc = *emitter.as<Compiler>();
+
+ Gp gp = cc.newGpz("gp");
+ Xmm a = cc.newXmm("a");
+ Xmm b = cc.newXmm("b");
+ Xmm c = cc.newXmm("c");
+ Xmm d = cc.newXmm("d");
+
+ cc.addFunc(FuncSignatureT<void>(CallConvId::kHost));
+ generateSseSequenceInternal(cc, form, gp, a, b, c, d);
+ cc.endFunc();
+ }
+#endif
+}
+
+// Generates a long sequence of AVX instructions.
+template<typename Emitter>
+static void generateAvxSequenceInternal(
+ Emitter& cc,
+ InstForm form,
+ const x86::Gp& gp,
+ const x86::Vec& vecA, const x86::Vec& vecB, const x86::Vec& vecC, const x86::Vec& vecD) {
+
+ x86::Gp gpd = gp.r32();
+ x86::Gp gpq = gp.r64();
+ x86::Gp gpz = cc.is32Bit() ? gpd : gpq;
+
+ x86::Xmm xmmA = vecA.xmm();
+ x86::Xmm xmmB = vecB.xmm();
+ x86::Xmm xmmC = vecC.xmm();
+ x86::Xmm xmmD = vecD.xmm();
+
+ x86::Ymm ymmA = vecA.ymm();
+ x86::Ymm ymmB = vecB.ymm();
+ x86::Ymm ymmC = vecC.ymm();
+ x86::Ymm ymmD = vecD.ymm();
+
+ cc.xor_(gpd, gpd);
+ cc.vxorps(xmmA, xmmA, xmmA);
+ cc.vxorps(xmmB, xmmB, xmmB);
+ cc.vxorps(xmmC, xmmC, xmmC);
+ cc.vxorps(xmmD, xmmD, xmmD);
+
+ if (form == InstForm::kReg) {
+ cc.vaddpd(xmmA, xmmB, xmmC);
+ cc.vaddpd(ymmA, ymmB, ymmC);
+ cc.vaddps(xmmA, xmmB, xmmC);
+ cc.vaddps(ymmA, ymmB, ymmC);
+ cc.vaddsd(xmmA, xmmB, xmmC);
+ cc.vaddss(xmmA, xmmB, xmmC);
+ cc.vaddsubpd(xmmA, xmmB, xmmC);
+ cc.vaddsubpd(ymmA, ymmB, ymmC);
+ cc.vaddsubps(xmmA, xmmB, xmmC);
+ cc.vaddsubps(ymmA, ymmB, ymmC);
+ cc.vandpd(xmmA, xmmB, xmmC);
+ cc.vandpd(ymmA, ymmB, ymmC);
+ cc.vandps(xmmA, xmmB, xmmC);
+ cc.vandps(ymmA, ymmB, ymmC);
+ cc.vandnpd(xmmA, xmmB, xmmC);
+ cc.vandnpd(ymmA, ymmB, ymmC);
+ cc.vandnps(xmmA, xmmB, xmmC);
+ cc.vandnps(ymmA, ymmB, ymmC);
+ cc.vblendpd(xmmA, xmmB, xmmC, 0);
+ cc.vblendpd(ymmA, ymmB, ymmC, 0);
+ cc.vblendps(xmmA, xmmB, xmmC, 0);
+ cc.vblendps(ymmA, ymmB, ymmC, 0);
+ cc.vblendvpd(xmmA, xmmB, xmmC, xmmA);
+ cc.vblendvpd(ymmA, ymmB, ymmC, ymmA);
+ cc.vcmppd(xmmA, xmmB, xmmC, 0);
+ cc.vcmppd(ymmA, ymmB, ymmC, 0);
+ cc.vcmpps(xmmA, xmmB, xmmC, 0);
+ cc.vcmpps(ymmA, ymmB, ymmC, 0);
+ cc.vcmpsd(xmmA, xmmB, xmmC, 0);
+ cc.vcmpss(xmmA, xmmB, xmmC, 0);
+ cc.vcomisd(xmmA, xmmB);
+ cc.vcomiss(xmmA, xmmB);
+ cc.vcvtdq2pd(xmmA, xmmB);
+ cc.vcvtdq2pd(ymmA, xmmB);
+ cc.vcvtdq2ps(xmmA, xmmB);
+ cc.vcvtdq2ps(ymmA, ymmB);
+ cc.vcvtpd2dq(xmmA, xmmB);
+ cc.vcvtpd2dq(xmmA, ymmB);
+ cc.vcvtpd2ps(xmmA, xmmB);
+ cc.vcvtpd2ps(xmmA, ymmB);
+ cc.vcvtps2dq(xmmA, xmmB);
+ cc.vcvtps2dq(ymmA, ymmB);
+ cc.vcvtps2pd(xmmA, xmmB);
+ cc.vcvtps2pd(ymmA, xmmB);
+ cc.vcvtsd2si(gpd, xmmB);
+ cc.vcvtsd2si(gpz, xmmB);
+ cc.vcvtsd2ss(xmmA, xmmB, xmmC);
+ cc.vcvtsi2sd(xmmA, xmmB, gpd);
+ cc.vcvtsi2sd(xmmA, xmmB, gpz);
+ cc.vcvtsi2ss(xmmA, xmmB, gpd);
+ cc.vcvtsi2ss(xmmA, xmmB, gpz);
+ cc.vcvtss2sd(xmmA, xmmB, xmmC);
+ cc.vcvtss2si(gpd, xmmB);
+ cc.vcvttpd2dq(xmmA, xmmB);
+ cc.vcvttpd2dq(xmmA, ymmB);
+ cc.vcvttps2dq(xmmA, xmmB);
+ cc.vcvttps2dq(ymmA, ymmB);
+ cc.vcvttsd2si(gpd, xmmB);
+ cc.vcvttss2si(gpz, xmmB);
+ cc.vdivpd(xmmA, xmmB, xmmC);
+ cc.vdivpd(ymmA, ymmB, ymmC);
+ cc.vdivps(xmmA, xmmB, xmmC);
+ cc.vdivps(ymmA, ymmB, ymmC);
+ cc.vdivsd(xmmA, xmmB, xmmC);
+ cc.vdivss(xmmA, xmmB, xmmC);
+ cc.vdppd(xmmA, xmmB, xmmC, 0);
+ cc.vdpps(xmmA, xmmB, xmmC, 0);
+ cc.vdpps(ymmA, ymmB, ymmC, 0);
+ cc.vextractf128(xmmA, ymmB, 0);
+ cc.vextractps(gpd, xmmB, 0);
+ cc.vhaddpd(xmmA, xmmB, xmmC);
+ cc.vhaddpd(ymmA, ymmB, ymmC);
+ cc.vhaddps(xmmA, xmmB, xmmC);
+ cc.vhaddps(ymmA, ymmB, ymmC);
+ cc.vhsubpd(xmmA, xmmB, xmmC);
+ cc.vhsubpd(ymmA, ymmB, ymmC);
+ cc.vhsubps(xmmA, xmmB, xmmC);
+ cc.vhsubps(ymmA, ymmB, ymmC);
+ cc.vinsertf128(ymmA, ymmB, xmmC, 0);
+ cc.vinsertps(xmmA, xmmB, xmmC, 0);
+ cc.vmaxpd(xmmA, xmmB, xmmC);
+ cc.vmaxpd(ymmA, ymmB, ymmC);
+ cc.vmaxps(xmmA, xmmB, xmmC);
+ cc.vmaxps(ymmA, ymmB, ymmC);
+ cc.vmaxsd(xmmA, xmmB, xmmC);
+ cc.vmaxss(xmmA, xmmB, xmmC);
+ cc.vminpd(xmmA, xmmB, xmmC);
+ cc.vminpd(ymmA, ymmB, ymmC);
+ cc.vminps(xmmA, xmmB, xmmC);
+ cc.vminps(ymmA, ymmB, ymmC);
+ cc.vminsd(xmmA, xmmB, xmmC);
+ cc.vminss(xmmA, xmmB, xmmC);
+ cc.vmovapd(xmmA, xmmB);
+ cc.vmovapd(ymmA, ymmB);
+ cc.vmovaps(xmmA, xmmB);
+ cc.vmovaps(ymmA, ymmB);
+ cc.vmovd(xmmA, gpd);
+ cc.vmovd(gpd, xmmB);
+ cc.vmovddup(xmmA, xmmB);
+ cc.vmovddup(ymmA, ymmB);
+ cc.vmovdqa(xmmA, xmmB);
+ cc.vmovdqa(ymmA, ymmB);
+ cc.vmovdqu(xmmA, xmmB);
+ cc.vmovdqu(ymmA, ymmB);
+ cc.vmovhlps(xmmA, xmmB, xmmC);
+ cc.vmovlhps(xmmA, xmmB, xmmC);
+ cc.vmovmskpd(gpd, xmmB);
+ cc.vmovmskpd(gpd, ymmB);
+ cc.vmovmskps(gpd, xmmB);
+ cc.vmovmskps(gpd, ymmB);
+ cc.vmovsd(xmmA, xmmB, xmmC);
+ cc.vmovshdup(xmmA, xmmB);
+ cc.vmovshdup(ymmA, ymmB);
+ cc.vmovsldup(xmmA, xmmB);
+ cc.vmovsldup(ymmA, ymmB);
+ cc.vmovss(xmmA, xmmB, xmmC);
+ cc.vmovupd(xmmA, xmmB);
+ cc.vmovupd(ymmA, ymmB);
+ cc.vmovups(xmmA, xmmB);
+ cc.vmovups(ymmA, ymmB);
+ cc.vmpsadbw(xmmA, xmmB, xmmC, 0);
+ cc.vmulpd(xmmA, xmmB, xmmC);
+ cc.vmulpd(ymmA, ymmB, ymmC);
+ cc.vmulps(xmmA, xmmB, xmmC);
+ cc.vmulps(ymmA, ymmB, ymmC);
+ cc.vmulsd(xmmA, xmmB, xmmC);
+ cc.vmulss(xmmA, xmmB, xmmC);
+ cc.vorpd(xmmA, xmmB, xmmC);
+ cc.vorpd(ymmA, ymmB, ymmC);
+ cc.vorps(xmmA, xmmB, xmmC);
+ cc.vorps(ymmA, ymmB, ymmC);
+ cc.vpabsb(xmmA, xmmB);
+ cc.vpabsd(xmmA, xmmB);
+ cc.vpabsw(xmmA, xmmB);
+ cc.vpackssdw(xmmA, xmmB, xmmC);
+ cc.vpacksswb(xmmA, xmmB, xmmC);
+ cc.vpackusdw(xmmA, xmmB, xmmC);
+ cc.vpackuswb(xmmA, xmmB, xmmC);
+ cc.vpaddb(xmmA, xmmB, xmmC);
+ cc.vpaddd(xmmA, xmmB, xmmC);
+ cc.vpaddq(xmmA, xmmB, xmmC);
+ cc.vpaddw(xmmA, xmmB, xmmC);
+ cc.vpaddsb(xmmA, xmmB, xmmC);
+ cc.vpaddsw(xmmA, xmmB, xmmC);
+ cc.vpaddusb(xmmA, xmmB, xmmC);
+ cc.vpaddusw(xmmA, xmmB, xmmC);
+ cc.vpalignr(xmmA, xmmB, xmmC, 0);
+ cc.vpand(xmmA, xmmB, xmmC);
+ cc.vpandn(xmmA, xmmB, xmmC);
+ cc.vpavgb(xmmA, xmmB, xmmC);
+ cc.vpavgw(xmmA, xmmB, xmmC);
+ cc.vpblendvb(xmmA, xmmB, xmmC, xmmA);
+ cc.vpblendw(xmmA, xmmB, xmmC, 0);
+ cc.vpcmpeqb(xmmA, xmmB, xmmC);
+ cc.vpcmpeqd(xmmA, xmmB, xmmC);
+ cc.vpcmpeqq(xmmA, xmmB, xmmC);
+ cc.vpcmpeqw(xmmA, xmmB, xmmC);
+ cc.vpcmpgtb(xmmA, xmmB, xmmC);
+ cc.vpcmpgtd(xmmA, xmmB, xmmC);
+ cc.vpcmpgtq(xmmA, xmmB, xmmC);
+ cc.vpcmpgtw(xmmA, xmmB, xmmC);
+ cc.vpermilpd(xmmA, xmmB, xmmC);
+ cc.vpermilpd(ymmA, ymmB, ymmC);
+ cc.vpermilpd(xmmA, xmmB, 0);
+ cc.vpermilpd(ymmA, ymmB, 0);
+ cc.vpermilps(xmmA, xmmB, xmmC);
+ cc.vpermilps(ymmA, ymmB, ymmC);
+ cc.vpermilps(xmmA, xmmB, 0);
+ cc.vpermilps(ymmA, ymmB, 0);
+ cc.vperm2f128(ymmA, ymmB, ymmC, 0);
+ cc.vpextrb(gpd, xmmB, 0);
+ cc.vpextrd(gpd, xmmB, 0);
+ if (cc.is64Bit()) cc.vpextrq(gpq, xmmB, 0);
+ cc.vpextrw(gpd, xmmB, 0);
+ cc.vphaddd(xmmA, xmmB, xmmC);
+ cc.vphaddsw(xmmA, xmmB, xmmC);
+ cc.vphaddw(xmmA, xmmB, xmmC);
+ cc.vphminposuw(xmmA, xmmB);
+ cc.vphsubd(xmmA, xmmB, xmmC);
+ cc.vphsubsw(xmmA, xmmB, xmmC);
+ cc.vphsubw(xmmA, xmmB, xmmC);
+ cc.vpinsrb(xmmA, xmmB, gpd, 0);
+ cc.vpinsrd(xmmA, xmmB, gpd, 0);
+ cc.vpinsrw(xmmA, xmmB, gpd, 0);
+ cc.vpmaddubsw(xmmA, xmmB, xmmC);
+ cc.vpmaddwd(xmmA, xmmB, xmmC);
+ cc.vpmaxsb(xmmA, xmmB, xmmC);
+ cc.vpmaxsd(xmmA, xmmB, xmmC);
+ cc.vpmaxsw(xmmA, xmmB, xmmC);
+ cc.vpmaxub(xmmA, xmmB, xmmC);
+ cc.vpmaxud(xmmA, xmmB, xmmC);
+ cc.vpmaxuw(xmmA, xmmB, xmmC);
+ cc.vpminsb(xmmA, xmmB, xmmC);
+ cc.vpminsd(xmmA, xmmB, xmmC);
+ cc.vpminsw(xmmA, xmmB, xmmC);
+ cc.vpminub(xmmA, xmmB, xmmC);
+ cc.vpminud(xmmA, xmmB, xmmC);
+ cc.vpminuw(xmmA, xmmB, xmmC);
+ cc.vpmovmskb(gpd, xmmB);
+ cc.vpmovsxbd(xmmA, xmmB);
+ cc.vpmovsxbq(xmmA, xmmB);
+ cc.vpmovsxbw(xmmA, xmmB);
+ cc.vpmovsxdq(xmmA, xmmB);
+ cc.vpmovsxwd(xmmA, xmmB);
+ cc.vpmovsxwq(xmmA, xmmB);
+ cc.vpmovzxbd(xmmA, xmmB);
+ cc.vpmovzxbq(xmmA, xmmB);
+ cc.vpmovzxbw(xmmA, xmmB);
+ cc.vpmovzxdq(xmmA, xmmB);
+ cc.vpmovzxwd(xmmA, xmmB);
+ cc.vpmovzxwq(xmmA, xmmB);
+ cc.vpmuldq(xmmA, xmmB, xmmC);
+ cc.vpmulhrsw(xmmA, xmmB, xmmC);
+ cc.vpmulhuw(xmmA, xmmB, xmmC);
+ cc.vpmulhw(xmmA, xmmB, xmmC);
+ cc.vpmulld(xmmA, xmmB, xmmC);
+ cc.vpmullw(xmmA, xmmB, xmmC);
+ cc.vpmuludq(xmmA, xmmB, xmmC);
+ cc.vpor(xmmA, xmmB, xmmC);
+ cc.vpsadbw(xmmA, xmmB, xmmC);
+ cc.vpshufb(xmmA, xmmB, xmmC);
+ cc.vpshufd(xmmA, xmmB, 0);
+ cc.vpshufhw(xmmA, xmmB, 0);
+ cc.vpshuflw(xmmA, xmmB, 0);
+ cc.vpsignb(xmmA, xmmB, xmmC);
+ cc.vpsignd(xmmA, xmmB, xmmC);
+ cc.vpsignw(xmmA, xmmB, xmmC);
+ cc.vpslld(xmmA, xmmB, xmmC);
+ cc.vpslld(xmmA, xmmB, 0);
+ cc.vpslldq(xmmA, xmmB, 0);
+ cc.vpsllq(xmmA, xmmB, xmmC);
+ cc.vpsllq(xmmA, xmmB, 0);
+ cc.vpsllw(xmmA, xmmB, xmmC);
+ cc.vpsllw(xmmA, xmmB, 0);
+ cc.vpsrad(xmmA, xmmB, xmmC);
+ cc.vpsrad(xmmA, xmmB, 0);
+ cc.vpsraw(xmmA, xmmB, xmmC);
+ cc.vpsraw(xmmA, xmmB, 0);
+ cc.vpsrld(xmmA, xmmB, xmmC);
+ cc.vpsrld(xmmA, xmmB, 0);
+ cc.vpsrldq(xmmA, xmmB, 0);
+ cc.vpsrlq(xmmA, xmmB, xmmC);
+ cc.vpsrlq(xmmA, xmmB, 0);
+ cc.vpsrlw(xmmA, xmmB, xmmC);
+ cc.vpsrlw(xmmA, xmmB, 0);
+ cc.vpsubb(xmmA, xmmB, xmmC);
+ cc.vpsubd(xmmA, xmmB, xmmC);
+ cc.vpsubq(xmmA, xmmB, xmmC);
+ cc.vpsubw(xmmA, xmmB, xmmC);
+ cc.vpsubsb(xmmA, xmmB, xmmC);
+ cc.vpsubsw(xmmA, xmmB, xmmC);
+ cc.vpsubusb(xmmA, xmmB, xmmC);
+ cc.vpsubusw(xmmA, xmmB, xmmC);
+ cc.vptest(xmmA, xmmB);
+ cc.vptest(ymmA, ymmB);
+ cc.vpunpckhbw(xmmA, xmmB, xmmC);
+ cc.vpunpckhdq(xmmA, xmmB, xmmC);
+ cc.vpunpckhqdq(xmmA, xmmB, xmmC);
+ cc.vpunpckhwd(xmmA, xmmB, xmmC);
+ cc.vpunpcklbw(xmmA, xmmB, xmmC);
+ cc.vpunpckldq(xmmA, xmmB, xmmC);
+ cc.vpunpcklqdq(xmmA, xmmB, xmmC);
+ cc.vpunpcklwd(xmmA, xmmB, xmmC);
+ cc.vpxor(xmmA, xmmB, xmmC);
+ cc.vrcpps(xmmA, xmmB);
+ cc.vrcpps(ymmA, ymmB);
+ cc.vrcpss(xmmA, xmmB, xmmC);
+ cc.vrsqrtps(xmmA, xmmB);
+ cc.vrsqrtps(ymmA, ymmB);
+ cc.vrsqrtss(xmmA, xmmB, xmmC);
+ cc.vroundpd(xmmA, xmmB, 0);
+ cc.vroundpd(ymmA, ymmB, 0);
+ cc.vroundps(xmmA, xmmB, 0);
+ cc.vroundps(ymmA, ymmB, 0);
+ cc.vroundsd(xmmA, xmmB, xmmC, 0);
+ cc.vroundss(xmmA, xmmB, xmmC, 0);
+ cc.vshufpd(xmmA, xmmB, xmmC, 0);
+ cc.vshufpd(ymmA, ymmB, ymmC, 0);
+ cc.vshufps(xmmA, xmmB, xmmC, 0);
+ cc.vshufps(ymmA, ymmB, ymmC, 0);
+ cc.vsqrtpd(xmmA, xmmB);
+ cc.vsqrtpd(ymmA, ymmB);
+ cc.vsqrtps(xmmA, xmmB);
+ cc.vsqrtps(ymmA, ymmB);
+ cc.vsqrtsd(xmmA, xmmB, xmmC);
+ cc.vsqrtss(xmmA, xmmB, xmmC);
+ cc.vsubpd(xmmA, xmmB, xmmC);
+ cc.vsubpd(ymmA, ymmB, ymmC);
+ cc.vsubps(xmmA, xmmB, xmmC);
+ cc.vsubps(ymmA, ymmB, ymmC);
+ cc.vsubsd(xmmA, xmmB, xmmC);
+ cc.vsubss(xmmA, xmmB, xmmC);
+ cc.vtestps(xmmA, xmmB);
+ cc.vtestps(ymmA, ymmB);
+ cc.vtestpd(xmmA, xmmB);
+ cc.vtestpd(ymmA, ymmB);
+ cc.vucomisd(xmmA, xmmB);
+ cc.vucomiss(xmmA, xmmB);
+ cc.vunpckhpd(xmmA, xmmB, xmmC);
+ cc.vunpckhpd(ymmA, ymmB, ymmC);
+ cc.vunpckhps(xmmA, xmmB, xmmC);
+ cc.vunpckhps(ymmA, ymmB, ymmC);
+ cc.vunpcklpd(xmmA, xmmB, xmmC);
+ cc.vunpcklpd(ymmA, ymmB, ymmC);
+ cc.vunpcklps(xmmA, xmmB, xmmC);
+ cc.vunpcklps(ymmA, ymmB, ymmC);
+ cc.vxorpd(xmmA, xmmB, xmmC);
+ cc.vxorpd(ymmA, ymmB, ymmC);
+ cc.vxorps(xmmA, xmmB, xmmC);
+ cc.vxorps(ymmA, ymmB, ymmC);
+
+ // AVX+AESNI.
+ cc.vaesdec(xmmA, xmmB, xmmC);
+ cc.vaesdeclast(xmmA, xmmB, xmmC);
+ cc.vaesenc(xmmA, xmmB, xmmC);
+ cc.vaesenclast(xmmA, xmmB, xmmC);
+ cc.vaesimc(xmmA, xmmB);
+ cc.vaeskeygenassist(xmmA, xmmB, 0);
+
+ // AVX+PCLMULQDQ.
+ cc.vpclmulqdq(xmmA, xmmB, xmmC, 0);
+
+ // AVX2.
+ cc.vbroadcastsd(ymmA, xmmB);
+ cc.vbroadcastss(xmmA, xmmB);
+ cc.vbroadcastss(ymmA, xmmB);
+ cc.vextracti128(xmmA, ymmB, 0);
+ cc.vinserti128(ymmA, ymmB, xmmC, 0);
+ cc.vmpsadbw(ymmA, ymmB, ymmC, 0);
+ cc.vpabsb(ymmA, ymmB);
+ cc.vpabsd(ymmA, ymmB);
+ cc.vpabsw(ymmA, ymmB);
+ cc.vpackssdw(ymmA, ymmB, ymmC);
+ cc.vpacksswb(ymmA, ymmB, ymmC);
+ cc.vpackusdw(ymmA, ymmB, ymmC);
+ cc.vpackuswb(ymmA, ymmB, ymmC);
+ cc.vpaddb(ymmA, ymmB, ymmC);
+ cc.vpaddd(ymmA, ymmB, ymmC);
+ cc.vpaddq(ymmA, ymmB, ymmC);
+ cc.vpaddw(ymmA, ymmB, ymmC);
+ cc.vpaddsb(ymmA, ymmB, ymmC);
+ cc.vpaddsw(ymmA, ymmB, ymmC);
+ cc.vpaddusb(ymmA, ymmB, ymmC);
+ cc.vpaddusw(ymmA, ymmB, ymmC);
+ cc.vpalignr(ymmA, ymmB, ymmC, 0);
+ cc.vpand(ymmA, ymmB, ymmC);
+ cc.vpandn(ymmA, ymmB, ymmC);
+ cc.vpavgb(ymmA, ymmB, ymmC);
+ cc.vpavgw(ymmA, ymmB, ymmC);
+ cc.vpblendd(xmmA, xmmB, xmmC, 0);
+ cc.vpblendd(ymmA, ymmB, ymmC, 0);
+ cc.vpblendvb(ymmA, ymmB, ymmC, ymmA);
+ cc.vpblendw(ymmA, ymmB, ymmC, 0);
+ cc.vpbroadcastb(xmmA, xmmB);
+ cc.vpbroadcastb(ymmA, xmmB);
+ cc.vpbroadcastd(xmmA, xmmB);
+ cc.vpbroadcastd(ymmA, xmmB);
+ cc.vpbroadcastq(xmmA, xmmB);
+ cc.vpbroadcastq(ymmA, xmmB);
+ cc.vpbroadcastw(xmmA, xmmB);
+ cc.vpbroadcastw(ymmA, xmmB);
+ cc.vpcmpeqb(ymmA, ymmB, ymmC);
+ cc.vpcmpeqd(ymmA, ymmB, ymmC);
+ cc.vpcmpeqq(ymmA, ymmB, ymmC);
+ cc.vpcmpeqw(ymmA, ymmB, ymmC);
+ cc.vpcmpgtb(ymmA, ymmB, ymmC);
+ cc.vpcmpgtd(ymmA, ymmB, ymmC);
+ cc.vpcmpgtq(ymmA, ymmB, ymmC);
+ cc.vpcmpgtw(ymmA, ymmB, ymmC);
+ cc.vperm2i128(ymmA, ymmB, ymmC, 0);
+ cc.vpermd(ymmA, ymmB, ymmC);
+ cc.vpermps(ymmA, ymmB, ymmC);
+ cc.vpermpd(ymmA, ymmB, 0);
+ cc.vpermq(ymmA, ymmB, 0);
+ cc.vpmovmskb(gpd, ymmB);
+ cc.vpmovsxbd(ymmA, xmmB);
+ cc.vpmovsxbq(ymmA, xmmB);
+ cc.vpmovsxbw(ymmA, xmmB);
+ cc.vpmovsxdq(ymmA, xmmB);
+ cc.vpmovsxwd(ymmA, xmmB);
+ cc.vpmovsxwq(ymmA, xmmB);
+ cc.vpmovzxbd(ymmA, xmmB);
+ cc.vpmovzxbq(ymmA, xmmB);
+ cc.vpmovzxbw(ymmA, xmmB);
+ cc.vpmovzxdq(ymmA, xmmB);
+ cc.vpmovzxwd(ymmA, xmmB);
+ cc.vpmovzxwq(ymmA, xmmB);
+ cc.vpshufd(ymmA, ymmB, 0);
+ cc.vpshufhw(ymmA, ymmB, 0);
+ cc.vpshuflw(ymmA, ymmB, 0);
+ cc.vpslld(ymmA, ymmB, 0);
+ cc.vpslldq(ymmA, ymmB, 0);
+ cc.vpsllq(ymmA, ymmB, 0);
+ cc.vpsllw(ymmA, ymmB, 0);
+ cc.vpsrad(ymmA, ymmB, 0);
+ cc.vpsraw(ymmA, ymmB, 0);
+ cc.vpsrld(ymmA, ymmB, 0);
+ cc.vpsrldq(ymmA, ymmB, 0);
+ cc.vpsrlq(ymmA, ymmB, 0);
+ cc.vpsrlw(ymmA, ymmB, 0);
+ cc.vphaddd(ymmA, ymmB, ymmC);
+ cc.vphaddsw(ymmA, ymmB, ymmC);
+ cc.vphaddw(ymmA, ymmB, ymmC);
+ cc.vphsubd(ymmA, ymmB, ymmC);
+ cc.vphsubsw(ymmA, ymmB, ymmC);
+ cc.vphsubw(ymmA, ymmB, ymmC);
+ cc.vpmaddubsw(ymmA, ymmB, ymmC);
+ cc.vpmaddwd(ymmA, ymmB, ymmC);
+ cc.vpmaxsb(ymmA, ymmB, ymmC);
+ cc.vpmaxsd(ymmA, ymmB, ymmC);
+ cc.vpmaxsw(ymmA, ymmB, ymmC);
+ cc.vpmaxub(ymmA, ymmB, ymmC);
+ cc.vpmaxud(ymmA, ymmB, ymmC);
+ cc.vpmaxuw(ymmA, ymmB, ymmC);
+ cc.vpminsb(ymmA, ymmB, ymmC);
+ cc.vpminsd(ymmA, ymmB, ymmC);
+ cc.vpminsw(ymmA, ymmB, ymmC);
+ cc.vpminub(ymmA, ymmB, ymmC);
+ cc.vpminud(ymmA, ymmB, ymmC);
+ cc.vpminuw(ymmA, ymmB, ymmC);
+ cc.vpmuldq(ymmA, ymmB, ymmC);
+ cc.vpmulhrsw(ymmA, ymmB, ymmC);
+ cc.vpmulhuw(ymmA, ymmB, ymmC);
+ cc.vpmulhw(ymmA, ymmB, ymmC);
+ cc.vpmulld(ymmA, ymmB, ymmC);
+ cc.vpmullw(ymmA, ymmB, ymmC);
+ cc.vpmuludq(ymmA, ymmB, ymmC);
+ cc.vpor(ymmA, ymmB, ymmC);
+ cc.vpsadbw(ymmA, ymmB, ymmC);
+ cc.vpshufb(ymmA, ymmB, ymmC);
+ cc.vpsignb(ymmA, ymmB, ymmC);
+ cc.vpsignd(ymmA, ymmB, ymmC);
+ cc.vpsignw(ymmA, ymmB, ymmC);
+ cc.vpslld(ymmA, ymmB, xmmC);
+ cc.vpsllq(ymmA, ymmB, xmmC);
+ cc.vpsllvd(xmmA, xmmB, xmmC);
+ cc.vpsllvd(ymmA, ymmB, ymmC);
+ cc.vpsllvq(xmmA, xmmB, xmmC);
+ cc.vpsllvq(ymmA, ymmB, ymmC);
+ cc.vpsllw(ymmA, ymmB, xmmC);
+ cc.vpsrad(ymmA, ymmB, xmmC);
+ cc.vpsravd(xmmA, xmmB, xmmC);
+ cc.vpsravd(ymmA, ymmB, ymmC);
+ cc.vpsraw(ymmA, ymmB, xmmC);
+ cc.vpsrld(ymmA, ymmB, xmmC);
+ cc.vpsrlq(ymmA, ymmB, xmmC);
+ cc.vpsrlvd(xmmA, xmmB, xmmC);
+ cc.vpsrlvd(ymmA, ymmB, ymmC);
+ cc.vpsrlvq(xmmA, xmmB, xmmC);
+ cc.vpsrlvq(ymmA, ymmB, ymmC);
+ cc.vpsrlw(ymmA, ymmB, xmmC);
+ cc.vpsubb(ymmA, ymmB, ymmC);
+ cc.vpsubd(ymmA, ymmB, ymmC);
+ cc.vpsubq(ymmA, ymmB, ymmC);
+ cc.vpsubsb(ymmA, ymmB, ymmC);
+ cc.vpsubsw(ymmA, ymmB, ymmC);
+ cc.vpsubusb(ymmA, ymmB, ymmC);
+ cc.vpsubusw(ymmA, ymmB, ymmC);
+ cc.vpsubw(ymmA, ymmB, ymmC);
+ cc.vpunpckhbw(ymmA, ymmB, ymmC);
+ cc.vpunpckhdq(ymmA, ymmB, ymmC);
+ cc.vpunpckhqdq(ymmA, ymmB, ymmC);
+ cc.vpunpckhwd(ymmA, ymmB, ymmC);
+ cc.vpunpcklbw(ymmA, ymmB, ymmC);
+ cc.vpunpckldq(ymmA, ymmB, ymmC);
+ cc.vpunpcklqdq(ymmA, ymmB, ymmC);
+ cc.vpunpcklwd(ymmA, ymmB, ymmC);
+ cc.vpxor(ymmA, ymmB, ymmC);
+
+ // FMA.
+ cc.vfmadd132pd(xmmA, xmmB, xmmC);
+ cc.vfmadd132pd(ymmA, ymmB, ymmC);
+ cc.vfmadd132ps(xmmA, xmmB, xmmC);
+ cc.vfmadd132ps(ymmA, ymmB, ymmC);
+ cc.vfmadd132sd(xmmA, xmmB, xmmC);
+ cc.vfmadd132ss(xmmA, xmmB, xmmC);
+ cc.vfmadd213pd(xmmA, xmmB, xmmC);
+ cc.vfmadd213pd(ymmA, ymmB, ymmC);
+ cc.vfmadd213ps(xmmA, xmmB, xmmC);
+ cc.vfmadd213ps(ymmA, ymmB, ymmC);
+ cc.vfmadd213sd(xmmA, xmmB, xmmC);
+ cc.vfmadd213ss(xmmA, xmmB, xmmC);
+ cc.vfmadd231pd(xmmA, xmmB, xmmC);
+ cc.vfmadd231pd(ymmA, ymmB, ymmC);
+ cc.vfmadd231ps(xmmA, xmmB, xmmC);
+ cc.vfmadd231ps(ymmA, ymmB, ymmC);
+ cc.vfmadd231sd(xmmA, xmmB, xmmC);
+ cc.vfmadd231ss(xmmA, xmmB, xmmC);
+ cc.vfmaddsub132pd(xmmA, xmmB, xmmC);
+ cc.vfmaddsub132pd(ymmA, ymmB, ymmC);
+ cc.vfmaddsub132ps(xmmA, xmmB, xmmC);
+ cc.vfmaddsub132ps(ymmA, ymmB, ymmC);
+ cc.vfmaddsub213pd(xmmA, xmmB, xmmC);
+ cc.vfmaddsub213pd(ymmA, ymmB, ymmC);
+ cc.vfmaddsub213ps(xmmA, xmmB, xmmC);
+ cc.vfmaddsub213ps(ymmA, ymmB, ymmC);
+ cc.vfmaddsub231pd(xmmA, xmmB, xmmC);
+ cc.vfmaddsub231pd(ymmA, ymmB, ymmC);
+ cc.vfmaddsub231ps(xmmA, xmmB, xmmC);
+ cc.vfmaddsub231ps(ymmA, ymmB, ymmC);
+ cc.vfmsub132pd(xmmA, xmmB, xmmC);
+ cc.vfmsub132pd(ymmA, ymmB, ymmC);
+ cc.vfmsub132ps(xmmA, xmmB, xmmC);
+ cc.vfmsub132ps(ymmA, ymmB, ymmC);
+ cc.vfmsub132sd(xmmA, xmmB, xmmC);
+ cc.vfmsub132ss(xmmA, xmmB, xmmC);
+ cc.vfmsub213pd(xmmA, xmmB, xmmC);
+ cc.vfmsub213pd(ymmA, ymmB, ymmC);
+ cc.vfmsub213ps(xmmA, xmmB, xmmC);
+ cc.vfmsub213ps(ymmA, ymmB, ymmC);
+ cc.vfmsub213sd(xmmA, xmmB, xmmC);
+ cc.vfmsub213ss(xmmA, xmmB, xmmC);
+ cc.vfmsub231pd(xmmA, xmmB, xmmC);
+ cc.vfmsub231pd(ymmA, ymmB, ymmC);
+ cc.vfmsub231ps(xmmA, xmmB, xmmC);
+ cc.vfmsub231ps(ymmA, ymmB, ymmC);
+ cc.vfmsub231sd(xmmA, xmmB, xmmC);
+ cc.vfmsub231ss(xmmA, xmmB, xmmC);
+ cc.vfmsubadd132pd(xmmA, xmmB, xmmC);
+ cc.vfmsubadd132pd(ymmA, ymmB, ymmC);
+ cc.vfmsubadd132ps(xmmA, xmmB, xmmC);
+ cc.vfmsubadd132ps(ymmA, ymmB, ymmC);
+ cc.vfmsubadd213pd(xmmA, xmmB, xmmC);
+ cc.vfmsubadd213pd(ymmA, ymmB, ymmC);
+ cc.vfmsubadd213ps(xmmA, xmmB, xmmC);
+ cc.vfmsubadd213ps(ymmA, ymmB, ymmC);
+ cc.vfmsubadd231pd(xmmA, xmmB, xmmC);
+ cc.vfmsubadd231pd(ymmA, ymmB, ymmC);
+ cc.vfmsubadd231ps(xmmA, xmmB, xmmC);
+ cc.vfmsubadd231ps(ymmA, ymmB, ymmC);
+ cc.vfnmadd132pd(xmmA, xmmB, xmmC);
+ cc.vfnmadd132pd(ymmA, ymmB, ymmC);
+ cc.vfnmadd132ps(xmmA, xmmB, xmmC);
+ cc.vfnmadd132ps(ymmA, ymmB, ymmC);
+ cc.vfnmadd132sd(xmmA, xmmB, xmmC);
+ cc.vfnmadd132ss(xmmA, xmmB, xmmC);
+ cc.vfnmadd213pd(xmmA, xmmB, xmmC);
+ cc.vfnmadd213pd(ymmA, ymmB, ymmC);
+ cc.vfnmadd213ps(xmmA, xmmB, xmmC);
+ cc.vfnmadd213ps(ymmA, ymmB, ymmC);
+ cc.vfnmadd213sd(xmmA, xmmB, xmmC);
+ cc.vfnmadd213ss(xmmA, xmmB, xmmC);
+ cc.vfnmadd231pd(xmmA, xmmB, xmmC);
+ cc.vfnmadd231pd(ymmA, ymmB, ymmC);
+ cc.vfnmadd231ps(xmmA, xmmB, xmmC);
+ cc.vfnmadd231ps(ymmA, ymmB, ymmC);
+ cc.vfnmadd231sd(xmmA, xmmB, xmmC);
+ cc.vfnmadd231ss(xmmA, xmmB, xmmC);
+ cc.vfnmsub132pd(xmmA, xmmB, xmmC);
+ cc.vfnmsub132pd(ymmA, ymmB, ymmC);
+ cc.vfnmsub132ps(xmmA, xmmB, xmmC);
+ cc.vfnmsub132ps(ymmA, ymmB, ymmC);
+ cc.vfnmsub132sd(xmmA, xmmB, xmmC);
+ cc.vfnmsub132ss(xmmA, xmmB, xmmC);
+ cc.vfnmsub213pd(xmmA, xmmB, xmmC);
+ cc.vfnmsub213pd(ymmA, ymmB, ymmC);
+ cc.vfnmsub213ps(xmmA, xmmB, xmmC);
+ cc.vfnmsub213ps(ymmA, ymmB, ymmC);
+ cc.vfnmsub213sd(xmmA, xmmB, xmmC);
+ cc.vfnmsub213ss(xmmA, xmmB, xmmC);
+ cc.vfnmsub231pd(xmmA, xmmB, xmmC);
+ cc.vfnmsub231pd(ymmA, ymmB, ymmC);
+ cc.vfnmsub231ps(xmmA, xmmB, xmmC);
+ cc.vfnmsub231ps(ymmA, ymmB, ymmC);
+ cc.vfnmsub231sd(xmmA, xmmB, xmmC);
+ cc.vfnmsub231ss(xmmA, xmmB, xmmC);
+ }
+ else {
+ x86::Mem m = x86::ptr(gpz);
+ x86::Mem m128 = x86::xmmword_ptr(gpz);
+ x86::Mem m256 = x86::xmmword_ptr(gpz);
+ x86::Mem vx_ptr = x86::ptr(gpz, xmmD);
+ x86::Mem vy_ptr = x86::ptr(gpz, ymmD);
+
+ cc.vaddpd(xmmA, xmmB, m);
+ cc.vaddpd(ymmA, ymmB, m);
+ cc.vaddps(xmmA, xmmB, m);
+ cc.vaddps(ymmA, ymmB, m);
+ cc.vaddsd(xmmA, xmmB, m);
+ cc.vaddss(xmmA, xmmB, m);
+ cc.vaddsubpd(xmmA, xmmB, m);
+ cc.vaddsubpd(ymmA, ymmB, m);
+ cc.vaddsubps(xmmA, xmmB, m);
+ cc.vaddsubps(ymmA, ymmB, m);
+ cc.vandpd(xmmA, xmmB, m);
+ cc.vandpd(ymmA, ymmB, m);
+ cc.vandps(xmmA, xmmB, m);
+ cc.vandps(ymmA, ymmB, m);
+ cc.vandnpd(xmmA, xmmB, m);
+ cc.vandnpd(ymmA, ymmB, m);
+ cc.vandnps(xmmA, xmmB, m);
+ cc.vandnps(ymmA, ymmB, m);
+ cc.vblendpd(xmmA, xmmB, m, 0);
+ cc.vblendpd(ymmA, ymmB, m, 0);
+ cc.vblendps(xmmA, xmmB, m, 0);
+ cc.vblendps(ymmA, ymmB, m, 0);
+ cc.vblendvpd(xmmA, xmmB, m, xmmA);
+ cc.vblendvpd(ymmA, ymmB, m, ymmA);
+ cc.vbroadcastf128(ymmA, m);
+ cc.vbroadcastsd(ymmA, m);
+ cc.vbroadcastss(xmmA, m);
+ cc.vbroadcastss(ymmA, m);
+ cc.vcmppd(xmmA, xmmB, m, 0);
+ cc.vcmppd(ymmA, ymmB, m, 0);
+ cc.vcmpps(xmmA, xmmB, m, 0);
+ cc.vcmpps(ymmA, ymmB, m, 0);
+ cc.vcmpsd(xmmA, xmmB, m, 0);
+ cc.vcmpss(xmmA, xmmB, m, 0);
+ cc.vcomisd(xmmA, m);
+ cc.vcomiss(xmmA, m);
+ cc.vcvtdq2pd(xmmA, m);
+ cc.vcvtdq2pd(ymmA, m);
+ cc.vcvtdq2ps(xmmA, m);
+ cc.vcvtdq2ps(ymmA, m);
+ cc.vcvtpd2dq(xmmA, m128);
+ cc.vcvtpd2dq(xmmA, m256);
+ cc.vcvtpd2ps(xmmA, m128);
+ cc.vcvtpd2ps(xmmA, m256);
+ cc.vcvtps2dq(xmmA, m);
+ cc.vcvtps2dq(ymmA, m);
+ cc.vcvtps2pd(xmmA, m);
+ cc.vcvtps2pd(ymmA, m);
+ cc.vcvtsd2si(gpd, m);
+ cc.vcvtsd2ss(xmmA, xmmB, m);
+ cc.vcvtsi2sd(xmmA, xmmB, m);
+ cc.vcvtsi2ss(xmmA, xmmB, m);
+ cc.vcvtss2sd(xmmA, xmmB, m);
+ cc.vcvtss2si(gpd, m);
+ cc.vcvttpd2dq(xmmA, m128);
+ cc.vcvttpd2dq(xmmA, m256);
+ cc.vcvttps2dq(xmmA, m);
+ cc.vcvttps2dq(ymmA, m);
+ cc.vcvttsd2si(gpd, m);
+ cc.vcvttss2si(gpd, m);
+ cc.vdivpd(xmmA, xmmB, m);
+ cc.vdivpd(ymmA, ymmB, m);
+ cc.vdivps(xmmA, xmmB, m);
+ cc.vdivps(ymmA, ymmB, m);
+ cc.vdivsd(xmmA, xmmB, m);
+ cc.vdivss(xmmA, xmmB, m);
+ cc.vdppd(xmmA, xmmB, m, 0);
+ cc.vdpps(xmmA, xmmB, m, 0);
+ cc.vdpps(ymmA, ymmB, m, 0);
+ cc.vextractf128(m, ymmB, 0);
+ cc.vextractps(m, xmmB, 0);
+ cc.vhaddpd(xmmA, xmmB, m);
+ cc.vhaddpd(ymmA, ymmB, m);
+ cc.vhaddps(xmmA, xmmB, m);
+ cc.vhaddps(ymmA, ymmB, m);
+ cc.vhsubpd(xmmA, xmmB, m);
+ cc.vhsubpd(ymmA, ymmB, m);
+ cc.vhsubps(xmmA, xmmB, m);
+ cc.vhsubps(ymmA, ymmB, m);
+ cc.vinsertf128(ymmA, ymmB, m, 0);
+ cc.vinsertps(xmmA, xmmB, m, 0);
+ cc.vlddqu(xmmA, m);
+ cc.vlddqu(ymmA, m);
+ cc.vmaskmovps(xmmA, xmmB, m);
+ cc.vmaskmovps(ymmA, ymmB, m);
+ cc.vmaskmovps(m, xmmB, xmmC);
+ cc.vmaskmovps(m, ymmB, ymmC);
+ cc.vmaskmovpd(xmmA, xmmB, m);
+ cc.vmaskmovpd(ymmA, ymmB, m);
+ cc.vmaskmovpd(m, xmmB, xmmC);
+ cc.vmaskmovpd(m, ymmB, ymmC);
+ cc.vmaxpd(xmmA, xmmB, m);
+ cc.vmaxpd(ymmA, ymmB, m);
+ cc.vmaxps(xmmA, xmmB, m);
+ cc.vmaxps(ymmA, ymmB, m);
+ cc.vmaxsd(xmmA, xmmB, m);
+ cc.vmaxss(xmmA, xmmB, m);
+ cc.vminpd(xmmA, xmmB, m);
+ cc.vminpd(ymmA, ymmB, m);
+ cc.vminps(xmmA, xmmB, m);
+ cc.vminps(ymmA, ymmB, m);
+ cc.vminsd(xmmA, xmmB, m);
+ cc.vminss(xmmA, xmmB, m);
+ cc.vmovapd(xmmA, m);
+ cc.vmovapd(m, xmmB);
+ cc.vmovapd(ymmA, m);
+ cc.vmovapd(m, ymmB);
+ cc.vmovaps(xmmA, m);
+ cc.vmovaps(m, xmmB);
+ cc.vmovaps(ymmA, m);
+ cc.vmovaps(m, ymmB);
+ cc.vmovd(xmmA, m);
+ cc.vmovd(m, xmmB);
+ cc.vmovddup(xmmA, m);
+ cc.vmovddup(ymmA, m);
+ cc.vmovdqa(xmmA, m);
+ cc.vmovdqa(m, xmmB);
+ cc.vmovdqa(ymmA, m);
+ cc.vmovdqa(m, ymmB);
+ cc.vmovdqu(xmmA, m);
+ cc.vmovdqu(m, xmmB);
+ cc.vmovdqu(ymmA, m);
+ cc.vmovdqu(m, ymmB);
+ cc.vmovhpd(xmmA, xmmB, m);
+ cc.vmovhps(xmmA, xmmB, m);
+ cc.vmovhps(m, xmmB);
+ cc.vmovlpd(xmmA, xmmB, m);
+ cc.vmovlpd(m, xmmB);
+ cc.vmovlps(xmmA, xmmB, m);
+ cc.vmovlps(m, xmmB);
+ cc.vmovntdq(m, xmmB);
+ cc.vmovntdq(m, ymmB);
+ cc.vmovntdqa(xmmA, m);
+ cc.vmovntpd(m, xmmB);
+ cc.vmovntpd(m, ymmB);
+ cc.vmovntps(m, xmmB);
+ cc.vmovntps(m, ymmB);
+ cc.vmovsd(xmmA, m);
+ cc.vmovsd(m, xmmB);
+ cc.vmovshdup(xmmA, m);
+ cc.vmovshdup(ymmA, m);
+ cc.vmovsldup(xmmA, m);
+ cc.vmovsldup(ymmA, m);
+ cc.vmovss(xmmA, m);
+ cc.vmovss(m, xmmB);
+ cc.vmovupd(xmmA, m);
+ cc.vmovupd(m, xmmB);
+ cc.vmovupd(ymmA, m);
+ cc.vmovupd(m, ymmB);
+ cc.vmovups(xmmA, m);
+ cc.vmovups(m, xmmB);
+ cc.vmovups(ymmA, m);
+ cc.vmovups(m, ymmB);
+ cc.vmpsadbw(xmmA, xmmB, m, 0);
+ cc.vmulpd(xmmA, xmmB, m);
+ cc.vmulpd(ymmA, ymmB, m);
+ cc.vmulps(xmmA, xmmB, m);
+ cc.vmulps(ymmA, ymmB, m);
+ cc.vmulsd(xmmA, xmmB, m);
+ cc.vmulss(xmmA, xmmB, m);
+ cc.vorpd(xmmA, xmmB, m);
+ cc.vorpd(ymmA, ymmB, m);
+ cc.vorps(xmmA, xmmB, m);
+ cc.vorps(ymmA, ymmB, m);
+ cc.vpabsb(xmmA, m);
+ cc.vpabsd(xmmA, m);
+ cc.vpabsw(xmmA, m);
+ cc.vpackssdw(xmmA, xmmB, m);
+ cc.vpacksswb(xmmA, xmmB, m);
+ cc.vpackusdw(xmmA, xmmB, m);
+ cc.vpackuswb(xmmA, xmmB, m);
+ cc.vpaddb(xmmA, xmmB, m);
+ cc.vpaddd(xmmA, xmmB, m);
+ cc.vpaddq(xmmA, xmmB, m);
+ cc.vpaddw(xmmA, xmmB, m);
+ cc.vpaddsb(xmmA, xmmB, m);
+ cc.vpaddsw(xmmA, xmmB, m);
+ cc.vpaddusb(xmmA, xmmB, m);
+ cc.vpaddusw(xmmA, xmmB, m);
+ cc.vpalignr(xmmA, xmmB, m, 0);
+ cc.vpand(xmmA, xmmB, m);
+ cc.vpandn(xmmA, xmmB, m);
+ cc.vpavgb(xmmA, xmmB, m);
+ cc.vpavgw(xmmA, xmmB, m);
+ cc.vpblendvb(xmmA, xmmB, m, xmmA);
+ cc.vpblendw(xmmA, xmmB, m, 0);
+ cc.vpcmpeqb(xmmA, xmmB, m);
+ cc.vpcmpeqd(xmmA, xmmB, m);
+ cc.vpcmpeqq(xmmA, xmmB, m);
+ cc.vpcmpeqw(xmmA, xmmB, m);
+ cc.vpcmpgtb(xmmA, xmmB, m);
+ cc.vpcmpgtd(xmmA, xmmB, m);
+ cc.vpcmpgtq(xmmA, xmmB, m);
+ cc.vpcmpgtw(xmmA, xmmB, m);
+ cc.vpermilpd(xmmA, xmmB, m);
+ cc.vpermilpd(ymmA, ymmB, m);
+ cc.vpermilpd(xmmA, m, 0);
+ cc.vpermilpd(ymmA, m, 0);
+ cc.vpermilps(xmmA, xmmB, m);
+ cc.vpermilps(ymmA, ymmB, m);
+ cc.vpermilps(xmmA, m, 0);
+ cc.vpermilps(ymmA, m, 0);
+ cc.vperm2f128(ymmA, ymmB, m, 0);
+ cc.vpextrb(m, xmmB, 0);
+ cc.vpextrd(m, xmmB, 0);
+ if (cc.is64Bit()) cc.vpextrq(m, xmmB, 0);
+ cc.vpextrw(m, xmmB, 0);
+ cc.vphaddd(xmmA, xmmB, m);
+ cc.vphaddsw(xmmA, xmmB, m);
+ cc.vphaddw(xmmA, xmmB, m);
+ cc.vphminposuw(xmmA, m);
+ cc.vphsubd(xmmA, xmmB, m);
+ cc.vphsubsw(xmmA, xmmB, m);
+ cc.vphsubw(xmmA, xmmB, m);
+ cc.vpinsrb(xmmA, xmmB, m, 0);
+ cc.vpinsrd(xmmA, xmmB, m, 0);
+ cc.vpinsrw(xmmA, xmmB, m, 0);
+ cc.vpmaddubsw(xmmA, xmmB, m);
+ cc.vpmaddwd(xmmA, xmmB, m);
+ cc.vpmaxsb(xmmA, xmmB, m);
+ cc.vpmaxsd(xmmA, xmmB, m);
+ cc.vpmaxsw(xmmA, xmmB, m);
+ cc.vpmaxub(xmmA, xmmB, m);
+ cc.vpmaxud(xmmA, xmmB, m);
+ cc.vpmaxuw(xmmA, xmmB, m);
+ cc.vpminsb(xmmA, xmmB, m);
+ cc.vpminsd(xmmA, xmmB, m);
+ cc.vpminsw(xmmA, xmmB, m);
+ cc.vpminub(xmmA, xmmB, m);
+ cc.vpminud(xmmA, xmmB, m);
+ cc.vpminuw(xmmA, xmmB, m);
+ cc.vpmovsxbd(xmmA, m);
+ cc.vpmovsxbq(xmmA, m);
+ cc.vpmovsxbw(xmmA, m);
+ cc.vpmovsxdq(xmmA, m);
+ cc.vpmovsxwd(xmmA, m);
+ cc.vpmovsxwq(xmmA, m);
+ cc.vpmovzxbd(xmmA, m);
+ cc.vpmovzxbq(xmmA, m);
+ cc.vpmovzxbw(xmmA, m);
+ cc.vpmovzxdq(xmmA, m);
+ cc.vpmovzxwd(xmmA, m);
+ cc.vpmovzxwq(xmmA, m);
+ cc.vpmuldq(xmmA, xmmB, m);
+ cc.vpmulhrsw(xmmA, xmmB, m);
+ cc.vpmulhuw(xmmA, xmmB, m);
+ cc.vpmulhw(xmmA, xmmB, m);
+ cc.vpmulld(xmmA, xmmB, m);
+ cc.vpmullw(xmmA, xmmB, m);
+ cc.vpmuludq(xmmA, xmmB, m);
+ cc.vpor(xmmA, xmmB, m);
+ cc.vpsadbw(xmmA, xmmB, m);
+ cc.vpshufb(xmmA, xmmB, m);
+ cc.vpshufd(xmmA, m, 0);
+ cc.vpshufhw(xmmA, m, 0);
+ cc.vpshuflw(xmmA, m, 0);
+ cc.vpsignb(xmmA, xmmB, m);
+ cc.vpsignd(xmmA, xmmB, m);
+ cc.vpsignw(xmmA, xmmB, m);
+ cc.vpslld(xmmA, xmmB, m);
+ cc.vpsllq(xmmA, xmmB, m);
+ cc.vpsllw(xmmA, xmmB, m);
+ cc.vpsrad(xmmA, xmmB, m);
+ cc.vpsraw(xmmA, xmmB, m);
+ cc.vpsrld(xmmA, xmmB, m);
+ cc.vpsrlq(xmmA, xmmB, m);
+ cc.vpsrlw(xmmA, xmmB, m);
+ cc.vpsubb(xmmA, xmmB, m);
+ cc.vpsubd(xmmA, xmmB, m);
+ cc.vpsubq(xmmA, xmmB, m);
+ cc.vpsubw(xmmA, xmmB, m);
+ cc.vpsubsb(xmmA, xmmB, m);
+ cc.vpsubsw(xmmA, xmmB, m);
+ cc.vpsubusb(xmmA, xmmB, m);
+ cc.vpsubusw(xmmA, xmmB, m);
+ cc.vptest(xmmA, m);
+ cc.vptest(ymmA, m);
+ cc.vpunpckhbw(xmmA, xmmB, m);
+ cc.vpunpckhdq(xmmA, xmmB, m);
+ cc.vpunpckhqdq(xmmA, xmmB, m);
+ cc.vpunpckhwd(xmmA, xmmB, m);
+ cc.vpunpcklbw(xmmA, xmmB, m);
+ cc.vpunpckldq(xmmA, xmmB, m);
+ cc.vpunpcklqdq(xmmA, xmmB, m);
+ cc.vpunpcklwd(xmmA, xmmB, m);
+ cc.vpxor(xmmA, xmmB, m);
+ cc.vrcpps(xmmA, m);
+ cc.vrcpps(ymmA, m);
+ cc.vrcpss(xmmA, xmmB, m);
+ cc.vrsqrtps(xmmA, m);
+ cc.vrsqrtps(ymmA, m);
+ cc.vrsqrtss(xmmA, xmmB, m);
+ cc.vroundpd(xmmA, m, 0);
+ cc.vroundpd(ymmA, m, 0);
+ cc.vroundps(xmmA, m, 0);
+ cc.vroundps(ymmA, m, 0);
+ cc.vroundsd(xmmA, xmmB, m, 0);
+ cc.vroundss(xmmA, xmmB, m, 0);
+ cc.vshufpd(xmmA, xmmB, m, 0);
+ cc.vshufpd(ymmA, ymmB, m, 0);
+ cc.vshufps(xmmA, xmmB, m, 0);
+ cc.vshufps(ymmA, ymmB, m, 0);
+ cc.vsqrtpd(xmmA, m);
+ cc.vsqrtpd(ymmA, m);
+ cc.vsqrtps(xmmA, m);
+ cc.vsqrtps(ymmA, m);
+ cc.vsqrtsd(xmmA, xmmB, m);
+ cc.vsqrtss(xmmA, xmmB, m);
+ cc.vsubpd(xmmA, xmmB, m);
+ cc.vsubpd(ymmA, ymmB, m);
+ cc.vsubps(xmmA, xmmB, m);
+ cc.vsubps(ymmA, ymmB, m);
+ cc.vsubsd(xmmA, xmmB, m);
+ cc.vsubss(xmmA, xmmB, m);
+ cc.vtestps(xmmA, m);
+ cc.vtestps(ymmA, m);
+ cc.vtestpd(xmmA, m);
+ cc.vtestpd(ymmA, m);
+ cc.vucomisd(xmmA, m);
+ cc.vucomiss(xmmA, m);
+ cc.vunpckhpd(xmmA, xmmB, m);
+ cc.vunpckhpd(ymmA, ymmB, m);
+ cc.vunpckhps(xmmA, xmmB, m);
+ cc.vunpckhps(ymmA, ymmB, m);
+ cc.vunpcklpd(xmmA, xmmB, m);
+ cc.vunpcklpd(ymmA, ymmB, m);
+ cc.vunpcklps(xmmA, xmmB, m);
+ cc.vunpcklps(ymmA, ymmB, m);
+ cc.vxorpd(xmmA, xmmB, m);
+ cc.vxorpd(ymmA, ymmB, m);
+ cc.vxorps(xmmA, xmmB, m);
+ cc.vxorps(ymmA, ymmB, m);
+
+ // AVX+AESNI.
+ cc.vaesdec(xmmA, xmmB, m);
+ cc.vaesdeclast(xmmA, xmmB, m);
+ cc.vaesenc(xmmA, xmmB, m);
+ cc.vaesenclast(xmmA, xmmB, m);
+ cc.vaesimc(xmmA, m);
+ cc.vaeskeygenassist(xmmA, m, 0);
+
+ // AVX+PCLMULQDQ.
+ cc.vpclmulqdq(xmmA, xmmB, m, 0);
+
+ // AVX2.
+ cc.vbroadcasti128(ymmA, m);
+ cc.vextracti128(m, ymmB, 0);
+ cc.vgatherdpd(xmmA, vx_ptr, xmmC);
+ cc.vgatherdpd(ymmA, vx_ptr, ymmC);
+ cc.vgatherdps(xmmA, vx_ptr, xmmC);
+ cc.vgatherdps(ymmA, vy_ptr, ymmC);
+ cc.vgatherqpd(xmmA, vx_ptr, xmmC);
+ cc.vgatherqpd(ymmA, vy_ptr, ymmC);
+ cc.vgatherqps(xmmA, vx_ptr, xmmC);
+ cc.vgatherqps(xmmA, vy_ptr, xmmC);
+ cc.vinserti128(ymmA, ymmB, m, 0);
+ cc.vmovntdqa(ymmA, m);
+ cc.vmpsadbw(ymmA, ymmB, m, 0);
+ cc.vpabsb(ymmA, m);
+ cc.vpabsd(ymmA, m);
+ cc.vpabsw(ymmA, m);
+ cc.vpackssdw(ymmA, ymmB, m);
+ cc.vpacksswb(ymmA, ymmB, m);
+ cc.vpackusdw(ymmA, ymmB, m);
+ cc.vpackuswb(ymmA, ymmB, m);
+ cc.vpaddb(ymmA, ymmB, m);
+ cc.vpaddd(ymmA, ymmB, m);
+ cc.vpaddq(ymmA, ymmB, m);
+ cc.vpaddw(ymmA, ymmB, m);
+ cc.vpaddsb(ymmA, ymmB, m);
+ cc.vpaddsw(ymmA, ymmB, m);
+ cc.vpaddusb(ymmA, ymmB, m);
+ cc.vpaddusw(ymmA, ymmB, m);
+ cc.vpalignr(ymmA, ymmB, m, 0);
+ cc.vpand(ymmA, ymmB, m);
+ cc.vpandn(ymmA, ymmB, m);
+ cc.vpavgb(ymmA, ymmB, m);
+ cc.vpavgw(ymmA, ymmB, m);
+ cc.vpblendd(xmmA, xmmB, m, 0);
+ cc.vpblendd(ymmA, ymmB, m, 0);
+ cc.vpblendvb(ymmA, ymmB, m, ymmA);
+ cc.vpblendw(ymmA, ymmB, m, 0);
+ cc.vpbroadcastb(xmmA, m);
+ cc.vpbroadcastb(ymmA, m);
+ cc.vpbroadcastd(xmmA, m);
+ cc.vpbroadcastd(ymmA, m);
+ cc.vpbroadcastq(xmmA, m);
+ cc.vpbroadcastq(ymmA, m);
+ cc.vpbroadcastw(xmmA, m);
+ cc.vpbroadcastw(ymmA, m);
+ cc.vpcmpeqb(ymmA, ymmB, m);
+ cc.vpcmpeqd(ymmA, ymmB, m);
+ cc.vpcmpeqq(ymmA, ymmB, m);
+ cc.vpcmpeqw(ymmA, ymmB, m);
+ cc.vpcmpgtb(ymmA, ymmB, m);
+ cc.vpcmpgtd(ymmA, ymmB, m);
+ cc.vpcmpgtq(ymmA, ymmB, m);
+ cc.vpcmpgtw(ymmA, ymmB, m);
+ cc.vperm2i128(ymmA, ymmB, m, 0);
+ cc.vpermd(ymmA, ymmB, m);
+ cc.vpermps(ymmA, ymmB, m);
+ cc.vpermpd(ymmA, m, 0);
+ cc.vpermq(ymmA, m, 0);
+ cc.vpgatherdd(xmmA, vx_ptr, xmmC);
+ cc.vpgatherdd(ymmA, vy_ptr, ymmC);
+ cc.vpgatherdq(xmmA, vx_ptr, xmmC);
+ cc.vpgatherdq(ymmA, vx_ptr, ymmC);
+ cc.vpgatherqd(xmmA, vx_ptr, xmmC);
+ cc.vpgatherqd(xmmA, vy_ptr, xmmC);
+ cc.vpgatherqq(xmmA, vx_ptr, xmmC);
+ cc.vpgatherqq(ymmA, vy_ptr, ymmC);
+ cc.vpmovsxbd(ymmA, m);
+ cc.vpmovsxbq(ymmA, m);
+ cc.vpmovsxbw(ymmA, m);
+ cc.vpmovsxdq(ymmA, m);
+ cc.vpmovsxwd(ymmA, m);
+ cc.vpmovsxwq(ymmA, m);
+ cc.vpmovzxbd(ymmA, m);
+ cc.vpmovzxbq(ymmA, m);
+ cc.vpmovzxbw(ymmA, m);
+ cc.vpmovzxdq(ymmA, m);
+ cc.vpmovzxwd(ymmA, m);
+ cc.vpmovzxwq(ymmA, m);
+ cc.vpshufd(ymmA, m, 0);
+ cc.vpshufhw(ymmA, m, 0);
+ cc.vpshuflw(ymmA, m, 0);
+ cc.vphaddd(ymmA, ymmB, m);
+ cc.vphaddsw(ymmA, ymmB, m);
+ cc.vphaddw(ymmA, ymmB, m);
+ cc.vphsubd(ymmA, ymmB, m);
+ cc.vphsubsw(ymmA, ymmB, m);
+ cc.vphsubw(ymmA, ymmB, m);
+ cc.vpmaddubsw(ymmA, ymmB, m);
+ cc.vpmaddwd(ymmA, ymmB, m);
+ cc.vpmaskmovd(m, xmmB, xmmC);
+ cc.vpmaskmovd(m, ymmB, ymmC);
+ cc.vpmaskmovd(xmmA, xmmB, m);
+ cc.vpmaskmovd(ymmA, ymmB, m);
+ cc.vpmaskmovq(m, xmmB, xmmC);
+ cc.vpmaskmovq(m, ymmB, ymmC);
+ cc.vpmaskmovq(xmmA, xmmB, m);
+ cc.vpmaskmovq(ymmA, ymmB, m);
+ cc.vpmaxsb(ymmA, ymmB, m);
+ cc.vpmaxsd(ymmA, ymmB, m);
+ cc.vpmaxsw(ymmA, ymmB, m);
+ cc.vpmaxub(ymmA, ymmB, m);
+ cc.vpmaxud(ymmA, ymmB, m);
+ cc.vpmaxuw(ymmA, ymmB, m);
+ cc.vpminsb(ymmA, ymmB, m);
+ cc.vpminsd(ymmA, ymmB, m);
+ cc.vpminsw(ymmA, ymmB, m);
+ cc.vpminub(ymmA, ymmB, m);
+ cc.vpminud(ymmA, ymmB, m);
+ cc.vpminuw(ymmA, ymmB, m);
+ cc.vpmuldq(ymmA, ymmB, m);
+ cc.vpmulhrsw(ymmA, ymmB, m);
+ cc.vpmulhuw(ymmA, ymmB, m);
+ cc.vpmulhw(ymmA, ymmB, m);
+ cc.vpmulld(ymmA, ymmB, m);
+ cc.vpmullw(ymmA, ymmB, m);
+ cc.vpmuludq(ymmA, ymmB, m);
+ cc.vpor(ymmA, ymmB, m);
+ cc.vpsadbw(ymmA, ymmB, m);
+ cc.vpshufb(ymmA, ymmB, m);
+ cc.vpsignb(ymmA, ymmB, m);
+ cc.vpsignd(ymmA, ymmB, m);
+ cc.vpsignw(ymmA, ymmB, m);
+ cc.vpslld(ymmA, ymmB, m);
+ cc.vpsllq(ymmA, ymmB, m);
+ cc.vpsllvd(xmmA, xmmB, m);
+ cc.vpsllvd(ymmA, ymmB, m);
+ cc.vpsllvq(xmmA, xmmB, m);
+ cc.vpsllvq(ymmA, ymmB, m);
+ cc.vpsllw(ymmA, ymmB, m);
+ cc.vpsrad(ymmA, ymmB, m);
+ cc.vpsravd(xmmA, xmmB, m);
+ cc.vpsravd(ymmA, ymmB, m);
+ cc.vpsraw(ymmA, ymmB, m);
+ cc.vpsrld(ymmA, ymmB, m);
+ cc.vpsrlq(ymmA, ymmB, m);
+ cc.vpsrlvd(xmmA, xmmB, m);
+ cc.vpsrlvd(ymmA, ymmB, m);
+ cc.vpsrlvq(xmmA, xmmB, m);
+ cc.vpsrlvq(ymmA, ymmB, m);
+ cc.vpsrlw(ymmA, ymmB, m);
+ cc.vpsubb(ymmA, ymmB, m);
+ cc.vpsubd(ymmA, ymmB, m);
+ cc.vpsubq(ymmA, ymmB, m);
+ cc.vpsubsb(ymmA, ymmB, m);
+ cc.vpsubsw(ymmA, ymmB, m);
+ cc.vpsubusb(ymmA, ymmB, m);
+ cc.vpsubusw(ymmA, ymmB, m);
+ cc.vpsubw(ymmA, ymmB, m);
+ cc.vpunpckhbw(ymmA, ymmB, m);
+ cc.vpunpckhdq(ymmA, ymmB, m);
+ cc.vpunpckhqdq(ymmA, ymmB, m);
+ cc.vpunpckhwd(ymmA, ymmB, m);
+ cc.vpunpcklbw(ymmA, ymmB, m);
+ cc.vpunpckldq(ymmA, ymmB, m);
+ cc.vpunpcklqdq(ymmA, ymmB, m);
+ cc.vpunpcklwd(ymmA, ymmB, m);
+ cc.vpxor(ymmA, ymmB, m);
+ }
+}
+
+static void generateAvxSequence(BaseEmitter& emitter, InstForm form, bool emitPrologEpilog) {
+ using namespace asmjit::x86;
+
+ if (emitter.isAssembler()) {
+ Assembler& cc = *emitter.as<Assembler>();
+
+ if (emitPrologEpilog) {
+ FuncDetail func;
+ func.init(FuncSignatureT<void, void*, const void*, size_t>(CallConvId::kHost), cc.environment());
+
+ FuncFrame frame;
+ frame.init(func);
+ frame.addDirtyRegs(eax, ymm0, ymm1, ymm2, ymm3);
+ frame.finalize();
+
+ cc.emitProlog(frame);
+ generateAvxSequenceInternal(cc, form, eax, ymm0, ymm1, ymm2, ymm3);
+ cc.emitEpilog(frame);
+ }
+ else {
+ generateAvxSequenceInternal(cc, form, eax, ymm0, ymm1, ymm2, ymm3);
+ }
+ }
+#ifndef ASMJIT_NO_BUILDER
+ else if (emitter.isBuilder()) {
+ Builder& cc = *emitter.as<Builder>();
+
+ if (emitPrologEpilog) {
+ FuncDetail func;
+ func.init(FuncSignatureT<void, void*, const void*, size_t>(CallConvId::kHost), cc.environment());
+
+ FuncFrame frame;
+ frame.init(func);
+ frame.addDirtyRegs(eax, ymm0, ymm1, ymm2, ymm3);
+ frame.finalize();
+
+ cc.emitProlog(frame);
+ generateAvxSequenceInternal(cc, form, eax, ymm0, ymm1, ymm2, ymm3);
+ cc.emitEpilog(frame);
+ }
+ else {
+ generateAvxSequenceInternal(cc, form, eax, ymm0, ymm1, ymm2, ymm3);
+ }
+ }
+#endif
+#ifndef ASMJIT_NO_COMPILER
+ else if (emitter.isCompiler()) {
+ Compiler& cc = *emitter.as<Compiler>();
+
+ Gp gp = cc.newGpz("gp");
+ Ymm a = cc.newYmm("a");
+ Ymm b = cc.newYmm("b");
+ Ymm c = cc.newYmm("c");
+ Ymm d = cc.newYmm("d");
+
+ cc.addFunc(FuncSignatureT<void>(CallConvId::kHost));
+ generateAvxSequenceInternal(cc, form, gp, a, b, c, d);
+ cc.endFunc();
+ }
+#endif
+}
+
+// Generates a long sequence of AVX512 instructions.
+template<typename Emitter>
+static void generateAvx512SequenceInternal(
+ Emitter& cc,
+ InstForm form,
+ const x86::Gp& gp,
+ const x86::KReg& kA, const x86::KReg& kB, const x86::KReg& kC,
+ const x86::Vec& vecA, const x86::Vec& vecB, const x86::Vec& vecC, const x86::Vec& vecD) {
+
+ x86::Gp gpd = gp.r32();
+ x86::Gp gpq = gp.r64();
+ x86::Gp gpz = cc.is32Bit() ? gpd : gpq;
+
+ x86::Xmm xmmA = vecA.xmm();
+ x86::Xmm xmmB = vecB.xmm();
+ x86::Xmm xmmC = vecC.xmm();
+ x86::Xmm xmmD = vecD.xmm();
+
+ x86::Ymm ymmA = vecA.ymm();
+ x86::Ymm ymmB = vecB.ymm();
+ x86::Ymm ymmC = vecC.ymm();
+ x86::Ymm ymmD = vecD.ymm();
+
+ x86::Zmm zmmA = vecA.zmm();
+ x86::Zmm zmmB = vecB.zmm();
+ x86::Zmm zmmC = vecC.zmm();
+ x86::Zmm zmmD = vecD.zmm();
+
+ cc.xor_(gpd, gpd);
+ cc.vxorps(xmmA, xmmA, xmmA);
+ cc.vxorps(xmmB, xmmB, xmmB);
+ cc.vxorps(xmmC, xmmC, xmmC);
+ cc.vxorps(xmmD, xmmD, xmmD);
+
+ if (form == InstForm::kReg) {
+ cc.kaddb(kA, kB, kC);
+ cc.kaddd(kA, kB, kC);
+ cc.kaddq(kA, kB, kC);
+ cc.kaddw(kA, kB, kC);
+ cc.kandb(kA, kB, kC);
+ cc.kandd(kA, kB, kC);
+ cc.kandnb(kA, kB, kC);
+ cc.kandnd(kA, kB, kC);
+ cc.kandnq(kA, kB, kC);
+ cc.kandnw(kA, kB, kC);
+ cc.kandq(kA, kB, kC);
+ cc.kandw(kA, kB, kC);
+ cc.kmovb(kA, kB);
+ cc.kmovb(kA, gpd);
+ cc.kmovb(gpd, kB);
+ cc.kmovd(kA, kB);
+ cc.kmovd(kA, gpd);
+ cc.kmovd(gpd, kB);
+ cc.kmovq(kA, kB);
+ if (cc.is64Bit()) cc.kmovq(kA, gpq);
+ if (cc.is64Bit()) cc.kmovq(gpq, kB);
+ cc.kmovw(kA, kB);
+ cc.kmovw(kA, gpd);
+ cc.kmovw(gpd, kB);
+ cc.knotb(kA, kB);
+ cc.knotd(kA, kB);
+ cc.knotq(kA, kB);
+ cc.knotw(kA, kB);
+ cc.korb(kA, kB, kC);
+ cc.kord(kA, kB, kC);
+ cc.korq(kA, kB, kC);
+ cc.kortestb(kA, kB);
+ cc.kortestd(kA, kB);
+ cc.kortestq(kA, kB);
+ cc.kortestw(kA, kB);
+ cc.korw(kA, kB, kC);
+ cc.kshiftlb(kA, kB, 0);
+ cc.kshiftld(kA, kB, 0);
+ cc.kshiftlq(kA, kB, 0);
+ cc.kshiftlw(kA, kB, 0);
+ cc.kshiftrb(kA, kB, 0);
+ cc.kshiftrd(kA, kB, 0);
+ cc.kshiftrq(kA, kB, 0);
+ cc.kshiftrw(kA, kB, 0);
+ cc.ktestb(kA, kB);
+ cc.ktestd(kA, kB);
+ cc.ktestq(kA, kB);
+ cc.ktestw(kA, kB);
+ cc.kunpckbw(kA, kB, kC);
+ cc.kunpckdq(kA, kB, kC);
+ cc.kunpckwd(kA, kB, kC);
+ cc.kxnorb(kA, kB, kC);
+ cc.kxnord(kA, kB, kC);
+ cc.kxnorq(kA, kB, kC);
+ cc.kxnorw(kA, kB, kC);
+ cc.kxorb(kA, kB, kC);
+ cc.kxord(kA, kB, kC);
+ cc.kxorq(kA, kB, kC);
+ cc.kxorw(kA, kB, kC);
+ cc.nop();
+
+ cc.evex().vaddpd(xmmA, xmmB, xmmC);
+ cc.evex().vaddpd(ymmA, ymmB, ymmC);
+ cc.evex().vaddpd(zmmA, zmmB, zmmC);
+ cc.evex().vaddps(xmmA, xmmB, xmmC);
+ cc.evex().vaddps(ymmA, ymmB, ymmC);
+ cc.evex().vaddps(zmmA, zmmB, zmmC);
+ cc.evex().vaddsd(xmmA, xmmB, xmmC);
+ cc.evex().vaddss(xmmA, xmmB, xmmC);
+ cc.evex().valignd(xmmA, xmmB, xmmC, 0);
+ cc.evex().valignd(ymmA, ymmB, ymmC, 0);
+ cc.evex().valignd(zmmA, zmmB, zmmC, 0);
+ cc.evex().valignq(xmmA, xmmB, xmmC, 0);
+ cc.evex().valignq(ymmA, ymmB, ymmC, 0);
+ cc.evex().valignq(zmmA, zmmB, zmmC, 0);
+ cc.evex().vandnpd(xmmA, xmmB, xmmC);
+ cc.evex().vandnpd(ymmA, ymmB, ymmC);
+ cc.evex().vandnpd(zmmA, zmmB, zmmC);
+ cc.evex().vandnps(xmmA, xmmB, xmmC);
+ cc.evex().vandnps(ymmA, ymmB, ymmC);
+ cc.evex().vandnps(zmmA, zmmB, zmmC);
+ cc.evex().vandpd(xmmA, xmmB, xmmC);
+ cc.evex().vandpd(ymmA, ymmB, ymmC);
+ cc.evex().vandpd(zmmA, zmmB, zmmC);
+ cc.evex().vandps(xmmA, xmmB, xmmC);
+ cc.evex().vandps(ymmA, ymmB, ymmC);
+ cc.evex().vandps(zmmA, zmmB, zmmC);
+ cc.evex().vblendmpd(xmmA, xmmB, xmmC);
+ cc.evex().vblendmpd(ymmA, ymmB, ymmC);
+ cc.evex().vblendmpd(zmmA, zmmB, zmmC);
+ cc.evex().vblendmps(xmmA, xmmB, xmmC);
+ cc.evex().vblendmps(ymmA, ymmB, ymmC);
+ cc.evex().vblendmps(zmmA, zmmB, zmmC);
+ cc.evex().vbroadcastf32x2(ymmA, xmmB);
+ cc.evex().vbroadcastf32x2(zmmA, xmmB);
+ cc.evex().vbroadcasti32x2(xmmA, xmmB);
+ cc.evex().vbroadcasti32x2(ymmA, xmmB);
+ cc.evex().vbroadcasti32x2(zmmA, xmmB);
+ cc.evex().vbroadcastsd(ymmA, xmmB);
+ cc.evex().vbroadcastsd(zmmA, xmmB);
+ cc.evex().vbroadcastss(xmmA, xmmB);
+ cc.evex().vbroadcastss(ymmA, xmmB);
+ cc.evex().vbroadcastss(zmmA, xmmB);
+ cc.evex().vcmppd(kA, xmmB, xmmC, 0);
+ cc.evex().vcmppd(kA, ymmB, ymmC, 0);
+ cc.evex().vcmppd(kA, zmmB, zmmC, 0);
+ cc.evex().vcmpps(kA, xmmB, xmmC, 0);
+ cc.evex().vcmpps(kA, ymmB, ymmC, 0);
+ cc.evex().vcmpps(kA, zmmB, zmmC, 0);
+ cc.evex().vcmpsd(kA, xmmB, xmmC, 0);
+ cc.evex().vcmpss(kA, xmmB, xmmC, 0);
+ cc.evex().vcomisd(xmmA, xmmB);
+ cc.evex().vcomiss(xmmA, xmmB);
+ cc.evex().vcompresspd(xmmA, xmmB);
+ cc.evex().vcompresspd(ymmA, ymmB);
+ cc.evex().vcompresspd(zmmA, zmmB);
+ cc.evex().vcompressps(xmmA, xmmB);
+ cc.evex().vcompressps(ymmA, ymmB);
+ cc.evex().vcompressps(zmmA, zmmB);
+ cc.evex().vcvtdq2pd(xmmA, xmmB);
+ cc.evex().vcvtdq2pd(ymmA, xmmB);
+ cc.evex().vcvtdq2pd(zmmA, ymmB);
+ cc.evex().vcvtdq2ps(xmmA, xmmB);
+ cc.evex().vcvtdq2ps(ymmA, ymmB);
+ cc.evex().vcvtdq2ps(zmmA, zmmB);
+ cc.evex().vcvtpd2dq(xmmA, xmmB);
+ cc.evex().vcvtpd2dq(xmmA, ymmB);
+ cc.evex().vcvtpd2dq(ymmA, zmmB);
+ cc.evex().vcvtpd2qq(xmmA, xmmB);
+ cc.evex().vcvtpd2qq(ymmA, ymmB);
+ cc.evex().vcvtpd2qq(zmmA, zmmB);
+ cc.evex().vcvtpd2udq(xmmA, xmmB);
+ cc.evex().vcvtpd2udq(xmmA, ymmB);
+ cc.evex().vcvtpd2udq(ymmA, zmmB);
+ cc.evex().vcvtpd2uqq(xmmA, xmmB);
+ cc.evex().vcvtpd2uqq(ymmA, ymmB);
+ cc.evex().vcvtpd2uqq(zmmA, zmmB);
+ cc.evex().vcvtph2ps(xmmA, xmmB);
+ cc.evex().vcvtph2ps(ymmA, xmmB);
+ cc.evex().vcvtph2ps(zmmA, ymmB);
+ cc.evex().vcvtps2dq(xmmA, xmmB);
+ cc.evex().vcvtps2dq(ymmA, ymmB);
+ cc.evex().vcvtps2dq(zmmA, zmmB);
+ cc.evex().vcvtps2pd(xmmA, xmmB);
+ cc.evex().vcvtps2pd(ymmA, xmmB);
+ cc.evex().vcvtps2pd(zmmA, ymmB);
+ cc.evex().vcvtps2ph(xmmA, xmmB, 0);
+ cc.evex().vcvtps2ph(xmmA, ymmB, 0);
+ cc.evex().vcvtps2ph(ymmA, zmmB, 0);
+ cc.evex().vcvtps2qq(xmmA, xmmB);
+ cc.evex().vcvtps2qq(ymmA, xmmB);
+ cc.evex().vcvtps2qq(zmmA, ymmB);
+ cc.evex().vcvtps2udq(xmmA, xmmB);
+ cc.evex().vcvtps2udq(ymmA, ymmB);
+ cc.evex().vcvtps2udq(zmmA, zmmB);
+ cc.evex().vcvtps2uqq(xmmA, xmmB);
+ cc.evex().vcvtps2uqq(ymmA, xmmB);
+ cc.evex().vcvtps2uqq(zmmA, ymmB);
+ cc.evex().vcvtqq2pd(xmmA, xmmB);
+ cc.evex().vcvtqq2pd(ymmA, ymmB);
+ cc.evex().vcvtqq2pd(zmmA, zmmB);
+ cc.evex().vcvtqq2ps(xmmA, xmmB);
+ cc.evex().vcvtqq2ps(xmmA, ymmB);
+ cc.evex().vcvtqq2ps(ymmA, zmmB);
+ cc.evex().vcvtsd2si(gpd, xmmB);
+ if (cc.is64Bit()) cc.evex().vcvtsd2si(gpq, xmmB);
+ cc.evex().vcvtsd2ss(xmmA, xmmB, xmmC);
+ cc.evex().vcvtsd2usi(gpd, xmmB);
+ if (cc.is64Bit()) cc.evex().vcvtsd2usi(gpq, xmmB);
+ cc.evex().vcvtsi2sd(xmmA, xmmB, gpd);
+ if (cc.is64Bit()) cc.evex().vcvtsi2sd(xmmA, xmmB, gpq);
+ cc.evex().vcvtsi2ss(xmmA, xmmB, gpd);
+ if (cc.is64Bit()) cc.evex().vcvtsi2ss(xmmA, xmmB, gpq);
+ cc.evex().vcvtss2sd(xmmA, xmmB, xmmC);
+ cc.evex().vcvtss2si(gpd, xmmB);
+ if (cc.is64Bit()) cc.evex().vcvtss2si(gpq, xmmB);
+ cc.evex().vcvtss2usi(gpd, xmmB);
+ if (cc.is64Bit()) cc.evex().vcvtss2usi(gpq, xmmB);
+ cc.evex().vcvttpd2dq(xmmA, xmmB);
+ cc.evex().vcvttpd2dq(xmmA, ymmB);
+ cc.evex().vcvttpd2dq(ymmA, zmmB);
+ cc.evex().vcvttpd2qq(xmmA, xmmB);
+ cc.evex().vcvttpd2qq(ymmA, ymmB);
+ cc.evex().vcvttpd2qq(zmmA, zmmB);
+ cc.evex().vcvttpd2udq(xmmA, xmmB);
+ cc.evex().vcvttpd2udq(xmmA, ymmB);
+ cc.evex().vcvttpd2udq(ymmA, zmmB);
+ cc.evex().vcvttpd2uqq(xmmA, xmmB);
+ cc.evex().vcvttpd2uqq(ymmA, ymmB);
+ cc.evex().vcvttpd2uqq(zmmA, zmmB);
+ cc.evex().vcvttps2dq(xmmA, xmmB);
+ cc.evex().vcvttps2dq(ymmA, ymmB);
+ cc.evex().vcvttps2dq(zmmA, zmmB);
+ cc.evex().vcvttps2qq(xmmA, xmmB);
+ cc.evex().vcvttps2qq(ymmA, xmmB);
+ cc.evex().vcvttps2qq(zmmA, ymmB);
+ cc.evex().vcvttps2udq(xmmA, xmmB);
+ cc.evex().vcvttps2udq(ymmA, ymmB);
+ cc.evex().vcvttps2udq(zmmA, zmmB);
+ cc.evex().vcvttps2uqq(xmmA, xmmB);
+ cc.evex().vcvttps2uqq(ymmA, xmmB);
+ cc.evex().vcvttps2uqq(zmmA, ymmB);
+ cc.evex().vcvttsd2si(gpd, xmmB);
+ if (cc.is64Bit()) cc.evex().vcvttsd2si(gpq, xmmB);
+ cc.evex().vcvttsd2usi(gpd, xmmB);
+ if (cc.is64Bit()) cc.evex().vcvttsd2usi(gpq, xmmB);
+ cc.evex().vcvttss2si(gpd, xmmB);
+ if (cc.is64Bit()) cc.evex().vcvttss2si(gpq, xmmB);
+ cc.evex().vcvttss2usi(gpd, xmmB);
+ if (cc.is64Bit()) cc.evex().vcvttss2usi(gpq, xmmB);
+ cc.evex().vcvtudq2pd(xmmA, xmmB);
+ cc.evex().vcvtudq2pd(ymmA, xmmB);
+ cc.evex().vcvtudq2pd(zmmA, ymmB);
+ cc.evex().vcvtudq2ps(xmmA, xmmB);
+ cc.evex().vcvtudq2ps(ymmA, ymmB);
+ cc.evex().vcvtudq2ps(zmmA, zmmB);
+ cc.evex().vcvtuqq2pd(xmmA, xmmB);
+ cc.evex().vcvtuqq2pd(ymmA, ymmB);
+ cc.evex().vcvtuqq2pd(zmmA, zmmB);
+ cc.evex().vcvtuqq2ps(xmmA, xmmB);
+ cc.evex().vcvtuqq2ps(xmmA, ymmB);
+ cc.evex().vcvtuqq2ps(ymmA, zmmB);
+ cc.evex().vcvtusi2sd(xmmA, xmmB, gpd);
+ if (cc.is64Bit()) cc.evex().vcvtusi2sd(xmmA, xmmB, gpq);
+ cc.evex().vcvtusi2ss(xmmA, xmmB, gpd);
+ if (cc.is64Bit()) cc.evex().vcvtusi2ss(xmmA, xmmB, gpq);
+ cc.evex().vdbpsadbw(xmmA, xmmB, xmmC, 0);
+ cc.evex().vdbpsadbw(ymmA, ymmB, ymmC, 0);
+ cc.evex().vdbpsadbw(zmmA, zmmB, zmmC, 0);
+ cc.evex().vdivpd(xmmA, xmmB, xmmC);
+ cc.evex().vdivpd(ymmA, ymmB, ymmC);
+ cc.evex().vdivpd(zmmA, zmmB, zmmC);
+ cc.evex().vdivps(xmmA, xmmB, xmmC);
+ cc.evex().vdivps(ymmA, ymmB, ymmC);
+ cc.evex().vdivps(zmmA, zmmB, zmmC);
+ cc.evex().vdivsd(xmmA, xmmB, xmmC);
+ cc.evex().vdivss(xmmA, xmmB, xmmC);
+ cc.evex().vexp2pd(zmmA, zmmB);
+ cc.evex().vexp2ps(zmmA, zmmB);
+ cc.evex().vexpandpd(xmmA, xmmB);
+ cc.evex().vexpandpd(ymmA, ymmB);
+ cc.evex().vexpandpd(zmmA, zmmB);
+ cc.evex().vexpandps(xmmA, xmmB);
+ cc.evex().vexpandps(ymmA, ymmB);
+ cc.evex().vexpandps(zmmA, zmmB);
+ cc.evex().vextractf32x4(xmmA, ymmB, 0);
+ cc.evex().vextractf32x4(xmmA, zmmB, 0);
+ cc.evex().vextractf32x8(ymmA, zmmB, 0);
+ cc.evex().vextractf64x2(xmmA, ymmB, 0);
+ cc.evex().vextractf64x2(xmmA, zmmB, 0);
+ cc.evex().vextractf64x4(ymmA, zmmB, 0);
+ cc.evex().vextracti32x4(xmmA, ymmB, 0);
+ cc.evex().vextracti32x4(xmmA, zmmB, 0);
+ cc.evex().vextracti32x8(ymmA, zmmB, 0);
+ cc.evex().vextracti64x2(xmmA, ymmB, 0);
+ cc.evex().vextracti64x2(xmmA, zmmB, 0);
+ cc.evex().vextracti64x4(ymmA, zmmB, 0);
+ cc.evex().vextractps(gpd, xmmB, 0);
+ cc.evex().vfixupimmpd(xmmA, xmmB, xmmC, 0);
+ cc.evex().vfixupimmpd(ymmA, ymmB, ymmC, 0);
+ cc.evex().vfixupimmpd(zmmA, zmmB, zmmC, 0);
+ cc.evex().vfixupimmps(xmmA, xmmB, xmmC, 0);
+ cc.evex().vfixupimmps(ymmA, ymmB, ymmC, 0);
+ cc.evex().vfixupimmps(zmmA, zmmB, zmmC, 0);
+ cc.evex().vfixupimmsd(xmmA, xmmB, xmmC, 0);
+ cc.evex().vfixupimmss(xmmA, xmmB, xmmC, 0);
+ cc.evex().vfmadd132pd(xmmA, xmmB, xmmC);
+ cc.evex().vfmadd132pd(ymmA, ymmB, ymmC);
+ cc.evex().vfmadd132pd(zmmA, zmmB, zmmC);
+ cc.evex().vfmadd132ps(xmmA, xmmB, xmmC);
+ cc.evex().vfmadd132ps(ymmA, ymmB, ymmC);
+ cc.evex().vfmadd132ps(zmmA, zmmB, zmmC);
+ cc.evex().vfmadd132sd(xmmA, xmmB, xmmC);
+ cc.evex().vfmadd132ss(xmmA, xmmB, xmmC);
+ cc.evex().vfmadd213pd(xmmA, xmmB, xmmC);
+ cc.evex().vfmadd213pd(ymmA, ymmB, ymmC);
+ cc.evex().vfmadd213pd(zmmA, zmmB, zmmC);
+ cc.evex().vfmadd213ps(xmmA, xmmB, xmmC);
+ cc.evex().vfmadd213ps(ymmA, ymmB, ymmC);
+ cc.evex().vfmadd213ps(zmmA, zmmB, zmmC);
+ cc.evex().vfmadd213sd(xmmA, xmmB, xmmC);
+ cc.evex().vfmadd213ss(xmmA, xmmB, xmmC);
+ cc.evex().vfmadd231pd(xmmA, xmmB, xmmC);
+ cc.evex().vfmadd231pd(ymmA, ymmB, ymmC);
+ cc.evex().vfmadd231pd(zmmA, zmmB, zmmC);
+ cc.evex().vfmadd231ps(xmmA, xmmB, xmmC);
+ cc.evex().vfmadd231ps(ymmA, ymmB, ymmC);
+ cc.evex().vfmadd231ps(zmmA, zmmB, zmmC);
+ cc.evex().vfmadd231sd(xmmA, xmmB, xmmC);
+ cc.evex().vfmadd231ss(xmmA, xmmB, xmmC);
+ cc.evex().vfmaddsub132pd(xmmA, xmmB, xmmC);
+ cc.evex().vfmaddsub132pd(ymmA, ymmB, ymmC);
+ cc.evex().vfmaddsub132pd(zmmA, zmmB, zmmC);
+ cc.evex().vfmaddsub132ps(xmmA, xmmB, xmmC);
+ cc.evex().vfmaddsub132ps(ymmA, ymmB, ymmC);
+ cc.evex().vfmaddsub132ps(zmmA, zmmB, zmmC);
+ cc.evex().vfmaddsub213pd(xmmA, xmmB, xmmC);
+ cc.evex().vfmaddsub213pd(ymmA, ymmB, ymmC);
+ cc.evex().vfmaddsub213pd(zmmA, zmmB, zmmC);
+ cc.evex().vfmaddsub213ps(xmmA, xmmB, xmmC);
+ cc.evex().vfmaddsub213ps(ymmA, ymmB, ymmC);
+ cc.evex().vfmaddsub213ps(zmmA, zmmB, zmmC);
+ cc.evex().vfmaddsub231pd(xmmA, xmmB, xmmC);
+ cc.evex().vfmaddsub231pd(ymmA, ymmB, ymmC);
+ cc.evex().vfmaddsub231pd(zmmA, zmmB, zmmC);
+ cc.evex().vfmaddsub231ps(xmmA, xmmB, xmmC);
+ cc.evex().vfmaddsub231ps(ymmA, ymmB, ymmC);
+ cc.evex().vfmaddsub231ps(zmmA, zmmB, zmmC);
+ cc.evex().vfmsub132pd(xmmA, xmmB, xmmC);
+ cc.evex().vfmsub132pd(ymmA, ymmB, ymmC);
+ cc.evex().vfmsub132pd(zmmA, zmmB, zmmC);
+ cc.evex().vfmsub132ps(xmmA, xmmB, xmmC);
+ cc.evex().vfmsub132ps(ymmA, ymmB, ymmC);
+ cc.evex().vfmsub132ps(zmmA, zmmB, zmmC);
+ cc.evex().vfmsub132sd(xmmA, xmmB, xmmC);
+ cc.evex().vfmsub132ss(xmmA, xmmB, xmmC);
+ cc.evex().vfmsub213pd(xmmA, xmmB, xmmC);
+ cc.evex().vfmsub213pd(ymmA, ymmB, ymmC);
+ cc.evex().vfmsub213pd(zmmA, zmmB, zmmC);
+ cc.evex().vfmsub213ps(xmmA, xmmB, xmmC);
+ cc.evex().vfmsub213ps(ymmA, ymmB, ymmC);
+ cc.evex().vfmsub213ps(zmmA, zmmB, zmmC);
+ cc.evex().vfmsub213sd(xmmA, xmmB, xmmC);
+ cc.evex().vfmsub213ss(xmmA, xmmB, xmmC);
+ cc.evex().vfmsub231pd(xmmA, xmmB, xmmC);
+ cc.evex().vfmsub231pd(ymmA, ymmB, ymmC);
+ cc.evex().vfmsub231pd(zmmA, zmmB, zmmC);
+ cc.evex().vfmsub231ps(xmmA, xmmB, xmmC);
+ cc.evex().vfmsub231ps(ymmA, ymmB, ymmC);
+ cc.evex().vfmsub231ps(zmmA, zmmB, zmmC);
+ cc.evex().vfmsub231sd(xmmA, xmmB, xmmC);
+ cc.evex().vfmsub231ss(xmmA, xmmB, xmmC);
+ cc.evex().vfmsubadd132pd(xmmA, xmmB, xmmC);
+ cc.evex().vfmsubadd132pd(ymmA, ymmB, ymmC);
+ cc.evex().vfmsubadd132pd(zmmA, zmmB, zmmC);
+ cc.evex().vfmsubadd132ps(xmmA, xmmB, xmmC);
+ cc.evex().vfmsubadd132ps(ymmA, ymmB, ymmC);
+ cc.evex().vfmsubadd132ps(zmmA, zmmB, zmmC);
+ cc.evex().vfmsubadd213pd(xmmA, xmmB, xmmC);
+ cc.evex().vfmsubadd213pd(ymmA, ymmB, ymmC);
+ cc.evex().vfmsubadd213pd(zmmA, zmmB, zmmC);
+ cc.evex().vfmsubadd213ps(xmmA, xmmB, xmmC);
+ cc.evex().vfmsubadd213ps(ymmA, ymmB, ymmC);
+ cc.evex().vfmsubadd213ps(zmmA, zmmB, zmmC);
+ cc.evex().vfmsubadd231pd(xmmA, xmmB, xmmC);
+ cc.evex().vfmsubadd231pd(ymmA, ymmB, ymmC);
+ cc.evex().vfmsubadd231pd(zmmA, zmmB, zmmC);
+ cc.evex().vfmsubadd231ps(xmmA, xmmB, xmmC);
+ cc.evex().vfmsubadd231ps(ymmA, ymmB, ymmC);
+ cc.evex().vfmsubadd231ps(zmmA, zmmB, zmmC);
+ cc.evex().vfnmadd132pd(xmmA, xmmB, xmmC);
+ cc.evex().vfnmadd132pd(ymmA, ymmB, ymmC);
+ cc.evex().vfnmadd132pd(zmmA, zmmB, zmmC);
+ cc.evex().vfnmadd132ps(xmmA, xmmB, xmmC);
+ cc.evex().vfnmadd132ps(ymmA, ymmB, ymmC);
+ cc.evex().vfnmadd132ps(zmmA, zmmB, zmmC);
+ cc.evex().vfnmadd132sd(xmmA, xmmB, xmmC);
+ cc.evex().vfnmadd132ss(xmmA, xmmB, xmmC);
+ cc.evex().vfnmadd213pd(xmmA, xmmB, xmmC);
+ cc.evex().vfnmadd213pd(ymmA, ymmB, ymmC);
+ cc.evex().vfnmadd213pd(zmmA, zmmB, zmmC);
+ cc.evex().vfnmadd213ps(xmmA, xmmB, xmmC);
+ cc.evex().vfnmadd213ps(ymmA, ymmB, ymmC);
+ cc.evex().vfnmadd213ps(zmmA, zmmB, zmmC);
+ cc.evex().vfnmadd213sd(xmmA, xmmB, xmmC);
+ cc.evex().vfnmadd213ss(xmmA, xmmB, xmmC);
+ cc.evex().vfnmadd231pd(xmmA, xmmB, xmmC);
+ cc.evex().vfnmadd231pd(ymmA, ymmB, ymmC);
+ cc.evex().vfnmadd231pd(zmmA, zmmB, zmmC);
+ cc.evex().vfnmadd231ps(xmmA, xmmB, xmmC);
+ cc.evex().vfnmadd231ps(ymmA, ymmB, ymmC);
+ cc.evex().vfnmadd231ps(zmmA, zmmB, zmmC);
+ cc.evex().vfnmadd231sd(xmmA, xmmB, xmmC);
+ cc.evex().vfnmadd231ss(xmmA, xmmB, xmmC);
+ cc.evex().vfnmsub132pd(xmmA, xmmB, xmmC);
+ cc.evex().vfnmsub132pd(ymmA, ymmB, ymmC);
+ cc.evex().vfnmsub132pd(zmmA, zmmB, zmmC);
+ cc.evex().vfnmsub132ps(xmmA, xmmB, xmmC);
+ cc.evex().vfnmsub132ps(ymmA, ymmB, ymmC);
+ cc.evex().vfnmsub132ps(zmmA, zmmB, zmmC);
+ cc.evex().vfnmsub132sd(xmmA, xmmB, xmmC);
+ cc.evex().vfnmsub132ss(xmmA, xmmB, xmmC);
+ cc.evex().vfnmsub213pd(xmmA, xmmB, xmmC);
+ cc.evex().vfnmsub213pd(ymmA, ymmB, ymmC);
+ cc.evex().vfnmsub213pd(zmmA, zmmB, zmmC);
+ cc.evex().vfnmsub213ps(xmmA, xmmB, xmmC);
+ cc.evex().vfnmsub213ps(ymmA, ymmB, ymmC);
+ cc.evex().vfnmsub213ps(zmmA, zmmB, zmmC);
+ cc.evex().vfnmsub213sd(xmmA, xmmB, xmmC);
+ cc.evex().vfnmsub213ss(xmmA, xmmB, xmmC);
+ cc.evex().vfnmsub231pd(xmmA, xmmB, xmmC);
+ cc.evex().vfnmsub231pd(ymmA, ymmB, ymmC);
+ cc.evex().vfnmsub231pd(zmmA, zmmB, zmmC);
+ cc.evex().vfnmsub231ps(xmmA, xmmB, xmmC);
+ cc.evex().vfnmsub231ps(ymmA, ymmB, ymmC);
+ cc.evex().vfnmsub231ps(zmmA, zmmB, zmmC);
+ cc.evex().vfnmsub231sd(xmmA, xmmB, xmmC);
+ cc.evex().vfnmsub231ss(xmmA, xmmB, xmmC);
+ cc.evex().vfpclasspd(kA, xmmB, 0);
+ cc.evex().vfpclasspd(kA, ymmB, 0);
+ cc.evex().vfpclasspd(kA, zmmB, 0);
+ cc.evex().vfpclassps(kA, xmmB, 0);
+ cc.evex().vfpclassps(kA, ymmB, 0);
+ cc.evex().vfpclassps(kA, zmmB, 0);
+ cc.evex().vfpclasssd(kA, xmmB, 0);
+ cc.evex().vfpclassss(kA, xmmB, 0);
+ cc.evex().vgetexppd(xmmA, xmmB);
+ cc.evex().vgetexppd(ymmA, ymmB);
+ cc.evex().vgetexppd(zmmA, zmmB);
+ cc.evex().vgetexpps(xmmA, xmmB);
+ cc.evex().vgetexpps(ymmA, ymmB);
+ cc.evex().vgetexpps(zmmA, zmmB);
+ cc.evex().vgetexpsd(xmmA, xmmB, xmmC);
+ cc.evex().vgetexpss(xmmA, xmmB, xmmC);
+ cc.evex().vgetmantpd(xmmA, xmmB, 0);
+ cc.evex().vgetmantpd(ymmA, ymmB, 0);
+ cc.evex().vgetmantpd(zmmA, zmmB, 0);
+ cc.evex().vgetmantps(xmmA, xmmB, 0);
+ cc.evex().vgetmantps(ymmA, ymmB, 0);
+ cc.evex().vgetmantps(zmmA, zmmB, 0);
+ cc.evex().vgetmantsd(xmmA, xmmB, xmmC, 0);
+ cc.evex().vgetmantss(xmmA, xmmB, xmmC, 0);
+ cc.evex().vinsertf32x4(ymmA, ymmB, xmmC, 0);
+ cc.evex().vinsertf32x4(zmmA, zmmB, xmmC, 0);
+ cc.evex().vinsertf32x8(zmmA, zmmB, ymmC, 0);
+ cc.evex().vinsertf64x2(ymmA, ymmB, xmmC, 0);
+ cc.evex().vinsertf64x2(zmmA, zmmB, xmmC, 0);
+ cc.evex().vinsertf64x4(zmmA, zmmB, ymmC, 0);
+ cc.evex().vinserti32x4(ymmA, ymmB, xmmC, 0);
+ cc.evex().vinserti32x4(zmmA, zmmB, xmmC, 0);
+ cc.evex().vinserti32x8(zmmA, zmmB, ymmC, 0);
+ cc.evex().vinserti64x2(ymmA, ymmB, xmmC, 0);
+ cc.evex().vinserti64x2(zmmA, zmmB, xmmC, 0);
+ cc.evex().vinserti64x4(zmmA, zmmB, ymmC, 0);
+ cc.evex().vinsertps(xmmA, xmmB, xmmC, 0);
+ cc.evex().vmaxpd(xmmA, xmmB, xmmC);
+ cc.evex().vmaxpd(ymmA, ymmB, ymmC);
+ cc.evex().vmaxpd(zmmA, zmmB, zmmC);
+ cc.evex().vmaxps(xmmA, xmmB, xmmC);
+ cc.evex().vmaxps(ymmA, ymmB, ymmC);
+ cc.evex().vmaxps(zmmA, zmmB, zmmC);
+ cc.evex().vmaxsd(xmmA, xmmB, xmmC);
+ cc.evex().vmaxss(xmmA, xmmB, xmmC);
+ cc.evex().vminpd(xmmA, xmmB, xmmC);
+ cc.evex().vminpd(ymmA, ymmB, ymmC);
+ cc.evex().vminpd(zmmA, zmmB, zmmC);
+ cc.evex().vminps(xmmA, xmmB, xmmC);
+ cc.evex().vminps(ymmA, ymmB, ymmC);
+ cc.evex().vminps(zmmA, zmmB, zmmC);
+ cc.evex().vminsd(xmmA, xmmB, xmmC);
+ cc.evex().vminss(xmmA, xmmB, xmmC);
+ cc.evex().vmovapd(xmmA, xmmB);
+ cc.evex().vmovapd(xmmA, xmmB);
+ cc.evex().vmovapd(ymmA, ymmB);
+ cc.evex().vmovapd(ymmA, ymmB);
+ cc.evex().vmovapd(zmmA, zmmB);
+ cc.evex().vmovapd(zmmA, zmmB);
+ cc.evex().vmovaps(xmmA, xmmB);
+ cc.evex().vmovaps(xmmA, xmmB);
+ cc.evex().vmovaps(ymmA, ymmB);
+ cc.evex().vmovaps(ymmA, ymmB);
+ cc.evex().vmovaps(zmmA, zmmB);
+ cc.evex().vmovaps(zmmA, zmmB);
+ cc.evex().vmovd(gpd, xmmB);
+ cc.evex().vmovd(xmmA, gpd);
+ cc.evex().vmovddup(xmmA, xmmB);
+ cc.evex().vmovddup(ymmA, ymmB);
+ cc.evex().vmovddup(zmmA, zmmB);
+ cc.evex().vmovdqa32(xmmA, xmmB);
+ cc.evex().vmovdqa32(xmmA, xmmB);
+ cc.evex().vmovdqa32(ymmA, ymmB);
+ cc.evex().vmovdqa32(ymmA, ymmB);
+ cc.evex().vmovdqa32(zmmA, zmmB);
+ cc.evex().vmovdqa32(zmmA, zmmB);
+ cc.evex().vmovdqa64(xmmA, xmmB);
+ cc.evex().vmovdqa64(xmmA, xmmB);
+ cc.evex().vmovdqa64(ymmA, ymmB);
+ cc.evex().vmovdqa64(ymmA, ymmB);
+ cc.evex().vmovdqa64(zmmA, zmmB);
+ cc.evex().vmovdqa64(zmmA, zmmB);
+ cc.evex().vmovdqu16(xmmA, xmmB);
+ cc.evex().vmovdqu16(xmmA, xmmB);
+ cc.evex().vmovdqu16(ymmA, ymmB);
+ cc.evex().vmovdqu16(ymmA, ymmB);
+ cc.evex().vmovdqu16(zmmA, zmmB);
+ cc.evex().vmovdqu16(zmmA, zmmB);
+ cc.evex().vmovdqu32(xmmA, xmmB);
+ cc.evex().vmovdqu32(xmmA, xmmB);
+ cc.evex().vmovdqu32(ymmA, ymmB);
+ cc.evex().vmovdqu32(ymmA, ymmB);
+ cc.evex().vmovdqu32(zmmA, zmmB);
+ cc.evex().vmovdqu32(zmmA, zmmB);
+ cc.evex().vmovdqu64(xmmA, xmmB);
+ cc.evex().vmovdqu64(xmmA, xmmB);
+ cc.evex().vmovdqu64(ymmA, ymmB);
+ cc.evex().vmovdqu64(ymmA, ymmB);
+ cc.evex().vmovdqu64(zmmA, zmmB);
+ cc.evex().vmovdqu64(zmmA, zmmB);
+ cc.evex().vmovdqu8(xmmA, xmmB);
+ cc.evex().vmovdqu8(xmmA, xmmB);
+ cc.evex().vmovdqu8(ymmA, ymmB);
+ cc.evex().vmovdqu8(ymmA, ymmB);
+ cc.evex().vmovdqu8(zmmA, zmmB);
+ cc.evex().vmovdqu8(zmmA, zmmB);
+ cc.evex().vmovhlps(xmmA, xmmB, xmmC);
+ if (cc.is64Bit()) cc.evex().vmovq(gpq, xmmB);
+ if (cc.is64Bit()) cc.evex().vmovq(xmmA, gpq);
+ cc.evex().vmovq(xmmA, xmmB);
+ cc.evex().vmovsd(xmmA, xmmB, xmmC);
+ cc.evex().vmovshdup(xmmA, xmmB);
+ cc.evex().vmovshdup(ymmA, ymmB);
+ cc.evex().vmovshdup(zmmA, zmmB);
+ cc.evex().vmovsldup(xmmA, xmmB);
+ cc.evex().vmovsldup(ymmA, ymmB);
+ cc.evex().vmovsldup(zmmA, zmmB);
+ cc.evex().vmovss(xmmA, xmmB, xmmC);
+ cc.evex().vmovupd(xmmA, xmmB);
+ cc.evex().vmovupd(xmmA, xmmB);
+ cc.evex().vmovupd(ymmA, ymmB);
+ cc.evex().vmovupd(ymmA, ymmB);
+ cc.evex().vmovupd(zmmA, zmmB);
+ cc.evex().vmovupd(zmmA, zmmB);
+ cc.evex().vmovups(xmmA, xmmB);
+ cc.evex().vmovups(xmmA, xmmB);
+ cc.evex().vmovups(ymmA, ymmB);
+ cc.evex().vmovups(ymmA, ymmB);
+ cc.evex().vmovups(zmmA, zmmB);
+ cc.evex().vmovups(zmmA, zmmB);
+ cc.evex().vmulpd(xmmA, xmmB, xmmC);
+ cc.evex().vmulpd(ymmA, ymmB, ymmC);
+ cc.evex().vmulpd(zmmA, zmmB, zmmC);
+ cc.evex().vmulps(xmmA, xmmB, xmmC);
+ cc.evex().vmulps(ymmA, ymmB, ymmC);
+ cc.evex().vmulps(zmmA, zmmB, zmmC);
+ cc.evex().vmulsd(xmmA, xmmB, xmmC);
+ cc.evex().vmulss(xmmA, xmmB, xmmC);
+ cc.evex().vorpd(xmmA, xmmB, xmmC);
+ cc.evex().vorpd(ymmA, ymmB, ymmC);
+ cc.evex().vorpd(zmmA, zmmB, zmmC);
+ cc.evex().vorps(xmmA, xmmB, xmmC);
+ cc.evex().vorps(ymmA, ymmB, ymmC);
+ cc.evex().vorps(zmmA, zmmB, zmmC);
+ cc.evex().vpabsb(xmmA, xmmB);
+ cc.evex().vpabsb(ymmA, ymmB);
+ cc.evex().vpabsb(zmmA, zmmB);
+ cc.evex().vpabsd(xmmA, xmmB);
+ cc.evex().vpabsd(ymmA, ymmB);
+ cc.evex().vpabsd(zmmA, zmmB);
+ cc.evex().vpabsq(xmmA, xmmB);
+ cc.evex().vpabsq(ymmA, ymmB);
+ cc.evex().vpabsq(zmmA, zmmB);
+ cc.evex().vpabsw(xmmA, xmmB);
+ cc.evex().vpabsw(ymmA, ymmB);
+ cc.evex().vpabsw(zmmA, zmmB);
+ cc.evex().vpackssdw(xmmA, xmmB, xmmC);
+ cc.evex().vpackssdw(ymmA, ymmB, ymmC);
+ cc.evex().vpackssdw(zmmA, zmmB, zmmC);
+ cc.evex().vpacksswb(xmmA, xmmB, xmmC);
+ cc.evex().vpacksswb(ymmA, ymmB, ymmC);
+ cc.evex().vpacksswb(zmmA, zmmB, zmmC);
+ cc.evex().vpackusdw(xmmA, xmmB, xmmC);
+ cc.evex().vpackusdw(ymmA, ymmB, ymmC);
+ cc.evex().vpackusdw(zmmA, zmmB, zmmC);
+ cc.evex().vpackuswb(xmmA, xmmB, xmmC);
+ cc.evex().vpackuswb(ymmA, ymmB, ymmC);
+ cc.evex().vpackuswb(zmmA, zmmB, zmmC);
+ cc.evex().vpaddb(xmmA, xmmB, xmmC);
+ cc.evex().vpaddb(ymmA, ymmB, ymmC);
+ cc.evex().vpaddb(zmmA, zmmB, zmmC);
+ cc.evex().vpaddd(xmmA, xmmB, xmmC);
+ cc.evex().vpaddd(ymmA, ymmB, ymmC);
+ cc.evex().vpaddd(zmmA, zmmB, zmmC);
+ cc.evex().vpaddq(xmmA, xmmB, xmmC);
+ cc.evex().vpaddq(ymmA, ymmB, ymmC);
+ cc.evex().vpaddq(zmmA, zmmB, zmmC);
+ cc.evex().vpaddsb(xmmA, xmmB, xmmC);
+ cc.evex().vpaddsb(ymmA, ymmB, ymmC);
+ cc.evex().vpaddsb(zmmA, zmmB, zmmC);
+ cc.evex().vpaddsw(xmmA, xmmB, xmmC);
+ cc.evex().vpaddsw(ymmA, ymmB, ymmC);
+ cc.evex().vpaddsw(zmmA, zmmB, zmmC);
+ cc.evex().vpaddusb(xmmA, xmmB, xmmC);
+ cc.evex().vpaddusb(ymmA, ymmB, ymmC);
+ cc.evex().vpaddusb(zmmA, zmmB, zmmC);
+ cc.evex().vpaddusw(xmmA, xmmB, xmmC);
+ cc.evex().vpaddusw(ymmA, ymmB, ymmC);
+ cc.evex().vpaddusw(zmmA, zmmB, zmmC);
+ cc.evex().vpaddw(xmmA, xmmB, xmmC);
+ cc.evex().vpaddw(ymmA, ymmB, ymmC);
+ cc.evex().vpaddw(zmmA, zmmB, zmmC);
+ cc.evex().vpalignr(xmmA, xmmB, xmmC, 0);
+ cc.evex().vpalignr(ymmA, ymmB, ymmC, 0);
+ cc.evex().vpalignr(zmmA, zmmB, zmmC, 0);
+ cc.evex().vpandd(xmmA, xmmB, xmmC);
+ cc.evex().vpandd(ymmA, ymmB, ymmC);
+ cc.evex().vpandd(zmmA, zmmB, zmmC);
+ cc.evex().vpandnd(xmmA, xmmB, xmmC);
+ cc.evex().vpandnd(ymmA, ymmB, ymmC);
+ cc.evex().vpandnd(zmmA, zmmB, zmmC);
+ cc.evex().vpandnq(xmmA, xmmB, xmmC);
+ cc.evex().vpandnq(ymmA, ymmB, ymmC);
+ cc.evex().vpandnq(zmmA, zmmB, zmmC);
+ cc.evex().vpandq(xmmA, xmmB, xmmC);
+ cc.evex().vpandq(ymmA, ymmB, ymmC);
+ cc.evex().vpandq(zmmA, zmmB, zmmC);
+ cc.evex().vpavgb(xmmA, xmmB, xmmC);
+ cc.evex().vpavgb(ymmA, ymmB, ymmC);
+ cc.evex().vpavgb(zmmA, zmmB, zmmC);
+ cc.evex().vpavgw(xmmA, xmmB, xmmC);
+ cc.evex().vpavgw(ymmA, ymmB, ymmC);
+ cc.evex().vpavgw(zmmA, zmmB, zmmC);
+ cc.evex().vpblendmb(xmmA, xmmB, xmmC);
+ cc.evex().vpblendmb(ymmA, ymmB, ymmC);
+ cc.evex().vpblendmb(zmmA, zmmB, zmmC);
+ cc.evex().vpblendmd(xmmA, xmmB, xmmC);
+ cc.evex().vpblendmd(ymmA, ymmB, ymmC);
+ cc.evex().vpblendmd(zmmA, zmmB, zmmC);
+ cc.evex().vpblendmq(xmmA, xmmB, xmmC);
+ cc.evex().vpblendmq(ymmA, ymmB, ymmC);
+ cc.evex().vpblendmq(zmmA, zmmB, zmmC);
+ cc.evex().vpblendmw(xmmA, xmmB, xmmC);
+ cc.evex().vpblendmw(ymmA, ymmB, ymmC);
+ cc.evex().vpblendmw(zmmA, zmmB, zmmC);
+ cc.evex().vpbroadcastb(xmmA, gpd);
+ cc.evex().vpbroadcastb(xmmA, xmmB);
+ cc.evex().vpbroadcastb(ymmA, gpd);
+ cc.evex().vpbroadcastb(ymmA, xmmB);
+ cc.evex().vpbroadcastb(zmmA, gpd);
+ cc.evex().vpbroadcastb(zmmA, xmmB);
+ cc.evex().vpbroadcastd(xmmA, gpd);
+ cc.evex().vpbroadcastd(xmmA, xmmB);
+ cc.evex().vpbroadcastd(ymmA, gpd);
+ cc.evex().vpbroadcastd(ymmA, xmmB);
+ cc.evex().vpbroadcastd(zmmA, gpd);
+ cc.evex().vpbroadcastd(zmmA, xmmB);
+ cc.evex().vpbroadcastmb2q(xmmA, kB);
+ cc.evex().vpbroadcastmb2q(ymmA, kB);
+ cc.evex().vpbroadcastmb2q(zmmA, kB);
+ cc.evex().vpbroadcastmw2d(xmmA, kB);
+ cc.evex().vpbroadcastmw2d(ymmA, kB);
+ cc.evex().vpbroadcastmw2d(zmmA, kB);
+ if (cc.is64Bit()) cc.evex().vpbroadcastq(xmmA, gpq);
+ cc.evex().vpbroadcastq(xmmA, xmmB);
+ if (cc.is64Bit()) cc.evex().vpbroadcastq(ymmA, gpq);
+ cc.evex().vpbroadcastq(ymmA, xmmB);
+ if (cc.is64Bit()) cc.evex().vpbroadcastq(zmmA, gpq);
+ cc.evex().vpbroadcastq(zmmA, xmmB);
+ cc.evex().vpbroadcastw(xmmA, gpd);
+ cc.evex().vpbroadcastw(xmmA, xmmB);
+ cc.evex().vpbroadcastw(ymmA, gpd);
+ cc.evex().vpbroadcastw(ymmA, xmmB);
+ cc.evex().vpbroadcastw(zmmA, gpd);
+ cc.evex().vpbroadcastw(zmmA, xmmB);
+ cc.evex().vpcmpb(kA, xmmB, xmmC, 0);
+ cc.evex().vpcmpb(kA, ymmB, ymmC, 0);
+ cc.evex().vpcmpb(kA, zmmB, zmmC, 0);
+ cc.evex().vpcmpd(kA, xmmB, xmmC, 0);
+ cc.evex().vpcmpd(kA, ymmB, ymmC, 0);
+ cc.evex().vpcmpd(kA, zmmB, zmmC, 0);
+ cc.evex().vpcmpeqb(kA, xmmB, xmmC);
+ cc.evex().vpcmpeqb(kA, ymmB, ymmC);
+ cc.evex().vpcmpeqb(kA, zmmB, zmmC);
+ cc.evex().vpcmpeqd(kA, xmmB, xmmC);
+ cc.evex().vpcmpeqd(kA, ymmB, ymmC);
+ cc.evex().vpcmpeqd(kA, zmmB, zmmC);
+ cc.evex().vpcmpeqq(kA, xmmB, xmmC);
+ cc.evex().vpcmpeqq(kA, ymmB, ymmC);
+ cc.evex().vpcmpeqq(kA, zmmB, zmmC);
+ cc.evex().vpcmpeqw(kA, xmmB, xmmC);
+ cc.evex().vpcmpeqw(kA, ymmB, ymmC);
+ cc.evex().vpcmpeqw(kA, zmmB, zmmC);
+ cc.evex().vpcmpgtb(kA, xmmB, xmmC);
+ cc.evex().vpcmpgtb(kA, ymmB, ymmC);
+ cc.evex().vpcmpgtb(kA, zmmB, zmmC);
+ cc.evex().vpcmpgtd(kA, xmmB, xmmC);
+ cc.evex().vpcmpgtd(kA, ymmB, ymmC);
+ cc.evex().vpcmpgtd(kA, zmmB, zmmC);
+ cc.evex().vpcmpgtq(kA, xmmB, xmmC);
+ cc.evex().vpcmpgtq(kA, ymmB, ymmC);
+ cc.evex().vpcmpgtq(kA, zmmB, zmmC);
+ cc.evex().vpcmpgtw(kA, xmmB, xmmC);
+ cc.evex().vpcmpgtw(kA, ymmB, ymmC);
+ cc.evex().vpcmpgtw(kA, zmmB, zmmC);
+ cc.evex().vpcmpq(kA, xmmB, xmmC, 0);
+ cc.evex().vpcmpq(kA, ymmB, ymmC, 0);
+ cc.evex().vpcmpq(kA, zmmB, zmmC, 0);
+ cc.evex().vpcmpub(kA, xmmB, xmmC, 0);
+ cc.evex().vpcmpub(kA, ymmB, ymmC, 0);
+ cc.evex().vpcmpub(kA, zmmB, zmmC, 0);
+ cc.evex().vpcmpud(kA, xmmB, xmmC, 0);
+ cc.evex().vpcmpud(kA, ymmB, ymmC, 0);
+ cc.evex().vpcmpud(kA, zmmB, zmmC, 0);
+ cc.evex().vpcmpuq(kA, xmmB, xmmC, 0);
+ cc.evex().vpcmpuq(kA, ymmB, ymmC, 0);
+ cc.evex().vpcmpuq(kA, zmmB, zmmC, 0);
+ cc.evex().vpcmpuw(kA, xmmB, xmmC, 0);
+ cc.evex().vpcmpuw(kA, ymmB, ymmC, 0);
+ cc.evex().vpcmpuw(kA, zmmB, zmmC, 0);
+ cc.evex().vpcmpw(kA, xmmB, xmmC, 0);
+ cc.evex().vpcmpw(kA, ymmB, ymmC, 0);
+ cc.evex().vpcmpw(kA, zmmB, zmmC, 0);
+ cc.evex().vpcompressd(xmmA, xmmB);
+ cc.evex().vpcompressd(ymmA, ymmB);
+ cc.evex().vpcompressd(zmmA, zmmB);
+ cc.evex().vpcompressq(xmmA, xmmB);
+ cc.evex().vpcompressq(ymmA, ymmB);
+ cc.evex().vpcompressq(zmmA, zmmB);
+ cc.evex().vpconflictd(xmmA, xmmB);
+ cc.evex().vpconflictd(ymmA, ymmB);
+ cc.evex().vpconflictd(zmmA, zmmB);
+ cc.evex().vpconflictq(xmmA, xmmB);
+ cc.evex().vpconflictq(ymmA, ymmB);
+ cc.evex().vpconflictq(zmmA, zmmB);
+ cc.evex().vpermb(xmmA, xmmB, xmmC);
+ cc.evex().vpermb(ymmA, ymmB, ymmC);
+ cc.evex().vpermb(zmmA, zmmB, zmmC);
+ cc.evex().vpermd(ymmA, ymmB, ymmC);
+ cc.evex().vpermd(zmmA, zmmB, zmmC);
+ cc.evex().vpermi2b(xmmA, xmmB, xmmC);
+ cc.evex().vpermi2b(ymmA, ymmB, ymmC);
+ cc.evex().vpermi2b(zmmA, zmmB, zmmC);
+ cc.evex().vpermi2d(xmmA, xmmB, xmmC);
+ cc.evex().vpermi2d(ymmA, ymmB, ymmC);
+ cc.evex().vpermi2d(zmmA, zmmB, zmmC);
+ cc.evex().vpermi2pd(xmmA, xmmB, xmmC);
+ cc.evex().vpermi2pd(ymmA, ymmB, ymmC);
+ cc.evex().vpermi2pd(zmmA, zmmB, zmmC);
+ cc.evex().vpermi2ps(xmmA, xmmB, xmmC);
+ cc.evex().vpermi2ps(ymmA, ymmB, ymmC);
+ cc.evex().vpermi2ps(zmmA, zmmB, zmmC);
+ cc.evex().vpermi2q(xmmA, xmmB, xmmC);
+ cc.evex().vpermi2q(ymmA, ymmB, ymmC);
+ cc.evex().vpermi2q(zmmA, zmmB, zmmC);
+ cc.evex().vpermi2w(xmmA, xmmB, xmmC);
+ cc.evex().vpermi2w(ymmA, ymmB, ymmC);
+ cc.evex().vpermi2w(zmmA, zmmB, zmmC);
+ cc.evex().vpermilpd(xmmA, xmmB, xmmC);
+ cc.evex().vpermilpd(ymmA, ymmB, ymmC);
+ cc.evex().vpermilpd(zmmA, zmmB, zmmC);
+ cc.evex().vpermilpd(xmmA, xmmB, 0);
+ cc.evex().vpermilpd(ymmA, ymmB, 0);
+ cc.evex().vpermilpd(zmmA, zmmB, 0);
+ cc.evex().vpermilps(xmmA, xmmB, xmmC);
+ cc.evex().vpermilps(ymmA, ymmB, ymmC);
+ cc.evex().vpermilps(zmmA, zmmB, zmmC);
+ cc.evex().vpermilps(xmmA, xmmB, 0);
+ cc.evex().vpermilps(ymmA, ymmB, 0);
+ cc.evex().vpermilps(zmmA, zmmB, 0);
+ cc.evex().vpermq(ymmA, ymmB, ymmC);
+ cc.evex().vpermq(zmmA, zmmB, zmmC);
+ cc.evex().vpermq(ymmA, ymmB, 0);
+ cc.evex().vpermq(zmmA, zmmB, 0);
+ cc.evex().vpermt2b(xmmA, xmmB, xmmC);
+ cc.evex().vpermt2b(ymmA, ymmB, ymmC);
+ cc.evex().vpermt2b(zmmA, zmmB, zmmC);
+ cc.evex().vpermt2d(xmmA, xmmB, xmmC);
+ cc.evex().vpermt2d(ymmA, ymmB, ymmC);
+ cc.evex().vpermt2d(zmmA, zmmB, zmmC);
+ cc.evex().vpermt2pd(xmmA, xmmB, xmmC);
+ cc.evex().vpermt2pd(ymmA, ymmB, ymmC);
+ cc.evex().vpermt2pd(zmmA, zmmB, zmmC);
+ cc.evex().vpermt2ps(xmmA, xmmB, xmmC);
+ cc.evex().vpermt2ps(ymmA, ymmB, ymmC);
+ cc.evex().vpermt2ps(zmmA, zmmB, zmmC);
+ cc.evex().vpermt2q(xmmA, xmmB, xmmC);
+ cc.evex().vpermt2q(ymmA, ymmB, ymmC);
+ cc.evex().vpermt2q(zmmA, zmmB, zmmC);
+ cc.evex().vpermt2w(xmmA, xmmB, xmmC);
+ cc.evex().vpermt2w(ymmA, ymmB, ymmC);
+ cc.evex().vpermt2w(zmmA, zmmB, zmmC);
+ cc.evex().vpermw(xmmA, xmmB, xmmC);
+ cc.evex().vpermw(ymmA, ymmB, ymmC);
+ cc.evex().vpermw(zmmA, zmmB, zmmC);
+ cc.evex().vpexpandd(xmmA, xmmB);
+ cc.evex().vpexpandd(ymmA, ymmB);
+ cc.evex().vpexpandd(zmmA, zmmB);
+ cc.evex().vpexpandq(xmmA, xmmB);
+ cc.evex().vpexpandq(ymmA, ymmB);
+ cc.evex().vpexpandq(zmmA, zmmB);
+ cc.evex().vpextrb(gpd, xmmB, 0);
+ cc.evex().vpextrd(gpd, xmmB, 0);
+ if (cc.is64Bit()) cc.evex().vpextrq(gpq, xmmB, 0);
+ cc.evex().vpextrw(gpd, xmmB, 0);
+ cc.evex().vpinsrb(xmmA, xmmB, gpd, 0);
+ cc.evex().vpinsrd(xmmA, xmmB, gpd, 0);
+ if (cc.is64Bit()) cc.evex().vpinsrq(xmmA, xmmB, gpq, 0);
+ cc.evex().vpinsrw(xmmA, xmmB, gpd, 0);
+ cc.evex().vplzcntd(xmmA, xmmB);
+ cc.evex().vplzcntd(ymmA, ymmB);
+ cc.evex().vplzcntd(zmmA, zmmB);
+ cc.evex().vplzcntq(xmmA, xmmB);
+ cc.evex().vplzcntq(ymmA, ymmB);
+ cc.evex().vplzcntq(zmmA, zmmB);
+ cc.evex().vpmadd52huq(xmmA, xmmB, xmmC);
+ cc.evex().vpmadd52huq(ymmA, ymmB, ymmC);
+ cc.evex().vpmadd52huq(zmmA, zmmB, zmmC);
+ cc.evex().vpmadd52luq(xmmA, xmmB, xmmC);
+ cc.evex().vpmadd52luq(ymmA, ymmB, ymmC);
+ cc.evex().vpmadd52luq(zmmA, zmmB, zmmC);
+ cc.evex().vpmaddubsw(xmmA, xmmB, xmmC);
+ cc.evex().vpmaddubsw(ymmA, ymmB, ymmC);
+ cc.evex().vpmaddubsw(zmmA, zmmB, zmmC);
+ cc.evex().vpmaddwd(xmmA, xmmB, xmmC);
+ cc.evex().vpmaddwd(ymmA, ymmB, ymmC);
+ cc.evex().vpmaddwd(zmmA, zmmB, zmmC);
+ cc.evex().vpmaxsb(xmmA, xmmB, xmmC);
+ cc.evex().vpmaxsb(ymmA, ymmB, ymmC);
+ cc.evex().vpmaxsb(zmmA, zmmB, zmmC);
+ cc.evex().vpmaxsd(xmmA, xmmB, xmmC);
+ cc.evex().vpmaxsd(ymmA, ymmB, ymmC);
+ cc.evex().vpmaxsd(zmmA, zmmB, zmmC);
+ cc.evex().vpmaxsq(xmmA, xmmB, xmmC);
+ cc.evex().vpmaxsq(ymmA, ymmB, ymmC);
+ cc.evex().vpmaxsq(zmmA, zmmB, zmmC);
+ cc.evex().vpmaxsw(xmmA, xmmB, xmmC);
+ cc.evex().vpmaxsw(ymmA, ymmB, ymmC);
+ cc.evex().vpmaxsw(zmmA, zmmB, zmmC);
+ cc.evex().vpmaxub(xmmA, xmmB, xmmC);
+ cc.evex().vpmaxub(ymmA, ymmB, ymmC);
+ cc.evex().vpmaxub(zmmA, zmmB, zmmC);
+ cc.evex().vpmaxud(xmmA, xmmB, xmmC);
+ cc.evex().vpmaxud(ymmA, ymmB, ymmC);
+ cc.evex().vpmaxud(zmmA, zmmB, zmmC);
+ cc.evex().vpmaxuq(xmmA, xmmB, xmmC);
+ cc.evex().vpmaxuq(ymmA, ymmB, ymmC);
+ cc.evex().vpmaxuq(zmmA, zmmB, zmmC);
+ cc.evex().vpmaxuw(xmmA, xmmB, xmmC);
+ cc.evex().vpmaxuw(ymmA, ymmB, ymmC);
+ cc.evex().vpmaxuw(zmmA, zmmB, zmmC);
+ cc.evex().vpminsb(xmmA, xmmB, xmmC);
+ cc.evex().vpminsb(ymmA, ymmB, ymmC);
+ cc.evex().vpminsb(zmmA, zmmB, zmmC);
+ cc.evex().vpminsd(xmmA, xmmB, xmmC);
+ cc.evex().vpminsd(ymmA, ymmB, ymmC);
+ cc.evex().vpminsd(zmmA, zmmB, zmmC);
+ cc.evex().vpminsq(xmmA, xmmB, xmmC);
+ cc.evex().vpminsq(ymmA, ymmB, ymmC);
+ cc.evex().vpminsq(zmmA, zmmB, zmmC);
+ cc.evex().vpminsw(xmmA, xmmB, xmmC);
+ cc.evex().vpminsw(ymmA, ymmB, ymmC);
+ cc.evex().vpminsw(zmmA, zmmB, zmmC);
+ cc.evex().vpminub(xmmA, xmmB, xmmC);
+ cc.evex().vpminub(ymmA, ymmB, ymmC);
+ cc.evex().vpminub(zmmA, zmmB, zmmC);
+ cc.evex().vpminud(xmmA, xmmB, xmmC);
+ cc.evex().vpminud(ymmA, ymmB, ymmC);
+ cc.evex().vpminud(zmmA, zmmB, zmmC);
+ cc.evex().vpminuq(xmmA, xmmB, xmmC);
+ cc.evex().vpminuq(ymmA, ymmB, ymmC);
+ cc.evex().vpminuq(zmmA, zmmB, zmmC);
+ cc.evex().vpminuw(xmmA, xmmB, xmmC);
+ cc.evex().vpminuw(ymmA, ymmB, ymmC);
+ cc.evex().vpminuw(zmmA, zmmB, zmmC);
+ cc.evex().vpmovb2m(kA, xmmB);
+ cc.evex().vpmovb2m(kA, ymmB);
+ cc.evex().vpmovb2m(kA, zmmB);
+ cc.evex().vpmovd2m(kA, xmmB);
+ cc.evex().vpmovd2m(kA, ymmB);
+ cc.evex().vpmovd2m(kA, zmmB);
+ cc.evex().vpmovdb(xmmA, xmmB);
+ cc.evex().vpmovdb(xmmA, ymmB);
+ cc.evex().vpmovdb(xmmA, zmmB);
+ cc.evex().vpmovdw(xmmA, xmmB);
+ cc.evex().vpmovdw(xmmA, ymmB);
+ cc.evex().vpmovdw(ymmA, zmmB);
+ cc.evex().vpmovm2b(xmmA, kB);
+ cc.evex().vpmovm2b(ymmA, kB);
+ cc.evex().vpmovm2b(zmmA, kB);
+ cc.evex().vpmovm2d(xmmA, kB);
+ cc.evex().vpmovm2d(ymmA, kB);
+ cc.evex().vpmovm2d(zmmA, kB);
+ cc.evex().vpmovm2q(xmmA, kB);
+ cc.evex().vpmovm2q(ymmA, kB);
+ cc.evex().vpmovm2q(zmmA, kB);
+ cc.evex().vpmovm2w(xmmA, kB);
+ cc.evex().vpmovm2w(ymmA, kB);
+ cc.evex().vpmovm2w(zmmA, kB);
+ cc.evex().vpmovq2m(kA, xmmB);
+ cc.evex().vpmovq2m(kA, ymmB);
+ cc.evex().vpmovq2m(kA, zmmB);
+ cc.evex().vpmovqb(xmmA, xmmB);
+ cc.evex().vpmovqb(xmmA, ymmB);
+ cc.evex().vpmovqb(xmmA, zmmB);
+ cc.evex().vpmovqd(xmmA, xmmB);
+ cc.evex().vpmovqd(xmmA, ymmB);
+ cc.evex().vpmovqd(ymmA, zmmB);
+ cc.evex().vpmovqw(xmmA, xmmB);
+ cc.evex().vpmovqw(xmmA, ymmB);
+ cc.evex().vpmovqw(xmmA, zmmB);
+ cc.evex().vpmovsdb(xmmA, xmmB);
+ cc.evex().vpmovsdb(xmmA, ymmB);
+ cc.evex().vpmovsdb(xmmA, zmmB);
+ cc.evex().vpmovsdw(xmmA, xmmB);
+ cc.evex().vpmovsdw(xmmA, ymmB);
+ cc.evex().vpmovsdw(ymmA, zmmB);
+ cc.evex().vpmovsqb(xmmA, xmmB);
+ cc.evex().vpmovsqb(xmmA, ymmB);
+ cc.evex().vpmovsqb(xmmA, zmmB);
+ cc.evex().vpmovsqd(xmmA, xmmB);
+ cc.evex().vpmovsqd(xmmA, ymmB);
+ cc.evex().vpmovsqd(ymmA, zmmB);
+ cc.evex().vpmovsqw(xmmA, xmmB);
+ cc.evex().vpmovsqw(xmmA, ymmB);
+ cc.evex().vpmovsqw(xmmA, zmmB);
+ cc.evex().vpmovswb(xmmA, xmmB);
+ cc.evex().vpmovswb(xmmA, ymmB);
+ cc.evex().vpmovswb(ymmA, zmmB);
+ cc.evex().vpmovsxbd(xmmA, xmmB);
+ cc.evex().vpmovsxbd(ymmA, xmmB);
+ cc.evex().vpmovsxbd(zmmA, xmmB);
+ cc.evex().vpmovsxbq(xmmA, xmmB);
+ cc.evex().vpmovsxbq(ymmA, xmmB);
+ cc.evex().vpmovsxbq(zmmA, xmmB);
+ cc.evex().vpmovsxbw(xmmA, xmmB);
+ cc.evex().vpmovsxbw(ymmA, xmmB);
+ cc.evex().vpmovsxbw(zmmA, ymmB);
+ cc.evex().vpmovsxdq(xmmA, xmmB);
+ cc.evex().vpmovsxdq(ymmA, xmmB);
+ cc.evex().vpmovsxdq(zmmA, ymmB);
+ cc.evex().vpmovsxwd(xmmA, xmmB);
+ cc.evex().vpmovsxwd(ymmA, xmmB);
+ cc.evex().vpmovsxwd(zmmA, ymmB);
+ cc.evex().vpmovsxwq(xmmA, xmmB);
+ cc.evex().vpmovsxwq(ymmA, xmmB);
+ cc.evex().vpmovsxwq(zmmA, xmmB);
+ cc.evex().vpmovusdb(xmmA, xmmB);
+ cc.evex().vpmovusdb(xmmA, ymmB);
+ cc.evex().vpmovusdb(xmmA, zmmB);
+ cc.evex().vpmovusdw(xmmA, xmmB);
+ cc.evex().vpmovusdw(xmmA, ymmB);
+ cc.evex().vpmovusdw(ymmA, zmmB);
+ cc.evex().vpmovusqb(xmmA, xmmB);
+ cc.evex().vpmovusqb(xmmA, ymmB);
+ cc.evex().vpmovusqb(xmmA, zmmB);
+ cc.evex().vpmovusqd(xmmA, xmmB);
+ cc.evex().vpmovusqd(xmmA, ymmB);
+ cc.evex().vpmovusqd(ymmA, zmmB);
+ cc.evex().vpmovusqw(xmmA, xmmB);
+ cc.evex().vpmovusqw(xmmA, ymmB);
+ cc.evex().vpmovusqw(xmmA, zmmB);
+ cc.evex().vpmovuswb(xmmA, xmmB);
+ cc.evex().vpmovuswb(xmmA, ymmB);
+ cc.evex().vpmovuswb(ymmA, zmmB);
+ cc.evex().vpmovw2m(kA, xmmB);
+ cc.evex().vpmovw2m(kA, ymmB);
+ cc.evex().vpmovw2m(kA, zmmB);
+ cc.evex().vpmovwb(xmmA, xmmB);
+ cc.evex().vpmovwb(xmmA, ymmB);
+ cc.evex().vpmovwb(ymmA, zmmB);
+ cc.evex().vpmovzxbd(xmmA, xmmB);
+ cc.evex().vpmovzxbd(ymmA, xmmB);
+ cc.evex().vpmovzxbd(zmmA, xmmB);
+ cc.evex().vpmovzxbq(xmmA, xmmB);
+ cc.evex().vpmovzxbq(ymmA, xmmB);
+ cc.evex().vpmovzxbq(zmmA, xmmB);
+ cc.evex().vpmovzxbw(xmmA, xmmB);
+ cc.evex().vpmovzxbw(ymmA, xmmB);
+ cc.evex().vpmovzxbw(zmmA, ymmB);
+ cc.evex().vpmovzxdq(xmmA, xmmB);
+ cc.evex().vpmovzxdq(ymmA, xmmB);
+ cc.evex().vpmovzxdq(zmmA, ymmB);
+ cc.evex().vpmovzxwd(xmmA, xmmB);
+ cc.evex().vpmovzxwd(ymmA, xmmB);
+ cc.evex().vpmovzxwd(zmmA, ymmB);
+ cc.evex().vpmovzxwq(xmmA, xmmB);
+ cc.evex().vpmovzxwq(ymmA, xmmB);
+ cc.evex().vpmovzxwq(zmmA, xmmB);
+ cc.evex().vpmuldq(xmmA, xmmB, xmmC);
+ cc.evex().vpmuldq(ymmA, ymmB, ymmC);
+ cc.evex().vpmuldq(zmmA, zmmB, zmmC);
+ cc.evex().vpmulhrsw(xmmA, xmmB, xmmC);
+ cc.evex().vpmulhrsw(ymmA, ymmB, ymmC);
+ cc.evex().vpmulhrsw(zmmA, zmmB, zmmC);
+ cc.evex().vpmulhuw(xmmA, xmmB, xmmC);
+ cc.evex().vpmulhuw(ymmA, ymmB, ymmC);
+ cc.evex().vpmulhuw(zmmA, zmmB, zmmC);
+ cc.evex().vpmulhw(xmmA, xmmB, xmmC);
+ cc.evex().vpmulhw(ymmA, ymmB, ymmC);
+ cc.evex().vpmulhw(zmmA, zmmB, zmmC);
+ cc.evex().vpmulld(xmmA, xmmB, xmmC);
+ cc.evex().vpmulld(ymmA, ymmB, ymmC);
+ cc.evex().vpmulld(zmmA, zmmB, zmmC);
+ cc.evex().vpmullq(xmmA, xmmB, xmmC);
+ cc.evex().vpmullq(ymmA, ymmB, ymmC);
+ cc.evex().vpmullq(zmmA, zmmB, zmmC);
+ cc.evex().vpmullw(xmmA, xmmB, xmmC);
+ cc.evex().vpmullw(ymmA, ymmB, ymmC);
+ cc.evex().vpmullw(zmmA, zmmB, zmmC);
+ cc.evex().vpmultishiftqb(xmmA, xmmB, xmmC);
+ cc.evex().vpmultishiftqb(ymmA, ymmB, ymmC);
+ cc.evex().vpmultishiftqb(zmmA, zmmB, zmmC);
+ cc.evex().vpmuludq(xmmA, xmmB, xmmC);
+ cc.evex().vpmuludq(ymmA, ymmB, ymmC);
+ cc.evex().vpmuludq(zmmA, zmmB, zmmC);
+ cc.evex().vpopcntd(zmmA, zmmB);
+ cc.evex().vpopcntq(zmmA, zmmB);
+ cc.evex().vpord(xmmA, xmmB, xmmC);
+ cc.evex().vpord(ymmA, ymmB, ymmC);
+ cc.evex().vpord(zmmA, zmmB, zmmC);
+ cc.evex().vporq(xmmA, xmmB, xmmC);
+ cc.evex().vporq(ymmA, ymmB, ymmC);
+ cc.evex().vporq(zmmA, zmmB, zmmC);
+ cc.evex().vprold(xmmA, xmmB, 0);
+ cc.evex().vprold(ymmA, ymmB, 0);
+ cc.evex().vprold(zmmA, zmmB, 0);
+ cc.evex().vprolq(xmmA, xmmB, 0);
+ cc.evex().vprolq(ymmA, ymmB, 0);
+ cc.evex().vprolq(zmmA, zmmB, 0);
+ cc.evex().vprolvd(xmmA, xmmB, xmmC);
+ cc.evex().vprolvd(ymmA, ymmB, ymmC);
+ cc.evex().vprolvd(zmmA, zmmB, zmmC);
+ cc.evex().vprolvq(xmmA, xmmB, xmmC);
+ cc.evex().vprolvq(ymmA, ymmB, ymmC);
+ cc.evex().vprolvq(zmmA, zmmB, zmmC);
+ cc.evex().vprord(xmmA, xmmB, 0);
+ cc.evex().vprord(ymmA, ymmB, 0);
+ cc.evex().vprord(zmmA, zmmB, 0);
+ cc.evex().vprorq(xmmA, xmmB, 0);
+ cc.evex().vprorq(ymmA, ymmB, 0);
+ cc.evex().vprorq(zmmA, zmmB, 0);
+ cc.evex().vprorvd(xmmA, xmmB, xmmC);
+ cc.evex().vprorvd(ymmA, ymmB, ymmC);
+ cc.evex().vprorvd(zmmA, zmmB, zmmC);
+ cc.evex().vprorvq(xmmA, xmmB, xmmC);
+ cc.evex().vprorvq(ymmA, ymmB, ymmC);
+ cc.evex().vprorvq(zmmA, zmmB, zmmC);
+ cc.evex().vpsadbw(xmmA, xmmB, xmmC);
+ cc.evex().vpsadbw(ymmA, ymmB, ymmC);
+ cc.evex().vpsadbw(zmmA, zmmB, zmmC);
+ cc.evex().vpshufb(xmmA, xmmB, xmmC);
+ cc.evex().vpshufb(ymmA, ymmB, ymmC);
+ cc.evex().vpshufb(zmmA, zmmB, zmmC);
+ cc.evex().vpshufd(xmmA, xmmB, 0);
+ cc.evex().vpshufd(ymmA, ymmB, 0);
+ cc.evex().vpshufd(zmmA, zmmB, 0);
+ cc.evex().vpshufhw(xmmA, xmmB, 0);
+ cc.evex().vpshufhw(ymmA, ymmB, 0);
+ cc.evex().vpshufhw(zmmA, zmmB, 0);
+ cc.evex().vpshuflw(xmmA, xmmB, 0);
+ cc.evex().vpshuflw(ymmA, ymmB, 0);
+ cc.evex().vpshuflw(zmmA, zmmB, 0);
+ cc.evex().vpslld(xmmA, xmmB, xmmC);
+ cc.evex().vpslld(xmmA, xmmB, 0);
+ cc.evex().vpslld(ymmA, ymmB, xmmC);
+ cc.evex().vpslld(ymmA, ymmB, 0);
+ cc.evex().vpslld(zmmA, zmmB, xmmC);
+ cc.evex().vpslld(zmmA, zmmB, 0);
+ cc.evex().vpslldq(xmmA, xmmB, 0);
+ cc.evex().vpslldq(ymmA, ymmB, 0);
+ cc.evex().vpslldq(zmmA, zmmB, 0);
+ cc.evex().vpsllq(xmmA, xmmB, xmmC);
+ cc.evex().vpsllq(xmmA, xmmB, 0);
+ cc.evex().vpsllq(ymmA, ymmB, xmmC);
+ cc.evex().vpsllq(ymmA, ymmB, 0);
+ cc.evex().vpsllq(zmmA, zmmB, xmmC);
+ cc.evex().vpsllq(zmmA, zmmB, 0);
+ cc.evex().vpsllvd(xmmA, xmmB, xmmC);
+ cc.evex().vpsllvd(ymmA, ymmB, ymmC);
+ cc.evex().vpsllvd(zmmA, zmmB, zmmC);
+ cc.evex().vpsllvq(xmmA, xmmB, xmmC);
+ cc.evex().vpsllvq(ymmA, ymmB, ymmC);
+ cc.evex().vpsllvq(zmmA, zmmB, zmmC);
+ cc.evex().vpsllvw(xmmA, xmmB, xmmC);
+ cc.evex().vpsllvw(ymmA, ymmB, ymmC);
+ cc.evex().vpsllvw(zmmA, zmmB, zmmC);
+ cc.evex().vpsllw(xmmA, xmmB, xmmC);
+ cc.evex().vpsllw(xmmA, xmmB, 0);
+ cc.evex().vpsllw(ymmA, ymmB, xmmC);
+ cc.evex().vpsllw(ymmA, ymmB, 0);
+ cc.evex().vpsllw(zmmA, zmmB, xmmC);
+ cc.evex().vpsllw(zmmA, zmmB, 0);
+ cc.evex().vpsrad(xmmA, xmmB, xmmC);
+ cc.evex().vpsrad(xmmA, xmmB, 0);
+ cc.evex().vpsrad(ymmA, ymmB, xmmC);
+ cc.evex().vpsrad(ymmA, ymmB, 0);
+ cc.evex().vpsrad(zmmA, zmmB, xmmC);
+ cc.evex().vpsrad(zmmA, zmmB, 0);
+ cc.evex().vpsraq(xmmA, xmmB, xmmC);
+ cc.evex().vpsraq(xmmA, xmmB, 0);
+ cc.evex().vpsraq(ymmA, ymmB, xmmC);
+ cc.evex().vpsraq(ymmA, ymmB, 0);
+ cc.evex().vpsraq(zmmA, zmmB, xmmC);
+ cc.evex().vpsraq(zmmA, zmmB, 0);
+ cc.evex().vpsravd(xmmA, xmmB, xmmC);
+ cc.evex().vpsravd(ymmA, ymmB, ymmC);
+ cc.evex().vpsravd(zmmA, zmmB, zmmC);
+ cc.evex().vpsravq(xmmA, xmmB, xmmC);
+ cc.evex().vpsravq(ymmA, ymmB, ymmC);
+ cc.evex().vpsravq(zmmA, zmmB, zmmC);
+ cc.evex().vpsravw(xmmA, xmmB, xmmC);
+ cc.evex().vpsravw(ymmA, ymmB, ymmC);
+ cc.evex().vpsravw(zmmA, zmmB, zmmC);
+ cc.evex().vpsraw(xmmA, xmmB, xmmC);
+ cc.evex().vpsraw(xmmA, xmmB, 0);
+ cc.evex().vpsraw(ymmA, ymmB, xmmC);
+ cc.evex().vpsraw(ymmA, ymmB, 0);
+ cc.evex().vpsraw(zmmA, zmmB, xmmC);
+ cc.evex().vpsraw(zmmA, zmmB, 0);
+ cc.evex().vpsrld(xmmA, xmmB, xmmC);
+ cc.evex().vpsrld(xmmA, xmmB, 0);
+ cc.evex().vpsrld(ymmA, ymmB, xmmC);
+ cc.evex().vpsrld(ymmA, ymmB, 0);
+ cc.evex().vpsrld(zmmA, zmmB, xmmC);
+ cc.evex().vpsrld(zmmA, zmmB, 0);
+ cc.evex().vpsrldq(xmmA, xmmB, 0);
+ cc.evex().vpsrldq(ymmA, ymmB, 0);
+ cc.evex().vpsrldq(zmmA, zmmB, 0);
+ cc.evex().vpsrlq(xmmA, xmmB, xmmC);
+ cc.evex().vpsrlq(xmmA, xmmB, 0);
+ cc.evex().vpsrlq(ymmA, ymmB, xmmC);
+ cc.evex().vpsrlq(ymmA, ymmB, 0);
+ cc.evex().vpsrlq(zmmA, zmmB, xmmC);
+ cc.evex().vpsrlq(zmmA, zmmB, 0);
+ cc.evex().vpsrlvd(xmmA, xmmB, xmmC);
+ cc.evex().vpsrlvd(ymmA, ymmB, ymmC);
+ cc.evex().vpsrlvd(zmmA, zmmB, zmmC);
+ cc.evex().vpsrlvq(xmmA, xmmB, xmmC);
+ cc.evex().vpsrlvq(ymmA, ymmB, ymmC);
+ cc.evex().vpsrlvq(zmmA, zmmB, zmmC);
+ cc.evex().vpsrlvw(xmmA, xmmB, xmmC);
+ cc.evex().vpsrlvw(ymmA, ymmB, ymmC);
+ cc.evex().vpsrlvw(zmmA, zmmB, zmmC);
+ cc.evex().vpsrlw(xmmA, xmmB, xmmC);
+ cc.evex().vpsrlw(xmmA, xmmB, 0);
+ cc.evex().vpsrlw(ymmA, ymmB, xmmC);
+ cc.evex().vpsrlw(ymmA, ymmB, 0);
+ cc.evex().vpsrlw(zmmA, zmmB, xmmC);
+ cc.evex().vpsrlw(zmmA, zmmB, 0);
+ cc.evex().vpsubb(xmmA, xmmB, xmmC);
+ cc.evex().vpsubb(ymmA, ymmB, ymmC);
+ cc.evex().vpsubb(zmmA, zmmB, zmmC);
+ cc.evex().vpsubd(xmmA, xmmB, xmmC);
+ cc.evex().vpsubd(ymmA, ymmB, ymmC);
+ cc.evex().vpsubd(zmmA, zmmB, zmmC);
+ cc.evex().vpsubq(xmmA, xmmB, xmmC);
+ cc.evex().vpsubq(ymmA, ymmB, ymmC);
+ cc.evex().vpsubq(zmmA, zmmB, zmmC);
+ cc.evex().vpsubsb(xmmA, xmmB, xmmC);
+ cc.evex().vpsubsb(ymmA, ymmB, ymmC);
+ cc.evex().vpsubsb(zmmA, zmmB, zmmC);
+ cc.evex().vpsubsw(xmmA, xmmB, xmmC);
+ cc.evex().vpsubsw(ymmA, ymmB, ymmC);
+ cc.evex().vpsubsw(zmmA, zmmB, zmmC);
+ cc.evex().vpsubusb(xmmA, xmmB, xmmC);
+ cc.evex().vpsubusb(ymmA, ymmB, ymmC);
+ cc.evex().vpsubusb(zmmA, zmmB, zmmC);
+ cc.evex().vpsubusw(xmmA, xmmB, xmmC);
+ cc.evex().vpsubusw(ymmA, ymmB, ymmC);
+ cc.evex().vpsubusw(zmmA, zmmB, zmmC);
+ cc.evex().vpsubw(xmmA, xmmB, xmmC);
+ cc.evex().vpsubw(ymmA, ymmB, ymmC);
+ cc.evex().vpsubw(zmmA, zmmB, zmmC);
+ cc.evex().vpternlogd(xmmA, xmmB, xmmC, 0);
+ cc.evex().vpternlogd(ymmA, ymmB, ymmC, 0);
+ cc.evex().vpternlogd(zmmA, zmmB, zmmC, 0);
+ cc.evex().vpternlogq(xmmA, xmmB, xmmC, 0);
+ cc.evex().vpternlogq(ymmA, ymmB, ymmC, 0);
+ cc.evex().vpternlogq(zmmA, zmmB, zmmC, 0);
+ cc.evex().vptestmb(kA, xmmB, xmmC);
+ cc.evex().vptestmb(kA, ymmB, ymmC);
+ cc.evex().vptestmb(kA, zmmB, zmmC);
+ cc.evex().vptestmd(kA, xmmB, xmmC);
+ cc.evex().vptestmd(kA, ymmB, ymmC);
+ cc.evex().vptestmd(kA, zmmB, zmmC);
+ cc.evex().vptestmq(kA, xmmB, xmmC);
+ cc.evex().vptestmq(kA, ymmB, ymmC);
+ cc.evex().vptestmq(kA, zmmB, zmmC);
+ cc.evex().vptestmw(kA, xmmB, xmmC);
+ cc.evex().vptestmw(kA, ymmB, ymmC);
+ cc.evex().vptestmw(kA, zmmB, zmmC);
+ cc.evex().vptestnmb(kA, xmmB, xmmC);
+ cc.evex().vptestnmb(kA, ymmB, ymmC);
+ cc.evex().vptestnmb(kA, zmmB, zmmC);
+ cc.evex().vptestnmd(kA, xmmB, xmmC);
+ cc.evex().vptestnmd(kA, ymmB, ymmC);
+ cc.evex().vptestnmd(kA, zmmB, zmmC);
+ cc.evex().vptestnmq(kA, xmmB, xmmC);
+ cc.evex().vptestnmq(kA, ymmB, ymmC);
+ cc.evex().vptestnmq(kA, zmmB, zmmC);
+ cc.evex().vptestnmw(kA, xmmB, xmmC);
+ cc.evex().vptestnmw(kA, ymmB, ymmC);
+ cc.evex().vptestnmw(kA, zmmB, zmmC);
+ cc.evex().vpunpckhbw(xmmA, xmmB, xmmC);
+ cc.evex().vpunpckhbw(ymmA, ymmB, ymmC);
+ cc.evex().vpunpckhbw(zmmA, zmmB, zmmC);
+ cc.evex().vpunpckhdq(xmmA, xmmB, xmmC);
+ cc.evex().vpunpckhdq(ymmA, ymmB, ymmC);
+ cc.evex().vpunpckhdq(zmmA, zmmB, zmmC);
+ cc.evex().vpunpckhqdq(xmmA, xmmB, xmmC);
+ cc.evex().vpunpckhqdq(ymmA, ymmB, ymmC);
+ cc.evex().vpunpckhqdq(zmmA, zmmB, zmmC);
+ cc.evex().vpunpckhwd(xmmA, xmmB, xmmC);
+ cc.evex().vpunpckhwd(ymmA, ymmB, ymmC);
+ cc.evex().vpunpckhwd(zmmA, zmmB, zmmC);
+ cc.evex().vpunpcklbw(xmmA, xmmB, xmmC);
+ cc.evex().vpunpcklbw(ymmA, ymmB, ymmC);
+ cc.evex().vpunpcklbw(zmmA, zmmB, zmmC);
+ cc.evex().vpunpckldq(xmmA, xmmB, xmmC);
+ cc.evex().vpunpckldq(ymmA, ymmB, ymmC);
+ cc.evex().vpunpckldq(zmmA, zmmB, zmmC);
+ cc.evex().vpunpcklqdq(xmmA, xmmB, xmmC);
+ cc.evex().vpunpcklqdq(ymmA, ymmB, ymmC);
+ cc.evex().vpunpcklqdq(zmmA, zmmB, zmmC);
+ cc.evex().vpunpcklwd(xmmA, xmmB, xmmC);
+ cc.evex().vpunpcklwd(ymmA, ymmB, ymmC);
+ cc.evex().vpunpcklwd(zmmA, zmmB, zmmC);
+ cc.evex().vpxord(xmmA, xmmB, xmmC);
+ cc.evex().vpxord(ymmA, ymmB, ymmC);
+ cc.evex().vpxord(zmmA, zmmB, zmmC);
+ cc.evex().vpxorq(xmmA, xmmB, xmmC);
+ cc.evex().vpxorq(ymmA, ymmB, ymmC);
+ cc.evex().vpxorq(zmmA, zmmB, zmmC);
+ cc.evex().vrangepd(xmmA, xmmB, xmmC, 0);
+ cc.evex().vrangepd(ymmA, ymmB, ymmC, 0);
+ cc.evex().vrangepd(zmmA, zmmB, zmmC, 0);
+ cc.evex().vrangeps(xmmA, xmmB, xmmC, 0);
+ cc.evex().vrangeps(ymmA, ymmB, ymmC, 0);
+ cc.evex().vrangeps(zmmA, zmmB, zmmC, 0);
+ cc.evex().vrangesd(xmmA, xmmB, xmmC, 0);
+ cc.evex().vrangess(xmmA, xmmB, xmmC, 0);
+ cc.evex().vrcp14pd(xmmA, xmmB);
+ cc.evex().vrcp14pd(ymmA, ymmB);
+ cc.evex().vrcp14pd(zmmA, zmmB);
+ cc.evex().vrcp14ps(xmmA, xmmB);
+ cc.evex().vrcp14ps(ymmA, ymmB);
+ cc.evex().vrcp14ps(zmmA, zmmB);
+ cc.evex().vrcp14sd(xmmA, xmmB, xmmC);
+ cc.evex().vrcp14ss(xmmA, xmmB, xmmC);
+ cc.evex().vrcp28pd(zmmA, zmmB);
+ cc.evex().vrcp28ps(zmmA, zmmB);
+ cc.evex().vrcp28sd(xmmA, xmmB, xmmC);
+ cc.evex().vrcp28ss(xmmA, xmmB, xmmC);
+ cc.evex().vreducepd(xmmA, xmmB, 0);
+ cc.evex().vreducepd(ymmA, ymmB, 0);
+ cc.evex().vreducepd(zmmA, zmmB, 0);
+ cc.evex().vreduceps(xmmA, xmmB, 0);
+ cc.evex().vreduceps(ymmA, ymmB, 0);
+ cc.evex().vreduceps(zmmA, zmmB, 0);
+ cc.evex().vreducesd(xmmA, xmmB, xmmC, 0);
+ cc.evex().vreducess(xmmA, xmmB, xmmC, 0);
+ cc.evex().vrndscalepd(xmmA, xmmB, 0);
+ cc.evex().vrndscalepd(ymmA, ymmB, 0);
+ cc.evex().vrndscalepd(zmmA, zmmB, 0);
+ cc.evex().vrndscaleps(xmmA, xmmB, 0);
+ cc.evex().vrndscaleps(ymmA, ymmB, 0);
+ cc.evex().vrndscaleps(zmmA, zmmB, 0);
+ cc.evex().vrndscalesd(xmmA, xmmB, xmmC, 0);
+ cc.evex().vrndscaless(xmmA, xmmB, xmmC, 0);
+ cc.evex().vrsqrt14pd(xmmA, xmmB);
+ cc.evex().vrsqrt14pd(ymmA, ymmB);
+ cc.evex().vrsqrt14pd(zmmA, zmmB);
+ cc.evex().vrsqrt14ps(xmmA, xmmB);
+ cc.evex().vrsqrt14ps(ymmA, ymmB);
+ cc.evex().vrsqrt14ps(zmmA, zmmB);
+ cc.evex().vrsqrt14sd(xmmA, xmmB, xmmC);
+ cc.evex().vrsqrt14ss(xmmA, xmmB, xmmC);
+ cc.evex().vrsqrt28pd(zmmA, zmmB);
+ cc.evex().vrsqrt28ps(zmmA, zmmB);
+ cc.evex().vrsqrt28sd(xmmA, xmmB, xmmC);
+ cc.evex().vrsqrt28ss(xmmA, xmmB, xmmC);
+ cc.evex().vscalefpd(xmmA, xmmB, xmmC);
+ cc.evex().vscalefpd(ymmA, ymmB, ymmC);
+ cc.evex().vscalefpd(zmmA, zmmB, zmmC);
+ cc.evex().vscalefps(xmmA, xmmB, xmmC);
+ cc.evex().vscalefps(ymmA, ymmB, ymmC);
+ cc.evex().vscalefps(zmmA, zmmB, zmmC);
+ cc.evex().vscalefsd(xmmA, xmmB, xmmC);
+ cc.evex().vscalefss(xmmA, xmmB, xmmC);
+ cc.evex().vshuff32x4(ymmA, ymmB, ymmC, 0);
+ cc.evex().vshuff32x4(zmmA, zmmB, zmmC, 0);
+ cc.evex().vshuff64x2(ymmA, ymmB, ymmC, 0);
+ cc.evex().vshuff64x2(zmmA, zmmB, zmmC, 0);
+ cc.evex().vshufi32x4(ymmA, ymmB, ymmC, 0);
+ cc.evex().vshufi32x4(zmmA, zmmB, zmmC, 0);
+ cc.evex().vshufi64x2(ymmA, ymmB, ymmC, 0);
+ cc.evex().vshufi64x2(zmmA, zmmB, zmmC, 0);
+ cc.evex().vshufpd(xmmA, xmmB, xmmC, 0);
+ cc.evex().vshufpd(ymmA, ymmB, ymmC, 0);
+ cc.evex().vshufpd(zmmA, zmmB, zmmC, 0);
+ cc.evex().vshufps(xmmA, xmmB, xmmC, 0);
+ cc.evex().vshufps(ymmA, ymmB, ymmC, 0);
+ cc.evex().vshufps(zmmA, zmmB, zmmC, 0);
+ cc.evex().vsqrtpd(xmmA, xmmB);
+ cc.evex().vsqrtpd(ymmA, ymmB);
+ cc.evex().vsqrtpd(zmmA, zmmB);
+ cc.evex().vsqrtps(xmmA, xmmB);
+ cc.evex().vsqrtps(ymmA, ymmB);
+ cc.evex().vsqrtps(zmmA, zmmB);
+ cc.evex().vsqrtsd(xmmA, xmmB, xmmC);
+ cc.evex().vsqrtss(xmmA, xmmB, xmmC);
+ cc.evex().vsubpd(xmmA, xmmB, xmmC);
+ cc.evex().vsubpd(ymmA, ymmB, ymmC);
+ cc.evex().vsubpd(zmmA, zmmB, zmmC);
+ cc.evex().vsubps(xmmA, xmmB, xmmC);
+ cc.evex().vsubps(ymmA, ymmB, ymmC);
+ cc.evex().vsubps(zmmA, zmmB, zmmC);
+ cc.evex().vsubsd(xmmA, xmmB, xmmC);
+ cc.evex().vsubss(xmmA, xmmB, xmmC);
+ cc.evex().vucomisd(xmmA, xmmB);
+ cc.evex().vucomiss(xmmA, xmmB);
+ cc.evex().vunpckhpd(xmmA, xmmB, xmmC);
+ cc.evex().vunpckhpd(ymmA, ymmB, ymmC);
+ cc.evex().vunpckhpd(zmmA, zmmB, zmmC);
+ cc.evex().vunpckhps(xmmA, xmmB, xmmC);
+ cc.evex().vunpckhps(ymmA, ymmB, ymmC);
+ cc.evex().vunpckhps(zmmA, zmmB, zmmC);
+ cc.evex().vunpcklpd(xmmA, xmmB, xmmC);
+ cc.evex().vunpcklpd(ymmA, ymmB, ymmC);
+ cc.evex().vunpcklpd(zmmA, zmmB, zmmC);
+ cc.evex().vunpcklps(xmmA, xmmB, xmmC);
+ cc.evex().vunpcklps(ymmA, ymmB, ymmC);
+ cc.evex().vunpcklps(zmmA, zmmB, zmmC);
+ cc.evex().vxorpd(xmmA, xmmB, xmmC);
+ cc.evex().vxorpd(ymmA, ymmB, ymmC);
+ cc.evex().vxorpd(zmmA, zmmB, zmmC);
+ cc.evex().vxorps(xmmA, xmmB, xmmC);
+ cc.evex().vxorps(ymmA, ymmB, ymmC);
+ cc.evex().vxorps(zmmA, zmmB, zmmC);
+ }
+ else {
+ x86::Mem m = x86::ptr(gpz);
+ x86::Mem m32 = x86::dword_ptr(gpz);
+ x86::Mem m64 = x86::qword_ptr(gpz);
+ x86::Mem m128 = x86::xmmword_ptr(gpz);
+ x86::Mem m256 = x86::ymmword_ptr(gpz);
+ x86::Mem m512 = x86::zmmword_ptr(gpz);
+ x86::Mem vx_ptr = x86::ptr(gpz, xmmD);
+ x86::Mem vy_ptr = x86::ptr(gpz, ymmD);
+ x86::Mem vz_ptr = x86::ptr(gpz, zmmD);
+
+ cc.kmovb(kA, m);
+ cc.kmovb(m, kB);
+ cc.kmovd(kA, m);
+ cc.kmovd(m, kB);
+ cc.kmovq(kA, m);
+ cc.kmovq(m, kB);
+ cc.kmovw(kA, m);
+ cc.kmovw(m, kB);
+
+ cc.evex().vaddpd(xmmA, xmmB, m);
+ cc.evex().vaddpd(ymmA, ymmB, m);
+ cc.evex().vaddpd(zmmA, zmmB, m);
+ cc.evex().vaddps(xmmA, xmmB, m);
+ cc.evex().vaddps(ymmA, ymmB, m);
+ cc.evex().vaddps(zmmA, zmmB, m);
+ cc.evex().vaddsd(xmmA, xmmB, m);
+ cc.evex().vaddss(xmmA, xmmB, m);
+ cc.evex().valignd(xmmA, xmmB, m, 0);
+ cc.evex().valignd(ymmA, ymmB, m, 0);
+ cc.evex().valignd(zmmA, zmmB, m, 0);
+ cc.evex().valignq(xmmA, xmmB, m, 0);
+ cc.evex().valignq(ymmA, ymmB, m, 0);
+ cc.evex().valignq(zmmA, zmmB, m, 0);
+ cc.evex().vandnpd(xmmA, xmmB, m);
+ cc.evex().vandnpd(ymmA, ymmB, m);
+ cc.evex().vandnpd(zmmA, zmmB, m);
+ cc.evex().vandnps(xmmA, xmmB, m);
+ cc.evex().vandnps(ymmA, ymmB, m);
+ cc.evex().vandnps(zmmA, zmmB, m);
+ cc.evex().vandpd(xmmA, xmmB, m);
+ cc.evex().vandpd(ymmA, ymmB, m);
+ cc.evex().vandpd(zmmA, zmmB, m);
+ cc.evex().vandps(xmmA, xmmB, m);
+ cc.evex().vandps(ymmA, ymmB, m);
+ cc.evex().vandps(zmmA, zmmB, m);
+ cc.evex().vblendmpd(xmmA, xmmB, m);
+ cc.evex().vblendmpd(ymmA, ymmB, m);
+ cc.evex().vblendmpd(zmmA, zmmB, m);
+ cc.evex().vblendmps(xmmA, xmmB, m);
+ cc.evex().vblendmps(ymmA, ymmB, m);
+ cc.evex().vblendmps(zmmA, zmmB, m);
+ cc.evex().vbroadcastf32x2(ymmA, m);
+ cc.evex().vbroadcastf32x2(zmmA, m);
+ cc.evex().vbroadcastf32x4(ymmA, m);
+ cc.evex().vbroadcastf32x4(zmmA, m);
+ cc.evex().vbroadcastf32x8(zmmA, m);
+ cc.evex().vbroadcastf64x2(ymmA, m);
+ cc.evex().vbroadcastf64x2(zmmA, m);
+ cc.evex().vbroadcastf64x4(zmmA, m);
+ cc.evex().vbroadcasti32x2(xmmA, m);
+ cc.evex().vbroadcasti32x2(ymmA, m);
+ cc.evex().vbroadcasti32x2(zmmA, m);
+ cc.evex().vbroadcasti32x4(ymmA, m);
+ cc.evex().vbroadcasti32x4(zmmA, m);
+ cc.evex().vbroadcasti32x8(zmmA, m);
+ cc.evex().vbroadcasti64x2(ymmA, m);
+ cc.evex().vbroadcasti64x2(zmmA, m);
+ cc.evex().vbroadcasti64x4(zmmA, m);
+ cc.evex().vbroadcastsd(ymmA, m);
+ cc.evex().vbroadcastsd(zmmA, m);
+ cc.evex().vbroadcastss(xmmA, m);
+ cc.evex().vbroadcastss(ymmA, m);
+ cc.evex().vbroadcastss(zmmA, m);
+ cc.evex().vcmppd(kA, xmmB, m, 0);
+ cc.evex().vcmppd(kA, ymmB, m, 0);
+ cc.evex().vcmppd(kA, zmmB, m, 0);
+ cc.evex().vcmpps(kA, xmmB, m, 0);
+ cc.evex().vcmpps(kA, ymmB, m, 0);
+ cc.evex().vcmpps(kA, zmmB, m, 0);
+ cc.evex().vcmpsd(kA, xmmB, m, 0);
+ cc.evex().vcmpss(kA, xmmB, m, 0);
+ cc.evex().vcomisd(xmmA, m);
+ cc.evex().vcomiss(xmmA, m);
+ cc.evex().vcompresspd(m, xmmB);
+ cc.evex().vcompresspd(m, ymmB);
+ cc.evex().vcompresspd(m, zmmB);
+ cc.evex().vcompressps(m, xmmB);
+ cc.evex().vcompressps(m, ymmB);
+ cc.evex().vcompressps(m, zmmB);
+ cc.evex().vcvtdq2pd(xmmA, m);
+ cc.evex().vcvtdq2pd(ymmA, m);
+ cc.evex().vcvtdq2pd(zmmA, m);
+ cc.evex().vcvtdq2ps(xmmA, m);
+ cc.evex().vcvtdq2ps(ymmA, m);
+ cc.evex().vcvtdq2ps(zmmA, m);
+ cc.evex().vcvtpd2dq(xmmA, m128);
+ cc.evex().vcvtpd2dq(xmmA, m256);
+ cc.evex().vcvtpd2dq(ymmA, m512);
+ cc.evex().vcvtpd2qq(xmmA, m);
+ cc.evex().vcvtpd2qq(ymmA, m);
+ cc.evex().vcvtpd2qq(zmmA, m);
+ cc.evex().vcvtpd2udq(xmmA, m128);
+ cc.evex().vcvtpd2udq(xmmA, m256);
+ cc.evex().vcvtpd2udq(ymmA, m512);
+ cc.evex().vcvtpd2uqq(xmmA, m);
+ cc.evex().vcvtpd2uqq(ymmA, m);
+ cc.evex().vcvtpd2uqq(zmmA, m);
+ cc.evex().vcvtph2ps(xmmA, m);
+ cc.evex().vcvtph2ps(ymmA, m);
+ cc.evex().vcvtph2ps(zmmA, m);
+ cc.evex().vcvtps2dq(xmmA, m);
+ cc.evex().vcvtps2dq(ymmA, m);
+ cc.evex().vcvtps2dq(zmmA, m);
+ cc.evex().vcvtps2pd(xmmA, m);
+ cc.evex().vcvtps2pd(ymmA, m);
+ cc.evex().vcvtps2pd(zmmA, m);
+ cc.evex().vcvtps2ph(m, xmmB, 0);
+ cc.evex().vcvtps2ph(m, ymmB, 0);
+ cc.evex().vcvtps2ph(m, zmmB, 0);
+ cc.evex().vcvtps2qq(xmmA, m);
+ cc.evex().vcvtps2qq(ymmA, m);
+ cc.evex().vcvtps2qq(zmmA, m);
+ cc.evex().vcvtps2udq(xmmA, m);
+ cc.evex().vcvtps2udq(ymmA, m);
+ cc.evex().vcvtps2udq(zmmA, m);
+ cc.evex().vcvtps2uqq(xmmA, m);
+ cc.evex().vcvtps2uqq(ymmA, m);
+ cc.evex().vcvtps2uqq(zmmA, m);
+ cc.evex().vcvtqq2pd(xmmA, m);
+ cc.evex().vcvtqq2pd(ymmA, m);
+ cc.evex().vcvtqq2pd(zmmA, m);
+ cc.evex().vcvtqq2ps(xmmA, m128);
+ cc.evex().vcvtqq2ps(xmmA, m256);
+ cc.evex().vcvtqq2ps(ymmA, m512);
+ cc.evex().vcvtsd2si(gpd, m);
+ if (cc.is64Bit()) cc.evex().vcvtsd2si(gpq, m);
+ cc.evex().vcvtsd2ss(xmmA, xmmB, m);
+ cc.evex().vcvtsd2usi(gpd, m);
+ if (cc.is64Bit()) cc.evex().vcvtsd2usi(gpq, m);
+ cc.evex().vcvtsi2sd(xmmA, xmmB, m32);
+ if (cc.is64Bit()) cc.evex().vcvtsi2sd(xmmA, xmmB, m64);
+ cc.evex().vcvtsi2ss(xmmA, xmmB, m32);
+ if (cc.is64Bit()) cc.evex().vcvtsi2ss(xmmA, xmmB, m64);
+ cc.evex().vcvtss2sd(xmmA, xmmB, m);
+ cc.evex().vcvtss2si(gpd, m);
+ if (cc.is64Bit()) cc.evex().vcvtss2si(gpq, m);
+ cc.evex().vcvtss2usi(gpd, m);
+ if (cc.is64Bit()) cc.evex().vcvtss2usi(gpq, m);
+ cc.evex().vcvttpd2dq(xmmA, m128);
+ cc.evex().vcvttpd2dq(xmmA, m256);
+ cc.evex().vcvttpd2dq(ymmA, m512);
+ cc.evex().vcvttpd2qq(xmmA, m);
+ cc.evex().vcvttpd2qq(ymmA, m);
+ cc.evex().vcvttpd2qq(zmmA, m);
+ cc.evex().vcvttpd2udq(xmmA, m128);
+ cc.evex().vcvttpd2udq(xmmA, m256);
+ cc.evex().vcvttpd2udq(ymmA, m512);
+ cc.evex().vcvttpd2uqq(xmmA, m);
+ cc.evex().vcvttpd2uqq(ymmA, m);
+ cc.evex().vcvttpd2uqq(zmmA, m);
+ cc.evex().vcvttps2dq(xmmA, m);
+ cc.evex().vcvttps2dq(ymmA, m);
+ cc.evex().vcvttps2dq(zmmA, m);
+ cc.evex().vcvttps2qq(xmmA, m);
+ cc.evex().vcvttps2qq(ymmA, m);
+ cc.evex().vcvttps2qq(zmmA, m);
+ cc.evex().vcvttps2udq(xmmA, m);
+ cc.evex().vcvttps2udq(ymmA, m);
+ cc.evex().vcvttps2udq(zmmA, m);
+ cc.evex().vcvttps2uqq(xmmA, m);
+ cc.evex().vcvttps2uqq(ymmA, m);
+ cc.evex().vcvttps2uqq(zmmA, m);
+ cc.evex().vcvttsd2si(gpd, m);
+ if (cc.is64Bit()) cc.evex().vcvttsd2si(gpq, m);
+ cc.evex().vcvttsd2usi(gpd, m);
+ if (cc.is64Bit()) cc.evex().vcvttsd2usi(gpq, m);
+ cc.evex().vcvttss2si(gpd, m);
+ if (cc.is64Bit()) cc.evex().vcvttss2si(gpq, m);
+ cc.evex().vcvttss2usi(gpd, m);
+ if (cc.is64Bit()) cc.evex().vcvttss2usi(gpq, m);
+ cc.evex().vcvtudq2pd(xmmA, m);
+ cc.evex().vcvtudq2pd(ymmA, m);
+ cc.evex().vcvtudq2pd(zmmA, m);
+ cc.evex().vcvtudq2ps(xmmA, m);
+ cc.evex().vcvtudq2ps(ymmA, m);
+ cc.evex().vcvtudq2ps(zmmA, m);
+ cc.evex().vcvtuqq2pd(xmmA, m);
+ cc.evex().vcvtuqq2pd(ymmA, m);
+ cc.evex().vcvtuqq2pd(zmmA, m);
+ cc.evex().vcvtuqq2ps(xmmA, m128);
+ cc.evex().vcvtuqq2ps(xmmA, m256);
+ cc.evex().vcvtuqq2ps(ymmA, m512);
+ cc.evex().vcvtusi2sd(xmmA, xmmB, m32);
+ if (cc.is64Bit()) cc.evex().vcvtusi2sd(xmmA, xmmB, m64);
+ cc.evex().vcvtusi2ss(xmmA, xmmB, m32);
+ if (cc.is64Bit()) cc.evex().vcvtusi2ss(xmmA, xmmB, m64);
+ cc.evex().vdbpsadbw(xmmA, xmmB, m, 0);
+ cc.evex().vdbpsadbw(ymmA, ymmB, m, 0);
+ cc.evex().vdbpsadbw(zmmA, zmmB, m, 0);
+ cc.evex().vdivpd(xmmA, xmmB, m);
+ cc.evex().vdivpd(ymmA, ymmB, m);
+ cc.evex().vdivpd(zmmA, zmmB, m);
+ cc.evex().vdivps(xmmA, xmmB, m);
+ cc.evex().vdivps(ymmA, ymmB, m);
+ cc.evex().vdivps(zmmA, zmmB, m);
+ cc.evex().vdivsd(xmmA, xmmB, m);
+ cc.evex().vdivss(xmmA, xmmB, m);
+ cc.evex().vexp2pd(zmmA, m);
+ cc.evex().vexp2ps(zmmA, m);
+ cc.evex().vexpandpd(xmmA, m);
+ cc.evex().vexpandpd(ymmA, m);
+ cc.evex().vexpandpd(zmmA, m);
+ cc.evex().vexpandps(xmmA, m);
+ cc.evex().vexpandps(ymmA, m);
+ cc.evex().vexpandps(zmmA, m);
+ cc.evex().vextractf32x4(m, ymmB, 0);
+ cc.evex().vextractf32x4(m, zmmB, 0);
+ cc.evex().vextractf32x8(m, zmmB, 0);
+ cc.evex().vextractf64x2(m, ymmB, 0);
+ cc.evex().vextractf64x2(m, zmmB, 0);
+ cc.evex().vextractf64x4(m, zmmB, 0);
+ cc.evex().vextracti32x4(m, ymmB, 0);
+ cc.evex().vextracti32x4(m, zmmB, 0);
+ cc.evex().vextracti32x8(m, zmmB, 0);
+ cc.evex().vextracti64x2(m, ymmB, 0);
+ cc.evex().vextracti64x2(m, zmmB, 0);
+ cc.evex().vextracti64x4(m, zmmB, 0);
+ cc.evex().vextractps(m, xmmB, 0);
+ cc.evex().vfixupimmpd(xmmA, xmmB, m, 0);
+ cc.evex().vfixupimmpd(ymmA, ymmB, m, 0);
+ cc.evex().vfixupimmpd(zmmA, zmmB, m, 0);
+ cc.evex().vfixupimmps(xmmA, xmmB, m, 0);
+ cc.evex().vfixupimmps(ymmA, ymmB, m, 0);
+ cc.evex().vfixupimmps(zmmA, zmmB, m, 0);
+ cc.evex().vfixupimmsd(xmmA, xmmB, m, 0);
+ cc.evex().vfixupimmss(xmmA, xmmB, m, 0);
+ cc.evex().vfmadd132pd(xmmA, xmmB, m);
+ cc.evex().vfmadd132pd(ymmA, ymmB, m);
+ cc.evex().vfmadd132pd(zmmA, zmmB, m);
+ cc.evex().vfmadd132ps(xmmA, xmmB, m);
+ cc.evex().vfmadd132ps(ymmA, ymmB, m);
+ cc.evex().vfmadd132ps(zmmA, zmmB, m);
+ cc.evex().vfmadd132sd(xmmA, xmmB, m);
+ cc.evex().vfmadd132ss(xmmA, xmmB, m);
+ cc.evex().vfmadd213pd(xmmA, xmmB, m);
+ cc.evex().vfmadd213pd(ymmA, ymmB, m);
+ cc.evex().vfmadd213pd(zmmA, zmmB, m);
+ cc.evex().vfmadd213ps(xmmA, xmmB, m);
+ cc.evex().vfmadd213ps(ymmA, ymmB, m);
+ cc.evex().vfmadd213ps(zmmA, zmmB, m);
+ cc.evex().vfmadd213sd(xmmA, xmmB, m);
+ cc.evex().vfmadd213ss(xmmA, xmmB, m);
+ cc.evex().vfmadd231pd(xmmA, xmmB, m);
+ cc.evex().vfmadd231pd(ymmA, ymmB, m);
+ cc.evex().vfmadd231pd(zmmA, zmmB, m);
+ cc.evex().vfmadd231ps(xmmA, xmmB, m);
+ cc.evex().vfmadd231ps(ymmA, ymmB, m);
+ cc.evex().vfmadd231ps(zmmA, zmmB, m);
+ cc.evex().vfmadd231sd(xmmA, xmmB, m);
+ cc.evex().vfmadd231ss(xmmA, xmmB, m);
+ cc.evex().vfmaddsub132pd(xmmA, xmmB, m);
+ cc.evex().vfmaddsub132pd(ymmA, ymmB, m);
+ cc.evex().vfmaddsub132pd(zmmA, zmmB, m);
+ cc.evex().vfmaddsub132ps(xmmA, xmmB, m);
+ cc.evex().vfmaddsub132ps(ymmA, ymmB, m);
+ cc.evex().vfmaddsub132ps(zmmA, zmmB, m);
+ cc.evex().vfmaddsub213pd(xmmA, xmmB, m);
+ cc.evex().vfmaddsub213pd(ymmA, ymmB, m);
+ cc.evex().vfmaddsub213pd(zmmA, zmmB, m);
+ cc.evex().vfmaddsub213ps(xmmA, xmmB, m);
+ cc.evex().vfmaddsub213ps(ymmA, ymmB, m);
+ cc.evex().vfmaddsub213ps(zmmA, zmmB, m);
+ cc.evex().vfmaddsub231pd(xmmA, xmmB, m);
+ cc.evex().vfmaddsub231pd(ymmA, ymmB, m);
+ cc.evex().vfmaddsub231pd(zmmA, zmmB, m);
+ cc.evex().vfmaddsub231ps(xmmA, xmmB, m);
+ cc.evex().vfmaddsub231ps(ymmA, ymmB, m);
+ cc.evex().vfmaddsub231ps(zmmA, zmmB, m);
+ cc.evex().vfmsub132pd(xmmA, xmmB, m);
+ cc.evex().vfmsub132pd(ymmA, ymmB, m);
+ cc.evex().vfmsub132pd(zmmA, zmmB, m);
+ cc.evex().vfmsub132ps(xmmA, xmmB, m);
+ cc.evex().vfmsub132ps(ymmA, ymmB, m);
+ cc.evex().vfmsub132ps(zmmA, zmmB, m);
+ cc.evex().vfmsub132sd(xmmA, xmmB, m);
+ cc.evex().vfmsub132ss(xmmA, xmmB, m);
+ cc.evex().vfmsub213pd(xmmA, xmmB, m);
+ cc.evex().vfmsub213pd(ymmA, ymmB, m);
+ cc.evex().vfmsub213pd(zmmA, zmmB, m);
+ cc.evex().vfmsub213ps(xmmA, xmmB, m);
+ cc.evex().vfmsub213ps(ymmA, ymmB, m);
+ cc.evex().vfmsub213ps(zmmA, zmmB, m);
+ cc.evex().vfmsub213sd(xmmA, xmmB, m);
+ cc.evex().vfmsub213ss(xmmA, xmmB, m);
+ cc.evex().vfmsub231pd(xmmA, xmmB, m);
+ cc.evex().vfmsub231pd(ymmA, ymmB, m);
+ cc.evex().vfmsub231pd(zmmA, zmmB, m);
+ cc.evex().vfmsub231ps(xmmA, xmmB, m);
+ cc.evex().vfmsub231ps(ymmA, ymmB, m);
+ cc.evex().vfmsub231ps(zmmA, zmmB, m);
+ cc.evex().vfmsub231sd(xmmA, xmmB, m);
+ cc.evex().vfmsub231ss(xmmA, xmmB, m);
+ cc.evex().vfmsubadd132pd(xmmA, xmmB, m);
+ cc.evex().vfmsubadd132pd(ymmA, ymmB, m);
+ cc.evex().vfmsubadd132pd(zmmA, zmmB, m);
+ cc.evex().vfmsubadd132ps(xmmA, xmmB, m);
+ cc.evex().vfmsubadd132ps(ymmA, ymmB, m);
+ cc.evex().vfmsubadd132ps(zmmA, zmmB, m);
+ cc.evex().vfmsubadd213pd(xmmA, xmmB, m);
+ cc.evex().vfmsubadd213pd(ymmA, ymmB, m);
+ cc.evex().vfmsubadd213pd(zmmA, zmmB, m);
+ cc.evex().vfmsubadd213ps(xmmA, xmmB, m);
+ cc.evex().vfmsubadd213ps(ymmA, ymmB, m);
+ cc.evex().vfmsubadd213ps(zmmA, zmmB, m);
+ cc.evex().vfmsubadd231pd(xmmA, xmmB, m);
+ cc.evex().vfmsubadd231pd(ymmA, ymmB, m);
+ cc.evex().vfmsubadd231pd(zmmA, zmmB, m);
+ cc.evex().vfmsubadd231ps(xmmA, xmmB, m);
+ cc.evex().vfmsubadd231ps(ymmA, ymmB, m);
+ cc.evex().vfmsubadd231ps(zmmA, zmmB, m);
+ cc.evex().vfnmadd132pd(xmmA, xmmB, m);
+ cc.evex().vfnmadd132pd(ymmA, ymmB, m);
+ cc.evex().vfnmadd132pd(zmmA, zmmB, m);
+ cc.evex().vfnmadd132ps(xmmA, xmmB, m);
+ cc.evex().vfnmadd132ps(ymmA, ymmB, m);
+ cc.evex().vfnmadd132ps(zmmA, zmmB, m);
+ cc.evex().vfnmadd132sd(xmmA, xmmB, m);
+ cc.evex().vfnmadd132ss(xmmA, xmmB, m);
+ cc.evex().vfnmadd213pd(xmmA, xmmB, m);
+ cc.evex().vfnmadd213pd(ymmA, ymmB, m);
+ cc.evex().vfnmadd213pd(zmmA, zmmB, m);
+ cc.evex().vfnmadd213ps(xmmA, xmmB, m);
+ cc.evex().vfnmadd213ps(ymmA, ymmB, m);
+ cc.evex().vfnmadd213ps(zmmA, zmmB, m);
+ cc.evex().vfnmadd213sd(xmmA, xmmB, m);
+ cc.evex().vfnmadd213ss(xmmA, xmmB, m);
+ cc.evex().vfnmadd231pd(xmmA, xmmB, m);
+ cc.evex().vfnmadd231pd(ymmA, ymmB, m);
+ cc.evex().vfnmadd231pd(zmmA, zmmB, m);
+ cc.evex().vfnmadd231ps(xmmA, xmmB, m);
+ cc.evex().vfnmadd231ps(ymmA, ymmB, m);
+ cc.evex().vfnmadd231ps(zmmA, zmmB, m);
+ cc.evex().vfnmadd231sd(xmmA, xmmB, m);
+ cc.evex().vfnmadd231ss(xmmA, xmmB, m);
+ cc.evex().vfnmsub132pd(xmmA, xmmB, m);
+ cc.evex().vfnmsub132pd(ymmA, ymmB, m);
+ cc.evex().vfnmsub132pd(zmmA, zmmB, m);
+ cc.evex().vfnmsub132ps(xmmA, xmmB, m);
+ cc.evex().vfnmsub132ps(ymmA, ymmB, m);
+ cc.evex().vfnmsub132ps(zmmA, zmmB, m);
+ cc.evex().vfnmsub132sd(xmmA, xmmB, m);
+ cc.evex().vfnmsub132ss(xmmA, xmmB, m);
+ cc.evex().vfnmsub213pd(xmmA, xmmB, m);
+ cc.evex().vfnmsub213pd(ymmA, ymmB, m);
+ cc.evex().vfnmsub213pd(zmmA, zmmB, m);
+ cc.evex().vfnmsub213ps(xmmA, xmmB, m);
+ cc.evex().vfnmsub213ps(ymmA, ymmB, m);
+ cc.evex().vfnmsub213ps(zmmA, zmmB, m);
+ cc.evex().vfnmsub213sd(xmmA, xmmB, m);
+ cc.evex().vfnmsub213ss(xmmA, xmmB, m);
+ cc.evex().vfnmsub231pd(xmmA, xmmB, m);
+ cc.evex().vfnmsub231pd(ymmA, ymmB, m);
+ cc.evex().vfnmsub231pd(zmmA, zmmB, m);
+ cc.evex().vfnmsub231ps(xmmA, xmmB, m);
+ cc.evex().vfnmsub231ps(ymmA, ymmB, m);
+ cc.evex().vfnmsub231ps(zmmA, zmmB, m);
+ cc.evex().vfnmsub231sd(xmmA, xmmB, m);
+ cc.evex().vfnmsub231ss(xmmA, xmmB, m);
+ cc.evex().vfpclasspd(kA, m128, 0);
+ cc.evex().vfpclasspd(kA, m256, 0);
+ cc.evex().vfpclasspd(kA, m512, 0);
+ cc.evex().vfpclassps(kA, m128, 0);
+ cc.evex().vfpclassps(kA, m256, 0);
+ cc.evex().vfpclassps(kA, m512, 0);
+ cc.evex().vfpclasssd(kA, m, 0);
+ cc.evex().vfpclassss(kA, m, 0);
+ cc.evex().k(kA).vgatherdpd(xmmA, vx_ptr);
+ cc.evex().k(kA).vgatherdpd(ymmA, vx_ptr);
+ cc.evex().k(kA).vgatherdpd(zmmA, vy_ptr);
+ cc.evex().k(kA).vgatherdps(xmmA, vx_ptr);
+ cc.evex().k(kA).vgatherdps(ymmA, vy_ptr);
+ cc.evex().k(kA).vgatherdps(zmmA, vz_ptr);
+ cc.evex().k(kA).vgatherpf0dpd(vy_ptr);
+ cc.evex().k(kA).vgatherpf0dps(vz_ptr);
+ cc.evex().k(kA).vgatherpf0qpd(vz_ptr);
+ cc.evex().k(kA).vgatherpf0qps(vz_ptr);
+ cc.evex().k(kA).vgatherpf1dpd(vy_ptr);
+ cc.evex().k(kA).vgatherpf1dps(vz_ptr);
+ cc.evex().k(kA).vgatherpf1qpd(vz_ptr);
+ cc.evex().k(kA).vgatherpf1qps(vz_ptr);
+ cc.evex().k(kA).vgatherqpd(xmmA, vx_ptr);
+ cc.evex().k(kA).vgatherqpd(ymmA, vy_ptr);
+ cc.evex().k(kA).vgatherqpd(zmmA, vz_ptr);
+ cc.evex().k(kA).vgatherqps(xmmA, vx_ptr);
+ cc.evex().k(kA).vgatherqps(xmmA, vy_ptr);
+ cc.evex().k(kA).vgatherqps(ymmA, vz_ptr);
+ cc.evex().vgetexppd(xmmA, m);
+ cc.evex().vgetexppd(ymmA, m);
+ cc.evex().vgetexppd(zmmA, m);
+ cc.evex().vgetexpps(xmmA, m);
+ cc.evex().vgetexpps(ymmA, m);
+ cc.evex().vgetexpps(zmmA, m);
+ cc.evex().vgetexpsd(xmmA, xmmB, m);
+ cc.evex().vgetexpss(xmmA, xmmB, m);
+ cc.evex().vgetmantpd(xmmA, m, 0);
+ cc.evex().vgetmantpd(ymmA, m, 0);
+ cc.evex().vgetmantpd(zmmA, m, 0);
+ cc.evex().vgetmantps(xmmA, m, 0);
+ cc.evex().vgetmantps(ymmA, m, 0);
+ cc.evex().vgetmantps(zmmA, m, 0);
+ cc.evex().vgetmantsd(xmmA, xmmB, m, 0);
+ cc.evex().vgetmantss(xmmA, xmmB, m, 0);
+ cc.evex().vinsertf32x4(ymmA, ymmB, m, 0);
+ cc.evex().vinsertf32x4(zmmA, zmmB, m, 0);
+ cc.evex().vinsertf32x8(zmmA, zmmB, m, 0);
+ cc.evex().vinsertf64x2(ymmA, ymmB, m, 0);
+ cc.evex().vinsertf64x2(zmmA, zmmB, m, 0);
+ cc.evex().vinsertf64x4(zmmA, zmmB, m, 0);
+ cc.evex().vinserti32x4(ymmA, ymmB, m, 0);
+ cc.evex().vinserti32x4(zmmA, zmmB, m, 0);
+ cc.evex().vinserti32x8(zmmA, zmmB, m, 0);
+ cc.evex().vinserti64x2(ymmA, ymmB, m, 0);
+ cc.evex().vinserti64x2(zmmA, zmmB, m, 0);
+ cc.evex().vinserti64x4(zmmA, zmmB, m, 0);
+ cc.evex().vinsertps(xmmA, xmmB, m, 0);
+ cc.evex().vmaxpd(xmmA, xmmB, m);
+ cc.evex().vmaxpd(ymmA, ymmB, m);
+ cc.evex().vmaxpd(zmmA, zmmB, m);
+ cc.evex().vmaxps(xmmA, xmmB, m);
+ cc.evex().vmaxps(ymmA, ymmB, m);
+ cc.evex().vmaxps(zmmA, zmmB, m);
+ cc.evex().vmaxsd(xmmA, xmmB, m);
+ cc.evex().vmaxss(xmmA, xmmB, m);
+ cc.evex().vminpd(xmmA, xmmB, m);
+ cc.evex().vminpd(ymmA, ymmB, m);
+ cc.evex().vminpd(zmmA, zmmB, m);
+ cc.evex().vminps(xmmA, xmmB, m);
+ cc.evex().vminps(ymmA, ymmB, m);
+ cc.evex().vminps(zmmA, zmmB, m);
+ cc.evex().vminsd(xmmA, xmmB, m);
+ cc.evex().vminss(xmmA, xmmB, m);
+ cc.evex().vmovapd(xmmA, m);
+ cc.evex().vmovapd(m, xmmB);
+ cc.evex().vmovapd(ymmA, m);
+ cc.evex().vmovapd(m, ymmB);
+ cc.evex().vmovapd(zmmA, m);
+ cc.evex().vmovapd(m, zmmB);
+ cc.evex().vmovaps(xmmA, m);
+ cc.evex().vmovaps(m, xmmB);
+ cc.evex().vmovaps(ymmA, m);
+ cc.evex().vmovaps(m, ymmB);
+ cc.evex().vmovaps(zmmA, m);
+ cc.evex().vmovaps(m, zmmB);
+ cc.evex().vmovd(m, xmmB);
+ cc.evex().vmovd(xmmA, m);
+ cc.evex().vmovddup(xmmA, m);
+ cc.evex().vmovddup(ymmA, m);
+ cc.evex().vmovddup(zmmA, m);
+ cc.evex().vmovdqa32(xmmA, m);
+ cc.evex().vmovdqa32(m, xmmB);
+ cc.evex().vmovdqa32(ymmA, m);
+ cc.evex().vmovdqa32(m, ymmB);
+ cc.evex().vmovdqa32(zmmA, m);
+ cc.evex().vmovdqa32(m, zmmB);
+ cc.evex().vmovdqa64(xmmA, m);
+ cc.evex().vmovdqa64(m, xmmB);
+ cc.evex().vmovdqa64(ymmA, m);
+ cc.evex().vmovdqa64(m, ymmB);
+ cc.evex().vmovdqa64(zmmA, m);
+ cc.evex().vmovdqa64(m, zmmB);
+ cc.evex().vmovdqu16(xmmA, m);
+ cc.evex().vmovdqu16(m, xmmB);
+ cc.evex().vmovdqu16(ymmA, m);
+ cc.evex().vmovdqu16(m, ymmB);
+ cc.evex().vmovdqu16(zmmA, m);
+ cc.evex().vmovdqu16(m, zmmB);
+ cc.evex().vmovdqu32(xmmA, m);
+ cc.evex().vmovdqu32(m, xmmB);
+ cc.evex().vmovdqu32(ymmA, m);
+ cc.evex().vmovdqu32(m, ymmB);
+ cc.evex().vmovdqu32(zmmA, m);
+ cc.evex().vmovdqu32(m, zmmB);
+ cc.evex().vmovdqu64(xmmA, m);
+ cc.evex().vmovdqu64(m, xmmB);
+ cc.evex().vmovdqu64(ymmA, m);
+ cc.evex().vmovdqu64(m, ymmB);
+ cc.evex().vmovdqu64(zmmA, m);
+ cc.evex().vmovdqu64(m, zmmB);
+ cc.evex().vmovdqu8(xmmA, m);
+ cc.evex().vmovdqu8(m, xmmB);
+ cc.evex().vmovdqu8(ymmA, m);
+ cc.evex().vmovdqu8(m, ymmB);
+ cc.evex().vmovdqu8(zmmA, m);
+ cc.evex().vmovdqu8(m, zmmB);
+ cc.evex().vmovhpd(m, xmmB);
+ cc.evex().vmovhpd(xmmA, xmmB, m);
+ cc.evex().vmovhps(m, xmmB);
+ cc.evex().vmovhps(xmmA, xmmB, m);
+ cc.evex().vmovlpd(m, xmmB);
+ cc.evex().vmovlpd(xmmA, xmmB, m);
+ cc.evex().vmovlps(m, xmmB);
+ cc.evex().vmovlps(xmmA, xmmB, m);
+ cc.evex().vmovntdq(m, xmmB);
+ cc.evex().vmovntdq(m, ymmB);
+ cc.evex().vmovntdq(m, zmmB);
+ cc.evex().vmovntdqa(xmmA, m);
+ cc.evex().vmovntdqa(ymmA, m);
+ cc.evex().vmovntdqa(zmmA, m);
+ cc.evex().vmovntpd(m, xmmB);
+ cc.evex().vmovntpd(m, ymmB);
+ cc.evex().vmovntpd(m, zmmB);
+ cc.evex().vmovntps(m, xmmB);
+ cc.evex().vmovntps(m, ymmB);
+ cc.evex().vmovntps(m, zmmB);
+ cc.evex().vmovq(m, xmmB);
+ cc.evex().vmovq(xmmA, m);
+ cc.evex().vmovq(xmmA, m);
+ cc.evex().vmovq(m, xmmB);
+ cc.evex().vmovsd(m, xmmB);
+ cc.evex().vmovsd(xmmA, m);
+ cc.evex().vmovshdup(xmmA, m);
+ cc.evex().vmovshdup(ymmA, m);
+ cc.evex().vmovshdup(zmmA, m);
+ cc.evex().vmovsldup(xmmA, m);
+ cc.evex().vmovsldup(ymmA, m);
+ cc.evex().vmovsldup(zmmA, m);
+ cc.evex().vmovss(m, xmmB);
+ cc.evex().vmovss(xmmA, m);
+ cc.evex().vmovupd(xmmA, m);
+ cc.evex().vmovupd(m, xmmB);
+ cc.evex().vmovupd(ymmA, m);
+ cc.evex().vmovupd(m, ymmB);
+ cc.evex().vmovupd(zmmA, m);
+ cc.evex().vmovupd(m, zmmB);
+ cc.evex().vmovups(xmmA, m);
+ cc.evex().vmovups(m, xmmB);
+ cc.evex().vmovups(ymmA, m);
+ cc.evex().vmovups(m, ymmB);
+ cc.evex().vmovups(zmmA, m);
+ cc.evex().vmovups(m, zmmB);
+ cc.evex().vmulpd(xmmA, xmmB, m);
+ cc.evex().vmulpd(ymmA, ymmB, m);
+ cc.evex().vmulpd(zmmA, zmmB, m);
+ cc.evex().vmulps(xmmA, xmmB, m);
+ cc.evex().vmulps(ymmA, ymmB, m);
+ cc.evex().vmulps(zmmA, zmmB, m);
+ cc.evex().vmulsd(xmmA, xmmB, m);
+ cc.evex().vmulss(xmmA, xmmB, m);
+ cc.evex().vorpd(xmmA, xmmB, m);
+ cc.evex().vorpd(ymmA, ymmB, m);
+ cc.evex().vorpd(zmmA, zmmB, m);
+ cc.evex().vorps(xmmA, xmmB, m);
+ cc.evex().vorps(ymmA, ymmB, m);
+ cc.evex().vorps(zmmA, zmmB, m);
+ cc.evex().vpabsb(xmmA, m);
+ cc.evex().vpabsb(ymmA, m);
+ cc.evex().vpabsb(zmmA, m);
+ cc.evex().vpabsd(xmmA, m);
+ cc.evex().vpabsd(ymmA, m);
+ cc.evex().vpabsd(zmmA, m);
+ cc.evex().vpabsq(xmmA, m);
+ cc.evex().vpabsq(ymmA, m);
+ cc.evex().vpabsq(zmmA, m);
+ cc.evex().vpabsw(xmmA, m);
+ cc.evex().vpabsw(ymmA, m);
+ cc.evex().vpabsw(zmmA, m);
+ cc.evex().vpackssdw(xmmA, xmmB, m);
+ cc.evex().vpackssdw(ymmA, ymmB, m);
+ cc.evex().vpackssdw(zmmA, zmmB, m);
+ cc.evex().vpacksswb(xmmA, xmmB, m);
+ cc.evex().vpacksswb(ymmA, ymmB, m);
+ cc.evex().vpacksswb(zmmA, zmmB, m);
+ cc.evex().vpackusdw(xmmA, xmmB, m);
+ cc.evex().vpackusdw(ymmA, ymmB, m);
+ cc.evex().vpackusdw(zmmA, zmmB, m);
+ cc.evex().vpackuswb(xmmA, xmmB, m);
+ cc.evex().vpackuswb(ymmA, ymmB, m);
+ cc.evex().vpackuswb(zmmA, zmmB, m);
+ cc.evex().vpaddb(xmmA, xmmB, m);
+ cc.evex().vpaddb(ymmA, ymmB, m);
+ cc.evex().vpaddb(zmmA, zmmB, m);
+ cc.evex().vpaddd(xmmA, xmmB, m);
+ cc.evex().vpaddd(ymmA, ymmB, m);
+ cc.evex().vpaddd(zmmA, zmmB, m);
+ cc.evex().vpaddq(xmmA, xmmB, m);
+ cc.evex().vpaddq(ymmA, ymmB, m);
+ cc.evex().vpaddq(zmmA, zmmB, m);
+ cc.evex().vpaddsb(xmmA, xmmB, m);
+ cc.evex().vpaddsb(ymmA, ymmB, m);
+ cc.evex().vpaddsb(zmmA, zmmB, m);
+ cc.evex().vpaddsw(xmmA, xmmB, m);
+ cc.evex().vpaddsw(ymmA, ymmB, m);
+ cc.evex().vpaddsw(zmmA, zmmB, m);
+ cc.evex().vpaddusb(xmmA, xmmB, m);
+ cc.evex().vpaddusb(ymmA, ymmB, m);
+ cc.evex().vpaddusb(zmmA, zmmB, m);
+ cc.evex().vpaddusw(xmmA, xmmB, m);
+ cc.evex().vpaddusw(ymmA, ymmB, m);
+ cc.evex().vpaddusw(zmmA, zmmB, m);
+ cc.evex().vpaddw(xmmA, xmmB, m);
+ cc.evex().vpaddw(ymmA, ymmB, m);
+ cc.evex().vpaddw(zmmA, zmmB, m);
+ cc.evex().vpalignr(xmmA, xmmB, m, 0);
+ cc.evex().vpalignr(ymmA, ymmB, m, 0);
+ cc.evex().vpalignr(zmmA, zmmB, m, 0);
+ cc.evex().vpandd(xmmA, xmmB, m);
+ cc.evex().vpandd(ymmA, ymmB, m);
+ cc.evex().vpandd(zmmA, zmmB, m);
+ cc.evex().vpandnd(xmmA, xmmB, m);
+ cc.evex().vpandnd(ymmA, ymmB, m);
+ cc.evex().vpandnd(zmmA, zmmB, m);
+ cc.evex().vpandnq(xmmA, xmmB, m);
+ cc.evex().vpandnq(ymmA, ymmB, m);
+ cc.evex().vpandnq(zmmA, zmmB, m);
+ cc.evex().vpandq(xmmA, xmmB, m);
+ cc.evex().vpandq(ymmA, ymmB, m);
+ cc.evex().vpandq(zmmA, zmmB, m);
+ cc.evex().vpavgb(xmmA, xmmB, m);
+ cc.evex().vpavgb(ymmA, ymmB, m);
+ cc.evex().vpavgb(zmmA, zmmB, m);
+ cc.evex().vpavgw(xmmA, xmmB, m);
+ cc.evex().vpavgw(ymmA, ymmB, m);
+ cc.evex().vpavgw(zmmA, zmmB, m);
+ cc.evex().vpblendmb(xmmA, xmmB, m);
+ cc.evex().vpblendmb(ymmA, ymmB, m);
+ cc.evex().vpblendmb(zmmA, zmmB, m);
+ cc.evex().vpblendmd(xmmA, xmmB, m);
+ cc.evex().vpblendmd(ymmA, ymmB, m);
+ cc.evex().vpblendmd(zmmA, zmmB, m);
+ cc.evex().vpblendmq(xmmA, xmmB, m);
+ cc.evex().vpblendmq(ymmA, ymmB, m);
+ cc.evex().vpblendmq(zmmA, zmmB, m);
+ cc.evex().vpblendmw(xmmA, xmmB, m);
+ cc.evex().vpblendmw(ymmA, ymmB, m);
+ cc.evex().vpblendmw(zmmA, zmmB, m);
+ cc.evex().vpbroadcastb(xmmA, m);
+ cc.evex().vpbroadcastb(ymmA, m);
+ cc.evex().vpbroadcastb(zmmA, m);
+ cc.evex().vpbroadcastd(xmmA, m);
+ cc.evex().vpbroadcastd(ymmA, m);
+ cc.evex().vpbroadcastd(zmmA, m);
+ cc.evex().vpbroadcastq(xmmA, m);
+ cc.evex().vpbroadcastq(ymmA, m);
+ cc.evex().vpbroadcastq(zmmA, m);
+ cc.evex().vpbroadcastw(xmmA, m);
+ cc.evex().vpbroadcastw(ymmA, m);
+ cc.evex().vpbroadcastw(zmmA, m);
+ cc.evex().vpcmpb(kA, xmmB, m, 0);
+ cc.evex().vpcmpb(kA, ymmB, m, 0);
+ cc.evex().vpcmpb(kA, zmmB, m, 0);
+ cc.evex().vpcmpd(kA, xmmB, m, 0);
+ cc.evex().vpcmpd(kA, ymmB, m, 0);
+ cc.evex().vpcmpd(kA, zmmB, m, 0);
+ cc.evex().vpcmpeqb(kA, xmmB, m);
+ cc.evex().vpcmpeqb(kA, ymmB, m);
+ cc.evex().vpcmpeqb(kA, zmmB, m);
+ cc.evex().vpcmpeqd(kA, xmmB, m);
+ cc.evex().vpcmpeqd(kA, ymmB, m);
+ cc.evex().vpcmpeqd(kA, zmmB, m);
+ cc.evex().vpcmpeqq(kA, xmmB, m);
+ cc.evex().vpcmpeqq(kA, ymmB, m);
+ cc.evex().vpcmpeqq(kA, zmmB, m);
+ cc.evex().vpcmpeqw(kA, xmmB, m);
+ cc.evex().vpcmpeqw(kA, ymmB, m);
+ cc.evex().vpcmpeqw(kA, zmmB, m);
+ cc.evex().vpcmpgtb(kA, xmmB, m);
+ cc.evex().vpcmpgtb(kA, ymmB, m);
+ cc.evex().vpcmpgtb(kA, zmmB, m);
+ cc.evex().vpcmpgtd(kA, xmmB, m);
+ cc.evex().vpcmpgtd(kA, ymmB, m);
+ cc.evex().vpcmpgtd(kA, zmmB, m);
+ cc.evex().vpcmpgtq(kA, xmmB, m);
+ cc.evex().vpcmpgtq(kA, ymmB, m);
+ cc.evex().vpcmpgtq(kA, zmmB, m);
+ cc.evex().vpcmpgtw(kA, xmmB, m);
+ cc.evex().vpcmpgtw(kA, ymmB, m);
+ cc.evex().vpcmpgtw(kA, zmmB, m);
+ cc.evex().vpcmpq(kA, xmmB, m, 0);
+ cc.evex().vpcmpq(kA, ymmB, m, 0);
+ cc.evex().vpcmpq(kA, zmmB, m, 0);
+ cc.evex().vpcmpub(kA, xmmB, m, 0);
+ cc.evex().vpcmpub(kA, ymmB, m, 0);
+ cc.evex().vpcmpub(kA, zmmB, m, 0);
+ cc.evex().vpcmpud(kA, xmmB, m, 0);
+ cc.evex().vpcmpud(kA, ymmB, m, 0);
+ cc.evex().vpcmpud(kA, zmmB, m, 0);
+ cc.evex().vpcmpuq(kA, xmmB, m, 0);
+ cc.evex().vpcmpuq(kA, ymmB, m, 0);
+ cc.evex().vpcmpuq(kA, zmmB, m, 0);
+ cc.evex().vpcmpuw(kA, xmmB, m, 0);
+ cc.evex().vpcmpuw(kA, ymmB, m, 0);
+ cc.evex().vpcmpuw(kA, zmmB, m, 0);
+ cc.evex().vpcmpw(kA, xmmB, m, 0);
+ cc.evex().vpcmpw(kA, ymmB, m, 0);
+ cc.evex().vpcmpw(kA, zmmB, m, 0);
+ cc.evex().vpcompressd(m, xmmB);
+ cc.evex().vpcompressd(m, ymmB);
+ cc.evex().vpcompressd(m, zmmB);
+ cc.evex().vpcompressq(m, xmmB);
+ cc.evex().vpcompressq(m, ymmB);
+ cc.evex().vpcompressq(m, zmmB);
+ cc.evex().vpconflictd(xmmA, m);
+ cc.evex().vpconflictd(ymmA, m);
+ cc.evex().vpconflictd(zmmA, m);
+ cc.evex().vpconflictq(xmmA, m);
+ cc.evex().vpconflictq(ymmA, m);
+ cc.evex().vpconflictq(zmmA, m);
+ cc.evex().vpermb(xmmA, xmmB, m);
+ cc.evex().vpermb(ymmA, ymmB, m);
+ cc.evex().vpermb(zmmA, zmmB, m);
+ cc.evex().vpermd(ymmA, ymmB, m);
+ cc.evex().vpermd(zmmA, zmmB, m);
+ cc.evex().vpermi2b(xmmA, xmmB, m);
+ cc.evex().vpermi2b(ymmA, ymmB, m);
+ cc.evex().vpermi2b(zmmA, zmmB, m);
+ cc.evex().vpermi2d(xmmA, xmmB, m);
+ cc.evex().vpermi2d(ymmA, ymmB, m);
+ cc.evex().vpermi2d(zmmA, zmmB, m);
+ cc.evex().vpermi2pd(xmmA, xmmB, m);
+ cc.evex().vpermi2pd(ymmA, ymmB, m);
+ cc.evex().vpermi2pd(zmmA, zmmB, m);
+ cc.evex().vpermi2ps(xmmA, xmmB, m);
+ cc.evex().vpermi2ps(ymmA, ymmB, m);
+ cc.evex().vpermi2ps(zmmA, zmmB, m);
+ cc.evex().vpermi2q(xmmA, xmmB, m);
+ cc.evex().vpermi2q(ymmA, ymmB, m);
+ cc.evex().vpermi2q(zmmA, zmmB, m);
+ cc.evex().vpermi2w(xmmA, xmmB, m);
+ cc.evex().vpermi2w(ymmA, ymmB, m);
+ cc.evex().vpermi2w(zmmA, zmmB, m);
+ cc.evex().vpermilpd(xmmA, xmmB, m);
+ cc.evex().vpermilpd(ymmA, ymmB, m);
+ cc.evex().vpermilpd(zmmA, zmmB, m);
+ cc.evex().vpermilpd(xmmA, m, 0);
+ cc.evex().vpermilpd(ymmA, m, 0);
+ cc.evex().vpermilpd(zmmA, m, 0);
+ cc.evex().vpermilps(xmmA, xmmB, m);
+ cc.evex().vpermilps(ymmA, ymmB, m);
+ cc.evex().vpermilps(zmmA, zmmB, m);
+ cc.evex().vpermilps(xmmA, m, 0);
+ cc.evex().vpermilps(ymmA, m, 0);
+ cc.evex().vpermilps(zmmA, m, 0);
+ cc.evex().vpermq(ymmA, ymmB, m);
+ cc.evex().vpermq(zmmA, zmmB, m);
+ cc.evex().vpermq(ymmA, m, 0);
+ cc.evex().vpermq(zmmA, m, 0);
+ cc.evex().vpermt2b(xmmA, xmmB, m);
+ cc.evex().vpermt2b(ymmA, ymmB, m);
+ cc.evex().vpermt2b(zmmA, zmmB, m);
+ cc.evex().vpermt2d(xmmA, xmmB, m);
+ cc.evex().vpermt2d(ymmA, ymmB, m);
+ cc.evex().vpermt2d(zmmA, zmmB, m);
+ cc.evex().vpermt2pd(xmmA, xmmB, m);
+ cc.evex().vpermt2pd(ymmA, ymmB, m);
+ cc.evex().vpermt2pd(zmmA, zmmB, m);
+ cc.evex().vpermt2ps(xmmA, xmmB, m);
+ cc.evex().vpermt2ps(ymmA, ymmB, m);
+ cc.evex().vpermt2ps(zmmA, zmmB, m);
+ cc.evex().vpermt2q(xmmA, xmmB, m);
+ cc.evex().vpermt2q(ymmA, ymmB, m);
+ cc.evex().vpermt2q(zmmA, zmmB, m);
+ cc.evex().vpermt2w(xmmA, xmmB, m);
+ cc.evex().vpermt2w(ymmA, ymmB, m);
+ cc.evex().vpermt2w(zmmA, zmmB, m);
+ cc.evex().vpermw(xmmA, xmmB, m);
+ cc.evex().vpermw(ymmA, ymmB, m);
+ cc.evex().vpermw(zmmA, zmmB, m);
+ cc.evex().vpexpandd(xmmA, m);
+ cc.evex().vpexpandd(ymmA, m);
+ cc.evex().vpexpandd(zmmA, m);
+ cc.evex().vpexpandq(xmmA, m);
+ cc.evex().vpexpandq(ymmA, m);
+ cc.evex().vpexpandq(zmmA, m);
+ cc.evex().vpextrb(m, xmmB, 0);
+ cc.evex().vpextrd(m, xmmB, 0);
+ if (cc.is64Bit()) cc.evex().vpextrq(m, xmmB, 0);
+ cc.evex().vpextrw(m, xmmB, 0);
+ cc.evex().k(kA).vpgatherdd(xmmA, vx_ptr);
+ cc.evex().k(kA).vpgatherdd(ymmA, vy_ptr);
+ cc.evex().k(kA).vpgatherdd(zmmA, vz_ptr);
+ cc.evex().k(kA).vpgatherdq(xmmA, vx_ptr);
+ cc.evex().k(kA).vpgatherdq(ymmA, vx_ptr);
+ cc.evex().k(kA).vpgatherdq(zmmA, vy_ptr);
+ cc.evex().k(kA).vpgatherqd(xmmA, vx_ptr);
+ cc.evex().k(kA).vpgatherqd(xmmA, vy_ptr);
+ cc.evex().k(kA).vpgatherqd(ymmA, vz_ptr);
+ cc.evex().k(kA).vpgatherqq(xmmA, vx_ptr);
+ cc.evex().k(kA).vpgatherqq(ymmA, vy_ptr);
+ cc.evex().k(kA).vpgatherqq(zmmA, vz_ptr);
+ cc.evex().vpinsrb(xmmA, xmmB, m, 0);
+ cc.evex().vpinsrd(xmmA, xmmB, m, 0);
+ if (cc.is64Bit()) cc.evex().vpinsrq(xmmA, xmmB, m, 0);
+ cc.evex().vpinsrw(xmmA, xmmB, m, 0);
+ cc.evex().vplzcntd(xmmA, m);
+ cc.evex().vplzcntd(ymmA, m);
+ cc.evex().vplzcntd(zmmA, m);
+ cc.evex().vplzcntq(xmmA, m);
+ cc.evex().vplzcntq(ymmA, m);
+ cc.evex().vplzcntq(zmmA, m);
+ cc.evex().vpmadd52huq(xmmA, xmmB, m);
+ cc.evex().vpmadd52huq(ymmA, ymmB, m);
+ cc.evex().vpmadd52huq(zmmA, zmmB, m);
+ cc.evex().vpmadd52luq(xmmA, xmmB, m);
+ cc.evex().vpmadd52luq(ymmA, ymmB, m);
+ cc.evex().vpmadd52luq(zmmA, zmmB, m);
+ cc.evex().vpmaddubsw(xmmA, xmmB, m);
+ cc.evex().vpmaddubsw(ymmA, ymmB, m);
+ cc.evex().vpmaddubsw(zmmA, zmmB, m);
+ cc.evex().vpmaddwd(xmmA, xmmB, m);
+ cc.evex().vpmaddwd(ymmA, ymmB, m);
+ cc.evex().vpmaddwd(zmmA, zmmB, m);
+ cc.evex().vpmaxsb(xmmA, xmmB, m);
+ cc.evex().vpmaxsb(ymmA, ymmB, m);
+ cc.evex().vpmaxsb(zmmA, zmmB, m);
+ cc.evex().vpmaxsd(xmmA, xmmB, m);
+ cc.evex().vpmaxsd(ymmA, ymmB, m);
+ cc.evex().vpmaxsd(zmmA, zmmB, m);
+ cc.evex().vpmaxsq(xmmA, xmmB, m);
+ cc.evex().vpmaxsq(ymmA, ymmB, m);
+ cc.evex().vpmaxsq(zmmA, zmmB, m);
+ cc.evex().vpmaxsw(xmmA, xmmB, m);
+ cc.evex().vpmaxsw(ymmA, ymmB, m);
+ cc.evex().vpmaxsw(zmmA, zmmB, m);
+ cc.evex().vpmaxub(xmmA, xmmB, m);
+ cc.evex().vpmaxub(ymmA, ymmB, m);
+ cc.evex().vpmaxub(zmmA, zmmB, m);
+ cc.evex().vpmaxud(xmmA, xmmB, m);
+ cc.evex().vpmaxud(ymmA, ymmB, m);
+ cc.evex().vpmaxud(zmmA, zmmB, m);
+ cc.evex().vpmaxuq(xmmA, xmmB, m);
+ cc.evex().vpmaxuq(ymmA, ymmB, m);
+ cc.evex().vpmaxuq(zmmA, zmmB, m);
+ cc.evex().vpmaxuw(xmmA, xmmB, m);
+ cc.evex().vpmaxuw(ymmA, ymmB, m);
+ cc.evex().vpmaxuw(zmmA, zmmB, m);
+ cc.evex().vpminsb(xmmA, xmmB, m);
+ cc.evex().vpminsb(ymmA, ymmB, m);
+ cc.evex().vpminsb(zmmA, zmmB, m);
+ cc.evex().vpminsd(xmmA, xmmB, m);
+ cc.evex().vpminsd(ymmA, ymmB, m);
+ cc.evex().vpminsd(zmmA, zmmB, m);
+ cc.evex().vpminsq(xmmA, xmmB, m);
+ cc.evex().vpminsq(ymmA, ymmB, m);
+ cc.evex().vpminsq(zmmA, zmmB, m);
+ cc.evex().vpminsw(xmmA, xmmB, m);
+ cc.evex().vpminsw(ymmA, ymmB, m);
+ cc.evex().vpminsw(zmmA, zmmB, m);
+ cc.evex().vpminub(xmmA, xmmB, m);
+ cc.evex().vpminub(ymmA, ymmB, m);
+ cc.evex().vpminub(zmmA, zmmB, m);
+ cc.evex().vpminud(xmmA, xmmB, m);
+ cc.evex().vpminud(ymmA, ymmB, m);
+ cc.evex().vpminud(zmmA, zmmB, m);
+ cc.evex().vpminuq(xmmA, xmmB, m);
+ cc.evex().vpminuq(ymmA, ymmB, m);
+ cc.evex().vpminuq(zmmA, zmmB, m);
+ cc.evex().vpminuw(xmmA, xmmB, m);
+ cc.evex().vpminuw(ymmA, ymmB, m);
+ cc.evex().vpminuw(zmmA, zmmB, m);
+ cc.evex().vpmovdb(m, xmmB);
+ cc.evex().vpmovdb(m, ymmB);
+ cc.evex().vpmovdb(m, zmmB);
+ cc.evex().vpmovdw(m, xmmB);
+ cc.evex().vpmovdw(m, ymmB);
+ cc.evex().vpmovdw(m, zmmB);
+ cc.evex().vpmovqb(m, xmmB);
+ cc.evex().vpmovqb(m, ymmB);
+ cc.evex().vpmovqb(m, zmmB);
+ cc.evex().vpmovqd(m, xmmB);
+ cc.evex().vpmovqd(m, ymmB);
+ cc.evex().vpmovqd(m, zmmB);
+ cc.evex().vpmovqw(m, xmmB);
+ cc.evex().vpmovqw(m, ymmB);
+ cc.evex().vpmovqw(m, zmmB);
+ cc.evex().vpmovsdb(m, xmmB);
+ cc.evex().vpmovsdb(m, ymmB);
+ cc.evex().vpmovsdb(m, zmmB);
+ cc.evex().vpmovsdw(m, xmmB);
+ cc.evex().vpmovsdw(m, ymmB);
+ cc.evex().vpmovsdw(m, zmmB);
+ cc.evex().vpmovsqb(m, xmmB);
+ cc.evex().vpmovsqb(m, ymmB);
+ cc.evex().vpmovsqb(m, zmmB);
+ cc.evex().vpmovsqd(m, xmmB);
+ cc.evex().vpmovsqd(m, ymmB);
+ cc.evex().vpmovsqd(m, zmmB);
+ cc.evex().vpmovsqw(m, xmmB);
+ cc.evex().vpmovsqw(m, ymmB);
+ cc.evex().vpmovsqw(m, zmmB);
+ cc.evex().vpmovswb(m, xmmB);
+ cc.evex().vpmovswb(m, ymmB);
+ cc.evex().vpmovswb(m, zmmB);
+ cc.evex().vpmovsxbd(xmmA, m);
+ cc.evex().vpmovsxbd(ymmA, m);
+ cc.evex().vpmovsxbd(zmmA, m);
+ cc.evex().vpmovsxbq(xmmA, m);
+ cc.evex().vpmovsxbq(ymmA, m);
+ cc.evex().vpmovsxbq(zmmA, m);
+ cc.evex().vpmovsxbw(xmmA, m);
+ cc.evex().vpmovsxbw(ymmA, m);
+ cc.evex().vpmovsxbw(zmmA, m);
+ cc.evex().vpmovsxdq(xmmA, m);
+ cc.evex().vpmovsxdq(ymmA, m);
+ cc.evex().vpmovsxdq(zmmA, m);
+ cc.evex().vpmovsxwd(xmmA, m);
+ cc.evex().vpmovsxwd(ymmA, m);
+ cc.evex().vpmovsxwd(zmmA, m);
+ cc.evex().vpmovsxwq(xmmA, m);
+ cc.evex().vpmovsxwq(ymmA, m);
+ cc.evex().vpmovsxwq(zmmA, m);
+ cc.evex().vpmovusdb(m, xmmB);
+ cc.evex().vpmovusdb(m, ymmB);
+ cc.evex().vpmovusdb(m, zmmB);
+ cc.evex().vpmovusdw(m, xmmB);
+ cc.evex().vpmovusdw(m, ymmB);
+ cc.evex().vpmovusdw(m, zmmB);
+ cc.evex().vpmovusqb(m, xmmB);
+ cc.evex().vpmovusqb(m, ymmB);
+ cc.evex().vpmovusqb(m, zmmB);
+ cc.evex().vpmovusqd(m, xmmB);
+ cc.evex().vpmovusqd(m, ymmB);
+ cc.evex().vpmovusqd(m, zmmB);
+ cc.evex().vpmovusqw(m, xmmB);
+ cc.evex().vpmovusqw(m, ymmB);
+ cc.evex().vpmovusqw(m, zmmB);
+ cc.evex().vpmovuswb(m, xmmB);
+ cc.evex().vpmovuswb(m, ymmB);
+ cc.evex().vpmovuswb(m, zmmB);
+ cc.evex().vpmovwb(m, xmmB);
+ cc.evex().vpmovwb(m, ymmB);
+ cc.evex().vpmovwb(m, zmmB);
+ cc.evex().vpmovzxbd(xmmA, m);
+ cc.evex().vpmovzxbd(ymmA, m);
+ cc.evex().vpmovzxbd(zmmA, m);
+ cc.evex().vpmovzxbq(xmmA, m);
+ cc.evex().vpmovzxbq(ymmA, m);
+ cc.evex().vpmovzxbq(zmmA, m);
+ cc.evex().vpmovzxbw(xmmA, m);
+ cc.evex().vpmovzxbw(ymmA, m);
+ cc.evex().vpmovzxbw(zmmA, m);
+ cc.evex().vpmovzxdq(xmmA, m);
+ cc.evex().vpmovzxdq(ymmA, m);
+ cc.evex().vpmovzxdq(zmmA, m);
+ cc.evex().vpmovzxwd(xmmA, m);
+ cc.evex().vpmovzxwd(ymmA, m);
+ cc.evex().vpmovzxwd(zmmA, m);
+ cc.evex().vpmovzxwq(xmmA, m);
+ cc.evex().vpmovzxwq(ymmA, m);
+ cc.evex().vpmovzxwq(zmmA, m);
+ cc.evex().vpmuldq(xmmA, xmmB, m);
+ cc.evex().vpmuldq(ymmA, ymmB, m);
+ cc.evex().vpmuldq(zmmA, zmmB, m);
+ cc.evex().vpmulhrsw(xmmA, xmmB, m);
+ cc.evex().vpmulhrsw(ymmA, ymmB, m);
+ cc.evex().vpmulhrsw(zmmA, zmmB, m);
+ cc.evex().vpmulhuw(xmmA, xmmB, m);
+ cc.evex().vpmulhuw(ymmA, ymmB, m);
+ cc.evex().vpmulhuw(zmmA, zmmB, m);
+ cc.evex().vpmulhw(xmmA, xmmB, m);
+ cc.evex().vpmulhw(ymmA, ymmB, m);
+ cc.evex().vpmulhw(zmmA, zmmB, m);
+ cc.evex().vpmulld(xmmA, xmmB, m);
+ cc.evex().vpmulld(ymmA, ymmB, m);
+ cc.evex().vpmulld(zmmA, zmmB, m);
+ cc.evex().vpmullq(xmmA, xmmB, m);
+ cc.evex().vpmullq(ymmA, ymmB, m);
+ cc.evex().vpmullq(zmmA, zmmB, m);
+ cc.evex().vpmullw(xmmA, xmmB, m);
+ cc.evex().vpmullw(ymmA, ymmB, m);
+ cc.evex().vpmullw(zmmA, zmmB, m);
+ cc.evex().vpmultishiftqb(xmmA, xmmB, m);
+ cc.evex().vpmultishiftqb(ymmA, ymmB, m);
+ cc.evex().vpmultishiftqb(zmmA, zmmB, m);
+ cc.evex().vpmuludq(xmmA, xmmB, m);
+ cc.evex().vpmuludq(ymmA, ymmB, m);
+ cc.evex().vpmuludq(zmmA, zmmB, m);
+ cc.evex().vpopcntd(zmmA, m);
+ cc.evex().vpopcntq(zmmA, m);
+ cc.evex().vpord(xmmA, xmmB, m);
+ cc.evex().vpord(ymmA, ymmB, m);
+ cc.evex().vpord(zmmA, zmmB, m);
+ cc.evex().vporq(xmmA, xmmB, m);
+ cc.evex().vporq(ymmA, ymmB, m);
+ cc.evex().vporq(zmmA, zmmB, m);
+ cc.evex().vprold(xmmA, m, 0);
+ cc.evex().vprold(ymmA, m, 0);
+ cc.evex().vprold(zmmA, m, 0);
+ cc.evex().vprolq(xmmA, m, 0);
+ cc.evex().vprolq(ymmA, m, 0);
+ cc.evex().vprolq(zmmA, m, 0);
+ cc.evex().vprolvd(xmmA, xmmB, m);
+ cc.evex().vprolvd(ymmA, ymmB, m);
+ cc.evex().vprolvd(zmmA, zmmB, m);
+ cc.evex().vprolvq(xmmA, xmmB, m);
+ cc.evex().vprolvq(ymmA, ymmB, m);
+ cc.evex().vprolvq(zmmA, zmmB, m);
+ cc.evex().vprord(xmmA, m, 0);
+ cc.evex().vprord(ymmA, m, 0);
+ cc.evex().vprord(zmmA, m, 0);
+ cc.evex().vprorq(xmmA, m, 0);
+ cc.evex().vprorq(ymmA, m, 0);
+ cc.evex().vprorq(zmmA, m, 0);
+ cc.evex().vprorvd(xmmA, xmmB, m);
+ cc.evex().vprorvd(ymmA, ymmB, m);
+ cc.evex().vprorvd(zmmA, zmmB, m);
+ cc.evex().vprorvq(xmmA, xmmB, m);
+ cc.evex().vprorvq(ymmA, ymmB, m);
+ cc.evex().vprorvq(zmmA, zmmB, m);
+ cc.evex().vpsadbw(xmmA, xmmB, m);
+ cc.evex().vpsadbw(ymmA, ymmB, m);
+ cc.evex().vpsadbw(zmmA, zmmB, m);
+ cc.evex().k(kA).vpscatterdd(vx_ptr, xmmB);
+ cc.evex().k(kA).vpscatterdd(vy_ptr, ymmB);
+ cc.evex().k(kA).vpscatterdd(vz_ptr, zmmB);
+ cc.evex().k(kA).vpscatterdq(vx_ptr, xmmB);
+ cc.evex().k(kA).vpscatterdq(vx_ptr, ymmB);
+ cc.evex().k(kA).vpscatterdq(vy_ptr, zmmB);
+ cc.evex().k(kA).vpscatterqd(vx_ptr, xmmB);
+ cc.evex().k(kA).vpscatterqd(vy_ptr, xmmB);
+ cc.evex().k(kA).vpscatterqd(vz_ptr, ymmB);
+ cc.evex().k(kA).vpscatterqq(vx_ptr, xmmB);
+ cc.evex().k(kA).vpscatterqq(vy_ptr, ymmB);
+ cc.evex().k(kA).vpscatterqq(vz_ptr, zmmB);
+ cc.evex().vpshufb(xmmA, xmmB, m);
+ cc.evex().vpshufb(ymmA, ymmB, m);
+ cc.evex().vpshufb(zmmA, zmmB, m);
+ cc.evex().vpshufd(xmmA, m, 0);
+ cc.evex().vpshufd(ymmA, m, 0);
+ cc.evex().vpshufd(zmmA, m, 0);
+ cc.evex().vpshufhw(xmmA, m, 0);
+ cc.evex().vpshufhw(ymmA, m, 0);
+ cc.evex().vpshufhw(zmmA, m, 0);
+ cc.evex().vpshuflw(xmmA, m, 0);
+ cc.evex().vpshuflw(ymmA, m, 0);
+ cc.evex().vpshuflw(zmmA, m, 0);
+ cc.evex().vpslld(xmmA, xmmB, m);
+ cc.evex().vpslld(xmmA, m, 0);
+ cc.evex().vpslld(ymmA, ymmB, m);
+ cc.evex().vpslld(ymmA, m, 0);
+ cc.evex().vpslld(zmmA, zmmB, m);
+ cc.evex().vpslld(zmmA, m, 0);
+ cc.evex().vpslldq(xmmA, m, 0);
+ cc.evex().vpslldq(ymmA, m, 0);
+ cc.evex().vpslldq(zmmA, m, 0);
+ cc.evex().vpsllq(xmmA, xmmB, m);
+ cc.evex().vpsllq(xmmA, m, 0);
+ cc.evex().vpsllq(ymmA, ymmB, m);
+ cc.evex().vpsllq(ymmA, m, 0);
+ cc.evex().vpsllq(zmmA, zmmB, m);
+ cc.evex().vpsllq(zmmA, m, 0);
+ cc.evex().vpsllvd(xmmA, xmmB, m);
+ cc.evex().vpsllvd(ymmA, ymmB, m);
+ cc.evex().vpsllvd(zmmA, zmmB, m);
+ cc.evex().vpsllvq(xmmA, xmmB, m);
+ cc.evex().vpsllvq(ymmA, ymmB, m);
+ cc.evex().vpsllvq(zmmA, zmmB, m);
+ cc.evex().vpsllvw(xmmA, xmmB, m);
+ cc.evex().vpsllvw(ymmA, ymmB, m);
+ cc.evex().vpsllvw(zmmA, zmmB, m);
+ cc.evex().vpsllw(xmmA, xmmB, m);
+ cc.evex().vpsllw(xmmA, m, 0);
+ cc.evex().vpsllw(ymmA, ymmB, m);
+ cc.evex().vpsllw(ymmA, m, 0);
+ cc.evex().vpsllw(zmmA, zmmB, m);
+ cc.evex().vpsllw(zmmA, m, 0);
+ cc.evex().vpsrad(xmmA, xmmB, m);
+ cc.evex().vpsrad(xmmA, m, 0);
+ cc.evex().vpsrad(ymmA, ymmB, m);
+ cc.evex().vpsrad(ymmA, m, 0);
+ cc.evex().vpsrad(zmmA, zmmB, m);
+ cc.evex().vpsrad(zmmA, m, 0);
+ cc.evex().vpsraq(xmmA, xmmB, m);
+ cc.evex().vpsraq(xmmA, m, 0);
+ cc.evex().vpsraq(ymmA, ymmB, m);
+ cc.evex().vpsraq(ymmA, m, 0);
+ cc.evex().vpsraq(zmmA, zmmB, m);
+ cc.evex().vpsraq(zmmA, m, 0);
+ cc.evex().vpsravd(xmmA, xmmB, m);
+ cc.evex().vpsravd(ymmA, ymmB, m);
+ cc.evex().vpsravd(zmmA, zmmB, m);
+ cc.evex().vpsravq(xmmA, xmmB, m);
+ cc.evex().vpsravq(ymmA, ymmB, m);
+ cc.evex().vpsravq(zmmA, zmmB, m);
+ cc.evex().vpsravw(xmmA, xmmB, m);
+ cc.evex().vpsravw(ymmA, ymmB, m);
+ cc.evex().vpsravw(zmmA, zmmB, m);
+ cc.evex().vpsraw(xmmA, xmmB, m);
+ cc.evex().vpsraw(xmmA, m, 0);
+ cc.evex().vpsraw(ymmA, ymmB, m);
+ cc.evex().vpsraw(ymmA, m, 0);
+ cc.evex().vpsraw(zmmA, zmmB, m);
+ cc.evex().vpsraw(zmmA, m, 0);
+ cc.evex().vpsrld(xmmA, xmmB, m);
+ cc.evex().vpsrld(xmmA, m, 0);
+ cc.evex().vpsrld(ymmA, ymmB, m);
+ cc.evex().vpsrld(ymmA, m, 0);
+ cc.evex().vpsrld(zmmA, zmmB, m);
+ cc.evex().vpsrld(zmmA, m, 0);
+ cc.evex().vpsrldq(xmmA, m, 0);
+ cc.evex().vpsrldq(ymmA, m, 0);
+ cc.evex().vpsrldq(zmmA, m, 0);
+ cc.evex().vpsrlq(xmmA, xmmB, m);
+ cc.evex().vpsrlq(xmmA, m, 0);
+ cc.evex().vpsrlq(ymmA, ymmB, m);
+ cc.evex().vpsrlq(ymmA, m, 0);
+ cc.evex().vpsrlq(zmmA, zmmB, m);
+ cc.evex().vpsrlq(zmmA, m, 0);
+ cc.evex().vpsrlvd(xmmA, xmmB, m);
+ cc.evex().vpsrlvd(ymmA, ymmB, m);
+ cc.evex().vpsrlvd(zmmA, zmmB, m);
+ cc.evex().vpsrlvq(xmmA, xmmB, m);
+ cc.evex().vpsrlvq(ymmA, ymmB, m);
+ cc.evex().vpsrlvq(zmmA, zmmB, m);
+ cc.evex().vpsrlvw(xmmA, xmmB, m);
+ cc.evex().vpsrlvw(ymmA, ymmB, m);
+ cc.evex().vpsrlvw(zmmA, zmmB, m);
+ cc.evex().vpsrlw(xmmA, xmmB, m);
+ cc.evex().vpsrlw(xmmA, m, 0);
+ cc.evex().vpsrlw(ymmA, ymmB, m);
+ cc.evex().vpsrlw(ymmA, m, 0);
+ cc.evex().vpsrlw(zmmA, zmmB, m);
+ cc.evex().vpsrlw(zmmA, m, 0);
+ cc.evex().vpsubb(xmmA, xmmB, m);
+ cc.evex().vpsubb(ymmA, ymmB, m);
+ cc.evex().vpsubb(zmmA, zmmB, m);
+ cc.evex().vpsubd(xmmA, xmmB, m);
+ cc.evex().vpsubd(ymmA, ymmB, m);
+ cc.evex().vpsubd(zmmA, zmmB, m);
+ cc.evex().vpsubq(xmmA, xmmB, m);
+ cc.evex().vpsubq(ymmA, ymmB, m);
+ cc.evex().vpsubq(zmmA, zmmB, m);
+ cc.evex().vpsubsb(xmmA, xmmB, m);
+ cc.evex().vpsubsb(ymmA, ymmB, m);
+ cc.evex().vpsubsb(zmmA, zmmB, m);
+ cc.evex().vpsubsw(xmmA, xmmB, m);
+ cc.evex().vpsubsw(ymmA, ymmB, m);
+ cc.evex().vpsubsw(zmmA, zmmB, m);
+ cc.evex().vpsubusb(xmmA, xmmB, m);
+ cc.evex().vpsubusb(ymmA, ymmB, m);
+ cc.evex().vpsubusb(zmmA, zmmB, m);
+ cc.evex().vpsubusw(xmmA, xmmB, m);
+ cc.evex().vpsubusw(ymmA, ymmB, m);
+ cc.evex().vpsubusw(zmmA, zmmB, m);
+ cc.evex().vpsubw(xmmA, xmmB, m);
+ cc.evex().vpsubw(ymmA, ymmB, m);
+ cc.evex().vpsubw(zmmA, zmmB, m);
+ cc.evex().vpternlogd(xmmA, xmmB, m, 0);
+ cc.evex().vpternlogd(ymmA, ymmB, m, 0);
+ cc.evex().vpternlogd(zmmA, zmmB, m, 0);
+ cc.evex().vpternlogq(xmmA, xmmB, m, 0);
+ cc.evex().vpternlogq(ymmA, ymmB, m, 0);
+ cc.evex().vpternlogq(zmmA, zmmB, m, 0);
+ cc.evex().vptestmb(kA, xmmB, m);
+ cc.evex().vptestmb(kA, ymmB, m);
+ cc.evex().vptestmb(kA, zmmB, m);
+ cc.evex().vptestmd(kA, xmmB, m);
+ cc.evex().vptestmd(kA, ymmB, m);
+ cc.evex().vptestmd(kA, zmmB, m);
+ cc.evex().vptestmq(kA, xmmB, m);
+ cc.evex().vptestmq(kA, ymmB, m);
+ cc.evex().vptestmq(kA, zmmB, m);
+ cc.evex().vptestmw(kA, xmmB, m);
+ cc.evex().vptestmw(kA, ymmB, m);
+ cc.evex().vptestmw(kA, zmmB, m);
+ cc.evex().vptestnmb(kA, xmmB, m);
+ cc.evex().vptestnmb(kA, ymmB, m);
+ cc.evex().vptestnmb(kA, zmmB, m);
+ cc.evex().vptestnmd(kA, xmmB, m);
+ cc.evex().vptestnmd(kA, ymmB, m);
+ cc.evex().vptestnmd(kA, zmmB, m);
+ cc.evex().vptestnmq(kA, xmmB, m);
+ cc.evex().vptestnmq(kA, ymmB, m);
+ cc.evex().vptestnmq(kA, zmmB, m);
+ cc.evex().vptestnmw(kA, xmmB, m);
+ cc.evex().vptestnmw(kA, ymmB, m);
+ cc.evex().vptestnmw(kA, zmmB, m);
+ cc.evex().vpunpckhbw(xmmA, xmmB, m);
+ cc.evex().vpunpckhbw(ymmA, ymmB, m);
+ cc.evex().vpunpckhbw(zmmA, zmmB, m);
+ cc.evex().vpunpckhdq(xmmA, xmmB, m);
+ cc.evex().vpunpckhdq(ymmA, ymmB, m);
+ cc.evex().vpunpckhdq(zmmA, zmmB, m);
+ cc.evex().vpunpckhqdq(xmmA, xmmB, m);
+ cc.evex().vpunpckhqdq(ymmA, ymmB, m);
+ cc.evex().vpunpckhqdq(zmmA, zmmB, m);
+ cc.evex().vpunpckhwd(xmmA, xmmB, m);
+ cc.evex().vpunpckhwd(ymmA, ymmB, m);
+ cc.evex().vpunpckhwd(zmmA, zmmB, m);
+ cc.evex().vpunpcklbw(xmmA, xmmB, m);
+ cc.evex().vpunpcklbw(ymmA, ymmB, m);
+ cc.evex().vpunpcklbw(zmmA, zmmB, m);
+ cc.evex().vpunpckldq(xmmA, xmmB, m);
+ cc.evex().vpunpckldq(ymmA, ymmB, m);
+ cc.evex().vpunpckldq(zmmA, zmmB, m);
+ cc.evex().vpunpcklqdq(xmmA, xmmB, m);
+ cc.evex().vpunpcklqdq(ymmA, ymmB, m);
+ cc.evex().vpunpcklqdq(zmmA, zmmB, m);
+ cc.evex().vpunpcklwd(xmmA, xmmB, m);
+ cc.evex().vpunpcklwd(ymmA, ymmB, m);
+ cc.evex().vpunpcklwd(zmmA, zmmB, m);
+ cc.evex().vpxord(xmmA, xmmB, m);
+ cc.evex().vpxord(ymmA, ymmB, m);
+ cc.evex().vpxord(zmmA, zmmB, m);
+ cc.evex().vpxorq(xmmA, xmmB, m);
+ cc.evex().vpxorq(ymmA, ymmB, m);
+ cc.evex().vpxorq(zmmA, zmmB, m);
+ cc.evex().vrangepd(xmmA, xmmB, m, 0);
+ cc.evex().vrangepd(ymmA, ymmB, m, 0);
+ cc.evex().vrangepd(zmmA, zmmB, m, 0);
+ cc.evex().vrangeps(xmmA, xmmB, m, 0);
+ cc.evex().vrangeps(ymmA, ymmB, m, 0);
+ cc.evex().vrangeps(zmmA, zmmB, m, 0);
+ cc.evex().vrangesd(xmmA, xmmB, m, 0);
+ cc.evex().vrangess(xmmA, xmmB, m, 0);
+ cc.evex().vrcp14pd(xmmA, m);
+ cc.evex().vrcp14pd(ymmA, m);
+ cc.evex().vrcp14pd(zmmA, m);
+ cc.evex().vrcp14ps(xmmA, m);
+ cc.evex().vrcp14ps(ymmA, m);
+ cc.evex().vrcp14ps(zmmA, m);
+ cc.evex().vrcp14sd(xmmA, xmmB, m);
+ cc.evex().vrcp14ss(xmmA, xmmB, m);
+ cc.evex().vrcp28pd(zmmA, m);
+ cc.evex().vrcp28ps(zmmA, m);
+ cc.evex().vrcp28sd(xmmA, xmmB, m);
+ cc.evex().vrcp28ss(xmmA, xmmB, m);
+ cc.evex().vreducepd(xmmA, m, 0);
+ cc.evex().vreducepd(ymmA, m, 0);
+ cc.evex().vreducepd(zmmA, m, 0);
+ cc.evex().vreduceps(xmmA, m, 0);
+ cc.evex().vreduceps(ymmA, m, 0);
+ cc.evex().vreduceps(zmmA, m, 0);
+ cc.evex().vreducesd(xmmA, xmmB, m, 0);
+ cc.evex().vreducess(xmmA, xmmB, m, 0);
+ cc.evex().vrndscalepd(xmmA, m, 0);
+ cc.evex().vrndscalepd(ymmA, m, 0);
+ cc.evex().vrndscalepd(zmmA, m, 0);
+ cc.evex().vrndscaleps(xmmA, m, 0);
+ cc.evex().vrndscaleps(ymmA, m, 0);
+ cc.evex().vrndscaleps(zmmA, m, 0);
+ cc.evex().vrndscalesd(xmmA, xmmB, m, 0);
+ cc.evex().vrndscaless(xmmA, xmmB, m, 0);
+ cc.evex().vrsqrt14pd(xmmA, m);
+ cc.evex().vrsqrt14pd(ymmA, m);
+ cc.evex().vrsqrt14pd(zmmA, m);
+ cc.evex().vrsqrt14ps(xmmA, m);
+ cc.evex().vrsqrt14ps(ymmA, m);
+ cc.evex().vrsqrt14ps(zmmA, m);
+ cc.evex().vrsqrt14sd(xmmA, xmmB, m);
+ cc.evex().vrsqrt14ss(xmmA, xmmB, m);
+ cc.evex().vrsqrt28pd(zmmA, m);
+ cc.evex().vrsqrt28ps(zmmA, m);
+ cc.evex().vrsqrt28sd(xmmA, xmmB, m);
+ cc.evex().vrsqrt28ss(xmmA, xmmB, m);
+ cc.evex().vscalefpd(xmmA, xmmB, m);
+ cc.evex().vscalefpd(ymmA, ymmB, m);
+ cc.evex().vscalefpd(zmmA, zmmB, m);
+ cc.evex().vscalefps(xmmA, xmmB, m);
+ cc.evex().vscalefps(ymmA, ymmB, m);
+ cc.evex().vscalefps(zmmA, zmmB, m);
+ cc.evex().vscalefsd(xmmA, xmmB, m);
+ cc.evex().vscalefss(xmmA, xmmB, m);
+ cc.evex().k(kA).vscatterdpd(vx_ptr, xmmB);
+ cc.evex().k(kA).vscatterdpd(vx_ptr, ymmB);
+ cc.evex().k(kA).vscatterdpd(vy_ptr, zmmB);
+ cc.evex().k(kA).vscatterdps(vx_ptr, xmmB);
+ cc.evex().k(kA).vscatterdps(vy_ptr, ymmB);
+ cc.evex().k(kA).vscatterdps(vz_ptr, zmmB);
+ cc.evex().k(kA).vscatterpf0dpd(vy_ptr);
+ cc.evex().k(kA).vscatterpf0dps(vz_ptr);
+ cc.evex().k(kA).vscatterpf0qpd(vz_ptr);
+ cc.evex().k(kA).vscatterpf0qps(vz_ptr);
+ cc.evex().k(kA).vscatterpf1dpd(vy_ptr);
+ cc.evex().k(kA).vscatterpf1dps(vz_ptr);
+ cc.evex().k(kA).vscatterpf1qpd(vz_ptr);
+ cc.evex().k(kA).vscatterpf1qps(vz_ptr);
+ cc.evex().k(kA).vscatterqpd(vx_ptr, xmmB);
+ cc.evex().k(kA).vscatterqpd(vy_ptr, ymmB);
+ cc.evex().k(kA).vscatterqpd(vz_ptr, zmmB);
+ cc.evex().k(kA).vscatterqps(vx_ptr, xmmB);
+ cc.evex().k(kA).vscatterqps(vy_ptr, xmmB);
+ cc.evex().k(kA).vscatterqps(vz_ptr, ymmB);
+ cc.evex().vshuff32x4(ymmA, ymmB, m, 0);
+ cc.evex().vshuff32x4(zmmA, zmmB, m, 0);
+ cc.evex().vshuff64x2(ymmA, ymmB, m, 0);
+ cc.evex().vshuff64x2(zmmA, zmmB, m, 0);
+ cc.evex().vshufi32x4(ymmA, ymmB, m, 0);
+ cc.evex().vshufi32x4(zmmA, zmmB, m, 0);
+ cc.evex().vshufi64x2(ymmA, ymmB, m, 0);
+ cc.evex().vshufi64x2(zmmA, zmmB, m, 0);
+ cc.evex().vshufpd(xmmA, xmmB, m, 0);
+ cc.evex().vshufpd(ymmA, ymmB, m, 0);
+ cc.evex().vshufpd(zmmA, zmmB, m, 0);
+ cc.evex().vshufps(xmmA, xmmB, m, 0);
+ cc.evex().vshufps(ymmA, ymmB, m, 0);
+ cc.evex().vshufps(zmmA, zmmB, m, 0);
+ cc.evex().vsqrtpd(xmmA, m);
+ cc.evex().vsqrtpd(ymmA, m);
+ cc.evex().vsqrtpd(zmmA, m);
+ cc.evex().vsqrtps(xmmA, m);
+ cc.evex().vsqrtps(ymmA, m);
+ cc.evex().vsqrtps(zmmA, m);
+ cc.evex().vsqrtsd(xmmA, xmmB, m);
+ cc.evex().vsqrtss(xmmA, xmmB, m);
+ cc.evex().vsubpd(xmmA, xmmB, m);
+ cc.evex().vsubpd(ymmA, ymmB, m);
+ cc.evex().vsubpd(zmmA, zmmB, m);
+ cc.evex().vsubps(xmmA, xmmB, m);
+ cc.evex().vsubps(ymmA, ymmB, m);
+ cc.evex().vsubps(zmmA, zmmB, m);
+ cc.evex().vsubsd(xmmA, xmmB, m);
+ cc.evex().vsubss(xmmA, xmmB, m);
+ cc.evex().vucomisd(xmmA, m);
+ cc.evex().vucomiss(xmmA, m);
+ cc.evex().vunpckhpd(xmmA, xmmB, m);
+ cc.evex().vunpckhpd(ymmA, ymmB, m);
+ cc.evex().vunpckhpd(zmmA, zmmB, m);
+ cc.evex().vunpckhps(xmmA, xmmB, m);
+ cc.evex().vunpckhps(ymmA, ymmB, m);
+ cc.evex().vunpckhps(zmmA, zmmB, m);
+ cc.evex().vunpcklpd(xmmA, xmmB, m);
+ cc.evex().vunpcklpd(ymmA, ymmB, m);
+ cc.evex().vunpcklpd(zmmA, zmmB, m);
+ cc.evex().vunpcklps(xmmA, xmmB, m);
+ cc.evex().vunpcklps(ymmA, ymmB, m);
+ cc.evex().vunpcklps(zmmA, zmmB, m);
+ cc.evex().vxorpd(xmmA, xmmB, m);
+ cc.evex().vxorpd(ymmA, ymmB, m);
+ cc.evex().vxorpd(zmmA, zmmB, m);
+ cc.evex().vxorps(xmmA, xmmB, m);
+ cc.evex().vxorps(ymmA, ymmB, m);
+ cc.evex().vxorps(zmmA, zmmB, m);
+ }
+}
+
+static void generateAvx512Sequence(BaseEmitter& emitter, InstForm form, bool emitPrologEpilog) {
+ using namespace asmjit::x86;
+
+ if (emitter.isAssembler()) {
+ Assembler& cc = *emitter.as<Assembler>();
+
+ if (emitPrologEpilog) {
+ FuncDetail func;
+ func.init(FuncSignatureT<void, void*, const void*, size_t>(CallConvId::kHost), cc.environment());
+
+ FuncFrame frame;
+ frame.init(func);
+ frame.addDirtyRegs(eax, k1, k2, k3, zmm0, zmm1, zmm2, zmm3);
+ frame.finalize();
+
+ cc.emitProlog(frame);
+ generateAvx512SequenceInternal(cc, form, eax, k1, k2, k3, zmm0, zmm1, zmm2, zmm3);
+ cc.emitEpilog(frame);
+ }
+ else {
+ generateAvx512SequenceInternal(cc, form, eax, k1, k2, k3, zmm0, zmm1, zmm2, zmm3);
+ }
+ }
+#ifndef ASMJIT_NO_BUILDER
+ else if (emitter.isBuilder()) {
+ Builder& cc = *emitter.as<Builder>();
+
+ if (emitPrologEpilog) {
+ FuncDetail func;
+ func.init(FuncSignatureT<void, void*, const void*, size_t>(CallConvId::kHost), cc.environment());
+
+ FuncFrame frame;
+ frame.init(func);
+ frame.addDirtyRegs(eax, k1, k2, k3, zmm0, zmm1, zmm2, zmm3);
+ frame.finalize();
+
+ cc.emitProlog(frame);
+ generateAvx512SequenceInternal(cc, form, eax, k1, k2, k3, zmm0, zmm1, zmm2, zmm3);
+ cc.emitEpilog(frame);
+ }
+ else {
+ generateAvx512SequenceInternal(cc, form, eax, k1, k2, k3, zmm0, zmm1, zmm2, zmm3);
+ }
+ }
+#endif
+#ifndef ASMJIT_NO_COMPILER
+ else if (emitter.isCompiler()) {
+ Compiler& cc = *emitter.as<Compiler>();
+
+ Gp gp = cc.newGpz("gp");
+ Zmm vecA = cc.newZmm("vecA");
+ Zmm vecB = cc.newZmm("vecB");
+ Zmm vecC = cc.newZmm("vecC");
+ Zmm vecD = cc.newZmm("vecD");
+
+ KReg kA = cc.newKq("kA");
+ KReg kB = cc.newKq("kB");
+ KReg kC = cc.newKq("kC");
+
+ cc.addFunc(FuncSignatureT<void>(CallConvId::kHost));
+ generateAvx512SequenceInternal(cc, form, gp, kA, kB, kC, vecA, vecB, vecC, vecD);
+ cc.endFunc();
+ }
+#endif
+}
+
+template<typename EmitterFn>
+static void benchmarkX86Function(Arch arch, uint32_t numIterations, const char* description, const EmitterFn& emitterFn) noexcept {
+ CodeHolder code;
+ printf("%s:\n", description);
+
+ bench<x86::Assembler>(code, arch, numIterations, "[raw]", [&](x86::Assembler& cc) {
+ emitterFn(cc, false);
+ });
+
+ bench<x86::Assembler>(code, arch, numIterations, "[validated]", [&](x86::Assembler& cc) {
+ cc.addDiagnosticOptions(DiagnosticOptions::kValidateAssembler);
+ emitterFn(cc, false);
+ });
+
+ bench<x86::Assembler>(code, arch, numIterations, "[prolog/epilog]", [&](x86::Assembler& cc) {
+ cc.addDiagnosticOptions(DiagnosticOptions::kValidateAssembler);
+ emitterFn(cc, true);
+ });
+
+#ifndef ASMJIT_NO_BUILDER
+ bench<x86::Builder>(code, arch, numIterations, "[no-asm]", [&](x86::Builder& cc) {
+ emitterFn(cc, false);
+ });
+
+ bench<x86::Builder>(code, arch, numIterations, "[finalized]", [&](x86::Builder& cc) {
+ emitterFn(cc, false);
+ cc.finalize();
+ });
+
+ bench<x86::Builder>(code, arch, numIterations, "[prolog/epilog]", [&](x86::Builder& cc) {
+ emitterFn(cc, true);
+ cc.finalize();
+ });
+#endif
+
+#ifndef ASMJIT_NO_COMPILER
+ bench<x86::Compiler>(code, arch, numIterations, "[no-asm]", [&](x86::Compiler& cc) {
+ emitterFn(cc, true);
+ });
+
+ bench<x86::Compiler>(code, arch, numIterations, "[finalized]", [&](x86::Compiler& cc) {
+ emitterFn(cc, true);
+ cc.finalize();
+ });
+#endif
+
+ printf("\n");
+}
+
+void benchmarkX86Emitters(uint32_t numIterations, bool testX86, bool testX64) {
+ uint32_t i = 0;
+ uint32_t n = 0;
+
+ Arch archs[2] {};
+
+ if (testX86) archs[n++] = Arch::kX86;
+ if (testX64) archs[n++] = Arch::kX64;
+
+ for (i = 0; i < n; i++) {
+ static const char description[] = "GpSequence<Reg> (Sequence of GP instructions - reg-only)";
+ benchmarkX86Function(archs[i], numIterations, description, [](BaseEmitter& emitter, bool emitPrologEpilog) {
+ generateGpSequence(emitter, InstForm::kReg, emitPrologEpilog);
+ });
+ }
+
+ for (i = 0; i < n; i++) {
+ static const char description[] = "GpSequence<Mem> (Sequence of GP instructions - reg/mem)";
+ benchmarkX86Function(archs[i], numIterations, description, [](BaseEmitter& emitter, bool emitPrologEpilog) {
+ generateGpSequence(emitter, InstForm::kMem, emitPrologEpilog);
+ });
+ }
+
+ for (i = 0; i < n; i++) {
+ static const char description[] = "SseSequence<Reg> (sequence of SSE+ instructions - reg-only)";
+ benchmarkX86Function(archs[i], numIterations, description, [](BaseEmitter& emitter, bool emitPrologEpilog) {
+ generateSseSequence(emitter, InstForm::kReg, emitPrologEpilog);
+ });
+ }
+
+ for (i = 0; i < n; i++) {
+ static const char description[] = "SseSequence<Mem> (sequence of SSE+ instructions - reg/mem)";
+ benchmarkX86Function(archs[i], numIterations, description, [](BaseEmitter& emitter, bool emitPrologEpilog) {
+ generateSseSequence(emitter, InstForm::kMem, emitPrologEpilog);
+ });
+ }
+
+ for (i = 0; i < n; i++) {
+ static const char description[] = "AvxSequence<Reg> (sequence of AVX+ instructions - reg-only)";
+ benchmarkX86Function(archs[i], numIterations, description, [](BaseEmitter& emitter, bool emitPrologEpilog) {
+ generateAvxSequence(emitter, InstForm::kReg, emitPrologEpilog);
+ });
+ }
+
+ for (i = 0; i < n; i++) {
+ static const char description[] = "AvxSequence<Mem> (sequence of AVX+ instructions - reg/mem)";
+ benchmarkX86Function(archs[i], numIterations, description, [](BaseEmitter& emitter, bool emitPrologEpilog) {
+ generateAvxSequence(emitter, InstForm::kMem, emitPrologEpilog);
+ });
+ }
+
+ for (i = 0; i < n; i++) {
+ static const char description[] = "Avx512Sequence<Reg> (sequence of AVX512+ instructions - reg-only)";
+ benchmarkX86Function(archs[i], numIterations, description, [](BaseEmitter& emitter, bool emitPrologEpilog) {
+ generateAvx512Sequence(emitter, InstForm::kReg, emitPrologEpilog);
+ });
+ }
+
+ for (i = 0; i < n; i++) {
+ static const char description[] = "Avx512Sequence<Mem> (sequence of AVX512+ instructions - reg/mem)";
+ benchmarkX86Function(archs[i], numIterations, description, [](BaseEmitter& emitter, bool emitPrologEpilog) {
+ generateAvx512Sequence(emitter, InstForm::kMem, emitPrologEpilog);
+ });
+ }
+
+ for (i = 0; i < n; i++) {
+ static const char description[] = "SseAlphaBlend (alpha-blend function with labels and jumps)";
+ benchmarkX86Function(archs[i], numIterations, description, [](BaseEmitter& emitter, bool emitPrologEpilog) {
+ asmtest::generateSseAlphaBlend(emitter, emitPrologEpilog);
+ });
+ }
+}
+
+#endif // !ASMJIT_NO_X86
diff --git a/3rdparty/asmjit/test/asmjit_test_unit.cpp b/3rdparty/asmjit/test/asmjit_test_unit.cpp
index 3aac7401e17..5658ebc1d60 100644
--- a/3rdparty/asmjit/test/asmjit_test_unit.cpp
+++ b/3rdparty/asmjit/test/asmjit_test_unit.cpp
@@ -1,61 +1,26 @@
-// AsmJit - Machine code generation for C++
+// This file is part of AsmJit project <https://asmjit.com>
//
-// * Official AsmJit Home Page: https://asmjit.com
-// * Official Github Repository: https://github.com/asmjit/asmjit
-//
-// Copyright (c) 2008-2020 The AsmJit Authors
-//
-// This software is provided 'as-is', without any express or implied
-// warranty. In no event will the authors be held liable for any damages
-// arising from the use of this software.
-//
-// Permission is granted to anyone to use this software for any purpose,
-// including commercial applications, and to alter it and redistribute it
-// freely, subject to the following restrictions:
-//
-// 1. The origin of this software must not be misrepresented; you must not
-// claim that you wrote the original software. If you use this software
-// in a product, an acknowledgment in the product documentation would be
-// appreciated but is not required.
-// 2. Altered source versions must be plainly marked as such, and must not be
-// misrepresented as being the original software.
-// 3. This notice may not be removed or altered from any source distribution.
+// See asmjit.h or LICENSE.md for license and copyright information
+// SPDX-License-Identifier: Zlib
-#include <asmjit/asmjit.h>
-#include "./broken.h"
+#include <asmjit/core.h>
-using namespace asmjit;
+#if !defined(ASMJIT_NO_X86)
+#include <asmjit/x86.h>
+#endif
-// ============================================================================
-// [DumpCpu]
-// ============================================================================
-
-struct DumpCpuFeature {
- uint32_t feature;
- const char* name;
-};
-
-static const char* archToString(uint32_t arch) noexcept {
- switch (arch & ~Environment::kArchBigEndianMask) {
- case Environment::kArchX86 : return "X86";
- case Environment::kArchX64 : return "X64";
- case Environment::kArchARM : return "ARM";
- case Environment::kArchThumb : return "Thumb";
- case Environment::kArchAArch64 : return "AArch64";
- case Environment::kArchMIPS_LE : return "MIPS";
- case Environment::kArchMIPS64_LE: return "MIPS64";
- default: return "Unknown";
- }
-}
+#include "asmjitutils.h"
+#include "broken.h"
+
+using namespace asmjit;
static void dumpCpu(void) noexcept {
const CpuInfo& cpu = CpuInfo::host();
- // --------------------------------------------------------------------------
- // [CPU Information]
- // --------------------------------------------------------------------------
+ // CPU Information
+ // ---------------
- INFO("Host CPU:");
+ INFO("CPU Info:");
INFO(" Vendor : %s", cpu.vendor());
INFO(" Brand : %s", cpu.brand());
INFO(" Model ID : %u", cpu.modelId());
@@ -68,13 +33,12 @@ static void dumpCpu(void) noexcept {
INFO(" HW-Thread Count : %u", cpu.hwThreadCount());
INFO("");
- // --------------------------------------------------------------------------
- // [CPU Features]
- // --------------------------------------------------------------------------
+ // CPU Features
+ // ------------
#ifndef ASMJIT_NO_LOGGING
INFO("CPU Features:");
- BaseFeatures::Iterator it(cpu.features().iterator());
+ CpuFeatures::Iterator it(cpu.features().iterator());
while (it.hasNext()) {
uint32_t featureId = uint32_t(it.next());
StringTmp<64> featureString;
@@ -85,10 +49,6 @@ static void dumpCpu(void) noexcept {
#endif // !ASMJIT_NO_LOGGING
}
-// ============================================================================
-// [DumpSizeOf]
-// ============================================================================
-
#define DUMP_TYPE(...) \
INFO(" %-26s: %u", #__VA_ARGS__, uint32_t(sizeof(__VA_ARGS__)))
@@ -144,7 +104,7 @@ static void dumpSizeOf(void) noexcept {
DUMP_TYPE(FuncArgsAssignment);
INFO("");
-#ifndef ASMJIT_NO_BUILDER
+#if !defined(ASMJIT_NO_BUILDER)
INFO("Size of builder classes:");
DUMP_TYPE(BaseBuilder);
DUMP_TYPE(BaseNode);
@@ -160,7 +120,7 @@ static void dumpSizeOf(void) noexcept {
INFO("");
#endif
-#ifndef ASMJIT_NO_COMPILER
+#if !defined(ASMJIT_NO_COMPILER)
INFO("Size of compiler classes:");
DUMP_TYPE(BaseCompiler);
DUMP_TYPE(FuncNode);
@@ -169,13 +129,13 @@ static void dumpSizeOf(void) noexcept {
INFO("");
#endif
-#ifdef ASMJIT_BUILD_X86
+#if !defined(ASMJIT_NO_X86)
INFO("Size of x86-specific classes:");
DUMP_TYPE(x86::Assembler);
- #ifndef ASMJIT_NO_BUILDER
+ #if !defined(ASMJIT_NO_BUILDER)
DUMP_TYPE(x86::Builder);
#endif
- #ifndef ASMJIT_NO_COMPILER
+ #if !defined(ASMJIT_NO_COMPILER)
DUMP_TYPE(x86::Compiler);
#endif
DUMP_TYPE(x86::InstDB::InstInfo);
@@ -188,10 +148,6 @@ static void dumpSizeOf(void) noexcept {
#undef DUMP_TYPE
-// ============================================================================
-// [Main]
-// ============================================================================
-
static void onBeforeRun(void) noexcept {
dumpCpu();
dumpSizeOf();
@@ -208,7 +164,7 @@ int main(int argc, const char* argv[]) {
unsigned((ASMJIT_LIBRARY_VERSION >> 16) ),
unsigned((ASMJIT_LIBRARY_VERSION >> 8) & 0xFF),
unsigned((ASMJIT_LIBRARY_VERSION ) & 0xFF),
- archToString(Environment::kArchHost),
+ asmjitArchAsString(Arch::kHost),
buildType
);
diff --git a/3rdparty/asmjit/test/asmjit_test_x86_instinfo.cpp b/3rdparty/asmjit/test/asmjit_test_x86_instinfo.cpp
deleted file mode 100644
index 1d7d5003f8b..00000000000
--- a/3rdparty/asmjit/test/asmjit_test_x86_instinfo.cpp
+++ /dev/null
@@ -1,128 +0,0 @@
-// AsmJit - Machine code generation for C++
-//
-// * Official AsmJit Home Page: https://asmjit.com
-// * Official Github Repository: https://github.com/asmjit/asmjit
-//
-// Copyright (c) 2008-2020 The AsmJit Authors
-//
-// This software is provided 'as-is', without any express or implied
-// warranty. In no event will the authors be held liable for any damages
-// arising from the use of this software.
-//
-// Permission is granted to anyone to use this software for any purpose,
-// including commercial applications, and to alter it and redistribute it
-// freely, subject to the following restrictions:
-//
-// 1. The origin of this software must not be misrepresented; you must not
-// claim that you wrote the original software. If you use this software
-// in a product, an acknowledgment in the product documentation would be
-// appreciated but is not required.
-// 2. Altered source versions must be plainly marked as such, and must not be
-// misrepresented as being the original software.
-// 3. This notice may not be removed or altered from any source distribution.
-
-#include <asmjit/x86.h>
-#include <stdio.h>
-
-using namespace asmjit;
-
-static void printInfo(uint32_t arch, const BaseInst& inst, const Operand_* operands, size_t opCount) {
- StringTmp<512> sb;
-
- // Read & Write Information
- // ------------------------
-
- InstRWInfo rw;
- InstAPI::queryRWInfo(arch, inst, operands, opCount, &rw);
-
- sb.append("Instruction:\n");
- sb.append(" ");
-#ifndef ASMJIT_NO_LOGGING
- Formatter::formatInstruction(sb, 0, nullptr, arch, inst, operands, opCount);
-#else
- sb.append("<Logging-Not-Available>");
-#endif
- sb.append("\n");
-
- sb.append("Operands:\n");
- for (uint32_t i = 0; i < rw.opCount(); i++) {
- const OpRWInfo& op = rw.operand(i);
- const char* access = op.isReadOnly() ? "R" :
- op.isWriteOnly() ? "W" :
- op.isReadWrite() ? "X" : "_";
-
- sb.appendFormat(" [%u] RW=%s Read=%016llX Write=%016llX Extend=%016llX",
- i, access, op.readByteMask(), op.writeByteMask(), op.extendByteMask());
- sb.append("\n");
- }
-
- // CPU Features
- // ------------
-
- BaseFeatures features;
- InstAPI::queryFeatures(arch, inst, operands, opCount, &features);
-
-#ifndef ASMJIT_NO_LOGGING
- if (!features.empty()) {
- sb.append("Features:\n");
- sb.append(" ");
-
- bool first = true;
- BaseFeatures::Iterator it(features.iterator());
- while (it.hasNext()) {
- uint32_t featureId = uint32_t(it.next());
- if (!first)
- sb.append(" & ");
- Formatter::formatFeature(sb, arch, featureId);
- first = false;
- }
- sb.append("\n");
- }
-#endif
-
- printf("%s\n", sb.data());
-}
-
-template<typename... Args>
-static void printInfoSimple(uint32_t arch, uint32_t instId, Args&&... args) {
- BaseInst inst(instId);
- Operand_ opArray[] = { std::forward<Args>(args)... };
- printInfo(arch, inst, opArray, sizeof...(args));
-}
-
-int main() {
- using namespace x86;
- uint32_t arch = Environment::kArchX64;
-
- printf("AsmJit X86 Instruction Information Test\n\n");
-
- printInfoSimple(arch,
- x86::Inst::kIdAdd,
- x86::eax, x86::ebx);
-
- printInfoSimple(arch,
- x86::Inst::kIdPshufd,
- x86::xmm0, x86::xmm1, imm(0));
-
- printInfoSimple(arch,
- x86::Inst::kIdPextrw,
- x86::eax, x86::xmm1, imm(0));
-
- printInfoSimple(arch,
- x86::Inst::kIdPextrw,
- x86::ptr(rax), x86::xmm1, imm(0));
-
- printInfoSimple(arch,
- x86::Inst::kIdVaddpd,
- x86::ymm0, x86::ymm1, x86::ymm2);
-
- printInfoSimple(arch,
- x86::Inst::kIdVaddpd,
- x86::ymm0, x86::ymm30, x86::ymm31);
-
- printInfoSimple(arch,
- x86::Inst::kIdVaddpd,
- x86::zmm0, x86::zmm1, x86::zmm2);
-
- return 0;
-}
diff --git a/3rdparty/asmjit/test/asmjit_test_x86_sections.cpp b/3rdparty/asmjit/test/asmjit_test_x86_sections.cpp
index ddafd63b8bc..353b5e4fa1b 100644
--- a/3rdparty/asmjit/test/asmjit_test_x86_sections.cpp
+++ b/3rdparty/asmjit/test/asmjit_test_x86_sections.cpp
@@ -1,25 +1,7 @@
-// AsmJit - Machine code generation for C++
+// This file is part of AsmJit project <https://asmjit.com>
//
-// * Official AsmJit Home Page: https://asmjit.com
-// * Official Github Repository: https://github.com/asmjit/asmjit
-//
-// Copyright (c) 2008-2020 The AsmJit Authors
-//
-// This software is provided 'as-is', without any express or implied
-// warranty. In no event will the authors be held liable for any damages
-// arising from the use of this software.
-//
-// Permission is granted to anyone to use this software for any purpose,
-// including commercial applications, and to alter it and redistribute it
-// freely, subject to the following restrictions:
-//
-// 1. The origin of this software must not be misrepresented; you must not
-// claim that you wrote the original software. If you use this software
-// in a product, an acknowledgment in the product documentation would be
-// appreciated but is not required.
-// 2. Altered source versions must be plainly marked as such, and must not be
-// misrepresented as being the original software.
-// 3. This notice may not be removed or altered from any source distribution.
+// See asmjit.h or LICENSE.md for license and copyright information
+// SPDX-License-Identifier: Zlib
// ----------------------------------------------------------------------------
// This is a working example that demonstrates how multiple sections can be
@@ -34,6 +16,9 @@
// - Copy the code to the destination address.
// ----------------------------------------------------------------------------
+#include <asmjit/core.h>
+#if !defined(ASMJIT_NO_X86) && ASMJIT_ARCH_X86
+
#include <asmjit/x86.h>
#include <stdio.h>
#include <stdlib.h>
@@ -48,19 +33,19 @@ using namespace asmjit;
static const uint8_t dataArray[] = { 2, 9, 4, 7, 1, 3, 8, 5, 6, 0 };
static void fail(const char* message, Error err) {
- printf("%s: %s\n", message, DebugUtils::errorAsString(err));
+ printf("** FAILURE: %s (%s) **\n", message, DebugUtils::errorAsString(err));
exit(1);
}
int main() {
printf("AsmJit X86 Sections Test\n\n");
- Environment env = hostEnvironment();
+ Environment env = Environment::host();
JitAllocator allocator;
#ifndef ASMJIT_NO_LOGGING
FileLogger logger(stdout);
- logger.setIndentation(FormatOptions::kIndentationCode, 2);
+ logger.setIndentation(FormatIndentationGroup::kCode, 2);
#endif
CodeHolder code;
@@ -71,7 +56,7 @@ int main() {
#endif
Section* dataSection;
- Error err = code.newSection(&dataSection, ".data", SIZE_MAX, 0, 8);
+ Error err = code.newSection(&dataSection, ".data", SIZE_MAX, SectionFlags::kNone, 8);
if (err) {
fail("Failed to create a .data section", err);
@@ -85,7 +70,7 @@ int main() {
Label data = a.newLabel();
FuncDetail func;
- func.init(FuncSignatureT<size_t, size_t>(CallConv::kIdHost), code.environment());
+ func.init(FuncSignatureT<size_t, size_t>(CallConvId::kHost), code.environment());
FuncFrame frame;
frame.init(func);
@@ -115,7 +100,7 @@ int main() {
// how to do it explicitly.
printf("\nCalculating section offsets:\n");
uint64_t offset = 0;
- for (Section* section : code.sections()) {
+ for (Section* section : code.sectionsByOrder()) {
offset = Support::alignUp(offset, section->alignment());
section->setOffset(offset);
offset += section->realSize();
@@ -142,34 +127,46 @@ int main() {
}
// Allocate memory for the function and relocate it there.
- void* roPtr;
+ void* rxPtr;
void* rwPtr;
- err = allocator.alloc(&roPtr, &rwPtr, codeSize);
+ err = allocator.alloc(&rxPtr, &rwPtr, codeSize);
if (err)
fail("Failed to allocate executable memory", err);
// Relocate to the base-address of the allocated memory.
- code.relocateToBase(uint64_t(uintptr_t(roPtr)));
+ code.relocateToBase(uint64_t(uintptr_t(rxPtr)));
+
+ VirtMem::protectJitMemory(VirtMem::ProtectJitAccess::kReadWrite);
// Copy the flattened code into `mem.rw`. There are two ways. You can either copy
// everything manually by iterating over all sections or use `copyFlattenedData`.
// This code is similar to what `copyFlattenedData(p, codeSize, 0)` would do:
- for (Section* section : code.sections())
+ for (Section* section : code.sectionsByOrder())
memcpy(static_cast<uint8_t*>(rwPtr) + size_t(section->offset()), section->data(), section->bufferSize());
+ VirtMem::protectJitMemory(VirtMem::ProtectJitAccess::kReadExecute);
+ VirtMem::flushInstructionCache(rwPtr, code.codeSize());
+
// Execute the function and test whether it works.
typedef size_t (*Func)(size_t idx);
- Func fn = (Func)roPtr;
+ Func fn = (Func)rxPtr;
printf("\n");
if (fn(0) != dataArray[0] ||
fn(3) != dataArray[3] ||
fn(6) != dataArray[6] ||
fn(9) != dataArray[9] ) {
- printf("Failure:\n The generated function returned incorrect result(s)\n");
+ printf("** FAILURE: The generated function returned incorrect result(s) **\n");
return 1;
}
- printf("Success:\n The generated function returned expected results\n");
+ printf("** SUCCESS **\n");
+ return 0;
+}
+
+#else
+int main() {
+ printf("AsmJit X86 Sections Test is disabled on non-x86 host\n\n");
return 0;
}
+#endif // !ASMJIT_NO_X86 && ASMJIT_ARCH_X86
diff --git a/3rdparty/asmjit/test/asmjitutils.h b/3rdparty/asmjit/test/asmjitutils.h
new file mode 100644
index 00000000000..d84d3d4c742
--- /dev/null
+++ b/3rdparty/asmjit/test/asmjitutils.h
@@ -0,0 +1,38 @@
+// This file is part of AsmJit project <https://asmjit.com>
+//
+// See asmjit.h or LICENSE.md for license and copyright information
+// SPDX-License-Identifier: Zlib
+
+#ifndef ASMJITUTILS_H_INCLUDED
+#define ASMJITUTILS_H_INCLUDED
+
+#include <asmjit/core.h>
+
+static const char* asmjitArchAsString(asmjit::Arch arch) noexcept {
+ switch (arch) {
+ case asmjit::Arch::kX86 : return "X86";
+ case asmjit::Arch::kX64 : return "X64";
+
+ case asmjit::Arch::kRISCV32 : return "RISCV32";
+ case asmjit::Arch::kRISCV64 : return "RISCV64";
+
+ case asmjit::Arch::kARM : return "ARM";
+ case asmjit::Arch::kAArch64 : return "AArch64";
+ case asmjit::Arch::kThumb : return "Thumb";
+
+ case asmjit::Arch::kMIPS32_LE : return "MIPS_LE";
+ case asmjit::Arch::kMIPS64_LE : return "MIPS64_LE";
+
+ case asmjit::Arch::kARM_BE : return "ARM_BE";
+ case asmjit::Arch::kThumb_BE : return "Thumb_BE";
+ case asmjit::Arch::kAArch64_BE: return "AArch64_BE";
+
+ case asmjit::Arch::kMIPS32_BE : return "MIPS_BE";
+ case asmjit::Arch::kMIPS64_BE : return "MIPS64_BE";
+
+ default:
+ return "<Unknown>";
+ }
+}
+
+#endif // ASMJITUTILS_H_INCLUDED
diff --git a/3rdparty/asmjit/test/cmdline.h b/3rdparty/asmjit/test/cmdline.h
new file mode 100644
index 00000000000..4da0d2ed559
--- /dev/null
+++ b/3rdparty/asmjit/test/cmdline.h
@@ -0,0 +1,61 @@
+// This file is part of AsmJit project <https://asmjit.com>
+//
+// See asmjit.h or LICENSE.md for license and copyright information
+// SPDX-License-Identifier: Zlib
+
+#ifndef CMDLINE_H_INCLUDED
+#define CMDLINE_H_INCLUDED
+
+#include <stdint.h>
+#include <stdlib.h>
+#include <string.h>
+
+class CmdLine {
+public:
+ int _argc;
+ const char* const* _argv;
+
+ CmdLine(int argc, const char* const* argv)
+ : _argc(argc),
+ _argv(argv) {}
+
+ bool hasArg(const char* key) const {
+ for (int i = 1; i < _argc; i++)
+ if (strcmp(key, _argv[i]) == 0)
+ return true;
+ return false;
+ }
+
+ const char* valueOf(const char* key, const char* defaultValue) const {
+ size_t keySize = strlen(key);
+ for (int i = 1; i < _argc; i++) {
+ const char* val = _argv[i];
+ if (strlen(val) >= keySize + 1 && val[keySize] == '=' && memcmp(val, key, keySize) == 0)
+ return val + keySize + 1;
+ }
+
+ return defaultValue;
+ }
+
+ int valueAsInt(const char* key, int defaultValue) const {
+ const char* val = valueOf(key, nullptr);
+ if (val == nullptr || val[0] == '\0')
+ return defaultValue;
+
+ return atoi(val);
+ }
+
+ unsigned valueAsUInt(const char* key, unsigned defaultValue) const {
+ const char* val = valueOf(key, nullptr);
+ if (val == nullptr || val[0] == '\0')
+ return defaultValue;
+
+ int v = atoi(val);
+ if (v < 0)
+ return defaultValue;
+ else
+ return unsigned(v);
+ }
+};
+
+#endif // CMDLINE_H_INCLUDED
diff --git a/3rdparty/asmjit/test/performancetimer.h b/3rdparty/asmjit/test/performancetimer.h
new file mode 100644
index 00000000000..baa0479fc34
--- /dev/null
+++ b/3rdparty/asmjit/test/performancetimer.h
@@ -0,0 +1,41 @@
+// This file is part of AsmJit project <https://asmjit.com>
+//
+// See asmjit.h or LICENSE.md for license and copyright information
+// SPDX-License-Identifier: Zlib
+
+#ifndef PERFORMANCETIMER_H_INCLUDED
+#define PERFORMANCETIMER_H_INCLUDED
+
+#include <asmjit/core.h>
+#include <chrono>
+
+class PerformanceTimer {
+public:
+ typedef std::chrono::high_resolution_clock::time_point TimePoint;
+
+ TimePoint _startTime {};
+ TimePoint _endTime {};
+
+ inline void start() {
+ _startTime = std::chrono::high_resolution_clock::now();
+ }
+
+ inline void stop() {
+ _endTime = std::chrono::high_resolution_clock::now();
+ }
+
+ inline double duration() const {
+ std::chrono::duration<double> elapsed = _endTime - _startTime;
+ return elapsed.count() * 1000;
+ }
+};
+
+static inline double mbps(double duration, uint64_t outputSize) noexcept {
+ if (duration == 0)
+ return 0.0;
+
+ double bytesTotal = double(outputSize);
+ return (bytesTotal * 1000) / (duration * 1024 * 1024);
+}
+
+#endif // PERFORMANCETIMER_H_INCLUDED
diff --git a/3rdparty/asmjit/tools/configure-makefiles.sh b/3rdparty/asmjit/tools/configure-makefiles.sh
index 8bf7ca90347..69503dc28ef 100644
--- a/3rdparty/asmjit/tools/configure-makefiles.sh
+++ b/3rdparty/asmjit/tools/configure-makefiles.sh
@@ -1,17 +1,13 @@
#!/bin/sh
-CURRENT_DIR=`pwd`
-BUILD_DIR="build"
+CURRENT_DIR="`pwd`"
+BUILD_DIR="${CURRENT_DIR}/../build"
BUILD_OPTIONS="-DCMAKE_EXPORT_COMPILE_COMMANDS=ON -DASMJIT_TEST=1"
-echo "** Configuring ${BUILD_DIR}_dbg [Debug Build] **"
-mkdir -p ../${BUILD_DIR}_dbg
-cd ../${BUILD_DIR}_dbg
-eval cmake .. -DCMAKE_BUILD_TYPE=Debug ${BUILD_OPTIONS}
-cd ${CURRENT_DIR}
+echo "== [Configuring Build - Debug] =="
+eval cmake "${CURRENT_DIR}/.." -B "${BUILD_DIR}/Debug" -DCMAKE_BUILD_TYPE=Debug ${BUILD_OPTIONS}
+echo ""
-echo "** Configuring ${BUILD_DIR}_rel [Release Build] **"
-mkdir -p ../${BUILD_DIR}_rel
-cd ../${BUILD_DIR}_rel
-eval cmake .. -DCMAKE_BUILD_TYPE=Release ${BUILD_OPTIONS}
-cd ${CURRENT_DIR}
+echo "== [Configuring Build - Release] =="
+eval cmake "${CURRENT_DIR}/.." -B "${BUILD_DIR}/Release" -DCMAKE_BUILD_TYPE=Release ${BUILD_OPTIONS}
+echo ""
diff --git a/3rdparty/asmjit/tools/configure-ninja.sh b/3rdparty/asmjit/tools/configure-ninja.sh
index 0ff2779062f..84808d24363 100644
--- a/3rdparty/asmjit/tools/configure-ninja.sh
+++ b/3rdparty/asmjit/tools/configure-ninja.sh
@@ -1,17 +1,13 @@
#!/bin/sh
-CURRENT_DIR=`pwd`
-BUILD_DIR="build"
-BUILD_OPTIONS="-DCMAKE_EXPORT_COMPILE_COMMANDS=ON -DASMJIT_TEST=1"
+CURRENT_DIR="`pwd`"
+BUILD_DIR="${CURRENT_DIR}/../build"
+BUILD_OPTIONS="-G Ninja -DCMAKE_EXPORT_COMPILE_COMMANDS=ON -DASMJIT_TEST=1"
-echo "** Configuring ${BUILD_DIR}_dbg [Debug Build] **"
-mkdir -p ../${BUILD_DIR}_dbg
-cd ../${BUILD_DIR}_dbg
-eval cmake .. -G"Ninja" -DCMAKE_BUILD_TYPE=Debug ${BUILD_OPTIONS}
-cd ${CURRENT_DIR}
+echo "== [Configuring Build - Debug] =="
+eval cmake "${CURRENT_DIR}/.." -B "${BUILD_DIR}/Debug" -DCMAKE_BUILD_TYPE=Debug ${BUILD_OPTIONS}
+echo ""
-echo "** Configuring ${BUILD_DIR}_rel [Release Build] **"
-mkdir -p ../${BUILD_DIR}_rel
-cd ../${BUILD_DIR}_rel
-eval cmake .. -G"Ninja" -DCMAKE_BUILD_TYPE=Release ${BUILD_OPTIONS}
-cd ${CURRENT_DIR}
+echo "== [Configuring Build - Release] =="
+eval cmake "${CURRENT_DIR}/.." -B "${BUILD_DIR}/Release" -DCMAKE_BUILD_TYPE=Release ${BUILD_OPTIONS}
+echo ""
diff --git a/3rdparty/asmjit/tools/configure-sanitizers.sh b/3rdparty/asmjit/tools/configure-sanitizers.sh
index 14a16b4d92a..a9f64969b70 100644
--- a/3rdparty/asmjit/tools/configure-sanitizers.sh
+++ b/3rdparty/asmjit/tools/configure-sanitizers.sh
@@ -1,17 +1,13 @@
#!/bin/sh
-CURRENT_DIR=`pwd`
-BUILD_DIR="build"
+CURRENT_DIR="`pwd`"
+BUILD_DIR="${CURRENT_DIR}/../build"
BUILD_OPTIONS="-DCMAKE_EXPORT_COMPILE_COMMANDS=ON -DASMJIT_TEST=1"
-echo "** Configuring '${BUILD_DIR}_rel_asan' [Sanitize=Address] **"
-mkdir -p ../${BUILD_DIR}_dbg_asan
-cd ../${BUILD_DIR}_dbg_asan
-eval cmake .. -GNinja -DCMAKE_BUILD_TYPE=Debug ${BUILD_OPTIONS} -DASMJIT_SANITIZE=address
-cd ${CURRENT_DIR}
+echo "== [Configuring Build - Release_ASAN] =="
+eval cmake "${CURRENT_DIR}/.." -B "${BUILD_DIR}/Release_ASAN" ${BUILD_OPTIONS} -DCMAKE_BUILD_TYPE=Release -DASMJIT_SANITIZE=address
+echo ""
-echo "** Configuring '${BUILD_DIR}_rel_ubsan' [Sanitize=Undefined] **"
-mkdir -p ../${BUILD_DIR}_dbg_ubsan
-cd ../${BUILD_DIR}_dbg_ubsan
-eval cmake .. -GNinja -DCMAKE_BUILD_TYPE=Debug ${BUILD_OPTIONS} -DASMJIT_SANITIZE=undefined
-cd ${CURRENT_DIR}
+echo "== [Configuring Build - Release_UBSAN] =="
+eval cmake "${CURRENT_DIR}/.." -B "${BUILD_DIR}/Release_UBSAN" ${BUILD_OPTIONS} -DCMAKE_BUILD_TYPE=Release -DASMJIT_SANITIZE=undefined
+echo ""
diff --git a/3rdparty/asmjit/tools/configure-vs-x64.bat b/3rdparty/asmjit/tools/configure-vs-x64.bat
deleted file mode 100644
index db4012adbee..00000000000
--- a/3rdparty/asmjit/tools/configure-vs-x64.bat
+++ /dev/null
@@ -1,9 +0,0 @@
-@echo off
-
-set CURRENT_DIR=%CD%
-set BUILD_DIR="build_vs_x64"
-
-mkdir ..\%BUILD_DIR%
-cd ..\%BUILD_DIR%
-cmake .. -G"Visual Studio 16" -A x64 -DASMJIT_TEST=1
-cd %CURRENT_DIR%
diff --git a/3rdparty/asmjit/tools/configure-vs-x86.bat b/3rdparty/asmjit/tools/configure-vs-x86.bat
deleted file mode 100644
index 7bc7b9d6717..00000000000
--- a/3rdparty/asmjit/tools/configure-vs-x86.bat
+++ /dev/null
@@ -1,9 +0,0 @@
-@echo off
-
-set CURRENT_DIR=%CD%
-set BUILD_DIR="build_vs_x86"
-
-mkdir ..\%BUILD_DIR%
-cd ..\%BUILD_DIR%
-cmake .. -G"Visual Studio 16" -A Win32 -DASMJIT_TEST=1
-cd %CURRENT_DIR%
diff --git a/3rdparty/asmjit/tools/configure-vs2019-x64.bat b/3rdparty/asmjit/tools/configure-vs2019-x64.bat
new file mode 100644
index 00000000000..05bc31e4fc4
--- /dev/null
+++ b/3rdparty/asmjit/tools/configure-vs2019-x64.bat
@@ -0,0 +1,2 @@
+@echo off
+cmake .. -B "..\build_vs2019_x64" -G"Visual Studio 16" -A x64 -DASMJIT_TEST=1
diff --git a/3rdparty/asmjit/tools/configure-vs2019-x86.bat b/3rdparty/asmjit/tools/configure-vs2019-x86.bat
new file mode 100644
index 00000000000..a0e266395a4
--- /dev/null
+++ b/3rdparty/asmjit/tools/configure-vs2019-x86.bat
@@ -0,0 +1,2 @@
+@echo off
+cmake .. -B "..\build_vs2019_x86" -G"Visual Studio 16" -A Win32 -DASMJIT_TEST=1
diff --git a/3rdparty/asmjit/tools/configure-vs2022-x64.bat b/3rdparty/asmjit/tools/configure-vs2022-x64.bat
new file mode 100644
index 00000000000..b33f5411de5
--- /dev/null
+++ b/3rdparty/asmjit/tools/configure-vs2022-x64.bat
@@ -0,0 +1,2 @@
+@echo off
+cmake .. -B "..\build_vs2022_x64" -G"Visual Studio 17" -A x64 -DASMJIT_TEST=1
diff --git a/3rdparty/asmjit/tools/configure-vs2022-x86.bat b/3rdparty/asmjit/tools/configure-vs2022-x86.bat
new file mode 100644
index 00000000000..0ba350531d9
--- /dev/null
+++ b/3rdparty/asmjit/tools/configure-vs2022-x86.bat
@@ -0,0 +1,2 @@
+@echo off
+cmake .. -B "..\build_vs2022_x86" -G"Visual Studio 17" -A Win32 -DASMJIT_TEST=1
diff --git a/3rdparty/asmjit/tools/configure-xcode.sh b/3rdparty/asmjit/tools/configure-xcode.sh
index a52c9efa0a4..d9c7d983d75 100644
--- a/3rdparty/asmjit/tools/configure-xcode.sh
+++ b/3rdparty/asmjit/tools/configure-xcode.sh
@@ -1,9 +1,8 @@
#!/bin/sh
-BUILD_DIR="build_xcode"
-CURRENT_DIR=`pwd`
+CURRENT_DIR="`pwd`"
+BUILD_DIR="${CURRENT_DIR}/../build"
+BUILD_OPTIONS="-G Xcode -DCMAKE_EXPORT_COMPILE_COMMANDS=ON -DASMJIT_TEST=1"
-mkdir -p ../${BUILD_DIR}
-cd ../${BUILD_DIR}
-cmake .. -G"Xcode" -DASMJIT_TEST=1
-cd ${CURRENT_DIR}
+mkdir -p "${BUILD_DIR}"
+eval cmake "${CURRENT_DIR}/.." -B "${BUILD_DIR}" ${BUILD_OPTIONS}
diff --git a/3rdparty/asmjit/tools/tablegen-arm.js b/3rdparty/asmjit/tools/tablegen-arm.js
new file mode 100644
index 00000000000..e1c829358e2
--- /dev/null
+++ b/3rdparty/asmjit/tools/tablegen-arm.js
@@ -0,0 +1,365 @@
+// [AsmJit]
+// Machine Code Generation for C++.
+//
+// [License]
+// ZLIB - See LICENSE.md file in the package.
+
+// ============================================================================
+// tablegen-arm.js
+// ============================================================================
+
+"use strict";
+
+const { executionAsyncResource } = require("async_hooks");
+const core = require("./tablegen.js");
+const hasOwn = Object.prototype.hasOwnProperty;
+
+const asmdb = core.asmdb;
+const kIndent = core.kIndent;
+const IndexedArray = core.IndexedArray;
+const StringUtils = core.StringUtils;
+
+const FAIL = core.FAIL;
+
+// ============================================================================
+// [ArmDB]
+// ============================================================================
+
+// Create ARM ISA.
+const isa = new asmdb.arm.ISA();
+
+// ============================================================================
+// [tablegen.arm.GenUtils]
+// ============================================================================
+
+class GenUtils {
+ // Get a list of instructions based on `name` and optional `mode`.
+ static query(name, mode) {
+ const insts = isa.query(name);
+ return !mode ? insts : insts.filter(function(inst) { return inst.arch === mode; });
+ }
+
+ static archOf(records) {
+ var t16Arch = false;
+ var t32Arch = false;
+ var a32Arch = false;
+ var a64Arch = false;
+
+ for (var i = 0; i < records.length; i++) {
+ const record = records[i];
+ if (record.encoding === "T16") t16Arch = true;
+ if (record.encoding === "T32") t32Arch = true;
+ if (record.encoding === "A32") a32Arch = true;
+ if (record.encoding === "A64") a64Arch = true;
+ }
+
+ var s = (t16Arch && !t32Arch) ? "T16" :
+ (t32Arch && !t16Arch) ? "T32" :
+ (t16Arch && t32Arch) ? "Txx" : "---";
+ s += " ";
+ s += (a32Arch) ? "A32" : "---";
+ s += " ";
+ s += (a64Arch) ? "A64" : "---";
+
+ return `[${s}]`;
+ }
+
+ static featuresOf(records) {
+ const exts = Object.create(null);
+ for (var i = 0; i < records.length; i++) {
+ const record = records[i];
+ for (var k in record.extensions)
+ exts[k] = true;
+ }
+ const arr = Object.keys(exts);
+ arr.sort();
+ return arr;
+ }
+}
+
+// ============================================================================
+// [tablegen.arm.ArmTableGen]
+// ============================================================================
+
+class ArmTableGen extends core.TableGen {
+ constructor() {
+ super("A64");
+ }
+
+ // --------------------------------------------------------------------------
+ // [Parse / Merge]
+ // --------------------------------------------------------------------------
+
+ parse() {
+ const rawData = this.dataOfFile("src/asmjit/arm/a64instdb.cpp");
+ const stringData = StringUtils.extract(rawData, "// ${InstInfo:Begin}", "// ${InstInfo:End");
+
+ const re = new RegExp(
+ "INST\\(\\s*" +
+ // [01] Instruction.
+ "(" +
+ "[A-Za-z0-9_]+" +
+ ")\\s*,\\s*" +
+
+ // [02] Encoding.
+ "(" +
+ "[^,]+" +
+ ")\\s*,\\s*" +
+
+ // [03] OpcodeData.
+ "(" +
+ "\\([^\\)]+\\)" +
+ ")\\s*,\\s*" +
+
+ // [04] RWInfo.
+ "(" +
+ "[^,]+" +
+ ")\\s*,\\s*" +
+
+ // [05] InstructionFlags.
+ "(\\s*" +
+ "(?:" +
+ "(?:" +
+ "[\\d]+" +
+ "|" +
+ "F\\([^\\)]*\\)" +
+ ")" +
+ "\\s*" +
+ "[|]?\\s*" +
+ ")+" +
+ ")\\s*,\\s*" +
+
+ // --- autogenerated fields ---
+
+ // [06] OpcodeDataIndex.
+ "([^\\)]+)" +
+ "\\s*,\\s*" +
+
+ // [07] NameDataIndex.
+ "([^\\)]+)" +
+ "\\s*\\)"
+ , "g");
+
+ var m;
+ while ((m = re.exec(stringData)) !== null) {
+ var enum_ = m[1];
+ var name = enum_ === "None" ? "" : enum_.toLowerCase();
+ var encoding = m[2].trim();
+ var opcodeData = m[3].trim();
+ var rwInfo = m[4].trim();
+ var instFlags = m[5].trim();
+
+ var displayName = name;
+ if (name.endsWith("_v"))
+ displayName = name.substring(0, name.length - 2);
+
+ // We have just matched #define INST()
+ if (name == "id" &&
+ encoding === "encoding" &&
+ encodingDataIndex === "encodingDataIndex")
+ continue;
+
+ this.addInst({
+ id : 0, // Instruction id (numeric value).
+ name : name, // Instruction name.
+ displayName : displayName, // Instruction name to display.
+ enum : enum_, // Instruction enum without `kId` prefix.
+ encoding : encoding, // Opcode encoding.
+ opcodeData : opcodeData, // Opcode data.
+ opcodeDataIndex : -1, // Opcode data index.
+ rwInfo : rwInfo, // RW info.
+ flags : instFlags, // Instruction flags.
+
+ nameIndex : -1 // Index to InstDB::_nameData.
+ });
+ }
+
+ if (this.insts.length === 0 || this.insts.length !== StringUtils.countOf(stringData, "INST("))
+ FAIL("ARMTableGen.parse(): Invalid parsing regexp (no data parsed)");
+
+ console.log("Number of Instructions: " + this.insts.length);
+ }
+
+ merge() {
+ var s = StringUtils.format(this.insts, "", true, function(inst) {
+ return "INST(" +
+ String(inst.enum ).padEnd(17) + ", " +
+ String(inst.encoding ).padEnd(19) + ", " +
+ String(inst.opcodeData ).padEnd(86) + ", " +
+ String(inst.rwInfo ).padEnd(10) + ", " +
+ String(inst.flags ).padEnd(26) + ", " +
+ String(inst.opcodeDataIndex ).padEnd( 3) + ", " +
+ String(inst.nameIndex ).padEnd( 4) + ")";
+ }) + "\n";
+ return this.inject("InstInfo", s, this.insts.length * 4);
+ }
+
+ // --------------------------------------------------------------------------
+ // [Hooks]
+ // --------------------------------------------------------------------------
+
+ onBeforeRun() {
+ this.load([
+ "src/asmjit/arm/a64emitter.h",
+ "src/asmjit/arm/a64globals.h",
+ "src/asmjit/arm/a64instdb.cpp",
+ "src/asmjit/arm/a64instdb.h",
+ "src/asmjit/arm/a64instdb_p.h"
+ ]);
+ this.parse();
+ }
+
+ onAfterRun() {
+ this.merge();
+ this.save();
+ this.dumpTableSizes();
+ }
+}
+
+// ============================================================================
+// [tablegen.arm.IdEnum]
+// ============================================================================
+
+class IdEnum extends core.IdEnum {
+ constructor() {
+ super("IdEnum");
+ }
+
+ comment(inst) {
+ let name = inst.name;
+ let ext = [];
+
+ if (name.endsWith("_v")) {
+ name = name.substr(0, name.length - 2);
+ ext.push("ASIMD");
+ }
+
+ let exts = "";
+ if (ext.length)
+ exts = " {" + ext.join("&") + "}";
+
+ return `Instruction '${name}'${exts}.`;
+ }
+}
+
+// ============================================================================
+// [tablegen.arm.NameTable]
+// ============================================================================
+
+class NameTable extends core.NameTable {
+ constructor() {
+ super("NameTable");
+ }
+}
+
+// ============================================================================
+// [tablegen.arm.EncodingTable]
+// ============================================================================
+
+class EncodingTable extends core.Task {
+ constructor() {
+ super("EncodingTable");
+ }
+
+ run() {
+ const insts = this.ctx.insts;
+ const map = {};
+
+ for (var i = 0; i < insts.length; i++) {
+ const inst = insts[i];
+
+ const encoding = inst.encoding;
+ const opcodeData = inst.opcodeData.replace(/\(/g, "{ ").replace(/\)/g, " }");
+
+ if (!hasOwn.call(map, encoding))
+ map[encoding] = [];
+
+ if (inst.opcodeData === "(_)") {
+ inst.opcodeDataIndex = 0;
+ continue;
+ }
+
+ const opcodeTable = map[encoding];
+ const opcodeDataIndex = opcodeTable.length;
+
+ opcodeTable.push({ name: inst.name, data: opcodeData });
+ inst.opcodeDataIndex = opcodeDataIndex;
+ }
+
+ const keys = Object.keys(map);
+ keys.sort();
+
+ var tableSource = "";
+ var tableHeader = "";
+ var encodingIds = "";
+
+ encodingIds += "enum EncodingId : uint32_t {\n"
+ encodingIds += " kEncodingNone = 0";
+
+ keys.forEach((dataClass) => {
+ const dataName = dataClass[0].toLowerCase() + dataClass.substr(1);
+ const opcodeTable = map[dataClass];
+ const count = opcodeTable.length;
+
+ if (dataClass !== "None") {
+ encodingIds += ",\n"
+ encodingIds += " kEncoding" + dataClass;
+ }
+
+ if (count) {
+ tableHeader += `extern const ${dataClass} ${dataName}[${count}];\n`;
+
+ if (tableSource)
+ tableSource += "\n";
+
+ tableSource += `const ${dataClass} ${dataName}[${count}] = {\n`;
+ for (var i = 0; i < count; i++) {
+ tableSource += ` ${opcodeTable[i].data}` + (i == count - 1 ? " " : ",") + " // " + opcodeTable[i].name + "\n";
+ }
+ tableSource += `};\n`;
+ }
+ });
+
+ encodingIds += "\n};\n";
+
+ return this.ctx.inject("EncodingId" , StringUtils.disclaimer(encodingIds), 0) +
+ this.ctx.inject("EncodingDataForward", StringUtils.disclaimer(tableHeader), 0) +
+ this.ctx.inject("EncodingData" , StringUtils.disclaimer(tableSource), 0);
+ }
+}
+// ============================================================================
+// [tablegen.arm.CommonTable]
+// ============================================================================
+
+class CommonTable extends core.Task {
+ constructor() {
+ super("CommonTable", [
+ "IdEnum",
+ "NameTable"
+ ]);
+ }
+
+ run() {
+ //const table = new IndexedArray();
+
+ //for (var i = 0; i < insts.length; i++) {
+ // const inst = insts[i];
+ // const item = "{ " + "0" + "}";
+ // inst.commonIndex = table.addIndexed(item);
+ //}
+
+ // return this.ctx.inject("InstInfo", StringUtils.disclaimer(s), 0);
+ return 0;
+ }
+}
+
+// ============================================================================
+// [Main]
+// ============================================================================
+
+new ArmTableGen()
+ .addTask(new IdEnum())
+ .addTask(new NameTable())
+ .addTask(new EncodingTable())
+ .addTask(new CommonTable())
+ .run();
diff --git a/3rdparty/asmjit/tools/tablegen-arm.sh b/3rdparty/asmjit/tools/tablegen-arm.sh
new file mode 100644
index 00000000000..8545c1e71ba
--- /dev/null
+++ b/3rdparty/asmjit/tools/tablegen-arm.sh
@@ -0,0 +1,3 @@
+#!/bin/sh
+
+node ./tablegen-arm.js
diff --git a/3rdparty/asmjit/tools/tablegen-x86.js b/3rdparty/asmjit/tools/tablegen-x86.js
index dfd0f40b6ef..61fc7349605 100644
--- a/3rdparty/asmjit/tools/tablegen-x86.js
+++ b/3rdparty/asmjit/tools/tablegen-x86.js
@@ -1,25 +1,7 @@
-// AsmJit - Machine code generation for C++
+// This file is part of AsmJit project <https://asmjit.com>
//
-// * Official AsmJit Home Page: https://asmjit.com
-// * Official Github Repository: https://github.com/asmjit/asmjit
-//
-// Copyright (c) 2008-2020 The AsmJit Authors
-//
-// This software is provided 'as-is', without any express or implied
-// warranty. In no event will the authors be held liable for any damages
-// arising from the use of this software.
-//
-// Permission is granted to anyone to use this software for any purpose,
-// including commercial applications, and to alter it and redistribute it
-// freely, subject to the following restrictions:
-//
-// 1. The origin of this software must not be misrepresented; you must not
-// claim that you wrote the original software. If you use this software
-// in a product, an acknowledgment in the product documentation would be
-// appreciated but is not required.
-// 2. Altered source versions must be plainly marked as such, and must not be
-// misrepresented as being the original software.
-// 3. This notice may not be removed or altered from any source distribution.
+// See asmjit.h or LICENSE.md for license and copyright information
+// SPDX-License-Identifier: Zlib
// ============================================================================
// tablegen-x86.js
@@ -69,7 +51,18 @@ const x86isa = new asmdb.x86.ISA({
["imul", "r64, ib" , "RMI" , "REX.W 6B /r ib", "X64 OF=W SF=W ZF=U AF=U PF=U CF=W"],
["imul", "r16, iw" , "RMI" , "66 69 /r iw" , "ANY OF=W SF=W ZF=U AF=U PF=U CF=W"],
["imul", "r32, id" , "RMI" , "69 /r id" , "ANY OF=W SF=W ZF=U AF=U PF=U CF=W"],
- ["imul", "r64, id" , "RMI" , "REX.W 69 /r id", "X64 OF=W SF=W ZF=U AF=U PF=U CF=W"]
+ ["imul", "r64, id" , "RMI" , "REX.W 69 /r id", "X64 OF=W SF=W ZF=U AF=U PF=U CF=W"],
+
+ // Movabs (X64 only).
+ ["movabs", "W:r64, iq/uq" , "I" , "REX.W B8+r iq", "X64"],
+ ["movabs", "w:al, moff8" , "NONE", "A0" , "X64"],
+ ["movabs", "w:ax, moff16" , "NONE", "66 A1" , "X64"],
+ ["movabs", "W:eax, moff32", "NONE", "A1" , "X64"],
+ ["movabs", "W:rax, moff64", "NONE", "REX.W A1" , "X64"],
+ ["movabs", "W:moff8, al" , "NONE", "A2" , "X64"],
+ ["movabs", "W:moff16, ax" , "NONE", "66 A3" , "X64"],
+ ["movabs", "W:moff32, eax", "NONE", "A3" , "X64"],
+ ["movabs", "W:moff64, rax", "NONE", "REX.W A3" , "X64"]
]
});
@@ -138,6 +131,25 @@ class Filter {
// [tablegen.x86.GenUtils]
// ============================================================================
+const VexToEvexMap = {
+ "vbroadcastf128": "vbroadcastf32x4",
+ "vbroadcasti128": "vbroadcasti32x4",
+ "vextractf128": "vextractf32x4",
+ "vextracti128": "vextracti32x4",
+ "vinsertf128": "vinsertf32x4",
+ "vinserti128": "vinserti32x4",
+ "vmovdqa": "vmovdqa32",
+ "vmovdqu": "vmovdqu32",
+ "vpand": "vpandd",
+ "vpandn": "vpandnd",
+ "vpor": "vpord",
+ "vpxor": "vpxord",
+ "vroundpd": "vrndscalepd",
+ "vroundps": "vrndscaleps",
+ "vroundsd": "vrndscalesd",
+ "vroundss": "vrndscaless"
+};
+
class GenUtils {
static cpuArchOf(dbInsts) {
var anyArch = false;
@@ -158,20 +170,66 @@ class GenUtils {
return ArrayUtils.sorted(dbInsts.unionCpuFeatures());
}
- static flagsOf(dbInsts) {
- function replace(map, a, b, c) {
- if (map[a] && map[b]) {
- delete map[a];
- delete map[b];
- map[c] = true;
+ static assignVexEvexCompatibilityFlags(f, dbInsts) {
+ const vexInsts = dbInsts.filter((inst) => { return inst.prefix === "VEX"; });
+ const evexInsts = dbInsts.filter((inst) => { return inst.prefix === "EVEX"; });
+
+ function isCompatible(vexInst, evexInst) {
+ if (vexInst.operands.length !== evexInst.operands.length)
+ return false;
+
+ for (let i = 0; i < vexInst.operands.length; i++) {
+ const vexOp = vexInst.operands[i];
+ const evexOp = evexInst.operands[i];
+
+ if (vexOp.data === evexOp.data)
+ continue;
+
+ if (vexOp.reg && vexOp.reg === evexOp.reg)
+ continue;
+ if (vexOp.mem && vexOp.mem === evexOp.mem)
+ continue;
+
+ return false;
}
+ return true;
+ }
+
+ let compatible = 0;
+ for (const vexInst of vexInsts) {
+ for (const evexInst of evexInsts) {
+ if (isCompatible(vexInst, evexInst)) {
+ compatible++;
+ break;
+ }
+ }
+ }
+
+ if (compatible == vexInsts.length) {
+ f.EvexCompat = true;
+ return true;
}
+ if (evexInsts[0].operands[0].reg === "k") {
+ f.EvexKReg = true;
+ return true;
+ }
+
+ if (evexInsts[0].operands.length == 2 && vexInsts[0].operands.length === 3) {
+ f.EvexTwoOp = true;
+ return true;
+ }
+
+ return false;
+ }
+
+ static flagsOf(dbInsts) {
const f = Object.create(null);
var i, j;
var mib = dbInsts.length > 0 && /^(?:bndldx|bndstx)$/.test(dbInsts[0].name);
- if (mib) f.Mib = true;
+ if (mib)
+ f.Mib = true;
var mmx = false;
var vec = false;
@@ -190,7 +248,7 @@ class GenUtils {
const op = operands[j];
if (op.reg === "mm")
mmx = true;
- else if (/^(k|xmm|ymm|zmm)$/.test(op.reg)) {
+ else if (/^(xmm|ymm|zmm)$/.test(op.reg)) {
vec = true;
}
}
@@ -203,13 +261,14 @@ class GenUtils {
const dbInst = dbInsts[i];
const operands = dbInst.operands;
- if (dbInst.attributes.Lock ) f.Lock = true;
- if (dbInst.attributes.XAcquire ) f.XAcquire = true;
- if (dbInst.attributes.XRelease ) f.XRelease = true;
- if (dbInst.attributes.BND ) f.Rep = true;
- if (dbInst.attributes.REP ) f.Rep = true;
- if (dbInst.attributes.REPNE ) f.Rep = true;
- if (dbInst.attributes.RepIgnored) f.RepIgnored = true;
+ if (dbInst.attributes.Lock ) f.Lock = true;
+ if (dbInst.attributes.XAcquire ) f.XAcquire = true;
+ if (dbInst.attributes.XRelease ) f.XRelease = true;
+ if (dbInst.attributes.BND ) f.Rep = true;
+ if (dbInst.attributes.REP ) f.Rep = true;
+ if (dbInst.attributes.REPNE ) f.Rep = true;
+ if (dbInst.attributes.RepIgnored ) f.RepIgnored = true;
+ if (dbInst.attributes.ImplicitZeroing) f.Avx512ImplicitZ = true;
if (dbInst.fpu) {
for (var j = 0; j < operands.length; j++) {
@@ -221,6 +280,9 @@ class GenUtils {
}
}
+ if (dbInst.attributes.Tsib)
+ f.Tsib = true;
+
if (dbInst.vsibReg)
f.Vsib = true;
@@ -230,6 +292,9 @@ class GenUtils {
if (dbInst.prefix === "EVEX") {
f.Evex = true;
+ if (dbInst.extensions["AVX512_VNNI"])
+ f.PreferEvex = true;
+
if (dbInst.kmask) f.Avx512K = true;
if (dbInst.zmask) f.Avx512Z = true;
@@ -239,22 +304,18 @@ class GenUtils {
if (dbInst.broadcast) f["Avx512B" + String(dbInst.elementSize)] = true;
if (dbInst.tupleType === "T1_4X") f.Avx512T4X = true;
}
+
+ if (VexToEvexMap[dbInst.name])
+ f.EvexTransformable = true;
+ }
+
+ if (f.Vex && f.Evex) {
+ GenUtils.assignVexEvexCompatibilityFlags(f, dbInsts)
}
- replace(f, "Avx512K" , "Avx512Z" , "Avx512KZ");
- replace(f, "Avx512ER" , "Avx512SAE" , "Avx512ER_SAE");
- replace(f, "Avx512KZ" , "Avx512SAE" , "Avx512KZ_SAE");
- replace(f, "Avx512KZ" , "Avx512ER_SAE", "Avx512KZ_ER_SAE");
- replace(f, "Avx512K" , "Avx512B32" , "Avx512K_B32");
- replace(f, "Avx512K" , "Avx512B64" , "Avx512K_B64");
- replace(f, "Avx512KZ" , "Avx512B32" , "Avx512KZ_B32");
- replace(f, "Avx512KZ" , "Avx512B64" , "Avx512KZ_B64");
- replace(f, "Avx512KZ_SAE" , "Avx512B32" , "Avx512KZ_SAE_B32");
- replace(f, "Avx512KZ_SAE" , "Avx512B64" , "Avx512KZ_SAE_B64");
- replace(f, "Avx512KZ_ER_SAE", "Avx512B32" , "Avx512KZ_ER_SAE_B32");
- replace(f, "Avx512KZ_ER_SAE", "Avx512B64" , "Avx512KZ_ER_SAE_B64");
-
- return Object.getOwnPropertyNames(f);
+ const result = Object.getOwnPropertyNames(f);
+ result.sort();
+ return result;
}
static eqOps(aOps, aFrom, bOps, bFrom) {
@@ -279,6 +340,20 @@ class GenUtils {
}
}
+ // Prevent some instructions from having implicit memory size if that would
+ // make them ambiguous. There are some instructions where the ambiguity is
+ // okay, but some like 'push' and 'pop' where it isn't.
+ static canUseImplicitMemSize(name) {
+ switch (name) {
+ case "pop":
+ case "push":
+ return false;
+
+ default:
+ return true;
+ }
+ }
+
static singleRegCase(name) {
switch (name) {
case "xchg" :
@@ -308,6 +383,16 @@ class GenUtils {
case "xorpd" : case "vxorpd" :
case "xorps" : case "vxorps" :
+ case "kxnorb":
+ case "kxnord":
+ case "kxnorw":
+ case "kxnorq":
+
+ case "kxorb":
+ case "kxord":
+ case "kxorw":
+ case "kxorq":
+
case "sub" :
case "sbb" :
case "psubb" : case "vpsubb" :
@@ -362,12 +447,12 @@ class GenUtils {
}
}
- static controlType(dbInsts) {
+ static controlFlow(dbInsts) {
if (dbInsts.checkAttribute("Control", "Jump")) return "Jump";
if (dbInsts.checkAttribute("Control", "Call")) return "Call";
if (dbInsts.checkAttribute("Control", "Branch")) return "Branch";
if (dbInsts.checkAttribute("Control", "Return")) return "Return";
- return "None";
+ return "Regular";
}
}
@@ -378,6 +463,8 @@ class GenUtils {
class X86TableGen extends core.TableGen {
constructor() {
super("X86");
+
+ this.emitMissingString = "";
}
// --------------------------------------------------------------------------
@@ -431,31 +518,32 @@ class X86TableGen extends core.TableGen {
FAIL(`Instruction '${name}' not found in asmdb`);
const flags = GenUtils.flagsOf(dbInsts);
- const controlType = GenUtils.controlType(dbInsts);
+ const controlFlow = GenUtils.controlFlow(dbInsts);
const singleRegCase = GenUtils.singleRegCase(name);
this.addInst({
- id : 0, // Instruction id (numeric value).
- name : name, // Instruction name.
- enum : enum_, // Instruction enum without `kId` prefix.
- dbInsts : dbInsts, // All dbInsts returned from asmdb query.
- encoding : encoding, // Instruction encoding.
- opcode0 : opcode0, // Primary opcode.
- opcode1 : opcode1, // Secondary opcode.
- flags : flags,
- signatures : null, // Instruction signatures.
- controlType : controlType,
- singleRegCase : singleRegCase,
-
- mainOpcodeValue : -1, // Main opcode value (0.255 hex).
- mainOpcodeIndex : -1, // Index to InstDB::_mainOpcodeTable.
- altOpcodeIndex : -1, // Index to InstDB::_altOpcodeTable.
- nameIndex : -1, // Index to InstDB::_nameData.
- commonInfoIndexA : -1,
- commomInfoIndexB : -1,
-
- signatureIndex : -1,
- signatureCount : -1
+ id : 0, // Instruction id (numeric value).
+ name : name, // Instruction name.
+ displayName : name, // Instruction name to display.
+ enum : enum_, // Instruction enum without `kId` prefix.
+ dbInsts : dbInsts, // All dbInsts returned from asmdb query.
+ encoding : encoding, // Instruction encoding.
+ opcode0 : opcode0, // Primary opcode.
+ opcode1 : opcode1, // Secondary opcode.
+ flags : flags,
+ signatures : null, // Instruction signatures.
+ controlFlow : controlFlow,
+ singleRegCase : singleRegCase,
+
+ mainOpcodeValue : -1, // Main opcode value (0.255 hex).
+ mainOpcodeIndex : -1, // Index to InstDB::_mainOpcodeTable.
+ altOpcodeIndex : -1, // Index to InstDB::_altOpcodeTable.
+ nameIndex : -1, // Index to InstDB::_nameData.
+ commonInfoIndex : -1,
+ additionalInfoIndex: -1,
+
+ signatureIndex : -1,
+ signatureCount : -1
});
}
@@ -468,15 +556,15 @@ class X86TableGen extends core.TableGen {
merge() {
var s = StringUtils.format(this.insts, "", true, function(inst) {
return "INST(" +
- String(inst.enum ).padEnd(17) + ", " +
- String(inst.encoding ).padEnd(19) + ", " +
- String(inst.opcode0 ).padEnd(26) + ", " +
- String(inst.opcode1 ).padEnd(26) + ", " +
- String(inst.mainOpcodeIndex ).padEnd( 3) + ", " +
- String(inst.altOpcodeIndex ).padEnd( 3) + ", " +
- String(inst.nameIndex ).padEnd( 5) + ", " +
- String(inst.commonInfoIndexA).padEnd( 3) + ", " +
- String(inst.commomInfoIndexB).padEnd( 3) + ")";
+ String(inst.enum ).padEnd(17) + ", " +
+ String(inst.encoding ).padEnd(19) + ", " +
+ String(inst.opcode0 ).padEnd(26) + ", " +
+ String(inst.opcode1 ).padEnd(26) + ", " +
+ String(inst.mainOpcodeIndex ).padEnd( 3) + ", " +
+ String(inst.altOpcodeIndex ).padEnd( 3) + ", " +
+ String(inst.nameIndex ).padEnd( 5) + ", " +
+ String(inst.commonInfoIndex ).padEnd( 3) + ", " +
+ String(inst.additionalInfoIndex).padEnd( 3) + ")";
}) + "\n";
this.inject("InstInfo", s, this.insts.length * 8);
}
@@ -509,13 +597,16 @@ class X86TableGen extends core.TableGen {
String(inst.encoding ).padEnd(19) + ", " +
String(inst.opcode0 ).padEnd(26) + ", " +
String(inst.opcode1 ).padEnd(26) + ", " +
- String("0" ).padEnd( 4) + ", " +
+ String("0" ).padEnd( 3) + ", " +
+ String("0" ).padEnd( 3) + ", " +
+ String("0" ).padEnd( 5) + ", " +
String("0" ).padEnd( 3) + ", " +
String("0" ).padEnd( 3) + "),\n";
}
}
}, this);
console.log(out);
+ console.log(this.emitMissingString);
}
newInstFromGroup(dbInsts) {
@@ -540,24 +631,83 @@ class X86TableGen extends core.TableGen {
return s === "VEX" || s === "EVEX" || s === "XOP";
}
+ function formatEmit(dbi) {
+ const results = [];
+ const nameUp = dbi.name[0].toUpperCase() + dbi.name.substr(1);
+
+ for (let choice = 0; choice < 2; choice++) {
+ let s = `ASMJIT_INST_${dbi.operands.length}x(${dbi.name}, ${nameUp}`;
+ for (let j = 0; j < dbi.operands.length; j++) {
+ s += ", ";
+ const op = dbi.operands[j];
+ var reg = op.reg;
+ var mem = op.mem;
+
+ if (op.isReg() && op.isMem()) {
+ if (choice == 0) mem = null;
+ if (choice == 1) reg = null;
+ }
+
+ if (reg) {
+ if (reg === "xmm" || reg === "ymm" || reg === "zmm")
+ s += "Vec";
+ else if (reg === "k")
+ s += "KReg";
+ else if (reg === "r32" || reg === "r64" || reg === "r16" || reg === "r8")
+ s += "Gp";
+ else
+ s += reg;
+ }
+ else if (mem) {
+ s += "Mem";
+ }
+ else if (op.isImm()) {
+ s += "Imm";
+ }
+ else {
+ s += "Unknown";
+ }
+ }
+ s += `)`;
+ results.push(s);
+ }
+
+ return results;
+ }
+
var dbi = dbInsts[0];
- var id = this.insts.length;
- var name = dbi.name;
- var enum_ = name[0].toUpperCase() + name.substr(1);
+ var id = this.insts.length;
+ var name = dbi.name;
+ var enum_ = name[0].toUpperCase() + name.substr(1);
- var opcode = dbi.opcodeHex;
- var rm = dbi.rm;
- var mm = dbi.mm;
- var pp = dbi.pp;
+ var opcode = dbi.opcodeHex;
+ var modR = dbi.modR;
+ var mm = dbi.mm;
+ var pp = dbi.pp;
var encoding = dbi.encoding;
- var isVec = isVecPrefix(dbi.prefix);
-
- var access = GetAccess(dbi);
+ var isVec = isVecPrefix(dbi.prefix);
+ var evexCount = 0;
+
+ var access = GetAccess(dbi);
+
+ var vexL = undefined;
+ var vexW = undefined;
+ var evexW = undefined;
+ var cdshl = "_";
+ var tupleType = "_";
+
+ const tupleTypeToCDSHL = {
+ "FVM": "4",
+ "FV": "4",
+ "HVM": "3",
+ "HV": "3",
+ "QVM": "2",
+ "QV": "2",
+ "T1S": "?"
+ }
- var vexL = undefined;
- var vexW = undefined;
- var evexW = undefined;
+ const emitMap = {};
for (var i = 0; i < dbInsts.length; i++) {
dbi = dbInsts[i];
@@ -577,47 +727,66 @@ class X86TableGen extends core.TableGen {
}
if (dbi.prefix === "EVEX") {
+ evexCount++;
var newEvexW = String(dbi.w === "W0" ? 0 : dbi.w === "W1" ? 1 : "_");
if (evexW !== undefined && evexW !== newEvexW)
evexW = "x";
else
evexW = newEvexW;
+
+ if (dbi.tupleType) {
+ if (tupleType !== "_" && tupleType !== dbi.tupleType) {
+ console.log(`${dbi.name}: WARNING: TupleType ${tupleType} != ${dbi.tupleType}`);
+ }
+
+ tupleType = dbi.tupleType;
+ }
}
- if (opcode !== dbi.opcodeHex ) { console.log(`ISSUE: Opcode ${opcode} != ${dbi.opcodeHex}`); return null; }
- if (rm !== dbi.rm ) { console.log(`ISSUE: RM ${rm} != ${dbi.rm}`); return null; }
- if (mm !== dbi.mm ) { console.log(`ISSUE: MM ${mm} != ${dbi.mm}`); return null; }
- if (pp !== dbi.pp ) { console.log(`ISSUE: PP ${pp} != ${dbi.pp}`); return null; }
- if (encoding !== dbi.encoding ) { console.log(`ISSUE: Enc ${encoding} != ${dbi.encoding}`); return null; }
- if (access !== GetAccess(dbi)) { console.log(`ISSUE: Access ${access} != ${GetAccess(dbi)}`); return null; }
- if (isVec != isVecPrefix(dbi.prefix)) { console.log(`ISSUE: Vex/Non-Vex mismatch`); return null; }
+ if (opcode !== dbi.opcodeHex ) { console.log(`${dbi.name}: ISSUE: Opcode ${opcode} != ${dbi.opcodeHex}`); return null; }
+ if (modR !== dbi.modR ) { console.log(`${dbi.name}: ISSUE: ModR ${modR} != ${dbi.modR}`); return null; }
+ if (mm !== dbi.mm ) { console.log(`${dbi.name}: ISSUE: MM ${mm} != ${dbi.mm}`); return null; }
+ if (pp !== dbi.pp ) { console.log(`${dbi.name}: ISSUE: PP ${pp} != ${dbi.pp}`); return null; }
+ if (encoding !== dbi.encoding ) { console.log(`${dbi.name}: ISSUE: Enc ${encoding} != ${dbi.encoding}`); return null; }
+ if (access !== GetAccess(dbi)) { console.log(`${dbi.name}: ISSUE: Access ${access} != ${GetAccess(dbi)}`); return null; }
+ if (isVec != isVecPrefix(dbi.prefix)) { console.log(`${dbi.name}: ISSUE: Vex/Non-Vex mismatch`); return null; }
+
+ formatEmit(dbi).forEach((emit) => {
+ if (!emitMap[emit]) {
+ emitMap[emit] = true;
+ this.emitMissingString += emit + "\n";
+ }
+ });
}
+ if (tupleType !== "_")
+ cdshl = tupleTypeToCDSHL[tupleType] || "?";
+
var ppmm = pp.padEnd(2).replace(/ /g, "0") +
mm.padEnd(4).replace(/ /g, "0") ;
var composed = composeOpCode({
- type : isVec ? "V" : "O",
+ type : evexCount == dbInsts.length ? "E" : isVec ? "V" : "O",
prefix: ppmm,
opcode: opcode,
- o : rm === "r" ? "_" : (rm ? rm : "_"),
+ o : modR === "r" ? "_" : (modR ? modR : "_"),
l : vexL !== undefined ? vexL : "_",
w : vexW !== undefined ? vexW : "_",
ew : evexW !== undefined ? evexW : "_",
- en : "_",
- tt : "_ "
+ en : cdshl,
+ tt : dbi.modRM ? dbi.modRM + " " : tupleType.padEnd(3)
});
return {
- id : id,
- name : name,
- enum : enum_,
- encoding : encoding,
- opcode0 : composed,
- opcode1 : "0",
- nameIndex : -1,
- commonInfoIndexA : -1,
- commomInfoIndexB : -1
+ id : id,
+ name : name,
+ enum : enum_,
+ encoding : encoding,
+ opcode0 : composed,
+ opcode1 : "0",
+ nameIndex : -1,
+ commonInfoIndex : -1,
+ additionalInfoIndex: -1
};
}
@@ -663,11 +832,21 @@ class IdEnum extends core.IdEnum {
var text = "";
var features = GenUtils.cpuFeaturesOf(dbInsts);
+ const priorityFeatures = ["AVX_VNNI"];
+
if (features.length) {
text += "{";
const avxFeatures = filterAVX(features, true);
const otherFeatures = filterAVX(features, false);
+ for (const pf of priorityFeatures) {
+ const index = avxFeatures.indexOf(pf);
+ if (index != -1) {
+ avxFeatures.splice(index, 1);
+ avxFeatures.unshift(pf);
+ }
+ }
+
const vl = avxFeatures.indexOf("AVX512_VL");
if (vl !== -1) avxFeatures.splice(vl, 1);
@@ -716,39 +895,103 @@ class AltOpcodeTable extends core.Task {
const mainOpcodeTable = new IndexedArray();
const altOpcodeTable = new IndexedArray();
- mainOpcodeTable.addIndexed("O(000000,00,0,0,0,0,0,_ )");
+ const cdttSimplification = {
+ "0" : "None",
+ "_" : "None",
+ "FV" : "ByLL",
+ "HV" : "ByLL",
+ "QV" : "ByLL",
+ "FVM" : "ByLL",
+ "T1S" : "None",
+ "T1F" : "None",
+ "T1_4X": "None",
+ "T2" : "None",
+ "T4" : "None",
+ "T8" : "None",
+ "HVM" : "ByLL",
+ "QVM" : "ByLL",
+ "OVM" : "ByLL",
+ "128" : "None",
+ "T4X" : "None"
+ }
- function indexOpcode(opcode) {
- if (opcode === "0")
- return ["00", 0];
+ const noOp = "O(000000,00,0,0,0,0,0,0 )";
+
+ mainOpcodeTable.addIndexed(noOp);
- // O_FPU(__,__OP,_)
- if (opcode.startsWith("O_FPU(")) {
- var value = opcode.substring(11, 13);
- var remaining = opcode.substring(0, 11) + "00" + opcode.substring(13);
+ function splitOpcodeToComponents(opcode) {
+ const i = opcode.indexOf("(");
+ const prefix = opcode.substr(0, i);
+ return [prefix].concat(opcode.substring(i + 1, opcode.length - 1).split(","));
+ }
- return [value, mainOpcodeTable.addIndexed(remaining.padEnd(26))];
+ function normalizeOpcodeComponents(components) {
+ for (let i = 1; i < components.length; i++) {
+ components[i] = components[i].trim();
+ // These all are zeros that only have some contextual meaning in the table, but the assembler doesn't care.
+ if (components[i] === "_" || components[i] === "I" || components[i] === "x")
+ components[i] = "0";
}
- // X(______,OP,_,_,_,_,_,_ )
- if (opcode.startsWith("O_FPU(") || opcode.startsWith("O(") || opcode.startsWith("V(") || opcode.startsWith("E(")) {
- var value = opcode.substring(9, 11);
- var remaining = opcode.substring(0, 9) + "00" + opcode.substring(11);
+ // Simplify CDTT (compressed displacement TupleType).
+ if (components.length >= 9) {
+ if (components[0] === "V" || components[0] === "E") {
+ const cdtt = components[8];
+ if (cdttSimplification[cdtt] !== undefined)
+ components[8] = cdttSimplification[cdtt];
+ }
+ }
+ return components;
+ }
- remaining = remaining.replace(/,[_xI],/g, ",0,");
- remaining = remaining.replace(/,[_xI],/g, ",0,");
- return [value, mainOpcodeTable.addIndexed(remaining.padEnd(26))];
+ function joinOpcodeComponents(components) {
+ const prefix = components[0];
+ const values = components.slice(1);
+ if (values.length >= 8)
+ values[7] = values[7].padEnd(4);
+ return prefix + "(" + values.join(",") + ")";
+ }
+
+ function indexMainOpcode(opcode) {
+ if (opcode === "0")
+ return ["00", 0];
+
+ var opcodeByte = "";
+ const components = normalizeOpcodeComponents(splitOpcodeToComponents(opcode));
+
+ if (components[0] === "O_FPU") {
+ // Reset opcode byte, this is stored in the instruction data itself.
+ opcodeByte = components[2].substr(2, 2);
+ components[2] = components[2].substr(0, 2) + "00";
+ }
+ else if (components[0] === "O" || components[0] === "V" || components[0] === "E") {
+ // Reset opcode byte, this is stored in the instruction data itself.
+ opcodeByte = components[2];
+ components[2] = "00";
+ }
+ else {
+ FAIL(`Failed to process opcode '${opcode}'`);
}
- FAIL(`Failed to process opcode '${opcode}'`);
+ const newOpcode = joinOpcodeComponents(components);
+ return [opcodeByte, mainOpcodeTable.addIndexed(newOpcode.padEnd(27))];
+ }
+
+ function indexAltOpcode(opcode) {
+ if (opcode === "0")
+ opcode = noOp;
+ else
+ opcode = joinOpcodeComponents(normalizeOpcodeComponents(splitOpcodeToComponents(opcode)));
+ return altOpcodeTable.addIndexed(opcode.padEnd(27));
}
insts.map((inst) => {
- const [value, index] = indexOpcode(inst.opcode0);
+ const [value, index] = indexMainOpcode(inst.opcode0);
inst.mainOpcodeValue = value;
inst.mainOpcodeIndex = index;
- inst.altOpcodeIndex = altOpcodeTable.addIndexed(inst.opcode1.padEnd(26));
+ inst.altOpcodeIndex = indexAltOpcode(inst.opcode1);
});
+
// console.log(mainOpcodeTable.length);
// console.log(StringUtils.format(mainOpcodeTable, kIndent, true));
@@ -763,138 +1006,6 @@ class AltOpcodeTable extends core.Task {
}
// ============================================================================
-// [tablegen.x86.SseToAvxTable]
-// ============================================================================
-/*
-// Removed from asmjit.
-class InstSseToAvxTable extends core.Task {
- constructor() {
- super("InstSseToAvxTable", ["IdEnum"]);
- }
-
- run() {
- const insts = this.ctx.insts;
-
- const dataTable = new IndexedArray();
- const indexTable = [];
-
- function add(data) {
- return dataTable.addIndexed("{ " + `SseToAvxData::kMode${data.mode}`.padEnd(28) + ", " + String(data.delta).padEnd(4) + " }");
- }
-
- // This will receive a zero index, which means that no SseToAvx or AvxToSSe translation is possible.
- const kInvalidIndex = add({ mode: "None", delta: 0 });
- insts.forEach((inst) => { indexTable.push(kInvalidIndex); });
-
- insts.forEach((inst) => {
- // If it's not `kInvalidIndex` it's an AVX instruction that shares the
- // SseToAvx data. We won't touch it as it already has the index assigned.
- if (indexTable[inst.id] === kInvalidIndex) {
- const data = this.calcSseToAvxData(inst.dbInsts);
- const index = add(data);
-
- indexTable[inst.id] = index;
- if (data.delta !== 0)
- indexTable[this.ctx.instMap["v" + inst.name].id] = index;
- }
- });
-
- this.inject("SseToAvxIndex",
- disclaimer(`static const uint8_t sseToAvxIndex[] = {\n${StringUtils.format(indexTable, kIndent, -1)}\n};\n`),
- indexTable.length * 1);
-
- this.inject("SseToAvxTable",
- disclaimer(`static const SseToAvxData sseToAvxData[] = {\n${StringUtils.format(dataTable, kIndent, true)}\n};\n`),
- dataTable.length * 2);
- }
-
- filterSseToAvx(dbInsts) {
- const filtered = [];
- for (var x = 0; x < dbInsts.length; x++) {
- const dbInst = dbInsts[x];
- const ops = dbInst.operands;
-
- // SSE instruction does never share its name with AVX one.
- if (/^(VEX|XOP|EVEX)$/.test(dbInst.prefix))
- return [];
-
- var ok = false;
- for (var y = 0; y < ops.length; y++) {
- // There is no AVX instruction that works with MMX regs.
- if (ops[y].reg === "mm") { ok = false; break; }
- if (ops[y].reg === "xmm") { ok = true; }
- }
-
- if (ok)
- filtered.push(dbInst);
- }
-
- return filtered;
- }
-
- calcSseToAvxData(dbInsts) {
- const data = {
- mode : "None", // No conversion by default.
- delta: 0 // 0 if no conversion is possible.
- };
-
- const dbSseInsts = this.filterSseToAvx(dbInsts);
- if (!dbSseInsts.length)
- return data;
-
- const sseName = dbSseInsts[0].name;
- const avxName = "v" + sseName;
-
- const dbAvxInsts = this.ctx.query(avxName);
- if (!dbAvxInsts.length) {
- DEBUG(`SseToAvx: Instruction '${sseName}' has no AVX counterpart`);
- return data;
- }
-
- if (avxName === "vblendvpd" || avxName === "vblendvps" || avxName === "vpblendvb") {
- // Special cases first.
- data.mode = "Blend";
- }
- else {
- // Common case, deduce conversion mode by checking both SSE and AVX instructions.
- const map = Object.create(null);
- for (var sseIndex = 0; sseIndex < dbSseInsts.length; sseIndex++) {
- const sseInst = dbSseInsts[sseIndex];
- var match = false;
-
- for (var avxIndex = 0; avxIndex < dbAvxInsts.length; avxIndex++) {
- const avxInst = dbAvxInsts[avxIndex];
-
- // Select only VEX instructions.
- if (avxInst.prefix !== "VEX") continue;
-
- // Check if the AVX version is the same.
- if (GenUtils.eqOps(avxInst.operands, 0, sseInst.operands, 0)) {
- map.raw = true;
- match = true;
- }
- else if (avxInst.operands[0].data === "xmm" && GenUtils.eqOps(avxInst.operands, 1, sseInst.operands, 0)) {
- map.nds = true;
- match = true;
- }
- }
-
- if (!match) {
- const signature = sseInst.operands.map(function(op) { return op.data; }).join(", ");
- console.log(`SseToAvx: Instruction '${sseName}(${signature})' has no AVX counterpart`);
- return data;
- }
- }
-
- data.mode = (map.raw && !map.nds) ? "Move" : (map.raw && map.nds) ? "MoveIfMem" : "Extend";
- }
- data.delta = this.ctx.instMap[avxName].id - this.ctx.instMap[sseName].id;
- return data;
- }
-}
-*/
-
-// ============================================================================
// [tablegen.x86.InstSignatureTable]
// ============================================================================
@@ -902,83 +1013,32 @@ const RegOp = MapUtils.arrayToMap(["al", "ah", "ax", "eax", "rax", "cl", "r8lo",
const MemOp = MapUtils.arrayToMap(["m8", "m16", "m32", "m48", "m64", "m80", "m128", "m256", "m512", "m1024"]);
const cmpOp = StringUtils.makePriorityCompare([
- "r8lo", "r8hi", "r16", "r32", "r64", "xmm", "ymm", "zmm", "mm", "k", "sreg", "creg", "dreg", "st", "bnd",
- "mem", "vm", "m8", "m16", "m32", "m48", "m64", "m80", "m128", "m256", "m512", "m1024",
- "mib",
- "vm32x", "vm32y", "vm32z", "vm64x", "vm64y", "vm64z",
- "memBase", "memES", "memDS",
- "i4", "u4", "i8", "u8", "i16", "u16", "i32", "u32", "i64", "u64",
- "rel8", "rel32",
- "implicit"
+ "RegGpbLo", "RegGpbHi", "RegGpw", "RegGpd", "RegGpq", "RegXmm", "RegYmm", "RegZmm", "RegMm", "RegKReg", "RegSReg", "RegCReg", "RegDReg", "RegSt", "RegBnd", "RegTmm",
+ "MemUnspecified", "Mem8", "Mem16", "Mem32", "Mem48", "Mem64", "Mem80", "Mem128", "Mem256", "Mem512", "Mem1024",
+ "Vm32x", "Vm32y", "Vm32z", "Vm64x", "Vm64y", "Vm64z",
+ "ImmI4", "ImmU4", "ImmI8", "ImmU8", "ImmI16", "ImmU16", "ImmI32", "ImmU32", "ImmI64", "ImmU64",
+ "Rel8", "Rel32",
+ "FlagMemBase",
+ "FlagMemDs",
+ "FlagMemEs",
+ "FlagMib",
+ "FlagTMem",
+ "FlagConsecutive",
+ "FlagImplicit"
]);
-const OpToAsmJitOp = {
- "implicit": "F(Implicit)",
-
- "r8lo" : "F(GpbLo)",
- "r8hi" : "F(GpbHi)",
- "r16" : "F(Gpw)",
- "r32" : "F(Gpd)",
- "r64" : "F(Gpq)",
- "xmm" : "F(Xmm)",
- "ymm" : "F(Ymm)",
- "zmm" : "F(Zmm)",
- "mm" : "F(Mm)",
- "k" : "F(KReg)",
- "sreg" : "F(SReg)",
- "creg" : "F(CReg)",
- "dreg" : "F(DReg)",
- "st" : "F(St)",
- "bnd" : "F(Bnd)",
-
- "mem" : "F(Mem)",
- "vm" : "F(Vm)",
-
- "i4" : "F(I4)",
- "u4" : "F(U4)",
- "i8" : "F(I8)",
- "u8" : "F(U8)",
- "i16" : "F(I16)",
- "u16" : "F(U16)",
- "i32" : "F(I32)",
- "u32" : "F(U32)",
- "i64" : "F(I64)",
- "u64" : "F(U64)",
-
- "rel8" : "F(Rel8)",
- "rel32" : "F(Rel32)",
-
- "m8" : "M(M8)",
- "m16" : "M(M16)",
- "m32" : "M(M32)",
- "m48" : "M(M48)",
- "m64" : "M(M64)",
- "m80" : "M(M80)",
- "m128" : "M(M128)",
- "m256" : "M(M256)",
- "m512" : "M(M512)",
- "m1024" : "M(M1024)",
- "mib" : "M(Mib)",
- "mAny" : "M(Any)",
- "vm32x" : "M(Vm32x)",
- "vm32y" : "M(Vm32y)",
- "vm32z" : "M(Vm32z)",
- "vm64x" : "M(Vm64x)",
- "vm64y" : "M(Vm64y)",
- "vm64z" : "M(Vm64z)",
-
- "memBase" : "M(BaseOnly)",
- "memDS" : "M(Ds)",
- "memES" : "M(Es)"
-};
-
-function StringifyArray(a, map) {
+function StringifyOpArray(a, map) {
var s = "";
for (var i = 0; i < a.length; i++) {
const op = a[i];
- if (!hasOwn.call(map, op))
+ var mapped = null;
+ if (typeof map === "function")
+ mapped = map(op);
+ else if (hasOwn.call(map, op))
+ mapped = map[op];
+ else
FAIL(`UNHANDLED OPERAND '${op}'`);
- s += (s ? " | " : "") + map[op];
+ s += (s ? " | " : "") + mapped;
}
return s ? s : "0";
}
@@ -1021,32 +1081,18 @@ class OSignature {
const index = asmdb.x86.Utils.regIndexOf(k);
if (index !== null && index !== -1) {
const kind = asmdb.x86.Utils.regKindOf(k);
- if (indexKind !== kind) return false;
+ if (indexKind !== kind)
+ return false;
}
}
}
// Can merge...
- for (k in bf) af[k] = true;
+ for (k in bf)
+ af[k] = true;
return true;
}
- simplify() {
- const flags = this.flags;
-
- // 32-bit register or 16-bit memory implies also 16-bit reg.
- if (flags.r32 && flags.m16) {
- flags.r16 = true;
- }
-
- // 32-bit register or 8-bit memory implies also 16-bit and 8-bit reg.
- if (flags.r32 && flags.m8) {
- flags.r8lo = true;
- flags.r8hi = true;
- flags.r16 = true;
- }
- }
-
toString() {
var s = "";
var flags = this.flags;
@@ -1072,132 +1118,117 @@ class OSignature {
}
toAsmJitOpData() {
- var oFlags = this.flags;
-
- var mFlags = Object.create(null);
- var mMemFlags = Object.create(null);
- var mExtFlags = Object.create(null);
- var sRegMask = 0;
+ var opFlags = Object.create(null);
+ var regMask = 0;
- for (var k in oFlags) {
+ for (var k in this.flags) {
switch (k) {
- case "implicit":
- case "r8lo" :
- case "r8hi" :
- case "r16" :
- case "r32" :
- case "r64" :
- case "creg" :
- case "dreg" :
- case "sreg" :
- case "bnd" :
- case "st" :
- case "k" :
- case "mm" :
- case "xmm" :
- case "ymm" :
- case "zmm" : mFlags[k] = true; break;
-
- case "m8" :
- case "m16" :
- case "m32" :
- case "m48" :
- case "m64" :
- case "m80" :
- case "m128" :
- case "m256" :
- case "m512" :
- case "m1024" : mFlags.mem = true; mMemFlags[k] = true; break;
- case "mib" : mFlags.mem = true; mMemFlags.mib = true; break;
- case "mem" : mFlags.mem = true; mMemFlags.mAny = true; break;
-
- case "memBase" : mFlags.mem = true; mMemFlags.memBase = true; break;
- case "memDS" : mFlags.mem = true; mMemFlags.memDS = true; break;
- case "memES" : mFlags.mem = true; mMemFlags.memES = true; break;
- case "memZAX" : mFlags.mem = true; sRegMask |= 1 << 0; break;
- case "memZSI" : mFlags.mem = true; sRegMask |= 1 << 6; break;
- case "memZDI" : mFlags.mem = true; sRegMask |= 1 << 7; break;
-
- case "vm32x" : mFlags.vm = true; mMemFlags.vm32x = true; break;
- case "vm32y" : mFlags.vm = true; mMemFlags.vm32y = true; break;
- case "vm32z" : mFlags.vm = true; mMemFlags.vm32z = true; break;
- case "vm64x" : mFlags.vm = true; mMemFlags.vm64x = true; break;
- case "vm64y" : mFlags.vm = true; mMemFlags.vm64y = true; break;
- case "vm64z" : mFlags.vm = true; mMemFlags.vm64z = true; break;
-
- case "i4" :
- case "u4" :
- case "i8" :
- case "u8" :
- case "i16" :
- case "u16" :
- case "i32" :
- case "u32" :
- case "i64" :
- case "u64" : mFlags[k] = true; break;
-
- case "rel8" :
- case "rel32" :
- mFlags.i32 = true;
- mFlags.i64 = true;
- mFlags[k] = true;
- break;
-
- case "rel16" :
- mFlags.i32 = true;
- mFlags.i64 = true;
- mFlags.rel32 = true;
- break;
-
- default: {
- switch (k) {
- case "es" : mFlags.sreg = true; sRegMask |= 1 << 1; break;
- case "cs" : mFlags.sreg = true; sRegMask |= 1 << 2; break;
- case "ss" : mFlags.sreg = true; sRegMask |= 1 << 3; break;
- case "ds" : mFlags.sreg = true; sRegMask |= 1 << 4; break;
- case "fs" : mFlags.sreg = true; sRegMask |= 1 << 5; break;
- case "gs" : mFlags.sreg = true; sRegMask |= 1 << 6; break;
- case "al" : mFlags.r8lo = true; sRegMask |= 1 << 0; break;
- case "ah" : mFlags.r8hi = true; sRegMask |= 1 << 0; break;
- case "ax" : mFlags.r16 = true; sRegMask |= 1 << 0; break;
- case "eax" : mFlags.r32 = true; sRegMask |= 1 << 0; break;
- case "rax" : mFlags.r64 = true; sRegMask |= 1 << 0; break;
- case "cl" : mFlags.r8lo = true; sRegMask |= 1 << 1; break;
- case "ch" : mFlags.r8hi = true; sRegMask |= 1 << 1; break;
- case "cx" : mFlags.r16 = true; sRegMask |= 1 << 1; break;
- case "ecx" : mFlags.r32 = true; sRegMask |= 1 << 1; break;
- case "rcx" : mFlags.r64 = true; sRegMask |= 1 << 1; break;
- case "dl" : mFlags.r8lo = true; sRegMask |= 1 << 2; break;
- case "dh" : mFlags.r8hi = true; sRegMask |= 1 << 2; break;
- case "dx" : mFlags.r16 = true; sRegMask |= 1 << 2; break;
- case "edx" : mFlags.r32 = true; sRegMask |= 1 << 2; break;
- case "rdx" : mFlags.r64 = true; sRegMask |= 1 << 2; break;
- case "bl" : mFlags.r8lo = true; sRegMask |= 1 << 3; break;
- case "bh" : mFlags.r8hi = true; sRegMask |= 1 << 3; break;
- case "bx" : mFlags.r16 = true; sRegMask |= 1 << 3; break;
- case "ebx" : mFlags.r32 = true; sRegMask |= 1 << 3; break;
- case "rbx" : mFlags.r64 = true; sRegMask |= 1 << 3; break;
- case "si" : mFlags.r16 = true; sRegMask |= 1 << 6; break;
- case "esi" : mFlags.r32 = true; sRegMask |= 1 << 6; break;
- case "rsi" : mFlags.r64 = true; sRegMask |= 1 << 6; break;
- case "di" : mFlags.r16 = true; sRegMask |= 1 << 7; break;
- case "edi" : mFlags.r32 = true; sRegMask |= 1 << 7; break;
- case "rdi" : mFlags.r64 = true; sRegMask |= 1 << 7; break;
- case "st0" : mFlags.st = true; sRegMask |= 1 << 0; break;
- case "xmm0" : mFlags.xmm = true; sRegMask |= 1 << 0; break;
- case "ymm0" : mFlags.ymm = true; sRegMask |= 1 << 0; break;
- default:
- console.log(`UNKNOWN OPERAND '${k}'`);
- }
- }
+ case "r8lo" : opFlags.RegGpbLo = true; break;
+ case "r8hi" : opFlags.RegGpbHi = true; break;
+ case "r16" : opFlags.RegGpw = true; break;
+ case "r32" : opFlags.RegGpd = true; break;
+ case "r64" : opFlags.RegGpq = true; break;
+ case "creg" : opFlags.RegCReg = true; break;
+ case "dreg" : opFlags.RegDReg = true; break;
+ case "sreg" : opFlags.RegSReg = true; break;
+ case "bnd" : opFlags.RegBnd = true; break;
+ case "st" : opFlags.RegSt = true; break;
+ case "k" : opFlags.RegKReg = true; break;
+ case "mm" : opFlags.RegMm = true; break;
+ case "xmm" : opFlags.RegXmm = true; break;
+ case "ymm" : opFlags.RegYmm = true; break;
+ case "zmm" : opFlags.RegZmm = true; break;
+ case "tmm" : opFlags.RegTmm = true; break;
+
+ case "m8" : opFlags.Mem8 = true; break;
+ case "m16" : opFlags.Mem16 = true; break;
+ case "m32" : opFlags.Mem32 = true; break;
+ case "m48" : opFlags.Mem48 = true; break;
+ case "m64" : opFlags.Mem64 = true; break;
+ case "m80" : opFlags.Mem80 = true; break;
+ case "m128" : opFlags.Mem128 = true; break;
+ case "m256" : opFlags.Mem256 = true; break;
+ case "m512" : opFlags.Mem512 = true; break;
+ case "m1024" : opFlags.Mem1024 = true; break;
+
+ case "mem" : opFlags.MemUnspecified = true; break;
+ case "mib" : opFlags.MemUnspecified = true; opFlags.FlagMib = true; break;
+ case "tmem" : opFlags.MemUnspecified = true; opFlags.FlagTMem = true; break;
+
+ case "memBase" : opFlags.FlagMemBase = true; break;
+ case "memDS" : opFlags.FlagMemDs = true; break;
+ case "memES" : opFlags.FlagMemEs = true; break;
+ case "memZAX" : regMask |= 1 << 0; break;
+ case "memZSI" : regMask |= 1 << 6; break;
+ case "memZDI" : regMask |= 1 << 7; break;
+
+ case "vm32x" : opFlags.Vm32x = true; break;
+ case "vm32y" : opFlags.Vm32y = true; break;
+ case "vm32z" : opFlags.Vm32z = true; break;
+ case "vm64x" : opFlags.Vm64x = true; break;
+ case "vm64y" : opFlags.Vm64y = true; break;
+ case "vm64z" : opFlags.Vm64z = true; break;
+
+ case "i4" : opFlags.ImmI4 = true; break;
+ case "u4" : opFlags.ImmU4 = true; break;
+ case "i8" : opFlags.ImmI8 = true; break;
+ case "u8" : opFlags.ImmU8 = true; break;
+ case "i16" : opFlags.ImmI16 = true; break;
+ case "u16" : opFlags.ImmU16 = true; break;
+ case "i32" : opFlags.ImmI32 = true; break;
+ case "u32" : opFlags.ImmU32 = true; break;
+ case "i64" : opFlags.ImmI64 = true; break;
+ case "u64" : opFlags.ImmU64 = true; break;
+
+ case "rel8" : opFlags.ImmI32 = true; opFlags.ImmI64 = true; opFlags.Rel8 = true; break;
+ case "rel16" : opFlags.ImmI32 = true; opFlags.ImmI64 = true; opFlags.Rel32 = true; break;
+ case "rel32" : opFlags.ImmI32 = true; opFlags.ImmI64 = true; opFlags.Rel32 = true; break;
+
+ case "es" : opFlags.RegSReg = true; regMask |= 1 << 1; break;
+ case "cs" : opFlags.RegSReg = true; regMask |= 1 << 2; break;
+ case "ss" : opFlags.RegSReg = true; regMask |= 1 << 3; break;
+ case "ds" : opFlags.RegSReg = true; regMask |= 1 << 4; break;
+ case "fs" : opFlags.RegSReg = true; regMask |= 1 << 5; break;
+ case "gs" : opFlags.RegSReg = true; regMask |= 1 << 6; break;
+ case "al" : opFlags.RegGpbLo = true; regMask |= 1 << 0; break;
+ case "ah" : opFlags.RegGpbHi = true; regMask |= 1 << 0; break;
+ case "ax" : opFlags.RegGpw = true; regMask |= 1 << 0; break;
+ case "eax" : opFlags.RegGpd = true; regMask |= 1 << 0; break;
+ case "rax" : opFlags.RegGpq = true; regMask |= 1 << 0; break;
+ case "cl" : opFlags.RegGpbLo = true; regMask |= 1 << 1; break;
+ case "ch" : opFlags.RegGpbHi = true; regMask |= 1 << 1; break;
+ case "cx" : opFlags.RegGpw = true; regMask |= 1 << 1; break;
+ case "ecx" : opFlags.RegGpd = true; regMask |= 1 << 1; break;
+ case "rcx" : opFlags.RegGpq = true; regMask |= 1 << 1; break;
+ case "dl" : opFlags.RegGpbLo = true; regMask |= 1 << 2; break;
+ case "dh" : opFlags.RegGpbHi = true; regMask |= 1 << 2; break;
+ case "dx" : opFlags.RegGpw = true; regMask |= 1 << 2; break;
+ case "edx" : opFlags.RegGpd = true; regMask |= 1 << 2; break;
+ case "rdx" : opFlags.RegGpq = true; regMask |= 1 << 2; break;
+ case "bl" : opFlags.RegGpbLo = true; regMask |= 1 << 3; break;
+ case "bh" : opFlags.RegGpbHi = true; regMask |= 1 << 3; break;
+ case "bx" : opFlags.RegGpw = true; regMask |= 1 << 3; break;
+ case "ebx" : opFlags.RegGpd = true; regMask |= 1 << 3; break;
+ case "rbx" : opFlags.RegGpq = true; regMask |= 1 << 3; break;
+ case "si" : opFlags.RegGpw = true; regMask |= 1 << 6; break;
+ case "esi" : opFlags.RegGpd = true; regMask |= 1 << 6; break;
+ case "rsi" : opFlags.RegGpq = true; regMask |= 1 << 6; break;
+ case "di" : opFlags.RegGpw = true; regMask |= 1 << 7; break;
+ case "edi" : opFlags.RegGpd = true; regMask |= 1 << 7; break;
+ case "rdi" : opFlags.RegGpq = true; regMask |= 1 << 7; break;
+ case "st0" : opFlags.RegSt = true; regMask |= 1 << 0; break;
+ case "xmm0" : opFlags.RegXmm = true; regMask |= 1 << 0; break;
+ case "ymm0" : opFlags.RegYmm = true; regMask |= 1 << 0; break;
+
+ case "implicit": opFlags.FlagImplicit = true; break;
+
+ default:
+ console.log(`UNKNOWN OPERAND '${k}'`);
}
}
- const sFlags = StringifyArray(ArrayUtils.sorted(mFlags , cmpOp), OpToAsmJitOp);
- const sMemFlags = StringifyArray(ArrayUtils.sorted(mMemFlags, cmpOp), OpToAsmJitOp);
- const sExtFlags = StringifyArray(ArrayUtils.sorted(mExtFlags, cmpOp), OpToAsmJitOp);
-
- return `ROW(${sFlags || 0}, ${sMemFlags || 0}, ${sExtFlags || 0}, ${decToHex(sRegMask, 2)})`;
+ const outputFlags = StringifyOpArray(ArrayUtils.sorted(opFlags, cmpOp), function(k) { return `F(${k})`; });
+ return `ROW(${outputFlags || 0}, ${decToHex(regMask, 2)})`;
}
}
@@ -1210,11 +1241,6 @@ class ISignature extends Array {
this.implicit = 0; // Number of implicit operands.
}
- simplify() {
- for (var i = 0; i < this.length; i++)
- this[i].simplify();
- }
-
opEquals(other) {
const len = this.length;
if (len !== other.length) return false;
@@ -1398,7 +1424,8 @@ class SignatureArray extends Array {
// Patch all instructions to accept implicit-size memory operand.
for (bIndex = 0; bIndex < sameSizeSet.length; bIndex++) {
const bInst = sameSizeSet[bIndex];
- if (implicit) bInst[memPos].flags.mem = true;
+ if (implicit)
+ bInst[memPos].flags.mem = true;
if (!implicit)
DEBUG(`${this.name}: Explicit: ${bInst}`);
@@ -1406,21 +1433,21 @@ class SignatureArray extends Array {
}
}
- simplify() {
- for (var i = 0; i < this.length; i++)
- this[i].simplify();
- }
-
compact() {
- for (var i = 0; i < this.length; i++) {
- var row = this[i];
- var j = i + 1;
- while (j < this.length) {
- if (row.mergeWith(this[j])) {
- this.splice(j, 1);
- continue;
+ var didSomething = true;
+ while (didSomething) {
+ didSomething = false;
+ for (var i = 0; i < this.length; i++) {
+ var row = this[i];
+ var j = i + 1;
+ while (j < this.length) {
+ if (row.mergeWith(this[j])) {
+ this.splice(j, 1);
+ didSomething = true;
+ continue;
+ }
+ j++;
}
- j++;
}
}
}
@@ -1433,14 +1460,7 @@ class SignatureArray extends Array {
class InstSignatureTable extends core.Task {
constructor() {
super("InstSignatureTable");
-
this.maxOpRows = 0;
- this.opBlackList = {
- "moff8" : true,
- "moff16": true,
- "moff32": true,
- "moff64": true
- };
}
run() {
@@ -1458,7 +1478,7 @@ class InstSignatureTable extends core.Task {
const oSignatureArr = [];
// Must be first to be assigned to zero.
- const oSignatureNone = "ROW(0, 0, 0, 0xFF)";
+ const oSignatureNone = "ROW(0, 0xFF)";
oSignatureMap[oSignatureNone] = [0];
oSignatureArr.push(oSignatureNone);
@@ -1555,21 +1575,19 @@ class InstSignatureTable extends core.Task {
});
}
- var s = `#define ROW(count, x86, x64, implicit, o0, o1, o2, o3, o4, o5) \\\n` +
- ` { count, (x86 ? uint8_t(InstDB::kModeX86) : uint8_t(0)) | \\\n` +
- ` (x64 ? uint8_t(InstDB::kModeX64) : uint8_t(0)) , \\\n` +
- ` implicit, \\\n` +
- ` 0, \\\n` +
- ` { o0, o1, o2, o3, o4, o5 } \\\n` +
+ var s = `#define ROW(count, x86, x64, implicit, o0, o1, o2, o3, o4, o5) \\\n` +
+ ` { count, uint8_t(x86 ? uint8_t(InstDB::Mode::kX86) : uint8_t(0)) | \\\n` +
+ ` (x64 ? uint8_t(InstDB::Mode::kX64) : uint8_t(0)) , \\\n` +
+ ` implicit, \\\n` +
+ ` 0, \\\n` +
+ ` { o0, o1, o2, o3, o4, o5 } \\\n` +
` }\n` +
StringUtils.makeCxxArrayWithComment(iSignatureArr, "const InstDB::InstSignature InstDB::_instSignatureTable[]") +
`#undef ROW\n` +
`\n` +
- `#define ROW(flags, mFlags, extFlags, regId) { uint32_t(flags), uint16_t(mFlags), uint8_t(extFlags), uint8_t(regId) }\n` +
- `#define F(VAL) InstDB::kOp##VAL\n` +
- `#define M(VAL) InstDB::kMemOp##VAL\n` +
+ `#define ROW(opFlags, regId) { opFlags, uint8_t(regId) }\n` +
+ `#define F(VAL) uint64_t(InstDB::OpFlags::k##VAL)\n` +
StringUtils.makeCxxArray(oSignatureArr, "const InstDB::OpSignature InstDB::_opSignatureTable[]") +
- `#undef M\n` +
`#undef F\n` +
`#undef ROW\n`;
this.inject("InstSignatureTable", disclaimer(s), oSignatureArr.length * 8 + iSignatureArr.length * 8);
@@ -1614,17 +1632,23 @@ class InstSignatureTable extends core.Task {
var imm = iop.imm;
var rel = iop.rel;
- // Terminate if this operand is something asmjit doesn't support
- // and skip all instructions having implicit `imm` operand of `1`,
- // which are handled fine by asmjit.
- if (this.opBlackList[mem] === true || iop.immValue !== null)
+ // Skip all instructions having implicit `imm` operand of `1`.
+ if (iop.immValue !== null)
+ break;
+
+ // Shorten the number of signatures of 'mov' instruction.
+ if (inst.name === "mov" && mem.startsWith("moff"))
break;
- if (reg === "r8") reg = "r8lo";
if (reg === "seg") reg = "sreg";
if (reg === "st(i)") reg = "st";
if (reg === "st(0)") reg = "st0";
+ if (mem === "moff8") mem = "m8";
+ if (mem === "moff16") mem = "m16";
+ if (mem === "moff32") mem = "m32";
+ if (mem === "moff64") mem = "m64";
+
if (mem === "m32fp") mem = "m32";
if (mem === "m64fp") mem = "m64";
if (mem === "m80fp") mem = "m80";
@@ -1656,6 +1680,46 @@ class InstSignatureTable extends core.Task {
const seg = iop.memSeg;
if (seg) {
+ switch (inst.name) {
+ case "cmpsb": op.flags.m8 = true; break;
+ case "cmpsw": op.flags.m16 = true; break;
+ case "cmpsd": op.flags.m32 = true; break;
+ case "cmpsq": op.flags.m64 = true; break;
+ case "lodsb": op.flags.m8 = true; break;
+ case "lodsw": op.flags.m16 = true; break;
+ case "lodsd": op.flags.m32 = true; break;
+ case "lodsq": op.flags.m64 = true; break;
+ case "movsb": op.flags.m8 = true; break;
+ case "movsw": op.flags.m16 = true; break;
+ case "movsd": op.flags.m32 = true; break;
+ case "movsq": op.flags.m64 = true; break;
+ case "scasb": op.flags.m8 = true; break;
+ case "scasw": op.flags.m16 = true; break;
+ case "scasd": op.flags.m32 = true; break;
+ case "scasq": op.flags.m64 = true; break;
+ case "stosb": op.flags.m8 = true; break;
+ case "stosw": op.flags.m16 = true; break;
+ case "stosd": op.flags.m32 = true; break;
+ case "stosq": op.flags.m64 = true; break;
+ case "insb": op.flags.m8 = true; break;
+ case "insw": op.flags.m16 = true; break;
+ case "insd": op.flags.m32 = true; break;
+ case "outsb": op.flags.m8 = true; break;
+ case "outsw": op.flags.m16 = true; break;
+ case "outsd": op.flags.m32 = true; break;
+ case "clzero": op.flags.mem = true; op.flags.m512 = true; break;
+ case "enqcmd": op.flags.mem = true; op.flags.m512 = true; break;
+ case "enqcmds": op.flags.mem = true; op.flags.m512 = true; break;
+ case "movdir64b": op.flags.mem = true; op.flags.m512 = true; break;
+ case "maskmovq": op.flags.mem = true; op.flags.m64 = true; break;
+ case "maskmovdqu": op.flags.mem = true; op.flags.m128 = true; break;
+ case "vmaskmovdqu": op.flags.mem = true; op.flags.m128 = true; break;
+ case "monitor": op.flags.mem = true; break;
+ case "monitorx": op.flags.mem = true; break;
+ case "umonitor": op.flags.mem = true; break;
+ default: console.log(`UNKNOWN MEM IN INSTRUCTION '${inst.name}'`); break;
+ }
+
if (seg === "ds") op.flags.memDS = true;
if (seg === "es") op.flags.memES = true;
if (reg === "reg") { op.flags.memBase = true; }
@@ -1666,13 +1730,26 @@ class InstSignatureTable extends core.Task {
if (reg === "zdi") { op.flags.memBase = true; op.flags.memZDI = true; }
}
else if (reg) {
- op.flags[reg] = true;
- if (reg === "r8lo") op.flags.r8hi = true;
+ if (reg == "r8") {
+ op.flags["r8lo"] = true;
+ op.flags["r8hi"] = true;
+ }
+ else {
+ op.flags[reg] = true;
+ }
}
if (mem) {
op.flags[mem] = true;
- // Exception: Allow LEA to use any memory size.
- if (inst.name === "lea") MapUtils.add(op.flags, MemOp);
+ // HACK: Allow LEA|CL*|PREFETCH* to use any memory size.
+ if (/^(cldemote|clwb|clflush\w*|lea|prefetch\w*)$/.test(inst.name)) {
+ op.flags.mem = true;
+ Object.assign(op.flags, MemOp);
+ }
+
+ // HACK: These instructions specify explicit memory size, but it's just informational.
+ if (inst.name === "enqcmd" || inst.name === "enqcmds" || inst.name === "movdir64b")
+ op.flags.mem = true;
+
}
if (imm) {
if (iop.immSign === "any" || iop.immSign === "signed" ) op.flags["i" + imm] = true;
@@ -1689,30 +1766,27 @@ class InstSignatureTable extends core.Task {
}
}
- signatures.calcImplicitMemSize();
- signatures.simplify();
- signatures.compact();
+ if (signatures.length && GenUtils.canUseImplicitMemSize(dbInsts[0].name))
+ signatures.calcImplicitMemSize();
- signatures.simplify();
signatures.compact();
-
return signatures;
}
}
// ============================================================================
-// [tablegen.x86.InstCommonInfoTableB]
+// [tablegen.x86.AdditionalInfoTable]
// ============================================================================
-class InstCommonInfoTableB extends core.Task {
+class AdditionalInfoTable extends core.Task {
constructor() {
- super("InstCommonInfoTableB");
+ super("AdditionalInfoTable");
}
run() {
const insts = this.ctx.insts;
- const commonTableB = new IndexedArray();
const rwInfoTable = new IndexedArray();
+ const additionaInfoTable = new IndexedArray();
// If the instruction doesn't read any flags it should point to the first index.
rwInfoTable.addIndexed(`{ 0, 0 }`);
@@ -1728,17 +1802,17 @@ class InstCommonInfoTableB extends core.Task {
const wData = w.map(function(flag) { return `FLAG(${flag})`; }).join(" | ") || "0";
const rwDataIndex = rwInfoTable.addIndexed(`{ ${rData}, ${wData} }`);
- inst.commomInfoIndexB = commonTableB.addIndexed(`{ { ${features} }, ${rwDataIndex}, 0 }`);
+ inst.additionalInfoIndex = additionaInfoTable.addIndexed(`{ { ${features} }, ${rwDataIndex}, 0 }`);
});
- var s = `#define EXT(VAL) uint32_t(Features::k##VAL)\n` +
- `const InstDB::CommonInfoTableB InstDB::_commonInfoTableB[] = {\n${StringUtils.format(commonTableB, kIndent, true)}\n};\n` +
+ var s = `#define EXT(VAL) uint32_t(CpuFeatures::X86::k##VAL)\n` +
+ `const InstDB::AdditionalInfo InstDB::_additionalInfoTable[] = {\n${StringUtils.format(additionaInfoTable, kIndent, true)}\n};\n` +
`#undef EXT\n` +
`\n` +
- `#define FLAG(VAL) uint32_t(Status::k##VAL)\n` +
+ `#define FLAG(VAL) uint32_t(CpuRWFlags::kX86_##VAL)\n` +
`const InstDB::RWFlagsInfoTable InstDB::_rwFlagsInfoTable[] = {\n${StringUtils.format(rwInfoTable, kIndent, true)}\n};\n` +
`#undef FLAG\n`;
- this.inject("InstCommonInfoTableB", disclaimer(s), commonTableB.length * 8 + rwInfoTable.length * 8);
+ this.inject("AdditionalInfoTable", disclaimer(s), additionaInfoTable.length * 8 + rwInfoTable.length * 8);
}
rwFlagsOf(dbInsts) {
@@ -1814,17 +1888,23 @@ class InstRWInfoTable extends core.Task {
constructor() {
super("InstRWInfoTable");
- this.rwInfoIndex = [];
- this.rwInfoTable = new IndexedArray();
+ this.rwInfoIndexA = [];
+ this.rwInfoIndexB = [];
+ this.rwInfoTableA = new IndexedArray();
+ this.rwInfoTableB = new IndexedArray();
+
this.rmInfoTable = new IndexedArray();
this.opInfoTable = new IndexedArray();
- const _ = null;
this.rwCategoryByName = {
"imul" : "Imul",
"mov" : "Mov",
+ "movabs" : "Movabs",
"movhpd" : "Movh64",
"movhps" : "Movh64",
+ "punpcklbw" : "Punpcklxx",
+ "punpckldq" : "Punpcklxx",
+ "punpcklwd" : "Punpcklxx",
"vmaskmovpd": "Vmaskmov",
"vmaskmovps": "Vmaskmov",
"vmovddup" : "Vmovddup",
@@ -1833,37 +1913,39 @@ class InstRWInfoTable extends core.Task {
"vpmaskmovd": "Vmaskmov",
"vpmaskmovq": "Vmaskmov"
};
+
+ const _ = null;
this.rwCategoryByData = {
Vmov1_8: [
- [{access: "W", flags: {}, fixed: -1, index: 0, width: 8}, {access: "R", flags: {}, fixed: -1, index: 0, width: 64},_,_,_,_],
- [{access: "W", flags: {}, fixed: -1, index: 0, width: 16}, {access: "R", flags: {}, fixed: -1, index: 0, width:128},_,_,_,_],
- [{access: "W", flags: {}, fixed: -1, index: 0, width: 32}, {access: "R", flags: {}, fixed: -1, index: 0, width:256},_,_,_,_],
- [{access: "W", flags: {}, fixed: -1, index: 0, width: 64}, {access: "R", flags: {}, fixed: -1, index: 0, width:512},_,_,_,_]
+ [{access: "W", clc: 0, flags: {}, fixed: -1, index: 0, width: 8}, {access: "R", clc: 0, flags: {}, fixed: -1, index: 0, width: 64},_,_,_,_],
+ [{access: "W", clc: 0, flags: {}, fixed: -1, index: 0, width: 16}, {access: "R", clc: 0, flags: {}, fixed: -1, index: 0, width:128},_,_,_,_],
+ [{access: "W", clc: 0, flags: {}, fixed: -1, index: 0, width: 32}, {access: "R", clc: 0, flags: {}, fixed: -1, index: 0, width:256},_,_,_,_],
+ [{access: "W", clc: 0, flags: {}, fixed: -1, index: 0, width: 64}, {access: "R", clc: 0, flags: {}, fixed: -1, index: 0, width:512},_,_,_,_]
],
Vmov1_4: [
- [{access: "W", flags: {}, fixed: -1, index: 0, width: 32}, {access: "R", flags: {}, fixed: -1, index: 0, width:128},_,_,_,_],
- [{access: "W", flags: {}, fixed: -1, index: 0, width: 64}, {access: "R", flags: {}, fixed: -1, index: 0, width:256},_,_,_,_],
- [{access: "W", flags: {}, fixed: -1, index: 0, width:128}, {access: "R", flags: {}, fixed: -1, index: 0, width:512},_,_,_,_]
+ [{access: "W", clc: 0, flags: {}, fixed: -1, index: 0, width: 32}, {access: "R", clc: 0, flags: {}, fixed: -1, index: 0, width:128},_,_,_,_],
+ [{access: "W", clc: 0, flags: {}, fixed: -1, index: 0, width: 64}, {access: "R", clc: 0, flags: {}, fixed: -1, index: 0, width:256},_,_,_,_],
+ [{access: "W", clc: 0, flags: {}, fixed: -1, index: 0, width:128}, {access: "R", clc: 0, flags: {}, fixed: -1, index: 0, width:512},_,_,_,_]
],
Vmov1_2: [
- [{access: "W", flags: {}, fixed: -1, index: 0, width: 64}, {access: "R", flags: {}, fixed: -1, index: 0, width:128},_,_,_,_],
- [{access: "W", flags: {}, fixed: -1, index: 0, width:128}, {access: "R", flags: {}, fixed: -1, index: 0, width:256},_,_,_,_],
- [{access: "W", flags: {}, fixed: -1, index: 0, width:256}, {access: "R", flags: {}, fixed: -1, index: 0, width:512},_,_,_,_]
+ [{access: "W", clc: 0, flags: {}, fixed: -1, index: 0, width: 64}, {access: "R", clc: 0, flags: {}, fixed: -1, index: 0, width:128},_,_,_,_],
+ [{access: "W", clc: 0, flags: {}, fixed: -1, index: 0, width:128}, {access: "R", clc: 0, flags: {}, fixed: -1, index: 0, width:256},_,_,_,_],
+ [{access: "W", clc: 0, flags: {}, fixed: -1, index: 0, width:256}, {access: "R", clc: 0, flags: {}, fixed: -1, index: 0, width:512},_,_,_,_]
],
Vmov2_1: [
- [{access: "W", flags: {}, fixed: -1, index: 0, width: 128}, {access: "R", flags: {}, fixed: -1, index: 0, width: 64},_,_,_,_],
- [{access: "W", flags: {}, fixed: -1, index: 0, width: 256}, {access: "R", flags: {}, fixed: -1, index: 0, width:128},_,_,_,_],
- [{access: "W", flags: {}, fixed: -1, index: 0, width: 512}, {access: "R", flags: {}, fixed: -1, index: 0, width:256},_,_,_,_]
+ [{access: "W", clc: 0, flags: {}, fixed: -1, index: 0, width: 128}, {access: "R", clc: 0, flags: {}, fixed: -1, index: 0, width: 64},_,_,_,_],
+ [{access: "W", clc: 0, flags: {}, fixed: -1, index: 0, width: 256}, {access: "R", clc: 0, flags: {}, fixed: -1, index: 0, width:128},_,_,_,_],
+ [{access: "W", clc: 0, flags: {}, fixed: -1, index: 0, width: 512}, {access: "R", clc: 0, flags: {}, fixed: -1, index: 0, width:256},_,_,_,_]
],
Vmov4_1: [
- [{access: "W", flags: {}, fixed: -1, index: 0, width: 128}, {access: "R", flags: {}, fixed: -1, index: 0, width: 32},_,_,_,_],
- [{access: "W", flags: {}, fixed: -1, index: 0, width: 256}, {access: "R", flags: {}, fixed: -1, index: 0, width: 64},_,_,_,_],
- [{access: "W", flags: {}, fixed: -1, index: 0, width: 512}, {access: "R", flags: {}, fixed: -1, index: 0, width:128},_,_,_,_]
+ [{access: "W", clc: 0, flags: {}, fixed: -1, index: 0, width: 128}, {access: "R", clc: 0, flags: {}, fixed: -1, index: 0, width: 32},_,_,_,_],
+ [{access: "W", clc: 0, flags: {}, fixed: -1, index: 0, width: 256}, {access: "R", clc: 0, flags: {}, fixed: -1, index: 0, width: 64},_,_,_,_],
+ [{access: "W", clc: 0, flags: {}, fixed: -1, index: 0, width: 512}, {access: "R", clc: 0, flags: {}, fixed: -1, index: 0, width:128},_,_,_,_]
],
Vmov8_1: [
- [{access: "W", flags: {}, fixed: -1, index: 0, width: 128}, {access: "R", flags: {}, fixed: -1, index: 0, width: 16},_,_,_,_],
- [{access: "W", flags: {}, fixed: -1, index: 0, width: 256}, {access: "R", flags: {}, fixed: -1, index: 0, width: 32},_,_,_,_],
- [{access: "W", flags: {}, fixed: -1, index: 0, width: 512}, {access: "R", flags: {}, fixed: -1, index: 0, width: 64},_,_,_,_]
+ [{access: "W", clc: 0, flags: {}, fixed: -1, index: 0, width: 128}, {access: "R", clc: 0, flags: {}, fixed: -1, index: 0, width: 16},_,_,_,_],
+ [{access: "W", clc: 0, flags: {}, fixed: -1, index: 0, width: 256}, {access: "R", clc: 0, flags: {}, fixed: -1, index: 0, width: 32},_,_,_,_],
+ [{access: "W", clc: 0, flags: {}, fixed: -1, index: 0, width: 512}, {access: "R", clc: 0, flags: {}, fixed: -1, index: 0, width: 64},_,_,_,_]
]
};
}
@@ -1883,8 +1965,9 @@ class InstRWInfoTable extends core.Task {
"0x0000000000000000u",
"0x0000000000000000u",
"0xFF",
+ "0",
CxxUtils.struct(0),
- "0"
+ "OpRWFlags::kNone"
);
this.rmInfoTable.addIndexed(noRmInfo);
@@ -1900,8 +1983,8 @@ class InstRWInfoTable extends core.Task {
const o2Insts = dbInsts.filter((inst) => { return inst.operands.length === 2; });
const oxInsts = dbInsts.filter((inst) => { return inst.operands.length !== 2; });
- const rwInfoArray = [this.rwInfo(o2Insts), this.rwInfo(oxInsts)];
- const rmInfoArray = [this.rmInfo(o2Insts), this.rmInfo(oxInsts)];
+ const rwInfoArray = [this.rwInfo(inst, o2Insts), this.rwInfo(inst, oxInsts)];
+ const rmInfoArray = [this.rmInfo(inst, o2Insts), this.rmInfo(inst, oxInsts)];
for (var i = 0; i < 2; i++) {
const rwInfo = rwInfoArray[i];
@@ -1929,12 +2012,15 @@ class InstRWInfoTable extends core.Task {
const wIndex = opAcc === "X" || opAcc === "W" ? op.index : -1;
const wWidth = opAcc === "X" || opAcc === "W" ? op.width : -1;
+ const consecutiveLeadCount = op.clc;
+
const opData = CxxUtils.struct(
this.byteMaskFromBitRanges([{ start: rIndex, end: rIndex + rWidth - 1 }]) + "u",
this.byteMaskFromBitRanges([{ start: wIndex, end: wIndex + wWidth - 1 }]) + "u",
StringUtils.decToHex(op.fixed === -1 ? 0xFF : op.fixed, 2),
+ String(consecutiveLeadCount),
CxxUtils.struct(0),
- CxxUtils.flags(flags, function(flag) { return "OpRWInfo::k" + flag; })
+ CxxUtils.flags(flags, function(flag) { return "OpRWFlags::k" + flag; }, "OpRWFlags::kNone")
);
rwOpsIndex.push(this.opInfoTable.addIndexed(opData));
@@ -1945,7 +2031,7 @@ class InstRWInfoTable extends core.Task {
StringUtils.decToHex(rmInfo.rmIndexes, 2),
String(Math.max(rmInfo.memFixed, 0)).padEnd(2),
CxxUtils.flags({ "InstDB::RWInfoRm::kFlagAmbiguous": Boolean(rmInfo.memAmbiguous) }),
- rmInfo.memExtension === "None" ? "0" : "Features::k" + rmInfo.memExtension
+ rmInfo.memExtension === "None" ? "0" : "uint32_t(CpuFeatures::X86::k" + rmInfo.memExtension + ")"
);
const rwData = CxxUtils.struct(
@@ -1954,21 +2040,30 @@ class InstRWInfoTable extends core.Task {
CxxUtils.struct(...(rwOpsIndex.map(function(item) { return String(item).padEnd(2); })))
);
- this.rwInfoIndex.push(this.rwInfoTable.addIndexed(rwData));
+ if (i == 0)
+ this.rwInfoIndexA.push(this.rwInfoTableA.addIndexed(rwData));
+ else
+ this.rwInfoIndexB.push(this.rwInfoTableB.addIndexed(rwData));
}
});
var s = "";
- s += "const uint8_t InstDB::rwInfoIndex[Inst::_kIdCount * 2] = {\n" + StringUtils.format(this.rwInfoIndex, kIndent, -1) + "\n};\n";
+ s += "const uint8_t InstDB::rwInfoIndexA[Inst::_kIdCount] = {\n" + StringUtils.format(this.rwInfoIndexA, kIndent, -1) + "\n};\n";
+ s += "\n";
+ s += "const uint8_t InstDB::rwInfoIndexB[Inst::_kIdCount] = {\n" + StringUtils.format(this.rwInfoIndexB, kIndent, -1) + "\n};\n";
s += "\n";
- s += "const InstDB::RWInfo InstDB::rwInfo[] = {\n" + StringUtils.format(this.rwInfoTable, kIndent, true) + "\n};\n";
+ s += "const InstDB::RWInfo InstDB::rwInfoA[] = {\n" + StringUtils.format(this.rwInfoTableA, kIndent, true) + "\n};\n";
+ s += "\n";
+ s += "const InstDB::RWInfo InstDB::rwInfoB[] = {\n" + StringUtils.format(this.rwInfoTableB, kIndent, true) + "\n};\n";
s += "\n";
s += "const InstDB::RWInfoOp InstDB::rwInfoOp[] = {\n" + StringUtils.format(this.opInfoTable, kIndent, true) + "\n};\n";
s += "\n";
s += "const InstDB::RWInfoRm InstDB::rwInfoRm[] = {\n" + StringUtils.format(this.rmInfoTable, kIndent, true) + "\n};\n";
- const size = this.rwInfoIndex.length +
- this.rwInfoTable.length * 8 +
+ const size = this.rwInfoIndexA.length +
+ this.rwInfoIndexB.length +
+ this.rwInfoTableA.length * 8 +
+ this.rwInfoTableB.length * 8 +
this.rmInfoTable.length * 4 +
this.opInfoTable.length * 24;
@@ -2006,7 +2101,9 @@ class InstRWInfoTable extends core.Task {
// Read/Write Info
// ---------------
- rwInfo(dbInsts) {
+ rwInfo(asmInst, dbInsts) {
+ const self = this;
+
function nullOps() {
return [null, null, null, null, null, null];
}
@@ -2017,6 +2114,7 @@ class InstRWInfoTable extends core.Task {
return {
access: op.read && op.write ? "X" : op.read ? "R" : op.write ? "W" : "?",
+ clc: 0,
flags: {},
fixed: GenUtils.fixedRegOf(op.reg),
index: op.rwxIndex,
@@ -2038,12 +2136,16 @@ class InstRWInfoTable extends core.Task {
const opSize = op.isReg() ? op.regSize : op.memSize;
var d = {
access: op.read && op.write ? "X" : op.read ? "R" : op.write ? "W" : "?",
+ clc: 0,
flags: {},
fixed: -1,
index: -1,
width: -1
};
+ if (op.consecutiveLeadCount)
+ d.clc = op.consecutiveLeadCount;
+
if (op.isReg())
d.fixed = GenUtils.fixedRegOf(op.reg);
else
@@ -2052,6 +2154,12 @@ class InstRWInfoTable extends core.Task {
if (op.zext)
d.flags.ZExt = true;
+ if (op.regIndexRel)
+ d.flags.Consecutive = true;
+
+ for (var k in self.rwOpFlagsForInstruction(asmInst.name, j))
+ d.flags[k] = true;
+
if ((step === -1 || step === j) || op.rwxIndex !== 0 || op.rwxWidth !== opSize) {
d.index = op.rwxIndex;
d.width = op.rwxWidth;
@@ -2147,10 +2255,29 @@ class InstRWInfoTable extends core.Task {
return null;
}
+ rwOpFlagsForInstruction(instName, opIndex) {
+ const toMap = MapUtils.arrayToMap;
+
+ // TODO: We should be able to get this information from asmdb.
+ switch (instName + "@" + opIndex) {
+ case "cmps@0": return toMap(['MemBaseRW', 'MemBasePostModify']);
+ case "cmps@1": return toMap(['MemBaseRW', 'MemBasePostModify']);
+ case "movs@0": return toMap(['MemBaseRW', 'MemBasePostModify']);
+ case "movs@1": return toMap(['MemBaseRW', 'MemBasePostModify']);
+ case "lods@1": return toMap(['MemBaseRW', 'MemBasePostModify']);
+ case "stos@0": return toMap(['MemBaseRW', 'MemBasePostModify']);
+ case "scas@1": return toMap(['MemBaseRW', 'MemBasePostModify']);
+ case "bndstx@0": return toMap(['MemBaseWrite', 'MemIndexWrite']);
+
+ default:
+ return {};
+ }
+ }
+
// Reg/Mem Info
// ------------
- rmInfo(dbInsts) {
+ rmInfo(asmInst, dbInsts) {
const info = {
category: "None",
rmIndexes: this.rmReplaceableIndexes(dbInsts),
@@ -2198,9 +2325,14 @@ class InstRWInfoTable extends core.Task {
if (category === null)
category = c;
else if (category !== c) {
+ // Special cases.
if (dbInst.name === "mov" || dbInst.name === "vmovddup")
- return "None"; // Special case
- return StringUtils.capitalize(dbInst.name); // Special case.
+ return "None";
+
+ if (/^(punpcklbw|punpckldq|punpcklwd)$/.test(dbInst.name))
+ return "None";
+
+ return StringUtils.capitalize(dbInst.name);
}
}
@@ -2381,7 +2513,7 @@ class InstCommonTable extends core.Task {
"IdEnum",
"NameTable",
"InstSignatureTable",
- "InstCommonInfoTableB",
+ "AdditionalInfoTable",
"InstRWInfoTable"
]);
}
@@ -2391,25 +2523,33 @@ class InstCommonTable extends core.Task {
const table = new IndexedArray();
insts.forEach((inst) => {
- const flags = inst.flags.map(function(flag) { return `F(${flag})`; }).join("|") || "0";
- const singleRegCase = `SINGLE_REG(${inst.singleRegCase})`;
- const controlType = `CONTROL(${inst.controlType})`;
+ const commonFlagsArray = inst.flags.filter((flag) => { return !flag.startsWith("Avx512"); });
+ const avx512FlagsArray = inst.flags.filter((flag) => { return flag.startsWith("Avx512"); });
+
+ const commonFlags = commonFlagsArray.map(function(flag) { return `F(${flag })`; }).join("|") || "0";
+ const avx512Flags = avx512FlagsArray.map(function(flag) { return `X(${flag.substr(6)})`; }).join("|") || "0";
+
+ const controlFlow = `CONTROL_FLOW(${inst.controlFlow})`;
+ const singleRegCase = `SAME_REG_HINT(${inst.singleRegCase})`;
const row = "{ " +
- String(flags ).padEnd(54) + ", " +
+ String(commonFlags ).padEnd(50) + ", " +
+ String(avx512Flags ).padEnd(30) + ", " +
String(inst.signatureIndex).padEnd( 3) + ", " +
String(inst.signatureCount).padEnd( 2) + ", " +
- String(controlType ).padEnd(16) + ", " +
- String(singleRegCase ).padEnd(16) + ", " + "0 }";
- inst.commonInfoIndexA = table.addIndexed(row);
+ String(controlFlow ).padEnd(16) + ", " +
+ String(singleRegCase ).padEnd(16) + "}";
+ inst.commonInfoIndex = table.addIndexed(row);
});
- var s = `#define F(VAL) InstDB::kFlag##VAL\n` +
- `#define CONTROL(VAL) Inst::kControl##VAL\n` +
- `#define SINGLE_REG(VAL) InstDB::kSingleReg##VAL\n` +
+ var s = `#define F(VAL) uint32_t(InstDB::InstFlags::k##VAL)\n` +
+ `#define X(VAL) uint32_t(InstDB::Avx512Flags::k##VAL)\n` +
+ `#define CONTROL_FLOW(VAL) uint8_t(InstControlFlow::k##VAL)\n` +
+ `#define SAME_REG_HINT(VAL) uint8_t(InstSameRegHint::k##VAL)\n` +
`const InstDB::CommonInfo InstDB::_commonInfoTable[] = {\n${StringUtils.format(table, kIndent, true)}\n};\n` +
- `#undef SINGLE_REG\n` +
- `#undef CONTROL\n` +
+ `#undef SAME_REG_HINT\n` +
+ `#undef CONTROL_FLOW\n` +
+ `#undef X\n` +
`#undef F\n`;
this.inject("InstCommonTable", disclaimer(s), table.length * 8);
}
@@ -2424,7 +2564,7 @@ new X86TableGen()
.addTask(new NameTable())
.addTask(new AltOpcodeTable())
.addTask(new InstSignatureTable())
- .addTask(new InstCommonInfoTableB())
+ .addTask(new AdditionalInfoTable())
.addTask(new InstRWInfoTable())
.addTask(new InstCommonTable())
.run();
diff --git a/3rdparty/asmjit/tools/tablegen-x86.sh b/3rdparty/asmjit/tools/tablegen-x86.sh
new file mode 100644
index 00000000000..40facf326dc
--- /dev/null
+++ b/3rdparty/asmjit/tools/tablegen-x86.sh
@@ -0,0 +1,3 @@
+#!/usr/bin/env sh
+set -e
+node ./tablegen-x86.js $@
diff --git a/3rdparty/asmjit/tools/tablegen.js b/3rdparty/asmjit/tools/tablegen.js
index c367522b643..fdc65fd1cbd 100644
--- a/3rdparty/asmjit/tools/tablegen.js
+++ b/3rdparty/asmjit/tools/tablegen.js
@@ -1,25 +1,7 @@
-// AsmJit - Machine code generation for C++
+// This file is part of AsmJit project <https://asmjit.com>
//
-// * Official AsmJit Home Page: https://asmjit.com
-// * Official Github Repository: https://github.com/asmjit/asmjit
-//
-// Copyright (c) 2008-2020 The AsmJit Authors
-//
-// This software is provided 'as-is', without any express or implied
-// warranty. In no event will the authors be held liable for any damages
-// arising from the use of this software.
-//
-// Permission is granted to anyone to use this software for any purpose,
-// including commercial applications, and to alter it and redistribute it
-// freely, subject to the following restrictions:
-//
-// 1. The origin of this software must not be misrepresented; you must not
-// claim that you wrote the original software. If you use this software
-// in a product, an acknowledgment in the product documentation would be
-// appreciated but is not required.
-// 2. Altered source versions must be plainly marked as such, and must not be
-// misrepresented as being the original software.
-// 3. This notice may not be removed or altered from any source distribution.
+// See asmjit.h or LICENSE.md for license and copyright information
+// SPDX-License-Identifier: Zlib
// ============================================================================
// tablegen.js
@@ -178,6 +160,21 @@ exports.Lang = Lang;
class StringUtils {
static asString(x) { return String(x); }
+ static countOf(s, pattern) {
+ if (!pattern)
+ FAIL(`Pattern cannot be empty`);
+
+ var n = 0;
+ var pos = 0;
+
+ while ((pos = s.indexOf(pattern, pos)) >= 0) {
+ n++;
+ pos += pattern.length;
+ }
+
+ return n;
+ }
+
static capitalize(s) {
s = String(s);
return !s ? s : s[0].toUpperCase() + s.substr(1);
@@ -276,15 +273,28 @@ class StringUtils {
return lines.join("\n");
}
+ static extract(s, start, end) {
+ var iStart = s.indexOf(start);
+ var iEnd = s.indexOf(end);
+
+ if (iStart === -1)
+ FAIL(`StringUtils.extract(): Couldn't locate start mark '${start}'`);
+
+ if (iEnd === -1)
+ FAIL(`StringUtils.extract(): Couldn't locate end mark '${end}'`);
+
+ return s.substring(iStart + start.length, iEnd).trim();
+ }
+
static inject(s, start, end, code) {
var iStart = s.indexOf(start);
var iEnd = s.indexOf(end);
if (iStart === -1)
- FAIL(`Utils.inject(): Couldn't locate start mark '${start}'`);
+ FAIL(`StringUtils.inject(): Couldn't locate start mark '${start}'`);
if (iEnd === -1)
- FAIL(`Utils.inject(): Couldn't locate end mark '${end}'`);
+ FAIL(`StringUtils.inject(): Couldn't locate end mark '${end}'`);
var nIndent = 0;
while (iStart > 0 && s[iStart-1] === " ") {
@@ -426,7 +436,10 @@ exports.MapUtils = MapUtils;
// ============================================================================
class CxxUtils {
- static flags(obj, fn) {
+ static flags(obj, fn, none) {
+ if (none == null)
+ none = "0";
+
if (!fn)
fn = nop;
@@ -435,7 +448,7 @@ class CxxUtils {
if (obj[k])
out += (out ? " | " : "") + fn(k);
}
- return out ? out : "0";
+ return out ? out : none;
}
static struct(...args) {
@@ -890,14 +903,14 @@ class NameTable extends Task {
var maxLength = 0;
for (var i = 0; i < insts.length; i++) {
const inst = insts[i];
- instNames.add(inst.name);
- maxLength = Math.max(maxLength, inst.name.length);
+ instNames.add(inst.displayName);
+ maxLength = Math.max(maxLength, inst.displayName.length);
}
instNames.index();
for (var i = 0; i < insts.length; i++) {
const inst = insts[i];
- const name = inst.name;
+ const name = inst.displayName;
const nameIndex = instNames.getIndex(name);
const index = name.charCodeAt(0) - 'a'.charCodeAt(0);
diff --git a/3rdparty/asmjit/tools/tablegen.sh b/3rdparty/asmjit/tools/tablegen.sh
index 40facf326dc..b2c9cac368c 100644
--- a/3rdparty/asmjit/tools/tablegen.sh
+++ b/3rdparty/asmjit/tools/tablegen.sh
@@ -1,3 +1,4 @@
#!/usr/bin/env sh
set -e
+node ./tablegen-arm.js $@
node ./tablegen-x86.js $@